Google Kubernetes Engine (GKE) 可精細控管大型語言模型 (LLM) 推論,提供最佳效能和成本。本指南說明如何使用 vLLM 和 Text Generation Inference (TGI) 服務架構,在 GKE 上透過 GPU 最佳化開放式 LLM 的推論和服務。
如需所有最佳做法的檢查清單摘要,請參閱「檢查清單摘要」。
如需所有 GKE 最佳做法的整合總覽,請參閱「GKE 最佳做法」。目標
本指南適用於生成式 AI 客戶、新舊 GKE 使用者、機器學習工程師,以及有興趣使用 Kubernetes 搭配 GPU 最佳化 LLM 工作負載的 LLMOps (DevOps) 工程師。
完成本指南後,您將能夠:
- 選擇訓練後 LLM 最佳化技術,包括量化、張量平行處理和記憶體最佳化。
- 考慮採用這些最佳化技術時,請權衡高階取捨條件。
- 使用 vLLM 或 TGI 等服務架構,將開放式 LLM 模型部署至 GKE,並啟用最佳化設定。
大型語言模型放送最佳化技術總覽
與非 AI 工作負載不同,大型語言模型工作負載通常會因依賴矩陣乘法運算,而出現較高的延遲和較低的輸送量。如要提升 LLM 推論效能,可以使用專用硬體加速器 (例如 GPU 和 TPU),以及經過最佳化的服務架構。
您可以套用下列一或多項最佳做法,減少 LLM 工作負載延遲時間,同時提高處理量和成本效益:
本指南中的範例使用 Gemma 7B LLM 和 vLLM 或 TGI 服務架構,套用這些最佳做法;不過,所述概念和功能適用於大多數熱門的開放式 LLM。
事前準備
嘗試本指南中的範例之前,請先完成下列必要工作:
請按照下列指南中的操作說明存取 Gemma 模型、準備環境,以及建立和設定 Cloud de Confiance by S3NS 資源:
請務必將 Hugging Face 存取權杖儲存至 Kubernetes 密鑰。
將 https://github.com/GoogleCloudPlatform/kubernetes-engine-samples/ 範例存放區複製到本機開發環境。
將工作目錄變更為
/kubernetes-engine-samples/ai-ml/llm-serving-gemma/。
最佳做法:量化
量化類似於有損圖像壓縮技術,可使用較低精確度格式 (8 位元或 4 位元) 表示權重,進而縮減模型大小,降低記憶體需求。不過,與圖片壓縮一樣,量化也涉及取捨:模型大小縮減可能會導致準確度降低。
量化方法有很多種,每種方法都有獨特的優缺點。 部分模型 (例如 AWQ 和 GPTQ) 需要預先量化,並可在 Hugging Face 或 Kaggle 等平台使用。舉例來說,如果您在 Llama-2 13B 模型上套用 GPTQ,並在 Gemma 7B 模型上套用 AWQ,就能在單一 L4 GPU 上提供模型,而不必使用兩個 L4 GPU (不含量化)。
您也可以使用 AutoAWQ 和 AutoGPTQ 等工具執行量化作業。這些方法可改善延遲和處理量。相較之下,使用 EETQ 和 bitsandbytes 程式庫進行量化的技術不需要預先量化模型,因此在沒有預先量化版本時,是合適的選擇。
要使用哪種量化技術,取決於您的具體目標,以及該技術與您想使用的服務框架是否相容。詳情請參閱 Hugging Face 的量化指南。
選取其中一個分頁標籤,查看使用 TGI 或 vLLM 架構套用量化的範例:
TGI
GKE 支援搭配 TGI 使用下列量化選項:
awqgptqeetqbitsandbytesbitsandbytes-nf4bitsandbytes-fp4
AWQ 和 GPTQ 量化方法需要預先量化的模型,而 EETQ 和 bitsandbytes 量化方法則可套用至任何模型。如要進一步瞭解這些選項,請參閱這篇 Hugging Face 文章。
如要使用量化功能,請在啟動模型伺服器時設定 -–quantize 參數。
下列程式碼片段說明如何在 GKE 上使用 TGI,透過 bitsandbytes 量化功能最佳化 Gemma 7B。
如要套用這項設定,請使用下列指令:
kubectl apply -f tgi/tgi-7b-bitsandbytes.yaml
vLLM
GKE 支援下列 vLLM 量子化選項:
gptq- 採用 4 位元量化 (Gemma 不支援,但其他模型支援)awqsqueezellm- 使用 FP8 (8 位元浮點數) E5M2 和 E4M3 格式的 KV 快取量化。
如要搭配 vLLM 使用模型量化功能,模型必須預先量化。啟動執行階段時,請設定 –quantization 參數。
下列程式碼片段說明如何使用 GKE 上的 vLLM,透過 awq 量化功能最佳化 Gemma 7B 模型:
如要套用這項設定,請使用下列指令:
kubectl apply -f vllm/vllm-7b-awq.yaml
使用 KV 快取量化功能縮短延遲時間
您可以運用 FP8 E5M2 KV 快取量化,大幅減少 KV 快取記憶體用量並縮短延遲時間,特別是針對大型批次。 但這會降低推論準確度。
如要啟用 FP8 E5M2 KV 快取量化,請設定 --kv-cache-dtype fp8_e5m2 參數:
如要套用這項設定,請使用下列指令:
kubectl apply -f vllm/vllm-7b-kvcache.yaml
最佳做法:張量平行化
張量平行處理是一種技術,可將運算負載分配到多個 GPU,這對於執行超出單一 GPU 記憶體容量的大型模型來說至關重要。這種做法可讓您使用多個經濟實惠的 GPU,而非單一昂貴的 GPU,因此更具成本效益。還能提升模型推論輸送量。張量平行處理會利用張量運算可獨立對較小資料區塊執行的特性。
如要進一步瞭解這項技巧,請參閱 Hugging Face 的 張量平行處理指南。
選取下列任一分頁標籤,即可查看使用 TGI 或 vLLM 架構套用張量平行處理的範例:
TGI
使用 TGI 時,服務執行階段預設會使用 Pod 可用的所有 GPU。如要設定使用的 GPU 數量,請指定 --num-shard 參數,並將 GPU 數量設為值。
如需支援張量平行處理的模型清單,請參閱 Hugging Face 說明文件。
下列程式碼片段說明如何使用張量平行處理和兩個 L4 GPU,最佳化 Gemma 7B 指令微調模型:
如要套用這項設定,請使用下列指令:
kubectl apply -f tgi/tgi-7b-it-tensorparallelism.yaml
在 GKE Autopilot 叢集中執行這項指令時,系統會建立 Pod,最低資源需求為 21 個 vCPU 和 78 GiB 記憶體。
vLLM
vLLM 支援分散式張量平行推論。如果有多個可用的 GPU,vLLM 會預設啟用這項功能。
下列程式碼片段說明如何使用張量平行處理和兩個 L4 GPU,最佳化 Gemma 7B 指令微調模型:
如要套用這項設定,請使用下列指令:
kubectl apply -f vllm/vllm-7b-it-tensorparallelism.yaml
在 GKE Autopilot 叢集中執行這項指令時,系統會建立 Pod,最低資源需求為 21 個 vCPU 和 78 GiB 記憶體。
最佳做法:模型記憶體最佳化
如要有效推論,最佳化 LLM 的記憶體用量至關重要。本節將介紹注意力層最佳化策略,例如分頁注意力機制和快速注意力機制。這些策略可提升記憶體效率,進而延長輸入序列並縮短 GPU 閒置時間。本節也會說明如何調整模型輸入和輸出大小,以符合記憶體限制,並針對特定服務架構進行最佳化。
注意層最佳化
自我注意力層 可讓模型瞭解語言處理工作中的情境,因為字詞的意義可能會因情境而異。 不過,這些層會在 GPU vRAM 中儲存輸入詞元權重、鍵 (K) 和值 (V)。因此,隨著輸入序列變長,大小和運算時間會呈現二次方成長。
處理長輸入序列時,KV 快取特別實用,因為自注意力機制的負擔可能會變得相當龐大。這種最佳化方法可將運算處理作業降至線性複雜度。
最佳化 LLM 注意力機制的具體技術包括:
- 分頁注意力:分頁注意力會使用分頁技術 (類似於 OS 虛擬記憶體),改善大型模型和長輸入序列的記憶體管理。這項技術可有效減少 KV 快取中的片段和重複內容,讓輸入序列更長,不會耗盡 GPU 記憶體。
- Flash attention:Flash attention 可在生成權杖時,盡量減少 GPU RAM 與 L1 快取之間的資料傳輸,進而減少 GPU 記憶體瓶頸。這樣可消除運算核心的閒置時間,大幅提升 GPU 的推論和訓練效能。
調整模型輸入和輸出大小
記憶體需求取決於輸入和輸出大小。輸出內容越長、背景資訊越多,需要的資源就越多;輸出內容越短、背景資訊越少,就能使用較小、較便宜的 GPU,進而節省成本。
選取任一分頁,即可查看在 TGI 或 vLLM 架構中調整模型輸入和輸出記憶體需求的範例:
TGI
TGI 服務執行階段會在啟動期間檢查記憶體需求,如果模型可能佔用的最大記憶體用量超出可用的 GPU 記憶體,就不會啟動。這項檢查可避免記憶體不足 (OOM) 導致會耗用大量記憶體的工作負載當機。
GKE 支援下列 TGI 參數,可最佳化模型記憶體需求:
以下程式碼片段說明如何使用單一 L4 GPU 提供 Gemma 7B 指令微調模型,並使用 --max-total-tokens=3072, --max-batch-prefill-tokens=512,
--max-input-length=512 參數設定:
如要套用這項設定,請使用下列指令:
kubectl apply -f tgi/tgi-7b-token.yaml
vLLM
在 vLLM 中,設定模型的背景資訊長度,這會直接影響 KV 快取大小和 GPU RAM 需求。較短的脈絡長度可使用較經濟實惠的 GPU。預設值是模型可接受的權杖數量上限。如有需要,請使用 --max-model-len MAX_MODEL_LEN 限制背景資訊長度上限。
舉例來說,Gemma 7B 指令微調模型預設的內容長度為 8192,超過單一 NVIDIA L4 GPU 的記憶體容量。如要在 L4 上部署,請將 --max-model-len 設為小於 640 的值,限制提示和輸出的總長度。調整後,即使模型預設脈絡長度較長,也能在單一 L4 GPU 上執行。
如要使用修改後的權杖限制進行部署,請使用下列程式碼片段:
如要套用這項設定,請使用下列指令:
kubectl apply -f vllm/vllm-7b-token.yaml
檢查清單摘要
| 最佳化目標 | 練習 |
|---|---|
| 延遲時間 |
|
| 處理量 | |
| 具成本效益 |
後續步驟
- 如需涵蓋容器設定的端對端指南,請參閱「透過 GKE 上的多個 GPU 提供 LLM」。
- 如需雲端管理的 LLM 服務解決方案,請透過 Vertex AI Model Garden 部署模型。