Wie man GPU-beschleunigte Anwendungen mit Docker-Nvidia verpackt.

Die Rolle von GPU-Beschleunigern in hochleistungsfähigen Anwendungen und eine Schritt-für-Schritt-Anleitung für die Einrichtung von Docker-NVIDIA

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 
Sie erhalten folgendes Ergebnis:
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.

Ausgewählte Blogbeiträge