MATLAB と Simulink を使用した組み込み AI
コンセプトから量産まで、あらゆる組み込みハードウェアに AI を展開しましょう。
MATLAB と Simulink を使用した組み込み AI の特長
システムレベルのシミュレーションと自動コード生成を用いて、リソースに制約のあるハードウェア (MCU、GPU、FPGA、NPU) に学習済みの AI モデルを展開できます。
- システムレベル シミュレーション: 実機を使用する前に、コントローラー、センサー、プラントモデルとともに AI の動作をテストできます。
- コード生成: 手作業による移植なしで、AI コンポーネントを含む Simulink モデルから最適化された C/C++、CUDA、または HDL を直接生成できます。
- インポートの柔軟性: PyTorch、ONNX、または TensorFlow のモデルを導入し、同一のパイプライン経由で展開できます。
- 全段階での検証: 形式的手法、敵対的ロバスト性テスト、およびソフトウェアインザループ (SIL)、プロセッサインザループ (PIL)、ハードウェアインザループ (HIL) テストを用いて、あらゆる段階で AI コンポーネントを検証できます。
- 規格への準拠: DO-178C、ISO 26262、IEC 61508 認証に対応するトレーサビリティを備えた MISRA C 準拠コードを生成できます。
エンドツーエンドの組み込み 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% | 活性化値の相関が高い全結合層主体のネットワークや再帰型ネットワーク |
| 量子化 | 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 |
最初の引数は、dlnetwork オブジェクト (MATLAB で学習されたもの、またはインポートされたもの) またはモデルファイルパス — 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 モデルをシステム シミュレーションに組み込み、コントローラー、センサー、プラントモデルとともに動作を検証します。
| ブロック | コード | ユースケース |
|---|---|---|
| 同時実行 |
|
PyTorch、TensorFlow、ONNX、またはカスタム Python モデルを、変換を行わずに Simulink で直接シミュレーションします。全面的な統合の前に、サードパーティの AI が大規模なシステムでどのように機能するかを評価します。 |
| Predict |
|
dlnetwork を、単一の推論ブロック (分類または回帰) として実行します。 |
| PyTorch Exported Program |
|
C/C++ および CUDA コード生成を使用して、PyTorch .pt2 モデルを Simulink で直接実行します。 |
| 層ブロック | exportNetworkToSimulink |
層ごとの固定小数点制御および検査向けに、ネットワークを個別の Simulink ブロックとしてエクスポートします。 |
展開と検証
MATLAB なしで稼働するスタンドアロンのソースコードを生成し、その後ターゲット ハードウェア上で段階的に検証します。
コード生成
| 製品 | 出力 | 主なターゲット | ターゲットライブラリ |
|---|---|---|---|
| MATLAB Coder | C/C++ | ARM Cortex-A、x86、任意の POSIX/RTOS | スタンドアロン*、Intel oneDNN |
| Embedded Coder | 量産向け C/C++ | NXP、Infineon、STMicro、Renesas MCU など | スタンドアロン*、CMSIS、CMSIS-NN |
| GPU Coder | CUDA C++ | NVIDIA Jetson Thor、Orin、Xavier、TX2 | スタンドアロン*、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 |
*サードパーティ製ライブラリに依存しない、任意のプロセッサ向けのスタンドアロン ANSI/ISO C/C++ を生成するには、ターゲットのディープラーニング ライブラリを 'none' に設定します。
エントリポイント関数のパターン
% 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 (モデルインザループ) | Simulink モデル (インタープリター実行) | ホスト PC | アルゴリズムの正確性: ゴールデン リファレンスを確立 |
| SIL (ソフトウェアインザループ) | 生成された C/C++/CUDA コード | ホスト PC (コンパイル済み) | 動作の正確性: ホストプロセッサ上で実行される生成済みコードの数値的等価性 |
| PIL (プロセッサインザループ) | 生成された C/C++/CUDA コード | ターゲット ハードウェア | ターゲット固有の影響: コンパイラ、FPU、ターゲットプロセッサ上で実行される生成コードの数値的等価性 |
| HIL (ハードウェアインザループ) | 実際の 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