L’apprendimento automatico abbraccia diverse mega tendenze nell’industria e svolge un ruolo molto importante all’interno della Visione Embedded, dell’Internet delle Cose e del Cloud Computing. Molti sistemi embedded non solo richiedono l’elaborazione e l’analisi, ma anche la presa di decisioni ai bordi della rete per svolgere la propria funzione. Ciò richiede la capacità di interpretare e di comprendere il contenuto di un fotogramma o di più fotogrammi di immagine. Qui è dove sono messe in campo le tecniche di apprendimento automatico; l’uso di queste tecniche consente ai sistemi di visione embedded di evolversi da sistemi con funzioni di visione verso sistemi autonomi con funzioni di visione. L’apprendimento automatico è effettuato il più delle volte attraverso l’istanziazione e l’addestramento di una rete neurale. Il termine rete neurale è molto generico e include un numero significativo di sottocategorie. Le reti neurali sono modellate sulla corteccia cerebrale umana, in cui ogni neurone riceve un segnale in ingresso, lo elabora e lo comunica elaborato a un altro neurone. Di conseguenza, le reti neurali consistono tipicamente in uno strato di ingresso, in uno o più strati interni e in uno strato di uscita. Le reti neurali che passano l’uscita di uno strato a un altro senza formare un ciclo sono chiamate reti neurali feedforward o Fnn, mentre quelle che contengono cicli diretti in cui è presente una retroazione, ad esempio la rete di Elman, sono chiamate reti neurali ricorrenti o Rnn. Un termine usato molto comunemente in molte applicazioni di apprendimento automatico è quello di reti neurali profonde o Dnn. Queste ultime sono reti neurali dotate di numerosi strati nascosti, che consentono di eseguire una funzione di apprendimento automatico più complessa. Prima che si possa utilizzare una rete neurale, è necessario addestrare la rete per determinare il valore dei pesi e delle modulazioni usate all’interno di ciascuno strato. L’addestramento di una Dnn richiede una serie significativa di dati per impostare le prestazioni richieste in modo corretto. Nell’addestrare una Dnn per applicazioni di elaborazione delle immagini, potremmo aver bisogno di ottenere immagini da ambienti quali www.image-net.org.
Le reti neurali convoluzionali
Ciò che separa le applicazioni di visione embedded da altre applicazioni di apprendimento automatico più semplici è il fatto che presentano un formato di ingresso bidimensionale. Come tale, nelle implementazioni dei sistemi di apprendimento automatico è usata una struttura di rete chiamata Cnn o rete neurale convoluzionale, perché è in grado di elaborare ingressi bidimensionali. Esistono numerosi implementazioni diverse di Cnn che si sono evolute nel corso degli anni, da AlexNet a GoogleNet, Sdd e Fcn, e sebbene siano caratterizzate da diverse parametrizzazioni in fase di implementazione, esse consistono in più stadi degli stessi blocchi funzionali di base. Questi ultimi sono:
- Convoluzione - In questo stadio, l’immagine in ingresso è suddivisa in diverse tessere più piccole sovrapposte l’una all’altra attraverso l’applicazione di un filtro. I risultati di questa convoluzione sono usati per creare una mappa di caratteristiche.
- Unità lineare rettificata (reLU) - Strato di attivazione usato per creare una mappa di attivazione che segue una convoluzione.
- Max pooling - Effettua il sottocampionamento fra strati per ridurre la risoluzione.
- Completamente connesso - Si tratta di uno strato di moltiplicazione a matrice che applica all’ingresso sia i pesi, sia una modulazione. È chiamato strato a connessione completa poiché l’ingresso e l’uscita sono completamente connessi.
Queste reti e questi stadi sono definiti e addestrati all’interno di una struttura come Caffe, che fornisce non solo un insieme di librerie, ma anche modelli di reti preesistenti (grazie al proprio repertorio di modelli e ai propri pesi pre-addestrati), da applicare al modello per ottenere reti operative in tempi rapidi. L’apprendimento è richiesto per definire i parametri per la convoluzione (pesi del filtro) e per lo strato completamente connesso (pesi e modulazioni), mentre gli elementi Pool e ReLU non richiedono alcuna parametrizzazione. Tuttavia, sia lo strato Pool, sia quello di convoluzione necessitano della parametrizzazione per definire le dimensioni del nucleo del filtro e del passo. Il modo in cui determiniamo i valori che sono usati per questi ultimi è noto come addestramento; uno dei vantaggi dell’uso di una Cnn è la relativa semplicità di addestramento della rete.
L’apprendimento basato su Gpu
L’addestramento di una Cnn richiede un grosso insieme di dati che consiste in diverse migliaia di immagini corrette e non corrette. Quando si effettua l’addestramento, viene aggiunto uno strato aggiuntivo chiamato funzione di perdita; questo stadio permette all’algoritmo di addestramento di conoscere se la rete ha identificato correttamente l’immagine in ingresso o meno. Durante l’apprendimento si ricorre alla propagazione sia in avanti, sia all’indietro per determinare se l’immagine è classificata correttamente e per aggiornare i pesi in base ai segnali di errore e ai gradienti calcolati. Per applicare gli insiemi di immagini e per calcolare i coefficienti di rete in modo più possibile rapido ed efficiente, vengono usate grandi farm di Gpu. Le Gpu farm sono usate perché l’obiettivo dell’apprendimento è di generare i pesi e le modulazioni all’interno dell’intervallo di tempo minimo. Di conseguenza l’efficienza energetica, la risposta in tempo reale e il determinismo per ciascun fotogramma dell’immagine non sono così critici come all’interno di applicazioni di inferenza ai bordi della rete. Le Gpu farm forniscono quindi il meccanismo più efficiente per determinare i pesi e le modulazioni della Cnn. La generazione di questi pesi e di queste modulazioni deve comunque prendere in considerazione il sistema numerico che deve essere utilizzato nell’implementazione del motore di inferenza. Le applicazioni di apprendimento automatico usano sempre più spesso sistemi numerici più efficienti a virgola fissa con precisione ridotta, come la rappresentazione Int8. L’uso dei sistemi numerici a virgola fissa con precisione ridotta avviene senza una perdita significativa nell’accuratezza, se confrontati con un approccio tradizionale a virgola mobile a 32 bit. Essendo inoltre la matematica a virgola fissa considerevolmente più semplice da realizzare rispetto a quella a virgola mobile, questo passaggio verso il sistema Int8 offre soluzioni più efficienti e più veloci in alcune implementazioni. Per supportare tale generazione di sistema numerico con precisione ridotta, il tool automatizzato Ristretto per Caffe consente l’addestramento delle reti usando sistemi numerici a virgola fissa. Questo rimuove la necessità di convertire i dati di addestramento a virgola mobile in dati di addestramento a virgola fissa e il relativo impatto sulle prestazioni potenziali.
Inferenza nell’apprendimento automatico con reVision
Molte applicazioni di inferenza nell’apprendimento automatico sono ai bordi della rete, e richiedono una soluzione che non solo è in grado di fornire prestazioni elevate ma è anche energeticamente efficiente, sicura e deterministica. Per raggiungere tali requisiti, molte soluzioni sfruttano le funzionalità fornite dai dispositivi Interamente Programmabili SoC Zynq o MPSoC UltraScale+ di Xilinx. Questi dispositivi combinano una matrice logica programmabile con unità Arm ad alte prestazioni nel sistema di elaborazione. Questa combinazione consente la creazione di un sistema che è caratterizzato da un tempo di risposta migliorato, è molto flessibile per modifiche future e offre una soluzione energeticamente efficiente. Un anello di decisione e di risposta a bassa latenza è di importanza critica per molte applicazioni, come i robot autonomi con funzioni di visione, nei quali il tempo di risposta è critico per evitare lesioni o danni alle persone e al loro ambiente. Tale miglioramento del tempo di risposta è reso possibile dall›uso della logica programmabile per realizzare la sequenza di elaborazione della visione e il motore di inferenza per l’apprendimento automatico. A questo scopo, l’uso della logica programmabile riduce i colli di bottiglia del sistema rispetto alle soluzioni tradizionali. Con un approccio basato su Cpu/Gpu, ciascuno stadio dell’operazione richiede l’uso di una memoria Ddr esterna, dato che le immagini non possono essere passate fra le funzioni all’interno della cache interna limitata. Un approccio basato sulla logica programmabile consente di adottare una soluzione che opera in tempo reale, con la Ram interna che assicura la memorizzazione temporanea dei dati come richiesto. Ciò riduce la necessità di archiviare elementi intermedi all’interno della Ddr e quindi riduce non solo la latenza dell’elaborazione delle immagini, ma riduce anche la potenza dissipata e aumenta il determinismo, non essendovi la necessità di condividere l’accesso con altre risorse del sistema per trasferire i dati di immagine al di fuori del chip da e verso la memoria Ddr. Per consentire lo sviluppo di questi dispositivi con ambienti e librerie standard come Caffe, OpenCV e OpenVX, Xilinx fornisce lo stack di accelerazione reVision. Questo stack consente agli sviluppatori di accelerare l’ambiente e le funzioni della libreria all’interno della metà dei dispositivi Zynq-7000 o MPSoC Zynq UltraScale+ costituita da logica programmabile, senza la necessità di essere uno specialista nei linguaggi Hdl e ottenendo miglioramenti significativi in termini di prestazioni, consumi e latenza. Per ottenere ciò, reVision fornisce sia funzioni OpenCV ottimizzate su hardware, sia stadi di inferenza per l’apprendimento automatico, come ad esempio gli stadi Conv, reLU, Max Pooling e Completamente Connesso. Questo permette allo stack reVision di supportare una soluzione di inferenza più reattiva in Caffe, preconfigurata usando un file prototxt. All’interno della logica programmabile, l’inferenza per l’apprendimento automatico è implementata usando il sistema numerico Int8. Ciò consente alle operazioni in formato Int8 di usare le slice DSP48E2 disponibili all’interno dell’architettura UltraScale+. L’uso degli elementi Dsp assicura un aumento delle prestazioni, essendo essi stessi degli elementi dedicati di moltiplicazione e accumulo progettati per eseguire operazioni matematiche a virgola fissa. La struttura di questi elementi Dsp consente anche di ottenere un’implementazione che fa un uso efficiente delle risorse, poiché ciascuno è in grado di effettuare fino a due operazioni Mac in formato Int8 usando gli stessi pesi del kernel. L’adozione di tale approccio può fornire un miglioramento della velocità di trasmissione dati anche di 1,75 volte. Questa possibilità consente di ottenere una soluzione ottimizzata nei costi e assicura un aumento dell’efficienza energetica da due a sei volte, rispetto ai dispositivi della concorrenza. Questa capacità di operare con ambienti ad alto livello riduce significativamente il tempo di sviluppo, consentendo al gruppo di sviluppo di concentrarsi sulle proprie attività a valore aggiunto, piuttosto che duplicare il modello ad alto livello in un linguaggio di descrizione hardware. Un ciclo di sviluppo più breve consente inoltre di aggiornare una soluzione più flessibile quando standard, requisiti e funzionalità evolvono in linea con la roadmap del prodotto o con le esigenze dei clienti. La natura interamente programmabile dei dispositivi consente di realizzare questi aggiornamenti lungo il ciclo di vita del prodotto, grazie alla capacità di interfacciamento universale e alla possibilità di riprogrammare il PS o la PL come richiesto dall’applicazione.