2026-05-29 — 次瀏覽
一個 Triton FP8 繞道補丁,為 DGX Spark 的 GB10 擠出多 17% 的 NVFP4 速度
一個社群補丁把 NVFP4 權重改走 GB10 的 FP8 張量核心,而非緩慢的 BF16 後備路徑,讓 Qwen3.6-35B-A3B 在 DGX Spark 上從 40.8 提升到 47.6 tok/s。
NVIDIA 把 DGX Spark 行銷成一台原生支援 FP4 的 Blackwell 機器——但本月一篇社群實測揭露了這個說法背後的一個小註腳,以及一個巧妙的 80 行繞道方案,把行銷暗示的吞吐量補回了大半。簡短版本是:Spark 的 GB10 晶片的張量核心其實無法直接執行 FP4 運算,因此 NVFP4 模型一直在走一條緩慢的軟體後備路徑。一個 Triton monkey-patch 把它們改走晶片的 FP8 核心,於是 Qwen3.6-35B-A3B 從 40.8 躍升到 47.6 tok/s。
GB10 對 FP4 究竟做了什麼
NVIDIA DGX Spark 的 GB10 Superchip(Grace Blackwell,SM121)並沒有原生 FP4 硬體。這點很關鍵,因為 vLLM 在拿到 NVFP4 量化模型時,一直把矩陣乘法導向一條緩慢的 BF16 反量化後備路徑(Marlin path),而完全沒有用到晶片的 FP8 張量核心。4-bit 權重在 GEMM 執行前會被重新解包回 16-bit——這幾乎抵銷了量化的整個意義。你省下了記憶體,但運算路徑並不比跑一個更大的格式快。
這個 80 行的 Triton 繞道
一篇實測文章(發表於 2026 年 4 月 22 日,5 月 6 日更新)詳述了一個約 80 行的 Triton monkey-patch,在不分叉 vLLM 的情況下解決這個問題。在模型載入時,補丁把 NVFP4 權重轉成 FP8;在推論時,它透過 torch._scaled_mm 在 GB10 的 FP8 張量核心上執行 GEMM。由於它是一個執行期 monkey-patch,因此不需要修改 vLLM 原始碼——你匯入它,它就替換掉相關的 kernel,現有的 NVFP4 checkpoint 便突然走上了快速路徑。
作者也標出了反量化公式中一個關鍵更正:你必須除以全域 scale,而不是乘以它,以避免數值溢位。這正是那種會產生垃圾輸出或 NaN、而不是乾淨崩潰的「一個字元符號錯誤」,因此對任何想重現這個補丁的人都值得特別提醒。
數據
在 Qwen3.6-35B-A3B(NVFP4)上,單串流生成從 40.8 tok/s 提升到 47.6 tok/s——加速 17%。作為對照,同一台機器上的原生 FP8 checkpoint 的上限是 53.8 tok/s,因此這個補丁補回了緩慢後備路徑與專門打造的 FP8 模型之間的大部分(但非全部)差距。
| 路徑 | Qwen3.6-35B-A3B 單串流 |
|---|---|
| NVFP4 走 BF16 後備(Marlin) | 40.8 tok/s |
| NVFP4 走 Triton FP8 繞道 | 47.6 tok/s(+17%) |
| 原生 FP8 checkpoint(上限) | 53.8 tok/s |
此實測在 vLLM 0.19.1 搭配 NVIDIA 驅動程式 580.142 上執行。
實務筆記
如果你在 Spark 上自架,並因為 NVFP4 checkpoint 能塞進統一記憶體而一直選用它,這值得花十分鐘。誠實的決策樹是:如果你的模型有原生 FP8 checkpoint 而且塞得下,它在 53.8 tok/s 仍是最快的路徑。但 FP8 權重大約是 FP4 的兩倍大,在一台每一 GB 統一記憶體都要爭搶的機器上,對較大的模型而言這可能根本不是選項。此時 Triton 繞道能讓你在保留較小 FP4 佔用的同時,達到 FP8 上限約 12% 以內的水準——這是一筆真正划算的交易。把你的軟體堆疊釘在 vLLM 0.19.1 與驅動程式 580.142,以對齊測試過的組合,並在信任輸出前再次確認「除而非乘」的更正。
較少被討論的角度
這裡更深層的教訓,是關於如何解讀這款硬體上的 Blackwell 行銷話術。「原生 NVFP4 的 Blackwell」在格式層面上技術上為真——晶片理解這個編碼——但 GB10 的張量核心並不會直接執行 FP4 運算,因此這個 4-bit 格式只有在軟體把它橋接到一條矽晶能真正跑得快的路徑(例如 FP8)時才會有回報。在一台 3000 美元級、tok/s 與統一記憶體餘裕就是全部勝負的機器上,一個無需分叉 vLLM、僅 80 行的使用者層補丁就能補回逼近原生 FP8 的差距,這是一記尖銳的提醒:在 Spark 上,決定真實吞吐量的是 kernel 與執行期層——而非標籤上的量化格式。格式告訴你權重有多小;它沒告訴你它們跑得有多快。