深度学习模型训练计算量的估算

深度学习模型训练计算量的估算

  • 方法1:基于网络架构和批处理数量计算算术运算次数
  • 前向传递计算和常见层的参数数量
    • 全连接层(Fully connected layer)
      • 参数
      • 浮点数计算量
    • CNN
      • 参数
      • 浮点数计算量
    • 转置CNN
      • 参数
      • 浮点数计算量
    • RNN
      • 参数
      • 浮点数计算量
    • GRU
      • 参数
      • 浮点数计算量
    • LSTM
      • 参数
      • 浮点数计算量
    • Self-Attention
      • 参数
      • 浮点数计算量
    • Multi-Headed Attention
      • 参数
      • 浮点数计算量
    • 示例:CNN-LSTM-FCN模型
  • 方法2:基于硬件设置和训练时间计算运算次数
    • 1.从论文/参考文献中提取信息:
    • 2.阅读硬件规格
    • 3.进行估算
      • 估算GPU的总FLOP:
      • 精度的考虑:
      • 考虑硬件特性:

深度学习模型训练计算量的估算

在当今的机器学习领域,深度学习模型的性能和先进性往往与其在更多计算资源上进行的训练有关。为了确保不同深度学习模型之间的准确比较,估算和报告训练过程中的计算资源使用情况变得至关重要。

本文将探讨深度学习模型训练计算量的估算方法,并介绍了该领域的一些前沿。

计算资源的使用通常以训练模型的最终版本所需的浮点运算次数(FLOP)来衡量。

我们将重点介绍两种估算方法,以大家更好地理解和比较不同深度学习模型的训练计算量,这两种方法用于估算深度学习模型的训练计算量

  • 一种基于网络架构和批处理数量
  • 一种基于硬件的最大配置和模型训练时间

方法1:基于网络架构和批处理数量计算算术运算次数

这种方法通过分析模型的架构和训练数据量来估算计算量。我们将探讨如何通过这种信息来估算模型训练的计算资源需求,以及其在实际研究中的应用。

大致公式如下:

计算量 = 2 × c o n n e c t i o n s × 3 × t r a i n i n g e x a m p l e × e p o c h s 计算量 = 2 \times connections \times 3 \times training \space example \times epochs 计算量=2×connections×3×training example×epochs

connections:指的是神经网络中的连接数,即神经元之间的直接相互连接。在神经网络中,神经元之间的连接表示它们之间的信息传递和相互作用。

举个例子,如果你有一个具有 N 个输入神经元和 M 个输出神经元的全连接层(fully connected layer),那么它将有 NM 个连接。这意味着每个输入神经元都与每个输出神经元相连接,形成了 NM 个连接。

training example:指的是用于训练机器学习模型的数据集中的样本数量
epochs:是指在训练深度学习模型时的迭代次数

计算资源的使用通常是以模型的前向传播(inference)或反向传播(backpropagation)所需的浮点运算次数(FLOP)来衡量。这是在单次迭代(一个batch)中的计算,而不是迭代的总和,在深度学习框架中,每个批次计算完成后,框架通常会自动释放相应的计算资源,包括中间结果的内存

为什么不可以层层计算,释放资源,进入下一层呢?

在神经网络的训练中,每一层的计算都依赖于前一层的输出,因此不能在每一层的计算中释放资源并进入下一层。神经网络的计算通常是流水线式的,每一层的输出是下一层的输入。如果在每一层都等待上一层计算完成并释放资源,会导致整个计算过程变得非常慢。

下面我们可以将上面的公式翻译转换一下,可以用如下公式来解释:

t r a i n i n g _ c o m p u t e = ( o p s _ p e r _ f o r w a r d _ p a s s + o p s _ p e r _ b a c k w a r d _ p a s s ) ∗ n _ p a s s e s training\_compute = (ops\_per\_forward\_pass + ops\_per\_backward\_pass) * n\_passes training_compute=(ops_per_forward_pass+ops_per_backward_pass)n_passes

