このチュートリアルでは、Google Cloudの Google Kubernetes Engine(GKE)に Qwen3.8-2.4T(nvidia/Qwen3.8-2.4T-A95B-NVFP4)をデプロイして提供する方法について説明します。これは、NVFP4 に量子化された 950 億のアクティブ パラメータを持つ 2.4 兆パラメータの Mixture-of-Experts モデルです。このデプロイでは、Cluster Toolkit、合計 32 個の NVIDIA B200 GPU を搭載した 4 つのマルチホスト A4(a4-highgpu-8g)仮想マシン(VM)インスタンス、NVIDIA Dynamo、プリフィル デコード(PD)分離を備えた SGLang サービング フレームワークを使用します。
このチュートリアルで説明するデプロイ構成では、Cluster Toolkit を使用して標準モードで GKE クラスタをプロビジョニングします。クラスタには、GPUDirect リモート ダイレクト メモリ アクセス(RDMA)ネットワーキングを介して接続された 4 つの a4-highgpu-8g ノードが含まれています。次に、Grove ギャング スケジューリングを使用して KAI Scheduler と NVIDIA Dynamo プラットフォームをインストールし、モデルの重みを Cloud Storage にステージングします。次に、Cloud Storage FUSE を使用してバケットをマウントし、テンソル並列処理、エキスパート並列処理、FP8 KV キャッシュを使用して、2 つの 16 GPU マルチホスト ワーカープールにプリフィルとデコードを分離する DynamoGraphDeployment カスタム リソースをデプロイします。
目標
- Cluster Toolkit をインストールし、標準モードでマルチホスト A4 GKE クラスタをプロビジョニングします。
- クラスタに KAI Scheduler と NVIDIA Dynamo プラットフォームを Grove ギャング スケジューリングとともにインストールします。
- Qwen3.8-2.4T モデルの重みを Cloud Storage バケットにステージングします。
- 合計 32 個の NVIDIA B200 GPU を搭載した 4 つの A4 ノードに、マルチホストの PD 分離 SGLang 推論サーバーをデプロイします。
- Dynamo フロントエンド ルーターにチャット完了リクエストを送信します。
- サービング ベンチマーク ワークロードを実行します。
- デプロイしたリソースをクリーンアップします。
費用
このドキュメントでは、課金対象である次のGoogle Cloudコンポーネントを使用します。
料金計算ツールを使うと、予想使用量に基づいて費用の見積もりを生成できます。
始める前に
チュートリアルの環境を設定します。
- Google Cloud CLI をインストールして初期化し、
kubectlと Helm(バージョン 3.10 以降)をインストールします。Cloud Shell を使用する場合、これらのツールはプリインストールされています。 - Cloud Shell ではなく Linux または macOS ワークステーションからこのチュートリアルを実行する場合は、Terraform や Git などの必要な Cluster Toolkit の依存関係をインストールします。
Google Cloud プロジェクトで Kubernetes Engine API、Compute Engine API、Cloud Storage API、Identity and Access Management API、Cloud Resource Manager API、Service Usage API を有効にします。
Hugging Face アクセス トークンを取得する
このチュートリアルを使用するには、Hugging Face アクセス トークンが必要です。Hugging Face で無料アカウントに登録できます。アカウントを作成したら、アクセス トークンを生成します。
- [Welcome to Hugging Face] ページで、アカウントのアバターをクリックし、[アクセス トークン] を選択します。
- [アクセス トークン] ページで、[Create new token] をクリックします。
- [Read] トークン タイプを選択し、トークンの名前を入力します。
- アクセス トークンが表示されます。トークンを安全な場所に保存します。
必要なロール
このチュートリアルを完了するために必要な権限を取得するには、プロジェクトに対する次の IAM ロールを付与するよう管理者に依頼してください。
- Kubernetes Engine 管理者(
roles/container.admin) - Compute 管理者(
roles/compute.admin) - ストレージ管理者 (
roles/storage.admin) - プロジェクト IAM 管理者 (
roles/resourcemanager.projectIamAdmin) - サービス アカウント管理者 (
roles/iam.serviceAccountAdmin) - サービス アカウント ユーザー(
roles/iam.serviceAccountUser) - Service Usage コンシューマー (
roles/serviceusage.serviceUsageConsumer)
ロールの付与については、プロジェクト、フォルダ、組織へのアクセスを管理するをご覧ください。
環境変数を設定する
このチュートリアル全体で使用する環境変数をエクスポートします。
次のように置き換えます。
YOUR_PROJECT_ID: 実際の Google Cloudプロジェクトの ID。YOUR_REGION: A4 容量が配置され、クラスタをデプロイするリージョン(us-central1など)。YOUR_ZONE: A4 容量が配置されているゾーン(us-central1-bなど)。YOUR_CLUSTER_NAME: GKE クラスタと Cluster Toolkit デプロイの名前。生成されたノードプール サービス アカウント ID(YOUR_CLUSTER_NAME-gke-np-sa)が Identity and Access Management(IAM)の 30 文字の制限内に収まるように、20 文字以下の名前を使用します。YOUR_RESERVATION_NAME: A4 予約の名前、または拡張予約ブロックのパス(RESERVATION_NAME/reservationBlocks/RESERVATION_BLOCK_NAME形式)。YOUR_BUCKET_NAME: Cluster Toolkit の Terraform 状態とステージングされた Qwen3.8-2.4T モデルの重みを保存する Cloud Storage バケットのグローバルに一意の名前。YOUR_HF_TOKEN: Hugging Face アクセス トークン。
GKE クラスタを作成する
Cluster Toolkit をダウンロードし、4 つの a4-highgpu-8g ノード、GPUDirect RDMA ネットワーキング、DRA サポートを備えた標準モードの GKE クラスタをプロビジョニングします。
Google Cloud CLI にログインし、Terraform のアプリケーションのデフォルト認証情報を生成します。
CLUSTER_TOOLKIT_VERSION(v1.104.0)で指定されたバージョンのビルド済み Cluster Toolkit バンドルをダウンロードして展開します。macOS または
arm64ワークステーションでこのコマンドを実行する場合は、プラットフォームに合わせてOS="mac"またはARCH="arm64"を設定します。Cluster Toolkit のデプロイとステージングされたモデルの重みの Terraform 状態を保存するには、均一なバケットレベルのアクセスとオブジェクト バージョニングを有効にして、A4 予約と同じリージョンに Cloud Storage バケットを作成します。
4 つの
a4-highgpu-8gノードのcluster-toolkit/examples/gke-a4/gke-a4-deployment.yamlデプロイ構成ファイルを作成します。デフォルトでは、デプロイ ファイルは特定の予約を使用するように構成されています。特定の予約がない場合は、クラスタをデプロイする前に、
cluster-toolkit/examples/gke-a4/gke-a4-deployment.yamlを更新して、Spot VM や Flex Start VM などの代替の使用オプションを使用できます。構成手順については、GKE の使用オプションをご覧ください。cluster-toolkitディレクトリに移動し、gcluster deployコマンドを使用して GKE クラスタをデプロイしてから、作業ディレクトリに戻ります。クラスタの作成には約 20 ~ 30 分かかります。
--auto-approveフラグを指定せずに./gcluster deployを実行する場合は、提案された変更を適用するために、プロンプトが表示されたら「a」と入力します。クラスタと通信するように
kubectl認証情報を構成します。
KAI Scheduler と NVIDIA Dynamo をインストールする
Hugging Face Secret を作成し、Grove ギャング スケジューリングを使用して KAI Scheduler と NVIDIA Dynamo プラットフォームをインストールして、クラスタを準備します。
Hugging Face アクセス トークンを保存する
hf-secretという名前の Kubernetes Secret を作成します。NVIDIA Dynamo プラットフォームの Helm チャート(
v1.5.0)をダウンロードし、KAI Scheduler をインストールして、Grove を有効にした Dynamo プラットフォームをインストールします。
Cloud Storage にモデルの重みをステージングする
推論ワーカー Pod がコールド スタートのたびに Hugging Face からダウンロードするのではなく、Cloud Storage FUSE を使用して重みをマウントできるように、リージョン内の Cloud Storage バケット(gs://${GCS_BUCKET})に nvidia/Qwen3.8-2.4T-A95B-NVFP4 チェックポイントをステージングします。
GKE クラスタを作成するで作成した
gs://${GCS_BUCKET}バケットに対する Storage オブジェクト ユーザーロール(roles/storage.objectUser)を、workload-identity-k8s-saKubernetes サービス アカウントにバインドされている Google サービス アカウントに付与します。qwen3.8-2.4t-nvfp4-stage-weights-job.yamlマニフェストとqwen3.8-2.4t-nvfp4-multihost-a4-gcsfuse.yamlマニフェストをダウンロードします。または、次の内容で
qwen3.8-2.4t-nvfp4-stage-weights-job.yamlという名前のファイルを作成します。このインデックス付き Job は、4 つの A4 ノードで 4 つの Pod を並列に実行します。各 Pod は、nvidia/Qwen3.8-2.4T-A95B-NVFP4チェックポイントのサイズがバランスされたスライスをノードのローカル NVMe SSD にダウンロードし、gcloud storage rsyncを使用してgs://${GCS_BUCKET}/hf_models/models--nvidia--qwen3_8-2_4t-a95b-nvfp4にアップロードします。Cloud Storage バケット名を
qwen3.8-2.4t-nvfp4-stage-weights-job.yamlに置き換え、ステージング ジョブを開始します。4 つの Pod すべてが重みのアップロードを完了するまで待ってから、完了したジョブを削除します。モデルの重みをローカル NVMe SSD にダウンロードして Cloud Storage にアップロードするには、約 25 分かかります。
省略可: ステージング ジョブの実行中に、2 番目のターミナル セッションでステージング Pod のログをストリーミングして、ダウンロードの進行状況をモニタリングします。
YOUR_POD_NAMEは、kubectl get podsのqwen3-8-2-4t-stage-weightsPod の名前に置き換えます。
マルチホストの分離された SGLang サーバーをデプロイする
ワークロード マニフェスト(qwen3.8-2.4t-nvfp4-multihost-a4-gcsfuse.yaml)は、DRA を介してノードのマルチ NIC RDMA デバイス(mrdma.google.com)を割り当てる Kubernetes ResourceClaimTemplate(all-mrdma)、workload-identity-k8s-sa サービス アカウントの Role リソースと RoleBinding リソース、Grove ギャング スケジューリングが有効になっている NVIDIA Dynamo DynamoGraphDeployment(qwen3-8-2-4t-a4-disagg)を定義します。デプロイメントは次のものから構成されます。
フロントエンド(
Frontend): クライアント リクエストを受け入れ、登録済みのプリフィル ワーカーとデコード ワーカーを検出し、分離されたリクエスト ルーティングを調整する 1 つのルーター レプリカを実行します。プリフィル ワーカー(
Prefill): 2 つのa4-highgpu-8gノードにわたって 2 ノードのワーカープールを実行します。合計 16 個の NVIDIA B200 GPU が搭載されています。各 Pod は、Cloud Storage FUSE CSI ドライバ(gcsfuse.csi.storage.gke.io)とローカル NVMe SSD ファイル キャッシュを使用して、Cloud Storage バケットからステージングされたnvidia/Qwen3.8-2.4T-A95B-NVFP4重みを/model-weightsにマウントし、NCCL/gIB 環境をソースとして、次のフラグを使用して--disaggregation-mode prefillでpython3 -m dynamo.sglangを起動します。--served-model-name "nvidia/Qwen3.8-2.4T-A95B-NVFP4"--tensor-parallel-size 16--ep-size 16--nnodes 2--moe-runner-backend flashinfer_trtllm--attention-backend triton--kv-cache-dtype fp8_e4m3--disable-flashinfer-autotune
デコード ワーカー(
Decode): 残りの 2 つのa4-highgpu-8gノードで 2 ノードのワーカープールを実行します。合計 16 個の NVIDIA B200 GPU が使用されます。各 Pod は、Cloud Storage FUSE CSI ドライバを介して/model-weightsの Cloud Storage からステージングされたモデルの重みをマウントし、次のフラグを使用して--disaggregation-mode decodeでpython3 -m dynamo.sglangを起動します。--served-model-name "nvidia/Qwen3.8-2.4T-A95B-NVFP4"--tensor-parallel-size 16--ep-size 16--nnodes 2--moe-runner-backend flashinfer_trtllm--attention-backend triton--kv-cache-dtype fp8_e4m3
分離された推論サーバーをデプロイしてモニタリングします。
前にダウンロードした
qwen3.8-2.4t-nvfp4-multihost-a4-gcsfuse.yamlワークロード マニフェストを確認するか、次の内容でqwen3.8-2.4t-nvfp4-multihost-a4-gcsfuse.yamlという名前のファイルを作成します。qwen3.8-2.4t-nvfp4-multihost-a4-gcsfuse.yamlを Cloud Storage バケット名に置き換え、ワークロード マニフェストをクラスタに適用します。重みの読み込みとサーバーの初期化をモニタリングするには、クラスタ内の Pod を一覧表示し、プリフィル リーダー Pod とデコード リーダー Pod のログをストリーミングします。
YOUR_POD_NAMEは、kubectl get pods出力のプリフィル リーダー Pod またはデコード リーダー Pod の名前に置き換えます。コールド スタートの場合、Cloud Storage FUSE を介して Cloud Storage から 2,400,000,000,000 個の NVFP4 モデルの重み(200 シャードで約 1.44 TB)をストリーミングし、マルチホスト SGLang サーバーを初期化するのに約 4 ~ 5 分かかります。リクエストを送信する前に、
kubectl get podsのREADY列で、フロントエンド Pod に1/1が表示され、プリフィル Pod とデコード Pod に2/2が表示されるまで待ちます。NAME READY STATUS RESTARTS AGE qwen3-8-2-4t-a4-disagg-0-decode-0-decode-ldr-wz92h 2/2 Running 0 5m qwen3-8-2-4t-a4-disagg-0-decode-0-decode-wkr-fb8g6 2/2 Running 0 5m qwen3-8-2-4t-a4-disagg-0-frontend-jrx4s 1/1 Running 0 5m qwen3-8-2-4t-a4-disagg-0-prefill-0-prefill-ldr-7nz25 2/2 Running 0 5m qwen3-8-2-4t-a4-disagg-0-prefill-0-prefill-wkr-7d5cw 2/2 Running 0 5m
推論リクエストを送信する
デプロイされた Qwen3.8-2.4T サービスにチャット完了リクエストを送信します。
ローカルポート
8000をqwen3-8-2-4t-a4-disagg-frontendサービスに転送します。このターミナル セッションでポート転送を実行したままにするか、バックグラウンドでコマンドを実行します。
2 番目のターミナル セッションで、
/v1/chat/completionsエンドポイントにチャット完了リクエストを送信します。
ベンチマーク ワークロードを実行する
1,024 個の入力トークン、1,024 個の出力トークン(1k/1k)、256 個のプロンプト、128 個の最大同時実行数の構成で sglang.bench_serving を使用して、Dynamo フロントエンド Pod からデプロイされた Qwen3.8-2.4T サーバーのベンチマークを行います。
ベンチマークが完了したら、次のような指標を含む出力を探します。
Output token throughputTotal Token throughputTTFTTPOT
クリーンアップ
このチュートリアルで使用したリソースについて、 Google Cloud アカウントに継続的な追加料金が発生しないようにするには、Kubernetes ワークロード、GKE クラスタ、Cloud Storage バケットを削除します。
DynamoGraphDeployment リソースと ResourceClaimTemplate リソースを削除します。
NVIDIA Dynamo プラットフォームと KAI Scheduler Helm リリースをアンインストールします。
Hugging Face Kubernetes Secret を削除します。
cluster-toolkitディレクトリから、gcluster destroyコマンドを使用して、GKE クラスタとその関連インフラストラクチャを破棄します。ステージングされたモデルの重みと Terraform の状態を保存する Cloud Storage バケットを削除します。
gcloud storage rm --recursive "gs://${GCS_BUCKET}"
次のステップ
- NVIDIA Dynamo の詳細を確認する。
- SGLang の詳細を確認する。
- NVIDIA B200 GPU を搭載した A4 VM の詳細を確認する。
- Cluster Toolkit の詳細を確認する。
- AI に最適化された GKE クラスタの管理について学習する。