Bereitstellung von Anwendungen in Red Hat OpenShift-Clustern

Mit Red Hat® OpenShift® on IBM Cloud®-Clustern können Sie Apps aus einer fernen Datei oder einem fernen Repository (z. B. GitHub) mit einem einzigen Befehl bereitstellen. Zum Lieferumfang Ihrer Cluster gehören außerdem verschiedene integrierte Services, die Sie zum Betrieb Ihres Clusters verwenden können.

Apps in Red Hat OpenShift verschieben

Zum Erstellen einer App in Ihrem Red Hat OpenShift on IBM Cloud-Cluster können Sie die Red Hat OpenShift-Konsole oder die entsprechende CLI verwenden.

Werden Fehler angezeigt, wenn Sie Ihre App bereitstellen? Red Hat OpenShift hat andere Standardeinstellungen als Community-Kubernetes, z. B. strengere Sicherheitskontexteinschränkungen. Informieren Sie sich anhand der folgenden allgemeinen Szenarios, wo möglicherweise Änderungen an Ihren Apps erforderlich sind, damit sie in Red Hat OpenShift-Clustern bereitgestellt werden können.

Apps über Konsole bereitstellen

Sie können mit verschiedenen Methoden Apps in der Red Hat OpenShift-Konsole erstellen. Verwenden Sie hierzu die Perspektive Entwickler. Weitere Informationen finden Sie in der Dokumentation Red Hat OpenShift.

  1. Wählen Sie auf der Konsole Ihren Cluster aus.
  2. Klicken Sie auf Red Hat OpenShift-Webkonsole.
  3. Wählen Sie in der Perspektivenumschaltung die Option Entwickler aus. Die Red Hat OpenShift-Webkonsole wechselt in die Perspektive 'Entwickler' und das Menü enthält jetzt Elemente, wie +Hinzufügen, Topologie und Builds.
  4. Klicken Sie auf + Hinzufügen.
  5. Wählen Sie in der Menüleiste des Teilfensters Hinzufügen in der Dropdown-Liste das Projekt aus, in dem Sie die App erstellen wollen.
  6. Klicken Sie auf die Methode, die Sie verwenden möchten, um Ihre App hinzuzufügen, und befolgen Sie dann die Anweisungen. Klicken Sie zum Beispiel auf Von Git.

Apps über Befehlszeilenschnittstelle bereitstellen

Um eine App in Ihrem Red Hat OpenShift on IBM Cloud-Cluster zu erstellen, verwenden Sie den Befehl oc new-app. Sie können beispielsweise auf ein öffentliches GitHub- oder GitLab-Repository oder mit einer URL verweisen, die auf .git endet. Sie können aber auch auf ein anderes lokales oder fernes Repository verweisen. Weitere Informationen finden Sie im Lernprogramm und in der Dokumentation Red Hat OpenShift.

oc new-app --name <app_name> https://github.com/<path_to_app_repo> [--context-dir=<subdirectory>]
Was bewirkt der Befehl new-app ?
Der Befehl new-app bewirkt, dass eine Buildkonfiguration und ein App-Image aus dem Quellcode, eine Bereitstellungskonfiguration zum Bereitstellen der Container in Pods Ihres Clusters sowie ein Service erstellt werden, mit dem die App im Cluster zugänglich gemacht wird. Weitere Informationen über den Erstellungsprozess und andere Quellen als Git finden Sie in der Dokumentation Red Hat OpenShift.

Apps für bestimmte Workerknoten mithilfe von Bezeichnungen bereitstellen

Wenn Sie eine App bereitstellen, werden die App-Pods ohne Unterschied für verschiedene Workerknoten in Ihrem Cluster bereitgestellt. Manchmal möchten Sie vielleicht die Workerknoten einschränken, auf denen die App-Pods bereitgestellt werden sollen. Beispiel: Sie möchten, dass App-Pods nur für Workerknoten in einem bestimmten Worker-Pool bereitgestellt werden, weil sich diese Workerknoten auf Bare-Metal-Maschinen befinden. Fügen Sie Ihrer App-Bereitstellung eine Affinitätsregel hinzu, um die Workerknoten anzugeben, für die die App-Pods bereitgestellt werden müssen.

Vorbereitende Schritte

