Hydras sweeper,特别是 Ax-sweeper free/allocate 内存如何?

How does Hydras sweeper, specifically Ax-sweeper free/allocate memory?

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

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

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

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

所以我的问题是,Hydra sweeper(或 ax-sweeper)如何在两次扫荡之间工作?我一直有这样的印象,它 运行s main(cfg: DictConfig)@hydra.main(...) 装饰,采用标量 return(分数)和 运行 具有此分数的贝叶斯优化器,main() 被称为类似于函数(内部的所有内容都被正确地 deallocated/garbage 收集 每次扫描 - 运行 之间)。

不是这样的吗?然后我是否应该将数据加载到 main() 之外的某个地方并在扫描之间保留它?

非常感谢您!

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

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

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

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