Azure Stack Edge Pro'nuzda GPU paylaşımını kullanarak IoT Edge 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. Yaklaşım, Çoklu İşlem Hizmeti'ni (MPS) etkinleştirmeyi ve ardından IoT Edge dağıtımı aracılığıyla GPU iş yüklerini belirtmeyi içerir.
Ön koşullar
Başlamadan önce aşağıdakilerden emin olun:
Etkinleştirilmiş ve işlem 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.
Aşağıdaki dağıtımı
json
yerel sisteminize kaydedin. IoT Edge dağıtımını çalıştırmak için bu dosyadaki bilgileri kullanacaksınız. Bu dağıtım, Nvidia tarafından genel kullanıma sunulan Basit CUDA kapsayıcılarını temel alır.{ "modulesContent": { "$edgeAgent": { "properties.desired": { "modules": { "cuda-sample1": { "settings": { "image": "nvidia/samples:nbody", "createOptions": "{\"Entrypoint\":[\"/bin/sh\"],\"Cmd\":[\"-c\",\"/tmp/nbody -benchmark -i=1000; while true; do echo no-op; sleep 10000;done\"],\"HostConfig\":{\"IpcMode\":\"host\",\"PidMode\":\"host\"}}" }, "type": "docker", "version": "1.0", "env": { "NVIDIA_VISIBLE_DEVICES": { "value": "0" } }, "status": "running", "restartPolicy": "never" }, "cuda-sample2": { "settings": { "image": "nvidia/samples:nbody", "createOptions": "{\"Entrypoint\":[\"/bin/sh\"],\"Cmd\":[\"-c\",\"/tmp/nbody -benchmark -i=1000; while true; do echo no-op; sleep 10000;done\"],\"HostConfig\":{\"IpcMode\":\"host\",\"PidMode\":\"host\"}}" }, "type": "docker", "version": "1.0", "env": { "NVIDIA_VISIBLE_DEVICES": { "value": "0" } }, "status": "running", "restartPolicy": "never" } }, "runtime": { "settings": { "minDockerVersion": "v1.25" }, "type": "docker" }, "schemaVersion": "1.1", "systemModules": { "edgeAgent": { "settings": { "image": "mcr.microsoft.com/azureiotedge-agent:1.0", "createOptions": "" }, "type": "docker" }, "edgeHub": { "settings": { "image": "mcr.microsoft.com/azureiotedge-hub:1.0", "createOptions": "{\"HostConfig\":{\"PortBindings\":{\"443/tcp\":[{\"HostPort\":\"443\"}],\"5671/tcp\":[{\"HostPort\":\"5671\"}],\"8883/tcp\":[{\"HostPort\":\"8883\"}]}}}" }, "type": "docker", "status": "running", "restartPolicy": "always" } } } }, "$edgeHub": { "properties.desired": { "routes": { "route": "FROM /messages/* INTO $upstream" }, "schemaVersion": "1.1", "storeAndForwardConfiguration": { "timeToLiveSecs": 7200 } } }, "cuda-sample1": { "properties.desired": {} }, "cuda-sample2": { "properties.desired": {} } } }
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: Tue Feb 23 10:34:01 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 | 0000041F:00:00.0 Off | 0 | | N/A 40C P8 15W / 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ı olmadan dağıtma
Artık Çok İşlemli Hizmet çalışmadığında ve bağlam paylaşımı olmadığında cihazınıza bir uygulama dağıtabilirsiniz. Dağıtım, cihazınızda bulunan ad alanında iotedge
Azure portalı üzerinden gerçekleştirilir.
IoT Edge ad alanında kullanıcı oluşturma
İlk olarak ad alanına bağlanacak iotedge
bir kullanıcı oluşturacaksınız. IoT Edge modülleri iotedge ad alanında dağıtılır. Daha fazla bilgi için bkz . Cihazınızdaki Kubernetes ad alanları.
Kullanıcı oluşturmak ve kullanıcıya ad alanına erişim vermek için iotedge
bu adımları izleyin.
Cihazınızın PowerShell arabirimine Bağlan.
Ad alanında
iotedge
yeni bir kullanıcı oluşturun. Şu komutu çalıştırın:New-HcsKubernetesUser -UserName <user name>
Aşağıda örnek bir çıkış verilmiştir:
[10.100.10.10]: PS>New-HcsKubernetesUser -UserName iotedgeuser apiVersion: v1 clusters: - cluster: certificate-authority-data: ===========================//snipped //======================// snipped //============================= server: https://compute.myasegpudev.wdshcsso.com:6443 name: kubernetes contexts: - context: cluster: kubernetes user: iotedgeuser name: iotedgeuser@kubernetes current-context: iotedgeuser@kubernetes kind: Config preferences: {} users: - name: iotedgeuser user: client-certificate-data: ===========================//snipped //======================// snipped //============================= client-key-data: ===========================//snipped //======================// snipped ============================ PQotLS0tLUVORCBSU0EgUFJJVkFURSBLRVktLS0tLQo=
Düz metin olarak görüntülenen çıkışı kopyalayın. Çıktıyı yerel makinenizdeki kullanıcı profilinizin klasörüne bir yapılandırma dosyası (uzantısı olmadan)
.kube
olarak kaydedin; örneğin,C:\Users\<username>\.kube
.Oluşturduğunuz kullanıcıya ad alanına erişim
iotedge
verin. Şu komutu çalıştırın:Grant-HcsKubernetesNamespaceAccess -Namespace iotedge -UserName <user name>
Aşağıda örnek bir çıkış verilmiştir:
[10.100.10.10]: PS>Grant-HcsKubernetesNamespaceAccess -Namespace iotedge -UserName iotedgeuser [10.100.10.10]: PS>
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.
Portal aracılığıyla modülleri dağıtma
Azure portalı aracılığıyla IoT Edge modüllerini dağıtın. N gövde simülasyonu çalıştıran genel kullanıma açık Nvidia CUDA örnek modüllerini dağıtacaksınız.
Cihazınızda IoT Edge hizmetinin çalıştığından emin olun.
Sağ bölmede IoT Edge kutucuğunu seçin. IoT Edge > Özellikleri'ne gidin. Sağ bölmede cihazınızla ilişkilendirilmiş IoT Hub kaynağını seçin.
IoT Hub kaynağında Otomatik Cihaz Yönetimi > IoT Edge'e gidin. Sağ bölmede, cihazınızla ilişkilendirilmiş IoT Edge cihazını seçin.
Modül ayarla’yı seçin.
+ Ekle + IoT Edge modülü'ne >tıklayın.
Modül Ayarlar sekmesinde IoT Edge modülü adını ve Görüntü URI'sini sağlayın. Görüntü çekme ilkesini Oluşturmada olarak ayarlayın.
Ortam Değişkenleri sekmesinde NVIDIA_VISIBLE_DEVICES 0 olarak belirtin.
Kapsayıcı Oluşturma Seçenekleri sekmesinde aşağıdaki seçenekleri sağlayın:
{ "Entrypoint": [ "/bin/sh" ], "Cmd": [ "-c", "/tmp/nbody -benchmark -i=1000; while true; do echo no-op; sleep 10000;done" ], "HostConfig": { "IpcMode": "host", "PidMode": "host" } }
Seçenekler aşağıdaki gibi görüntülenir:
Ekle'yi seçin.
Eklediğiniz modül Çalışıyor olarak gösterilmelidir.
İlk modülü eklerken izlediğiniz bir modülü eklemek için tüm adımları yineleyin. Bu örnekte, modülün adını olarak
cuda-sample2
belirtin.Her iki modül de aynı GPU'ya sahip olacak şekilde aynı ortam değişkenini kullanın.
İlk modül için sağladığınız kapsayıcı oluşturma seçeneklerini kullanın ve Ekle'yi seçin.
Modülleri ayarla sayfasında Gözden Geçir + Oluştur'u ve ardından Oluştur'u seçin.
Her iki modülün çalışma zamanı durumu artık Çalışıyor olarak gösterilmelidir.
İş yükü dağıtımlarını izleme
Yeni bir PowerShell oturumu açın.
Ad alanında
iotedge
çalışan podları listeleyin. Şu komutu çalıştırın:kubectl get pods -n iotedge
Aşağıda örnek bir çıkış verilmiştir:
PS C:\WINDOWS\system32> kubectl get pods -n iotedge --kubeconfig C:\GPU-sharing\kubeconfigs\configiotuser1 NAME READY STATUS RESTARTS AGE cuda-sample1-869989578c-ssng8 2/2 Running 0 5s cuda-sample2-6db6d98689-d74kb 2/2 Running 0 4s edgeagent-79f988968b-7p2tv 2/2 Running 0 6d21h edgehub-d6c764847-l8v4m 2/2 Running 0 24h iotedged-55fdb7b5c6-l9zn8 1/1 Running 1 6d21h PS C:\WINDOWS\system32>
Cihazınızda çalışan iki pod
cuda-sample1-97c494d7f-lnmns
cuda-sample2-d9f6c4688-2rld9
vardır.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: Fri Mar 5 13:31:16 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 52C 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 188342 C /tmp/nbody 109MiB | | 0 N/A N/A 188413 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ı vardır. Bunlara karşılık gelen bellek kullanımını da görüntüleyebilirsiniz.
Simülasyon tamamlandıktan sonra, Nvidia smi çıkışı cihazda çalışan hiçbir işlem olmadığını gösterecektir.
[10.100.10.10]: PS>Get-HcsGpuNvidiaSmi K8S-1HXQG13CL-1HXQG13: Fri Mar 5 13:54:48 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>
N gövdesi benzetimi tamamlandıktan sonra dağıtımın ayrıntılarını ve simülasyonun tamamlanması için gereken süreyi anlamak için günlükleri görüntüleyin.
İlk kapsayıcıdan örnek bir çıkış aşağıda verilmiştir:
PS C:\WINDOWS\system32> kubectl -n iotedge --kubeconfig C:\GPU-sharing\kubeconfigs\configiotuser1 logs cuda-sample1-869989578c-ssng8 cuda-sample1 Run "nbody -benchmark [-numbodies=<numBodies>]" to measure performance. ==============// snipped //===================// snipped //============= > 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: 170171.531 ms = 98.590 billion interactions per second = 1971.801 single-precision GFLOP/s at 20 flops per interaction no-op PS C:\WINDOWS\system32>
İkinci kapsayıcıdan örnek bir çıkış aşağıda verilmiştir:
PS C:\WINDOWS\system32> kubectl -n iotedge --kubeconfig C:\GPU-sharing\kubeconfigs\configiotuser1 logs cuda-sample2-6db6d98689-d74kb cuda-sample2 Run "nbody -benchmark [-numbodies=<numBodies>]" to measure performance. ==============// snipped //===================// snipped //============= > 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: 170054.969 ms = 98.658 billion interactions per second = 1973.152 single-precision GFLOP/s at 20 flops per interaction no-op PS C:\WINDOWS\system32>
Modül dağıtımını durdurun. Cihazınızın IoT Hub kaynağında:
Otomatik Cihaz Dağıtımı > IoT Edge'e gidin. Cihazınıza karşılık gelen IoT Edge cihazını seçin.
Modülleri ayarla'ya gidin ve bir modül seçin.
Modüller sekmesinde bir modül seçin.
Modül ayarları sekmesinde İstenen durumu durduruldu olarak ayarlayın. Güncelleştir'i seçin.
Cihaza dağıtılan ikinci modülü durdurmak için adımları yineleyin. Gözden Geçir + oluştur’u ve sonra da Oluştur’u seçin. Bu, dağıtımı güncelleştirmelidir.
Modüller sayfasını birden çok kez yenileyin. modülü Çalışma Zamanı durumu Durduruldu olarak gösterilene kadar.
Bağlam paylaşımı ile dağıtma
Artık cihazınızda MPS çalışırken n gövde benzetimini iki CUDA kapsayıcısı üzerinde dağıtabilirsiniz. İ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 0000191E:00:00.0. All done. Created nvidia-mps.service [10.100.10.10]: PS>
Cihazın PowerShell arabiriminden Nvidia smi çıkışını alın. İşlemi veya MPS hizmetinin cihazda çalıştığını görebilirsiniz
nvidia-cuda-mps-server
.Aşağıda örnek bir çıkış verilmiştir:
[10.100.10.10]: PS>Get-HcsGpuNvidiaSmi K8S-1HXQG13CL-1HXQG13: Thu Mar 4 12:37:39 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 36C 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 122792 C nvidia-cuda-mps-server 25MiB | +-----------------------------------------------------------------------------+ [10.100.10.10]: PS>Get-HcsGpuNvidiaSmi
Daha önce durdurduğunuz modülleri dağıtın. İstenen durumu Set modülleri aracılığıyla çalıştıracak şekilde ayarlayın.
Örnek çıktı aşağıda verilmiştir:
PS C:\WINDOWS\system32> kubectl get pods -n iotedge --kubeconfig C:\GPU-sharing\kubeconfigs\configiotuser1 NAME READY STATUS RESTARTS AGE cuda-sample1-869989578c-2zxh6 2/2 Running 0 44s cuda-sample2-6db6d98689-fn7mx 2/2 Running 0 44s edgeagent-79f988968b-7p2tv 2/2 Running 0 5d20h edgehub-d6c764847-l8v4m 2/2 Running 0 27m iotedged-55fdb7b5c6-l9zn8 1/1 Running 1 5d20h PS C:\WINDOWS\system32>
Modüllerin cihazınızda dağıtıldığını ve çalıştığını görebilirsiniz.
Modüller dağıtıldığında, n gövde benzetimi de her iki kapsayıcıda da çalışmaya başlar. Simülasyon ilk kapsayıcıda tamamlandığında örnek çıktı aşağıda verilmiştir:
PS C:\WINDOWS\system32> kubectl -n iotedge logs cuda-sample1-869989578c-2zxh6 cuda-sample1 Run "nbody -benchmark [-numbodies=<numBodies>]" to measure performance. ==============// snipped //===================// snipped //============= > 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: 155256.062 ms = 108.062 billion interactions per second = 2161.232 single-precision GFLOP/s at 20 flops per interaction no-op PS C:\WINDOWS\system32>
Simülasyon ikinci kapsayıcıda tamamlandığında örnek çıktı aşağıda verilmiştir:
PS C:\WINDOWS\system32> kubectl -n iotedge --kubeconfig C:\GPU-sharing\kubeconfigs\configiotuser1 logs cuda-sample2-6db6d98689-fn7mx cuda-sample2 Run "nbody -benchmark [-numbodies=<numBodies>]" to measure performance. ==============// snipped //===================// snipped //============= > 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: 155366.359 ms = 107.985 billion interactions per second = 2159.697 single-precision GFLOP/s at 20 flops per interaction no-op PS C:\WINDOWS\system32>
Her iki kapsayıcı da n gövde simülasyonunu çalıştırırken cihazın PowerShell arabiriminden Nvidia smi çıkışını alın. Burada örnek bir çıkış verilmiştir. Üç işlem vardır,
nvidia-cuda-mps-server
işlem (C türü) MPS hizmetine karşılık gelir ve/tmp/nbody
işlemler (M + C türü) modüller tarafından dağıtılan n gövde iş yüklerine karşılık gelir.[10.100.10.10]: PS>Get-HcsGpuNvidiaSmi K8S-1HXQG13CL-1HXQG13: Thu Mar 4 12:59:44 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 54C P0 69W / 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 56832 M+C /tmp/nbody 107MiB | | 0 N/A N/A 56900 M+C /tmp/nbody 107MiB | | 0 N/A N/A 122792 C nvidia-cuda-mps-server 25MiB | +-----------------------------------------------------------------------------+ [10.100.10.10]: PS>Get-HcsGpuNvidiaSmi
Sonraki adımlar
- Azure Stack Edge Pro'nuzda paylaşılan bir GPU Kubernetes iş yükü dağıtın.