[PYTHON] Ich habe versucht zu überprüfen, wie schnell der Mnist des Chainer-Beispiels mit Cython beschleunigt werden kann

Warum machen

Es wurde seit Chainer 1.5 beschleunigt. Es wurde erwähnt, dass die Verwendung von Cython einer der Gründe für die Beschleunigung war, daher hatte ich eine einfache Frage, wie schnell es sein würde, wenn ich das Beispiel mit Cython umschreiben würde, also habe ich es versucht.

PC-Spezifikationen

OS:OS X Yosemite CPU: 2.7GHz Intel Core i5 Memory:8GHz DDR3

Bedingungen

Verwenden Sie Beispiel Mnist Anzahl der Lernvorgänge: 20 Mal Die Daten wurden im Voraus heruntergeladen

Visualisierung

Visualisierung mit Profiler

Verwenden Sie Pycallgraph http://pycallgraph.slowchop.com Installieren Sie graphviz http://www.graphviz.org/Download_macos.php Installieren Sie X11 (für Yosemite) http://www.xquartz.org/ Wenn fehlgeschlagen mit Fehlercode 256 erscheint https://github.com/gak/pycallgraph/issues/100

Bei Verwendung von Pycallgraph

 python pycallgraph graphviz -- ./Dateiname.py

Was ich machen will; was ich vorhabe zu tun

1: Visualisierung und Profilerstellung der normalen Verarbeitung 2: Einfaches Cython 3: Statische Typeinstellung durch cdef 4: Cythonisierung externer Module

Ausgangszustand

basic.png

Die Visualisierung gibt Ihnen eine Vorstellung davon, was Zeit braucht. train_mnist.Train_Mnist.train Sie können sehen, dass es 951 Sekunden dauert.

Das Ergebnis eines normalen Profils ist unten.

ncalls: Anzahl der Anrufe tottime: Gesamtzeit, die diese Funktion verbringt percall: tottime geteilt durch ncalls cumtime: Gesamtzeit (von Anfang bis Ende) dieser Funktion, einschließlich untergeordneter Funktionen. Dieses Element wird auch in rekursiven Funktionen genau gemessen. percall: cumtime geteilt durch die Anzahl der primitiven Anrufe

Dieses Mal wurde der Code aus Gründen der Benutzerfreundlichkeit von Cython geändert, sodass sich die Verarbeitungszeit von der oben genannten unterscheidet. Ich wollte unbedingt Pycallgraph mit Cython verwenden, konnte es aber aufgrund meines Unwissens nicht verwenden. Wenn jemand weiß, wie man es benutzt, lass es mich wissen (die Verarbeitung des Cithon-Teils wird im normalen Gebrauch nicht aufgeführt).

Es endet in 755,154 Sekunden.

Ausführungsmethode

python -m cProfile
Profile.prof

         37494628 function calls (35068627 primitive calls) in 755.154 seconds

   Ordered by: internal time

   ncalls  tottime  percall  cumtime  percall filename:lineno(function)
    72000  448.089    0.006  448.651    0.006 adam.py:27(update_one_cpu)
   114000  187.057    0.002  187.057    0.002 {method 'dot' of 'numpy.ndarray' objects}
   216000   31.576    0.000   31.576    0.000 {method 'fill' of 'numpy.ndarray' objects}
    12000   23.122    0.002  163.601    0.014 variable.py:216(backward)

Konzentrieren Sie sich basierend auf der 2: 8-Regel auf den Teil, dessen Verarbeitung am längsten dauert. Sie können sehen, dass adam.py fast den größten Teil der Verarbeitungszeit in Anspruch nimmt und die Matrixoperationen von numpy weiterhin die Verarbeitungszeit verwenden.

cython

Ich wollte es auch in Cython grafisch darstellen, aber ich hatte nicht genug Wissen über den Autor und konnte nicht nur den Verarbeitungsteil von Cython grafisch darstellen, also habe ich es profiliert.

Das Ergebnis ist langsamer als 800 Sekunden

Profile.prof

         37466504 function calls (35040503 primitive calls) in 800.453 seconds

   Ordered by: internal time

   ncalls  tottime  percall  cumtime  percall filename:lineno(function)
    72000  473.638    0.007  474.181    0.007 adam.py:27(update_one_cpu)
   114000  199.589    0.002  199.589    0.002 {method 'dot' of 'numpy.ndarray' objects}
   216000   33.706    0.000   33.706    0.000 {method 'fill' of 'numpy.ndarray' objects}
    12000   24.754    0.002  173.816    0.014 variable.py:216(backward)
    28000    9.944    0.000   10.392    0.000 

Der Verarbeitungsteil von adam.py und variable.py ist langsamer als vor der Cythonisierung. Es besteht die Möglichkeit, dass es aufgrund der Zusammenarbeit zwischen der von Cython konvertierten c-Sprache und der externen Verarbeitung von Python langsam ist.

