【R语言】鉴于计算10亿以内训练模型记录for循环的加速

news2024/11/19 17:47:53

文章目录

    • 1 前言
    • 2 几个循环
      • 2.1 100以内的和
      • 2.2 100以内奇数和/偶数和
    • 3 多重循环
      • 3.1 向量化
      • 3.2 合并循环
      • 3.3 apply函数
      • 3.4 矩阵运算
      • 3.5 foreach分解任务
    • 4 讨论

1 前言

笔者主力机是MBAM1芯片(8+256),某个下午巩固循环突然思考到个问题,小循环很快就能run出来,中循环还勉勉强强,稍微上点强度就运行的很慢。虽然是CPU占用100%,8颗核心好像是偷着懒跑的,但是丢给我那台4核心8线程黑苹果,是跑满的,说明ARM在多线程的时候,有点东西

下图是计算一个10亿内训练模型时的top

2 几个循环

2.1 100以内的和

### for
sum <- 0
for (i in 1:100) {
  sum <- sum + i
}
print(sum)

### while
sum <- 0
i <- 1
while (i <= 100) {
  sum <- sum + i
  i <- i + 1
}
print(sum)

2.2 100以内奇数和/偶数和

### for
odd_sum <- 0
even_sum <- 0

for (i in 1:100) {
  if (i %% 2 == 0) {
    even_sum <- even_sum + i
  } else {
    odd_sum <- odd_sum + i
  }
}

print(paste("奇数和:", odd_sum))
print(paste("偶数和:", even_sum))

### while
odd_sum <- 0
even_sum <- 0
i <- 1

while (i <= 100) {
  if (i %% 2 == 0) {
    even_sum <- even_sum + i
  } else {
    odd_sum <- odd_sum + i
  }
  i <- i + 1
}

print(paste("奇数和:", odd_sum))
print(paste("偶数和:", even_sum))

3 多重循环

以下仅记录和提供思路,具体情况具体分析,但是有一点思维模式很得益

3.1 向量化

假设计算两个向量x和y的点积,使用for循环分别游历,相乘再相加:

x <- c(1, 2, 3, 4, 5)
y <- c(5, 4, 3, 2, 1)
dot_product <- 0
for (i in 1:length(x)) {
  dot_product <- dot_product + x[i] * y[i]
}
print(dot_product)

向量化,可以理解为对号入座,亮点就是sum()*

x <- c(1, 2, 3, 4, 5)
y <- c(5, 4, 3, 2, 1)
dot_product <- sum(x * y)
print(dot_product)

3.2 合并循环

假设对两个矩阵A和B中的每个元素进行遍历,将它们相加,并将结果保存到矩阵C中。可以使用两个嵌套的for循环实现:

A <- matrix(1:9, 3, 3)
B <- matrix(10:18, 3, 3)
C <- matrix(0, 3, 3)
for (i in 1:nrow(A)) {
  for (j in 1:ncol(A)) {
    C[i, j] <- A[i, j] + B[i, j]
  }
}
print(C)

#输出结果:
     [,1] [,2] [,3]
[1,]   11   13   15
[2,]   17   19   21
[3,]   23   25   27

但是理解这类的目的,合并循环的思路在这里刚好就是矩阵一一对应的数字相加:

A <- matrix(1:9, 3, 3)
B <- matrix(10:18, 3, 3)
C <- A + B
print(C)

3.3 apply函数

假设有一个3x3的二维矩阵mat,需要将矩阵中每个元素求平方。我们可以使用for循环来实现:

mat <- matrix(1:9, 3, 3)
result <- matrix(0, 3, 3)
for (i in 1:nrow(mat)) {
  for (j in 1:ncol(mat)) {
    result[i, j] <- mat[i, j] ^ 2
  }
}
print(result)

apply+function

mat <- matrix(1:9, 3, 3)
result <- apply(mat, c(1, 2), function(x) x^2)
print(result)

3.4 矩阵运算

假设需要计算一个矩阵A的逆矩阵,使用for循环和矩阵运算实现:

A <- matrix(c(1, 2, 3, 4), 2, 2)
det_A <- A[1, 1] * A[2, 2] - A[1, 2] * A[2, 1]
adj_A <- matrix(c(A[2, 2], -A[1, 2], -A[2, 1], A[1, 1]), 2, 2)
A_inv <- adj_A / det_A
print(A_inv)

#输出结果:
     [,1] [,2]
[1,] -2.0  1.0
[2,]  1.5 -0.5

若要优化这一步骤,很简单,直接用solve()

A <- matrix(c(1, 2, 3, 4), 2, 2)
A_inv <- solve(A)
print(A_inv)

3.5 foreach分解任务

foreach包实现多线程for循环

library(foreach)
library(doParallel)

# 创建一个1000行,1000列的矩阵
m <- matrix(runif(1000000), nrow = 1000)

