Azure Red Hat OpenShift ile GPU iş yüklerini kullanma

Bu makalede, Azure Red Hat OpenShift ile NVIDIA GPU iş yüklerinin nasıl kullanılacağı gösterilmektedir.

Önkoşullar

  • OpenShift CLI
  • jq, moreutils ve gettext paketi
  • Azure Red Hat OpenShift 4.10

Küme yüklemeniz gerekiyorsa bkz . Öğretici: Azure Red Hat OpenShift 4 kümesi oluşturma. kümeler 4.10.x veya daha yüksek bir sürüme sahip olmalıdırlar.

Uyarı

4.10 itibarıyla, NVIDIA Operatörünü kullanmak için yetkilendirmelerin ayarlanması artık gerekli değildir. Bu, GPU iş yükleri için küme kurulumunu büyük ölçüde basitleştirdi.

Linux:

sudo dnf install jq moreutils gettext

macOS

brew install jq moreutils gettext

GPU kotası isteme

Azure'daki tüm GPU kotaları varsayılan olarak 0'dır. Azure portalında oturum açmanız ve GPU kotası istemeniz gerekir. GPU çalışanlarının rekabeti nedeniyle, GPU'ları gerçekten ayırabileceğiniz bir bölgede küme sağlamanız gerekebilir.

aşağıdaki GPU çalışanlarını destekler:

  • NC4as T4 v3
  • NC6s v3
  • NC8as T4 v3
  • NC12s v3
  • NC16as T4 v3
  • NC24s v3
  • NC24rs v3
  • NC64as T4 v3

Aşağıdaki örnekler ek MachineSet'lerde de desteklenir:

  • Standard_ND96asr_v4
  • NC24ads_A100_v4
  • NC48ads_A100_v4
  • NC96ads_A100_v4
  • ND96amsr_A100_v4

Uyarı

Kota isteğinde bulunurken Azure'ın çekirdek başına olduğunu unutmayın. Tek bir NC4as T4 v3 düğümü istemek için 4'lerden oluşan gruplar halinde kota istemeniz gerekir. NC16as T4 v3 isteğinde bulunmak istiyorsanız 16 kota istemeniz gerekir.

  1. Azure portalda oturum açın.

  2. Arama kutusuna kotalar girin ve İşlem'i seçin.

  3. Arama kutusuna NCAsv3_T4 girin, kümenizin içinde olduğu bölgenin kutusunu işaretleyin ve ardından Kota artışı iste'yi seçin.

  4. Kotayı yapılandırın.

    Azure portalındaki kotalar sayfasının ekran görüntüsü.

Kümenizde oturum açın

Küme yöneticisi ayrıcalıklarına sahip bir kullanıcı hesabıyla OpenShift'te oturum açın. Aşağıdaki örnekte kubadmin adlı bir hesap kullanılır:

oc login <apiserver> -u kubeadmin -p <kubeadminpass>

Çekme gizli dizisi (koşullu)

İşleçleri yükleyip cloud.redhat.com bağlanabildiğinizden emin olmak için çekme gizli dizinizi güncelleştirin.

Uyarı

cloud.redhat.com etkin bir tam çekme gizli dizisi oluşturmuşsanız bu adımı atlayın.

  1. cloud.redhat.com oturum açın.

  2. https://cloud.redhat.com/openshift/install/azure/aro-provisioned adresine göz atın.

  3. Çekme gizli dizisini indir'i seçin ve çekme gizli dizisini olarak pull-secret.txtkaydedin.

    Önemli

    Bu bölümdeki kalan adımlar ile aynı çalışma dizininde pull-secret.txtçalıştırılmalıdır.

  4. Mevcut çekme gizli dizisini dışarı aktarın.

    oc get secret pull-secret -n openshift-config -o json | jq -r '.data.".dockerconfigjson"' | base64 --decode > export-pull.json
    
  5. eklemek cloud.redhat.comiçin indirilen çekme gizli dizisini sistem çekme gizli dizisiyle birleştirin.

    jq -s '.[0] * .[1]' export-pull.json pull-secret.txt | tr -d "\n\r" > new-pull-secret.json
    
  6. Yeni gizli dizi dosyasını karşıya yükleyin.

    oc set data secret/pull-secret -n openshift-config --from-file=.dockerconfigjson=new-pull-secret.json
    

    Her şeyin cloud.redhat.com eşitlenmesi için yaklaşık 1 saat beklemeniz gerekebilir.

  7. Gizli dizileri silin.

    rm pull-secret.txt export-pull.json new-pull-secret.json
    

