モデルの管理と監視


Red Hat OpenShift AI Cloud Service 1

Red Hat OpenShift AI Cloud Service でモデルを管理および監視する

概要

クラスター管理者は、Red Hat OpenShift AI Cloud Service でモデルを管理および監視できます。

第1章 モデルサービングランタイムの管理

クラスター管理者は、カスタムモデルサービングランタイムを作成し、OpenShift AI にデプロイされたモデルの推論サービスを編集できます。

モデルサービングランタイムは、特定のモデルフレームワーク群のサポートと、それらのフレームワークでサポートされるモデル形式のサポートを追加します。OpenShift AI に含まれている プリインストールされたランタイム を使用できます。デフォルトのランタイムがニーズを満たしていない場合は、独自のカスタムランタイムを追加することもできます。

管理者は、OpenShift AI インターフェイスを使用して、カスタムのモデルサービングランタイムを追加して有効にすることができます。その場合は、シングルモデルサービングプラットフォームにモデルをデプロイする際に、カスタムランタイムを選択できます。

注記

Red Hat はカスタムランタイムのサポートを提供しません。追加したカスタムランタイムを使用するライセンスがあることを確認し、お客様の責任で正しく設定および保守するようにしてください。

前提条件

  • OpenShift AI 管理者権限を持つユーザーとして OpenShift AI にログインしている。
  • カスタムランタイムをビルドし、イメージを Quay などのコンテナーイメージリポジトリーに追加している。

手順

  1. OpenShift AI ダッシュボードから、SettingsServing runtimes をクリックします。

    Serving runtimes ページが開き、すでにインストールされ有効になっているモデルサービングランタイムが表示されます。

  2. カスタムランタイムを追加するには、次のオプションのいずれかを選択します。

    • 既存のランタイム (たとえば、vLLM NVIDIA GPU ServingRuntime for KServe) から開始するには、既存のランタイムの横にあるアクションメニュー (⋮) をクリックし、Duplicate をクリックします。
    • 新しいカスタムランタイムを追加するには、Add serving runtime をクリックします。
  3. Select the model serving platforms this runtime supports リストで、Single-model serving platform を選択します。
  4. Select the API protocol this runtime supports リストで、REST または gRPC を選択します。
  5. オプション: (既存のランタイムを複製するのではなく) 新しいランタイムを開始した場合は、次のオプションのいずれかを選択してコードを追加します。

    • YAML ファイルをアップロードする

      1. Upload files をクリックします。
      2. ファイルブラウザーで、コンピューター上の YAML ファイルを選択します。

        埋め込み YAML エディターが開き、アップロードしたファイルの内容が表示されます。

    • エディターに YAML コードを直接入力する

      1. Start from scratch をクリックします。
      2. 埋め込みエディターに YAML コードを直接入力または貼り付けます。
    注記

    多くの場合、カスタムランタイムを作成するには、ServingRuntime 仕様の env セクションに新しいパラメーターまたはカスタムパラメーターを追加する必要があります。

  6. Add をクリックします。

    Serving runtimes ページが開き、インストールされているランタイムの更新されたリストが表示されます。追加したカスタムランタイムが自動的に有効になることを確認します。ランタイム作成時に指定した API プロトコルが表示されます。

  7. オプション: カスタムランタイムを編集するには、アクションメニュー (⋮) をクリックし、Edit を選択します。

検証

  • 追加したカスタムモデルサービングランタイムは、Serving runtimes ページに有効な状態で表示されます。

第2章 シングルモデルサービングプラットフォーム上でのモデルの管理と監視

クラスター管理者は、シングルモデルサービングプラットフォームでモデルを管理および監視できます。シングルモデルサービングプラットフォームの監視設定、複数の GPU ノードへのモデルのデプロイ、リアルタイムメトリクスを視覚化する Grafana ダッシュボードの設定などのタスクを実行できます。

2.1. KServe のタイムアウトの設定

大規模なモデルをデプロイする場合、または KServe でノードの自動スケーリングを使用する場合、モデルがデプロイされる前に操作がタイムアウトすることがあります。KNative Serving が設定するデフォルトの progress-deadline が 10 分であるためです。

KNative Serving を使用した Pod のデプロイに 10 分以上かかる場合、Pod が自動的に失敗とマークされる可能性があります。これは、S3 互換のオブジェクトストレージからプルするのに 10 分以上かかる大規模なモデルをデプロイしている場合、またはノードの自動スケーリングを使用して GPU ノードの消費を削減している場合に発生する可能性があります。

この問題を解決するには、アプリケーションに合わせて KServe の InferenceService でカスタムの progress-deadline を設定できます。

前提条件

  • OpenShift クラスターの namespace 編集アクセス権がある。

手順

  1. OpenShift コンソールにクラスター管理者としてログインします。
  2. モデルをデプロイしたプロジェクトを選択します。
  3. Administrator パースペクティブで、HomeSearch をクリックします。
  4. Resources ドロップダウンメニューから、InferenceService を検索します。
  5. spec.predictor.annotations の下の serving.knative.dev/progress-deadline を新しいタイムアウトに変更します。

    apiVersion: serving.kserve.io/v1alpha1
    kind: InferenceService
    metadata:
      name: my-inference-service
    spec:
      predictor:
        annotations:
          serving.knative.dev/progress-deadline: 30m
    Copy to Clipboard Toggle word wrap
    注記

    必ず spec.predictor.annotations レベルで progress-deadline を設定して、KServe の InferenceServiceprogress-deadline を KNative Service オブジェクトにコピーできるようにしてください。

2.2. 複数の 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

2.3. Kueue の推論サービスの設定

推論サービスのワークロードをキューに入れてリソースを管理するには、サービスのメタデータに kueue.x-k8s.io/queue-name ラベルを追加します。このラベルは、管理対象としてワークロードを特定の LocalQueue に送信します。これは、プロジェクトで Kueue が有効になっている場合にのみ必要です。詳細は、Kueue を使用したワークロードの管理 を参照してください。

前提条件

  • モデルがデプロイされているプロジェクトでリソースを編集する権限がある。
  • クラスター管理者として、Kueue を使用したワークロード管理の設定 の説明に従って、Red Hat build of Kueue Operator をインストールしてアクティブ化しておく。

手順

推論サービスを設定するには、次の手順を実行します。

  1. OpenShift コンソールにログインします。
  2. Administrator パースペクティブで、プロジェクトに移動し、モデルの InferenceService リソースを見つけます。
  3. InferenceService の名前をクリックすると、詳細が表示されます。
  4. YAML タブを選択してエディターを開きます。
  5. metadata セクションで、labels の下に kueue.x-k8s.io/queue-name ラベルを追加します。<local-queue-name> は、ターゲットの LocalQueue の名前に置き換えます。

    apiVersion: serving.kserve.io/v1beta1
    kind: InferenceService
    metadata:
      name: <model-name>
      namespace: <project-namespace>
      labels:
        kueue.x-k8s.io/queue-name: <local-queue-name>
    ...
    Copy to Clipboard Toggle word wrap
  6. Save をクリックします。

