一、ヘテロジニアスハードウェアスケジューリング
1. 基本概念
ヘテロジニアスハードウェア :1つのチップ/デバイス内に、アーキテクチャや用途が全く異なり、独立した演算能力を持つ複数の演算ユニットが含まれているもの。Orinを例にとると、ARM CPU(汎用プロセッサ)、Ampere GPU(汎用並列演算)、DLA(AI専用固定アクセラレータ)の3つは、命令セット、メモリ、得意とするタスクが全く異なります。これがヘテロジニアスハードウェアです。
ヘテロジニアスハードウェアのスケジューリング : AIモデルやビジネスパイプラインを複数のサブタスクに分割し、各ハードウェアの特長に応じてタスクを割り当て、データフローを管理し、実行タイミングを同期させ、負荷を分散させることで、CPU/GPU/DLAを同時に並列処理させ、アイドル状態を回避し、デバイス間の頻繁なデータコピーを防止し、最終的にエンドツーエンドの遅延を低減し、ハードウェア利用率を向上させ、消費電力を削減する
適切な計算処理を最適なハードウェアに割り当て、複数のハードウェアを統一的に調整して連携させ、ビジネスチェーン全体を完走させる。
2. コア比較:ホモジニアス vs ヘテロジニアス
- ホモジニアススケジューリング:すべてのタスクを1種類のハードウェアのみで処理する(例:純粋なGPUでモデル全体を実行)。スケジューリングは単純だが、演算能力や消費電力の浪費が著しい。
- 異種スケジューリング:複数のハードウェアが役割分担して連携し、チップ全体の総合演算能力を最大化します。これは、自動運転用Orinやエッジ側NPUにおける中核的な最適化手段です。
二、Orinの異種ハードウェアスケジューリングの完全解説:GPU + DLA + CPU
Orinの3大ハードウェアコアの位置づけ
NVIDIA Orin SOCには、3種類の完全に独立した演算ユニットが内蔵されており、メモリバスは相互接続されているものの、演算能力、メモリアクセス、得意とする演算子、データ転送のオーバーヘッドは全く異なる。スケジューリングの主な目標は、デバイス間のデータコピーを削減し、同種の演算子を同一ハードウェアに集中させ、負荷をバランスよく分散させて単一のボトルネックが発生しないようにすることである。
- CPU 汎用制御ユニット。専用の画像/テンソルアクセラレーション機能はなく、浮動小数点演算能力は低い。
- 得意分野:画像デコード、ビジネスロジック、スレッドスケジューリング、単純な閾値フィルタリング、パラメータ解析、メッセージキュー、mmapによるデータやり取り、例外判定;
- 弱点:畳み込み、行列乗算、NMS、正規化などのテンソル演算速度が極めて遅く、大量のループによる処理オーバーヘッドが爆発的に増加する。
- DLA(Deep Learning Accelerator、2つの独立したDLAコア) ディープラーニング専用の固定アクセラレータ。純粋なハードウェアパイプラインを採用し、低消費電力かつ安定したレイテンシを実現。
- 得意分野:標準的な3×3/5×5畳み込み、BN、ReLU、Pool、Add、Concat、Reshapeなどの規則的なCNN基本演算子;高解像度での浅層特徴抽出;
- 弱点:複雑な分岐、動的なシェイプ、深層畳み込み(DWConv)、転置畳み込み(TransposedConv)、Softmax、LayerNorm、マルチヘッドアテンション、カスタムCUDA演算子、大バッチには対応していません。DLA間でのデータ転送にはオーバーヘッドが発生します。
- GPU(NVIDIA Ampere GPU) 汎用並列演算ユニット、プログラム可能なCUDAコア、柔軟な演算能力。
- 得意分野:DWConv、転置畳み込み、PixelShuffle、Transformer QKV/マルチヘッドアテンション、Softmax、Sigmoid、NMS、カスタムCUDAプラグイン、小規模な断片化演算子、動的バッチ、複雑な分岐ネットワーク;
- 弱点:浅層かつ高解像度の畳み込みではメモリアクセス負荷が大きく、消費電力はDLAより高い。大量の標準的な基本畳み込みでは、DLAほど安定した低遅延を実現できない。
重要な制約:デバイス間のデータ転送コストが極めて高い
DLA ↔ GPU、CPU ↔ GPU、CPU ↔ DLA 間のテンソル転送にはDMA によるメモリコピーが必要であり、高解像度画像/特徴マップの1回のコピーに数msを要する場合があり、これが異種スケジューリングにおける最大の性能ボトルネックとなる。スケジューリングの第一原則: 1つのデータパス内では、演算子を可能な限りすべて同一のハードウェアに配置し、途中でデバイスを切り替えない。
三、各ハードウェア演算子の適応に関する詳細な分類(実装階層化の根拠)
1. DLAが優先的に担う演算子(全DLA処理)
ネットワークの浅層のメインバックボーンに適しており、入力解像度が高く、連続した規則的な畳み込みがあり、複雑な分岐がない場合:
- Conv2d(カーネル=3/5、ストライドは標準、通常のグループ化畳み込み)
- BatchNorm2d、ReLU、LeakyReLU、MaxPool/AvgPool
- ElementWise:Add、Mul、Sub、Div
- Concat、Slice、Reshape、Unsqueeze/Squeeze
- Global Average Pool、単純なダウンサンプリング層
DLAの制限:
- 動的な入力形状はサポートされておらず、サイズは固定である必要があります;
- 深度分離畳み込み(DWConv)および大グループ畳み込み(GroupConv)は高速化できず、自動的にGPUにフォールバックします;
- Transformer、Softmax、LayerNormは完全にサポートされていません;
- 単一の DLA では batch=1 が最適であり、batch を増やすと遅延が著しく増加する。2つの DLA を使用すれば、2つの経路に分割してメインツリーを並列処理できる。
2. GPU での実行が必須の演算子(DLA には配置できない)
ネットワークの深層部、検出ヘッド、BEV、Transformer、後処理はすべて GPU に配置:
- 畳み込み系:DW(ディープ畳み込み)、TransposedConv(転置畳み込み)、超大ブロック畳み込み;
- 活性化・正規化:Softmax、Sigmoid、LayerNorm、InstanceNorm;
- Transformer一式:QKV線形層、マルチヘッドアテンション、MatMul(行列乗算);
- 検出後処理:アンカーデコード、信頼度フィルタリング、回転NMS、通常NMS;
- カスタム演算子:CUDAプラグイン、RoIAlign、BEV特徴融合、ボクセルエンコーディング;
- 不規則な分岐、長短パスの多重融合、動的サイズ入力。
3. CPUは非テンソル論理演算のみを担当し、ネットワーク演算子の実行は禁止
データ前処理の入口および業務制御のみを行う:
- 画像ファイルのデコード(nvJPEGのハードウェアデコードはGPUにオフロード可能);
- カメラデータの受信、タイムスタンプの同期、スレッドキューの管理;
- 単純な閾値フィルタリング、結果のシリアライズおよび報告;
- モデルの読み込み、エンジンの初期化、ハードウェアリソース管理; 絶対禁止:CPUによるリサイズ、正規化、チャネル変換、NMS、ボックスデコードの実行。
4. 2つの主流なヘテロジニアス展開アーキテクチャ(自動運転BEV/2D検出に共通)
案1:バックボーンDLA + 検出ヘッド/トランスフォーマーGPU(最も一般的、レイテンシが最適)
データフロー経路:CPUによる画像取得 → GPUによるハードウェア前処理(VPI/cuCV) → 固定サイズのテンソルをDLAのVRAMにコピー → DLAによるバックボーンの浅層CNN(多段階Conv+Pool)の実行 → DLAから出力された中間特徴マップを1回だけGPUにコピー → GPUによる深層残差、DWConv、BEV Transformer、検出ヘッド、NMSの後処理 → 結果をCPUに返送し、業務報告を行う
メリット:
- 高解像度のメインツリーを低消費電力のDLAに委ね、GPUの演算リソースを解放して複雑なBEV/Transformerを処理;
- DLA→GPU間のデータコピーは1回のみであり、デバイス間転送のオーバーヘッドを最小限に抑える;
- DLAパイプラインの遅延変動が極めて小さく、自動運転のハードリアルタイム要件に適している。
実装上の注意点:
- メインストリームの出力特徴マップのチャネル数が多すぎると、DLA→GPU間のデータコピーに要する時間が急増する;
- メインストリームに複数の分岐出力がある場合、すべての分岐をDLA内で統一して処理し、分岐を統合してからGPUへコピーする;
- デュアルDLAシナリオ:左右のカメラからの2つのメインストリームをそれぞれDLA0、DLA1にバインドし、2つのストリームを並列に推論する。
案2:全GPU推論(小規模モデル/Transformerをメインネットワークとする)
適用シナリオ:純粋なTransformer、低解像度検出、軽量ネットワーク、動的バッチが必要な場合。DLAのスケジューリングが不要で、すべての演算子をGPUで実行するため、DLA演算子の非互換性やレイヤーごとの切り出しに伴う開発コストを回避できる。欠点:浅層の大きな畳み込みがGPUの演算リソースを大量に消費し、複数カメラを並行処理する際、GPU負荷が上限に達しやすい。
五、TensorRT 異種階層スケジューリングの実践設定(主要な実装手順)
Orinの異種処理は、TensorRTのLayer Device Assignment を利用して演算子のハードウェア割り当てを実現しており、2つの設定方法があります:
1. 自動階層化(シンプルなネットワーク、迅速な導入)
Engineの構築時にDLAの自動割り当てを有効にする:
IBuilderConfig* config = builder->createBuilderConfig();
// DLAを有効化し、対応する演算子を自動的にDLAに割り当てる
config->setDefaultDeviceType(DeviceType::kDLA);
// DLAコア0/1の使用を指定
config->setDLACore(0);
// DLAで使用可能なビデオメモリを設定
config->setDLAMaxWorkspaceSize(1 << 30);
自動割り当てルール:TensorRTが各層を自動的に走査し、DLAがサポートされている場合はDLAに割り当て、サポートされていない場合は自動的にGPUにフォールバックします。欠点:自動レイヤリングにより、DLA↔GPU間の断片的なコピーが大量に発生し、複雑なBEVネットワークではレイテンシが悪化します。
2. 手動によるレイヤリングとスライシング(プロジェクト最適、自動運転の標準仕様)
ネットワークを手動で2つのセグメントに分割:
- セグメントA:バックボーンの浅層 → DLAにバインド;
- セグメントB:深層 + 検出ヘッド + Transformer → GPUにバインド;中間にはデータ交換ノードとして境界テンソルが1つだけ存在する。操作手順:
- ONNX GraphSurgeonを使用してモデルを分割し、メインストリームの末尾に明示的な出力ノードを追加する;
- DLAサブエンジンとGPUサブエンジンをそれぞれ構築する;
- 推論フロー: ① GPUで画像を前処理し、ビデオメモリにアップロード; ② ビデオメモリのデータをDLA専用メモリにコピー; ③ DLAサブ推論を実行し、メインストリームの特徴量を出力; ④ DLA特徴量をGPUのビデオメモリにコピーし戻す; ⑤ GPUで残りのネットワーク+NMSを実行;
利点:デバイス間のコピーは1回のみ、遅延は安定して制御可能、負荷分散が図れる。
六、異種スケジューリングの中核となる最適化テクニック(落とし穴回避の要点)
1. デバイス間コピー回数の削減を最優先
- 処理の途中でDLAとGPUを頻繁に切り替えないこと。1回の切り替え=1回の完全なDMAコピーに相当する;
- 画像の前処理はすべてGPU(OpenCV CUDA / VPI / nvJPEG)で行い、CPUは生のデータストリームのみを転送し、完全な画像テンソルはアップロードしない;
- CUDAの統一メモリ
cudaMallocManagedを使用し、CPU/GPUでアドレス空間を共有することで、明示的なmemcpyを省略する。DLAは統一メモリに対応していないため、独立したビデオメモリバッファが必要である; - DLAの出力境界特徴マップでは、チャネル数を可能な限り圧縮し、解像度を下げて、コピーするバイト数を削減する。
2. DLA ハードウェアスケジューリングの最適化
- デュアル DLA による負荷分散:複数のカメラから入力がある場合、カメラ 0 は DLA0 を、カメラ 1 は DLA1 をメインとし、並列推論を行うことで、単一の DLA での輻輳を回避する;
- DLA の batch=1 を固定し、 動的バッチは有効にしない。DLAのバッチ推論遅延は線形に増加する;
- DLAは小サイズの特長密集計算には適さない。1/16、1/32にダウンサンプリングした後の特徴マップはすべてGPUに委ねる;
- DLAが動作している間、GPUは別の前処理/後処理を並列実行でき、ハードウェアリソースは完全に並列で競合しない。
3. GPU負荷分散
- 複数のcudaStreamによるタスク分離:Stream1:画像のGPU前処理;Stream2:DLAデータコピー;Stream3:GPU深層ネットワーク+NMS推論;ハードウェアの並列処理を活用し、データコピーの遅延を相殺;
- TransformerやNMSなどの処理に時間がかかる演算子はGPUストリームを独占し、データコピー操作との同期待ちを行わない;
- 複数モデルの並行処理シナリオ:メインツリーにDLAを配置し、GPUは検出ヘッドのみを担当させることで、複数の処理がGPUの演算能力を奪い合うのを回避する。
4. CPUスケジューリングとの連携による最適化
- CPUは軽量なスケジューリングのみを行い、画像のデコードやリサイズをすべてGPUにオフロードし、CPUでのテンソル演算を排除する;
- CPUアフィニティを設定し、収集、前処理、推論制御スレッドを異なるA78/A55コアにバインドすることで、スレッドの競合を回避する;
- 大容量画像メモリはmmapで共有し、CPUとGPU間で元の画像を重複してコピーしない;
- 推論のタイムアウトや異常時のリセットロジックをCPUに配置し、GPUがフリーズした場合はDLA/GPUの推論コンテキストを個別に再起動する。
七、負荷分散の判定基準
Nsight Systems /trtexec を使用してハードウェアの処理時間を収集:
- 理想的な状態:DLA 推論処理時間 ≈ GPU 深層推論処理時間、両者が並列に実行され待ち時間なし;
- DLA の処理時間が GPU を大幅に上回る場合:バックボーンネットワークの負荷が高すぎるため、チャネルを適切に剪定して DLA の負荷を低減する;
- GPUの処理時間がDLAの処理時間を大幅に上回る場合:Transformer/NMSがボトルネックとなっているため、NMSのCUDA演算子を最適化するか、検出出力ボックスの数を減らす;
- DMAコピーが総処理時間の20%以上を占める場合:モデルの分割が不適切であるため、DLAサブグラフを統合し、デバイス間の転送を削減する必要がある。
8. BEV自動運転の完全なヘテロジニアスデータフローの例
- CPU:複数のカメラからの生フレームを受信し、タイムスタンプを同期させる;
- GPU (VPI):nvJPEGのデコード、リサイズ、正規化、HWCからCHWへの変換を行い、正規化されたテンソルを出力する;
- cudaMemcpy:画像テンソルを DLA グラフィックメモリにコピー;
- DLA0/DLA1:複数カメラ画像のバックボーン CNN による並列推論を行い、複数カメラの特徴量を出力;
- cudaMemcpy:複数カメラの特徴量を一度に GPU へ戻す;
- GPU:BEV特徴変換、Transformerのマルチヘッドアテンション、検出ヘッドのデコード、回転NMS;
- GPU→CPU:少量の検出ボックス結果をCPUへコピー;
- CPU:結果のパッケージ化、ログの送信、業務ロジックの制御。