このチュートリアルでは、Google Kubernetes Engine(GKE)に Mixture-of-Experts コーディング モデルである Qwen3-Coder-480B(Qwen/Qwen3-Coder-480B-A35B-Instruct-FP8)をデプロイして提供する方法について説明します。このデプロイでは、マルチホスト TPU7x(Ironwood)アクセラレータと、TorchTPU(torchtpu)およびプリフィル デコード(PD)分離を備えた SGLang サービング フレームワークを使用します。
このチュートリアルで説明するデプロイ構成では、2 つのマルチホスト tpu7x-standard-4t ノードプールをプロビジョニングします。各ノードプールは 2x2x2 トポロジで配置されます(ノードプールごとに 2 つのノードに 8 つの TPU7x チップ、合計 16 個の TPU7x チップ)。Kubernetes LeaderWorkerSet API を使用して、次のことを行います。
- テンソル並列処理とエキスパート並列処理を有効にして、分離されたマルチホスト プリフィル サーバーとデコード サーバーを別々の TPU7x スライスで実行します。
- OpenAI 互換のリクエストを SGLang 分離ルーター経由でルーティングする。
目標
- GKE クラスタとマルチホスト TPU7x ノードプールを設定します。
- 認証情報を構成し、LeaderWorkerSet コントローラをインストールします。
- マルチホストの SGLang プリフィル、デコード、ルーターのワークロードをデプロイします。
- SGLang ルーター サービスに推論リクエストを送信します。
- サービング ベンチマーク ワークロードを実行します。
- クリーンアップする。
費用
このドキュメントでは、課金対象である次のGoogle Cloudコンポーネントを使用します。
料金計算ツールを使うと、予想使用量に基づいて費用の見積もりを生成できます。
このドキュメントに記載されているタスクの完了後、作成したリソースを削除すると、それ以上の請求は発生しません。詳細については、クリーンアップをご覧ください。
始める前に
このチュートリアルを使用するには、Hugging Face アクセス トークンが必要です。Hugging Face で無料アカウントに登録できます。アカウントを作成したら、アクセス トークンを生成します。
- [Welcome to Hugging Face] ページで、アカウントのアバターをクリックし、[アクセス トークン] を選択します。
- [アクセス トークン] ページで、[新しいトークンを作成] をクリックします。
- [Read] トークン タイプを選択し、トークンの名前を入力します。
- アクセス トークンが表示されます。トークンを安全な場所に保存します。
Google Cloud プロジェクトで Kubernetes Engine API、Compute Engine API、Cloud TPU API、Artifact Registry API を有効にします。
TPU 容量が配置されているリージョンに、プロジェクトのディスク割り当てと外部 IP アドレス割り当てが十分にあることを確認します。
Google Cloud コンソールで、[割り当てとシステム上限] ページに移動します。
プリフィル Pod とデコード Pod によるモデル キャッシュに使用される 4 つの 700 GiB エフェメラル ボリューム全体で、Google Cloud Hyperdisk Balanced の割り当てが 2,800 GiB 以上あることを確認します。
[使用中のリージョン外部 IPv4 アドレス] でフィルタし、ターゲット リージョンに十分な IP アドレス割り当てがあることを確認します。
このチュートリアルを完了するために必要な権限を取得するには、プロジェクトに対する次の 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: TPU7x ノードプールをデプロイするゾーン(us-central1-cなど)。YOUR_RESERVATION_NAME: 予約を使用している場合は、TPU7x 予約の名前。YOUR_HF_TOKEN: Hugging Face アクセス トークン。YOUR_SGLANG_TPU_IMAGE: カスタム SGLang TorchTPU コンテナ イメージを使用している場合は、イメージの URI。それ以外の場合は、デフォルトの SGLang TorchTPU イメージ。
GKE クラスタを作成する
Standard モードで GKE クラスタを作成し、プリフィルとデコードの分離用に 2 つのマルチホスト TPU7x ノードプールを接続するには、次の操作を行います。
デフォルトのノードプールに
e2-standard-4ノードを使用するリージョン GKE クラスタを作成します。これにより、LeaderWorkerSet コントローラと SGLang 分離ルーターに十分な CPU リソースとメモリリソースが提供されます。マルチホスト TPU7x ノードプールに必要な
2x2x2アクセラレータ トポロジを使用して、高スループットのワークロード プレースメント ポリシーを作成します。2 つのマルチホスト TPU7x ノードプール(
tpu7x-pool-0とtpu7x-pool-1)を作成します。各ノードプールには 2 つのtpu7x-standard-4tノードが含まれます(ノードプールごとに2x2x2トポロジの 8 つの TPU7x チップ、合計 16 個の TPU7x チップ)。特定の予約を使用する代わりに、次のフラグを渡して、Spot 容量または Flex Start VM を使用してノードプールを作成することもできます。
- Spot VM:
--reservation-affinity=specificと--reservation=${RESERVATION}を--spotに置き換えて、Spot 容量を使用します。Spot 容量を使用するインスタンスは、ノードプールの作成後に作成されるまでに時間がかかることがあり、ワークロードの実行中にプリエンプトされる可能性があります。 - Flex Start VM:
--num-nodes=2、--reservation-affinity=specific、--reservation=${RESERVATION}を--flex-start、--enable-autoscaling、--num-nodes=0、--min-nodes=0、--max-nodes=2に置き換えて、Flex Start 消費オプションを使用してノードプールをプロビジョニングします。詳細については、TPU と Flex Start VM で小規模なバッチ ワークロードを実行するをご覧ください。
- Spot VM:
クラスタと通信するように
kubectl認証情報を構成します。
認証情報を構成して LeaderWorkerSet をインストールする
マルチホスト SGLang デプロイ用にクラスタを準備するには、次の手順を完了します。
Hugging Face アクセス トークンを保存する
hf-secretという名前の Kubernetes Secret を作成します。クラスタに LeaderWorkerSet CustomResourceDefinition とコントローラをインストールします。
マルチホスト SGLang サーバーをデプロイする
ワークロード マニフェスト(qwen3-coder-480b-multihost-disagg-v7x.yaml)は、2 つの 2x2x2 TPU7x ノードプール間で分離されたプレフィルとデコードのサービングを調整するために、次のリソースを定義します。
- StorageClass(
hyperdisk-balanced-tpu): Google Cloud Hyperdisk Balanced ストレージを基盤とするエフェメラル 700 GiB ReadWriteOnce ボリュームをプロビジョニングします。4 つのプリフィル Pod とデコード Pod はそれぞれ、ダウンロードしたQwen/Qwen3-Coder-480B-A35B-Instruct-FP8チェックポイントをローカルに保存するために、/dataに独自のボリュームをマウントします。 - プレフィル プール(
sglang-prefill-serviceとsglang-tpu-prefill): 1 つの2x2x2TPU7x ノードプール(16 個の TensorCore を提供する 8 個の TPU チップ)に排他的に固定されたsize: 2の LeaderWorkerSet(1 つのリーダー Pod と 1 つのワーカー Pod)を実行します。LeaderWorkerSet は、"cloud.google.com/gke-nodepool"に設定されたleaderworkerset.sigs.k8s.io/exclusive-topologyアノテーションを使用します。Pod は、--disaggregation-mode=prefill、--tensor-parallel-size=16、--ep-size=16フラグを指定してsglang.launch_serverを起動し、HTTP ポート8000とブートストラップ ポート8998を公開します。 - デコードプール(
sglang-decode-serviceとsglang-tpu-decode): 2 番目の2x2x2TPU7x ノードプール(16 個の TensorCore を提供する 8 個の TPU チップ)に固定されたsize: 2の LeaderWorkerSet を実行します。LeaderWorkerSet は、--disaggregation-mode=decode、--tensor-parallel-size=16、--ep-size=16フラグを指定してsglang.launch_serverを起動します。 - 分離ルーター(
sglang-routerとsglang-service):--pd-disaggregationフラグを指定してsglang_router.launch_routerモジュールを実行する CPU Deployment を実行し、ポート8000で ClusterIP Service を公開します。ルーターはプロンプトを転送し、sglang-prefill-serviceサービスとsglang-decode-serviceサービス間の KV キャッシュ転送を調整します。
マルチホスト SGLang サーバーをデプロイしてモニタリングする手順は次のとおりです。
ワークロード マニフェストをダウンロードします。
または、次の内容で
qwen3-coder-480b-multihost-disagg-v7x.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 のログをモニタリングします。
最初の実行では、モデルの初期ダウンロード、重みの読み込み、コンパイルに約 15 ~ 30 分かかります。
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 モデルのベンチマークを行うには、次のコマンドを実行します。
クリーンアップ
このチュートリアルで使用したリソースについて Google Cloud アカウントに継続的な料金が発生しないようにするには、次のリソースを削除します。
SGLang のプリフィル、デコード、ルーターのワークロードを削除します。
TPU7x ノードプール、ワークロード プレースメント ポリシー、GKE クラスタを削除します。
次のステップ
- SGLang の詳細を確認する。
- TPU7x(Ironwood)の詳細を確認する。
- Cloud TPU の詳細を確認する。