调试和训练指南#

在本教程中,我们将指导使用 Isaac Lab 的开发人员了解各种参数对训练时间、GPU 使用率和内存使用的影响。这对于解决在强化学习(RL)训练过程中常见的内存不足(OOM)错误特别有帮助。我们将涉及在 Isaac Lab 中强化学习训练期间常见的错误,并提供一些故障排除的指导步骤。

训练与并行环境#

Isaac Lab 的关键 RL 范式是通过并行训练多个环境。在这里,我们将环境定义为机器人或多个机器人与其他机器人或物体在仿真中互动的实例。通过并行创建多个环境,我们生成多个环境副本,使得每个环境中的机器人可以独立于其他环境探索世界。因此,环境的数量成为训练中的一个重要超参数。通常,环境数量越多,训练过程中可以收集的数据就越多,这反过来为 RL 训练提供了更多数据,并允许更快速的训练,因为 RL 代理可以从并行的经验中学习。

然而,环境的数量也可能受到其他因素的限制。内存通常是我们可以并行运行的环境数量的硬性约束。当更多的环境被添加到世界中时,仿真还需要更多的内存来表示和仿真场景中的每个物体。因此,我们可以并行仿真的环境数量通常取决于机器上可用的内存资源。此外,不同形式的仿真也可能消耗不同数量的内存。例如,具有高保真度视觉和碰撞网格的物体将比简单的原始形状消耗更多的内存。可变形仿真也可能需要比刚体仿真更多的内存。

使用渲染进行训练通常会消耗比仅运行物理模拟时更高的内存。这在以相对较大分辨率进行渲染时尤其如此。此外,在使用图像观察进行强化学习(RL)策略训练时,我们通常还需要更多的内存来存储图像缓冲区的回放轨迹以及用于策略的更大网络。这两个组件还会影响可用于模拟的内存量。

为了减少内存消耗,一种方法是简化资源的碰撞网格,尽可能保留正确模拟接触所需的最基本碰撞形状。此外,我们建议在调试时仅使用视口,并且环境数量较少时进行调试。当以较大数量的环境并行训练时,建议在无头模式下运行,以避免任何渲染开销。如果RL流程需要在循环中进行渲染,确保减少环境数量,并考虑图像缓冲区的维度和策略网络的大小。当遇到内存溢出错误时,最简单的解决方案可能是减少环境数量。

超参数调优#

虽然在许多情况下,平行模拟更多环境可以带来更快的训练和更好的结果,但也有一些情况,当环境数量达到某个阈值时,会观察到收益递减的现象。这个阈值会根据环境、任务、策略设置和RL算法的复杂性有所不同。当更多环境被平行模拟时,每个模拟步骤需要更多时间来模拟,这将影响整体训练时间。当环境数量较少时,单步模拟时间的增加通常相较于更多经验收集带来的训练性能提升来说是微不足道的。然而,当环境数量达到某个临界点时,更多经验对RL算法的好处可能开始饱和,增加的模拟时间可能会超过训练性能的提升。

与环境数量过大导致的收益递减相反,使用较少数量的环境进行训练也可能具有挑战性。这通常是由于RL策略没有获得足够的经验供其学习。为了解决这个问题,增加批量大小或时间步长可能会有所帮助,以适应从较少数量的并行环境中收集的较少数据。当环境数量受到可用资源的限制时,使用并行GPU或在多个节点上进行训练也有助于缓解由于有限的回合数而导致的问题。

调试训练中的 NaNs#

在 RL 训练过程中常见的一个错误是观察缓冲区中出现 NaN(非数值),这些 NaN 通常会被传播到策略网络中,并导致下游训练流程崩溃。在大多数情况下,NaN 的出现是由于仿真不稳定。这可能是由于对机器人施加了超出仿真限制的剧烈动作,或者资产重置到无效状态所导致的。减少 NaN 出现的一些有用提示包括: 正确调整资产的物理参数,以确保关节、速度和力的限制在合理范围内,并且机器人的增益已正确调整。检查对机器人施加的动作是否合理,确保它们不会对物体施加过大的力或冲击也是一个好主意。减少物理仿真的时间步长也有助于提高仿真精度和稳定性,此外,增加求解器的迭代次数也有帮助。

理解训练输出#

每个 RL 库在训练过程中都会产生自己的输出数据。有些库更加冗长,并生成包含更多训练过程详细信息的日志,而其他库则更为简洁。在本节中,我们将解释 RL 库的常见输出。

RL-Games#

对于每次迭代,RL-Games 打印数据收集、推理和训练性能的统计信息。

fps step: 112918 fps step and policy inference: 104337 fps total: 78179 epoch: 1/150 frames: 0

fps step 指的是环境步长 FPS,其中包括应用动作、计算观测、奖励、结束标志、重置以及模拟步进。

step and policy inference 测量 fps step 中的每一项,以及策略推理计算actions所需的时间。

fps total 测量上述内容以及训练迭代所需的时间。

在指定的时间间隔内,它还会记录当前最佳奖励和保存到文件的中间检查点路径。

=> saving checkpoint 'IsaacLab/logs/rl_games/cartpole_direct/2024-12-28_20-23-06/nn/last_cartpole_direct_ep_150_rew_294.18793.pth'
saving next best rewards:  [294.18793]

RSL RL#

对于每次迭代,RSL RL 提供以下输出:

                        Learning iteration 0/150

                     Computation: 50355 steps/s (collection: 1.106s, learning 0.195s)
             Value function loss: 22.0539
                  Surrogate loss: -0.0086
           Mean action noise std: 1.00
                     Mean reward: -5.49
             Mean episode length: 15.79
--------------------------------------------------------------------------------
                 Total timesteps: 65536
                  Iteration time: 1.30s
                      Total time: 1.30s
                             ETA: 195.2s

这个输出包含了数据收集、推理和学习的总 FPS,以及每步的数据收集和学习时间的详细信息。此外,还提供了训练损失的统计数据,以及当前的平均奖励和回合长度。

在底部部分,它记录了迄今为止完成的总步数、当前迭代的总时间、总体训练时间以及完成所有迭代所需的估计训练时间。

SKRL#

SKRL 提供了一个非常简单的输出,显示训练进度,作为总时间步数的百分比(除以环境数量)。它还包括到目前为止的总经过时间和预计完成训练的时间。

0%|                                          | 2/4800 [00:00<10:02,  7.96it/s]

Stable-Baselines3#

Stable-Baselines3 提供了详细的输出,概述了 rollout 统计数据、时间和策略数据。

------------------------------------------
| rollout/                |              |
|    ep_len_mean          | 30.8         |
|    ep_rew_mean          | 2.87         |
| time/                   |              |
|    fps                  | 8824         |
|    iterations           | 2            |
|    time_elapsed         | 14           |
|    total_timesteps      | 131072       |
| train/                  |              |
|    approx_kl            | 0.0079056695 |
|    clip_fraction        | 0.0842       |
|    clip_range           | 0.2          |
|    entropy_loss         | -1.42        |
|    explained_variance   | 0.0344       |
|    learning_rate        | 0.0003       |
|    loss                 | 10.4         |
|    n_updates            | 20           |
|    policy_gradient_loss | -0.0119      |
|    std                  | 1            |
|    value_loss           | 17           |
------------------------------------------

rollout/ 部分,记录了每次迭代的平均剧集长度和奖励。在 time/ 部分,提供了总 FPS、迭代次数、总耗时和总时间步数的数据。最后,在 train/ 部分,记录了训练参数的统计数据,例如 KL、损失、学习率等。