AI-LECTURER 速報課|2026-10-21|約 28 分鐘

DeepSeek 把自家線上引擎開源了:大模型怎麼跑得又快、又每次答案都一樣

📍 真實場景
阿哲,32 歲,新創公司的後端工程師,剛被老闆指派把公司客服機器人從外部 API 改成自己部署開源大模型

他在週五晚上租了一台 GPU 伺服器,用最陽春的方式載入模型,打算測試客服機器人一次同時回答 50 位客戶

😖 卡住的地方:他發現同一個問題問兩次,答案居然不一樣,客戶一多回應就變慢,GPU 明明很貴卻常常在空轉,完全不知道業界是怎麼解決的
💡 這課會用 DeepSeek 剛開源的 DeepInfer 當範本,讓你看懂線上大模型服務背後的四個關鍵工程技巧,以及資深工程師為什麼這樣取捨

🧭 這到底是什麼(白話版)

DeepInfer 是 DeepSeek 把自家正式上線服務所用的 推論引擎負責把訓練好的模型拿來實際回答問題的那套執行程式,好比餐廳的廚房,模型是食譜,引擎是廚師和灶台 開源出來的版本。目前它支援 DeepSeek-V4.1-Flash 這個模型,硬體則是 NVIDIA SM100 顯示卡和華為 Ascend 950 晶片。

它的賣點有兩類。第一類是「更快」:用 核心運算程式kernel,直接在顯示卡上執行的小型高度優化程式,專門做矩陣乘法這類最耗力的計算(像 FlashMLA、DeepGEMM)、非同步排程CPU 在安排下一批工作的同時,顯示卡已經在算上一批,兩邊不互相等待,以及用「草稿字」加速解碼。第二類是「更穩」:同樣的輸入永遠得到同樣的輸出,也就是 確定性取樣只要輸入的字和取樣參數相同,輸出就一定相同,不會每次抽籤抽到不同結果。

另外要注意:這次釋出的只是「離線推論」核心,官方明講完整線上服務還需要 KV 快取系統把已經算過的前文記憶存起來,下次不用重算的倉庫、預填與解碼拆開部署、跨副本的負載平衡,這些都「不包含」在內。也就是說它是引擎,不是整台車。另外它目前只能在 Linux 上建置,需要 Python 3.12、GCC 13 以上和 CUDA 13。

🎯 為什麼值得你花時間

貴的是 GPU 閒置大模型服務的成本主要是顯示卡租金。DeepInfer 的非同步排程和並行策略,目標就是讓顯示卡幾乎不空轉,同樣硬體就能服務更多人。
答案要可重現才能除錯如果同一個問題因為「剛好跟誰一起被處理」而得到不同答案,出了錯你根本無法重現問題。批次不變性和確定性取樣讓你能穩定重現,這對測試與稽核很重要。
這是少見的正式生產等級教材大多數教學範例是玩具程式,這份是支撐 DeepSeek 真實線上服務的程式碼,並且公開了哪些功能「刻意沒放」,讓你看到真實系統的邊界在哪。

⚙️ 它是怎麼運作的

1
1. 讀進一批請求並排程伺服器同時收到很多人的問題。非同步排程讓 CPU 在顯示卡還在算上一批時,就先把下一批排好,省掉等待的空檔。
▼
2
2. 預填:先讀完你的問題模型要先把整段輸入讀一遍(預填,prefill)。DeepInfer 的 SWA 有界重播只重算尾巴一小段而不是全部,減少重複工作。
▼
3
3. 解碼:一個字一個字吐出來回答是逐字生成的。DSpark 先用小模型猜幾個「草稿字」(預設最多 5 個),再由大模型一次驗證,猜對的就一次收下。
▼
4
4. 信心排程決定何時驗證系統估計草稿的信心程度,信心高就多猜幾個字再驗證,信心低就早點驗證,避免白做工。
▼
5
5. 取樣並選擇性限制格式最後從機率分佈挑出下一個字。可以固定隨機種子(seq_seed)讓結果可重現,也可以用 JSON schema 或 regex 強迫輸出符合格式。
README 中的主要功能與用途對照
功能解決的問題開啟方式(摘自 README)
DSpark 草稿驗證解碼太慢DEEPINFER_ENABLE_MTP_VARLEN=1
SWA 有界重播預填重算太多DEEPINFER_YOCO_PREFILL_TRUNCATION_MODE=compact
批次不變推論答案受同批其他請求影響DEEPINFER_BATCH_INVARIANT=1(僅 NVIDIA)
確定性取樣同輸入結果不同再加固定 seq_seed,並關閉 MTP_VARLEN
結構化輸出輸出格式亂跑SamplingParams 的 so_args 參數

🔍 程式碼漫遊(點有 ● 的行看白話講解)

