mercoledì 15 gennaio 2020

Docker tensorflow ottimizzato per Intel

Usando la versione standard di Tensorflow distribuita da Google si nota il messaggio "Your CPU supports instructions that this Tensorflow binary was not compiled to use: AVX2 FMA"

Questo perche' la versione distribuita e' compilata per funzionare su un ampio spettro di calcolatori

La soluzione per avere una versione ottimizzata per tutte le istruzioni della CPU e' quella di compilare da sorgenti Tensorflow oppure di utilizzare dei container docker che gia' hanno il codice compilato ottimizzato. In questo senso vengono utili i container prodotti da Intel con il supporto MKL (Math Kernel for Deep Neural Network)

Vi sono versioni con Python 2.7
docker run -it -p 8888:8888 intelaipg/intel-optimized-tensorflow

e Python 3.6
docker run -it -p 8888:8888 intelaipg/intel-optimized-tensorflow:2.0.0-mkl-py3




Per modificare in modo permanente il container con le librerie di normale uso si lancia

docker run -it intelaipg/intel-optimized-tensorflow:2.0.0-mkl-py3 /bin/bash 

e con pip si installano normalmente le librerie Python (per esempio Pandas, Matplotlib...)
al termine si fa exit e con 

docker ps -a 

si copia l'ID del container modificato. A questo punto con commit si modifica in modo definitivo il container

docker commit Docker_ID intelaipg/intel-optimized-tensorflow:2.0.0-mkl-py3





lunedì 13 gennaio 2020

Videoscrittura o computer

Frugando tra dei libri destinati al cestino ho trovato questo libro del 1984 "Scrivere con il computer" in cui l'autore ci guida alla domanda se sia meglio un sistema di video scrittura, come la serie Olivetti ETV,  oppure un PC con Wordstar


Fa strano pensarlo ai giorni nostri ma ricordo che ai tempi del liceo (tipo 1987-1988) il professore di filosofia aveva acquistato un sistema di video scrittura mentre il professore di italiano usava un Olivetti M15 

giovedì 9 gennaio 2020

Foraminiferi Tensorflow : train vs retrain model con Tensorflow

Continua la mia battaglia personale con le reti neurali per il riconoscimento di foraminiferi.
Attualmente le strade percorse sono state due: la prima prevede di scrivere ed addestrare da zero una rete neurale CNN mentre la seconda prevede il retraining di reti gia' addestrate (nello specifico mobilenet v2 ed inception v3)

Quali sono i risultati migliori??
In entrambi i casi le corrette previsioni del modello si e' aggirato intorno al 60 % (quindi poco performante ma l'oggetto di studio e' di per se difficile anche per un umano)

Retrain Inception v3
La reale differenze e' che il modello con retrain ha la tendenza di indovinare o sbagliare completamente le previsioni mentre con la rete addestrata da zero la distribuzione di successi /insuccessi e' molto piu' distribuita

CNN Trained

Predizione classificazione immagini con Tensorflow da modelli .h5

In un esempio precedente avevo usato il modello .tflite per fare predizione di classificazione immagine.

Il modello e' stato creato da un train di Inception

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

import os
os.environ['TF_CPP_MIN_LOG_LEVEL'] = '3'

import sys

import tensorflow as tf

import tensorflow_hub as hub

from keras.models import load_model

model = tf.keras.models.load_model('incept.h5', custom_objects={'KerasLayer':hub.KerasLayer})
#print(model.get_config())
from keras.preprocessing import image
img = image.load_img(sys.argv[1])# , target_size=(299,299,3))
img  = image.img_to_array(img)
img  = img.reshape((1,) + img.shape)
img  = img/255
build_input_shape = img.reshape(-1,299,299,3)
#print (build_input_shape)
img_class=model.predict_classes(img) 
print (sys.argv[1])
print(img_class) 

mercoledì 8 gennaio 2020

Conversione da formato .pd (saved_model) a tflite

Un file in formato .pb racchiude al suo interno un modello completo di grafo con calcoli e pesi e puo' essere utilizzato direttamente per il serving

Tflite e' invece il formato di TensorFlow Lite ed e' caratterizzato da ridotte dimesioni mediante model quantization e model pruning

Per passare da .pb a .tflite (il contrario non si puo' fare) si possono usare i programmi toco e tflite_converter (il file risultante e' equivalente)


toco --saved_model_dir ./fora --output_file test.tflite
tflite_convert -output_file = model.tflite --saved_model_dir = my_dir 


Nella conversione, a seconda del livello di ottimizzazione, il modello tflite puo' performare in modo uguale od inferiore al modello completo

Esempio Retraining an image classifier

Ho trovato un esempio completo per il retraining di un classificatore di immagini a questo link

https://colab.research.google.com/github/tensorflow/hub/blob/master/examples/colab/tf2_image_retraining.ipynb

Si tratta di un Jupyter Notebook in cui si puo' attivare data augmentation e fine tuning e si puo' scegliere tra MobileNet v2 e Inception v3. I dati presentano gia' uno split con il 20% destinato alla validazione e shuffle del training, shuffle sul training, dropout

Girando su Colab si ha a disposizione una istanza con 12 Gb di Ram ed una GPU da 16 Gb di ram.
Il modello viene salvato nel formato .pb ma puo' essere convertito in formato .tflite con una verifica di quanto si perda in prestazioni utilizzando il formato di TensorFlow Lite

per attivare ogni singola cella di codice si usa CTRL+Enter



il file puo' essere visualizzato, una volta scaricato dal proprio GDrive, con il comando

saved_model_cli show --dir fora2/ --all

----------------------------------------------------------------------------
MetaGraphDef with tag-set: 'serve' contains the following SignatureDefs:

signature_def['__saved_model_init_op']:
  The given SavedModel SignatureDef contains the following input(s):
  The given SavedModel SignatureDef contains the following output(s):
    outputs['__saved_model_init_op'] tensor_info:
        dtype: DT_INVALID
        shape: unknown_rank
        name: NoOp
  Method name is: 

signature_def['serving_default']:
  The given SavedModel SignatureDef contains the following input(s):
    inputs['input_1'] tensor_info:
        dtype: DT_FLOAT
        shape: (-1, 224, 224, 3)
        name: serving_default_input_1:0
  The given SavedModel SignatureDef contains the following output(s):
    outputs['output_1'] tensor_info:
        dtype: DT_FLOAT
        shape: (-1, 5)
        name: StatefulPartitionedCall:0
  Method name is: tensorflow/serving/predict



Art and Science of Machine Learning





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...