cdef

Ich habe cdef mit der Erwartung definiert, dass es schneller sein würde, einen statischen Typ im Voraus mit cdef zu definieren.

Vorbereitungen

Als ich es auf dem Mac verwendet habe, ist ein Fehler aufgetreten, und ich habe verschiedene Maßnahmen ergriffen.

Wenn ich versuche, cimport zu verwenden, wird der folgende Fehler angezeigt.

/Users/smap2/.pyxbld/temp.macosx-10.10-x86_64-3.4/pyrex/train_mnist_c2.c:242:10: fatal error: 'numpy/arrayobject.h' file not found

Im folgenden Verzeichnis

/usr/local/include/

Kopieren Sie das mit dem folgenden Befehl gefundene Header-Verzeichnis oder übergeben Sie es

find / -name arrayobject.h -print 2> /dev/null

Es waren 776 Sekunden.

Profile.prof

         37466756 function calls (35040748 primitive calls) in 776.901 seconds

   Ordered by: internal time

   ncalls  tottime  percall  cumtime  percall filename:lineno(function)
    72000  458.284    0.006  458.812    0.006 adam.py:27(update_one_cpu)
   114000  194.834    0.002  194.834    0.002 {method 'dot' of 'numpy.ndarray' objects}
   216000   33.120    0.000   33.120    0.000 {method 'fill' of 'numpy.ndarray' objects}
    12000   24.025    0.002  168.772    0.014 variable.py:216(backward)

Es ist eine Verbesserung gegenüber der einfachen Cythonisierung, aber da sich in adam.py und variable.py nicht viel ändert, ist es aufgrund der zusätzlichen Verarbeitung der C-Sprache und der Python-Sprachkonvertierung langsamer als die Python-Verarbeitung.

adam.py cython

Ich habe versucht, den Teil zu beschleunigen, der die längste Verarbeitung benötigt, indem ich adam.py in cython konvertiert habe.

Infolgedessen zeigte es den Effekt, etwa 30 Sekunden schneller zu sein.

Profile.prof

         37250749 function calls (34824741 primitive calls) in 727.414 seconds

   Ordered by: internal time

   ncalls  tottime  percall  cumtime  percall filename:lineno(function)
    72000  430.495    0.006  430.537    0.006 optimizer.py:388(update_one)
   114000  180.775    0.002  180.775    0.002 {method 'dot' of 'numpy.ndarray' objects}
   216000   30.647    0.000   30.647    0.000 {method 'fill' of 'numpy.ndarray' objects}
    12000   21.766    0.002  157.230    0.013 variable.py:216(backward)

Die Verarbeitungszeit von optimizer.py, einschließlich adam.py, ist etwa 20 Sekunden schneller als die von Python. Dies funktionierte und wurde schneller.

Zusammenfassung

Anstatt einfach zu versuchen, mit Cython zu beschleunigen, habe ich festgestellt, dass es eine Möglichkeit gibt, dass es effektiv ist, wenn ich es und Cython nur dort profiliere, wo es wirklich funktioniert. Es war ein Adventskalender, in dem ich erfahren konnte, dass der Zyklus von Hypothese, Visualisierung und Verifizierung wichtig ist, anstatt zu versuchen, ihn loszuwerden.

Der Code, den ich ausführen wollte, ist unten aufgeführt. https://github.com/SnowMasaya/chainer_cython_study

Referenz

Chainer: a neural network framework https://github.com/pfnet/chainer

Recommended Posts

