1. 수업 개요
이번 수업은 임베디드/하드웨어 환경에서의 이식성(Portability)과 효율(Efficiency)의 트레이드오프, 그리고 모델 압축(Quantization, Pruning, Knowledge Distillation)을 통해 Tiny 디바이스에 ML 모델을 배포하는 전 과정을 다뤘다.
큰 모델과 범용 코드의 "이식성"을 고집하면 비용·전력·엔지니어링 노력이 커질 수 있고, 반대로 HW 맞춤 최적화를 하면 이식성은 떨어지는 선택이 자주 필요하다. 임베디드에서는 정확도뿐 아니라 연산량·지연·전력·메모리를 함께 고려해야 한다.
실습에서는 M5Core2에서 PC로 IMU 데이터를 전송하는 방식(BLE, WiFi UDP, ESP-NOW)을 비교하고, CNN 모델에 프루닝과 양자화를 적용해 TFLite로 변환한 뒤 M5Core2에 배포하는 파이프라인을 경험했다.
2. 이식성 트레이드오프 (Portability Trade-offs)
임베디드에서는 "이식성을 희생하고 효율을 얻는" 선택이 자주 필요하다. 특정 HW(보드) 구현 관점에서 선택지는 크게 두 가지다.
Option 1: 범용 코드 이식성/호환성(Universal Code Portability)을 최우선으로 할 때
- 장점: 여러 시스템에서 그대로 동작한다(이식성 ✓).
- 단점: 비용(Cost), 전력(Power), 엔지니어링 노력(Engineering Effort)이 커질 수 있다(✗).
Option 2: 이식성은 낮추고(Lower Code Portability) 최적화할 때
- 단점: 이식성이 떨어진다(✗).
- 장점: 비용/전력/개발 노력 측면에서 유리하다(✓).
핵심은 "어디서나 동일하게 동작"을 고집하면 비용·전력·노력에서 불리해질 수 있고, HW 맞춤 최적화를 하면 이식성은 떨어질 수 있다는 트레이드오프를 인지하는 것이다.
3. ML 모델 진화: 정확도 vs 연산량
모델이 발전할수록 정확도(Top-1 Accuracy)를 올리기 위해 연산량(GFLOPs)과 규모가 커지는 경향이 있다. 동시에 모바일/엣지 지향 모델(예: MobileNet 계열)처럼 연산량 대비 효율을 노린 모델도 등장한다.
임베디드에서는 "정확도만"이 아니라 연산량·지연·전력·메모리까지 함께 봐야 한다. 작은 모델은 더 빠르게 돌고, 메모리를 덜 쓰며, 전력을 덜 소비한다(Smaller models run faster, use less memory, and consume less power).
4. 대표 CNN 모델 비교
대표 CNN들을 정확도·파라미터 규모·특징으로 비교하면 다음과 같다.
- AlexNet (2012): Top-1 약 63%(ImageNet), 약 60M parameters, 수백 MB 수준. 초기 딥 CNN의 대표로, 현재는 교육/학습용 성격.
- VGGNet (VGG16/19): VGG16 Top-1 약 71.3%, 약 138M params, 약 528MB. 구조가 단순하고 균일하지만 크고 무거움(heavy compute).
- ResNet (ResNet152V2 등): Top-1 약 78.0%, 약 60.4M params. Residual 구조로 성능이 좋고, VGG보다 효율적인 경향.
- MobileNet (MobileNetV3 Large): Top-1 약 75.2%, 약 5.48M params. 모바일/엣지용으로 크기와 지연(latency)에서 유리한 트레이드오프.
임베디드/엣지에서는 MobileNet처럼 "작고 효율적인 모델"이 중요하다.
5. 모델 압축 기법의 위치
ML 시스템을 (1) Models ↔ (2) Runtimes ↔ (3) Hardware 세 층으로 보면, 서로 영향을 주는 생태계다. "하드웨어에 맞게 실제로 돌아가게" 하려면 모델 자체뿐 아니라 런타임과 하드웨어까지 포함한 최적화가 필요하다.
Model Compression Techniques로는 Pruning(가지치기), Quantization(양자화), Knowledge Distillation(지식 증류) 등이 있다. 이 기법들을 조합(Quantized & pruned, Distillation applied)하여 사용할 수 있다.
6. Tiny 디바이스 최적화 3대 축
Tiny 디바이스에서 모델을 맞추기 위한 대표 기법 세 가지는 다음과 같다.
- Quantization(양자화): float32 → int8처럼 정밀도를 낮춰(정수화) 모델을 가볍게 한다.
- Model Pruning(프루닝): 중요하지 않은 뉴런/연결을 제거한다.
- Knowledge Distillation(지식 증류): 큰(teacher) 모델의 지식을 작은(student) 모델이 모방하도록 학습시킨다.
이를 묶어 Model Compression(모델 압축)으로 사용하며, "Quantized & pruned", "Distillation applied"처럼 조합 가능하다.
7. Pruning (가지치기)
Pruning은 자원 제약 장치에서 실시간 추론에 적합하도록 모델을 최적화하는 압축 기법이다. 촘촘한 연결(가중치/시냅스) 중 일부를 제거하는 방식으로 이해할 수 있다.
Pruning은 두 관점으로 설명할 수 있다.
- Synapse(가중치 연결) 제거: 특정 가중치를 0으로 만들어 연결 자체를 줄인다.
- Neuron(노드) 제거: 뉴런 전체를 제거하여 연산과 파라미터를 줄인다.
tensorflow-model-optimization 패키지로 프루닝을 적용할 수 있고, 설치가 어려우면 수동(manual) 프루닝도 가능하다. 압축률(compression %)을 계산하여 보고하는 것이 실습 목표 중 하나다.
8. Quantization (양자화)
Quantization은 모델 파라미터(기본 float32)를 정밀도가 낮은 표현으로 바꾸는 최적화다. 결과적으로 모델 크기 감소, 이식성 향상, 계산 속도 향상이 기대된다.
분류: PTQ vs QAT
- Post-training Quantization (PTQ): 학습이 끝난 모델을 변환(conversion)해서 양자화한다. POT(Post-training Optimization Tool) 같은 도구가 빠르고 쉽다. 모델 사이즈 감소와 CPU/하드웨어 가속기 지연 개선 효과가 있으나, 정확도 저하가 조금 있을 수 있다(little degradation).
- Quantization-aware Training (QAT): 학습 단계에서 추론 시 양자화를 에뮬레이션(emulates inference-time quantization)한다. 실제 양자화 모델을 만들 때 양자화 환경을 고려한 모델이 되도록 한다. 8-bit 같은 저정밀 사용이 배포 시 이점을 만든다.
왜 되는가? AlexNet 예시처럼 가중치 분포가 좁은 범위에 몰려 있는 경향이 있어, 큰 손실 없이 더 적은 비트로 표현 가능하다. 양자화 대상은 Weights(가중치), Biases(바이어스), Activations(활성값)이다. 연속적인 분포(실수)를 이산적인 값(계단/막대 형태)으로 바꾸는 과정이다.
9. Knowledge Distillation (지식 증류)
지식 증류는 "큰 모델의 지식을 작은 모델로 옮기는 과정"이다. 큰 네트워크(teacher) → 작은 네트워크(student) 구조로, 같은 입력 x가 teacher와 student에 동시에 들어간다.
Teacher 출력은 Softmax(T=t) 형태로 soft labels(부드러운 확률 분포)를 생성하고, student도 Softmax(T=t)로 soft predictions를 만든다. teacher soft label과 student soft prediction 사이를 맞추는 distillation loss를 계산한다. 동시에 student는 Softmax(T=1)에서 실제 정답 y(ground truth, hard label)와의 차이를 student loss로 학습한다.
핵심은 "정답만" 따라가는 것이 아니라, teacher가 내는 클래스 확률분포 전체(soft target)를 참고해 더 풍부한 정보를 학습한다는 점이다.
10. TinyML과 M5Core2 배포 워크플로우
TinyML/Embedded ML은 wearable, camera, IoT sensor 같은 작고 저전력 장치에서 동작한다. MCU 예시로 메모리 16KB, 32-bit Arm Cortex-M4 같은 제한이 강조된다. 따라서 "Shrink & Fit Model into Small Memory"가 핵심이고, Model Shrinking Concepts로 Quantization(32bits→8bits), Model Pruning, Distillation/Knowledge Distillation, Model Compression 등이 정리된다.
Audio ML Workflow: TFLite Model to Arduino (M5Core2) 흐름은 대략 다음과 같다.
- PC에서 모델 학습: TensorFlow로 학습하고 model.tflite 출력.
- INT8로 양자화: 컨트롤러에서 돌아가도록 사이즈 축소.
- TFLite → C 배열로 변환: xxd -i model_int8.tflite > model_data.cc 같은 형태로 C/C++ 배열화.
- Arduino Sketch(M5Core2) 구성: model_data.cc 추가, 메모리(arena) 설정, TFLM(TensorFlow Lite Micro) 라이브러리, 특징추출(MFCC), 추론 루프(inference loop).
- 오디오 캡처 & 특징 추출: 마이크(i2s, 16kHz), log-mel / MFCC(40). 학습 때와 동일한 설정 유지가 중요하다.
- TFLite Micro로 추론: 루프에서 실행, MFCC 특징 입력, 출력 점수/라벨 읽기.
- M5Core2에 최종 배포: C array 모델, INT8 양자화, 업로드 및 실행.
11. 실습 Task I: IMU 데이터 전송 방식 비교
PC로 IMU 데이터를 캡처할 때 다음 세 가지 프로토콜을 각각 테스트했다. 어떤 것이 더 빠른지, 얼마나 빠른지(속도 측정), 각 프로토콜이 어떻게 동작하는지(작동 원리)를 비교하는 것이 목표다.
① BLE (Bluetooth Serial)
M5Core2에서 BluetoothSerial로 "M5Core2_IMU" 이름으로 BLE를 초기화하고, 50Hz(20ms 간격)로 가속도·자이로(ax, ay, az, gx, gy, gz)를 타임스탬프와 함께 한 줄씩 전송한다. PC에서는 페어링 후 해당 COM 포트를 열어 시리얼로 수신하고, CSV로 저장한 뒤 pandas로 시각화한다.
SerialBT.begin("M5Core2_IMU");
// 50Hz: interval 20000 us
SerialBT.printf("%lu,%.3f,%.3f,%.3f,%.3f,%.3f,%.3f\n",
millis(), ax, ay, az, gx, gy, gz);
ser = serial.Serial(port, BAUD, timeout=1)
while (time.time() - start_time) < RECORD_SECONDS:
if ser.in_waiting > 0:
line = ser.readline().decode('utf-8', errors='ignore').strip()
parts = line.split(',')
if len(parts) == 7: # ms, ax, ay, az, gx, gy, gz
data_list.append(parts)
df.to_csv(OUT_FILE, index=False) # bt_imu_log.csv
② WiFi: UDP
M5Core2는 WiFi에 연결한 뒤, IMU에서 가속도·자이로를 읽고 온보드에서 쿼터니언을 계산(자이로 적분 + 가속도 보정)한다. 계산된 qw, qx, qy, qz를 UDP 패킷으로 PC IP와 포트(예: 12345)로 전송한다. PC에서는 UDP 소켓을 열고 해당 포트에서 수신한 패킷을 파싱해 quaternion_wifi_log.csv로 저장하고 시각화한다.
udp.beginPacket(host_ip, udp_port);
udp.printf("%lu,%.4f,%.4f,%.4f,%.4f", millis(), qw, qx, qy, qz);
udp.endPacket();
delay(10); // ~100Hz
sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
sock.bind((UDP_IP, UDP_PORT))
data, addr = sock.recvfrom(1024)
# parts: ms, qw, qx, qy, qz → quaternion_wifi_log.csv
③ ESP-NOW
ESP-NOW는 WiFi 기반이지만 AP/라우터 없이 디바이스 간 직접 통신하는 프로토콜이다. M5Core2(TX)에서 IMU로 쿼터니언을 계산한 뒤 struct_message(ms, qw, qx, qy, qz)로 묶어 esp_now_send로 브로드캐스트 주소에 전송한다. 수신 보드(RX)는 USB로 PC에 연결되어 있고, ESP-NOW로 받은 패킷을 Serial(921600)로 PC에 CSV 형식으로 출력한다. PC에서는 RX가 연결된 COM 포트를 열어 시리얼로 수신해 esp_now_quats.csv 등으로 저장한다. delay(5)로 약 200Hz 수준의 고속 스트림이 가능하다.
typedef struct struct_message { uint32_t ms; float qw, qx, qy, qz; } struct_message;
esp_now_send(broadcastAddress, (uint8_t *) &myData, sizeof(myData));
delay(5); // ~200Hz
Serial.begin(921600);
void OnDataRecv(...) {
Serial.printf("%d,%lu,%.4f,%.4f,%.4f,%.4f\n", id, ms, qw, qx, qy, qz);
}
실습을 통해 BLE는 페어링과 대역폭 제한, UDP는 WiFi 설정과 지연, ESP-NOW는 저지연·고속이지만 RX 보드가 필요하다는 차이를 체감할 수 있다.
12. 실습 Task II·III: CNN 압축과 보드 추론
Task II (Open Problem)에서는 "action" IMU 데이터를 PC로 수집한다. 위에서 성공한 프로토콜(BLE, UDP, ESP-NOW) 중 하나를 사용하거나, 이전 시간에 사용한 Serial(UART)로 캡처한 데이터를 사용할 수 있다.
- 모델 개발: CNN으로 모델을 개발하고 h5 포맷으로 저장한다. tensorflow-model-optimization 패키지를 사용해 CNN 개발 과정에서 pruning을 적용한다. 패키지 설치가 안 되면 수동(manual) pruning을 한다. model compression %(압축률)를 계산하여 보고한다.
- 최적화/변환: TFLiteConverter로 float32 → int8 변환(양자화)한다. tflite 모델로 export하고, 모델을 C++ header 파일로 변환해 임베디드에 올릴 수 있게 한다.
Task III: 결과 비교/개선/보드 추론
비교 대상 모델은 (1) 기본 h5, (2) pruned h5, (3) quantized tflite 세 종류다. 정확도(accuracy)와 시간(timing)을 비교하고 결과를 표로 정리(tabulate)한다. tflite 결과가 나쁘면 개선(improve)하고, 개선된 tflite로 M5Core2에서 실제 추론을 수행한다.
이를 통해 "이식성과 효율의 트레이드오프"와 "모델 압축 → TFLite → Tiny 디바이스 배포" 전체 파이프라인을 한 번에 경험하게 된다.
13. 정리
이번 수업에서는 임베디드 환경에서의 이식성·효율 트레이드오프, ML 모델의 정확도와 연산량 관계, 대표 CNN 비교, 그리고 모델 압축 기법(Pruning, Quantization, Knowledge Distillation)을 이론으로 다뤘다.
실습에서는 M5Core2에서 PC로 IMU 데이터를 전송하는 세 가지 방식(BLE, WiFi UDP, ESP-NOW)을 구현하고 비교했고, CNN 모델에 프루닝과 양자화를 적용해 TFLite로 변환한 뒤 정확도·시간을 비교하고 M5Core2에 배포하는 과정까지 맛봤다.
TinyML은 제한된 메모리와 전력에서 모델을 "맞춰 넣는" 문제다. 작은 모델은 더 빠르고, 메모리를 덜 쓰고, 전력을 덜 소비한다는 점을 직접 확인하는 시간이었다.
'UNLV' 카테고리의 다른 글
| [UNLV] - 오프라인 음성 인식으로 Tello 드론 제어(11일차) (0) | 2026.02.20 |
|---|---|
| [UNLV] - OpenCV와 YOLO: 컴퓨터 비전 실습(10일차) (2) | 2026.02.19 |
| [UNLV] - 딥러닝과 합성곱 신경망(8일차) (2) | 2026.02.14 |
| [UNLV] - 데이터 엔지니어링과 MQTT 스트리밍(7일차) (0) | 2026.02.13 |
| [UNLV] - 키워드 스포팅과 오디오 처리(6일차) (0) | 2026.02.12 |