Gehen Sie wie folgt vor, um Apps auf bestimmten Workerknoten bereitzustellen

  1. Rufen Sie die ID des Worker-Pools ab, in dem die App-Pods bereitgestellt werden sollen.

    ibmcloud oc worker-pool ls --cluster CLUSTER_NAME_OR_ID
    
  2. Listen Sie die Workerknoten auf, die sich in dem Worker-Pool befinden, und notieren Sie sich eine der privaten IP-Adressen.

    ibmcloud oc worker ls --cluster CLUSTER_NAME_OR_ID --worker-pool WORKER_POOL_NAME_OR_ID
    
  3. Beschreiben Sie den Workerknoten. Notieren Sie sich in der Ausgabe für Labels die Bezeichnung der Worker-Pool-ID: ibm-cloud.kubernetes.io/worker-pool-id.

    In den Schritten dieses Abschnitts wird eine Worker-Pool-ID zum Bereitstellen von App-Pods für Workerknoten in diesem Worker-Pool verwendet. Zum Bereitstellen von App-Pods für bestimmte Workerknoten durch Verwendung einer anderen Bezeichnung (Label), notieren Sie sich dementsprechend diese andere Bezeichnung. Beispiel: Zum Bereitstellen von App-Pods nur für Workerknoten in einem bestimmten privaten VLAN, verwenden Sie die Bezeichnung privateVLAN=.

    oc describe node <worker_node_private_IP>
    

    Beispielausgabe

    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. Fügen Sie der App-Bereitstellung eine Affinitätsregel für das Label der Worker-Pool-ID hinzu.

    YAML-Beispieldatei

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

    Im Abschnitt Affinität der YAML-Beispieldatei steht ibm-cloud.kubernetes.io/worker-pool-id für key und <worker_pool_ID> für value.

  5. Wenden Sie die aktualisierte Bereitstellungskonfigurationsdatei an.

    oc apply -f with-node-affinity.yaml
    
  6. Stellen Sie sicher, dass die App-Pods auf den richtigen Workerknoten bereitgestellt wurden.

    1. Listen Sie die Pods in Ihrem Cluster auf.
        oc get pods -o wide
        ```
        Beispielausgabe
        ```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. Geben Sie in der Ausgabe einen Pod für Ihre App an. Notieren Sie sich die private IP-Adresse (**NODE**) des Workerknotens, auf dem sich der Pod befindet.
    
        In der vorherigen Beispielausgabe befindet sich der App-Pod `cf-py-d7b7d94db-vp8pq` auf einem Workerknoten mit der IP-Adresse `10.xxx.xx.xxx`.
    
    3. Listen Sie die Workerknoten im Worker-Pool auf, die Sie in Ihrer App-Bereitstellung angegeben haben.
    
    ```sh {: pre}
        ibmcloud oc worker ls --cluster CLUSTER_NAME_OR_ID --worker-pool WORKER_POOL_NAME_OR_ID
        ```
        Beispielausgabe
    
        ```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
        ```
        Wenn Sie eine App-Affinitätsregel basierend auf einem anderen Faktor erstellt haben, rufen Sie stattdessen diesen Wert ab. Um beispielsweise zu bestätigen, dass der App-Pod auf einem Workerknoten in einem bestimmten VLAN bereitgestellt wurde, zeigen Sie das VLAN an, in dem sich der Workerknoten befindet, indem Sie `ibmcloud oc worker get --cluster CLUSTER_NAME_OR_ID --worker WORKER_ID` ausführen.
        {: tip}
    
    4. Vergewissern Sie sich in der Ausgabe, dass der Workerknoten mit der privaten IP-Adresse, die Sie im vorherigen Schritt angegeben haben, in diesem Worker-Pool bereitgestellt ist.
    
    

Bereitstellung einer App auf einem NVIDIA-GPU-Rechner

Wenn Sie einen GPU-Maschinentyp haben, können Sie die Verarbeitungszeit beschleunigen, die für rechenintensive Workloads wie KI, maschinelles Lernen, Inferenzen usw. erforderlich ist.

In den nachfolgenden Abschnitten erfahren Sie, wie Sie Workloads bereitstellen, für die die GPU erforderlich ist. Sie können jedoch auch Anwendungen bereitstellen, deren Workloads nicht sowohl auf der GPU als auch auf der CPU verarbeitet werden müssen.

Sie können auch mathematisch intensive Workloads wie das TensorFlow framework für maschinelles Lernen mit dieser Kubernetes Demo ausprobieren.

Voraussetzungen

