深度强化学习课程文档
实战:高级深度强化学习。使用 Sample Factory 从像素玩 Doom
并获得增强的文档体验
开始使用
实战:高级深度强化学习。使用 Sample Factory 从像素玩 Doom
第 8 单元第 2 部分:高级深度强化学习。使用 Sample Factory 从像素玩 Doom

在本笔记本中,我们将学习如何训练深度神经网络,以在基于 Doom 游戏的 3D 环境中收集物品,下方显示了最终策略的视频。我们使用 Sample Factory(PPO 算法的异步实现)来训练此策略。
请注意以下几点:
Sample Factory 是一个高级强化学习框架,并且仅在 Linux 和 Mac 上运行(不支持 Windows)。
该框架在具有许多 CPU 核心的 GPU 机器上性能最佳,每秒可达到 100k 次交互。标准 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。为此,请转到
Runtime > Change Runtime type

硬件加速器 > GPU

在开始训练我们的智能体之前,让我们研究一下我们将要使用的库和环境。
Sample Factory
Sample Factory 是最快的强化学习库之一,专注于策略梯度 (PPO) 的高效同步和异步实现。
Sample Factory 经过彻底测试,被许多研究人员和从业者使用,并积极维护。我们的实现已知可以在各种领域达到 SOTA 性能,同时最大限度地减少强化学习实验训练时间和硬件要求。

主要特点
- 高度优化的算法 架构,实现最大学习吞吐量
- 同步和异步 训练机制
- 串行(单进程)模式,便于调试
- 在基于 CPU 和 GPU 加速环境 中均表现最佳
- 单智能体和多智能体训练,自对弈,支持在单个或多个 GPU 上同时 训练多个策略
- 基于种群的训练(PBT)
- 离散、连续、混合动作空间
- 基于向量、基于图像、基于字典的观察空间
- 通过解析动作/观察空间规范自动创建模型架构。支持 自定义模型架构
- 旨在导入其他项目,自定义环境 是头等公民
- 详细的 WandB 和 Tensorboard 摘要,自定义指标
- HuggingFace 🤗 集成(将训练好的模型和指标上传到 Hub)
- 多个 示例 环境 集成,附带调优参数和训练好的模型
以上所有策略均可在 🤗 Hub 上找到。搜索标签 sample-factory
Sample-factory 如何工作
Sample-factory 是社区中最优化程度最高的强化学习实现之一。
它通过生成多个进程来运行 rollout worker、推理 worker 和一个 learner worker。
这些worker通过共享内存进行通信,从而降低了进程间的通信成本。
rollout worker 与环境交互并将观测发送到推理 worker。
推理 worker 查询固定版本的策略,并将动作发回给 rollout worker。
在 k 步之后,rollout worker 将经验轨迹发送给 learner worker,learner worker 用它来更新智能体的策略网络。

Sample-factory 中的 Actor-Critic 模型
Sample Factory 中的 Actor Critic 模型由三个组件组成
- 编码器 - 处理输入观测(图像、向量)并将其映射为向量。这部分模型很可能是您最想自定义的部分。
- 核心 - 整合来自一个或多个编码器的向量,可选择在基于内存的智能体中包含单层或多层 LSTM/GRU。
- 解码器 - 在计算策略和价值输出之前,对模型核心的输出应用额外的层。
该库已设计为自动支持任何观测和动作空间。用户可以轻松添加其自定义模型。您可以在文档中了解更多信息。
ViZDoom
ViZDoom 是 Doom 引擎的开源 Python 接口。
该库由波兹南工业大学计算机科学研究所的 Marek Wydmuch 和 Michal Kempka 于 2016 年创建。
该库能够直接从屏幕像素训练智能体,适用于多种场景,包括下方视频中所示的团队死亡竞赛。由于 ViZDoom 环境基于 90 年代创建的游戏,因此它可以在现代硬件上以加速的速度运行,使我们能够相当快地学习复杂的 AI 行为。
该库包含以下功能:
- 多平台 (Linux, macOS, Windows)
- Python 和 C++ API
- OpenAI Gym 环境封装
- 易于创建自定义场景(提供可视化编辑器、脚本语言和示例)
- 异步和同步单人与多人模式
- 轻量级(几兆字节)且快速(同步模式下高达 7000 fps,单线程)
- 可自定义分辨率和渲染参数
- 访问深度缓冲区(3D 视觉)
- 帧中可见游戏对象的自动标注
- 访问音频缓冲区
- 访问角色/对象列表和地图几何
- 离屏渲染和情节录制
- 异步模式下的时间缩放。
我们首先需要安装 ViZDoom 环境所需的一些依赖项
现在 Colab 运行时已设置完毕,我们可以开始安装在 Linux 上运行 ViZDoom 所需的依赖项。
如果您在 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
现在设置已完成,我们可以训练智能体了。我们在这里选择学习一个名为 Health Gathering Supreme
的 ViZDoom 任务。
场景:生命值收集至尊

此场景的目标是教导智能体如何在不了解使其生存的原因的情况下生存。智能体只知道生命是宝贵的,死亡是糟糕的,因此它必须学习什么能延长它的生命,以及它的生命值与生存相关联。
地图是一个矩形,包含墙壁和周期性伤害玩家的绿色酸性地板。最初,地图上均匀分布着一些医疗包。新的医疗包会不时从天而降。医疗包能恢复玩家的部分生命值——为了生存,智能体需要捡起它们。当玩家死亡或超时时,本回合结束。
进一步配置
- 生存奖励 = 1
- 3个可用按钮:左转,右转,向前移动
- 1个可用游戏变量:HEALTH(生命值)
- 死亡惩罚 = 100
您可以在 这里 找到更多关于 ViZDoom 中可用场景的信息。
此外,还有一些为 ViZDoom 创建的更复杂的场景,例如 此 GitHub 页面上详细介绍的场景。
训练智能体
- 我们将训练智能体 4000000 步。这大约需要 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 下载并可视化一个训练了 10B 步的智能体。
#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 死亡竞赛
训练智能体玩 Doom 死亡竞赛在比 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
。
至此,最后一个单元的学习就结束了。但我们还没有完成!🤗 以下奖励部分包含深度强化学习中最有趣、最先进和最前沿的一些工作。