混合 CPU-GPU 推理的崛起:何時以及如何有效卸載層
地方人工智慧的效率前沿
隨著本地 AI 模型的能力提升,它們的體積也隨之增大,往往甚至會使高階消費級 GPU 的記憶體承受壓力。曾經簡單的問題:“我的 GPU 能運行這個模型嗎?”現已演變為更為細緻的優化挑戰。答案越來越多地不再是選擇 CPU 還是 GPU,而是在於策略性地同時利用兩者。混合 CPU-GPU 推理–將模型巧妙地分配在 GPU 的高速運算能力以及 CPU 和 RAM 的豐富記憶體之間–已成為在有限硬體上高效執行大型模型的關鍵技術。這種方法代表了新的效率前沿,將曾被認為性能不足的機器轉變為能勝任的 AI 工作站,並作為通向可擴展、具成本效益的本地部署的重要橋樑。
為什麼選擇混合推論?超越 GPU 記憶體牆
混合推理的主要驅動因素是 GPU 記憶體屏障。模型必須適合在顯示卡的 VRAM 中運行,才能完全在 GPU 上運行,這樣可以提供最快的推理速度。當模型超出此限制時,傳統解決方案是完全在 CPU 上運行,儘管 CPU 擁有更多的系統 RAM,但其運算速度慢了數個數量級,導致延遲無法使用。
混合推理優雅地解決了這一難題。透過將模型中計算最密集的層加載到 GPU,而將其餘部分保存在系統 RAM 由 CPU 處理,你可以運行比 VRAM 通常允許的更大的模型,同時保留 GPU 的大部分速度優勢。
核心類比:把它想像成一個專業廚房。GPU 是你的超級明星主廚(在特定任務上極快,但工作空間有限–VRAM)。CPU 則是一群助理廚師(個別較慢,但可以使用整個食品儲藏室–系統 RAM)。混合推理就像廚房經理策略性地決定哪些任務(模型層)由明星主廚處理,哪些交給助理團隊,以最大化整體菜品產出。
策略性的「何時」:混合卸載情境
混合推理並不總是最佳選擇。使用此決策框架來判斷何時它能提供最大的優勢。
| 情境 | 建議的方法 | 基本原理 |
| 模型大小 > 顯示記憶體 | 混合推理 | 典型的使用案例。相較於完全使用 CPU,在可管理的性能損耗下,能夠運行比你的 VRAM 大 20-50% 的模型。 |
| 優先考慮吞吐量 | 完整 GPU 推論 | 如果你的模型可以完全放入 VRAM,就保持在那裡。這樣可以最大化每秒處理的詞元數。 |
| 最大化模型尺寸 | 全 CPU 推論 | 為了在 VRAM 非常有限但 RAM 充足的系統上運行可能的最大模型,儘管速度很慢。 |
| 服務多個模型 | 混合 + 全 GPU | 對於大型、使用頻率較低的模型使用混合模式,同時保持小型、高需求的模型完全加載在 GPU 上。 |
| 能量/熱量受限 | 保守混合 | 將更多層卸載到 CPU,以降低 GPU 使用率和功耗,犧牲一些速度來換取效率。 |
關鍵指標:如果在使用 Ollama 或 llama.cpp 等工具嘗試載入模型時遇到「記憶體不足」錯誤,混合卸載是你下一個合乎邏輯的步驟。
實用「如何」:實施層卸載
值得慶幸的是,這個實作正變得更加容易獲取,主要是通過一個參數來管理:ngl(GPU 層數)或在各種工具中的等效參數。
- 使用 Ollama:最簡單的方法
Ollama 內建支持層卸載。在運行或創建模型時,你可以指定將其中多少層放置在 GPU 上。
| # Run a model, offloading 40 of its layers to the GPU
ollama run llama3.1:8b –num-gpu-layers 40
# To make this permanent, create a Modelfile FROM llama3.1:8b PARAMETER num_gpu_layers 40 PARAMETER num_thread 8 # Can also optimize CPU threads |
如何找到合適的數字?從一個較大的數字開始(例如 50)。如果出現 VRAM 錯誤,則逐步減小數字。像 nvtop(Linux)或任務管理器的效能標籤(Windows 11)等工具可以幫助你實時監控 VRAM 使用情況。
- 使用 llama.cpp:細緻控制
llama.cpp 的主要二進位檔透過 -ngl 旗標提供精確控制,並且非常適合做基準測試。
| # Benchmark a model with different offload strategies
./main -m mixtral-8x7b.Q5_K_M.gguf -n 512 -ngl 0 –prompt “Hello” # CPU only ./main -m mixtral-8x7b.Q5_K_M.gguf -n 512 -ngl 20 –prompt “Hello” # 20 layers on GPU ./main -m mixtral-8x7b.Q5_K_M.gguf -n 512 -ngl 40 –prompt “Hello” # 40 layers on GPU |
- 進階調校:尋找最佳點
目標是找到曲線中的性能「膝點」–即添加更多 GPU 層會產生遞減效益。
- 系統性分析:測量不同 ngl 值(例如 0、10、20、30、40)下的每秒代幣數(t/s)。使用一致的提示長度。
- 監控資源:觀察你的 VRAM 使用量接近其最大值(例如,23.8 / 24 GB)。這是你的實際上限。
- 考慮模型架構:並非所有層都是相同的。早期層通常更適合使用 GPU 卸載。最後的 ngl 層會被送到 GPU。
經驗法則:一個好的起點是卸載足夠的層,以填滿你可用 VRAM 的 80-90%,並留下一個小的緩衝以應對額外開銷。
效能期望與權衡
了解性能曲線對於設定現實的期望至關重要。
- 曲線並非線性:最初卸載到 GPU 的層提供最大的速度提升。每增加一層,增益會逐漸減小。從 0 層增加到 20 層 GPU 可能會將速度提升三倍,而從 20 層增加到 40 層可能僅增加 50% 的速度。
- 通訊成本:資料必須通過 PCIe 線路在 CPU 的 RAM 與 GPU 的 VRAM 之間傳輸。這個開銷就是混合推理比全 GPU 推理慢的原因。與舊型或較慢的總線相比,PCIe 4.0 x16 介面在這方面明顯更好。
- 量化是你的朋友:使用量化模型(例如 Q4_K_M)可能是最有效的策略。它減少了模型的記憶體佔用,使更多層可以放入 GPU 中,直接提升混合性能。
邁向擴展的橋樑:從單一機器到叢集
在單一機器上掌握混合推理為更高級的擴展概念奠定了基礎:
- 多 GPU 推理:邏輯上的下一步。與其將層在 CPU 和單個 GPU 之間拆分,像 vLLM 中的 tensor_parallel 這樣的框架可以將它們拆分到多個 GPU 上,同時擴展記憶體和計算能力。
- 邊緣編排:在邊緣運算網路中,不同的模型或層可以分佈在各種設備上(例如高效能的閘道 GPU、較輕量的端點 CPU),所有這些都由中央編排器管理–這是一種混合推理的宏觀版本。
- 優化硬體組合:了解 CPU 與 GPU 的相互作用有助於做出更好的硬體選擇。這凸顯了不僅需要強大的 GPU,還需要具有高單核心性能的 CPU、快速的記憶體(DDR5)以及具有高頻寬 PCIe 匯流排的主機板的價值。
結論:透過策略性妥協解鎖能力
混合 CPU-GPU 推理是一種智慧的折衷藝術。它接受在原始速度上的權衡,以實現一個更重要的目標:讓現有的有限硬體能夠使用先進的 AI 能力。它讓更多人可以使用更大、更強的模型,而不需要在 GPU 記憶體上實現飛躍式的增加。
隨著本地 AI 領域朝著更大型的多模態與推理模型發展,像層卸載這樣的技術只會變得更加重要。通過理解並實施這一策略,你不再將硬體視為固定的限制,而是開始將其視為可被優化的靈活資源。這種思維方式是真正從運行孤立模型過渡到構建可擴展、韌性強且高效的本地 AI 系統的橋樑。
為您的特定模型和硬體找到最佳配置可能是一個複雜的調整過程。LocalArch.ai 的基礎架構專家專門從事本地 AI 系統的性能分析和優化。請聯繫我們,以確保您的本地設置能夠提供最大效率和能力。