Azure Stack Edge Pro'nuzda GPU paylaşımını kullanarak Kubernetes iş yükü dağıtma
Bu makalede, kapsayıcılı iş yüklerinin Azure Stack Edge Pro GPU cihazınızda GPU'ları nasıl paylaşabileceği açıklanmaktadır. Bu makalede, biri GPU bağlam paylaşımı olmadan, diğeri de cihazdaki Çok İşlemli Hizmet (MPS) aracılığıyla etkinleştirilmiş bağlam paylaşımı olan iki iş çalıştıracaksınız. Daha fazla bilgi için bkz . Çoklu İşlem Hizmeti.
Önkoşullar
Başlamadan önce aşağıdakilerden emin olun:
Etkinleştirilmiş ve işlemi yapılandırılmış bir Azure Stack Edge Pro GPU cihazına erişiminiz var. Kubernetes API uç noktanız var ve bu uç noktayı
hosts
istemcinizdeki cihaza erişecek dosyaya eklediniz.Desteklenen işletim sistemine sahip bir istemci sistemine erişiminiz var. Windows istemcisi kullanıyorsanız, sistem cihaza erişmek için PowerShell 5.0 veya sonraki bir sürümü çalıştırmalıdır.
Bir ad alanı ve kullanıcı oluşturdunuz. Kullanıcıya bu ad alanına erişim de vermişsinizdir. Cihazınıza erişmek için kullanacağınız istemci sisteminde bu ad alanının kubeconfig dosyası yüklüdür. Ayrıntılı yönergeler için bkz. Azure Stack Edge Pro GPU cihazınızda kubectl aracılığıyla kubernetes kümesine Bağlan ve bu kümeyi yönetme.
Aşağıdaki dağıtımı
yaml
yerel sisteminize kaydedin. Kubernetes dağıtımlarını çalıştırmak için bu dosyayı kullanacaksınız. Bu dağıtım, Nvidia tarafından genel kullanıma sunulan Basit CUDA kapsayıcılarını temel alır.apiVersion: batch/v1 kind: Job metadata: name: cuda-sample1 spec: template: spec: hostPID: true hostIPC: true containers: - name: cuda-sample-container1 image: nvidia/samples:nbody command: ["/tmp/nbody"] args: ["-benchmark", "-i=1000"] env: - name: NVIDIA_VISIBLE_DEVICES value: "0" restartPolicy: "Never" backoffLimit: 1 --- apiVersion: batch/v1 kind: Job metadata: name: cuda-sample2 spec: template: metadata: spec: hostPID: true hostIPC: true containers: - name: cuda-sample-container2 image: nvidia/samples:nbody command: ["/tmp/nbody"] args: ["-benchmark", "-i=1000"] env: - name: NVIDIA_VISIBLE_DEVICES value: "0" restartPolicy: "Never" backoffLimit: 1
GPU sürücüsünü, CUDA sürümünü doğrulama
İlk adım, cihazınızın gerekli GPU sürücüsünü ve CUDA sürümlerini çalıştırdığını doğrulamaktır.
Cihazınızın PowerShell arabirimine Bağlan.
Şu komutu çalıştırın:
Get-HcsGpuNvidiaSmi
Nvidia smi çıkışında, cihazınızdaKI GPU sürümünü ve CUDA sürümünü not edin. Azure Stack Edge 2102 yazılımı çalıştırıyorsanız, bu sürüm aşağıdaki sürücü sürümlerine karşılık gelir:
- GPU sürücüsü sürümü: 460.32.03
- CUDA sürümü: 11.2
Aşağıda örnek bir çıkış verilmiştir:
[10.100.10.10]: PS>Get-HcsGpuNvidiaSmi K8S-1HXQG13CL-1HXQG13: Wed Mar 3 12:24:27 2021 +-----------------------------------------------------------------------------+ | NVIDIA-SMI 460.32.03 Driver Version: 460.32.03 CUDA Version: 11.2 | |-------------------------------+----------------------+----------------------+ | GPU Name Persistence-M| Bus-Id Disp.A | Volatile Uncorr. ECC | | Fan Temp Perf Pwr:Usage/Cap| Memory-Usage | GPU-Util Compute M. | | | | MIG M. | |===============================+======================+======================| | 0 Tesla T4 On | 00002C74:00:00.0 Off | 0 | | N/A 34C P8 9W / 70W | 0MiB / 15109MiB | 0% Default | | | | N/A | +-------------------------------+----------------------+----------------------+ +-----------------------------------------------------------------------------+ | Processes: | | GPU GI CI PID Type Process name GPU Memory | | ID ID Usage | |=============================================================================| | No running processes found | +-----------------------------------------------------------------------------+ [10.100.10.10]: PS>
Bu oturumu açık tutun, makale boyunca Nvidia smi çıkışını görüntülemek için kullanacaksınız.
Bağlam paylaşımı olmayan iş
Ad alanında mynamesp1
cihazınızda bir uygulama dağıtmak için ilk işi çalıştıracaksınız. Bu uygulama dağıtımı, GPU bağlam paylaşımının varsayılan olarak etkinleştirilmediğini de gösterir.
Ad alanında çalışan tüm podları listeleyin. Şu komutu çalıştırın:
kubectl get pods -n <Name of the namespace>
Aşağıda örnek bir çıkış verilmiştir:
PS C:\WINDOWS\system32> kubectl get pods -n mynamesp1 No resources found.
Daha önce sağlanan deployment.yaml dosyasını kullanarak cihazınızda bir dağıtım işi başlatın. Şu komutu çalıştırın:
kubectl apply -f <Path to the deployment .yaml> -n <Name of the namespace>
Bu iş iki kapsayıcı oluşturur ve her iki kapsayıcıda da bir n gövde benzetimi çalıştırır. Simülasyon yinelemelerinin sayısı içinde
.yaml
belirtilir.Aşağıda örnek bir çıkış verilmiştir:
PS C:\WINDOWS\system32> kubectl apply -f -n mynamesp1 C:\gpu-sharing\k8-gpusharing.yaml job.batch/cuda-sample1 created job.batch/cuda-sample2 created PS C:\WINDOWS\system32>
Dağıtımda başlatılan podları listelemek için aşağıdaki komutu çalıştırın:
kubectl get pods -n <Name of the namespace>
Aşağıda örnek bir çıkış verilmiştir:
PS C:\WINDOWS\system32> kubectl get pods -n mynamesp1 NAME READY STATUS RESTARTS AGE cuda-sample1-27srm 1/1 Running 0 28s cuda-sample2-db9vx 1/1 Running 0 27s PS C:\WINDOWS\system32>
Cihazınızda çalışan iki pod
cuda-sample1-cf979886d-xcwsq
cuda-sample2-68b4899948-vcv68
vardır.Podların ayrıntılarını getirin. Şu komutu çalıştırın:
kubectl -n <Name of the namespace> describe <Name of the job>
Aşağıda örnek bir çıkış verilmiştir:
PS C:\WINDOWS\system32> kubectl -n mynamesp1 describe job.batch/cuda-sample1; kubectl -n mynamesp1 describe job.batch/cuda-sample2 Name: cuda-sample1 Namespace: mynamesp1 Selector: controller-uid=22783f76-6af1-490d-b6eb-67dd4cda0e1f Labels: controller-uid=22783f76-6af1-490d-b6eb-67dd4cda0e1f job-name=cuda-sample1 Annotations: kubectl.kubernetes.io/last-applied-configuration: {"apiVersion":"batch/v1","kind":"Job","metadata":{"annotations":{},"name":"cuda-sample1","namespace":"mynamesp1"},"spec":{"backoffLimit":1... Parallelism: 1 Completions: 1 Start Time: Wed, 03 Mar 2021 12:25:34 -0800 Pods Statuses: 1 Running / 0 Succeeded / 0 Failed Pod Template: Labels: controller-uid=22783f76-6af1-490d-b6eb-67dd4cda0e1f job-name=cuda-sample1 Containers: cuda-sample-container1: Image: nvidia/samples:nbody Port: <none> Host Port: <none> Command: /tmp/nbody Args: -benchmark -i=10000 Environment: NVIDIA_VISIBLE_DEVICES: 0 Mounts: <none> Volumes: <none> Events: Type Reason Age From Message ---- ------ ---- ---- ------- Normal SuccessfulCreate 60s job-controller Created pod: cuda-sample1-27srm Name: cuda-sample2 Namespace: mynamesp1 Selector: controller-uid=e68c8d5a-718e-4880-b53f-26458dc24381 Labels: controller-uid=e68c8d5a-718e-4880-b53f-26458dc24381 job-name=cuda-sample2 Annotations: kubectl.kubernetes.io/last-applied-configuration: {"apiVersion":"batch/v1","kind":"Job","metadata":{"annotations":{},"name":"cuda-sample2","namespace":"mynamesp1"},"spec":{"backoffLimit":1... Parallelism: 1 Completions: 1 Start Time: Wed, 03 Mar 2021 12:25:35 -0800 Pods Statuses: 1 Running / 0 Succeeded / 0 Failed Pod Template: Labels: controller-uid=e68c8d5a-718e-4880-b53f-26458dc24381 job-name=cuda-sample2 Containers: cuda-sample-container2: Image: nvidia/samples:nbody Port: <none> Host Port: <none> Command: /tmp/nbody Args: -benchmark -i=10000 Environment: NVIDIA_VISIBLE_DEVICES: 0 Mounts: <none> Volumes: <none> Events: Type Reason Age From Message ---- ------ ---- ---- ------- Normal SuccessfulCreate 60s job-controller Created pod: cuda-sample2-db9vx PS C:\WINDOWS\system32>
Çıktı, her iki pod'un da iş tarafından başarıyla oluşturulduğunu gösterir.
Her iki kapsayıcı da n gövde benzetimini çalıştırırken Nvidia smi çıkışından GPU kullanımını görüntüleyin. Cihazın PowerShell arabirimine gidin ve komutunu çalıştırın
Get-HcsGpuNvidiaSmi
.Her iki kapsayıcı da n gövde benzetimini çalıştırırken örnek bir çıkış aşağıda verilmiştir:
[10.100.10.10]: PS>Get-HcsGpuNvidiaSmi K8S-1HXQG13CL-1HXQG13: Wed Mar 3 12:26:41 2021 +-----------------------------------------------------------------------------+ | NVIDIA-SMI 460.32.03 Driver Version: 460.32.03 CUDA Version: 11.2 | |-------------------------------+----------------------+----------------------+ | GPU Name Persistence-M| Bus-Id Disp.A | Volatile Uncorr. ECC | | Fan Temp Perf Pwr:Usage/Cap| Memory-Usage | GPU-Util Compute M. | | | | MIG M. | |===============================+======================+======================| | 0 Tesla T4 On | 00002C74:00:00.0 Off | 0 | | N/A 64C P0 69W / 70W | 221MiB / 15109MiB | 100% Default | | | | N/A | +-------------------------------+----------------------+----------------------+ +-----------------------------------------------------------------------------+ | Processes: | | GPU GI CI PID Type Process name GPU Memory | | ID ID Usage | |=============================================================================| | 0 N/A N/A 197976 C /tmp/nbody 109MiB | | 0 N/A N/A 198051 C /tmp/nbody 109MiB | +-----------------------------------------------------------------------------+ [10.100.10.10]: PS>
Gördüğünüz gibi, GPU 0'da n gövde benzetimi ile çalışan iki kapsayıcı (Tür = C) vardır.
N gövde benzetimini izleyin.
get pod
Komutları çalıştırın. Simülasyon çalışırken örnek bir çıkış aşağıda verilmiştir.PS C:\WINDOWS\system32> kubectl get pods -n mynamesp1 NAME READY STATUS RESTARTS AGE cuda-sample1-27srm 1/1 Running 0 70s cuda-sample2-db9vx 1/1 Running 0 69s PS C:\WINDOWS\system32>
Simülasyon tamamlandığında çıkış bunu gösterir. Aşağıda örnek bir çıkış verilmiştir:
PS C:\WINDOWS\system32> kubectl get pods -n mynamesp1 NAME READY STATUS RESTARTS AGE cuda-sample1-27srm 0/1 Completed 0 2m54s cuda-sample2-db9vx 0/1 Completed 0 2m53s PS C:\WINDOWS\system32>
Simülasyon tamamlandıktan sonra günlükleri ve simülasyonun tamamlanması için toplam süreyi görüntüleyebilirsiniz. Şu komutu çalıştırın:
kubectl logs -n <Name of the namespace> <pod name>
Aşağıda örnek bir çıkış verilmiştir:
PS C:\WINDOWS\system32> kubectl logs -n mynamesp1 cuda-sample1-27srm Run "nbody -benchmark [-numbodies=<numBodies>]" to measure performance. ===========// CUT //===================// CUT //===================== > Windowed mode > Simulation data stored in video memory > Single precision floating point simulation > 1 Devices used for simulation GPU Device 0: "Turing" with compute capability 7.5 > Compute 7.5 CUDA device: [Tesla T4] 40960 bodies, total time for 10000 iterations: 170398.766 ms = 98.459 billion interactions per second = 1969.171 single-precision GFLOP/s at 20 flops per interaction PS C:\WINDOWS\system32>
PS C:\WINDOWS\system32> kubectl logs -n mynamesp1 cuda-sample2-db9vx Run "nbody -benchmark [-numbodies=<numBodies>]" to measure performance. ===========// CUT //===================// CUT //===================== > Windowed mode > Simulation data stored in video memory > Single precision floating point simulation > 1 Devices used for simulation GPU Device 0: "Turing" with compute capability 7.5 > Compute 7.5 CUDA device: [Tesla T4] 40960 bodies, total time for 10000 iterations: 170368.859 ms = 98.476 billion interactions per second = 1969.517 single-precision GFLOP/s at 20 flops per interaction PS C:\WINDOWS\system32>
Şu anda GPU üzerinde çalışan bir işlem olmamalıdır. Nvidia smi çıkışını kullanarak GPU kullanımını görüntüleyerek bunu doğrulayabilirsiniz.
[10.100.10.10]: PS>Get-HcsGpuNvidiaSmi K8S-1HXQG13CL-1HXQG13: Wed Mar 3 12:32:52 2021 +-----------------------------------------------------------------------------+ | NVIDIA-SMI 460.32.03 Driver Version: 460.32.03 CUDA Version: 11.2 | |-------------------------------+----------------------+----------------------+ | GPU Name Persistence-M| Bus-Id Disp.A | Volatile Uncorr. ECC | | Fan Temp Perf Pwr:Usage/Cap| Memory-Usage | GPU-Util Compute M. | | | | MIG M. | |===============================+======================+======================| | 0 Tesla T4 On | 00002C74:00:00.0 Off | 0 | | N/A 38C P8 9W / 70W | 0MiB / 15109MiB | 0% Default | | | | N/A | +-------------------------------+----------------------+----------------------+ +-----------------------------------------------------------------------------+ | Processes: | | GPU GI CI PID Type Process name GPU Memory | | ID ID Usage | |=============================================================================| | No running processes found | +-----------------------------------------------------------------------------+ [10.100.10.10]: PS>
Bağlam paylaşımı ile iş
MPS'de GPU bağlam paylaşımı etkinleştirildiğinde iki CUDA kapsayıcısına n gövde benzetimini dağıtmak için ikinci işi çalıştıracaksınız. İlk olarak, cihazda MPS'yi etkinleştireceksiniz.
Cihazınızın PowerShell arabirimine Bağlan.
Cihazınızda MPS'yi etkinleştirmek için komutunu çalıştırın
Start-HcsGpuMPS
.[10.100.10.10]: PS>Start-HcsGpuMPS K8S-1HXQG13CL-1HXQG13: Set compute mode to EXCLUSIVE_PROCESS for GPU 00002C74:00:00.0. All done. Created nvidia-mps.service [10.100.10.10]: PS>
daha önce kullandığınız dağıtımı
yaml
kullanarak işi çalıştırın. Mevcut dağıtımı silmeniz gerekebilir. Bkz. Dağıtımı silme.Aşağıda örnek bir çıkış verilmiştir:
PS C:\WINDOWS\system32> kubectl -n mynamesp1 delete -f C:\gpu-sharing\k8-gpusharing.yaml job.batch "cuda-sample1" deleted job.batch "cuda-sample2" deleted PS C:\WINDOWS\system32> kubectl get pods -n mynamesp1 No resources found. PS C:\WINDOWS\system32> kubectl -n mynamesp1 apply -f C:\gpu-sharing\k8-gpusharing.yaml job.batch/cuda-sample1 created job.batch/cuda-sample2 created PS C:\WINDOWS\system32> kubectl get pods -n mynamesp1 NAME READY STATUS RESTARTS AGE cuda-sample1-vcznt 1/1 Running 0 21s cuda-sample2-zkx4w 1/1 Running 0 21s PS C:\WINDOWS\system32> kubectl -n mynamesp1 describe job.batch/cuda-sample1; kubectl -n mynamesp1 describe job.batch/cuda-sample2 Name: cuda-sample1 Namespace: mynamesp1 Selector: controller-uid=ed06bdf0-a282-4b35-a2a0-c0d36303a35e Labels: controller-uid=ed06bdf0-a282-4b35-a2a0-c0d36303a35e job-name=cuda-sample1 Annotations: kubectl.kubernetes.io/last-applied-configuration: {"apiVersion":"batch/v1","kind":"Job","metadata":{"annotations":{},"name":"cuda-sample1","namespace":"mynamesp1"},"spec":{"backoffLimit":1... Parallelism: 1 Completions: 1 Start Time: Wed, 03 Mar 2021 21:51:51 -0800 Pods Statuses: 1 Running / 0 Succeeded / 0 Failed Pod Template: Labels: controller-uid=ed06bdf0-a282-4b35-a2a0-c0d36303a35e job-name=cuda-sample1 Containers: cuda-sample-container1: Image: nvidia/samples:nbody Port: <none> Host Port: <none> Command: /tmp/nbody Args: -benchmark -i=10000 Environment: NVIDIA_VISIBLE_DEVICES: 0 Mounts: <none> Volumes: <none> Events: Type Reason Age From Message ---- ------ ---- ---- ------- Normal SuccessfulCreate 46s job-controller Created pod: cuda-sample1-vcznt Name: cuda-sample2 Namespace: mynamesp1 Selector: controller-uid=6282b8fa-e76d-4f45-aa85-653ee0212b29 Labels: controller-uid=6282b8fa-e76d-4f45-aa85-653ee0212b29 job-name=cuda-sample2 Annotations: kubectl.kubernetes.io/last-applied-configuration: {"apiVersion":"batch/v1","kind":"Job","metadata":{"annotations":{},"name":"cuda-sample2","namespace":"mynamesp1"},"spec":{"backoffLimit":1... Parallelism: 1 Completions: 1 Start Time: Wed, 03 Mar 2021 21:51:51 -0800 Pods Statuses: 1 Running / 0 Succeeded / 0 Failed Pod Template: Labels: controller-uid=6282b8fa-e76d-4f45-aa85-653ee0212b29 job-name=cuda-sample2 Containers: cuda-sample-container2: Image: nvidia/samples:nbody Port: <none> Host Port: <none> Command: /tmp/nbody Args: -benchmark -i=10000 Environment: NVIDIA_VISIBLE_DEVICES: 0 Mounts: <none> Volumes: <none> Events: Type Reason Age From Message ---- ------ ---- ---- ------- Normal SuccessfulCreate 47s job-controller Created pod: cuda-sample2-zkx4w PS C:\WINDOWS\system32>
Simülasyon çalışırken Nvidia smi çıkışını görüntüleyebilirsiniz. Çıktı, n gövde benzetimi ve MPS hizmeti (C türü) ile çalışan cuda kapsayıcılarına (M + C türü) karşılık gelen işlemleri gösterir. Tüm bu işlemler GPU 0'a sahip olur.
PS>Get-HcsGpuNvidiaSmi K8S-1HXQG13CL-1HXQG13: Mon Mar 3 21:54:50 2021 +-----------------------------------------------------------------------------+ | NVIDIA-SMI 460.32.03 Driver Version: 460.32.03 CUDA Version: 11.2 | |-------------------------------+----------------------+----------------------+ | GPU Name Persistence-M| Bus-Id Disp.A | Volatile Uncorr. ECC | | Fan Temp Perf Pwr:Usage/Cap| Memory-Usage | GPU-Util Compute M. | | | | MIG M. | |===============================+======================+======================| | 0 Tesla T4 On | 0000E00B:00:00.0 Off | 0 | | N/A 45C P0 68W / 70W | 242MiB / 15109MiB | 100% E. Process | | | | N/A | +-------------------------------+----------------------+----------------------+ +-----------------------------------------------------------------------------+ | Processes: | | GPU GI CI PID Type Process name GPU Memory | | ID ID Usage | |=============================================================================| | 0 N/A N/A 144377 M+C /tmp/nbody 107MiB | | 0 N/A N/A 144379 M+C /tmp/nbody 107MiB | | 0 N/A N/A 144443 C nvidia-cuda-mps-server 25MiB | +-----------------------------------------------------------------------------+
Simülasyon tamamlandıktan sonra günlükleri ve simülasyonun tamamlanması için toplam süreyi görüntüleyebilirsiniz. Şu komutu çalıştırın:
PS C:\WINDOWS\system32> kubectl get pods -n mynamesp1 NAME READY STATUS RESTARTS AGE cuda-sample1-vcznt 0/1 Completed 0 5m44s cuda-sample2-zkx4w 0/1 Completed 0 5m44s PS C:\WINDOWS\system32> kubectl logs -n mynamesp1 cuda-sample1-vcznt Run "nbody -benchmark [-numbodies=<numBodies>]" to measure performance. ===========// CUT //===================// CUT //===================== > Windowed mode > Simulation data stored in video memory > Single precision floating point simulation > 1 Devices used for simulation GPU Device 0: "Turing" with compute capability 7.5 > Compute 7.5 CUDA device: [Tesla T4] 40960 bodies, total time for 10000 iterations: 154979.453 ms = 108.254 billion interactions per second = 2165.089 single-precision GFLOP/s at 20 flops per interaction PS C:\WINDOWS\system32> kubectl logs -n mynamesp1 cuda-sample2-zkx4w Run "nbody -benchmark [-numbodies=<numBodies>]" to measure performance. ===========// CUT //===================// CUT //===================== > Windowed mode > Simulation data stored in video memory > Single precision floating point simulation > 1 Devices used for simulation GPU Device 0: "Turing" with compute capability 7.5 > Compute 7.5 CUDA device: [Tesla T4] 40960 bodies, total time for 10000 iterations: 154986.734 ms = 108.249 billion interactions per second = 2164.987 single-precision GFLOP/s at 20 flops per interaction PS C:\WINDOWS\system32>
Simülasyon tamamlandıktan sonra Nvidia smi çıkışını yeniden görüntüleyebilirsiniz. YALNıZCA MPS hizmeti için nvidia-cuda-mps-server işlemi çalışıyor olarak gösterilir.
PS>Get-HcsGpuNvidiaSmi K8S-1HXQG13CL-1HXQG13: Mon Mar 3 21:59:55 2021 +-----------------------------------------------------------------------------+ | NVIDIA-SMI 460.32.03 Driver Version: 460.32.03 CUDA Version: 11.2 | |-------------------------------+----------------------+----------------------+ | GPU Name Persistence-M| Bus-Id Disp.A | Volatile Uncorr. ECC | | Fan Temp Perf Pwr:Usage/Cap| Memory-Usage | GPU-Util Compute M. | | | | MIG M. | |===============================+======================+======================| | 0 Tesla T4 On | 0000E00B:00:00.0 Off | 0 | | N/A 37C P8 9W / 70W | 28MiB / 15109MiB | 0% E. Process | | | | N/A | +-------------------------------+----------------------+----------------------+ +-----------------------------------------------------------------------------+ | Processes: | | GPU GI CI PID Type Process name GPU Memory | | ID ID Usage | |=============================================================================| | 0 N/A N/A 144443 C nvidia-cuda-mps-server 25MiB | +-----------------------------------------------------------------------------+
Dağıtımı silme
MPS etkinken ve MPS devre dışıyken cihazınızda çalışırken dağıtımları silmeniz gerekebilir.
Cihazınızdaki dağıtımı silmek için aşağıdaki komutu çalıştırın:
kubectl delete -f <Path to the deployment .yaml> -n <Name of the namespace>
Aşağıda örnek bir çıkış verilmiştir:
PS C:\WINDOWS\system32> kubectl delete -f 'C:\gpu-sharing\k8-gpusharing.yaml' -n mynamesp1
deployment.apps "cuda-sample1" deleted
deployment.apps "cuda-sample2" deleted
PS C:\WINDOWS\system32>
Sonraki adımlar
- Azure Stack Edge Pro'nuzda GPU paylaşımı ile bir IoT Edge iş yükü dağıtın.