TensorFlow, pourquoi python était-il le langage choisi?

143

J'ai récemment commencé à étudier l'apprentissage en profondeur et d'autres techniques de ML, et j'ai commencé à rechercher des frameworks qui simplifient le processus de création d'un réseau et de l'entraînement, puis j'ai trouvé TensorFlow, ayant peu d'expérience dans le domaine, pour moi, il semble que la vitesse soit un grand facteur pour rendre un grand système ML encore plus si vous travaillez avec l'apprentissage en profondeur, alors pourquoi python a-t-il été choisi par Google pour créer TensorFlow? Ne serait-il pas préférable d'en faire un langage qui puisse être compilé et non interprété?

Quels sont les avantages de l'utilisation de Python par rapport à un langage comme C ++ pour l'apprentissage automatique?

Ollegn
la source
2
Petite bête noire: la compilation et l'interprétation ne sont pas opposées. De plus, tout langage de programmation peut être implémenté avec un compilateur ou avec un interpréteur, ou les deux. Il y a une bonne réponse à propos de la distinction sur le génie logiciel.
8bittree

Réponses:

240

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.)

dga
la source
1
Comment définissez-vous «l'inférence» dans It's already quite straightforward to run inference using several other languagesÊtre un programmeur Prolog, cela ne me convient tout simplement pas; cela semble être un mot déplacé.
Guy Coder
1
Exécution juste de la passe avant du modèle. L'application aux données par rapport à la formation.
dga
En ce qui concerne l'inférence de forme. Je suis en train de convertir certains réseaux de neurones en un langage à typage statique juste pour l'apprentissage uniquement et la saisie Duck dans Ptyhon rend définitivement cette partie du code beaucoup plus facile à écrire. Du côté du filp, écrire du code Python sans les types rend beaucoup plus difficile lors de l'apprentissage de Ptyhon d'obtenir les types juste avant de s'exécuter. Je vois beaucoup plus d'erreurs d'exécution en utilisant Ptyhon que l'autre langage qui est F #. Il pourrait être intéressant de noter que Duck a saisi la réponse.
Guy Coder
2
Bien que ce soit vrai, je pense que le typage de python était une raison indirecte. Parmi les langages couramment utilisés dans Google --- quora.com/ ... --- Python est le meilleur match pour le doctorat moyen en apprentissage automatique. Le seul autre vrai choix aurait été C ++ (je ne connais pas beaucoup de gens qui utilisent Lua, le langage utilisé par Torch), et C ++ est assez loin de la zone de confort de la boîte à outils ML. Beaucoup de gens ML viennent d'un fond matlab, avec numpy de plus en plus populaire. La frappe de canard sous-tend probablement la popularité, bien sûr, mais cela dépasse mon champ d'application.
dga
Merci, joli résumé. Guy Coder --- quant au sens de "l'inférence" en jeu, voir l'article de Wikipedia sur l'inférence statistique . C'est une inférence inductive par opposition au type déductif effectué par Prolog.
Bob Carpenter
35

TF n'est pas écrit en python. Il est écrit en C ++ (et utilise des bibliothèques numériques hautement performantes et du code CUDA ) et vous pouvez le vérifier en regardant leur github . Donc le noyau n'est pas écrit en python mais TF fournit une interface à de nombreux autres langages ( python, C ++, Java, Go )

entrez la description de l'image ici

Si vous venez d'un monde d'analyse de données, vous pouvez y penser comme numpy (non écrit en python, mais fournit une interface à Python) ou si vous êtes un développeur Web - pensez-y comme une base de données (PostgreSQL, MySQL, qui peut être invoqué depuis Java, Python, PHP)


L'interface Python (le langage dans lequel les gens écrivent des modèles dans TF) est la plus populaire pour de nombreuses raisons . À mon avis, la raison principale est historique: la majorité des utilisateurs de ML l'utilisent déjà (un autre choix populaire est R) donc si vous ne fournissez pas d'interface à python, votre bibliothèque est très probablement vouée à l'obscurité.


Mais être écrit en python ne signifie pas que votre modèle est exécuté en python. Au contraire, si vous avez écrit votre modèle de la bonne façon, Python n'est jamais exécuté lors de l'évaluation du graphe TF (sauf de tf.py_func () , qui existe pour le débogage et doit être évité dans le modèle réel exactement car il est exécuté sur Côté Python).

Ceci est différent de par exemple numpy. Par exemple, si vous faites np.linalg.eig(np.matmul(A, np.transpose(A))(ce qui est eig(AA')), l'opération calculera la transposition dans un langage rapide (C ++ ou fortran), la retournera à python, la prendra de python avec A, et calculera une multiplication dans un langage rapide et la renverra à python, puis calculez les valeurs propres et renvoyez-les à python. Donc, malgré le fait que les opérations coûteuses comme matmul et eig sont calculées efficacement, vous perdez toujours du temps en déplaçant les résultats vers Python et forcez. TF ne le fait pas , une fois que vous avez défini le graphe, vos tenseurs ne circulent pas en python mais en C ++ / CUDA / autre chose.

Salvador Dali
la source
Dans ce contexte, mon article de blog pourrait être intéressant: blog.ephorie.de/why-r-for-data-science-and-not-python
vonjd
4

Python vous permet de créer des modules d'extension en utilisant C et C ++, en s'interfaçant avec du code natif, tout en bénéficiant des avantages que Python vous offre.

TensorFlow utilise Python, oui, mais il contient également de grandes quantités de C ++ .

Cela permet une interface plus simple pour l'expérimentation avec moins de surcharge de pensée humaine avec Python, et ajoute des performances en programmant les parties les plus importantes en C ++.

Alyssa Haroldsen
la source
0

Le dernier ratio que vous pouvez vérifier à partir d' ici montre à l'intérieur de TensorFlow C ++ prend ~ 50% du code, et Python prend ~ 40% du code.

Le C ++ et le Python sont les langues officielles de Google, il n'est donc pas étonnant qu'il en soit ainsi. Si je devais fournir une régression rapide où C ++ et Python sont présents ...

C ++ est à l'intérieur de l'algèbre de calcul, et Python est utilisé pour tout le reste, y compris pour les tests. Sachant à quel point les tests sont omniprésents aujourd'hui, il n'est pas étonnant que le code Python contribue autant à TF.

prosti
la source