大模型面經(jīng)—如何評估顯卡利用率及顯卡運用優(yōu)化方法 原創(chuàng)
?本篇總結(jié)了顯卡利用率評估方法及顯卡運用優(yōu)化方法。
本篇來總結(jié)一些顯卡優(yōu)化的經(jīng)驗,還是按照面經(jīng)的形式給出,希望能給到大家一些實際訓練效率優(yōu)化的幫助~
下面是一個快捷目錄。
一、如何評估顯卡利用率?
二、如何優(yōu)化顯存利用率?
一、如何評估顯卡利用率
使用deepseed時,zero3如果沒有 nvlink,多卡訓練下會變慢很多,下面有三種方法來評估訓練時發(fā)揮了多少GPU性能。
1. flops 比值法
采用Nvidia可參考的顯卡峰值計算速度進行計算
gpu 利用率 = 實測的flops/顯卡理論上的峰值flops
實測的flops可以直接用 DeepSpeed Flops Profiler直接得到。
舉例:deepspeed 實測flops 100tflops,而用的是A100卡理論峰值312tflops,可以得到GPU 利用率只有 32.05%
2. throughout 估計法
根據(jù)論文中的訓練速度或者吞吐量進行計算,一般論文中會說明 3300 token/s/gpu
gpu 利用率 = 實際吞吐量 / 論文中的吞吐量(假設(shè)利用率100%)
舉例:
實測訓練時處理樣本速度為 3 example/s,一共有4卡,max length 2048,則吞吐量為 1536 token/s/gpu ;
根據(jù)llama 論文知道,他們訓練7B模型的吞吐量約為 3300 token/s/gpu,那么GPU利用率只有46.54%
3. torch profiler 分析法
利用torch profiler 記錄各個函數(shù)的時間,將結(jié)果在tensorboard上展示,在gpu kenel視圖下, 可以看到tensor core 的利用率,比如30%。
profiler是一個用于分析訓練的一體化工具。它可以記錄CPU操作時間、CUDA內(nèi)核計時、內(nèi)存消耗歷史,只需要將訓練嵌入到分析器上下文中,如下所示:
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。
最推薦的還是方法三,可以比較詳細地監(jiān)控訓練過程。
二、如何優(yōu)化顯存利用率
如果發(fā)現(xiàn)GPU利用率很低,那么需要采取一些優(yōu)化措施。以下是一些優(yōu)化 GPU 性能的方法:
1. 減少日志IO操作頻率
輸出頻率過多非常影響訓練效率,所以一旦開始正式訓練盡量把日志精簡;有必要的話print也盡量少一些。
2. 基于類似于torch profiler 這樣的性能監(jiān)控方法結(jié)合具體的情況分析瓶頸
3. 數(shù)據(jù)加載效率過低
有可能是數(shù)據(jù)加載速度慢,導致 GPU 等待 CPU 提供數(shù)據(jù)。
可以通過下面的方法:
1)增加數(shù)據(jù)加載線程數(shù), 使用框架(如 PyTorch 或 TensorFlow)中 `DataLoader` 的 `num_workers` 參數(shù)增加數(shù)據(jù)加載的并發(fā)。
2)使用數(shù)據(jù)預緩存,在訓練開始前,將數(shù)據(jù)轉(zhuǎn)換為 Tensor 并存儲到高效格式(如 TensorFlow 的 TFRecord 或 PyTorch 的 `.pt` 文件)。
3)啟用異步加載,利用異步數(shù)據(jù)加載技術(shù),例如 PyTorch 的 `prefetch`。
4)使用更快的存儲設(shè)備,如果數(shù)據(jù)集較大,建議將數(shù)據(jù)存儲在 NVMe SSD 或 RAMDisk 上。
4. 模型架構(gòu)優(yōu)化
可以剪枝,簡化架構(gòu),使用 cuDNN 的優(yōu)化版本或 TensorRT 加速等更高效的算子進行計算。
5. 調(diào)整batch大小
有可能batch數(shù)過小,可以增大批量大小,盡量增大 batch_size 以提高并行計算效率,但需注意顯存是否足夠;并且進行混合精度訓練, 使用混合精度(float16 + float32)訓練(如 PyTorch 的 `torch.cuda.amp` 或 TensorFlow 的 `mixed_float16`),減少顯存占用,從而支持更大的批量。
6. 學習率和優(yōu)化器調(diào)整
還有一個可能是訓練配置不對,學習率不合理或優(yōu)化器效率較低。
可以使用合適的學習率策略(如 Warmup、Cosine Annealing);或者使用高效的優(yōu)化器(如 AdamW)或框架支持的 fused 優(yōu)化器(如 PyTorch 的 `fused_adam`)。
參考文獻
[1]【DeepSpeed 教程翻譯】三,在 DeepSpeed 中使用 PyTorch Profiler做性能調(diào)試和Flops Profiler教程翻譯 - 知乎
[2] 【LLM面試題】顯存問題/評估微調(diào)所需顯存_llm微調(diào)需要顯存多大-CSDN博客
?
文轉(zhuǎn)載自公眾號瓦力算法學研所,作者:喜歡瓦力的卷卷