検証

  • ワークロードは、kueue.x-k8s.io/queue-name ラベルで指定された LocalQueue に送信されます。
  • 必要なクラスターリソースが利用可能になり、キューによって許可されると、ワークロードが開始されます。
  • オプション: 検証するには、次のコマンドを実行し、Admitted Workloads セクションを確認します。

    $ oc describe localqueue <local-queue-name> -n <project-namespace>
    Copy to Clipboard Toggle word wrap

2.4. パフォーマンスの最適化とチューニング

デプロイしたモデルを最適化および調整して、さまざまなユースケースにおいて、速度、効率、コストのバランスをとることができます。

モデルの推論パフォーマンスを評価するには、次の主要なメトリクスを考慮してください。

  • レイテンシー: 応答を生成するのにかかる時間。リアルタイムアプリケーションにとって極めて重要です。これには、Time-to-First-Token (TTFT) と Inter-Token Latency (ITL) が含まれます。
  • スループット: モデルサーバーの全体的な効率。1 秒あたりのトークン数 (TPS) または 1 秒あたりのリクエスト数 (RPS) で測定されます。

  • 100 万トークンあたりのコスト: モデルの推論の費用対効果。



特にテキスト要約や検索拡張生成 (RAG) などのアプリケーションの場合、パフォーマンスはモデルのサイズ、使用可能な GPU メモリー、入力シーケンスの長さなどの要因からの影響を受けます。パフォーマンス要件を満たすには、量子化などの手法を使用してメモリー要件を削減したり、並列処理を使用して非常に大きなモデルを複数の GPU に分散したりすることができます。

2.4.1. LLM を利用したアプリケーションの GPU 要件の決定

OpenShift AI でホストされる Large Language Model (LLM) を利用したアプリケーション用に GPU を選択する際には、考慮すべき要素がいくつかあります。

次のガイドラインは、モデルのサイズと予想される使用状況に応じて、アプリケーションのハードウェア要件を決定するのに役立ちます。

  • メモリー要件の見積もり: 一般的な目安として、16 ビット精度の N パラメーターを持つモデルには、約 2N バイトの GPU メモリーが必要です。たとえば、80 億パラメーターのモデルでは約 16 GB の GPU メモリーが必要です。700 億パラメーターのモデルでは約 140 GB が必要です。
  • 量子化: メモリー要件を削減し、スループットを向上させるために、量子化を使用して、INT8、FP8、INT4 などの低精度形式でモデルをロードまたは実行できます。これにより、モデルの精度がわずかに低下しますが、メモリーフットプリントが削減されます。

    注記

    vLLM ServingRuntime for KServe モデルサービングランタイムは、いくつかの量子化方法をサポートしています。サポートされている実装と互換性のあるハードウェアの詳細は、Supported hardware for quantization kernels を参照してください。

  • キー値キャッシュ用の追加メモリー: モデルの重みに加えて、リクエストの数と各リクエストのシーケンスの長さに応じて増加するアテンションキー値 (KV) キャッシュを格納するための GPU メモリーも必要です。これは、特に大規模モデルの場合、リアルタイムアプリケーションのパフォーマンスに影響を与える可能性があります。
  • 推奨される GPU 設定:

    • 小規模モデル (10 - 80 億パラメーター): この範囲のモデルの場合、通常、24 GB のメモリーを搭載した GPU があれば、少数の同時ユーザーをサポートするのに十分です。
    • 中規模モデル (100 - 340 億パラメーター):

      • 200 億パラメーター未満のモデルには、少なくとも 48 GB の GPU メモリーが必要です。
      • 200 - 340 億のパラメーターを持つモデルでは、単一の GPU に少なくとも 80 GB 以上のメモリーが必要です。
    • 大規模モデル (700 億パラメーター): この規模のモデルでは、テンソル並列化技術を使用して複数の GPU に分散する必要がある場合があります。テンソル並列化により、モデルを複数の GPU に分散できるため、トークン間のレイテンシーが改善され、KV キャッシュ用の追加メモリーが解放されて最大バッチサイズが増加します。テンソル並列化は、GPU に NVLink などの高速相互接続がある場合に最も効果的に機能します。
    • 非常に大規模なモデル (4050 億パラメーター): 非常に大規模なモデルの場合、メモリー需要を減らすために量子化を推奨します。パイプライン並列化を使用して、複数の GPU 間、または 2 台のサーバー間でモデルを分散することもできます。このアプローチでは、単一サーバーのメモリー制限を超えて拡張できますが、最適なパフォーマンスを得るにはサーバー間の通信を慎重に管理する必要があります。

最良の結果を得るには、小さいモデルから始めて、並列化や量子化などの手法を使用して、パフォーマンスとメモリーの要件を満たすように、必要に応じて大きいモデルにスケールアップしてください。

テキスト要約アプリケーションや RAG アプリケーション、およびユーザーがアップロードした大容量のドキュメントを処理する LLM ベースのサービスでは、考慮すべき要素が他にもあります。

  • 長い入力シーケンス: 各ユーザークエリーに、長いプロンプトや、アップロードされたドキュメントなどの大量のコンテキストが含まれている場合、入力シーケンスの長さが通常のチャットアプリケーションよりも大幅に長くなる可能性があります。入力シーケンス長が長くなると、事前入力時間 (モデルが応答を生成する前に初期入力シーケンスを処理するのにかかる時間) が長くなり、最初のトークン生成までの時間 (TTFT) が長くなる可能性があります。TTFT が長くなると、アプリケーションの応答性に影響が生じる可能性があります。最適なユーザーエクスペリエンスを実現するために、この遅延を最小限に抑えてください。
  • KV キャッシュの使用: シーケンスが長くなるほど、キー値 (KV) キャッシュ に多くの GPU メモリーが必要になります。KV キャッシュには、生成中のモデルのパフォーマンスを向上させるための中間アテンションデータが格納されます。リクエストあたりの KV キャッシュ使用率を高くするには、十分な GPU メモリーを備えたハードウェアセットアップが必要です。これは、複数のユーザーが同時にモデルをクエリーする場合に特に重要です。各リクエストによってメモリーの総負荷が増加するためです。
  • 最適なハードウェア設定: 応答性を維持し、メモリーのボトルネックを回避するには、十分なメモリーを備えた GPU 設定を選択します。たとえば、80 億のモデルを単一の 24 GB GPU で実行する代わりに、より大きな GPU (48 GB や 80 GB など) または複数の GPU にモデルをデプロイすると、KV キャッシュのメモリーヘッドルームが増え、トークン間のレイテンシーが短縮されるため、パフォーマンスが向上します。マルチ GPU セットアップとテンソル並列化を使用すると、メモリー需要を管理し、大規模な入力シーケンスの効率を向上できます。

