第3章 OpenShift Container Platform の AI Inference Server を使用した推論サービング modelcar イメージ


シークレット、永続ストレージ、および Red Hat AI Inference Server を使用して modelcar コンテナーイメージを推論するデプロイメントカスタムリソース (CR) を設定して、OpenShift Container Platform を使用して modelcar コンテナーに言語モデルをデプロイします。

前提条件

  • OpenShift CLI (oc) がインストールされている。
  • cluster-admin 権限を持つユーザーとしてログインしている。
  • 基盤となる AI アクセラレーターハードウェアに NFD と必要な GPU Operator がインストールされている。
  • 言語モデル用の modelcar コンテナーイメージを作成し、コンテナーイメージレジストリーにプッシュした。

手順

  1. クラスターがコンテナーレジストリーから Red Hat AI Inference Server イメージをダウンロードできるように、Docker シークレットを作成します。たとえば、ローカルの ~/.docker/config.json ファイルの内容を含む Secret CR を作成するには、次のコマンドを実行します。

    oc create secret generic docker-secret --from-file=.dockercfg=$HOME/.docker/config.json --type=kubernetes.io/dockercfg -n rhaiis-namespace
  2. PersistentVolumeClaim (PVC) カスタムリソース (CR) を作成し、クラスターに適用します。次の PVC CR の例では、デフォルトの IBM VPC ブロック永続ボリュームを使用します。

    apiVersion: v1
    kind: PersistentVolumeClaim
    metadata:
      name: model-cache
      namespace: rhaiis-namespace
    spec:
      accessModes:
        - ReadWriteOnce
      resources:
        requests:
          storage: 20Gi
      storageClassName: ibmc-vpc-block-10iops-tier
    注記

    要件を満たすようにクラスターストレージを設定することは、この手順の範囲外です。詳細は、永続ストレージの設定 を参照してください。

  3. modelcar イメージをプルし、Red Hat AI Inference Server コンテナーをデプロイする Deployment カスタムリソース (CR) を作成します。AI Inference Server を使用して modelcar イメージをサービングする次の Deployment CR 例を参照してください。

    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: rhaiis-oci-deploy
      namespace: rhaiis-namespace
      labels:
        app: granite
    spec:
      replicas: 0
      selector:
        matchLabels:
          app: rhaiis-oci-deploy
      template:
        metadata:
          labels:
            app: rhaiis-oci-deploy
        spec:
          imagePullSecrets:
            - name: docker-secret
          volumes:
            - name: model-volume
              persistentVolumeClaim:
                claimName: model-cache 
    1
    
            - name: shm
              emptyDir:
                medium: Memory
                sizeLimit: "2Gi"
            - name: oci-auth
              secret:
                secretName: docker-secret
                items:
                  - key: .dockercfg
                    path: config.json
          initContainers: 
    2
    
            - name: fetch-model
              image: ghcr.io/oras-project/oras:v1.2.0
              command: ["/bin/sh","-c"]
              args:
                - |
                  set -e
                  # Only pull if /model is empty
                  if [ -z "$(ls -A /model)" ]; then
                    echo "Pulling model…"
                    # Update with the modelcar container image registry URL
                    oras pull <YOUR_MODELCAR_REGISTRY_URL> \
                      --output /model \
                  else
                    echo "Model already present, skipping pull"
                  fi
              volumeMounts:
                - name: model-volume
                  mountPath: /model
                - name: oci-auth
                  mountPath: /auth
                  readOnly: true
          containers:
            - name: granite
              image: 'registry.redhat.io/rhaiis/vllm-cuda-rhel9@sha256:a6645a8e8d7928dce59542c362caf11eca94bb1b427390e78f0f8a87912041cd'
              imagePullPolicy: IfNotPresent
              env:
                - name: VLLM_SERVER_DEV_MODE
                  value: '1'
              command:
                - python
                - '-m'
                - vllm.entrypoints.openai.api_server
              args:
                - '--port=8000'
                - '--model=/model'
                - '--served-model-name=ibm-granite/granite-3.1-2b-instruct' 
    3
    
                - '--tensor-parallel-size=1'
              resources:
                limits:
                  cpu: '10'
                  nvidia.com/gpu: '1'
                  memory: 16Gi
                requests:
                  cpu: '2'
                  memory: 6Gi
                  nvidia.com/gpu: '1'
              volumeMounts:
                - name: model-volume
                  mountPath: /model
                - name: shm
                  mountPath: /dev/shm 
    4
    
          restartPolicy: Always
    1
    spec.template.spec.volumes.persistentVolumeClaim.claimName は、作成した PVC の名前と一致する必要があります。
    2
    このサンプルデプロイメントでは、メインのアプリケーションコンテナーの前に実行され、必要な modelcar イメージをダウンロードする単純な initContainers 設定を使用します。たとえば、以前のデプロイメントからモデルディレクトリーがすでに設定されている場合は、モデルプルのステップはスキップされます。
    3
    デプロイするモデルに合わせて --served-model-name の値を更新します。
    4
    NVIDIA Collective Communications Library (NCCL) では、/dev/shm ボリュームマウントが必要です。/dev/shm ボリュームマウントが設定されていない場合、Tensor 並列 vLLM デプロイメントは失敗します。
  4. デプロイメントのレプリカ数を必要な数まで増やします。たとえば、以下のコマンドを実行します。

    oc scale deployment granite -n rhaiis-namespace --replicas=1
  5. オプション: デプロイメントを監視し、成功したことを確認します。

    $ oc get deployment -n rhaiis-namespace --watch

    出力例

    NAME                READY   UP-TO-DATE   AVAILABLE   AGE
    rhaiis-oci-deploy   0/1     1            0           2s
    rhaiis-oci-deploy   1/1     1            1           14s

  6. モデル推論用の Service CR を作成します。以下に例を示します。

    apiVersion: v1
    kind: Service
    metadata:
      name: rhaiis-oci-deploy
      namespace: rhaiis-namespace
    spec:
      selector:
        app: rhaiis-oci-deploy
      ports:
        - name: http
          port: 80
          targetPort: 8000
  7. オプション: モデルへのパブリックアクセスを有効にするには、Route CR を作成します。以下に例を示します。

    apiVersion: route.openshift.io/v1
    kind: Route
    metadata:
      name: rhaiis-oci-deploy
      namespace: rhaiis-namespace
    spec:
      to:
        kind: Service
        name: rhaiis-oci-deploy
      port:
        targetPort: http
  8. 公開されたルートの URL を取得します。以下のコマンドを実行します。

    $ oc get route granite -n rhaiis-namespace -o jsonpath='{.spec.host}'

    出力例

    rhaiis-oci-deploy-rhaiis-namespace.apps.example.com