GPU makine kümesi

makine kümeleri oluşturmak için Kubernetes MachineSet kullanır. Aşağıdaki yordamda, kümedeki ilk makine kümesini dışarı aktarma ve bunu tek bir GPU makinesi oluşturmak için şablon olarak kullanma açıklanmaktadır.

  1. Mevcut makine kümelerini görüntüleyin.

    Kurulum kolaylığı için bu örnek, yeni bir GPU makine kümesi oluşturmak için kopyalanan ilk makine kümesini kullanır.

    MACHINESET=$(oc get machineset -n openshift-machine-api -o=jsonpath='{.items[0]}' | jq -r '[.metadata.name] | @tsv')
    
  2. Örnek makine kümesinin bir kopyasını kaydedin.

    oc get machineset -n openshift-machine-api $MACHINESET -o json > gpu_machineset.json
    
  3. .metadata.name Alanı yeni bir benzersiz adla değiştirin.

    jq '.metadata.name = "nvidia-worker-<region><az>"' gpu_machineset.json| sponge gpu_machineset.json
    
  4. Makine kümesi için istenen çoğaltma sayısıyla eşleştiğinden emin olun spec.replicas .

    jq '.spec.replicas = 1' gpu_machineset.json| sponge gpu_machineset.json
    
  5. Alanı, alanla .spec.selector.matchLabels.machine.openshift.io/cluster-api-machineset eşleşecek şekilde .metadata.name değiştirin.

    jq '.spec.selector.matchLabels."machine.openshift.io/cluster-api-machineset" = "nvidia-worker-<region><az>"' gpu_machineset.json| sponge gpu_machineset.json
    
  6. alanını .spec.template.metadata.labels.machine.openshift.io/cluster-api-machineset alanla .metadata.name eşleşecek şekilde değiştirin.

    jq '.spec.template.metadata.labels."machine.openshift.io/cluster-api-machineset" = "nvidia-worker-<region><az>"' gpu_machineset.json| sponge gpu_machineset.json
    
  7. öğesini spec.template.spec.providerSpec.value.vmSize Azure'dan istenen GPU örneği türüyle eşleşecek şekilde değiştirin.

    Bu örnekte kullanılan makine Standard_NC4as_T4_v3.

    jq '.spec.template.spec.providerSpec.value.vmSize = "Standard_NC4as_T4_v3"' gpu_machineset.json | sponge gpu_machineset.json
    
  8. öğesini spec.template.spec.providerSpec.value.zone Azure'dan istenen bölgeyle eşleşecek şekilde değiştirin.

    jq '.spec.template.spec.providerSpec.value.zone = "1"' gpu_machineset.json | sponge gpu_machineset.json
    
  9. .status yaml dosyasının bölümünü silin.

    jq 'del(.status)' gpu_machineset.json | sponge gpu_machineset.json
    
  10. yaml dosyasındaki diğer verileri doğrulayın.

Doğru SKU'nun ayarlandığından emin olun

Makine kümesi için kullanılan görüntüye bağlı olarak ve değerlerinin image.skuimage.version her ikisi de buna göre ayarlanmalıdır. Bu, Hyper-V için 1. nesil veya 2 sanal makinenin kullanılıp kullanılmayacağını güvence altına almaktır. Daha fazla bilgi için buradaki bakın.

Örnek:

kullanılıyorsa Standard_NC4as_T4_v3, her iki sürüm de desteklenir. Özellik desteği bölümünde belirtildiği gibi. Bu durumda değişiklik gerekmez.

kullanılıyorsa Standard_NC24ads_A100_v4yalnızca 2. Nesil VMdesteklenir. Bu durumda, değerin image.sku görüntünün kümenin özgün v2sürümüne karşılık gelen eşdeğer image.sku sürümünü izlemesi gerekir. Bu örnekte değer olacaktır v410-v2.

Bu, aşağıdaki komut kullanılarak bulunabilir:

az vm image list --architecture x64 -o table --all --offer aro4 --publisher azureopenshift
Filtered output:

SKU      VERSION
-------  ---------------
v410-v2  410.84.20220125
aro_410  410.84.20220125

Küme temel SKU görüntüsü aro_410ile oluşturulduysa ve aynı değer makine kümesinde tutulursa, aşağıdaki hatayla başarısız olur:

failure sending request for machine myworkernode: cannot create vm: compute.VirtualMachinesClient#CreateOrUpdate: Failure sending request: StatusCode=400 -- Original Error: Code="BadRequest" Message="The selected VM size 'Standard_NC24ads_A100_v4' cannot boot Hypervisor Generation '1'.

GPU makine kümesi oluşturma

Yeni GPU makinesini oluşturmak için aşağıdaki adımları kullanın. Yeni bir GPU makinesinin sağlanması 10-15 dakika sürebilir. Bu adım başarısız olursa Azure portalında oturum açın ve kullanılabilirlik sorunları olmadığından emin olun. Bunu yapmak için Sanal Makineler gidin ve VM'lerin durumunu görmek için daha önce oluşturduğunuz çalışan adını arayın.

  1. GPU Makinesi kümesini oluşturun.

    oc create -f gpu_machineset.json
    

    Bu komutun tamamlanması birkaç dakika sürer.

  2. GPU makine kümesini doğrulayın.

    Makineler dağıtılmalıdır. Aşağıdaki komutlarla makine kümesinin durumunu görüntüleyebilirsiniz:

    oc get machineset -n openshift-machine-api
    oc get machine -n openshift-machine-api
    

    Makineler sağlandıktan sonra (5-15 dakika sürebilir), makineler düğüm listesinde düğüm olarak gösterilir:

    oc get nodes
    

    Daha önce oluşturulmuş olan ada sahip nvidia-worker-southcentralus1 bir düğüm görmeniz gerekir.

NVIDIA GPU operatörünü yükleme

Bu bölümde ad alanının nvidia-gpu-operator nasıl oluşturulacağı, operatör grubunun nasıl ayarlanacağı ve NVIDIA GPU işlecinin nasıl yükleneceği açıklanmaktadır.

  1. NVIDIA ad alanı oluşturun.

    cat <<EOF | oc apply -f -
    apiVersion: v1
    kind: Namespace
    metadata:
      name: nvidia-gpu-operator
    EOF
    
  2. İşleç Grubu Oluştur.

    cat <<EOF | oc apply -f -
    apiVersion: operators.coreos.com/v1
    kind: OperatorGroup
    metadata:
      name: nvidia-gpu-operator-group
      namespace: nvidia-gpu-operator
    spec:
     targetNamespaces:
     - nvidia-gpu-operator
    EOF
    
  3. Aşağıdaki komutu kullanarak en son NVIDIA kanalını edinin:

    CHANNEL=$(oc get packagemanifest gpu-operator-certified -n openshift-marketplace -o jsonpath='{.status.defaultChannel}')
    

Uyarı

Kümeniz çekme gizli dizisi sağlanmadan oluşturulduysa, küme Red Hat'ten veya sertifikalı iş ortaklarından örnekler veya işleçler içermez. Bu, aşağıdaki hata iletisiyle sonuçlanır:

Sunucudan hata (NotFound): packagemanifests.packages.operators.coreos.com "gpu-operator-certified" bulunamadı.

