哪些硬體重要(哪些不重要)
本機 LLM 效能取決於三種資源,而它們並不等重。VRAM 容量決定你到底能跑什麼。記憶體頻寬決定生成感覺多快。原始算力主要決定按下 Enter 後你要等多久。把它們排對,每個硬體決策都變得顯而易見;排錯了,你就會為永遠用不到的 teraflops 買單。
排序:容量、頻寬、算力
- VRAM 容量(GB)——最硬的限制。裝不下的模型要嘛跑不動,要嘛溢到系統 RAM 上龜行。容量同時決定模型大小、量化等級與上下文長度,卡上其他任何東西都補償不了它的不足。
- 記憶體頻寬(GB/s)——token 吐出來的速度。每個生成的 token 都要從 VRAM 讀取幾乎整個模型,所以解碼速度=頻寬÷模型位元組數。生成期間算力大多在旁邊納涼。
- 算力(TFLOPS)——對預填重要:在第一個 token 出現前消化你的提示詞。FLOPs 越多,首 token 時間越短,多請求共享 GPU 時的批次吞吐量也越高。但它幾乎推不動單一串流的每秒 token 數。
哪種資源買到哪種體驗
| 體驗 | 受限於 | 感覺起來 |
|---|---|---|
| 載入模型 | 儲存、PCIe 通道 | 每場次一次 10–60 秒;不影響品質 |
| 首 token 時間(TTFT) | 算力(TFLOPS) | 長提示詞讓你等;吃 FLOPs |
| 生成速度(tok/s) | 記憶體頻寬 | ≈ GB/s ÷ 每 token 權重 GB 數 |
| 撐得住的上下文 | VRAM 容量 | KV 快取隨每個 token 增長(KV 快取) |
| 同時使用者數 | 先容量、後算力 | 先比容量,再比批次預填的 FLOPs |
兩條公式承載了幾乎全部的直覺:
decode tok/s ≈ effective bandwidth (GB/s) ÷ model size (GB)
prefill FLOPs ≈ 2 × parameters × prompt tokens
實例。8B 模型在 Q4_K_M 下權重約 5 GB。在頻寬約 1,000 GB/s 的 GPU 上,解碼上限是 1,000 ÷ 5 ≈ 200 tok/s;扣掉開銷後實際引擎落在 100–150。同樣的 2,000 token 提示詞大約需要 2 × 8×10⁹ × 2×10³ ≈ 32 TFLOPs 的預填運算——任何現代獨立 GPU 都在一秒內,在 CPU 上則慢得有感。模擬器 讓你用真實數字戳弄這些取捨。
為什麼新世代 GPU 幾乎不加速解碼
每個 GPU 世代大約讓算力翻倍:更多核心、更高時脈、更強的張量單元。預填與 TTFT 因此改善——長提示詞 RAG 與整個程式庫規模的智慧代理在新卡上明顯更俐落。但記憶體系統的進步少得多:GDDR6 到 GDDR6X 再到 GDDR7,每世代大概只多 20–50% 頻寬,而解碼吃的是頻寬。所以新卡消化提示詞更快,生成速度卻與頻寬相近的上一階幾乎一樣。比較本機 LLM 用的顯示卡時,先看 GB/s 與 VRAM 欄位,TFLOPS 最後再看。
多半不重要的東西
- 電源餘裕。 LLM 推論的功耗遠低於顯示卡的遊戲峰值。符合官方需求的優質電源供應器就綽綽有餘;別為一顆你永遠餵不滿的 1,600 W 怪獸編預算。
- **散熱。**只有連續多小時的服務部署才重要,熱節流會削時脈。任何像樣的雙風扇或三風扇卡都撐得住。
- **PCIe 通道。**x8 vs x16、Gen 4 vs Gen 5——影響模型載入時間與 CPU 卸載流量,不影響生成。除非你會卸載層,否則可以無視。
- **NVLink 與專業驅動。**嗜好級服務在解碼期間幾乎不在卡間搬資料。有也好,但在這裡永遠不值得花錢。
- **NPU。**現代筆電與桌面 SoC 的 NPU 跑小型視覺與音訊模型確實不錯,但就目前而言,還沒有以它為目標、真正可用的 LLM 服務堆疊。對話模型請規劃 GPU、CPU 或 Apple Silicon——而不是 NPU。
選購心法:先選模型,再選卡
不要問「我的 GPU 能跑什麼」。問你真正想要哪一級的模型,然後買裝得下它、還有餘裕的最便宜顯示卡:
- 選定工作負載:日常 8B 對話、認真的 32B 寫程式/推理助理,或預算允許時的 70B 級品質。
- 用你真正使用的上下文,算它在好量化下的佔用空間——VRAM 用量計算 有公式與現成表格。
- 對到有 10–20% 餘裕的顯示卡等級——GPU 等級 把等級對應到模型。
- 然後才在那個等級內最佳化頻寬。
從 GPU 預算往前推,就是人們如何買到一張只裝得下小到沒用的模型的快卡、或一張只用 40% 容量的巨卡。先編列模型的預算,再編記憶體,讓算力自己找到位置。升級任何東西之前,先確認你手上到底有什麼:
nvidia-smi --query-gpu=name,memory.total,memory.used --format=csv