其中:

  • ops_per_forward_pass:表示的是前向传播中的计算数
  • ops_per_backward_pass:是反向传播中的计算数
  • n_passes:等于模型迭代次数和训练样本数的乘积:

n _ p a s s e s = n _ e p o c h s ∗ n _ e x a m p l e s n\_passes = n\_epochs * n\_examples n_passes=n_epochsn_examples

如果不知道自己一个迭代的训练样本数,有时可以计算为每个迭代的批次数乘以每个批次的大小

n _ e x a m p l e s = n _ b a t c h e s ∗ b a t c h _ s i z e n\_examples = n\_batches * batch\_size n_examples=n_batchesbatch_size

ops_per_backward_passops_per_forward_pass的比率相对稳定,因此可以将二者整合为

f p _ t o _ b p _ r a t i o = o p s _ p e r _ b a c k w a r d _ p a s s o p s _ p e r _ f o r w a r d _ p a s s fp\_to\_bp\_ratio = \frac{ops\_per\_backward\_pass}{ops\_per\_forward\_pass} fp_to_bp_ratio=ops_per_forward_passops_per_backward_pass

得到以下公式:

t r a i n i n g _ c o m p u t e = o p s _ p e r _ f o r w a r d _ p a s s ∗ ( 1 + f p _ t o _ b p _ r a t i o ) ∗ n _ p a s s e s training\_compute = ops\_per\_forward\_pass * (1 + fp\_to\_bp\_ratio) * n\_passes training_compute=ops_per_forward_pass(1+fp_to_bp_ratio)n_passes

通常估计fp_to_bp_ratio的值为2:1 。最终的公式为:
t r a i n i n g _ c o m p u t e = o p s _ p e r _ f o r w a r d _ p a s s ∗ 3 ∗ n _ e p o c h s ∗ n _ e x a m p l e s training\_compute = ops\_per\_forward\_pass * 3 * n\_epochs * n\_examples training_compute=ops_per_forward_pass3n_epochsn_examples

为什么反向传递操作与前向传递操作的比率2:1

计算反向传递需要为每一层计算与权重相关的梯度和每个神经元关于要回传的层输入的误差梯度。这些操作中的每一个需要的计算量大致等于该层前向传递中的操作量。因此,fp_to_bp_ratio约为2:1。

为什么权重更新参数计算可以忽略不计

在深度学习训练中,权重更新所需的参数计算量相对于前向传播和反向传播来说,通常可以被认为是可以忽略不计的。这主要有以下几个原因:

  1. 批量更新: 在深度学习中,通常使用批量梯度下降或小批量梯度下降等优化算法进行权重更新。这意味着权重更新是基于整个训练数据集或小批次的梯度。相比于前向传播和反向传播,其中需要对每个训练样本进行计算,权重更新的计算是在更大的数据集上进行的,因此其计算量相对较小。
  2. 累积梯度: 在实际应用中,通常会累积多个批次的梯度来更新参数。这样做有助于降低梯度的方差,提高梯度估计的稳定性。由于梯度的累积,单个批次中的权重更新计算相对于整体训练过程来说是较小的一部分。
  3. 参数共享: 在卷积神经网络(CNN)等架构中,存在参数共享的情况。在这种情况下,多个神经元共享同一组权重,从而减少了参数的数量。由于参数共享,权重的梯度计算是相对较小的。

前向传递计算和常见层的参数数量

下面是整理了一个常见神经网络层的表格,估算了它们的参数数量以及每层前向传递所需的浮点运算次数

前文已经知道了,在许多层中,前向传递中的FLOP数量大致等于参数数量的两倍,然而,有许多例外情况,例如CNN由于参数共享而具有更少的参数,而词嵌入则不进行任何操作。

全连接层(Fully connected layer)

在这里插入图片描述

参数

在这里插入图片描述

浮点数计算量

在这里插入图片描述

CNN

从形状为 H × W × C H \times W \times C H×W×C 的张量中使用形状为 K × K × C K \times K \times C K×K×C的 D 个滤波器,应用步幅为 S 和填充为 P 的卷积神经网络(CNN)。
在这里插入图片描述

