如何在搭配 vLLM 和 OpenAI Python SDK 的 Cloud Run GPU 上執行 LLM 推論

1. 簡介

總覽

Cloud Run 最近新增了 GPU 支援功能。目前僅開放公開測試,且須先加入候補名單。如有興趣試用這項功能,請填寫這份表單,加入候補名單。Cloud Run 是 Google Cloud 的容器平台,可讓您輕鬆在容器中執行程式碼,不必管理叢集。

目前我們提供的 GPU 是 Nvidia L4 GPU,具有 24 GB 的 vRAM。每個 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 Shell 中,按一下「啟用 Cloud Shell」 d1264ca30785e435.png

cb81e7c8e34bc8d.png

如果是第一次啟動 Cloud Shell,系統會顯示說明 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 secret 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) 模型。如要進一步瞭解密鑰和 Cloud Build,請參閱這篇文章

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

並在建構映像檔時,授予預設 Compute 服務帳戶存取 Secret Manager 中 HF_TOKEN 密鑰的權限。

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

接下來,請建立 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。部署作業大約需要 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 開發人員 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 服務,請前往 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