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的运行时间和内存使用情况。这样可以更直观地监控训练过程的性能。
Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