Ich habe versucht zu überprüfen, wie schnell der Mnist des Chainer-Beispiels mit Cython beschleunigt werden kann
Ich habe versucht, die Beschleunigung von Python durch Cython zu verifizieren und zu analysieren
Ich habe versucht, die Sündenfunktion mit Chainer zu approximieren
Ich habe versucht, die Sündenfunktion mit Chainer zu approximieren (Re-Challenge)
Ich habe versucht, den Index der Liste mithilfe der Aufzählungsfunktion abzurufen
Ich habe versucht, die Höhen und Tiefen des Schlusskurses des Aktienkurses von Guru Navi mit TensorFlow vorherzusagen (Fortschritt)
Ich habe versucht, das Gesichtsbild mit sparse_image_warp von TensorFlow Addons zu transformieren
Ich habe versucht, die Trefferergebnisse von Hachinai mithilfe der Bildverarbeitung zu erhalten
Ich habe versucht, die Beispielnachrichten zur Geschäftsintegration in Amazon Transcribe zu übertragen
Ich habe versucht, die Ähnlichkeit der Frageabsicht mit Doc2Vec von gensim abzuschätzen
Ich habe versucht, die Genauigkeit meines eigenen neuronalen Netzwerks zu verbessern
Ich habe versucht, die Phase der Geschichte mit COTOHA zu extrahieren und zu veranschaulichen
[Linux] Ich habe versucht, die sichere Bestätigungsmethode von FQDN (CentOS7) zu überprüfen.
Ich habe die übliche Geschichte ausprobiert, Deep Learning zu verwenden, um den Nikkei-Durchschnitt vorherzusagen
Mit COTOHA habe ich versucht, den emotionalen Verlauf des Laufens von Meros zu verfolgen.
Ich habe versucht, das Ergebnis des A / B-Tests mit dem Chi-Quadrat-Test zu überprüfen
Ich habe versucht, das Update von "Hameln" mit "Beautiful Soup" und "IFTTT" zu benachrichtigen.
[Python] Ich habe versucht, das Mitgliederbild der Idolgruppe mithilfe von Keras zu beurteilen
Ich habe versucht, die Python-Bibliothek "pykakasi" zu verwenden, die Kanji in Romaji konvertieren kann.
Ich habe versucht, die Trapezform des Bildes zu korrigieren
Ich habe versucht, den Bildfilter von OpenCV zu verwenden
Ich habe versucht, die Texte von Hinatazaka 46 zu vektorisieren!
Ich habe versucht, den Sieg oder die Niederlage der Premier League mit dem Qore SDK vorherzusagen
Ich habe versucht, das Update von "Werde ein Romanautor" mit "IFTTT" und "Werde ein Romanautor API" zu benachrichtigen.
Python-Übung 100 Schläge Ich habe versucht, den Entscheidungsbaum von Kapitel 5 mit graphviz zu visualisieren
Ich habe versucht, den Text in der Bilddatei mit Tesseract der OCR-Engine zu extrahieren
Beim 15. Offline-Echtzeitversuch habe ich versucht, das Problem des Schreibens mit Python zu lösen
Ich habe versucht, die Sündenfunktion mit Chainer zu trainieren
Ich habe versucht zusammenzufassen, wie man Matplotlib von Python verwendet
Ich habe versucht, die Grundform von GPLVM zusammenzufassen
Ich habe das MNIST-Tutorial von tensorflow für Anfänger ausprobiert.
Ich habe versucht, die API von Sakenowa Data Project zu verwenden
Ich habe versucht, die Spacha-Informationen von VTuber zu visualisieren
Ich habe versucht, den negativen Teil von Meros zu löschen
Ich habe versucht, die Sprache mit CNN + Melspectogram zu identifizieren
Ich habe versucht, das Wissensdiagramm mit OpenKE zu ergänzen
Ich habe versucht, die Stimmen der Sprecher zu klassifizieren
Ich habe versucht, das Bild mithilfe von maschinellem Lernen zu komprimieren
Ich habe versucht, die String-Operationen von Python zusammenzufassen
[Pokemon-Schwertschild] Ich habe versucht, die Urteilsgrundlage des tiefen Lernens anhand der Drei-Familien-Klassifikation als Beispiel zu visualisieren
Ich habe versucht, mit Hilfe des neuronalen Netzes zu überprüfen, ob "Japanisch" nur "unlesbare Schriftarten" wirklich nur von Japanisch gelesen werden können
Ich habe versucht, das Problem von F02 zu lösen, wie man mit Python offline in Echtzeit schreibt
Ich habe versucht, die Genauigkeit von Modellen für maschinelles Lernen mit Kaggle als Thema zu vergleichen.
[Git] Ich habe versucht, anhand eines konkreten Beispiels zu verstehen, wie man Git Stash verwendet.
Ich habe versucht, die Yin- und Yang-Klassifikation hololiver Mitglieder durch maschinelles Lernen zu überprüfen
Ich habe versucht, die Infektion mit einer neuen Lungenentzündung mithilfe des SIR-Modells vorherzusagen: ☓ Wuhan ed. ○ Hubei ed.
Ich habe versucht, die Erstellung einer praktischen Umgebung mithilfe der SoftLayer-API der IBM Cloud zu automatisieren
Ich habe versucht, die Entropie des Bildes mit Python zu finden
[Pferderennen] Ich habe versucht, die Stärke des Rennpferdes zu quantifizieren
Ich habe versucht zu simulieren, wie sich die Infektion mit Python ausbreitet
Ich habe versucht, die Standortinformationen des Odakyu-Busses zu erhalten
Ich habe versucht, mit TensorFlow den Durchschnitt mehrerer Spalten zu ermitteln
Ich habe versucht, das CNN-Modell von TensorFlow mit TF-Slim umzugestalten
Ich habe versucht, die Anzeigenoptimierung mithilfe des Banditenalgorithmus zu simulieren
Ich habe versucht, das Lachproblem mit Keras zu erkennen.
[Python] Ich habe versucht, die folgende Beziehung von Twitter zu visualisieren
Ich habe versucht, ListNet of Rank Learning mit Chainer zu implementieren