你下載了 Qwen 的草稿模型,想讓本機服務回答得更快,卻在啟動時看到 FA3、TP 或並行數錯誤。這篇 DSpine 部署教學先帶你確認「這條路適不適合我的機器」,再走到首跑、比較與回退。
前半專為完全沒有推論部署背景的讀者寫;操作段給已有 Linux、NVIDIA GPU、Python 與模型儲存空間的人。你會學會把錯誤分層,留下可比較的紀錄;硬體條件不合,就保留現有服務。本文依 2026 年 11 月 11 日的官方文件與原始碼整理,未在 NVIDIA GPU 執行推論,以下提供操作與評估方法。
先說結論:能加速=配對正確+路徑相容+整段工作更快
DSpine=小助手平行寫草稿,大模型逐段驗收。小助手先填幾個候選字,大模型確認可以收下多少;猜錯就修正,再繼續。多一位助手也多一份工作,最後是否省時間,要把寫草稿、驗收、讀輸入與等工具的時間一起算。
本篇的順序是:固定版本 → 查硬體與後端 → 單請求跑通 → 同條件比較 → 保留回退。若你還不熟一般推測解碼,可先讀 vLLM Speculative Decoding 的基礎與測量;這裡專門處理 Tencent DSpine 的接線與限制。
一、DSpine 部署先認五個零件:草稿不是另一個聊天模型
①「主筆與助手」:主模型、draft 要配成一組
官方支援清單列出 Qwen3-8B 搭配 tencent/Qwen3-8B-DSpine-b16,以及 Qwen3.8-27B 搭配 tencent/Qwen3.8-27B-DSpine-b16。Draft 是為指定主模型準備的輔助權重;不要只看都有 Qwen 三個字,就把 8B、27B 或其他家族互換。
②「一起起草」:平行仍然需要前後關係
一般自回歸解碼像逐字接龍:寫完前一字,再算下一字。DSpine 論文讓多個草稿位置一起更新,並在每層把前一位置的預測特徵交給相鄰位置,讓前後關係沿網路深度傳遞。白話說,助手們同時動筆,也在一輪輪交換前一句的線索。
③「驗收幾個」:acceptance length 是過程指標
Acceptance length(每次驗證平均提交的 Token 數)可觀察一次大模型驗收推進多少。Token 是模型處理文字的小單位。專案 SPS 文件以「接受的草稿 Token 總數 ÷ 驗證次數+1」計算此指標;額外的 1 是該計數方式中的主模型提交。它不是答案正確率,也不是整個服務的加速倍數。
④「怎麼算」:注意力後端與採樣後端分開看
FA3 是注意力運算的實作;FlashInfer 在不同參數裡可能負責不同工作。27B 官方指令同時有 --attention-backend fa3、--speculative-draft-attention-backend fa3,以及 --sampling-backend flashinfer。最後一項出現 FlashInfer,並不表示能把前兩項一起換成 FlashInfer。這就像廚房的爐具與裝盤設備,名稱同屬一個供應商也不能互代。
⑤「幾張卡、幾個人」:TP 與並行數不是同一件事
TP(tensor parallelism,張量平行)把一個模型的計算分給多張 GPU;並行數則是同時在處理幾份請求。固定版參數檢查明確要求 CUDA 與 tp_size == 1。所以多買一張卡,不會自動讓這版 DSpine 走多卡 TP;把請求數從 1 加到 8,也不是把模型切成八份。
二、先過相容性關:版本、GPU、TP、並行依序查
本文固定 DSpine commit 321b0fc1388c4cdf03483ab73856975f7c0c0be7。套件設定要求 Python 3.11 以上,並鎖定 SGLang 0.5.22、PyTorch 2.14.1、flashinfer-python 0.7.1。這是會連到 SGLang 內部介面的 plugin;在另一個舊環境直接升級其中一包,很容易失去可比較的基準。

