美團搜推團隊 投稿
量子位 | 公眾號 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/