以下是根據 README 說明整理的設定示意,用來看懂「要同時做到可重現」需要哪幾個開關;實際匯入與完整用法請以官方 examples 為準。

●import os
💬 環境變數是 DeepInfer 控制功能的主要方式,所以要在程式啟動前先設定。
●os.environ['DEEPINFER_ACCELERATOR'] = 'nvidia'
💬 告訴引擎用哪種硬體;華為晶片則改成 ascend。README 要求這個變數要在執行環境中一直保持設定。
●os.environ['DEEPINFER_BATCH_INVARIANT'] = '1'
💬 重點行:開啟批次不變推論,讓你的答案不會因為同批次還有誰而改變。目前僅支援 NVIDIA。
●os.environ['DEEPINFER_ENABLE_MTP_VARLEN'] = '0'
💬 重點行:要完全確定性就得關掉草稿加速。這就是「速度換可重現」的取捨,快與穩不能全都要。
●params = SamplingParams(seq_seed=1234)
💬 重點行:固定隨機種子,相同輸入加相同種子就得到相同輸出。SamplingParams 的匯入位置請看官方 examples。

🛠️ 動手做:草稿猜字實驗室:猜幾個字最划算?

  1. 把「草稿長度」拉到 1,「猜對率」維持 70%,按「開始模擬」,記下平均每次驗證收到幾個字。
  2. 把草稿長度拉到 8 再按幾次,觀察平均值是否一直變大,還是慢慢趨緩。
  3. 把猜對率降到 30%,再比較草稿長度 2 和 8,思考:猜得不準的時候,猜很多字還有價值嗎?
👇 下面是活的,直接操作

🧠 工程思維透鏡(資深工程師看到的是什麼)

🔭 為什麼「答案每次一樣」會這麼難,還要專門做批次不變推論?
電腦做小數加法時,加的順序不同結果會有極微小差異(浮點數不滿足結合律)。大模型為了提速,會依照同批請求的多寡改變運算切法,於是同一個問題因「鄰居」不同而得到略有不同的數字,累積後可能讓挑出的字都不同。批次不變推論強迫用固定的運算順序,代價是放棄部分針對批次大小的最佳化,所以它預設不開,是「可重現性 vs. 吞吐量」的明確取捨。
🔭 確定性取樣為什麼要求關閉 MTP_VARLEN(草稿加速)?
草稿加速會讓每一步接受的字數不固定,運算形狀隨之變動,這與固定運算順序的需求衝突。README 因此要求要確定性就得關掉它。資深工程師的做法是兩種模式並存:正式服務開草稿求速度,測試、稽核、回歸驗證時開確定性模式求可重現。
🔭 這次沒放 KV 快取與負載平衡,透露了什麼設計理由?
這些元件和各家的機房、網路、營運方式綁得很深,不容易通用;而核心引擎相對獨立,開源價值高、維護成本低。這是典型的「把可重用的核心與耦合基礎設施切開」的分層思維,也提醒你:拿到開源引擎不等於拿到完整服務,評估導入成本時要把缺的那塊算進去。

📝 隨堂考(點選答案,立即回饋)

Q1. DSpark 草稿驗證的核心想法是什麼?
✅ 草稿字由便宜的方式猜出,大模型一次驗證多個字,猜對率夠高時就能少跑很多次大模型。
Q2. 想讓同一輸入得到完全相同輸出,README 的做法是?
✅ 三者缺一不可:固定運算順序、避免變動的草稿接受數、固定隨機種子。
Q3. 下列哪一項「不」在這次 DeepInfer 開源釋出範圍內?
✅ README 明確列出 KV 快取系統、負載平衡等是完整服務所需但未包含的部分。
Q4. 在 Windows 11 上直接安裝 DeepInfer 可行嗎?
✅ 需求寫明 Linux、GCC 13 以上、Python 3.12 與 NVIDIA SM100 或 Ascend 950,所以本課用瀏覽器模擬來理解概念。

🃏 翻牌記憶卡(先想答案,再點開對答)

推論引擎是什麼?點我翻面
負責把訓練好的模型實際拿來回答問題的執行程式,重點是又快又穩。
批次不變推論解決什麼?點我翻面
同一個問題不會因為同批次還有哪些其他請求而得到不同答案。
為什麼快與可重現會衝突?點我翻面
加速手法常改變運算順序或形狀,而浮點數運算順序不同結果就有微小差異。
非同步排程的好處?點我翻面
CPU 排下一批和顯示卡運算上一批同時進行,減少顯示卡空轉。
結構化輸出怎麼用?點我翻面
在 SamplingParams 傳入 so_args,指定 regex、JSON schema 或 EBNF 文法來限制生成格式。

✅ 離開前自測(全勾=這課真的學會了)

0%