本教學課程說明如何使用 Google Kubernetes Engine (GKE) 上的 GPU,透過 NVIDIA Triton Inference Server 和 TensorFlow Serving 部署及提供大型語言模型 (LLM)。這有助於您瞭解及探索如何在代管 Kubernetes 環境中,實際部署 LLM 以進行推論。您會將預先建構的容器部署至 GKE 叢集,其中包含單一 L4 Tensor Core GPU,並準備 GKE 基礎架構來執行線上推論。
本教學課程適用於機器學習 (ML) 工程師、平台管理員和營運人員,以及想在 GKE 叢集上代管預先訓練的機器學習 (ML) 模型的資料和 AI 專家。如要進一步瞭解內容中提及的常見角色和範例工作,請參閱「常見的 GKE Enterprise 使用者角色和工作」。 Google Cloud
閱讀本頁面之前,請先熟悉下列概念:
目標
- 建立 GKE Autopilot 或 Standard 叢集。
- 設定預先訓練模型所在的 Cloud Storage bucket。
- 部署所選的線上推論架構。
- 對已部署的服務提出測試要求。
費用
本教學課程使用下列 Google Cloud的計費元件:- GKE
- Cloud Storage
- L4 GPU 加速器
- 輸出流量
使用 Pricing Calculator 可根據您的預測使用量來產生費用預估。
完成本教學課程後,您可以刪除建立的資源以避免繼續計費。詳情請參閱「清除」。
事前準備
設定專案
- Sign in to your Google Cloud account. If you're new to Google Cloud, create an account to evaluate how our products perform in real-world scenarios. New customers also get $300 in free credits to run, test, and deploy workloads.
-
In the Google Cloud console, on the project selector page, click Create project to begin creating a new Google Cloud project.
-
Make sure that billing is enabled for your Google Cloud project.
-
Enable the GKE API.
-
In the Google Cloud console, on the project selector page, click Create project to begin creating a new Google Cloud project.
-
Make sure that billing is enabled for your Google Cloud project.
-
Enable the GKE API.
在 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 Standard 叢集:
gcloud container clusters create ${CLUSTER_NAME} \ --project=${PROJECT_ID} \ --region=${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=1
GKE 會建立單一節點集區,每個節點都包含一個 L4 GPU。
設定 Google Cloud CLI 的預設值
建立 GKE 叢集
您可以在 GKE Autopilot 或 Standard 叢集的單一 GPU 上提供模型。建議您使用 Autopilot 叢集,享有全代管 Kubernetes 體驗。使用 GKE Autopilot 時,系統會根據模型要求自動調度資源。
如要為工作負載選擇最合適的 GKE 作業模式,請參閱「選擇 GKE 作業模式」。
Autopilot
執行下列指令,建立 GKE Autopilot 叢集:
gcloud container clusters create-auto ${CLUSTER_NAME} \
--region=${REGION} \
--project=${PROJECT_ID} \
--release-channel=rapid
GKE 會根據部署的工作負載要求,建立含 CPU 和 GPU 節點的 Autopilot 叢集。
標準
建立 Cloud Storage 值區
建立 Cloud Storage bucket,儲存要放送的預先訓練模型。
在 Cloud Shell 中執行下列指令:
gcloud storage buckets create gs://$GSBUCKET
設定叢集,透過 Workload Identity Federation for GKE 存取儲存空間
如要讓叢集存取 Cloud Storage bucket,請執行下列操作:
- 建立 Google Cloud 服務帳戶。
- 在叢集中建立 Kubernetes ServiceAccount。
- 將 Kubernetes ServiceAccount 繫結至 Google Cloud 服務帳戶。
建立 Google Cloud 服務帳戶
前往 Google Cloud 控制台的「建立服務帳戶」頁面:
在「Service account ID」(服務帳戶 ID) 欄位中輸入
gke-ai-sa
。按一下「建立並繼續」。
在「角色」清單中,選取「Cloud Storage」>「Storage Insights Collector Service」(Storage Insights 收集器服務) 角色。
按一下
「Add another role」(新增其他角色)。在「請選擇角色」清單中,選取「Cloud Storage」>「Storage 物件管理員」角色。
依序點選「繼續」和「完成」。
在叢集中建立 Kubernetes ServiceAccount
在 Cloud Shell 中執行下列操作:
建立 Kubernetes 命名空間:
kubectl create namespace gke-ai-namespace
在命名空間中建立 Kubernetes ServiceAccount:
kubectl create serviceaccount gpu-k8s-sa --namespace=gke-ai-namespace
將 Kubernetes ServiceAccount 繫結至 Google Cloud 服務帳戶
在 Cloud Shell 中執行下列指令:
將 IAM 繫結新增至 Google Cloud 服務帳戶:
gcloud iam service-accounts add-iam-policy-binding gke-ai-sa@PROJECT_ID.iam.gserviceaccount.com \ --role roles/iam.workloadIdentityUser \ --member "serviceAccount:PROJECT_ID.svc.id.goog[gke-ai-namespace/gpu-k8s-sa]"
--member
標記會提供 Google Cloud中 Kubernetes ServiceAccount 的完整身分。為 Kubernetes ServiceAccount 加上註解:
kubectl annotate serviceaccount gpu-k8s-sa \ --namespace gke-ai-namespace \ iam.gke.io/gcp-service-account=gke-ai-sa@PROJECT_ID.iam.gserviceaccount.com
部署線上推論伺服器
每個線上推論架構都希望以特定格式找到預先訓練的 ML 模型。以下章節說明如何根據要使用的架構部署推論伺服器:
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 位址。確認服務和部署作業是否正常運作:
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 資源
- 保留專案:刪除 GKE 叢集和 Google Cloud 資源 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
,然後按一下「刪除」。
刪除 Google Cloud 服務帳戶:
前往「Service accounts」(服務帳戶) 頁面:
選取專案。
勾選
gke-gpu-sa@PROJECT_ID.iam.gserviceaccount.com
的核取方塊。按一下「刪除」圖示
。如要確認刪除,請按一下「刪除」。
刪除 GKE 叢集和 Google Cloud 資源
刪除 GKE 叢集:
前往「Clusters」(叢集) 頁面:
勾選
online-serving-cluster
的核取方塊。按一下「刪除」圖示
。如要確認刪除,請輸入
online-serving-cluster
,然後按一下「刪除」。
刪除 Cloud Storage bucket:
前往「Buckets」(值區) 頁面:
勾選
PROJECT_ID-gke-bucket
的核取方塊。按一下「刪除」圖示
。如要確認刪除,請輸入
DELETE
,然後按一下「刪除」。
刪除 Google Cloud 服務帳戶:
前往「Service accounts」(服務帳戶) 頁面:
選取專案。
勾選
gke-gpu-sa@PROJECT_ID.iam.gserviceaccount.com
的核取方塊。按一下「刪除」圖示
。如要確認刪除,請按一下「刪除」。
刪除專案
- In the Google Cloud console, go to the Manage resources page.
- In the project list, select the project that you want to delete, and then click Delete.
- In the dialog, type the project ID, and then click Shut down to delete the project.