Ray:在python脚本中多次调用tune.run()时的内存管理
我有一个python脚本,它使用库Ray:在python脚本中多次调用tune.run()时的内存管理,python,memory-management,reinforcement-learning,ray,Python,Memory Management,Reinforcement Learning,Ray,我有一个python脚本,它使用库ray和rllib训练强化学习模型。脚本使用检查点迭代更新rllib.PPO模型。在每次迭代中,我都会重新定义配置并调用tune.run(),在这里我将上一次迭代的检查点提供给restore变量。对于对tune.run()的每次调用,我只请求一个worker。在进入循环之前,我初始化ray并请求大量资源 问题是内存增长很快,直到ray抱怨工作人员没有足够的内存并停止工作。使用htop,我可以看到python脚本在前10次迭代中从6%变为80%。我想知道如何在每次
ray
和rllib
训练强化学习模型。脚本使用检查点迭代更新rllib.PPO
模型。在每次迭代中,我都会重新定义配置并调用tune.run()
,在这里我将上一次迭代的检查点提供给restore变量。对于对tune.run()
的每次调用,我只请求一个worker。在进入循环之前,我初始化ray并请求大量资源
问题是内存增长很快,直到ray
抱怨工作人员没有足够的内存并停止工作。使用htop,我可以看到python脚本在前10次迭代中从6%变为80%。我想知道如何在每次迭代结束时释放资源,以便内存使用不会随着运行时间的增加而增加
以下是我脚本的(伪)代码:
初始化光线
ray.init(对象存储内存=50000000000,内存=50000000000)
训练回路
正如您所看到的,我目前没有做任何事情来释放资源。此外,在循环中调用
ray.init()
会产生一个错误,表明不可能多次调用它。最后,在开始时请求更多内存是不可能的,也不能解决问题,因为我希望在保持内存使用不变的情况下执行数千次迭代。啊,我解决了这个问题。调用tune.run()
后不需要释放任何资源,内存问题是由于在每次迭代中构建tensorflow图造成的。我意识到,非常令人烦恼的是,释放TensorLow分配的资源的唯一方法是终止python解释器(关闭tensorflow会话不会释放它们)。因此,我编写了一个用于构建和训练图形的脚本,我使用os.system()
调用该脚本。很有黑客味,但我不知道还有其他解决方案 也许可以使用ray.remote(max_calls=1)
函数在PythonLand中运行TensorFlow会话,但可以解决内存问题?有什么消息吗?我希望最终有一个更好的解决方案。
for iteration in range(niterations):
new_config = ...
prev_checkpoint = ...
tune.run('PPO', restore= prev_checkpoint, config=new_config)