常见 PyTorch 错误及解决方案¶
我的训练太慢了 [新手 / 中级]¶
RL 在某些情况下以 CPU 密集型而闻名。即使并行运行少量环境,通过为集群请求比您正在使用的环境数量更多的核心(例如,两倍)也可以看到显著的速度提升。这对于渲染的环境(即使是在 GPU 上渲染)也是如此,尤其是如此。
训练速度取决于几个因素,而且没有一种万能的解决方案。常见的瓶颈是:
数据收集:模拟器的速度可能会影响性能,后续的数据转换也是如此。通常通过向量化(如果模拟器支持,例如 Brax 和其他基于 Jax 的模拟器)或并行化(在 gym 和其他库中被不正确地称为向量化 envs)来加速环境交互。在 TorchRL 中,转换通常可以在设备上执行。
回放缓冲区存储和采样:如果底层操作需要大量的内存操作或繁琐的索引(例如,优先回放缓冲区),将项目存储到回放缓冲区可能需要时间。如果数据未连续存储和/或执行了昂贵的堆叠或连接操作,采样也可能需要相当长的时间。在这些情况下,TorchRL 提供了高效的连续存储解决方案以及高效的写入和采样解决方案。
优势计算:优势函数的计算也可能构成计算瓶颈,因为它们通常使用纯粹的 for 循环进行编码。如果分析表明此操作花费了大量时间,请考虑使用我们完全向量化的解决方案。
损失计算:损失计算和优化步骤经常是计算时间的重要组成部分。一些技术可以加快速度。例如,如果使用了多个目标网络,使用向量化映射和函数式编程(通过 functorch)而不是循环模型配置可以提供显著的速度提升。
常见错误¶
有关 mujoco(包括 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()
。