# 初始化并行计算环境
cl <- makeCluster(detectCores())
registerDoParallel(cl)

# 使用foreach包和%dopar%运算符进行并行计算
result <- foreach(i = 1:nrow(m), .combine = "+") %dopar% sum(m[i, ])

# 结束并行计算环境
stopCluster(cl)

# 输出结果
print(result)

有人会说,这不就是用了个函数吗?

是,但又不完全是,不然为何有人懂得用这个函数,但有人需要一步一步算(并非说一步一步算不好,只有自己算过,理解了,才懂得去挖掘深度,化繁为简)

4 讨论

如果只知道个函数是知其然而不知其所以然,但是只知道计算过程便如优化前的一样,一步一步计算。得益于现在互联网发展的飞起,各种便利工具各种开源方法,几乎人人都是调包侠,但是当现成的辅佐无法满足时还是需要回归底层。最近深有感触,不论是数据挖掘、还是机器学习深度学习、人工智能、全栈,分析的尽头就是算法

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/492130.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

App违反Google数据安全政策,解决方案

前言 google隐私政策阶段性会进行更新&#xff0c;时长关注隐私政策变化&#xff0c;避免app被强制下架&#xff0c;影响后续运营工作。 邮件内容 摘录邮件详情 我们在以下区域发现了问题&#xff1a; SPLIT_BUNDLE 2:政策声明&#xff0c;数据安全部分&#xff1a;“https:…

中国社科院与美国杜兰大学金融管理硕士项目,引领你走在金融行业前沿

作为金融领域从业人员时刻都在关注行业最新资讯&#xff0c;只有掌握一手的前沿讯息&#xff0c;才能在职场上无往不胜。针对在职的你&#xff0c;如何利用业余时间让自己更增值呢&#xff0c;中国社科院与美国杜兰大学金融管理硕士项目引领你走在金融行业前沿。 金融管理硕士…

ecology9-嵌入第三方系统,特定情况下在嵌套页提示“登录超时,请重新登录”

ecology9-嵌入第三方系统&#xff0c;特定情况下在嵌套页提示“登录超时&#xff0c;请重新登录” 问题描述尝试1尝试2尝试3√尝试4参考 问题描述 A系统对接了ecology9的单点登录。A系统在某个边栏菜单嵌入ecology9的流程页面。当清空浏览器缓存时&#xff0c;A系统在单点登录…

从C语言到C++⑥(第二章_类和对象_中篇_续)大练习(日期类)+笔试选择题

目录 1. 日期类详细实现 1.1 构造函数和打印函数 1.2 六个比较运算符重载 1.3 日期天数 和 日期天数 1.4 日期 - 天数 和 日期 - 天数 1.5 日期 和 日期 1.6 日期-- 和 --日期 1.7 日期 - 日期 operator- 1.8 打印*this是星期几 2. 日期类完整代码 Date.h: Date.…

计算机智能系统有哪些SCI期刊? - 易智编译EaseEditing

计算机智能系统是计算机科学中的一个重要分支&#xff0c;其主要研究计算机智能和人工智能等方面的问题。以下是一些SCI期刊的推荐&#xff1a; IEEE Transactions on Neural Networks and Learning Systems&#xff1a; 该期刊是IEEE计算智能学会的官方期刊&#xff0c;涵盖了…

JavaWeb——数据链路层详解

目录 一、以太网 1、定义 2、以太网格式帧 二、MTU 1、定义 2、MTU对IP协议的影响 3、MTU对UDP协议的影响 4、MTU对TCP协议的影响 三、ARP协议 1、定义 2、ARP协议的作用 3、ARP协议的工作流程 一、以太网 1、定义 "以太网" 不是一种具体的网络&#xff…

谷歌浏览器 | Chrome DevTools系统学习篇-概述

Chrome DevTools是一套直接内置到谷歌Chrome浏览器的web开发工具。DevTools可以帮助您即时编辑页面并快速诊断问题&#xff0c;最终帮助您更快地构建更好的网站。我们今天的概述主要讲述谷歌浏览器的日常使用和几大常见控制面板的介绍。 目录 1.打开谷歌浏览器 2.谷歌浏览器的…

MySQL 页、页结构、页目录、索引

MySQL中&#xff0c;数据存到了什么地方&#xff1f; 存储到了硬盘的文件上&#xff0c;被称为&#xff1a;数据文件 或 表空间 每个数据库都是由 一组数据文件 组成&#xff0c;这些文件包含了&#xff1a;所有表、索引、其他相关对象的数据 MySQL 以什么样的方式访问&#…

安卓联发科MT6737手机开发核心板 开发模块

MT6737核心板是一款基于联发科MT6737T平台高性能、可运行安卓操作系统的4G智能模块。它支持多种制式&#xff0c;包括LTE-FDD/LTE-TDD/WCDMA/TD-SCDMA/EVDO/CDMA/GSM等。此外&#xff0c;它还支持WiFi 802.11a/b/g/n和BT4.0LE近距离无线通信&#xff0c;并支持GPS/GLONASS/北斗…

