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?
python
c++
machine-learning
tensorflow
Ollegn
źródło
źródło
Odpowiedzi:
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:
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 ++:
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.)
źródło
It's already quite straightforward to run inference using several other languages
byciu programistą w Prologu, to po prostu mi nie pasuje; wydaje się, że słowo jest nie na miejscu.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 )
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 jesteig(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.źródło
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 ++.
źródło
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.
źródło