要約すると、ドキュメントベースのアプリケーションで最適な応答性とスケーラビリティーを確保するには、GPU メモリー容量の高いハードウェアを優先的に考慮する必要があります。また、長い入力シーケンスと KV キャッシュのメモリー要件の増加に対応するために、マルチ GPU セットアップも検討する必要があります。

2.4.3. 推論のパフォーマンスメトリクス

レイテンシースループット、および 100 万トークンあたりのコスト は、推論時のモデルの応答生成効率を評価する際に考慮すべき重要なメトリクスです。これらのメトリクスは、モデルの推論パフォーマンスを包括的に把握し、さまざまなユースケースの速度、効率、コストのバランスをとるのに役立ちます。

2.4.3.1. レイテンシー

レイテンシー は、インタラクティブなユースケースやリアルタイムのユースケースにとって重要です。これは次のメトリクスを使用して測定します。

  • 最初のトークン生成までの時間 (TTFT): 最初のリクエストから最初のトークン生成までの遅延 (ミリ秒単位)。このメトリクスはストリーミングレスポンスにとって重要です。
  • トークン間のレイテンシー (ITL): 最初のトークンの後に後続の各トークンを生成するのにかかる時間 (ミリ秒単位)。ストリーミングにも関連します。
  • 出力トークンあたりの時間 (TPOT): 非ストリーミングリクエストの場合に、出力シーケンス内の各トークンを生成するのにかかる平均時間 (ミリ秒単位)。
2.4.3.2. スループット

スループット は、モデルサーバーの全体的な効率を測定したものです。これは次のメトリクスで表されます。

  • 1 秒あたりのトークン数 (TPS): すべてのアクティブなリクエストで 1 秒あたりに生成されるトークンの合計数。
  • 1 秒あたりのリクエスト数 (RPS): 1 秒あたりに処理されるリクエストの数。RPS は、応答時間と同様に、シーケンス長の影響を強く受けます。
2.4.3.3. 100 万トークンあたりのコスト

100 万トークンあたりのコスト は、モデルの推論の費用対効果を測定したものです。これは、生成された 100 万トークンあたりに発生する費用を示します。このメトリクスは、モデルをデプロイすることの経済的な実現可能性とスケーラビリティーの両方を評価するのに役立ちます。

2.4.4. メトリクスベースの自動スケーリング (metrics-based autoscaling) の設定

重要

メトリクスベースの自動スケーリングは現在、Red Hat OpenShift AI でテクノロジープレビュー機能として提供されています。テクノロジープレビュー機能は、Red Hat 製品のサービスレベルアグリーメント (SLA) の対象外であり、機能的に完全ではないことがあります。Red Hat では、実稼働環境での使用を推奨していません。テクノロジープレビュー機能は、最新の製品機能をいち早く提供して、開発段階で機能のテストを行いフィードバックを提供していただくことを目的としています。

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

Knative ベースの自動スケーリングは、標準のデプロイメントモードでは使用できません。ただし、標準のデプロイメントモードでは、推論サービスに対してメトリクスベースの自動スケーリングを有効にできます。メトリクスベースの自動スケーリングを使用すると、アクセラレーターリソースの効率管理、運用コストの削減が実現され、推論サービスでパフォーマンス要件が確実に満たされるようになります。

標準デプロイメントで推論サービスの自動スケーリングを設定するには、Kubernetes Event-driven Autoscaling (KEDA) に基づく OpenShift Custom Metrics Autoscaler (CMA) をインストールして設定します。その後、OpenShift モニタリングで利用可能なさまざまなモデルランタイムメトリクス (KVCache 使用率、Time to First Token (TTFT)、同時実行性など) を使用して、推論サービスの自動スケーリングをトリガーできます。

前提条件

  • OpenShift クラスターのクラスター管理者権限を持っている。
  • クラスターに CMA operator がインストールされている。詳細は、custom metrics autoscaler のインストール を参照してください。

    注記
    • CMA operator をインストールした後、KedaController リソースを設定する必要があります。
    • odh-controller は、TriggerAuthenticationServiceAccountRoleRoleBinding、および Secret リソースを自動的に作成し、CMA が OpenShift Monitoring メトリクスにアクセスできるようにします。
  • クラスターに対してユーザーワークロードモニタリング (UWM) が有効化されている。詳細は、ユーザーワークロードモニタリングの設定 を参照してください。
  • 標準デプロイメントモードで、シングルモデルサービングプラットフォームにモデルをデプロイした。

手順

  1. OpenShift コンソールにクラスター管理者としてログインします。
  2. Administrator パースペクティブで、HomeSearch をクリックします。
  3. モデルをデプロイしたプロジェクトを選択します。
  4. Resources ドロップダウンメニューから、InferenceService を選択します。
  5. デプロイされたモデルの InferenceService をクリックし、YAML をクリックします。
  6. spec.predictor で、次の例のようなメトリクスベースの自動スケーリングポリシーを定義します。

    kind: InferenceService
    metadata:
      name: my-inference-service
      namespace: my-namespace
      annotations:
        serving.kserve.io/autoscalerClass: keda
    spec:
      predictor:
        minReplicas: 1
        maxReplicas: 5
        autoscaling:
          metrics:
            - type: External
              external:
                metric:
                  backend: "prometheus"
                  serverAddress: "https://thanos-querier.openshift-monitoring.svc:9092"
                  query: vllm:num_requests_waiting
              authenticationRef:
                name: inference-prometheus-auth
              authModes: bearer
              target:
                type: Value
                value: 2
    Copy to Clipboard Toggle word wrap

    この設定例では、vllm:num_requests_waiting メトリクスで示されるように、処理を待機しているリクエストの数に基づいて、1 - 5 個のレプリカ間で自動スケーリングするように推論サービスを設定します。

  7. Save をクリックします。

検証

  • KEDA ScaledObject リソースが作成されたことを確認します。

    oc get scaledobject -n <namespace>
    Copy to Clipboard Toggle word wrap

2.4.5. メトリクスベースの自動スケーリングのガイドライン

メトリクスベースの自動スケーリングを使用すると、従来のリクエストの同時実行ではなく、レイテンシーやスループットに重点を置いたサービスレベル目標 (SLO) に基づいて AI ワークロードをスケーリングできます。メトリクスベースの自動スケーリングは、Kubernetes Event-driven Autoscaling (KEDA) に基づいています。

リクエストの同時実行数、リクエストレート、CPU 使用率などの要因に依存する従来のスケーリング方法は、GPU 上で動作する LLM 推論サーバーのスケーリングには効果的ではありません。対照的に、vLLM の容量は、GPU のサイズと同時に処理されるトークンの合計数によって決まります。カスタムメトリクスを使用すると、SLO を満たすための自動スケーリングの決定に役立ちます。

次のガイドラインは、メトリクスの選択、スライディングウィンドウの定義、HPA スケールダウンの設定、最適なスケーリングパフォーマンスを実現するためのモデルサイズの考慮など、AI 推論ワークロードの自動スケーリングに役立ちます。

