3.10. KServe の raw デプロイメントモードを使用してシングルノードの OpenShift にモデルをデプロイする


シングルノードの OpenShift で KServe の raw デプロイメントモードを使用して機械学習モデルをデプロイできます。raw デプロイメントモードには、複数のボリュームをマウントする機能など、Knative に比べていくつかのメリットがあります。

重要

シングルノード OpenShift で KServe の raw デプロイメントモードを使用して機械学習モデルをデプロイすることは、限定提供機能です。限定提供とは、Red Hat AI Business Unit からの特別な承認を得た場合にのみ、対象となる機能をインストールしてサポートを受けることができることを意味します。このような承認がない場合、この機能はサポートされません。

前提条件

  • Red Hat OpenShift AI にログインしている。
  • OpenShift クラスターのクラスター管理者権限を持っている。
  • 少なくとも 4 つの CPU と 16 GB のメモリーを備えたノードを持つ OpenShift クラスターを作成している。
  • Red Hat OpenShift AI (RHOAI) Operator がインストールされている。
  • OpenShift コマンドラインインターフェイス (CLI) がインストールされている。OpenShift コマンドラインインターフェイス (CLI) のインストールに関する詳細は、OpenShift CLI のスタートガイド を参照してください。
  • KServe をインストールしている。
  • S3 互換オブジェクトストレージにアクセスできる。
  • デプロイするモデルについて、S3 互換オブジェクトストレージバケット内の関連フォルダーパスを把握している。
  • Caikit-TGIS ランタイムを使用するために、モデルを Caikit 形式に変換している。例は、caikit-tgis-serving リポジトリーの Converting Hugging Face Hub models to Caikit format を参照してください。
  • モデルサーバーでグラフィックスプロセッシングユニット (GPU) を使用する場合は、OpenShift AI で GPU サポートを有効にしている。NVIDIA GPU の有効化 を参照してください。
  • vLLM ランタイムを使用するには、OpenShift AI で GPU サポートを有効にし、クラスターに Node Feature Discovery Operator をインストールして設定しておく。詳細は、Node Feature Discovery Operator のインストールNVIDIA GPU の有効化 を参照してください。

