Skip to content

性能优化指南

本文档提供 L2 数据采集的性能优化建议,帮助你在有限的硬件资源下最大化数据生成效率。

核心参数对比

参数影响维度典型范围调优策略
--num_envs并行度4–1024受 GPU 显存限制,越大越快
--num_demos总数据量10–100,000根据下游训练需求决定
--video录制开销±10-20% 时间按需启用,用 --video_interval 采样
--video_interval视频采样率1–20越大磁盘占用越小,但样本覆盖率下降
sim.dt仿真步长0.01–0.02越大越快,但物理精度下降
decimation控制频率2–4越大越快,但控制精度下降

L2 并行度调优

Scripted 数据源

瓶颈:GPU 显存(PhysX 仿真 + 渲染缓冲区)

推荐配置

GPU显存--num_envs吞吐量(demos/分钟)
RTX 409024 GB32–64~500
A10040 GB64–128~800
A10080 GB128–256~1200
H10080 GB256–512~2000

调优步骤

  1. 从小值开始(如 --num_envs 4),确保能跑通
  2. 逐步翻倍(8 → 16 → 32 → ...),直到显存不足(OOM)
  3. 回退到上一个成功值,作为最优配置

显存不足时的降级策略

bash
# 策略 1:减少并行度
uv run sim2lerobot scripted collect --num_demos 1000 --num_envs 16

# 策略 2:关闭视频录制
uv run sim2lerobot scripted collect --num_demos 1000 --num_envs 32

# 策略 3:降低分辨率(修改 env_cfg.viewer)
# 在 src/sim2lerobot/sources/scripted/env_cfg.py 中设置 window_width=640, window_height=480

RL 数据源

瓶颈:训练阶段受 GPU 计算限制,rollout 阶段受显存限制

训练阶段train.py):

GPU--num_envs训练时间(600 iters)
RTX 4090512–1024~15 分钟
A1001024–2048~10 分钟
H1002048–4096~5 分钟

Rollout 阶段rollout_and_record.py):

GPU--num_envs吞吐量(demos/分钟)
RTX 409032–64~300
A10064–128~500

调优建议

  • 训练时用大 num_envs(1024+),加速收敛
  • Rollout 时用中等 num_envs(32–64),避免 OOM
  • 如果训练显存不足,优先降低 num_envs,而不是减少网络层数(会影响策略质量)

Teleop 数据源

瓶颈:人类操作速度(~1 demo/分钟)

优化方向

  • 提高操作熟练度(多练习键盘映射)
  • 降低控制频率(--step_hz 20 而不是 30,减少按键负担)
  • 使用 SpaceMouse 或 VR 手柄(更直观,但需要硬件)

Teleop 的性能优化空间有限,主要靠提高人工效率。

视频录制开销分析

性能影响

配置运行时间开销磁盘占用(每 demo)显存增加
无视频0%0 MB0 MB
--video+10-20%1-5 MB+100-200 MB
--video --video_interval 5+2-4%0.2-1 MB+100-200 MB

采样策略

场景 1:质量检查(只需要看少量样本)

bash
# 每 10 个 demo 录一个视频
uv run sim2lerobot scripted collect \
    --num_demos 1000 \
    --num_envs 64 \
    --video --video_interval 10

场景 2:演示展示(需要高质量视频)

bash
# 单独跑一小批,全部录制
uv run sim2lerobot scripted collect \
    --num_demos 10 \
    --num_envs 1 \
    --video

场景 3:大规模采集(不需要视频)

bash
# 关闭视频,最大化吞吐量
uv run sim2lerobot scripted collect \
    --num_demos 100000 \
    --num_envs 128

视频分辨率调优

修改 env_cfg.viewer 可以降低视频编码开销:

python
# src/sim2lerobot/sources/scripted/env_cfg.py
env_cfg.viewer.window_width = 640   # 默认 1280
env_cfg.viewer.window_height = 480  # 默认 720

效果

  • 1280×720 → 640×480:运行时间减少 ~5%,磁盘占用减少 ~60%
  • 适合只需要粗略检查的场景

HDF5 写入性能

瓶颈分析

IsaacLab 的 RecorderManager 在每个 env.reset() 时写入一个 episode 到 HDF5。写入性能受以下因素影响:

  1. 磁盘 I/O:HDD < SATA SSD < NVMe SSD
  2. 压缩算法gzip 压缩率高但慢,lzf 快但压缩率低
  3. Episode 长度:越长写入次数越少,但单次写入越慢

优化建议

使用 NVMe SSD

bash
# 检查磁盘类型
lsblk -d -o name,rota
# rota=0 表示 SSD,rota=1 表示 HDD

# 如果 data/ 在 HDD 上,移到 SSD
mv data /path/to/nvme/data
ln -s /path/to/nvme/data data

