MATLAB 및 Simulink를 활용한 임베디드 AI
개념부터 프로덕션 단계까지, 어떤 임베디드 하드웨어에도 AI를 배포할 수 있습니다.
임베디드 AI에 MATLAB 및 Simulink를 활용하는 이유
시스템 수준 시뮬레이션 및 자동 코드 생성을 통해 MCU, GPU, FPGA 및 NPU 같은 리소스가 제한된 하드웨어에 훈련된 AI 모델을 배포할 수 있습니다.
- 시스템 수준 시뮬레이션: 실제 하드웨어에 적용하기 전에 제어기, 센서 및 플랜트 모델과 함께 AI의 동작을 테스트할 수 있습니다.
- 코드 생성: 별도의 수작업 이식 작업 없이도 AI 컴포넌트를 비롯한 최적화된 C/C++, CUDA 또는 HDL을 Simulink 모델로부터 직접 생성할 수 있습니다.
- 모델 가져오기의 유연성: PyTorch, ONNX 또는 TensorFlow 모델을 가져와 동일한 파이프라인을 통해 배포할 수 있습니다.
- 전 단계에 걸친 검증. 정형 기법, 적대적 강인성 테스트, SIL(Software-in-the-Loop), PIL(Processor-in-the-Loop) 및 HIL(Hardware-in-the-Loop) 테스트를 통해 모든 단계에서 AI 컴포넌트를 검증할 수 있습니다.
- 표준 준수: 추적성을 갖춘 MISRA C 준수 코드를 생성해 DO-178C, ISO 26262 및 IEC 61508 인증을 지원할 수 있습니다.
종단간 임베디드 AI 워크플로
준비
훈련 / 가져오기
압축
훈련 / 가져오기
통합
검증
반복적인 특성:
이 워크플로는 엄격하게 선형적이진 않습니다. 프로젝트의 메모리 제약 조건, 지연 시간 요구사항, 타겟 하드웨어 및 표준 준수 요구사항에 따라 일부 단계는 반복 수행하거나 순서가 변경될 수 있으며, 완전히 생략될 수도 있습니다.
AI 모델 훈련/가져오기
프로그래밍 방식으로 MATLAB에서 훈련
% Train a deep learning network net = trainnet(data, layers, "crossentropy", options); % Train a machine learning model mdl = fitcsvm(features, labels);
대화형 방식으로 MATLAB에서 훈련
외부 프레임워크에서 가져오기
% Import from PyTorch (exported program format) net = importNetworkFromPyTorch("exported_pytorch_model.pt2") net = dlnetwork with properties: Layers: [9×1 nnet.cnn.layer.Layer] Connections: [11×2 table] Learnables: [86×3 table] State: [42×3 table] InputNames: {'InputLayer1'} OutputNames: {'ResidualNetSmall:fc'} Initialized: 1
| 출처 | 함수 |
|---|---|
| PyTorch (.pt2/.pt) | importNetworkFromPyTorch |
| ONNX | importNetworkFromONNX |
| TensorFlow 2 | importNetworkFromTensorFlow |
| Keras 3 | importNetworkFromKeras |
| XGBoost (.json) | importModelFromXGBoost |
모델 압축
%% Step 1: Prune (e.g., remove 60% of learnables) netPruned = compressNetworkUsingTaylorPruning(net, dsTrain, "crossentropy", ... options, LearnablesReductionGoal=0.6); %% Step 2: Project (e.g., retain 80% variance) npca = neuronPCA(netPruned, dsTrain); netProjected = compressNetworkUsingProjection(netPruned, npca, ... ExplainedVarianceGoal=0.8); netProjected = trainnet(data, netProjected, "crossentropy", optionsFT); %% Step 3: Quantize (INT8) quantObj = dlquantizer(netProjected, ExecutionEnvironment="CPU"); calibrate(quantObj, dsCal); netQuantized = quantize(quantObj);
| 기법 | 잠재적 모델 크기 감소율 | 적용 시점 |
|---|---|---|
| 가지치기 | 50~70% | 중복 필터로 과대파라미터화된 CNN |
| 투영 | 20~85% | 활성값 간 상관관계가 높은 FC 비중이 높은 신경망 또는 순환 신경망 |
| 양자화 | 75% (4배) | 고정소수점 프로세서에 배포하기 전 최종 단계 |
팁:
추천 순서: 가지치기 → 투영 → 양자화 (각 단계 완료 후 미세 조정). estimateNetworkMetrics(net)을 사용해 매 단계 전후로 학습 가능한 파라미터, 활성화 메모리 및 MAC를 측정할 수 있습니다. Deep Learning Toolbox Model Compression Library도 참고해 보세요.
AI 모델 검증
배포하기 전에 AI Verification Library 및 Deep Learning Toolbox Interface for alpha-beta-CROWN Verifier를 사용해 안전 속성을 증명하거나 강인성을 평가할 수 있습니다. 일부 입력 샘플만을 테스트하는 방식과 달리, 정형 검증은 연속적인 입력 범위 전체에 대한 수학적 보증을 제공합니다.
| 기법 | 기능 설명 | 주요 함수 |
|---|---|---|
| 강인성 검증 | 지정된 입력 범위 내에서 신경망의 분류 결과가 변하지 않음을 증명 | verifyNetworkRobustness |
| 정형 출력 범위 | 지정된 입력 범위에 대해 신경망 출력이 가질 수 있는 상한 및 하한 계산 | estimateNetworkOutputBounds |
| 적대적 강인성 | 지정된 입력 범위 안에서 오분류를 유발할 수 있는 적대적 표본 발견 | findAdversarialExamples |
| 분포 외 데이터 탐지 | 훈련 데이터와 다른 특성을 가진 입력을 탐지해 런타임 중 예기치 않은 오류 방지 | networkDistributionDiscriminator |
첫 번째 인수는 (MATLAB에서 훈련되거나 가져온) dlnetwork 객체 또는 모델 파일 경로입니다. 즉, ONNX 파일(.onnx) 또는 전체 PyTorch 모델(torch.save()로 저장된)입니다. 함수와 구문은 동일합니다.
% Prove classification is robust to sensor noise around input X0 XLower = X0 - epsilon; XUpper = X0 + epsilon; [result, cex] = verifyNetworkRobustness(net, XLower, XUpper, trueLabel); % Compute guaranteed output bounds over the input region [YLower, YUpper] = estimateNetworkOutputBounds(net, XLower, XUpper); % Find adversarial examples within bounded region [adversarials, success] = findAdversarialExamples(net, XLower, XUpper, trueLabel);
Simulink에서 통합
시스템 시뮬레이션에 AI 모델을 내장해 코드를 생성하기 전에 제어기, 센서 및 플랜트 모델과 함께 동작을 검증할 수 있습니다.
| 블록 | 코드 | 활용 사례 |
|---|---|---|
| Co-Execution |
|
PyTorch, TensorFlow, ONNX 또는 사용자 지정 Python 모델을 변환 없이 Simulink에서 직접 시뮬레이션, 전체 통합 전에 더 큰 시스템 내에서 타사 AI 성능 평가 |
| Predict |
|
dlnetwork를 단일 추론 블록으로 실행(분류 또는 회귀) |
| PyTorch ExportedProgram |
|
C/C++ 및 CUDA 코드 생성을 통해 Simulink에서 직접 PyTorch .pt2 모델 실행 |
| Layer Blocks | exportNetworkToSimulink |
신경망을 개별 Simulink 블록으로 내보내어 계층별 고정소수점 제어 및 검사 수행 |
배포 및 검증
MATLAB 없이 실행되는 독립 실행형 소스 코드를 생성한 다음, 타겟 하드웨어에서 점진적으로 검증할 수 있습니다.
코드 생성
| 제품 | 출력 | 주요 타겟 | 타겟 라이브러리 |
|---|---|---|---|
| MATLAB Coder | C/C++ | ARM Cortex-A, x86, 모든 POSIX/RTOS | Standalone*, Intel oneDNN |
| Embedded Coder | 프로덕션 C/C++ | NXP, Infineon, STMicro, Renesas MCU 등 | Standalone*, CMSIS, CMSIS-NN |
| GPU Coder | CUDA C++ | NVIDIA Jetson Thor, Orin, Xavier, TX2 | Standalone*, TensorRT |
| Embedded Coder + HSP | NPU에 최적화된 C/C++ | Qualcomm Hexagon, Infineon PPU (AURIX TC4x) | 공급업체 NPU 런타임 |
| HDL Coder | VHDL/Verilog | AMD(Xilinx) FPGA, Intel FPGA | Deep Learning HDL Toolbox IP |
*타겟 딥러닝 라이브러리를 'none'으로 설정하면 타사 라이브러리에 의존하지 않는 독립 실행형 ANSI/ISO C/C++를 생성하여 모든 프로세서에서 사용할 수 있습니다.
진입점 함수 패턴
% Use MATLAB dlnetwork
function out = myPredict(in) %#codegen
persistent net
if isempty(net)
net = coder.loadDeepLearningNetwork('myNet.mat');
end
out = predict(net, in);
end
% Use PyTorch model function out = myPredict(in) %#codegen persistent pytorchNet if isempty(pytorchNet) pytorchNet = loadPyTorchExportedProgram('myPyTorchNet.pt2'); end out = invoke(pytorchNet, in); end
구성 및 생성
% Generate C++ for any processor cfg = coder.config('lib'); cfg.TargetLang = 'C++'; cfg.DeepLearningConfig = coder.DeepLearningConfig('none'); codegen -config cfg myPredict -args {ones(224,224,3,'single')} % Generate CUDA for NVIDIA Jetson gpuCfg = coder.gpuConfig('lib'); gpuCfg.DeepLearningConfig = coder.DeepLearningConfig('tensorrt'); codegen -config gpuCfg myPredict -args {ones(224,224,3,'single')}
| 타겟 라이브러리 | 하드웨어 |
|---|---|
'none' |
모두 (라이브러리 제약 없음) |
'mkldnn' |
x86-64 (Intel oneDNN) |
'cudnn' |
NVIDIA GPU |
'tensorrt' |
NVIDIA GPU/Jetson |
시스템 수준 검증 (MIL/SIL/PIL/HIL)
검증은 단계적으로 수행합니다. 모델(MIL) → 호스트에서 실행되는 생성된 코드(SIL) → 타겟 프로세서(PIL) → 실제 I/O를 포함한 전체 시스템(HIL).
| 단계 | 실행 대상 | 실행 환경 | 검증 내용 |
|---|---|---|---|
| MIL (Model-in-the-Loop) | Simulink 모델 (인터프리터 실행) | 호스트 PC | 알고리즘 정확성: 골든 레퍼런스 수립 |
| SIL (Software-in-the-Loop) | 생성된 C/C++/CUDA 코드 | 호스트 PC (컴파일 실행) | 생성된 코드의 동작 정확성: 호스트 프로세서에서 실행되는 생성된 코드와 모델의 수치적 동등성 확인 |
| PIL (Processor-in-the-Loop) | 생성된 C/C++/CUDA 코드 | 타겟 하드웨어 | 타겟 특정 효과: 컴파일러, FPU, 타겟 프로세서에서 실행 중인 생성된 코드의 수치적 동등성 확인 |
| HIL (Hardware-in-the-Loop) | 실제 I/O를 포함한 전체 시스템 | 실시간 타겟 | 실시간 효과: 통합, 타이밍 및 I/O 동작 |
% Processor-in-the-Loop verification set_param("myModel/AI_Subsystem", "SimulationMode", "Processor-in-the-loop"); out = sim("myModel"); % Compare PIL output against MIL baseline to detect numerical drift