Najlepsze frameworki do uczenia maszynowego i głębokiego uczenia

Który framework do implementacji uczenia maszynowego lub uczenia głębokiego wybrać?

To zależy od stopnia skomplikowania procesu uczenia, objętości i formatu danych, ale także preferencji programistycznych. Przekonaliśmy się jednak, że TensorFlow, Spark MLlib, Scikit-learn, MXNet, Microsoft Cognitive Toolkit i Caffe to frameworki, które dają radę.

W ostatnim roku recenzowałem te sześć frameworków, czyli: Caffe, Microsoft Cognitive Toolkit (zwany też CNTK 2), MXNet, Scikit-learn, Spark MLlib i TensorFlow. Jeśli miałbym szerzej zarzucić swoje sieci, mógłbym równie dobrze dodać do tej wyliczanki jeszcze kilka innych popularnych frameworków, takich jak chociażby Theano (10-letni framework do implementacji głębokiego uczenia i uczenia maszynowego napisany w Pythonie), Keras (warstwa prezentacji głębokiego uczenia dla frameworków Theano i TensorFlow) i DeepLearning4j (oprogramowanie głębokiego uczenia napisane w językach Java i Scala na platformach Hadoop i Spark). Możliwości dostępne dla osób zainteresowanych głębokim uczeniem i sieciami neuronowymi jeszcze nigdy nie były tak bogate.

Zobacz również:

Frameworki do implementacji uczenia maszynowego i uczenia głębokiego różnią się między sobą. Przede wszystkim, frameworki uczenia maszynowego obejmują różnorodne metody uczenia algorytmów klasyfikacji, regresji, grupowania, wykrywania anomalii i opracowywania danych. Mogą również obejmować metody oparte na sieciach neuronowych. Frameworki głębokiego uczenia lub głębokich sieci neuronowych (ang. Deep Neural Network, DNN) obejmują różnorodne typologie sieci neuronowych z wieloma ukrytymi warstwami. Wspomniane warstwy stanowią wielostopniowy proces rozpoznawania wzorców. Im więcej warstw w obrębie sieci, tym bardziej skomplikowane cechy mogą zostać wychwycone dla celów grupowania i klasyfikacji.

Caffe, CNTK, DeepLearning4j, Keras, MXNet i TensorFlow to szkielety do implementacji głębokiego uczenia. Scikit-learn i Spark MLlib to frameworki uczenia maszynowego. Theano łączy w sobie obie kategorie.

Obliczenia dotyczące głębokich sieci neuronowych przyspieszają zwykle o jeden rząd wielkości na układach GPU (w szczególności na architekturze obliczeniowej CUDA od firmy Nvidia o ogólnym zastosowaniu, w przypadku większości frameworków) w porównaniu do układów CPU. Prostsze metody maszynowego uczenia się zasadniczo nie wymagają przyspieszenia oferowanego przez układy GPU.

Co prawda, można trenować głębokie sieci neuronowe na jednym lub większej liczbie układów CPU, ale taki trening musi przebiegać w wolnym tempie, nie zaś w ciągu kilku sekund ani minut. Im więcej neuronów i warstw, które muszą zostać przeszkolone, i im więcej danych przeznaczonych do treningu, tym dłużej on zajmie. Gdy w 2016 roku zespół Google Brain trenował swoje modele tłumaczenia na potrzeby nowej wersji narzędzia Google Translate, przeprowadzał sesje treningowe na wielu różnych układach GPU. Każda z takich sesji trwała tydzień. Bez układów GPU każdy z poszczególnych eksperymentów trenowania modeli zająłby kilka miesięcy.

Poszczególne frameworki mają co najmniej jedną charakterystyczną cechę. Zaletą pakietu Caffe jest zastosowanie splotowych, głębokich sieci neuronowych do rozpoznawania obrazów. Microsoft Cognitive Toolkit posiada odrębną bibliotekę ewaluacyjną przeznaczoną do wdrażania modeli predykcyjnych, które działają na witrynach ASP.Net. Z kolei framework MXNet posiada doskonałą skalowalność w kontekście trenowania konfiguracji obejmujących wiele układów GPU i wiele maszyn. Scikit-learn oferuje szeroki wybór skutecznych metod uczenia maszynowego. Dodatkowo, jest łatwy w nauce i obsłudze. Framework Spark MLlib jest zintegrowany z platformą Hadoop i posiada wysoką skalowalność w zakresie uczenia maszynowego. TensorFlow oferuje natomiast wyjątkowe narzędzie diagnostyczne dla wykresów sieciowych o nazwie TensorBoard.

Z drugiej jednak strony, szybkość uczenia się jest niemalże identyczna w przypadku wszystkich wymienionych frameworków głębokiego uczenia działających na układach GPU. Jest to spowodowane tym, że trening pętli wewnętrznych odbywa się przez większość czasu na głębokich sieciach neuronowych CuDNN od firmy Nvidia. Niemniej jednak, każdy z opisanych frameworków prezentuje nieco inne podejście do kwestii opisywania sieci neuronowych, przy czym wyróżnić można dwie główne koncepcje: korzystanie z pliku opisu graficznego lub tworzenie własnych opisów poprzez wykonanie kodu.

Mając powyższe na uwadze, poznajmy szczegóły dotyczące każdego z omawianych frameworków.

Caffe