Azure Red Hat OpenShift kümesine Red Hat çekme gizli dizinizi eklemek için bu kılavuzu izleyin.

  1. Aşağıdaki komutu kullanarak en son NVIDIA paketini alın:

    PACKAGE=$(oc get packagemanifests/gpu-operator-certified -n openshift-marketplace -ojson | jq -r '.status.channels[] | select(.name == "'$CHANNEL'") | .currentCSV')
    
  2. Abonelik Oluştur'u seçin.

    envsubst  <<EOF | oc apply -f -
    apiVersion: operators.coreos.com/v1alpha1
    kind: Subscription
    metadata:
      name: gpu-operator-certified
      namespace: nvidia-gpu-operator
    spec:
      channel: "$CHANNEL"
      installPlanApproval: Automatic
      name: gpu-operator-certified
      source: certified-operators
      sourceNamespace: openshift-marketplace
      startingCSV: "$PACKAGE"
    EOF
    
  3. İşleç'in yüklemeyi bitirmesini bekleyin.

    Operatörün yüklenmesinin tamamlandığını doğrulayana kadar devam etmeyin. Ayrıca GPU çalışanınızın çevrimiçi olduğundan emin olun.

    Ad alanında yüklü işleçlerin ekran görüntüsü.

Düğüm özellik bulma işlecini yükleme

Düğüm özellik bulma işleci, düğümlerinizdeki GPU'ları bulur ve düğümleri uygun şekilde etiketleyerek iş yükleri için hedefleyebilirsiniz.

Bu örnek, NFD işlecini openshift-ndf ad alanına yükler ve NFD yapılandırması olan "aboneliği" oluşturur.

