TensorFlow, ¿por qué Python fue el idioma elegido?

143

Recientemente comencé a estudiar aprendizaje profundo y otras técnicas de aprendizaje automático, y comencé a buscar marcos que simplificaran el proceso de construir una red y entrenarlo, luego encontré TensorFlow, que tenía poca experiencia en el campo, para mí, parece que la velocidad es un Gran factor para hacer un gran sistema ML aún más si se trabaja con aprendizaje profundo, entonces, ¿por qué Google eligió Python para hacer TensorFlow? ¿No sería mejor hacerlo sobre un lenguaje que se pueda compilar y no interpretar?

¿Cuáles son las ventajas de usar Python sobre un lenguaje como C ++ para el aprendizaje automático?

Ollegn
fuente
2
Nitpick menor: la compilación y la interpretación no son opuestos. Además, cualquier lenguaje de programación puede implementarse con un compilador o con un intérprete, o ambos. Hay una buena respuesta sobre la distinción sobre la Ingeniería de Software.
8bittree

Respuestas:

240

Lo más importante a tener en cuenta sobre TensorFlow es que, en su mayor parte, el núcleo no está escrito en Python : está escrito en una combinación de C ++ y CUDA altamente optimizados (lenguaje de Nvidia para programar GPU). Gran parte de eso sucede, a su vez, al usar Eigen (una biblioteca numérica de C ++ y CUDA de alto rendimiento) y cuDNN de NVidia (una biblioteca DNN muy optimizada para GPU NVidia , para funciones tales como convoluciones ).

El modelo para TensorFlow es que el programador usa "algo de lenguaje" (¡muy probablemente Python!) Para expresar el modelo. Este modelo, escrito en las construcciones TensorFlow como:

h1 = tf.nn.relu(tf.matmul(l1, W1) + b1)
h2 = ...

en realidad no se ejecuta cuando se ejecuta Python. En cambio, lo que realmente se crea es un gráfico de flujo de datos que dice tomar entradas particulares, aplicar operaciones particulares, suministrar los resultados como entradas para otras operaciones, y así sucesivamente. Este modelo se ejecuta mediante un código C ++ rápido y, en su mayor parte, los datos que pasan entre operaciones nunca se vuelven a copiar en el código Python .

Luego, el programador "impulsa" la ejecución de este modelo tirando de los nodos, para entrenamiento, generalmente en Python, y para servir, a veces en Python y otras en C ++ sin procesar:

sess.run(eval_results)

Esta Python (o llamada de función C ++) utiliza una llamada en proceso a C ++ o un RPC para que la versión distribuida llame al servidor TensorFlow de C ++ para indicarle que se ejecute, y luego copia los resultados.

Entonces, dicho esto, reformulemos la pregunta: ¿Por qué TensorFlow eligió Python como el primer lenguaje bien soportado para expresar y controlar la capacitación de modelos?

La respuesta a eso es simple: Python es probablemente el lenguaje más cómodo para una amplia gama de científicos de datos y expertos en aprendizaje automático que también es tan fácil de integrar y controlar un backend C ++, a la vez que es general, ampliamente utilizado tanto dentro como fuera de Google, y de código abierto. Dado que con el modelo básico de TensorFlow, el rendimiento de Python no es tan importante, fue un ajuste natural. También es una gran ventaja que NumPy facilita el preprocesamiento en Python, también con alto rendimiento, antes de alimentarlo a TensorFlow para las cosas realmente pesadas de CPU.

También hay un montón de complejidad al expresar el modelo que no se usa al ejecutarlo: inferencia de forma (por ejemplo, si haces matmul (A, B), ¿cuál es la forma de los datos resultantes?) Y el cálculo automático de gradiente . Resulta que fue agradable poder expresarlos en Python, aunque creo que a largo plazo probablemente se trasladarán al backend de C ++ para facilitar la adición de otros lenguajes.

(La esperanza, por supuesto, es admitir otros idiomas en el futuro para crear y expresar modelos. Ya es bastante sencillo hacer inferencia usando varios otros idiomas: C ++ funciona ahora, alguien de Facebook contribuyó con enlaces Go que estamos revisando ahora , etc.)