2.4.5.1. レイテンシーとスループットを最適化したスケーリングのメトリクスの選択

レイテンシーの影響を受けやすいアプリケーションの場合は、リクエストの特性に応じてスケーリングメトリクスを選択します。

  • シーケンスの長さが異なる場合は、Time to First Token (TTFT) と Inter-Token Latency (ITL) のサービスレベル目標 (SLO) を使用します。これらのメトリクスは、シーケンスの長さの変更による影響が少ないため、提供されるスケーリング信号が多くなります。
  • end-to-end request latency を使用して、リクエストのシーケンス長が類似している場合に自動スケーリングをトリガーします。

エンドツーエンド (e2e) リクエストのレイテンシーはシーケンスの長さに依存するため、入力/出力トークン数のばらつきが大きいユースケースでは課題が生じます。10 トークンの完了と 2000 トークンの完了では、同一のシステム条件下でもレイテンシーが大きく異なります。レイテンシー制約なしでスループットを最大化するには、vllm:num_requests_waiting > 0.1 メトリクス (KEDA scaledObject はしきい値 0 をサポートしていません) を使用してワークロードをスケーリングします。このメトリクスは、リクエストがキューに入れられるとすぐにシステムをスケールアップし、使用率を最大化してバックログを防止します。このストラテジーは、入力シーケンスと出力シーケンスの長さが一貫している場合に最適に機能します。

効果的なメトリクスベースの自動スケーリングを構築するには、次のベストプラクティスに従ってください。

  • 適切なメトリクスを選択してください。

    • 負荷パターンを分析して、シーケンスの長さの変動を判断します。
    • 変動の大きいワークロードには TTFT/ITL を、均一なワークロードには E2E レイテンシーを選択します。
    • 優先度の異なる複数のメトリクスを実装し、スケーリングの意思決定を堅牢にします。
  • 設定を段階的に調整します。

    • 最初はしきい値を控えめにし、期間を長めに設定してください。
    • 時間の経過に伴うスケーリング動作と SLO コンプライアンスを監視します。
    • 確認されたパターンとビジネス要件に基づいて設定を最適化します。
  • テストを通じて動作を検証します。

    • 現実的なシーケンス長の分布を用いて負荷テストを実行します。
    • さまざまなトラフィックパターンでのスケーリングを検証します。
    • トラフィックの急増や負荷の段階的な増加などのエッジケースをテストします。
2.4.5.2. 適切なスライディングウィンドウの選択

スライディングウィンドウの長さとは、スケーリングの決定を行うためにメトリクスが集計または評価される期間のことです。スライディングウィンドウの長さは、スケーリングの応答性と安定性に影響します。

理想的なウィンドウの長さは、使用するメトリクスによって異なります。

  • Time to First Token (TTFT) と Inter-Token Latency (ITL) のメトリクスの場合、ノイズが少ないため、より短いウィンドウ (1 - 2 分) を使用できます。
  • エンドツーエンドのレイテンシーメトリクスの場合、シーケンスの長さの変動を考慮するために、より長いウィンドウ (4 - 5 分) が必要です。
Expand
ウィンドウの長さ特徴最適な用途

短い (30 秒未満)

メトリクススクレイピング間隔が長すぎる場合、自動スケーリングは効果的にトリガーされません。

推奨されません。

中 (60 秒)

負荷の変化に迅速に対応しますが、コストが高くなる可能性があります。急速なスケールアップとスケールダウン (スラッシングとも呼ばれる) を引き起こす可能性があります。

急激で予測できない急増を伴うワークロード。

長い (4 分以上)

不要なスケーリングを削減しながら、応答性と安定性のバランスをとります。短期間での急増を検知できず、負荷の変化への適応が遅れる可能性があります。

中程度の変動性がある実稼働ワークロード。

2.4.5.3. HPA スケールダウン設定の最適化

効果的なスケールダウン設定は、コストの最適化とリソースの効率化に不可欠です。クラスターの負荷を軽減するためにアイドル状態の Pod を早期に終了する必要性と、コールドスタート時間を回避するために Pod を保持する配慮とのバランスを考慮する必要があります。スケールダウンのための Horizontal Pod Autoscaler (HPA) 設定は、アイドル状態の Pod を速やかに削除し、不要なリソースの使用を防ぐ上で重要な役割を果たします。

KEDA scaledObject カスタムリソース (CR) を管理することで、HPA のスケールダウン動作を制御できます。このカスタムリソース (CR) により、特定のワークロードのイベント駆動型の自動スケーリングが可能になります。

HPA がスケールダウンする前に待機する時間を設定するには、次の例に示すように stabilizationWindowSeconds フィールドを調整します。

apiVersion: keda.sh/v1alpha1
kind: ScaledObject
metadata:
  name: my-app-scaler
spec:
  advanced:
    horizontalPodAutoscalerConfig:
      behavior:
        scaleDown:
          stabilizationWindowSeconds: 300
Copy to Clipboard Toggle word wrap
2.4.5.4. 最適なスケーリングのためのモデルサイズの考慮

モデルのサイズは、自動スケーリングの動作とリソースの使用に影響します。次の表では、さまざまなモデルサイズの一般的な特性と、AI 推論ワークロードにメトリクスベースの自動スケーリングを実装するときに選択するスケーリングストラテジーを説明します。

Expand
モデルサイズメモリーフットプリントスケーリングストラテジーコールドスタート時間

小 (3B 未満)

6 GiB 未満

リソースバッファーを低くして積極的なスケーリングを使用します。

ダウンロードには最大 10 分、読み込みには 30 秒かかります。

中 (3B-10B)

6-20 GiB

より保守的なスケーリングストラテジーを使用します。

ダウンロードには最大 30 分、読み込みには 1 分かかります。

大規模 (10B 以上)

20 GiB を超える

モデルのシャーディングまたは量子化が必要になる場合があります。

ダウンロードには最大数時間、ロードには数分かかります。

パラメーター数が 30 億未満のモデルの場合、次のストラテジーを使用してコールドスタートの待機時間を削減できます。

  • 実行時にモデルをダウンロードするのではなく、イメージに直接モデルを埋め込むことでコンテナーイメージを最適化します。また、マルチステージビルドを使用して最終的なイメージサイズを縮小し、イメージレイヤーのキャッシュを使用してコンテナーのプルを高速化することもできます。
  • 永続ボリューム要求 (PVC) 上のモデルをキャッシュして、レプリカ間でストレージを共有します。PVC を使用してキャッシュされたモデルにアクセスするように推論サービスを設定します。

2.5. Grafana を使用してモデルのパフォーマンスを監視する

Grafana メトリクスダッシュボードをデプロイして、モデルのパフォーマンスとリソースの使用状況を監視できます。メトリクスダッシュボードを使用すると、モデルを提供するランタイムとハードウェアアクセラレーターの主要なメトリクスを視覚化できます。

2.5.1. Grafana メトリクスダッシュボードのデプロイ