先保存 nvidia-smi 輸出,記下 GPU 型號、顯存、驅動與正在使用的程序。安裝環境就緒後,以 python -c "import torch; print(torch.__version__); print(torch.cuda.get_device_name(0)); print(torch.cuda.get_device_capability(0))"確認 PyTorch 看到的設備。驅動畫面寫的 CUDA 相容版本,與 Python 套件實際攜帶的 runtime 要分別記錄。
對 Qwen3.8-27B,取樣 kernel 建置碼直接檢查 compute capability 是否等於 (9, 0),否則報 Hopper GPU 錯誤。這是固定版程式的界線;RTX 6000 PRO 或 DGX Spark 的使用者,先核對自己是否會走到這段,而非反覆重裝 FA3。對 8B 首跑,本篇也選有相容 FA3 的 Hopper CUDA 環境,避免把更換硬體後端與驗證 DSpine 混在同一次實驗。
27B 的 worker 檢查還會把 CUDA graph 的 batch 設定與 --max-running-requests一起納入容量判斷;特定優化 sampler 的容量大於 8 就報錯。因此只把請求限制改小,卻保留過大的 graph batch,仍可能卡住。8B README 的 64 請求範例不能直接搬到 27B。
11 月 8 日的 issue #2與 11 月 10 日的 issue #5是使用者回報,能幫你辨認錯誤樣子;本文的限制判斷則以上述原始碼為依據。另有 官方 MLX 路線提供 Apple Silicon 的 Qwen3-8B 操作,它使用不同安裝與執行配置;不要在 Mac 上照貼本文 CUDA 指令,或把 MLX 的條件延伸成 27B 保證。
三、DSpine 部署首跑:先讓 Qwen3-8B 完成一個請求
第 1 步:「我拿到哪一版?」另建環境並固定來源
以下只在已有符合條件、可供測試的 GPU 主機操作。先執行 git clone https://github.com/Tencent/DSpine.git dspine-lab,接著 cd dspine-lab、git checkout 321b0fc1388c4cdf03483ab73856975f7c0c0be7。使用已安裝的 Python 3.11 以上建立 python3 -m venv .venv,再 source .venv/bin/activate、python -m pip install -e .。
用 python -m pip freeze > environment.txt保存套件清單,再核對上述鎖定版號。主模型與 draft 也要保留各自下載的 revision,不能只寫資料夾名。本次查閱的 8B 主模型 revision 是 b968826d9c46dd6066d109eabc6255188de91218,draft 是 9fc2ab3d4db06ca06dd30d91b2f8d28537673add;在模型平台選對該 revision,下載到你自己的固定資料夾,再把下一步路徑換成實際位置。
模型下載前,先留出主模型、draft、快取與環境的空間;運行顯存還包括 KV cache(已讀文字的中間計算)與 CUDA graph。下載大小不等於運行容量。官方範例使用 --trust-remote-code,這會允許模型載入時執行遠端程式碼:檢查固定 revision 的內容,使用不含正式服務密鑰的測試帳戶,再啟動。
第 2 步:「原本就能回答嗎?」先跑 AR 基準
把兩份權重固定到 /models/qwen3-8b 與 /models/qwen3-8b-dspine;這些是要自行替換的路徑。先以 sglang serve --model-path /models/qwen3-8b --tp-size 1 --dtype bfloat16 --attention-backend fa3 --page-size 1 --mem-fraction-static 0.65 --context-length 8192 --max-running-requests 1 --cuda-graph-bs-decode 1 --host 127.0.0.1 --port 30000 --trust-remote-code啟動原始解碼基準,將完整啟動指令與 log 存檔。
這是以官方 8B 範例縮為單請求、僅綁定本機的入門配置;沒有附上 AlphaLab 速度結果。等啟動完成後,以 curl -sS http://127.0.0.1:30000/generate -H "Content-Type: application/json" -d '{"text":"List three prime numbers greater than 100.","sampling_params":{"temperature":0,"max_new_tokens":128}}'送出一份固定請求。SGLang 請求文件可核對原生 /generate介面;先保存完整回應,再檢查是否產生有效文字與正確內容。
第 3 步:「助手真的加入了嗎?」只增加草稿設定
在啟動服務的終端按 Ctrl+C,確認服務退出,再用同一條基準指令加上 --speculative-algorithm DSPINE --speculative-draft-model-path /models/qwen3-8b-dspine --speculative-num-draft-tokens 16重新啟動。其他設定保持相同,再送剛才那份請求。先比較 log 是否載入指定 draft、有沒有驗證輪次及正常輸出,之後才計時。
能啟動卻沒有產生合格答案,仍屬未通過。若載入錯誤,先查模型配對與 revision;若錯在 kernel,查硬體與後端;若是記憶體不足,先縮小上下文與並行。每次只改一個變因,別同時改量化、FA3、模型與 block size。
四、再看 Qwen3.8-27B:保留一整組條件,別只抄模型名
要部署 27B,從 固定版完整指令開始逐項核對,而非把 8B 指令的路徑換掉。它同時指定兩個 FA3 後端、Triton linear attention、ReplaySSM、float32 SSM 狀態與 extra_buffer快取策略。參數驗證碼將其中幾項當作明確約束;這些設定共同處理主模型的狀態與驗證路徑。
先維持 --tp-size 1、--max-running-requests 8與 --cuda-graph-max-bs-decode 8的固定版上限,再按可用顯存縮小測試規模。README 的 --context-length 131072是參考配置,並非每張卡都能容納的承諾。需要多卡 TP 才放得下時,就保留原服務,別靠刪除驗證檢查硬闖。
服務穩定後,才考慮 SPS tuning(針對工作負載選驗證預算)。官方要求至少八份不同前綴,涵蓋實際上下文、任務與推理設定;在閒置 GPU 執行 python scripts/tune_sps.py --help先確認介面,再依文件準備 tokenized JSONL。這一段屬進階調校;首跑先證明可用,不急著追最佳成績。
五、怎麼比較 AR、DFlash2 與 DSpine,才知道值得換?
先問:「快的是哪一段?」27B 官方模型卡的評估使用 SGLang 0.5.22、BF16、FA3、並行 8;DSpine draft block 為 16,DFlash2 為 8,並加入動態驗證與 ReplaySSM。Agent 評估以既有 sandbox 軌跡的工具呼叫前綴依序回放。這提供特定測試條件的證據,不能直接當成你的即時工具任務會等比例縮短。

