Nasazení úlohy IoT Edge pomocí sdílení GPU ve službě Azure Stack Edge Pro
Tento článek popisuje, jak kontejnerizované úlohy můžou sdílet gpu na vašem zařízení Azure Stack Edge Pro GPU. Tento přístup zahrnuje povolení multiprocesové služby (MPS) a následné určení úloh GPU prostřednictvím nasazení IoT Edge.
Požadavky
Než začnete, ujistěte se, že:
Máte přístup k zařízení Azure Stack Edge Pro GPU, které je aktivované a má nakonfigurované výpočetní prostředky. Máte koncový bod rozhraní Kubernetes API a tento koncový bod jste přidali do
hosts
souboru ve vašem klientovi, který bude přistupovat k zařízení.Máte přístup k klientskému systému s podporovaným operačním systémem. Pokud používáte klienta Windows, měl by systém pro přístup k zařízení spustit PowerShell 5.0 nebo novější.
Uložte následující nasazení
json
do místního systému. Ke spuštění nasazení IoT Edge použijete informace z tohoto souboru. Toto nasazení je založené na jednoduchých kontejnerech CUDA, které jsou veřejně dostupné od NVIDIA.{ "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": {} } } }
Ověření ovladače GPU, verze CUDA
Prvním krokem je ověření, že na vašem zařízení běží požadovaný ovladač GPU a verze CUDA.
Spusťte následující příkaz:
Get-HcsGpuNvidiaSmi
Ve výstupu NVIDIA smi si poznamenejte verzi GPU a verzi CUDA na vašem zařízení. Pokud používáte software Azure Stack Edge 2102, tato verze by odpovídala následujícím verzím ovladačů:
- Verze ovladače GPU: 460.32.03
- Verze CUDA: 11.2
Tady je příklad výstupu:
[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>
Nechte tuto relaci otevřenou, protože ji použijete k zobrazení výstupu NVIDIA smi v celém článku.
Nasazení bez sdílení kontextu
Teď můžete na zařízení nasadit aplikaci, když není spuštěná služba s více procesy a neexistuje žádné sdílení kontextu. Nasazení je prostřednictvím webu Azure Portal v iotedge
oboru názvů, který existuje na vašem zařízení.
Vytvoření uživatele v oboru názvů IoT Edge
Nejprve vytvoříte uživatele, který se připojí k iotedge
oboru názvů. Moduly IoT Edge se nasazují v oboru názvů iotedge. Další informace najdete v tématu Obory názvů Kubernetes na vašem zařízení.
Tímto postupem vytvoříte uživatele a udělíte uživateli přístup k iotedge
oboru názvů.
Vytvořte nového uživatele v
iotedge
oboru názvů. Spusťte následující příkaz:New-HcsKubernetesUser -UserName <user name>
Tady je příklad výstupu:
[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=
Zkopírujte výstup zobrazený ve formátu prostého textu. Uložte výstup jako konfigurační soubor (bez přípony) do
.kube
složky vašeho profilu uživatele na místním počítači,C:\Users\<username>\.kube
například .Udělte uživateli, kterého jste vytvořili, přístup k
iotedge
oboru názvů. Spusťte následující příkaz:Grant-HcsKubernetesNamespaceAccess -Namespace iotedge -UserName <user name>
Tady je příklad výstupu:
[10.100.10.10]: PS>Grant-HcsKubernetesNamespaceAccess -Namespace iotedge -UserName iotedgeuser [10.100.10.10]: PS>
Podrobné pokyny najdete v tématu Připojení ke clusteru Kubernetes a jeho správa prostřednictvím kubectl na zařízení Azure Stack Edge Pro GPU.
Nasazení modulů prostřednictvím portálu
Nasaďte moduly IoT Edge prostřednictvím webu Azure Portal. Nasadíte veřejně dostupné ukázkové moduly NVIDIA CUDA, které spouští simulaci n-body.
Ujistěte se, že je na vašem zařízení spuštěná služba IoT Edge.
V pravém podokně vyberte dlaždici IoT Edge. Přejděte do vlastností IoT Edge>. V pravém podokně vyberte prostředek IoT Hubu přidružený k vašemu zařízení.
V prostředku IoT Hubu přejděte na Automatické Správa zařízení > IoT Edge. V pravém podokně vyberte zařízení IoT Edge přidružené k vašemu zařízení.
Vyberte Set modules (Nastavit moduly).
Vyberte modul + Přidat > + IoT Edge.
Na kartě Nastavení modulu zadejte název modulu IoT Edge a identifikátor URI image. Nastavte zásady vyžádání image na Hodnotu Při vytváření.
Na kartě Proměnné prostředí zadejte NVIDIA_VISIBLE_DEVICES jako 0.
Na kartě Možnosti vytvoření kontejneru zadejte následující možnosti:
{ "Entrypoint": [ "/bin/sh" ], "Cmd": [ "-c", "/tmp/nbody -benchmark -i=1000; while true; do echo no-op; sleep 10000;done" ], "HostConfig": { "IpcMode": "host", "PidMode": "host" } }
Možnosti se zobrazí takto:
Vyberte Přidat.
Přidaný modul by se měl zobrazit jako Spuštěno.
Opakujte všechny kroky a přidejte modul, který jste provedli při přidávání prvního modulu. V tomto příkladu zadejte název modulu jako
cuda-sample2
.Použijte stejnou proměnnou prostředí jako oba moduly, které budou sdílet stejné GPU.
Použijte stejné možnosti vytvoření kontejneru, které jste zadali pro první modul, a vyberte Přidat.
Na stránce Nastavit moduly vyberte Zkontrolovat a vytvořit a pak vyberte Vytvořit.
Stav modulu runtime obou modulů by se teď měl zobrazit jako Spuštěno.
Monitorování nasazení úloh
Otevřete novou relaci PowerShellu.
Vypište pody spuštěné v
iotedge
oboru názvů. Spusťte následující příkaz:kubectl get pods -n iotedge
Tady je příklad výstupu:
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>
Na vašem zařízení jsou dva pody a
cuda-sample1-97c494d7f-lnmns
cuda-sample2-d9f6c4688-2rld9
běží na něm.Zatímco oba kontejnery spouští simulaci n-body, zobrazte využití GPU z výstupu NVIDIA smi. Přejděte do rozhraní PowerShellu zařízení a spusťte
Get-HcsGpuNvidiaSmi
.Tady je příklad výstupu, když oba kontejnery spouští simulaci n-body:
[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>
Jak vidíte, v GPU 0 běží dva kontejnery se simulací n-body. Můžete také zobrazit odpovídající využití paměti.
Po dokončení simulace výstup NVIDIA smi ukáže, že na zařízení nejsou spuštěné žádné procesy.
[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>
Po dokončení simulace n-těla si prohlédněte protokoly, abyste porozuměli podrobnostem nasazení a času potřebnému k dokončení simulace.
Tady je příklad výstupu z prvního kontejneru:
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>
Tady je příklad výstupu z druhého kontejneru:
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>
Zastavte nasazení modulu. V prostředku ioT Hubu pro vaše zařízení:
Přejděte na IoT Edge pro automatické nasazení > zařízení. Vyberte zařízení IoT Edge odpovídající vašemu zařízení.
Přejděte do části Nastavit moduly a vyberte modul.
Na kartě Moduly vyberte modul.
Na kartě Nastavení modulu nastavte požadovaný stav na zastavený. Vyberte Aktualizovat.
Opakováním kroků zastavte druhý modul nasazený na zařízení. Vyberte Zkontrolovat a vytvořit a potom Vytvořit. Tím by se mělo nasazení aktualizovat.
Stránka Aktualizovat sadu modulů několikrát. dokud se stav modulu Runtime nezobrazí jako Zastaveno.
Nasazení s využitím sdílení kontextu
Simulaci n-těla teď můžete nasadit na dva kontejnery CUDA, když je na vašem zařízení spuštěná služba MPS. Nejprve povolíte mps na zařízení.
Pokud chcete ve svém zařízení povolit MPS, spusťte
Start-HcsGpuMPS
příkaz.[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>
Získejte výstup NVIDIA smi z rozhraní PowerShellu zařízení.
nvidia-cuda-mps-server
Uvidíte proces nebo je na zařízení spuštěná služba MPS.Tady je příklad výstupu:
[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
Nasaďte moduly, které jste zastavili dříve. Nastavte požadovaný stav tak, aby běžel prostřednictvím modulů Set.
Tady je příklad výstupu:
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>
Uvidíte, že jsou moduly nasazené a spuštěné na vašem zařízení.
Po nasazení modulů se na obou kontejnerech spustí simulace n-body. Tady je příklad výstupu po dokončení simulace v prvním kontejneru:
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>
Tady je příklad výstupu po dokončení simulace ve druhém kontejneru:
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>
Získejte výstup NVIDIA smi z rozhraní PowerShellu zařízení, když oba kontejnery spouští simulaci n-těla. Tady je příklad výstupu. Existují tři procesy,
nvidia-cuda-mps-server
proces (typ C) odpovídá službě MPS a/tmp/nbody
procesy (typ M + C) odpovídají úlohám n-body nasazeným moduly.[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
Další kroky
- Nasaďte na azure Stack Edge Pro sdílenou úlohu KUBERNEtes s GPU.