Das Wichtigste an TensorFlow ist, dass der Kern größtenteils nicht in Python geschrieben ist : Er ist in einer Kombination aus hochoptimiertem C ++ und CUDA (Nvidias Sprache für die Programmierung von GPUs) geschrieben. Vieles davon geschieht wiederum durch die Verwendung von Eigen (eine hochleistungsfähige numerische C ++ - und CUDA-Bibliothek) und NVidias cuDNN (eine sehr optimierte DNN-Bibliothek für NVidia-GPUs für Funktionen wie Faltungen ).
Das Modell für TensorFlow ist, dass der Programmierer "eine Sprache" (höchstwahrscheinlich Python!) Verwendet, um das Modell auszudrücken. Dieses Modell, das in den TensorFlow-Konstrukten geschrieben wurde, wie z.
h1 = tf.nn.relu(tf.matmul(l1, W1) + b1)
h2 = ...
wird nicht ausgeführt, wenn Python ausgeführt wird. Stattdessen wird tatsächlich ein Datenflussdiagramm erstellt , das besagt, dass bestimmte Eingaben vorgenommen, bestimmte Operationen angewendet, die Ergebnisse als Eingaben für andere Operationen bereitgestellt werden sollen usw. Dieses Modell wird von schnellem C ++ - Code ausgeführt, und die zwischen den Operationen liegenden Daten werden größtenteils nie wieder in den Python-Code kopiert .
Dann "steuert" der Programmierer die Ausführung dieses Modells durch Ziehen an Knoten - zum Trainieren, normalerweise in Python, und zum Servieren, manchmal in Python und manchmal in rohem C ++:
sess.run(eval_results)
Dieser eine Python- (oder C ++ - Funktionsaufruf) verwendet entweder einen In-Process-Aufruf von C ++ oder einen RPC, damit die verteilte Version den C ++ TensorFlow-Server aufruft, um ihn zur Ausführung aufzufordern, und kopiert dann die Ergebnisse zurück.
Nachdem dies gesagt ist, lassen Sie uns die Frage umformulieren: Warum hat TensorFlow Python als erste gut unterstützte Sprache ausgewählt, um das Training von Modellen auszudrücken und zu steuern?
Die Antwort darauf ist einfach: Python ist wahrscheinlich die komfortabelste Sprache für eine Vielzahl von Datenwissenschaftlern und Experten für maschinelles Lernen. Sie ist auch so einfach zu integrieren und hat die Kontrolle über ein C ++ - Backend, ist aber sowohl innen als auch außen allgemein verbreitet von Google und Open Source. Angesichts der Tatsache, dass mit dem Grundmodell von TensorFlow die Leistung von Python nicht so wichtig ist, war dies eine natürliche Anpassung. Es ist auch ein großes Plus, dass NumPy es einfach macht, die Vorverarbeitung in Python durchzuführen - auch mit hoher Leistung -, bevor es TensorFlow für die wirklich CPU-schweren Dinge zugeführt wird.
Es ist auch sehr komplex, das Modell auszudrücken, das bei der Ausführung nicht verwendet wird - Forminferenz (z. B. wenn Sie Matmul (A, B) ausführen, wie ist die Form der resultierenden Daten?) Und automatische Gradientenberechnung . Es hat sich als schön herausgestellt, diese in Python ausdrücken zu können, obwohl ich denke, dass sie langfristig wahrscheinlich in das C ++ - Backend wechseln werden, um das Hinzufügen anderer Sprachen zu vereinfachen.
(Die Hoffnung besteht natürlich darin, in Zukunft andere Sprachen beim Erstellen und Ausdrücken von Modellen zu unterstützen. Es ist bereits recht einfach, Inferenzen mit mehreren anderen Sprachen auszuführen. C ++ funktioniert jetzt, jemand von Facebook hat Go- Bindungen beigesteuert , die wir gerade überprüfen , etc.)