TensorFlow, dlaczego wybrano język Python?


143

Niedawno zacząłem studiować głębokie uczenie się i inne techniki ML i zacząłem szukać frameworków, które upraszczają proces budowania sieci i jej trenowania, potem znalazłem TensorFlow, mając niewielkie doświadczenie w tej dziedzinie, wydaje mi się, że szybkość to To duży czynnik, który sprawia, że ​​duży system ML jest jeszcze lepszy, jeśli pracuje się z głębokim uczeniem się, dlaczego więc Python został wybrany przez Google do stworzenia TensorFlow? Czy nie byłoby lepiej zrobić to z języka, który można kompilować, a nie interpretować?

Jakie są zalety używania Pythona w porównaniu z językiem takim jak C ++ do uczenia maszynowego?


2
Drobny chwytak: Kompilacja i interpretacja nie są przeciwieństwami. Dodatkowo każdy język programowania może być zaimplementowany za pomocą kompilatora lub interpretera lub obu. Jest dobra odpowiedź na temat różnicy w inżynierii oprogramowania.
8bittree

Odpowiedzi:


240

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


1
Jak definiujesz „wnioskowanie” w It's already quite straightforward to run inference using several other languagesbyciu programistą w Prologu, to po prostu mi nie pasuje; wydaje się, że słowo jest nie na miejscu.
Guy Coder

1
Prowadzenie tylko do przodu modelu. Zastosowanie go do danych a trening.
dga

W odniesieniu do wnioskowania o kształcie. Konwertuję niektóre sieci neuronowe na język statycznie typowany tylko do nauki, a pisanie Duck w języku Ptyhon zdecydowanie ułatwia pisanie tej części kodu. Z drugiej strony, pisanie kodu w Pythonie bez typów sprawia, że ​​podczas nauki języka Ptyhon znacznie trudniej jest uzyskać typy tuż przed uruchomieniem. Widzę o wiele więcej błędów czasu wykonywania przy użyciu Ptyhon niż w innym języku, którym jest F #. Warto zwrócić uwagę, że Duck wpisuje odpowiedź.
Guy Coder

2
Chociaż to prawda, myślę, że pisanie w Pythonie było pośrednim powodem. Spośród języków powszechnie używanych w Google --- quora.com/ ... --- Python najlepiej pasuje do przeciętnego doktora z zakresu uczenia maszynowego. Jedynym innym prawdziwym wyborem byłby C ++ (nie znam wielu ludzi, którzy używają Lua, języka używanego przez Torch), a C ++ jest dość daleko od strefy komfortu zestawu narzędzi ML. Wielu ludzi ML pochodzi z matlabowego środowiska, a numpy jest coraz bardziej popularne. Oczywiście typowanie kaczki leży u podstaw popularności, ale to przekracza moje możliwości.
dga,

Dzięki, miłe podsumowanie. Guy Coder --- co do sensu „wnioskowania” w grze, zobacz artykuł w Wikipedii na temat wnioskowania statystycznego . Jest to wnioskowanie indukcyjne w przeciwieństwie do typu dedukcyjnego wykonywanego przez Prolog.
Bob Carpenter

35

TF nie jest napisane w Pythonie. Jest napisany w C ++ (i korzysta z wydajnych bibliotek numerycznych i kodu CUDA ) i możesz to sprawdzić, przeglądając ich github . Tak więc rdzeń nie jest napisany w Pythonie, ale TF zapewnia interfejs dla wielu innych języków ( python, C ++, Java, Go )

wprowadź opis obrazu tutaj

Jeśli pochodzisz ze świata analizy danych, możesz myśleć o tym jak numpy (nie napisane w Pythonie, ale zapewnia interfejs do Pythona) lub jeśli jesteś programistą internetowym - pomyśl o tym jak o bazie danych (PostgreSQL, MySQL, która można wywołać z Java, Python, PHP)


Frontend Pythona (język, w którym ludzie piszą modele w TF) jest najpopularniejszy z wielu powodów . Moim zdaniem główny powód jest historyczny: większość użytkowników ML już z niego korzysta (innym popularnym wyborem jest R), więc jeśli nie udostępnisz interfejsu do Pythona, Twoja biblioteka jest prawdopodobnie skazana na zapomnienie.


Ale napisanie w Pythonie nie oznacza, że ​​model jest wykonywany w Pythonie. Wręcz przeciwnie, jeśli napisałeś swój model we właściwy sposób, Python nigdy nie jest wykonywany podczas oceny wykresu TF (z wyjątkiem tf.py_func () , który istnieje do debugowania i należy go unikać w rzeczywistym modelu dokładnie dlatego, że jest wykonywany na Strona Pythona).

To różni się na przykład od numpy. Na przykład, jeśli to zrobisz np.linalg.eig(np.matmul(A, np.transpose(A))(co jest eig(AA')), operacja obliczy transpozycję w jakimś szybkim języku (C ++ lub fortran), zwróci ją do Pythona, weźmie ją z Pythona razem z A i obliczy mnożenie w jakimś szybkim języku i zwróci je do python, a następnie oblicz wartości własne i zwróć je do pythona. Tak więc kosztowne operacje, takie jak matmul i eig, są obliczane wydajnie, nadal tracisz czas, przenosząc wyniki do Pythona z powrotem i wymuszając. TF tego nie robi , kiedy już zdefiniowałeś wykres, twoje tensory płyną nie w Pythonie, ale w C ++ / CUDA / czymś innym.


W tym kontekście mój wpis na blogu może być interesujący: blog.ephorie.de/why-r-for-data-science-and-not-python
vonjd

4

Python umożliwia tworzenie modułów rozszerzeń za pomocą C i C ++, łącząc się z kodem natywnym i nadal korzystając z zalet, które daje Python.

TensorFlow używa Pythona, tak, ale zawiera również duże ilości C ++ .

Pozwala to na prostszy interfejs do eksperymentowania z mniejszym narzutem na ludzką myśl z Pythonem i zwiększa wydajność poprzez programowanie najważniejszych części w C ++.


0

Ostatni współczynnik, który możesz sprawdzić tutaj, pokazuje, że wewnątrz TensorFlow C ++ zajmuje ~ 50% kodu, a Python zajmuje ~ 40% kodu.

Zarówno C ++, jak i Python są oficjalnymi językami w Google, więc nic dziwnego, dlaczego tak jest. Gdybym musiał zapewnić szybką regresję tam, gdzie obecne są C ++ i Python ...

C ++ znajduje się wewnątrz algebry obliczeniowej, a Python jest używany do wszystkiego innego, w tym do testowania. Wiedząc, jak wszechobecne jest dziś testowanie, nic dziwnego, dlaczego kod Pythona wnosi tak duży wkład do TF.

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.