首页 > 自考资讯 > 自考资讯

手算神经网络的MAC和FLOP

2024-10-09

大家好,今天给各位分享手算神经网络的MAC和FLOP的一些知识,其中也会对进行解释,文章篇幅可能偏长,如果能碰巧解决你现在面临的问题,别忘了关注本站,现在就马上开始吧!

推荐NSDT工具:Three.js AI纹理开发套件- YOLO合成数据生成器- GLTF/GLB在线编辑- 3D模型格式在线转换- 可编程3D场景编辑器- REVIT导出3D模型插件- 3D模型语义搜索引擎- AI模型在线观看- Three.js虚拟轴开发包- 3D模型在线曲面还原- STL模型在线切割

1、为什么要计算MAC和FLOP

首先让我们看一下MAC和FLOP的定义。

FLOP:FLOP(浮点运算)可以被视为加法、减法、乘法或除法运算。 MAC:MAC(乘累加)运算本质上是先乘后加,即MAC=a * b + c。它算作两次FLOP(一次用于乘法,一次用于加法)。解决MAC 和FLOP 不仅仅是一项学术练习;它也是一项任务。它是优化神经网络性能和效率的关键组成部分。它有助于设计计算高效且有效的模型,最终在训练和推理阶段节省时间和资源。

资源效率。了解FLOP 有助于估计神经网络的计算成本。通过优化FLOP 数量,您可以减少训练或运行神经网络所需的时间。内存效率。 MAC 操作通常决定网络的内存使用情况,因为它们与网络中的参数和激活次数直接相关。减少MAC 有助于提高网络内存效率。电源效率。 FLOP 和MAC 操作都会影响运行神经网络的硬件的功耗。通过优化这些指标,可以降低运行网络的能耗,这在移动和嵌入式设备中尤其重要。修剪和量化。了解FLOP 和MAC 有助于通过剪枝(删除不必要的连接)和量化(降低权重和激活的精度)等技术来优化神经网络,旨在降低计算和内存成本。模型之间的比较。 FLOP 和MAC 提供了一种比较不同模型的计算复杂度的方法,可以作为为特定应用选择模型的标准。硬件基准测试。这些指标还可用于在运行神经网络时对不同硬件平台的性能进行基准测试。实时应用。对于实时应用程序,特别是在计算资源有限的边缘设备上,理解和优化这些指标对于确保网络能够在应用程序的时间限制内运行至关重要。电池寿命。在电池供电的设备中,降低神经网络的计算成本(从而降低能耗)有助于延长电池寿命。设计新算法。研究人员在开发新算法或神经网络架构时可以使用这些指标作为指导,旨在提高计算效率而不牺牲准确性。

2、神经网络层的MAC和FLOP计算

接下来让我们统计一下浮点运算或乘法累加运算的数量,以了解每一层的计算复杂度。

2.1 全连接层(密集层)

现在我们将创建一个简单的3 层神经网络并开始计算所涉及的操作。以下是计算第一个线性层(即全连接(或密集)层)中操作的公式:

对于具有I 输入和O 输出的全连接层,操作数如下:

MAC: I OFLOP: 2 (I O) (因为每个MAC 算作两次FLOP) class SimpleLinearModel(nn.Module): def __init__(self): super(SimpleLinearModel,self).__init__() self. fc1=nn.Linear(in_features=10, out_features=20, 偏差=False) self.fc2=nn.Linear(in_features=20, out_features=15, 偏差=False) self.fc3=nn.Linear(in_features=15, out_features=1,bias=False) defforward(self, x): x=self.fc1(x) x=F.relu(x) x=self.fc2(x) F.relu(x) x=self. fc3(x) return xlinear_model=SimpleLinearModel().cuda()sample_data=torch.randn(1, 10).cuda() 步骤1:确定层参数对于给定的模型,我们有三个线性层,定义为:

fc1:10 个输入特征,20 个输出特征fc2:20 个输入特征,15 个输出特征fc3:15 个输入特征,1 个输出特征步骤2:计算FLOP 和MAC 现在,计算每层的MAC 和FLOP :

层fc1:

MAC=10 20=200FLOPs=2 MAC=2 200=400 层fc2:

MAC=20 15=300FLOPs=2 MAC=2 300=600 层fc3:

MACs=15 1=15FLOPs=2 MACs=2 15=30第3 步:总结结果最后,为了找到通过整个网络的单个输入的MAC 和FLOP 总数,我们将所有层的结果相加:

总MAC=MACs(fc1) + MACs(fc2) + MACs(fc3)=200 + 300 + 15=515 总FLOPs=FLOPs(fc1) + FLOPs(fc2) + FLOPs(fc3)=400 + 600 + 30=1030我们可以使用torchprofile 库来验证给定神经网络模型的FLOP 和MAC 计算。操作方法如下:

