GTX 1060 跑 Qwen 35B 實戰:llama.cpp 從 3 tok/s 優化到 17 tok/s

整理一套低顯存顯卡執行 Qwen 35B 大模型的 llama.cpp 優化思路:為什麼預設速度慢,如何理解 MoE 卸載、記憶體瓶頸、上下文長度和穩定性參數,以及如何把 GTX 1060 這類 6GB 顯卡調到更可用的本地推理狀態。

6GB 顯存的 GTX 1060 能不能跑 35B 級別的大模型?

如果照傳統理解,第一反應多半是「不太現實」。35B 參數量太大,顯存只有 6GB,就算模型已經量化,也很容易遇到速度慢、記憶體爆掉、上下文拉不上去、跑一段時間就不穩定等問題。

但如果模型是 MoE 架構,再配合 llama.cpp 的分層卸載、CPU 記憶體承接和參數調校,情況就會變得有意思:它不一定能變成高階顯卡的體驗,但可以從「勉強能跑」優化到「日常測試可用」。

這篇按實作思路整理:目的不是神化 GTX 1060,而是講清楚低顯存顯卡跑 Qwen 35B 這類模型時,應該先看哪裡、調哪裡、怎麼判斷瓶頸。

先說結論

低顯存顯卡跑 35B 模型,關鍵不是把所有東西都塞進顯存,而是讓 GPU 只承擔最值得加速的部分。

大致思路是:

1
2
3
4
5
6
7
先能跑起來
-> 看預設速度為什麼慢
-> 調整 GPU 卸載層數
-> 利用 MoE 特性減少不必要負擔
-> 修復記憶體和快取瓶頸
-> 再拉上下文長度
-> 最後處理穩定性

如果一開始就盯著「顯存不夠怎麼辦」,很容易走偏。更實際的目標應該是:讓顯存、記憶體、CPU、磁碟和上下文快取配合起來,而不是只看顯卡型號。

準備環境

這種玩法建議先準備好幾個條件:

  • 一張 6GB 顯存左右的 NVIDIA 顯卡,例如 GTX 1060 6GB;
  • 足夠的系統記憶體,越低越容易卡在 swap 或 OOM;
  • 已經編譯好 CUDA 版本的 llama.cpp
  • 一個適合低顯存嘗試的量化模型檔;
  • 能接受速度不是雲端 API 等級;
  • 會查看顯存、記憶體和程序占用。

可以先用下面這些命令確認環境:

1
2
3
nvidia-smi
free -h
./llama-cli --help

如果 nvidia-smi 看不到顯卡,或者 llama.cpp 沒有 CUDA 支援,後面再怎麼調參數都不會有理想效果。

第一步:先讓模型跑起來

不要一上來就追求 17 tok/s。第一步只看一件事:模型能不能正常載入並輸出。

一個基礎命令通常長這樣:

1
2
3
4
./llama-cli \
  -m /path/to/model.gguf \
  -p "用三句話解釋什麼是 MoE 模型" \
  -n 128

如果這一步都失敗,先不要急著加 GPU 參數,優先檢查:

  • 模型檔路徑是否正確;
  • 模型量化格式是否被目前的 llama.cpp 支援;
  • 系統記憶體是否足夠;
  • 是否下載了錯誤版本的模型;
  • 目前二進位檔是否支援對應模型架構。

能跑起來以後,再開始優化速度。

為什麼預設速度可能只有 3 tok/s

低顯存環境下,預設參數慢通常不是單一原因造成的。

常見瓶頸有這幾類:

瓶頸 表現 處理方向
GPU 卸載太少 顯卡很閒,CPU 很忙 增加可承受的 GPU offload
卸載太激進 顯存爆掉或頻繁報錯 降低卸載層數
記憶體頻寬不夠 CPU 占用高但 token 慢 減少無效開銷,換更合適量化
上下文太大 一開始就很慢或記憶體暴漲 先用小上下文測試
swap 介入 系統卡頓明顯 增加記憶體或降低參數
批次參數不合適 prompt 處理慢 調整 batch 相關參數

所以調校時不要只看 tok/s 數字。建議同時開著:

1
2
watch -n 1 nvidia-smi
htop

觀察 GPU 顯存、GPU 利用率、CPU 占用和系統記憶體是否同步變化。

第二步:調整 GPU 卸載

llama.cpp 裡最常見的加速思路,是把部分層卸載到 GPU。

常用參數是:

1
-ngl 20

或者完整一點:

1
2
3
4
5
./llama-cli \
  -m /path/to/model.gguf \
  -p "寫一個本地大模型調校 checklist" \
  -n 256 \
  -ngl 20

這裡的 20 不是固定答案。低顯存顯卡要一點點試:

1
2
3
4
-ngl 10
-ngl 15
-ngl 20
-ngl 25

每次調整後看三件事:

  1. 是否能正常啟動;
  2. 顯存是否接近打滿;
  3. tok/s 是否真的提升。

如果顯存已經頂滿,再繼續加 -ngl 只會讓程式更不穩定,不一定更快。

第三步:理解 MoE 為什麼重要

MoE 模型和普通 dense 模型不太一樣。

MoE 的核心特點是:模型參數總量很大,但每次推理不一定啟用全部專家。也就是說,標稱 35B 不代表每個 token 都要完整跑一遍 35B 的全部計算。

這也是低顯存顯卡有機會嘗試的關鍵原因。

但要注意兩點:

  • MoE 不是免費魔法,模型檔仍然很大;
  • 顯存不夠時,仍然需要 CPU 記憶體承擔大量資料。

所以優化 MoE 模型時,重點是把真正高頻、值得加速的部分交給 GPU,把顯存用在刀口上。

