在openai gym中从图像中学习:渲染函数的内存泄漏或离屏glfw问题。

问题描述 投票:0回答:1

我正试图从openai gym的图像中学习一个控制策略。我的代码非常简单,但是由于某些原因,我产生了巨大的内存需求,并且随着代码的运行而不断增加。我的设置基本如下。

downsample_obs = torchvision.transforms.Compose([
        torchvision.transforms.ToPILImage(),
        torchvision.transforms.Resize((resize,resize), interpolation=2),
        torchvision.transforms.ToTensor()
    ])
env = gym.make('Hopper-v2')
state = env.reset()
observation = downsample_obs(env.render(mode='rgb_array')).detach()
for t in range(1000):
    next_state, reward, done, _ = env.step(action)
    observation = downsample_obs(env.render(mode='rgb_array')).detach()
    memory.push(state, np.array([action]), mask, next_state, reward, stored_observe)
    if done:
        break
update_model(memory) ...

我已经删除了渲染函数周围的所有东西 我只是调用env.render(mode='rgb_array')t次,但我仍然保持这个问题。我以为这是因为环境没有被关闭,但是当我在每次交互后包含适当的初始化关闭环境时,内存需求只会增加。每次调用make时,我也会得到以下消息。

Creating offscreen glfw

我尝试了各种库来诊断内存泄漏,比如gc和pympler.tracker的summaryTracker,但都没有报告任何内存。这让我感到非常沮丧,希望得到任何帮助。

python-3.x memory-leaks glfw openai-gym torchvision
1个回答
0
投票

事实证明,在很大程度上要感谢一位合作者,我发现窗口渲染器(glwf)正在为每个窗口分配内存,将显示器从窗口中分离出来,但没有破坏窗口。因此,这个信息一直没有被清理掉。为了解决这个问题,我添加了以下内容。

import glfw
def f():
   ....
   something that calls .render()
   ....
   glfw.terminate()

这将迫使python正确地进行deallocate和垃圾回收。Phew.

© www.soinside.com 2019 - 2024. All rights reserved.