Ditto TalkingHead (DGX Spark / ARM64) の TensorRT 移植作業記録
目的
ditto-talkinghead プロジェクトを DGX Spark (ARM64 / aarch64) 環境で動作させるため、既存の ONNX モデルを現在の環境向け TensorRT エンジンに変換し、推論できるようにする作業を行った。
特に warp_network.onnx は GridSample3D カスタムプラグインに依存しているため、単純変換ではなく TensorRT カスタムプラグイン (.so) のロード問題の解決 が鍵となった。

なぜこの作業が必要だったか
Ditto のチェックポイントには libgrid_sample_3d_plugin.so が含まれていたが、これは x86‑64 用にビルドされたバイナリ だった。
私の環境は:
- DGX Spark
- ARM64 (aarch64)
- TensorRT 10.14.1
- CUDA 13.1
つまり、x86 用プラグイン .so を ARM TensorRT でロードできず、warp_network.onnx のパース段階で失敗し、TRT エンジンの生成が不可能だった。
症状(失敗ログの要点)
TRT 変換中に warp_network で次のエラーが出た:
Unable to load library: libgrid_sample_3d_plugin.soPlugin not found ... GridSample3DFail parsing warp_network.onnx- 最終的に
Network must have at least one output
根本原因は GridSample3D プラグインのロード失敗だった。
原因分析の流れ
1) プラグインファイルの有無確認
ファイルは実際に存在した。
./checkpoints/ditto_onnx/libgrid_sample_3d_plugin.so
したがって単なるパス問題ではなかった。
2) ldd の結果
ldd ./checkpoints/ditto_onnx/libgrid_sample_3d_plugin.so の出力:
not a dynamic executable
最初は不自然に思えたが、追加解析で アーキテクチャ不一致の可能性 が高まった。
3) file / readelf でアーキテクチャを確定
決定的証拠:
fileの結果:ELF 64-bit LSB shared object, x86-64readelf -hの結果:Machine: Advanced Micro Devices X86-64
つまり、Ditto が提供した .so は x86‑64 用バイナリ で、現在の ARM64 環境ではロードできない。
解決策(要点)
結論
GridSample3D TensorRT プラグインを ARM64 環境で再ビルド する必要があった。
解決手順
1) プラグインソースの入手
ditto-talkinghead リポジトリにはプラグインソースが無く、バイナリだけが提供されていた。
別リポジトリから GridSample3D TensorRT プラグインのソースを取得:
grid-sample3d-trt-plugin
ソースファイル:
grid_sample_3d_plugin.cppgrid_sample_3d_plugin.hgrid_sample_3d.cugrid_sample_3d.cuh
2) TensorRT / CUDA 環境の確認
確認結果:
- TensorRT Python:
10.14.1.48 - TensorRT ライブラリ:
/usr/lib/aarch64-linux-gnu/libnvinfer.so - CUDA:
13.1 - GPU Capability:
(12, 1)→ CUDA arch121
3) CMake ビルド設定の修正
既存の CMake 設定は x86 中心・古い GPU アーキテクチャをハードコードしており、以下の問題があった:
compute_70が強制 → 現在の nvcc では未対応cuda_fp16.hのインクルードパス問題- TensorRT lib ディレクトリ指定不足
修正ポイント
CUDA_ARCHITECTURESのハードコードを除去- TensorRT の include / lib パスを明示
- CUDA include パスを指定 (
/usr/local/cuda/targets/sbsa-linux/include) - テストサブディレクトリのビルドを無効化(任意)
4) ARM64 用プラグインのビルド成功
cd /workspace/grid-sample3d-trt-plugin
rm -rf build
mkdir build && cd build
cmake .. \
-DCMAKE_BUILD_TYPE=Release \
-DTensorRT_ROOT=/usr \
-DTensorRT_INCLUDE_DIR=/usr/include/aarch64-linux-gnu \
-DTensorRT_LIB_DIR=/usr/lib/aarch64-linux-gnu \
-DCMAKE_CUDA_ARCHITECTURES=121
cmake --build . -j"$(nproc)"
ビルド後に生成されたファイル:
build/libgrid_sample_3d_plugin.so
このファイルが ARM64 かどうかを確認:
file build/libgrid_sample_3d_plugin.so
期待される出力例:
ELF 64-bit LSB shared object, ARM aarch64, …
5) Ditto チェックポイントの x86 プラグインと置換
cp /workspace/grid-sample3d-trt-plugin/build/libgrid_sample_3d_plugin.so \
/workspace/ditto-talkinghead/checkpoints/ditto_onnx/libgrid_sample_3d_plugin.so
6) TensorRT プラグインロードの確認
Python から TRT プラグインレジストリに直接ロードし、正常に動作することをテストした。
7) ONNX → TensorRT 変換の再実行
cvt_onnx_to_trt.py を実行すると、warp_network.onnx を含むすべての変換が成功した。
最終的に 推論も成功 した。
現在の最終状態
✅ GridSample3D カスタム TensorRT プラグインが ARM64 で正常動作
✅ warp_network.onnx のパースに成功
✅ ONNX → TensorRT エンジン変換に成功
✅ Ditto TalkingHead の推論が DGX Spark / ARM64 環境で成功
この作業により ditto-talkinghead を DGX Spark 環境向けに完全に移植できた。
トラブルシューティングメモ
1) チェックポイントに含まれる .so はプラットフォーム依存
チェックポイントに入っているからといって自分の環境でそのまま動くわけではない。特に ARM 環境では x86 用バイナリ が混在していることが多い。DGX‑Spark や macOS ユーザーは頻繁に遭遇するが、初めてこのエラーに直面するとかなり戸惑う。自分のマシンが aarch64 (ARM) であることをまず疑うべき。
2) TensorRT バージョンアップ時はプラグインの再ビルドが必要になることがある
今回は TRT 10.14 でビルドに成功したが、メジャーバージョンが変わるとプラグイン API/ABI の違いで再パッチが必要になる場合がある。
3) CUDA アーキテクチャのハードコーディングに注意
CMakeLists.txt に 70;80;86;89 などが書かれていると最新 GPU で失敗する可能性がある。現在の GPU Capability を確認し、major*10 + minor の形式で CMAKE_CUDA_ARCHITECTURES を指定すること。
python - <<'PY'
import torch
print(torch.cuda.get_device_capability())
PY
参考(自環境サマリ)
- Platform: DGX Spark
- Arch: aarch64 (ARM64)
- CUDA: 13.1
- TensorRT: 10.14.1
- Python: 3.12
- GPU capability: 12.1 (CMake CUDA arch = 121)
関連記事