O mais importante a ser percebido sobre o TensorFlow é que, na maioria das vezes, o núcleo não está escrito em Python : está escrito em uma combinação de C ++ e CUDA altamente otimizados (a linguagem da Nvidia para programação de GPUs). Muito disso acontece, por sua vez, usando o Eigen (uma biblioteca numérica C ++ e CUDA de alto desempenho) e o cuDNN da NVidia (uma biblioteca DNN muito otimizada para GPUs NVidia , para funções como convoluções ).
O modelo para o TensorFlow é que o programador usa "alguma linguagem" (provavelmente Python!) Para expressar o modelo. Esse modelo, escrito nas construções do TensorFlow, como:
h1 = tf.nn.relu(tf.matmul(l1, W1) + b1)
h2 = ...
não é realmente executado quando o Python é executado. Em vez disso, o que é realmente criado é um gráfico de fluxo de dados que diz para receber entradas específicas, aplicar operações específicas, fornecer os resultados como entradas para outras operações e assim por diante. Esse modelo é executado pelo código C ++ rápido e, na maioria das vezes, os dados entre as operações nunca são copiados para o código Python .
Em seguida, o programador "conduz" a execução desse modelo puxando nós - para treinamento, geralmente em Python, e para veiculação, algumas vezes em Python e outras em C ++ bruto:
sess.run(eval_results)
Esse Python (ou chamada de função C ++) usa uma chamada em processo para C ++ ou um RPC para que a versão distribuída chame o servidor C ++ TensorFlow para instruí-lo a executar e, em seguida, copie os resultados.
Então, com isso dito, vamos refazer a pergunta: Por que o TensorFlow escolheu o Python como a primeira linguagem bem suportada para expressar e controlar o treinamento de modelos?
A resposta para isso é simples: o Python é provavelmente a linguagem mais confortável para uma grande variedade de cientistas de dados e especialistas em aprendizado de máquina, que também é fácil de integrar e ter controle de um back-end em C ++, além de ser geral e amplamente utilizada dentro e fora do Google e código aberto. Dado que, com o modelo básico do TensorFlow, o desempenho do Python não é tão importante, era um ajuste natural. Também é uma vantagem enorme que o NumPy facilita o pré-processamento em Python - também com alto desempenho - antes de alimentá-lo no TensorFlow para coisas realmente pesadas na CPU.
Também há muita complexidade em expressar o modelo que não é usado ao executá-lo - inferência de forma (por exemplo, se você faz matmul (A, B), qual é a forma dos dados resultantes?) E computação automática de gradiente . Acontece que foi bom poder expressar aqueles em Python, embora eu pense que, a longo prazo, eles provavelmente se mudem para o back-end C ++ para facilitar a adição de outras linguagens.
(A esperança, é claro, é oferecer suporte a outras linguagens no futuro para criar e expressar modelos. Já é bastante simples executar inferência usando várias outras linguagens - o C ++ funciona agora, alguém do Facebook contribuiu com as ligações Go que estamos revendo agora etc.)