本教學課程說明如何使用 Hugging Face 的文字生成推論 (TGI) 服務架構,在 Google Kubernetes Engine (GKE) 上透過 GPU 部署及提供大型語言模型 (LLM) 服務。本教學課程將提供基礎知識,協助您瞭解及探索如何實際部署 LLM,在 Kubernetes 代管環境中進行推論。您將執行 TGI 的預先建構容器部署至 GKE。您也可以設定 GKE,從 Hugging Face 載入 Gemma 2B、9B 和 27B 的權重。
本教學課程的適用對象為機器學習 (ML) 工程師、平台管理員和操作員,以及有興趣使用 Kubernetes 容器自動化調度管理功能,在 H100、A100 和 L4 GPU 硬體上提供 LLM 服務的資料和 AI 專家。如要進一步瞭解內容中提及的常見角色和範例工作,請參閱「常見的 GKE 使用者角色和工作」。 Google Cloud
如果您需要整合式代管 AI 平台,以經濟實惠的方式快速建構及提供機器學習模型,建議您試用 Vertex AI 部署解決方案。
閱讀本頁面之前,請先熟悉下列概念:
背景
本節說明本指南中使用的重要技術。
Gemma
Gemma 是一組開放式輕量級生成式人工智慧 (AI) 模型,以開放授權形式發布。這些 AI 模型可在應用程式、硬體、行動裝置或代管服務中執行。
本指南將介紹下列模型:
- Gemma 進行文字生成,您也可以調整這些模型,讓模型專精於執行特定工作。
- CodeGemma 是一系列強大輕巧的模型,可執行各種程式設計工作,例如填空式程式碼完成、程式碼生成、自然語言理解、數學推理和指令遵循。
詳情請參閱 Gemma 說明文件。
GPU
GPU 可加速處理節點上執行的特定工作負載,例如機器學習和資料處理。GKE 提供各種機器類型選項,可供節點設定使用,包括搭載 NVIDIA H100、L4 和 A100 GPU 的機器類型。
Text Generation Inference (TGI)
TGI 是 Hugging Face 的工具包,可部署及提供 LLM。TGI 可為熱門開放原始碼 LLM (包括 Gemma) 提供高效能的文字生成功能。TGI 包含以下功能:
- 使用 Flash Attention 和 PagedAttention 實作最佳化 Transformer
- 持續批次處理,提升整體放送輸送量
- 張量平行化,可在多個 GPU 上加快推論速度
詳情請參閱 TGI 說明文件。
取得模型存取權
如要存取 Gemma 模型並部署至 GKE,請先簽署授權同意聲明,然後產生 Hugging Face 存取權杖。
簽署授權同意聲明協議
您必須簽署同意聲明協議,才能使用 Gemma。請按照下列步驟操作:
- 前往 Kaggle.com 的模型同意聲明頁面。
- 使用 Hugging Face 帳戶驗證同意聲明。
- 接受模型條款。
產生存取權杖
如要透過 Hugging Face 存取模型,必須提供 Hugging Face 權杖。
如要產生新權杖 (如果沒有),請按照下列步驟操作:
- 依序點選「Your Profile」(你的個人資料) >「Settings」(設定) >「Access Tokens」(存取權杖)。
- 選取「New Token」。
- 指定您選擇的名稱,以及至少
Read
的角色。 - 選取「產生權杖」。
- 將產生的權杖複製到剪貼簿。
準備環境
在本教學課程中,您將使用 Cloud Shell 管理Google Cloud上託管的資源。Cloud Shell 已預先安裝本教學課程所需的軟體,包括 kubectl
和
gcloud CLI。
如要使用 Cloud Shell 設定環境,請按照下列步驟操作:
在 Google Cloud 控制台中,按一下
Google Cloud 控制台中的「啟用 Cloud Shell」,啟動 Cloud Shell 工作階段。系統會在 Google Cloud 控制台的底部窗格啟動工作階段。
設定預設環境變數:
gcloud config set project PROJECT_ID gcloud config set billing/quota_project PROJECT_ID export PROJECT_ID=$(gcloud config get project) export CONTROL_PLANE_LOCATION=CONTROL_PLANE_LOCATION export CLUSTER_NAME=CLUSTER_NAME export HF_TOKEN=HF_TOKEN
替換下列值:
建立及設定 Google Cloud 資源
請按照下列指示建立必要資源。
建立 GKE 叢集和節點集區
您可以在 GKE Autopilot 或 Standard 叢集的 GPU 上提供 Gemma 服務。建議您使用 Autopilot 叢集,享有全代管 Kubernetes 體驗。如要為工作負載選擇最合適的 GKE 作業模式,請參閱「選擇 GKE 作業模式」。
Autopilot
在 Cloud Shell 中執行下列指令:
gcloud container clusters create-auto CLUSTER_NAME \
--project=PROJECT_ID \
--location=CONTROL_PLANE_LOCATION \
--release-channel=rapid
替換下列值:
PROJECT_ID
:您的 Google Cloud 專案 ID。CONTROL_PLANE_LOCATION
:叢集控制層的 Compute Engine 區域。這個區域必須支援您要使用的加速器類型,例如 L4 GPU 的us-central1
。CLUSTER_NAME
:叢集名稱。
GKE 會根據部署的工作負載要求,建立含 CPU 和 GPU 節點的 Autopilot 叢集。
標準
在 Cloud Shell 中執行下列指令,建立 Standard 叢集:
gcloud container clusters create CLUSTER_NAME \ --project=PROJECT_ID \ --location=CONTROL_PLANE_LOCATION \ --workload-pool=PROJECT_ID.svc.id.goog \ --release-channel=rapid \ --num-nodes=1
替換下列值:
PROJECT_ID
:您的 Google Cloud 專案 ID。CONTROL_PLANE_LOCATION
:叢集控制層的 Compute Engine 區域。這個區域必須支援您要使用的加速器類型,例如 L4 GPU 的us-central1
。CLUSTER_NAME
:叢集名稱。
建立叢集可能需要幾分鐘的時間。
如要為叢集建立節點集區,並設定適當的磁碟大小,請執行下列指令:
Gemma 2 2B
gcloud container node-pools create gpupool \ --accelerator type=nvidia-l4,count=1,gpu-driver-version=latest \ --project=PROJECT_ID \ --location=CONTROL_PLANE_LOCATION \ --node-locations=CONTROL_PLANE_LOCATION-a \ --cluster=CLUSTER_NAME \ --machine-type=g2-standard-8 \ --num-nodes=1
GKE 會為每個節點建立一個包含 L4 GPU 的節點集區。
Gemma 2 9B
gcloud container node-pools create gpupool \ --accelerator type=nvidia-l4,count=2,gpu-driver-version=latest \ --project=PROJECT_ID \ --location=CONTROL_PLANE_LOCATION \ --node-locations=CONTROL_PLANE_LOCATION-a \ --cluster=CLUSTER_NAME \ --machine-type=g2-standard-24 \ --num-nodes=1
GKE 會為每個節點建立一個節點集區,內含兩個 L4 GPU。
Gemma 2 27B
gcloud container node-pools create gpupool \ --accelerator type=nvidia-l4,count=4,gpu-driver-version=latest \ --project=PROJECT_ID \ --location=CONTROL_PLANE_LOCATION \ --node-locations=CONTROL_PLANE_LOCATION-a \ --cluster=CLUSTER_NAME \ --machine-type=g2-standard-48 \ --num-nodes=1 \ --disk-size=180
GKE 會為每個節點建立一個節點集區,內含四個 L4 GPU。
為 Hugging Face 憑證建立 Kubernetes 密鑰
在 Cloud Shell 中執行下列操作:
設定
kubectl
與叢集通訊:gcloud container clusters get-credentials CLUSTER_NAME \ --location=CONTROL_PLANE_LOCATION
建立包含 Hugging Face 權杖的 Kubernetes Secret:
kubectl create secret generic hf-secret \ --from-literal=hf_api_token=HF_TOKEN \ --dry-run=client -o yaml | kubectl apply -f -
將
HF_TOKEN
換成您稍早產生的 Hugging Face 權杖。
部署 TGI
在本節中,您將部署 TGI 容器,提供要使用的 Gemma 模型。本教學課程會使用 Kubernetes Deployment 部署模型。Deployment 是 Kubernetes API 物件,可讓您執行多個 Pod 副本,並將這些副本分散到叢集中的節點。
Gemma 2 2B-it
請按照下列操作說明部署 Gemma 2B 指令微調模型。
建立下列
tgi-2-2b-it.yaml
資訊清單:套用資訊清單:
kubectl apply -f tgi-2-2b-it.yaml
Gemma 2 9B-it
請按照下列操作說明部署 Gemma 9B 指令微調模型。
建立下列
tgi-2-9b-it.yaml
資訊清單:套用資訊清單:
kubectl apply -f tgi-2-9b-it.yaml
Gemma 2 27B-it
請按照下列操作說明部署 Gemma 2 27B 指令微調模型。
建立下列
tgi-2-27b-it.yaml
資訊清單:套用資訊清單:
kubectl apply -f tgi-2-27b-it.yaml
CodeGemma 7B-it
請按照下列操作說明部署 CodeGemma 7B 指令微調模型。
建立下列
tgi-codegemma-1.1-7b-it.yaml
資訊清單:套用資訊清單:
kubectl apply -f tgi-codegemma-1.1-7b-it.yaml
提供模型
在本節中,您將與模型互動。
設定通訊埠轉送
執行下列指令,設定通訊埠轉送至模型:
kubectl port-forward service/llm-service 8000:8000
輸出結果會與下列內容相似:
Forwarding from 127.0.0.1:8000 -> 8000
使用 curl 與模型互動
本節說明如何執行基本冒煙測試,驗證已部署的預先訓練或指令微調模型。為求簡單起見,本節將說明如何使用 Gemma 2 指令微調和 CodeGemma 模型進行測試。
Gemma 2
在新的終端機工作階段中,使用 curl
與模型對話:
USER_PROMPT="I'm new to coding. If you could only recommend one programming language to start with, what would it be and why?"
curl -X POST http://localhost:8000/generate \
-H "Content-Type: application/json" \
-d @- <<EOF
{
"inputs": "<start_of_turn>user\n${USER_PROMPT}<end_of_turn>\n",
"parameters": {
"temperature": 0.90,
"top_p": 0.95,
"max_new_tokens": 128
}
}
EOF
以下輸出內容顯示模型回應的範例:
{"generated_text":"**Python**\n\n**Reasons why Python is a great choice for beginners:**\n\n* **Simple syntax:** Python uses clear and concise syntax, making it easy for beginners to pick up.\n* **Easy to learn:** Python's syntax is based on English, making it easier to learn than other languages.\n* **Large and supportive community:** Python has a massive and active community of developers who are constantly willing to help.\n* **Numerous libraries and tools:** Python comes with a vast collection of libraries and tools that make it easy to perform various tasks, such as data manipulation, web development, and machine learning.\n* **"}
CodeGemma
在新的終端機工作階段中,使用 curl
與模型對話:
USER_PROMPT="Generate a python code example of a adding two numbers from a function called addNumbers"
curl -s -X POST http://localhost:8000/generate \
-H "Content-Type: application/json" \
-d @- <<EOF | jq -r .generated_text
{
"inputs": "<start_of_turn>user\n${USER_PROMPT}<end_of_turn>\n",
"parameters": {
"temperature": 0.90,
"top_p": 0.95,
"max_new_tokens": 2000
}
}
EOF
以下輸出內容顯示模型回應的範例:
def addNumbers(num1, num2):
sum = num1 + num2
return sum
# Get the input from the user
num1 = float(input("Enter the first number: "))
num2 = float(input("Enter the second number: "))
# Call the addNumbers function
sum = addNumbers(num1, num2)
# Print the result
print("The sum of", num1, "and", num2, "is", sum)
(選用) 透過 Gradio 聊天介面與模型互動
在本節中,您將建構網頁聊天應用程式,與經過指令微調的模型互動。為簡化說明,本節僅介紹使用 2B-it 模型的測試方法。
Gradio 是 Python 程式庫,內含 ChatInterface
包裝函式,可為聊天機器人建立使用者介面。
部署對話介面
在 Cloud Shell 中,將下列資訊清單儲存為
gradio.yaml
:套用資訊清單:
kubectl apply -f gradio.yaml
等待部署作業完成:
kubectl wait --for=condition=Available --timeout=300s deployment/gradio
使用即時通訊介面
在 Cloud Shell 中執行下列指令:
kubectl port-forward service/gradio 8080:8080
這項操作會建立從 Cloud Shell 到 Gradio 服務的通訊埠轉送。
按一下 Cloud Shell 工作列右上方的「Web Preview」
按鈕。按一下「透過以下通訊埠預覽:8080」。瀏覽器會開啟新分頁。
使用 Gradio 對話介面與 Gemma 互動。新增提示,然後按一下「提交」。
排解問題
- 如果收到
Empty reply from server
訊息,可能是因為容器尚未完成下載模型資料。再次檢查 Pod 的記錄,確認是否出現Connected
訊息,表示模型已準備好提供服務。 - 如果看到
Connection refused
,請確認連接埠轉送功能是否已啟用。
觀察模型成效
如要觀察模型效能,您可以在 Cloud Monitoring 中使用 TGI 資訊主頁整合功能。您可以在這個資訊主頁中查看重要成效指標,例如權杖輸送量、要求延遲時間和錯誤率。
如要使用 TGI 資訊主頁,必須在 GKE 叢集中啟用 Google Cloud Managed Service for Prometheus,從 TGI 收集指標。TGI 預設會以 Prometheus 格式公開指標,因此您不需要安裝額外的匯出工具。
接著,您可以使用 TGI 資訊主頁查看指標。 如要瞭解如何使用 Google Cloud Managed Service for Prometheus 收集模型指標,請參閱 Cloud Monitoring 說明文件中的 TGI 可觀測性指南。