ユーザーワークロードモニタリング (UWM) 用の Grafana メトリクスダッシュボードをデプロイし、シングルモデルサービングプラットフォームにデプロイされたモデルのパフォーマンスとリソース使用状況のメトリクスを監視できます。

この例 のように Kustomize オーバーレイを作成できます。オーバーレイを使用して、OpenVino Model Server (OVMS) および vLLM でデプロイされたモデル用の事前設定されたメトリクスダッシュボードをデプロイします。

前提条件

  • OpenShift クラスターのクラスター管理者権限がある。
  • OpenShift コマンドラインインターフェイス (CLI) がインストールされている。詳細は、OpenShift CLI のインストール (OpenShift Dedicated) または OpenShift CLI のインストール (Red Hat OpenShift Service on AWS) を参照してください。
  • この例 のように、Grafana インスタンスをデプロイするためのオーバーレイを作成している。

    注記

    GPU メトリクスを表示するには、Enabling the GPU monitoring dashboard の説明に従って、NVIDIA GPU モニタリングダッシュボードを有効にする必要があります。GPU モニタリングダッシュボードは、GPU ノードの GPU 使用率、メモリー使用量、およびその他のメトリクスの包括的なビューを提供します。

手順

  1. ターミナルウィンドウで、クラスター管理者として OpenShift CLI にログインします。
  2. Grafana Operator およびメトリクスダッシュボードをインストールするためのオーバーレイをまだ作成していない場合は、RHOAI UWM リポジトリー を参照して作成します。
  3. 作成したオーバーレイを使用して、Grafana インスタンスおよびメトリクスダッシュボードを OpenShift クラスターにインストールします。<overlay-name> は、オーバーレイの名前に置き換えます。

    oc apply -k overlays/<overlay-name>
    Copy to Clipboard Toggle word wrap
  4. Grafana インスタンスの URL を取得します。<namespace> は、Grafana インスタンスが含まれる namespace に置き換えます。

    oc get route -n <namespace> grafana-route -o jsonpath='{.spec.host}'
    Copy to Clipboard Toggle word wrap
  5. URL を使用して Grafana インスタンスにアクセスします。

    grafana-<namespace>.apps.example-openshift.com
    Copy to Clipboard Toggle word wrap

検証

  • Grafana インスタンスの KServe、vLLM、および OVMS で利用可能な事前設定されたダッシュボードにアクセスできます。

2.5.2. Grafana インスタンスへの vLLM/GPU メトリクスダッシュボードのデプロイ

アクセラレーターと vLLM のパフォーマンスメトリクスを監視するために Grafana ボードをデプロイします。

前提条件

  • Grafana メトリクスダッシュボードのデプロイ の説明に従って、Grafana メトリクスダッシュボードをデプロイした。
  • Grafana インスタンスにアクセスできる。
  • 設定ファイル内の環境変数を置き換えるために使用されるコマンドラインツールである envsubst をインストールした。詳細は、GNU の gettext ドキュメントを参照してください。

手順

  1. 次の例のように、YAML ファイルで GrafanaDashboard オブジェクトを定義します。

    1. NVIDIA アクセラレーターのメトリクスを監視するには、nvidia-vllm-dashboard.yaml を参照してください。
    2. AMD アクセラレーターのメトリクスを監視するには、amd-vllm-dashboard.yaml を参照してください。
    3. Intel アクセラレーターのメトリクスを監視するには、gaudi-vllm-dashboard.yaml を参照してください。
    4. vLLM メトリクスを監視するには、grafana-vllm-dashboard.yaml を参照してください。
  2. 以下の例のような inputs.env ファイルを作成します。NAMESPACE パラメーターおよび MODEL_NAME パラメーターを独自の値に置き換えます。

    NAMESPACE=<namespace> 
    1
    
    MODEL_NAME=<model-name> 
    2
    Copy to Clipboard Toggle word wrap
    1
    NAMESPACE は、モデルがデプロイされるターゲット namespace です。
    2
    MODEL_NAME は、InferenceService で定義されているモデル名です。モデル名は、Grafana ダッシュボードで Pod 名をフィルタリングするためにも使用されます。
  3. 以下のアクションを実行して、YAML ファイルの NAMESPACE パラメーターおよび MODEL_NAME パラメーターを inputs.env ファイルの値に置き換えます。

    1. inputs.env に記載されているパラメーターを環境変数としてエクスポートします。

      export $(cat inputs.env | xargs)
      Copy to Clipboard Toggle word wrap
    2. 次の YAML ファイルを更新し、${NAMESPACE} および ${MODEL_NAME} 変数をエクスポートされた環境変数の値に置き換え、dashboard_template.yaml を先ほど作成した GrafanaDashboard オブジェクト YAML ファイルの名前に置き換えます。

      envsubst '${NAMESPACE} ${MODEL_NAME}' < dashboard_template.yaml > dashboard_template-replaced.yaml
      Copy to Clipboard Toggle word wrap
  4. YAML ファイルに更新された値が含まれていることを確認します。
  5. ダッシュボードオブジェクトをデプロイします。

    oc create -f dashboard_template-replaced.yaml
    Copy to Clipboard Toggle word wrap

検証

Grafana インスタンスでアクセラレーターと vLLM メトリクスダッシュボードを表示できます。

2.5.3. Grafana メトリクス

Grafana ボードを使用して、アクセラレーターおよび vLLM パフォーマンスメトリクスを監視できます。datasourceinstance および gpu は、ボード内で定義された変数です。

2.5.3.1. アクセラレーターメトリクス

アクセラレーターのメトリクスを追跡して、ハードウェアの健全性を確認します。

NVIDIA GPU の使用率

GPU が実際にタスクを処理している時間の割合を追跡し、GPU のワークロードレベルを示します。

Query

DCGM_FI_DEV_GPU_UTIL{instance=~"$instance", gpu=~"$gpu"}
Copy to Clipboard Toggle word wrap
NVIDIA GPU メモリー使用率

メモリー使用量と空きメモリーを比較します。これは、GPU を多用するワークロードでのメモリーのボトルネックを特定するために重要です。

Query

DCGM_FI_DEV_POWER_USAGE{instance=~"$instance", gpu=~"$gpu"}
Copy to Clipboard Toggle word wrap

Sum

sum(DCGM_FI_DEV_POWER_USAGE{instance=~"$instance", gpu=~"$gpu"})
Copy to Clipboard Toggle word wrap
NVIDIA GPU の温度

ハードウェアの劣化を防ぐために、GPU が安全な熱制限内で動作されるようにします。

Query

DCGM_FI_DEV_GPU_TEMP{instance=~"$instance", gpu=~"$gpu"}
Copy to Clipboard Toggle word wrap

Avg

avg(DCGM_FI_DEV_GPU_TEMP{instance=~"$instance", gpu=~"$gpu"})
Copy to Clipboard Toggle word wrap
NVIDIA GPU スロットリング

GPU スロットリングは、GPU が過熱による損傷を避けるために自動的にクロック (動作周波数) を下げるときに発生します。

