このチュートリアルでは、Google Cloudの Google Kubernetes Engine(GKE)に DeepSeek-R1(deepseek-ai/DeepSeek-R1)をデプロイして提供する方法について説明します。DeepSeek-R1 は、370 億個のアクティブ パラメータを持つ 6,710 億個のパラメータの Mixture-of-Experts モデルです。このデプロイでは、Cluster Toolkit、合計 16 個の NVIDIA B200 GPU を搭載した 2 つのマルチホスト A4(a4-highgpu-8g)仮想マシン(VM)インスタンス、vLLM サービング フレームワークを使用します。
このチュートリアルで説明するデプロイ構成では、Cluster Toolkit を使用して標準モードで GKE クラスタをプロビジョニングします。クラスタには、GPUDirect リモート ダイレクト メモリ アクセス(RDMA)ネットワーキングを介して接続された 2 つの a4-highgpu-8g ノードがあります。次に、モデルの重みを Cloud Storage にステージングし、Kubernetes JobSet API と Ray を使用して、テンソル並列処理、エキスパート並列処理、FP8 KV キャッシュを使用して 16 個の NVIDIA B200 GPU すべてでモデルを提供します。
目標
- Cluster Toolkit をインストールし、標準モードでマルチホスト A4 GKE クラスタをプロビジョニングします。
- DeepSeek-R1 モデルの重みを Cloud Storage バケットにステージングします。
- JobSet と Ray を使用して、2 つの A4 ノードに合計 16 個の NVIDIA B200 GPU を搭載したマルチホスト vLLM 推論サーバーをデプロイします。
- チャット完了リクエストを vLLM サーバーに送信します。
- サービング ベンチマーク ワークロードを実行します。
- デプロイしたリソースをクリーンアップします。
費用
このドキュメントでは、課金対象である次のGoogle Cloudコンポーネントを使用します。
料金計算ツールを使うと、予想使用量に基づいて費用の見積もりを生成できます。
始める前に
チュートリアルの環境を設定します。
- Google Cloud CLI をインストールして初期化し、
kubectlをインストールします。Cloud Shell を使用する場合、どちらのツールもプリインストールされています。 - Cloud Shell ではなく Linux または macOS ワークステーションからこのチュートリアルを実行する場合は、必要な Cluster Toolkit の依存関係(Terraform や Git など)をインストールします。
Google Cloud プロジェクトで Kubernetes Engine API、Compute Engine API、Cloud Storage API、Artifact Registry 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_HF_TOKEN: Hugging Face アクセス トークン。YOUR_GCS_BUCKET: モデルの重みをステージングする Cloud Storage バケットのグローバルに一意の名前。このスクリプトは、TERRAFORM_BUCKETをYOUR_GCS_BUCKET-tf-stateに設定して、Cluster Toolkit の Terraform 状態を保存します。
このスクリプトは、
CLUSTER_TOOLKIT_VERSIONをv1.104.0に設定します。これにより、インストールする Cluster Toolkit のバージョンが指定されます。Cluster Toolkit バージョンv1.104.0以降には、examples/gke-a4/gke-a4-deployment.yamlの容量消費オプションが組み込まれています。v1.104.0より前のバージョンでは、これらの容量オプションを手動で追加する必要があります。
GKE クラスタを作成する
Cluster Toolkit をダウンロードし、2 つの a4-highgpu-8g ノード、GPUDirect RDMA ネットワーキング、JobSet コントローラを使用して、Standard モードで GKE クラスタをプロビジョニングします。
CLUSTER_TOOLKIT_VERSION(v1.104.0)で指定されたバージョンのビルド済み Cluster Toolkit バンドルをダウンロードして展開し、作業ディレクトリをcluster-toolkitディレクトリに変更して、バイナリ バージョンを確認します。必要に応じて、Cluster Toolkit で使用可能なコマンドとフラグを表示します。
Cluster Toolkit デプロイの Terraform 状態を保存する Cloud Storage バケットを作成します。
2 つの
a4-highgpu-8gノード用のexamples/gke-a4/gke-a4-deployment.yamlデプロイ構成ファイルを作成します。デフォルトでは、
examples/gke-a4/gke-a4.yamlブループリントは特定の予約を使用するように構成されています。特定の予約がない場合は、クラスタをデプロイする前にexamples/gke-a4/gke-a4.yamlを編集して、次のいずれかの使用オプションを使用できます。- Spot 容量: プロジェクトに GPU、ディスク、CPU のプリエンプティブル割り当てが十分にあることを確認します。
examples/gke-a4/gke-a4.yamlの下部で、--- Option 1: Specific Reservation ---セクションをコメントアウトし、--- Option 4: Spot ---セクションのコメント化を解除します。 - Flex Start VM: プロジェクトに GPU、ディスク、CPU の十分なプリエンプティブル割り当てがあることを確認します。
examples/gke-a4/gke-a4.yamlの下部で、--- Option 1: Specific Reservation ---セクションをコメントアウトし、--- Option 2: DWS Flex Start ---セクションのコメント化を解除します。
- Spot 容量: プロジェクトに GPU、ディスク、CPU のプリエンプティブル割り当てが十分にあることを確認します。
gcluster deployコマンドを使用して GKE クラスタをデプロイします。クラスタの作成には約 30 ~ 45 分かかります。
--auto-approveフラグを指定せずに./gcluster deployを実行する場合は、提案された変更を適用するために、プロンプトが表示されたらaと入力します。デプロイが完了すると、出力は次のようなメッセージで終了します。Apply complete! Resources: 80 added, 0 changed, 0 destroyed.クラスタと通信するように
kubectl認証情報を構成します。
Cloud Storage にモデルの重みをステージングする
DeepSeek-R1 の重みを A4 ノードの 1 つのローカル SSD にダウンロードし、ノード間で高速ストリーミングできるように Cloud Storage バケットに転送します。
モデルのダウンロード Job、vLLM 推論サーバー、ベンチマーク Pod の Kubernetes マニフェスト ファイルをダウンロードします。
モデルの重みを保存するために、均一なバケットレベルのアクセス権を持つ Cloud Storage バケットを作成します。
バケットに対する IAM 権限を、デフォルトの Kubernetes サービス アカウント、デフォルトの Compute Engine サービス アカウント、クラスタ ノードプール サービス アカウント(
${CLUSTER_NAME}-gke-np-sa)に付与します。上記のスクリプトによって付与される IAM 権限には、
--load-format runai_streamerに必要なストレージ レガシー バケット読み取りロール(roles/storage.legacyBucketReader)が含まれています。Hugging Face アクセス トークンを保存する
hf-secretという名前の Kubernetes Secret を作成します。download_model.yamlマニフェストを確認します。以前にダウンロードしていない場合は、ローカルにファイルを作成します。Cloud Storage バケット名を
download_model.yamlマニフェストに置き換え、モデルのダウンロード ジョブを開始します。ダウンロード Pod が起動するまで待ってから、Job ログをストリーミングします。
モデルをノードのローカル NVMe SSD にダウンロードし、重みを Cloud Storage バケットにアップロードするまでに約 30 ~ 40 分かかります。
ジョブが完了したら、163 個の
.safetensorsシャードがすべて Cloud Storage バケットに存在することを確認します。完了したステージング ジョブを削除します。
マルチホスト vLLM サーバーをデプロイする
ワークロード マニフェスト(deepseek_r1_server.yaml)は、2 つの a4-highgpu-8g ノード間でマルチホスト サービングを調整する ClusterIP Service(vllm-r1-leader)と Kubernetes JobSet(vllm-r1)を定義します。
- リーダー(
leader): 8 個の NVIDIA B200 GPU を搭載した A4 ノードで 1 つのレプリカを実行し、NCCL/gIB 環境(/usr/local/gib/scripts/set_nccl_env.sh)をソースとして、2 ノード クラスタのポート6379で Ray ヘッドノードを起動し、HTTP ポート8080でvllm serveを起動します。サーバーは、--load-format runai_streamerを使用してgs://$MODEL_BUCKET/DeepSeek-R1から重みを直接ストリーミングし、/models/DeepSeek-R1でマウントされた Cloud Storage FUSE ボリュームからトークナイザーを読み込みます。--tensor-parallel-size 16、--pipeline-parallel-size 1、--distributed-executor-backend ray、--enable-expert-parallel、--kv-cache-dtype fp8_e4m3、--async-scheduling、CUDA グラフ(FULL_AND_PIECEWISE)で実行されます。 - ワーカー(
worker): 8 個の NVIDIA B200 GPU を搭載した 2 番目の A4 ノードで 1 つのヘッドレス レプリカを実行し、NCCL/gIB を構成して、vllm-r1-leader:6379でリーダーの Ray クラスタに参加します。
マルチホスト vLLM サーバーをデプロイしてモニタリングします。
deepseek_r1_server.yamlマニフェストを確認します。以前にダウンロードしていない場合は、ローカルにファイルを作成します。このデプロイをより多くのホストにスケーリングするには、
deepseek_r1_server.yamlのパラメータを更新します。たとえば、合計 32 個の NVIDIA B200 GPU を搭載した 4 つの A4 ノードにスケールするには、workerレプリケートされたジョブでreplicas: 3を設定し、リーダー引数を次のように更新します。--ray_cluster_size=4--tensor-parallel-size=16--pipeline-parallel-size=2
Cloud Storage バケット名を
deepseek_r1_server.yamlに置き換え、マニフェストをクラスタに適用します。サーバーの起動が完了するまで、リーダー Pod とワーカー Pod のログをモニタリングします。
kubectl logs -fはフォアグラウンドでログをストリーミングするため、両方の Pod を同時にモニタリングする場合は、別のターミナル セッションでワーカーログ コマンドを実行します。ログのストリーミングをいつでも停止するには、Ctrl+C キーを押します。最初の重みストリーミング、モデルの読み込み、CUDA グラフのキャプチャには、約 15 ~ 20 分かかります。リクエストを送信する前に、リーダー Pod のログに次のメッセージが出力されるまで待ちます。
(APIServer pid=1) INFO: Started server process [1] (APIServer pid=1) INFO: Waiting for application startup. (APIServer pid=1) INFO: Application startup complete.
推論リクエストを送信する
デプロイされた vLLM サーバーにチャット完了リクエストを送信します。
ローカルポート
8080をバックグラウンドでvllm-r1-leaderService に転送します。/v1/chat/completionsエンドポイントにチャット完了リクエストを送信します。
ベンチマーク ワークロードを実行する
8,192 個の入力トークンと 1,024 個の出力トークン(8k/1k)の構成で vllm bench serve を使用して、デプロイされた DeepSeek-R1 サーバーのベンチマークを行います。
deepseek_r1_8k_1k.yamlマニフェストを確認します。以前にダウンロードしていない場合は、ローカルにファイルを作成します。マニフェストでは、8,192 個の入力トークン、1,024 個の出力トークン、1,280 個のプロンプト、112 個の最大同時実行数が指定されています。
deepseek_r1_8k_1k.yamlマニフェストを適用します。vllm-bench-8k-1kPod が起動するまで待ってから、ベンチマーク ログをストリーミングします。ベンチマークが完了するまでに約 15 分かかります。ベンチマークが完了したら、次のような指標を含む出力を探します。
Output token throughputTotal token throughputTTFTTPOT
クリーンアップ
このチュートリアルで使用したリソースについて、 Google Cloud アカウントに継続的な追加料金が発生しないようにするには、Kubernetes ワークロード、GKE クラスタ、Cloud Storage バケットを削除します。
ベンチマーク Pod、vLLM サーバーの JobSet と Service、モデルのダウンロード Job、Hugging Face Secret を削除します。
ステージングされたモデルの重みを保存する Cloud Storage バケットを削除します。
cluster-toolkitディレクトリから、gcluster destroyコマンドを使用して、GKE クラスタとその関連インフラストラクチャを破棄します。Terraform の状態を保存する Cloud Storage バケットを削除します。
次のステップ
- vLLM の詳細を確認する。
- NVIDIA B200 GPU を搭載した A4 VM の詳細を確認する。
- Cluster Toolkit の詳細を確認する。
- AI に最適化された GKE クラスタの管理について学習する。