常见的 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()
。