大模型(LLMs)显存问题面
1.大模型大概有多大,模型文件有多大?
一般放出来的模型文件都是fpl6的,假设是一个nB的模型,那么模型文件占2nG,fpl6加载到显存里做推理也是占2nG,对外的pr都是10n亿参数的模型.
2.能否用4*v10032G训练vicuna65b?
不能.首先,llama65b的权重需要5*v10032G才能完整加载到GPU.其次,vicuna 使用flash-attention 加速训练,暂不支持v100,需要 turing 架构之后的显卡.(fastchat上可以通过调用train脚本训练vicuna而非train_mem,其实也是可以训练的)
3.如果就是想要试试65b模型,但是显存不多怎么办?
最少大概50g显存,可以在1lama-65b-int4(gptg)模型基础上LoRA[6],当然各种库要安装定制版本的.
4.nB模型推理需要多少显存?
考虑模型参数都是fp16,2nG的显存能把模型加载.
5.nB模型训练需要多少显存?
基础显存:模型参数梯度优化器,总共16nG.
解释:优化器部分必须用fp32(似乎fp16会导致训练不稳定),所以应该是2212=16,参考ZeRO论文.注:以上算数不够直观,举个例子?7B 的vicuna 在fsdp下总其160G显存勉强可以训练.(按照上面计算7*16=112G是基础显存)所以全量训练准备显存20nG大概是最低要求,除非内存充足,显存不够offload内存补.
activation 占用显存,和 max len、batch size 有关.
6.如何估算模型所需的RAM?
首先,我们需要了解如何根据参数量估计模型大致所需的RAM,这在实践中有很重要的参考意义.我们需要通过估算设置batch_size,设置模型精度,选择微调方法和参数分布方法等.接下来,我们用LLaMA-6B模型为例估算其大致需要的内存.
首先考虑精度对所需内存的影响:
fp32 精度,一个参数需要 32bits 4bytes.fp16 精度,一个参数需要16bits 2bytes.int8 精度,一个参数需要 8 bits 1 byte.
其次,考虑模型需要的RAM大致分三个部分:
模型参数:等于参数量*每个参数所需内存.
对于fp32,LLaMA-6B 需要6B*4 bytes=24GB 内存对于int8,LLaMA-6B 需要6B*1 byte= 6GB
> torch.ones((1 1)).to("cuda") > print_gpu_utilization()>>>GPU memory occupied: 1343 MB
综上,int8精度的LLaMA-6B 模型部分大致需要6GB6GB12GB1.3GB=25.3GB 左右.再根据 LLaMA 的架构(hidden_size =4096 intermediate_size =11008 num_hidden_layers = 32 contex1_length=2048)计算中间变量内存.每个 instance 需要:(4096 11008)* 2048 *32 * 1byte = 990MB所以一张A100(80GBRAM)大概可以在int8精度:batch_size=50的设定下进行全参数训练.查看消费级显卡的内存和算力:
2023 GPU Benchmark and Graphics Card Comparison Charthttps:/
7.如何评估你的显卡利用率
zero3 如果没有nvlink,多卡训练下会变慢.但是一直不知道究竞会变得多慢,下面给出几种方法来评估自己在训练时发挥了多少gpu性能,以及具体测试方法.
7.1 flops 比值法
测试工具:deepspeed参考数据:nvidia公布的显卡fpl6峰值计算速度(tensorcore)gpu利用率=实测的flops/显卡理论上的峰值flops举例:deepspeed 实测flops 100tflops,而用的是A100卡理论峰值312tflops,可以得到GPU利用率只有32.05%
7.2throughout估计法
7.3torchprofiler分析法
测试工具:torch profiler 及 tensorboard参考数据:无利用 torch profiler 记录各个函数的时间,将结果在tensorboard上展示,在gpukenel视图下,可以看到 tensor core 的利用率,比如 30%
总结:以上三种方法,在笔者的实验中能得到差不多的利用率指标. 从准确性上看,方案三>方案一>方案二从易用性上看,方案二>方案一>方案三
如果不想改代码就用方案二估算自己的训练速度是不是合理的,如果想精确分析训练速度的瓶颈还是建议使用方案三.
8.测试你的显卡利用率实现细节篇
8.1如何查看多机训练时的网速?
iftop命令,看网速很方便.
8.2如何查看服务器上的多卡之间的NVLINKtopo?$ nvidia-smi topo -m
8.3如何查看服务器上显卡的具体型号?cd /usr/local/cuda/samples/1_Utilities/deviceQuerymake/deviceQuery
8.4如何查看训练时的flops?(也就是每秒的计算量)
理论上,如果flops比较低,说明没有发挥出显卡的性能.如果基于deepspeed训练,可以通过配置文件很方便的测试."flops_profiler*: { "enabled": true "profile_step": 1 ‘1 :snpou do "module_depth": -1 "detailed": true nu : oryndhno } 参考:
8.5如何查看对deepspeed的环境配置是否正确?
S ds_report
8.6tf32格式有多长?
19位
8.7哪里看各类显卡算力比较?
8.8(torchprofiler)如何查看自已的训练中通信开销?
用pytorch profiler查看,下面给出基于transformers的一种快捷的修改方式. training_trainer_prof.py用记录的pt.trace.json文件放到 tensorboard上,可以看出 tensor core 的利用率.根据实践经验,使用deepspcedzero3时,pcie版本的卡很大部分时间都在通信上,AlIGather和ReduceScatter 的时间超过 tensor core 计算的时间,所以flops 上不去.