2.12. 複数の GPU ノードを使用したモデルのデプロイ


大規模言語モデル (LLM) などの大規模モデルを処理するために、複数の GPU ノードにわたってモデルをデプロイします。

vLLM サービングフレームワークを使用して、複数の GPU ノードにわたって Red Hat OpenShift AI 上でモデルを提供できます。マルチノード推論では、vllm-multinode-runtime カスタムランタイムが使用されます。これは、vLLM NVIDIA GPU ServingRuntime for KServe と同じイメージを使用し、マルチ GPU 推論に必要な情報を含んでいます。

モデルは、永続ボリューム要求 (PVC) または Open Container Initiative (OCI) コンテナーイメージからデプロイできます。

重要

複数の GPU ノードを使用したモデルのデプロイ は、現在、Red Hat OpenShift AI のテクノロジープレビュー機能として提供されています。テクノロジープレビュー機能は、Red Hat 製品のサービスレベルアグリーメント (SLA) の対象外であり、機能的に完全ではないことがあります。Red Hat では、実稼働環境での使用を推奨していません。これらの機能により、近日発表予定の製品機能をリリースに先駆けてご提供でき、お客様は開発プロセス時に機能をテストして、フィードバックをお寄せいただくことができます。

Red Hat のテクノロジープレビュー機能のサポート範囲に関する詳細は、テクノロジープレビュー機能のサポート範囲 を参照してください。

前提条件

  • OpenShift クラスターのクラスター管理者権限を持っている。
  • OpenShift コマンドラインインターフェイス (CLI) をダウンロードしてインストールした。詳細は、OpenShift CLI のインストール (Red Hat OpenShift Dedicated) または OpenShift CLI のインストール (Red Hat OpenShift Service on AWS) を参照してください。
  • Node Feature Discovery Operator、NVIDIA GPU Operator など、お使いの GPU タイプ用の Operator を有効にした。アクセラレーターの有効化の詳細は、アクセラレーターの有効化 を参照してください。

    • NVIDIA GPU (nvidia.com/gpu) を使用している。
    • ServingRuntime または InferenceService のいずれかを使用して GPU タイプを指定した。ServingRuntime で指定された GPU タイプが InferenceService で設定されたものと異なる場合、両方の GPU タイプがリソースに割り当てられ、エラーが発生する可能性があります。
  • クラスターで KServe を有効にした。
  • 環境にヘッド Pod が 1 つだけある。InferenceServicemin_replicas または max_replicas 設定を使用してレプリカ数を調整しないでください。追加のヘッド Pod を作成すると、それらが Ray クラスターから除外される可能性があります。
  • PVC からデプロイする場合: 永続ボリューム要求 (PVC) がセットアップされ、ReadWriteMany (RWX) アクセスモード用に設定されている。
  • OCI コンテナーイメージからデプロイする場合:

    • モデルを OCI コンテナーイメージに保存した。
    • モデルがプライベート OCI リポジトリーに保存されている場合は、イメージプルシークレットを設定した。

