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 のユースケースの一つに、独自のオープン大規模言語モデル(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

この仮想マシンには、必要なすべての開発ツールが読み込まれます。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 からシークレットにアクセスするために使用されます。

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

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

次に、Hugging Face アクセス トークン用に HF_TOKEN というシークレットを Secret Manager で作成します。Cloud Build は、ビルド時にサービス アカウントを使用してこのシークレットにアクセスし、Gemma 2(2B)モデルを Hugging Face から pull します。シークレットと 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

次に、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 にデプロイする準備が整いました。

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. サービスをテストする

デプロイしたら、ID トークンを自動的に追加する Cloud Run 開発プロキシ サービスを使用するか、サービス 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 サービスを削除するには、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 を実行します。