如何在搭配 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 的後端服務,這是實際工作環境系統的推論引擎。本程式碼研究室採用 Google 的 Gemma 2,搭配 20 億個參數解說經過調整的模型。

課程內容

  • 如何在 Cloud Run 使用 GPU。
  • 如何使用 Hugging Face 擷取模型。
  • 如何使用 vLLM 做為推論引擎,在 Cloud Run 中部署 Google 的 Gemma 2 2b 經過訓練的模型。
  • 如何叫用後端服務完成句子。

2. 設定和需求

必要條件

  • 您已登入 Cloud 控制台。
  • 先前已部署 Cloud Run 服務。舉例來說,您可以按照從原始碼部署網路服務的快速入門導覽課程著手。
  • 您擁有 Hugging Face 帳戶,且您已透過 https://huggingface.co/google/gemma-2-2b-it 確認 Gemma 2 2b 授權。否則您將無法下載模型。
  • 您建立了可存取 google/gemma-2-2b-it 模型的存取權杖。

啟用 Cloud Shell

  1. 在 Cloud 控制台中,按一下「啟用 Cloud Shell」圖示 d1264ca30785e435.png

cb81e7c8e34bc8d.png

如果您是第一次啟動 Cloud Shell,系統會顯示中繼畫面,說明這項服務的內容。如果系統顯示中繼畫面,請按一下「繼續」

d95252b003979716.png

佈建並連線至 Cloud Shell 只需幾分鐘的時間。

7833d5e1c5d18f54.png

這個虛擬機器已載入所有必要的開發工具。提供永久的 5 GB 主目錄,而且在 Google Cloud 中運作,大幅提高網路效能和驗證能力。在本程式碼研究室中,您的大部分作業都可透過瀏覽器完成。

連線至 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

開始使用本程式碼研究室之前,您必須先啟用多個 API。本程式碼研究室需要使用下列 API。您可以執行下列指令來啟用這些 API:

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

設定環境變數

您可以設定將在本程式碼研究室中使用的環境變數。

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 中的密鑰。

首先,請執行下列指令來建立服務帳戶:

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

接著,將「Vertex AI 使用者」角色授予服務帳戶。

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

現在,請在 Secret Manager 中為 Hugging Face 存取權杖建立名為「HF_TOKEN」的密鑰。Cloud Build 會在建構期間透過服務帳戶存取這組密鑰,從 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 中的密鑰。如要進一步瞭解 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"

最後提交版本。

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 dev Proxy 服務,讓系統自動為您新增 ID 權杖,或是直接 curl 服務網址。

使用 Cloud Run 開發人員 Proxy 服務

如要使用 Cloud Run 開發人員 Proxy 服務,請按照下列步驟操作:

首先,請執行下列指令

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 -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. 恭喜!

恭喜您完成本程式碼研究室!

建議您參閱 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 來查看可用專案的清單。