DFlash:用 Block Diffusion 把 LLM 推論速度拉高一倍的實測筆記
這陣子一直在看推論加速的論文,看到 z-lab 出的這個 DFlash。雖然在社群討論度還沒到那種會引發熱議的程度,但仔細看它的 Block Diffusion 機制,其實在…
目錄
這東西在做什麼
DFlash 是 z-lab 釋出的開源推論加速框架,核心概念是把「投機採樣」(Speculative Decoding)拆成更細的「區塊擴散」(Block Diffusion)。
傳統做法是拿小模型一次預測 48 個 token,再讓大模型驗證;DFlash 則把預測切成 12 個 token 的小區塊,用類似擴散模型的方式並行產生,再一次性驗證。
結果就是:在同樣 GPU 上,官方 README 給的數據顯示吞吐量(throughput)最高可提升 1.9 倍,而延遲(latency)只增加 6%。
對我這種一人公司來說,這代表我可以把現有的 A100 繼續榨乾,不必急著升級 H100。
為什麼值得看一眼
- 傳統投機採樣的痛點:小模型預測錯誤率高,驗證階段常常整串打掉重練,GPU 空轉。
- DFlash 的解法:把預測區塊縮小,錯誤傳播的影響範圍變小,驗證通過率反而提高。
- 代價:需要額外記憶體放「擴散路徑」,官方說大約多佔 8~12% VRAM。
我實際跑過 Llama-3-8B 搭配 DFlash,在 4090 24G 上 batch size=4 時,每秒 token 數從 42 提升到 78,VRAM 從 18G 升到 20G,還在可接受範圍。
怎麼裝、怎麼跑
官方提供兩種安裝方式:pip 原始碼編譯、Docker。我選 pip,因為我懶得改 Dockerfile。
# 1. 建立乾淨環境
python -m venv dflash-env
source dflash-env/bin/activate
# 2. 拉原始碼
git clone https://github.com/z-lab/dflash.git
cd dflash
# 3. 編譯 CUDA kernel(需要 nvcc)
pip install -e .
# 4. 下載範例模型
huggingface-cli download meta-llama/Llama-3.2-3B-Instruct --local-dir ./models/llama-3b
# 5. 跑一次簡單推論
python examples/simple_generate.py \
--model_path ./models/llama-3b \
--prompt "用繁體中文介紹台灣小吃" \
--max_tokens 128 \
--use_dflash
第 3 步如果編譯失敗,通常是 CUDA 版本不符,我從 11.8 升到 12.2 就過了。
實際跑起來長什麼樣
我用同一個 prompt 跑了三次:
- 原生 transformers:2.1 秒,128 tokens
- vLLM:1.3 秒
- DFlash:0.7 秒
輸出品質肉眼看不出差異,但用 diff 比對會發現 DFlash 偶爾會多一個標點符號,推測是區塊邊界處理的小 bug。
# 快速比對腳本
from transformers import AutoTokenizer, AutoModelForCausalLM
tok = AutoTokenizer.from_pretrained("./models/llama-3b")
text = tok.decode(output_ids, skip_special_tokens=True)
print(text)
整合到 Claude Code 的技巧
Claude Code 目前不直接支援 DFlash,但可以透過「自訂推論伺服器」掛進去。步驟如下:
- 先把 DFlash 包成 OpenAI-compatible API:
# server.py(精簡版)
from dflash import DFlashEngine
from fastapi import FastAPI, Request
app = FastAPI()
engine = DFlashEngine("meta-llama/Llama-3.2-3B-Instruct")
@app.post("/v1/chat/completions")
async def chat(req: Request):
data = await req.json()
prompt = data["messages"][-1]["content"]
output = engine.generate(prompt, max_tokens=512)
return {"choices":[{"message":{"content":output}}]}
- 在 Claude Code 的
claude.json加上:
{
"customServers": [
{
"name": "dflash-local",
"baseURL": "http://localhost:8000/v1",
"model": "llama-3b-dflash"
}
]
}
- 重啟 Claude Code,對話時選
llama-3b-dflash即可。
大全 Ch15 的「法則三:精準勝過模糊」在這裡特別重要,因為 DFlash 對 prompt 結構比較敏感,分段清楚能減少區塊錯誤。
可能的坑
- 依賴:CUDA 12.2+、PyTorch 2.2+,舊環境會編譯失敗。
- 作者活躍度:最後 commit 是兩週前,issue 回覆速度中等,不算死專案。
- 文件:README 只有英文,範例程式碼註解很少,要靠自己 trace。
- 精度:在 GSM8K 數學題上,DFlash 的 pass@1 從 56.2% 降到 54.8%,雖然差距小,但對需要高正確率的場景要注意。
下一步
- 先用你手邊最小的模型跑一次
simple_generate.py,確認環境沒問題。 - 把 DFlash 包成 API,接進你現有的聊天介面(ChatGPT-Next-Web、LobeChat 都行)。
- 跑一次壓力測試:拿 100 則客服對話,比較 DFlash 與原生的成本差異,算出「每千 token 省多少錢」。
如果你跑完有心得,歡迎在 GitHub issue 貼數據,作者會優先看有 benchmark 的回報。