Recenzja: uczenie głębokie MXNet wyróżnia się dzięki Gluon

Kiedy przeglądałem MXNet v0.7 w 2016 r., Czułem, że jest to obiecująca platforma do głębokiego uczenia z doskonałą skalowalnością (prawie liniową w klastrach GPU), dobrym autodróżniowaniem i najnowocześniejszą obsługą procesorów graficznych CUDA. Czułem również, że potrzebuje pracy nad swoją dokumentacją i samouczkami oraz potrzebuje dużo więcej przykładów w swoim modelowym zoo. Ponadto chciałbym zobaczyć interfejs wysokiego poziomu dla MXNet, który wyobrażałem sobie, że będzie to Keras.

Od tego czasu nastąpił spory postęp. MXNet przeniósł się pod parasol Apache Software Foundation na początku 2017 roku i chociaż nadal „inkubuje” w wersji 1.3, wydaje się być dość dobrze dopracowany.

Chociaż pracowano nad Kerasem z zapleczem MXNet, inny interfejs wysokiego poziomu stał się znacznie ważniejszy: Gluon. Przed włączeniem Gluon można było pisać prosty kod imperatywny lub szybki kod symboliczny w MXNet, ale nie oba na raz. Dzięki Gluon możesz połączyć to, co najlepsze z obu światów, w sposób, który konkuruje zarówno z Kerasem, jak i PyTorchem.

Co to jest Gluon dla MXNet?

Zalety deklarowane dla Gluon obejmują prosty kod, elastyczne modelowanie, dynamiczne wykresy i wysoką wydajność:

  1. Prosty, łatwy do zrozumienia kod : Gluon oferuje pełny zestaw modułów konstrukcyjnych sieci neuronowych typu plug-and-play, w tym wstępnie zdefiniowane warstwy, optymalizatory i inicjatory.
  2. Elastyczna, imperatywna struktura : Gluon nie wymaga sztywnego zdefiniowania modelu sieci neuronowej, ale raczej zbliża algorytm uczący i model do siebie, aby zapewnić elastyczność w procesie rozwoju.
  3. Dynamiczne wykresy : Gluon umożliwia programistom definiowanie modeli sieci neuronowych, które są dynamiczne, co oznacza, że ​​można je budować w locie, z dowolną strukturą i przy użyciu dowolnego natywnego przepływu sterowania Pythona.
  4. Wysoka wydajność : Gluon zapewnia wszystkie powyższe korzyści bez wpływu na prędkość treningu zapewnianą przez podstawowy silnik.

Te cztery elementy, wraz ze znacznie rozszerzoną kolekcją przykładów modeli, zapewniają Gluon / MXNet zgrubną zgodność z Keras / TensorFlow i PyTorch w celu ułatwienia rozwoju i szybkości szkolenia. Możesz zobaczyć przykłady kodu Gluon ilustrujące każdą z tych cech na głównej stronie Gluon i powtórzone na stronie przeglądu Gluon API.

Gluon API zawiera funkcjonalność dla warstw sieci neuronowych, powtarzających się sieci neuronowych, funkcji strat, metod zbioru danych i zbiorów danych wizyjnych, modelu zoo oraz zestawu eksperymentalnych metod sieci neuronowych. Można dowolnie łączyć ze standardowymi MXNet gluonowych i NumPy modułów-na przykład module, autogradi ndarray-jako również z przepływów kontrola Python.

Gluon oferuje duży wybór warstw do budowania modeli, w tym warstwy podstawowe (Gęste, Zanikanie itp.), Warstwy splotowe, warstwy puli i warstwy aktywacji. Każde z nich jest połączeniem jednowierszowym. Można ich używać między innymi wewnątrz kontenerów sieciowych, takich jak gluon.nn.Sequential().

HybridSequentialSieci może być buforowane (przekształcony symboliczny wykresu) o wysokiej wydajności przy użyciu hybridize()metody:

net = nn.HybridSequential ()

z net.name_scope ():

    net.add (nn.Dense (256, aktywacja = "relu"))

    net.add (nn.Dense (128, aktywacja = "relu"))

    net.add (nn.Dense (2))

net.hybridize ()

Zwróć uwagę na sposób, w jaki Densemetoda warstwy może przyjąć nazwę warstwy aktywacji jako parametr. To jedno z wielu podobieństw między Gluonem i Kerasem.

Ani kontener Sequentialani nie HybridSequentialjest udokumentowany jako część Gluon API. Jak odkryłem przeszukując drzewo kodu źródłowego, są one zaimplementowane w incubator-mxnet / python / mxnet / gluon / nn / basic_layers.py.

Co nowego w MXNet 1.3?