macs=profile_macs(linear_model, sample_data)print(macs)#515

2.2 卷积神经网络 (CNN)

现在,让我们确定一个简单卷积模型的MAC(乘法累加)和FLOP(浮点运算)。此计算可能比我们之前使用密集层的示例稍微复杂一些,这主要是由于步幅、填充和内核大小等因素造成的。不过,我会把它分解一下,以便我们更容易学习。

类SimpleConv(nn.Module): def __init__(self): super(SimpleConv, self).__init__() self.conv1=nn.Conv2d(in_channels=1, out_channels=16, kernel_size=3, stride=1, padding=1) self.conv2=nn.Conv2d(in_channels=16, out_channels=32, kernel_size=3, stride=1, padding=1) self.fc=nn.Linear(in_features=32*28*28, out_features=10) defforward(self, x): x=self.conv1(x) x=F.relu(x) x=self.conv2(x) x=F.relu(x) x=x.view(x.shape[ 0], -1) x=self.fc(x) return xx=torch.rand(1, 1, 28, 28).cuda()conv_model=SimpleConv().cuda() 计算卷积运算的重要注意事项:

在计算卷积核的操作时,请务必记住,内核中的通道数应与输入中的通道数相匹配。例如,如果我们的输入是具有三个颜色通道的RGB 图像,则内核的尺寸将为3x3x3 以考虑输入的三个通道。出于演示目的,我们将在整个卷积层中保持一致的图像大小。为此,我们将padding 和stride 值都设置为1。 步骤1:识别图层参数

对于给定的模型,我们有两个卷积层和一个线性层,定义为:

conv1:1个输入通道,16个输出通道,内核大小为3 conv2:16个输入通道,32个输出通道fc:322828个输入特征,1个输出特征。由于我们的图像在卷积层中没有发生变化第2步:计算FLOP和MAC现在,计算每一层的MAC和FLOP:

公式为:output_image_size * 内核形状* output_channels

手算神经网络的MAC和FLOP

层转换1:

MAC=28 * 28 * 3 * 3 * 1 * 16=1,12,896FLOPs=2 MAC=2 200=2,25,792层转换2:

MAC=28 28 * 3 * 3 * 16 * 32=3,612,672FLOPs=2 MAC=2 300=600=7,225,344层fc:

MACs=32 * 28 * 28 * 10=250,880FLOPs=2 MACs=2 15=501,760步骤3:总结结果最后,为了找到整个网络中单个输入的MAC 和FLOP 总数,我们添加所有层的结果:

总MAC=MACs(conv1) + MACs(conv2) + MACs(fc)=1,12,896 + 3,612,672 + 250,880=39,76,448 总FLOPs=FLOPs(fc1) + FLOPs(fc2) + FLOPs(fc3)=2,25,792 + 7,225,344 + 501,760=7,952,896 使用torchprofile库验证操作:

macs=profile_macs(conv_model,(x,))print(macs)#3976448

2.3 自注意力模块

介绍完线性层和卷积层的MAC之后,我们下一步就是确定自学习层的FLOP(浮点运算)注意力模块,它是大型语言模型的关键组件。该计算对于理解此类模型的计算复杂性至关重要。让我们更深入地挖掘一下。

class SimpleAttentionBlock(nn.Module): def __init__(self, embed_size, Heads): super(SimpleAttentionBlock, self).__init__() self.embed_size=embed_size self.heads=头self.head_dim=embed_size //头断言( self. head_dim * Heads==embed_size ), '嵌入大小需要能被heads整除' self.values=nn.Linear(self.embed_size, self.embed_size,bias=False) self.keys=nn.Linear(self. embed_size,self.embed_size,偏差=False) self.queries=nn.Linear(self.embed_size,self.embed_size,偏差=False) self.fc_out=nn.Linear(头* self.head_dim,embed_size)def前向(self 、值、键、查询、掩码): N=querys.shape[0] value_len、key_len、query_len=values.shape[1]、keys.shape[1]、queries.shape[1] print(values.shape)值=self.values(values).reshape(N,self.heads,value_len,self.head_dim)键=self.keys(keys).reshape(N,self.heads,key_len,self.head_dim)查询=self.queries(查询).reshape(N,self.heads,query_len,self.head_dim)能量=torch.matmul(查询,keys.transpose(-2,-1))如果掩码不是None:能量=energy.masked_fill (mask==0, float('-1e20')) 注意力=torch.nn.function.softmax(energy, dim=3) out=torch.matmul(注意力, 值).reshape( N, query_len, self.heads * self.head_dim ) return self.fc_out(out)第一步:识别图层参数

线性变换

让我们定义hyper_params

batch_size=1seq_len=10embed_size=256 在注意力块中,我们有三个线性变换(用于查询、键和值),最后一个(fc_out)。

