Neue Google Compute Engine-VM-Images für Deep Learning

Ursprünglicher Autor: Viacheslav Kovalevskyi
  • Übersetzung

Mitautor des Artikels: Mike Cheng


Die Google Cloud-Plattform hat jetzt virtuelle Maschinen-Images im Portfolio, die speziell für die an Deep Learning Beteiligten entwickelt wurden. Heute werden wir darüber sprechen, was diese Bilder sind, welche Vorteile sie Entwicklern und Forschern bieten und wie eine virtuelle Maschine erstellt werden kann.


Lyrischer Exkurs: Zum Zeitpunkt der Erstellung dieses Dokuments befand sich das Produkt noch in der Beta-Phase, dementsprechend gelten keine SLAs.


Was für eine Art von Bestie sind dies virtuelle Bilder für Googles Deep Learning?


Die Deep Learning-VMs von Google sind Bilder von Debian 9, die sofort einsatzbereit sind und über alles verfügen, was Sie für Deep Learning benötigen. Derzeit gibt es Versionen von Bildern mit TensorFlow, PyTorch und Universalbildern. Jede Version wird nur für CPU- und GPU-Instanzen bearbeitet. Um etwas besser zu verstehen, welches Bild Sie benötigen, habe ich einen kleinen Spickzettel gezeichnet:



Wie auf dem Spickzettel gezeigt, gibt es 8 verschiedene Familien von Bildern. Wie bereits erwähnt, basieren sie alle auf Debian 9.


Was genau ist auf den Images vorinstalliert?


Alle Bilder haben Python 2.7 / 3.5 mit den folgenden vorinstallierten Paketen:


  • numpy
  • sklearn
  • scipy
  • Pandas
  • nltk
  • kissen
  • Jupyter-Umgebungen (Labor und Notebook)
  • und vieles mehr.

Konfigurierter Stack von Nvidia (nur in GPU-Images):


  • CUDA 9. *
  • CuDNN 7.1
  • NCCL 2. *
  • neueste nvidia fahrer

Die Liste wird ständig aktualisiert, bleiben Sie also auf der offiziellen Seite .


Und warum werden diese Bilder eigentlich benötigt?


Nehmen wir an, Sie müssen ein neuronales Netzwerkmodell mit Keras (mit TensorFlow) trainieren. Sie benötigen Lerngeschwindigkeit und entscheiden sich für eine GPU. Um eine GPU verwenden zu können, müssen Sie den Nvidia-Stack (Nvidia-Treiber + CUDA + CuDNN + NCCL) installieren und konfigurieren. Dieser Prozess ist nicht nur an sich recht komplex (insbesondere wenn Sie kein Systemingenieur, sondern ein Forscher sind), es erschwert auch die Tatsache, dass Sie die binären Abhängigkeiten Ihrer Version der TensorFlow-Bibliothek berücksichtigen müssen. Beispielsweise wird die offizielle TensorFlow 1.9-Distribution mit CUDA 9.0 kompiliert und funktioniert nicht, wenn Sie einen Stack mit CUDA 9.1 oder 9.2 installiert haben. Das Einrichten dieses Stacks kann ein "spaßiger" Prozess sein, ich glaube, niemand wird damit streiten (insbesondere diejenigen, die dies getan haben).


Nehmen wir nun an, nach mehreren schlaflosen Nächten ist alles eingerichtet und funktioniert. Frage: Diese Konfiguration, die Sie konfigurieren konnten, ist die optimale für Ihre Hardware? Stimmt es beispielsweise, dass die installierte CUDA 9.0 und das offizielle Binärpaket TensorFlow 1.9 mit einem SkyLake-Prozessor und einer Volta V100-GPU die schnellste Geschwindigkeit in einer Instanz zeigen?


Es ist fast unmöglich zu antworten, ohne Tests mit anderen CUDA-Versionen durchzuführen. Um sicher zu gehen, müssen Sie TensorFlow manuell in verschiedenen Konfigurationen zusammenbauen und Ihre Tests loswerden. All dies sollte mit dem teuren Eisen durchgeführt werden, auf dem das Modell später trainiert werden soll. Schließlich können alle diese Messungen verworfen werden, sobald die neue Version von TensorFlow oder der Stack von Nvidia freigegeben wird. Wir können mit Sicherheit sagen, dass die meisten Forscher dies einfach nicht tun werden und einfach die Standard-TensorFlow-Baugruppe verwenden, da sie nicht die optimale Geschwindigkeit haben.