手順

  1. ターミナルウィンドウで、クラスター管理者として OpenShift クラスターにまだログインしていない場合は、次の例に示すように OpenShift CLI にログインします。

    $ oc login <openshift_cluster_url> -u <admin_username> -p <password>
    Copy to Clipboard Toggle word wrap
  2. モデルをデプロイするための namespace を選択または作成します。たとえば、kserve-demo namespace を作成するには、次のコマンドを実行します。

    oc new-project kserve-demo
    Copy to Clipboard Toggle word wrap
  3. (PVC からモデルをデプロイする場合のみ) モデルをデプロイする namespace に、モデルストレージ用の PVC を作成します。Filesystem volumeMode を使用してストレージクラスを作成し、このストレージクラスを PVC に使用します。ストレージサイズは、ディスク上のモデルファイルのサイズよりも大きくする必要があります。以下に例を示します。

    注記

    PVC がすでに設定済みの場合、または OCI コンテナーイメージからモデルをデプロイする場合は、このステップをスキップできます。

    kubectl apply -f -
    apiVersion: v1
    kind: PersistentVolumeClaim
    metadata:
      name: granite-8b-code-base-pvc
    spec:
      accessModes:
        - ReadWriteMany
      volumeMode: Filesystem
      resources:
        requests:
          storage: <model size>
      storageClassName: <storage class>
    Copy to Clipboard Toggle word wrap
    1. 作成した PVC にモデルをダウンロードするための Pod を作成します。バケット名、モデルパス、および認証情報を使用してサンプル YAML を更新します。

      apiVersion: v1
      kind: Pod
      metadata:
        name: download-granite-8b-code
        labels:
          name: download-granite-8b-code
      spec:
        volumes:
          - name: model-volume
            persistentVolumeClaim:
              claimName: granite-8b-code-base-pvc
        restartPolicy: Never
        initContainers:
          - name: fix-volume-permissions
            image: quay.io/quay/busybox@sha256:92f3298bf80a1ba949140d77987f5de081f010337880cd771f7e7fc928f8c74d
            command: ["sh"]
            args: ["-c", "mkdir -p /mnt/models/$(MODEL_PATH) && chmod -R 777 /mnt/models"] 
      1
      
            volumeMounts:
              - mountPath: "/mnt/models/"
                name: model-volume
            env:
              - name: MODEL_PATH
                value: <model path> 
      2
      
        containers:
          - resources:
              requests:
                memory: 40Gi
            name: download-model
            imagePullPolicy: IfNotPresent
            image: quay.io/opendatahub/kserve-storage-initializer:v0.14 
      3
      
            args:
              - 's3://$(BUCKET_NAME)/$(MODEL_PATH)/'
              - /mnt/models/$(MODEL_PATH)
            env:
              - name: AWS_ACCESS_KEY_ID
                value: <id> 
      4
      
              - name: AWS_SECRET_ACCESS_KEY
                value: <secret> 
      5
      
              - name: BUCKET_NAME
                value: <bucket_name> 
      6
      
              - name: MODEL_PATH
                value: <model path> 
      7
      
              - name: S3_USE_HTTPS
                value: "1"
              - name: AWS_ENDPOINT_URL
                value: <AWS endpoint> 
      8
      
              - name: awsAnonymousCredential
                value: 'false'
              - name: AWS_DEFAULT_REGION
                value: <region> 
      9
      
              - name: S3_VERIFY_SSL
                value: 'true' 
      10
      
            volumeMounts:
              - mountPath: "/mnt/models/"
                name: model-volume
      Copy to Clipboard Toggle word wrap
      1
      chmod 操作は、Pod が root として実行されている場合にのみ使用できます。Pod を root として実行していない場合は、引数から `chmod -R 777` を削除します。
      2 7
      モデルへのパスを指定します。
      3
      InferenceService にある containers.image の値。この値にアクセスするには、oc get configmap inferenceservice-config -n redhat-ods-operator -oyaml | grep kserve-storage-initializer: のコマンドを実行します。
      4
      S3 バケットへのアクセスキー ID。
      5
      S3 バケットへのシークレットアクセスキー。
      6
      S3 バケットの名前。
      8
      S3 バケットへのエンドポイント。
      9
      AWS S3 バケットを使用する場合の S3 バケットのリージョン。ODF や Minio などの他の S3 互換ストレージを使用する場合は、AWS_DEFAULT_REGION 環境変数を削除できます。
      10
      SSL エラーが発生した場合は、S3_VERIFY_SSLfalse に変更します。
  4. プロジェクト namespace に vllm-multinode-runtime カスタムランタイムを作成します。

    oc process vllm-multinode-runtime-template -n redhat-ods-applications|oc apply -n kserve-demo -f -
    Copy to Clipboard Toggle word wrap
  5. 次の InferenceService 設定を使用してモデルをデプロイします。

    apiVersion: serving.kserve.io/v1beta1
    kind: InferenceService
    metadata:
      annotations:
        serving.kserve.io/deploymentMode: RawDeployment
        serving.kserve.io/autoscalerClass: external
      name: <inference service name>
    spec:
      predictor:
        model:
          modelFormat:
            name: vLLM
          runtime: vllm-multinode-runtime
          storageUri: <storage_uri_path> 
    1
    
        workerSpec: {} 
    2
    Copy to Clipboard Toggle word wrap
    1
    デプロイ方法に応じてモデルへのパスを指定します。
    • PVC の場合: pvc://<pvc_name>/<model_path>
    • OCI コンテナーイメージの場合: oci://<registry_host>/<org_or_username>/<repository_name><tag_or_digest>
    2
    InferenceService には次の設定を追加できます。
    • workerSpec.tensorParallelSize: ノードごとに使用される GPU の数を決定します。ヘッドノードとワーカーノードのデプロイメントリソースの GPU タイプ数は、どちらも自動的に更新されます。workerSpec.tensorParallelSize の値は、必ず 1 以上にしてください。
    • workerSpec.pipelineParallelSize: デプロイメントでモデルのバランスをとるために使用されるノードの数を決定します。この変数は、ヘッドノードとワーカーノードの両方を含むノードの合計数を表します。workerSpec.pipelineParallelSize の値は、必ず 2 以上にしてください。実稼働環境では、この値は変更しないでください。

      注記

      お使いの環境およびモデルサイズに応じて、追加の引数を指定する必要がある場合があります。

  6. InferenceService 設定を適用してモデルをデプロイします。

    oc apply -f <inference-service-file.yaml>
    Copy to Clipboard Toggle word wrap

検証

