如何使用 vLLM 和 OpenAI Python SDK 在 Cloud Run GPU 上运行 LLM 推理

1. 简介

概览

Cloud Run 最近添加了 GPU 支持。此功能目前为公开预览版,但需要申请加入等候名单。如果您有兴趣试用此功能,请填写此表单以加入候补名单。Cloud Run 是 Google Cloud 上的一个容器平台,可让您轻松在容器中运行代码,而无需管理集群。

目前,我们提供的 GPU 是配备 24 GB vRAM 的 Nvidia L4 GPU。每个 Cloud Run 实例有一个 GPU,并且 Cloud Run 自动扩缩功能仍然适用。这包括横向扩容到最多 5 个实例(可申请增加配额),以及在没有请求时缩容到零个实例。

GPU 的一个应用场景是运行您自己的开放大语言模型 (LLM)。本教程将引导您完成部署运行 LLM 的服务。

该服务是一个后端服务,可运行 vLLM(一种用于生产系统的推理引擎)。此 Codelab 使用 Google 的 Gemma 2(一种包含 20 亿个参数的指令调优模型)。

学习内容

  • 如何在 Cloud Run 上使用 GPU。
  • 如何使用 Hugging Face 检索模型。
  • 如何使用 vLLM 作为推理引擎,在 Cloud Run 上部署 Google 的 Gemma 2 2b 指令调优模型。
  • 如何调用后端服务来完成句子补全。

2. 设置和要求

前提条件

  • 您已登录 Cloud 控制台。
  • 您之前已部署过 Cloud Run 服务。例如,您可以按照从源代码部署 Web 服务快速入门中的步骤开始操作。
  • 您拥有 Hugging Face 账号,并且已在 https://huggingface.co/google/gemma-2-2b-it 接受 Gemma 2 2b 许可;否则,您将无法下载该模型。
  • 您已创建可访问 google/gemma-2-2b-it 模型的访问令牌。

激活 Cloud Shell

  1. 在 Cloud Console 中,点击激活 Cloud Shelld1264ca30785e435.png

cb81e7c8e34bc8d.png

如果您是首次启动 Cloud Shell,系统会显示一个中间屏幕,其中描述了 Cloud Shell 的用途。如果您看到了中间屏幕,请点击继续

d95252b003979716.png

预配和连接到 Cloud Shell 只需花几分钟时间。

7833d5e1c5d18f54.png

这个虚拟机已加载了所需的所有开发工具。它提供了一个持久的 5 GB 主目录,并且在 Google Cloud 中运行,大大增强了网络性能和身份验证。只需使用一个浏览器即可完成本 Codelab 中的大部分工作。

连接到 Cloud Shell 后,您应该会看到自己已通过身份验证,并且相关项目已设置为您的项目 ID。

  1. 在 Cloud Shell 中运行以下命令以确认您已通过身份验证:
gcloud auth list

命令输出

 Credentialed Accounts
ACTIVE  ACCOUNT
*       <my_account>@<my_domain.com>

To set the active account, run:
    $ gcloud config set account `ACCOUNT`
  1. 在 Cloud Shell 中运行以下命令,以确认 gcloud 命令了解您的项目:
gcloud config list project

命令输出

[core]
project = <PROJECT_ID>

如果不是上述结果,您可以使用以下命令进行设置:

gcloud config set project <PROJECT_ID>

命令输出

Updated property [core/project].

3. 启用 API 并设置环境变量

启用 API

在开始使用此 Codelab 之前,您需要启用多个 API。本 Codelab 需要使用以下 API。您可以运行以下命令来启用这些 API:

gcloud services enable run.googleapis.com \
    cloudbuild.googleapis.com \
    secretmanager.googleapis.com \
    artifactregistry.googleapis.com

设置环境变量

您可以设置本 Codelab 中全程使用的环境变量。

HF_TOKEN=<YOUR_HUGGING_FACE_TOKEN>
PROJECT_ID=<YOUR_PROJECT_ID>

