打卡第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)与记录操作竞争带宽。
- 操作系统调度:后台进程(如杀毒软件)可能随机抢占资源。
诊断建议
- 使用性能分析工具(如PyTorch Profiler)定位耗时操作。
- 调整记录频率,观察是否出现阈值效应。
- 对比不同硬件(如NVMe SSD vs HDD)下的训练时长差异。
# PyTorch性能分析示例
with torch.profiler.profile(activities=[torch.profiler.Activity.CUDA]) as prof:train_step()
print(prof.key_averages())
@浙大疏锦行