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