Build Caffe sur Google Colaboratory: carte graphique gratuite dans le cloud

Google Colaboratory est un service cloud récemment lancé visant à simplifier la recherche en apprentissage automatique et en apprentissage profond. En utilisant le Colaboratory, vous pouvez accéder à distance à une machine avec une carte vidéo connectée, et c'est entièrement gratuit, ce qui simplifie considérablement la vie lorsque vous devez former des réseaux de neurones profonds. Nous pouvons dire qu'il s'agit d'un analogue des documents Google pour le bloc-notes Jupyter.

Colaboratory a préinstallé Tensorflow et presque toutes les bibliothèques Python nécessaires pour travailler. Si un paquet est manquant, il est facilement installé sur le pouce via pip ou apt-get . Mais que se passe-t-il si vous devez créer un projet à partir de la source et vous connecter au GPU? Il s'avère que cela peut ne pas être si simple que je l'ai découvert lors de la construction de SSD-Caffe . Dans cette publication, je donnerai une brève description du Colaboratoire, décrirai les difficultés rencontrées et comment les résoudre, ainsi que quelques astuces utiles.

Tout le code est disponible dans mon carnet de colaboratoire .


En bref sur le colaboratoire


En gros, Colaboratory vous permet d'exécuter Jupyter Notebook sur une machine distante. Les fichiers de collaboration sont des "ordinateurs portables" .ipynb ordinaires et sont stockés sur le disque Google. Il existe également un ensemble de fonctions qui vous permettent de télécharger des fichiers depuis une machine distante vers le disque Google et vice versa. Vous pouvez également partager ces fichiers avec d'autres, vous pouvez y écrire des commentaires, comme dans les documents Google.

Dans le Colaboratory, vous pouvez utiliser le GPU, à savoir le Tesla K80. Pour ce faire, connectez-le dans les paramètres: Runtime  rightarrowModifier le type d'exécution  rightarrowAccélérateur matériel. Il convient de noter que les GPU ne sont pas toujours disponibles, puis le Colaboratory proposera de démarrer la machine sans elle.

Il semble que rien ne puisse démarrer sauf le Jupyter Notebook lui-même, mais il y a un accès indirect au terminal: pour cela, vous devez ajouter un point d'exclamation devant la commande du terminal, par exemple !mkdir images . En général, nous pouvons supposer que nous avons affaire à une machine ordinaire parfaite sur laquelle Ubuntu 17.10 est installé (au moment de la rédaction), mais connecté à distance. Il s'ensuit que tout ce qui peut être fait via le terminal (pas de manière interactive) peut être fait sur celui-ci, y compris:

  • cloner des référentiels à l'aide de git clone ,
  • charger des données à l'aide de wget (d'ailleurs, même les gros fichiers sont chargés presque instantanément à partir d'un disque Google),
  • utilisez make (et probablement cmake )
  • installer des outils et des bibliothèques en utilisant apt-get et pip

Quelques commentaires supplémentaires sur le Colaboratoire:

  • Il semble que l'utilisateur ait un accès illimité à tous les fichiers du système (toutes les commandes doivent être écrites sans sudo );
  • L'état terminal n'est pas transféré entre les équipes, même si elles sont dans la même cellule (par exemple, cd dir si nécessaire, vous devrez écrire au début de chaque commande);
  • Si vous vous déconnectez du Colaboratory pendant une longue période, toutes les modifications de la machine virtuelle seront effacées, y compris tous les packages installés et les fichiers téléchargés.Par conséquent, il est recommandé que l'installation des packages soit incluse dans le bloc-notes Jupyter;
  • Après 12 heures d'utilisation continue, la machine s'éteint automatiquement, mais elle peut ensuite être redémarrée (en théorie, dans la pratique, le GPU peut ne pas être disponible).

Construction SSD-Caffe


Je voulais essayer le Single Shot Detector (SSD) , à savoir son implémentation Caffe dans Google Colaboratory, mais pour cela, le projet devait être assemblé à partir de la source.

