このチュートリアルでは、Google Kubernetes Engine(GKE)に Mixture of Experts コーディング モデルである Qwen3-Coder-30B-A3B(Qwen/Qwen3-Coder-30B-A3B-Instruct-FP8)をデプロイして提供する方法について説明します。このデプロイでは、マルチホスト TPU v6e(Trillium)アクセラレータと、TorchTPU(torchtpu)およびプレフィル デコード(PD)分離を備えた SGLang サービング フレームワークを使用します。
このチュートリアルで説明するデプロイ構成では、2 つのマルチホスト ct6e-standard-4t ノードプールをプロビジョニングします。各ノードプールは 2x4 トポロジで配置されます(ノードプールごとに 2 つのノードに 8 つの TPU v6e チップ、合計 16 個の TPU v6e チップ)。Kubernetes LeaderWorkerSet API を使用して、次のことを行います。
- テンソル並列処理とエキスパート並列処理を有効にして、分離されたマルチホスト プリフィル サーバーとデコード サーバーを別々の TPU v6e スライスで実行します。
- SGLang 分離ルーターを介してリクエストをルーティングします。
より大規模な Qwen3-Coder-480B モデルを使用して、TPU7x(Ironwood)アクセラレータで同様のマルチホスト SGLang TorchTPU サービング ワークフローを実行するには、TPU7x アクセラレータでマルチホスト SGLang TorchTPU と PD 分離を使用して GKE で Qwen3-Coder-480B をサービングするをご覧ください。
目標
- GKE クラスタとマルチホスト TPU v6e ノードプールを設定します。
- 認証情報を構成し、LeaderWorkerSet コントローラをインストールします。
- マルチホストの SGLang プレフィル、デコード、ルーターのワークロードをデプロイします。
- SGLang ルーター サービスに推論リクエストを送信します。
- サービング ベンチマーク ワークロードを実行します。
- クリーンアップする。
費用
このドキュメントでは、課金対象である次のGoogle Cloudコンポーネントを使用します。
料金計算ツールを使うと、予想使用量に基づいて費用の見積もりを生成できます。
このドキュメントに記載されているタスクの完了後、作成したリソースを削除すると、それ以上の請求は発生しません。詳細については、クリーンアップをご覧ください。
始める前に
チュートリアルの環境を設定します。
Google Cloud CLI をインストールして初期化し、
kubectlをインストールします。Cloud Shell を使用する場合、どちらのツールもプリインストールされています。Google Cloud プロジェクトで Kubernetes Engine API、Compute Engine API、Cloud TPU API、Artifact Registry API を有効にします。
TPU 容量が配置されているリージョンに、プロジェクトのディスク割り当てと外部 IP アドレス割り当てが十分にあることを確認します。
Google Cloud コンソールで、[割り当てとシステム上限] ページに移動します。
プリフィル Pod とデコード Pod によるモデル キャッシュに使用される 4 つの 100 GiB エフェメラル ボリューム全体で、少なくとも 400 GiB の Google Cloud Hyperdisk Balanced 割り当てが利用可能であることを確認します。
[使用中のリージョン外部 IPv4 アドレス] でフィルタし、ターゲット リージョンに十分な IP アドレス割り当てがあることを確認します。
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/iam.serviceAccountUser)
ロールの付与については、プロジェクト、フォルダ、組織へのアクセス権の管理をご覧ください。
必要な権限は、カスタムロールや他の事前定義ロールから取得することもできます。
Compute Engine のデフォルト サービス アカウントに、プロジェクトに対する次の Identity and Access Management(IAM)ロールが付与されていることを確認します。
- Kubernetes Engine デフォルト ノード サービス アカウント(
roles/container.defaultNodeServiceAccount) - Artifact Registry 読み取り(
roles/artifactregistry.reader)
環境変数を設定する
このチュートリアル全体で使用する環境変数をエクスポートします。
次のように置き換えます。
YOUR_CLUSTER_NAME: GKE クラスタの名前。YOUR_PROJECT_ID: 実際の Google Cloudプロジェクトの ID。YOUR_REGION: クラスタをデプロイするリージョン(us-central1など)。YOUR_ZONE: TPU v6e ノードプールをデプロイするゾーン(us-central1-bなど)。YOUR_RESERVATION_NAME: 予約を使用している場合は、TPU v6e 予約の名前。YOUR_HF_TOKEN: Hugging Face アクセス トークン。
カスタム SGLang TorchTPU コンテナ イメージを使用している場合は、SGLANG_IMAGE 変数の lmsysorg/sglang:v0.1.0-tpu をイメージの URI に置き換えます。
GKE クラスタを作成する
Standard モードで GKE クラスタを作成し、プリフィルとデコードの分離用に 2 つのマルチホスト TPU v6e ノードプールを接続するには、次の操作を行います。
デフォルトのノードプールに
e2-standard-4ノードを使用するリージョン GKE クラスタを作成します。これにより、LeaderWorkerSet コントローラと SGLang 分離ルーターに十分な CPU リソースとメモリリソースが提供されます。2 つのマルチホスト TPU v6e ノードプールを作成します。各ノードプールには 2 つの
ct6e-standard-4tノードが含まれます(ノードプールごとに2x4トポロジの 8 つの TPU v6e チップ、合計 16 個の TPU v6e チップ)。特定の予約を使用する代わりに、Spot 容量または Flex Start VM を使用してノードプールを作成することもできます。
Spot VM
--reservation-affinity=specificフラグと--reservation="${RESERVATION}"フラグを--spotフラグに置き換えて、Spot 容量を使用してノードプールをプロビジョニングします。Spot 容量を使用するインスタンスは、ノードプールの作成後に作成されるまでに時間がかかることがあり、ワークロードの実行中にプリエンプトされる可能性があります。
Flex Start VM
Flex Start 消費オプションを使用してノードプールをプロビジョニングします。
詳細については、TPU と Flex Start VM で小規模なバッチ ワークロードを実行するをご覧ください。
クラスタと通信するように
kubectl認証情報を構成します。
認証情報を構成して LeaderWorkerSet をインストールする
マルチホスト SGLang デプロイ用にクラスタを準備する手順は次のとおりです。
Hugging Face アクセス トークンを保存する
hf-secretという名前の Kubernetes Secret を作成します。クラスタに LeaderWorkerSet CustomResourceDefinition とコントローラをインストールします。
マルチホスト SGLang サーバーをデプロイする
ワークロード マニフェスト(qwen3-coder-30b-multihost-disagg-v6e-2x4.yaml)は、2 つの 2x4 TPU v6e ノードプール間で分離されたプレフィルとデコードのサービングを調整するために、次のリソースを定義します。
StorageClass(
hyperdisk-balanced-tpu): Google Cloud Hyperdisk Balanced ストレージを基盤とするエフェメラル 100 GiB ReadWriteOnce ボリュームをプロビジョニングします。4 つのプリフィル Pod とデコード Pod はそれぞれ、ダウンロードしたQwen/Qwen3-Coder-30B-A3B-Instruct-FP8チェックポイントをローカルに保存するために、独自のボリュームを/dataにマウントします。プリフィル プール(
sglang-prefill-serviceとsglang-tpu-prefill): 1 つのリーダー Pod と 1 つのワーカー Pod を含む LeaderWorkerSet を実行します。これは、1 つの2x4TPU v6e ノードプールに排他的に固定されます。このノードプールには 8 個の TPU チップがあり、8 個の TensorCore が提供されます。LeaderWorkerSet は、"cloud.google.com/gke-nodepool"に設定されたleaderworkerset.sigs.k8s.io/exclusive-topologyアノテーションを使用します。Pod は、次のフラグを指定してsglang.launch_serverを起動し、ポート8000とブートストラップ ポート8998を公開します。--disaggregation-mode=prefill--tensor-parallel-size=8--ep-size=8
デコードプール(
sglang-decode-serviceとsglang-tpu-decode): 2 番目の2x4TPU v6e ノードプール(8 個の TPU チップ、8 個の TensorCore を提供)に固定されたsize: 2の LeaderWorkerSet を実行します。LeaderWorkerSet は、次のフラグを指定してsglang.launch_serverを起動します。--disaggregation-mode=decode--tensor-parallel-size=8--ep-size=8
分離ルーター(
sglang-routerとsglang-service):--pd-disaggregationフラグを指定してsglang_router.launch_routerモジュールを実行する CPU デプロイを実行し、ポート8000で ClusterIP Service を公開します。ルーターはプロンプトを転送し、sglang-prefill-serviceサービスとsglang-decode-serviceサービス間の KV キャッシュ転送を調整します。
マルチホスト SGLang サーバーをデプロイしてモニタリングする手順は次のとおりです。
ワークロード マニフェストをダウンロードします。
または、次の内容で
qwen3-coder-30b-multihost-disagg-v6e-2x4.yamlという名前のファイルを作成します。ワークロード マニフェストをクラスタに適用します。
ルーター、プリフィル、デコードの Pod が作成されていることを確認します。
すべての Pod の準備が整うと、出力は次のようになります。
NAME READY STATUS RESTARTS AGE sglang-router-6d87cb8c7d-gv4wr 1/1 Running 0 39m sglang-tpu-decode-0 1/1 Running 0 40m sglang-tpu-decode-0-1 1/1 Running 0 40m sglang-tpu-prefill-0 1/1 Running 0 40m sglang-tpu-prefill-0-1 1/1 Running 0 40m起動が完了するまで、プリフィルとデコードのリーダー Pod のログをモニタリングします。
最初の実行では、モデルの初期ダウンロード、重みの読み込み、コンパイルに約 7 ~ 10 分かかります。
Spot 容量や Flex Start VM などのプリエンプティブル容量を使用している場合、ノードプールの作成後に TPU スライスノードが作成されるまでに時間がかかることがあります。また、ワークロードの実行中にプリエンプトされる可能性があります。詳細については、プリエンプティブル VM インスタンスをご覧ください。TPU スライスノードが作成されているかどうかを確認するには、ノードのステータスと条件を確認するをご覧ください。
プリフィルとデコードのリーダー Pod のログに次のメッセージが出力され、
kubectl get podsのすべての Pod のREADY列に1/1が表示されるまで待ちます。The server is fired up and ready to roll!2 つ目のターミナル セッションを開き、ローカルポート
8000をsglang-serviceに転送します。このターミナル セッションでポート転送を実行したままにします。
推論リクエストを送信する
最初のターミナル セッションに戻り、SGLang ルーターによって公開されている /v1/chat/completions エンドポイントにチャット完了リクエストを送信します。
ベンチマーク ワークロードを実行する
sglang-router Pod から 1,024 トークンの入力と 1,024 トークンの出力(1k/1k)ワークロードを使用して、デプロイされた Qwen3-Coder-30B-A3B モデルのベンチマークを行うには、次のコマンドを実行します。
ベンチマークが完了したら、次のような指標を含む出力を探します。
Output token throughput
Total token throughput
TTFT
TPOT
クリーンアップ
このチュートリアルで使用したリソースについて Google Cloud アカウントに継続的な追加料金が発生しないようにするには、次のリソースを削除します。
SGLang のプリフィル、デコード、ルーターのワークロードを削除します。
TPU v6e ノードプールと GKE クラスタを削除します。
次のステップ
- SGLang の詳細を確認する。
- TPU v6e(Trillium)の詳細を確認する。
- Cloud TPU の詳細を確認する。
特に記載のない限り、このページのコンテンツはクリエイティブ・コモンズの表示 4.0 ライセンスにより使用許諾されます。コードサンプルは Apache 2.0 ライセンスにより使用許諾されます。詳しくは、Google Developers サイトのポリシーをご覧ください。Java は Oracle および関連会社の登録商標です。
最終更新日 2026-11-03 UTC。