MXNet v1.3 zawiera długą listę nowych funkcji, ulepszeń i poprawek błędów. Najważniejsze cechy obejmują możliwość hybrydyzacji warstw RNN (rekurencyjnych sieci neuronowych) w celu uzyskania wydajności, nowych i zaktualizowanych wstępnie wytrenowanych modeli wizyjnych, eksport modeli do formatu ONNX (Open Neural Network Exchange) oraz integrację środowiska wykonawczego Nvidia TensorRT z MXNet w celu przyspieszenia wnioskowania . Co więcej, integracja Intel MKL (Math Kernel Library) z MXNet daje nawet czterokrotną poprawę wydajności procesorów Intela w przypadku intensywnych operacji, w tym węzłów konwolucyjnych.

Społeczność MXNet również zwraca większą uwagę na kontrolę jakości i ciągłą integrację. Wśród podjętych kroków jest zintegrowanie przykładowych notebooków z samouczka Deep Learning: The Straight Dope z nocnymi testami CI.

Instalacja MXNet bez łez

Jeśli masz już działającą, bieżącą instalację notebooków Python, MXNet i Jupyter z Notedown, możesz przejść do następnej sekcji. W przeciwnym razie postępuj zgodnie z instrukcjami.

Nie potrafię powiedzieć, ile problemów miałem ze starszymi wersjami różnych komponentów oprogramowania, wyrzucając niejasne błędy, wraz z zakłóceniami wynikającymi z instalacji innych pakietów, zanim ustaliłem tę powtarzalną sekwencję. W ten sposób nie powinieneś napotykać błędów, z wyjątkiem własnego kodu i nie powinieneś łamać innych struktur głębokiego uczenia, które mogłeś zainstalować.

Czy to jedyna możliwa opcja instalacji? Nie, oczywiście nie. Jeszcze łatwiej jest uruchomić MXNet w Amazon SageMaker lub uruchomić Deep Learning AMI na AWS, który ma już zainstalowane wszystko, czego potrzebujesz.

Zacznij od zainstalowania najnowszej wersji Pythona 3 na swoją platformę. (Miałem problemy z uruchomieniem MXNet z Pythonem 2 lub wcześniejszymi wersjami Pythona 3.) Proponuję zainstalować Python 3 z Python.org. Jeśli wolisz środowisko Anaconda lub MiniConda, możesz zamiast tego zainstalować Python 3 z jednym z nich i prawdopodobnie pominąć krok instalacji Jupyter.

Sprawdź, czy można uruchomić python3z wiersza poleceń i czy zgłasza najnowszą wersję. W mojej instalacji z końca października 2018 r. python3 -VZwraca Python 3.7.1; Twoja wersja może być późniejsza.

Następnie zainstaluj Jupyter. Użyłem pip. Ten krok nie jest potrzebny, jeśli zainstalowałeś Anacondę, która domyślnie instaluje Jupyter.

python3 -m pip install --upgrade pip

python3 -m pip install jupyter

Jeśli uruchomisz jupyter notebookz wiersza poleceń, powinieneś zobaczyć otwarte okno przeglądarki i móc utworzyć nowy notatnik z jądrem Python 3. Zamknij te dwa okna i zatrzymaj serwer notebooka, zazwyczaj naciskając dwukrotnie Ctrl-c w wierszu poleceń.

Teraz zainstaluj Notedown przy użyciu tarballa, jak opisano w pliku Readme kursu awaryjnego Gluon. Wtyczka Notedown pozwala Jupyterowi czytać notatniki zapisane w formacie przecen, co jest przydatne zarówno w przypadku szybkiego kursu, jak i w przypadku Deep Learning: The Straight Dope.

pip install //github.com/mli/notedown/tarball/master

Smoke przetestuj to, uruchamiając Jupyter z Notedown:

Notatnik jupyter --NotebookApp.contents_manager_class = 'saidown.NotedownContentsManager'

Ponownie zamknij wszystkie strony internetowe i zatrzymaj serwer notebooka.

Teraz jesteśmy gotowi do stworzenia wirtualnego środowiska dla MXNet. Jeśli jesteś użytkownikiem Anaconda, możesz zamiast tego utworzyć środowisko wirtualne za pomocą conda. Użyłem natywnego narzędzia Venv Python3, zaczynając od mojego katalogu domowego:

python3 -m venv envs / mxnet

Teraz aktywuj środowisko wirtualne i zainstaluj MXNet dla swojej platformy. Wybrałem kompilację MXNet z MKL (wysokowydajną biblioteką Intela dla jego procesorów), ponieważ jestem na komputerze Mac (dla którego nie ma pliku binarnego MXNet dla procesorów graficznych CUDA), ale jeśli masz najnowszy procesor graficzny Nvidia z CUDA zainstalowaną w systemie Linux lub Windows, możesz zainstalować wersję MXNet z obsługą zarówno CUDA, jak i MKL. W powłoce Bash instalacja MXNet w środowisku wirtualnym wyglądała następująco:

source envs / mxnet / bin / activ

pip install mxnet-mkl

Aktywacja jest nieco inna w powłoce C i powłoce Fish, ponieważ możesz uruchomić skrypt aktywacji bezpośrednio zamiast używać source. W każdym razie będziesz musiał aktywować środowisko, gdy chcesz wrócić do tej instalacji MXNet po zamknięciu powłoki. Jeśli nie jesteś w swoim katalogu domowym, polecenie aktywacji Bash wyglądałoby tak:

źródło ~ / envs / mxnet / bin / activ

Przetestuj instalację MXNet w wierszu poleceń, uruchamiając Python 3 i importując bibliotekę MXNet, którą właśnie zainstalowaliśmy. Zauważ, że (mxnet)prefiks w linii poleceń oznacza, że ​​jesteśmy w środowisku wirtualnym.

(mxnet) Martins-Retina-MacBook: ~ martinheller $ python3

Python 3.7.1 (v3.7.1: 260ec2c36a, 20 października 2018, 03:13:28)

[Clang 6.0 (clang-600.0.57)] na Darwinie

Wpisz „pomoc”, „prawa autorskie”, „autorstwo” lub „licencja”, aby uzyskać więcej informacji.

>>> importuj mxnet jako mx

>>> z mxnet import nd

>>> nd. tablica (((1,2,3), (5,6,7)))

[[1. 2. 3.]

 [5. 6. 7.]]

>>> ^ D

(mxnet) Martins-Retina-MacBook: ~ martinheller $

Teraz jesteśmy gotowi do przetestowania MXNet w notebooku Jupyter z Notedown, w środowisku wirtualnym, w którym zainstalowaliśmy MXNet:

Po przetestowaniu instalacji MXNet w notebooku Jupyter możesz wykonać następny krok i pełniej przetestować Gluon. Przejdź do repozytorium gluon-api / gluon-api w serwisie GitHub i pobierz notatnik Jupyter z przykładowym kodem. Przejdź do katalogu, do którego został pobrany notebook, w razie potrzeby aktywuj środowisko wirtualne MXNet, uruchom notebook Jupyter, otwórz próbkę i uruchom ją. Ukończenie szkolenia może chwilę potrwać. Jeśli wszystko jest w porządku, zobaczysz coś takiego:

Samouczki dotyczące modułu Gluon i MXNet

MXNet ma teraz wiele samouczków zarówno dla Gluon, jak i Module API. Wspomniałem już o długim kursie głębokiego uczenia z Gluonem, Deep Learning: The Straight Dope oraz krótkiej wersji, 60-Minute Gluon Crash Course.

Ponadto dostępnych jest około 30 samouczków Gluon dla języka Python. Po stronie Module API jest około 24 tutoriali dla Pythona, pięć dla Scali, dwa dla C ++, dziewięć dla R i cztery dla Perla.

Kiedy recenzowałem Keras we wrześniu tego roku, powiedziałem, że „Gdybym zaczynał dzisiaj nowy projekt głębokiego uczenia się, najprawdopodobniej przeprowadziłbym badania z Kerasem”. Nie jestem już tego taki pewien. Gluon / MXNet to prawie tak dobry wybór jak Keras / TensorFlow do badań głębokiego uczenia procesorów i procesorów graficznych.

Z drugiej strony, MXNet obecnie nie obsługuje TPU lub FPGA, w przeciwieństwie do TensorFlow, i brakuje mu odpowiednika TensorBoard TensorBoard do wizualizacji wykresów. Ponadto Keras / TensorFlow ma większy ekosystem niż Gluon / MXNet.

Keras można wdrożyć w większej liczbie środowisk niż Gluon, ale można wdrażać modele Gluon do prognozowania na urządzeniach z systemem Android, iOS, Raspberry Pi i Nvidia Jetson, a także na komputerach zdolnych do trenowania modeli i do TensorRT. Gluon i Keras są obecnie bardziej dojrzałe niż PyTorch, który wciąż jest w fazie beta. PyTorch i Gluon mogą dynamicznie tworzyć modele; Obecnie Keras nie może.

Ostatecznie wybór frameworka uczenia głębokiego może zależeć od Twoich konkretnych wymagań - lub tego, co wiesz i lubisz. Ale dzięki Gluon i innym radykalnym ulepszeniom (w dokumentacji, samouczkach, modelach itp.) MXNet staje się tak dobrym wyborem jak TensorFlow lub PyTorch do głębokiego uczenia się.