美团搜推团队 投稿
量子位 | 公众号 qbitai
满血版deepseek r1部署a100,基于int8量化,相比bf16实现50%吞吐提升!
美团搜推机器学习团队最新开源,实现对deepseek r1模型基本无损的int8精度量化。
要知道,deepseek r1原生版本的模型权重为fp8数据格式,对gpu芯片类型有严格限制,仅能被英伟达新型gpu支持(如ada、hopper架构芯片),其他型号gpu(如a100)无法直接部署。
目前,量化代码已经合入到了开源llm推理框架sglang,量化模型已经发布到了hugging face社区,方便用户使用。
int8: 友好的“平替”
根据deepseek最新发布的技术报告,v3/r1突破性的训练成本控制主要依托fp8精度训练方案。fp8是一种典型的模型量化技术,相较于业界常用的bf16精度,fp8精度通过将数据位宽减半显著降低了单次计算开销,但也会带来一定的精度损失。
在实践中,deepseek r1采用了混合精度训练机制有效缓解了精度损失问题。
为了继续保持高吞吐性能,美团技术团队选择了和fp8精度等位宽的int8精度。同时,int8精度被广泛硬件原生支持,基于int8精度可以极大拓展deepseek模型的硬件部署范围。以硬件友好的int8精度为中心,美团技术团队开始探索fp8“平替”的落地方案。
量化技术的探索
具体来说,分块量化(block-wise quantization)是deepseek v3/r1降低量化损失的关键技术之一。分块量化通过对权重矩阵的细粒度切分,将量化操作的范围控制在[128, 128]的矩阵内,减少了分布分散的出现概率,从而很好地控制了每次量化过程中的损失。
美团技术团队延续了deepseek训练的量化策略,同样在[128, 128]的矩阵内进行分块量化操作,保证训练和推理的一致性。在量化目标的选型上,int8的优势在于其与fp8享有相同的位宽,且大部分硬件都对int8的数据计算原生支持。
在实践中,由于deepseek官方并没有提供半精度浮点型(bf16)的权重,因此首先需要将原生的fp8模型权重反量化成bf16,再分块量化成int8类型。另外在推理过程中,为了匹配权重的分块量化,激活值采用在线逐token-group的量化方式,即每个token的嵌入向量分为多个组,逐组进行量化。分块量化的激活值和权重的乘法过程如下左图所示。
除了上述的分块量化外,美团技术团队还探索了更高效的通道量化(channel-wise quantization),即权重的每列为一组进行量化。
通道量化在执行完int8的矩阵乘法后,只需进行一次反量化计算,计算开销更低。在具体实践中,同样地先将原生fp8的模型权重反量化成bf16,之后逐通道量化成int8类型。同时,对激活值采用在线逐token量化,最大程度地减少activation的量化损失。通道量化的激活值和权重的乘法过程如下右图所示。
目前,两种int8量化权重均已开源到hugging face。
int8量化模型精度
分别应用上述的两种量化方法,对开源的deepseek r1模型进行了int8量化处理,并在gsm8k和mmlu两个数据集上对量化后的模型进行了精度评估。评估结果如下表所示,相比基线的bf16和fp8模型,两种int8量化模型的精度基本无损。
注:表中的精度结果是多次测试的均值。
int8量化模型推理吞吐
在知名开源推理框架sglang上,对上述两种int8量化方法进行了推理支持,并进行了推理吞吐评估。sglang是当前sota的开源llm推理框架,在deepseek系列模型上有着最优的推理性能,被业界广泛使用。
在a100 gpu上对两种int8模型和bf16模型进行推理吞吐评估。得益于更低的显存要求,int8量化模型仅需要16张a100 gpu即可推理,但是bf16模型需要32张a100 gpu。为了比较的公平性,统一在32张a100 gpu上进行吞吐测试。结果如下表所示,分块量化的int8推理相比bf16可以提升33%的吞吐;通道量化的int8推理可以进一步达到50%的吞吐提升。
int8量化模型部署
以双节点各8张a100 gpu为例,开发者需要在双部署节点安装最新版本的sglang,然后分别执行下面命令:
# 分块量化int8推理 # 主节点 python3 -m sglang.launch_server \ --model meituan/deepseek-r1-block-int8 --tp 16 --dist-init-addr \ head_ip:5000 --nnodes 2 --node-rank 0 --trust-remote --enable-torch-compile --torch-compile-max-bs 8 # 副节点 python3 -m sglang.launch_server \ --model meituan/deepseek-r1-block-int8 --tp 16 --dist-init-addr \ head_ip:5000 --nnodes 2 --node-rank 1 --trust-remote --enable-torch-compile --torch-compile-max-bs 8
# 通道量化int8推理 # 主节点 python3 -m sglang.launch_server \ --model meituan/deepseek-r1-channel-int8 --tp 16 --dist-init-addr \ head_ip:5000 --nnodes 2 --node-rank 0 --trust-remote --enable-torch-compile --torch-compile-max-bs 8 \ --quantization w8a8_int8 # 副节点 python3 -m sglang.launch_server \ --model meituan/deepseek-r1-channel-int8 --tp 16 --dist-init-addr \ head_ip:5000 --nnodes 2 --node-rank 1 --trust-remote --enable-torch-compile --torch-compile-max-bs 8 \ --quantization w8a8_int8
下面是一些有趣的case:
深度思考能力展示
这里以curl为例发送一条请求:
curl -x post 'http://head_ip:5000/v1/chat/completions' \ --header 'content-type: application/json' \ -d '{ "model": "deepseek-r1", "messages": [{"role": "user", "content": "下列选项中,找出与众不同的一个:1.铝 2.锡 3.钢 4.铁 5.铜" } ] }'
在int8 r1的回答中(由于篇幅限制省略部分内容),能看到其风格独特的反思:
不过,我需要确认这一点是否正确。比如,有没有可能其他选项中也有合金?比如,锡有时候会和其他金属混合使用,但锡本身是纯金属。同样,铝、铁、铜都是纯金属。所以钢作为合金,应该是一个关键的不同点。另外,可以考虑其他属性,比如它们的用途、物理性质或化学性质。例如,导电性:银是最好的导体,但这里没有银,而铜的导电性也很好,铝也不错,铁和钢的导电性相对差一些。但这样分类的话,可能难以确定哪一个不同。……不过回到最初的分类,钢是唯一的合金,而其他都是纯金属,这一点可能更为基础。因此答案应该是3.钢。不过需要再验证一下这个结论是否正确。
最终答案也是正确的:
答案:3.钢
模拟海量小球运动
参考其他llm测试的prompts作为输入,对比int8(上)和fp8(下)输出代码的运行效果,int8完全不逊于fp8。
write a script for 100 bouncing balls within a sphere, make sure to handle collision detection properly. make the sphere slowly rotate. make sure balls stays within the sphere. implement it in p5.js
总结与展望
综上,研究团队在deepseek r1上进行了int8量化技术的探索,并基于sglang框架进行了推理能力的支持,在保证量化后模型精度的前提下,让deepseek r1可以在如a100等老型号gpu上进行部署,并且提升了推理吞吐。我们希望开源的代码和权重可以让更多用户和业务方受益,也欢迎大家积极交流相关技术,共同建设、回馈开源社区。
交流邮箱:[email protected]
参考文献
[1] 技术报告:liu a, feng b, xue b, et al. deepseek-v3 technical report[j]. arxiv preprint arxiv:2412.19437, 2024.
[2] hugging face:https://huggingface.co/meituan/deepseek-r1-block-int8,https://huggingface.co/meituan/deepseek-r1-channel-int8
[3] 推理支持:block-wise int8 deepseek r1支持(https://github.com/sgl-project/sglang/pull/3730)、channel-wise int8 deepseek r1支持(https://github.com/sgl-project/sglang/pull/3888)
[4] 其他llm测试:https://qwenlm.github.io/blog/qwq-max-preview/