TensorFlow, perché Python è stata la lingua scelta?


143

Di recente ho iniziato a studiare il deep learning e altre tecniche ML, e ho iniziato a cercare framework che semplificano il processo di costruzione di una rete e la sua formazione, quindi ho trovato TensorFlow, avendo poca esperienza nel settore, per me sembra che la velocità sia un grande fattore per rendere ancora più grande un grande sistema ML se si lavora con l'apprendimento profondo, quindi perché Google ha scelto Python per realizzare TensorFlow? Non sarebbe meglio farlo su una lingua che può essere compilata e non interpretata?

Quali sono i vantaggi dell'utilizzo di Python su un linguaggio come C ++ per l'apprendimento automatico?


2
Minor nitpick: compilazione e interpretazione non sono opposti. Inoltre, qualsiasi linguaggio di programmazione può essere implementato con un compilatore o un interprete o entrambi. C'è una bella risposta sulla distinzione in Ingegneria del software.
8bittree,

Risposte:


240

La cosa più importante da capire su TensorFlow è che, per la maggior parte, il core non è scritto in Python : è scritto in una combinazione di C ++ e CUDA altamente ottimizzati (il linguaggio di Nvidia per la programmazione di GPU). Molto di questo accade, a sua volta, utilizzando Eigen (una libreria numerica C ++ e CUDA ad alte prestazioni) e la cuDNN di NVidia (una libreria DNN molto ottimizzata per GPU NVidia , per funzioni come le convoluzioni ).

Il modello per TensorFlow è che il programmatore usa "un po 'di linguaggio" (molto probabilmente Python!) Per esprimere il modello. Questo modello, scritto nei costrutti TensorFlow come:

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

in realtà non viene eseguito quando Python viene eseguito. Invece, ciò che è effettivamente creato è un grafico del flusso di dati che dice di prendere input particolari, applicare operazioni particolari, fornire i risultati come input ad altre operazioni e così via. Questo modello viene eseguito dal codice C ++ veloce e, per la maggior parte, i dati tra le operazioni non vengono mai copiati nel codice Python .

Quindi il programmatore "guida" l'esecuzione di questo modello tirando su nodi - per l'addestramento, di solito in Python, e per servire, a volte in Python e talvolta in C ++ grezzo:

sess.run(eval_results)

Questa chiamata a una funzione Python (o C ++) utilizza una chiamata in-process a C ++ o un RPC per la versione distribuita da chiamare nel server TensorFlow C ++ per dirgli l'esecuzione, quindi copia nuovamente i risultati.

Quindi, detto questo, riformuliamo la domanda: perché TensorFlow ha scelto Python come il primo linguaggio ben supportato per esprimere e controllare la formazione dei modelli?

La risposta è semplice: Python è probabilmente il linguaggio più comodo per una vasta gamma di data scientist ed esperti di machine learning che è anche così facile da integrare e avere il controllo di un backend C ++, pur essendo generale, ampiamente usato sia all'interno che all'esterno di Google e open source. Dato che con il modello base di TensorFlow, le prestazioni di Python non sono così importanti, ma si adattano perfettamente. È anche un grande vantaggio che NumPy semplifichi la pre-elaborazione in Python, anche con prestazioni elevate, prima di inviarlo a TensorFlow per le cose veramente pesanti per la CPU.

C'è anche un sacco di complessità nell'esprimere il modello che non viene utilizzato durante l'esecuzione: l'inferenza della forma (ad esempio, se si fa matmul (A, B), qual è la forma dei dati risultanti?) E il calcolo automatico del gradiente . Risulta essere stato bello poter esprimere quelli in Python, anche se penso che a lungo termine probabilmente passeranno al backend C ++ per rendere più semplice l'aggiunta di altre lingue.

(La speranza, ovviamente, è di supportare altre lingue in futuro per la creazione e l'espressione di modelli. È già abbastanza semplice eseguire l'inferenza usando diverse altre lingue - C ++ ora funziona, qualcuno di Facebook ha contribuito Vai a rilegature che stiamo esaminando ora , eccetera.)


1
Come stai definendo "inferenza" in It's already quite straightforward to run inference using several other languagesEssere un programmatore di Prolog, non mi va bene; sembra una parola fuori posto.
Guy Coder,

1
Eseguendo solo il passaggio in avanti del modello. Applicandolo a dati vs formazione.
Data

