对于常用的 AdamW 来说,需要储存两倍的模型参数(用来储存一阶和二阶momentum)。
除此之外,CUDA kernel 也会占据一些 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(80GB RAM)大概可以在 int8 精度;batch_size = 50 的设定下进行全参数训练。
查看消费级显卡的内存和算力:
2023 GPU Benchmark and Graphics Card Comparison Chart
https://www.gpucheck.com/gpu-benchmark-graphics-card-comparison-chart
7. 如何评估你的显卡利用率
zero3如果没有nvlink,多卡训练下会变慢。但是一直不知道究竟会变得多慢,下面给出几种方法来评估自己在训
练时发挥了多少gpu性能,以及具体测试方法。
7.1 flops比值法
举例:deepspeed实测flops 100tflops,而用的是A100卡理论峰值312tflops,可以得到GPU利用率只有 32.05%
7.2 throughout估计法
举例:
实测训练时处理样本速度为 3 example/s,一共有4卡,max length 2048,则吞吐量为 1536 token/s/gpu
根据llama论文知道,他们训练7B模型的吞吐量约为 3300 token/s/gpu,那么GPU利用率只有46.54%
7.3 torch profiler分析法
利用torch profiler记录各个函数的时间,将结果在tensorboard上展示,在gpu kenel视图下,可以看到tensor core
的利用率,比如30%
• 梯度:同上,等于参数量*每个梯度参数所需内存。
• 优化器参数:不同的优化器所储存的参数量不同。
• fp32 的 LLaMA-6B,AdamW 需要 6B*8 bytes = 48 GB
• int8 的 LLaMA-6B,AdamW 需要 6B*2 bytes = 12 GB
> torch.ones((1,1)).to("cuda")
> print_gpu_utilization()
>>>
GPU memory occupied: 1343 MB
(4096 +11008)* 2048 *32 * 1byte = 990MB
• 测试工具:deepspeed
• 参考数据:nvidia公布的显卡fp16峰值计算速度(tensor core)
gpu利用率 = 实测的flops/显卡理论上的峰值flops
• 测试工具:手动估算 或者 deepspeed
• 参考数据:论文中的训练速度或者吞吐量
吞吐量 = example数量/秒/GPU * max_length
gpu利用率 = 实际吞吐量 / 论文中的吞吐量(假设利用率100%)
• 测试工具:torch profiler 及 tensorboard
• 参考数据:无
评论