首页 > 解决方案 > 从 openai 健身房中的图像中学习:渲染功能的内存泄漏或屏幕外 glfw 问题

问题描述

我正在尝试从 openai 健身房的图像中学习控制策略。我的代码非常紧张,但是由于某种原因,我会产生巨大的内存需求,随着我的代码运行而不断增长。我的设置基本上如下:

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

我尝试了各种库来诊断内存泄漏,例如 pymler.tracker 中的 gc 和 SummaryTracker。但都没有报告内存中的任何内容。这非常令人沮丧,任何帮助将不胜感激!

标签: python-3.xmemory-leaksglfwopenai-gymtorchvision

解决方案


事实证明,在很大程度上要感谢合作者,我发现窗口渲染器 (glwf) 正在为每个窗口分配内存,将监视器与窗口分离,但没有破坏窗口。因此,这些信息从未被清理过。为了解决这个问题,我添加了以下内容:

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

这迫使 python 正确地释放和垃圾收集。呸。


推荐阅读