MCU 전력·메모리 예산 안에서 돌아가는 TinyML — Edge AI 배포와 OTA 운영

TinyML·Edge AI 모델 경량화를 MCU 자원 예산 관점에서 설계하고, TensorFlow Lite Micro 배포와 Edge MLOps(서명·OTA·롤백)까지 다룬다

2026-08-12 · 최초 발행 2025-12-11

IoT 디바이스에 AI를 얹는 일의 출발점은 알고리즘이 아니라 예산이다. MCU 하나가 쓸 수 있는 RAM이 수백 KB, 배터리가 수개월을 버텨야 하는 상황에서는 정확도보다 그 제약 안에 들어가느냐가 먼저 결정된다.

Edge AI·TinyML·모델 경량화가 나누는 역할

Edge AI는 게이트웨이·카메라·센서 모듈 같은 네트워크 엣지에서 AI 추론을 수행하는 방식으로, 지연·프라이버시·가용성 최적화가 목적이다. TinyML은 그중에서도 수십 KB~수 MB 메모리의 초저전력 MCU에서 ML 모델을 실행하는 기술 스택을 가리킨다. INT8 정수 연산과 DSP 전처리, 초저전력 설계가 중심이다. 모델 경량화(Model Compression)는 정확도 손실을 최소화하면서 모델 크기·연산량을 줄이는 기법 묶음으로, 양자화(Quantization)·프루닝(Pruning)·지식 증류(Knowledge Distillation)가 대표적이다.

자원 예산이 설계를 결정한다

시스템 제약 관리에서는 RAM/Flash, 연산량(MACs), 전력(mW·mAh), 지연(ms) 목표를 먼저 정의하고 실시간성 SLO를 최우선 지표로 삼는다. MCU가 M0+인지 M4F인지, NPU·DSP가 있는지, ARM CMSIS-NN이나 Ethos-U 같은 가속 라이브러리를 쓸 수 있는지도 미리 점검해야 한다.

경량화 파이프라인에서는 Post-Training Quantization(PTQ)으로 INT8 변환을 우선 시도하고, 민감한 경우에만 Quantization-Aware Training(QAT)을 적용한다. 프루닝은 채널·필터 단위의 구조적 희소성을 쓰는 편이 컴파일러 최적화 효율을 극대화한다. 지식 증류는 경량 학생 모델이 대형 교사 모델의 소프트 타깃을 학습해 정확도를 회복하는 방식이다. INT8 경량화만으로도 연산·메모리가 4배 줄고 배터리 수명이 2~5배 늘어나는 효과가 있다.

컴파일러·런타임은 TensorFlow Lite Micro(TFLM), ONNX Runtime Mobile, TensorRT, Core ML/NNAPI 중에서 선택한다. TVM·Glow 같은 컴파일러는 연산자 퓨전·메모리 플래닝·커널 선택을 자동화하고, 타깃 ISA·NPU별로 백엔드를 튜닝할 수 있다.

통신·오프로드 패턴은 신뢰도나 자원 상태에 따라 부분 오프로드하는 로컬 우선·클라우드 보완 방식이 기본이다. 저전력 모드에서는 샘플링·해상도를 적응시키고, 네트워크가 불가능할 때는 로컬 버퍼링 후 기회가 될 때 동기화한다. 이벤트 기반 전송으로 데이터 전송비를 최대 80%까지 줄일 수 있다.

보안·운영(Edge MLOps)에서는 Secure Boot와 모델 서명·암호화, 무결성 검증으로 보안 체인을 구성하고 민감 데이터는 온디바이스에서 처리한다. OTA·롤백은 A/B 파티션 원자적 스왑, 단계적 롤아웃, 헬스 체크·자동 롤백으로 안정성을 확보한다.

현장 사례

제조 예지보전(MCU)은 3축 가속도를 1kHz로 수집해 20ms 윈도우로 자르고, MFCC·스펙트럼 전처리 후 DS-CNN INT8 모델(약 60~150KB)로 추론한다. 실시간 이상 진동을 감지해 경보 지연을 50ms 미만으로 유지한다.

엣지 비전(NPU 카메라)은 MobileNetV2-0.35 INT8을 320×320 입력으로 돌려 사람·차량을 검출한다. 게이트 제어와 프라이버시 보호에 쓰이며 프레임당 20~30ms가 걸린다.

키워드 스폿팅(M0+)은 8kHz 오디오를 1초 슬라이딩 윈도우로 처리하는 DS-CNN INT8 모델(20~60KB)을 쓴다. 상시대기 소비전력을 1mA 미만으로 설계하는 게 핵심이다.

스마트미터 이상탐지(게이트웨이)는 1D CNN·오토인코더 INT8을 스트리밍 윈도우로 돌리고, 개념드리프트가 감지되면 주기적으로 미세튜닝한다.

웨어러블 헬스는 PPG·IMU 기반 활동·HRV 분석에 Tiny Transformer를 쓰고, 마지막 층만 온디바이스에서 개인화한다. 개인정보는 클라우드로 보내지 않는다.

어디에 배치할 것인가

구분 성능(지연) 확장성 일관성 안정성 운영 편의
클라우드 추론 중~고지연(네트워크 의존) 매우 높음 모델 단일화 용이 네트워크 장애 취약 운영 단순, OTA 최소
엣지 게이트웨이 저지연(10~50ms) 높음(사이트 단위) 디바이스군별 변이 존재 네트워크 부분 불필요 OTA/장비 관리 필요
Tiny MCU 초저지연(1~20ms) 개수 증가 시 관리 부담 모델 분기/최적화 다양 네트워크 무관, 전력 제약 OTA·계측·로그 체계 필수

Tiny MCU까지 내려가면 클라우드 추론 대비 지연이 10~100배 단축되고, 네트워크가 끊겨도 오프라인에서 계속 동작한다.

데이터부터 현장 추론까지

신뢰도 = 임계값신뢰도 < 임계값메모리 부족/오류오류율 상승데이터 수집모델 학습경량화(양자화·프루닝·증류)컴파일/변환(TFLiteMicro·TVM·NNAPI)OTA 패키징/서명디바이스 배포센서 입력온디바이스전처리(DSP·필터링)경량 모델 추론(INT8·NPU가속)로컬 액션/제어클라우드 재요청(보완 추론)로깅 내구모드모니터링/원격 로깅롤백 요청

배포·업데이트 절차

목표 정의 단계에서는 지연·전력·정확도 SLO와 RAM/Flash 예산을 세운다. 데이터·학습 단계는 실제 장비 분포를 반영한 수집·증강과 MobileNet·DS-CNN·Tiny-Transformer 같은 경량 아키텍처 설계다. 경량화 단계는 PTQ→QAT를 단계적으로 적용하고 구조적 프루닝, 증류로 정확도를 회복한다. 컴파일 단계는 CMSIS-NN/NNAPI/NPU Delegate 같은 타깃별 커널을 선택하고 고정소수점을 확인한다. 패키징·보안 단계는 모델 서명·암호화, A/B OTA 번들 작성, 원자적 스왑을 수행한다. 카나리 롤아웃 단계는 1~5% 장비에 배포 후 헬스 체크를 거쳐 점진 확대하고, 실패하면 자동 롤백한다. 마지막 관측·개선 단계는 신뢰도 분포, 지연, 메모리·온도, 배터리 드레인 지표를 수집해 드리프트에 대응한다.

INT8 양자화와 MCU 추론 최소 예제

환경: Python 3.10, TensorFlow 2.13, TensorFlow Lite Micro 2.13, Cortex-M4F 256KB RAM 기준.

호스트에서 모델을 양자화·내보내는 코드다.

import tensorflow as tf
import numpy as np

# 예시: 이미 학습된 Keras 모델 로드
model = tf.keras.models.load_model("model_fp32.h5")

# 대표 데이터셋(8-bit 보정용) 생성기
def rep_data():
    for _ in range(200):
        # 실제 센서 통계와 유사한 입력 샘플 제공 필요
        yield [np.random.rand(1, 16000, 1).astype(np.float32)]

converter = tf.lite.TFLiteConverter.from_keras_model(model)
converter.optimizations = [tf.lite.Optimize.DEFAULT]
converter.representative_dataset = rep_data
converter.target_spec.supported_ops = [tf.lite.OpsSet.TFLITE_BUILTINS_INT8]
converter.inference_input_type = tf.int8
converter.inference_output_type = tf.int8

tflite_model = converter.convert()
open("model_int8.tflite", "wb").write(tflite_model)
print("Saved: model_int8.tflite, size:", len(tflite_model), "bytes")

디바이스 쪽 TFLite Micro 추론 스켈레톤이다.

#include "model_int8.h"              // 모델 바이트 배열
#include "tensorflow/lite/micro/all_ops_resolver.h"
#include "tensorflow/lite/micro/micro_interpreter.h"
#include "tensorflow/lite/schema/schema_generated.h"
#include "tensorflow/lite/version.h"

constexpr int kArenaSize = 80 * 1024; // RAM 예산 내 텐서 아레나
static uint8_t tensor_arena[kArenaSize];

int main() {
  const tflite::Model* model = tflite::GetModel(model_int8_tflite);
  static tflite::AllOpsResolver resolver;
  static tflite::MicroInterpreter interpreter(model, resolver, tensor_arena, kArenaSize);
  interpreter.AllocateTensors();

  TfLiteTensor* input = interpreter.input(0);
  // 센서 전처리 결과를 INT8 스케일에 맞춰 채움(예: zero_point/scale 적용)
  for (int i = 0; i < input->bytes; i++) input->data.int8[i] = 0;

  TfLiteStatus invoke_status = interpreter.Invoke();
  if (invoke_status != kTfLiteOk) {
    // 오류 처리: 내구 모드/로깅
    return -1;
  }

  TfLiteTensor* output = interpreter.output(0);
  // 출력 후처리: 신뢰도 임계값 판정→액션/오프로드 결정
  return 0;
}

대표 데이터셋은 실제 배포 분포와 근사해야 양자화 정확도가 유지된다. MCU RAM/Flash 예산 안에서 텐서 아레나 크기, 입력 크기, 모델 크기를 동시에 만족해야 하고, 연산자가 미지원이면 대체 커널을 추가하거나 모델 구조를 수정해야 한다.

TinyMLEdgeAI모델경량화TFLiteMicroEdgeMLOps