参数

在这里插入图片描述

浮点数计算量

在这里插入图片描述

转置CNN

从形状为 H × W × C H \times W \times C H×W×C 的张量中使用形状为 K × K × C K \times K \times C K×K×C的 D 个滤波器,应用步幅为 S、填充为 P 的转置卷积神经网络(Transpose CNN)。

在这里插入图片描述

参数

在这里插入图片描述

浮点数计算量

在这里插入图片描述

RNN

带有偏置向量的循环神经网络(RNN),其输入大小为 N,输出大小为 M。

在这里插入图片描述

参数

在这里插入图片描述

浮点数计算量

在这里插入图片描述

GRU

带有偏置向量的全门控门循环单元(Fully Gated GRU),其输入大小为 N,输出大小为 M。

在这里插入图片描述

参数

在这里插入图片描述

浮点数计算量

在这里插入图片描述

LSTM

带有偏置向量的长短时记忆网络(LSTM),其输入大小为 N,输出大小为 M。

在这里插入图片描述

参数

在这里插入图片描述

浮点数计算量

在这里插入图片描述

Self-Attention

具有序列长度 L、输入大小为 W、键大小为 D 和输出大小为 N 的自注意力层(Self-Attention Layer)。
在这里插入图片描述

参数

在这里插入图片描述

浮点数计算量

在这里插入图片描述

Multi-Headed Attention

具有序列长度 L、输入大小为 W、键大小为 D、每个注意力头输出大小为 N、最终输出大小为 M 以及 H 个注意力头的多头注意力层(Multi-Headed Attention Layer)。
在这里插入图片描述

参数

在这里插入图片描述

浮点数计算量

在这里插入图片描述

示例:CNN-LSTM-FCN模型

例如,假设我们有一个CNN-LSTM-FCN架构,具体如下:

  • 输入是形状为 [400x400x5] 的图像序列。
  • 每个输入序列的平均长度为20张图像。
  • CNN 具有16个形状为 5x5x5 的滤波器,应用步幅为2,填充为2。
  • LSTM 是一个多对一层,具有256个输出单元和偏置向量。
  • 全连接层有10个输出单元。
  • 训练过程经过10个时期,每个时期包含100个大小为128的序列批次。
    在这里插入图片描述
    当我们考虑一个CNN-LSTM-FCN模型时,循环部分包括CNN和LSTM,而FC则是网络的非循环部分。

首先,CNN接受一个形状为 400 ∗ 400 ∗ 5 400 *400 * 5 4004005的输入图像序列。该CNN有16个5x5x5的滤波器,应用步幅为2,填充为2。它产生一个输出,宽度和高度为 H ’ = W ’ = [ ( W − K + 2 P ) / S ] + 1 = [ ( 400 − 5 + 2 ∗ 2 + 1 ) / 2 ] = 200 H’=W’= [(W -K +2P)/S]+1 = [(400 - 5+2 * 2+1)/2 ]=200 H=W=[(WK+2P)/S]+1=[(4005+22+1)/2]=200,通道数为16。整个CNN的前向传递需要约 1.024 × 1 0 12 1.024 \times 10^{12} 1.024×1012 次浮点运算(FLOP)。

在将输入馈送到LSTM之前,CNN的输出被重新排列成一个 200 ∗ 200 ∗ 16 200*200*16 20020016的输入。然后,LSTM中每个序列标记的操作数量约为 1.31 × 1 0 9 1.31 \times 10^9 1.31×109FLOP。最后,全连接层(FC)有10个输出单元,它需要5120 FLOP。

整个网络的非循环部分相对较小,我们可以将总操作数近似为:

t r a i n i n g _ c o m p u t e ≈ o p s _ p e r _ f o r w a r d _ p a s s _ r e c u r r e n t × 3 × n _ e p o c h s × n _ b a t c h e s × b a t c h _ s i z e × a v g _ t o k e n s _ p e r _ s e q u e n c e ≈ 1.024 × 1 0 12 F L O P × 3 × 10 × 100 × 128 × 20 = 7.86432 × 1 0 18 F L O P training\_compute≈ops\_per\_forward\_pass\_recurrent \times 3 \times n\_epochs \times n\_batches \times batch\_size \times avg\_tokens\_per\_sequence ≈1.024 \times 10^{12}FLOP \times 3 \times 10 \times 100 \times 128 \times 20=7.86432×10 ^{18}FLOP training_computeops_per_forward_pass_recurrent×3×n_epochs×n_batches×batch_size×avg_tokens_per_sequence1.024×1012FLOP×3×10×100×128×20=7.86432×1018FLOP

方法2:基于硬件设置和训练时间计算运算次数

另一种估算方法涉及考虑所使用的硬件和训练时间。我们将研究如何利用这些硬件方面的信息来估算计算资源的使用情况,并探讨硬件选择如何影响深度学习模型的性能和效率。

传统的基于硬件设置和训练时间计算运算次数是用使用GPU天数做为标准

GPU使用天数:描述了单个GPU用于训练的累积天数。如果训练持续了5天,总共使用了4个GPU,那等于20个GPU天数。

传统的用GPU天数来估算计算资源的方法存在一些问题。首先,它只关注训练所使用的时间,而忽略了训练过程中所使用的计算硬件的性能。在十年内,GPU的性能显著提升,因此相同的GPU天数在不同时期所完成的实际计算工作量可能存在巨大差异。

此外,该方法没有考虑到不同硬件设置之间的差异。同样的GPU天数在不同的硬件配置下可能导致不同数量的浮点运算。因此,为了更准确地估算计算资源的使用情况,我们需要考虑硬件性能和配置的影响。

因此我们需要用GPU时间结合硬件配置估算FLOP,具体步骤如下

1.从论文/参考文献中提取信息:

在深入研究模型相关论文时,我们需要从中提取以下关键信息:

  1. GPU天数的数量:论文中应该包含关于训练模型所用GPU的天数,这反映了模型在训练期间的计算资源使用情况。
  2. 所使用的计算系统/GPU:论文应该明确说明在训练期间使用的计算系统或GPU型号,这对于了解硬件规格和性能至关重要。
  3. 训练运行期间使用的浮点数数字表示:论文应提供关于训练运行期间所采用的数字表示的信息,如FP32、FP16、BF16、INT8等。这直接关系到模型在计算过程中使用的精度。

2.阅读硬件规格

通过阅读硬件规格表,我们可以获取以下信息:

  1. GPU/系统的型号:通过查阅制造商的规格表,我们可以确定所使用的GPU或计算系统的具体型号。此信息对于计算性能的准确评估至关重要。
  2. GPU的峰值性能:规格表通常包含GPU的峰值性能,以FLOP/s(每秒浮点运算次数)为单位。这是评估硬件计算能力的关键指标。

以下是NVIDIA A100的示例:
在这里插入图片描述

如果您找不到使用过的硬件或上述硬件的规格,建议参考下面链接里的表格,估计给定年份的平均计算能力。您还可以在下面的框中找到每年峰值表现的图表

ML Hardware Data sheet

3.进行估算

综合上述信息,我们可以进行如下估算:

估算GPU的总FLOP:

步骤 1:计算单个GPU的峰值性能

从硬件规格表中获取GPU的峰值性能,表示为FLOP/s。例如,若峰值性能为 X X X FLOP/s。

步骤 2:计算总的GPU FLOP

通过将单个GPU的峰值性能乘以GPU使用的天数,我们得到总的GPU FLOP。假设GPU使用天数为 Y 天,那么总的GPU FLOP 为 X × Y X \times Y X×Y

精度的考虑:

步骤 1:确定训练使用的数字表示

从论文中获取模型在训练期间使用的数字表示,如FP32、FP16等。

步骤 2:确定每个数字表示的FLOP数

