Red Hat OpenShift クラスターへのアプリのデプロイ

Red Hat® OpenShift® on IBM Cloud® クラスターでは、単一のコマンドを使用して、リモート・ファイルまたは GitHub などのリポジトリーからアプリをデプロイできます。 また、クラスターには、そのクラスターの操作に役立つさまざまな組み込みサービスが付属しています。

Red Hat OpenShift へのアプリの移行

Red Hat OpenShift on IBM Cloud クラスターでアプリを作成するために、Red Hat OpenShift コンソールまたは CLI を使用できます。

アプリのデプロイ時にエラーが発生しますか? Red Hat OpenShift には、厳密なセキュリティー・コンテキスト制約などのように、コミュニティー Kubernetes とは異なるデフォルト設定があります。 Red Hat OpenShift クラスターにアプリをデプロイするために、アプリを変更する必要が生じることがある一般的な状況を確認してください。

コンソールによるアプリのデプロイ

Red Hat OpenShift コンソールの Developer パースペクティブを使用すると、さまざまな方式でアプリを作成できます。 詳しくは、 Red Hat OpenShift のドキュメントを参照。

  1. コンソールから、クラスタを選択します。
  2. **「Red Hat OpenShift Web コンソール」**をクリックします。
  3. パースペクティブ・スイッチャーで Developer を選択します。 Red Hat OpenShift Web コンソールが Developer パースペクティブに切り替わり、メニューに**「+Add」「Topology」「Builds」**などの項目が表示されるようになりました。
  4. **「+追加 (+Add)」**をクリックします。
  5. **「Add」ペインのメニュー・バーのドロップダウン・リストから、作成するアプリを配置する「Project」**を選択します。
  6. アプリを追加するために使用する方式をクリックし、指示に従います。 例えば、**「From Git」**をクリックします。

CLI によるアプリのデプロイ

Red Hat OpenShift on IBM Cloud クラスタにアプリを作成するには、 oc new-app コマンドを使用する。 例えば、パブリック GitHub リポジトリー、.git で終わる URL のパブリック GitLab リポジトリー、別のローカル・リポジトリーやリモート・リポジトリーを参照できます。 詳しくは、 チュートリアルをお試し いただき、 Red Hat OpenShift のドキュメントをご覧ください。

oc new-app --name <app_name> https://github.com/<path_to_app_repo> [--context-dir=<subdirectory>]
new-app コマンドにはどのような機能がありますか?
new-app コマンドは、ソース・コードからのビルド構成とアプリ・イメージの作成、クラスター内のポッドにコンテナーをデプロイするためのデプロイメント構成の作成、クラスター内でアプリを公開するためのサービスの作成を行います。 ビルド・プロセスの詳細や、 Git 以外のソースについては、 Red Hat OpenShift のドキュメントを参照のこと。

ラベルを使用した特定のワーカー・ノードへのアプリのデプロイ

アプリをデプロイすると、アプリ・ポッドが、クラスター内のさまざまなワーカー・ノードに無差別にデプロイされます。 場合によっては、アプリ・ポッドのデプロイ先のワーカー・ノードを制限する必要があります。 例えば、特定のワーカー・プールのワーカー・ノードがベアメタル・マシン上にあるため、これらのワーカー・ノードにのみアプリ・ポッドがデプロイされるようにしたいとします。 アプリ・ポッドをデプロイするワーカー・ノードを指定するには、アプリのデプロイメントにアフィニティー・ルールを追加します。

開始前に

