このチュートリアルでは、 Google Cloudの Google Kubernetes Engine(GKE)に Llama 3.1 405B(nvidia/Llama-3.1-405B-Instruct-FP8)をデプロイして提供する方法について説明します。これは、FP8 に量子化された 4,050 億パラメータの指示調整済みモデルです。このデプロイでは、Cluster Toolkit、合計 16 個の NVIDIA B200 GPU を搭載した 2 つの A4(a4-highgpu-8g)仮想マシン(VM)インスタンス、NVIDIA Dynamo、単一ホストのプリフィル デコード(PD)分離を備えた SGLang サービング フレームワークを使用します。
このチュートリアルで説明するデプロイ構成では、Cluster Toolkit を使用して標準モードで GKE クラスタをプロビジョニングします。クラスタには、GPUDirect リモート ダイレクト メモリ アクセス(RDMA)ネットワーキングを介して接続された 2 つの a4-highgpu-8g ノードが含まれています。次に、Grove ギャング スケジューリングを使用して KAI Scheduler と NVIDIA Dynamo プラットフォームをインストールします。最後に、テンソル並列処理と FP8 KV キャッシュを使用して、2 つの単一ホスト 8 GPU ワーカーにプリフィルとデコードを分離する DynamoGraphDeployment カスタム リソースをデプロイします。
目標
- Cluster Toolkit をインストールし、Standard モードで 2 ノードの A4 GKE クラスタをプロビジョニングします。
- クラスタに KAI Scheduler と NVIDIA Dynamo プラットフォームを Grove ギャング スケジューリングとともにインストールします。
- 1 つの単一ホスト A4 プリフィル ワーカーと 1 つの単一ホスト 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 予約の名前。YOUR_BUCKET_NAME: Cluster Toolkit の Terraform 状態を保存する Cloud Storage バケットのグローバルに一意の名前。YOUR_HF_TOKEN: Hugging Face アクセス トークン。
GKE クラスタを作成する
Cluster Toolkit をダウンロードし、2 つの 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 状態を保存するには、オブジェクト バージョニングを有効にした Cloud Storage バケットを作成します。
2 つの
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 プラットフォームをインストールします。
単一ホストの分離された SGLang サーバーをデプロイする
ワークロード マニフェスト(llama3.1-405b-singlehost-a4.yaml)は、DRA を介してノードのマルチ NIC RDMA デバイス(mrdma.google.com)を割り当てる Kubernetes ResourceClaimTemplate(all-mrdma)と、Grove ギャング スケジューリングが有効になっている NVIDIA Dynamo DynamoGraphDeployment(llama3-405b-a4-disagg)を定義します。デプロイメントは次のものから構成されます。
- フロントエンド(
Frontend): クライアント リクエストを受け入れ、登録済みのプリフィル ワーカーとデコード ワーカーを検出し、分離されたリクエスト ルーティングを調整する 1 つのルーター レプリカを実行します。 - プリフィル ワーカー(
Prefill): 8 個の NVIDIA B200 GPU を搭載した 1 つのa4-highgpu-8gノードで単一ホスト ワーカーを実行します。起動時に、Pod は NCCL/gIB 環境をソースとし、nvidia/Llama-3.1-405B-Instruct-FP8チェックポイントを Hugging Face Hub からノードのローカル NVMe SSD にダウンロードし、次のフラグを使用して--disaggregation-mode prefillでpython3 -m dynamo.sglangを起動します。--tensor-parallel-size 8--kv-cache-dtype fp8_e4m3--context-length 16384--mem-fraction-static 0.85
- デコード ワーカー(
Decode): 8 個の NVIDIA B200 GPU を搭載した 2 番目のa4-highgpu-8gノードで単一ホスト ワーカーを実行します。起動時に、Pod はモデルの重みをノードのローカル NVMe SSD にキャッシュし、次のフラグを使用して--disaggregation-mode decodeでpython3 -m dynamo.sglangを起動します。--tensor-parallel-size 8--kv-cache-dtype fp8_e4m3--context-length 16384--mem-fraction-static 0.85
分離された推論サーバーをデプロイしてモニタリングします。
llama3.1-405b-singlehost-a4.yamlワークロード マニフェストをダウンロードします。または、次の内容の
llama3.1-405b-singlehost-a4.yamlという名前のファイルを作成します。ワークロード マニフェストをクラスタに適用します。
重みのダウンロードとサーバーの初期化をモニタリングするには、クラスタ内の Pod を一覧表示し、プリフィル Pod とデコード Pod のログをストリーミングします。
YOUR_POD_NAMEは、kubectl get pods出力のプリフィル Pod またはデコード Pod の名前に置き換えます。最初の実行では、405B FP8 モデルの重みのダウンロードと SGLang サーバーの初期化に約 10 ~ 20 分かかります。リクエストを送信する前に、フロントエンド、プリフィル、デコードの Pod の
kubectl get podsのREADY列に1/1が表示されるまで待ちます。NAME READY STATUS RESTARTS AGE llama3-405b-a4-disagg-0-decode-tgl7q 1/1 Running 0 15m llama3-405b-a4-disagg-0-frontend-wrxq5 1/1 Running 0 15m llama3-405b-a4-disagg-0-prefill-67h5s 1/1 Running 0 15m
推論リクエストを送信する
デプロイされた Llama 3.1 405B サービスにチャット完了リクエストを送信します。
ローカルポート
8000をllama3-405b-a4-disagg-frontendサービスに転送します。このターミナル セッションでポート転送を実行したままにするか、バックグラウンドでコマンドを実行します。
2 番目のターミナル セッションで、
/v1/chat/completionsエンドポイントにチャット完了リクエストを送信します。
ベンチマーク ワークロードを実行する
sglang.bench_serving を使用して、Dynamo フロントエンド Pod からデプロイされた Llama 3.1 405B サーバーのベンチマークを行います。1,024 個の入力トークン、1,024 個の出力トークン(1k/1k)、2,048 個のプロンプト、最大同時実行数 512 でベンチマークを構成します。
ベンチマークが完了したら、次のような指標を含む出力を探します。
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コマンドを使用します。gcloud storage rm --recursive "gs://${GCS_BUCKET}"
次のステップ
- NVIDIA Dynamo の詳細を確認する。
- SGLang の詳細を確認する。
- NVIDIA B200 GPU を搭載した A4 VM の詳細を確認する。
- Cluster Toolkit の詳細を確認する。
- AI に最適化された GKE クラスタの管理について学習する。