Framework do implementacji głębokiego uczenia o nazwie Caffe, który początkowo służył jako silny framework do klasyfikacji obrazów, sprawia wrażenie, jakby stanął w miejscu, biorąc pod uwagę nieustannie pojawiające się błędy, zatrzymanie rozwoju na wersji 1.0 RC3 sprzed ponad roku i opuszczenie projektu przez jego inicjatorów. Framework nadal jednak dysponuje dobrej jakości splotowymi sieciami neuronowymi do rozpoznawania obrazów i dobrym wsparciem dla układów GPU o nazwie CUDA od firmy Nvidia, a także prostym formatem opisu sieci. Z drugiej strony, modele tego frameworku często wymagają znacznych ilości pamięci GPU (ponad 1 GB) do ich uruchomienia, jego dokumentacja nadal zawiera błędy i jest problematyczna, trudno uzyskać wsparcie, a proces instalacji budzi wątpliwości, szczególnie w zakresie obsługi notebooka Python.

Microsoft Cognitive Toolkit

Microsoft Cognitive Toolkit to szybki i łatwy w użyciu framework do implementacji głębokiego uczenia, który jednak ma dość ograniczony zakres stosowania w porównaniu do narzędzia TensorFlow. Oferuje różnorodne modele i algorytmy, doskonałą obsługę języka Python i aplikacji Jupyter Notebook, ciekawy deklaratywny język konfiguracji sieci neuronowych BrainScript oraz zautomatyzowane wdrażanie dla systemów operacyjnych Windows i Ubuntu Linux.

Z drugiej strony, gdy recenzowałem to narzędzie jeszcze w wersji Beta 1, dokumentacja nie była jeszcze w pełni zaktualizowana do wersji CNTK 2, a framework nie obsługiwał systemu MacOS. Chociaż wprowadzono wiele poprawek do CNTK 2 od czasu wersji Beta 1, w tym nowy tryb kompresji pamięci w celu ograniczenia zużycia pamięci na układy GPU i nowe pakiety instalacji Nuget, to nadal brakuje obsługi systemu MacOS.

MXNet

MXNet to przenośna i skalowalna biblioteka uczenia głębokiego wybrana przez Amazona jako framework DNN. Łączy w sobie symboliczną deklarację geometrii sieci neuronowej z imperatywnym programowaniem operacji na czujnikach. MXNet skaluje się do wielu układów GPU na wielu różnych hostach z niemal liniową wydajnością skalowania na poziomie 85% i może pochwalić się doskonałą szybkością tworzenia, programowalnością i możliwością przenoszenia. Obsługuje języki Python, R, Scala, Julia i C++ na różnych poziomach, umożliwiając łączenie ze sobą programowania w językach symbolicznych z programowaniem imperatywnym.

Gdy recenzowałem framework MXNet, dokumentacja tego programu wydawała się być niepełna i udało mi się znaleźć żadnych nowych przykładów języków innych niż Python. W obu przypadkach sytuacja poprawiła się od mojego ostatniego przeglądu.

Scikit-learn

Framework Sickit-learn napisany w języku Python oferuje szeroki wybór skutecznych algorytmów uczenia maszynowego, jednak poza uczeniem głębokim. Dla użytkowników języka Python Scikit-learn to z pewnością najlepsze rozwiązanie spośród wszystkich prostych bibliotek uczenia maszynowego.

Scikit-learn to mocna i sprawdzona biblioteka uczenia maszynowego napisana w języku Python z szerokim asortymentem ugruntowanych algorytmów i zintegrowanych grafik. Program jest stosunkowo łatwy w instalacji, nauce i obsłudze oraz dysponuje dobrymi przykładami i dobrej jakości samouczkami.

Z drugiej strony, framework Scikit-learn nie obejmuje implementacji uczenia głębokiego ani uczenia przez wzmacnianie, nie oferuje modeli graficznych ani możliwości prognozowania sekwencji, nie może być też stosowany w przypadku języków innych niż Python. Nie obsługuje również PyPy, kompilatora „na czas” napisanego w Pythonie, ani procesorów graficznych. Jednocześnie, za wyjątkiem drobnej przygody z sieciami neuronowymi, nie sprawia w rzeczywistości żadnych problemów, jeśli chodzi o szybkość uczenia się. Korzysta z kompilera Cython (Python-to-C) dla funkcji, które muszą być wykonywane błyskawicznie, takich jak pętle wewnętrzne.

Spark MLlib

Spark MLlib to biblioteka uczenia maszynowego typu open source dla programu Spark, która dostarcza najczęściej wykorzystywane algorytmy uczenia maszynowego, takie jak algorytmy klasyfikacji, regresji, grupowania i wspólnej filtracji (ale nie sieci DNN) wraz z narzędziami do wychwytania cech charakterystycznych, transformacji, redukcji wymiarowości i wyboru oraz narzędziami do konstruowania, oceny i strojenia potoków uczenia maszynowego. Spark MLlib oferuje także funkcje zapisywania i ładowania algorytmów, modeli i potoków, obsługi danych oraz obliczeń algebry liniowej i obliczeń statystycznych.

Framework Spark MLlib został napisany w języku Scala i korzysta z pakietu algebry liniowej Breeze. Breeze opiera się na bibliotece netlib-java w przypadku przetwarzania zoptymalizowanych algorytmów numerycznych, chociaż oznacza to zoptymalizowane użycie CPU w dystrybucji typu open source. Databricks oferuje dostosowane klastry Spark, które są kompatybilne z układami GPU mogącymi potencjalnie 10-krotnie zwiększyć prędkość na potrzeby trenowania skomplikowanych modeli uczenia maszynowego z wykorzystaniem Big Data.