Os microcontroladores têm RAM e armazenamento limitados, o que limita o tamanho dos modelos de machine learning. Além disso, atualmente o TensorFlow Lite para microcontroladores é compatível com um subconjunto limitado de operações. Portanto, nem todas as arquiteturas de modelo são possíveis.
Neste documento, explicamos o processo de conversão de um modelo do TensorFlow para execução em microcontroladores. Também descreve as operações aceitas e fornece algumas orientações sobre como projetar e treinar um modelo que caiba na memória limitada.
Para ver um exemplo completo e executável de como criar e converter um modelo, consulte Hello World.
Conversão de modelos
Para converter um modelo treinado do TensorFlow para execução em microcontroladores, use
a
API Python do conversor do TensorFlow Lite.
Isso converterá o modelo em um
FlatBuffer
, reduzindo o tamanho dele
e o modificará para usar operações do TensorFlow Lite.
Para ter o menor tamanho de modelo possível, use a quantização pós-treinamento.
Converter em uma matriz C
Muitas plataformas de microcontroladores não oferecem suporte a sistemas de arquivos nativos. A maneira mais fácil de usar um modelo do programa é incluí-lo como uma matriz C e compilá-lo no programa.
O seguinte comando unix vai gerar um arquivo de origem C que contém o
modelo do TensorFlow Lite como uma matriz char
:
xxd -i converted_model.tflite > model_data.cc
O resultado será semelhante ao seguinte:
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;
Depois de gerar o arquivo, você pode incluí-lo em seu programa. É
importante alterar a declaração de matriz para const
para melhorar a eficiência da
memória em plataformas incorporadas.
Para conferir um exemplo de como incluir e usar um modelo no programa, consulte
hello_world_test.cc
no exemplo Hello World.
Arquitetura e treinamento de modelos
Ao projetar um modelo para microcontroladores, é importante considerar o tamanho do modelo, a carga de trabalho e as operações usadas.
Tamanho do modelo
Um modelo precisa ser pequeno o suficiente para caber na memória do dispositivo de destino com o restante do programa, tanto como binário quanto no momento da execução.
Para criar um modelo menor, use camadas menores e em menor quantidade na sua arquitetura. No entanto, modelos pequenos são mais propensos a sofrer underfitting. Isso significa que, para muitos problemas, faz sentido tentar usar o maior modelo que couber na memória. No entanto, o uso de modelos maiores também vai aumentar a carga de trabalho do processador.
Carga de trabalho
O tamanho e a complexidade do modelo afetam a carga de trabalho. Modelos grandes e complexos podem resultar em um ciclo de trabalho maior, o que significa que o processador do dispositivo passa mais tempo trabalhando e menos tempo inativo. Isso vai aumentar o consumo de energia e a saída de calor, o que pode ser um problema dependendo do aplicativo.
Suporte para operações
Atualmente, o TensorFlow Lite para microcontroladores é compatível com um subconjunto limitado de operações do TensorFlow, o que afeta as arquiteturas de modelo que podem ser executadas. Estamos trabalhando na expansão do suporte a operações, tanto em termos de implementações de referência quanto em otimizações para arquiteturas específicas.
As operações aceitas podem ser vistas no arquivo micro_mutable_ops_resolver.h
.