2016-10-06 2 views
0

Ich habe ein recht kleines neuronales Netzwerk mit zwei vollständig verbundenen Signeteilnetzwerken 10-> 100-> 10, deren Ausgang verkettet und dann in ein anderes 20-> 100-> 1-Netzwerk eingespeist wird. Diese Architektur ist ziemlich klein und hat nur einige Gewichtungsmatrizen, die eine maximale Dimension von 20x100 = 2000 Gewichten haben.Theano: einfaches neuronales Netzwerk mit 6 Schichten Zügen mit nur 132 Datenpunkten pro Sekunde. Warum ist es so langsam?

Auch wenn ich theano mit allen gesetzten Flags verwende, um GPU-Beschleunigung zu verwenden, erreicht das System nur 132 Iterationen (Datenpunkte!) Pro Sekunde. Ich verwende keine Minibatches, weil es nicht Ihr typisches neuronales Netzwerk ist, sondern ein Matrix-Faktorisierungsmodell.

Das System verwende ich die folgenden Spezifikationen hat:

OS

uname -a 
Linux node081 2.6.32-358.18.1.el6.x86_64 #1 SMP Wed Aug 28 17:19:38 UTC 2013 x86_64 x86_64 x86_64 GNU/Linux 

Software

  • Python 3.5.2 (von mir selbst kompiliert)
  • Theanos 0.9.0dev2.dev-ee4c4e21b9e9037f2aa9626c3d779382840ea 2E3
  • NumPy 1.11.2

cpu

Intel(R) Xeon(R) CPU E5-2620 0 @ 2.00GHz 

mit nproc die 12 zurückkehrt, somit könnten 12 Prozessoren haben (oder Kerne?)

GPU

Dies ist der Ausgang von nvidia-smi (mit meinem Prozess läuft):

+------------------------------------------------------+     
| NVIDIA-SMI 5.319.49 Driver Version: 319.49   |     
|-------------------------------+----------------------+----------------------+ 
| GPU Name  Persistence-M| Bus-Id  Disp.A | Volatile Uncorr. ECC | 
| Fan Temp Perf Pwr:Usage/Cap|   Memory-Usage | GPU-Util Compute M. | 
|===============================+======================+======================| 
| 0 Tesla K20m   On | 0000:03:00.0  Off |     Off | 
| N/A 29C P0 49W/225W |  92MB/5119MB |  19%  Default | 
+-------------------------------+----------------------+----------------------+ 

+-----------------------------------------------------------------------------+ 
| Compute processes:            GPU Memory | 
| GPU  PID Process name          Usage  | 
|=============================================================================| 
| 0  5903 python3            77MB | 
+-----------------------------------------------------------------------------+ 

Befehl und env vars

OMP_NUM_THREADS=8 THEANO_FLAGS=mode=FAST_RUN,device=gpu,init_gpu_device=gpu,floatX=float32,nvcc.flags=-D_FORCE_INLINES,print_active_device=True,enable_initial_driver_test=True,warn_float64=raise,force_device=True,assert_no_cpu_op=raise python3 [email protected] 

Einstellungen Theanos Config zur Laufzeit gesetzt

theano.config.optimizer='fast_run' 
theano.config.openmp=True 
theano.config.openmp_elemwise_minsize=4 
theano.config.floatX='float32' 
theano.config.assert_no_cpu_op='raise' 

ich auch versucht, deaktivieren Sie openmp, und es funktioniert etwas langsamer.

Es scheint, dass ich alle Vorsichtsmaßnahmen getroffen habe, um sicherzustellen, dass ich GPU-Beschleunigung richtig eingestellt habe. Was könnte der Grund sein, nur 132 Gradientenupdates in jeder Sekunde zu bekommen? Gibt es weitere Prüfungen, die ich durchführen muss?

Antwort

1

In Theano,

  • Die Compilation ist viel schneller auf optimizer=fast_compile als mit optimizer=fast_run.
  • Mithilfe des neuen Back-Ends wurde die Kompilierungszeit mit Hilfe des neuen Optimierers in bestimmten Netzwerken um das 5-Fache erhöht. Ich würde vorschlagen, dass Sie immer mit dem neuen Backend bleiben sollten. Sie können das neue Backend mit dem Flag device=cuda verwenden.
  • Während Sie das neue Backend verwenden, rate ich Ihnen, die blutigste Kante zu verwenden, wenn Sie Geschwindigkeit wollen. Es werden jede Woche viele Optimierungen durchgeführt, die ein hohes Tempo ermöglichen.

  • Aus den Dokumenten, können Sie das Flag gesetzt allow_gc=False schneller Geschwindigkeit zu bekommen

  • Sie config.nvcc.fastmath Flag auf True gesetzt, wenn Sie eine Geschwindigkeit von bis sich aus der Division und Multiplikation Operationen auf Kosten erfordern Präzision.
  • Wenn Sie Faltungsoperationen in Ihrem Netzwerk haben, können Sie je nach Netzwerk und Bedarf einige config.dnn Flags festlegen. Auch das Setzen von cnmem-Flag wird helfen.

  • Schließlich, wenn Sie einen Code Berichterstattung langsam, bitte Profilierungs Ergebnisse für die Unterstützung der Entwicklung teilen :)

+0

was ich den Code, um tat, war die Umstrukturierung minibatches möglich zu machen. Mit einer Minibuchse von 64 habe ich etwa 40x Speedup bekommen. Ich könnte Ihre Vorschläge früher oder später versuchen. – fstab

+0

Da auf einer GPU Matrix - Matrix - Multiplikationen viel schneller als Matrix - Vektor sind, schlage ich vor, dass Sie eine optimale Mini - Batch - Größe einstellen, die es Ihnen ermöglicht, den fast vollständigen GPU - Speicher zu verwenden, damit Sie den Gradienten schneller und schneller berechnen können effizienterer Weg – Sentient07

+0

Es stimmt, es gibt einen Haken: Die Minibatch-Größe beeinflusst auch das Lernen: Je größer der Minibatch, desto weniger "stochastische" positive Effekte des Stochastic Gradient Descent. – fstab

Verwandte Themen