Caffe mit Grafikprozessorbeschleunigung

Anleitung für grafikprozessorfähige Anwendungen lesen und direkt beginnen

Caffe

Caffe ist ein Deep-Learning-Framework, das auf Programmierausdruck, Schnelligkeit und Modularität ausgelegt ist. Entwickelt wird dieses beliebte Framework für Computer Vision vom Berkeley Vision and Learning Center (BVLC) sowie von Mitgliedern der Community. Caffe wird erfolgreich in akademischen Forschungsprojekten, bei der Entwicklung von Prototypen in Startups sowie in umfangreichen industriellen Projekten in den Bereichen maschinelles Sehen, Sprache und Multimedia eingesetzt.

Caffe läuft auf den neuesten Grafikprozessoren mit der NVIDIA Pascal-Architektur bis zu 65 % schneller und lässt sich auf mehrere Grafikprozessoren innerhalb eines einzelnen Knotens skalieren. Dadurch lassen sich Modelle innerhalb weniger Stunden anstatt mehrerer Tage trainieren.

Installation

Systemanforderungen

Für die grafikprozessorfähige Version von Caffe gelten folgende Anforderungen:

  • Linux 64-Bit (Diese Anleitung wurde für Ubuntu 14.04 verfasst)
  • NVIDIA® CUDA® 7.5 (CUDA 8.0 für Grafikprozessoren mit der NVIDIA Pascal-Architektur erforderlich)
  • cuDNN 5.1
  • Außerdem benötigen Sie NVIDIA-Grafikprozessoren, die mindestens Compute Capability 3.0 unterstützen.

Download‑ und Installationsanleitung

1. CUDA installieren

Um Caffe mit NVIDIA-Grafikprozessoren zu verwenden, müssen Sie zuerst das CUDA-Toolkit installieren.

2. cuDNN installieren

Laden Sie nach der Installation des CUDA-Toolkits die Bibliothek cuDNN v5.1für Linux herunter. (Dazu müssen Sie sich für das Accelerated Computing Developer Program registrieren).

Entpacken Sie nach dem Download die Dateien und kopieren Sie sie in das CUDA-Toolkit-Verzeichnis (in unserem Beispiel: /usr/local/cuda/):

$ sudo tar -xvf cudnn-8.0-linux-x64-v5.1.tgz -C /usr/local

3. Abhängigkeiten installieren

Caffe hängt von verschiedenen Bibliotheken ab, die über den Paketmanager Ihres Systems verfügbar sein sollten.

Auf Ubuntu 14.04 werden die erforderlichen Bibliotheken mit den folgenden Befehlen installiert:

$ sudo apt-get install libprotobuf-dev libleveldb-dev libsnappy-dev libopencv-dev libhdf5-serial-dev protobuf-compiler libgflags-dev libgoogle-glog-dev liblmdb-dev libatlas-base-dev git

$ sudo apt-get install --no-install-recommends libboost-all-dev

4. NCCL installieren

NVIDIA NCCL ist erforderlich, wenn Caffe auch auf mehreren Grafikprozessoren ausgeführt werden soll. NCCL lässt sich mit folgenden Befehlen installieren:

$ git clone https://github.com/NVIDIA/nccl.git

$ cd nccl

$ sudo make install -j4

NCCL-Bibliotheken und Header-Dateien werden unter /usr/local/lib und /usr/local/include installiert.

5. Caffe installieren

