在 GKE 中使用單一 GPU 提供模型


本教學課程說明如何使用 Google Kubernetes Engine (GKE) 上的 GPU,透過 NVIDIA Triton Inference ServerTensorFlow Serving 部署及提供大型語言模型 (LLM)。這有助於您瞭解及探索如何在代管 Kubernetes 環境中,實際部署 LLM 以進行推論。您會將預先建構的容器部署至 GKE 叢集,其中包含單一 L4 Tensor Core GPU,並準備 GKE 基礎架構來執行線上推論。

本教學課程適用於機器學習 (ML) 工程師、平台管理員和營運人員,以及想在 GKE 叢集上代管預先訓練的機器學習 (ML) 模型的資料和 AI 專家。如要進一步瞭解內容中提及的常見角色和範例工作,請參閱「常見的 GKE Enterprise 使用者角色和工作」。 Google Cloud

閱讀本頁面之前,請先熟悉下列概念:

目標

  1. 建立 GKE Autopilot 或 Standard 叢集。
  2. 設定預先訓練模型所在的 Cloud Storage bucket。
  3. 部署所選的線上推論架構。
  4. 對已部署的服務提出測試要求。

費用

本教學課程使用下列 Google Cloud的計費元件:

  • GKE
  • Cloud Storage
  • L4 GPU 加速器
  • 輸出流量

使用 Pricing Calculator 可根據您的預測使用量來產生費用預估。

完成本教學課程後,您可以刪除建立的資源以避免繼續計費。詳情請參閱「清除」。

事前準備

設定專案

  1. 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.
  2. In the Google Cloud console, on the project selector page, click Create project to begin creating a new Google Cloud project.

    Go to project selector

  3. Make sure that billing is enabled for your Google Cloud project.

  4. Enable the GKE API.

    Enable the API

  5. In the Google Cloud console, on the project selector page, click Create project to begin creating a new Google Cloud project.

    Go to project selector

  6. Make sure that billing is enabled for your Google Cloud project.

  7. Enable the GKE API.

    Enable the API

  8. 設定 Google Cloud CLI 的預設值

    1. 在 Google Cloud 控制台中啟動 Cloud Shell 執行個體:
      開啟 Cloud Shell

    2. 下載這個範例應用程式的原始碼:

      git clone https://github.com/GoogleCloudPlatform/kubernetes-engine-samples
      cd kubernetes-engine-samples/ai-ml/gke-online-serving-single-gpu
      
    3. 設定預設環境變數:

      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
    4. 在 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} \
          --region=${REGION} \
          --project=${PROJECT_ID} \
          --release-channel=rapid
    

    GKE 會根據部署的工作負載要求,建立含 CPU 和 GPU 節點的 Autopilot 叢集。

    標準

    1. 執行下列指令,建立 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
      

      建立叢集可能需要幾分鐘的時間。

    2. 執行下列指令來建立節點集區:

        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。

建立 Cloud Storage 值區

建立 Cloud Storage bucket,儲存要放送的預先訓練模型。

在 Cloud Shell 中執行下列指令:

gcloud storage buckets create gs://$GSBUCKET

設定叢集,透過 Workload Identity Federation for GKE 存取儲存空間

如要讓叢集存取 Cloud Storage bucket,請執行下列操作:

  1. 建立 Google Cloud 服務帳戶。
  2. 在叢集中建立 Kubernetes ServiceAccount。
  3. 將 Kubernetes ServiceAccount 繫結至 Google Cloud 服務帳戶。

建立 Google Cloud 服務帳戶

  1. 前往 Google Cloud 控制台的「建立服務帳戶」頁面:

    前往「Create service account」(建立服務帳戶)

  2. 在「Service account ID」(服務帳戶 ID) 欄位中輸入 gke-ai-sa

  3. 按一下「建立並繼續」

  4. 在「角色」清單中,選取「Cloud Storage」>「Storage Insights Collector Service」(Storage Insights 收集器服務) 角色。

  5. 按一下 「Add another role」(新增其他角色)

  6. 在「請選擇角色」清單中,選取「Cloud Storage」>「Storage 物件管理員」角色。

  7. 依序點選「繼續」和「完成」

在叢集中建立 Kubernetes ServiceAccount

在 Cloud Shell 中執行下列操作:

  1. 建立 Kubernetes 命名空間:

    kubectl create namespace gke-ai-namespace
    
  2. 在命名空間中建立 Kubernetes ServiceAccount:

    kubectl create serviceaccount gpu-k8s-sa --namespace=gke-ai-namespace
    

將 Kubernetes ServiceAccount 繫結至 Google Cloud 服務帳戶

