Caffe avec accélération GPU

Exploitez le plein potentiel de Caffe avec notre guide de démarrage pour application GPU.

Caffe

Caffe est un framework de Deep Learning à hautes performances mettant l’accent sur la vitesse, l’expression et la modularité. Cette solution populaire de vision par ordinateur a été développée par le Berkeley Vision and Learning Center (BVLC) et les contributeurs de sa communauté. Caffe est dédié aux projets de recherche universitaire, aux prototypes des sociétés émergentes et aux applications industrielles à grande échelle en matière de vision par ordinateur, de traitement du langage et de création multimédia.

Caffe s’exécute jusqu’à 65% plus vite grâce aux nouveaux GPU NVIDIA Pascal et offre d’importants gains de performance sur les nœuds à GPU multiples. Vous pouvez désormais entraîner vos modèles en quelques heures, contre plusieurs jours auparavant.

Installation

Configuration requise

L’accélération GPU de Caffe requiert la configuration suivante :

Instructions de téléchargement et d’installation

1. Installez CUDA.

Pour utiliser Caffe avec des GPU NVIDIA, vous devez commencer par installer le Kit d’outils NVIDIA CUDA.

2. Installez cuDNN.

Une fois que vous avez installé le Kit d’outils NVIDIA CUDA, veuillez télécharger la bibliothèque cuDNN v5.1 pour Linux (vous devez au préalable vous enregistrer au programme de développement pour le calcul accéléré).

Une fois la bibliothèque téléchargée, veuillez décompresser les fichiers avant de les copier dans le répertoire du Kit d’outils CUDA (chemin d’accès standard : /usr/local/cuda/).

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

3. Installez les dépendances.

Caffe s’appuie sur plusieurs bibliothèques logicielles qui doivent normalement être accessibles via le gestionnaire de paquets de votre système.

Sur Ubuntu 14.04, veuillez utiliser les commandes suivantes pour installer les bibliothèques requises :

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

NVIDIA NCCL est requis pour exécuter Caffe sur plus d’un GPU. Vous pouvez installer NCCL via les commandes suivantes :

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

$ cd nccl

$ sudo make install -j4

Les bibliothèques et les en-têtes NCCL seront installés dans "/usr/local/lib and /usr/local/include".

5. Installer Caffe

Nous vous recommandons d’installer la dernière version de Caffe à partir du portail NVIDIA (https://github.com/NVIDIA/caffe/releases). La version 0.15.9 est la dernière disponible au moment de la rédaction de ce guide.

$ 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

Ouvrez le fichier Makefile.config récemment créé via un éditeur de texte et effectuez les changements suivants :

Uncomment the line USE_CUDNN := 1. Cette commande active l’accélération cuDNN.

Uncomment the line USE_NCCL := 1. Cette commande active NCCL (requis pour exécuter Caffe sur plusieurs GPU).

Sauvegardez et fermez le fichier. Vous allez pouvoir procéder à la compilation de Caffe.

$ make all -j4

Une fois cette commande terminée, les fichiers binaires de Caffe seront normalement disponibles dans "build/tools/caffe".

PRÉPARATION D’UNE BASE DE DONNÉES D’IMAGES

Une base de données d’images est requise comme ressource d’entrée afin de tester les performances de Caffe. Caffe inclut des modèles préconfigurés pour utiliser des images issues du projet ILSVRC12 ("ImageNet"). Les fichiers image d’origine peuvent être téléchargés via http://image-net.org/download-images (vous devrez au préalable créer un compte et accepter les conditions d'utilisation). Une fois que vous avez téléchargé et décompressé les fichiers image sur votre système, veuillez suivre les étapes ci-après. Les images d’origine doivent être stockées sur votre disque de la manière suivante :

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

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

6. Téléchargez les données auxiliaires.

$ ./data/ilsvrc12/get_ilsvrc_aux.sh

7. Créez la base de données.

Ouvrez le fichier "examples/imagenet/create_imagenet.sh" dans un éditeur de texte et effectuez les changements suivants :

Changez les variables TRAIN_DATA_ROOT et VAL_DATA_ROOT dans le chemin d’accès où vous avez décompressé les images d’origine.

Définissez "RESIZE=true" pour que les images soient redimensionnées de manière appropriée avant leur intégration à la base de données.

Sauvegardez et fermez le fichier. Vous allez maintenant pouvoir créer votre base de données d’image avec les commandes suivantes :

$ ./examples/imagenet/create_imagenet.sh

Créez ensuite vos fichiers d’image Mean avec la commande suivante :

$ ./examples/imagenet/make_imagenet_mean.sh

Entraînement de modèles

ALEXNET (TAILLE DE BATCH : 256)

Par défaut, les modèles sont configurés pour entraîner l’intégralité du réseau, ce qui peut requérir de quelques heures à plusieurs jours. À des fins de benchmarking, nous allons limiter le nombre d’itérations à 1000. Ouvrez le fichier "models/bvlc_alexnet/solver.prototxt" dans un éditeur de texte et procédez au changement suivant :

max_iter: 1000

Sauvegardez et fermez le fichier. Vous pouvez désormais entraîner le réseau :

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

Vous pouvez procéder à l’entraînement sur plusieurs GPU simultanément en spécifiant un plus grand nombre d’identifiants d’appareil (exemple : 0,1,2,3) ou en utilisant directement la commande "-gpu all" afin de faire appel à tous les GPU disponibles sur votre système.

GOOGLENET (TAILLE DE BATCH : 32)

Par défaut, les modèles sont configurés pour entraîner l’intégralité du réseau, ce qui peut requérir de quelques heures à plusieurs jours. À des fins de benchmarking, nous allons limiter le nombre d’itérations à 1000. Ouvrez le fichier "models/bvlc_googlenet/solver.prototxt" dans un éditeur de texte et procédez au changement suivant :

max_iter: 1000

Sauvegardez et fermez le fichier. Vous pouvez désormais entraîner le réseau :

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

Vous pouvez procéder à l’entraînement sur plusieurs GPU simultanément en spécifiant un plus grand nombre d’identifiants d’appareil (exemple : 0,1,2,3) ou en utilisant directement la commande "-gpu all" afin de faire appel à tous les GPU disponibles sur votre système.

Benchmarks

PERFORMANCES D’ENTRAÎNEMENT AVEC GOOGLENET

GoogLeNet est un tout nouveau modèle de Deep Learning qui s’appuie sur un modèle de réseau plus étendu et plus complexe afin de fournir une classification d'images de haute précision.

Performances d’entraînement pour la classification d’images
Performances de Caffe avec plusieurs GPU par nœud

Configuration système recommandée

Configuration matérielle

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

Configuration logicielle

Software stack

Parameter
Version

OS

Ubuntu 14.04

GPU Driver

367.27 or newer

CUDA Toolkit

8.0

cuDNN Library

v5.1

Déployez votre solution GPU personnalisée.