DL简记5---如何评估大模型在训练或推理时每个batch的GPU显存利用率和运行时间?
·
1. 计算每个batch的运行时间(Runtime)
在模型训练或推理过程中,监控每个batch的运行时间是非常重要的。通过记录每个batch的开始和结束时间,我们可以计算出每个batch的运行时间。这对于性能优化和时间效率分析至关重要。
使用 time.time() 来记录每个batch的运行时间:
start_time = time.time() # 记录开始时间
# 进行模型的前向传播和损失计算
loss_status = self.run_batch(batch)
runtime = time.time() - start_time # 计算运行时间
2. 计算每个batch的内存使用(Memory Usage)
内存消耗是另一个重要的性能指标。通过 torch.cuda.max_memory_allocated() 可以获取每个batch的最大内存使用量(仅适用于GPU)。这种监控可以帮助你了解模型在每个batch上的资源消耗,尤其是在大规模训练时,内存使用往往是一个关键瓶颈。
计算内存使用的代码如下:
if self.device.type == 'cuda':
mem_usage = torch.cuda.max_memory_allocated(self.device)
mem_mb = mem_usage / (1024 ** 2) # 转换为MB
else:
mem_mb = 0 # 在CPU上无法获取内存信息,设为0
3. 在训练循环中加入内存和运行时间的监控
在训练过程中,我们需要实时跟踪每个batch的运行时间和内存消耗。这不仅可以帮助你监控性能,还能在训练过程中的进度条中提供实时反馈。
以下是一个示例,展示如何在训练循环中同时记录运行时间和内存使用:
for iter_id, batch in enumerate(dataset):
batch = batch.to(self.device)
# 重置CUDA内存统计
if self.device.type == 'cuda':
torch.cuda.reset_peak_memory_stats(self.device)
# 记录开始时间
start_time = time.time()
# 前向传播和损失计算
loss_status = self.run_batch(batch)
# 计算总损失
loss = loss_status['loss1'] * self.loss_weight[0] + loss_status['loss2'] * self.loss_weight[1]
loss /= sum(self.loss_weight)
loss = loss.mean()
# 计算运行时间
runtime = time.time() - start_time
# 获取内存使用(仅CUDA)
if self.device.type == 'cuda':
mem_usage = torch.cuda.max_memory_allocated(self.device)
mem_mb = mem_usage / (1024 ** 2) # 转换为MB
else:
mem_mb = 0 # CPU情况下无法测量,设为0
# 更新统计信息
batch_time.update(runtime)
loss1_stats.update(loss_status['loss1'].item())
loss2_stats.update(loss_status['loss2'].item())
# 在进度条中显示当前batch的内存和运行时间
if self.local_rank == 0:
Bar.suffix = '[{:}/{:}]|Tot: {total:} |ETA: {eta:} '.format(iter_id, len(dataset), total=bar.elapsed_td, eta=bar.eta_td)
Bar.suffix += '|Loss1: {:.4f} '.format(loss1_stats.avg)
Bar.suffix += '|Loss2: {:.4f} '.format(loss2_stats.avg)
Bar.suffix += '|Mem: {:.2f}MB |Time: {:.2f}s '.format(mem_mb, runtime)
bar.next()
在日志中记录每个epoch的平均内存和时间消耗:
通过记录每个epoch结束后的平均内存和时间消耗,你可以更好地评估训练的资源使用情况。以下是一个示例:
Epoch: 10/100 |Loss1: 0.2345 |Loss2: 0.5678 |Net: 23.45s |AvgMem: 120.35MB
最后的输出:
对于每个batch,进度条中将显示如下内容:
[10/100]|Tot: 1m 23s |ETA: 1m 25s |Loss1: 0.2345 |Mem: 120.35MB |Time: 0.45s
解释:
- 运行时间(Runtime):
Runtime是每个batch执行的实际时间,使用time.time()来计算。 - 内存使用(Memory Usage):
Memory Usage是指每个batch运行时GPU内存的消耗,使用torch.cuda.max_memory_allocated()获取最大内存消耗。 - 进度条显示:在每个batch处理时,进度条会实时显示当前batch的运行时间和内存使用情况。这样可以更直观地监控训练过程的性能。
更多推荐



所有评论(0)