本教學課程說明如何使用 NVIDIA Triton Inference Server 和 TensorFlow Serving,在 Google Kubernetes Engine (GKE) 上透過 GPU 部署及提供大型語言模型 (LLM)。這有助於您瞭解及探索如何在代管 Kubernetes 環境中,實際部署 LLM 以進行推論。您會將預先建構的容器部署至 GKE 叢集,其中包含單一 L4 Tensor Core GPU,並準備 GKE 基礎架構來執行線上推論。
本教學課程適用於機器學習 (ML) 工程師、平台管理員和作業人員,以及想在 GKE 叢集上代管預先訓練的機器學習 (ML) 模型的資料和 AI 專家。如要進一步瞭解內容中提及的常見角色和範例工作,請參閱「常見的 GKE 使用者角色和工作」。 Google Cloud
閱讀本頁面之前,請先熟悉下列概念:
建立 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
部署線上推論伺服器
每個線上推論架構都希望以特定格式找到預先訓練的機器學習模型。以下章節說明如何根據要使用的架構部署推論伺服器:
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 可觀測性指南。