Soit dit en passant, si une version de Caffe vous convient, il existe un moyen beaucoup plus simple (cela fonctionne même, bien que je n'aie rien essayé):

 !apt install caffe-cuda 

Assembler SSD-Caffe à partir de la source est une quête assez longue en plusieurs étapes, qui ne peut être effectuée qu'avec des béquilles.

Étape 1: installation des dépendances

Ici, nous devons télécharger toutes les dépendances pour Caffe en utilisant apt . Cependant, avant de faire cela, vous devez autoriser apt à télécharger le code source des dépendances. Le guide d'installation de Caffe indique que cela nécessite une «ligne deb-src dans le fichier sources.list». Malheureusement, il n'y a aucun détail là-bas, donc je viens de décommenter toutes les lignes deb-src dans le fichier /etc/apt/sources.list :

 with open('/etc/apt/sources.list') as f: txt = f.read() with open('/etc/apt/sources.list', 'w') as f: f.write(txt.replace('# deb-src','deb-src')) 

Et ça a marché. Il ne reste plus qu'à télécharger les dépendances:

 !apt update !apt build-dep caffe-cuda 

Étape 2: besoin d'un autre compilateur

Ici, le problème est le suivant: g++-7 , qui est la valeur par défaut, est pour une raison quelconque incompatible avec le compilateur nvcc CUDA, vous devez donc utiliser autre chose. J'ai téléchargé g++-5 et en ai fait le compilateur par défaut:

 !apt install g++-5 !update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-5 20 !update-alternatives --install /usr/bin/g++ g++ /usr/bin/g++-5 20 

Étape 3: avoir à construire un boost

Si vous essayez de construire Caffe à ce stade, des problèmes surviendront lorsque vous essayez de connecter boost, car il a été construit par un autre compilateur, vous devez donc télécharger ses sources et également construire en utilisant g++-5 ( plus sur le site web de boost ):

 !wget https://dl.bintray.com/boostorg/release/1.67.0/source/boost_1_67_0.tar.bz2 !tar --bzip2 -xf boost_1_67_0.tar.bz2 !cd boost_1_67_0 && ./bootstrap.sh --exec-prefix=/usr/local --with-libraries=system,filesystem,regex,thread,python --with-python-version=2.7 --with-python-root=/usr !cd boost_1_67_0 && ./b2 install 

Étape 4: Configurer le Makefile

Clone Caffe avec GitHub:

 !git clone https://github.com/weiliu89/caffe.git && cd caffe && git checkout ssd 

Et nous changeons les champs nécessaires dans Makefile.config - J'ai changé le chemin d'accès à CUDA, changé l'option BLAS, changé la version d'OpenCV en une troisième, ajouté une couche Python et ajouté également tous les chemins d'accès aux bibliothèques qui ont été installées, mais pour une raison quelconque, ils n'ont pas été trouvés (tout cela est pratique) fait en utilisant Python):

 with open('caffe/Makefile.config.example') as f: config = f.read() comment = ['CUDA_DIR := /usr/local/cuda', 'BLAS := open'] uncomment = ['# CUDA_DIR := /usr', '# BLAS := atlas', '# OPENCV_VERSION := 3', '# WITH_PYTHON_LAYER := 1'] # replace = [('INCLUDE_DIRS := $(PYTHON_INCLUDE) /usr/local/include', 'INCLUDE_DIRS := $(PYTHON_INCLUDE) /usr/local/include /usr/include/hdf5/serial /usr/local/lib/python2.7/dist-packages/numpy/core/include/'), ('LIBRARY_DIRS := $(PYTHON_LIB) /usr/local/lib /usr/lib', 'LIBRARY_DIRS := $(PYTHON_LIB) /usr/local/lib /usr/lib /usr/lib/x86_64-linux-gnu/hdf5/serial')] for c in uncomment: config = config.replace(c, c[2:]) for c in comment: config = config.replace(c, '# '+c) for c1,c2 in replace: config = config.replace(c1, c2) with open('caffe/Makefile.config', 'w') as f: f.write(config) 

De plus, dans le Makefile lui-même, j'ai dû remplacer toutes les balises -isystem par -I : les deux sont responsables de la recherche des en-têtes, mais ils sont traités un peu différemment, et sans ce remplacement, des problèmes se sont déjà produits lorsque stdlib était connecté ( plus de détails ici ):

 with open('caffe/Makefile') as f: mfile = f.read() with open('caffe/Makefile', 'w') as f: f.write(mfile.replace('-isystem','-I')) 

Étape 5: Construire

