本教程介绍如何通过 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 用户角色和任务。
在阅读本页面之前,请确保您熟悉以下内容:
目标
- 创建 GKE Autopilot 或 Standard 集群。
- 配置 Cloud Storage 存储桶,即预训练模型。
- 部署您选择的在线推断框架。
- 向已部署服务发出测试请求。
费用
本教程使用 Google Cloud的以下收费组件:- GKE
- Cloud Storage
- L4 GPU 加速器
- 出站流量
您可使用价格计算器根据您的预计使用情况来估算费用。
完成本教程后,您可以删除所创建的资源以避免继续计费。如需了解详情,请参阅清理。
准备工作
设置项目
- 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 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} \
--region=${REGION} \
--project=${PROJECT_ID} \
--release-channel=rapid
GKE 会根据所部署的工作负载的请求,创建具有所需 CPU 和 GPU 节点的 Autopilot 集群。
Standard
运行以下命令创建 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。
创建 Cloud Storage 存储桶
创建 Cloud Storage 存储桶以存储将要提供的预训练模型。
在 Cloud Shell 中,运行以下命令:
gcloud storage buckets create gs://$GSBUCKET
配置集群以使用适用于 GKE 的工作负载身份联合访问存储桶
如需允许集群访问 Cloud Storage 存储桶,请执行以下操作:
- 创建 Google Cloud 服务账号。
- 在集群中创建 Kubernetes ServiceAccount。
- 将 Kubernetes ServiceAccount 绑定到 Google Cloud 服务账号。
创建 Google Cloud 服务账号
在 Google Cloud 控制台中,转到创建服务账号页面:
在服务账号 ID 字段中,输入
gke-ai-sa
。点击创建并继续。
在角色列表中,选择 Cloud Storage > Storage Insights Collector Service 角色。
点击
添加其他角色。在选择角色列表中,选择 Cloud Storage > Storage Object Admin 角色。
点击继续,然后点击完成。
在集群中创建 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 中,运行以下命令:
向 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 的完整身份。为 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 中,将预训练的机器学习模型复制到 Cloud Storage 存储桶:
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
部署 Service 以访问 Deployment:
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 地址。确认 Service 和 Deployment 正常运行:
curl -v EXTERNAL_IP:8000/v2/health/ready
输出类似于以下内容:
... < HTTP/1.1 200 OK < Content-Length: 0 < Content-Type: text/plain ...
TF Serving
在 Cloud Shell 中,将预训练的机器学习模型复制到 Cloud Storage 存储桶:
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
部署 Service 以访问 Deployment:
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 存储桶:
转至存储桶页面:
选择
PROJECT_ID-gke-bucket
对应的复选框。点击
删除。如需确认删除,请输入
DELETE
,然后点击删除。
删除 Google Cloud 服务账号:
转到服务账号页面:
选择您的项目。
选择
gke-gpu-sa@PROJECT_ID.iam.gserviceaccount.com
对应的复选框。点击
删除。如需确认删除,请点击删除。
删除 GKE 集群和 Google Cloud 资源
删除 GKE 集群:
转到集群页面:
选择
online-serving-cluster
对应的复选框。点击
删除。如需确认删除,请输入
online-serving-cluster
,然后点击删除。
删除 Cloud Storage 存储桶:
转至存储桶页面:
选择
PROJECT_ID-gke-bucket
对应的复选框。点击
删除。如需确认删除,请输入
DELETE
,然后点击删除。
删除 Google Cloud 服务账号:
转到服务账号页面:
选择您的项目。
选择
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.