Jednym z pierwszych problemów, na jakie napotykają osoby studiujące uczenie maszynowe jest jak zbudować lokalne środowisko programistyczne dla uczenia maszynowego? Jest to o tyle niewdzięczne zagadnienie, że dostępnych jest wiele metod oraz narzędzi i czasami po prostu nie wiadomo, które wybrać i od czego zacząć. Do tego dochodzą kwestie wyboru bibliotek do instalacji, IDE oraz wykorzystania GPU.
Osobiście, dla potrzeb nauki i eksperymentowania, jestem zwolennikiem skorzystania z zestawu pakietów oferowanych przez Anacondę, menadżera conda oraz notebooka Jupyter. Z niniejszego posta dowiesz się między innymi:
- Czym jest Anaconda, conda i jakie są alternatywy?
- Jak zainstalować Anaconda?
- Jak tworzyć środowiska wirtualne z wykorzystaniem conda?
- Jakie pakiety zainstalować, aby móc rozpocząć prace z uczeniem maszynowym?
- Jak zainstalować bibliotekę Tensorflow w różnych wersjach?
- Jak zainstalować Tensorflow na GPU?
Anaconda jest open-source’ową platformą dla uczenia maszynowego i data science, dostępną na większość systemów operacyjnych. Zawiera ona w sobie przede wszystkim zestaw ponad 1.500 bibliotek programistycznych i narzędziowych, a wśród nich conda i pip, które przydadzą się do zbudowania środowisk. Dzięki Anacondzie mamy wszystko pod ręką, budowa środowiska jest szybka i prosta, a platforma dba o aktualność bibliotek i zależności między nimi. Ma też niestety swoje minusy: bardziej zaawansowane funkcje są płatne, a instalacja Tensorflow 2.0 nie jest jak na razie (październik 2019) wspierana przez conda i trzeba posiłkować się menedżerem pip.
Conda to menedżer środowisk wirtualnych oraz bibliotek programistycznych dla Pythona (ale też i innych języków). Jest dostarczany wraz z Anacondą i można dzięki niemu tworzyć odseparowane środowiska, w których będziemy wykorzystywali różne biblioteki lub różne ich wersje, np.: tensorflow 1.x, tensorflow 2.x, tensorflow-gpu, itd.
Pip to również menedżer bibliotek / pakietów programistycznych. Nie daje on jednak możliwość tworzenia odseparowanych środowisk. Jeżeli ktoś chciałby użyć pip i jednak działać w środowisku zwirtualizowanym, to może skorzystać z menedżera środowisk wirtualnych dla języka Python – venv. Pewną przewagą pip nad conda (przynajmniej na październik 2019) jest to, że tensorflow 2.0 jest dostępny z poziomu pip i jest już nawet wersją domyślną. Podczas gdy w conda na razie brak wsparcia dla tensorflow 2.0 i jeżeli chce się zbudować środowisko oparte na wersji 2.0, to trzeba nieco pokombinować, o czym niżej.
Warto w tym miejscu dodać, że jest mnóstwo świetnych środowisk dla Pythona dostępnych w chmurze – wystarczy wyszukać „cloud python ide”. Dodatkowo, jeżeli ktoś, tak jak ja, lubi Jupyter Notebook, to Google oferuje rozwiązanie Colaboratory, które jest niczym innym jak darmowym notebookiem Jupyter uruchomionym w chmurze, skonfigurowanym do pracy lub wymagającym jedynie minimalnego setup’u. I co ciekawe, umożliwia również darmowe skorzystanie z gpu.
Pomimo tego uważam, że lokalne środowisko zawsze warto mieć, stąd przejdźmy do jego konfigurowania.
Środowisko programistyczne dla uczenia maszynowego – krok 1
Pobieramy i instalujemy Anacondę dla wersji Pythona 3.7. Instalację przeprowadzamy z domyślnymi ustawieniami. Jedyną wątpliwość może budzić ten ekran:
Jak widać Anaconda nie rekomenduje dodawania ścieżki do zmiennej PATH. W konsekwencji, aby uruchomić np. condę będziemy musieli przejść do folderu, w którym instalujemy Anacondę, do podkatalogu condabin lub skorzystać z programu Anaconda Prompt (na Windows). Nie jest to jakiś problem, a przy bardziej rozbudowanych środowiskach faktycznie dodanie do PATH ścieżki do Anacondy może spowodować konflikty. Stąd ja pozostawiam rekomendowane ustawienia i rozpoczynam instalację.
Środowisko programistyczne dla uczenia maszynowego – krok 2
Uruchamiamy konsolę, w systemie Windows polecenie cmd, przechodzimy do katalogu condabin (alternatywnie uruchamiamy Anaconda Prompt) oraz sprawdzamy wersję condy:
>conda -V
Jeżeli chcemy się upewnić, że używamy najnowszej wersji condy możemy wykonać polecenie:
>conda update -n base -c defaults conda
Tworzymy nowe wirtualne środowisko. Tu nazywam je my_env, ale nazwa może być dowolna:
>conda create --name my_env
Aby przełączyć się w tryb pracy z nowo utworzonym środowiskiem wykonujemy polecenie:
>conda activate my_env
Przełączenie się na to środowisko jest ważne, w przeciwnym wypadku będziemy działali w kontekście środowiska bazowego „base” i z separacji nici. Aby zobaczyć jakie pakiety są zainstalowane na obecnym środowisku wydajemy polecenie:
> conda list
Ponieważ przy tworzeniu środowiska nie wskazaliśmy żadnych pakietów i bibliotek, to lista powinna być na tę chwilę pusta. Aby zainstalować pakiety możemy się posłużyć poleceniem:
>conda install numpy pandas matplotlib pillow jupyter
Wymieniliśmy jedynie kilka kluczowych dla nas pakietów, ale conda badając zależności zainstaluje ich o wiele więcej, w tym pythona w odpowiedniej wersji. Jest to jedna z największych zalet menedżerów w rodzaju condy czy pip. Wszystkim tym, którzy chcieliby nieco więcej poczytać o możliwościach condy, polecam tę zgrabną stronkę – Conda Cheet Sheet.
W tym miejscu możemy się na chwilę zatrzymać z dalszą instalacją i zastanowić się w jaki sposób można zainstalować tensorflow:
- Jeżeli chcemy jedną z ostatnich stabilnych wersji 1.x, to możemy w dalszej kolejności instalować z wykorzystaniem conda – jest to najbardziej zalecana droga, bo nasze środowisko będzie nadal zarządzane przez jednego menedżera pakietów – condę.
- Jeżeli chcielibyśmy dziś (październik 2019) zainstalować wersję 2.0, to niestety nie jest ona jeszcze oferowana przez condę i musimy posłużyć się menedżerem pip.
- Z jeszcze inną sytuacją mamy do czynienia, jeżeli możemy i chcemy skorzystać z procesora graficznego GPU.
Aby łatwo przejść każdą z dróg sklonujemy teraz nasze środowisko. Na początek deaktywujemy środowisko i skorzystamy z opcji – -clone:
>conda deactivate
>conda create -n my_env-20 --clone my_env
>conda create -n my_env-gpu --clone my_env
W rezultacie mamy trzy bliźniacze środowiska: my_env, my_env-20, my_env-gpu i oddzielnie na każdym z nich możemy przejść wyżej wymienione instalacje. Wystarczy przełączać się między środowiskami poleceniami deactivate – activate.
Środowisko programistyczne – krok 3A
Aktywujemy środowisko my_env i instalujemy tensorflow w najnowszej wersji dostępnej w repozytorium Anacondy:
>conda activate my_env
>conda install tensorflow
Jeżeli chcemy sprawdzić w jakiej wersji został zainstalowany Python:
>python --version
>>>Python 3.7.4
Jeżeli chcemy sprawdzić wersję tensorflow, to proponuję zrobić to z poziomu Jupyter Notebook (przy okazji sprawdzimy, czy działa poprawnie):
>jupyter notebook
# W notebooku:import tensorflow as tf
print(tf.__version__)
>>> 1.14.0
Środowisko programistyczne – krok 3B
Przełączmy się teraz na środowisko my_env-20 i spróbujmy zainstalować tensorflow w wersji 2.0. Niestety, w tej sytuacji nie możemy posłużyć się conda, gdyż na dziś (październik 2019) nie ma ona w swoim repozytorium tej wersji tensorflow. Do gry wchodzi zatem inny menedżer pakietów – pip.
>conda deactivate
>conda activate my_env-20
>conda install pip
>>># All requested packages already installed.
Jak widać pip jest już zainstalowany – zapewne był określony jako jedna z zależności przy instalacji bazowych pakietów. Tensorflow instalujemy z wykorzystaniem pip:
>pip install tensorflow
>python --version
>python -c "import tensorflow as tf; print(tf.__version__);"
W rezultacie uzyskamy środowisko z Pythonem w wersji 3.7.4 oraz tensorflow w wersji 2.0.0. Niestety, nie będzie to środowisko idealne. W szczególności cała idea budowy środowiska z wykorzystaniem conda zakłada, że menedżer ten śledzi instalacje i wszystkie zależności, dzięki czemu środowisko jest spójne i można je w dowolnym momencie uzupełniać i aktualizować. Kiedy na scenę wchodzi dodatkowo pip, conda traci częściowo te informacje i traci również pełną kontrolę nad środowiskiem. Generalną zasadą w takiej sytuacji jest, aby instalacje z wykorzystaniem pip wykonywać na samym końcu a po instalacji tensorflow nie dokonywać kolejnych instalacji z użyciem conda, w przeciwnym wypadku środowisko może stać się niezdatne do użytku. Więcej o potencjalnych problemach tej konfiguracji i dobrych praktykach w tym zakresie w tym artykule.
Dodam, że jeszcze jedna istotna różnica między tensorflow zainstalowanym z wykorzystaniem conda vs. pip jest taka, że tensorflow od conda potrafi być do 8 razy bardziej wydajny ze względu na sposób budowania pakietu w repozytorium Anacondy.
Środowisko programistyczne – krok 3C
Ostatnim wariantem budowy środowiska jest takie jego skonfigurowanie, aby możliwe było wykorzystanie mocy jednostki GPU, co dramatycznie przyspiesza obliczenia. Na początek zasadnicza kwestia. Możliwość skorzystania z GPU mają jedynie te osoby, które posiadają kartę graficzną CUDA-enabled. Sprawdzić to można pod tym adresem. Uwaga: wiele osób sprawdza również tu, ale lista ta jest na dziś (październik 2019) nieaktualna. Nie ma na niej np. mojej karty graficznej GeForce GTX 1660 Ti, a bez wątpienia może być ona wykorzystana przez tensorflow.
Sama instalacja z wykorzystaniem condy jest obecnie bajecznie prosta i w niczym nie przypomina mocno skomplikowanego procesu instalacji sprzed kilku miesięcy. Głównie dlatego, że instalując tensorflow-gpu conda samodzielnie dociąga cudatoolkit oraz cudnn, co kiedyś trzeba było mozolnie wykonywać samodzielnie. W pierwszym kroku przełączamy się na odpowiedni klon środowiska, a potem instalujemy pakiet tensorflow-gpu
>conda deactivate
>conda activate my_env-gpu
>conda install tensorflow-gpu
I to tyle 🙂 . Wystarczy teraz jedynie upewnić się, że nasze środowisko faktycznie „widzi” i korzysta z procesora GPU. Najlepiej skorzystać z notebooka:
>jupyter notebook
# W notebooku:
import tensorflow as tf
print(tf.__version__)
>>> 1.14.0
tf.test.is_gpu_available()
>>>True
tf.test.gpu_device_name()
>>>'/device:GPU:0
Masz pytanie? Zadaj je w komentarzu.
Spodobał ci się post? Będzie mi miło, gdy go polecisz.
Do zobaczenia wkrótce, przy okazji omawiania innego ciekawego tematu!
Czy oglądasz mecze NBA? Sprawdź mój darmowy serwis NBA Games Ranked i ciesz się oglądaniem wyłącznie dobrych meczów.
Jak rozwiązać ten problem: failed with initial frozen solve. Retrying with flexible solve