마이크로 컨트롤러는 RAM과 스토리지가 제한되어 있어 머신러닝 모델의 크기에 제약이 있습니다. 또한 마이크로컨트롤러용 LiteRT는 현재 제한된 하위 집합의 작업만 지원하므로 모든 모델 아키텍처가 가능한 것은 아닙니다.
이 문서에서는 마이크로컨트롤러에서 실행되도록 TensorFlow 모델을 변환하는 프로세스를 설명합니다. 또한 지원되는 작업을 설명하고 제한된 메모리에 맞게 모델을 설계하고 학습하는 방법에 관한 안내를 제공합니다.
모델을 빌드하고 변환하는 실행 가능한 엔드 투 엔드 예시는 Hello World 예시를 참고하세요.
모델 변환
마이크로 컨트롤러에서 실행되도록 학습된 TensorFlow 모델을 변환하려면 LiteRT 변환기 Python API를 사용해야 합니다. 이렇게 하면 모델이 FlatBuffer로 변환되어 모델 크기가 줄어들고 LiteRT 작업을 사용하도록 수정됩니다.
가능한 가장 작은 모델 크기를 얻으려면 학습 후 양자화를 사용하는 것이 좋습니다.
C 배열로 변환
많은 마이크로컨트롤러 플랫폼에는 기본 파일 시스템 지원이 없습니다. 프로그램에서 모델을 사용하는 가장 쉬운 방법은 모델을 C 배열로 포함하고 프로그램으로 컴파일하는 것입니다.
다음 Unix 명령어는 LiteRT 모델을 char 배열로 포함하는 C 소스 파일을 생성합니다.
xxd -i converted_model.tflite > model_data.cc
출력은 다음과 비슷합니다.
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;
파일을 생성한 후 프로그램에 포함할 수 있습니다. 삽입된 플랫폼에서 메모리 효율성을 높이려면 배열 선언을 const로 변경하는 것이 중요합니다.
프로그램에 모델을 포함하고 사용하는 방법의 예는 Hello World 예의 hello_world_test.cc를 참고하세요.
모델 아키텍처 및 학습
마이크로컨트롤러에서 사용할 모델을 설계할 때는 모델 크기, 워크로드, 사용되는 작업을 고려해야 합니다.
모델 크기
모델은 바이너리 및 런타임 모두에서 프로그램의 나머지 부분과 함께 타겟 기기의 메모리에 맞을 만큼 작아야 합니다.
더 작은 모델을 만들려면 아키텍처에서 더 적은 수의 더 작은 레이어를 사용하면 됩니다. 하지만 작은 모델은 과소적합이 발생할 가능성이 더 높습니다. 즉, 많은 문제에서 메모리에 맞는 가장 큰 모델을 사용해 보는 것이 좋습니다. 하지만 더 큰 모델을 사용하면 프로세서 워크로드도 증가합니다.
워크로드
모델의 크기와 복잡성은 워크로드에 영향을 미칩니다. 크고 복잡한 모델은 듀티 사이클이 높아질 수 있으며, 이는 기기의 프로세서가 작동하는 시간이 길어지고 유휴 상태인 시간이 짧아진다는 의미입니다. 이렇게 하면 전력 소비와 열 출력이 증가하므로 애플리케이션에 따라 문제가 될 수 있습니다.
작업 지원
마이크로 컨트롤러용 LiteRT는 현재 TensorFlow 작업의 제한된 하위 집합을 지원하므로 실행할 수 있는 모델 아키텍처에 영향을 미칩니다. Google에서는 참조 구현과 특정 아키텍처의 최적화 측면에서 모두 작업 지원을 확대하기 위해 노력하고 있습니다.
지원되는 작업은 micro_mutable_ops_resolver.h 파일에서 확인할 수 있습니다.