検証

モデルをクエリーして、デプロイメントが成功したことを確認します。以下のコマンドを実行します。

curl -v -k   http://rhaiis-oci-deploy-rhaiis-namespace.apps.modelsibm.ibmmodel.rh-ods.com/v1/chat/completions   -H "Content-Type: application/json"   -d '{
    "model":"ibm-granite/granite-3.1-2b-instruct",
    "messages":[{"role":"user","content":"Hello?"}],
    "temperature":0.1
  }'| jq

出力例

{
  "id": "chatcmpl-07b177360eaa40a3b311c24a8e3c7f43",
  "object": "chat.completion",
  "created": 1755189746,
  "model": "ibm-granite/granite-3.1-2b-instruct",
  "choices": [
    {
      "index": 0,
      "message": {
        "role": "assistant",
        "reasoning_content": null,
        "content": "Hello! How can I assist you today?",
        "tool_calls": []
      },
      "logprobs": null,
      "finish_reason": "stop",
      "stop_reason": null
    }
  ],
  "usage": {
    "prompt_tokens": 61,
    "total_tokens": 71,
    "completion_tokens": 10,
    "prompt_tokens_details": null
  },
  "prompt_logprobs": null,
  "kv_transfer_params": null
}

Red Hat logoGithubredditYoutubeTwitter

詳細情報

試用、購入および販売

コミュニティー

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

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

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

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

会社概要

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

Theme

© 2026 Red Hat
トップに戻る