模型训练时间的估算

本文详细解析了如何根据已知参数估算BERT模型的训练时间,包括每秒处理的样本数、总样本数、批次大小及迭代次数,展示了两种计算总训练时间的方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

模型训练时间的估算

昨天群里一个朋友训练一个BERT句子对模型,使用的是CPU来进行训练,由于代码是BERT官方代码,并没有显示训练需要的总时间,所以训练的时候只能等待。他截图发了基本的信息,想知道训练完整个模型需要多久。

最开始跑BERT模型的时候,我也碰到这个问题,当时没有深入研究,
不过后来换成keras,bert4keras等框架,可以直接输出时间,比较直观,也就忽略了这个问题。这次回过头来重新理一理,也算温故知新。

话不多说,截图如下:
在这里插入图片描述
在这里插入图片描述

基础量

先整理一下截图中已知的量:

global_step/sec = 0.204125
表示每秒训练多少个batch批次;

examples/sec = 3.26599
表示每秒可以训练的样本数量 ;

Num examples = 40127
表示样本的总数量

Batch size = 16
表示一批次有多少个样本;

Num steps = 25079
表示总共有多少步(批次)

Epoch = 10
迭代次数,即所有样本训练的次数

迭代次数Epoch没有在截图里,但是可以这样推算:

Epoch = Num steps * Batch size / Num examples
      = 25079 * 16 / 40127
	  = 10 次

推理公式

以下是推理出来的其它公式:

Num steps = Num examples * Epoch / Batch size 
25079 = 40127 * 10 / 16

一个迭代训练用时 = Num examples / (examples/sec)
                 = 40127 / 3.26599 
				 = 12286秒
				 = 3小时 24分 46秒

训练总用时(秒) = Num examples * Epoch / (examples/sec) (秒)
               = 40127 * 10 / 3.26599
		       = 122863 秒
		       = 34小时 7分 43秒

或者:
训练总用时(秒) = Num steps  / (global_step/sec) (秒)
               = 25079 / 0.204125
			   = 122861 秒
		       = 34小时 7分 41秒

** 附带一个时间长度的转换方法,可用于把秒数变成时间长度 **:

'''
# 经过的秒数 转成 时间长度
测试样例:
>>> getSpanTimes(122891234,unit='')
'3Y 10M 22D 08:27:14;'
>>> getSpanTimes(122891234,unit='en')
'3 Years 10 Months 22 Days 08 Hour 27 Minute 14 Second'
>>> getSpanTimes(122891234,unit='zh')
'3年 10个月 22天 08小时 27分 14秒'
'''
def getSpanTimes (lngTimeSpan, unit=''):
    import time
    unit_sim = 'Y |M |D |:|:|;'
    unit_en = ' Years | Months | Days | Hour | Minute | Second'
    unit_zh = '年 |个月 |天 |小时 |分 |秒'
    if unit=='en':
        unit_list = unit_en.split('|')
    elif unit=='zh':
        unit_list = unit_zh.split('|')
    else:
        unit_list = unit_sim.split('|')
    t = time.gmtime(float(round(lngTimeSpan,3)))
    #print(t)
    total_time = ''
    total_time += ('%d%s'  % (t.tm_year-1970, unit_list[0])) if t.tm_year>1970 else '' 
    total_time += ('%d%s' % (t.tm_mon-1, unit_list[1])) if t.tm_mon>1 else '' 
    total_time += ('%d%s'   % (t.tm_mday-1, unit_list[2])) if t.tm_mday>1 else '' 
    tm = "%%H%s%%M%s%%S%s" % tuple(unit_list[3:])
    total_time += time.strftime(tm, t)
    return total_time

最终结论

最终得到的结果:总训练时间可以这样计算:

** 训练总用时(秒) = Num examples * Epoch / (examples/sec) (秒) **

** 训练总用时(秒) = Num steps / (global_step/sec) (秒) **

ps: 看来使用CPU训练模型确实是非常慢,跑一个迭代要接受三个半小时。

### 如何估算模型训练时激活值所需的显存 在深度学习中,显存的需求主要由以下几个因素决定:模型权重、激活值(activations)、梯度以及优化器状态。对于激活值的显存需求,可以通过以下方法和公式进行估算。 #### 激活值显存估算的核心要素 激活值是指神经网络每一层前向传播过程中产生的中间输出数据。这些数据需要存储以便后续反向传播计算梯度。因此,在训练模式下,激活值会占用额外的显存空间。具体来说: - **每层激活值大小**可以表示为 `batch_size × input_height × input_width × channels` 的张量。 - 如果使用 FP32 数据类型,则每个数值占据 4 字节;如果使用 FP16 则减少到 2 字节[^1]。 #### 计算公式 假设一个卷积神经网络有 N 层,第 i 层的输入尺寸为 \(H_i \times W_i\) ,通道数为 \(C_i\) 。则该层激活值所需显存量可按如下方式计算: \[ \text{Activation Memory (Layer }i\text{)} = Batch\_Size \cdot H_i \cdot W_i \cdot C_i \cdot Bytes\_Per\_Element \] 其中, - \(Batch\_Size\) 是批量处理样本的数量; - \(Bytes\_Per\_Element\) 取决于精度设置,默认情况下浮点数单精度 (FP32) 占用 4 字节,半精度 (FP16) 占用 2 字节。 整个网络所有层总的激活值显存消耗为各单独层之和: \[ Total\_Activations\_Memory = \sum_{i=1}^{N}{(Batch\_Size \cdot H_i \cdot W_i \cdot C_i \cdot Bytes\_Per\_Element)} \][^1] 需要注意的是,在实际操作中还存在其他开销比如临时变量分配等,上述只是理论上的最低界限估计值[^2]。 另外值得注意的一点是在某些特殊架构或者技术应用场合下可能会有所变化,例如当采用Gradient Checkpointing 技术时虽然能有效降低峰值内存使用率但是也会带来一定时间成本作为代价. ```python def estimate_activation_memory(batch_size, layers_info, bytes_per_element=4): total_mem = 0 for layer in layers_info: h, w, c = layer['height'], layer['width'], layer['channels'] mem_layer = batch_size * h * w * c * bytes_per_element total_mem += mem_layer return total_mem / (1024 ** 3) # Convert to GBs layers_example = [{'height': 224, 'width': 224, 'channels': 64}, {'height': 112, 'width': 112, 'channels': 128}] print(f"Estimated Activation Memory: {estimate_activation_memory(32, layers_example):.2f}GB") ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值