Intelligenza distribuita: scopriamo l’edge processing con il nostro Raspberry Pi

Il paradigma del cloud computing ha permesso a chiunque di ottenere risorse computazionali praticamente illimitate in termini sia di memoria, sia di capacità di elaborazione. Questo ha contribuito a creare un ecosistema di applicazioni e servizi "smart" che apprendono e modificano i loro comportamenti in maniera autonoma ed "intelligente", ovvero contestuale all'ambiente nel quale si trovano. Tuttavia, la progressiva e pervasiva diffusione di dispositivi a basso costo e di piccole dimensioni, ma comunque dotati di discrete capacità di elaborazione, ha permesso di "spostare" il focus dell'intelligenza dai grossi data center, tipici degli esordi dell'era del cloud, ai cosiddetti dispositivi di "frontiera", tradizionalmente più vicini alle sorgenti dati, ed un tempo utilizzati come semplici nodi per l'acquisizione e l'indirizzamento delle informazioni. Questo cambio di paradigma ha quindi portato alla definizione dell'Edge Processing: vediamo nel dettaglio di cosa si tratta, quali sono i vantaggi rispetto ai classici sistemi cloud e, soprattutto, come è possibile sperimentarlo direttamente sul nostro Raspberry.

Una breve introduzione all'edge computing

L'edge computing rappresenta l'ultimo (soltanto in termini di tempo, ovviamente) passo nel campo del cloud computing. Questo approccio, nato e sviluppatosi negli ultimi anni, permette di risolvere alcuni dei problemi legati alla sempre maggior pervasività delle tecniche di machine learning, praticamente in ogni ambito. I classici approcci al cloud computing hanno infatti evidenziato nel corso del tempo tutti i loro limiti, resi maggiormente evidenti dalla sempre maggiore richiesta di capacità computazionale e banda necessaria all'utilizzo delle tecniche di big datamachine learning per introdurre intelligenza. In parole povere, l'edge computing prevede che il carico computazionale sia distribuito e delocalizzato verso gli estremi (edge) dell'infrastruttura ICT; in questo modello, i dispositivi più vicini ai dati si prendono carico di parte delle elaborazioni necessarie a rendere il nostro sistema intelligente.

Per fare un esempio concreto, possiamo pensare agli algoritmi che i nostri smartphone utilizzano per riconoscere i volti nelle foto che scattiamo: il modello che usiamo, e che ci permette di riconoscere i volti, è stato addestrato sul cloud, ma il riconoscimento (assieme alle elaborazioni di cui necessita) è eseguito direttamente sul nostro smartphone (che, quindi, è proprio un edge device).

A partire da questo esempio, possiamo individuare tre diversi strati principali all'interno delle architetture per l'edge computing, come mostrato in Figura 1.

Figura 1. Schema logico di un'architettura per l'Edge Processing

Il primo strato è quello dei dispositivi veri e propri (IoT devices). Questi possono essere sia sensori, sia attuatori, e vanno a costituire gli elementi del sistema che interagiscono direttamente con l'ambiente nel quale questo è inserito. Tornando al caso precedente, il dispositivo IoT è proprio la fotocamera del nostro smartphone. Il secondo strato è invece l'edge vero e proprio, ed è utilizzato per elaborare "localmente" i dati acquisiti dai dispositivi. Tornando all'analogia precedente, l'edge sarà dato proprio dal nostro smartphone, che esegue l'algoritmo di riconoscimento facciale. Il terzo ed ultimo strato è invece quello del cloud, nel quale gli algoritmi che saranno poi implementati sull'edge vengono addestrati a partire da grosse quantità di dati. Per riassumere: i dispositivi agiscono, l'edge decide, il cloud apprende.

Un sistema di questo tipo offre quindi dei chiari vantaggi rispetto alle classiche architetture centralizzate, tra cui riduzione nella latenza legata all'elaborazione delle informazioni, minor consumo di banda, capacità di lavorare anche in situazioni di assenza di rete ed utilizzo più efficiente delle risorse. Ad ogni modo, per approfondire ulteriormente, vi consiglio di leggere questo articolo.

Una piattaforma per l'Edge Computing: Azure IoT Edge

Appare evidente come per usufruire dei benefici offerti dal paradigma dell'edge computing sia necessaria una piattaforma di una certa complessità. Anche se è certamente possibile crearne una da zero basandosi su strumenti open source (come EdgeX Foundry o Eclipse IoT Kura), è preferibile, almeno nel caso di piccoli team, appoggiarsi ad ecosistemi già pronti, nei quali non è necessaria la gestione nel dettaglio di ogni parte dell'architettura. Andremo quindi ad introdurre l'utilizzo di Azure IoT Edge, sistema sviluppato da Microsoft e, tuttavia, fortemente improntato sull'open source. Quest'ultimo aspetto è particolarmente rilevante: il sorgente per Azure IoT Edge è infatti liberamente disponibile su GitHub, ed è possibile utilizzarlo su tutti i principali sistemi operativi. A seconda delle necessità, inoltre, può essere adattato a dispositivi dalle capacità limitate, come ad esempio un Raspberry Pi Zero, come anche mainframe collocati nei data center.

Come già sottolineato in precedenza, tra i vari vantaggi legati all'utilizzo di una piattaforma già esistente vi è la gestione della stessa. Ad esempio, Azure IoT Edge automatizza la comunicazione e l'autenticazione dei dispositivi IoT: questo chiaramente comporta un significativo vantaggio nel momento in cui i dispositivi sono collocati in luoghi non facilmente accessibili. Infatti, una volta registrati, i dispositivi potranno essere completamente gestiti ed aggiornati da remoto, con la possibilità di effettuarne la configurazione anche quando fossero momentaneamente offline (per poi ovviamente aggiornarli nel momento in cui dovessero tornare online).

