このガイドでは、大規模言語モデル(LLM)をデプロイする際のワークロードの費用を最適化する方法について説明します。GKE インフラストラクチャは、Flex Start プロビジョニング モード、Spot VM、カスタム コンピューティング クラス プロファイルを組み合わせて、ワークロードの費用を最適化します。
このガイドでは、デプロイ可能な LLM の例として Mixtral 8x7b を使用します。
このガイドは、LLM のサービングに Kubernetes コンテナ オーケストレーションの機能を使用することに関心のある機械学習(ML)エンジニア、プラットフォーム管理者、オペレーター、データおよび AI スペシャリストを対象としています。 Google Cloud のコンテンツで使用されている一般的なロールとタスクの例の詳細については、一般的な GKE Enterprise ユーザーロールとタスクをご覧ください。
背景
このセクションでは、AI / ML ワークロードの要件に基づいて、GPU アクセラレータなどのコンピューティング リソースを取得するための手法について説明します。これらの手法は、GKE では「アクセラレータの入手可能性戦略」と呼ばれます。
GPU
画像処理装置(GPU)を使用すると、ML やデータ処理などの特定のワークロードを高速化できます。GKE には、ML タスクとデータ処理タスクのパフォーマンスを最適化するため、強力な GPU を搭載したノードが用意されています。GKE には、NVIDIA H100、A100、L4 GPU を搭載したマシンタイプをはじめとして、ノード構成用のさまざまなマシンタイプ オプションが用意されています。
詳細については、GKE での GPU についてをご覧ください。
Flex Start プロビジョニング モード
Flex Start プロビジョニング モードは、GKE が GPU リクエストを保持し、容量が使用可能になるとリソースを自動的にプロビジョニングする GPU 予約の一種です。最大 7 日間という限られた期間に GPU 容量が必要で、開始日が固定されていないワークロードには、Flex Start プロビジョニング モードの使用を検討してください。詳細については、Flex Start プロビジョニング モードをご覧ください。
Spot VM
ワークロードが頻繁なノード中断を許容できるのであれば、GPU を Spot VM で使用することもできます。Spot VM または Flex Start プロビジョニング モードを使用すると、GPU の実行コストを削減できます。Spot VM と Flex Start プロビジョニング モードを組み合わせて使用すると、Spot VM の容量を使用できない場合のフォールバック オプションが提供されます。
詳細については、GPU ノードプールで Spot VM を使用するをご覧ください。
カスタム コンピューティング クラス
GPU は、カスタム コンピューティング クラスを使用してリクエストできます。カスタム コンピューティング クラスを使用すると、ノードのスケーリング決定時に GKE が優先順位を判断するノード構成の階層を定義し、選択したハードウェアでワークロードを実行できます。詳細については、カスタム コンピューティング クラスについてをご覧ください。
始める前に
- 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.
-
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.
-
Make sure that you have the following role or roles on the project:
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 column 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 アカウントのメールアドレスです。
- [ロールを選択] リストでロールを選択します。
- 追加のロールを付与するには、 [別のロールを追加] をクリックして各ロールを追加します。
- [保存] をクリックします。
-
- バージョン 1.32.2-gke.1652000 以降を実行する GKE Autopilot クラスタまたは GKE Standard クラスタがあることを確認します。クラスタでノードの自動プロビジョニングを有効にして GPU の上限を構成する必要があります。
- Hugging Face アカウントを作成します(まだ作成していない場合)。
- プロジェクトに NVIDIA L4 GPU の十分な割り当てがあることを確認します。詳細については、GPU についてと数量に基づく割り当てをご覧ください。
モデルへのアクセス権を取得する
Hugging Face トークンをまだ生成していない場合は、新しいトークンを生成します。
- [Your Profile] > [Settings] > [Access Tokens] の順にクリックします。
- [New Token] を選択します。
- 任意の名前と、少なくとも
Read
ロールを指定します。 - [Generate a token] を選択します。
カスタム コンピューティング クラス プロファイルを作成する
このセクションでは、カスタムのコンピューティング クラス プロファイルを作成します。カスタム コンピューティング クラス プロファイルは、ワークロードで使用される複数のコンピューティング リソースのタイプと関係を定義します。
- Google Cloud コンソールで
(Cloud Shell をアクティブにする)をクリックして、Google Cloud コンソールで Cloud Shell セッションを起動します。 Google Cloud コンソールの下部ペインにセッションが開きます。
dws-flex-start.yaml
マニフェスト ファイルを作成します。apiVersion: cloud.google.com/v1 kind: ComputeClass metadata: name: dws-model-inference-class spec: priorities: - machineType: g2-standard-24 spot: true - machineType: g2-standard-24 flexStart: enabled: true nodeRecycling: leadTimeSeconds: 3600 nodePoolAutoCreation: enabled: true
dws-flex-start.yaml
マニフェストを適用します。kubectl apply -f dws-flex-start.yaml
GKE は、L4 アクセラレータを使用して g2-standard-24
マシンをデプロイします。GKE は、コンピューティング クラスを使用して、まず Spot VM を優先し、次に Flex Start プロビジョニング モードを優先します。
LLM ワークロードをデプロイする
次のコマンドを使用して、Hugging Face トークンを含む Kubernetes Secret を作成します。
kubectl create secret generic model-inference-secret \ --from-literal=HUGGING_FACE_TOKEN=HUGGING_FACE_TOKEN \ --dry-run=client -o yaml | kubectl apply -f -
HUGGING_FACE_TOKEN
は、Hugging Face アクセス トークンに置き換えます。mixtral-deployment.yaml
という名前のファイルを作成します。apiVersion: apps/v1 kind: Deployment metadata: name: inference-mixtral-ccc spec: nodeSelector: cloud.google.com/compute-class: dws-model-inference-class replicas: 1 selector: matchLabels: app: llm template: metadata: labels: app: llm spec: containers: - name: llm image: us-docker.pkg.dev/deeplearning-platform-release/gcr.io/huggingface-text-generation-inference-cu124.2-3.ubuntu2204.py311 resources: requests: cpu: "5" memory: "40Gi" nvidia.com/gpu: "2" limits: cpu: "5" memory: "40Gi" nvidia.com/gpu: "2" env: - name: MODEL_ID value: mistralai/Mixtral-8x7B-Instruct-v0.1 - name: NUM_SHARD value: "2" - name: PORT value: "8080" - name: QUANTIZE value: bitsandbytes-nf4 - name: HUGGING_FACE_HUB_TOKEN valueFrom: secretKeyRef: name: model-inference-secret key: HUGGING_FACE_TOKEN volumeMounts: - mountPath: /dev/shm name: dshm - mountPath: /tmp name: ephemeral-volume volumes: - name: dshm emptyDir: medium: Memory - name: ephemeral-volume ephemeral: volumeClaimTemplate: metadata: labels: type: ephemeral spec: accessModes: ["ReadWriteOnce"] storageClassName: "premium-rwo" resources: requests: storage: 100Gi
このマニフェストでは、
mountPath
フィールドは/tmp
に設定されています。これは、TGI デフォルト イメージ内に設定されているデフォルトの/data
パスではなく、テキスト生成推論(TGI)用の Deep Learning Containers(DLC)のHF_HOME
環境変数が設定されているパスです。ダウンロードされたモデルはこのディレクトリに保存されます。モデルをデプロイします。
kubectl apply -f mixtral-deployment.yaml
GKE は、デプロイする新しい Pod をスケジュールします。これにより、ノードプール オートスケーラーがトリガーされ、2 番目のノードが追加されてからモデルの 2 番目のレプリカがデプロイされます。
モデルのステータスを確認します。
watch kubectl get deploy inference-mixtral-ccc
モデルが正常にデプロイされると、出力は次のようになります。
NAME READY UP-TO-DATE AVAILABLE AGE inference-mixtral-ccc 1/1 1 1 10m
監視を終了するには、
CTRL + C
を押します。GKE がプロビジョニングしたノードプールを表示します。
kubectl get nodes -L cloud.google.com/gke-nodepool
出力は次のようになります。
NAME STATUS ROLES AGE VERSION GKE-NODEPOOL gke-flex-na-nap-g2-standard--0723b782-fg7v Ready <none> 10m v1.32.3-gke.1152000 nap-g2-standard-24-spot-gpu2-1gbdlbxz gke-flex-nap-zo-default-pool-09f6fe53-fzm8 Ready <none> 32m v1.32.3-gke.1152000 default-pool gke-flex-nap-zo-default-pool-09f6fe53-lv2v Ready <none> 32m v1.32.3-gke.1152000 default-pool gke-flex-nap-zo-default-pool-09f6fe53-pq6m Ready <none> 32m v1.32.3-gke.1152000 default-pool
作成されたノードプールの名前は、マシンのタイプを示します。この場合、GKE は Spot VM をプロビジョニングしました。
curl
を使用してモデルを操作する
このセクションでは、基本的な推論テストを実行して、デプロイされたモデルを確認する方法について説明します。
モデルへのポート転送を設定します。
kubectl port-forward service/llm-service 8080:8080
出力は次のようになります。
Forwarding from 127.0.0.1:8080 -> 8080
新しいターミナル セッションで、
curl
を使用してモデルとチャットします。curl http://localhost:8080/v1/completions \ -X POST \ -H "Content-Type: application/json" \ -d '{ "model": "mixtral-8x7b-instruct-gptq", "prompt": "<s>[INST]Who was the first president of the United States?[/INST]", "max_tokens": 40}'
出力は次のようになります。
George Washington was a Founding Father and the first president of the United States, serving from 1789 to 1797.
クリーンアップ
このページで使用したリソースについて、 Google Cloud アカウントに課金されないようにするには、リソースを含むプロジェクトを削除するか、プロジェクトを維持して個々のリソースを削除します。
プロジェクトを削除する
- In the Google Cloud console, go to the Manage resources page.
- In the project list, select the project that you want to delete, and then click Delete.
- In the dialog, type the project ID, and then click Shut down to delete the project.
個々のリソースを削除する
このガイドで作成した Kubernetes リソースを削除します。
kubectl delete deployment inference-mixtral-ccc kubectl delete service llm-service kubectl delete computeclass dws-model-inference-class kubectl delete secret model-inference-secret
クラスタを削除します。
gcloud container clusters delete CLUSTER_NAME
次のステップ
- Flex Start プロビジョニング モードで小規模なワークロードをトレーニングする方法を確認する。
- GKE 上の GPU の詳細を確認する。