Developer.

Konfiguracja serwera VPS (JupyterLab) dla Machine Learning

Serwer VPS kosztuje tyle co droższe kraftowe piwo. Kupiłem I nie żałuje. Za kilka złotych ciężko oczekiwać wydajność rozwiązań chmurowych i faktycznie pojawiło się kilka zgrzytów :) Poniże krótka instrukcja konfiguracji, która sprawdza się u mnie. Dla sportu robię reinstalację servera raz na jakiś czas dopracowując szczegóły. Pojawia się kilka drobnych różnic w stosunku do oryginalnego tekstu Łukasza Prokulskiego ( stawiamy własny serwer ), ale mają one charakter kosmetyczny.

v2

Od czasu, gdy pisałem pierwszą wersję instrukcji minęło ponad pół roku. W tym czasie wyszło bardzo wiele niedociągnięć, które popełniłem za pierwszym razem. Z okazjis wyjścia Ubuntu 20.04 postanowiłem przeinstalować wszystko od zera, starając się wdrożyć to wszystko, o czym dowiedziałem się w tym czasie.

Podstawowa konfiguracja serwera

Opis na podstawie tekstu Łukasza Prokulskiego: Stawiamy własny serwer uzupełnianego o inne źródła. Za radą Łukasza wybrałem serwer webh.pl i ogólnie nie żałuję, miał być tani i taki jest. Ma jednak jedną istotną wadę, która na początku może spędzać sen z powiek.

Jest nią niepoprawna obsługa rozszerzenia instrukcji procesora AVX2 przez wirtualna maszynę (problem z biblioteką OpenBLAS). Link do szerszego opisu dla dociekliwych.

Rozwiązaniem jest ręczne określenie typu procesora w zmiennych systemowych, co można zrobić ręcznie z poziomu konsoli instrukcją:

export OPENBLAS_CORETYPE="Skylake"

Ewentualnie z poziomu skryptu pythona:

import os
os.environ["OPENBLAS_CORETYPE"] ="Skylake"
os.getenv("OPENBLAS_CORETYPE")

W jupyter możemy skorzystać z magiczej funkcji:

%env OPENBLAS_CORETYPE=Skylake

Polecam rozwiązać to w sposób permanentny, poprzez modyfikację sudo nano /etc/environment i dodanie w nim linii:

OPENBLAS_CORETYPE="Skylake"

Pozostaje przeładować zmienne systemowe i można sprawdzić czy wszystko jest ok:

source /etc/environment

echo $OPENBLAS_CORETYPE      
Skylake

Jeżeli mimo tego nadal pojawiałyby się problemy, to należy zrestartować serwer.

Użytkownicy i logowanie

Dodanie nowego użytkownika którego będziemy używać do pracy zamiast konta root

adduser lambda

Dodanie użytkownika lambda do grupy administratorów:

gpasswd -a lambda sudo

Wyłączenie możliwości logowania użytkownika root poprzez SSH

sudo nano /etc/ssh/sshd_config
PermitRootLogin yes

zamienić na:

PermitRootLogin no

O tym dlaczego warto to zrobić dla własnego bezpieczenstwa, można poczytać w artykule Lessons Learned from SSH Credential Honeypots

Jeżeli mimo wszystko potrzebujesz naocznie przekonać się na jakie zagrożenia narażone sa komputery podłączone do internetu to polecam wykonanie komendy

grep "Failed password" /var/log/auth.log

Aktywacja firewalla, dodanie reguły dla OpenSSH

sudo ufw app list
sudo ufw allow OpenSSH
sudo ufw enable
sudo ufw status

Poprawna konfiguracja:

Status: active

To                         Action      From
--                         ------      ----
OpenSSH                    ALLOW       Anywhere 

restart

sudo service ssh restart

Aktualizacja systemu:

sudo apt-get update
sudo apt-get upgrade

Przydatne programy:

sudo apt install mc

Jeżeli planujemy instalację biblioteki OpenCV z conda-forge to można od razu doinstalować:

sudo apt install libgl1-mesa-glx

W ten sposób nie musimy pózniej google-ować co powoduje błąd (ImportError: libGL.so.1: cannot open shared object file: No such file or directory). Zaoszczedziliśmy właśnie 30s życia :)

3) Python

Instalacja podstawowych pakietów

python3 -V
> Python 3.6.9

Instalacja i aktualizacja pip

sudo apt install python3-pip python3-dev
sudo -H pip3 install --upgrade pip
pip3 -V
>pip 9.0.1 from /usr/lib/python3/dist-packages (python 3.6)

Menadżer pakietów dla Python, komendy w wierszu poleceń:

pip list     # – lista zainstalowanych pakietów
pip search     # – szuka pakietów w repozytorium online
pip install pakiet   # – instalowanie modułu
pip uninstall pakiet # - odinstalowanie
pip list –o    # - sprawdzenie nieaktualnych pakietów
pip install –U pakiet  # - update pakietu
pip freeze> plik.txt  # – zapisanie informacji do pliku o pakietach
pip install –r plik.txt # – zainstaluje wszystkie wymagane pakiety

Biblioteki systemowe:

sudo apt install build-essential libssl-dev libffi-dev 

Przykład pliku requirements.txt:

# Moduł warunek wersja
numpy >= 1.15.2
pandas == 0.23.4

Conda & JupyterLab