根据不同数字表示的标准,确定每个数字表示所需的FLOP数。例如,FP32可能需要 A A A FLOP,FP16可能需要 B B BFLOP。

步骤 3:计算总的FLOP数

将每个数字表示所需的FLOP数与模型中相应数字表示的使用情况相乘,得到总的FLOP数。假设使用了FP32和FP16,总FLOP数为
A × 数量 1 + B × 数量 2 A×数量1+B×数量2 A×数量1+B×数量2

考虑硬件特性:

步骤 1:检查是否使用了张量核心

查阅硬件规格表或相关文献,确定是否启用了NVIDIA的张量核心。如果启用,我们可以考虑这一特性对性能的影响。

步骤 2:了解张量核心的使用情况

若启用了张量核心,了解它在模型训练中的具体使用情况。这可能涉及到特殊的参数设置或架构要求。

步骤 3:调整总的GPU FLOP

如果使用了张量核心,可以根据其使用情况调整总的GPU FLOP。这可能需要根据具体情况进行一些额外的计算和估算。

通过这些详细的步骤,我们可以更准确地估算模型在训练期间的计算资源使用情况,考虑到不同精度和硬件特性的影响。

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

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

相关文章

刷题学习记录(含2023ISCTFweb题的部分知识点)

[SWPUCTF 2021 新生赛]sql 进入环境 查看源码,发现是get传参且参数为wllm fuzz测试,发现空格,,and被过滤了 同样的也可以用python脚本进行fuzz测试 import requests fuzz{length ,,handler,like,select,sleep,database,delete,h…

java学习part09类的构造器

1. 2.默认构造器 如果没有显式定义任何构造器,系统会默认加一个默认构造器。 如果定义了,则不会有默认构造器。 默认构造器的权限和类的权限一样,类是public构造器就是public,类是缺省默认构造器就是缺省 反编译之后添加的构造…

解决DaemonSet没法调度到master节点的问题

最近在kubernetes部署一个springcloud微服务项目,到了最后一步部署边缘路由:使用nginx-ingress和traefik都可以,必须使用DaemonSet部署,但是发现三个节点,却总共只有两个pod。 换句话说, DaemonSet没法调度…

UML建模图文详解教程05——包图

版权声明 本文原创作者:谷哥的小弟作者博客地址:http://blog.csdn.net/lfdfhl本文参考资料:《UML面向对象分析、建模与设计(第2版)》吕云翔,赵天宇 著 包图概述 包图(package diagram)是用来描述模型中的…

一个最简单的工业通讯数据分析例子

1.背景 对工业设备的通讯协议进行分析可以帮助我们更好地理解其工作原理和相关技术,并且有助于以下几个方面: 1. 优化工业设备的通讯效率:了解通讯协议的细节可以帮助我们找到通讯效率低下的原因并进行优化,提高设备的通讯效率和…

MySQL 8 配置文件详解与最佳实践

MySQL 8 是一款强大的关系型数据库管理系统,通过适当的配置文件设置,可以充分发挥其性能潜力。在这篇博客中,我们将深入探究 MySQL 8 常用的配置文件,并提供一些建议,帮助您优化数据库性能。 配置文件概览 在 MySQL …

【数据结构】二叉树概念 | 满二叉树 | 完全二叉树

二叉树的概念 二叉树在实践中用的很多。 一棵二叉树是结点的一个有限集合,该集合: 或者为空;由一个根结点加上两棵别称为左子树和右子树的二叉树组成。二叉树最多两个孩子。 这里注意:二叉树并不是度为2的树。 二叉树的度最大值是…

Go lumberjack 日志轮换和管理

在开发应用程序时,记录日志是一项关键的任务,以便在应用程序运行时追踪问题、监视性能和保留审计记录。Go 语言提供了灵活且强大的日志记录功能,可以通过多种方式配置和使用。其中一个常用的日志记录库是 github.com/natefinch/lumberjack&am…

【JAVA】我们该如何规避代码中可能出现的错误?(二)

个人主页:【😊个人主页】 系列专栏:【❤️初识JAVA】 文章目录 前言异常方法(Throwable类)Throwable类的方法 捕获异常多重捕获块 前言 异常是程序中的一些错误,但并不是所有的错误都是异常,并…

git-3

1.如何让工作区的文件恢复为和暂存区一样? 工作区所作的变更还不及暂存区的变更好,想从暂存区拷贝到工作区,变更工作区(恢复成和暂存区一样的状态),想到用git checkout -- 文件名 2.怎样取消暂存区部分文件的更改? 如…

无损压缩技巧:减小PDF文件尺寸的有效方法

我们在制作pdf文档的时候,会加入许多内容,文字、图片等等,素材添加的过多之后就会导致pdf文档特别大,在上传或者储存时,就会特别不方便,所以今天就告诉大家一个pdf压缩的方法,使用pdf在线压缩工…

洛谷 P1883 函数

P1883 函数 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn) Error Curves - 洛谷 | 计算机科学教育新生态 (luogu.com.cn) 这两题是一模一样的,过一题水两题。 分析 主要难点在于证明F(x)是一个单峰函数可以被三分,但是我随便画了几个f(x)之后发现好像…