特定のワーカー・ノードにアプリをデプロイするには、以下のようにします。

  1. アプリ・ポッドをデプロイするワーカー・プールの ID を取得します。

    ibmcloud oc worker-pool ls --cluster CLUSTER_NAME_OR_ID
    
  2. ワーカー・プールにあるワーカー・ノードをリストし、プライベート IP アドレスの 1 つをメモします。

    ibmcloud oc worker ls --cluster CLUSTER_NAME_OR_ID --worker-pool WORKER_POOL_NAME_OR_ID
    
  3. ワーカー・ノードの説明を表示します。 Labels 出力で、ワーカー・プール ID ラベル ibm-cloud.kubernetes.io/worker-pool-id をメモします。

    このトピックで示す手順では、ワーカー・プール ID を使用して、そのワーカー・プール内のワーカー・ノードにのみアプリ・ポッドをデプロイします。 別のラベルを使用して特定のワーカー・ノードにアプリ・ポッドをデプロイするには、代わりにそのラベルをメモしてください。 例えば、特定のプライベート VLAN 上にあるワーカー・ノードにのみアプリ・ポッドをデプロイするには、privateVLAN= ラベルを使用します。

    oc describe node <worker_node_private_IP>
    

    出力例

    NAME:               10.xxx.xx.xxx
    Roles:              <none>
    Labels:             arch=amd64
                        beta.kubernetes.io/arch=amd64
                        beta.kubernetes.io/instance-type=b3c.4x16.encrypted
                        beta.kubernetes.io/os=linux
                        failure-domain.beta.kubernetes.io/region=us-south
                        failure-domain.beta.kubernetes.io/zone=dal10
                        ibm-cloud.kubernetes.io/encrypted-docker-data=true
                        ibm-cloud.kubernetes.io/ha-worker=true
                        ibm-cloud.kubernetes.io/iaas-provider=softlayer
                        ibm-cloud.kubernetes.io/machine-type=b3c.4x16.encrypted
                        ibm-cloud.kubernetes.io/sgx-enabled=false
                        ibm-cloud.kubernetes.io/worker-pool-id=00a11aa1a11aa11a1111a1111aaa11aa-11a11a
                        ibm-cloud.kubernetes.io/worker-version=1.35_1534
                        kubernetes.io/hostname=10.xxx.xx.xxx
                        privateVLAN=1234567
                        publicVLAN=7654321
    Annotations:        node.alpha.kubernetes.io/ttl=0
    ...
    
  4. アプリ展開に、ワーカープールIDラベルに対する アフィニティルールを追加します

    YAML の例

    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: with-node-affinity
    spec:
      template:
        spec:
          affinity:
            nodeAffinity:
              requiredDuringSchedulingIgnoredDuringExecution:
                nodeSelectorTerms:
                - matchExpressions:
                  - key: ibm-cloud.kubernetes.io/worker-pool-id
                    operator: In
                    values:
                    - <worker_pool_ID>
    ...
    

    YAML の例のアフィニティー (affinity) セクションでは、ibm-cloud.kubernetes.io/worker-pool-idkey<worker_pool_ID>value です。

  5. 更新したデプロイメント構成ファイルを適用します。

    oc apply -f with-node-affinity.yaml
    
  6. アプリ・ポッドが、正しいワーカー・ノードにデプロイされたことを確認します。

    1. クラスター内のポッドをリストします。
        oc get pods -o wide
        ```
        出力例
        ```sh {: screen}
        NAME                   READY     STATUS              RESTARTS   AGE       IP               NODE
        cf-py-d7b7d94db-vp8pq  1/1       Running             0          15d       172.30.xxx.xxx   10.176.48.78
        ```
    2. 出力で、アプリのポッドを確認します。 ポッドがあるワーカー・ノードの **NODE** プライベート IP アドレスをメモします。
    
        前述の出力例で、アプリ・ポッド `cf-py-d7b7d94db-vp8pq` は、IP アドレス `10.xxx.xx.xxx` のワーカー・ノード上にあります。
    
    3. アプリのデプロイメントに指定したワーカー・プール内にあるワーカー・ノードをリストします。
    
    ```sh {: pre}
        ibmcloud oc worker ls --cluster CLUSTER_NAME_OR_ID --worker-pool WORKER_POOL_NAME_OR_ID
        ```
        出力例
    
        ```sh {: screen}
        ID                                                 Public IP       Private IP     Machine Type      State    Status  Zone    Version
        kube-dal10-crb20b637238bb471f8b4b8b881bbb4962-w7   169.xx.xxx.xxx  10.176.48.78   b3c.4x16          normal   Ready   dal10   1.8.6_1504
        kube-dal10-crb20b637238bb471f8b4b8b881bbb4962-w8   169.xx.xxx.xxx  10.176.48.83   b3c.4x16          normal   Ready   dal10   1.8.6_1504
        kube-dal12-crb20b637238bb471f8b4b8b881bbb4962-w9   169.xx.xxx.xxx  10.176.48.69   b3c.4x16          normal   Ready   dal12   1.8.6_1504
        ```
        別の要因に基づいてアプリのアフィニティー・ルールを作成した場合は、代わりにその値を取得してください。 例えば、アプリ・ポッドが特定の VLAN 上のワーカー・ノードにデプロイされたことを確認するには、`ibmcloud oc worker get --cluster CLUSTER_NAME_OR_ID --worker WORKER_ID` を実行して、そのワーカー・ノードが存在する VLAN を表示します。
        {: tip}
    
    4. 出力で、前のステップで指定したプライベート IP アドレスを持つワーカー・ノードがこのワーカー・プールにデプロイされていることを確認します。
    
    

NVIDIA のGPU搭載マシンへのアプリのデプロイ

GPU マシン・タイプを使用している場合は、AI、機械学習、推論などの計算主体のワークロードに必要な処理時間を短縮できます。

以下のステップは、GPU を必要とするワークロードをデプロイする方法を示しています。 ただし、GPUとCPUの両方でワークロードを処理する必要のないアプリもデプロイすることは可能です。

また、機械学習フレームワークのような、数学的に集約されたワークロードを試すこともできる。 TensorFlowこの Kubernetes デモで、機械学習フレームワークのような数学的に集約されたワークロードを試すこともできる。

前提条件

開始前に

  • GPU フレーバーを使用する クラスター またはワーカー・プールを作成します。 ベアメタル・マシンのセットアップは、完了するまでに 1 営業日以上かかることがあることに留意してください。 使用可能なフレーバーのリストについては、以下のリンクを参照してください。

  • クラスター内の Kubernetes リソースを処理できる適切な Kubernetes RBAC 役割を付与する、サービス・アクセス役割が自分に割り当てられていることを確認します。

プライベート専用クラスターの制限: クラスターにパブリック・ネットワーク接続がない場合は、外部レジストリーおよびイメージ・ストリームから icr.io へのパブリック・ネットワーク接続またはミラー・イメージを許可する必要があります。 以下の例では、GPU アプリは、イメージ・ストリームとともに OLM マーケットプレイスを使用します。 この例は、クラスタが NVIDIA レジストリ( nvcr.io )にアクセスできない場合は動作しません。

NVIDIA GPU オペレーターはバージョン 1.3.1 以降を使用する必要があります。 Node Feature Discovery オペレーターをインストールするときには、Red Hat OpenShift クラスターのバージョンに対応する更新チャネルを選択してください。 Helm チャートなど、他の方法を使って演算子をインストールしないでください。

RHEL 9 ワーカーノード :RHEL 9 ワーカーノードに NVIDIA GPU ドライバをインストールする場合は、回避策を適用して、必要なすべての拡張アップデートサポート (EUS) リポジトリを有効にする必要があります。 NVIDIA GPU Operatorでは、デフォルトで必要なEUSリポジトリがすべて有効になっていないため、ドライバーのインストールに失敗します。 詳細は、 RHEL 9 ワーカー・ノードで NVIDIA GPU ドライバのインストールが失敗するのはなぜですか?

Node のFeature Discovery Operatorまたは NVIDIA のGPU Operatorのインストールで問題が発生した場合は、 NVIDIA のサポートにお問い合わせいただくかNVIDIA のGPU Operatorリポジトリでイシューを登録してください。

ワークロードのデプロイ

  1. YAML ファイルを作成します。 この例では、 Job のYAMLファイルが、コマンドが完了するまで実行され、正常に終了する短命のPodを作成することで、バッチ処理のようなワークロードを管理します。

    GPU ワークロードの場合、ジョブの YAML ファイルで「 resources: limits: nvidia.com/gpu 」フィールドを指定する必要があります。

    apiVersion: batch/v1
    kind: Job
    metadata:
      name: nvidia-devicequery
      labels:
        name: nvidia-devicequery
    spec:
      template:
        metadata:
          labels:
            name: nvidia-devicequery
        spec:
          containers:
          - name: nvidia-devicequery
            image: nvcr.io/nvidia/k8s/cuda-sample:devicequery-cuda11.7.1-ubuntu20.04
            imagePullPolicy: IfNotPresent
            resources:
              limits:
                nvidia.com/gpu: 2
          restartPolicy: Never
    
    YAMLコンポーネントを理解する
    コンポーネント 説明
    メタデータとラベルの名前 ジョブの名前とラベルを入力し、ファイルのメタデータと spec template メタデータの両方で同じ名前を使用します。 例えば、nvidia-devicequery です。
    containers.image 実行中インスタンスとなっているコンテナーが属するイメージを指定します。 この例では、 DockerHub CUDA デバイス照会イメージ nvcr.io/nvidia/k8s/cuda-sample:devicequery-cuda11.7.1-ubuntu20.04 を使用するように値が設定されています。
    containers.imagePullPolicy イメージが現在ワーカー・ノード上にない場合にのみ新規イメージをプルする場合は、IfNotPresent を指定します。
    resources.limits

    GPU マシンの場合は、リソース制限を指定する必要があります。 Kubernetes デバイスプラグインは、デフォルトのリソース要求を制限値に合わせて設定します。

    • キーは「 nvidia.com/gpu 」と指定する必要があります。
    • 2 のように、必要なGPUの総数を入力してください。 コンテナー・ポッドは GPU を共有せず、GPU はオーバーコミットできないことに注意してください。 例えば、mg1c.16x128 マシンが 1 台のみの場合、そのマシンには GPU が 2 つしかないため、指定できるのは最大で 2 つです。
  2. YAML ファイルを適用します。 以下に例を示します。

    oc apply -f nvidia-devicequery.yaml
    
  3. nvidia-devicequery 」ラベルでポッドをフィルタリングして、ジョブポッドを確認してください。 STATUSCompleted であることを確認します。

    oc get pod -A -l 'name in (nvidia-devicequery)'
    

    出力例

    NAME                  READY     STATUS      RESTARTS   AGE
    nvidia-devicequery-ppkd4      0/1       Completed   0          36s
    
  4. ポッドに describe を実行して、GPU デバイス・プラグインがポッドをどのようにスケジュールしたかを確認します。

    • Limits フィールドと Requests フィールドで、指定したリソース制限とデバイス・プラグインが自動的に設定した要求とが一致していることを確認します。
    • イベントで、ポッドが GPU ワーカー・ノードに割り当てられていることを確認します。
        oc describe pod nvidia-devicequery-ppkd4
        ```
        出力例
        ```sh {: screen}
        NAME:           nvidia-devicequery-ppkd4
        Namespace:      default
        ...
        Limits:
            nvidia.com/gpu:  1
        Requests:
            nvidia.com/gpu:  1
        ...
        Events:
        Type    Reason                 Age   From                     Message
        ----    ------                 ----  ----                     -------
        Normal  Scheduled              1m    default-scheduler        Successfully assigned nvidia-devicequery-ppkd4 to 10.xxx.xx.xxx
        ...
        ```
    
  5. ジョブが GPU を使用してそのワークロードの計算を実行したことを検証するには、ログを確認します。

    oc logs nvidia-devicequery-ppkd4
    

    出力例

    /cuda-samples/sample Starting...
    CUDA Device Query (Runtime API) version (CUDART static linking)
    Detected 1 CUDA Capable device(s)
    Device 0: "Tesla P100-PCIE-16GB"
    CUDA Driver Version / Runtime Version          11.4 / 11.7
    CUDA Capability Major/Minor version number:    6.0
    Total amount of global memory:                 16281 MBytes (17071734784 bytes)
    (056) Multiprocessors, (064) CUDA Cores/MP:    3584 CUDA Cores
    GPU Max Clock rate:                            1329 MHz (1.33 GHz)
    Memory Clock rate:                             715 Mhz
    Memory Bus Width:                              4096-bit
    L2 Cache Size:                                 4194304 bytes
    Maximum Texture Dimension Size (x,y,z)         1D=(131072), 2D=(131072, 65536), 3D=(16384, 16384, 16384)
    Maximum Layered 1D Texture Size, (num) layers  1D=(32768), 2048 layers
    Maximum Layered 2D Texture Size, (num) layers  2D=(32768, 32768), 2048 layers
    Total amount of constant memory:               65536 bytes
    Total amount of shared memory per block:       49152 bytes
    Total shared memory per multiprocessor:        65536 bytes
    Total number of registers available per block: 65536
    Warp size:                                     32
    Maximum number of threads per multiprocessor:  2048
    Maximum number of threads per block:           1024
    Max dimension size of a thread block (x,y,z): (1024, 1024, 64)
    Max dimension size of a grid size    (x,y,z): (2147483647, 65535, 65535)
    Maximum memory pitch:                          2147483647 bytes
    Texture alignment:                             512 bytes
    Concurrent copy and kernel execution:          Yes with 2 copy engine(s)
    Run time limit on kernels:                     No
    Integrated GPU sharing Host Memory:            No
    Support host page-locked memory mapping:       Yes
    Alignment requirement for Surfaces:            Yes
    Device has ECC support:                        Enabled
    Device supports Unified Addressing (UVA):      Yes
    Device supports Managed Memory:                Yes
    Device supports Compute Preemption:            Yes
    Supports Cooperative Kernel Launch:            Yes
    Supports MultiDevice Co-op Kernel Launch:      Yes
    Device PCI Domain ID / Bus ID / location ID:   0 / 175 / 0
    Compute Mode:
    < Default (multiple host threads can use ::cudaSetDevice() with device simultaneously) >
    deviceQuery, CUDA Driver = CUDART, CUDA Driver Version = 11.4, CUDA Runtime Version = 11.7, NumDevs = 1
    Result = PASS
    

    この例では、GPU がワーカー・ノードでスケジュールされているため、GPU を使用してジョブが実行されました。 制限が 2 に設定されている場合は、2 個の GPU のみが表示されます。

