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

このガイドでは、GKE で LLM サービング ワークロードの費用を最適化する方法について説明します。このチュートリアルでは、推論の費用対効果を向上させるために、Flex Start VM、Spot VM、ComputeClass を組み合わせて使用します。

このガイドでは、デプロイ可能な LLM の例として Mixtral 8x7b を使用します。

このガイドは、LLM のサービングに Kubernetes コンテナ オーケストレーションの機能を使用することに関心のある機械学習(ML)エンジニア、プラットフォーム管理者、オペレーター、データおよび AI スペシャリストを対象としています。 Cloud de Confiance by S3NS のコンテンツで使用されている一般的なロールとタスクの例の詳細については、GKE ユーザーの一般的なロールとタスクをご覧ください。

Flex Start の料金

Flex Start は、リソースを必要に応じて動的にプロビジョニングする必要があり、最長 7 日間の短期間での利用が想定され、複雑な割り当て管理が必要なく、コスト効率よく使いたいワークロードにおすすめです。Flex Start は Dynamic Workload Scheduler によって動いており、料金も Dynamic Workload Scheduler に基づいたものになります。

  • vCPU、GPU、TPU が最大 53% 割引になります。
  • 使った分だけ支払う方式です。

背景

このセクションでは、AI / ML ワークロードの要件に基づいて、GPU アクセラレータなどのコンピューティング リソースを取得するための手法について説明します。これらの手法は、GKE では「アクセラレータの入手可能性戦略」と呼ばれます。

GPU

画像処理装置(GPU)を使用すると、ML やデータ処理などの特定のワークロードを高速化できます。GKE には、ML タスクとデータ処理タスクのパフォーマンスを最適化するため、強力な GPU を搭載したノードが用意されています。GKE には、NVIDIA H100、A100、L4 GPU を搭載したマシンタイプをはじめとして、ノード構成用のさまざまなマシンタイプ オプションが用意されています。

詳細については、GKE での GPU についてをご覧ください。

Flex Start

Flex Start は、Dynamic Workload Scheduler を活用した GPU 使用オプションです。GKE で GPU リクエストを保持し、容量が使用可能になると Flex Start VM を自動的にプロビジョニングします。最大 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 を使用するをご覧ください。

ComputeClasses

GPU は、ComputeClass を使用してリクエストできます。ComputeClass を使用すると、ノード スケーリングの決定時に GKE が優先順位を付けるノード構成の階層を定義して、選択したハードウェアでワークロードが実行されるようにできます。詳細については、カスタム ComputeClass についてをご覧ください。

始める前に

  • In the Cloud de Confiance console, on the project selector page, select or create a Cloud de Confiance project.

    Roles required to select or create a project

    • Select a project: Selecting a project doesn't require a specific IAM role—you can select any project that you've been granted a role on.
    • Create a project: To create a project, you need the Project Creator role (roles/resourcemanager.projectCreator), which contains the resourcemanager.projects.create permission. Learn how to grant roles.

    Go to project selector

  • Verify that billing is enabled for your Cloud de Confiance project.

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

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

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

ComputeClass を作成する

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

  1. Cloud de Confiance コンソールで Cloud Shell 有効化アイコンCloud Shell をアクティブにする)をクリックして、Cloud de Confiance コンソールで Cloud Shell セッションを起動します。 Cloud de Confiance コンソールの下部ペインにセッションが開きます。
  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 は、ComputeClasses を使用して、まず Spot VM を優先し、次に Flex Start VM を優先します。

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:
      replicas: 1
      selector:
        matchLabels:
          app: llm
      template:
        metadata:
          labels:
            app: llm
        spec:
          nodeSelector:
            cloud.google.com/compute-class: dws-model-inference-class
          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. コンテナがダウンロードされ、モデルのサービングが開始されるまで待ちます。

    watch "kubectl logs $(kubectl get pods -l app=llm -o custom-columns=:metadata.name --no-headers) | tail"
    

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

  6. 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 をプロビジョニングしました。

  7. モデルを公開します。

    kubectl expose deployment/inference-mixtral-ccc --port 8080 --name=llm-service
    

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.
    

クリーンアップ

このページで使用したリソースについて、 Cloud de Confiance by S3NS アカウントに課金されないようにするには、リソースを含むプロジェクトを削除するか、プロジェクトを維持して個々のリソースを削除します。

プロジェクトを削除する

  1. Cloud de Confiance コンソールで [リソースの管理] ページに移動します。

    [リソースの管理] に移動

  2. プロジェクト リストで、削除するプロジェクトを選択し、[削除] をクリックします。
  3. ダイアログでプロジェクト ID を入力し、[シャットダウン] をクリックしてプロジェクトを削除します。

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

  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
    

次のステップ