Vorbereitende Schritte

  • Erstellen Sie einen Cluster oder Worker-Pool, der einen GPU-Typ verwendet. Beachten Sie, dass das Einrichten einer Bare-Metal-Maschine mehr als einen Geschäftstag in Anspruch nehmen kann. Eine Liste der verfügbaren Versionen finden Sie unter den folgenden Links.

  • Stellen Sie sicher, dass Ihnen eine Servicezugriffsrolle zugeordnet wurde, die Ihnen die entsprechende RBAC-Rolle für Kubernetes erteilt, um mit Kubernetes-Ressourcen im Cluster arbeiten zu können.

Einschränkungen nur für private Cluster: Wenn Ihr Cluster keine öffentliche Netzkonnektivität hat, müssen Sie öffentliche Netzkonnektivität zulassen oder Images aus externen Registrys und Imagedatenströmen in icr.io spiegeln. Im folgenden Beispiel verwendet die GPU-App OLM Marketplace mit Bilddatenströmen. Dieses Beispiel funktioniert nicht, wenn Ihr Cluster nicht auf die NVIDIA-Registrierung ( nvcr.io ) zugreifen kann.

Sie müssen Version 1.3.1 oder höher des NVIDIA GPU-Operators verwenden. Wenn Sie den Node Feature Discovery-Operator installieren, wählen Sie den Aktualisierungskanal aus, der mit Ihrer Red Hat OpenShift-Clusterversion übereinstimmt. Installieren Sie die Operatoren nicht auf andere Weise, beispielsweise über ein Helm-Diagramm.

RHEL 9 Worker Nodes: Wenn Sie NVIDIA GPU-Treiber auf RHEL 9-Arbeitsknoten installieren, müssen Sie einen Workaround anwenden, um alle erforderlichen Extended Update Support (EUS)-Repositories zu aktivieren. Der NVIDIA GPU Operator aktiviert standardmäßig nicht alle erforderlichen EUS-Repositories, was dazu führt, dass die Treiberinstallation fehlschlägt. Weitere Informationen finden Sie unter Warum schlägt die Installation meines NVIDIA GPU-Treibers auf RHEL 9 Worker Nodes fehl?

Sollten bei der Installation des „ Node Feature Discovery Operator“ oder des „ NVIDIA GPU Operator“ Probleme auftreten, senden Sie bitte eine E-Mail an Wenden Sie sich an den Support unter NVIDIA, um Hilfe zu erhalten oder melden Sie ein Problem im NVIDIA GPU Operator-Repo

Workload implementieren

  1. Erstellen Sie eine YAML-Datei. In diesem Beispiel verwaltet eine Job YAML-Datei batchähnliche Workloads, indem sie einen kurzlebigen Pod erstellt, der so lange läuft, bis der Befehl abgeschlossen ist und erfolgreich beendet wird.

    Für GPU-Workloads müssen Sie das Feld resources: limits: nvidia.com/gpu in der Job-YAML-Datei angeben.

    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
    
    Verstehen Ihrer YAML-Komponenten
    Komponente Beschreibung
    Namen für Metadaten und Bezeichnung Geben Sie einen Namen und eine Bezeichnung für den Job ein und verwenden Sie denselben Namen sowohl in den Metadaten der Datei als auch in den spec template-Metadaten. Beispiel: nvidia-devicequery.
    containers.image Geben Sie ein Image an, von dem der Container eine Instanz ausführt. In diesem Beispiel wird der Wert für die Verwendung des CUDA-Einheitenabfrageimage DockerHub festgelegt:nvcr.io/nvidia/k8s/cuda-sample:devicequery-cuda11.7.1-ubuntu20.04.
    containers.imagePullPolicy Um nur ein neues Image zu extrahieren, wenn das Image sich nicht aktuell auf dem Workerknoten befindet, geben Sie IfNotPresent an.
    resources.limits

    Für GPU-Maschinen müssen Sie eine Ressourcengrenze angeben. Das Kubernetes-Geräte-Plug-in passt die Standard-Ressourcenanforderung an das Limit an.

    • Sie müssen den Schlüssel als nvidia.com/gpu.
    • angeben Geben Sie die ganze Zahl der angeforderten GPUs ein, z. B. 2. Beachten Sie, dass Container-Pods keine GPUs gemeinsam nutzen und GPUs nicht überlastet werden können. Wenn Sie zum Beispiel nur über eine Maschine des Typs mg1c.16x128 verfügen, stehen Ihnen nur zwei GPUs auf dieser Maschine zur Verfügung und es kann maximal der Wert 2 angegeben werden.
  2. Wenden Sie die YAML-Datei an. Zum Beispiel:

    oc apply -f nvidia-devicequery.yaml
    
  3. Überprüfen Sie den Job-Pod, indem Sie Ihre Pods nach dem Label nvidia-devicequery filtern. Stellen Sie sicher, dass der STATUS den Wert Completed aufweist.

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

    Beispielausgabe

    NAME                  READY     STATUS      RESTARTS   AGE
    nvidia-devicequery-ppkd4      0/1       Completed   0          36s
    
  4. Beschreiben Sie den Pod, um zu sehen, wie das GPU-Einheiten-Plug-in den Pod terminiert hat.

    • In den Feldern Limits und Requests entspricht die von Ihnen angegebene Ressourcengrenze der Anforderung, die das Einheiten-Plug-in automatisch festgelegt hat.
    • Überprüfen Sie in den Ereignissen, dass der Pod dem GPU-Workerknoten zugewiesen ist.
        oc describe pod nvidia-devicequery-ppkd4
        ```
        Beispielausgabe
        ```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. Um sicherzustellen, dass der Job die GPU zum Berechnen der Workload verwendet hat, können Sie die entsprechenden Protokolle überprüfen.

    oc logs nvidia-devicequery-ppkd4
    

    Beispielausgabe

    /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
    

    In diesem Beispiel sehen Sie, dass eine GPU zur Ausführung des Jobs verwendet wurde, da die GPU im Workerknoten terminiert wurde. Wenn der Grenzwert auf 2 gesetzt ist, werden nur 2 GPUs angezeigt.

