深度强化学习课程文档

动手实践:高级深度强化学习。使用 Sample Factory 从像素玩 Doom

Hugging Face's logo
加入 Hugging Face 社区

并获得增强型文档体验

开始

动手实践:高级深度强化学习。使用 Sample Factory 从像素玩 Doom

Ask a Question Open In Colab

Colab 笔记本:在 Colab 中打开

单元 8 第 2 部分:高级深度强化学习。使用 Sample Factory 从像素玩 Doom

Thumbnail

在这个笔记本中,我们将学习如何训练一个深度神经网络,以基于 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 Step 1
  • 硬件加速器 > GPU
GPU Step 2

在开始训练代理之前,让我们**研究一下我们将使用的库和环境**。

Sample Factory

Sample Factory 是**最快的 RL 库之一,专注于策略梯度 (PPO) 的高效同步和异步实现**。

Sample Factory 经过充分**测试,被许多研究人员和从业者使用**,并且得到积极维护。我们的实现已知**在多种领域中达到最先进的性能,同时最大程度地减少 RL 实验训练时间和硬件要求**。

Sample factory

主要功能

所有上述策略都可以在 🤗 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

Sample-factory 中的 Actor Critic 模型

Sample Factory 中的 Actor Critic 模型由三个部分组成

  • Encoder - 处理输入观测结果(图像、向量)并将它们映射到向量。这部分模型是你最有可能需要自定义的部分。
  • Core - 集成来自一个或多个编码器的向量,可以选择在基于内存的 agent 中包含单层或多层 LSTM/GRU。
  • Decoder - 在计算策略和价值输出之前,对模型核心输出应用额外的层。

该库被设计为自动支持任何观测和动作空间。用户可以轻松添加自定义模型。你可以在 文档 中了解更多信息。

ViZDoom

ViZDoomDoom 引擎的开源 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

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 网站获取您的身份验证令牌。

Create HF Token
  • 复制令牌
  • 运行下面的单元格并粘贴令牌

如果您不想使用 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_corridordoom_defend_the_center。**


这结束了最后一单元。 但我们还没有结束! 🤗 以下 **奖励部分包含深度强化学习中一些最有趣、最先进和最前沿的工作**。

继续学习,保持出色 🤗

< > 更新 在 GitHub 上