mg30_real_h50 AV1 codec → decord 불가 → PyAV(12.8 ms) 채택 → Pi0.5 통일성 위해 torchcodec(0.73 ms, 17×) 전환mg30_real_h50 비디오는 AV1 codec (libsvtav1)으로 인코딩되어 있어 decord가 cannot find video stream 오류를 낸다. PyAV (libdav1d SW 디코더)로 우회해 동작은 확인했으나, Pi0.5 학습 스크립트 (launch_pi05_b0_ref.sh)가 이미 torchcodec을 쓰고 있다는 지적이 있었다.
측정 결과 torchcodec이 PyAV 대비 17× 빠른 것을 확인 → 전사적으로 torchcodec으로 표준화. 단, conda 환경의 libstdc++ CXXABI 버전 mismatch로 import 자체가 실패하는 문제를 먼저 해결해야 했다.
| Backend | 2-frame seek | 3-cam aggregate | 비고 |
|---|---|---|---|
| decord | — | — | ✗ AV1 open 실패 |
| opencv VideoCapture | — | — | ✗ seek 후 read() False |
| torchvision.io | — | — | ✓ 동작 (deprecated 경고) |
| PyAV (libdav1d) | 12.8 ms | 38 ms | ✓ 동작 |
| torchcodec | 0.73 ms | ~2 ms | ✓ 채택 |
torchcodec import 시 실패 원인:
동적 링커가 시스템 libstdc++ (CXXABI ≤1.3.9)를 먼저 로드하여 conda의 새 libstdc++ (1.3.15)가 invisible.
os.environ['LD_LIBRARY_PATH']를 설정해도 무효 — dlopen은 import 시점(Python 시작 이전)에 발생하므로 SLURM shell에서 미리 export해야 한다.첫 segment: conda libstdc++ + libavcodec + libopenvino (시스템보다 우선)
두 번째 segment: venv-bundled CUDA 12 libs (libnppicc, libcublas, libcudart 등)
PyAV av.open(...) → torchcodec VideoDecoder(path, num_ffmpeg_threads=1). 수동 timestamp seek → decoder.get_frames_at(indices=[base+0, base+16]). tensor (T,C,H,W) uint8 → permute(0,2,3,1).numpy()로 PIL-호환 변환.
| 측정 항목 | PyAV | torchcodec | 비율 |
|---|---|---|---|
| 2-frame seek (1 cam) | 12.8 ms | 0.73 ms | 17× |
| 3-cam aggregate (per __getitem__) | 38 ms | ~2 ms | 19× |
| Smoke __getitem__ warm (6 cam-frames) | 44-48 ms | 12 ms | 4× |
| Smoke __getitem__ cold (first open) | 314 ms | 650 ms | decoder open 비용 |
| Mini train it/s (B200 1 GPU, bs 4) | 11.47 | 10.82 | ≈ 동등 (model forward bound) |
| env | Python | site-packages 경로 |
|---|---|---|
| gr00t-idm | 3.10 | $VENV/lib/python3.10/site-packages/nvidia/*/lib |
| pi05 | 3.12 | $VENV/lib/python3.12/site-packages/nvidia/*/lib |
| dreamgen | 3.10 | 동일 패턴 |
launch_pi05_b{0,1,2}_ref.sh와 run_idm_train_robocasa_h50_v2_8gpu.sh가 같은 패턴 적용 중 — 신규 launch 작성 시 cargo-cult 권장.PyAV도 동작하며 dataloader bottleneck이 되지 않을 수준(12.8 ms)이다. 그러나 (1) Pi0.5 기존 코드베이스가 이미 torchcodec을 씀 → 통일성, (2) AV1 SW dav1d가 향후 GPU decode로 전환 시 torchcodec이 더 자연스럽게 지원, (3) index-based seek (get_frames_at)이 timestamp 계산 없이 깔끔하다는 이점. cold open 시 650ms 비용은 per-worker 캐시로 첫 호출 1회만 발생하므로 실제 학습에서 무시 가능.
device='cuda' 옵션 — AV1 SW dav1d라 GPU 가속 단정 못함, 실측 필요pip install torchcodec nvidia-npp-cu12 + conda ffmpeg=7 + LD_LIBRARY_PATH 동일 절차nvcr.io/nvidia/pytorch:25.04-py3로 worker 이미지 교체하면 모든 lib 시스템에 존재 → LD_LIBRARY_PATH 불필요. 단 image pull ~20 GB 비용 고려.