La chose la plus importante à réaliser à propos de TensorFlow est que, pour la plupart, le noyau n'est pas écrit en Python : il est écrit dans une combinaison de C ++ hautement optimisé et CUDA (le langage de Nvidia pour la programmation des GPU). Une grande partie de cela se produit, à son tour, en utilisant Eigen (une bibliothèque numérique C ++ et CUDA haute performance) et le cuDNN de NVidia (une bibliothèque DNN très optimisée pour les GPU NVidia , pour des fonctions telles que les convolutions ).
Le modèle pour TensorFlow est que le programmeur utilise "un langage" (très probablement Python!) Pour exprimer le modèle. Ce modèle, écrit dans les constructions TensorFlow telles que:
h1 = tf.nn.relu(tf.matmul(l1, W1) + b1)
h2 = ...
n'est pas réellement exécuté lorsque Python est exécuté. Au lieu de cela, ce qui est réellement créé est un graphique de flux de données qui dit de prendre des entrées particulières, d'appliquer des opérations particulières, de fournir les résultats en tant qu'entrées à d'autres opérations, et ainsi de suite. Ce modèle est exécuté par du code C ++ rapide et, pour la plupart, les données passant entre les opérations ne sont jamais recopiées dans le code Python .
Ensuite, le programmeur "pilote" l'exécution de ce modèle en tirant sur les nœuds - pour l'entraînement, généralement en Python, et pour le service, parfois en Python et parfois en C ++ brut:
sess.run(eval_results)
Celui-ci Python (ou appel de fonction C ++) utilise soit un appel en cours de processus à C ++ soit un RPC pour la version distribuée pour appeler le serveur C ++ TensorFlow pour lui dire de s'exécuter, puis recopie les résultats.
Cela dit, reformulons la question: pourquoi TensorFlow a-t-il choisi Python comme premier langage bien pris en charge pour exprimer et contrôler la formation des modèles?
La réponse à cela est simple: Python est probablement le langage le plus confortable pour un large éventail de scientifiques des données et d'experts en apprentissage automatique.Il est également aussi facile à intégrer et à contrôler un backend C ++, tout en étant général, largement utilisé à l'intérieur et à l'extérieur. de Google et open source. Étant donné qu'avec le modèle de base de TensorFlow, les performances de Python ne sont pas si importantes, c'était un ajustement naturel. C'est également un énorme avantage que NumPy facilite le prétraitement en Python - également avec des performances élevées - avant de l'introduire dans TensorFlow pour les choses vraiment lourdes en CPU.
Il y a aussi un tas de complexité dans l'expression du modèle qui n'est pas utilisé lors de son exécution - l'inférence de forme (par exemple, si vous faites matmul (A, B), quelle est la forme des données résultantes?) Et le calcul automatique du gradient . Cela s'est avéré bien de pouvoir les exprimer en Python, même si je pense qu'à long terme, ils passeront probablement au backend C ++ pour faciliter l'ajout d'autres langages.
(L'espoir, bien sûr, est de prendre en charge d'autres langages à l'avenir pour créer et exprimer des modèles. Il est déjà assez simple d'exécuter l'inférence en utilisant plusieurs autres langages - C ++ fonctionne maintenant, quelqu'un de Facebook a contribué aux liaisons Go que nous examinons maintenant , etc.)