Jak zacząć przygodę z uczeniem głębokim (deep learning) – przydatne opcje konfiguracyjne

Deep learning – przydatne opcje konfiguracyjne

Uczenie głębokie (deep learning) w ostatnich kilku latach przeżywa rozkwit. Jeśli chcesz spróbować tego podejścia do analizy danych, w poniższym artykule znajdziesz kilka wskazówek dotyczących konfiguracji popularnych środowisk: TensorFlow i Keras. Oba frameworki rozwijają się – także w obszarze opcji konfiguracyjnych. Dlatego, aby móc wskazówki te wykorzystać, warto sprawdzić wersje własnych środowisk. Wybrane opcje opisuję, używając języka Python w wersji 3.5.3, biblioteki TensorFlow w wersji 1.4.1 i biblioteki Keras w wersji 2.1.3.

Zakładam, że Czytelnik dysponuje komputerem z kartą graficzną i że chciałby jej użyć w procesie uczenia głębokiego. Pierwsze, zasadnicze pytanie, to czy nasz program faktycznie będzie mógł korzystać z GPU, czy jedynie z CPU. Poniżej kod w języku Python, który daje odpowiedź na to pytanie, drukując zestaw urządzeń, z którymi może współpracować zainstalowana wersja TensorFlow.
Deep learning – przydatne opcje konfiguracyjne

Jeśli korzystasz z języka Python z gałęzi 2.x, poprzedź import funkcji następującą dyrektywą:
Deep learning – przydatne opcje konfiguracyjne

Przedstawiony kod diagnostyczny podaje identyfikatory dostępnych urządzeń, do których możemy się odwołać w kodzie analitycznym, o czym za chwilę. W moim środowisku roboczym biblioteka TensorFlow ma dostęp zarówno do CPU, jak i GPU.Deep learning – przydatne opcje konfiguracyjne

TensorFlow umożliwia konfigurację sesji dzięki funkcji ConfigProto(). Jeżeli chcielibyśmy na przykład sprawdzić, jakie urządzenia realizują poszczególne elementy grafu analitycznego, wywołujemy instancję wspomnianej funkcji i parametryzujemy ją. Jako przykład zobaczmy, za pomocą jakich urządzeń realizowane jest mnożenie macierzy:
Deep learning – przydatne opcje konfiguracyjne

Dzięki aktywacji opcji log_device_placement widać, że w moim środowisku roboczym operacje grafu – zarówno utworzenie macierzy, jak i operacje ich mnożenia – realizowane są przez kartę graficzną o identyfikatorze GPU:0
Deep learning – przydatne opcje konfiguracyjne

Nic jednak nie stoi na przeszkodzie, żeby to zmienić, o ile dla danego urządzenia zaimplementowana została określona operacja. Wywołujemy identyfikator docelowego urządzenia, przypisując mu żądaną operację:
Deep learning – przydatne opcje konfiguracyjne

W wyniku bezpośredniego przypisania, jak wyżej, utworzenie wybranych macierzy (a2, b2) oraz operacja ich przemnożenia (F) realizowane są teraz przez CPU, pozostałe zaś operacje grafu przez GPU.
Deep learning – przydatne opcje konfiguracyjne

Aby ustrzec się możliwych błędów wynikających z braku implementacji pewnych operacji dla docelowego urządzenia, wskazując je, warto zadeklarować opcjonalność bezpośredniego przypisania. Korzystamy tu z opcji:
Deep learning – przydatne opcje konfiguracyjne

Jeśli na przykład zadeklarowaliśmy, że fragment kodu związany z uczeniem sieci ma zostać zrealizowany w całości na GPU, a do poprawnej realizacji propagacji wstecznej przy użyciu określonego algorytmu (na przykład RMS) niezbędny jest udział CPU, powyższa opcja uchroni nas przed błędem. Fragment kodu, który nie może zostać zrealizowany na GPU, zostanie zrealizowany na CPU.

W celu szybkiego prototypowania często używa się wygodnej biblioteki Keras. Z jej poziomu także jesteśmy w stanie odwołać się do opcji konfiguracyjnych sesji Tensorflow, o ile framework ten stanowi oczywiście backend. Aby sparametryzować sesję TensorFlow korzystając z biblioteki Keras, używamy funkcji set_session(), jak poniżej.
Deep learning – przydatne opcje konfiguracyjne

Ważne, aby konfiguracja sesji TensorFlow poprzedzała import backendu.

Do przydatnych opcji konfiguracyjnych należy też dyrektywa związana z zarządzaniem pamięcią GPU. Defaultowo TensorFlow próbuje przydzielić maksymalną ilość zasobów pamięciowych karty do bieżącej sesji, niezależnie od tego, ile pamięci faktycznie potrzebuje proces. Tak więc, na przykład, próba równoległego testowania alternatywnego modelu – chociażby z innymi niż model bieżący parametrami – zakończy się niepowodzeniem. Aby spróbować temu zapobiec, wydajemy dyrektywę jak niżej:
Deep learning – przydatne opcje konfiguracyjne

Opcja ta przydziela zasoby pamięciowe karty GPU wedle rzeczywistych potrzeb sesji. Możemy teraz równolegle testować alternatywne modele sieci, o ile sumaryczna wielkość pamięci używanej przez równoległe sesje nie przekracza całkowitej pamięci karty graficznej. W przypadku kart NVIDII możemy wygodnie monitorować stan zasobów GPU, wydając w terminalu komendę:
Deep learning – przydatne opcje konfiguracyjne

Poniżej przykładowy wynik wspomnianej komendy, wydanej podczas równoległego uczenia dwóch alternatywnych klasyfikatorów opartych o sieć Vgg16 z wykorzystaniem klasycznych danych MINIST, wbudowanych w bibliotekę Keras.

Deep learning – przydatne opcje konfiguracyjne

Jak widać, równoległe uczenie dwóch alternatywnych klasyfikatorów zajmuje niecałe 600 MB pamięci z dostępnych na laptopie 4 Gigabajtów. Oba klasyfikatory zawierają ok. miliona optymalizowanych parametrów.

Dzięki omówionym w artykule opcjom konfiguracyjnym można by dołożyć do równoległych testów kolejne cztery alternatywne modele o zbliżonej złożoności i na przykład iść na obiad.

Tags

top