主题
性能优化指南
本文档提供 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 4090 | 24 GB | 32–64 | ~500 |
| A100 | 40 GB | 64–128 | ~800 |
| A100 | 80 GB | 128–256 | ~1200 |
| H100 | 80 GB | 256–512 | ~2000 |
调优步骤:
- 从小值开始(如
--num_envs 4),确保能跑通 - 逐步翻倍(8 → 16 → 32 → ...),直到显存不足(OOM)
- 回退到上一个成功值,作为最优配置
显存不足时的降级策略:
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=480RL 数据源
瓶颈:训练阶段受 GPU 计算限制,rollout 阶段受显存限制
训练阶段(train.py):
| GPU | --num_envs | 训练时间(600 iters) |
|---|---|---|
| RTX 4090 | 512–1024 | ~15 分钟 |
| A100 | 1024–2048 | ~10 分钟 |
| H100 | 2048–4096 | ~5 分钟 |
Rollout 阶段(rollout_and_record.py):
| GPU | --num_envs | 吞吐量(demos/分钟) |
|---|---|---|
| RTX 4090 | 32–64 | ~300 |
| A100 | 64–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 MB | 0 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。写入性能受以下因素影响:
- 磁盘 I/O:HDD < SATA SSD < NVMe SSD
- 压缩算法:
gzip压缩率高但慢,lzf快但压缩率低 - 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.py的sim.dt
decimation(控制频率降采样)
decimation | 控制频率 | 速度 | 适用场景 |
|---|---|---|---|
| 1 | 100 Hz | 慢 | 高频控制(力控、柔顺) |
| 2 | 50 Hz | 中 | 通用场景(位置控制) |
| 4 | 25 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 没喂饱)
解决方案:
- 增加
num_envs - 使用 NVMe SSD
- 关闭不必要的日志输出
问题 2:显存不足(OOM)
可能原因:
num_envs太大- 视频录制占用额外显存
- 场景复杂度高(物体多、网格精细)
解决方案:
- 减少
num_envs - 关闭视频录制或降低分辨率
- 简化场景(减少物体数量)
问题 3:仿真不稳定(物体穿模、抖动)
可能原因:
sim.dt太大decimation太大- 碰撞网格精度不足
解决方案:
- 降低
sim.dt(如 0.02 → 0.01) - 降低
decimation(如 4 → 2) - 检查 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