Crea e converti modelli

I microcontrollori hanno RAM e spazio di archiviazione limitati, il che pone vincoli alle dimensioni dei modelli di machine learning. Inoltre, LiteRT per microcontrollori attualmente supporta un sottoinsieme limitato di operazioni, quindi non tutte le architetture dei modelli sono possibili.

Questo documento spiega il processo di conversione di un modello TensorFlow per l'esecuzione su microcontrollori. Inoltre, descrive le operazioni supportate e fornisce alcune indicazioni sulla progettazione e l'addestramento di un modello da inserire in una memoria limitata.

Per un esempio end-to-end eseguibile di creazione e conversione di un modello, consulta l'esempio Hello World.

Conversione del modello

Per convertire un modello TensorFlow addestrato in modo che venga eseguito sui microcontrollori, devi utilizzare l'API Python del convertitore LiteRT. In questo modo il modello verrà convertito in un FlatBuffer, riducendo le dimensioni del modello e modificandolo in modo che utilizzi le operazioni LiteRT.

Per ottenere le dimensioni del modello più piccole possibili, ti consigliamo di utilizzare la quantizzazione post-addestramento.

Converti in un array C

Molte piattaforme di microcontrollori non supportano il file system nativo. Il modo più semplice per utilizzare un modello dal tuo programma è includerlo come array C e compilarlo nel programma.

Il seguente comando Unix genererà un file di origine C che contiene il modello LiteRT come array char:

xxd -i converted_model.tflite > model_data.cc

L'output sarà simile al seguente:

unsigned char converted_model_tflite[] = {
  0x18, 0x00, 0x00, 0x00, 0x54, 0x46, 0x4c, 0x33, 0x00, 0x00, 0x0e, 0x00,
  // <Lines omitted>
};
unsigned int converted_model_tflite_len = 18200;

Una volta generato il file, puoi includerlo nel tuo programma. È importante modificare la dichiarazione dell'array in const per una migliore efficienza della memoria sulle piattaforme incorporate.

Per un esempio di come includere e utilizzare un modello nel tuo programma, vedi hello_world_test.cc nell'esempio Hello World.

Architettura e addestramento del modello

Quando progetti un modello da utilizzare sui microcontrollori, è importante considerare le dimensioni del modello, il carico di lavoro e le operazioni utilizzate.

Dimensione modello

Un modello deve essere abbastanza piccolo da poter essere memorizzato nella memoria del dispositivo di destinazione insieme al resto del programma, sia come binario che in fase di runtime.

Per creare un modello più piccolo, puoi utilizzare meno livelli e livelli più piccoli nella tua architettura. Tuttavia, i modelli piccoli hanno maggiori probabilità di soffrire di underfitting. Ciò significa che per molti problemi è opportuno provare a utilizzare il modello più grande che può essere caricato in memoria. Tuttavia, l'utilizzo di modelli più grandi comporterà anche un aumento del carico di lavoro del processore.

Workload

Le dimensioni e la complessità del modello influiscono sul carico di lavoro. Modelli grandi e complessi potrebbero comportare un ciclo di lavoro più elevato, il che significa che il processore del dispositivo trascorre più tempo a lavorare e meno tempo inattivo. In questo modo aumenteranno il consumo di energia e la produzione di calore, il che potrebbe essere un problema a seconda dell'applicazione.

Supporto per le operazioni

LiteRT per microcontrollori attualmente supporta un sottoinsieme limitato di operazioni TensorFlow, il che influisce sulle architetture dei modelli che è possibile eseguire. Stiamo lavorando per ampliare il supporto delle operazioni, sia in termini di implementazioni di riferimento sia di ottimizzazioni per architetture specifiche.

Le operazioni supportate sono visibili nel file micro_mutable_ops_resolver.h