클라우드 기반의 AI 모델을 프로덕션 환경에서 운영하다 보면 필연적으로 네트워크 레이턴시(Network Latency)와 대역폭 비용 문제에 직면하게 됩니다. 특히 스마트 팩토리의 이상 감지 시스템이나 자율 주행 보조 장치처럼 실시간 응답이 필수적인 환경에서, 서버 왕복 시간(RTT)이 200ms를 초과하는 순간 서비스의 가치는 급격히 하락합니다. 엣지 AI(Edge AI)는 선택이 아닌 필수 생존 전략이 되었습니다.
클라우드 AI의 한계와 온디바이스 전환 경험
최근 IoT CCTV 객체 탐지 프로젝트를 진행하며, 4K 영상을 클라우드로 전송하여 추론하는 방식은 네트워크 대역폭을 감당할 수 없음을 확인했습니다. 또한, 데이터 프라이버시 이슈로 인해 영상 데이터를 외부로 유출하지 말아야 한다는 요구사항이 있었습니다. 이 문제를 해결하기 위해 고성능 서버 모델을 라즈베리 파이(Raspberry Pi)나 모바일 AP의 NPU(Neural Processing Unit)에서 직접 실행하는 온디바이스(On-Device) AI로 아키텍처를 변경해야 했습니다.
OOM(Out Of Memory) 킬러가 프로세스를 종료시킵니다.
모델 경량화 핵심 기술: Quantization & Pruning
엣지 디바이스에 모델을 배포하기 위해서는 모델 경량화(Model Compression) 과정이 필수적입니다. 가장 효과적인 두 가지 기법은 양자화(Quantization)와 가지치기(Pruning)입니다.
1. 양자화 (Quantization)
양자화는 모델의 가중치(Weight)와 활성화 함수(Activation)의 정밀도를 32비트 부동소수점(Float32)에서 8비트 정수(Int8) 등으로 줄이는 기술입니다. 이를 통해 모델 크기를 약 1/4로 줄이고, 메모리 대역폭 사용량을 감소시켜 추론 속도를 비약적으로 높일 수 있습니다.
2. 가지치기 (Pruning)
가지치기는 신경망에서 영향력이 적은(값이 0에 가까운) 가중치를 제거하여 희소(Sparse) 모델로 만드는 기법입니다. 적절히 적용하면 정확도 손실 없이 모델 크기를 줄일 수 있으나, 하드웨어 가속기가 희소 연산을 지원해야 성능 이득을 볼 수 있습니다.
TensorFlow Lite를 이용한 Post-Training Quantization 구현
가장 현실적이고 적용하기 쉬운 방법은 학습이 완료된 모델을 변환할 때 양자화를 적용하는 Post-Training Quantization(PTQ)입니다. 아래는 TensorFlow 모델을 TFLite 포맷으로 변환하며 Full Integer Quantization을 적용하는 코드입니다.
import tensorflow as tf
# 1. 학습된 SavedModel 경로 설정
saved_model_dir = 'path/to/saved_model'
# 2. 대표 데이터셋(Representative Dataset) 생성
# 실제 추론 데이터의 분포를 알아야 정확한 스케일링 팩터를 계산할 수 있음
def representative_data_gen():
for input_value in tf.data.TFRecordDataset(train_images_tfr).take(100):
# 모델 입력 형상에 맞게 전처리 필요
yield [tf.dtypes.cast(input_value, tf.float32)]
# 3. 컨버터 설정
converter = tf.lite.TFLiteConverter.from_saved_model(saved_model_dir)
# 최적화 플래그 설정 (기본적으로 사이즈 최적화)
converter.optimizations = [tf.lite.Optimize.DEFAULT]
# 4. Full Integer Quantization 설장 (CPU/EdgeTPU 가속을 위해 필수)
converter.representative_dataset = representative_data_gen
converter.target_spec.supported_ops = [tf.lite.OpsSet.TFLITE_BUILTINS_INT8]
converter.inference_input_type = tf.int8 # 입력도 Int8로 변환
converter.inference_output_type = tf.int8 # 출력도 Int8로 변환
# 5. 변환 및 저장
tflite_model_quant = converter.convert()
with open('mobilenet_v2_quantized.tflite', 'wb') as f:
f.write(tflite_model_quant)
# 성공 로그
print("Model converted to TFLite Int8 successfully.")
representative_dataset이 없으면 동적 범위 양자화(Dynamic Range Quantization)만 적용되어, 가중치는 줄어들지만 연산 속도 향상은 제한적일 수 있습니다. NPU 가속을 위해서는 반드시 대표 데이터셋을 제공해야 합니다.
성능 비교 및 검증
실제 ARM Cortex-A72 기반의 엣지 디바이스에서 MobileNet V2 모델을 기준으로 최적화 전후의 성능을 측정한 결과입니다.
| 모델 타입 | 파일 크기 | 추론 시간 (CPU) | 추론 시간 (NPU/DSP) | 정확도 (Top-1) |
|---|---|---|---|---|
| Original (Float32) | 14.0 MB | 120 ms | 지원 불가 | 71.8% |
| Optimized (Int8) | 3.5 MB | 55 ms | 8 ms | 70.9% |
결론
엣지 AI의 성공 여부는 모델의 정확도뿐만 아니라 추론 속도(Latency)와 전력 효율(Power Efficiency)의 균형을 맞추는 데 있습니다. 단순히 모델 구조를 작게 설계하는 것을 넘어, 하드웨어 특성에 맞는 양자화 기법을 적용해야만 진정한 온디바이스 AI 성능을 끌어낼 수 있습니다. 초기 단계에서는 TensorFlow Lite나 PyTorch Mobile의 기본 양자화 기능을 활용하고, 이후 프로파일링 도구를 통해 병목 구간을 분석하는 접근 방식을 권장합니다.
Post a Comment