Not
Bu sayfaya erişim yetkilendirme gerektiriyor. Oturum açmayı veya dizinleri değiştirmeyi deneyebilirsiniz.
Bu sayfaya erişim yetkilendirme gerektiriyor. Dizinleri değiştirmeyi deneyebilirsiniz.
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.
Azure portalda oturum açın.
Arama kutusuna kotalar girin ve İşlem'i seçin.
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.
Kotayı yapılandırın.
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.
cloud.redhat.com oturum açın.
https://cloud.redhat.com/openshift/install/azure/aro-provisioned adresine göz atın.
Ç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.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.jsoneklemek
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.jsonYeni gizli dizi dosyasını karşıya yükleyin.
oc set data secret/pull-secret -n openshift-config --from-file=.dockerconfigjson=new-pull-secret.jsonHer şeyin cloud.redhat.com eşitlenmesi için yaklaşık 1 saat beklemeniz gerekebilir.
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.
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')Örnek makine kümesinin bir kopyasını kaydedin.
oc get machineset -n openshift-machine-api $MACHINESET -o json > gpu_machineset.json.metadata.nameAlanı yeni bir benzersiz adla değiştirin.jq '.metadata.name = "nvidia-worker-<region><az>"' gpu_machineset.json| sponge gpu_machineset.jsonMakine 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.jsonAlanı, alanla
.spec.selector.matchLabels.machine.openshift.io/cluster-api-machineseteşleşecek şekilde.metadata.namedeğiştirin.jq '.spec.selector.matchLabels."machine.openshift.io/cluster-api-machineset" = "nvidia-worker-<region><az>"' gpu_machineset.json| sponge gpu_machineset.jsonalanını
.spec.template.metadata.labels.machine.openshift.io/cluster-api-machinesetalanla.metadata.nameeş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öğesini
spec.template.spec.providerSpec.value.vmSizeAzure'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öğesini
spec.template.spec.providerSpec.value.zoneAzure'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.statusyaml dosyasının bölümünü silin.jq 'del(.status)' gpu_machineset.json | sponge gpu_machineset.jsonyaml 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.
GPU Makinesi kümesini oluşturun.
oc create -f gpu_machineset.jsonBu komutun tamamlanması birkaç dakika sürer.
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-apiMakineler sağlandıktan sonra (5-15 dakika sürebilir), makineler düğüm listesinde düğüm olarak gösterilir:
oc get nodesDaha önce oluşturulmuş olan ada sahip
nvidia-worker-southcentralus1bir 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.
NVIDIA ad alanı oluşturun.
cat <<EOF | oc apply -f - apiVersion: v1 kind: Namespace metadata: name: nvidia-gpu-operator EOFİş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 EOFAş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.
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')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İş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.
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.
Namespaceöğesini ayarlayın.cat <<EOF | oc apply -f - apiVersion: v1 kind: Namespace metadata: name: openshift-nfd EOFOperatorGroupoluşturun.cat <<EOF | oc apply -f - apiVersion: operators.coreos.com/v1 kind: OperatorGroup metadata: generateName: openshift-nfd- name: openshift-nfd namespace: openshift-nfd EOFSubscriptionoluş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 EOFDüğü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.
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"] EOFNFD'nin hazır olduğunu doğrulayın.
Bu işlecin durumu Kullanılabilir olarak gösterilmelidir.
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.
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 EOFKü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-operatoremin olun. Şöyle demelidir:State: Ready once everything is complete.
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:
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=trueDüğü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.
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' ; doneBu ö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)
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 EOFGü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