1

所以我使用 Hydra 1.1来管理我的配置,并在minerl environmenthydra-ax-sweeper==1.1.5上运行一些超参数优化。为此,我使用多处理(通过 pytorch)将大量数据加载到内存中(加载多处理时峰值约为 50Gb,完全加载后降至 30Gb)。

在正常运行中,这不是问题(我的机器有 90+Gb RAM),一次训练完成没有任何问题。

但是,当我使用-m选项(和hydra/sweeper: ax配置)运行相同的代码时,代码在大约 2-3 次清扫器运行后停止,卡在数据加载阶段,因为系统的所有内存(+交换内存)都被占用了。

首先,我认为这是环境代码的一些问题minerl,它在子进程中启动 java-code。所以我尝试在没有环境的情况下运行我的代码(只有 30Gb 数据),但我仍然遇到同样的问题。所以我怀疑我在 Hydra 清扫器之间有一些内存泄漏。

所以我的问题是,九头蛇扫地机(或斧头扫地机)如何在两次扫地之间工作?我一直有这样的印象,它运行main(cfg: DictConfig)装饰有@hydra.main(...),采用标量返回(分数)并以这个分数运行贝叶斯优化器,main()调用类似于函数(内部的所有内容都被正确地释放/在每次扫描运行之间收集垃圾)。

不是这样吗?然后我应该将数据加载到外部某处main()并在扫描之间保存吗?

非常感谢您!

4

2 回答 2

1

Hydra 清扫器通常没有控制并发的设施。这是您正在使用的启动器的责任。内置的基本启动器串行运行作业,因此它不应触发内存问题。如果您正在使用其他启动器,您可能需要通过启动器特定参数来控制它们的并行度。

于 2021-09-27T18:14:46.460 回答
1

可能会并行运行试验hydra-ax-sweeper,具体取决于调用中get_max_parallelism定义的函数的结果ax.service.ax_client。我怀疑您的机器由于这种并行性而内存不足。

Hydra 的 Axe 插件目前没有用于配置此max_parallelism设置的 config 组,因此由 ax 自动设置。

在 main 之外加载数据(如您所建议的)可能是解决此问题的好方法。

于 2021-09-21T17:41:33.073 回答