dga
fuente
1
¿Cómo estás definiendo 'inferencia' en It's already quite straightforward to run inference using several other languagesSer un programador de Prolog? Simplemente no me queda; Parece una palabra fuera de lugar.
Guy Coder
1
Ejecutando solo el pase de avance del modelo. Aplicandolo a datos vs entrenamiento.
dga
Con respecto a la inferencia de formas. Estoy convirtiendo algunas redes neuronales a un lenguaje tipado estáticamente solo para uso de aprendizaje y la escritura de Pato en Ptyhon definitivamente hace que esa parte del código sea mucho más fácil de escribir. Por el lado del filtro, escribir código de Python sin los tipos hace que sea mucho más difícil al aprender Ptyhon obtener los tipos justo antes de ejecutarlos. Veo muchos más errores de tiempo de ejecución usando Ptyhon que el otro idioma que es F #. Vale la pena señalar que Duck escribe la respuesta.
Guy Coder
2
Si bien eso es cierto, creo que la tipificación de Python fue una razón indirecta. De los idiomas comúnmente utilizados en Google --- quora.com/… --- Python es la mejor combinación para el Ph.D. de aprendizaje automático promedio. La única otra opción real habría sido C ++ (no conozco a muchas personas que usan Lua, el lenguaje que utiliza Torch), y C ++ está bastante lejos de la zona de confort de ML toolbox. Mucha gente de ML proviene de un fondo matlab, con numpy cada vez más popular. La escritura del pato probablemente subyace en la popularidad, por supuesto, pero eso está más allá de mi alcance.
dga
Gracias, buen resumen. Guy Coder --- en cuanto al sentido de "inferencia" en juego, vea el artículo de Wikipedia sobre inferencia estadística . Es inferencia inductiva en oposición al tipo deductivo realizado por Prolog.
Bob Carpenter
35

TF no está escrito en python. Está escrito en C ++ (y utiliza bibliotecas numéricas de alto rendimiento y código CUDA ) y puede verificar esto mirando su github . Por lo tanto, el núcleo no está escrito en Python, pero TF proporciona una interfaz para muchos otros lenguajes ( Python, C ++, Java, Go )

ingrese la descripción de la imagen aquí

Si vienes de un mundo de análisis de datos, puedes pensar en ello como numpy (no escrito en python, pero proporciona una interfaz para Python) o si eres un desarrollador web, piensa en ello como una base de datos (PostgreSQL, MySQL, que se puede invocar desde Java, Python, PHP)


La interfaz de Python (el lenguaje en el que las personas escriben modelos en TF) es la más popular debido a muchas razones . En mi opinión, la razón principal es histórica: la mayoría de los usuarios de ML ya lo usan (otra opción popular es R), por lo que si no proporciona una interfaz para Python, su biblioteca probablemente esté condenada a la oscuridad.


Pero estar escrito en python no significa que su modelo se ejecute en python. Por el contrario, si escribió su modelo de la manera correcta, Python nunca se ejecuta durante la evaluación del gráfico TF (excepto tf.py_func () , que existe para la depuración y debe evitarse en el modelo real exactamente porque se ejecuta en Lado de Python).

Esto es diferente de, por ejemplo, numpy. Por ejemplo, si lo hace np.linalg.eig(np.matmul(A, np.transpose(A))(que es eig(AA')), la operación calculará la transposición en algún lenguaje rápido (C ++ o fortran), lo devolverá a python, lo tomará de python junto con A y calculará una multiplicación en algún lenguaje rápido y lo devolverá a python, luego calcule valores propios y devuélvalo a python. Sin embargo, operaciones costosas como matmul y eig se calculan de manera eficiente, aún así pierde tiempo al mover los resultados a python hacia atrás y forzarlos. TF no lo hace , una vez que definió el gráfico, sus tensores fluyen no en Python sino en C ++ / CUDA / algo más.

Salvador Dalí
fuente
En este contexto, mi publicación de blog podría ser de interés: blog.ephorie.de/why-r-for-data-science-and-not-python
vonjd
4

Python le permite crear módulos de extensión usando C y C ++, interactuando con código nativo y aún obteniendo las ventajas que Python le brinda.

TensorFlow usa Python, sí, pero también contiene grandes cantidades de C ++ .

Esto permite una interfaz más simple para la experimentación con menos sobrecarga de pensamiento humano con Python, y agrega rendimiento al programar las partes más importantes en C ++.

Alyssa Haroldsen
fuente
0

La última relación que puede verificar desde aquí muestra dentro de TensorFlow C ++ toma ~ 50% del código, y Python toma ~ 40% del código.

Tanto C ++ como Python son los idiomas oficiales en Google, por lo que no es de extrañar por qué es así. Si tuviera que proporcionar una regresión rápida donde C ++ y Python están presentes ...

C ++ está dentro del álgebra computacional, y Python se usa para todo lo demás, incluidas las pruebas. Sabiendo cuán ubicua es la prueba hoy en día, no es de extrañar por qué el código Python contribuye tanto a TF.

prosti
fuente