深度強化學習課程文件
實戰:高階深度強化學習。使用 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 storefrom 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_dirls train_dir/doom_health_gathering_supreme_2222env = "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。
至此,最後一個單元的學習就結束了。但我們還沒有完成!🤗 以下獎勵部分包含深度強化學習中最有趣、最先進和最前沿的一些工作。