訓練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
    


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM