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 インスタンスごとに 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=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

次に、Hugging Face アクセス トークンの Secret Manager に HF_TOKEN というシークレットを作成します。Cloud Build は、ビルド時にサービス アカウントを使用してこのシークレットにアクセスし、Hugging Face から Gemma 2(2B)モデルを pull します。シークレットと Cloud Build の詳細を確認する。

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

また、イメージのビルド時に、デフォルトのコンピューティング サービス アカウントに 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

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

サービス 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 を実行すると、使用可能なすべてのプロジェクトのリストを表示できます。