REGION=us-central1
SERVICE_NAME=vllm-gemma-2-2b-it
AR_REPO_NAME=vllm-gemma-2-2b-it-repo
SERVICE_ACCOUNT=vllm-gemma-2-2b-it
SERVICE_ACCOUNT_ADDRESS=$SERVICE_ACCOUNT@$PROJECT_ID.iam.gserviceaccount.com

4. 创建服务账号

此服务账号用于构建 Cloud Run 服务并访问 Secret Manager 中的 Secret。

首先,运行以下命令创建服务账号:

gcloud iam service-accounts create $SERVICE_ACCOUNT \
  --display-name="Cloud Run vllm SA to access secret manager"

其次,向该服务账号授予 Vertex AI User 角色。

gcloud projects add-iam-policy-binding $PROJECT_ID \
  --member serviceAccount:$SERVICE_ACCOUNT_ADDRESS \
  --role=roles/secretmanager.secretAccessor

现在,在 Secret Manager 中为您的 Hugging Face 访问令牌创建一个名为 HF_TOKEN 的 Secret。Cloud Build 使用该服务账号在构建时访问此 Secret,以便从 Hugging Face 拉取 Gemma 2 (2B) 模型。您可以点击此处详细了解密文和 Cloud Build。

printf $HF_TOKEN | gcloud secrets create HF_TOKEN --data-file=-

并在构建映像时,向默认计算服务账号授予对 Secret Manager 中 HF_TOKEN Secret 的访问权限。

PROJECT_NUMBER=$(gcloud projects describe $PROJECT_ID --format="value(projectNumber)")

gcloud projects add-iam-policy-binding $PROJECT_ID \
  --member="serviceAccount:$PROJECT_NUMBER-compute@developer.gserviceaccount.com" \
  --role="roles/secretmanager.secretAccessor"

5. 在 Artifact Registry 中创建映像

首先,在 Artifact Registry 中创建一个代码库。

gcloud artifacts repositories create $AR_REPO_NAME \
  --repository-format docker \
  --location us-central1

接下来,创建一个将纳入 Secret Manager 中 Secret 的 Dockerfile。您可以点击此处详细了解 Docker buildx –secrets 标志

FROM vllm/vllm-openai:latest

ENV HF_HOME=/model-cache
RUN --mount=type=secret,id=HF_TOKEN HF_TOKEN=$(cat /run/secrets/HF_TOKEN) \
    huggingface-cli download google/gemma-2-2b-it

ENV HF_HUB_OFFLINE=1

ENTRYPOINT python3 -m vllm.entrypoints.openai.api_server \
    --port ${PORT:-8000} \
    --model ${MODEL_NAME:-google/gemma-2-2b-it} \
    ${MAX_MODEL_LEN:+--max-model-len "$MAX_MODEL_LEN"}

现在,创建一个 cloudbuild.yaml 文件

steps:
- name: 'gcr.io/cloud-builders/docker'
  id: build
  entrypoint: 'bash'
  secretEnv: ['HF_TOKEN']
  args: 
    - -c
    - |
        SECRET_TOKEN="$$HF_TOKEN" docker buildx build --tag=${_IMAGE} --secret id=HF_TOKEN .

availableSecrets:
  secretManager:
  - versionName: 'projects/${PROJECT_ID}/secrets/HF_TOKEN/versions/latest'
    env: 'HF_TOKEN'

images: ["${_IMAGE}"]

substitutions:  
  _IMAGE: 'us-central1-docker.pkg.dev/${PROJECT_ID}/vllm-gemma-2-2b-it-repo/vllm-gemma-2-2b-it'

options:
  dynamicSubstitutions: true
  machineType: "E2_HIGHCPU_32"

最后,提交 build。

gcloud builds submit --config=cloudbuild.yaml

构建过程大约需要 8 分钟。

6. 部署服务

现在,您可以将映像部署到 Cloud Run 了。部署大约需要 5 分钟。您需要将健康检查的初始延迟时间增加几分钟,以便为映像提供更多加载时间。否则,健康检查会返回“截止时间已过”错误。

