深度强化学习课程文档

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

Hugging Face's logo
加入 Hugging Face 社区

并获得增强的文档体验

开始入门

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

Ask a Question Open In Colab

Colab 笔记本: Open In Colab

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

Thumbnail

在本笔记本中,我们将学习如何训练深度神经网络,使其在 Doom 游戏的基础上,在 3D 环境中收集物体,结果策略的视频如下所示。我们使用 Sample Factory 训练此策略,Sample Factory 是 PPO 算法的异步实现。

请注意以下几点

  • Sample Factory 是一个高级强化学习框架,仅在 Linux 和 Mac 上运行(不在 Windows 上运行)。

  • 该框架在具有多个 CPU 核心的 GPU 机器上表现最佳,在那里它可以达到每秒 10 万次交互的速度。标准 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最快的强化学习库之一,专注于策略梯度(PPO)的高效同步和异步实现

Sample Factory 经过了全面的测试,被许多研究人员和从业者使用,并且正在积极维护。我们的实现以在各种领域达到 SOTA 性能,同时最大限度地缩短强化学习实验训练时间和硬件要求而闻名。

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,learner worker 使用该轨迹来更新智能体的策略网络

Sample factory

Sample Factory 中的 Actor Critic 模型

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

  • 编码器 - 处理输入观察(图像、向量)并将它们映射到向量。这是您最有可能想要自定义的模型部分。
  • 核心 - 集成来自一个或多个编码器的向量,可以选择在基于内存的智能体中包含单层或多层 LSTM/GRU。
  • 解码器 - 在计算策略和价值输出之前,将附加层应用于模型核心的输出。

该库旨在自动支持任何观察和动作空间。用户可以轻松添加其自定义模型。您可以在文档中找到更多信息。

ViZDoom

ViZDoomDoom 引擎的开源 Python 接口

该库由 Marek Wydmuch 和 Michal Kempka 于 2016 年在波兰波兹南理工大学计算机科学研究所创建。

该库支持直接从屏幕像素训练智能体,适用于多种场景,包括团队死亡竞赛,如下面的视频所示。由于 ViZDoom 环境基于 90 年代创建的游戏,因此它可以在现代硬件上加速运行,使我们能够相当快地学习复杂的 AI 行为

该库包括以下功能

  • 多平台(Linux、macOS、Windows),
  • Python 和 C++ 的 API,
  • OpenAI Gym 环境包装器
  • 易于创建的自定义场景(视觉编辑器、脚本语言和示例可用),
  • 异步和同步单人及多人模式,
  • 轻量级(几 MB)且快速(同步模式下单线程高达 7000 fps),
  • 可自定义的分辨率和渲染参数,
  • 访问深度缓冲区(3D 视觉),
  • 自动标记帧中可见的游戏对象,
  • 访问音频缓冲区
  • 访问 actor/对象列表和地图几何图形,
  • 离屏渲染和 episode 录制,
  • 异步模式下的时间缩放。

我们首先需要安装 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 任务。

场景:Health Gathering Supreme

Health-Gathering-Supreme

此场景的目标是教导智能体如何在不知道是什么使其生存的情况下生存。智能体只知道生命是宝贵的,死亡是不好的,因此它必须学习什么可以延长其生存时间,以及其健康与生存有关

地图是一个包含墙壁的矩形,并带有绿色的酸性地面,会定期伤害玩家。最初,地图上均匀分布着一些医疗包。新的医疗包会不时从天而降。医疗包可以治愈玩家的部分生命值 - 为了生存,智能体需要捡起它们。episode 在玩家死亡或超时后结束。

进一步配置

  • Living_reward = 1
  • 3 个可用按钮:左转、右转、前进
  • 1 个可用的游戏变量:HEALTH
  • 死亡惩罚 = 100

您可以在此处找到有关 ViZDoom 中可用场景的更多信息。

还有许多更复杂的场景是为 ViZDoom 创建的,例如 此 github 页面上详细介绍的场景。

训练智能体

  • 我们将训练智能体 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 下载并可视化一个经过 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 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