Google Colaboratory ist ein kürzlich eingeführter Cloud-Dienst, der die Forschung im Bereich maschinelles Lernen und Deep Learning vereinfachen soll. Mit dem Colaboratory können Sie mit einer angeschlossenen Grafikkarte per Fernzugriff auf ein Gerät zugreifen. Es ist völlig kostenlos. Dies vereinfacht das Leben erheblich, wenn Sie tiefe neuronale Netze trainieren müssen. Wir können sagen, dass es sich um ein Analogon zu Google-Dokumenten für das Jupyter-Notizbuch handelt.
In Colaboratory ist Tensorflow
vorinstalliert und fast alle Python-Bibliotheken sind für die Arbeit erforderlich. Wenn ein Paket fehlt, kann es einfach unterwegs durch
pip
oder
apt-get
installiert werden. Aber was ist, wenn Sie ein Projekt aus dem Quellcode erstellen und eine Verbindung zur GPU herstellen müssen? Es stellt sich heraus, dass dies möglicherweise nicht so einfach ist, wie ich beim Aufbau von
SSD-Caffe herausgefunden habe . In dieser Veröffentlichung werde ich eine kurze Beschreibung des Labors geben, die aufgetretenen Schwierigkeiten und deren Lösung beschreiben sowie einige nützliche Tricks bereitstellen.
Der gesamte Code ist in meinem
Colaboratory Notebook verfügbar.
Kurz über Colaboratory
Grob gesagt können Sie mit Colaboratory Jupyter Notebook auf einem Remotecomputer ausführen. Labordateien sind normale .ipynb-Laptops und werden auf der Google-Festplatte gespeichert. Es gibt auch eine Reihe von Funktionen, mit denen Sie Dateien von einem Remotecomputer auf die Google-Festplatte hochladen können und umgekehrt. Sie können diese Dateien auch für andere freigeben und Kommentare dazu schreiben, wie in Google-Dokumenten.
Im Labor können Sie die GPU verwenden, nämlich den Tesla K80. Verbinden Sie dies dazu in den Einstellungen: Laufzeit
Laufzeittyp ändern
Hardwarebeschleuniger. Es ist erwähnenswert, dass GPUs nicht immer verfügbar sind, und dann bietet das Labor an, die Maschine ohne sie zu starten.
Es scheint, dass nichts außer dem Jupyter Notebook selbst gestartet werden kann, aber es gibt einen indirekten Zugriff auf das Terminal: Dazu müssen Sie vor dem Terminalbefehl ein Ausrufezeichen
!mkdir images
, zum Beispiel
!mkdir images
. Im Allgemeinen können wir davon ausgehen, dass es sich um einen perfekten normalen Computer handelt, auf dem Ubuntu 17.10 (zum Zeitpunkt des Schreibens) installiert, aber remote verbunden ist. Daraus folgt, dass alles, was über das Terminal (nicht interaktiv) ausgeführt werden kann, auf dem Terminal ausgeführt werden kann, einschließlich:
- Klon-Repositorys mit
git clone
, - Daten mit
wget
laden (übrigens werden auch große Dateien fast sofort von einer Google-Festplatte geladen), - benutze
make
(und höchstwahrscheinlich cmake
) - Installieren Sie Tools und Bibliotheken mit
apt-get
und pip
Noch ein paar Kommentare zum Colaboratory:
- Es scheint, dass der Benutzer uneingeschränkten Zugriff auf alle Dateien im System hat (alle Befehle müssen ohne
sudo
geschrieben werden); - Der Terminalstatus wird nicht zwischen Teams übertragen, selbst wenn sie sich in derselben Zelle befinden (z. B.
cd dir
falls erforderlich, müssen Sie zu Beginn jedes Befehls schreiben). - Wenn Sie die Verbindung zum Labor für längere Zeit trennen, werden alle Änderungen in der virtuellen Maschine gelöscht, einschließlich aller installierten Pakete und heruntergeladenen Dateien. Daher wird empfohlen, die Installation von Paketen in das Jupyter-Notizbuch aufzunehmen.
- Nach 12 Stunden Dauerbetrieb schaltet sich das Gerät automatisch aus, kann dann aber neu gestartet werden (theoretisch ist die GPU in der Praxis möglicherweise nicht verfügbar).
SSD-Caffe Build
Ich wollte den
Single Shot Detector (SSD) ausprobieren, nämlich die
Caffe-Implementierung in Google Colaboratory, aber dafür musste das Projekt aus dem Quellcode zusammengestellt werden.
Übrigens, wenn eine Version von
Caffe für Sie geeignet ist, gibt es einen viel einfacheren Weg (es funktioniert sogar, obwohl ich nicht versucht habe, etwas auszuführen):
!apt install caffe-cuda
Das Zusammenbauen von SSD-Caffe aus der Quelle ist eine ziemlich lange Aufgabe in mehreren Schritten, die nur mit Krücken durchgeführt werden kann.
Schritt 1: Installieren von AbhängigkeitenHier müssen wir alle Abhängigkeiten für Caffe mit
apt
herunterladen. Zuvor müssen Sie jedoch zulassen, dass
apt
den Abhängigkeitsquellcode herunterlädt.
Im Caffe-Installationshandbuch heißt es, dass hierfür eine "deb-src-Zeile in der Datei sources.list" erforderlich ist. Leider gibt es dort keine Details, so dass ich nur alle
deb-src
Zeilen in der Datei
/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'))
Und es hat funktioniert. Es bleiben nur die Abhängigkeiten herunterzuladen:
!apt update !apt build-dep caffe-cuda
Schritt 2: Benötigen Sie einen anderen CompilerHier ist das Problem das folgende:
g++-7
, das standardmäßig die Standardeinstellung ist, ist aus irgendeinem Grund nicht mit dem
nvcc
CUDA-Compiler kompatibel, sodass Sie etwas anderes verwenden müssen. Ich habe
g++-5
heruntergeladen und es zum Standard-Compiler gemacht:
!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
Schritt 3: Boost bauen müssenWenn Sie zu diesem Zeitpunkt versuchen, Caffe zu erstellen, treten beim Versuch, Boost zu verbinden, Probleme auf, da es von einem anderen Compiler erstellt wurde. Sie müssen daher seine Quellen herunterladen und auch mit
g++-5
erstellen (
mehr auf der Boost-Website ):
!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
Schritt 4: Konfigurieren Sie das MakefileCaffe mit GitHub klonen:
!git clone https://github.com/weiliu89/caffe.git && cd caffe && git checkout ssd
Und wir ändern die erforderlichen Felder in Makefile.config - Ich habe den Pfad zu CUDA geändert, die BLAS-Option geändert, die Version von OpenCV in eine dritte geändert, eine Python-Ebene hinzugefügt und auch alle Pfade zu den Bibliotheken hinzugefügt, die installiert wurden, aber aus irgendeinem Grund nicht gefunden wurden (all dies ist praktisch) fertig mit 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']
Außerdem musste ich im Makefile selbst alle
-isystem
Tags durch
-I
ersetzen: Beide sind für das Auffinden der Header verantwortlich, werden jedoch etwas anders verarbeitet, und ohne dieses Problem traten bereits beim Verbinden von stdlib Probleme auf (
weitere Details hier ):
with open('caffe/Makefile') as f: mfile = f.read() with open('caffe/Makefile', 'w') as f: f.write(mfile.replace('-isystem','-I'))
Schritt 5: ErstellenEs war noch eine letzte Krücke übrig - um die
c++config.h
zu korrigieren, andernfalls gibt es Probleme mit Nan-Typen (
mehr ):
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'))
Jetzt können Sie tatsächlich Caffe bauen:
!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
In den letzten beiden Zeilen werden die Bibliothekspfade Boost und Caffe hinzugefügt.
Jetzt kann Caffe verwendet werden (Sie müssen nur den Pfad dazu in PYTHONPATH angeben):
import sys caffe_path = !cd caffe/python && pwd sys.path.insert(0, caffe_path[0]) import caffe
Um es zu testen, habe ich das
Mobilenet-SSD- Projekt getestet: Der Code befindet sich auch in meinem
Colaboratory Notebook .
Insbesondere habe ich die Vorhersagezeit für ein Bild gemessen und die Beschleunigung auf der GPU betrug etwa 3,8.
Bonus: einige nützliche Tricks
Es gibt ein
großartiges Tutorial zu Medium in Google Colaboratory. Auch im Labor selbst gibt es Dateien mit Beispielen für fast alles, was benötigt wird.
Hängen Sie eine Google-Festplatte in das Dateisystem einer virtuellen Maschine ein:
!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}
Dieser Code gibt den Link zurück und gibt ein Eingabefenster. Sie müssen dem Link folgen, den Code kopieren und in das Fenster eingeben. Aus irgendeinem Grund muss ich das zweimal machen. Weiter:
!mkdir -p drive !google-drive-ocamlfuse drive
Danach können Sie Ihre Google-Festplatte als reguläres Verzeichnis verwenden. Außerdem werden alle Änderungen in diesem Verzeichnis automatisch mit Google-Drive synchronisiert.
Keras- Installation:
!pip install -q keras import keras
Installieren Sie
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
Arbeitsverzeichnis ändern:
import os os.chdir("/path/to/wdir")
Löschen Sie alle Änderungen und starten Sie den Computer neu:
!kill -9 -1
Laden Sie die Datei auf den lokalen Computer hoch:
from google.colab import files files.download('file.ext')
Holen Sie sich das Wörterbuch aus Dateien, die auf die Google-Festplatte hochgeladen wurden:
from google.colab import files uploaded = files.upload()
Ausgabe des Terminalbefehls stummschalten (zur Variablen umleiten):
lines_list = !pwd
Im Allgemeinen bietet Google Colaboratory eine gute Möglichkeit, neuronale Netze in der Cloud zu trainieren. Dies ist möglicherweise nicht ausreichend für sehr große Gitter. Ein weiteres Plus ist die Möglichkeit, Code unabhängig vom lokalen Betriebssystem auszuführen (was für die Reproduzierbarkeit gut ist) und auch an demselben Projekt zusammenzuarbeiten. Als Haken ist die GPU möglicherweise auch für längere Zeit nicht verfügbar.