训练DQN,报错:OSError: [Errno 12] Cannot allocate memory


训练DQN,报错:OSError: [Errno 12] Cannot allocate memory

问题介绍:

这两天在做强化学习的作业,使用 DQN 打 Atari 游戏,但在训练过程中,出现了题目中描述的错误。

解决方案:

参考链接( https://github.com/openai/gym/issues/110 )

(1)涉及知识:linux 的 overcommit_memoryovercommit_ratio

  • overcommit_memory 是内核对内存分配的一种策略。

  • vm.overcommit_memory 共有三种取值,分别为 0, 1, 2

    • vm.overcommit_memory = 0: 表示内核将检查是否有足够的可用内存供应用进程使用;如果有足够的可用内存,内存申请允许;否则,内存申请失败,并把错误返回给应用进程。
    • vm.overcommit_memory = 1: 表示内核允许分配所有的物理内存,而不管当前的内存状态如何。
    • vm.overcommit_memory = 2: 拒绝等于或者大于总可用 swap 大小以及 overcommit_ratio 指定的物理 RAM 比例的内存请求。
  • overcommit_ratio 默认为 50,为物理内存分配时的比例。**只有当 vm.overcommit_memory = 2 的时候才会生效 **

  • 查看系统 overcommit 信息

    # cat /proc/meminfo |grep -i commit
    CommitLimit:    90971304 kB
    Committed_AS:   64872556 kB
    
    • CommitLimit: 最大能分配的内存(个人理解仅仅在vm.overcommit_memory=2时候生效),具体的值是
      SWAP内存大小 + 物理内存 * overcommit_ratio / 100
    • Committed_AS: 当前已经分配的内存大小

(2)解决方法(两种)

  1. 将 overcommit_ratio 设置为 90

    # echo 90 > /proc/sys/vm/overcommit_ratio
    
  2. 将 vm.overcommit_memory 设置为 1

    sudo bash -c "echo vm.overcommit_memory=1 >> /etc/sysctl.conf"
    sudo sysctl -p
    

相关