Najważniejszą rzeczą, jaką należy sobie uświadomić w przypadku TensorFlow, jest to, że w większości rdzeń nie jest napisany w Pythonie : jest napisany w połączeniu wysoce zoptymalizowanego C ++ i CUDA (język Nvidii do programowania procesorów graficznych). Wiele z tego dzieje się z kolei przy użyciu Eigen (wysokowydajna biblioteka numeryczna C ++ i CUDA) oraz cuDNN firmy NVidia (bardzo zoptymalizowana biblioteka DNN dla procesorów graficznych NVidia , do takich funkcji jak konwolucje ).
Model dla TensorFlow polega na tym, że programista używa „jakiegoś języka” (najprawdopodobniej Pythona!) Do wyrażenia modelu. Ten model, napisany w konstrukcjach TensorFlow, takich jak:
h1 = tf.nn.relu(tf.matmul(l1, W1) + b1)
h2 = ...
nie jest faktycznie wykonywany, gdy jest uruchomiony Python. Zamiast tego faktycznie utworzono wykres przepływu danych, który mówi, aby pobierać określone dane wejściowe, stosować określone operacje, dostarczać wyniki jako dane wejściowe do innych operacji i tak dalej. Ten model jest wykonywany przez szybki kod C ++, a dane przechodzące między operacjami nigdy nie są kopiowane z powrotem do kodu Pythona .
Następnie programista „steruje” wykonaniem tego modelu przez ciągnięcie na węzłach - do nauki, zwykle w Pythonie i do obsługi, czasem w Pythonie, a czasem w surowym C ++:
sess.run(eval_results)
Ten jeden Python (lub wywołanie funkcji C ++) używa wywołania w procesie do C ++ lub RPC dla wersji rozproszonej, aby wywołać serwer C ++ TensorFlow, aby nakazać jej wykonanie, a następnie kopiuje wyniki.
Mówiąc to, powtórzmy pytanie: dlaczego TensorFlow wybrał Python jako pierwszy dobrze obsługiwany język do wyrażania i kontrolowania uczenia modeli?
Odpowiedź na to pytanie jest prosta: Python jest prawdopodobnie najwygodniejsze język dla szerokiej gamy naukowców danych i ekspertów Machine Learning to również, że łatwo zintegrować i mieć kontrolę nad C ++ backend, a jednocześnie ogólny, szeroko stosowany zarówno wewnątrz jak i na zewnątrz Google i open source. Biorąc pod uwagę, że w podstawowym modelu TensorFlow wydajność Pythona nie jest tak ważna, było to naturalne dopasowanie. Ogromną zaletą jest również to, że NumPy ułatwia wykonywanie wstępnego przetwarzania w Pythonie - również z wysoką wydajnością - przed przekazaniem go do TensorFlow w celu uzyskania naprawdę obciążających procesor rzeczy.
Istnieje również spora złożoność w wyrażaniu modelu, który nie jest używany podczas jego wykonywania - wnioskowanie o kształcie (np. Jeśli wykonujesz matmul (A, B), jaki jest kształt wynikowych danych?) I automatyczne obliczanie gradientu . Okazuje się, że fajnie było móc je wyrazić w Pythonie, chociaż myślę, że w dłuższej perspektywie prawdopodobnie przejdą na zaplecze C ++, aby ułatwić dodawanie innych języków.
(Oczywiście nadzieją jest, że w przyszłości będziemy wspierać inne języki w tworzeniu i wyrażaniu modeli. Wnioskowanie przy użyciu kilku innych języków jest już całkiem proste - C ++ działa teraz, ktoś z Facebooka dodał powiązania Go , które teraz sprawdzamy itp.)