Up and Run
with a

Configurare una macchina remota (tipo AWS, una nostra workstation remota o quello che è) per diventare il nostro personale laboratorio per addestrare piccole e grandi reti neurali può essere un’operazione snervante e “time consuming”. Proprio per questo motivo ho deciso di creare questa guida per riassumere, in pochi e semplici passaggi, come ottenere un ambiente flessibile e efficiente  per lavorare con il deep learning.

N.B.: In questa guida si assume che la macchina alla quale ci si colleghi abbia installato CUDA/cuDNN.

1.0 Connect to the Host

Indubbiamente la prima cosa che bisogna fare è connettersi con la propria macchina remota utilizzando una shell di nostro piacimento.

ssh <username>@<host> -L 8888:localhost:8888

Sostituire <username> e <host> con le proprie informazioni. Ex: vitto@192.168.1.1. L’opzione ‘-L’ ci permette di re-indirizzare tutto il traffico della porta 8888 del localhost della macchina remota alla nostra porta 8888. Sarà molto importante quando verrà il momento di connettersi con un server jupyter.

N.B.: considera di utilizzare ssh_pass per velocizzare la procedura di connessione.

2.0 Install VirtualEnvWrapper

Virtualenvwrapper, come da nome, è un wrapper attorno alla libreria virtualenv. Semplifica di molto la creazione e distruzione degli environment. In questo modo possiamo creare velocemente dei “compartimenti” in cui installare differenti pacchetti e versioni. 

pip3 install virtualenvwrapper --user

Aggiungere al .bashrc le seguenti righe (‘cd ~ && nano .bashrc’):

# virtualenvwrapper
export WORKON_HOME=$HOME/.virtualenvs
export PROJECT_HOME=$HOME/Devel
export PATH=$HOME/.local/bin:$PATH
export VIRTUALENVWRAPPER_PYTHON=/usr/bin/python3
source $HOME/.local/bin/virtualenvwrapper.sh

Ricordarsi di fare il source prima di procedere(‘cd ~ && source .bashrc’).

A questo punto è possibile creare, entrare e distruggere gli ambienti con i seguenti comandi:

  • mkvritualev: creare un nuovo ambiente
  • workon: entrare in un nuovo ambiete e visualizzare quelli disponibili
  • rmvirtualenv: rimuovere un ambiente

Quindi iniziamo con il creare un nuovo ambiente chiamato “TensorFlow2.x”.

mkvirtualenv TensorFlow2.x -p python3

3.0 Install Jupyter Notebook and its Extensions

Jupyter Notebook è uno strumento fondamentale per ogni data scientist ma anche per un machine learning engineering. Proprio per questo la cosa migliore è installare la libreria di questo strumento fuori da un ambiente virtuale e poi usare uno jupyter kernel per collegarlo con i differenti ambienti.

Iniziamo con l’installarlo:

pip3 install jupyter --user

Questo passaggio che viene non è indispensabile, ma senza estensioni jupyter non è lo stesso. Certe estensioni come dividere in capitoli il proprio notebook,  numerare le righe o ispezionare le variabili cambiano completamente il modo di lavorare con questo strumento. 

#install jupyter extensions

pip install jupyter_contrib_nbextensions

jupyter contrib nbextension install --user

Poi una volta avviato ‘jupyter’ si potrà facilmente selezionare le estensioni desiderate da questa schermata —> link.

3.1 Create a Jupyter Kernel

Come accennato prima, jupyter conviene installarlo a livello di sistema e poi creare degli jupyter kernel nei singoli virtual environments.

Quindi entriamo nel virtualenv creato prima:

workon TensorFlow2.x

A questo punto installiamo dentro il virtualenv la libreria ipykernel e creiamo un nuovo kernel con il nome che vogliamo. Questo kernel, sarà legato a tutte le librerie installate e che verranno installate nel virtualenvironment.

pip3 install ipykernel

ipython kernel install --user --name=TensorFlow2.0
kernel_jupyter_1

4.0 Install tmux

Questo punto è l’unico che richiede di avere permessi di amministratore. Dobbiamo installare tmux, un multiplexer di terminale che ci permetterà di creare delle sessioni che rimarranno attive anche dopo aver chiuso la shell utilizzata per collegarsi in ssh con l’host.

sudo apt install tmux

4.1 Create a tmux Session

Tumx non è sicuramente un strumento “user friendly”, ma già utilizzando i suoi comandi di base si può sfruttare molte delle sue funzionalità.

Per prima cosa creiamo una nuova sessione (sostituire ‘session’ con un nome a piacere. Sarà il nome della sessione.):

tmux new -s session

Questi sono i principali comandi:

  • tmux set mouse: rendere il mouse utilizzabile
  • tmux a -t session: accedere nuovamente alla sessione chiamata ‘session’
  • ctrl + b e poi ctrl + D: uscire dalla sessione (D è maiuscola. Non è un errore)
  • ctrl + b e poi ctrl + “: aprire un nuovo terminale dividendo la schermata in orizzontale
  • ctrl + b e poi ctrl + %: aprire un nuovo terminale dividendo la schermata in verticale

Quindi dopo aver creato una sessione, attivate il server di jupyter (jupyter-noteboook) e via…

4.2 Personal Preferences

Voglio concludere con un mio modo personale di impostare una sessione di tmux. Cerco sempre di tenere una divisione dello schermo che mi permetta di avere:

  • una finestra che contiene il server jupyter
  • una che visualizza lo stato delle gpu con il comando nvidia-smi (watch -n 0.5 nvidia-smi se volete una visualizzazione aggiornata ogni 0.5 secondi)
  • una console libera per entrare nei virtual environments installare librerie e lanciare comandi
tmux_window