venerdì 3 gennaio 2020

Launching in Machine Learning Coursera

Questo e' quello piu' teorico ma anche piu' interessante per adesso



Colab e TensorFlow

Colab e' una piattaforma cloud offerta da Google per sviluppare utilizzando i Jupiter Notebook..con la possibilita' di utilizzare anche una GPU con ovvi vantaggi nell'uso di Tensorflow

I dati si possono caricare su Google Drive ed essere condivisi con Colab tramite il codice sottostante.


Prima di poter utilizzare Colab si deve cliccare sul link, ottenere una chiave che dovremo incollare sulla pagina

La configurazione della GPU si trova su Notebook settings e dai log di Tensorflow risulta essere una Tesla P100-PCIE-16GB (la disponibilita' della CPU non e' garantita)


Di seguito la rete neurale dei foraminiferi in esecuzione su Colab. Da notare che dalla seconda epoch
entra in funzione la GPU con un significativo incremento delle prestazioni






lunedì 30 dicembre 2019

Retrain Model con dati di foraminiferi

Aggiornamento
Ho provato a fare girare il modello con dataset di train di 1000 e 1500 immagini

Dataset 1000 immagini per classe
57% di attribuzioni corrette


Dataset 1500 immagini per classe
56% di attribuzioni corrette



=======================================================================

Al posto di creare da zero un modello in Tensorflow per addestrare il riconoscimento di foraminiferi ho provato ad aggiungere le mie classi ad una rete gia' addestrata

Per fare cio' si deve aggiungere il supporto a Tensorflow HUB con

pip install "tensorflow~=2.0" 
pip install "tensorflow-hub[make_image_classifier]~=0.6"
Si lancia quindi il comando

make_image_classifier \
  --image_dir train \
  --tfhub_module https://tfhub.dev/google/tf2-preview/mobilenet_v2/feature_vector/4 \
  --saved_model_dir fora \
  --labels_output_file class_labels.txt \
  --tflite_output_file fora_mobile_model.tflite

Le immagini devono essere conformi al formato di mobilenet quindi devono avere una dimensione di 224x224 pixels

di default vengono selezionate 5 epoche ma si puo' cambiare il valore con lo switch --train_epochs

Ho iniziato con il dataset completo di 1500 immagini per 5 classi ma in modo non prevedibile il processo veniva killato senza preavviso. Si tratta di un problema di memoria cosi' sono sceso a 500 elementi per classe con una ram di 8Gb

Per effettuare l'inferenza (ovvero la previsione del modello su una immagine non contenuta nel training si usa lo script label_image.py

 https://github.com/tensorflow/tensorflow/blob/master/tensorflow/lite/examples/python/label_image.py

python label_image.py -m fora_mobile_model.tflite -l class_labels.txt  -i test/a_globigerina_bulloides.1102.jpg 


I risultati sono leggermente peggiori del precedente post  : 22 corretti e 25 errati (46% corretti 54% errati) ma si nota in maniera netta come il riconoscimento di Globigerinita Glutinata sia totalmente sballato

Corso How Google does Machine Learning

Visto che il precedente corso dava dei crediti su Coursera ho provato il corso offerto da Google




Non avevo mai provato Coursera, anche perche' i corsi interessanti sono costosi. Il livello delle lezioni non e' altissimo ed i test sono piuttosto banali rispetto al corso tenuto direttamente da Google ma c'e' stata la possibilita' di avere sessioni gratuite di utilizzo di Google Cloud...non male

venerdì 27 dicembre 2019

Tensorflow GPU in NVidia Jetson Nano

Uno degli aspetti che piu' mi intrigava nella Jetson Nano era quello di poter creare modelli di reti neurali e non sono di usarli come accede in Intel Neural e Google Cal
La cosa ancora piu' interessante e' quello di poter utilizzare l'accelerazione GPU data dai Cuda core...ma e' tutto oro quello che luccica??




Per partire si inizia dall'installazione di Tensorflow su Jetson Nano. Dato che non si tratta di un processore x86 si deve ricompilare tutto da sorgenti od utilizzare i repository di NVidia
https://docs.nvidia.com/deeplearning/frameworks/install-tf-jetson-platform/index.html