GPU スロットリングを識別するには、次のメトリクスを使用できます。

  • GPU temperature: GPU 温度を監視します。スロットリングは、GPU が特定の温度 (たとえば 85 - 90°C) に達したときによく発生します。
  • SM clock speed: コアクロック速度を監視します。GPU に負荷がかかっているときにクロック速度が大幅に低下すると、スロットリングが発生していることを示します。
2.5.3.2. CPU メトリクス

CPU のメトリクスを追跡して、ハードウェアの健全性を確認できます。

CPU の使用率

CPU 使用率を追跡して、CPU に依存するワークロードを識別します。

Query

sum(rate(container_cpu_usage_seconds_total{namespace="$namespace", pod=~"$model_name.*"}[5m])) by (namespace)
Copy to Clipboard Toggle word wrap
CPU-GPU ボトルネック

CPU スロットリングと GPU 使用率メトリクスを組み合わせることで、リソース割り当ての非効率性を特定します。次の表は、CPU スロットリングと GPU 使用率の組み合わせと、お使いの環境でこれらのメトリクスが何を意味するのかを示しています。

Expand
CPU スロットリングGPU の使用率意味

Low

High

システムを適切に分散します。GPU は CPU の制約なしに最大限に活用されます。

High

Low

CPU リソースが制限されています。CPU が GPU の処理要求に対応できず、GPU が十分に活用されない可能性があります。

High

High

CPU と GPU の両方のワークロードが増えているため、リソースをスケールアップする必要がある可能性があります。

Query

sum(rate(container_cpu_cfs_throttled_seconds_total{namespace="$namespace", pod=~"$model_name.*"}[5m])) by (namespace)
avg_over_time(DCGM_FI_DEV_GPU_UTIL{instance=~"$instance", gpu=~"$gpu"}[5m])
Copy to Clipboard Toggle word wrap
2.5.3.3. vLLM メトリクス

vLLM モデルに関連するメトリクスを追跡できます。

GPU と CPU のキャッシュ使用率

vLLM モデルによって使用される GPU メモリーの割合を追跡し、メモリー効率に関する分析情報を提供します。

Query

sum_over_time(vllm:gpu_cache_usage_perc{namespace="${namespace}",pod=~"$model_name.*"}[24h])
Copy to Clipboard Toggle word wrap
要求の実行

アクティブに処理されているリクエストの数。ワークロードの同時実行性を監視するのに役立ちます。

num_requests_running{namespace="$namespace", pod=~"$model_name.*"}
Copy to Clipboard Toggle word wrap
待機中のリクエスト

キュー内のリクエストを追跡し、システムの飽和状態を示します。

num_requests_waiting{namespace="$namespace", pod=~"$model_name.*"}
Copy to Clipboard Toggle word wrap
接頭辞キャッシュヒット率

ヒット率が高い場合、キャッシュされた計算が効率的に再利用され、リソースの使用が最適化されます。

クエリー

vllm:gpu_cache_usage_perc{namespace="$namespace", pod=~"$model_name.*", model_name="$model_name"}
vllm:cpu_cache_usage_perc{namespace="$namespace", pod=~"$model_name.*", model_name="$model_name"}
Copy to Clipboard Toggle word wrap
リクエストの合計数

クエリー

vllm:request_success_total{finished_reason="length",namespace="$namespace", pod=~"$model_name.*", model_name="$model_name"}
Copy to Clipboard Toggle word wrap

モデル推論に設定された最大トークン制限に達したため、リクエストは終了しました。

クエリー

vllm:request_success_total{finished_reason="stop",namespace="$namespace", pod=~"$model_name.*", model_name="$model_name"}
Copy to Clipboard Toggle word wrap

モデルの出力または停止条件 (文の終わりやトークンの完了など) に基づいて、リクエストが自然に完了しました。

エンドツーエンドのレイテンシー
最適なユーザーエクスペリエンスを実現するために、リクエストの全体の処理時間を測定します。

ヒストグラムクエリー

histogram_quantile(0.99, sum by(le) (rate(vllm:e2e_request_latency_seconds_bucket{namespace="$namespace", pod=~"$model_name.*", model_name="$model_name"}[5m])))
histogram_quantile(0.95, sum by(le) (rate(vllm:e2e_request_latency_seconds_bucket{namespace="$namespace", pod=~"$model_name.*", model_name="$model_name"}[5m])))
histogram_quantile(0.9, sum by(le) (rate(vllm:e2e_request_latency_seconds_bucket{namespace="$namespace", pod=~"$model_name.*", model_name="$model_name"}[5m])))
histogram_quantile(0.5, sum by(le) (rate(vllm:e2e_request_latency_seconds_bucket{namespace="$namespace", pod=~"$model_name.*", model_name="$model_name"}[5m])))
rate(vllm:e2e_request_latency_seconds_sum{namespace="$namespace", pod=~"$model_name.*",model_name="$model_name"}[5m])
rate(vllm:e2e_request_latency_seconds_count{namespace="$namespace", pod=~"$model_name.*", model_name="$model_name"}[5m])
Copy to Clipboard Toggle word wrap
Time to First Token (TTFT) のレイテンシー

応答の最初のトークンを生成するのにかかる時間。

ヒストグラムクエリー

histogram_quantile(0.99, sum by(le) (rate(vllm:time_to_first_token_seconds_bucket{namespace="$namespace", pod=~"$model_name.*", model_name="$model_name"}[5m])))
histogram_quantile(0.95, sum by(le) (rate(vllm:time_to_first_token_seconds_bucket{namespace="$namespace", pod=~"$model_name.*", model_name="$model_name"}[5m])))
histogram_quantile(0.9, sum by(le) (rate(vllm:time_to_first_token_seconds_bucket{namespace="$namespace", pod=~"$model_name.*", model_name="$model_name"}[5m])))
histogram_quantile(0.5, sum by(le) (rate(vllm:time_to_first_token_seconds_bucket{namespace="$namespace", pod=~"$model_name.*", model_name="$model_name"}[5m])))
rate(vllm:time_to_first_token_seconds_sum{namespace="$namespace", pod=~"$model_name.*", model_name="$model_name"}[5m])
rate(vllm:time_to_first_token_seconds_count{namespace="$namespace", pod=~"$model_name.*", model_name="$model_name"}[5m])
Copy to Clipboard Toggle word wrap
出力トークンあたりの時間 (TPOT) のレイテンシー

各出力トークンを生成するのにかかる平均時間。

ヒストグラムクエリー