テスト用のGPUワークロードをデプロイしたところで、次のように、GPU処理に依存するツールを実行できるようにクラスタを設定したい場合もあるでしょう。 IBM Maximo Visual Inspection

インテルAIアクセラレータ(Gaudi 3)マシンにアプリをデプロイする

この機能は、許可リストに登録されたアカウントのみが利用可能です。 アクセスを要求するには、「 許可リストに登録された機能へのアクセスを要求する 」を参照してください。

resource.limits フィールドを使用して Gaudi デバイスを検索する Intel Gaudi の PyTorch コンテナイメージをデプロイするために、以下の例を実行します。 作業を開始する前に、お使いのクラスタが以下の要件を満たしていることを確認してください。

詳細と例については、 Habanaのドキュメントと クイックスタートの例を参照してください。

  1. 以下のジョブ設定例をコピーし、以下のファイル名で保存する。 config.yaml
    apiVersion: batch/v1
    kind: Job
    metadata:
      name: habanalabs-gaudi-demo
    spec:
      template:
          spec:
            hostIPC: true
            restartPolicy: OnFailure
            containers:
              - name: habana-ai-base-container
                image: vault.habana.ai/gaudi-docker/1.21.0/ubuntu22.04/habanalabs/pytorch-installer-2.6.0:latest
                workingDir: /root
                command: ["hl-smi"]
                securityContext:
                  capabilities:
                      add: ["SYS_NICE"]
                resources:
                  limits:
                      habana.ai/gaudi: 8
                      memory: 409Gi
                      hugepages-2Mi: 9500Mi
    
  2. クラスター内でそのジョブを実行してください。
    oc apply -f config.yaml
    
  3. ポッドが起動するのを待ち、ジョブが完了したことを確認する。
    oc get po -n default
    
    NAME                          READY   STATUS      RESTARTS   AGE
    habanalabs-gaudi-demo-kmdcp   0/1     Completed   0          2m32s
    
  4. 詳細はジョブポッドをご覧ください。
    oc describe po habanalabs-gaudi-demo-kmdcp
    
    Name:             habanalabs-gaudi-demo-kmdcp
    Namespace:        default
    Priority:         0
    Service Account:  default
    Node:             test-csrq76620trmo9r8j7u0-btsstagevpc-gaudi3s-00013059/10.180.0.83
    Start Time:       Tue, 27 May 2025 14:41:50 -0400
    Labels:           batch.kubernetes.io/controller-uid=c3b33c8a-5fef-4312-9d59-c8b13c03313a
                      batch.kubernetes.io/job-name=habanalabs-gaudi-demo
                      controller-uid=c3b33c8a-5fef-4312-9d59-c8b13c03313a
                      job-name=habanalabs-gaudi-demo
    Annotations:      cni.projectcalico.org/containerID: 7c883dfa9c681ee2c4128b1a5412d4dc181842d0de2a4b7b8019eefc06df37ca
                      cni.projectcalico.org/podIP:
                      cni.projectcalico.org/podIPs:
    Status:           Succeeded
    IP:               172.17.151.97
    IPs:
      IP:           172.17.151.97
    Controlled By:  Job/habanalabs-gaudi-demo
    Containers:
      habana-ai-base-container:
        Container ID:  cri-o://d75288e9b467f3f820e05e770bbc3d9a2b11cbf8155a54a129fc083d5d507571
        Image:         vault.habana.ai/gaudi-docker/1.21.0/ubuntu22.04/habanalabs/pytorch-installer-2.6.0:latest
        Image ID:      vault.habana.ai/gaudi-docker/1.21.0/ubuntu22.04/habanalabs/pytorch-installer-2.6.0@sha256:cd599626a8f4d1c3a7b354ccf4ef73e19196f09030d02261d4900bf3467a964c
        Port:          <none>
        Host Port:     <none>
        Command:
          hl-smi
        State:          Terminated
          Reason:       Completed
          Exit Code:    0
          Started:      Tue, 27 May 2025 14:41:53 -0400
          Finished:     Tue, 27 May 2025 14:41:54 -0400
        Ready:          False
        Restart Count:  0
        Limits:
          habana.ai/gaudi:  8
          hugepages-2Mi:    9500Mi
          memory:           409Gi
        Requests:
          habana.ai/gaudi:  8
          hugepages-2Mi:    9500Mi
          memory:           409Gi
        Environment:        <none>
        Mounts:
          /var/run/secrets/kubernetes.io/serviceaccount from kube-api-access-8vn42 (ro)
    Conditions:
      Type                        Status
      PodReadyToStartContainers   False
      Initialized                 True
      Ready                       False
      ContainersReady             False
      PodScheduled                True
    Volumes:
      kube-api-access-8vn42:
        Type:                    Projected (a volume that contains injected data from multiple sources)
        TokenExpirationSeconds:  3607
        ConfigMapName:           kube-root-ca.crt
        ConfigMapOptional:       <nil>
        DownwardAPI:             true
        ConfigMapName:           openshift-service-ca.crt
        ConfigMapOptional:       <nil>
    QoS Class:                   Burstable
    Node-Selectors:              <none>
    Tolerations:                 node.kubernetes.io/memory-pressure:NoSchedule op=Exists
                                  node.kubernetes.io/not-ready:NoExecute op=Exists for 300s
                                  node.kubernetes.io/unreachable:NoExecute op=Exists for 300s
    Events:
      Type    Reason          Age   From               Message
      ----    ------          ----  ----               -------
      Normal  Scheduled       53s   default-scheduler  Successfully assigned default/habanalabs-gaudi-demo-kmdcp to test-csrq76620trmo9r8j7u0-btsstagevpc-gaudi3s-00013059
      Normal  AddedInterface  52s   multus             Add eth0 [172.17.151.97/32] from k8s-pod-network
      Normal  Pulling         52s   kubelet            Pulling image "vault.habana.ai/gaudi-docker/1.21.0/ubuntu22.04/habanalabs/pytorch-installer-2.6.0:latest"
      Normal  Pulled          50s   kubelet            Successfully pulled image "vault.habana.ai/gaudi-docker/1.21.0/ubuntu22.04/habanalabs/pytorch-installer-2.6.0:latest" in 2.146s (2.146s including waiting). Image size: 5188441181 bytes.
      Normal  Created         50s   kubelet            Created container: habana-ai-base-container
      Normal  Started         50s   kubelet            Started container habana-ai-base-container
    
  5. ガウディ・デバイスの詳細を見るには、ポッド・ログを入手してください。
    oc logs habanalabs-gaudi-demo-kmdcp
    
    出力例
    +-----------------------------------------------------------------------------+
    | HL-SMI Version:                              hl-1.21.0-fw-59.2.1.0          |
    | Driver Version:                                     1.20.1-366eb9c          |
    | Nic Driver Version:                                 1.20.1-213b09b          |
    |-------------------------------+----------------------+----------------------+
    | AIP  Name        Persistence-M| Bus-Id        Disp.A | Volatile Uncor-Events|
    | Fan  Temp  Perf  Pwr:Usage/Cap|         Memory-Usage | AIP-Util  Compute M. |
    |===============================+======================+======================|
    |   0  HL-325L             N/A  | 0000:e9:00.0     N/A |                   0  |
    | N/A   36C   P0  228W /  900W  |   672MiB / 131072MiB |     0%            0% |
    |-------------------------------+----------------------+----------------------+
    |   1  HL-325L             N/A  | 0000:c1:00.0     N/A |                   0  |
    | N/A   37C   P0  226W /  900W  |   672MiB / 131072MiB |     0%            0% |
    |-------------------------------+----------------------+----------------------+
    |   2  HL-325L             N/A  | 0000:b7:00.0     N/A |                   0  |
    | N/A   36C   P0  225W /  900W  |   672MiB / 131072MiB |     0%            0% |
    |-------------------------------+----------------------+----------------------+
    |   3  HL-325L             N/A  | 0000:ad:00.0     N/A |                   0  |
    | N/A   40C   P0  228W /  900W  |   672MiB / 131072MiB |     0%            0% |
    |-------------------------------+----------------------+----------------------+
    |   4  HL-325L             N/A  | 0000:a3:00.0     N/A |                   0  |
    | N/A   36C   P0  228W /  900W  |   672MiB / 131072MiB |     0%            0% |
    |-------------------------------+----------------------+----------------------+
    |   5  HL-325L             N/A  | 0000:df:00.0     N/A |                   0  |
    | N/A   39C   P0  229W /  900W  |   672MiB / 131072MiB |     0%            0% |
    |-------------------------------+----------------------+----------------------+
    |   6  HL-325L             N/A  | 0000:d5:00.0     N/A |                   0  |
    | N/A   36C   P0  231W /  900W  |   672MiB / 131072MiB |     0%            0% |
    |-------------------------------+----------------------+----------------------+
    |   7  HL-325L             N/A  | 0000:cb:00.0     N/A |                   0  |
    | N/A   38C   P0  227W /  900W  |   672MiB / 131072MiB |     0%            0% |
    |-------------------------------+----------------------+----------------------+
    | Compute Processes:                                               AIP Memory |
    |  AIP       PID   Type   Process name                             Usage      |
    |=============================================================================|
    |   0        N/A   N/A    N/A                                      N/A        |
    |   1        N/A   N/A    N/A                                      N/A        |
    |   2        N/A   N/A    N/A                                      N/A        |
    |   3        N/A   N/A    N/A                                      N/A        |
    |   4        N/A   N/A    N/A                                      N/A        |
    |   5        N/A   N/A    N/A                                      N/A        |
    |   6        N/A   N/A    N/A                                      N/A        |
    |   7        N/A   N/A    N/A                                      N/A        |
    +=============================================================================+
    

