疑難排解:症狀 → 原因 → 解法
本機推論的失敗有模式。同樣十幾個症狀涵蓋了幾乎所有求救文,而每一個都有無聊的原因與兩分鐘的解法。掃表格、套解法、然後讀數字確認真的修好了。
診斷表
| 症狀 | 可能原因 | 解法 |
|---|---|---|
輸出含角色 token(user:、`< |
im_start | >`) |
| 立即空回覆 | 模板渲染出「已完成」的對話,或 EOS token 錯誤 | 修模板;檢查 EOS:提示詞 |
| 複誦你的問題而不是回答 | base 模型,不是 instruct 模型 | 改用 instruct/chat GGUF |
| 載入時記憶體不足 | 權重+量化超過 VRAM | 更小的量化或更小的模型:VRAM 用量計算 |
| 生成中記憶體不足 | KV 快取長過餘裕 | 更短上下文、KV 快取 q8_0:KV 快取 |
| 有 GPU 卻 1–3 tok/s | 層還在 CPU 上 | 完整卸載(n_gpu_layers):引擎參數 |
| 首 token 慢、之後串流快 | 預填受限:提示詞太長 | 縮短提示詞、批次、更快的預填:速度 |
| 無盡重複、片語迴圈 | 取樣器太寬鬆、懲罰沒開 | temp ≤ 0.8、repeat_penalty 1.05–1.1:取樣 |
| 韓文輸出亂碼或生硬 | 模型韓文弱 | 多語家族(Qwen、Gemma):模型家族 |
| 句子中途被截斷 | 上下文視窗滿或 max_tokens 太低 | 修剪上下文或調高輸出上限 |
| 好模型吐無效 JSON | 自由形式取樣 | 約束解碼:結構化輸出 |
| 模型無視你的指令 | 長提示詞迷失在中間 | 目標在前、內容在後、再問一次:提示詞 |
| 載入時當掉或 coredump | 下載損毀 | 驗證總和檢查碼,重新下載 |
按症狀讀、不是按原因讀:對上你看到的、套解法、再量一次。多數「我的模型壞了」的求救停在第 1、2 或 6 行。
五分鐘飛前檢查
深入除錯之前,先蒐集事實:
nvidia-smi --query-gpu=name,memory.total,memory.used --format=csv # GPU + VRAM
ls -lh model.gguf # 大小 vs VRAM
llama-server --version # 引擎建置版本
如果模型檔比可用 VRAM 大,第 4 行就是你的答案,沒有旗標救得了你。如果生成期間 memory.used 穩定攀升,那是 KV 快取,不是漏記憶體。
正常長什麼樣
對效能除錯之前,先知道大概範圍。7–8B Q4_K_M 模型、批次 1 的解碼速度:
| 硬體 | 解碼 tok/s |
|---|---|
| 中階 GPU(RTX 3060/4060 級) | 30–60 |
| 高階 GPU(RTX 3090/4090 級) | 100–150 |
| Apple M 系列(統一記憶體) | 20–40 |
| 純 CPU(現代 8 核心) | 3–8 |
兩條公式解釋了大部分:
decode tok/s ≈ 記憶體頻寬 (GB/s) ÷ 模型大小 (GB)
需要 VRAM ≈ 權重 + KV 快取 + 1–2 GB 開銷
4.5 GB 的 7B 量化在 288 GB/s 卡上理論上限接近 64 tok/s;實際預期約 45–55。如果你在表的 2 倍以內,你的硬體不是 bug。
短提示詞的首 token 時間(TTFT)應該遠低於一秒;它隨提示詞長度÷預填吞吐量增長(預填吞吐是解碼速度的 10–100 倍)。10k token 的提示詞要 20 秒才出第一個 token,是預填受限,不是壞了。
VRAM 帳目:權重載入正常但之後 OOM,那是 KV 快取或上下文長度,不是量化——KV 快取。
工作流程:一次換一個變數
同時改兩件事時 bug 會躲起來。沿這條鏈隔離——模型 → 引擎 → 設定 → 提示詞:
- **基準。**已知良好的模型、已知良好的引擎、預設旗標。對話正常嗎?那堆疊就沒問題。
- 換模型(同引擎、同旗標)。壞了?是檔案或它的模板。
- 換引擎(同模型)。壞了?引擎 bug 或旗標翻譯問題。
- **對旗標二分。**還原預設,一次加回一個旗標直到壞掉。
- **傾印渲染後的提示詞。**輸出怪但能跑時,真相就在渲染後的模板裡。
邊做邊記筆記——「temp 0.8 正常、min_p 0.2 壞掉」是診斷;「試了一堆還是爛」不是。
如何好好地求救
一篇好的求救文是實驗室報告。包含:
- 模型檔:確切名稱、量化與來源(
qwen2.5-7b-instruct-q4_k_m.gguf、哪個存放庫)。 - 引擎與版本:llama.cpp 建置日期、Ollama 版本、vLLM 發布版——引擎每週都在變。
- 確切旗標或 API 呼叫:完整命令列或請求本體,不是轉述。
- 硬體:GPU+VRAM(或 Mac+RAM),若有層在 CPU 上也要寫。
- 觀察到的數字:tok/s、TTFT、VRAM 用量,以及確切的錯誤文字(若有)。
- 已經試過什麼、以及結果有什麼變化。
複製貼上骨架:
Model: qwen2.5-7b-instruct-q4_k_m.gguf (bartowski repo)
Engine: llama.cpp b4321 (llama-server)
Flags: -ngl 99 -c 8192 --temp 0.7
Hardware: RTX 4060 8GB / Ryzen 7 / 32GB RAM
Observed: loads in 21s, ~35 tok/s, TTFT ~1.2s, then OOM at ~6k ctx
Tried: -c 4096 → no crash; q8_0 KV → no crash
有這六項事實,多數問題一則回覆就能對到上面的表格。這個論壇正是為了這種貼文而存在——帶著實驗室報告來,你就會得到解法。