我正试图从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,但都没有报告任何内存。这让我感到非常沮丧,希望得到任何帮助。
事实证明,在很大程度上要感谢一位合作者,我发现窗口渲染器(glwf)正在为每个窗口分配内存,将显示器从窗口中分离出来,但没有破坏窗口。因此,这个信息一直没有被清理掉。为了解决这个问题,我添加了以下内容。
import glfw
def f():
....
something that calls .render()
....
glfw.terminate()
这将迫使python正确地进行deallocate和垃圾回收。Phew.