输入大小:[batch_size, seq_len, embed_size] 线性变换矩阵:[embed_size, embed_size] MAC:batch_sizeseq_lenembed_sizeembed_size 查询、键、值线性变换:

查询变换MAC=1 * 10 * 256 * 256=6,55,360 密钥变换MAC=1 * 10 * 256 * 256=6,55,360 值变换MAC=1 * 10 * 256 * 256=6,55,360 能量计算: 查询( reshape)点键(reshape)——点积运算。

Macs:batch_sizeseq_lenseq_lenheadshead_dim 查询和关键点积

MACS=1 * 10 * 10 * 32 [32,因为256/8 除以头数]=25,600 注意权重总和值计算的输出: 注意权重点值(重塑) —— 另一个点积运算。

Macs:batch_sizeseq_lenseq_lenheadshead_dim 注意力和值点积

Macs=1 * 10 * 10 * 32=25,600 个完全连接的输出(fc_out)

Macs:batch_sizeseq_lenheadshead_dimembed_sizeMacs=1 * 10 * 8 * 32 * 256=6,55,360 步骤2:总结结果

MAC 总数=MAC(conv1) + MAC(conv2) + MAC(fc)=6,55,360 + 6,55,360 + 6,55,360 + 25,600 + 25,600 + 6,55,360=26,72,640 总FLOP=2 * 总MAC=53 ,45,280 使用torchprofile库验证运行:

# 创建模型的实例model=SimpleAttentionBlock(embed_size=256, Heads=8).cuda()# 生成一些样本数据(batch of 5 个序列,每个长度10,embedding size 256)values=torch.randn( 1, 10, 256).cuda()keys=torch.randn(1, 10, 256).cuda()queries=torch.randn(1, 10, 256).cuda()# 没有简单掩码mask=None#与样本进行前向传递datamacs=profile_macs(model, (values, keys,querys, mask))print(macs)#2672640

3、结束语

整个计算过程中,我们主要考虑batch size为1。然而,需要注意的是,针对更大的批量大小缩放MAC 和FLOP 非常简单。

要计算大于1 的批量大小的MAC 或FLOP,只需将批量大小为1 获得的总MAC 或FLOP 乘以所需的批量大小值即可。这种缩放允许您估计神经网络模型中各种批量大小的计算要求。

用户评论

心脏偷懒

这篇文章太棒了!我一直想了解手工计算神经网络的 MAC 和 FLOP 到底代表什么意思以及如何计算,你解释得很清楚简洁!

    有8位网友表示赞同!

金橙橙。-

很有用啊!我正在学习深度学习课程,这篇博文解答了我很多关于模型规模和复杂度的问题。感谢作者对MAC和FLOP的深入分析!

    有12位网友表示赞同!

娇眉恨

手算神经网络?太难了吧!感觉这种操作只适合那些理论水平极高的研究人员。一般人很难理解这种计算方法吧!

    有15位网友表示赞同!

陌上花

我之前也尝试过用手算神经网络,但很快就放弃了... 太复杂太耗时!这篇博文给了我一些思路,或许可以试试使用代码来帮助计算 MAC 和 FLOP 。

    有6位网友表示赞同!

权诈

看来MAC和FLOP对于深度学习模型性能的影响真的很重要!需要好好研究一下如何控制它们的规模来提升效率。这篇文章给了我很大的启发!

    有10位网友表示赞同!

岁岁年年

我觉得文章标题比较吸引人,但内容有些枯燥,缺乏一些生动的例子或真实应用场景的说明,能增加趣味性就好了!

    有13位网友表示赞同!

未来未必来

我目前在做深度学习项目,对 MAC 和 FLOP 的理解非常有帮助。期待作者能开设更多关于深度学习实践的教程!

    有17位网友表示赞同!

淡抹烟熏妆丶

手算神经网络的感觉就是… 让人捉襟见肘啊!而且MAC和FLOP的值波动很大,很难精确掌控模型规模,是不是应该有更先进的方法?

    有10位网友表示赞同!

有你,很幸福

这种计算方法或许对于理解神经网络的基本原理很有用,但对于实际应用来说效率太低吧。我更倾向于使用现成的深度学习框架来开发模型。

    有11位网友表示赞同!

墨染年华

这篇文章让我对MAC和FLOP的概念有了清晰的认识。以后估计要经常用到这些指标了,感谢博主的分享!

    有18位网友表示赞同!

孤自凉丶

文章写的比较理论,没有太多针对实际应用场景的阐述。希望能更具体地解释在训练神经网络过程中如何利用 MAC 和 FLOP 来优化模型效果。

    有20位网友表示赞同!

古巷青灯

感觉这篇博文很有深度,不仅讲解了 MAC 和 FLOP 的概念,还深入分析了它们与模型性能之间的关系。这对想要深入学习深度学习的人来说非常有帮助!

    有5位网友表示赞同!

