大模型面经—如何评估显卡利用率及显卡运用优化方法 原创

发布于 2024-11-19 12:51
浏览
0收藏

​本篇总结了显卡利用率评估方法及显卡运用优化方法。

本篇来总结一些显卡优化的经验,还是按照面经的形式给出,希望能给到大家一些实际训练效率优化的帮助~

下面是一个快捷目录。

一、如何评估显卡利用率?

二、如何优化显存利用率?

 一、如何评估显卡利用率

使用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博客

文转载自公众号瓦力算法学研所,作者:喜欢瓦力的卷卷

原文链接:​https://mp.weixin.qq.com/s/8HezD5aWVnb_1nDJ236DvQ​

©著作权归作者所有,如需转载,请注明出处,否则将追究法律责任
收藏
回复
举报
回复
相关推荐