소개: 네트워크 엣지에서의 딥 러닝
TinyML 리소스 장치에 딥 러닝을 적용하는 분야 극히 제한적: 몇 킬로바이트의 RAM을 갖춘 마이크로컨트롤러, 스마트폰, IoT 센서 및 임베디드 장치. 추론을 위해 데이터를 클라우드로 보내는 대신 모델이 실행됩니다. 장치에서 직접 대기 시간이 없고 완전한 개인 정보 보호 및 오프라인 작업을 제공합니다.
문제는 일반적으로 기가바이트의 메모리가 필요한 모델을 몇 메가바이트로 압축하는 것입니다. 또는 킬로바이트까지 허용 가능한 정확도를 유지합니다. 다음과 같은 기술 양자화, 전정 e 지식 증류 이것을 가능하게 만드십시오. 이번 글에서는 압축 기술을 살펴보겠습니다. 배포 프레임워크 및 실제 사용 사례.
무엇을 배울 것인가
- 임베디드 장치의 제약: 메모리, 계산, 에너지
- 양자화: float32에서 int8 이상
- 가지치기: 불필요한 무게 제거
- 지식 증류: 대규모 모델에서 소규모 모델로 지식 이전
- TensorFlow Lite 및 ONNX: Edge 배포 프레임워크
- 개인 정보 보호 및 기기 내 추론
- 사용 사례: 제스처 인식, 이상 탐지, 키워드 발견
임베디드 장치 제약
임베디드 장치는 모델 실행을 불가능하게 만드는 심각한 제약 하에서 작동합니다. 표준 딥 러닝:
- 메모리(RAM): 256KB(마이크로컨트롤러)부터 4~8GB(스마트폰)까지. ResNet-50 모델에는 ~100MB, GPT-2 소형 ~500MB가 필요합니다.
- 컴퓨팅(CPU/NPU): 수십 MHz(마이크로컨트롤러)에서 수 GHz(모바일)까지. 대부분의 경우 전용 GPU 없음
- 에너지: 밀리와트(배터리 구동 센서)에서 몇 와트(스마트폰)까지. 추론은 에너지 효율적이어야 합니다.
- 저장: 몇 MB(플래시)에서 기가바이트(모바일)까지. 모델은 사용 가능한 저장 공간에 맞아야 합니다.
엣지 AI가 중요한 이유
온디바이스 추론은 다음과 같은 중요한 이점을 제공합니다. 제로 레이턴시 (왕복은 안됨 클라우드로), 은둔 (데이터가 장치 외부로 유출되지 않음) 신뢰할 수 있음 (인터넷 연결 없이 작동), 비용 (추론을 위한 클라우드 비용 없음) e 확장성 (수십억 개의 장치가 동시에 추론을 수행할 수 있습니다).
양자화: 수치 정밀도 감소
La 양자화 float32의 모델 가중치 및 활성화를 변환합니다. (32비트)를 더 적은 비트로 표현: int8(8비트), int4(4비트) 또는 바이너리 (1비트). 이는 모델의 크기를 줄이고 추론 속도를 높입니다. 정수에서는 부동 소수점보다 더 효율적입니다.
훈련 후 양자화(PTQ)
가장 간단한 양자화: 이미 훈련된 모델을 가져와 가중치를 변환합니다. 재교육이 필요하지 않지만 정확도가 약간 떨어질 수 있습니다.
QAT(양자화 인식 훈련)
모델은 순방향 전달 동안 양자화를 시뮬레이션하여 훈련됩니다. 이를 통해 감소된 정확도에 적응하기 위해 네트워크를 조정하고 일반적으로 PTQ로 손실된 정확도를 복구합니다.
import torch
import torch.quantization as quant
# --- Post-Training Quantization ---
model = load_trained_model()
model.eval()
# Configurazione quantizzazione: int8 per pesi e attivazioni
model.qconfig = quant.get_default_qconfig('fbgemm') # Per x86
# model.qconfig = quant.get_default_qconfig('qnnpack') # Per ARM
# Preparare il modello
model_prepared = quant.prepare(model)
# Calibrazione: passa dati reali per determinare range
with torch.no_grad():
for batch in calibration_loader:
model_prepared(batch)
# Convertire a modello quantizzato
model_quantized = quant.convert(model_prepared)
# Confronto dimensioni
import os
torch.save(model.state_dict(), 'model_fp32.pth')
torch.save(model_quantized.state_dict(), 'model_int8.pth')
size_fp32 = os.path.getsize('model_fp32.pth') / 1e6
size_int8 = os.path.getsize('model_int8.pth') / 1e6
print(f"FP32: {size_fp32:.1f} MB")
print(f"INT8: {size_int8:.1f} MB")
print(f"Compression: {size_fp32/size_int8:.1f}x")
가지치기: 필수적이지 않은 가중치 제거
Il 전정 연결(가중치) 또는 전체 구조(뉴런, 채널, 레이어) 모델 출력에 거의 기여하지 않습니다. 신경망은 일반적으로 과도하게 매개변수화된: 중량의 최대 90%까지 손실 제거 가능 최소 정확도.
- 구조화되지 않은 가지치기: 개별 가중치를 제거합니다(0으로 설정). 압축률은 높지만 가속을 위해서는 특수 하드웨어가 필요함
- 구조화된 가지치기: 전체 채널, 필터 또는 레이어를 제거합니다. 표준 하드웨어와 호환, 즉각적인 실제 가속
import torch.nn.utils.prune as prune
model = load_trained_model()
# Pruning non strutturato: rimuovi 50% dei pesi per magnitudine
for name, module in model.named_modules():
if isinstance(module, torch.nn.Conv2d):
prune.l1_unstructured(module, name='weight', amount=0.5)
elif isinstance(module, torch.nn.Linear):
prune.l1_unstructured(module, name='weight', amount=0.3)
# Contare pesi zero (pruned)
total = 0
pruned = 0
for name, param in model.named_parameters():
if 'weight' in name:
total += param.numel()
pruned += (param == 0).sum().item()
print(f"Parametri totali: {total:,}")
print(f"Parametri pruned: {pruned:,} ({100*pruned/total:.1f}%)")
# Rendere il pruning permanente
for name, module in model.named_modules():
if isinstance(module, (torch.nn.Conv2d, torch.nn.Linear)):
prune.remove(module, 'weight')
지식 증류: 교사와 학생
La 지식 증류 대형 모델에 대한 지식을 전달합니다. (선생님) 작은 모델 (학생). 라벨로만 학생을 교육하는 대신 맞습니다. 이는 다음을 복제하도록 훈련되었습니다. 소프트 예측 선생님의 (예측 클래스뿐만 아니라 출력의 전체 확률) 이러한 소프트 예측 더 풍부한 정보를 포함합니다. 예를 들어 고양이 사진의 확률은 비슷합니다. 비행기의 경우 호랑이와 배스에 이르기까지 이 구조는 학생에게 도움이 됩니다.
TensorFlow Lite: 모바일 및 엣지에 배포
텐서플로우 라이트 ML 모델 배포를 위한 참조 프레임워크 모바일 및 임베디드 장치에서. 모델을 최적화하는 변환기(양자화, 융합 연산자) 및 추론을 위한 경량 런타임을 제공합니다.
import tensorflow as tf
# Convertire modello Keras a TFLite con quantizzazione
model = tf.keras.models.load_model('my_model.h5')
converter = tf.lite.TFLiteConverter.from_keras_model(model)
# Quantizzazione int8 completa
converter.optimizations = [tf.lite.Optimize.DEFAULT]
converter.representative_dataset = representative_data_gen
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()
# Salvare modello TFLite
with open('model_quantized.tflite', 'wb') as f:
f.write(tflite_model)
print(f"Modello TFLite: {len(tflite_model)/1024:.0f} KB")
# Inferenza con TFLite
interpreter = tf.lite.Interpreter(model_path='model_quantized.tflite')
interpreter.allocate_tensors()
input_details = interpreter.get_input_details()
output_details = interpreter.get_output_details()
interpreter.set_tensor(input_details[0]['index'], input_data)
interpreter.invoke()
output = interpreter.get_tensor(output_details[0]['index'])
ONNX: 프레임워크 간 상호 운용성
ONNX (Open Neural Network Exchange)는 다음을 허용하는 개방형 형식입니다. 모든 프레임워크(PyTorch, TensorFlow 등)에서 모델을 내보내고 런타임으로 실행 최적화되었습니다. ONNX 런타임 여러 가지에 대한 자동 최적화를 제공합니다 하드웨어 플랫폼, TVM 모델을 최적화된 네이티브 코드로 컴파일 특정 장치의 경우.
실제 사용 사례
- 키워드 스포팅: 몇 KB의 RAM을 갖춘 기기에서 음성 명령("Hey Siri", "OK Google")을 인식합니다. >95% 정확도의 20-50KB 모델
- 제스처 인식: IMU 센서(가속도계, 자이로스코프)로 제스처를 인식합니다. 스마트워치 및 웨어러블용 템플릿
- 이상 탐지: 진동센서로 산업기계의 이상현상을 감지합니다. 클라우드 연결 없이 예측 유지 관리
- 모바일에서의 객체 감지: 스마트폰에서 실시간 객체 인식을 위한 MobileNet 및 EfficientDet
- 온디바이스 안면 인식: Apple의 Face ID는 A 시리즈 칩에 전용 신경 모델을 사용합니다.
시리즈의 다음 단계
- 지난 글에서 우리는설명 가능한 AI(XAI)
- SHAP, LIME 및 GradCAM을 사용하여 모델 결정을 해석하는 방법을 살펴보겠습니다.
- 모델의 투명성이 GDPR 규정 준수 및 공정성에 필수적인 이유를 분석합니다.