複数の GPU ノードにモデルをデプロイするように環境を設定したことを確認するには、GPU リソースのステータス、InferenceService のステータス、Ray クラスターのステータスを確認し、モデルにリクエストを送信します。

  • GPU リソースのステータスを確認します。

    • ヘッドノードとワーカーノードの Pod 名を取得します。

      # Get pod name
      podName=$(oc get pod -l app=isvc.granite-8b-code-base-pvc-predictor --no-headers|cut -d' ' -f1)
      workerPodName=$(oc get pod -l app=isvc.granite-8b-code-base-pvc-predictor-worker --no-headers|cut -d' ' -f1)
      
      oc wait --for=condition=ready pod/${podName} --timeout=300s
      # Check the GPU memory size for both the head and worker pods:
      echo "### HEAD NODE GPU Memory Size"
      kubectl exec $podName -- nvidia-smi
      echo "### Worker NODE GPU Memory Size"
      kubectl exec $workerPodName -- nvidia-smi
      Copy to Clipboard Toggle word wrap

      応答の例

      +-----------------------------------------------------------------------------------------+
      | NVIDIA-SMI 550.90.07              Driver Version: 550.90.07      CUDA Version: 12.4     |
      |-----------------------------------------+------------------------+----------------------+
      | GPU  Name                 Persistence-M | Bus-Id          Disp.A | Volatile Uncorr. ECC |
      | Fan  Temp   Perf          Pwr:Usage/Cap |           Memory-Usage | GPU-Util  Compute M. |
      |                                         |                        |               MIG M. |
      |=========================================+========================+======================|
      |   0  NVIDIA A10G                    On  |   00000000:00:1E.0 Off |                    0 |
      |  0%   33C    P0             71W /  300W |19031MiB /  23028MiB <1>|      0%      Default |
      |                                         |                        |                  N/A |
      +-----------------------------------------+------------------------+----------------------+
               ...
      +-----------------------------------------------------------------------------------------+
      | NVIDIA-SMI 550.90.07              Driver Version: 550.90.07      CUDA Version: 12.4     |
      |-----------------------------------------+------------------------+----------------------+
      | GPU  Name                 Persistence-M | Bus-Id          Disp.A | Volatile Uncorr. ECC |
      | Fan  Temp   Perf          Pwr:Usage/Cap |           Memory-Usage | GPU-Util  Compute M. |
      |                                         |                        |               MIG M. |
      |=========================================+========================+======================|
      |   0  NVIDIA A10G                    On  |   00000000:00:1E.0 Off |                    0 |
      |  0%   30C    P0             69W /  300W |18959MiB /  23028MiB <2>|      0%      Default |
      |                                         |                        |                  N/A |
      +-----------------------------------------+------------------------+----------------------+
      Copy to Clipboard Toggle word wrap

      <1> と <2> の値をチェックして、モデルが適切にロードされたことを確認します。モデルがロードされなかった場合、これらのフィールドの値は 0MiB になります。

  • 次のコマンドを使用して、InferenceService のステータスを確認します。注記: テクノロジープレビューでは、推論にポート転送のみを使用できます。

    oc wait --for=condition=ready pod/${podName} -n $DEMO_NAMESPACE --timeout=300s
    export MODEL_NAME=granite-8b-code-base-pvc
    Copy to Clipboard Toggle word wrap

    応答の例

       NAME                 URL                                                   READY   PREV   LATEST   PREVROLLEDOUTREVISION   LATESTREADYREVISION                          AGE
       granite-8b-code-base-pvc   http://granite-8b-code-base-pvc.default.example.com
    Copy to Clipboard Toggle word wrap

  • モデルが推論に使用できることを確認するために、モデルにリクエストを送信します。

    oc wait --for=condition=ready pod/${podName} -n vllm-multinode --timeout=300s
    
    oc port-forward $podName 8080:8080 &
    
    curl http://localhost:8080/v1/completions \
           -H "Content-Type: application/json" \
           -d "{
                'model': "$MODEL_NAME",
                'prompt': 'At what temperature does Nitrogen boil?',
                'max_tokens': 100,
                'temperature': 0
            }"
    Copy to Clipboard Toggle word wrap
トップに戻る
Red Hat logoGithubredditYoutubeTwitter

詳細情報

試用、購入および販売

コミュニティー

Red Hat ドキュメントについて

Red Hat をお使いのお客様が、信頼できるコンテンツが含まれている製品やサービスを活用することで、イノベーションを行い、目標を達成できるようにします。 最新の更新を見る.

多様性を受け入れるオープンソースの強化

Red Hat では、コード、ドキュメント、Web プロパティーにおける配慮に欠ける用語の置き換えに取り組んでいます。このような変更は、段階的に実施される予定です。詳細情報: Red Hat ブログ.

会社概要

Red Hat は、企業がコアとなるデータセンターからネットワークエッジに至るまで、各種プラットフォームや環境全体で作業を簡素化できるように、強化されたソリューションを提供しています。

Theme

© 2025 Red Hat