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