强化学习MAPPO论文复现
行路有良伴就是捷径。
Good company on the road is the shortest cut.
今天给大家分享的是,最近强化学习领域较火的一篇论文MAPPO的复现。
(今天这篇论文复现,需要有一定的强化学习知识背景,因时间有限,今天这次分享,主要把重点放在实验的问题汇总与解决,论文中有关的一些背景知识,改日慢慢为大家普及)
MAPPO是清华大学于超小姐姐等人的一篇有关多智能体的一种关于集中值函数PPO算法的变体文章。论文全称是“The Surprising Effectiveness of MAPPO in Cooperative, Multi-Agent Games”。此论文认为,PPO的策略裁剪机制非常适用于SMAC任务,并且在多智能体的不平稳环境中,IPPO的学习稳定性优于IAC(independent actor-critic)和IQL(independent q-learning),性能更好。也就是说,此论文认为将PPO算法扩展到多智能体环境中是十分有效的,并且总结了多智能体任务中非常有用的5个trick。大家感兴趣的可以去阅读下全文。好了,我们言归正传,回到今天的主线任务——论文实验复现及问题解决。
友情传送门:
MAPPO源码地址
https://github.com/marlbenchmark/on-policy
一、问题汇总与解决
(1)线程问题
运行时,出现线程创建失败
-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逻辑核数
cat /proc/cpuinfo| grep "processor"| wc -l
在python程序开头加入
import os
os.environ['OPENBLAS_NUM_THREADS'] = '1'
出现
修改train_mpe_.sh,在后面加上--use_recurrent_policy
重新运行即可。
(2)动态库GLIBC问题
运行train_smac.sh出现问题
确定好StarCraftII的位置
将星际争霸文件移动到root目录下,
sudo mv /home/lab214/StarCraftII /root/
运行星际争霸
python -m pysc2.bin.agent -map Simple64
出现问题报错
/root/StarCraftII/Versions/Base75689/SC2_x64: /lib64/libc.so.6: version `GLIBC_2.18' not found (required by /root/StarCraftII/Libs/libstdc++.so.6)
查看系统中GLIBC版本
strings /lib64/libc.so.6 | grep GLIBC
发现最高才到GLIBC2.17
背景补充:
Glibc是gnu发布的libc库,即c运行库。glibc是linux系统中最底层的api,几乎其它任何运行库都会依赖于glibc。glibc除了封装linux操作系统所提供的系统服务外,它本身也提供了许多其它一些必要功能服务的实现…对于CentOS这样的系统,为了追求稳定性(这个值得商榷)往往各种库版本都很低,因此,更新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
创建编译目录
cd glibc-2.18
编译
cd build/
安装
sudo make -j
sudo make install
再次查看glibc
strings /lib64/libc.so.6 | grep GLIBC
此时GLIBC2.18已经成功安装
二、运行测试及问题解决
运行星际争霸
python -m pysc2.bin.agent -map Simple64
发现,此时已经可以成功运行
作为玩家启动游戏
python -m pysc2.bin.play –map Simple64
会随机出现一个地图
找到回放存放的路径
cd ~/StarCraftII/
在存有回放文件的文件夹下观看回放
python -m pysc2.bin.play -replay RandomAgent/Simple64_2021-04-21-03-13-36.SC2Replay
列出所有地图
python -m pysc2.bin.map_list
继续运行星际争霸
./train_smac.sh
出现新的问题
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
发现SMAC_Maps
将其剪切到onpolicy/envs/starcraft2文件夹下,再次运行
./train_smac.sh
该错误仍然出现,这说明,我们需要将地图文件放置到星际争霸地图中去
首先,先浏览星际争霸地图文件,发现地图中没有SMAC_Maps
根据显示出的地图路径,我们将下载好的SMAC_Maps移动到Maps下
sudo mv /home/lab214/下载/on-policy-main/onpolicy/envs/starcraft2/SMAC_Maps /root/StarCraftII/Maps/
之后,再次运行测试
./train_smac.sh
此时,已经可以成功运行
总共有1千万步需要更新
大概训练九百多万步后,便会停止。
运行hanabi场景
chmod +x ./train_hanabi_forward.sh
开始运行
./train_hanabi_forward.sh
出现bug为“check recurrent policy!”
修改train_hanabi_forward.sh,在其后加上--use_recurrent_policy
重新运行
仔细研究train_hanabi_forward.sh发现其中已经含有--use_recurrent_policy 猜想这可能是由于环境问题造成的
进入运行环境
source /etc/profile
再次运行
仍然是一样的报错,这说明不是运行环境问题。
继续探索,出现
IndentationError: unindent does not match any outer indentation level
这说明出现了空格和Table混用的情况,需要修改空格。定位到157行
将elif对齐后,重新运行
发现仍有错误,将其删除
重新运行
使用sudo执行
安装wandb
pip install -i https://pypi.douban.com/simple --trusted-host pypi.douban.com wandb
切换root用户
进入root用户,再进入环境 运行发现
于是改变hanabi_forward.sh的参数,将algo="mappo"改为algo="rmappo"
再次执行
出现cuda out of memory
发现超出内存,在train_hanabi_forward.sh中修改训练次数和隐藏层大小,在这里我将--hidden_size改为了256
再次运行
./train_hanabi_forward.sh
发现此时,终于可以成功运行!
对此,你有什么看法呢?如果你在操作过程中遇到了什么问题,或有什么想法和建议,在留言区留下你的足迹吧,与大家一起交流,一起进步~