histogram_quantile(0.99, sum by(le) (rate(vllm:time_per_output_token_seconds_bucket{namespace="$namespace", pod=~"$model_name.*", model_name="$model_name"}[5m])))
histogram_quantile(0.95, sum by(le) (rate(vllm:time_per_output_token_seconds_bucket{namespace="$namespace", pod=~"$model_name.*", model_name="$model_name"}[5m])))
histogram_quantile(0.9, sum by(le) (rate(vllm:time_per_output_token_seconds_bucket{namespace="$namespace", pod=~"$model_name.*", model_name="$model_name"}[5m])))
histogram_quantile(0.5, sum by(le) (rate(vllm:time_per_output_token_seconds_bucket{namespace="$namespace", pod=~"$model_name.*", model_name="$model_name"}[5m])))
rate(vllm:time_per_output_token_seconds_sum{namespace="$namespace", pod=~"$model_name.*", model_name="$model_name"}[5m])
rate(vllm:time_per_output_token_seconds_count{namespace="$namespace", pod=~"$model_name.*", model_name="$model_name"}[5m])
Copy to Clipboard Toggle word wrap
プロンプトトークンのスループットと生成スループット

LLM 最適化のプロンプトトークンの処理速度を追跡します。

クエリー

rate(vllm:prompt_tokens_total{namespace="$namespace", pod=~"$model_name.*", model_name="$model_name"}[5m])
rate(vllm:generation_tokens_total{namespace="$namespace", pod=~"$model_name.*", model_name="$model_name"}[5m])
Copy to Clipboard Toggle word wrap
生成されたトークンの合計
リアルタイムアプリケーションにとって重要な、応答トークンの生成効率を測定します。

Query

sum(vllm:generation_tokens_total{namespace="$namespace", pod=~"$model_name.*", model_name="$model_name"})
Copy to Clipboard Toggle word wrap

第3章 NVIDIA NIM モデルサービングプラットフォームでのモデルの管理と監視

クラスター管理者は、NVIDIA NIM モデルサービスプラットフォームのモデルを管理および監視できます。NVIDIA NIM モデルの選択オプションをカスタマイズしたり、NIM モデルのメトリクスを有効にしたり、その他のタスクを実行できます。

3.1. NVIDIA NIM モデルサービングプラットフォームのモデル選択オプションのカスタマイズ

NVIDIA NIM モデルサービスプラットフォームでは、NVIDIA GPU Cloud (NGC) から利用可能なすべての NVIDIA NIM モデルを利用できます。NIM モデルは Deploy model ダイアログの NVIDIA NIM リストから選択してデプロイできます。リストに表示されるモデルをカスタマイズするには、希望するモデルを指定して ConfigMap オブジェクトを作成します。

前提条件

  • OpenShift クラスターのクラスター管理者権限を持っている。
  • NVIDIA Cloud Account (NCA) をお持ちで、NVIDIA GPU Cloud (NGC) ポータルにアクセスできる。
  • NVIDIA NIM モデルサービスプラットフォームで選択できる NVIDIA NIM モデルの ID を知っている。

    注記
    • モデル ID は NGC Catalog で確認できます。ID は通常 URL パスの一部です。
    • モデル ID は、NGC CLI を使用して検索することもできます。詳細は、NGC CLI リファレンス を参照してください。
  • Account のカスタムリソース (CR) の名前と namespace を知っている。

手順

  1. ターミナルウィンドウで、以下の例のように、クラスター管理者として OpenShift CLI にログインします。

    oc login <openshift_cluster_url> -u <admin_username> -p <password>
    Copy to Clipboard Toggle word wrap
  2. 次の例のような、NVIDIA NIM モデルサービスプラットフォームで選択できるようにするモデル ID を含む ConfigMap オブジェクトを YAML ファイルで定義します。

    apiVersion: v1
    kind: ConfigMap
    metadata:
     name: nvidia-nim-enabled-models
    data:
     models: |-
        [
        "mistral-nemo-12b-instruct",
        "llama3-70b-instruct",
        "phind-codellama-34b-v2-instruct",
        "deepseek-r1",
        "qwen-2.5-72b-instruct"
        ]
    Copy to Clipboard Toggle word wrap
  3. Account CR の名前および namespace を確認します。

    oc get account -A
    Copy to Clipboard Toggle word wrap

    次の例のような出力が表示されます。

    NAMESPACE         NAME       TEMPLATE  CONFIGMAP  SECRET
    redhat-ods-applications  odh-nim-account
    Copy to Clipboard Toggle word wrap
  4. ConfigMap オブジェクトを Account CR と同じ namespace にデプロイします。

    oc apply -f <configmap-name> -n <namespace>
    Copy to Clipboard Toggle word wrap

    <configmap-name> は YAML ファイルの名前に、<namespace>Account CR の namespace に置き換えます。

  5. 以前に作成した ConfigMap オブジェクトを、Account CR の spec.modelListConfig セクションに追加します。

    oc patch account <account-name> \
      --type='merge' \
      	-p '{"spec": {"modelListConfig": {"name": "<configmap-name>"}}}'
    Copy to Clipboard Toggle word wrap

    <account-name>Account CR の名前に、<configmap-name>ConfigMap オブジェクトに置き換えます。

  6. ConfigMap オブジェクトが Account CR に追加されたことを確認します。

    oc get account <account-name> -o yaml
    Copy to Clipboard Toggle word wrap

    以下の出力のように、Account CR の spec.modelListConfig セクションに ConfigMap オブジェクトが表示されます。

    spec:
     enabledModelsConfig:
     modelListConfig:
      name: <configmap-name>
    Copy to Clipboard Toggle word wrap

検証

3.2. 既存の NIM デプロイメントの NVIDIA NIM メトリクスの有効化

以前に OpenShift AI に NIM モデルをデプロイし、その後、最新バージョンにアップグレードした場合は、メトリクスの収集とグラフの生成を有効にするアノテーションを追加して、既存のデプロイメントに対して NIM メトリクスを手動で有効にする必要があります。

注記

最新バージョンの OpenShift AI では、新しいデプロイメントに対して NIM メトリクスとグラフが自動的に有効になります。

3.2.1. 既存の既存の NIM デプロイメントのグラフ生成の有効化

次の手順では、既存の NIM デプロイメントでグラフ生成を有効にする方法を説明します。

前提条件

  • OpenShift クラスターのクラスター管理者権限を持っている。
  • OpenShift コマンドラインインターフェイス (CLI) をダウンロードしてインストールした。詳細は、OpenShift CLI のインストール (Red Hat OpenShift Dedicated) または OpenShift CLI のインストール (Red Hat OpenShift Service on AWS) を参照してください。
  • OpenShift AI に既存の NIM デプロイメントがある。