Questa parte e' molto lunga...in particolare durante l'installazione di h5py il computer sembra stallare per oltre 15 minuti...pazienza, pazienza e pazienza

sudo apt-get update
sudo apt-get install libhdf5-serial-dev hdf5-tools libhdf5-dev zlib1g-dev zip libjpeg8-dev

sudo apt-get install python3-pip
sudo pip3 install -U pip testresources setuptools

sudo pip3 install -U numpy==1.16.1 future==0.17.1 mock==3.0.5 h5py==2.9.0 keras_preprocessing==1.0.5 keras_applications==1.0.8 gast==0.2.2 enum34 futures protobuf

sudo pip3 install --pre --extra-index-url https://developer.download.nvidia.com/compute/redist/jp/v43 tensorflow-gpu

La cosa che mi pone qualche sospetto e' la stringa
tensorflow was not compiled for cuda support jetson nano



Tensorflow puo' essere utilizzato all'esterno di un VirtualEnv (anche se e' sempre possibile creare VirtualEnv specialmente nel caso di installazioni multiple di Tensorflow)

In generale se si devono installare delle librerie Python accessorie (tipo SciPy) conviene utilizzare apt al posto di pip 

Una volta lanciato Tensorflow si osserva il carico distribuito sui 4 core


tramite il comando tegrastats si puo' controllare l'hardware

------------------------------------------------------------------------------------
RAM 1264/3964MB (lfb 529x4MB) SWAP 0/10174MB (cached 0MB) IRAM 0/252kB(lfb 252kB) CPU [40%@518,14%@518,16%@518,18%@518] EMC_FREQ 2%@1600 GR3D_FREQ 0%@76 APE 25 PLL@19C CPU@21C PMIC@100C GPU@21C AO@25.5C thermal@21C POM_5V_IN 2301/2301 POM_5V_GPU 80/80 POM_5V_CPU 444/444
RAM 1264/3964MB (lfb 529x4MB) SWAP 0/10174MB (cached 0MB) IRAM 0/252kB(lfb 252kB) CPU [38%@204,10%@204,23%@204,9%@204] EMC_FREQ 3%@1600 GR3D_FREQ 5%@76 APE 25 PLL@19.5C CPU@21.5C PMIC@100C GPU@21C AO@25.5C thermal@21C POM_5V_IN 2143/2222 POM_5V_GPU 40/60 POM_5V_CPU 323/383
RAM 1264/3964MB (lfb 529x4MB) SWAP 0/10174MB (cached 0MB) IRAM 0/252kB(lfb 252kB) CPU [44%@307,7%@307,9%@307,1%@307] EMC_FREQ 3%@1600 GR3D_FREQ 0%@153 APE 25 PLL@19.5C CPU@21C PMIC@100C GPU@21C AO@25.5C thermal@21.25C POM_5V_IN 2103/2182 POM_5V_GPU 40/53 POM_5V_CPU 323/363
RAM 1264/3964MB (lfb 529x4MB) SWAP 0/10174MB (cached 0MB) IRAM 0/252kB(lfb 252kB) CPU [43%@403,7%@403,10%@403,4%@403] EMC_FREQ 2%@1600 GR3D_FREQ 0%@153 APE 25 PLL@19.5C CPU@20.5C PMIC@100C GPU@21C AO@25.5C thermal@20.5C POM_5V_IN 2224/2192 POM_5V_GPU 121/70 POM_5V_CPU 363/363
RAM 1284/3964MB (lfb 527x4MB) SWAP 0/10174MB (cached 0MB) IRAM 0/252kB(lfb 252kB) CPU [45%@1479,21%@1479,53%@1479,22%@1479] EMC_FREQ 2%@1600 GR3D_FREQ 0%@153 APE 25 PLL@19.5C CPU@21.5C PMIC@100C GPU@21C AO@25.5C thermal@21C POM_5V_IN 2853/2324 POM_5V_GPU 40/64 POM_5V_CPU 884/467
RAM 1306/3964MB (lfb 520x4MB) SWAP 0/10174MB (cached 0MB) IRAM 0/252kB(lfb 252kB) CPU [25%@1479,51%@1479,58%@1479,54%@1479] EMC_FREQ 3%@1600 GR3D_FREQ 0%@153 APE 25 PLL@20.5C CPU@22.5C PMIC@100C GPU@21C AO@26C thermal@21.5C POM_5V_IN 3787/2568 POM_5V_GPU 39/60 POM_5V_CPU 1870/701
------------------------------------------------------------------------------------

Da una prova a parita' di rete neurale Jetson Nano ha una velocita' comparabile con un I5 6 gen. quindi la presenza di una GPU non migliora in modo sensibile la velocita' di calcolo come nel caso di GPU legate a schede video (benchmark di riferimento)

martedì 24 dicembre 2019

Primi passi con NVidia Jetson Nano

L'impostazione di base e' stata ridotta al minimo. Il sistema e' basato sulla scheda Jetson Nano, una SD Card da 64 Gb, un dongle USB Wifi Edimax N150, una tastiera Logitech K400 Plus, un alimentatore esterno da 5V 4A



Per il case ho preso questo progetto  https://www.thingiverse.com/thing:3518410
E' piuttosto delicato su alcuni dettagli ma in generale va bene

Il primo problema riguarda l'alimentazione. Visto che non mi fidavo di una alimentazione via USB visti i  consumi della scheda ho utilizzato un alimentatore esterno. Il problema e' che per abilitare l'alimentazione esterna e' necessario chiudere con un Jumper J48...ed il jumper non e' incluso. Sono impazzito a trovare un jumper a giro per casa ed alla fine ho dovuto cannabalizzare un vecchio HD PATA (il jumper serviva a selezionare salve and master). La Jetson ha due modalita' di utilizzo 5W e 10 W (di default e' la seconda)

Da linea di comando si puo' modificare con (0=10W, 1=5W)

$ sudo nvpmodel -m 0 
$ sudo jetson_clocks



Nonostante sia sconsigliato di usare un convertitore da HDMI a DVI io ho lo ho utilizzato con successo per la connessione ad vecchio monitor

Invece mi ha fatto impazzire la Edimax che continuava a disconettersi dall'hotpost. La soluzione e' stata mettere in blacklist il modulo con

echo "blacklist rtl8192cu" | sudo tee -a /etc/modprobe.d/blacklist.conf




Si puo' avere una modalita' headless semplicemente collegando un cavo microUSB e puntando il browser del portatile su 192.168.55.1:8888 e password dlinano

In ogni caso il server SSH e' gia' installato e disponibile (ho collegato un cavo cross con un indirizzo fisso per la rete via cavo per estendere la modalita' headless)

Per provare CUDA Jetson ha gia' tutto installato. Si deve pero' settare la Path e copiare gli esempi nella propria home

export PATH=${PATH}:/usr/local/cuda/bin 
export LD_LIBRARY_PATH=${LD_LIBRARY_PATH}:/usr/local/cuda/lib64

Per gli esempi di CUDA

/usr/local/cuda-10.0/bin/cuda-install-samples-10.0.sh . (attenzione al punto finale)

ATTENZIONE : operazione lenta in compilazione

Jetson Nano 4 Giga di Ram e puo' essere poca per reti neurali impegnativi. Si puo' aumentare usando uno swap file

$ sudo fallocate -l 8G /mnt/4GB.swap 
$ sudo mkswap /mnt/4GB.swap 
$ sudo swapon /mnt/4GB.swap

e modificando il file /etc/fstab aggiungendo

/mnt/4GB.swap none swap sw 0 0

Ultima cosa: di default l'uscita audio e' impostata su Analogico e non su HDMI.

link utile
https://github.com/jkjung-avt/jetson_nano.git

Debugger integrato ESP32S3

Aggiornamento In realta' il Jtag USB funziona anche sui moduli cinesi Il problema risiede  nell'ID USB della porta Jtag. Nel modulo...