在 Cloud Shell 中執行下列指令:

  1. 將 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 的完整身分。

  2. 為 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

  1. 在 Cloud Shell 中,將預先訓練的 ML 模型複製到 Cloud Storage bucket:

    gcloud storage cp src/triton-model-repository gs://$GSBUCKET --recursive
    
  2. 使用 Deployment 部署架構。Deployment 是 Kubernetes API 物件,可讓您執行多個 Pod 副本,並將這些副本分散到叢集中的節點:

    envsubst < src/gke-config/deployment-triton.yaml | kubectl --namespace=gke-ai-namespace apply -f -
    
  3. 確認 GKE 已部署架構:

    kubectl get deployments --namespace=gke-ai-namespace
    

    架構就緒時,輸出內容會類似如下:

    NAME                 READY   UP-TO-DATE   AVAILABLE   AGE
    triton-deployment    1/1     1            1           5m29s
    
  4. 部署服務以存取部署作業:

    kubectl apply --namespace=gke-ai-namespace -f src/gke-config/service-triton.yaml
    
  5. 確認是否已指派外部 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 位址。

  6. 確認服務和部署作業正常運作:

    curl -v EXTERNAL_IP:8000/v2/health/ready
    

    輸出結果會與下列內容相似:

    ...
    < HTTP/1.1 200 OK
    < Content-Length: 0
    < Content-Type: text/plain
    ...
    

TF Serving

  1. 在 Cloud Shell 中,將預先訓練的 ML 模型複製到 Cloud Storage bucket:

    gcloud storage cp src/tfserve-model-repository gs://$GSBUCKET --recursive
    
  2. 使用 Deployment 部署架構。Deployment 是 Kubernetes API 物件,可讓您執行多個 Pod 副本,並將這些副本分散到叢集中的節點:

    envsubst < src/gke-config/deployment-tfserve.yaml | kubectl --namespace=gke-ai-namespace apply -f -
    
  3. 確認 GKE 已部署架構:

    kubectl get deployments --namespace=gke-ai-namespace
    

    架構就緒時,輸出內容會類似如下:

    NAME                 READY   UP-TO-DATE   AVAILABLE   AGE
    tfserve-deployment   1/1     1            1           5m29s
    
  4. 部署服務以存取部署作業:

    kubectl apply --namespace=gke-ai-namespace -f src/gke-config/service-tfserve.yaml
    
  5. 確認是否已指派外部 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 位址。

  6. 確認服務和部署作業是否正常運作:

    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

  1. 在 Cloud Shell 中建立 Python 虛擬環境。

    python -m venv ./mnist_client
    source ./mnist_client/bin/activate
    
  2. 安裝必要的 Python 套件。

    pip install -r src/client/triton-requirements.txt
    
  3. 載入圖片,測試 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

  1. 在 Cloud Shell 中建立 Python 虛擬環境。

    python -m venv ./mnist_client
    source ./mnist_client/bin/activate
    
  2. 安裝必要的 Python 套件。

    pip install -r src/client/tfserve-requirements.txt
    
  3. 使用幾張圖片測試 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:從 09 的值。你可以使用儲存在 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 資源

  1. 刪除 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
  1. 刪除 Cloud Storage bucket:

    1. 前往「Buckets」(值區) 頁面:

      前往值區

    2. 勾選 PROJECT_ID-gke-bucket 的核取方塊。

    3. 按一下「刪除」圖示

    4. 如要確認刪除,請輸入 DELETE,然後按一下「刪除」

  2. 刪除 Google Cloud 服務帳戶:

    1. 前往「Service accounts」(服務帳戶) 頁面:

      前往「Service accounts」(服務帳戶)

    2. 選取專案。

    3. 勾選 gke-gpu-sa@PROJECT_ID.iam.gserviceaccount.com 的核取方塊。

    4. 按一下「刪除」圖示

    5. 如要確認刪除,請按一下「刪除」

刪除 GKE 叢集和 Google Cloud 資源

  1. 刪除 GKE 叢集:

    1. 前往「Clusters」(叢集) 頁面:

      前往「Clusters」(叢集)

    2. 勾選 online-serving-cluster 的核取方塊。

    3. 按一下「刪除」圖示

    4. 如要確認刪除,請輸入 online-serving-cluster,然後按一下「刪除」

  2. 刪除 Cloud Storage bucket:

    1. 前往「Buckets」(值區) 頁面:

      前往值區

    2. 勾選 PROJECT_ID-gke-bucket 的核取方塊。

    3. 按一下「刪除」圖示

    4. 如要確認刪除,請輸入 DELETE,然後按一下「刪除」

  3. 刪除 Google Cloud 服務帳戶:

    1. 前往「Service accounts」(服務帳戶) 頁面:

      前往「Service accounts」(服務帳戶)

    2. 選取專案。

    3. 勾選 gke-gpu-sa@PROJECT_ID.iam.gserviceaccount.com 的核取方塊。

    4. 按一下「刪除」圖示

    5. 如要確認刪除,請按一下「刪除」

刪除專案

  1. In the Google Cloud console, go to the Manage resources page.

    Go to Manage resources

  2. In the project list, select the project that you want to delete, and then click Delete.
  3. In the dialog, type the project ID, and then click Shut down to delete the project.

後續步驟