費用を最適化し、高可用性の GPU プロビジョニング戦略を使用して GKE で LLM をサービングする


このガイドでは、大規模言語モデル(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.

    Go to project selector

  • 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.

    Go to project selector

  • 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

    1. In the Google Cloud console, go to the IAM page.

      Go to IAM
    2. Select the project.
    3. 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.

    4. 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

    1. In the Google Cloud console, go to the IAM page.

      [IAM] に移動
    2. プロジェクトを選択します。
    3. [ アクセスを許可] をクリックします。
    4. [新しいプリンシパル] フィールドに、ユーザー ID を入力します。 これは通常、Google アカウントのメールアドレスです。

    5. [ロールを選択] リストでロールを選択します。
    6. 追加のロールを付与するには、 [別のロールを追加] をクリックして各ロールを追加します。
    7. [保存] をクリックします。

モデルへのアクセス権を取得する

Hugging Face トークンをまだ生成していない場合は、新しいトークンを生成します。

  1. [Your Profile] > [Settings] > [Access Tokens] の順にクリックします。
  2. [New Token] を選択します。
  3. 任意の名前と、少なくとも Read ロールを指定します。
  4. [Generate a token] を選択します。

カスタム コンピューティング クラス プロファイルを作成する

このセクションでは、カスタムのコンピューティング クラス プロファイルを作成します。カスタム コンピューティング クラス プロファイルは、ワークロードで使用される複数のコンピューティング リソースのタイプと関係を定義します。

  1. Google Cloud コンソールで Cloud Shell 有効化アイコンCloud Shell をアクティブにする)をクリックして、Google Cloud コンソールで Cloud Shell セッションを起動します。 Google Cloud コンソールの下部ペインにセッションが開きます。
  2. 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
    
  3. dws-flex-start.yaml マニフェストを適用します。

    kubectl apply -f dws-flex-start.yaml
    

GKE は、L4 アクセラレータを使用して g2-standard-24 マシンをデプロイします。GKE は、コンピューティング クラスを使用して、まず Spot VM を優先し、次に Flex Start プロビジョニング モードを優先します。

LLM ワークロードをデプロイする

  1. 次のコマンドを使用して、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 アクセス トークンに置き換えます。

  2. 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 環境変数が設定されているパスです。ダウンロードされたモデルはこのディレクトリに保存されます。

  3. モデルをデプロイします。

    kubectl apply -f  mixtral-deployment.yaml
    

    GKE は、デプロイする新しい Pod をスケジュールします。これにより、ノードプール オートスケーラーがトリガーされ、2 番目のノードが追加されてからモデルの 2 番目のレプリカがデプロイされます。

  4. モデルのステータスを確認します。

    watch kubectl get deploy inference-mixtral-ccc
    

    モデルが正常にデプロイされると、出力は次のようになります。

    NAME                   READY   UP-TO-DATE   AVAILABLE   AGE
    inference-mixtral-ccc  1/1     1            1           10m
    

    監視を終了するには、CTRL + C を押します。

  5. 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 を使用してモデルを操作する

このセクションでは、基本的な推論テストを実行して、デプロイされたモデルを確認する方法について説明します。

  1. モデルへのポート転送を設定します。

    kubectl port-forward service/llm-service 8080:8080
    

    出力は次のようになります。

    Forwarding from 127.0.0.1:8080 -> 8080
    
  2. 新しいターミナル セッションで、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 アカウントに課金されないようにするには、リソースを含むプロジェクトを削除するか、プロジェクトを維持して個々のリソースを削除します。

プロジェクトを削除する

  1. In the Google Cloud console, go to the Manage resources page.

    Go to Manage resources

  2. In the project list, select the project that you want to delete, and then click Delete.
  3. In the dialog, type the project ID, and then click Shut down to delete the project.

個々のリソースを削除する

  1. このガイドで作成した 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
    
  2. クラスタを削除します。

    gcloud container clusters delete CLUSTER_NAME
    

次のステップ