真正讓人困惑的其實不是「怎麼裝 GPU」,而是:為什麼現在 GPU 需求爆成這樣,以前不會?答案不在硬體變快,在基底(模型變大)與情境(需求變無限)同時發生。這篇先講清楚需求暴增的根,再用 SVG 拆解「算力到底怎麼被吃掉」、以及 Agent / Ollama / vLLM / GPU 每一層能調的節點。
需求暴增 = 兩件事相乘:① 模型變大(以前 node 沒那麼多,現在隨便就 B 級參數,單次推論本身就重);② 需求變無限(以前算完給有限服務、人偶爾用;現在 agent 幫你 24/7、無時間限制狂打 API)。人有天花板,agent 沒有。
- 基底:以前 GPU 主要為了訓練/算出 model、node 少;現在是 B 級模型常駐,單次推論就很重。
- 情境:以前算完 → 有限服務(人用、有邊界);現在 agent 無限、無時間限制狂打 API。
- 兩者相乘 → GPU 需求跟以前不是同一個量級。
- 算力怎麼被吃掉:Agent → 推論層(Ollama/vLLM)→ GPU,算力=token 生成(prefill+decode)。
- 再加一條:微調從一次性變持續性 → GPU 被推論與訓練兩頭吃、互搶同批卡。
- 三層可調:Agent(模型選型/context)、推論層(量化/批次/KV)、GPU(VRAM/多卡);配合算力可插拔。
以前的 GPU 為什麼不會暴增
倒回去看舊世界:GPU 主要是為了訓練 / 算出一個 model。而且那時的模型 node(參數)沒現在多,單次算力需求有限。更關鍵的是——算完之後是「有限服務」:模型上線後由人偶爾去用,有次數、有時間邊界。人會累、會下班,需求自然有天花板。所以舊世界的 GPU 需求是可預期、有上限的。
現在為什麼暴增:B 級模型 × Agent 無限打 API
現在兩件事同時變了,而且是相乘關係:
- 基底:模型變大 —— 隨便一個模型就是 B(billion)級參數,node 暴增;單次推論要負荷的算力,比以前大好幾個量級。
- 情境:需求變無限 —— 以前是人用,現在是 agent 幫你用。agent 平行、24/7、無時間限制地狂打 API,一個任務能自己迭代幾十上百次。人有天花板,agent 沒有。
把這兩件相乘:大模型的單次成本 × agent 的無限併發 —— 這就是為什麼 GPU 需求跟以前不是同一個量級。基底(模型)墊高了每一次的成本,情境(agent)把次數推向無限。接下來再看,這些算力具體怎麼被吃掉、又能從哪裡調。
關鍵:舊 ML 是「一次預測」,LLM 是「逐 token 無窮迴圈」
這才是「以前一張卡就夠、現在要一整排卡」的根本 —— 不是模型大而已,是運算的形狀完全變了。
舊 ML 的 predict:一次 forward pass 就出結果(一個分類、一個數值、一句回覆)。離散、便宜、做完就停 —— 所以一張卡跑很多次 predict,服務整個 ML 團隊綽綽有餘。
LLM 的 generate:逐個 token、自迴歸。要吐一段話,是一個字一個字生:每產一個 token,都要把整個 B 級模型完整跑一遍(動用全部參數 + 讀整個 KV cache),再把這個 token 接回去、算下一個。一段回答 = 數百到數千次 forward pass,不是一次。
① 大模型(每次 forward 動用 B 級參數)× ② 逐 token 自迴歸(一段回答數百~數千次)× ③ agent 把整段無限重複。舊世界只有「一次 predict」;新世界是「迴圈裡再套迴圈」。所以一張卡撐不住,要一整排新卡。
你可能會反問:舊 ML 的 predict 不也要跑完整個模型的 node 嗎?那時怎麼沒爆炸?問得好 —— 差別不在「跑不跑 node」(兩邊都跑),而在三個乘數同時被推到極限:
| 乘數 | 舊 ML predict | LLM + agent |
|---|---|---|
| ① node 大小(每次多重) | 小模型(百萬級)→ 便宜 | B 級參數 → 貴幾個量級 |
| ② 每個答案跑幾次 | 1 次(離散,一問一答) | 數百~數千次(逐 token 自迴歸) |
| ③ 觸發頻率 / 工時 | 人偶爾、有邊界 → GPU 多半閒著 | agent 24/7 → GPU 幾乎全滿 |
| 相乘結果 | 一張卡綽綽有餘 | 一整排卡還不夠 |
還有一條:微調(調參數)從「一次性」變「持續性」
前面兩節講的是「推論」暴增。但你點出還有一條 —— 「調參數」這個動作本身也變了,而且這是新世界獨有的持續負擔。
| 舊 ML | 現在 | |
|---|---|---|
| 何時調參數 | 訓練一次 → 上線 → 收工 | 持續微調:LoRA / RLHF / DPO / 對齊 / 每領域或客戶一個 adapter |
| 在多大的模型上調 | 小模型 | B 級模型 → 單次就吃很多卡 |
| 跟推論搶卡? | 幾乎不搶(推論便宜) | 搶 —— 兩頭吃同一批 GPU |
舊模型:你直接對 GPU 程式
先回顧舊的那套(很多人的直覺仍停在這):你用 CUDA / PyTorch 寫 kernel 或訓練迴圈,把資料餵進去,GPU 把 FLOPS 算完吐結果。你擁有整條 pipeline、同步、你控制;算力好壞看吞吐與利用率。典型是訓練、或固定 batch 的推論。
新模型:Agent → 推論層 → GPU
AI Agent 這套完全不同 —— agent 不直接碰 GPU:
agent 只做一件事:把 prompt(一串 token)送給一個推論端點(Ollama / vLLM / 某個 API)。推論層負責 tokenize、批次、KV cache、量化,再把工作排上 GPU,逐 token 生成回傳。多個 agent / 請求共享同一張卡,靠推論層的排程器擠在一起算。模型該選多大,我在〈用甜蜜點階梯找剛好夠用的最小模型〉講過。
算力路徑一次看懂
把三個節點與各自的旋鈕擺在一起 —— 右下虛框就是「配合的算力」,可插拔:
token 生成的兩個階段:prefill vs decode
要會調,先懂 GPU 到底在忙什麼。一次生成分兩階段,瓶頸不同:
| 階段 | 在做什麼 | 瓶頸 | 影響誰 |
|---|---|---|---|
| prefill(讀 prompt) | 把整段 prompt 一次算進 KV cache | 算力(compute-bound)、可平行 | prompt/context 越長越貴 |
| decode(逐字生成) | 一次吐一個 token,反覆 | 記憶體頻寬 + KV cache 大小 | 輸出越長、batch 越大越吃 VRAM |
Agent 層能調什麼
- 模型選型:別動不動 120B。選「剛好夠用」的最小模型,VRAM、延遲、成本一起降。
- context / prompt 長度:砍掉沒用的上下文 → prefill 更快、KV cache 更小。
- prompt 快取:重複前綴重用 KV,省 prefill。
- max_tokens:限制輸出長度 → decode 更短。
- 平行 vs 序列工具呼叫:能平行就平行,但注意會同時佔更多並發。
推論層(Ollama / vLLM)能調什麼
這是你旋鈕最多的一層。兩個代表:
| 旋鈕 | Ollama | vLLM |
|---|---|---|
| 量化(裝得下) | GGUF `Q4_K_M`/`Q5`/`Q8` | AWQ / GPTQ / FP8 |
| context 上限 | `num_ctx` | `–max-model-len` |
| 並發 / 批次 | `OLLAMA_NUM_PARALLEL` | `–max-num-seqs`(continuous batching) |
| VRAM 用量 | `num_gpu`(offload 層數) | `–gpu-memory-utilization` |
| KV cache | llama.cpp KV | PagedAttention(分頁省記憶體) |
| 共同前綴重用 | (較有限) | `–enable-prefix-caching` |
| 多卡 | 較弱 | `–tensor-parallel-size` |
| 加速 | — | speculative decoding / chunked prefill |
GPU / 硬體層能調什麼
- VRAM 容量:最硬的天花板 —— 決定模型多大、context 多長、batch 多寬。
- 卡數 + tensor parallel:單卡裝不下就切模型跨多卡(需 NVLink 才不被互連拖死)。
- MIG 切片:A100/H100 可切成多個小 GPU 實例,給多個輕量服務。
- FP8 / INT8 硬體:新卡原生支援低精度,量化才跑得快。
配合的算力:可插拔(所以畫成虛框)
前面路徑圖右下那個虛框就是重點:推論層把 GPU 當一個可替換的算力後端。同一套 agent + 推論層設定,底下的算力可以隨需求換:
| 算力來源 | 適合 | 代價 |
|---|---|---|
| 本地 GPU | 資料不出門、延遲低、可控 | 要自己買卡、VRAM 有限 |
| 雲端 GPU | 彈性、要多少開多少 | 成本、資料出門 |
| MIG 切片 | 一張大卡分給多個輕服務 | 單片算力上限低 |
| 多卡 TP | 裝大模型 / 高吞吐 | 要 NVLink、複雜度高 |
畫成虛框是因為:它不是綁死的。你先把 Agent 層與推論層調對,算力那塊再依預算/資料政策插上去。
決策樹:算力不夠時,先調哪裡
常見問題 FAQ
AI Agent 是直接呼叫 GPU 嗎?
不是。Agent 把 prompt(tokens)送給推論層(Ollama/vLLM/API),由推論層排程上 GPU。Agent 端看到的是一個推論端點,不是 GPU。
跟以前用 GPU 訓練/跑 batch 差在哪?
舊模型你直接寫 CUDA/訓練迴圈、擁有整條 pipeline,算力=FLOPS;新模型多了一層推論引擎,算力=token 生成(prefill+decode),多請求共享一張卡由引擎排程。
為什麼有 GPU 還是很慢?
最常見是模型層沒全上 GPU(VRAM 不夠被 offload 到 CPU),或 context 太長把 prefill+KV 撐爆。先查 offload 與 context。
該先花錢加卡,還是先調參數?
先調。多數情況「量化 + 選對模型 + 砍 context + 開 batch」就解決了;加卡(虛框那塊)是調到頂還不夠才上。
發佈留言