打卡第35天:GPU训练以及类的Call方法

知识点回归:
1.CPU性能的查看:看架构代际、核心数、线程数
2.GPU性能的查看:看显存、看级别、看架构代际
3.GPU训练的方法:数据和模型移动到GPU device上
4.类的call方法:为什么定义前向传播时可以直接写作self.fc1(x)

ps:在训练过程中可以在命令行输入nvida-smi查看显存占用情况

作业:

在GPU训练过程中,记录次数和训练时长非线性相关的原因可能涉及多个技术因素。以下是一些关键点:


硬件资源调度与并行效率

GPU的并行计算能力受限于任务分配和资源调度。例如,频繁的记录操作(如日志、检查点保存)可能触发同步点(synchronization),导致GPU计算流中断。此时,显存访问延迟或I/O瓶颈(如磁盘写入速度)可能成为主要耗时因素,而非训练本身的计算量。

# 示例:记录操作可能引入同步
torch.save(model.state_dict(), "checkpoint.pt")  # 同步写入磁盘


计算与I/O重叠程度

现代深度学习框架(如PyTorch)会异步处理计算和I/O。若记录操作未充分异步化,I/O等待时间可能无法被计算任务掩盖。例如,日志记录频率过高时,I/O队列饱和,导致训练线程阻塞。

# 异步日志示例(需配合多线程/异步库)
logger.async_log(loss.item())  # 假设存在异步接口


显存管理与中间状态

记录中间变量(如梯度、激活值)可能触发显存回收或扩容。显存分配/释放操作(如CUDA cudaMalloc)的耗时不稳定,尤其在显存碎片化严重时,额外开销可能非线性增长。

# 显存监控工具示例
nvidia-smi -l 1  # 实时观察显存波动


框架内部优化差异

框架的底层实现(如PyTorch的自动微分、TensorFlow的图优化)可能因记录需求调整计算图结构。例如,开启梯度检查点(Gradient Checkpointing)会减少显存占用但增加重计算时间,导致训练时长与记录次数呈现阶梯式变化。

# 梯度检查点示例
from torch.utils.checkpoint import checkpoint
def forward_pass(x):
    return checkpoint(model, x)  # 牺牲时间换显存


其他潜在因素

  • 数据吞吐量:数据加载器(DataLoader)的批次预处理速度可能受记录操作影响。
  • 分布式训练:多GPU通信(如AllReduce)与记录操作竞争带宽。
  • 操作系统调度:后台进程(如杀毒软件)可能随机抢占资源。

诊断建议

  1. 使用性能分析工具(如PyTorch Profiler)定位耗时操作。
  2. 调整记录频率,观察是否出现阈值效应。
  3. 对比不同硬件(如NVMe SSD vs HDD)下的训练时长差异。
# PyTorch性能分析示例
with torch.profiler.profile(activities=[torch.profiler.Activity.CUDA]) as prof:
    train_step()
print(prof.key_averages())

@浙大疏锦行

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值