このチュートリアルでは、単一ホストの TPU v6e(Trillium)アクセラレータと、TorchTPU(torchtpu)を備えた vLLM TPU サービング フレームワークを使用して、Google Kubernetes Engine(GKE)に Mixture of Experts モデル Qwen3-30B-A3B(Qwen/Qwen3-30B-A3B-FP8)をデプロイして提供する方法について説明します。ワークロードは、データ並列処理とエキスパート並列処理を有効にした 2x2 トポロジの 4 つの TPU v6e チップを含む単一の ct6e-standard-4t ノードで実行します。
より大きな Qwen3.5-397B モデルを使用して、TPU7x(Ironwood)アクセラレータで同様の単一ホスト vLLM TorchTPU サービング ワークフローを実行するには、TPU7x アクセラレータで vLLM TorchTPU を使用して GKE で Qwen3.5-397B をサービングするをご覧ください。
目標
- GKE クラスタと単一ホスト TPU v6e ノードプールを設定します。
- GKE に単一ホストの vLLM TorchTPU サーバーをデプロイします。
- vLLM TorchTPU サーバーに推論リクエストを送信します。
- サービング ベンチマーク ワークロードを実行します。
- クリーンアップする。
費用
このドキュメントでは、課金対象である次のGoogle Cloudコンポーネントを使用します。
料金計算ツールを使うと、予想使用量に基づいて費用の見積もりを生成できます。
このドキュメントに記載されているタスクの完了後、作成したリソースを削除すると、それ以上の請求は発生しません。詳細については、クリーンアップをご覧ください。
始める前に
チュートリアルの環境を設定します。
Google Cloud プロジェクトで Kubernetes Engine API を有効にします。
Google Cloud プロジェクトで Artifact Registry API を有効にします。
Google Cloud CLI をインストールして初期化し、
kubectlをインストールします。Cloud Shell を使用する場合、どちらのツールもプリインストールされています。TPU 容量が配置されているリージョンに、プロジェクトの SSD 割り当てと外部 IP アドレス割り当てが十分にあることを確認します。
Google Cloud コンソールで、[割り当てとシステム上限] ページに移動します。
[Persistent Disk SSD (GB)] でフィルタし、モデル キャッシュ ボリュームに 500 GB 以上の割り当てがあることを確認します。
[使用中のリージョン外部 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)
ロールの付与については、プロジェクト、フォルダ、組織へのアクセス権の管理をご覧ください。
環境変数を設定する
認証を設定します。
環境変数を設定します。
次のように置き換えます。
YOUR_PROJECT_ID: 実際の Google Cloudプロジェクトの ID。YOUR_REGION: クラスタをデプロイするリージョン(us-central1など)。YOUR_ZONE: TPU v6e ノードプールをデプロイするゾーン(us-central1-cなど)。YOUR_CLUSTER_NAME: GKE クラスタの名前(tpu-v6e-tutorial-clusterなど)。YOUR_RESERVATION_NAME: 予約を使用している場合は、TPU v6e 予約の名前。YOUR_HF_TOKEN: Hugging Face アクセス トークン。YOUR_NETWORK_NAME:Google Cloud ネットワークの名前。カスタム ネットワークを作成した場合は、そのネットワークを指定します。それ以外の場合は、defaultを指定します。YOUR_SUBNETWORK_NAME:Google Cloud サブネットワークの名前。カスタム サブネットワークを作成した場合は、そのサブネットワークを指定します。それ以外の場合は、defaultを指定します。YOUR_VLLM_TPU_IMAGE: 使用する vLLM TorchTPU イメージ。公開イメージについては、vLLM TorchTPU リポジトリをご覧ください。
GKE クラスタを作成する
Standard モードで GKE クラスタを作成し、単一ホストの TPU v6e ノードプールを接続するには、次の操作を行います。
リージョン GKE クラスタを作成します。
GKE クラスタのデフォルトのマシンタイプ(
e2-medium)には、ワークロード コントローラに十分な CPU 容量がないため、このコマンドではe2-standard-4を指定します。出力は次のようになります。
NAME LOCATION MASTER_VERSION MASTER_IP MACHINE_TYPE NODE_VERSION NUM_NODES STATUS tpu-v6e-tutorial-cluster us-central1 1.35.7-gke.1027000 34.63.222.246 e2-standard-4 1.35.7-gke.1027000 3 RUNNING予約を使用して、1 つの
ct6e-standard-4tノード(2x2トポロジの 4 つの TPU v6e チップ)を持つ単一ホスト TPU v6e ノードプールを作成します。特定の予約を使用する代わりに、次のフラグを渡して、Spot 容量または Flex Start VM を使用してノードプールを作成することもできます。
- Spot VM:
--reservation-affinityフラグと--reservationフラグを--spotに置き換えて、Spot 容量を使用します。Spot 容量を使用するインスタンスは、ノードプールの作成後に作成されるまでに時間がかかることがあり、ワークロードの実行中にプリエンプトされる可能性があります。Pod の作成に時間がかかる場合や、ワークロードが実行中に停止する場合は、これが原因である可能性があります。 - Flex Start VM: Flex Start 消費オプションを使用してノードプールをプロビジョニングするには、
--flex-startフラグを渡します。詳細については、TPU と Flex Start VM で小規模なバッチ ワークロードを実行するをご覧ください。
出力は次のようになります。
NAME MACHINE_TYPE DISK_SIZE_GB NODE_VERSION np-0 ct6e-standard-4t 100 1.35.7-gke.1027000- Spot VM:
クラスタと通信するように
kubectl認証情報を構成します。
認証情報の構成
Hugging Face アクセス トークンを保存する hf-secret という名前の Kubernetes Secret を作成します。
vLLM TorchTPU サーバーをデプロイする
ワークロード マニフェスト(qwen3_5_server.yaml)は、次のリソースを定義します。
ダウンロードしたモデルの重み、XLA コンパイル キャッシュ、PyTorch コンパイル キャッシュを保存するための、Google Cloud Hyperdisk Balanced ストレージを基盤とする StorageClass(
hyperdisk-balanced-qwen3)と 500 GiB の PersistentVolumeClaim(hd-claim-qwen3)。2x2トポロジ(google.com/tpu: '4')を持つ単一の TPU v6e ノードにスケジュールされた Deployment(vllm-qwen3)。コンテナは、次のフラグを使用してQwen/Qwen3-30B-A3B-FP8のvllm serveを実行します。--data-parallel-size=4--tensor-parallel-size=1--enable-expert-parallel--kv-cache-dtype=fp8--max-model-len=9236--max-num-seqs=64。
ポート
8000を公開するClusterIPService(vllm-qwen3-service)。
ワークロードをデプロイしてモニタリングするには、次の手順を完了します。
サーバー マニフェストを取得します。
または、次の内容の
qwen3_5_server.yamlという名前のファイルを作成することもできます。vLLM TorchTPU サーバー マニフェストをクラスタに適用します。
アプリケーションの起動が完了するまで、サーバーのデプロイログをモニタリングします。
Pod がモデルの重みをダウンロードしてモデルをコンパイルする間、サービスの初期起動に約 15 ~ 30 分かかることがあります。
Spot や Flex Start などのプリエンプティブ容量を使用している場合、ノードプールの作成後に TPU スライスノードが作成されるまでに時間がかかることがあります。また、ワークロードの実行中にプリエンプトされる可能性があります。Pod の起動に想定よりも時間がかかっている場合や、ワークロードが途中で停止する場合は、これが原因である可能性があります。詳細については、Spot VM のプリエンプションをご覧ください。TPU スライスノードが作成されているかどうかを確認するには、ノードのステータスと条件を確認するをご覧ください。
トラフィックを送信する前に、ログに
Application startup completeが報告されるまで待ちます。(APIServer pid=1) INFO: Started server process [1] (APIServer pid=1) INFO: Waiting for application startup. (APIServer pid=1) INFO: Application startup complete.2 つ目のターミナル セッションを開きます。
2 番目のターミナル セッションで、ローカルポート
8000をvllm-qwen3-serviceに転送します。このターミナル セッションでポート転送を実行したままにします。
推論リクエストを送信する
最初のターミナル セッションに戻り、/v1/chat/completions エンドポイントにチャット完了リクエストを送信します。
ベンチマーク ワークロードを実行する
InferenceX ベンチマーク スイートを使用して、8,192 トークンの入力と 1,024 トークンの出力(8k/1k)ワークロードでデプロイされた Qwen3-30B-A3B モデルをベンチマークするには、次の手順を完了します。
ベンチマーク マニフェストを取得します。
または、次の内容のファイルを
qwen3_5-benchmark-8k1k.yamlという名前で作成します。ベンチマーク Pod マニフェストを適用します。
ベンチマーク ログをモニタリングします。
ベンチマークが完了するまでに約 25 ~ 30 分かかります。
ベンチマークが完了したら、次のような指標を含む出力を探します。
Output token throughputTotal token throughputTTFTTPOT
クリーンアップ
このチュートリアルで使用したリソースについて、 Google Cloud アカウントに継続的な料金が発生しないようにするには、Kubernetes ワークロード、TPU ノードプール、GKE クラスタを削除します。
vLLM TorchTPU サーバーの Deployment、Service、PersistentVolumeClaim、Hugging Face Secret を削除します。
TPU v6e ノードプールと GKE クラスタを削除します。
次のステップ
- Cloud TPU での vLLM の詳細を確認する。
- TPU v6e(Trillium)の詳細を確認する。
- Cloud TPU の詳細を確認する。