Training Tensorflow Inception-v3 Imagenet auf bescheidenen Hardware-Setup

9

Ich habe Inception V3 auf einer bescheidenen Maschine mit einer einzigen GPU (GeForce GTX 980 Ti, 6GB) trainiert. Die maximale Stapelgröße scheint ungefähr 40 zu sein.

Ich habe die Standardeinstellungen für die Lernrate verwendet, die in der Datei inception_train.py angegeben wurden: initial_learning_rate = 0.1 , num_epochs_per_decay = 30 und learning_rate_decay_factor = 0.16 . Nach ein paar Wochen Training war die beste Genauigkeit, die ich erreichen konnte, die folgende: (500K-1M Iterationen):

%Vor%

Ich habe versucht, gegen Ende der Trainingseinheit mit den Einstellungen herumzuspielen, konnte aber keine Verbesserung der Genauigkeit feststellen.

Ich habe eine neue Trainingssitzung von Grund auf mit num_epochs_per_decay = 10 und learning_rate_decay_factor = 0.001 begonnen, basierend auf einigen anderen Posts in diesem Forum, aber es ist hier im Dunkeln zu fassen.

Irgendwelche Empfehlungen zu guten Voreinstellungen für ein kleines Hardware-Setup wie meines?

    
Dominiek 08.07.2016, 04:59
quelle

2 Antworten

18

TL, DR: Es gibt keine bekannte Methode, um ein Inception V3-Modell innerhalb einer akzeptablen Zeitspanne von einem bescheidenen Hardware-Setup aus neu zu trainieren. Ich würde dringend empfehlen, ein vortrainiertes Modell auf Ihre gewünschte Aufgabe zu trainieren.

Bei einem kleinen Hardware-Setup wie dem Ihren wird es schwierig sein, die maximale Leistung zu erreichen. Im Allgemeinen ist die beste Leistung für CNNs mit den größten möglichen Losgrößen. Dies bedeutet, dass bei CNN der Trainingsvorgang oft durch die maximale Stapelgröße begrenzt wird, die in den GPU-Speicher passen kann.

Das Inception V3-Modell zum Herunterladen hier wurde mit einer effektiven Stapelgröße von 1600 auf 50 GPUs trainiert - wobei jede GPU eine Stapelgröße von 32 hatte.

Angesichts Ihrer bescheidenen Hardware wäre mein erster Vorschlag, den vortrainierten Modus über den obigen Link herunterzuladen und das Modell für Ihre individuelle Aufgabe neu zu trainieren. Das würde dein Leben viel glücklicher machen.

Als Gedankenexperiment (aber kaum praktikabel) .. wenn Sie sich besonders dazu gezwungen fühlen, die Trainingsleistung des Modells vom vortrainierten Modell durch Training von Grund auf anzupassen, könnten Sie folgendes tun wahnsinnig Verfahren auf Ihrer 1 GPU. Sie könnten nämlich das folgende Verfahren ausführen:

  1. Ausführung mit einer Batchgröße von 32
  2. Speichern Sie die Farbverläufe aus dem Lauf
  3. Wiederholen Sie dies 50 mal.
  4. Durchschnitt der Steigungen von den 50 Chargen.
  5. Aktualisiere alle Variablen mit den Gradienten.
  6. Wiederholen Sie

Ich erwähne das nur, um Ihnen einen konzeptionellen Sinn dafür zu geben, was erreicht werden müsste, um genau die gleiche Leistung zu erzielen. Angesichts der von Ihnen genannten Geschwindigkeitsnummern würde dieser Vorgang Monate dauern. Kaum praktisch.

Realistischer, wenn Sie immer noch stark daran interessiert sind, von Grund auf zu trainieren und das Beste zu tun, was Sie können, hier einige allgemeine Richtlinien:

  • Führen Sie immer die größtmögliche Batchgröße aus. Es sieht so aus, als ob du das schon machst. Großartig.
  • Stellen Sie sicher, dass Sie nicht an die CPU gebunden sind. Das heißt, stellen Sie sicher, dass die Eingabeverarbeitungswarteschlangen immer bescheiden genug sind, wie auf TensorBoard angezeigt. Wenn nicht, erhöhen Sie die Anzahl der Vorverarbeitungs-Threads oder verwenden Sie eine andere CPU, falls verfügbar.
  • Re: Lernrate. Wenn Sie immer synchrones Training durchführen (was bei 1 GPU der Fall sein muss), ist die tolerierbare Lernrate umso höher, je höher die Batchgröße ist. Ich würde versuchen, eine Reihe von mehreren schnellen Läufen (z. B. jeweils einige Stunden) durchzuführen, um das höchstmögliche Lernen zu identifizieren, das nicht zu NaNs führt. Nachdem Sie eine solche Lernrate gefunden haben, klicken Sie 5-10% und führen Sie damit fort.
  • Wie für num_epochs_per_decay und dease_rate gibt es mehrere Strategien. Die Strategie, die durch 10 Epochen pro Zerfall, 0,001 Decay-Faktor hervorgehoben wird, besteht darin, das Modell so lange wie möglich zu hämmern, bis die Eval-Genauigkeit Asymptoten ist. Und dann senken Sie die Lernrate. Dies ist eine einfache Strategie, die nett ist. Ich würde überprüfen, ob das, was Sie in Ihrem Modell sehen, überwacht, dass die Evaluierungsgenauigkeit und die Feststellung, dass es in der Tat asymptotiert, bevor Sie dem Modell erlauben, die Lernrate zu verringern. Schließlich ist der Abklingfaktor ein bisschen ad-hoc, aber eine Absenkung um beispielsweise eine Potenz von 10 scheint eine gute Faustregel zu sein.

Bitte beachten Sie, dass dies allgemeine Richtlinien sind und andere sogar unterschiedliche Ratschläge geben können. Der Grund, warum wir Ihnen keine spezifischere Anleitung geben können, ist, dass CNNs dieser Größe einfach nicht von Grund auf mit einem bescheidenen Hardware-Setup trainiert werden.

    
user5869947 10.07.2016 21:33
quelle
1

Ausgezeichnete Tipps. Es gibt Vorrang für das Training mit einem ähnlichen Setup wie bei Ihnen. Schau dir das an - Ссылка Diese Leute trainierten GoogleNet, aber mit Caffe. Dennoch wäre es hilfreich, ihre Erfahrungen zu studieren.

    
PintoUbuntu 06.12.2016 09:50
quelle