準備三組你知道如何驗收的工作:短文用相同長度與重點清單;推理題核對最後答案及步驟;工具回合保留相同工具回傳、提示模板與停止條件。從並行 1 開始,再測你的日常負載;27B 的固定版測試保持在上述容量內。暖機後重複多輪,交錯執行順序,保存每次原始結果。
- 首字延遲(TTFT):從送出請求到收到第一個有效輸出 Token。要用串流客戶端量;整包
curl回應的總時間不能冒充首字時間。 - 總完成時間:同時保留單次請求與整段任務時間。工具網路等待、失敗重試、思考設定與輸出 Token 數都要記。
- 峰值記憶體:測量期間定期記錄
nvidia-smi,標註採樣間隔;採樣最大值可能漏掉短峰值。 - 輸出有效性:文字是否完整、JSON 是否能解析、工具名稱與參數是否合規、最後任務是否完成。快但不合格,不能算成功。
先把同一主模型的 AR 與 DSpine 比清楚。要加入 DFlash2,再使用模型卡連到的 官方對應 checkpoint與其操作設定;記錄它自己的版本與 block,不把 DSpine 權重塞進另一演算法。若為了啟動而必須更換 runtime,將它列成另一配置比較,別宣稱只換了 draft。
Acceptance length 變長而總時間沒變,可能是草稿成本、prefill(讀入提示)或工具等待吃掉收益。不同版本不可直接互比;對隨機採樣,也不要要求每次文字逐字相同才算品質維持。先定義內容與格式的合格條件,再看各組有多少次完成。
六、停用與回退:先恢復已知可用的那一條路
在試驗前保存原服務的環境、權重路徑、啟動指令與客戶端設定。DSpine 出錯時,停止測試程序,把客戶端切回原本健康的服務。針對本篇 8B 最小範例,可重新執行第 2 步已驗收的 AR 指令;它本來就沒有帶三項 speculative 設定。27B 則恢復你預先驗收的完整 AR 配置,別只刪一個旗標,留下專為 speculative 路徑加入的組合。
回退後重送相同小請求,確認健康、內容與格式,再恢復使用。要把服務接進 Agent,可參考 建立 Agent Harness 的拆解,讓逾時與退出條件也有明確位置。若你真正需要的是 Mac 長任務比較,接著讀 MTPLX MTP 的 A/B 評估方法,不要混用 CUDA 配方。
常見問題:八個先講答案的判斷
1. 有 NVIDIA GPU 就能照貼嗎?
不一定。先核對固定版的 CUDA、FA3 與 kernel 路徑;27B 取樣 kernel 明確要求 capability 9.0。顯存夠與架構相容要分開確認。
2. 把 attention 改成 flashinfer 就能解決嗎?
先別改。27B native SWA 檢查要求 draft attention 為 FA3;sampling backend 的 FlashInfer 是另一項設定。先定位報錯在哪一層。
3. tp-size 2 可以加速嗎?
這個固定版會拒絕。參數驗證要求 TP=1;多卡服務需求先保留既有執行方案。
4. 八個並行,是所有 DSpine 的上限嗎?
不是這樣讀。此處是固定版 Qwen3.8-27B 特定優化路徑的容量檢查;8B 的 README 範例不同,不能互套。
5. Acceptance length 越大就一定越快?
不一定。它量每輪提交,不計完整任務裡的所有成本;請一起看總時間與合格率。
6. Mac 使用者要放棄嗎?
有另一條官方 MLX 路線。先按該文件核對 Qwen3-8B 的環境;本文沒有測試其推論,也沒有將它當成 27B 支援證據。
7. 每次輸出不同,表示推測解碼壞了嗎?
不一定。隨機採樣本就可能不同;先固定採樣設定,檢查格式、任務答案與重複多輪的表現。
8. 現在最值得做哪一步?
先保存環境身分與一份能通過的 AR 回應。有相容硬體才加入 DSpine;沒有就先完成相容性判斷,保留原服務。
給新手的三個重點
第一,先查主模型、draft、版本與 GPU,別從調參開始。第二,把「一次驗收更多字」與「整件工作更快完成」分開。第三,回退指令先存好,再開始比較。這三件事做完,你才有理由決定哪些工作值得換路徑。
接著閱讀
左右滑動查看更多推薦
下一步:留下一張能做決策的紀錄
回到最初的記法:小助手平行寫草稿,大模型逐段驗收。今天先填好版本、GPU、TP、並行、基準回應五欄;跑得通,再補首字、總時間、記憶體與有效性。當結果沒有改善,就用保存的原服務繼續工作;這也是一次有用的部署判斷。想系統化練習,可接著看 AlphaLab 課程,或從 AI 文章總覽選下一個實作。