MySQL的Redo Log跟Binlog

文章目录 概要Redo Log日志Redo Log的作用Redo Log的写入机制 Binlog日志Binlog的作用Binlog写入机制 两段提交 概要 Redo Log和Binlog是MySQL日志系统中非常重要的两种机制,也有很多相似之处,本文主要介绍两者细节和区别。 Redo Log日志 Redo Log的作…

Docker+ Jenkins+Maven+git自动化部署

环境:Centos7 JDK1.8 Maven3.3.9 Git 2.40 Docker 20.10.17 准备工作: 安装Docker Centos7默认的yum安装的docker是1.13,版本太低,很多镜像都要Docker版本要求,升级Docker版本。 卸载已安装Docker: yum …

你知道如何实现游戏中的透视效果吗?

引言 游戏中的透视效果可以合理运用CtrlCV实现。 不知道大家有没有这样一段经历:在做Cocos项目时需要一些特定的Shader去做一些特定的效果,例如透视、高光、滤镜等等,想自己写吧,不怎么会啊,网上又找不到&#xff0c…

redis-cluster集群(目的:高可用)

1、特点 集群由多个node节点组成,redis数据分布在这些节点中,在集群中分为主节点和从节点,一个主对应一个从,所有组的主从形成一个集群,每组的数据是独立的,并且集群自带哨兵模式 2、工作原理 集群模式中…

重生之我是一名程序员 37 ——C语言中的栈溢出问题

哈喽啊大家晚上好! 今天呢给大家带来一个烧脑的知识——C语言中的栈溢出问题。那什么是栈溢出呢?栈溢出指的是当程序在执行函数调用时,为了保护函数的局部变量和返回地址,将这些数据存储在栈中。如果函数在函数调用时使用了过多的…

安卓手机便签APP用哪个,手机上好用的便签APP是什么

在日常生活及工作方面,总是有许多做不完的事情需要大家来处理,当多项任务堆叠交叉在一起时,很容易漏掉一些项目,这时候大家会借助经常携带的手机来记录容易忘记的事情,如手机上的闹钟、定时提醒软件都可以用来记录待办…

2023亚太杯数学建模A题思路分析 - 采果机器人的图像识别技术

1 赛题 问题A 采果机器人的图像识别技术 中国是世界上最大的苹果生产国,年产量约为3500万吨。与此同时,中国也是世 界上最大的苹果出口国,全球每两个苹果中就有一个,全球超过六分之一的苹果出口 自中国。中国提出了一带一路倡议…

JDK11新特性

目录 一、JShell 二、Dynamic Class-File Constants类文件新添的一种结构 三、局部变量类型推断(var ”关键字”) 四、新加的一些实用API 1. 新的本机不可修改集合API 2. Stream 加强 3. String 加强 4. Optional 加强 5. 改进的文件API 五、移…