概要
このチュートリアルでは、vLLM サービング フレームワークと LeaderWorkerSet(LWS)API を利用し、Google Kubernetes Engine(GKE)の複数のノードで画像処理装置(GPU)を使用して Llama 3.1 405b をサービングする方法について説明します。
このドキュメントは、AI / ML ワークロードをデプロイして提供する際に、マネージド Kubernetes での詳細な制御、スケーラビリティ、復元力、ポータビリティ、費用対効果が求められる場合の出発点として適しています。
LeaderWorkerSet(LWS)
LWS は、AI / ML マルチノード推論ワークロードの一般的なデプロイ パターンに対応する Kubernetes deployment API です。LWS を使用すると、複数の Pod をグループとして扱うことができます。
vLLM を使用したマルチホスト サービング
1 つの GPU ノードに収まらない非常に大きな言語モデルをデプロイする場合は、複数の GPU ノードを使用してモデルをサービングします。vLLM はテンソル並列処理とパイプライン並列処理の両方をサポートし、複数の GPU でワークロードを実行します。
テンソル並列処理では、Transformer レイヤの行列乗算を複数の GPU に分割します。ただし、この方法では GPU 間の通信が必要になるため、高速なネットワークが必要であり、ノード間でワークロードを実行する場合は適していません。
パイプライン並列処理では、モデルをレイヤ(垂直方向)で分割します。この方法では、GPU 間の通信を常に行う必要がないため、ノードをまたいでモデルを実行する場合に適しています。
マルチノード サービングでは、どちらの戦略も使用できます。たとえば、それぞれ 8 個の H100 GPU が割り当てられた 2 つのノードを使用する場合、双方向のパイプライン並列処理を使用して 2 つのノードにモデルをシャードし、8 方向テンソル並列処理を使用して各ノード上の 8 個の GPU にモデルをシャードできます。
目標
- GKE Standard クラスタを準備する。
- クラスタ内の複数のノードに vLLM をデプロイする。
- vLLM を使用して、
curl
を介して Llama3 405b モデルをサービングする。
始める前に
- Sign in to your Google Cloud account. If you're new to Google Cloud, create an account to evaluate how our products perform in real-world scenarios. New customers also get $300 in free credits to run, test, and deploy workloads.
-
In the Google Cloud console, on the project selector page, select or create a Google Cloud project.
-
Make sure that billing is enabled for your Google Cloud project.
-
Enable the required API.
-
In the Google Cloud console, on the project selector page, select or create a Google Cloud project.
-
Make sure that billing is enabled for your Google Cloud project.
-
Enable the required API.
-
Make sure that you have the following role or roles on the project: roles/container.admin, roles/iam.serviceAccountAdmin
Check for the roles
-
In the Google Cloud console, go to the IAM page.
Go to IAM - Select the project.
-
In the Principal column, find all rows that identify you or a group that you're included in. To learn which groups you're included in, contact your administrator.
- For all rows that specify or include you, check the Role colunn to see whether the list of roles includes the required roles.
Grant the roles
-
In the Google Cloud console, go to the IAM page.
[IAM] に移動 - プロジェクトを選択します。
- [ アクセスを許可] をクリックします。
-
[新しいプリンシパル] フィールドに、ユーザー ID を入力します。 これは通常、Google アカウントのメールアドレスです。
- [ロールを選択] リストでロールを選択します。
- 追加のロールを付与するには、 [別のロールを追加] をクリックして各ロールを追加します。
- [保存] をクリックします。
-
- Hugging Face アカウントを作成します(まだ作成していない場合)。
- プロジェクトに、GPU に対する十分な割り当てがあることを確認します。詳細については、GPU についてと数量に基づく割り当てをご覧ください。
モデルへのアクセス権を取得する
アクセス トークンを生成する
Hugging Face トークンをまだ生成していない場合は、新しいトークンを生成します。
- [Your Profile] > [Settings] > [Access Tokens] の順にクリックします。
- [New Token] を選択します。
- 任意の名前と、少なくとも
Read
ロールを指定します。 - [Generate a token] を選択します。
環境を準備する
このチュートリアルでは、Cloud Shell を使用して Google Cloud でホストされるリソースを管理します。Cloud Shell には、このチュートリアルに必要な kubectl
や gcloud CLI などのソフトウェアがプリインストールされています。
Cloud Shell を使用して環境を設定するには、次の操作を行います。
Google Cloud コンソールで、Google Cloud コンソールの [Cloud Shell をアクティブにする] をクリックして、Cloud Shell セッションを起動します。これにより、Google Cloud コンソールの下部ペインでセッションが起動されます。
デフォルトの環境変数を設定します。
gcloud config set project PROJECT_ID export PROJECT_ID=$(gcloud config get project) export CLUSTER_NAME=CLUSTER_NAME export ZONE=ZONE export HF_TOKEN=HUGGING_FACE_TOKEN
次の値を置き換えます。
- PROJECT_ID: Google Cloud のプロジェクト ID。
- CLUSTER_NAME: GKE クラスタの名前。
- ZONE: H100 をサポートするゾーン。
GKE クラスタを作成する
2 つの CPU ノードを含む GKE Standard クラスタを作成します。
gcloud container clusters create CLUSTER_NAME \
--project=PROJECT_ID \
--num-nodes=2 \
--location=ZONE \
--machine-type=e2-standard-16
GPU ノードプールを作成する
2 つのノードと 8 つの H100 で構成される A3 ノードプールを作成します。
gcloud container node-pools create gpu-nodepool \
--location=ZONE \
--num-nodes=2 \
--machine-type=a3-highgpu-8g \
--accelerator=type=nvidia-h100-80gb,count=8,gpu-driver-version=LATEST \
--placement-type=COMPACT \
--cluster=CLUSTER_NAME
クラスタと通信を行うように kubectl
を構成します。
gcloud container clusters get-credentials CLUSTER_NAME --location=ZONE
Hugging Face の認証情報用の Kubernetes Secret を作成する
Hugging Face トークンを含む Kubernetes Secret を作成します。
kubectl create secret generic hf-secret \
--from-literal=hf_api_token=${HF_TOKEN} \
--dry-run=client -o yaml | kubectl apply -f -
LeaderWorkerSet をインストールする
LWS をインストールするには、次のコマンドを実行します。
VERSION=v0.4.0
kubectl apply --server-side -f https://github.com/kubernetes-sigs/lws/releases/download/$VERSION/manifests.yaml
LeaderWorkerSet コントローラが lws-system
Namespace で実行されていることを確認します。
kubectl get pod -n lws-system
出力は次のようになります。
NAME READY STATUS RESTARTS AGE
lws-controller-manager-5c4ff67cbd-9jsfc 2/2 Running 0 6d23h
vLLM モデルサーバーをデプロイする
vLLM モデルサーバーをデプロイする手順は次のとおりです。
マニフェスト
vllm-llama3-405b-A3.yaml
を調べます。次のコマンドを実行してマニフェストを適用します。
kubectl apply -f vllm-llama3-405b-A3.yaml
実行中のモデルサーバーのログを表示する
kubectl logs vllm-0 -c vllm-leader
出力は次のようになります。
INFO 08-09 21:01:34 api_server.py:297] Route: /detokenize, Methods: POST INFO 08-09 21:01:34 api_server.py:297] Route: /v1/models, Methods: GET INFO 08-09 21:01:34 api_server.py:297] Route: /version, Methods: GET INFO 08-09 21:01:34 api_server.py:297] Route: /v1/chat/completions, Methods: POST INFO 08-09 21:01:34 api_server.py:297] Route: /v1/completions, Methods: POST INFO 08-09 21:01:34 api_server.py:297] Route: /v1/embeddings, Methods: POST INFO: Started server process [7428] INFO: Waiting for application startup. INFO: Application startup complete. INFO: Uvicorn running on http://0.0.0.0:8080 (Press CTRL+C to quit)
モデルをサービングする
次のコマンドを実行して、モデルへのポート転送を設定します。
kubectl port-forward svc/vllm-leader 8080:8080
curl を使用してモデルを操作する
新しいターミナルで、サーバーにリクエストを送信します。
curl http://localhost:8080/v1/completions \
-H "Content-Type: application/json" \
-d '{
"model": "meta-llama/Meta-Llama-3.1-405B-Instruct",
"prompt": "San Francisco is a",
"max_tokens": 7,
"temperature": 0
}'
出力例を以下に示します。
{"id":"cmpl-0a2310f30ac3454aa7f2c5bb6a292e6c",
"object":"text_completion","created":1723238375,"model":"meta-llama/Meta-Llama-3.1-405B-Instruct","choices":[{"index":0,"text":" top destination for foodies, with","logprobs":null,"finish_reason":"length","stop_reason":null}],"usage":{"prompt_tokens":5,"total_tokens":12,"completion_tokens":7}}
クリーンアップ
このチュートリアルで使用したリソースについて、Google Cloud アカウントに課金されないようにするには、リソースを含むプロジェクトを削除するか、プロジェクトを維持して個々のリソースを削除します。
デプロイされたリソースを削除する
このガイドで作成したリソースについて、Google Cloud アカウントに課金されないようにするには、次のコマンドを実行します。
gcloud container clusters delete CLUSTER_NAME \
--location=ZONE
次のステップ
- GKE での GPU の詳細を確認する。
- vLLM の GitHub リポジトリとドキュメントを確認する。
- LWS の GitHub リポジトリを確認する。