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