Wir empfehlen, die neueste Release-Version von Caffe über die Abspaltung von NVIDIA (https://github.com/NVIDIA/caffe/releases) zu installieren. Die neueste veröffentlichte Version ist 0.15.9 (Stand beim Verfassen dieser Anleitung).

$ wget https://github.com/NVIDIA/caffe/archive/v0.15.9.tar.gz

$ tar -zxf v0.15.9.tar.gz

$ cd caffe-0.15.9

$ cp Makefile.config.example Makefile.config

Öffnen Sie die neu erstellte Datei Makefile.config in einem Texteditor und nehmen Sie die folgenden Änderungen vor:

Auskommentieren Sie die Zeile „USE_CUDNN := 1“. Dadurch aktivieren Sie die cuDNN-Beschleunigung.

Auskommentieren Sie die Zeile „USE_NCCL := 1“. Dadurch aktivieren Sie NCCL, das für die Ausführung von Caffe auf mehreren Grafikprozessoren erforderlich ist.

Speichern und schließen Sie die Datei. Nun ist alles zum Kompilieren von Caffe bereit.

$ make all -j4

Wenn die Ausführung dieses Befehls abgeschlossen ist, ist die Caffe-Binärdatei unter build/tools/caffe verfügbar.

BILDDATENBANK VORBEREITEN

Zum Testen der Trainingsleistung von Caffe ist als Input eine Bilddatenbank erforderlich. Caffe beinhaltet Modelle, die direkt Bilder aus der ILSVRC12-Challenge („ImageNet“) verwenden. Die Originalbilddateien stehen unter http://image-net.org/download-images zum Herunterladen zur Verfügung. Zum Herunterladen müssen Sie ein Konto erstellen und den Nutzungsbedingungen zustimmen. Sobald Sie die Originalbilddateien auf ihr System heruntergeladen und dort entpackt haben, fahren Sie mit den folgenden Schritten fort. Gehen wir davon aus, dass die Originalbilder folgendermaßen auf Ihrer Festplatte gespeichert werden:

/path/to/imagenet/train/n01440764/n01440764_10026.JPEG

/path/to/imagenet/val/ILSVRC2012_val_00000001.JPEG

6. Zusatzdaten herunterladen

$ ./data/ilsvrc12/get_ilsvrc_aux.sh

7. Datenbank erstellen

Öffnen Sie die Datei examples/imagenet/create_imagenet.sh in einem Texteditor und nehmen Sie folgende Änderungen vor:

Passen Sie TRAIN_DATA_ROOT und VAL_DATA_ROOT an den Pfad unter dem Sie die Originalbilder entpackt haben an.

Legen Sie „RESIZE=true“ fest, sodass die Größe der Bilder richtig angepasst wird, bevor sie der Datenbank hinzugefügt werden.

Speichern und schließen Sie die Datei. Sie können nun die Bilddatenbanken mit folgendem Befehl erstellen:

$ ./examples/imagenet/create_imagenet.sh

Erstellen Sie dann die erforderliche Bilderdurchschnittswertdatei mit:

$ ./examples/imagenet/make_imagenet_mean.sh

Training der Netzwerke

ALEXNET (BATCHGRÖSSE 256)

Standardmäßig ist das Modell so konfiguriert, dass das Netz vollständig trainiert wird. Dies dauert zwischen mehreren Stunden und mehreren Tagen. Für das Benchmarking wird die Anzahl der Iterationen auf 1.000 begrenzt. Öffnen Sie die Datei models/bvlc_alexnet/solver.prototxt in einem Texteditor und nehmen Sie die folgenden Änderungen vor:

max_iter: 1000

Speichern und schließen Sie die Datei. Nun können Sie das Netz trainieren:

$ export LD_LIBRARY_PATH=/usr/local/cuda/lib64:/usr/local/lib:$LD_LIBRARY_PATH

$ ./build/tools/caffe train –solver=models/bvlc_alexnet/solver.prototxt –gpu 0

……….
I0817 13:29:57.535207 30840 solver.cpp:242] Iteration 160 (1.57876 iter/s, 12.6682s/20 iter), loss = 6.90907
I0817 13:29:57.535292 30840 solver.cpp:261] Train net output #0: loss = 6.90907 (* 1 = 6.90907 loss)
I0817 13:29:57.535312 30840 sgd_solver.cpp:106] Iteration 160, lr = 0.01
I0817 13:30:10.195734 30840 solver.cpp:242] Iteration 180 (1.57974 iter/s, 12.6603s/20 iter), loss = 6.90196
I0817 13:30:10.195816 30840 solver.cpp:261] Train net output #0: loss = 6.90196 (* 1 = 6.90196 loss)
I0817 13:30:10.195835 30840 sgd_solver.cpp:106] Iteration 180, lr = 0.01
I0817 13:30:22.852818 30840 solver.cpp:242] Iteration 200 (1.58017 iter/s, 12.6568s/20 iter), loss = 6.92144
……….

