python-3.x - 从 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。但都没有报告内存中的任何内容。这非常令人沮丧,任何帮助将不胜感激!
解决方案
事实证明,在很大程度上要感谢合作者,我发现窗口渲染器 (glwf) 正在为每个窗口分配内存,将监视器与窗口分离,但没有破坏窗口。因此,这些信息从未被清理过。为了解决这个问题,我添加了以下内容:
import glfw
def f():
....
something that calls .render()
....
glfw.terminate()
这迫使 python 正确地释放和垃圾收集。呸。
推荐阅读
- javascript - Chart.js 在注释上切线
- laravel - laravel httpd 文档根目录不会改变
- react-native - 任务“:react-native-pjsip:compileReleaseJavaWithJavac”执行失败
- extjs - 如何从 ExtJs 网格中删除列?
- c# - 不允许修改 Column 对象的 DefaultConstraintName 属性
- python - 你怎么能让你的列表在 25 个字母之后成为下一个字符?
- svn - SVN 将存储库物理文件夹从一个驱动器移动到另一个驱动器
- angular-forms - 尽管动态删除了 FormGroup 仍然有控件
- python - 递归和返回以找到值的索引
- javascript - VueJS 和 Firebase - 如何验证某人的密码