DeepSeek R1 横空出世后,吸引了众多公司和个人用户尝试其满血版本部署。然而原生版本的模型权重为 FP8 数据格式,对 GPU 芯片类型有严格限制,仅能被英伟达新型 GPU 支持(如 Ada、Hopper 架构芯片),其他型号 GPU(如 A100)无法直接部署。
为了解决这一难题,美团搜推机器学习团队对 DeepSeek R1 模型进行了 INT8 精度量化尝试,发现使用 INT8 量化后模型精度基本无损。基于 INT8 量化,DeepSeek R1 模型解锁了芯片限制,可以部署到 A100 等其他型号 GPU;并且相比 BF16 实现了 50% 的吞吐提升,进一步降低了推理成本。量化代码已经合入到了开源 LLM 推理框架 SGLang,量化模型已经发布到了 Hugging Face 社区,方便用户使用。
INT8: 友好的 “平替”
根据 DeepSeek 最新发布的技术报告 [1],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 [2]。
INT8 量化模型精度
分别应用上述的两种量化方法,对开源的 DeepSeek R1 模型进行了 INT8 量化处理,并在 GSM8K 和 MMLU 两个数据集上对量化后的模型进行了精度评估。评估结果如下表所示,相比基线的 BF16 和 FP8 模型,两种 INT8 量化模型的精度基本无损。
注:表中的精度结果是多次测试的均值。
INT8 量化模型推理吞吐
在知名开源推理框架 SGLang 上,对上述两种 INT8 量化方法进行了推理支持 [3],并进行了推理吞吐评估。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
总结与展望
综上,美团团队在 DeepSeek R1 上进行了 INT8 量化技术的探索,并基于 SGLang 框架进行了推理能力的支持,在保证量化后模型精度的前提下,让 DeepSeek R1 可以在如 A100 等老型号 GPU 上进行部署,并且提升了推理吞吐。他们希望开源的代码和权重可以让更多用户和业务方受益,也欢迎大家积极交流相关技术,共同建设、回馈开源社区。
参考文献
[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/