Düğüm Özellik Bulma İşlecini Yüklemek için Resmi Belgeler.

  1. Namespace öğesini ayarlayın.

    cat <<EOF | oc apply -f -
    apiVersion: v1
    kind: Namespace
    metadata:
      name: openshift-nfd
    EOF
    
  2. OperatorGroup oluşturun.

    cat <<EOF | oc apply -f -
    apiVersion: operators.coreos.com/v1
    kind: OperatorGroup
    metadata:
      generateName: openshift-nfd-
      name: openshift-nfd
      namespace: openshift-nfd
    EOF
    
  3. Subscription oluşturun.

    cat <<EOF | oc apply -f -
    apiVersion: operators.coreos.com/v1alpha1
    kind: Subscription
    metadata:
      name: nfd
      namespace: openshift-nfd
    spec:
      channel: "stable"
      installPlanApproval: Automatic
      name: nfd
      source: redhat-operators
      sourceNamespace: openshift-marketplace
    EOF
    
  4. Düğüm Özelliği bulma işleminin yüklemeyi tamamlanmasını bekleyin.

    İşleçleri görüntülemek veya yalnızca birkaç dakika beklemek için OpenShift konsolunuzda oturum açabilirsiniz. İşlecin yüklenmesi beklenememesi sonraki adımda bir hataya neden olur.

  5. NFD Örneği oluşturun.

    cat <<EOF | oc apply -f -
    kind: NodeFeatureDiscovery
    apiVersion: nfd.openshift.io/v1
    metadata:
      name: nfd-instance
      namespace: openshift-nfd
    spec:
      customConfig:
        configData: |
          #    - name: "more.kernel.features"
          #      matchOn:
          #      - loadedKMod: ["example_kmod3"]
          #    - name: "more.features.by.nodename"
          #      value: customValue
          #      matchOn:
          #      - nodename: ["special-.*-node-.*"]
      operand:
        image: >-
          registry.redhat.io/openshift4/ose-node-feature-discovery@sha256:07658ef3df4b264b02396e67af813a52ba416b47ab6e1d2d08025a350ccd2b7b
        servicePort: 12000
      workerConfig:
        configData: |
          core:
          #  labelWhiteList:
          #  noPublish: false
            sleepInterval: 60s
          #  sources: [all]
          #  klog:
          #    addDirHeader: false
          #    alsologtostderr: false
          #    logBacktraceAt:
          #    logtostderr: true
          #    skipHeaders: false
          #    stderrthreshold: 2
          #    v: 0
          #    vmodule:
          ##   NOTE: the following options are not dynamically run-time
          ##          configurable and require a nfd-worker restart to take effect
          ##          after being changed
          #    logDir:
          #    logFile:
          #    logFileMaxSize: 1800
          #    skipLogHeaders: false
          sources:
          #  cpu:
          #    cpuid:
          ##     NOTE: attributeWhitelist has priority over attributeBlacklist
          #      attributeBlacklist:
          #        - "BMI1"
          #        - "BMI2"
          #        - "CLMUL"
          #        - "CMOV"
          #        - "CX16"
          #        - "ERMS"
          #        - "F16C"
          #        - "HTT"
          #        - "LZCNT"
          #        - "MMX"
          #        - "MMXEXT"
          #        - "NX"
          #        - "POPCNT"
          #        - "RDRAND"
          #        - "RDSEED"
          #        - "RDTSCP"
          #        - "SGX"
          #        - "SSE"
          #        - "SSE2"
          #        - "SSE3"
          #        - "SSE4.1"
          #        - "SSE4.2"
          #        - "SSSE3"
          #      attributeWhitelist:
          #  kernel:
          #    kconfigFile: "/path/to/kconfig"
          #    configOpts:
          #      - "NO_HZ"
          #      - "X86"
          #      - "DMI"
            pci:
              deviceClassWhitelist:
                - "0200"
                - "03"
                - "12"
              deviceLabelFields:
          #      - "class"
                - "vendor"
          #      - "device"
          #      - "subsystem_vendor"
          #      - "subsystem_device"
          #  usb:
          #    deviceClassWhitelist:
          #      - "0e"
          #      - "ef"
          #      - "fe"
          #      - "ff"
          #    deviceLabelFields:
          #      - "class"
          #      - "vendor"
          #      - "device"
          #  custom:
          #    - name: "my.kernel.feature"
          #      matchOn:
          #        - loadedKMod: ["example_kmod1", "example_kmod2"]
          #    - name: "my.pci.feature"
          #      matchOn:
          #        - pciId:
          #            class: ["0200"]
          #            vendor: ["15b3"]
          #            device: ["1014", "1017"]
          #        - pciId :
          #            vendor: ["8086"]
          #            device: ["1000", "1100"]
          #    - name: "my.usb.feature"
          #      matchOn:
          #        - usbId:
          #          class: ["ff"]
          #          vendor: ["03e7"]
          #          device: ["2485"]
          #        - usbId:
          #          class: ["fe"]
          #          vendor: ["1a6e"]
          #          device: ["089a"]
          #    - name: "my.combined.feature"
          #      matchOn:
          #        - pciId:
          #            vendor: ["15b3"]
          #            device: ["1014", "1017"]
          #          loadedKMod : ["vendor_kmod1", "vendor_kmod2"]
    EOF
    
  6. NFD'nin hazır olduğunu doğrulayın.

    Bu işlecin durumu Kullanılabilir olarak gösterilmelidir.

    Düğüm özellik bulma işlecinin ekran görüntüsü.

NVIDIA Küme Yapılandırması Uygula