柠夏初开

我一直听说MAC和FLOP是研究深度学习的重点指标,但对它们的具体含义不太了解。这篇博文正好解答了我这个疑惑,感谢分享!

    有8位网友表示赞同!

致命伤

我认为手算神经网络并不能很好地说明 MAC 和 FLOP 的计算原理,更适合使用代码进行编程计算。希望作者能够提供一些实际案例,让读者更加直观地理解这些概念。

    有18位网友表示赞同!

妄灸

这篇博文给我打开了新的思路!我之前一直关注着模型的准确率和参数数量,但很少关注 MAC 和 FLOP。看来这些指标对模型效率也扮演着重要的角色。

    有12位网友表示赞同!

冷青裳

虽然手算神经网络的过程比较复杂,但我还是想尝试一下,这样才能真正深刻地理解 MAC 和 FLOP 的含义!感谢作者提供的宝贵知识分享!

    有10位网友表示赞同!

猜你喜欢

  • 手算神经网络的MAC和FLOP

    手算神经网络的MAC和FLOP

    在本文中,我们将深入探讨神经网络背景下的 MAC(乘法累加运算)和 FLOP(浮点运算)概念。通过学习如何使用笔和纸手动计算这些内容,你将对各种网络结构的计算复

    来源:中国自考网 2024-10-09
  • 每日一词“失败”

    每日一词“失败”

    flop英 [flɒp]美 [flɑːp]v.沉重下坠;笨拙移动;垂落;彻底失败;演砸;扑通坐下;猛然倒下;休息;睡觉n.沉重、松散又笨拙的动作;扑通声;重坠声

    来源:中国自考网 2024-10-09
  • 四川文轩职业学院开设了哪些专业 专业代码是多少

    四川文轩职业学院开设了哪些专业 专业代码是多少

    今天小编为大家带来了四川文轩职业学院开设了哪些专业 专业代码是多少,希望能帮助到大家,一起来看看吧!本文目录一览:四川文轩职业学院开设专

    来源:中国自考网 2024-10-09
  • 川南幼儿师范高等专科学校开设了哪些专业 专业代码是多少

    川南幼儿师范高等专科学校开设了哪些专业 专业代码是多少

    川南幼儿师范高等专科学校开设了哪些专业 专业代码是多少相关内容,小编在这里做了整理,希望能对大家有所帮助,关于川南幼儿师范高等专科学校

    来源:中国自考网 2024-10-09
  • 蒙娜丽莎瓷砖怎么样

    蒙娜丽莎瓷砖怎么样

    小编给大家带来了蒙娜丽莎瓷砖怎么样相关文章,一起来看一下吧。 蒙娜丽莎瓷砖 是国内一线品牌,蒙娜丽莎瓷砖通过了国家各项认证,各方面的性

    来源:中国自考网 2024-10-09
  • 15秒内记住一个单词“第296次”失败

    15秒内记住一个单词“第296次”失败

    flop /flɒp/ v. 砸锅;完全失败点击收听音频跟读 ↓↓↓ ↓↓↓ ↓↓↓例句/词组:The play flopped on Broadway. 这出

    来源:中国自考网 2024-10-09
  • 20秒内记住一个单词“第296次”失败

    20秒内记住一个单词“第296次”失败

    flop /flɒp/ v. 砸锅;完全失败点击收听音频跟读 ↓↓↓ ↓↓↓ ↓↓↓例句/词组:The play flopped on Broadway. 这出

    来源:中国自考网 2024-10-09
  • 震惊!《王者荣耀》的“第一滴血”其实也有这个意思

    震惊!《王者荣耀》的“第一滴血”其实也有这个意思

    玩《王者荣耀》时,我们经常会纳闷一件事,那就是这游戏明明是大企鹅出品的游戏,游戏里的人物大部分也是中国历史人物,为什么游戏的很多对白偏偏是英文的?带着这个理由,

    来源:中国自考网 2024-10-09
  • 你知道《第一滴血》的含义,但你可能不知道这些游戏术语

    你知道《第一滴血》的含义,但你可能不知道这些游戏术语

    王者荣耀已经成为人人尽知、风靡全中国的一款手机游戏,但是“王者”们,这里面所涉及到的英文你都能听懂吗?今天给大家安利一点关于王者荣耀的英语干货,没准在学习生活中

    来源:中国自考网 2024-10-09
  • 孩子学习英语Phonics和汉语拼音会不会感到困惑?

    孩子学习英语Phonics和汉语拼音会不会感到困惑?

    大家好,我是Fion。之前经常收到大班和小一的家长问我们,现在学自然拼读,跟拼音混淆了怎么办?很明确告诉广大家长们,不用担心,即便英语和拼音暂时混淆了也没关系,

    来源:中国自考网 2024-10-09