{"id":2517,"date":"2021-02-04T12:49:38","date_gmt":"2021-02-04T11:49:38","guid":{"rendered":"https:\/\/blog.besharp.it\/?p=2517"},"modified":"2021-03-17T15:33:44","modified_gmt":"2021-03-17T14:33:44","slug":"deploy-di-una-pipeline-di-real-time-data-ingestion-e-analytics-con-aws-iot-core-amazon-kinesis-e-amazon-sagemaker","status":"publish","type":"post","link":"https:\/\/blog.besharp.it\/it\/deploy-di-una-pipeline-di-real-time-data-ingestion-e-analytics-con-aws-iot-core-amazon-kinesis-e-amazon-sagemaker\/","title":{"rendered":"Deploy di una pipeline di real-time Data Ingestion e Analytics con AWS IoT Core, Amazon Kinesis e Amazon SageMaker"},"content":{"rendered":"\n

Introduzione<\/h2>\n\n\n\n

Il Machine Learning sta rapidamente entrando a far parte della nostra vita quotidiana. Sempre pi\u00f9 software e dispositivi sono oggi in grado di connettersi ad internet e di gestire autonomamente routine e attivit\u00e0 di tutti i giorni senza l’intervento umano. Si pensi ad esempio alla domotica, alle luci e ai riscaldamenti smart <\/em>o ai robot che puliscono i pavimenti in autonomia senza difficolt\u00e0 alcuna anche in ambienti domestici complessi pieni di ostacoli.<\/p>\n\n\n\n

In questo contesto, le informazioni che possiamo raccogliere dai dispositivi connessi sono infinite. Il costo contenuto di acquisizione del dato e della potenza di calcolo necessaria ad elaborare grandi quantit\u00e0 di informazioni hanno reso accessibile l\u2019applicazione del Machine Learning ai pi\u00f9 diversi casi d\u2019uso. Uno dei pi\u00f9 interessanti riguarda sicuramente l\u2019ingestion e l\u2019analisi real-time dei dati provenienti da dispositivi connessi.<\/p>\n\n\n\n

In questo articolo, descriveremo una soluzione basata sui servizi gestiti di AWS per l\u2019elaborazione in tempo reale di elevati volumi di dati provenienti da uno o pi\u00f9 dispositivi connessi IoT e mostreremo come realizzare una pipeline completa di real-time Data Ingestion e Analytics. <\/p>\n\n\n\n

Esploreremo alcuni concetti chiave relativi all’apprendimento automatico, all\u2019ETL, alla pulizia dei dati e alla preparazione del data lake.<\/p>\n\n\n\n

Prima di passare alla progettazione del codice e dell’infrastruttura, per\u00f2, facciamo un breve riepilogo su alcuni concetti chiave relativi a Machine Learning, ETL, pulizia e preparazione dei dati, creazione dei data lake ed IoT. Partiamo!<\/p>\n\n\n\n

IoT, Machine Learning e Data Transformation: concetti chiave<\/h2>\n\n\n\n

IoT<\/h3>\n\n\n\n

Internet of Things (IoT) \u00e8 la definizione utilizzata per descrivere un insieme di dispositivi fisici  – “things” – interconnessi e dotati di sensori in grado di inviare dati e scambiare informazioni via internet.<\/p>\n\n\n\n

 L’IoT si \u00e8 evoluto rapidamente grazie alla diminuzione dei costi dei sensori intelligenti e alla diffusione di metodologie come analisi in tempo reale, apprendimento automatico e sistemi integrati.<\/p>\n\n\n\n

Naturalmente, anche i settori tradizionali dei sistemi embedded, delle reti di sensori wireless, dei sistemi di controllo e dell’automazione contribuiscono al mondo dell’IoT.<\/p>\n\n\n\n

Machine Learning<\/h3>\n\n\n\n

Il Machine Learning \u00e8 nato come un\u2019evoluzione dell’intelligenza artificiale<\/strong>. Il Machine Learning tradizionale richiede ai programmatori di scrivere euristiche complesse e difficili da mantenere per eseguire un compito tradizionalmente umano (ad esempio il riconoscimento del testo nelle immagini) utilizzando un computer.<\/p>\n\n\n\n

Grazie al ML, \u00e8 il sistema stesso che impara le relazioni tra i dati.<\/p>\n\n\n\n

Per esempio, in un\u2019ipotetica partita di scacchi, baster\u00e0 fornire un set di dati di caratteristiche riguardanti le partite di scacchi e il modello imparer\u00e0 a giocare da solo. 
Tutto ci\u00f2 acquista ancora pi\u00f9 rilevanza se lo si pensa in un contesto distribuito<\/strong> dove la previsione dovr\u00e0 scalare<\/strong>.<\/p>\n\n\n\n

Data Transformation<\/h3>\n\n\n\n

In una pipeline di Machine Learning, i dati devono essere uniformi, ovvero standardizzati. Le differenze nei dati possono derivare dalla loro provenienza da fonti eterogenee, da \u201cdatabase schema\u201d differenti o flussi di importazione dei dati diversi.<\/p>\n\n\n\n

La trasformazione dei dati o flusso di ETL (Estrazione, Trasformazione, Caricamento) \u00e8 quindi un passaggio essenziale in tutte le pipeline di ML. I dati standardizzati non sono solo essenziali nell’addestramento del modello di ML, ma sono anche molto pi\u00f9 facili da analizzare e visualizzare nella fase preliminare di data discovery<\/strong>.<\/p>\n\n\n\n

Per le attivit\u00e0 di pulizia e formattazione del dato sono generalmente utilizzate librerie come Scipy Pandas o simili.<\/p>\n\n\n\n

NumPy<\/strong>: <\/em>libreria utilizzata per la gestione di array multidimensionali. Generalmente utilizzata per le fasi di import e lettura di un dataset.<\/p>\n\n\n\n

Pandas<\/strong> Dataframe<\/strong>: libreria utilizzata per la gestione di dati in formato tabulare. Colleziona data point da file di tipo CSV<\/strong>, JSON<\/strong>, Excel<\/strong>, e pickle <\/strong>e li trasforma in tabelle.<\/p>\n\n\n\n

SciKit-Learn<\/strong>: libreria utilizzata per la manipolazione e il training finale dei dati.<\/p>\n\n\n\n

Pulire e formattare i dati \u00e8 essenziale per ottenere un modello performante in grado di convergere <\/strong>alla soluzione che si vuole ottenere.<\/p>\n\n\n\n

La Pipeline<\/h2>\n\n\n\n

Per la soluzione che andremo a realizzare faremo largo uso dei servizi gestiti messi a disposizione da AWS. Ecco un semplice schema infrastrutturale raffigurante gli attori principali nella nostra Pipeline di ML:<\/p>\n\n\n\n

\"La<\/figure>\n\n\n\n

Entriamo nel merito di ciascun servizio. <\/p>\n\n\n\n

La pipeline sar\u00e0 organizzata in 5 fasi principali:  ingestion<\/strong>, preparazione del data lake<\/strong>, trasformazione<\/strong>, training<\/strong> e inferenza<\/strong>.
Per la fase di ingestion<\/strong>, i dati saranno raccolti dai dispositivi connessi utilizzando AWS IoT Core<\/strong>, un servizio che permette di connettere i dispositivi ad AWS senza dover gestire server o complessit\u00e0 di comunicazione<\/a>. I dati collezionati saranno poi inviati utilizzando il protocollo MQTT<\/a> per minimizzare il code da scrivere e la banda richiesta. Con IoT Core \u00e8 possibile anche gestire l\u2019autenticazione dei device<\/strong>.<\/p>\n\n\n\n

\"AWS
AWS IoT Core – Per concessione di AWS<\/em><\/figcaption><\/figure>\n\n\n\n

Per mandare le informazioni al nostro data lake su Amazon S3, utilizzeremo Amazon Kinesis Data Firehose<\/a> e la feature che permette la lettura di messaggi IoT Core.<\/p>\n\n\n\n

Per trasformare i dati e renderli disponibili per Amazon SageMaker, utilizzeremo invece AWS Glue<\/a>, il servizio di ETL managed in grado di trovare, preparare e combinare tra di loro i dati, per l\u2019analisi, il machine learning e il deploy dell\u2019applicativo. Mettendo a disposizione tutti questi strumenti, esso permette di analizzare grandi moli di dati in pochi minuti, anzich\u00e9 in mesi.
Infine, vedremo come utilizzare gli algoritmi di Amazon SageMaker, in particolare DeepAR,<\/strong> per \u201cistruire\u201d e deployare il modello per l\u2019inferenza.<\/p>\n\n\n\n

Ingestion: da IoT Core a Kinesis Firehose<\/h2>\n\n\n\n

\u00c8 il momento di connettere i nostri dispositivi di test attraverso le feature di AWS IoT Core.<\/p>\n\n\n\n

AWS IoT Core<\/h3>\n\n\n\n

Accediamo al nostro account AWS ed entriamo nella pagina del servizio. Clicchiamo su \u201cGet started\u201d e poi procediamo con \u201cOnboard a device\u201d.<\/p>\n\n\n\n

\"Ingestion:
Connettere un nuovo dispositivo<\/em><\/figcaption><\/figure>\n\n\n\n

Seguiamo i passaggi descritti nel wizard per connettere i dispositivi. <\/p>\n\n\n\n

Gli obiettivi di questa fase sono:<\/p>\n\n\n\n

  1. Creare un AWS IoT Thing<\/strong><\/li>
  2. Scaricare il codice richiesto direttamente sul nostro dispositivo per permettere la connessione con AWS.<\/li><\/ol>\n\n\n\n

    Stabilire una connessione con AWS \u00e8 importante anche per permettere a Kinesis Firehose di leggere i messaggi mandati da AWS IoT Core. Ricordiamo che il dispositivo che stiamo connettendo necessiter\u00e0 di una connessione TCP pubblica sulla porta 8883.<\/p>\n\n\n\n

    Dal wizard, selezioniamo Linux come sistema operativo e un SDK (nel nostro caso Node.js):<\/p>\n\n\n\n

    \"Platform<\/figure>\n\n\n\n

    A questo punto, diamo un nome al nostro dispositivo e otteniamo il nostro kit di connessione contenente:<\/p>\n\n\n\n