Sie können das Netz auf mehreren Grafikprozessoren trainieren, indem Sie mehrere Geräte-IDs (z. B. „0,1,2,3“) angeben. Oder verwenden Sie den Zusatz „-gpu all“, wenn alle verfügbaren Grafikprozessoren im System verwendet werden sollen.

GOOGLENET (BATCHGRÖSSE 32)

Standardmäßig ist das Modell so konfiguriert, dass das Netz vollständig trainiert wird. Dies dauert zwischen mehreren Stunden und mehreren Tagen. Für das Benchmarking wird die Anzahl der Iterationen auf 1.000 begrenzt. Öffnen Sie die Datei models/bvlc_googlenet/solver.prototxt in einem Texteditor und nehmen Sie die folgenden Änderungen vor:

max_iter: 1000

Speichern und schließen Sie die Datei. Nun können Sie das Netz trainieren:

$ export LD_LIBRARY_PATH=/usr/local/cuda/lib64:/usr/local/lib:$LD_LIBRARY_PATH

$ ./build/tools/caffe train –solver=models/bvlc_googlenet/solver.prototxt –gpu 0

……….
I0817 13:33:08.056823 30959 solver.cpp:242] Iteration 80 (7.96223 iter/s, 5.02372s/40 iter), loss = 11.1401
I0817 13:33:08.056893 30959 solver.cpp:261] Train net output #0: loss1/loss1 = 6.85843 (* 0.3 = 2.05753 loss)
I0817 13:33:08.056910 30959 solver.cpp:261] Train net output #1: loss2/loss1 = 7.00557 (* 0.3 = 2.10167 loss)
I0817 13:33:08.056921 30959 solver.cpp:261] Train net output #2: loss3/loss3 = 6.82249 (* 1 = 6.82249 loss)
I0817 13:33:08.056934 30959 sgd_solver.cpp:106] Iteration 80, lr = 0.01
I0817 13:33:13.074957 30959 solver.cpp:242] Iteration 120 (7.97133 iter/s, 5.01798s/40 iter), loss = 11.1306
I0817 13:33:13.075026 30959 solver.cpp:261] Train net output #0: loss1/loss1 = 6.91996 (* 0.3 = 2.07599 loss)
I0817 13:33:13.075042 30959 solver.cpp:261] Train net output #1: loss2/loss1 = 6.91151 (* 0.3 = 2.07345 loss)
I0817 13:33:13.075052 30959 solver.cpp:261] Train net output #2: loss3/loss3 = 6.95206 (* 1 = 6.95206 loss)
I0817 13:33:13.075065 30959 sgd_solver.cpp:106] Iteration 120, lr = 0.01
I0817 13:33:18.099795 30959 solver.cpp:242] Iteration 160 (7.96068 iter/s, 5.0247s/40 iter), loss = 11.1211
……….

Sie können das Netz auf mehreren Grafikprozessoren trainieren, indem Sie mehrere Geräte-IDs (z. B. „0,1,2,3“) angeben. Oder verwenden Sie den Zusatz „-gpu all“, wenn alle verfügbaren Grafikprozessoren im System verwendet werden sollen.

Benchmarks

TRAININGSLEISTUNG BEI BILDERN MIT GOOGLENET

GoogLeNet ist ein neueres Deep-Learning-Modell, das ein tieferes, umfassenderes Netz nutzt und dadurch eine präzisere Bildklassifizierung ermöglicht.

Trainingsleistung bei der Bildklassifikation
Caffe-Leistung bei mehreren Grafikprozessoren pro Knoten

Empfohlene Systemkonfigurationen

Hardwarekonfiguration

PC

Parameter
Specs

CPU Architecture

x86_64

System Memory

8-32GB

CPUs

1

GPU Model

NVIDIA® TITAN X

GPUs

1-2

Servers

Parameter
Specs

CPU Architecture

x86_64

System Memory

32 GB

CPUs/Nodes

1-2

GPU Model

Tesla® M40
Tesla® P100

GPUs/Node

1-4

Softwarekonfiguration

Software stack

Parameter
Version

OS

Ubuntu 14.04

GPU Driver

367.27 or newer

CUDA Toolkit

8.0

cuDNN Library

v5.1

Ihre ideale Grafikprozessorlösung