深度图像加入训练会导致时间和内存瓶颈,
在这里聚焦内存瓶颈.
| 简称 | 方案 | 来源仓 | 实现 |
|---|---|---|---|
| IG | IsaacGym 光栅化渲染 | EP (extreme-parkour) | per-camera render target, GPU 光栅化 |
| RCC | IsaacLab RayCasterCamera | LP (IsaacLab-parkour) | NVIDIA 自带, warp-kernel raycast |
| WR | warp-raycaster | WR (本工作) | 深度图生成新方案 (Warp 重写) |
RTX 4070 Laptop · VRAM 8 GB · RAM 32 GB (VRAM = GPU 显存, RAM = 内存 / 系统内存)
结论: encoder 激活 2.6 G + env physics 固定 3.8 G, 是显存不足的主要原因.
深度相机本体占比不足 0.1 G, 可忽略, 瓶颈在于深度图生成后的图像处理.
结论: RAM 不是瓶颈, 合计只有 3.5 GB / 32 GB, 容量充裕.
| Stage | 阶段操作 | VRAM 累计 | Δ | 解读 |
|---|---|---|---|---|
| S0 | 初始化 CUDA 上下文 | 161 | +161 | 显卡启动开销, 与模型无关. |
| S1 | 加载学生模型权重 | 217 | +56 | 编码器 + 策略网络的参数本身, 体积小. |
| S2 | 分配优化器状态 | 371 | +154 | 优化器为每个参数额外存动量与方差, 体积约权重的两倍. |
| S3 | 测一次编码器前向 (无梯度) | 415 | +44 | 关闭梯度后中间激活跑完即释放, 显存几乎不增长. |
| S4 | 24 次编码器前向激活全留在显存 | 3011 | +2596 | 🚨 显存真大头. 学生训练一轮采 120 步, 但深度图每 5 步生成一次, 一轮下来共 24 次,24次结束后统一反传梯度,前向的中间激活一直累积不释放, 显存被叠了 24 倍. |
| S5 | 一次反传走完 24 步 | 3133 | +122 | 反传消耗中间激活, 新增的只是梯度张量与卷积反传所需的临时缓冲. |
| S6 | 优化器更新权重 | 3133 | +0 | Adam 就地更新动量与权重, 不分配新显存. |
承上: 深度相机本身并非内存/显存瓶颈, 但是还是测试比较一下, 不同深度图生成方案的占用差异大小.
结论: 显存基本平手. WR 初始化略省, 单环境边际成本略高, 环境数大了 IG 微反超; 内存两边都不构成压力.
WR 真正的优势是渲染速度, 不在显存.
delta = (env 构造完 + 1 步) − (进程启动后 baseline), 消 GPU 外部进程占用漂移. 单位 MB.
| 实现 | N=32 | N=64 | N=128 | N=192 | ||||
|---|---|---|---|---|---|---|---|---|
| VRAM | RAM | VRAM | RAM | VRAM | RAM | VRAM | RAM | |
| no_depth (baseline env) | 2578 | 3300 | 2578 | 3300 | 2580 | 3301 | 2582 | 3302 |
| IG (with depth) | 2873 | 3681 | 2915 | 3701 | 3002 | 3740 | 3090 | 3777 |
| WR (with depth) | 2841 | 3813 | 2899 | 3811 | 3001 | 3829 | 3112 | 3849 |
| IG − no_depth (纯深度) | +295 | +381 | +337 | +401 | +422 | +439 | +508 | +475 |
| WR − no_depth (纯深度) | +263 | +513 | +321 | +511 | +421 | +528 | +530 | +547 |
| VRAM init | VRAM/env | R² | RAM init | RAM/env | R² | |
|---|---|---|---|---|---|---|
| IG (光栅化) | +252.0 | +1.33 | 1.00 | +363.0 | +0.59 | 1.00 |
| WR (raycasting) | +211.8 | +1.65 | 1.00 | +500.9 | +0.23 | 0.94 |
| 差 (WR−IG) | −40.2 | +0.32 | +137.9 | −0.36 |
VRAM: WR 起步省 40 MB, 每加 env 多 0.32 MB. RAM: WR 起步多 138 MB (库加载 footprint), 每加 env 省 0.36 MB.
VRAM: WR −40 MB (一次性 BVH vs per-camera render target). RAM: WR +138 MB (trimesh+warp 库加载, 不是工作负载).
结论: WR 在初始化占用、单环境边际、内存三项上都明显领先 RCC, 内存差距尤其大. 原因是 WR 用一份共享的射线方案与一份共享几何缓冲, RCC 为每个相机实例独立分配资源.
但 32 GB 内存本就充裕, 这个差距并不解释学生策略的显存瓶颈 — 真瓶颈见 Sec 1.
| 实现 | N=32 | N=64 | N=128 | N=192 | ||||
|---|---|---|---|---|---|---|---|---|
| VRAM | RAM | VRAM | RAM | VRAM | RAM | VRAM | RAM | |
| no_depth (baseline env) | 2900 | 1785 | 2902 | 1788 | 2966 | 1823 | 2968 | 1836 |
| RCC (with depth) | 2954 | 2038 | 2994 | 2050 | 3112 | 2075 | 3146 | 2102 |
| WR (with depth) | 2932 | 1813 | 2954 | 1801 | 3038 | 1846 | 3088 | 1854 |
| RCC − no_depth | +54 | +253 | +92 | +262 | +146 | +252 | +178 | +266 |
| WR − no_depth | +32 | +28 | +52 | +13 | +72 | +23 | +120 | +18 |
| VRAM init | VRAM/env | R² | RAM init | RAM/env | R² | |
|---|---|---|---|---|---|---|
| RCC (IsaacLab 默认) | +37.6 | +0.77 | 0.97 | +253.7 | +0.05* | 0.27* |
| WR DepthSensor | +14.6 | +0.52 | 0.97 | +23.8 | −0.03* | 0.12* |
| 差 (WR−RCC) | −23.0 | −0.25 | −229.9 | ≈ 0 |
VRAM init 差 23 MB: RCC 在每个 env 上复制 3 份光线模板 (ray_starts / ray_directions / ray_hits, 每份 [N, 6360, 3]), 共 ~0.22 MB/env. WR 全局共享一份模板, 用 expand 取视图不复制. 差距来自 per-env buffer 的设计选择.
RAM init 差 230 MB — 两条挂载路径:
230 MB 是 sensor 框架的固定 footprint, 与 env 数无关 (slope ≈ 0, R² < 0.3).
VRAM/env: WR 省 0.25 MB/env (~32%). RAM/env ≈ 0 是预期结果: LP 深度全跑 GPU, host 侧没东西随 env 数增长; +0.05 / −0.03 是 OLS 在 0 附近的噪声残差 (R²<0.3), 不是真信号.
① 显存瓶颈不在深度图像的生成, 而在生成之后的处理:
真正吃显存的是编码器对深度图的累积处理与环境物理两块, 合计约 88%, 深度相机本体仅约 1%.
换深度相机方案, 对内存/显存占用的影响很小.
② 与光栅化方案对比:
显存基本打平 (大规模并行后光栅化方案微胜), 内存两边都不构成压力.
与 IsaacLab 自带射线相机对比:
WR 显存与内存均领先, 内存占用低约 11 倍; 但 32 GB 内存本就充裕, 这块差距不影响环境数上限.
③ WR 的速度优势分两档:
替代光栅化方案纯深度时间加速约 9 倍、训练端到端约 2.8 倍;
替代 IsaacLab 自带射线相机纯深度时间加速约 1.4 倍、训练端到端约 1.06 倍.