静态方法
手动估算训练算力与训练耗时
Estimating Training Compute of Deep Learning Models
draft report on transformative AI timelines
定义上算力FLOP(浮点操作数)一般指一次浮点加减或者乘除,另外一个单位是FMA(Fused Multiply-Add)或MACs(Multiply-Accmulate)则明确包含一次乘除和一次加减,可以简单认为1FMA或1MACs=2FLOP。
在训练里面反向传播和正向传播的算力比例按照经验近似为2:1,即训练所需算力大约为相同正向传播次数下的3倍。另外文中提到可以通过计算时间估计算力,该方法同样可以反过来计算训练耗时。
在已知模型单次传播(正向+反向)所耗算力的情况下,可通过硬件平台的浮点运算速度估算时间。NVDIA GPU在数据手册上的数值为理论峰值,实际上由于内存数据传输等待的问题GPU利用率不可能达到100%,文中给出的经验值多GPU训练的利用率按照30%(LLM)或者40%(其他模型),而在一般没有刻意优化的情况下可低至10%。torch-summary/torchinfo, thop 指定模型结构和输入大小,估算模型推理时内存占用以及所需算力
动态方法
- Profiler记录运算耗费资源
PyTorch Profiler With TensorBoard
Pytorch提供原生Profiler跟踪运算,输出结果到TensorBoard或者Chrome Trace文件 - 内存快照
Understanding CUDA Memory Usage
调用torch.cuda.memory._record_memory_history()启动内存快照记录,调用torch.cuda.memory._dump_snapshot()保存快照,在pytorch.org/memory_viz中载入保存的快照文件可以查看每一个时刻的内存分配情况。
Windows下运行可能会出现报错"record_context_cpp is not support on non-linux non-x86_64 platforms",将调用参数改为不记录C++的栈回溯即可torch.cuda.memory._record_memory_history(enabled='all', stacks='python')