gcloud beta run deploy $SERVICE_NAME \
--image=$REGION-docker.pkg.dev/$PROJECT_ID/$AR_REPO_NAME/$SERVICE_NAME \
--service-account $SERVICE_ACCOUNT_ADDRESS \
--cpu=8 \
--memory=32Gi \
--gpu=1 \
--port=8000 \
--gpu-type=nvidia-l4 \
--region $REGION \
--no-allow-unauthenticated \
--max-instances 3 \
--no-cpu-throttling \
--no-gpu-zonal-redundancy \
--startup-probe tcpSocket.port=8000,initialDelaySeconds=240,failureThreshold=1,timeoutSeconds=240,periodSeconds=240

7. 测试服务

部署完成后,您可以使用 Cloud Run 开发代理服务(该服务会自动为您添加 ID 令牌),也可以直接使用 curl 命令访问服务网址。

使用 Cloud Run 开发代理服务

如需使用 Cloud Run 开发代理服务,您可以按以下步骤操作:

首先,运行以下命令

gcloud run services proxy $SERVICE_NAME --region us-central1

接下来,使用 curl 调用服务

curl -X POST http://localhost:8080/v1/completions \
-H "Content-Type: application/json" \
-d '{
  "model": "google/gemma-2-2b-it",
  "prompt": "Cloud Run is a",
  "max_tokens": 128,
  "temperature": 0.90
}'

直接使用服务网址

首先,检索已部署服务的网址。

SERVICE_URL=$(gcloud run services describe $SERVICE_NAME --region $REGION --format 'value(status.url)')

使用 curl 命令调用服务

curl -X POST $SERVICE_URL/v1/completions \
-H "Authorization: bearer $(gcloud auth print-identity-token)" \
-H "Content-Type: application/json" \
-d '{
  "model": "google/gemma-2-2b-it",
  "prompt": "Cloud Run is a",
  "max_tokens": 128,
  "temperature": 0.90
}'

结果

您应该会看到如下所示的结果:

{"id":"cmpl-e0e6924d4bfd4d918383c87cba5e25ac","object":"text_completion","created":1723853023,"model":"google/gemma-2-2b","choices":[{"index":0,"text":" serverless compute platform that lets you write your backend code in standard languages, such as Java, Go, PHP and Python.\n\nYou can deploy your function as a REST API that scales on demand and allows you to add additional security features such as HTTPS.\n\nTo write code for an Android app with Cloud Run, you need to use the GraalVM. This is because while Node.js is a more commonly known node-based platform, GraalVM is a virtual machine (VM) to run native code in the Cloud Run environment.\n\nNow you need graal.vm/java-11-jre.jar, the","logprobs":null,"finish_reason":"length","stop_reason":null}],"usage":{"prompt_tokens":5,"total_tokens":133,"completion_tokens":128}}

8. 恭喜!

恭喜您完成此 Codelab!

建议您查看 Cloud Run 文档

所学内容

  • 如何在 Cloud Run 上使用 GPU。
  • 如何使用 Hugging Face 检索模型。
  • 如何使用 vLLM 作为推理引擎在 Cloud Run 上部署 Google 的 Gemma 2 (2B) 模型。
  • 如何调用后端服务来完成句子补全。

9. 清理

为避免产生意外费用(例如,Cloud Run 服务的调用次数意外超过免费层级中每月 Cloud Run 调用次数的分配额),您可以删除 Cloud Run 或删除您在第 2 步中创建的项目。

如需删除 Cloud Run 服务,请前往 Cloud Run Cloud 控制台 (https://console.cloud.google.com/run),然后删除 vllm-gemma-2-2b 服务。您可能还想删除 vllm-gemma-2-2b 服务账号。

如果您选择删除整个项目,可以前往 https://console.cloud.google.com/cloud-resource-manager,选择您在第 2 步中创建的项目,然后选择“删除”。如果您删除项目,则需要在 Cloud SDK 中更改项目。您可以运行 gcloud projects list 查看所有可用项目的列表。