{"id":154,"date":"2023-12-27T17:03:05","date_gmt":"2023-12-27T17:03:05","guid":{"rendered":"https:\/\/atled.it\/atled\/?p=154"},"modified":"2023-12-27T17:03:05","modified_gmt":"2023-12-27T17:03:05","slug":"lintelligenza-artificiale-dalla-workstation-ai-dispositivi-edge","status":"publish","type":"post","link":"https:\/\/atled.it\/atled\/lintelligenza-artificiale-dalla-workstation-ai-dispositivi-edge\/","title":{"rendered":"L&#8217;AI dalla workstation ai dispositivi edge: come trasformare il tuo modello Pytorch o Tensorflow in TFLite"},"content":{"rendered":"<p class=\"wp-block-paragraph \"><br>In questo articolo vengono definite le peculiarit&agrave; dell&#8217;utilizzo dell&#8217;Intelligenza artificiale su dispositivi edge, come sistemi di Internet of Things (IoT) o dispostivi mobile, e di come trasformare il proprio modello allenato su workstation con Pytorch o Tensorflow in Tensorflo Lite, la pi&ugrave; famosa libreria mobile per la distribuzione di modelli su dispositivi mobili, microcontrollori e altri dispositivi edge.<\/p>\n\n\n\n<figure class=\"wp-block-image aligncenter size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"626\" height=\"352\" src=\"https:\/\/atled.it\/atled\/wp-content\/uploads\/2023\/07\/learn-lite-hero.png\" alt=\"\" class=\"wp-image-162\" srcset=\"https:\/\/atled.it\/atled\/wp-content\/uploads\/2023\/07\/learn-lite-hero.png 626w, https:\/\/atled.it\/atled\/wp-content\/uploads\/2023\/07\/learn-lite-hero-300x169.png 300w, https:\/\/atled.it\/atled\/wp-content\/uploads\/2023\/07\/learn-lite-hero-18x10.png 18w\" sizes=\"(max-width: 626px) 100vw, 626px\" \/><\/figure>\n\n\n<p class=\"wp-block-paragraph aligncenter has-text-align-center aligncenter\">Immagine da: <a rel=\"noreferrer noopener\" href=\"https:\/\/www.tensorflow.org\/lite?hl=it\" target=\"_blank\">Tensorflow: for Mobile &amp; Edge<\/a><\/p>\n\n\n<h4 class=\"wp-block-heading wp-block-heading\" id=\"lintelligenza-artificiale-sui-dispositive-edge\">L&#8217;intelligenza artificiale sui dispositive edge<\/h4>\n\n\n<p class=\"wp-block-paragraph \">L&#8217;IA sui dispositivi edge, nota anche come &#8220;AI on edge computing&#8221; o &#8220;Edge AI&#8221;, &egrave; un paradigma di elaborazione dati che prevede l&#8217;esecuzione di algoritmi di intelligenza artificiale direttamente sui dispositivi o sui nodi di rete periferici, piuttosto che trasmettere i dati a server remoti o al cloud per l&#8217;elaborazione. In altre parole, mentre tradizionalmente l&#8217;elaborazione dei dati e l&#8217;apprendimento automatico richiedevano l&#8217;invio dei dati a server potenti e centralizzati, con l&#8217;IA sul bordo, queste operazioni avvengono localmente, pi&ugrave; vicino alla fonte dei dati. Ci&ograve; significa che i dispositivi intelligenti, come telefoni cellulari, telecamere, veicoli, sensori IoT e persino alcuni elettrodomestici, possono eseguire analisi complesse e prendere decisioni autonome senza dipendere totalmente da connessioni di rete stabili e godendo di una miglior gestione della privacy e sicurezza dei dati.<\/p>\n\n\n<p class=\"wp-block-paragraph \">Ma come devono modificarsi ed adattarsi i modelli di Deeplearning che alleniamo per poter funzionare in questo paradigma ? <\/p>\n\n\n<h5 class=\"wp-block-heading wp-block-heading\" id=\"le-caratteristich-di-un-modello-di-deep-learning-per-effettuare-inferenze-on-edge-sono-le-seguenti\">Le caratteristich di un modello di Deep Learning per effettuare inferenze on Edge sono le seguenti:<\/h5>\n\n\n<ol style=\"\" class=\"wp-block-list \">\n<li>\n<strong>Consumo ottimale di energia<\/strong>: Il consumo energetico ottimale &egrave; essenziale per i dispositivi Edge, specialmente quando non sono sempre collegati a una fonte di alimentazione considerato che solitamnte i modelli di DL sono dispondiosi.<\/li>\n\n\n\n<li>\n<strong>Leggerezza<\/strong>: I dispositivi Edge hanno risorse limitate in termini di spazio di archiviazione e capacit&agrave; di calcolo. Pertanto, i modelli di deep learning che vengono implementati su questi dispositivi devono essere leggeri, con dimensioni binarie ridotte.<\/li>\n\n\n\n<li>\n<strong>Multipiattaforma e linguaggio:<\/strong> dispositivi Edge possono essere basati su diverse piattaforme hardware e sistemi operativi. Pertanto, &egrave; importante sviluppare modelli di DL che siano multipiattaforma e compatibili con una variet&agrave; di dispositivi, ambienti e linguaggi di integrazione<\/li>\n<\/ol>\n\n\n<p id=\"3176\" class=\"wp-block-paragraph \">Una delle soluzioni pi&ugrave; utilizzate per soddisfare queste caratteristiche &egrave; TensorFlow Lite. TensorFlow Lite &egrave; una versione ottimizzata per dispositivi mobili e Edge del rinomato framework di deep learning TensorFlow.<\/p>\n\n\n<h4 class=\"wp-block-heading wp-block-heading\" id=\"tensorflow-lite\">Tensorflow Lite<\/h4>\n\n\n<p class=\"wp-block-paragraph \">TensorFlow Lite &egrave; una libreria mobile per la distribuzione di modelli su dispositivi mobili, microcontrollori e altri dispositivi edge. TFLite deriva dal del rinomato framework di deep learning TensorFlow ed &egrave; disponibile per Android, iOS, macOS, Linux e Windows supportando vari linguaggi di programmazione (Python, C, Java, Go e Rust).<\/p>\n\n\n<p class=\"wp-block-paragraph \">Per scoprire di pi&ugrave; su Tensorflow Lite: <a rel=\"noreferrer noopener\" href=\"https:\/\/www.tensorflow.org\/lite\" target=\"_blank\">TFLite<\/a>.<\/p>\n\n\n<h4 class=\"wp-block-heading wp-block-heading\" id=\"come-convertire-il-tuo-modello-in-tflite\"> Come convertire il tuo modello in TFLite<\/h4>\n\n\n<p class=\"wp-block-paragraph \">Individuati i vantaggi dell&#8217;utilizzo di Tensorflow Lite non resta che capire come trasformare il nostro modello, sia se implementato con Tensorflow (e Keras) che con Pytorch. Nei prossimi sottocapitoli viene perci&ograve; presentata un step by step tutorial per entrambi i casi.<\/p>\n\n\n<h5 class=\"wp-block-heading wp-block-heading\" id=\"come-passare-da-tensorflow-o-keras-a-tflite\">Come passare da Tensorflow o Keras a TFLite<\/h5>\n\n\n<p class=\"wp-block-paragraph \">La conversione partendo da un modello allenato nel framework di Tensorflow risulta molto semplice e immediata grazie all&#8217;API<strong> <\/strong><a rel=\"noreferrer noopener\" href=\"https:\/\/www.tensorflow.org\/lite\/api_docs\/python\/tf\/lite\/TFLiteConverter#experimental_from_jax\" target=\"_blank\"><code>TFLiteConverter<\/code><\/a>. Questa API convertir&agrave; il modello partendo da uno dei seugenti input: <\/p>\n\n\n<ul style=\"\" class=\"wp-block-list \">\n<li>Modello Tansorflow salvato (consigliato): un modello TensorFlow salvato su disco.<\/li>\n\n\n\n<li>Modello Keras: un modello creato utilizzando l&#8217;API di alto livello Keras.<\/li>\n\n\n\n<li>Formato Keras H5: un&#8217;alternativa leggera al formato SavedModel supportato dall&#8217;API di Keras.<\/li>\n\n\n\n<li>Modelli creati da funzioni concrete: un modello creato utilizzando l&#8217;API di basso livello di TensorFlow.<\/li>\n<\/ul>\n\n\n<p class=\"wp-block-paragraph \">Il convertitore accetta ha principlamente 3 opzioni che personalizzano la conversione per il modello:<\/p>\n\n\n<ul style=\"\" class=\"wp-block-list \">\n<li>\n<a href=\"https:\/\/www.tensorflow.org\/lite\/guide\/ops_compatibility\" target=\"_blank\" rel=\"noreferrer noopener\">Compatibility flags<\/a>: consentono di specificare se la conversione deve consentire operatori personalizzati.<\/li>\n\n\n\n<li>\n<a href=\"https:\/\/www.tensorflow.org\/lite\/performance\/model_optimization\" target=\"_blank\" rel=\"noreferrer noopener\">Optimization flags<\/a>: che consentono di specificare il tipo di ottimizzazione da applicare durante la conversione. La tecnica di ottimizzazione pi&ugrave; comunemente utilizzata &egrave; la quanitizzazione post-training.<\/li>\n\n\n\n<li>\n<a rel=\"noreferrer noopener\" href=\"https:\/\/www.tensorflow.org\/lite\/models\/convert\/metadata\" target=\"_blank\">Metadata flags<\/a>: consentono di aggiungere metadati al modello convertito, facilitando la creazione di codice wrapper specifico per la piattaforma quando si distribuiscono i modelli sui dispositivi.<\/li>\n<\/ul>\n\n\n<p class=\"wp-block-paragraph \">Esempio pratico utilizzando API Python.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code># Converting a SavedModel to a TensorFlow Lite model.\n\nimport tensorflow as tf\n\nmodel_name = \"MyFirstTFLite\"\n\nconverter = tf.lite.TFLiteConverter.from_saved_model(saved_model_dir)\nconverter.target_spec.supported_ops = \n  tf.lite.OpsSet.TFLITE_BUILTINS, # enable TensorFlow Lite ops\n  tf.lite.OpsSet.SELECT_TF_OPS # enable TensorFlow ops.\n]\ntflite_model = converter.convert()\n\n# Save the TFLite model\nwith open(\"\/path\/to\/save\/model\/\"+ model_name +\".tflite\", \"wb\") as f:\n  f.write(tflite_model)<\/code><\/pre>\n\n\n<h5 class=\"wp-block-heading wp-block-heading\" id=\"come-passare-da-pytorch-a-tflite\">Come passare da Pytorch a TFLite<\/h5>\n\n\n<p class=\"wp-block-paragraph \">Nel panorama attuale, PyTorch ha guadagnato una notevole popolarit&agrave; in molti settori, superando l&#8217;uso di TensorFlow in diverse applicazioni. Pertanto, &egrave; fondamentale comprendere come effettuare la transizione dai pesi di PyTorch a TensorFlow Lite (TFLite). Questo passaggio, tuttavia, non &egrave; cos&igrave; immediato come la conversione diretta da TensorFlow a TFLite, inffati, richiede un passaggio intermedio attraverso ONNX, un formato di scambio di modelli neutro rispetto alla piattaforma.<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"839\" src=\"https:\/\/atled.it\/atled\/wp-content\/uploads\/2023\/09\/2023-09-28_11-57-1024x839.png\" alt=\"\" class=\"wp-image-397\" srcset=\"https:\/\/atled.it\/atled\/wp-content\/uploads\/2023\/09\/2023-09-28_11-57-1024x839.png 1024w, https:\/\/atled.it\/atled\/wp-content\/uploads\/2023\/09\/2023-09-28_11-57-300x246.png 300w, https:\/\/atled.it\/atled\/wp-content\/uploads\/2023\/09\/2023-09-28_11-57-768x629.png 768w, https:\/\/atled.it\/atled\/wp-content\/uploads\/2023\/09\/2023-09-28_11-57-15x12.png 15w, https:\/\/atled.it\/atled\/wp-content\/uploads\/2023\/09\/2023-09-28_11-57.png 1067w\" sizes=\"(max-width: 1024px) 100vw, 1024px\" \/><\/figure>\n\n\n<p class=\"wp-block-paragraph \">ONNX funge peci&ograve; da ponte tra PyTorch e TFLite, consentendo la conversione agevole dei modelli. Prima di poter adattare il tuo modello a TFLite, sar&agrave; necessario trasformare il modello PyTorch in un formato compatibile con ONNX. Una volta completata questa fase, potrai procedere alla successiva trasformazione da ONNX a TFLite.<\/p>\n\n\n<p class=\"wp-block-paragraph \">I passaggi chiave per fare questa operazione sono:<\/p>\n\n\n<ol style=\"\" class=\"wp-block-list \">\n<li>Carica il modello PyTorch pre-addestrato utilizzando torch.load.<\/li>\n\n\n\n<li>Esporta il modello PyTorch nel formato ONNX utilizzando torch.onnx.export. Nota che &egrave; necessario fornire un tensore di input fittizio alla funzione di esportazione per specificare la forma dell&#8217;input del modello.<\/li>\n\n\n\n<li>Utilizza ONNX-TensorFlow per convertire il modello ONNX nel formato TensorFlow. ONNX-TensorFlow &egrave; un pacchetto Python che converte i modelli ONNX in grafi TensorFlow, e fornisce una funzione di preparazione che prende un modello ONNX in input e restituisce un grafo TensorFlow.<\/li>\n\n\n\n<li>Utilizza il Convertitore TensorFlow Lite per convertire il modello TensorFlow nel formato TensorFlow Lite, e salva il modello risultante in un file utilizzando le funzioni open e write<\/li>\n<\/ol>\n\n\n<h5 class=\"wp-block-heading wp-block-heading\" id=\"trasformare-il-modello-pytorch-in-onnx\">Trasformare il modello Pytorch in ONNX<\/h5>\n\n\n<p class=\"wp-block-paragraph \">Installa i pachetti necesari.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>!pip3 install onnx\n!pip3 install onnx_tf\n<\/code><\/pre>\n\n\n<p class=\"wp-block-paragraph \">In qusto articolo viene riportato un banale esempio basato su una MobilNetv2 che prendendo in input un&#8217;immagine resitituisce in outuput un valore. Il processo &egrave; facilmente estendibile a tutti gli altri tipi di architetture.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>from torchvision import models\nfrom torch import nn\nimport torch\nimport random\n\n#Definizione del modello\nmodel = models.mobilenet_v2()\n\nnum_ftrs = model.classifier&#91;1].in_features\nmodel.classifier = nn.Sequential(\n    nn.Linear(num_ftrs, 1, bias=True), nn.Sigmoid())\n\n# Caricamento dei pesi del modello\nmodel.load_state_dict(torch.load(\"\/path\/pesiPTH\", map_location=torch.device('cpu')))\n\n# Impostazione del modello in modalit\u00e0 di evaluation\nmodel.eval()\n\n# Creazione di un dummy input\ndummy_input = torch.randn(1,3,300,300)\n\n#Esportazione del modello in ONNX\n\ntorch.onnx.export(model, dummy_input, \"\/path\/onnxModel\", operator_export_type=torch.onnx.OperatorExportTypes.ONNX_ATEN_FALLBACK, verbose=True, input_names=&#91;'input'], output_names=&#91;'output']) #opset_version=12)<\/code><\/pre>\n\n\n<h5 class=\"wp-block-heading wp-block-heading\" id=\"trasformazione-da-onnx-a-tensorflow\">Trasformazione da ONNX a Tensorflow<\/h5>\n\n\n\n<pre class=\"wp-block-code\"><code>from onnx_tf.backend import prepare\nimport onnx\n\n# I modelli TensorFlow vengono generalmente salvati in file con estensione \".h5\" o \".pb\" su disco.\nTF_PATH = \"\/path\/converted.pb\" \n\n# Il percorso al tuo modello ONNX esistente dipende da dove lo hai salvato sul tuo sistema. \nONNX_PATH = \"\/path\/onnxModel\" \n\n # Caricamento del modello ONNX\nonnx_model = onnx.load(ONNX_PATH) \n\n# Creazione di un oggetto TensorflowRep\ntf_rep = prepare(onnx_model)\n\n# Esportazione del modello TF\ntf_rep.export_graph(TF_PATH)<\/code><\/pre>\n\n\n<h5 class=\"wp-block-heading wp-block-heading\" id=\"conversione-da-tensorflow-a-tensorflow-lite\">Conversione da Tensorflow a Tensorflow Lite<\/h5>\n\n\n\n<pre class=\"wp-block-code\"><code># Conversione del modello da TF a TFLite\nimport tensorflow as tf\nconverter = tf.lite.TFLiteConverter.from_saved_model(TF_PATH) # path to the SavedModel directory\nconverter.target_spec.supported_ops = &#91;\n  tf.lite.OpsSet.TFLITE_BUILTINS, # enable TensorFlow Lite ops.\n  tf.lite.OpsSet.SELECT_TF_OPS # enable TensorFlow ops.\n]\ntflite_model = converter.convert()\n\n# Salvataggio del modello\nwith open(\"path\/salvataggio\/\"+ model_name +\".tflite\", \"wb\") as f:\n  f.write(tflite_model)<\/code><\/pre>\n\n\n<h4 class=\"wp-block-heading wp-block-heading\" id=\"conclusioni\">Conclusioni<\/h4>\n\n\n<p class=\"wp-block-paragraph \"><br>In conclusione, abbiamo esplorato con successo le possibilit&agrave; offerte da TensorFlow Lite nell&#8217;implementare l&#8217;intelligenza artificiale on edge. Attraverso una dettagliata analisi delle caratteristiche di TFLite, abbiamo compreso come questo strumento si dimostri cruciale nel portare modelli di machine learning direttamente sui dispositivi. Inoltre, abbiamo fornito una guida pratica su come convertire modelli da TensorFlow e PyTorch a TensorFlow Lite, aprendo cos&igrave; la porta a un&#8217;ampia gamma di applicazioni edge-based. Grazie a TFLite, siamo in grado di sfruttare appieno il potenziale dell&#8217;edge computing, consentendo ai nostri dispositivi di prendere decisioni intelligenti in tempo reale, senza la necessit&agrave; di connessioni costanti alla cloud. Questo rappresenta un passo significativo verso un futuro in cui l&#8217;intelligenza artificiale sar&agrave; onnipresente, integrata nei nostri dispositivi quotidiani per migliorare le nostre vite in modi nuovi e innovativi.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>In questo articolo vengono definite le peculiarit&agrave; dell&#8217;utilizzo dell&#8217;Intelligenza artificiale su dispositivi edge, come sistemi di Internet of Things (IoT) o dispostivi mobile, e di come trasformare il proprio modello allenato su workstation con Pytorch o Tensorflow in Tensorflo Lite, la pi&ugrave; famosa libreria mobile per la distribuzione di modelli su dispositivi mobili, microcontrollori e &hellip;<\/p>\n","protected":false},"author":3,"featured_media":173,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[8,6],"tags":[],"_links":{"self":[{"href":"https:\/\/atled.it\/atled\/wp-json\/wp\/v2\/posts\/154"}],"collection":[{"href":"https:\/\/atled.it\/atled\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/atled.it\/atled\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/atled.it\/atled\/wp-json\/wp\/v2\/users\/3"}],"replies":[{"embeddable":true,"href":"https:\/\/atled.it\/atled\/wp-json\/wp\/v2\/comments?post=154"}],"version-history":[{"count":32,"href":"https:\/\/atled.it\/atled\/wp-json\/wp\/v2\/posts\/154\/revisions"}],"predecessor-version":[{"id":422,"href":"https:\/\/atled.it\/atled\/wp-json\/wp\/v2\/posts\/154\/revisions\/422"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/atled.it\/atled\/wp-json\/wp\/v2\/media\/173"}],"wp:attachment":[{"href":"https:\/\/atled.it\/atled\/wp-json\/wp\/v2\/media?parent=154"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/atled.it\/atled\/wp-json\/wp\/v2\/categories?post=154"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/atled.it\/atled\/wp-json\/wp\/v2\/tags?post=154"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}