【大模型】DeepSeek-R1各版本模型推理显存需求测算【理论+实践】
前言
最近临危受命,调研了一下DeepSeek需要什么硬件配置才能本地部署。查询中文社区相关资料,发现不少帖存在夸大唬人嫌疑。
于是撰写本文,辅以实验验证,以正试听。
1. 数据精度
硬件配置的核心就是显卡的显存。实际部署应用中,不可能拿CPU+大内存的方案进行推理,输出实在过慢。因此,理论上来说,只要显卡的显存容得下模型,部署就没问题。
要从理论角度计算不同参数量版本的模型大概需要多少显存,首先要理清不同精度和模型参数量之间的关系。不谈精度空谈参数量的结论都是耍流氓!
精度类型构成,常见的FP32、FP16等浮点数精度类型通常由符号位(sign)、指数位(exponent)和小数位(mantissa)三部分组成,如下图[1]所示。
符号为0或1,(0表示正,1表示负),指数位影响浮点数范围,小数位影响精度。
指数位越多,数据表示的范围越大;小数位越多,数据表示的精度越高。
除了FP(Floating Point)这种基本格式外,还有TF32(TensorFloat-32)、BF16(Brain Floating Point16)等特殊格式,通过微调范围或精度,做到性能和存储的权衡。
不同格式的基础情况如下表所示。
精度格式 | 总位数 | 符号位 | 指数位 | 小数位 | 主要用途 |
---|---|---|---|---|---|
FP64 | 64 | 1 | 11 | 52 | 科学计算、高精度需求 |
FP32 | 32 | 1 | 8 | 23 | 深度学习训练、通用计算 |
TF32 | 19 | 1 | 8 | 10 | NVIDIA Ampere GPU 深度学习训练 |
BF16 | 16 | 1 | 8 | 7 | 深度学习训练 |
FP16 | 16 | 1 | 5 | 10 | 深度学习推理、低内存场景 |
INT8 | 8 | 1 | 7 | - | 深度学习推理、量化模型 |
INT4 | 4 | 1 | 3 | - | 极度资源受限的推理场景 |
2. 模型推理显存理论计算
理清数据精度之后,就可以根据模型参数量对所需显存进行理论计算。
比如,DeepSeek-R1 - Distill Qwen - 32B
型号的模型,参数量为32B,如果参数精度为FP16,那么实际所需显存量即为32×16bit=32×10亿×16 bit
又因基本比特换算关系:
1 GB = 1 , 024 1,024 1,024 MB = ( 1 , 024 ) 2 (1,024)^2 (1,024)2 KB = ( 1 , 024 ) 3 (1,024)^3 (1,024)3 bytes = ( 1 , 024 ) 3 (1,024)^3 (1,024)3 × 8 = bit
即 32×10亿×16 bit = 32× 1 0 9 10^9 109×16 / ( 1 , 024 ) 3 (1,024)^3 (1,024)3 × 8 GB
由于32B并不是一个正好的整数,因此计算时,我们姑且认为1000 ≈ 1024,这样一进行化简,就可以得到:
32×10亿×16 bit ≈ 64 GB
理清这个关系之后,对于DeepSeek各版本各精度推理所需显存占用情况就可以同样计算,计算结果如下:
模型名称 | 版本 | 参数量 | FP16 显存占用 | INT8显存占用 | INT4 显存占用 |
---|---|---|---|---|---|
DeepSeek-R1-671B | 满血版 | 671B | 1342.0GB | 671.0GB | 335.5GB |
DeepSeek-R1 - Distill Llama - 70B | 蒸馏版 | 70B | 140.0GB | 70.0GB | 35.0GB |
DeepSeek-R1 - Distill Qwen - 32B | 蒸馏版 | 32B | 64.0GB | 32.0GB | 16.0GB |
DeepSeek-R1 - Distill Qwen - 14B | 蒸馏版 | 14B | 28.0GB | 14.0GB | 7.0GB |
DeepSeek-R1 - Distill Llama - 8B | 蒸馏版 | 8B | 16.0GB | 8.0GB | 4.0GB |
DeepSeek-R1 - Distill Qwen - 7B | 蒸馏版 | 7B | 14.0GB | 7.0GB | 3.5GB |
DeepSeek-R1 - Distill Qwen - 1.5B | 蒸馏版 | 1.5B | 3.0GB | 1.5GB | 0.75GB |
注:此表为理论计算,因为存在一些化简操作,所以实际部署时,显存占用会略高一些。
由此不难发现,在Ollama上,默认的xxb的DeepSeek-R1实际都是4位精度极致版。
所以各大厂商吹嘘的各种DeepSeek满血版,没准还是量化的残血版,真正的满血是671b模型+fp16精度!
3. 模型推理显存实践验证
空谈理论,还是缺乏实际数据支撑。
正好实验室的有三张4090D显卡闲置,拿来进行实验。
3.1 单卡32b部署
上表看出32b四位精度所需显存约16.0GB
,因此理论上单卡24GB的4090D就可以部署上去。
执行
ollama run deepseek-r1:32b
发现实际显存占用约21.1GB
,这里一方面是计算精度的误差问题,另一方面是KV Cache的问题(这里暂不细究)。因此,实际会比理论计算值略高一些。
3.2 双卡70b部署
在默认情况下,直接运行
ollama run deepseek-r1:70b
会报错:
Error: llama runner process has terminated: CUDA error
虽然ollama会自动扫描所有可用显卡,但多卡使用时,必须设置一下OLLAMA_SCHED_SPREAD
,以开启调度分布。更多环境变量及含义,可参考[3]。
修改配置文件
vim /etc/systemd/system/ollama.service
OLLAMA_SCHED_SPREAD
设为1,开启调度,并设置所用显卡为4,5。
保存,重新加载配置文件,并重启 ollama 服务。
systemctl daemon-reload
systemctl restart ollama.service
再次执行:
ollama run deepseek-r1:70b
查看日志:
journalctl -u ollama
可以看到ollama成功识别到了两张显卡:
4,5显卡显存占用情况:
总显存占用约为44.6GB。
3.3 三卡70b部署
两张卡已经能顺利部署70b的四位模型,下面再测试一下三卡部署70b的情况。
显卡占用情况如下:
显存占用约45.3GB,考虑到显卡本身的显存开销,实际双卡和三卡显存占用情况差不多,说明开启调度之后,ollama会自动把显存平均分配给各卡。
4. 训练所需资源估算
现在已经把DeepSeek-R1各版本所需推理显存分析透彻了。对于模型训练,显存的预估会更为复杂,因为有时候训练会涉及混合精度,资料[2]中部分提到了计算方式。
此外,还有16 比特全参数微调、冻结微调、LoRA 微调、QLoRA 微调等各种微调策略,这里挖个坑,后续再继续讨论大模型训练需要多少显存。
这里放一张LLaMA-Factory[4]的模型训练显存预估表,可大致参考:
参考资料
[1] NVIDIA A100 Tensor Core GPU Architecture :https://images.nvidia.cn/aem-dam/en-zz/Solutions/data-center/nvidia-ampere-architecture-whitepaper.pdf
[2] 一文讲明白大模型显存占用(只考虑单卡):https://zhuanlan.zhihu.com/p/713256008
[3] Ollama笔记(四)Ollama配置 :
https://zhuanlan.zhihu.com/p/712642806
[4] LLaMA-Factory:
https://github.com/hiyouga/LLaMA-Factory/blob/main/README_zh.md