Il restait une dernière béquille - pour corriger le c++config.h , sinon il y a des problèmes avec les types nan ( plus ):

 with open('/usr/include/x86_64-linux-gnu/c++/5/bits/c++config.h') as f: txt = f.read() with open('/usr/include/x86_64-linux-gnu/c++/5/bits/c++config.h', 'w') as f: f.write(txt.replace('/* #undef _GLIBCXX_USE_C99_MATH */', '/* #undef _GLIBCXX_USE_C99_MATH */\n#define _GLIBCXX_USE_C99_MATH 1')) 

Maintenant, en fait, vous pouvez construire Caffe:

 !cd caffe && make -j8 && make pycaffe && make test -j8 && make distribute !echo /usr/local/lib >> /etc/ld.so.conf && ldconfig !echo /content/caffe/distribute/lib >> /etc/ld.so.conf && ldconfig 

Les deux dernières lignes ajoutent les chemins de bibliothèque, à savoir boost et Caffe.

Maintenant, Caffe peut être utilisé (il vous suffit de spécifier le chemin d'accès à celui-ci dans PYTHONPATH):

 import sys caffe_path = !cd caffe/python && pwd sys.path.insert(0, caffe_path[0]) import caffe 

Pour le tester, j'ai testé le projet Mobilenet-SSD : le code est également dans mon carnet de colaboratoire .

En particulier, j'ai mesuré le temps de prédiction pour une image, et l'accélération sur le GPU était d'environ 3,8.

Bonus: quelques astuces utiles


Il existe un excellent tutoriel sur Medium sur Google Colaboratory. Dans le Colaboratory même, il y a des fichiers avec des exemples de presque tout ce qui peut être nécessaire.

Montez un disque Google dans le système de fichiers d'une machine virtuelle:

 !apt-get install -y -qq software-properties-common python-software-properties module-init-tools !add-apt-repository -y ppa:alessandro-strada/ppa 2>&1 > /dev/null !apt-get update -qq 2>&1 > /dev/null !apt-get -y install -qq google-drive-ocamlfuse fuse from google.colab import auth auth.authenticate_user() from oauth2client.client import GoogleCredentials creds = GoogleCredentials.get_application_default() import getpass !google-drive-ocamlfuse -headless -id={creds.client_id} -secret={creds.client_secret} < /dev/null 2>&1 | grep URL vcode = getpass.getpass() !echo {vcode} | google-drive-ocamlfuse -headless -id={creds.client_id} -secret={creds.client_secret} 

Ce code renverra le lien et donnera une fenêtre d'entrée. Vous devez suivre le lien, copier le code et le saisir dans la fenêtre. Pour une raison quelconque, je dois le faire deux fois. Suivant:

 !mkdir -p drive !google-drive-ocamlfuse drive 

Après cela, vous pouvez utiliser votre disque Google comme répertoire normal. De plus, toutes les modifications de ce répertoire sont automatiquement synchronisées avec Google Drive.

Installation de Keras :

 !pip install -q keras import keras 

Installez PyTorch :

 from os import path from wheel.pep425tags import get_abbr_impl, get_impl_ver, get_abi_tag platform = '{}{}-{}'.format(get_abbr_impl(), get_impl_ver(), get_abi_tag()) accelerator = 'cu80' if path.exists('/opt/bin/nvidia-smi') else 'cpu' !pip install -q http://download.pytorch.org/whl/{accelerator}/torch-0.3.0.post4-{platform}-linux_x86_64.whl torchvision import torch 

Changer le répertoire de travail:

 import os os.chdir("/path/to/wdir") 

Effacez toutes les modifications et redémarrez la machine:

 !kill -9 -1 

Téléchargez le fichier sur la machine locale:

 from google.colab import files files.download('file.ext') 

Obtenez le dictionnaire des fichiers téléchargés sur le disque Google:

 from google.colab import files uploaded = files.upload() 

Couper la sortie de la commande du terminal (rediriger vers la variable):

 lines_list = !pwd 

En général, Google Colaboratory offre une bonne occasion de mener une formation sur les réseaux de neurones dans le cloud. Certes, cela peut ne pas être suffisant pour les très grandes grilles. Un autre avantage est la possibilité d'exécuter du code indépendamment du système d'exploitation local (ce qui est bon pour la reproductibilité), et également de travailler ensemble sur le même projet. En guise de hic, le GPU peut ne pas être disponible, y compris pendant longtemps.

Source: https://habr.com/ru/post/fr413229/


All Articles