치트시트

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 모델
훈련 / 가져오기
→
모델
압축
→
AI 모델
훈련 / 가져오기
→
Simulink에서
통합
→
배포 및
검증

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배) 고정소수점 프로세서에 배포하기 전 최종 단계

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
Predict 블록
dlnetwork를 단일 추론 블록으로 실행(분류 또는 회귀)
PyTorch ExportedProgram
Co-Execution 블록
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

더 알아보기