Hier erscheinen Googles Deep Learning-Bilder. Bilder mit TensorFlow verfügen beispielsweise über einen eigenen TensorFlow, der für Hardware optimiert ist, die sich auf der Google Cloud Engine befindet. Sie wurden mit verschiedenen Konfigurationen des Nvidia-Stacks getestet und basieren auf der Konfiguration mit der höchsten Leistung (Spoiler: Dies ist nicht immer die neueste). Und vor allem - fast alles, was für die Forschung benötigt wird, ist bereits vorinstalliert!


Wie kann ich eine Instanz erstellen, die auf einem der Bilder basiert?


Es gibt zwei Optionen, um eine neue Instanz basierend auf diesen Bildern zu erstellen:


  • Verwenden der Google Cloud Marketplace-Weboberfläche
  • Gcloud verwenden

Da ich also ein großer Fan der Terminal- und CLI-Dienstprogramme bin, werde ich in diesem Artikel über diese Version sprechen. Wenn Ihnen die Benutzeroberfläche gefällt, finden Sie außerdem eine gute Dokumentation, in der beschrieben wird, wie eine Instanz mithilfe der Web-Benutzeroberfläche erstellt wird .


Bevor Sie fortfahren, installieren Sie das gcloud- Tool (falls noch nicht installiert) . Optional können Sie Google Cloud Shell verwenden . Beachten Sie jedoch, dass die WebPreview- Funktion in Google Cloud Shell derzeit nicht unterstützt wird. Daher können Sie dort kein Jupyter Lab oder Notebook verwenden.


Der nächste Schritt besteht darin, eine Familie von Bildern auszuwählen. Erlaube mir, den Spickzettel noch einmal mit der Wahl einer Familie von Bildern zu führen.



Für ein Beispiel gehen wir davon aus, dass Ihre Entscheidung auf tf-latest-cu92 gefallen ist. Wir werden sie später im Text verwenden.


Warten Sie eine Minute, aber was ist, wenn ich eine bestimmte Version von TensorFlow brauche, nicht die "letzte"?


Angenommen, wir haben ein Projekt, für das TensorFlow 1.8 erforderlich ist, gleichzeitig wurde jedoch bereits 1.9 veröffentlicht und die Bilder der tf-latest-Familie haben bereits 1.9. Für diesen Fall haben wir eine Familie von Bildern, die immer eine bestimmte Version des Frameworks haben (in unserem Fall tf-1-8-cpu und tf-1-8-cu92). Diese Bildfamilien werden aktualisiert, die TensorFlow-Version wird jedoch nicht geändert.


Da dies nur Beta-Version ist, unterstützen wir jetzt nur TensorFlow 1.8 / 1.9 und PyTorch 0.4. Wir planen, spätere Versionen zu unterstützen, aber zum jetzigen Zeitpunkt können wir die Frage, wie lange die alten Versionen beibehalten werden, nicht eindeutig beantworten.


Was ist, wenn ich einen Cluster erstellen oder dasselbe Image verwenden möchte?


In der Tat kann es viele Fälle geben, in denen dasselbe Bild immer wieder verwendet werden muss (und nicht die Bildfamilie). Streng genommen ist die direkte Verwendung von Bildern fast immer die bevorzugte Option. Wenn Sie beispielsweise einen Cluster mit mehreren Instanzen starten, ist es in diesem Fall nicht empfehlenswert, die Familie der Abbilder in Ihren Skripts direkt anzugeben. Wenn die Familie zum Zeitpunkt der Ausführung des Skripts aktualisiert wird, werden wahrscheinlich verschiedene Clusterinstanzen aus verschiedenen Abbildern erstellt (und kann unterschiedliche Bibliotheksversionen haben!). In solchen Fällen ist es wünschenswert, zuerst den spezifischen Namen des Bildes ihrer Familie zu ermitteln und erst dann den spezifischen Namen zu verwenden.


Wenn Sie sich für dieses Thema interessieren, können Sie meinen Artikel „Wie man eine Familie von Bildern korrekt verwendet“ sieht .


Sie können den Namen des letzten Bildes in der Familie mit einem einfachen Befehl anzeigen:


gcloud compute images describe-from-family tf-latest-cu92 \
        --project deeplearning-platform-release

Angenommen, der Name eines bestimmten Bildes lautet tf-latest-cu92–1529452792. Sie können es überall verwenden:


Zeit, unsere erste Instanz zu erstellen!


Um eine Instanz aus der Familie der Bilder zu erstellen, genügt es, einen einfachen Befehl auszuführen:


export IMAGE_FAMILY="tf-latest-cu92" # подставьте нужное семейство образов
export ZONE="us-west1-b"
export INSTANCE_NAME="my-instance"
gcloud compute instances create $INSTANCE_NAME \
        --zone=$ZONE \
        --image-family=$IMAGE_FAMILY \
        --image-project=deeplearning-platform-release \
        --maintenance-policy=TERMINATE \
        --accelerator='type=nvidia-tesla-v100,count=8' \
        --metadata='install-nvidia-driver=True'

Wenn Sie den Bildnamen und nicht die Bildfamilie verwenden, müssen Sie "- image-family = $ IMAGE_FAMILY" durch "- image = $ IMAGE-NAME" ersetzen.


Wenn Sie eine Instanz mit einer GPU verwenden, müssen Sie auf die folgenden Umstände achten:


Sie müssen die richtige Zone auswählen . Wenn Sie eine Instanz mit einer bestimmten GPU erstellen, müssen Sie sicherstellen, dass dieser GPU-Typ in der Zone verfügbar ist, in der Sie die Instanz erstellen. Hier gibt es kann durch geeignete Zonen GPU - Typ zu finden. Wie Sie sehen, ist us-west1-b die einzige Zone, in der alle 3 möglichen GPU-Typen (K80 / P100 / V100) verfügbar sind.


Stellen Sie sicher, dass Sie über ausreichende Kontingente verfügen, um eine Instanz mit der GPU zu erstellen . Selbst wenn Sie die richtige Region ausgewählt haben, bedeutet dies nicht, dass Sie über eine Quote für das Erstellen einer Instanz mit einer GPU in dieser Region verfügen. Standardmäßig ist das Kontingent für die GPU in allen Regionen auf Null gesetzt, sodass alle Versuche, eine Instanz aus der GPU zu erstellen, fehlschlagen. Eine gute Erklärung zur Erhöhung der Quote finden Sie hier .


Stellen Sie sicher, dass sich in der Zone genügend GPU befindet, um Ihre Anfrage zu erfüllen . Selbst wenn Sie die richtige Region ausgewählt haben und eine Quote für die GPU in dieser Region haben, bedeutet dies nicht, dass sich die GPU, an der Sie interessiert sind, in dieser Zone befindet. Ich weiß leider nicht, wie Sie sonst die Verfügbarkeit der GPU überprüfen können, außer als Versuch, eine Instanz zu erstellen und zu sehen, was passiert =)


Wählen Sie die richtige Anzahl von GPUs (abhängig vom GPU-Typ) . Tatsache ist, dass das Flag "Beschleuniger" in unserem Team für die Art und Anzahl der GPUs verantwortlich ist, die der Instanz zur Verfügung stehen werden. „- accelerator = 'type = nvidia-tesla-v100, count = 8'“ erstellt eine Instanz mit acht verfügbaren Nvidia Tesla V100 (Volta) GPUs. Jeder GPU-Typ verfügt über eine gültige Liste von Zählwerten. Hier ist die Liste für jeden GPU-Typ:


  • nvidia-tesla-k80 kann Zählungen haben: 1, 2, 4, 8
  • nvidia-tesla-p100 kann Zählungen haben: 1, 2, 4
  • nvidia-tesla-v100 kann Zählungen haben: 1, 8

Erteilen Sie der Google Cloud die Erlaubnis, den Nvidia-Treiber zum Zeitpunkt des Starts der Instanz in Ihrem Namen zu installieren . Der Treiber von Nvidia ist obligatorisch. Aus Gründen, die über den Rahmen dieses Artikels hinausgehen, ist auf den Bildern kein Nvidia-Treiber vorinstalliert. Sie können Google Cloud jedoch das Recht erteilen, es in Ihrem Namen zu installieren, wenn Sie die Instanz zum ersten Mal starten. Dies geschieht durch Hinzufügen des Flags "- metadata = 'install-nvidia-driver = True'". Wenn Sie dieses Flag nicht angeben, werden Sie bei der ersten Verbindung über SSH aufgefordert, den Treiber zu installieren.


Leider dauert der Treiberinstallationsvorgang beim ersten Laden einige Zeit, da er diesen Treiber selbst herunterladen und installieren muss (was dazu führt, dass die Instanz neu gestartet wird). Insgesamt sollte dies nicht länger als 5 Minuten dauern. Wir werden später darüber sprechen, wie Sie die Zeit des ersten Startvorgangs reduzieren können.


Verbindung zu einer SSH-Instanz herstellen


