Demand Layering — リアルタイムDNN推論のメモリ最適化

AI/ML

概要

Demand Layeringは、DarknetをベースにしたリアルタイムDNN推論向けのメモリ最適化実装です。研究論文(RTSS 2022)で提案された考え方を取り入れ、ネットワークの各レイヤーで必要なデータ(重み・中間活性値)を必要なときにのみメモリに配置し、不要になれば解放することで動作時のピークメモリを低減します。本リポジトリには複数のパイプライン(sequential / sync / async / two_stage / trade_off)を切り替えて実験できる実装と、事前にBatch Normalizationを吸収した.weightsファイルおよびテスト用動画を用いた実行手順が含まれています。C言語で書かれ、CMakeやMakefileでビルドする構成です。

GitHub

リポジトリの統計情報

  • スター数: 9
  • フォーク数: 0
  • ウォッチャー数: 9
  • コミット数: 30
  • ファイル数: 27
  • メインの言語: C

主な特徴

  • レイヤー単位でデータをオンデマンド配置・解放し、ピークメモリを削減する「Demand Layering」実装
  • 複数の実験用パイプライン(sequential、sync、async、two_stage、trade_off)を切替え可能
  • Darknet互換の.weightsファイルを利用(BNを既に吸収済みの重み提供)
  • C/CMakeベースで組み込みやエッジ環境向けに最適化された構成、CI設定あり

技術的なポイント

本実装の核心は「必要なときに必要なデータのみを確保する」ことで、従来の一括メモリ割当て方式に比べてピークメモリ量を大幅に削減する点にあります。具体的には、ネットワークの各レイヤー(畳み込みや全結合など)に対応する重みと中間活性値を、処理の前後でオンデマンドにロード/アンロードする仕組みを取り入れています。これにより、大きなモデルをメモリが限られたデバイス上で動かすことが可能になります。

レイテンシとメモリ削減のトレードオフを扱うために、複数のパイプライン設計が提供されています。順次実行(sequential)は実装が簡単でメモリ削減効果は高い一方でスループットは限定的。同期パイプライン(sync)は一定の同期点で処理をまとめ、スループットを改善します。非同期パイプライン(async)はレイヤー単位で非同期に入出力バッファを準備し、I/Oと演算を重ねることでレイテンシを低減します。two_stageは重みのロードと演算を二段階で分離し、メモリ使用と遅延のバランスを調整する設計です。trade_offモードは非同期とtwo_stageの中間点を狙った挙動を持ちます。

実装面ではDarknetのコードベースをベースにしており、.weightsファイルは事前にBatch Normalizationが吸収されたものを想定しているため、推論時の前処理が簡素化されています。Makefile中のフラグ(sequential, sync, async, two_stage, trade_off)を切り替えて目的に応じたパイプラインでビルド・実行できます。実行には重みファイルとテスト動画(test50.mp4)が必要で、付属のシェルスクリプトで一連の実験を自動化できます。

エッジデバイスでの実用性を高めるため、メモリ確保戦略としてはバッファプーリングやオンデマンドマッピング(mmap等を用いるケースが一般的)を想定した構成が考えられます(本リポジトリはC言語実装でメモリ解放のタイミングを細かく制御)。リアルタイム性とメモリ効率を両立させたい研究開発や組み込み用途に有益なソリューションです。

プロジェクトの構成

主要なファイルとディレクトリ:

  • .circleci: dir
  • .gitignore: file
  • .travis.yml: file
  • 3rdparty: dir
  • CMakeLists.txt: file
  • Makefile: file
  • src/: dir(Cソース等)
  • scripts/: dir(実行用シェル)
  • weights/: dir(.weightsリストや説明)
  • README.md: file

…他 22 ファイル

まとめ

エッジ向けにメモリを絞ったリアルタイム推論を試すのに適した実装と実験環境を提供します。

リポジトリ情報:

READMEの抜粋:

demand-layaring

Darknet memory optimization

  1. Download .weigts files (already apply the batch normalization)

https://drive.google.com/drive/folders/1xFJ4G4WS8wzsQ7rsO6HihxBV-uGqMvGG?usp=sharing

  1. Download test50.mp4 files

  2. Edit Make file (Choose one pipeline architecture, and change 0 to 1)

  • sequential = 0
  • sync = 0
  • async = 0
  • two_stage = 0
  • trade_off =0 (Only async and two_stage)
  1. Excute .sh file …