机器学习笔记之计算学习理论(二)PAC学习

机器学习笔记之计算学习理论——PAC学习 引言回顾&#xff1a;霍夫丁不等式霍夫丁不等式的问题及其优化 PAC \text{PAC} PAC引出新问题——霍夫丁不等式无法通过直接比较获取最优假设函数问题的解决方法新方法对于霍夫丁不等式的约束证明 总结 引言 上一节从霍夫丁不等式为切入…

STC32G12K128单片机的 moubus-rtu 从机测试工程

简介 STC32G12K128 是STC 推出的一款32位的 C251 的单片机。最近拿到一块官方申请的 屠龙刀-STC32G开发板&#xff0c;就用它的提供的库函数&#xff0c;查考安富莱提供的 modbus 例程移植了一个 modbus-rtu 从站的工程。 modbus-rtu slave 移植注意点 modbus-rtu 功能配置 …

每日学术速递5.3

CV - 计算机视觉 | ML - 机器学习 | RL - 强化学习 | NLP 自然语言处理 Subjects: cs.CV 1.Learning Locally Editable Virtual Humans 标题&#xff1a;学习本地可编辑虚拟人 作者&#xff1a;Hsuan-I Ho, Lixin Xue, Jie Song, Otmar Hilliges 文章链接&#xff1a;htt…

【分享】7-Zip解压缩软件的超详细使用攻略

常用的解压缩软件&#xff0c;除了WinRAR之外&#xff0c;7-Zip也是不错的选择。 7-Zip不仅是一款完全免费的开源解压软件&#xff0c;它的解压缩功能也很强大&#xff0c;可以支持视频、文档、文件夹、图片等文件进行压缩操作。 今天小编就来分享一下&#xff0c;7-Zip解压缩…

python一键登录srun校园网(以深圳技术大学为例)

全世界最&#xff08;不&#xff09;好的目录 一、需求分析二、实现过程2.1 分析api2.1.1 连接到校园网&#xff0c;自动弹出登录认证界面2.1.2 先输入错误的账号密码&#xff0c;按F12看会获取哪些信息2.1.3 api 2.2 分析加密2.3 流程总结 三.模拟登录3.1 编写配置文件3.2.功能…

【微软Bing王炸更新】无需等待,人人可用,答案图文并茂,太牛了

&#x1f680; AI破局先行者 &#x1f680; &#x1f332; AI工具、AI绘图、AI专栏 &#x1f340; &#x1f332; 如果你想学到最前沿、最火爆的技术&#xff0c;赶快加入吧✨ &#x1f332; 作者简介&#xff1a;硕风和炜&#xff0c;CSDN-Java领域优质创作者&#x1f3c6;&am…

opencv实践项目-图像拼接

目录 1.简介2. 步骤2.1 特征检测与提取2.2 关键点检测2.3 关键点和描述符2.4 特征匹配2.5 比率测试2.6 估计单应性 3. 完整代码 1.简介 图像拼接是计算机视觉中最成功的应用之一。如今&#xff0c;很难找到不包含此功能的手机或图像处理API。在本 文中&#xff0c;我们将讨论如…

虹科分享 | 专为创意专业人士设计的Thunderbolt适配器

一、方案介绍 虹科HK-ATTO ThunderLink雷电™ 适配器可以适用于任何地方。 1.小。 2.便携式。 3.强大。 我们的10GBE Thunderbolt适配器的性能至少比内置或附加NIC&#xff08;包括Mac&#xff09;高20% , ATTO 360只需点击一个按钮即可优化以太网SAN&#xff0c;并可与Thunder…

xxl-job 使用示例

目录 介绍 下载源码地址 文档网站 源码导入就是这样目录 数据库建表sql 就这么几个表出来了 修改xxl-job-admin项目下的application.properties文件 完事启动就行了 页面 页面访问地址 账号密码 增加自己的定时任务 介绍 这篇写的是接入使用xxl-job 的一个简单流程…

win系统使用macOS系统

最近 win 系统和 ubuntu 系统用的久了&#xff0c;想用一下 MacOS 系统&#xff0c;于是去网上查了相关资料&#xff0c;发现用一款叫 NEXUS 的软件可以实现在 windows 系统体验效果&#xff0c;现把教程记录下来&#xff0c;供大家使用。 目录 一、下载NEXUS 二、 安装NEXU…

IMX6ULL裸机篇之串口实验说明一

一. 串口 本章我们就来学习如何驱动 I.MX6U 上的串口&#xff0c;并使用串口和电脑进行通信。 串行接口指的是数据一个一个的顺序传输&#xff0c;通信线路简单。 UART 作为串口的一种&#xff0c;其工作原理也是将数据一位一位的进行传输&#xff0c;发送和接收各用一 条…