常见的 PyTorch 错误和解决方案¶
我的训练太慢了 [新手 / 中级]¶
在某些情况下,众所周知强化学习是 CPU 密集型的。即使并行运行少量环境,通过在集群上请求比您正在处理的环境数量更多的核心(例如两倍),您也会看到巨大的速度提升。对于需要渲染的环境尤其如此(即使它们是在 GPU 上渲染的)。
训练速度取决于几个因素,没有一种万能的解决方案适用于所有问题。常见的瓶颈是:
数据收集:模拟器速度可能会影响性能,后续的数据转换也是如此。加速环境交互通常通过向量化(如果模拟器支持,例如 Brax 和其他基于 Jax 的模拟器)或并行化(在 gym 和其他库中不恰当地称为向量化环境)来实现。在 TorchRL 中,转换通常可以在设备上执行。
经验回放缓冲区存储和采样:如果底层操作需要大量的内存操作或繁琐的索引(例如使用优先级经验回放缓冲区),将条目存储到经验回放缓冲区可能会耗时。如果数据不是连续存储且/或执行了耗时的堆叠或连接操作,采样也可能花费相当长的时间。TorchRL 在这些情况下提供了高效的连续存储解决方案以及高效的写入和采样解决方案。
优势计算:计算优势函数也可能构成计算瓶颈,因为这些通常是使用简单的 for 循环编写的。如果性能分析表明此操作耗时较长,请考虑改用我们完全向量化的解决方案。
损失计算:损失计算和优化步骤经常占用了相当一部分计算时间。一些技术可以加速此过程。例如,如果使用了多个目标网络,使用向量化映射和函数式编程(通过 functorch)而不是遍历模型配置,可以显著提高速度。
常见 bug¶
对于与 mujoco 相关的 bug(包括 DeepMind Control suite 和其他库),请参考 MUJOCO_INSTALLATION 文件。
ValueError: bad value(s) in fds_to_keep
:这可能有多种原因。在 torchrl 中常见的一个原因是,您试图在进程之间发送一个作为另一个张量视图的张量。例如,当在进程之间发送张量b = tensor.expand(new_shape)
时,对原始内容的引用将丢失(因为expand
操作保留了对原始张量的引用)。要调试此问题,请查找此类操作(view
,permute
,expand
等),并在调用函数后调用clone()
或contiguous()
。