In diesem Teil unserer DevOps-Beratungsserie zeigen wir Ihnen, wie Sie Docker-Container mit leistungsstarken NVIDIA-Grafikprozessoren erstellen und ausführen können, und bieten eine Schritt-für-Schritt-Anleitung. Unter GPU-beschleunigtem Computing versteht man die Verwendung einer Grafikverarbeitungseinheit zur Beschleunigung von Deep Learning-, Analyse- und Engineering-Anwendungen. GPU-Beschleuniger wurden erstmals 2007 von NVIDIA vorgestellt und werden heute weltweit in energieeffizienten Rechenzentren eingesetzt und spielen eine wichtige Rolle bei der Beschleunigung von Anwendungen.
Containerisierung von GPU-Anwendungen mit Docker-Nvidia
Die Containerisierung von GPU-Anwendungen bringt eine Reihe von Vorteilen mit sich, darunter eine einfache Bereitstellung, eine optimierte Zusammenarbeit, die Isolierung einzelner Geräte und vieles mehr. Am häufigsten werden Docker®-Container jedoch für die einfache Bereitstellung von CPU-basierten Anwendungen auf mehreren Rechnern verwendet, wobei Container sowohl hardware- als auch plattformunabhängig sind. Die Docker-Engine unterstützt von Haus aus keine NVIDIA-Grafikprozessoren, da sie spezielle Hardware verwendet, für die der NVIDIA-Treiber installiert werden muss.
Hier finden Sie unsere Erfahrungen mit der Verwendung einer Grafikverarbeitungseinheit zum Erstellen und Ausführen von Docker-Containern und eine schrittweise Beschreibung, wie dies erreicht wurde.
Schritt-für-Schritt-Einrichtung von Nvidia-Docker für GPU-beschleunigtes Computing.
Für den Anfang brauchen wir einen Server mit NVIDIA-GPU. Hetzner hat einen Server mit GeForce® GTX 1080
Anforderungen:
OS
CentOS 7.3
Docker
Docker version 19.03.15
NVIDIA Drivers
latest
Lasst uns die notwendigen Treiber für die Grafikkarte downloaden und installieren:
Nach dem download, müssen wir die Treiber installieren, indem wir alle Schritte folgen:
1./NVIDIA-Linux-x86_64-<major_version>.<minor_version>.run
Wie Nvidia und Docker zusammen funktionieren
Wir müssen nvidia-docker und das nvidia-docker-plugin installieren. Sie können unter nvidia github mehr über die Installation erfahren.
1 wget -P /tmp https://github.com/NVIDIA/nvidia-docker/releases/download/v1.0.1/nvidia-docker-1.0.1-1.x86_64.rpm 2 sudo rpm -i /tmp/nvidia-docker*.rpm && rm /tmp/nvidia-docker*.rpm
Launching service:
1 sudo systemctl start nvidia-docker
Testing:
1 nvidia-docker run --rm nvidia/cuda nvidia-smi
Sollte folgendes Ergebnis liefern:
1 Thu Jul 27 13:44:07 2017 2 +-------------------------------------------------------------+ 3 | NVIDIA-SMI 375.20 Driver Version: 375.20 | 4 |--------------------+----------------+-----------+ 5 | GPU Name Persistence-M| Bus-Id Disp.A | Volatile Uncorr. ECC | 6 | Fan Temp Perf Pwr:Usage/Cap| Memory-Usage | GPU-Util Compute M. | 7 |==================+=====================+======================| 8 | 0 GeForce GTX 1080 Off | 0000:01:00.0 Off | N/A | 9 | 33% 36C P8 11W / 180W | 0MiB / 8145MiB | 0% Default | 10 +------------------------+---------------------+----------------------+ 11 12 +-----------------------------------------------------------------------+ 13 | Processes: GPU Memory | 14 | GPU PID Type Process name Usage | 15 |================================================================| 16 | No running processes found | 17 +-----------------------------------------------------------------------+
Docker-Container mit GPU-Unterstützung im Orchestrator
Docker Swarm ist hier keine Option, da es in docker-compose V3 nicht möglich ist, auf das Innere des Geräts zuzugreifen.
Von der offiziellen Webseite:
Wir können nun die Ressourcen der Grafikkarte nutzen, aber wenn wir Orchestrierungstools verwenden müssen, kann nvidia-docker nicht gestartet werden, da es ein Add-on zu Docker ist.
Wir haben gerade einen Container im Rancher-Cluster gelaunched.
Was genau ist Nvidia-Docker?
Lassen Sie uns nun in die Details dessen eintauchen, was Nvidia-docker eigentlich ist. Im Grunde handelt es sich um einen Dienst, der ein Docker-Volume erstellt und die Geräte in einen Container einbindet.
Um herauszufinden, was erstellt und eingehängt wurde, müssen wir den folgenden Befehl ausführen:
1 curl –s http://localhost:3476/docker/cli
Hier ist das Ergebnis:
—volume-driver=nvidia-docker —volume=nvidia_driver_375.20:/usr/local/nvidia:ro —device=/dev/nvidiactl —device=/dev/nvidia-uvm —device=/dev/nvidia-uvm-tools —device=/dev/nvidia0
Für mathematische Berechnungen nutzen wir eine Python Bibliothek – tensorflow-gpu (TensorFlow)
Schreiben wir eine Dockerdatei bei der das Basis-Image aus der Docker Hub Nvidia/CUDA übernommen wird
1FROM nvidia/cuda:8.0-cudnn5-runtime-centos7 2 3 RUN pip install tensorflow-gpu 4 5 ENTRYPOINT ["python", "math.py"]
Dann schreiben Sie docker-compose um den compute container zu erstellen und auszuführen:
1 version: '2' 2 services: 3 math: 4 build: . 5 volumes: 6 - nvidia_driver_375.20:/usr/local/nvidia:ro 7 devices: 8 - /dev/nvidiactl 9 - /dev/nvidia-uvm 10 - /dev/nvidia-uvm-tools 11 - /dev/nvidia0 12 13 14 volumes: 15 nvidia_driver_375.20: 16 river: nvidia-docker 17 external: true
Launching Docker container:
1 docker-compose up -d
Wenn alles korrekt ausgeführt wurde, dann führen Sie folgenden Befehl aus:
1 nvidia-docker run --rm nvidia/cuda nvidia-smi
1 Thu Jul 27 15:12:40 2017 2 +-----------------------------------------------------------------------+ 3| NVIDIA-SMI 375.20 Driver Version: 375.20 | 4|--------------------------+-------------------+-------------------+ 5| GPU Name Persistence-M| Bus-Id Disp.A | Volatile Uncorr. ECC| 6| Fan Temp Perf Pwr:Usage/Cap| Memory-Usage | GPU-Util Compute M.| 7|===============================+======================+========| 8| 0 GeForce GTX 1080 Off | 0000:01:00.0 Off | N/A | 9| 39% 53C P2 86W / 180W | 7813MiB / 8145MiB | 56% Default | 10 +-----------------------+----------------------+----------------------+ 11 12 +----------------------------------------------------------------------+ 13| Processes: GPU Memory | 14| GPU PID Type Process name Usage | 15|==============================================================| 16| 0 27798 C python 7803MiB | 17 +---------------------------------------------------------------------+
In den Prozessen können Sie sehen, dass Python 56 % der GPU nutzt.
Wir haben gerade Docker, der führenden Container-Plattform, beigebracht, mit GeForce-Grafikkarten zu arbeiten, und sie kann nun zur Containerisierung von GPU-beschleunigten Anwendungen verwendet werden. Das bedeutet, dass Sie beschleunigte Anwendungen einfach und ohne Änderungen containerisieren und isolieren und sie auf jeder unterstützten GPU-fähigen Infrastruktur bereitstellen können.