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?
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
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
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