第四步:處理記憶體瓶頸

很多人以為低顯存跑不動,只是顯存問題。實際上更常見的是顯存、記憶體、快取一起卡。

如果執行時系統記憶體接近耗盡,或者 swap 開始大量使用,速度會明顯下降。可以用:

1
free -h

或者:

1
vmstat 1

觀察是否出現頻繁 swap。

優化方向包括:

  • 換更小的量化版本;
  • 降低上下文長度;
  • 降低 batch;
  • 減少並行任務;
  • 關閉不必要的背景程式;
  • 確保模型放在速度較快的 SSD 上;
  • 給系統留足記憶體餘量。

如果系統記憶體本身太小,6GB 顯卡再怎麼調也很難舒服。

第五步:上下文長度不要一開始拉滿

很多模型預設宣傳支援很長上下文,但低顯存機器不要一開始就拉滿。

建議先從較小上下文開始:

1
-c 4096

確認穩定後再嘗試:

1
-c 8192

再往上加時,要觀察記憶體和速度變化。

上下文越長,KV cache 壓力越大。低顯存設備上,長上下文通常比單純生成短回答更容易暴露問題。

如果你的目標只是本地問答、程式碼片段解釋、短文本摘要,沒必要一開始追求特別大的上下文。

第六步:關注 batch 參數

llama.cpp 的 batch 參數會影響 prompt 處理和生成表現。不同版本參數名稱可能略有變化,可以先看說明:

1
./llama-cli --help

常見思路是:

  • prompt 很長時,適當調 batch 可能改善處理速度;
  • 顯存緊張時,batch 太大可能導致不穩定;
  • 不要照抄別人的數值,按自己機器測試。

調參時建議一次只改一個參數。

比如先固定模型、上下文和 -ngl,再嘗試 batch。否則你很難判斷到底是哪一個參數帶來了變化。

第七步:記錄自己的五個關鍵參數

低顯存本地推理最怕「今天能跑,明天忘了怎麼配」。

建議每次測試都記錄這幾個參數:

參數 記錄什麼
模型檔 模型名稱、量化版本、檔案大小
GPU 卸載 -ngl 或相關卸載參數
上下文長度 -c 數值
batch batch / ubatch 等相關設定
結果 tok/s、顯存、記憶體、是否穩定

可以簡單寫成:

1
2
3
4
5
6
7
model: Qwen-xx-35B-xxx.gguf
gpu: GTX 1060 6GB
ngl: 20
ctx: 4096
batch: 預設
speed: 約 17 tok/s
status: 短文本穩定,長上下文需繼續測試

這樣下次換模型或換機器時,就能快速對比。

一個更穩的測試流程

推薦按這個順序做:

  1. 不加 GPU 卸載,確認模型能載入;
  2. 加較低 -ngl,確認能輸出;
  3. 逐步提高 -ngl,找到顯存臨界點;
  4. 固定 -ngl,調整上下文長度;
  5. 固定上下文,再測試 batch;
  6. 用同一段 prompt 對比 tok/s;
  7. 跑 10 到 20 分鐘,觀察是否穩定;
  8. 記錄最終參數。

不要每次換一個 prompt 測速度。prompt 不同,結果沒有可比性。

可以準備一個固定測試提示詞:

1
請用 800 字解釋 MoE 模型為什麼適合低顯存推理,並給出三個注意事項。

每輪都用同一個提示詞,才方便判斷優化是否真的有效。

常見失敗嘗試

低顯存調大模型時,這幾類操作很容易浪費時間:

1. 盲目拉高 GPU 卸載層數

看到 -ngl 提升速度,就一直往上加。

問題是 GTX 1060 只有 6GB 顯存,越過臨界點後,程式可能直接報錯,或者看似啟動了但執行不穩定。

2. 一開始就拉超長上下文

長上下文對記憶體和 KV cache 壓力很大。先用短上下文把模型跑穩,再擴上下文更實際。

3. 只看平均 tok/s

tok/s 是重要指標,但不是唯一指標。

你還要看:

  • 首 token 延遲;
  • prompt 處理速度;
  • 顯存是否溢出;
  • 長時間執行是否穩定;
  • 系統是否卡到影響其他操作。

4. 不記錄參數

本地推理調校經常需要反覆試。沒有記錄,很容易陷入「剛才那個能跑的參數是多少來著」的循環。

適合 GTX 1060 的預期

GTX 1060 這類老顯卡適合做什麼?

適合:

  • 學習 llama.cpp
  • 測試 GGUF 模型;
  • 跑短文本問答;
  • 做本地模型參數實驗;
  • 體驗 MoE 模型的低資源執行方式;
  • 驗證某個模型是否值得換更好硬體部署。

不太適合:

  • 高併發服務;
  • 超長上下文重度使用;
  • 多使用者同時推理;
  • 大規模 RAG 生產環境;
  • 對延遲非常敏感的即時應用。

把 GTX 1060 當成實驗機器,它很有價值。把它當成生產級大模型伺服器,就容易失望。

一句話總結

6GB 顯存跑 Qwen 35B 這類模型,真正的重點不是「硬塞進顯卡」,而是用 llama.cpp 把 GPU 卸載、MoE 特性、系統記憶體、上下文長度和 batch 參數協調起來。

如果你手裡剛好有 GTX 1060 這種老顯卡,可以按這個順序試:

1
先跑通 -> 調 -ngl -> 看顯存 -> 控上下文 -> 查記憶體 -> 測 batch -> 記錄 tok/s

從 3 tok/s 到 17 tok/s,不靠玄學,靠的是一步步把瓶頸拆開。

记录并分享
使用 Hugo 建立
主題 StackJimmy 設計