TensorFlow, por que python foi o idioma escolhido?

143

Recentemente, comecei a estudar aprendizado profundo e outras técnicas de ML, e comecei a procurar estruturas que simplificassem o processo de construir uma rede e treiná-la. Depois, encontrei o TensorFlow, com pouca experiência em campo, para mim, parece que a velocidade é uma fator importante para tornar um grande sistema de ML ainda mais se estiver trabalhando com aprendizado profundo, então por que o python foi escolhido pelo Google para criar o TensorFlow? Não seria melhor fazê-lo sobre um idioma que pode ser compilado e não interpretado?

Quais são as vantagens de usar o Python sobre uma linguagem como C ++ para aprendizado de máquina?

Ollegn
fonte
2
Nitpick menor: Compilação e interpretação não são opostas. Além disso, qualquer linguagem de programação pode ser implementada com um compilador ou intérprete, ou ambos. Há uma boa resposta sobre a distinção sobre Engenharia de Software.
bitbit

Respostas:

240

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

dga
fonte
1
Como você está definindo 'inferência' em It's already quite straightforward to run inference using several other languagesSer um programador de Prolog, isso simplesmente não se encaixa para mim; parece uma palavra fora de lugar.
Guy Coder
1
Executando apenas a passagem para frente do modelo. Aplicando-o a dados versus treinamento.
dga 28/02
Com relação à inferência de forma. Estou convertendo algumas redes neurais para uma linguagem de tipo estaticamente, apenas para uso em aprendizado, e a digitação de Duck em Ptyhon definitivamente torna essa parte do código muito mais fácil de escrever. No lado do filp, escrever código Python sem os tipos torna muito mais difícil ao aprender o Ptyhon a acertar os tipos antes de executar. Eu vejo muitos outros erros de tempo de execução usando Ptyhon do que o outro idioma que é o F #. Pode ser interessante notar Duck digitando a resposta.
Guy Coder
2
Embora isso seja verdade, acho que a digitação do python foi uma razão indireta. Das linguagens comumente usadas no Google --- quora.com/… --- Python é a melhor correspondência para o doutorado em aprendizado de máquina médio. A única outra opção real seria o C ++ (não conheço muitas pessoas que usam Lua, a linguagem que o Torch usa), e o C ++ está bem longe da zona de conforto da caixa de ferramentas ML. Muita gente de ML vem de um background matlab, com o numpy cada vez mais popular. A digitação com patos provavelmente está subjacente à popularidade, é claro, mas isso está além do meu escopo.
dga 29/02
Obrigado, bom resumo. Guy Coder - quanto ao sentido de "inferência" em jogo, consulte o artigo da Wikipedia sobre inferência estatística . É inferência indutiva em oposição ao tipo dedutivo realizado por Prolog.
22818 Bob Carpenter
35

TF não está escrito em python. Está escrito em C ++ (e usa bibliotecas numéricas de alto desempenho e código CUDA ) e você pode verificar isso consultando o github . Portanto, o núcleo não está escrito em python, mas o TF fornece uma interface para muitas outras linguagens ( python, C ++, Java, Go )

insira a descrição da imagem aqui

Se você vem de um mundo de análise de dados, pode pensar nisso como numpy (não escrito em python, mas fornece uma interface para Python) ou se você é um desenvolvedor web - pense nele como um banco de dados (PostgreSQL, MySQL, que pode ser chamado de Java, Python, PHP)


O front end do Python (a linguagem na qual as pessoas escrevem modelos no TF) é o mais popular por vários motivos . Na minha opinião, o principal motivo é histórico: a maioria dos usuários de ML já o usa (outra opção popular é R); portanto, se você não fornecer uma interface para python, sua biblioteca provavelmente estará fadada à obscuridade.


Mas ser escrito em python não significa que seu modelo seja executado em python. Pelo contrário, se você escreveu seu modelo da maneira correta, o Python nunca é executado durante a avaliação do gráfico TF (exceto tf.py_func () , que existe para depuração e deve ser evitado no modelo real exatamente porque ele é executado em Lado do Python).

Isso é diferente de, por exemplo, numpy. Por exemplo, se você fizer np.linalg.eig(np.matmul(A, np.transpose(A))(que é eig(AA')), a operação calculará a transposição em alguma linguagem rápida (C ++ ou fortran), retornará para python, leve-a do python junto com A e calcule uma multiplicação em alguma linguagem rápida e retorne-a para python, calcule os valores próprios e retorne-os ao python. Portanto, operações caras como matmul e eig são calculadas com eficiência, você ainda perde tempo movendo os resultados para python de volta e força. O TF não faz isso , depois de definir o gráfico, seus tensores não fluem em python, mas em C ++ / CUDA / outra coisa.

Salvador Dalí
fonte
Nesse contexto, minha postagem no blog pode ser interessante: blog.ephorie.de/why-r-for-data-science-and-not-python #
vonjd
4

O Python permite criar módulos de extensão usando C e C ++, fazendo interface com o código nativo e ainda obtendo as vantagens que o Python oferece.

O TensorFlow usa Python, sim, mas também contém grandes quantidades de C ++ .

Isso permite uma interface mais simples para experimentação com menos sobrecarga de pensamento humano com o Python e agrega desempenho ao programar as partes mais importantes do C ++.

Alyssa Haroldsen
fonte
0

A proporção mais recente que você pode conferir aqui é mostrada no interior do TensorFlow C ++, que leva ~ 50% do código, e Python, ~ 40% do código.

Tanto o C ++ quanto o Python são os idiomas oficiais do Google; portanto, não é de admirar que seja assim. Se eu tivesse que fornecer regressão rápida onde C ++ e Python estão presentes ...

O C ++ está dentro da álgebra computacional e o Python é usado para todo o resto, inclusive para os testes. Sabendo o quão onipresente o teste é hoje, não é de admirar por que o código Python contribui muito para o TF.

prosti
fonte