手順

  1. ターミナルウィンドウで、クラスター管理者として OpenShift クラスターにまだログインしていない場合は、OpenShift CLI にログインします。
  2. NIM デプロイメントに関連付けられている ServingRuntime の名前を確認します。

    oc get servingruntime -n <namespace>
    Copy to Clipboard Toggle word wrap

    <namespace> は、NIM モデルがデプロイされているプロジェクトの namespace に置き換えます。

  3. ServingRuntime 設定に既存の metadata.annotations セクションがあるかどうかを確認します。

    oc get servingruntime -n  <namespace> <servingruntime-name> -o json | jq '.metadata.annotations'
    Copy to Clipboard Toggle word wrap

    <servingruntime-name> は、前の手順の ServingRuntime の名前に置き換えます。

  4. 次のいずれかの操作を実行します。

    1. 設定に metadata.annotations セクションが存在しない場合は、必要なアノテーションを含むセクションを追加します。

      oc patch servingruntime -n <namespace> <servingruntime-name> --type json --patch \
       '[{"op": "add", "path": "/metadata/annotations", "value": {"runtimes.opendatahub.io/nvidia-nim": "true"}}]'
      Copy to Clipboard Toggle word wrap

      以下のような出力が表示されます。

      servingruntime.serving.kserve.io/nim-serving-runtime patched
      Copy to Clipboard Toggle word wrap
    2. 既存の metadata.annotations セクションがある場合は、必要なアノテーションをセクションに追加します。

      oc patch servingruntime -n <project-namespace> <runtime-name> --type json --patch \
       '[{"op": "add", "path": "/metadata/annotations/runtimes.opendatahub.io~1nvidia-nim", "value": "true"}]'
      Copy to Clipboard Toggle word wrap

      以下のような出力が表示されます。

      servingruntime.serving.kserve.io/nim-serving-runtime patched
      Copy to Clipboard Toggle word wrap

検証

  • アノテーションが既存の NIM デプロイメントの ServingRuntime に追加されていることを確認します。

    oc get servingruntime -n <namespace> <servingruntime-name> -o json | jq '.metadata.annotations'
    Copy to Clipboard Toggle word wrap

    追加したアノテーションが出力に表示されます。

    ...
    "runtimes.opendatahub.io/nvidia-nim": "true"
    Copy to Clipboard Toggle word wrap
    注記

    メトリクスをグラフ生成に使用できるようにするには、デプロイメントでメトリクスの収集も有効にする必要があります。既存の NIM デプロイメントのメトリクス収集を有効にする を参照してください。

3.2.2. 既存の NIM デプロイメントのメトリクス収集を有効にする

既存の NIM デプロイメントのメトリクス収集を有効にするには、デプロイメントの InferenceService に Prometheus エンドポイントとポートアノテーションを手動で追加する必要があります。

次の手順では、NIM デプロイメントの InferenceService に必要な Prometheus アノテーションを追加する方法を説明します。

前提条件

  • OpenShift クラスターのクラスター管理者権限を持っている。
  • OpenShift コマンドラインインターフェイス (CLI) をダウンロードしてインストールした。詳細は、OpenShift CLI のインストール (Red Hat OpenShift Dedicated) または OpenShift CLI のインストール (Red Hat OpenShift Service on AWS) を参照してください。
  • OpenShift AI に既存の NIM デプロイメントがある。

手順

  1. ターミナルウィンドウで、クラスター管理者として OpenShift クラスターにまだログインしていない場合は、OpenShift CLI にログインします。
  2. NIM デプロイメントに関連付けられている InferenceService の名前を確認します。

    oc get inferenceservice -n <namespace>
    Copy to Clipboard Toggle word wrap

    <namespace> は、NIM モデルがデプロイされているプロジェクトの namespace に置き換えます。

  3. InferenceService 設定に spec.predictor.annotations セクションが存在するかどうかを確認します。

    oc get inferenceservice -n <namespace> <inferenceservice-name> -o json | jq '.spec.predictor.annotations'
    Copy to Clipboard Toggle word wrap

    <inferenceservice-name> は、前の手順の InferenceService の名前に置き換えます。

  4. 次のいずれかの操作を実行します。

    1. 設定に spec.predictor.annotations セクションが存在しない場合は、そのセクションと必要なアノテーションを追加します。

      oc patch inferenceservice -n <namespace> <inference-name> --type json --patch \
       '[{"op": "add", "path": "/spec/predictor/annotations", "value": {"prometheus.io/path": "/metrics", "prometheus.io/port": "8000"}}]'
      Copy to Clipboard Toggle word wrap

      追加したアノテーションが出力に表示されます。

      inferenceservice.serving.kserve.io/nim-serving-runtime patched
      Copy to Clipboard Toggle word wrap
    2. 既存の spec.predictor.annotations セクションがある場合は、そのセクションに Prometheus アノテーションを追加します。

      oc patch inferenceservice -n <namespace> <inference-service-name> --type json --patch \
       '[{"op": "add", "path": "/spec/predictor/annotations/prometheus.io~1path", "value": "/metrics"},
       {"op": "add", "path": "/spec/predictor/annotations/prometheus.io~1port", "value": "8000"}]'
      Copy to Clipboard Toggle word wrap

      追加したアノテーションが出力に表示されます。

      inferenceservice.serving.kserve.io/nim-serving-runtime patched
      Copy to Clipboard Toggle word wrap

検証

  • アノテーションが InferenceService に追加されていることを確認します。

    oc get inferenceservice -n <namespace> <inferenceservice-name> -o json | jq '.spec.predictor.annotations'
    Copy to Clipboard Toggle word wrap

    出力に追加したアノテーションが表示されます。

    {
      "prometheus.io/path": "/metrics",
      "prometheus.io/port": "8000"
    }
    Copy to Clipboard Toggle word wrap

法律上の通知

Copyright © 2025 Red Hat, Inc.
The text of and illustrations in this document are licensed by Red Hat under a Creative Commons Attribution–Share Alike 3.0 Unported license ("CC-BY-SA"). An explanation of CC-BY-SA is available at http://creativecommons.org/licenses/by-sa/3.0/. In accordance with CC-BY-SA, if you distribute this document or an adaptation of it, you must provide the URL for the original version.
Red Hat, as the licensor of this document, waives the right to enforce, and agrees not to assert, Section 4d of CC-BY-SA to the fullest extent permitted by applicable law.
Red Hat, Red Hat Enterprise Linux, the Shadowman logo, the Red Hat logo, JBoss, OpenShift, Fedora, the Infinity logo, and RHCE are trademarks of Red Hat, Inc., registered in the United States and other countries.
Linux® is the registered trademark of Linus Torvalds in the United States and other countries.
Java® is a registered trademark of Oracle and/or its affiliates.
XFS® is a trademark of Silicon Graphics International Corp. or its subsidiaries in the United States and/or other countries.
MySQL® is a registered trademark of MySQL AB in the United States, the European Union and other countries.
Node.js® is an official trademark of Joyent. Red Hat is not formally related to or endorsed by the official Joyent Node.js open source or commercial project.
The OpenStack® Word Mark and OpenStack logo are either registered trademarks/service marks or trademarks/service marks of the OpenStack Foundation, in the United States and other countries and are used with the OpenStack Foundation's permission. We are not affiliated with, endorsed or sponsored by the OpenStack Foundation, or the OpenStack community.
All other trademarks are the property of their respective owners.
Red Hat logoGithubredditYoutubeTwitter

詳細情報

試用、購入および販売

コミュニティー

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

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

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

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

会社概要

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

Theme

© 2026 Red Hat
トップに戻る