动手实践:高级深度强化学习。使用 Sample Factory 从像素玩 Doom
单元 8 第 2 部分:高级深度强化学习。使用 Sample Factory 从像素玩 Doom
在这个笔记本中,我们将学习如何训练一个深度神经网络,以基于 Doom 游戏(一个显示结果策略的视频,如下所示)在 3D 环境中收集物体。我们使用 Sample Factory 训练这个策略,它是一种 PPO 算法的异步实现。
请注意以下几点
Sample Factory 是一个先进的 RL 框架,**只能在 Linux 和 Mac 上运行**(不支持 Windows)。
该框架在**具有多个 CPU 内核的 GPU 机器上表现最佳**,它可以在那里达到每秒 100,000 次交互的速度。标准 Colab 笔记本上提供的资源**限制了此库的性能**。因此,这种情况下速度**不能反映现实世界中的性能**。
Sample Factory 的基准测试在多种环境中可用,如果您想了解更多信息,请查看 示例。
from IPython.display import HTML
HTML(
"""<video width="640" height="480" controls>
<source src="https://huggingface.co/edbeeching/doom_health_gathering_supreme_3333/resolve/main/replay.mp4"
type="video/mp4">Your browser does not support the video tag.</video>"""
)
要验证 认证流程 的实践,您需要推送一个模型
doom_health_gathering_supreme
获得 >= 5 的结果。
要查找您的结果,请转到 排行榜 并找到您的模型,**结果 = 平均奖励 - 奖励的标准差**
如果您找不到您的模型,**请转到页面底部并单击刷新按钮**
有关认证流程的更多信息,请查看本节 👉 https://huggingface.co/deep-rl-course/en/unit0/introduction#certification-process
设置 GPU 💪
- 要**加快代理的训练,我们将使用 GPU**。为此,请转到
运行时 > 更改运行时类型
硬件加速器 > GPU
在开始训练代理之前,让我们**研究一下我们将使用的库和环境**。
Sample Factory
Sample Factory 是**最快的 RL 库之一,专注于策略梯度 (PPO) 的高效同步和异步实现**。
Sample Factory 经过充分**测试,被许多研究人员和从业者使用**,并且得到积极维护。我们的实现已知**在多种领域中达到最先进的性能,同时最大程度地减少 RL 实验训练时间和硬件要求**。
主要功能
- 高度优化的算法 架构 以实现最大学习吞吐量
- 同步和异步 训练机制
- 串行(单进程)模式 用于轻松调试
- 在基于 CPU 和 基于 GPU 的加速环境 中获得最佳性能
- 单智能体和多智能体训练、自我博弈,支持 同时训练多个策略 在一个或多个 GPU 上
- 基于种群的训练 (PBT)
- 离散、连续、混合动作空间
- 基于向量的、基于图像的、字典观察空间
- 通过解析动作/观察空间规范自动创建模型架构。支持 自定义模型架构
- 旨在导入到其他项目中, 自定义环境 是一等公民
- 详细的 WandB 和 Tensorboard 摘要, 自定义指标
- HuggingFace 🤗 集成 (将训练好的模型和指标上传到 Hub)
- 多个 示例 环境 集成 具有已调整的参数和已训练的模型
所有上述策略都可以在 🤗 hub 上找到。搜索标签 sample-factory
Sample-factory 工作原理
Sample-factory 是社区中最优化的强化学习实现之一。
它的工作原理是生成多个进程,运行 rollout worker、inference worker 和 learner worker。
这些worker通过共享内存进行通信,从而降低了进程之间的通信成本。
rollout worker 与环境交互并将观察结果发送到inference worker。
inference worker 查询策略的固定版本,并将动作发送回 rollout worker。
在k 步后,rollout worker 将一组经验轨迹发送到 learner worker,它使用这些轨迹更新 agent 的策略网络。
Sample-factory 中的 Actor Critic 模型
Sample Factory 中的 Actor Critic 模型由三个部分组成
- Encoder - 处理输入观测结果(图像、向量)并将它们映射到向量。这部分模型是你最有可能需要自定义的部分。
- Core - 集成来自一个或多个编码器的向量,可以选择在基于内存的 agent 中包含单层或多层 LSTM/GRU。
- Decoder - 在计算策略和价值输出之前,对模型核心输出应用额外的层。
该库被设计为自动支持任何观测和动作空间。用户可以轻松添加自定义模型。你可以在 文档 中了解更多信息。
ViZDoom
ViZDoom 是Doom 引擎的开源 python 接口。
该库由波兰波兹南理工大学计算科学研究所的 Marek Wydmuch 和 Michal Kempka 于 2016 年创建。
该库允许直接从屏幕像素中训练 agent,用于各种场景,包括以下视频中展示的团队死亡竞赛。由于 ViZDoom 环境基于 90 年代创建的游戏,因此它可以在现代硬件上以加速速度运行,使我们能够相当快地学习复杂的 AI 行为。
该库包含以下功能:
- 跨平台(Linux、macOS、Windows),
- Python 和 C++ 的 API,
- OpenAI Gym 环境包装器
- 易于创建自定义场景(可用的视觉编辑器、脚本语言和示例),
- 异步和同步单人和多人模式,
- 轻量级(几 MB)且快速(同步模式下高达 7000 fps,单线程),
- 可自定义的分辨率和渲染参数,
- 访问深度缓冲区(3D 视觉),
- 自动标记帧中可见的游戏对象,
- 访问音频缓冲区
- 访问角色/对象列表和地图几何形状,
- 离屏渲染和剧集录制,
- 异步模式下的时间缩放。
我们需要先安装运行 ViZDoom 环境所需的依赖项
现在我们的 Colab 运行时已设置完毕,我们可以开始安装运行 ViZDoom 在 Linux 上所需的依赖项。
如果你在 Mac 上的机器上进行操作,你需要按照 github 页面 上的安装说明进行操作。
# Install ViZDoom deps from
# https://github.com/mwydmuch/ViZDoom/blob/master/doc/Building.md#-linux
apt-get install build-essential zlib1g-dev libsdl2-dev libjpeg-dev \
nasm tar libbz2-dev libgtk2.0-dev cmake git libfluidsynth-dev libgme-dev \
libopenal-dev timidity libwildmidi-dev unzip ffmpeg
# Boost libraries
apt-get install libboost-all-dev
# Lua binding dependencies
apt-get install liblua5.1-dev
然后我们可以安装 Sample Factory 和 ViZDoom
- 这可能需要 7 分钟
pip install sample-factory pip install vizdoom
在 sample-factory 中设置 Doom 环境
import functools
from sample_factory.algo.utils.context import global_model_factory
from sample_factory.cfg.arguments import parse_full_cfg, parse_sf_args
from sample_factory.envs.env_utils import register_env
from sample_factory.train import run_rl
from sf_examples.vizdoom.doom.doom_model import make_vizdoom_encoder
from sf_examples.vizdoom.doom.doom_params import add_doom_env_args, doom_override_defaults
from sf_examples.vizdoom.doom.doom_utils import DOOM_ENVS, make_doom_env_from_spec
# Registers all the ViZDoom environments
def register_vizdoom_envs():
for env_spec in DOOM_ENVS:
make_env_func = functools.partial(make_doom_env_from_spec, env_spec)
register_env(env_spec.name, make_env_func)
# Sample Factory allows the registration of a custom Neural Network architecture
# See https://github.com/alex-petrenko/sample-factory/blob/master/sf_examples/vizdoom/doom/doom_model.py for more details
def register_vizdoom_models():
global_model_factory().register_encoder_factory(make_vizdoom_encoder)
def register_vizdoom_components():
register_vizdoom_envs()
register_vizdoom_models()
# parse the command line args and create a config
def parse_vizdoom_cfg(argv=None, evaluation=False):
parser, _ = parse_sf_args(argv=argv, evaluation=evaluation)
# parameters specific to Doom envs
add_doom_env_args(parser)
# override Doom default values for algo parameters
doom_override_defaults(parser)
# second parsing pass yields the final configuration
final_cfg = parse_full_cfg(parser, argv)
return final_cfg
现在设置已完成,我们可以训练 agent。我们选择训练一个名为 Health Gathering Supreme
的 ViZDoom 任务。
场景:Health Gathering Supreme
这个场景的目标是教会 agent 如何生存,但不知道是什么让它生存。agent 只知道生命宝贵,死亡不好,所以它必须学会延长自己的生命,并且它的健康状况与生存息息相关。
地图是一个矩形,包含墙壁,以及具有绿色酸性地板,会定期伤害玩家。最初,地图上均匀分布着一些急救包。不时会有新的急救包从天而降。急救包会治愈玩家部分生命值 - 要生存,agent 需要捡起它们。当玩家死亡或超时时,剧集结束。
进一步配置
- 生存奖励 = 1
- 3 个可用按钮:左转、右转、前进
- 1 个可用游戏变量:HEALTH
- 死亡惩罚 = 100
你可以在 这里 了解更多关于 ViZDoom 中可用场景的信息。
还有一些更复杂的场景是为 ViZDoom 创建的,比如 这个 github 页面 上详细介绍的场景。
训练 agent
- 我们将训练 agent 400 万步。这将大约需要 20 分钟。
## Start the training, this should take around 15 minutes
register_vizdoom_components()
# The scenario we train on today is health gathering
# other scenarios include "doom_basic", "doom_two_colors_easy", "doom_dm", "doom_dwango5", "doom_my_way_home", "doom_deadly_corridor", "doom_defend_the_center", "doom_defend_the_line"
env = "doom_health_gathering_supreme"
cfg = parse_vizdoom_cfg(
argv=[f"--env={env}", "--num_workers=8", "--num_envs_per_worker=4", "--train_for_env_steps=4000000"]
)
status = run_rl(cfg)
让我们看看训练后的策略的表现,并输出一个代理的视频。
from sample_factory.enjoy import enjoy
cfg = parse_vizdoom_cfg(
argv=[f"--env={env}", "--num_workers=1", "--save_video", "--no_render", "--max_num_episodes=10"], evaluation=True
)
status = enjoy(cfg)
现在让我们可视化代理的表现
from base64 import b64encode
from IPython.display import HTML
mp4 = open("/content/train_dir/default_experiment/replay.mp4", "rb").read()
data_url = "data:video/mp4;base64," + b64encode(mp4).decode()
HTML(
"""
<video width=640 controls>
<source src="%s" type="video/mp4">
</video>
"""
% data_url
)
代理已经学到了一些东西,但它的表现可以更好。 我们显然需要训练更长时间。 但让我们将这个模型上传到 Hub。
现在让我们将您的检查点和视频上传到 Hugging Face Hub
为了能够与社区共享您的模型,您需要遵循以下三个步骤
1️⃣ (如果还没有完成) 在 HF 上创建一个帐户 ➡ https://huggingface.co/join
2️⃣ 登录并从 Hugging Face 网站获取您的身份验证令牌。
- 创建一个新的令牌 (https://huggingface.co/settings/tokens) **具有写入角色**
- 复制令牌
- 运行下面的单元格并粘贴令牌
如果您不想使用 Google Colab 或 Jupyter Notebook,则需要使用以下命令:huggingface-cli login
from huggingface_hub import notebook_login
notebook_login()
!git config --global credential.helper store
from sample_factory.enjoy import enjoy
hf_username = "ThomasSimonini" # insert your HuggingFace username here
cfg = parse_vizdoom_cfg(
argv=[
f"--env={env}",
"--num_workers=1",
"--save_video",
"--no_render",
"--max_num_episodes=10",
"--max_num_frames=100000",
"--push_to_hub",
f"--hf_repository={hf_username}/rl_course_vizdoom_health_gathering_supreme",
],
evaluation=True,
)
status = enjoy(cfg)
让我们加载另一个模型
这个代理的表现很好,但我们可以做得更好! 让我们从 Hub 下载并可视化一个训练了 100 亿次步骤的代理。
#download the agent from the hub
python -m sample_factory.huggingface.load_from_hub -r edbeeching/doom_health_gathering_supreme_2222 -d ./train_dir
ls train_dir/doom_health_gathering_supreme_2222
env = "doom_health_gathering_supreme"
cfg = parse_vizdoom_cfg(
argv=[
f"--env={env}",
"--num_workers=1",
"--save_video",
"--no_render",
"--max_num_episodes=10",
"--experiment=doom_health_gathering_supreme_2222",
"--train_dir=train_dir",
],
evaluation=True,
)
status = enjoy(cfg)
mp4 = open("/content/train_dir/doom_health_gathering_supreme_2222/replay.mp4", "rb").read()
data_url = "data:video/mp4;base64," + b64encode(mp4).decode()
HTML(
"""
<video width=640 controls>
<source src="%s" type="video/mp4">
</video>
"""
% data_url
)
一些额外的挑战 🏆: Doom Deathmatch
训练一个代理玩 Doom deathmatch **需要在比 Colab 更强大的机器上花费数小时**。
幸运的是,我们已经 **在这种情况中训练了一个代理,并且它在 🤗 Hub 中可用!** 让我们下载模型并可视化代理的表现。
# Download the agent from the hub
python -m sample_factory.huggingface.load_from_hub -r edbeeching/doom_deathmatch_bots_2222 -d ./train_dir
鉴于代理玩的时间很长,视频生成可能需要 **10 分钟**。
from sample_factory.enjoy import enjoy
register_vizdoom_components()
env = "doom_deathmatch_bots"
cfg = parse_vizdoom_cfg(
argv=[
f"--env={env}",
"--num_workers=1",
"--save_video",
"--no_render",
"--max_num_episodes=1",
"--experiment=doom_deathmatch_bots_2222",
"--train_dir=train_dir",
],
evaluation=True,
)
status = enjoy(cfg)
mp4 = open("/content/train_dir/doom_deathmatch_bots_2222/replay.mp4", "rb").read()
data_url = "data:video/mp4;base64," + b64encode(mp4).decode()
HTML(
"""
<video width=640 controls>
<source src="%s" type="video/mp4">
</video>
"""
% data_url
)
您可以 **尝试使用上面的代码在这个环境中训练您的代理**,但不能在 colab 上。 **祝你好运 🤞**
如果您更喜欢一个更简单的场景, **为什么不尝试在另一个 ViZDoom 场景中进行训练,例如doom_deadly_corridor
或doom_defend_the_center
。**
这结束了最后一单元。 但我们还没有结束! 🤗 以下 **奖励部分包含深度强化学习中一些最有趣、最先进和最前沿的工作**。