扑克强化学习框架。
项目描述
扑克RL
扑克游戏中的多智能体深度强化学习框架。
背景
直到最近,解决不完美信息博弈的研究主要围绕遍历整个博弈树的方法展开(例如,参见 [0]、 [1]、 [2])。新算法,如神经虚构自我游戏 (NFSP) [3]、遗憾策略梯度 (RPG) [4]、深度反事实遗憾最小化 (Deep CFR) [5]和单深度 CFR [8] 最近结合了 Deep (强化)使用 CFR 和 Fictitious-Play 等传统方法学习近似纳什均衡,同时只访问游戏状态的一小部分。
PokerRL 框架
PokerRL 算法的组成部分
您的算法由相互交互的工作人员(绿色)组成。训练运行的参数通过TrainingProfile (
.../rl/base_cls/TrainingProfileBase
) 的实例传递。诸如最佳响应或正面交锋性能等常见指标可以由单独的工作人员定期测量(红色)。您经过训练的代理被包裹在一个 EvalAgent ( .../rl/base_cls/EvalAgentBase
) 中。您的 EvalAgent 可以在 AgentTournament ( .../game/AgentTournament
) 中与其他 AI 战斗,或在 InteractiveGame ( ) 中与人类比赛.../game/InteractiveGame
。所有本地工作人员(仅类)都可以用大约 4 行代码包装,以作为独立的分布式工作人员工作。
PokerRL 的某些部分仅适用于 2 人游戏,因为它们在其他设置中没有意义。但是,游戏引擎本身和代理模块对 N>1 名玩家是通用的。
算法评估
我们提供了四个指标来评估算法:
- 最佳响应 (BR) - 计算准确的可利用性(针对小型游戏)。
- 局部最佳响应 (LBR) [7]近似于 BR 的下限。
- RL 最佳响应 (RL-BR)通过 针对 AI训练 DDQN [9]来逼近 BR。
- 头对头 (H2H) - 让我们两种模式的特工对战。
我们当前的最佳响应实现仅适用于小型游戏,但 LBR 和 QBR 针对(非常)大型游戏中的分布式计算进行了优化。作为小型游戏中的基线比较,有(未优化的)普通 CFR [10]、CFR+ [11] 和线性 CFR [12] 实现可以像深度强化学习代理一样运行,并将它们的可利用性绘制到 TensorBoard。
性能和可扩展性
虽然过去算法的性能问题主要与游戏树上的计算有关,但这些基于采样的方法在查询神经网络时具有大部分开销。PokerRL 提供了一个 RL 环境和一个框架,在此基础上可以构建和运行基于深度学习的算法来解决扑克游戏。PokerRL 为 ray [6]提供了一个包装器,以允许相同的代码在本地、许多内核上运行,甚至在 CPU 和潜在的 GPU 工作人员集群上运行。
安装
这些说明将指导您在本地机器上启动和运行 PokerRL,并说明如何将您在本地开发和测试的相同代码无缝部署到 AWS 集群上。
先决条件
此代码库与本地运行的操作系统无关,但由于 ray的限制,仅支持 Linux 用于分布式运行。
在本地计算机上安装
首先,请安装 Anaconda/Miniconda 和 Docker。然后运行以下命令(在需要的地方插入详细信息):
conda create -n CHOOSE_A_NAME python=3.6 -y
source activate THE_NAME_YOU_CHOSE
pip install requests
conda install pytorch=0.4.1 -c pytorch
接着
pip install PokerRL
注意:对于分布式运行,您需要 Linux 和pip install PokerRL[distributed]
. 这对于仅本地使用不是必需的。
该框架使用PyCrayon,一个与 Tensorboard 无关的语言包装器。请按照他们的 GitHub 页面上的说明进行设置。安装 PyCrayon 后,您可以通过以下方式运行和启动日志服务器
docker run -d -p 8888:8888 -p 8889:8889 --name crayon alband/crayon
docker start crayon
现在尝试在浏览器中访问 Tensorboard localhost:8888
。
运行一些测试
在包含 PokerRL 的目录中运行此命令以检查所有单元测试是否通过。
python -m unittest discover PokerRL/test
测试您的安装是否成功的一个更有趣的方法是examples/interactive_user_v_user.py
与自己玩扑克并examples/run_cfrp_example.py
在小型扑克游戏中训练 CFR+ 代理。
云与集群
PokerRL 提供了一个接口,允许完全相同的代码通过使用 ray在本地和集群上运行。PokerRL 支持两种模式:
- 分布式:在具有多个内核的单台机器上运行多个工作进程
- 集群:在许多机器上运行许多工作人员
您可以通过在 TrainingProfile 中切换布尔值来启用/禁用分布式和集群模式。本节假设您使用安装了 pip 的 PokerRL 版本开发了您的算法。
与分布式 PokerRL 兼容的算法示例是 Neural Fictitious Self-Play [8] 的实现。以及 Single Deep CFR [3]的实现
AWS 实例上的本地或分布式模式
-
通过管理控制台启动任何适合您需求的 AWS 实例。本教程假设您的基础 AMI 是“Amazon Linux 2 AMI (HVM), SSD Volume Type”。注意:为您的安全组添加以下权限以便能够查看日志非常重要:
Custom TCP Rule | TCP | 8888 | Your_IP | Tensorboard
-
在实例上运行以下命令:
sudo yum update -y sudo yum install git gcc g++ polkit -y sudo amazon-linux-extras install docker -y sudo service docker start sudo docker pull alband/crayon wget https://repo.anaconda.com/miniconda/Miniconda3-latest-Linux-x86_64.sh bash Miniconda3-latest-Linux-x86_64.sh -b -p /home/ec2-user/miniconda export PATH=/home/ec2-user/miniconda/bin:$PATH conda create -n PokerAI python=3.6 -y source activate PokerAI pip install requests conda install pytorch=0.4.1 -c pytorch -y pip install PokerRL[distributed]
-
授予您的实例访问您的代码库的权限,以便
git pull
以后可以访问。 -
创建一个 AMI(即您的实例的映像)以便将来能够跳过过去的步骤。
-
每次使用 AMI 启动新实例时,执行
sudo service docker start sudo docker inspect -f {{.State.Running}} crayon || sudo docker run -d -p 8888:8888 -p 8889:8889 --name crayon alband/crayon sudo docker start crayon screen export OMP_NUM_THREADS=1 export PATH=/home/ec2-user/miniconda/bin:$PATH source activate PokerAI source deactivate source activate PokerAI
OMP_NUM_THREADS=1
由于 PyTorch 0.4.1 中存在忽略核心/进程限制的错误,您必须进行设置。这在 PyTorch 1.0 中已修复,但在许多情况下,对于循环网络,1.0 实际上比 0.4.1 慢。 -
开始任何算法运行的常用语法应该类似于
cd PATH/TO/PROJECT git pull python YOUR_SCRIPT.py
-
在您的浏览器(本地)中,请前往
AWS_INSTANCE_PUBLIC_IP:8888
查看日志和结果。
在集群上部署
从分布式到集群的步骤只需要ray记录的更改。获得集群规范文件 ( .yaml
) 并设置 AWS 账户后,只需启用cluster
TrainingProfile 中的选项并通过命令行通过 ray 启动集群。
笔记
一个可选的调试工具,可以在小型游戏中使用代理的策略绘制完整的游戏树。代码(由 Sebastian De Ro 编写)可以从
这里下载。要安装它,只需将 PokerViz 文件夹直接拖到您的C:/
驱动器 (Windows) 或您的home
目录 (Linux) 中。当您在小型游戏上运行 Best Response 时,PokerRL 将检测到它已安装并导出可视化。要查看树,请进入data
目录并重命名要查看的树,data.js
然后打开
index.html
.
请注意,Python 代码将从 C++ 导出的少量功能导入分别用于 Win 和 Linux 的 .dll 和 .so 文件。此存储库仅包含二进制文件。
引用
如果你在研究中使用 PokerRL,你可以引用如下:
@misc{steinberger2019pokerrl,
author = {Eric Steinberger},
title = {PokerRL},
year = {2019},
publisher = {GitHub},
journal = {GitHub repository},
howpublished = {\url{https://github.com/TinkeringCode/PokerRL}},
}
作者
- 埃里克·斯坦伯格
执照
这个项目是在 MIT 许可下获得许可的 - 有关详细信息,请参阅LICENSE文件。
致谢
我要感谢 Alexander Mandt 让 ray 在我们本地的 64 名工作人员集群上运行,并感谢 HTL Spengergasse 提供它。Sebastian De Ro 开发了一个游戏树可视化 工具,我们将它集成到 PokerRL 中,并为我们用 C++ 编写的批量扑克手牌评估器做出了贡献。
参考
[0] 津克维奇、马丁等人。“信息不完整游戏中的遗憾最小化。” 神经信息处理系统的进展。2008 年。
[1] Tammelin、Oskari 等人。“解决单挑限制德州扑克。” IJCAI.dc 2015。
[2] 兰克托、马克等人。“蒙特卡洛抽样在广泛游戏中的遗憾最小化。” 神经信息处理系统的进展。2009 年。
[3] 海因里希、约翰内斯和大卫·西尔弗。“从不完美信息游戏中的自我游戏中进行深度强化学习。” arXiv 预印本 arXiv:1603.01121 (2016)。
[4] 斯里尼瓦桑、斯里拉姆等人。“部分可观察的多智能体环境中的演员批评政策优化。” 神经信息处理系统的进展。2018 年。
[5] 布朗、诺姆等人。“深度反事实遗憾最小化。” arXiv 预印本 arXiv:1811.00164 (2018)。
[6] https://github.com/ray-project/ray
[7] 莉西、维利亚姆和迈克尔·鲍林。“当前无限扑克机器人的平衡近似质量。” arXiv 预印本 arXiv:1612.07547 (2016)。
[8] 斯坦伯格,埃里克。“单一深度反事实遗憾最小化。” arXiv 预印本 arXiv:1901.07621 (2019)。
[9] 王子玉,等。“用于深度强化学习的决斗网络架构。” arXiv 预印本 arXiv:1511.06581 (2015)。
[10] 津克维奇、马丁等人。“信息不完整游戏中的遗憾最小化。” 神经信息处理系统的进展。2008 年。
[11] 塔梅林,奥斯卡里。“使用 CFR+ 解决大型不完美信息博弈。” arXiv 预印本 arXiv:1407.5042 (2014)。
[12] 布朗、诺姆和 Tuomas Sandholm。“通过贴现遗憾最小化解决不完美信息博弈。” arXiv 预印本 arXiv:1809.04040 (2018)。
项目详情
下载文件
下载适用于您平台的文件。如果您不确定要选择哪个,请了解有关安装包的更多信息。