可重现性和确定性

可重现性和确定性#

给定相同的硬件和 Isaac Sim(因此也有 PhysX)版本,对于具有刚体和关节的场景,仿真会产生相同的结果。但是,由于浮点精度和舍入误差,仿真结果可能会因不同的硬件配置而变化。目前,PhysX 不保证对于具有非刚体(如布料或软体)的任何场景是确定性的。有关更多信息,请参阅 PhysX Determinism 文档 。

基于上述,Isaac Lab 提供确定性仿真,确保在不同运行中获得一致的仿真结果。这是通过在仿真环境和物理引擎中使用相同的随机种子来实现的。在构建环境时,随机种子使用 configure_seed() 方法设置为固定值。该方法在不同库(包括 PyTorch 和 NumPy)中全局设置 CPU 和 GPU 的随机种子。

在包含的工作流脚本中,使用在学习智能体配置文件或命令行参数中指定的种子来设置环境的随机种子。这样可以确保仿真结果在不同运行中是可重现的。种子被设置为环境参数 isaaclab.envs.ManagerBasedEnvCfg.seed 或 isaaclab.envs.DirectRLEnvCfg.seed ,取决于基于管理器或直接环境的实现。

--deterministic 参数#

--deterministic 参数由 isaaclab.app.add_launcher_args() 提供。 KitLauncher 发布 /isaaclab/render/deterministic ,Isaac RTX 后端在初始化时读取它,并应用 isaaclab_physx.renderers.isaac_rtx_renderer_utils.apply_isaac_rtx_determinism_settings() 。

严格的 PyTorch 确定性 已接入 RL-Games 、 skrl 、 RSL-RL 和 Stable-Baselines3 的强化学习训练入口:传入 --deterministic 时,以 torch_deterministic=True 调用 configure_seed() 。各入口在构造框架运行器或智能体对象后调用 configure_seed() ,避免干扰库初始化,再使用请求的全局随机数生成状态及可选的 PyTorch 确定性算法训练。该参数的 渲染 部分是否起作用取决于负载: 纯物理 仿真不渲染;非最小模式的 RTX 渲染需要它才能获得可复现图像; Newton 渲染需要 Warp 全局确定性模式,此参数会设置该模式(见 下文 )。

Warp 确定性。 Newton 求解器接受 deterministic 参数,Isaac Lab 从 deterministic 传入,并作为逐模块选项应用。其传感器和几何内核不接受该参数,而是回退到 warp.config.deterministic ,因此强化学习训练和回放入口在传入 --deterministic 时,将该全局值设为 RUN_TO_RUN 。不使用这些入口、自行构建环境的脚本,必须在创建环境前设置 warp.config.deterministic 。否则,场景 BVH 基于原子压缩的形状列表构建,顺序在进程间可能变化,使平铺相机从相同仿真状态渲染出的少量像素不同。已显式选择的模式(例如 GPU_TO_GPU )不会被覆盖。

备注

对于卷积负载,在启动训练前设置 TORCH_CUDNN_V8_API_DISABLED=1 ,使 PyTorch 使用 cuDNN v7 API 而非 cuDNN v8 执行计划,可能改善跨运行确定性。

物理确定性 在 Isaac Lab 强化学习训练入口中也由同一参数启用:入口在预设解析后的后端上设置 deterministic 。这是与后端无关的请求,各物理管理器在仿真启动时将其转换为自身设置;配置无法提供所需保证时会报错。Newton 选择 deterministic_mode="run_to_run" 并应用 MJWarp 的前提条件;PhysX 和 OvPhysX 启用增强确定性,但 OvPhysX 只提供尽力保证,尚未经过端到端验证。不使用强化学习入口的脚本,可直接设置 deterministic 获得相同行为;仅传入 --deterministic 时只配置 Torch 和渲染。

uv run --extra rl-games isaaclab train --rl_library rl_games \
  --task Isaac-Cartpole-Camera --deterministic
./isaaclab.sh train --rl_library rl_games \
  --task Isaac-Cartpole-Camera --deterministic

Newton 物理确定性#

将 isaaclab_newton.physics.NewtonCfg.deterministic_mode 设为 "gpu_to_gpu" ,请求跨 GPU 架构可复现;设为 "run_to_run" ,请求同一 GPU 上可复现。Newton 将所选模式应用于受支持的求解器内核,并在碰撞流程中启用确定性接触排序。确定性执行可能增加内存用量并降低仿真性能。支持 GPU 上且 isaaclab_newton.physics.MJWarpSolverCfg.disable_sensors 为 True 的 MJWarp,以及 XPBD 和 Featherstone;选择不受支持的求解器会报错。CPU 上的 MuJoCo( isaaclab_newton.physics.MJWarpSolverCfg.use_mujoco_cpu )已可复现,保持不变。直接设置该属性可请求更强的 "gpu_to_gpu" 保证,它优先于 isaaclab.physics.PhysicsCfg.deterministic 。设置 "not_guaranteed" 不会关闭请求,因为无法与默认值区分;应清除 isaaclab.physics.PhysicsCfg.deterministic 。

备注

disable_sensors 是必需条件而非可选项:MuJoCo Warp 触觉传感器内核在同一输出数组上应用两类原子归约,Warp 的确定性代码生成无法转换,因此传感器模块在请求确定性保证时无法编译。禁用它还会跳过填充 Newton body_qdd 和 body_parent_f 状态的 rne_postconstraint 阶段。IMU、PVA 和关节力旋量传感器读取该状态,因此 Newton 会直接报错,避免它们报告过时值;请移除这些传感器,或取消确定性请求。直接使用原生 MJWarp 传感器输出的集成也会受影响,但不会被检测到。

警告

确定性接触排序增加排序工作,并根据配置的最大接触数量分配缓冲区,因此运行和内存开销随接触容量增长。仅在需要其可复现保证时启用此模式。

对于我们关于强化学习训练的确定性测试结果,请查看 GitHub Pull Request #940 。

小技巧

由于 GPU 工作调度,存在一种可能性,即运行时对仿真参数的更改可能会改变操作进行的顺序。这是因为当 GPU 忙于执行其他任务时,环境更新可能会发生。由于浮点数存储的固有特性,对执行顺序的任何修改可能导致输出数据的最不显著位上发生微小变化。这些变化可能导致在仿真数千个环境和仿真帧的过程中出现不一致的执行。

一个说明性的例子是关于物体物理材质的运行时域随机化。当在 GPU 上执行时,该过程可能会引入确定性和仿真问题,因为这些参数是通过低级 API 从 CPU 传递到 GPU 的方式。因此,强烈建议只在设置时间执行此操作,即在环境步进开始之前。