大模型(LLMs)显存问题面来自:AiGC面试宝典宁静致远2023年09月16日21:001.大模型大概有多大,模型文件有多大?一般放出来的模型文件都是fp16的,假设是一个nB的模型,那么模型文件占2nG,fp16加载到显存里做推理也是占2nG,对外的pr都是10n亿参数的模型。2.能否用4*v10032G训练vicuna65b?不能。(刚发现fastchat上可以通过调用train脚本训练vicuna而非train_mem,其实也是可以训练的)3.如果就是想要试试65b模型,但是显存不多怎么办?最少大概50g显存,可以在llama-65b-int4(gptq)模型基础上LoRA[6],当然各种库要安装定制版本的。4.nB模型推理需要多少显存?考虑模型参数都是fp16,2nG的显存能把模型加载。5.nB模型训练需要多少显存?基础显存:模型参数+梯度+优化器,总共16nG。activation占用显存,和maxlen、batchsize有关解释:优化器部分必须用fp32(似乎fp16会导致训练不稳定),所以应该是2+2+12=16,参考ZeRO论文。注以上算数不够直观,举个例子?7B的vicuna在fsdp下总共160G显存勉强可以训练。(按照上面计算7*16=112G是基础显存)所以全量训练准备显存20nG大概是最低要求,除非内存充足,显存不够offload内存补。6.如何估算模型所需的RAM?首先,我们需要了解如何根据参数量估计模型大致所需的RAM,这在实践中有很重要的参考意义。我们需要通过估算设置batch_size,设置模型精度,选择微调方法和参数分布方法等。接下来,我们用LLaMA-6B模型为例估算其大致需要的内存。首先考虑精度对所需内存的影响:其次,考虑模型需要的RAM大致分三个部分:•首先,llama65b的权重需要5*v10032G才能完整加载到GPU。•其次,vicuna使用flash-attention加速训练,暂不支持v100,需要turing架构之后的显卡。•fp32精度,一个参数需要32bits,4bytes.•fp16精度,一个参数需要16bits,2bytes.•int8精度,一个参数需要8bits,1byte.•模型参数•梯度•优化器参数•模型参数:等于参数量*每个参数所需内存。•对于fp32,LLaMA-6B需要6B*4bytes=24GB内存•对于int8,LLaMA-6B需要6B*1byte=6GB扫码加查看更多对于常用的AdamW来说,需要储存两倍的模型参数(用来储存一阶和二阶momentum)。除此之外,CUDAkernel也会占据一些RAM,大概1.3GB左右,查看方式如下。综上,int8精度的LLaMA-6B模型部分大致需要6GB+6GB+12GB+1.3GB=25.3GB左右。再根据LLaMA的架构(hidden_size=4096,intermediate_size=11008,num_hidden_layers=32,context_length=2048)计算中间变量内存。每个instance需要:所以一张A100(80GBRAM)大概可以在int8精度;batch_size=50的设定下进行全参数训练。查看消费级显卡的内存和算力:2023GPUBenchmarkandGraphicsCardComparisonCharthttps://www.gpucheck.com/gpu-benchmark-graphics-card-comparison-chart7.如何评估你的显卡利用率zero3如果没有nvlink,多卡训练下会变慢。但是一直不知道究竟会变得多慢,下面给出几种方法来评估自己在训练时发挥了多少gpu性能,以及具体测试方法。7.1flops比值法举例:deepspeed实测flops100tflops,而用的是A100卡理论峰值312tflops,可以得到GPU利用率只有32.05%7.2throughout估计法举例:实测训练时处理样本速度为3example/s,一共有4卡,maxlength2048,则吞吐量为1536token/s/gpu根据llama论文知道,他们训练7B模型的吞吐量约为3300token/s/gpu,那么GPU利用率只有46.54%7.3torchprofiler分析法利用torchprofiler记录各个函数的时间,将结果在tensorboard上展示,在gpukenel视图下,可以看到tensorcore的利用率,比如30%•梯度:同上,等于参数量*每个梯度参数所需内存。•优化器参数:不同的优化器所储存的参数量不同。•fp32的LLaMA-6B,AdamW需要6B*8bytes=48GB•int8的LLaMA-6B,AdamW需要6B*2bytes=12GB>torch.ones((1,1)).to("cuda")>print_gpu_utilization()>>>GPUmemoryoccupied:1343MB(4096+11008)*2048*32*1byte=990MB•测试工具:deepspeed•参考数据:nvidia公布的显卡fp16峰值计算速度(tensorcore)gpu利用率=实测的flops/显卡理论上的峰值flops•测试工具:手动估算或者deepspeed•参考数据:论文中的训练速度或...
发表评论取消回复