使用 GKE 中的单个 GPU 提供模型

本教程介绍如何通过 NVIDIA Triton 推理服务器TensorFlow Serving 在 Google Kubernetes Engine (GKE) 上使用 GPU 部署和提供大语言模型 (LLM)。这为理解和探索在托管式 Kubernetes 环境中部署实际 LLM 以进行推理提供了基础。您会将预构建容器部署到具有单个 L4 Tensor Core GPU 的 GKE 集群,并准备 GKE 基础设施以进行在线推理。

本教程适用于机器学习 (ML) 工程师、平台管理员和运维人员,以及希望在 GKE 集群上托管预训练机器学习 (ML) 模型的数据和 AI 专家。如需详细了解我们在 Google Cloud内容中提及的常见角色和示例任务,请参阅常见的 GKE Enterprise 用户角色和任务

在阅读本页面之前,请确保您熟悉以下内容:

创建 Cloud Storage 存储桶

创建 Cloud Storage 存储桶以存储将要提供的预训练模型。

在 Cloud Shell 中,运行以下命令:

gcloud storage buckets create gs://$GSBUCKET

配置集群以使用适用于 GKE 的工作负载身份联合访问存储桶

如需允许集群访问 Cloud Storage 存储桶,请执行以下操作:

  1. 创建 Google Cloud 服务账号。
  2. 在集群中创建 Kubernetes ServiceAccount。
  3. 将 Kubernetes ServiceAccount 绑定到 Google Cloud 服务账号。

创建 Google Cloud 服务账号

  1. 在 Google Cloud 控制台中,前往创建服务账号页面:

    转到“创建服务账号”

  2. 服务账号 ID 字段中,输入 gke-ai-sa

  3. 点击创建并继续

  4. 角色列表中,选择 Cloud Storage > Storage Insights Collector Service 角色。

  5. 点击添加其他角色

  6. 选择角色列表中,选择 Cloud Storage > Storage Object Admin 角色。

  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. 向 Google Cloud 服务账号添加 IAM 绑定:

    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
    

部署在线推理服务器

每个在线推理框架都应找到采用特定格式的预训练机器学习模型。以下部分介绍了如何根据您要使用的框架部署推理服务器:

Triton

  1. 在 Cloud Shell 中,将预训练的机器学习模型复制到 Cloud Storage 存储桶:

    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. 部署 Service 以访问 Deployment:

    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. 确认 Service 和 Deployment 正常运行:

    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 中,将预训练的机器学习模型复制到 Cloud Storage 存储桶:

    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. 部署 Service 以访问 Deployment:

    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. 确认 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

  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 可观测性指南。