Per quanto riguarda l'inferenza della forma. Sto convertendo alcune reti neurali in un linguaggio tipicamente statico solo per uso didattico e la digitazione Duck in Ptyhon rende decisamente più facile scrivere quella parte del codice. Sul lato filp, scrivere il codice Python senza i tipi rende molto più difficile l'apprendimento di Ptyhon per ottenere i tipi subito prima dell'esecuzione. Vedo molti più errori di runtime utilizzando Ptyhon rispetto all'altra lingua che è F #. Vale la pena notare che Duck digitando la risposta.
Guy Coder,

2
Sebbene sia vero, penso che la digitazione di Python sia stata una ragione indiretta. Delle lingue comunemente utilizzate in Google --- quora.com/… --- Python è la migliore corrispondenza per il dottorato medio di apprendimento automatico. L'unica altra vera scelta sarebbe stata C ++ (non conosco molte persone che usano Lua, il linguaggio che utilizza Torch), e C ++ è piuttosto lontano dalla zona di comfort della cassetta degli attrezzi ML. Molte persone ML provengono da un background matlab, con intorpidimento sempre più popolare. La tipizzazione delle anatre probabilmente è alla base della popolarità, ovviamente, ma va oltre il mio scopo.
DGA

Grazie, bel riassunto. Guy Coder --- per quanto riguarda il senso di "inferenza" in gioco, vedi l'articolo di Wikipedia sull'inferenza statistica . È inferenza induttiva al contrario del tipo deduttivo eseguito da Prolog.
Bob Carpenter,

35

TF non è scritto in pitone. È scritto in C ++ (e utilizza librerie numeriche ad alte prestazioni e codice CUDA ) e puoi verificarlo guardando il loro github . Quindi il core non è scritto in Python ma TF fornisce un'interfaccia a molti altri linguaggi ( Python, C ++, Java, Go )

inserisci qui la descrizione dell'immagine

Se vieni da un mondo di analisi dei dati, puoi pensarci come numpy (non scritto in Python, ma fornisce un'interfaccia a Python) o se sei uno sviluppatore web - pensalo come un database (PostgreSQL, MySQL, che può essere invocato da Java, Python, PHP)


Il frontend Python (la lingua in cui le persone scrivono modelli in TF) è il più popolare per molte ragioni . Secondo me il motivo principale è storico: la maggior parte degli utenti ML lo usano già (un'altra scelta popolare è R) quindi se non fornirai un'interfaccia per Python, la tua biblioteca è molto probabilmente destinata all'oscurità.


Ma essere scritti in Python non significa che il tuo modello sia eseguito in Python. Al contrario, se hai scritto il tuo modello nel modo giusto, Python non viene mai eseguito durante la valutazione del grafico TF (eccetto tf.py_func () , che esiste per il debug e dovrebbe essere evitato nel modello reale esattamente perché viene eseguito su Lato di Python).

Questo è diverso da ad esempio numpy. Ad esempio, se lo fai np.linalg.eig(np.matmul(A, np.transpose(A))(che è eig(AA')), l'operazione calcolerà la trasposizione in un linguaggio veloce (C ++ o fortran), lo restituirà a Python, lo prenderà da Python insieme ad A, e calcolerà una moltiplicazione in un linguaggio veloce e lo restituirà a python, quindi calcola gli autovalori e restituiscilo a python. Tuttavia, operazioni costose come matmul ed eig sono calcolate in modo efficiente, perdi ancora tempo spostando i risultati su Python indietro e forzando. TF non lo fa , una volta definito il grafico il flusso dei tuoi tensori non è in pitone ma in C ++ / CUDA / qualcos'altro.


In questo contesto il mio post sul blog potrebbe essere interessante: blog.ephorie.de/why-r-for-data-science-and-not-python
vonjd

4

Python ti consente di creare moduli di estensione usando C e C ++, interfacciarsi con il codice nativo e ottenere comunque i vantaggi che ti offre Python.

TensorFlow utilizza Python, sì, ma contiene anche grandi quantità di C ++ .

Ciò consente un'interfaccia più semplice per la sperimentazione con un minore sovraccarico di pensiero umano con Python e aggiunge prestazioni programmando le parti più importanti in C ++.


0

L'ultimo rapporto che puoi controllare da qui mostra all'interno di TensorFlow C ++ il ~ 50% di codice e Python il ~ 40% di codice.

Sia C ++ che Python sono le lingue ufficiali di Google, quindi non c'è da stupirsi perché sia ​​così. Se dovessi fornire una regressione rapida in cui sono presenti C ++ e Python ...

Il C ++ è all'interno dell'algebra computazionale e Python è usato per tutto il resto, incluso il test. Sapendo quanto siano onnipresenti i test oggi non c'è da stupirsi perché il codice Python contribuisca così tanto a TF.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.