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

1. 简介

概览

Cloud Run 是 Google Cloud 上的一个容器平台,可让您轻松在容器中运行代码,而无需管理集群。Cloud Run 最近添加了 GPU 支持。

目前,我们提供的 GPU 是 Nvidia L4 GPU,配备 24 GB vRAM。每个 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 Console。
  • 您之前已部署 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 Shell d1264ca30785e435.png

cb81e7c8e34bc8d.png

如果您是首次启动 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=europe-west1
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) 模型。您可以点击此处详细了解 Secret 和 Cloud Build

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

在构建映像时,向默认的 Compute 服务账号授予对 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 $REGION

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

FROM vllm/vllm-openai:v0.11.0

ENV HF_HOME=/model-cache
RUN --mount=type=secret,id=HF_TOKEN HF_TOKEN=$(cat /run/secrets/HF_TOKEN) \
    hf 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} \
    --gpu-memory-utilization 0.85 \
    --max-num-seqs 256 \
    --max-model-len 4096

现在,创建一个 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: '${_LOCATION}-docker.pkg.dev/${PROJECT_ID}/vllm-gemma-2-2b-it-repo/vllm-gemma-2-2b-it'

options:
  dynamicSubstitutions: true
  machineType: "E2_HIGHCPU_32"

最后,提交构建。

gcloud builds submit --config=cloudbuild.yaml --substitutions=_LOCATION=$REGION

构建大约需要 8 分钟。

6. 部署该服务

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

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 $REGION

接下来,使用 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 Console (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 查看所有可用项目的列表。