訓練DQN,報錯:OSError: [Errno 12] Cannot allocate memory
問題介紹:
這兩天在做強化學習的作業,使用 DQN 打 Atari 游戲,但在訓練過程中,出現了題目中描述的錯誤。
解決方案:
參考鏈接( https://github.com/openai/gym/issues/110 )
(1)涉及知識:linux 的 overcommit_memory、overcommit_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: 當前已經分配的內存大小
- CommitLimit: 最大能分配的內存(個人理解僅僅在vm.overcommit_memory=2時候生效),具體的值是
(2)解決方法(兩種)
-
將 overcommit_ratio 設置為 90
# echo 90 > /proc/sys/vm/overcommit_ratio
-
將 vm.overcommit_memory 設置為 1
sudo bash -c "echo vm.overcommit_memory=1 >> /etc/sysctl.conf" sudo sysctl -p