AMD MI300x マシンにアプリをデプロイする

Red Hat CoreOS 4.18 以降 VPC

詳細と例については、 AMDのドキュメントと クイック・スタート・サンプルを参照のこと。

  1. 以下のポッド設定例をコピーし、以下のファイル名で保存します。 config.yaml
    apiVersion: v1
    kind: Pod
    metadata:
      name: amd-smi
    spec:
      containers:
      - image: docker.io/rocm/rocm-terminal:latest
        name: amd-smi
        command: ["/bin/bash"]
        args: ["-c","amd-smi version && amd-smi monitor -ptum"]
        resources:
          limits:
            amd.com/gpu: 8
          requests:
            amd.com/gpu: 8
      restartPolicy: Never
    
  2. クラスタにポッドを適用します。
    oc apply -f config.yaml
    
  3. ポッドが起動するのを待ち、ジョブが完了したことを確認する。
    oc get po -n default
    
    NAME       READY   STATUS      RESTARTS   AGE
    amd-smi    0/1     Completed   0          19m
    
  4. 詳細はジョブポッドをご覧ください。
    oc describe po amd-smi
    
    Name:         amd-smi
    Namespace:    default
    Priority:     0
    Node:         test-d18ofps20v1lr6in6ta0-btsstagevpc-gx3d208-00001687/10.240.1.4
    Start Time:   Mon, 07 Jul 2025 13:32:18 -0500
    Labels:       <none>
    Annotations:  cni.projectcalico.org/containerID: 5b5d39f8ebe5ea14250af02031084961285f8b210eea14d2c22704784d957de3
                  cni.projectcalico.org/podIP:
                  cni.projectcalico.org/podIPs:
    Status:       Succeeded
    IP:           172.17.55.73
    IPs:
      IP:  172.17.55.73
    Containers:
      amd-smi:
        Container ID:  cri-o://3260f5a2788cc189adbe53d3d49c1bdccc7001df27f0c747d6fa86a3068c9eda
        Image:         docker.io/rocm/rocm-terminal:latest
        Image ID:      docker.io/rocm/rocm-terminal@sha256:72b323c5d56c511ea75f7353d0fee04e637390dd4874d414020284627a658014
        Port:          <none>
        Host Port:     <none>
        Command:
          /bin/bash
        Args:
          -c
          amd-smi version && amd-smi monitor -ptum
        State:          Terminated
          Reason:       Completed
          Exit Code:    0
          Started:      Mon, 07 Jul 2025 13:32:20 -0500
          Finished:     Mon, 07 Jul 2025 13:32:20 -0500
        Ready:          False
        Restart Count:  0
        Limits:
          amd.com/gpu:  8
        Requests:
          amd.com/gpu:  8
        Environment:    <none>
        Mounts:
          /var/run/secrets/kubernetes.io/serviceaccount from kube-api-access-tshnq (ro)
    Conditions:
      Type                        Status
      PodReadyToStartContainers   False
      Initialized                 True
      Ready                       False
      ContainersReady             False
      PodScheduled                True
    Volumes:
      kube-api-access-tshnq:
        Type:                    Projected (a volume that contains injected data from multiple sources)
        TokenExpirationSeconds:  3607
        ConfigMapName:           kube-root-ca.crt
        ConfigMapOptional:       <nil>
        DownwardAPI:             true
        ConfigMapName:           openshift-service-ca.crt
        ConfigMapOptional:       <nil>
    QoS Class:                   BestEffort
    Node-Selectors:              <none>
    Tolerations:                 node.kubernetes.io/not-ready:NoExecute op=Exists for 300s
                                node.kubernetes.io/unreachable:NoExecute op=Exists for 300s
    Events:
      Type    Reason          Age   From               Message
      ----    ------          ----  ----               -------
      Normal  Scheduled       19m   default-scheduler  Successfully assigned default/amd-smi to test-d18ofps20v1lr6in6ta0-btsstagevpc-gx3d208-00001687
      Normal  AddedInterface  19m   multus             Add eth0 [172.17.55.73/32] from k8s-pod-network
      Normal  Pulling         19m   kubelet            Pulling image "docker.io/rocm/rocm-terminal:latest"
      Normal  Pulled          19m   kubelet            Successfully pulled image "docker.io/rocm/rocm-terminal:latest" in 782ms (782ms including waiting). Image size: 3016399213 bytes.
      Normal  Created         19m   kubelet            Created container: amd-smi
      Normal  Started         19m   kubelet            Started container amd-smi
    
  5. ポッドログを取得し、AMD GPUの詳細を確認してください。
    oc logs amd-smi
    
    出力例
    AMDSMI Tool: 25.3.0+ede62f2 | AMDSMI Library version: 25.3.0 | ROCm version: 6.4.0 | amdgpu version: 6.10.5 | amd_hsmp version: N/A
    WARNING: User is missing the following required groups: render. Please add user to these groups.
    GPU  POWER   GPU_T   MEM_T   GFX_CLK   GFX%   MEM%  MEM_CLOCK
      0  141 W   40 °C   36 °C   140 MHz    0 %    0 %    900 MHz
      1  144 W   42 °C   33 °C   138 MHz    0 %    0 %    900 MHz
      2  140 W   38 °C   34 °C   142 MHz    0 %    0 %    900 MHz
      3  142 W   39 °C   34 °C   140 MHz    0 %    0 %    900 MHz
      4  140 W   38 °C   35 °C   138 MHz    0 %    0 %    900 MHz
      5  142 W   36 °C   30 °C   138 MHz    0 %    0 %    900 MHz
      6  137 W   40 °C   35 °C   138 MHz    0 %    0 %    900 MHz
      7  137 W   38 °C   32 °C   142 MHz    0 %    0 %    900 MHz