強化學習MAPPO論文復現(xiàn)
行路有良伴就是捷徑。
Good company on the road is the shortest cut.
今天給大家分享的是,最近強化學習領域較火的一篇論文MAPPO的復現(xiàn)。
(今天這篇論文復現(xiàn),需要有一定的強化學習知識背景,因時間有限,今天這次分享,主要把重點放在實驗的問題匯總與解決,論文中有關的一些背景知識,改日慢慢為大家普及)
MAPPO是清華大學于超小姐姐等人的一篇有關多智能體的一種關于集中值函數(shù)PPO算法的變體文章。論文全稱是“The Surprising Effectiveness of MAPPO in Cooperative, Multi-Agent Games”。此論文認為,PPO的策略裁剪機制非常適用于SMAC任務,并且在多智能體的不平穩(wěn)環(huán)境中,IPPO的學習穩(wěn)定性優(yōu)于IAC(independent actor-critic)和IQL(independent q-learning),性能更好。也就是說,此論文認為將PPO算法擴展到多智能體環(huán)境中是十分有效的,并且總結了多智能體任務中非常有用的5個trick。大家感興趣的可以去閱讀下全文。好了,我們言歸正傳,回到今天的主線任務——論文實驗復現(xiàn)及問題解決。
友情傳送門:
MAPPO源碼地址
https://github.com/marlbenchmark/on-policy
一、問題匯總與解決
(1)線程問題
運行時,出現(xiàn)線程創(chuàng)建失敗
-u's'rOpenBLAS blas_thread_init: pthread_create failed for thread 8 of 40: Resource temporarily unavailableOpenBLAS blas_thread_init: RLIMIT_NPROC 4096 current, 253916 max
查看CPU邏輯核數(shù)
cat /proc/cpuinfo| grep "processor"| wc -l
在python程序開頭加入
import os
os.environ['OPENBLAS_NUM_THREADS'] = '1'
出現(xiàn)
修改train_mpe_.sh,在后面加上--use_recurrent_policy
重新運行即可。
(2)動態(tài)庫GLIBC問題
運行train_smac.sh出現(xiàn)問題
確定好StarCraftII的位置
將星際爭霸文件移動到root目錄下,
sudo mv /home/lab214/StarCraftII /root/
運行星際爭霸
python -m pysc2.bin.agent -map Simple64
出現(xiàn)問題報錯
/root/StarCraftII/Versions/Base75689/SC2_x64: /lib64/libc.so.6: version `GLIBC_2.18' not found (required by /root/StarCraftII/Libs/libstdc++.so.6)
查看系統(tǒng)中GLIBC版本
strings /lib64/libc.so.6 | grep GLIBC
發(fā)現(xiàn)最高才到GLIBC2.17
背景補充:
Glibc是gnu發(fā)布的libc庫,即c運行庫。glibc是linux系統(tǒng)中最底層的api,幾乎其它任何運行庫都會依賴于glibc。glibc除了封裝linux操作系統(tǒng)所提供的系統(tǒng)服務外,它本身也提供了許多其它一些必要功能服務的實現(xiàn)…對于CentOS這樣的系統(tǒng),為了追求穩(wěn)定性(這個值得商榷)往往各種庫版本都很低,因此,更新glibc到2.18即可。
下載glibc2.18庫
curl -O https://mirrors.tuna.tsinghua.edu.cn/gnu/glibc/glibc-2.18.tar.gz
解壓
tar -zxvf glibc-2.18.tar.gz
創(chuàng)建編譯目錄
cd glibc-2.18
編譯
cd build/
安裝
sudo make -j
sudo make install
再次查看glibc
strings /lib64/libc.so.6 | grep GLIBC
此時GLIBC2.18已經(jīng)成功安裝
二、運行測試及問題解決
運行星際爭霸
python -m pysc2.bin.agent -map Simple64
發(fā)現(xiàn),此時已經(jīng)可以成功運行
作為玩家啟動游戲
python -m pysc2.bin.play –map Simple64
會隨機出現(xiàn)一個地圖
找到回放存放的路徑
cd ~/StarCraftII/
在存有回放文件的文件夾下觀看回放
python -m pysc2.bin.play -replay RandomAgent/Simple64_2021-04-21-03-13-36.SC2Replay
列出所有地圖
python -m pysc2.bin.map_list
繼續(xù)運行星際爭霸
./train_smac.sh
出現(xiàn)新的問題
ValueError: Map 'SMAC_Maps/corridor.SC2Map' not found.
找到starcraft2的文件位置
cd onpolicy/envs/starcraft2
下載SMAC_Maps
git clone https://github.com/oxwhirl/smac.git
進入SMAC_Maps
cd smac/smac/env/starcraft2/mps
發(fā)現(xiàn)SMAC_Maps
將其剪切到onpolicy/envs/starcraft2文件夾下,再次運行
./train_smac.sh
該錯誤仍然出現(xiàn),這說明,我們需要將地圖文件放置到星際爭霸地圖中去
首先,先瀏覽星際爭霸地圖文件,發(fā)現(xiàn)地圖中沒有SMAC_Maps
根據(jù)顯示出的地圖路徑,我們將下載好的SMAC_Maps移動到Maps下
sudo mv /home/lab214/下載/on-policy-main/onpolicy/envs/starcraft2/SMAC_Maps /root/StarCraftII/Maps/
之后,再次運行測試
./train_smac.sh
此時,已經(jīng)可以成功運行
總共有1千萬步需要更新
大概訓練九百多萬步后,便會停止。
運行hanabi場景
chmod +x ./train_hanabi_forward.sh
開始運行
./train_hanabi_forward.sh
出現(xiàn)bug為“check recurrent policy!”
修改train_hanabi_forward.sh,在其后加上--use_recurrent_policy
重新運行
仔細研究train_hanabi_forward.sh發(fā)現(xiàn)其中已經(jīng)含有--use_recurrent_policy 猜想這可能是由于環(huán)境問題造成的
進入運行環(huán)境
source /etc/profile
再次運行
仍然是一樣的報錯,這說明不是運行環(huán)境問題。
繼續(xù)探索,出現(xiàn)
IndentationError: unindent does not match any outer indentation level
這說明出現(xiàn)了空格和Table混用的情況,需要修改空格。定位到157行
將elif對齊后,重新運行
發(fā)現(xiàn)仍有錯誤,將其刪除
重新運行
使用sudo執(zhí)行
安裝wandb
pip install -i https://pypi.douban.com/simple --trusted-host pypi.douban.com wandb
切換root用戶
進入root用戶,再進入環(huán)境 運行發(fā)現(xiàn)
于是改變hanabi_forward.sh的參數(shù),將algo="mappo"改為algo="rmappo"
再次執(zhí)行
出現(xiàn)cuda out of memory
發(fā)現(xiàn)超出內存,在train_hanabi_forward.sh中修改訓練次數(shù)和隱藏層大小,在這里我將--hidden_size改為了256
再次運行
./train_hanabi_forward.sh
發(fā)現(xiàn)此時,終于可以成功運行!
對此,你有什么看法呢?如果你在操作過程中遇到了什么問題,或有什么想法和建議,在留言區(qū)留下你的足跡吧,與大家一起交流,一起進步~