如何使用 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,系统会显示一个中间屏幕,说明它是什么。如果您看到中间屏幕,请点击继续

d95252b003979716.png

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

7833d5e1c5d18f54

这个虚拟机装有所需的所有开发工具。它提供了一个持久的 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 secrete 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=-

在 Secret Manager 中授予服务账号对 HF_TOKEN 密钥的访问权限。

gcloud secrets add-iam-policy-binding HF_TOKEN \
    --member serviceAccount:$SERVICE_ACCOUNT_ADDRESS \
    --role='roles/secretmanager.secretAccessor'

5. 在 Artifact Registry 中创建映像

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

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

接下来,创建一个 Dockerfile,它将包含来自 Secret Manager 的 Secret。您可以在此处详细了解 Docker buildx –secrets flag

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 了。

gcloud beta run deploy $SERVICE_NAME \
--image=us-central1-docker.pkg.dev/$PROJECT_ID/$AR_REPO_NAME/$SERVICE_NAME \
--service-account $SERVICE_ACCOUNT_ADDRESS \
--cpu=8 \
--memory=32Gi \
--gpu=1 --gpu-type=nvidia-l4 \
--region us-central1 \
--no-allow-unauthenticated \
--max-instances 5 \
--no-cpu-throttling

部署过程最多可能需要 5 分钟。

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 服务,请前往 https://console.cloud.google.com/run 前往 Cloud Run Cloud 控制台,然后删除 vllm-gemma-2-2b 服务。您可能还需要删除 vllm-gemma-2-2b 服务账号。

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