Tworzenie i konwertowanie modeli

Mikrokontrolery mają ograniczoną pamięć RAM i miejsce na dane, co ogranicza rozmiary modeli uczenia maszynowego. Dodatkowo LiteRT dla mikrokontrolerów obecnie obsługuje ograniczony podzbiór operacji, więc nie wszystkie architektury modeli są możliwe.

Ten dokument wyjaśnia proces konwertowania modelu TensorFlow w celu uruchomienia go na mikrokontrolerach. Opisuje też obsługiwane operacje i zawiera wskazówki dotyczące projektowania i trenowania modelu, który zmieści się w ograniczonej pamięci.

Kompleksowy przykład tworzenia i konwertowania modelu znajdziesz w przykładzie Hello World.

Konwersja modelu

Aby przekonwertować wytrenowany model TensorFlow do uruchamiania na mikrokontrolerach, użyj interfejsu Python API konwertera LiteRT. Spowoduje to przekonwertowanie modelu na format FlatBuffer, zmniejszenie jego rozmiaru i zmodyfikowanie go tak, aby korzystał z operacji LiteRT.

Aby uzyskać jak najmniejszy rozmiar modelu, warto rozważyć użycie kwantyzacji po trenowaniu.

Konwertowanie na tablicę C

Wiele platform mikrokontrolerów nie obsługuje natywnie systemu plików. Najprostszym sposobem użycia modelu w programie jest uwzględnienie go jako tablicy C i skompilowanie go w programie.

To polecenie systemu Unix wygeneruje plik źródłowy C, który zawiera model LiteRT jako tablicę char:

xxd -i converted_model.tflite > model_data.cc

Dane wyjściowe będą podobne do tych:

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;

Po wygenerowaniu pliku możesz go uwzględnić w programie. W celu zwiększenia wydajności pamięci na platformach wbudowanych ważne jest, aby zmienić deklarację tablicy na const.

Przykład tego, jak uwzględnić i używać modelu w programie, znajdziesz w sekcji hello_world_test.cc w przykładzie Hello World.

Architektura modelu i trenowanie

Podczas projektowania modelu do użytku na mikrokontrolerach ważne jest, aby wziąć pod uwagę rozmiar modelu, obciążenie i używane operacje.

Rozmiar modelu

Model musi być wystarczająco mały, aby zmieścić się w pamięci urządzenia docelowego wraz z pozostałą częścią programu, zarówno jako plik binarny, jak i w czasie działania.

Aby utworzyć mniejszy model, możesz użyć mniejszej liczby mniejszych warstw w architekturze. Jednak małe modele są bardziej podatne na niedopasowanie. Oznacza to, że w przypadku wielu problemów warto spróbować użyć największego modelu, który zmieści się w pamięci. Korzystanie z większych modeli spowoduje jednak również zwiększenie obciążenia procesora.

Zbiór zadań

Rozmiar i złożoność modelu mają wpływ na obciążenie. Duże, złożone modele mogą powodować wyższy cykl pracy, co oznacza, że procesor urządzenia spędza więcej czasu na pracy, a mniej na bezczynności. Zwiększy to zużycie energii i wydzielanie ciepła, co może stanowić problem w zależności od aplikacji.

Wsparcie operacyjne

LiteRT for Microcontrollers obsługuje obecnie ograniczony podzbiór operacji TensorFlow, co wpływa na architektury modeli, które można uruchamiać. Pracujemy nad rozszerzeniem obsługi operacji zarówno pod względem implementacji referencyjnych, jak i optymalizacji pod kątem konkretnych architektur.

Obsługiwane operacje można znaleźć w plikumicro_mutable_ops_resolver.h