Approfondiamo quindi i principali aspetti di Azure IoT Edge, partendo proprio da concetti e terminologia base utilizzati.

Una breve panoramica

In primis abbiamo i device che, intuitivamente, corrispondono a quelli che in precedenza abbiamo definito come dispositivi IoT. I device comunicano direttamente con l'Azure IoT Edge; per far sì che questo meccanismo funzioni adeguatamente, è tuttavia necessario che su ogni dispositivo sia configurato il Runtime di Azure IoT Edge. A sua volta, il Runtime è delegato alla gestione dei moduli. Ogni dispositivo registra all'interno della nostra applicazione IoT Edge (chiamata anche IoT Edge Solution) uno di questi moduli, che altro non sono se non dei container Docker, i quali sono normalmente registrati presso dei container registry privati o pubblici (come, ad esempio, Docker Hub o Azure Container Registry). E' importante sottolineare come, anche se ad ogni dispositivo è associato un modulo, il contrario non è vero: ad esempio, potremmo avere un modulo scritto in TensorFlow per la object detection non associato direttamente ad un device, ma piuttosto utilizzato dal modulo che gestisce la fotocamera per l'acquisizione dei singoli frame (il quale è, nei fatti, effettivamente associato ad un device fisico).

Il primo componente del Runtime ad essere eseguito all'accensione di un dispositivo è l'IoT Edge Agent, responsabile della comunicazione tra il dispositivo stesso ed il cloud. Il secondo componente è invece l'IoT Edge Hub, che agisce sostanzialmente da broker per facilitare la comunicazione tra diversi dispositivi mediante protocolli come MQTT.

In azione!

Passiamo ora ad una parte un pò più "pratica", che ci permetterà di saggiare quelle che sono le potenzialità di Azure IoT Edge. Per farlo, sfrutteremo il nostro fidato Raspberry Pi (in particolare, utilizzeremo la quarta versione, anche se vanno bene anche i modelli della terza) assieme al Sense Hat (di cui abbiamo già parlato in questo articolo). La configurazione prevede tre step fondamentali: il primo è la creazione delle risorse nel cloud, il secondo la configurazione e connessione del Raspberry ad Azure IoT Edge, ed il terzo il deploy di un modulo sullo stesso Raspberry. Iniziamo!

Step 1: Configurazione dell'ambiente

Assicuriamoci per prima cosa di aver creato un account su Azure; avremo a disposizione un tier gratuito, che potremo utilizzare per le nostre prove. A questo punto, dovremo installare sul PC, che utilizzeremo per sviluppare e configurare la nostra soluzione, la Azure IoT CLI, reperibile a questo indirizzo.

Scegliamo quindi la versione per il nostro sistema operativo, assicuriamoci che sia stata aggiunta al path, e quindi apriamo successivamente uno shell. Aggiungiamo l'estensione azure-cli-iot-ext che ci offre una serie di tool per interfacciarci con IoT Edge da riga di comando:

$ az extension add --name azure-cli-iot-ext

Possiamo quindi creare un resource group, ovvero una sorta di "contenitore logico" per le diverse risorse che creeremo nel corso del nostro progetto. Per farlo, effettuiamo il login:

$ az login

A questo punto, creiamo il resource group, dandogli un nome (in questo caso EosIotGroup) e specificando la posizione geografica del server (in questo caso westeurope):

$ az group create --name EosIotGroup --location westeurope

Creiamo quindi un IoT Hub all'interno del nostro resource group e chiamiamolo EosIotHub:

$ az iot hub create --resource-group EosIotGroup --name EosIotHub --sku S1

Una volta creato il nostro hub, potremo connettervi i nostri dispositivi.

Step 2: connettiamo il Raspberry ad Azure IoT Edge

Prima di farlo, però, dovremo creare un'identità per ciascuno di essi all'interno di Azure IoT. Inoltre, dal momento che stiamo configurando un'architettura basata sull'edge computing, useremo il flag --edge-enabled.

Da riga di comando digitiamo quindi la seguente istruzione:

$ az iot hub device-identity create --hub-name EosIotHub --device-id RPi1 --edge-enabled

E' importante notare come questa istruzione generi una stringa di connessione associata al nostro Raspberry (che abbiamo chiamato RPi1); questo valore ci servirà in seguito, per cui ricordiamo di annotarlo. Per verificare che tutto sia avvenuto correttamente, andiamo nella nostra area personale, cerchiamo IoT Hub, e verifichiamo che tra i nostri dispositivi vi sia RPi1, come mostrato in Figura 2.

Figura 2. I dispositivi associati al nostro Azure IoT Hub

Apriamo adesso una connessione SSH sul nostro Raspberry, assicurandoci che questo sia abilitato (se non sappiamo come abilitarlo, diamo un'occhiata a questo articolo):

$ ssh pi@raspberry_ip

[...]

ATTENZIONE: quello che hai appena letto è solo un estratto, l'Articolo Tecnico completo è composto da ben 2912 parole ed è riservato agli ABBONATI. Con l'Abbonamento avrai anche accesso a tutti gli altri Articoli Tecnici che potrai leggere in formato PDF per un anno. ABBONATI ORA, è semplice e sicuro.

Scarica subito una copia gratis

Scrivi un commento

Seguici anche sul tuo Social Network preferito!

Send this to a friend