Bu bölümde NVIDIA küme yapılandırmasının nasıl uygulanacağı açıklanmaktadır. Kendi özel depolarınız veya belirli ayarlarınız varsa lütfen bunu özelleştirmeye ilişkin NVIDIA belgelerini okuyun. Bu işlemin tamamlanması birkaç dakika sürebilir.

  1. Küme yapılandırması uygulama.

    cat <<EOF | oc apply -f -
    apiVersion: nvidia.com/v1
    kind: ClusterPolicy
    metadata:
      name: gpu-cluster-policy
    spec:
      migManager:
        enabled: true
      operator:
        defaultRuntime: crio
        initContainer: {}
        runtimeClass: nvidia
        deployGFD: true
      dcgm:
        enabled: true
      gfd: {}
      dcgmExporter:
        config:
          name: ''
      driver:
        licensingConfig:
          nlsEnabled: false
          configMapName: ''
        certConfig:
          name: ''
        kernelModuleConfig:
          name: ''
        repoConfig:
          configMapName: ''
        virtualTopology:
          config: ''
        enabled: true
        use_ocp_driver_toolkit: true
      devicePlugin: {}
      mig:
        strategy: single
      validator:
        plugin:
          env:
            - name: WITH_WORKLOAD
              value: 'true'
      nodeStatusExporter:
        enabled: true
      daemonsets: {}
      toolkit:
        enabled: true
    EOF
    
  2. Küme ilkesini doğrulayın.

    OpenShift konsolunda oturum açın ve işleçlere göz atın. Ad alanında olduğunuzdan nvidia-gpu-operator emin olun. Şöyle demelidir: State: Ready once everything is complete.

    OpenShift konsolundaki mevcut küme ilkelerinin ekran görüntüsü.

GPU'ları doğrulama

NVIDIA Operatörünün ve NFD'nin makineleri tamamen yüklemesi ve kendi kendine tanımlaması biraz zaman alabilir. Her şeyin beklendiği gibi çalıştığını doğrulamak için aşağıdaki komutları çalıştırın:

  1. NFD'nin GPU'larınızı görebildiğini doğrulayın.

    oc describe node | egrep 'Roles|pci-10de' | grep -v master
    

    Çıktı aşağıdakine benzer görünmelidir:

    Roles:              worker
                    feature.node.kubernetes.io/pci-10de.present=true
    
  2. Düğüm etiketlerini doğrulayın.

    OpenShift konsolunda oturum açarak düğüm etiketlerini görebilirsiniz -> İşlem -> Düğümler -> nvidia-worker-southcentralus1-. Yukarıdan birden fazla NVIDIA GPU etiketi ve pci-10de cihazı görmeniz gerekir.

    OpenShift konsolundaki GPU etiketlerinin ekran görüntüsü.

  3. NVIDIA SMI aracı doğrulaması.

    oc project nvidia-gpu-operator
    for i in $(oc get pod -lopenshift.driver-toolkit=true --no-headers |awk '{print $1}'); do echo $i; oc exec -it $i -- nvidia-smi ; echo -e '\n' ;  done
    

    Bu örnek ekran görüntüsü gibi konakta bulunan GPU'ları gösteren bir çıktı görmeniz gerekir. (GPU çalışan türüne bağlı olarak değişir)

    Kullanılabilir GPU'ları gösteren çıkışın ekran görüntüsü.

  4. GPU iş yükünü çalıştırmak için Pod oluşturma

    oc project nvidia-gpu-operator
    cat <<EOF | oc apply -f -
    apiVersion: v1
    kind: Pod
    metadata:
      name: cuda-vector-add
    spec:
      restartPolicy: OnFailure
      containers:
        - name: cuda-vector-add
          image: "quay.io/giantswarm/nvidia-gpu-demo:latest"
          resources:
            limits:
              nvidia.com/gpu: 1
          nodeSelector:
            nvidia.com/gpu.present: true
    EOF
    
  5. Günlükleri görüntüleyin.

    oc logs cuda-vector-add --tail=-1
    

Uyarı

Hata Error from server (BadRequest): container "cuda-vector-add" in pod "cuda-vector-add" is waiting to start: ContainerCreatingalırsanız yukarıdaki create deyimini çalıştırmayı oc delete pod cuda-vector-add ve yeniden çalıştırmayı deneyin.

Çıkış aşağıdakine benzer olmalıdır (GPU'ya bağlı olarak):

[Vector addition of 5000 elements]
Copy input data from the host memory to the CUDA device
CUDA kernel launch with 196 blocks of 256 threads
Copy output data from the CUDA device to the host memory
Test PASSED
Done

Başarılı olursa pod silinebilir:

oc delete pod cuda-vector-add