大模型面经—如何评估显卡利用率及显卡运用优化方法 原创
本篇总结了显卡利用率评估方法及显卡运用优化方法。
本篇来总结一些显卡优化的经验,还是按照面经的形式给出,希望能给到大家一些实际训练效率优化的帮助~
下面是一个快捷目录。
一、如何评估显卡利用率?
二、如何优化显存利用率?
一、如何评估显卡利用率
使用deepseed时,zero3如果没有 nvlink,多卡训练下会变慢很多,下面有三种方法来评估训练时发挥了多少GPU性能。
1. flops 比值法
采用Nvidia可参考的显卡峰值计算速度进行计算
gpu 利用率 = 实测的flops/显卡理论上的峰值flops
实测的flops可以直接用 DeepSpeed Flops Profiler直接得到。
举例:deepspeed 实测flops 100tflops,而用的是A100卡理论峰值312tflops,可以得到GPU 利用率只有 32.05%
2. throughout 估计法
根据论文中的训练速度或者吞吐量进行计算,一般论文中会说明 3300 token/s/gpu
gpu 利用率 = 实际吞吐量 / 论文中的吞吐量(假设利用率100%)
举例:
实测训练时处理样本速度为 3 example/s,一共有4卡,max length 2048,则吞吐量为 1536 token/s/gpu ;
根据llama 论文知道,他们训练7B模型的吞吐量约为 3300 token/s/gpu,那么GPU利用率只有46.54%
3. torch profiler 分析法
利用torch profiler 记录各个函数的时间,将结果在tensorboard上展示,在gpu kenel视图下, 可以看到tensor core 的利用率,比如30%。
profiler是一个用于分析训练的一体化工具。它可以记录CPU操作时间、CUDA内核计时、内存消耗历史,只需要将训练嵌入到分析器上下文中,如下所示:
import torch.autograd.profiler as profiler
with profiler.profile(
activities=[ProfilerActivity.CPU, ProfilerActivity.CUDA],
on_trace_ready=torch.profiler.tensorboard_trace_handler('./logs'),
) as prof:
train(args)
然后就可以启动tensorboard查看分析轨迹。注意这里需要先安装torch-tb-profiler。
最推荐的还是方法三,可以比较详细地监控训练过程。
二、如何优化显存利用率
如果发现GPU利用率很低,那么需要采取一些优化措施。以下是一些优化 GPU 性能的方法:
1. 减少日志IO操作频率
输出频率过多非常影响训练效率,所以一旦开始正式训练尽量把日志精简;有必要的话print也尽量少一些。
2. 基于类似于torch profiler 这样的性能监控方法结合具体的情况分析瓶颈
3. 数据加载效率过低
有可能是数据加载速度慢,导致 GPU 等待 CPU 提供数据。
可以通过下面的方法:
1)增加数据加载线程数, 使用框架(如 PyTorch 或 TensorFlow)中 `DataLoader` 的 `num_workers` 参数增加数据加载的并发。
2)使用数据预缓存,在训练开始前,将数据转换为 Tensor 并存储到高效格式(如 TensorFlow 的 TFRecord 或 PyTorch 的 `.pt` 文件)。
3)启用异步加载,利用异步数据加载技术,例如 PyTorch 的 `prefetch`。
4)使用更快的存储设备,如果数据集较大,建议将数据存储在 NVMe SSD 或 RAMDisk 上。
4. 模型架构优化
可以剪枝,简化架构,使用 cuDNN 的优化版本或 TensorRT 加速等更高效的算子进行计算。
5. 调整batch大小
有可能batch数过小,可以增大批量大小,尽量增大 batch_size 以提高并行计算效率,但需注意显存是否足够;并且进行混合精度训练, 使用混合精度(float16 + float32)训练(如 PyTorch 的 `torch.cuda.amp` 或 TensorFlow 的 `mixed_float16`),减少显存占用,从而支持更大的批量。
6. 学习率和优化器调整
还有一个可能是训练配置不对,学习率不合理或优化器效率较低。
可以使用合适的学习率策略(如 Warmup、Cosine Annealing);或者使用高效的优化器(如 AdamW)或框架支持的 fused 优化器(如 PyTorch 的 `fused_adam`)。
参考文献
[1]【DeepSpeed 教程翻译】三,在 DeepSpeed 中使用 PyTorch Profiler做性能调试和Flops Profiler教程翻译 - 知乎
[2] 【LLM面试题】显存问题/评估微调所需显存_llm微调需要显存多大-CSDN博客
文转载自公众号瓦力算法学研所,作者:喜欢瓦力的卷卷