Caffe con accelerazione tramite GPU

Inizia subito con questa guida per applicazioni basate su GPU.

Caffe

Caffe è un framework di deep learning progettato tenendo conto delle esigenze di espressione, velocità e modularità. Questo framework di computer vision, già ampiamente diffuso, è stato sviluppato dal Berkeley Vision and Learning Center (BVLC), con il contributo di un'intera community. Caffe potenzia progetti di ricerca accademica, prototipi di startup e applicazioni industriali visive, vocali e multimediali, su larga scala.

Caffe è più veloce del 65% con le GPU di nuova generazione NVIDIA Pascal ed è in grado di scalare su più GPU a singolo nodo. Adesso è possibile addestrare modelli in poche ore invece che in giorni.

Installazione

Requisiti di sistema

Requisiti per la versione di Caffe compatibile con GPU:

Istruzioni di download e di installazione

1. Installare CUDA

Per utilizzare Caffe con le GPU NVIDIA, installare prima di tutto il Toolkit CUDA.

2. Installare cuDNN

Dopo l'installazione del Toolkit CUDA, scaricare la Libreria cuDNN v5.1per Linux (tenere presente che è necessario eseguire la registrazione all'Accelerated Computing Developer Program).

Al termine del download, decomprimere i file e copiarli nella directory del Toolkit CUDA (di norma: /usr/local/cuda/):

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

3. Installare le dipendenze

Caffe dipende da diverse librerie reperibili dal gestore del pacchetto di sistema.

Su Ubuntu 14.04, i seguenti comandi installeranno le librerie necessarie:

$ 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. Installare NCCL

NVIDIA NCCL è necessario per l'esecuzione di Caffe su più GPU. La libreria NCCL può essere installata con i seguenti comandi:

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

$ cd nccl

$ sudo make install -j4

Le librerie e gli header NCCL verranno installati rispettivamente in /usr/local/lib e in /usr/local/include.

5. Installa Caffe

Si consiglia di installare la versione più recente di Caffe dal Fork NVIDIA, disponibile su https://github.com/NVIDIA/caffe/releases . Al momento della redazione della presente guida, la versione più recente è la 0.15.9.

$ 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

Aprire Makefile.config in un editor di testo e apportare le modifiche seguenti:

Eliminare i commenti dalla riga USE_CUDNN := 1. Questo consente l'accelerazione cuDNN.

Eliminare i commenti dalla riga USE_NCCL := 1. Questo abilita NCCL, necessario per l'esecuzione di Caffe su più GPU.

Salvare e chiudere il file. A questo punto, è possibile compilare Caffe.

$ make all -j4

Una volta eseguito il comando, il codice binario di Caffe sarà disponibile in build/tools/caffe.

PREPARARE UN DATABASE DI IMMAGINI

Il database di immagini servirà come origine di input per convalidare le prestazioni di training di Caffe. Caffe include modelli preimpostati per utilizzare immagini di ILSVRC12 Challenge ("ImageNet"). È possibile scaricare i file immagine originali da http://image-net.org/download-images (sarà necessario creare un account e accettare le condizioni del sito). Dopo aver scaricato ed estratto i file immagine originali sul sistema, procedere con i passaggi che seguono. Si presume che le immagini originali siano archiviate sul disco rigido:

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

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

6. Scaricare i dati ausiliari

$ ./data/ilsvrc12/get_ilsvrc_aux.sh

7. Creare il database

Aprire il file examples/imagenet/create_imagenet.sh in un editor di testo e apportare le modifiche seguenti:

Sostituire le variabili TRAIN_DATA_ROOT e VAL_DATA_ROOT con il percorso in cui sono stati estratti i file immagine originali.

Impostare RESIZE=true in modo che le immagini vengano ridimensionate prima di essere aggiunte al database.

Salvare e chiudere il file. È ora possibile creare i database di immagine con il seguente comando:

$ ./examples/imagenet/create_imagenet.sh

Successivamente, creare il file immagine mediano necessario con:

$ ./examples/imagenet/make_imagenet_mean.sh

Modelli di training

ALEXNET (DIMENSIONI BATCH 256)

Per impostazione predefinita, il modello è configurato per il training completo della rete. L'operazione potrebbe richiedere da poche ore a diversi giorni. Ai fini del benchmarking, il numero di iterazioni è stato limitato a 1000. Aprire il file models/bvlc_alexnet/solver.prototxt in un editor di testo e apportare la modifica seguente:

max_iter: 1000

Salvare e chiudere il file. È ora possibile procedere con il training della rete:

$ 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
……….

È possibile eseguire il training di più GPU specificando gli ID dei dispositivi (ad es.: 0,1,2,3) oppure con il parametro "-gpu all", che permette di utilizzare tutte le GPU disponibili nel sistema.

GOOGLENET (DIMENSIONI BATCH 32)

Per impostazione predefinita, il modello è configurato per il training completo della rete. L'operazione potrebbe richiedere da poche ore a diversi giorni. Ai fini del benchmarking, il numero di iterazioni è stato limitato a 1000. Aprire il file models/bvlc_googlenet/solver.prototxt in un editor di testo e apportare la modifica seguente:

max_iter: 1000

Salvare e chiudere il file. È ora possibile procedere con il training della rete:

$ 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
……….

È possibile eseguire il training di più GPU specificando gli ID dei dispositivi (ad es.: 0,1,2,3) oppure con il parametro "-gpu all", che permette di utilizzare tutte le GPU disponibili nel sistema.

Benchmark

PRESTAZIONI DI TRAINING DI IMMAGINI SU GOOGLENET

GoogLeNet è un modello più recente di deep learning che sfrutta una rete più ampia e profonda in grado di garantire maggiore precisione nella classificazione delle immagini.

Prestazioni di training per la classificazione di immagini
Prestazioni di Caffe su più GPU per nodo

Configurazioni del sistema consigliate

Configurazione hardware

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

Configurazione software

Software stack

Parameter
Version

OS

Ubuntu 14.04

GPU Driver

367.27 or newer

CUDA Toolkit

8.0

cuDNN Library

v5.1

Crea la tua soluzione GPU ideale oggi stesso