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 の有効化 を参照してください。
手順
コマンドラインターミナルを開き、クラスター管理者として OpenShift クラスターにログインします。
$ oc login <openshift_cluster_url> -u <admin_username> -p <password>
デフォルトでは、OpenShift はネットワークトラフィック管理にサービスメッシュを使用します。KServe の raw デプロイメントモードではサービスメッシュは必要ないため、Red Hat OpenShift Service Mesh を無効にします。
Red Hat OpenShift Service Mesh を無効にするには、次のコマンドを入力します。
$ oc edit dsci -n redhat-ods-operator
YAML エディターで、
serviceMesh
コンポーネントのmanagementState
の値を次のようにRemoved
に変更します。spec: components: serviceMesh: managementState: Removed
- 変更を保存します。
プロジェクトを作成します。
$ oc new-project <project_name> --description="<description>" --display-name="<display_name>"
プロジェクトの作成に関する詳細は、プロジェクトの使用 を参照してください。
データサイエンスクラスターを作成します。
-
Red Hat OpenShift Web コンソールの Administrator ビューで、Operators
Installed Operators をクリックし、Red Hat OpenShift AI Operator をクリックします。 - Data Science Cluster タブをクリックします。
- Create DataScienceCluster ボタンをクリックします。
- Configure via フィールドで、YAML view ラジオボタンをクリックします。
YAML エディターの
spec.components
セクションで、kserve
コンポーネントを次のように設定します。kserve: defaultDeploymentMode: RawDeployment managementState: Managed serving: managementState: Removed name: knative-serving
- Create をクリックします。
-
Red Hat OpenShift Web コンソールの Administrator ビューで、Operators
シークレットファイルを作成します。
コマンドラインターミナルで、シークレットを格納する 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'
を追加します。- ファイルを secret.yaml というファイル名で保存します。
secret.yaml ファイルを適用します。
$ oc apply -f secret.yaml -n <namespace>
サービスアカウントを作成します。
サービスアカウントを格納する YAML ファイルを作成し、次の YAML コードを追加します。
apiVersion: v1 kind: ServiceAccount metadata: name: models-bucket-sa secrets: - name: s3creds
サービスアカウントの詳細は、サービスアカウントの理解と作成 を参照してください。
- ファイルを serviceAccount.yaml というファイル名で保存します。
serviceAccount.yaml ファイルを適用します。
$ oc apply -f serviceAccount.yaml -n <namespace>
モデルの予測を提供するコンテナーイメージを定義するために、サービングランタイム用の 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"
- 上記の OpenVINO Model Server の例を使用している場合は、YAML コード内のプレースホルダーに必要な正しい値を挿入していることを確認してください。
- 適切なファイル名でファイルを保存します。
サービングランタイムを含むファイルを適用します。
$ oc apply -f <serving run time file name> -n <namespace>
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: []
YAML コードで、次の値が正しく設定されていることを確認します。
-
serving.kserve.io/deploymentMode
には、RawDeployment
の値が含まれている必要があります。 -
modelFormat
には、onnx
などのモデル形式の値が含まれている必要があります。 -
storageUri
には、モデルの s3 ストレージディレクトリーの値 (例s3://<bucket_name>/<model_directory_path>
) が含まれている必要があります。 -
runtime
には、ovms-runtime
など、サービングランタイムの名前の値が含まれている必要があります。
-
- 適切なファイル名でファイルを保存します。
InferenceService CR を含むファイルを適用します。
$ oc apply -f <InferenceService CR file name> -n <namespace>
クラスター内のすべての 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
すべての 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 タイプがリソースに割り当てられ、エラーが発生する可能性があります。
-
NVIDIA GPU (
- クラスターで KServe を有効にしている。
-
セットアップには 1 つの head Pod のみがあります。
InferenceService
のmin_replicas
またはmax_replicas
設定を使用してレプリカ数を調整しないでください。追加の head Pod を作成すると、それらが Ray クラスターから除外される可能性があります。 - ReadWriteMany (RWX)アクセスモード用に永続ボリューム要求(PVC)がセットアップされ、設定されている。
手順
ターミナルウィンドウで、クラスター管理者として OpenShift クラスターにまだログインしていない場合は、次の例に示すように OpenShift CLI にログインします。
$ oc login <openshift_cluster_url> -u <admin_username> -p <password>
モデルをデプロイする namespace を選択または作成します。この例では、
kserve-demo
が使用され、以下のコマンドを使用して作成できます。oc new-project kserve-demo
モデルをデプロイする 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>__
モデルを 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
vllm-multinode-runtime
ServingRuntime をカスタムランタイムとして作成します。oc process vllm-multinode-runtime-template -n redhat-ods-applications|oc apply -f -
次の
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 }"