手順

  1. コマンドラインターミナルを開き、クラスター管理者として OpenShift クラスターにログインします。

    $ oc login <openshift_cluster_url> -u <admin_username> -p <password>
  2. デフォルトでは、OpenShift はネットワークトラフィック管理にサービスメッシュを使用します。KServe の raw デプロイメントモードではサービスメッシュは必要ないため、Red Hat OpenShift Service Mesh を無効にします。

    1. Red Hat OpenShift Service Mesh を無効にするには、次のコマンドを入力します。

      $ oc edit dsci -n redhat-ods-operator
    2. YAML エディターで、serviceMesh コンポーネントの managementState の値を次のように Removed に変更します。

      spec:
        components:
          serviceMesh:
            managementState: Removed
    3. 変更を保存します。
  3. プロジェクトを作成します。

    $ oc new-project <project_name> --description="<description>" --display-name="<display_name>"

    プロジェクトの作成に関する詳細は、プロジェクトの使用 を参照してください。

  4. データサイエンスクラスターを作成します。

    1. Red Hat OpenShift Web コンソールの Administrator ビューで、Operators Installed Operators をクリックし、Red Hat OpenShift AI Operator をクリックします。
    2. Data Science Cluster タブをクリックします。
    3. Create DataScienceCluster ボタンをクリックします。
    4. Configure via フィールドで、YAML view ラジオボタンをクリックします。
    5. YAML エディターの spec.components セクションで、kserve コンポーネントを次のように設定します。

        kserve:
          defaultDeploymentMode: RawDeployment
          managementState: Managed
          serving:
            managementState: Removed
            name: knative-serving
    6. Create をクリックします。
  5. シークレットファイルを作成します。

    1. コマンドラインターミナルで、シークレットを格納する YAML ファイルを作成し、次の YAML コードを追加します。

      apiVersion: v1
      kind: Secret
      metadata:
        annotations:
          serving.kserve.io/s3-endpoint: <AWS_ENDPOINT>
          serving.kserve.io/s3-usehttps: "1"
          serving.kserve.io/s3-region: <AWS_REGION>
          serving.kserve.io/s3-useanoncredential: "false"
        name: <Secret-name>
      stringData:
        AWS_ACCESS_KEY_ID: "<AWS_ACCESS_KEY_ID>"
        AWS_SECRET_ACCESS_KEY: "<AWS_SECRET_ACCESS_KEY>"
      重要

      切断されたデプロイメントで機械学習モデルをデプロイする場合は、metadata.annotations セクションに serving.kserve.io/s3-verifyssl: '0' を追加します。

    2. ファイルを secret.yaml というファイル名で保存します。
    3. secret.yaml ファイルを適用します。

      $ oc apply -f secret.yaml -n <namespace>
  6. サービスアカウントを作成します。

    1. サービスアカウントを格納する YAML ファイルを作成し、次の YAML コードを追加します。

      apiVersion: v1
      kind: ServiceAccount
      metadata:
        name: models-bucket-sa
      secrets:
      - name: s3creds

      サービスアカウントの詳細は、サービスアカウントの理解と作成 を参照してください。

    2. ファイルを serviceAccount.yaml というファイル名で保存します。
    3. serviceAccount.yaml ファイルを適用します。

      $ oc apply -f serviceAccount.yaml -n <namespace>
  7. モデルの予測を提供するコンテナーイメージを定義するために、サービングランタイム用の YAML ファイルを作成します。以下は OpenVINO Model Server の使用例です。

    apiVersion: serving.kserve.io/v1alpha1
    kind: ServingRuntime
    metadata:
      name: ovms-runtime
    spec:
      annotations:
        prometheus.io/path: /metrics
        prometheus.io/port: "8888"
      containers:
        - args:
            - --model_name={{.Name}}
            - --port=8001
            - --rest_port=8888
            - --model_path=/mnt/models
            - --file_system_poll_wait_seconds=0
            - --grpc_bind_address=0.0.0.0
            - --rest_bind_address=0.0.0.0
            - --target_device=AUTO
            - --metrics_enable
          image: quay.io/modh/openvino_model_server@sha256:6c7795279f9075bebfcd9aecbb4a4ce4177eec41fb3f3e1f1079ce6309b7ae45
          name: kserve-container
          ports:
            - containerPort: 8888
              protocol: TCP
      multiModel: false
      protocolVersions:
        - v2
        - grpc-v2
      supportedModelFormats:
        - autoSelect: true
          name: openvino_ir
          version: opset13
        - name: onnx
          version: "1"
        - autoSelect: true
          name: tensorflow
          version: "1"
        - autoSelect: true
          name: tensorflow
          version: "2"
        - autoSelect: true
          name: paddle
          version: "2"
        - autoSelect: true
          name: pytorch
          version: "2"
    1. 上記の OpenVINO Model Server の例を使用している場合は、YAML コード内のプレースホルダーに必要な正しい値を挿入していることを確認してください。
    2. 適切なファイル名でファイルを保存します。
    3. サービングランタイムを含むファイルを適用します。

      $ oc apply -f <serving run time file name> -n <namespace>
  8. InferenceService カスタムリソース (CR) を作成します。InferenceService CR を含むための YAML ファイルを作成します。以前使用した OpenVINO Model Server の例を使用する場合の対応する YAML コードは、次のとおりです。

    apiVersion: serving.kserve.io/v1beta1
    kind: InferenceService
    metadata:
      annotations:
        serving.knative.openshift.io/enablePassthrough: "true"
        sidecar.istio.io/inject: "true"
        sidecar.istio.io/rewriteAppHTTPProbers: "true"
        serving.kserve.io/deploymentMode: RawDeployment
      name: <InferenceService-Name>
    spec:
      predictor:
        scaleMetric:
        minReplicas: 1
        scaleTarget:
        canaryTrafficPercent:
        serviceAccountName: <serviceAccountName>
        model:
          env: []
          volumeMounts: []
          modelFormat:
            name: onnx
          runtime: ovms-runtime
          storageUri: s3://<bucket_name>/<model_directory_path>
          resources:
            requests:
              memory: 5Gi
        volumes: []
    1. YAML コードで、次の値が正しく設定されていることを確認します。

      • serving.kserve.io/deploymentMode には、RawDeployment の値が含まれている必要があります。
      • modelFormat には、onnx などのモデル形式の値が含まれている必要があります。
      • storageUri には、モデルの s3 ストレージディレクトリーの値 (例 s3://<bucket_name>/<model_directory_path>) が含まれている必要があります。
      • runtime には、ovms-runtime など、サービングランタイムの名前の値が含まれている必要があります。
    2. 適切なファイル名でファイルを保存します。
    3. InferenceService CR を含むファイルを適用します。

      $ oc apply -f <InferenceService CR file name> -n <namespace>
  9. クラスター内のすべての Pod が実行されていることを確認します。

    $ oc get pods -n <namespace>

    出力例:

    NAME READY STATUS RESTARTS AGE
    <isvc_name>-predictor-xxxxx-2mr5l 1/1 Running 2 165m
    console-698d866b78-m87pm 1/1 Running 2 165m
  10. すべての Pod が実行中であることを確認したら、サービスポートをローカルマシンに転送します。

    $ oc -n <namespace> port-forward pod/<pod-name> <local_port>:<remote_port>

    <namespace><pod-name><local_port><remote_port> (これは 8888 などのモデルサーバーのポート) を、デプロイメントに適した値に置き換えてください。

検証

  • 好みのクライアントライブラリーまたはツールを使用して、localhost 推論 URL にリクエストを送信します。

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

複数のノードで複数のグラフィカルプロセッシングユニット(GPU)を使用するモデルをデプロイすると、大規模な言語モデル(LLM)などの大規模なモデルをデプロイする場合に役立ちます。

この手順では、vLLM 提供フレームワークを使用して、複数の GPU ノード間で Red Hat OpenShift AI でモデルを提供する方法を説明します。マルチノードの推論は、vllm-multinode-runtime ServingRuntime をカスタムランタイムとして使用します。vllm-multinode-runtime ServingRuntime は、vllm-runtime と同じ vLLM イメージを使用し、マルチ GPU インフレーションに必要な情報が含まれます。

重要

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

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

前提条件

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

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

手順

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

    $ oc login <openshift_cluster_url> -u <admin_username> -p <password>
  2. モデルをデプロイする namespace を選択または作成します。この例では、kserve-demo が使用され、以下のコマンドを使用して作成できます。

    oc new-project kserve-demo
  3. モデルをデプロイする namespace から、モデルストレージの PVC を作成し、ストレージクラスの名前を指定します。ストレージクラスはファイルストレージである必要があります。

    注記

    PVC がすでに設定されている場合は、この手順を省略できます。

    kubectl apply -f -
    apiVersion: v1
    kind: PersistentVolumeClaim
    metadata:
      name: granite-8b-code-base-pvc
    spec:
      accessModes:
        - ReadWriteMany
      volumeMode: Filesystem
      resources:
        requests:
          storage: 50Gi
      storageClassName: __<fileStorageClassName>__
  4. モデルを PVC にダウンロードします。以下に例を示します。

    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-claim
      restartPolicy: Never
      initContainers:
        - name: fix-volume-permissions
          image: quay.io/quay/busybox@sha256:xxxxx
          command: ["sh"]
          args: ["-c", "mkdir -p /mnt/models/granite-8b-code-base && chmod -R 777 /mnt/models"]
          volumeMounts:
            - mountPath: "/mnt/models/"
              name: model-volume
      containers:
        - resources:
            requests:
              memory: 40Gi
          name: download-model
          imagePullPolicy: IfNotPresent
          image: quay.io/modh/kserve-storage-initializer@sha256:xxxxx
          args:
            - 's3://$<bucket_name>/granite-8b-code-base/'
            - /mnt/models/granite-8b-code-base
          env:
            - name: AWS_ACCESS_KEY_ID
              value: <id>
            - name: AWS_SECRET_ACCESS_KEY
              value: <secret>
            - name: BUCKET_NAME
              value: <bucket_name>
            - name: S3_USE_HTTPS
              value: "1"
            - name: AWS_ENDPOINT_URL
              value: <AWS endpoint>
            - name: awsAnonymousCredential
              value: 'false'
            - name: AWS_DEFAULT_REGION
              value: <region>
          volumeMounts:
            - mountPath: "/mnt/models/"
              name: model-volume
  5. vllm-multinode-runtime ServingRuntime をカスタムランタイムとして作成します。

    oc process vllm-multinode-runtime-template -n redhat-ods-applications|oc apply  -f -
  6. 次の InferenceService 設定を使用してモデルをデプロイします。

    apiVersion: serving.kserve.io/v1beta1
    kind: InferenceService
    metadata:
      annotations:
        serving.kserve.io/deploymentMode: RawDeployment
        serving.kserve.io/autoscalerClass: external
      name: granite-8b-code-base-pvc
    spec:
      predictor:
        model:
          modelFormat:
            name: vLLM
          runtime: vllm-multinode-runtime
          storageUri: pvc://granite-8b-code-base-pvc/hf/8b_instruction_tuned
        workerSpec: {}

    次の設定を InferenceService に追加できます。

    • workerSpec.tensorParallelSize: ノードごとに使用される GPU の数を決定します。ヘッドおよびワーカーノードのデプロイメントリソースの両方の GPU タイプカウントは自動的に更新されます。workerSpec.tensorParallelSize の値が 1 以上であることを確認します。
    • workerSpec.pipelineParallelSize: デプロイメントに関与するノードの数を決定します。この変数は、ヘッドノードとワーカーノードの両方を含むノードの総数を表します。workerSpec.pipelineParallelSize の値が 2 以上であることを確認します。

検証

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

  • 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

      応答の例

      +-----------------------------------------------------------------------------------------+
      | 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 |
      +-----------------------------------------+------------------------+----------------------+

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

  • 次のコマンドを使用して、InferenceService のステータスを確認します。

    注記

    テクノロジープレビューでは、移植にはポート転送のみを使用できます。

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

    応答の例

       NAME                 URL                                                   READY   PREV   LATEST   PREVROLLEDOUTREVISION   LATESTREADYREVISION                          AGE
       granite-8b-code-base-pvc   http://granite-8b-code-base-pvc.default.example.com

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

    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
            }"
Red Hat logoGithubRedditYoutubeTwitter

詳細情報

試用、購入および販売

コミュニティー

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

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

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

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

会社概要

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

© 2024 Red Hat, Inc.