vLLM と OpenAI Python SDK を使用して Cloud Run GPU で LLM 推論を実行する方法

1. はじめに

概要

Cloud Run は Google Cloud 上のコンテナ プラットフォームであり、クラスタを管理することなく、コンテナでコードを簡単に実行できます。Cloud Run に GPU のサポートが追加されました。

現在、利用可能な GPU は、24 GB の vRAM を搭載した Nvidia L4 GPU です。Cloud Run インスタンスごとに 1 つの GPU があり、Cloud Run の自動スケーリングは引き続き適用されます。これには、最大 5 つのインスタンスへのスケールアウト(割り当ての増加が可能)と、リクエストがない場合のゼロ インスタンスへのスケールダウンが含まれます。

GPU のユースケースの 1 つは、独自のオープン大規模言語モデル(LLM)の実行です。このチュートリアルでは、LLM を実行するサービスをデプロイする手順について説明します。

このサービスは、本番環境システム用の推論エンジンである vLLM を実行するバックエンド サービスです。この Codelab では、20 億個のパラメータでチューニングされた Google Gemma 2 モデルを使用します。

学習内容

  • Cloud Run で GPU を使用する方法。
  • Hugging Face を使用してモデルを取得する方法。
  • 推論エンジンとして vLLM を使用して、Google の Gemma 2 2b 指示チューニング済みモデルを Cloud Run にデプロイする方法。
  • バックエンド サービスを呼び出して文の補完を行う方法。

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 Console で、[Cloud Shell をアクティブにする ] をクリックしますd1264ca30785e435.png

cb81e7c8e34bc8d.png

Cloud Shell を初めて起動した場合は、その内容を説明する画面が表示されます。中間画面が表示された場合は、[続行] をクリックしてください。

d95252b003979716.png

すぐにプロビジョニングが実行され、Cloud Shell に接続されます。

7833d5e1c5d18f54.png

この仮想マシンには、必要な開発ツールがすべて用意されています。仮想マシンは Google Cloud で稼働し、永続的なホーム ディレクトリが 5 GB 用意されているため、ネットワークのパフォーマンスと認証が大幅に向上しています。 この 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 からのシークレットへのアクセスに使用されます。

まず、次のコマンドを実行してサービス アカウントを作成します。

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

次に、Hugging Face アクセス トークン用の HF_TOKEN というシークレットを Secret Manager に作成します。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 $REGION

次に、Secret Manager のシークレットを組み込む Dockerfile を作成します。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 トークンを自動的に追加するか、サービス URL に対して直接 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
}'

サービス URL を直接使用する

まず、デプロイされたサービスの URL を取得します。

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 を使用して、Google の Gemma 2(2B)モデルを Cloud Run にデプロイする方法。
  • バックエンド サービスを呼び出して文の補完を行う方法。

9. クリーンアップ

意図しない料金が発生しないようにするには(たとえば、Cloud Run サービスが誤って無料枠の月間 Cloud Run 呼び出し割り当てよりも多く呼び出された場合)、Cloud Run を削除するか、ステップ 2 で作成したプロジェクトを削除します。

Cloud Run サービスを削除するには、https://console.cloud.google.com/run で Cloud Run Cloud Console に移動し、vllm-gemma-2-2b サービスを削除します。vllm-gemma-2-2b サービス アカウントを削除することもできます。

プロジェクト全体を削除する場合は、https://console.cloud.google.com/cloud-resource-manager に移動し、ステップ 2 で作成したプロジェクトを選択して [削除] を選択します。プロジェクトを削除する場合は、Cloud SDK でプロジェクトを変更する必要があります。gcloud projects list を実行すると、使用可能なすべてのプロジェクトのリストが表示されます。