调整 HDF5 压缩(需要修改 IsaacLab 源码):

python
# IsaacLab/source/isaaclab/isaaclab/envs/utils/hdf5_dataset_file_handler.py:89
# 默认:compression="gzip", compression_opts=4
# 改为:compression="lzf"  # 快 2-3 倍,但文件大 ~20%

批量写入(高级):

如果你需要极致性能,可以修改 RecorderManager 改为内存缓冲 + 批量写入,但这超出本仓库范围(IsaacLab 上游改动)。

仿真精度 vs 速度权衡

sim.dt(仿真步长)

sim.dt物理精度速度适用场景
0.005精细操作(装配、插入)
0.01通用场景(抓取、放置)
0.02粗略运动(导航、推动)

当前配置sim.dt=0.01(IsaacLab 默认)

调优建议

  • 如果任务不需要高精度碰撞检测,可以改为 0.02(速度提升 ~50%)
  • 修改位置:src/sim2lerobot/sources/scripted/env_cfg.pysim.dt

decimation(控制频率降采样)

decimation控制频率速度适用场景
1100 Hz高频控制(力控、柔顺)
250 Hz通用场景(位置控制)
425 Hz低频控制(导航)

当前配置decimation=2(50 Hz 控制频率)

调优建议

  • 对于 pick-and-place 任务,decimation=2 已经足够
  • 如果改为 decimation=4,速度提升 ~50%,但轨迹会更"跳跃"

多机并行采集

如果单机 GPU 不够,可以在多台机器上并行采集,然后合并 HDF5:

bash
# 机器 1
uv run sim2lerobot scripted collect \
    --num_demos 10000 \
    --num_envs 64 \
    --output data/scripted/lift_cube_part1.hdf5

# 机器 2
uv run sim2lerobot scripted collect \
    --num_demos 10000 \
    --num_envs 64 \
    --output data/scripted/lift_cube_part2.hdf5

# 合并(需要自己写脚本,或用 h5py)
python tools/merge_hdf5.py \
    data/scripted/lift_cube_part1.hdf5 \
    data/scripted/lift_cube_part2.hdf5 \
    -o data/scripted/lift_cube_merged.hdf5

注意:合并脚本需要重新编号 demo_{i} 的索引,避免冲突。

性能监控

GPU 利用率

bash
# 实时监控 GPU 使用情况
watch -n 1 nvidia-smi

# 关注指标:
# - GPU-Util: 应该接近 100%(如果低于 80%,说明有瓶颈)
# - Memory-Usage: 应该接近上限(如果有余量,可以增加 num_envs)

吞吐量统计

bash
# 采集 1000 个 demo,记录时间
time uv run sim2lerobot scripted collect \
    --num_demos 1000 \
    --num_envs 64

# 计算吞吐量:1000 demos / 实际秒数 = demos/秒

Profiling(高级)

如果需要定位性能瓶颈,可以用 Python profiler:

bash
# 用 cProfile 分析
python -m cProfile -o profile.stats -m sim2lerobot.cli.main scripted collect --num_demos 100

# 可视化
pip install snakeviz
snakeviz profile.stats

常见性能问题

问题 1:GPU 利用率低(<50%)

可能原因

  • CPU 瓶颈(数据预处理、HDF5 写入)
  • 磁盘 I/O 瓶颈(HDD 写入慢)
  • num_envs 太小(GPU 没喂饱)

解决方案

  1. 增加 num_envs
  2. 使用 NVMe SSD
  3. 关闭不必要的日志输出

问题 2:显存不足(OOM)

可能原因

  • num_envs 太大
  • 视频录制占用额外显存
  • 场景复杂度高(物体多、网格精细)

解决方案

  1. 减少 num_envs
  2. 关闭视频录制或降低分辨率
  3. 简化场景(减少物体数量)

问题 3:仿真不稳定(物体穿模、抖动)

可能原因

  • sim.dt 太大
  • decimation 太大
  • 碰撞网格精度不足

解决方案

  1. 降低 sim.dt(如 0.02 → 0.01)
  2. 降低 decimation(如 4 → 2)
  3. 检查 USD 资产的碰撞网格

推荐配置总结

快速原型(验证流程)

bash
uv run sim2lerobot scripted collect \
    --num_demos 10 \
    --num_envs 4 \
    --video

中等规模采集(1000-10000 demos)

bash
uv run sim2lerobot scripted collect \
    --num_demos 10000 \
    --num_envs 64 \
    --video --video_interval 10

大规模采集(100000+ demos)

bash
uv run sim2lerobot scripted collect \
    --num_demos 100000 \
    --num_envs 128

高质量演示(用于展示)

bash
uv run sim2lerobot scripted collect \
    --num_demos 10 \
    --num_envs 1 \
    --video

相关文档