このチュートリアルでは、Ray Serve LLM を使用してマルチホスト TPU 推論サービスをデプロイする方法について説明します。Ray のネイティブ TPU サポートを利用して、複雑なアクセラレータ トポロジ全体に分散エンジン ワーカーをアトミックに共同スケジューリングすることで、推論のためにマルチホスト TPU スライスに大規模なモデルをデプロイできます。
このチュートリアルは、分散マルチホスト TPU スライスで AI/ML ワークロードをサービングするために Kubernetes コンテナ オーケストレーション機能を使用することに関心のある ML エンジニア、プラットフォーム管理者、オペレーター、データおよび AI スペシャリストを対象としています。 のコンテンツで使用されている一般的なロールとタスクの例の詳細については、一般的な GKE ユーザーロールとタスクをご覧ください。 Google Cloud
このページを読む前に、次のことをよく理解しておいてください。
背景
このセクションでは、このガイドで使用されている重要なテクノロジーについて説明します。
TPU
Tensor Processing Unit(TPU)を使用すると、ノードで実行される特定のワークロード(ML やデータ処理など)を高速化できます。TPU の主な利点は、パフォーマンス拡張です。このチュートリアルでは、第 6 世代の Cloud TPU である TPU Trillium を使用します。マルチホスト TPU スライスは、高速チップ間相互接続(ICI)を使用して通信する複数の物理ノードで構成されており、高スループットと低レイテンシのサービングに適しています。
Ray 上の vLLM
vLLM は、高スループットでメモリ効率の高い LLM サービング エンジンです。Ray Serve と統合することで、vLLM は複数のホストにスケーリングし、物理ハードウェア トポロジにネイティブにアクセスできます。このチュートリアルでは、Ray Serve の LLMConfig Deployment と LLMServer Deployment を使用して、マルチホスト スライス全体で vLLM 推論をオーケストレートする方法を示します。これにより、フレームワークがトポロジの分散とプレースメント グループの分散を自動的に処理できます。
目標
このチュートリアルでは、マルチホスト TPU を使用するマネージド Kubernetes 環境における推論用 LLM の実用的なデプロイに関する基礎を学ぶことができます。
- Autopilot または Standard の GKE クラスタで環境を準備する。
- 依存関係が組み込まれたカスタム コンテナ イメージをビルドする。
- Ray LLM Python スクリプトをクラスタにデプロイして、TPU スライス上の vLLM 推論をオーケストレートする。
- Ray LLM を使用して、
curlとオプションのウェブチャット インターフェースを介して Gemma 4 モデルをサービングする。
始める前に
作業を始める前に、次のタスクが完了していることを確認してください。
- Google Kubernetes Engine API を有効にする。 Google Kubernetes Engine API の有効化
- このタスクに Google Cloud CLI を使用する場合は、gcloud CLI をインストールして初期化する。gcloud CLI をインストール済みの場合は、
gcloud components updateコマンドを実行して最新のバージョンを取得します。以前のバージョンの gcloud CLI では、このドキュメントのコマンドを実行できない場合があります。
- 選択したリージョンに TPU Trillium(v6e)の容量が十分にあることを確認します。詳細については、Cloud TPU の割り当てをご覧ください。
- GKE クラスタで GKE Dataplane V2 が使用され、DRANET のバージョン要件(Standard と Autopilot の両方で 1.35.2-gke.1842000 以降 )を満たしていることを確認します。
- 次の IAM ロールがあることを確認してください。
roles/container.adminroles/iam.serviceAccountAdmin
環境を準備する
このチュートリアルでは、Cloud Shell を使用して Google Cloudでホストされているリソースを管理します。Cloud Shell には、このチュートリアルに必要な kubectl や gcloud CLI などのソフトウェアがプリインストールされています。
Cloud Shell を使用して環境を設定するには、次の操作を行います。
コンソールで、[Activate Cloud Shell]
をクリックして、Cloud Shell セッションを起動します。 Google Cloud これにより、コンソールの下部ペインでセッションが起動します。 Google Cloud Python 仮想環境を作成してアクティブにします。
python3 -m venv ray-env source ray-env/bin/activateRay CLI をインストールします。
pip install "ray"デフォルトの環境変数を設定します。
export PROJECT_ID=$(gcloud config get project) export CLUSTER_NAME=ray-llm-cluster export REGION=REGION export ZONE=ZONE export NAMESPACE=default export KSA_NAME=ray-ksa export GSA_NAME=tpu-reader-sa export NETWORK_NAME=${CLUSTER_NAME}-net export GS_BUCKET=BUCKET_NAME export REPO_NAME=ray-repo export CUSTOM_IMAGE_URI=REGION-docker.pkg.dev/PROJECT_ID/REPOSITORY/vllm-tpu-ray:vllm-tpu次のように置き換えます。
PROJECT_ID: 実際の Google Cloud プロジェクト ID。CLUSTER_NAME: クラスタの名前。REGION: TPU Trillium の容量が使用可能なリージョン。ZONE: TPU Trillium の容量が使用可能なゾーン。詳細については、GKE での TPU の可用性をご覧ください。REPOSITORY: Artifact Registry リポジトリの名前BUCKET_NAME: ストレージ バケットの名前。
リソースを作成して構成する Google Cloud
次の手順で、必要なリソースを作成します。
GKE クラスタとノードプールを作成する
GKE Autopilot クラスタまたは GKE Standard クラスタの TPU で Gemma をサービングできます。GKE マネージド DRANET は、分散 Pod の高性能ネットワーキング リソースを動的にリクエストして管理します。これにより、GKE は、手動で VPC を設定しなくても、アクセラレータ間の通信用にセカンダリ高速ネットワークを自動的にプロビジョニングできます。
Autopilot
Cloud Shell で、Autopilot クラスタを作成します。
gcloud container clusters create-auto ${CLUSTER_NAME} \ --project=${PROJECT_ID} \ --enable-ray-operator \ --location=${REGION}クラスタと通信を行うように
kubectlを構成します。gcloud container clusters get-credentials ${CLUSTER_NAME} \ --location=${REGION}Autopilot モードで GKE マネージド DRANET を使用するには、リポジトリに用意されているカスタム ComputeClass リソースをデプロイして、動的ネットワーキングをオプトインします。
マニフェストをクラスタに適用します。
kubectl apply -f ai-ml/gke-ray/rayserve/llm/tpu/networking/dranet-compute-class.yaml
標準
Cloud Shell で、Ray オペレーターを有効にして GKE Dataplane V2 を使用する Standard クラスタを作成します。
gcloud container clusters create ${CLUSTER_NAME} \ --project=${PROJECT_ID} \ --addons=RayOperator,GcsFuseCsiDriver \ --machine-type=n2-standard-8 \ --enable-dataplane-v2 \ --workload-pool=${PROJECT_ID}.svc.id.goog \ --location=${ZONE}DRANET ドライバを有効にして、マルチホスト TPU スライス ノードプールを作成します。
gcloud container node-pools create v6e-16 \ --location=${ZONE} \ --cluster=${CLUSTER_NAME} \ --machine-type=ct6e-standard-4t \ --tpu-topology=4x4 \ --num-nodes=4 \ --enable-gvnic \ --scopes=https://www.googleapis.com/auth/cloud-platform \ --accelerator-network-profile=auto \ --node-labels=cloud.google.com/gke-networking-dra-driver=true
ストレージと認証を構成する
Cloud Storage バケットを作成し、Rapid Cache インスタンスを初期化してモデルの読み込みを高速化します。次に、Hugging Face の認証を構成します。
TPU ゾーンで、ストレージ バケットを作成し、Rapid Cache インスタンスを初期化します。
gcloud storage buckets create gs://${GS_BUCKET} --project=${PROJECT_ID} --default-storage-class=STANDARD --location=${REGION} gcloud storage buckets anywhere-caches create gs://${GS_BUCKET} ${ZONE} \ --ttl=1d \ --admission-policy=ADMIT_ON_FIRST_MISSID リンクを構成して、重みバケットを GKE Pod に安全にマウントできるようにします。まず、専用の IAM サービス アカウントを作成し、バケットの読み取り権限を付与します。
gcloud iam service-accounts create ${GSA_NAME} gcloud storage buckets add-iam-policy-binding gs://${GS_BUCKET} \ --member="serviceAccount:${GSA_NAME}@${PROJECT_ID}.iam.gserviceaccount.com" \ --role="roles/storage.objectAdmin"Workload Identity Federation for GKE バインディングを作成し、Kubernetes ServiceAccount オブジェクトにアノテーションを付けます。
gcloud iam service-accounts add-iam-policy-binding ${GSA_NAME}@${PROJECT_ID}.iam.gserviceaccount.com \ --role="roles/iam.workloadIdentityUser" \ --member="serviceAccount:${PROJECT_ID}.svc.id.goog[${NAMESPACE}/${KSA_NAME}]" kubectl create serviceaccount ${KSA_NAME} --namespace ${NAMESPACE} kubectl annotate serviceaccount ${KSA_NAME} --namespace ${NAMESPACE} iam.gke.io/gcp-service-account=${GSA_NAME}@${PROJECT_ID}.iam.gserviceaccount.comGemma 4 モデルの重みをダウンロードするには、Hugging Face で Google のライセンス契約に同意する必要があります。Hugging Face の Gemma 4 モデルのページに移動します。
[Agree and access repository] をクリックして、ライセンス条項に同意します。
Hugging Face アカウントの設定に移動し、アクセス トークンを
Readロールで生成します。Hugging Face トークンをエクスポートし、Ray がモデルの重みを pull できるように Kubernetes Secret を作成します。
export HF_TOKEN=YOUR_HUGGING_FACE_TOKEN kubectl create secret generic hf-secret \ --from-literal=hf_api_token=${HF_TOKEN}
カスタム コンテナ イメージをビルドする
マルチホスト環境に必要な依存関係がすべて含まれていることを確認するには、vLLM の TPU イメージに基づいてカスタム イメージをビルドし、サービング スクリプトをコピーします。
Artifact Registry リポジトリを作成します。
gcloud artifacts repositories create ${REPO_NAME} \ --repository-format=docker \ --location=${REGION}プロジェクトに対して Docker を認証します。
gcloud auth configure-docker ${REGION}-docker.pkg.devサンプル リポジトリの
Dockerfileを確認します。イメージをビルドして Artifact Registry に push します。
docker build -t ${CUSTOM_IMAGE_URI} . docker push ${CUSTOM_IMAGE_URI}
モデルの重みを Cloud Storage に事前ステージングする
RayCluster をデプロイする前に、スタンドアロン Kubernetes Job を使用してモデルの重みを Cloud Storage バケットに直接事前ステージングすることで、モデルの読み込みパフォーマンスを最適化し、分散 TPU スライス全体で高可用性を確保します。この分離されたアプローチにより、協調的な並列ストリーミングが可能になり、クラスタの起動時間が短縮されます。
ダウンローダー ジョブのマニフェストは、リポジトリにあります。マニフェスト構成を確認します。
リポジトリ内のファイルを適用して、ダウンローダー ジョブを作成します。
envsubst < ai-ml/gke-ray/rayserve/llm/tpu/components/model-downloader-job.yaml | kubectl apply -f -ダウンロード ストリームが成功を報告するまでジョブをモニタリングします。
kubectl logs -f job/model-downloader
推論スクリプトを作成する
次の Python スクリプトは、Ray Serve の高レベルの LLMConfig ラッパーを搭載した Ray Serve アプリケーションを定義します。
サンプル リポジトリの
serve_tpu_multihost.pyスクリプトを確認します。
Ray LLM API について
このスクリプトは、Ray Serve のネイティブ ray.serve.llm ライブラリを利用して、マルチホスト TPU オーケストレーションの複雑さを抽象化します。vLLM エンジンをラップすることで、Ray Serve LLM は、本番環境での高度に分散された推論ワークロード向けに特別に設計された、高性能でスケーラブルなフレームワークを提供します。
Ray LLM API を使用すると、次のような重要なメリットがあります。
- マルチノード デプロイ: Ray Serve LLM を使用すると、複数の分散ホスト(TPU マルチホスト スライスなど)にまたがる大規模なモデルを、ネイティブに自動プレースメント、調整、トポロジ分散でサービングできます。
- vLLM の互換性: Ray Serve LLM は、vLLM のサーバーと連携する OpenAI 互換の API を提供します。また、Kubernetes クラスタ全体でワークロードをスケーリングしながら、vLLM の高度な機能セット(構造化出力、マルチモーダル機能、推論モデルなど)にアクセスすることもできます。
- 本番環境に対応した機能: Ray Serve LLM には、組み込みの自動スケーリング、キャッシュ ヒットを最大化するためのカスタム リクエスト ルーティング、指標とオブザーバビリティの組み込み統合など、エンタープライズ グレードの機能が含まれています。
提供されている推論スクリプトでは、デプロイは次の 2 つの主要コンポーネントで定義されます。
LLMConfig: このオブジェクトは、サービング構成を定義します。モデルソース、vLLM のエンジン パラメータ、accelerator_configを指定します。{"kind": "tpu", "topology": "4x4"}を設定すると、Ray Serve LLM は、物理 16 チップ TPU v6e スライスに正確にマッピングされる分散プレースメント グループを自動的にプロビジョニングします。build_openai_app: この API は、構成された vLLM エンジンを OpenAI 互換の FastAPI サーバーに自動的にラップします。これにより、カスタム サーバーコードを記述しなくても、業界標準の REST API(/v1/chat/completionsなど)をすぐに使用できます。
RayService をデプロイする
動的リソース割り当て(DRA)ネットワーキング構成と RayService サービング マニフェストをデプロイします。
リポジトリに用意されている
ResourceClaimTemplateをデプロイして、各ノードで使用可能なすべての NetDevice インターフェースをリクエストします。テンプレート マニフェストをクラスタに適用します。
kubectl apply -f ai-ml/gke-ray/rayserve/llm/tpu/networking/all-netdev-template.yamlRayServiceサービング マニフェストは、リポジトリにあります。マニフェスト構成を確認します。マニフェストを使用してサービスをデプロイします。
Autopilot
Autopilot クラスタにサービスをデプロイするには、まずマニフェストをダウンロードし、ローカルで編集して、オプトイン
ComputeClassnodeSelectorを追加する必要があります。これは、Autopilot での DRANET ネットワーキングに必要です。curl -O https://raw.githubusercontent.com/GoogleCloudPlatform/kubernetes-engine-samples/main/ai-ml/gke-ray/rayserve/llm/tpu/ray-service.tpu-v6e-multihost.yamlnodeSelectorフィールドにラベルを追加して、次のようになります。nodeSelector: cloud.google.com/gke-tpu-accelerator: tpu-v6e-slice cloud.google.com/gke-tpu-topology: 4x4 cloud.google.com/compute-class: dranet-compute-class次に、変更したローカル マニフェストを使用してサービスをデプロイします。
envsubst < ray-service.tpu-v6e-multihost.yaml | kubectl apply -f -
標準
Standard クラスタにサービスをデプロイするには、リポジトリからマニフェストを直接デプロイします。
envsubst < ai-ml/gke-ray/rayserve/llm/tpu/ray-service.tpu-v6e-multihost.yaml | kubectl apply -f -
検証
RayService が利用可能になるまで待ちます。
kubectl wait --for=condition=Ready --timeout=1800s rayservice/vllm-tpu-multihostモデルが正常に読み込まれたことを確認するには、Ray ヘッド Pod のログを表示します。
kubectl logs -f -l ray.io/node-type=head -c ray-head
モデルをサービングする
このセクションでは、モデルを操作します。モデルが完全にダウンロードされたことを確認してから、次の手順に進んでください。
ポート転送をセットアップする
次のコマンドを実行して、モデルへのポート転送を設定します。
kubectl port-forward svc/vllm-tpu-multihost-head-svc 8000:8000 2>&1 >/dev/null &
curl を使用してモデルを操作する
このセクションでは、基本的なスモークテストを実行して、デプロイされた Gemma 4 モデルを確認する方法について説明します。
新しいターミナル セッションで、curl を使用してモデルとチャットします。
curl -X POST http://127.0.0.1:8000/v1/chat/completions \
-H "Content-Type: application/json" \
-d '{
"model": "google/gemma-4-31B-it",
"messages": [
{
"role": "user",
"content": "Why is GKE managed DRANET preferred for multi-host TPU networking?"
}
],
"max_tokens": 256
}'
出力は次のようになります。
{
"id": "chatcmpl-392692d3-5325-4832-a3a3-0b084c1045b0",
"object": "chat.completion",
"created": 1779883255,
"model": "google/gemma-4-31B-it",
"choices": [
{
"index": 0,
"message": {
"role": "assistant",
"content": "To understand why GKE-managed **DRANET** (Distributed RANET) is preferred for multi-host TPU networking, it is first necessary to understand the fundamental challenge of TPU pods: **the need for massive, low-latency, all-to-all communication.**\n\nWhen you scale a model across multiple TPU hosts (multi-host), the hosts must synchronize gradients and weights constantly. Standard TCP/IP networking introduces too much overhead (latency and CPU jitter) for these operations.\n\nHere is the detailed breakdown of why GKE-managed DRANET is the preferred architecture:\n\n### 1. Bypassing the Kernel (Zero-Copy Networking)\nStandard networking requires the operating system kernel to handle packets, moving data from the network card to kernel space and then to user space.\n* **The DRANET Advantage:** DRANET implements a specialized networking stack that allows for **Kernel Bypass**. It enables the TPU hardware/drivers to write data directly into the memory of the destination host. This reduces latency and eliminates the CPU overhead associated with processing network interrupts.\n\n### 2. High-Bandwidth, Low-Latency Interconnect\nMulti-host TPU training relies on a specialized topology (like a 2D or 3D"
},
"finish_reason": "length"
}
]
}
(省略可)Gradio のチャット インターフェースでモデルを操作する
このセクションでは、指示用にチューニングされたモデルを操作できるウェブチャット アプリケーションを作成します。
Gradio は、chatbot のユーザー インターフェースを作成する ChatInterface ラッパーを含む Python ライブラリです。
チャット インターフェースをデプロイする
チャット インターフェースのマニフェストは、リポジトリにあります。マニフェスト構成を確認します。
次のようにマニフェストを適用します。
kubectl apply -f ai-ml/gke-ray/rayserve/llm/tpu/components/gradio.yaml
Deployment が利用可能になるまで待ちます。
kubectl wait --for=condition=Available --timeout=900s deployment/gradio
チャット インターフェースを使用する
Cloud Shell で、次のコマンドを実行します。
kubectl port-forward service/gradio 8080:8080
これにより、Cloud Shell から Gradio サービスへのポート転送が作成されます。
Cloud Shell タスクバーの右上にある [ウェブでプレビュー] アイコン
をクリックします。[ポート 8080 でプレビュー] をクリックします。ブラウザで新しいタブが開きます。
Gradio のチャット インターフェースを使用して Gemma を操作します。プロンプトを追加して [送信] をクリックします。
モデルのパフォーマンスをモニタリングする
KubeRay で実行されているモデルのオブザーバビリティ指標のダッシュボードを表示するには、GKE 専用の Ray ダッシュボードを使用します。
クラスタを構成してオブザーバビリティ ダッシュボードにアクセスする手順については、Google Kubernetes Engine(GKE)上の RayCluster のログと指標を収集して表示するをご覧ください。
Ray ダッシュボードにアクセスする
Ray アクターのステータスを確認し、詳細なアプリケーション ログを表示して、Ray でノードレベルの使用率をネイティブにモニタリングするには、Ray ダッシュボードにアクセスします。
Ray ヘッドノード サービスをローカルマシンにポート転送します。
kubectl port-forward svc/vllm-tpu-multihost-head-svc 8265:8265ブラウザを開いて
http://localhost:8265に移動します。 Cloud Shell を使用している場合は、[ウェブでプレビュー] ボタンをクリックし、[ポート 8265 でプレビュー] を選択します。vLLM デプロイ、モデル レプリカのヘルス、クエリ レイテンシを表示するには、[Serve] タブをクリックします。
クリーンアップ
このチュートリアルで使用したリソースについて Google Cloud アカウントに課金されないようにするには、リソースを削除します。
RayService を削除します。
kubectl delete rayservice vllm-tpu-multihostGKE クラスタを削除します。
gcloud container clusters delete ${CLUSTER_NAME} --zone=${ZONE}
次のステップ
- Ray on Kubernetes について学習する。
- TPU を使用して GKE で vLLM をサービングする方法を学習する。
- GKE の TPU の詳細を確認する。