Nachdem Sie nun eine Test-GPU-Workload bereitgestellt haben, möchten Sie vielleicht Ihren Cluster so einrichten, dass ein Tool ausgeführt werden kann, das auf GPU-Verarbeitung angewiesen ist, wie beispielsweise IBM Maximo Visual Inspection.

Bereitstellen einer Anwendung auf einem Intel AI Accelerator (Gaudi 3) Rechner

Diese Funktion steht nur für Konten auf der Whitelist zur Verfügung. Informationen zur Beantragung des Zugriffs finden Sie unter Beantragung des Zugriffs auf zulassungspflichtige Funktionen.

Führen Sie das folgende Beispiel aus, um das Container-Image von Intel Gaudi PyTorch bereitzustellen, das ein Gaudi-Gerät über das Feld resource.limits abruft. Bevor Sie beginnen, stellen Sie sicher, dass Ihr Cluster die folgenden Anforderungen erfüllt.

Weitere Informationen und Beispiele finden Sie in den Habana-Dokumenten und im Schnellstart-Beispiel.

  1. Kopieren Sie die folgende Beispieljobkonfiguration und speichern Sie sie als Datei mit dem Namen 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. Wenden Sie den Job in Ihrem Cluster an.
    oc apply -f config.yaml
    
  3. Warten Sie, bis die Pods gestartet sind, und überprüfen Sie dann, ob der Auftrag abgeschlossen ist.
    oc get po -n default
    
    Beispiel
    NAME                          READY   STATUS      RESTARTS   AGE
    habanalabs-gaudi-demo-kmdcp   0/1     Completed   0          2m32s
    
  4. Beschreiben Sie den Job-Pod für weitere Details.
    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. Rufen Sie die Pod-Protokolle auf, um die Details des Gaudi-Geräts zu sehen.
    oc logs habanalabs-gaudi-demo-kmdcp
    
    Beispielausgabe
    +-----------------------------------------------------------------------------+
    | 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        |
    +=============================================================================+
    

Bereitstellen einer Anwendung auf einem AMD MI300x Rechner

Red Hat CoreOS 4.18 und später VPC

Weitere Informationen und Beispiele finden Sie in den AMD-Dokumenten und im Schnellstart-Beispiel.

  1. Kopieren Sie die folgende Beispiel-Pod-Konfiguration und speichern Sie sie in einer Datei mit dem Namen 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. Wenden Sie den Pod in Ihrem Cluster an.
    oc apply -f config.yaml
    
  3. Warten Sie, bis die Pods gestartet sind, und überprüfen Sie dann, ob der Auftrag abgeschlossen ist.
    oc get po -n default
    
    Beispiel
    NAME       READY   STATUS      RESTARTS   AGE
    amd-smi    0/1     Completed   0          19m
    
  4. Beschreiben Sie den Job-Pod für weitere Details.
    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. Holen Sie sich die Pod-Protokolle, um die Details der AMD-GPU zu sehen.
    oc logs amd-smi
    
    Beispielausgabe
    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