DouZero部署实战:一条从零跑通斗地主AI的完整路线图
DouZero部署实战:一条从零跑通斗地主AI的完整路线图
【免费下载链接】DouZero[ICML 2021] DouZero: Mastering DouDizhu with Self-Play Deep Reinforcement Learning | 斗地主AI项目地址: https://gitcode.com/gh_mirrors/do/DouZero
想不想让一台电脑学会斗地主?DouZero 是快手开源的斗地主 AI 框架,它靠自我博弈的深度强化学习,从零开始训练出能战胜大多数人类玩家的智能体,论文发表于 ICML 2021。这篇文章会带你走一遍 DouZero 部署实战的完整流程:装环境、加载模型、评估对局、自己训练,最后把 AI 用起来。
斗地主凭什么难倒 AI
先讲个背景故事,方便你理解这套工具的价值。斗地主看起来只是"出牌",但它同时具备四大难题:三方博弈中两个农民要暗中配合、你只能看到自己的手牌(信息不完整)、状态空间巨大、而合法动作组合约有 10⁴ 种且每手都在变。传统强化学习算法面对这种超大的动态动作空间,几乎都会"迷路"。
DouZero 的思路非常朴素:把经典蒙特卡洛方法用神经网络增强,配合动作编码和多进程并行演员,用一套极简的 Deep Monte Carlo 算法硬生生把难题啃了下来。它在一台四卡服务器上训练几天,就超越了当时所有斗地主 AI,在 Botzone 排行榜 344 个智能体中排名第一。这份"以简驭繁"的思路,值得每个 RL 爱好者亲自跑一遍。
先看清手中的工具箱
克隆仓库后,整个项目的骨架其实很清爽,主要就三块:
douzero/dmc/:核心算法区,dmc.py是深度蒙特卡洛训练主逻辑,models.py定义神经网络结构,arguments.py是全部训练参数douzero/evaluation/:评估区,simulation.py负责对局模拟,random_agent.py、rlcard_agent.py、deep_agent.py分别代表随机、规则和深度三种智能体- 根目录的
train.py、evaluate.py、generate_eval_data.py则是你日常要敲的三个入口脚本
记住这个结构,后面每一步都是往这三个位置"添砖加瓦"。
三步搞定环境配置
DouZero 部署实战的第一步是环境准备,三步就够:
- 克隆仓库:
git clone https://gitcode.com/gh_mirrors/do/DouZero - 安装依赖:
pip3 install -r requirements.txt,需要 Python 3.6 以上 - 安装包本体,推荐安装稳定版:
pip3 install douzero国内网络下载慢的话,可以换清华镜像源,一条命令的事。这里有个关键提示:训练需要 CUDA 显卡,但评估可以纯 CPU 跑。所以哪怕你没有 GPU,也能把下面的评估流程完整走一遍,只是稍慢而已。
不训练也能玩:先加载预训练模型
很多新手一上来就急着训练,其实更聪明的顺序是先用别人训好的模型把流程跑通。项目作者提供了几款现成模型:
baselines/douzero_ADP/:以平均分差(ADP)为目标训练的版本baselines/douzero_WP/:以胜率(WP)为目标训练的版本baselines/sl/:在人类对局数据上预训练的深度智能体
下载后把权重放进baselines/目录即可。注意:这三份模型文件在源码仓库里是占位符,你需要从官方渠道获取权重再放入。
第一次评估:让 AI 跟自己打
拿到模型后,最解气的操作就是看它大杀四方。评估分两步,第一步先生成对局数据:
python3 generate_eval_data.py --num_games 10000这条命令会随机生成 1 万副牌局并存成eval_data.pkl,相当于给 AI 出一套固定的"考题"。第二步用evaluate.py让它上场:
python3 evaluate.py --landlord baselines/douzero_ADP/landlord.ckpt --landlord_up random --landlord_down random命令的意思是:地主位放 DouZero-ADP 模型,两个农民位放随机策略。跑完你会在终端看到一屏结果,核心就两个数字:WP(胜率)和 ADP(平均分差)。
- WP:地主赢了几局、农民赢了几局,最直观的强弱指标
- ADP:地主得分的平均值,反映赢牌时的"碾压程度"
通常地主位能打出 60% 以上的胜率,就说明模型已经相当能打了。想调整对手的话,--landlord_up、--landlord_down可以换成rlcard(规则 AI)或任意.ckpt模型路径,玩出各种花式 PK。
评估结果怎么看才不踩坑
我见过不少新手对着评估输出一头雾水,这里帮你提炼三个判断要点:
- 看总量:评估默认基于 1 万局,局数太少(比如几百局)胜率波动会很大,别急着下结论
- 换对手再测:单打随机对手只能说明"AI 不傻",换上
rlcard规则 AI 再测一次,才能看出真实水平 - 多进程提速:纯 CPU 评估较慢,可加
--num_workers 4并行加速,GPU 机器再加--gpu_device 0
自己训练一个 AI:参数这样调最省心
跑通评估后,就可以试着自己训一个 AI 了。单卡机器直接跑:
python3 train.py默认每 30 分钟保存一次检查点。多卡机器可以按"模拟多、训练少"的原则分配资源,比如四卡机器让前三张卡各跑 15 个演员进程用于自我对弈,第四张卡专门训练:
python3 train.py --gpu_devices 0,1,2,3 --num_actor_devices 3 --num_actors 15 --training_device 3几个关键参数的含义帮你理清:--gpu_devices指定可见的显卡,--num_actor_devices决定几张卡用于模拟对局,--num_actors是每张模拟卡上的演员进程数,--training_device指定训练卡。此外--objective可以切换奖励目标(默认 adp,可换 wp),--learning_rate、--batch_size等超参都在douzero/dmc/arguments.py里可查。
新手建议:先用默认参数把流程跑通,再逐步加大--num_actors,观察胜率曲线变化,比一上来就猛调超参更有效率。
训练中途,如何找回最新模型
训练是个长跑,途中崩溃或想中途评估都很常见。好在检查点默认存在douzero_checkpoints/douzero/下,项目还贴心地提供了找回最新模型的小脚本:
sh get_most_recent.sh douzero_checkpoints/douzero/它会自动挑选三个位置(地主、上家农民、下家农民)最新的权重,统一复制到most_recent_model/目录,方便你直接喂给evaluate.py做中途评估。这个小动作能让训练过程形成"训练-评估-再训练"的正向循环。
只有 CPU 怎么办
没有 GPU 也不用劝退。DouZero 支持纯 CPU 训练,代价是速度慢一些:
python3 train.py --actor_device_cpu --training_device cpu--actor_device_cpu让模拟演员跑在 CPU 上,--training_device cpu让训练也走 CPU。Windows 用户需要注意一个历史限制:由于 CUDA 张量多进程在 Windows 上不受支持,只能用 CPU 做演员,用 GPU 训练会报operation not supported。先用 CPU 把流程跑通,有条件再上显卡,这是最务实的路径。
常见报错排雷
operation not supported:Windows 下 GPU 演员报错,改用--actor_device_cpu- 评估找不到模型:确认
.ckpt路径写对,并已放入baselines/目录 eval_data.pkl不存在:先跑generate_eval_data.py生成数据,再执行评估- 下载依赖太慢:换清华镜像源,或使用仓库提供的
requirements.txt逐项安装
把 AI 接进你的应用
模型在手,应用场景就很丰富了:可以做游戏里的智能陪玩、把DeepAgent的act接口封装成在线出牌服务,甚至作为强化学习课程的教学案例。douzero/evaluation/deep_agent.py里的模型加载与动作选择逻辑,就是最好的集成样板——它把"读状态、算价值、选最优动作"三步封装得清清楚楚,你只需要把输入换成自己的牌局数据即可。
现在,就动手部署吧
从环境配置、加载预训练模型、跑通评估,到亲手训练并调参,DouZero 部署实战的每一步其实都不复杂,难的是迈出第一步。建议你今天晚上就用一张 CPU 把generate_eval_data.py+evaluate.py跑通,亲眼看一次 AI 胜率刷屏,那份成就感会推着你继续玩下去。祝你在斗地主 AI 的世界里玩得开心,期待你训练出超越人类的模型!
【免费下载链接】DouZero[ICML 2021] DouZero: Mastering DouDizhu with Self-Play Deep Reinforcement Learning | 斗地主AI项目地址: https://gitcode.com/gh_mirrors/do/DouZero
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
