本教學課程說明如何使用 Google Kubernetes Engine (GKE) 上的 GPU,透過 NVIDIA Triton Inference Server 和 TensorFlow Serving 部署及提供大型語言模型 (LLM) 服務。這有助於您瞭解及探索在代管 Kubernetes 環境中,用於推論的實用 LLM 部署作業。您要將預先建構的容器部署至 GKE 叢集,其中包含單一 L4 Tensor 核心 GPU,並準備 GKE 基礎架構來執行線上推論。
本教學課程適用於機器學習 (ML) 工程師、平台管理員和營運人員,以及想在 GKE 叢集上代管預先訓練的機器學習 (ML) 模型的資料和 AI 專家。如要進一步瞭解 Google Cloud 內容中提及的常見角色和範例工作,請參閱「常見的 GKE 使用者角色和工作」。
閱讀本頁內容前,請務必先熟悉下列事項:
目標
- 建立 GKE Autopilot 或 Standard 叢集。
- 設定預先訓練模型所在的 Cloud Storage bucket。
- 部署所選的線上推論架構。
- 對已部署的服務發出測試要求。
費用
本教學課程使用下列 Google Cloud計費元件:- GKE
- Cloud Storage
- L4 GPU 加速器
- 輸出流量
使用 Pricing Calculator 可根據您的預測使用量來產生費用預估。
完成本教學課程後,您可以刪除建立的資源以避免繼續計費。詳情請參閱「清理」一節。
事前準備
設定專案
- 登入 Google Cloud 帳戶。如果您是 Google Cloud新手,歡迎 建立帳戶,親自體驗產品的實際應用成效。新客戶還能獲得價值 $300 美元的免費抵免額,能用於執行、測試及部署工作負載。
-
In the Google Cloud console, on the project selector page, click Create project to begin creating a new Google Cloud project.
Roles required to create a project
To create a project, you need the Project Creator role (
roles/resourcemanager.projectCreator), which contains theresourcemanager.projects.createpermission. Learn how to grant roles. -
Verify that billing is enabled for your Google Cloud project.
Enable the GKE API, if it is not already enabled.
Roles required to enable APIs
To enable APIs, you need the
serviceusage.services.enablepermission. If you created the project, then you likely already have this permission through the Owner role (roles/owner). Otherwise, you can get this permission through the Service Usage Admin role (roles/serviceusage.serviceUsageAdmin). Learn how to grant roles.-
In the Google Cloud console, on the project selector page, click Create project to begin creating a new Google Cloud project.
Roles required to create a project
To create a project, you need the Project Creator role (
roles/resourcemanager.projectCreator), which contains theresourcemanager.projects.createpermission. Learn how to grant roles. -
Verify that billing is enabled for your Google Cloud project.
Enable the GKE API, if it is not already enabled.
Roles required to enable APIs
To enable APIs, you need the
serviceusage.services.enablepermission. If you created the project, then you likely already have this permission through the Owner role (roles/owner). Otherwise, you can get this permission through the Service Usage Admin role (roles/serviceusage.serviceUsageAdmin). Learn how to grant roles.
設定 Google Cloud CLI 的預設值
在 Google Cloud 控制台中啟動 Cloud Shell 執行個體:
開啟 Cloud Shell下載這個範例應用程式的原始碼:
git clone https://github.com/GoogleCloudPlatform/kubernetes-engine-samples cd kubernetes-engine-samples/ai-ml/gke-online-serving-single-gpu設定預設環境變數:
gcloud config set project PROJECT_ID gcloud config set compute/region COMPUTE_REGION替換下列值:
- PROJECT_ID:您的 Google Cloud 專案 ID。
- COMPUTE_REGION:支援您要使用的加速器類型的 Compute Engine 區域,例如 L4 GPU 的
us-central1。
在 Cloud Shell 中建立下列環境變數:
export PROJECT_ID=$(gcloud config get project) export REGION=$(gcloud config get compute/region) export K8S_SA_NAME=gpu-k8s-sa export GSBUCKET=$PROJECT_ID-gke-bucket export MODEL_NAME=mnist export CLUSTER_NAME=online-serving-cluster
建立 GKE 叢集
您可以在 GKE Autopilot 或 Standard 叢集的單一 GPU 上提供模型。建議使用 Autopilot 叢集,享有全代管 Kubernetes 體驗。使用 GKE Autopilot 時,系統會根據模型要求自動調整資源。
如要為工作負載選擇最合適的 GKE 作業模式,請參閱「選擇 GKE 作業模式」。
Autopilot
執行下列指令,建立 GKE Autopilot 叢集:
gcloud container clusters create-auto ${CLUSTER_NAME} \
--location=${REGION} \
--project=${PROJECT_ID} \
--release-channel=rapid
GKE 會根據部署的工作負載要求,建立具有 CPU 和 GPU 節點的 Autopilot 叢集。
標準
執行下列指令,建立 GKE Standard 叢集:
gcloud container clusters create ${CLUSTER_NAME} \ --project=${PROJECT_ID} \ --location=${REGION} \ --workload-pool=${PROJECT_ID}.svc.id.goog \ --addons GcsFuseCsiDriver \ --release-channel=rapid \ --num-nodes=1建立叢集可能需要幾分鐘的時間。
執行下列指令來建立節點集區:
gcloud container node-pools create gpupool \ --accelerator type=nvidia-l4,count=1,gpu-driver-version=latest \ --project=${PROJECT_ID} \ --location=${REGION} \ --node-locations=${REGION}-a \ --cluster=${CLUSTER_NAME} \ --machine-type=g2-standard-8 \ --num-nodes=1GKE 會建立單一節點集區,每個節點包含一個 L4 GPU。
建立 Cloud Storage bucket
建立 Cloud Storage bucket,用於儲存要放送的預先訓練模型。
在 Cloud Shell 中執行下列指令:
gcloud storage buckets create gs://$GSBUCKET --uniform-bucket-level-access
設定叢集,透過 Workload Identity Federation for GKE 存取 bucket
如要讓叢集存取 Cloud Storage bucket,請執行下列操作:
- 在叢集中建立 Kubernetes ServiceAccount。
- 將 IAM 角色授予 Kubernetes ServiceAccount。
在叢集中建立 Kubernetes ServiceAccount
在 Cloud Shell 中執行下列操作:
建立 Kubernetes 命名空間:
kubectl create namespace gke-ai-namespace在命名空間中建立 Kubernetes ServiceAccount:
kubectl create serviceaccount gpu-k8s-sa --namespace=gke-ai-namespace
將 IAM 角色授予 Kubernetes ServiceAccount
在 Cloud Shell 中,將「Storage 物件管理員」(roles/storage.objectAdmin) 和「Storage Insights 收集器服務」(roles/storage.insightsCollectorService) 角色授予 Kubernetes ServiceAccount:
gcloud projects add-iam-policy-binding PROJECT_ID \
--member="principal://iam.googleapis.com/projects/PROJECT_NUMBER/locations/global/workloadIdentityPools/PROJECT_ID.svc.id.goog/subject/ns/gke-ai-namespace/sa/gpu-k8s-sa" \
--role=roles/storage.objectAdmin \
--condition=None
gcloud projects add-iam-policy-binding PROJECT_ID \
--member="principal://iam.googleapis.com/projects/PROJECT_NUMBER/locations/global/workloadIdentityPools/PROJECT_ID.svc.id.goog/subject/ns/gke-ai-namespace/sa/gpu-k8s-sa" \
--role=roles/storage.insightsCollectorService \
--condition=None
更改下列內容:
PROJECT_ID:您的 Google Cloud 專案 ID。PROJECT_NUMBER:您的 Google Cloud 專案編號。
部署線上推論伺服器
每個線上推論架構都希望以特定格式找到預先訓練的機器學習模型。以下章節說明如何根據要使用的框架部署推論伺服器:
Triton
在 Cloud Shell 中,將預先訓練的 ML 模型複製到 Cloud Storage bucket:
gcloud storage cp src/triton-model-repository gs://$GSBUCKET --recursive使用 Deployment 部署架構。Deployment 是 Kubernetes API 物件,可讓您執行多個 Pod 副本,這些副本會分散在叢集的節點中:
envsubst < src/gke-config/deployment-triton.yaml | kubectl --namespace=gke-ai-namespace apply -f -確認 GKE 已部署架構:
kubectl get deployments --namespace=gke-ai-namespace架構準備就緒時,輸出內容會類似下列內容:
NAME READY UP-TO-DATE AVAILABLE AGE triton-deployment 1/1 1 1 5m29s部署服務以存取部署作業:
kubectl apply --namespace=gke-ai-namespace -f src/gke-config/service-triton.yaml確認已指派外部 IP:
kubectl get services --namespace=gke-ai-namespace輸出結果會與下列內容相似:
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE kubernetes ClusterIP 34.118.224.1 <none> 443/TCP 60m triton-server LoadBalancer 34.118.227.176 35.239.54.228 8000:30866/TCP,8001:31035/TCP,8002:30516/TCP 5m14s記下「EXTERNAL-IP」欄中
triton-server的 IP 位址。確認服務和部署作業是否正常運作:
curl -v EXTERNAL_IP:8000/v2/health/ready輸出結果會與下列內容相似:
... < HTTP/1.1 200 OK < Content-Length: 0 < Content-Type: text/plain ...
TF Serving
在 Cloud Shell 中,將預先訓練的 ML 模型複製到 Cloud Storage bucket:
gcloud storage cp src/tfserve-model-repository gs://$GSBUCKET --recursive使用 Deployment 部署架構。Deployment 是 Kubernetes API 物件,可讓您執行多個 Pod 副本,這些副本會分散在叢集的節點中:
envsubst < src/gke-config/deployment-tfserve.yaml | kubectl --namespace=gke-ai-namespace apply -f -確認 GKE 已部署架構:
kubectl get deployments --namespace=gke-ai-namespace架構準備就緒時,輸出內容會類似下列內容:
NAME READY UP-TO-DATE AVAILABLE AGE tfserve-deployment 1/1 1 1 5m29s部署服務以存取部署作業:
kubectl apply --namespace=gke-ai-namespace -f src/gke-config/service-tfserve.yaml確認已指派外部 IP:
kubectl get services --namespace=gke-ai-namespace輸出結果會與下列內容相似:
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE kubernetes ClusterIP 34.118.224.1 <none> 443/TCP 60m tfserve-server LoadBalancer 34.118.227.176 35.239.54.228 8500:30003/TCP,8000:32194/TCP 5m14s記下「EXTERNAL-IP」欄中
tfserve-server的 IP 位址。確認 Service 和 Deployment 是否正常運作:
curl -v EXTERNAL_IP:8000/v1/models/mnist將
EXTERNAL_IP替換為外部 IP 位址。輸出結果會與下列內容相似:
... < HTTP/1.1 200 OK < Content-Type: application/json < Date: Thu, 12 Oct 2023 19:01:19 GMT < Content-Length: 154 < { "model_version_status": [ { "version": "1", "state": "AVAILABLE", "status": { "error_code": "OK", "error_message": "" } } ] }
提供模型
Triton
在 Cloud Shell 中建立 Python 虛擬環境。
python -m venv ./mnist_client source ./mnist_client/bin/activate安裝必要的 Python 套件。
pip install -r src/client/triton-requirements.txt載入圖片,測試 Triton 推論伺服器:
cd src/client python triton_mnist_client.py -i EXTERNAL_IP -m mnist -p ./images/TEST_IMAGE.png更改下列內容:
EXTERNAL_IP:外部 IP 位址。TEST_IMAGE:與要測試的圖片相符的檔案名稱。你可以使用儲存在src/client/images中的圖片。
視使用的圖片而定,輸出結果大致如下:
Calling Triton HTTP Service -> Prediction result: 7
TF Serving
在 Cloud Shell 中建立 Python 虛擬環境。
python -m venv ./mnist_client source ./mnist_client/bin/activate安裝必要的 Python 套件。
pip install -r src/client/tfserve-requirements.txt使用幾張圖片測試 TensorFlow Serving。
cd src/client python tfserve_mnist_client.py -i EXTERNAL_IP -m mnist -p ./images/TEST_IMAGE.png
更改下列內容:
EXTERNAL_IP:外部 IP 位址。TEST_IMAGE:介於0到9的值。你可以使用儲存在src/client/images中的圖片。
視使用的圖片而定,輸出內容會類似如下:
Calling TensorFlow Serve HTTP Service -> Prediction result: 5
觀察模型成效
Triton
如要觀察模型效能,可以使用 Cloud Monitoring 中的 Triton 資訊主頁整合功能。您可以在這個資訊主頁中查看重要成效指標,例如權杖輸送量、要求延遲和錯誤率。
如要使用 Triton 資訊主頁,您必須在 GKE 叢集中啟用 Google Cloud Managed Service for Prometheus,從 Triton 收集指標。Triton 預設會以 Prometheus 格式公開指標,因此您不需要安裝額外的匯出工具。
然後,您可以使用 Triton 資訊主頁查看指標。如要瞭解如何使用 Google Cloud Managed Service for Prometheus 收集模型指標,請參閱 Cloud Monitoring 說明文件中的 Triton 可觀測性指南。TF Serving
如要觀察模型效能,您可以在 Cloud Monitoring 中使用 TF Serving 資訊主頁整合功能。您可以在這個資訊主頁中查看重要成效指標,例如權杖輸送量、要求延遲和錯誤率。
如要使用 TF Serving 資訊主頁,您必須在 GKE 叢集中啟用 Google Cloud Managed Service for Prometheus,從 TF Serving 收集指標。
然後,您可以使用 TF Serving 資訊主頁查看指標。 如要瞭解如何使用 Google Cloud Managed Service for Prometheus 收集模型指標,請參閱 Cloud Monitoring 說明文件中的 TF Serving 可觀測性指南。清除所用資源
如要避免系統向您的 Google Cloud 帳戶收取本指南所建立資源的費用,請採取下列任一做法:
- 保留 GKE 叢集:刪除叢集中的 Kubernetes 資源和 Google Cloud 資源
- 保留 Google Cloud 專案:刪除 GKE 叢集和 Google Cloud 資源
- 刪除專案
刪除叢集中的 Kubernetes 資源和 Google Cloud 資源
- 刪除 Kubernetes 命名空間和您部署的工作負載:
Triton
kubectl -n gke-ai-namespace delete -f src/gke-config/service-triton.yaml
kubectl -n gke-ai-namespace delete -f src/gke-config/deployment-triton.yaml
kubectl delete namespace gke-ai-namespace
TF Serving
kubectl -n gke-ai-namespace delete -f src/gke-config/service-tfserve.yaml
kubectl -n gke-ai-namespace delete -f src/gke-config/deployment-tfserve.yaml
kubectl delete namespace gke-ai-namespace
刪除 Cloud Storage bucket:
前往「Buckets」(值區) 頁面:
勾選
PROJECT_ID-gke-bucket核取方塊。按一下「刪除」圖示 。
如要確認刪除,請輸入
DELETE,然後按一下「刪除」。
刪除 GKE 叢集和 Google Cloud 資源
刪除 GKE 叢集:
前往「Clusters」(叢集) 頁面:
勾選
online-serving-cluster的核取方塊。按一下「刪除」圖示 。
如要確認刪除,請輸入
online-serving-cluster,然後按一下「刪除」。
刪除 Cloud Storage bucket:
前往「Buckets」(值區) 頁面:
勾選
PROJECT_ID-gke-bucket核取方塊。按一下「刪除」圖示 。
如要確認刪除,請輸入
DELETE,然後按一下「刪除」。
刪除專案
- 前往 Google Cloud 控制台的「Manage resources」(管理資源) 頁面。
- 在專案清單中選取要刪除的專案,然後點選「Delete」(刪除)。
- 在對話方塊中輸入專案 ID,然後按一下 [Shut down] (關閉) 以刪除專案。