Es ist einfacher als eine dampfende Rübe und kann mit einem Befehl ausgeführt werden:


gcloud compute ssh $INSTANCE_NAME

gcloud erstellt ein Schlüsselpaar, lädt diese automatisch in die neu erstellte Instanz hoch und erstellt Ihren Benutzer darauf. Wenn Sie diesen Prozess noch einfacher machen möchten, können Sie eine Funktion verwenden, die dies vereinfacht:


function gssh() { 
  gcloud compute ssh $@
}
gssh $INSTANCE_NAME

By the way, können Sie alle meine gcloud bash Funktion finden hier . Bevor wir zu der Frage kommen, wie schnell diese Bilder sind, oder was mit ihnen gemacht werden kann, möchte ich das Problem mit der Startgeschwindigkeit der Instanzen klären.


Wie kann ich die Zeit des ersten Durchlaufs reduzieren?


Technisch gesehen die Zeit des allerersten Laufs - auf keinen Fall. Aber du kannst:


  • die billigste n1-standard-1-Instanz mit einem K80 erstellen;
  • Warten Sie, bis der erste Download abgeschlossen ist.
  • Überprüfen Sie, ob der Nvidia-Treiber installiert ist (dies kann durch Ausführen von "nvidia-smi" durchgeführt werden);
  • Instanz stoppen;
  • Erstellen Sie Ihr eigenes Bild aus einer angehaltenen Instanz.
  • Profit - alle Instanzen, die mit Ihrem abgeleiteten Image erstellt wurden, haben eine legendäre Startzeit von 15 Sekunden.

Aus dieser Liste wissen wir also bereits, wie eine neue Instanz erstellt und eine Verbindung zu ihr hergestellt wird. Außerdem können wir die Treiber auf Funktionsfähigkeit prüfen. Es bleibt nur noch zu besprechen, wie die Instanz angehalten und daraus ein Bild erstellt werden kann.


Führen Sie den folgenden Befehl aus, um die Instanz zu stoppen:


function ginstance_stop() { 
  gcloud compute instances stop - quiet $@
}
ginstance_stop $INSTANCE_NAME

Und hier ist der Befehl zur Image-Erstellung:


export IMAGE_NAME="my-awesome-image"
export IMAGE_FAMILY="family1"
gcloud compute images create $IMAGE_NAME \
        --source-disk $INSTANCE_NAME \
        --source-disk-zone $ZONE \
        --family $IMAGE_FAMILY

Herzlichen Glückwunsch, Sie haben jetzt Ihr Image mit den installierten Treibern von Nvidia.


Was ist mit Jupyter Lab?


Sobald Ihre Instanz funktioniert, ist der nächste logische Schritt, Jupyter Lab zu starten, um direkt Geschäfte zu tätigen. Mit neuen Bildern ist dies sehr einfach. Das Jupyter Lab läuft bereits seit dem Start der Instanz. Alles, was Sie tun müssen, ist eine Verbindung mit der Instanz mit der Portweiterleitung herzustellen, die Jupyter Lab überwacht. Und dies ist Port 8080. Dies geschieht mit dem folgenden Befehl:


gssh $INSTANCE_NAME -- -L 8080:localhost:8080

Alles ist fertig, jetzt können Sie einfach Ihren bevorzugten Browser öffnen und http: // localhost: 8080 aufrufen


Wie viel schneller ist TensorFlow aus Bildern?


Eine sehr wichtige Frage, da das Tempo des Trainings echtes Geld ist. Die vollständige Antwort auf diese Frage ist jedoch die längste, die bereits in diesem Artikel geschrieben wurde. Du musst also auf den nächsten Artikel warten :)


In der Zwischenzeit werde ich Sie mit einigen Zahlen über mein kleines persönliches Experiment verwöhnen. So betrug die Trainingsgeschwindigkeit bei ImageNet 6100 Bilder pro Sekunde (ResNet-50-Netzwerk). Mein persönliches Budget erlaubte es mir nicht, das Training des Modells vollständig abzuschließen. Bei dieser Geschwindigkeit gehe ich jedoch davon aus, dass Sie eine Genauigkeit von 75% in 5 Stunden und ein wenig erreichen können.


Wo bekomme ich Hilfe?


Wenn Sie Informationen zu neuen Bildern benötigen, können Sie:



Ihr Feedback ist sehr wichtig. Wenn Sie etwas zu den Bildern zu sagen haben, können Sie sich gerne an mich wenden, oder Sie können einen Kommentar unter diesem Artikel hinterlassen.


Jetzt auch beliebt: