seukseok의 개인 블로그

MCU에서 INT8 양자화 모델을 안정적으로 올리는 실무 체크리스트

· tech

INT8 양자화의 scale/zero-point, per-tensor/per-channel 차이, 그리고 TFLite Micro 배포에서 발생하는 연산자/메모리 이슈를 실무 체크리스트로 정리했다.

INT8 양자화는 모델 파일만 줄이는 작업이 아니라, MCU에서 끝까지 추론이 돌아가게 만드는 통합 작업에 가깝다.

내가 정리한 핵심은 딱 이거다.

왜 자꾸 “변환은 됐는데 실행은 실패”가 나올까

처음엔 보통 이렇게 생각한다.

  1. FP32를 INT8로 바꾸면 빨라지겠지
  2. .tflite 나오면 끝이겠지

근데 실제로는 여기서부터 시작이다.

즉, 양자화 자체보다 타깃 런타임 조건이 더 빡세다.

개념은 이 정도만 알면 충분

INT8 양자화에서 많이 보는 용어는 scale, zero-point다.

실무에서는 이론 완벽 이해보다, 내가 쓰는 TFLite Micro + CMSIS-NN 버전에서 실제 지원되는지 먼저 확인하는 게 훨씬 빠르다.

진짜 자주 터지는 에러 3개

1) op resolver 에러

Didn't find op for builtin opcode 'DEPTHWISE_CONV_2D' version 'X'

대부분 원인은 모델 변환 시점 op 버전과 펌웨어 커널 버전 불일치다.

체크:

2) arena 부족

Arena allocation failed

체크:

3) 정확도 급락

대부분 대표 데이터셋(representative data) 품질 문제나 전처리 불일치다.

체크:

컴파일 이슈: 이것부터 보면 빨리 끝남

대표적으로:

undefined reference to `arm_convolve_s8'

이 순서로 보면 해결 속도가 빠르다.

  1. CMSIS-NN 링크 포함 여부
  2. 타깃 플래그(-mcpu, -mthumb) 점검
  3. FPU/ABI 옵션 충돌 여부
  4. TFLite Micro 최적화 경로 활성화 확인

예시:

target_compile_options(app PRIVATE -mcpu=cortex-m7 -mthumb)
target_link_libraries(app PRIVATE cmsis_nn)

빠른 체크리스트

여기까지만 지켜도 실패율이 확 떨어진다.

참고 자료

마무리

INT8은 “모델 압축”보다 “시스템 통합”에 가깝다. 학부/석사 프로젝트에서도 이 관점으로 보면 디버깅 시간이 크게 줄어든다.

다음 글에서는 레이어별 latency를 잡아서 정확도-속도-전력 균형점을 찾는 방법을 정리해보겠다.