メインコンテンツまでスキップ
バージョン: v2512

リファクタリングによる改善

変換エラーを修正する

前ステップで特定したエラー原因に基づき、ソースコードのリファクタリングを行います。本チュートリアルではリファクタリング済みのコードを提供しているため、ディレクトリの移動を行います。

cd ../refactor

入力シェイプの固定化 (Dynamic Shapeの解消)

IntermediateLayerGetter クラス(ResNet101)でDynamic Shapeに由来のエラーが発生していました。オリジナルのDETRはアスペクト比を維持してリサイズするため、画像ごとにテンソルサイズが変動します。

対応策: パディング処理を追加し、常に入力サイズが一定(例: 1333x1333)になるよう修正します。

  • 最大サイズ(1333x1333)に合わせてリサイズ後、不足部分を0でパディングする処理を追加。
  • 後処理(逆正規化)において、パディングによる余白を考慮して座標変換するよう修正。

独自クラス NestedTensor の廃止と入出力の整理

最上位の DETR クラス等は、入力引数として独自クラス NestedTensor を受け取っています。これをONNX出力時に正しく解釈可能な形式に変更します。

対応策: データローダー・モデル内の処理において、画像テンソルとマスクを分離します。

  • NestedTensor を廃止し、「画像テンソル」と「マスク」の2つの torch.Tensor を明示的に引数として渡すよう修正。
  • これに伴い、下記の下位モジュールのインターフェースも修正します。
    • Joiner
    • BackboneBase
    • PositionEmbeddingSine

出力形式の修正

Dynamic Shapeと入力型の問題を解消すると、次は DETR クラスの戻り値(辞書型)が原因でエラーが発生します。

対応策: 出力をシンプルなテンソルのリストに変更します。

  • DETR クラス:pred_logits, pred_boxes をキーとする辞書ではなく、テンソルのリスト(タプル)を返すように修正。
  • Evaluator クラス:推論結果を受け取る際、リストから辞書形式へ復元するラッパー処理を追加。
Tips: 変換対象の絞り込み

AcuiRTは最上位モジュールから再帰的に変換を試みますが、デバッグ時は特定のモジュールだけをピンポイントで変換・確認したい場合があります。 その場合、下記のようにconfigを指定することで、特定のモジュール(例: backbone.conv.stem1)のみを対象にできます。これにより、上位モジュールのエラーに依存せず高速に検証可能です。

config_debug.json
{
"backbone.conv.stem1" : {
"rt_mode": "onnx",
"auto": true
}
}

修正したモデルを再度変換する

リファクタリング適用後に変換を実行すると、下記の様な出力が得られます。

実行コマンド
python main.py --batch_size 1 --no_aux_loss --eval --backbone resnet101 --resume ../baseline/detr-r101-2c7b67e5.pth --coco_path /path/to/dataset/coco --trt-engine-dir exps/refactor --trt-config aibooster_misc/config.json
Workflow Report
Conversion Rate: 447/447
Num Modules: 1
Accuracy: 0.5021068707623291
Latency: 66.03 ms
model [success] (<class 'models.detr.DETR'>)
Data
┏━━━━━━━━━┳━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━┳━━━━━━━━━━━━┓
┃ status ┃ module_class_name ┃ device_time_total ┃ device_events_total ┃ error ┃ num_errors ┃
┡━━━━━━━━━╇━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━━━━━━━╇━━━━━━━╇━━━━━━━━━━━━┩
│ success │ DETR │ 144668.06 │ 3 │ None │ 0 │
└─────────┴───────────────────┴───────────────────┴─────────────────────┴───────┴────────────┘

num_modules: 1 となっており、全てのモジュールが単一のTensorRTエンジンに統合されたことが確認できます。処理速度が向上していることも確認できます。

精度については、ベースラインから比較して3%程度の精度低下が見られます。これは入力シェイプの固定化のためにパディング処理を行った影響で畳み込み時の袖領域の演算結果が変化したことが原因と考えられます。 パディング処理を有効化した状態でFine-Tuningを行うことで精度を復元できると考えられます。

量子化して高速化する

最後に、configに量子化設定を追記してさらなる高速化を図ります。下記はFP16(半精度浮動小数点数)量子化を適用する設定です。

aibooster_misc/config_fp16.json
{
"rt_mode": "onnx",
"auto": true,
"fp16": true
}

量子化を適用した状態で変換を試みます。下記のような出力が得られれば成功です。精度(AP)を維持したまま、レイテンシを大幅に改善できました。

実行コマンド
python main.py --batch_size 1 --no_aux_loss --eval --backbone resnet101 --resume ../baseline/detr-r101-2c7b67e5.pth --coco_path /path/to/dataset/coco --trt-engine-dir exps/refactor_fp16 --trt-config aibooster_misc/config_fp16.json
Workflow Report
Conversion Rate: 447/447
Num Modules: 1
Accuracy: 0.5025068956852554
Latency: 48.13 ms
model [success] (<class 'models.detr.DETR'>)
Data
┏━━━━━━━━━┳━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━┳━━━━━━━━━━━━┓
┃ status ┃ module_class_name ┃ device_time_total ┃ device_events_total ┃ error ┃ num_errors ┃
┡━━━━━━━━━╇━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━━━━━━━╇━━━━━━━╇━━━━━━━━━━━━┩
│ success │ DETR │ 42507.566 │ 3 │ None │ 0 │
└─────────┴───────────────────┴───────────────────┴─────────────────────┴───────┴────────────┘

最終結果

ここまでのリファクタリング(入力固定化・入出力整理)と量子化設定を組み合わせた最終的な最適化結果は下記の通りです。 モデルの構造修正とFP16量子化により、大幅な高速化を達成しました。

モデルAP (Accuracy)Latency備考
PyTorchモデル0.531060.92msベースライン
AcuiRT・リファクタリング・量子化適用0.502548.13ms約1.25倍高速化 精度復元