Za pierwszym razem instalowałem Jupyter Notebook i JupyterLab wykorzystując venv. Tym razem zdecydowałem się bardziej odseparować od systemowego pythona i wykorzystałem menadżer pakietów conda.

Opisane na podstawie:

Odblokowanie portów firewalla:

sudo ufw enable
sudo ufw allow 8888
sudo ufw allow 22
sudo ufw status

Wynik:

To                         Action      From
--                         ------      ----
OpenSSH                    ALLOW       Anywhere
8888                       ALLOW       Anywhere

Pobranie Anaconda, najnowsza wersja Linux x64 Miniconda w najnowszej wersji (i po co był ten curl? wget zrobi to samo i jest dostępny od razu):

cd /tmp
sudo apt install curl

# notka do przyszłego mnie: uzyj miniconda, zaoszczędzisz miejsca i czasu
wget https://repo.anaconda.com/miniconda/Miniconda3-latest-Linux-x86_64.sh

# curl -O https://repo.anaconda.com/archive/Anaconda3-2020.07-Linux-x86_64.sh

Instalacja:

#sh Anaconda3-2020.07-Linux-x86_64.sh
sh Miniconda3-latest-Linux-x86_64.sh

W celu inicjalizacji po zakończeniu procesu instalacji, najpierw należy uruchomić:

<ścieżka do conda>/bin/activate

a następnie uruchomić conda init Można to też zrobić w trakcie instalacji wyrażając zgodę pod koniec instalacji.

Po instalacji:

source ~/.bashrc

Sprawdzenie czy instalacja przebiegła poprawnie:

conda --version

Stworzenie wirtualnego środowiska conda (z Python 3.7.0):

conda create --name env python=3.7.0
conda activate env

Instalacja JupyterLab:

conda install -c conda-forge jupyterlab

Polecam też doinstalować od razu podstawowe biblioteki:

conda install -y -c conda-forge numpy 
conda install -y -c conda-forge pandas
conda install -y -c conda-forge matplotlib 
conda install -y -c conda-forge missingno

# conda install -y -c conda-forge opencv 
# warto rozważyć instalację OpenCV z pomoca pip.
# Zyskamy dostęp do dodatkowych modułów:
pip install opencv-contrib-python

Stworzenie pliku konfiguracyjnego:

jupyter-lab --generate-config

Writing default config to: /home/lambda/.jupyter/jupyter_lab_config.py

Można od razu ustawić w nim domyślny folder roboczy:

nano /home/lambda/.jupyter/jupyter_lab_config.py

poprzez ustawienie linii

c.ServerApp.root_dir = '/home/lambda/ntbks'

Ustawienie hasła (nie będzie konieczne podawanie długiego tokena do autoryzacji):

jupyter notebook password
jupyter server password
Enter password: **********
Verify password: **********
[NotebookPasswordApp] Wrote hashed password to: /home/lambda/.jupyter/jupyter_notebook_config.py

Po połączaniu przez SSH powinniśmy mieć dostęp do JupyterLab (pod adresem localhost:8888):

ssh -L 8888:localhost:8888 myuser@your_server_ip

W PUTTy:

Ustawienie tunelu w SSH

SSH -> Tunnels

L8000 localhost:8888

Połączenie (na komputerze lokalnym):

http://localhost:8000

Po zalogowaniu każdorazowo konieczne jest uruchomienie ręcznie środowiska:

conda activate env
jupyter lab

###

Dlib

Dodatkowe informacje temat niuansów instalacji OpenCV. Warto pomyśleć też nad instalacją biblioteki Dlib:

  • Utworzenie środowiska z python 3.7: conda create -n cenv python=3.7.0
  • Instalacja cmake: conda install cmake
  • Instalacja Dlib : pip install dlib
  • Sprawdzenie poprawności w IPython:
python
Python 3.7.0 (default, Oct  9 2018, 10:31:47) 
[GCC 7.3.0] :: Anaconda, Inc. on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> import dlib
>>> dlib.__version__
'19.21.0'

Jeżeli zastanawiasz się czego jeszcze nie ma w utworzonym środowisku, to conda list powie co już mamy. PS. Korzystam zwykle z kanału conda-forge można na przyszłość ustawić go jako domyślny.

NodeJs

Doinstalowanie nodeJS (w celu późniejszego korzystania z rozszerzeń)

cd /tmp
curl -sL https://deb.nodesource.com/setup_14.x -o nodesource_setup.sh
sudo bash nodesource_setup.sh
sudo apt-get install -y nodejs

Dodatki

Jeżeli wszystko działa to możemy na koniec doinstalować ciemny motyw:

jupyter labextension install @telamonian/theme-darcula

CTRL + / - komentowanie (jednej lub wielu) linii kodu

SHIFT + L - pokazuje ukrywa numery linii

Lokalnie pracuję korzystając z Dockera

Sprawdzanie pisowni:

jupyter labextension install @ijmbarr/jupyterlab_spellchecker

Git

Od razu zainstalujemy git tak żeby od razu synchronizować całą pracę.

sudo apt-get install git

Konfiguracja:

git config --global user.name "user_name"
git config --global user.email "email_id"

Klonowanie repozytorium (po przejściu do właściwego folderu):

cd ~/github
git clone https://github.com/xxx/py_otomoto.git

Remote VS Code

sudo apt-get install openssh-server
sudo apt-get install sshfs