You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

运行OpenAI Gym的脚本在无显示器远程服务器上出现内存泄漏

内存占用过高问题解决思路

1. 排查pyvirtualdisplay资源泄漏

  • 你当前的代码没有在运行结束后停止虚拟显示实例,加上很多老版本pyvirtualdisplay存在后台进程残留的问题,每次启动Display都会新起Xvfb进程不会自动销毁,单次运行或重复运行都可能积累内存占用。
  • 修复方法:把虚拟显示的启动销毁放到上下文管理器里,确保用完自动释放:
with Display(visible=0, size=(1400, 900)) as virtual_display:
    # 把后续创建env、运行episode的代码全部放到这个缩进块里
    env = gym.make('CartPole-v1')
    # ... 其余运行代码 ...
    # 运行结束后自动调用stop()释放Xvfb资源
  • 额外清理:如果之前多次运行过脚本未正常关闭资源,先手动杀服务器上残留的Xvfb进程:ps aux | grep Xvfb | grep -v grep | awk '{print $2}' | xargs kill -9

2. 修复Monitor的内存缓存问题

  • 老版本gym的wrappers.Monitor默认会把所有帧、元数据全部缓存到内存里直到env关闭,哪怕你只跑10步也会持续累积数据,叠加虚拟显示的渲染缓存就会出现内存暴涨的情况。
  • 修复方法:
    • 不需要录视频的话直接删掉Monitor包装代码,CartPole不录制视频完全不会触发渲染逻辑,内存占用会降到MB级
    • 确实需要录视频的话,给Monitor加参数限制缓存:env = wrappers.Monitor(env, './videos/' + str(time()) + '/', video_callable=lambda episode_id: episode_id%100==0, force=True),同时每次运行结束必须调用env.close()主动释放缓存资源
  • 注意:你当前的代码运行完episode之后没有调用env.close(),所有录制的帧数据都会一直留在内存里不会释放

3. 排查依赖版本兼容性

  • 如果你用的是gym 0.18~0.21之间的版本,和pyvirtualdisplay 2.0以上版本存在已知的内存泄漏bug,要么把gym降到0.17.3,要么把pyvirtualdisplay降到1.3.2即可解决
  • 如果你升级到了Gymnasium(原OpenAI Gym的后续维护版本),要改用gymnasium.wrappers.RecordVideo替代旧的Monitor,旧版Monitor在新环境里本身就会导致内存泄漏

内容的提问来源于stack exchange,提问作者ava_punksmash

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.03 21:54:03