深度强化学习课程文档

使用机器人模拟和 Panda-Gym 的优势行动者评论 (A2C) 🤖

Hugging Face's logo
加入 Hugging Face 社区

并获得增强文档体验

开始使用

使用机器人模拟和 Panda-Gym 的优势行动者评论 (A2C) 🤖

Ask a Question Open In Colab

既然您已经学习了优势行动者评论 (A2C) 背后的理论,**您就可以使用 Stable-Baselines3 在机器人环境中训练您的 A2C 智能体**。并训练一个

  • 机器人手臂 🦾 移动到正确的位置。

我们将使用

为了验证此实践操作以进行认证流程,您需要将两个训练好的模型推送到 Hub 并获得以下结果

  • PandaReachDense-v3 获得大于等于 -3.5 的结果。

要查找您的结果,转到排行榜 并找到您的模型,**结果 = 平均奖励 - 奖励的标准差**

有关认证流程的更多信息,请查看此部分 👉 https://huggingface.co/deep-rl-course/en/unit0/introduction#certification-process

**要开始实践操作,请点击“在 Colab 中打开”按钮** 👇

Open In Colab

单元 6:使用机器人模拟和 Panda-Gym 的优势行动者评论 (A2C) 🤖

🎮 环境:

📚 RL 库:

我们一直在努力改进我们的教程,因此,**如果您在这个笔记本中发现任何问题**,请在 GitHub 仓库中打开一个问题

本笔记本的目标 🏆

在本笔记本结束时,您将

  • 能够使用**Panda-Gym**,即环境库。
  • 能够**使用 A2C 训练机器人**。
  • 了解**为什么我们需要规范化输入**。
  • 能够**将您训练好的智能体和代码推送到 Hub**,并附带一个漂亮的视频回放和评估分数 🔥。

先决条件 🏗️

在深入研究笔记本之前,您需要

🔲 📚 学习阅读单元 6 中的行动者评论方法 🤗

让我们训练我们的第一个机器人 🤖

设置 GPU 💪

  • 为了**加速智能体的训练,我们将使用 GPU**。为此,请转到运行时 > 更改运行时类型
GPU Step 1
  • 硬件加速器 > GPU
GPU Step 2

创建虚拟显示器 🔽

在笔记本中,我们需要生成一个回放视频。为此,使用 colab,**我们需要一个虚拟屏幕才能渲染环境**(从而记录帧)。

以下单元格将安装库并创建和运行虚拟屏幕 🖥

%%capture
!apt install python-opengl
!apt install ffmpeg
!apt install xvfb
!pip3 install pyvirtualdisplay
# Virtual display
from pyvirtualdisplay import Display

virtual_display = Display(visible=0, size=(1400, 900))
virtual_display.start()

安装依赖项 🔽

我们将安装多个依赖项。

  • gymnasium
  • panda-gym:包含机器人手臂环境。
  • stable-baselines3:SB3 深度强化学习库。
  • huggingface_sb3:Stable-baselines3 的额外代码,用于从 Hugging Face 🤗 Hub 加载和上传模型。
  • huggingface_hub:允许任何人使用 Hub 存储库的库。
!pip install stable-baselines3[extra]
!pip install gymnasium
!pip install huggingface_sb3
!pip install huggingface_hub
!pip install panda_gym

导入包 📦

import os

import gymnasium as gym
import panda_gym

from huggingface_sb3 import load_from_hub, package_to_hub

from stable_baselines3 import A2C
from stable_baselines3.common.evaluation import evaluate_policy
from stable_baselines3.common.vec_env import DummyVecEnv, VecNormalize
from stable_baselines3.common.env_util import make_vec_env

from huggingface_hub import notebook_login

PandaReachDense-v3 🦾

我们将要训练的智能体是一个机器人手臂,需要进行控制(移动手臂并使用末端执行器)。

在机器人学中,末端执行器是设计用于与环境交互的机器人手臂末端的设备。

PandaReach中,机器人必须将其末端执行器放置在目标位置(绿色球体)。

我们将使用此环境的密集版本。这意味着我们将获得一个密集奖励函数,该函数**将在每个时间步提供奖励**(智能体越接近完成任务,奖励越高)。与稀疏奖励函数相反,在稀疏奖励函数中,环境**仅当任务完成时才返回奖励**。

此外,我们将使用末端执行器位移控制,这意味着**动作对应于末端执行器的位移**。我们不控制每个关节的单独运动(关节控制)。

Robotics

这样**训练将更容易**。

创建环境

环境 🎮

PandaReachDense-v3中,机器人手臂必须将其末端执行器放置在目标位置(绿色球体)。

env_id = "PandaReachDense-v3"

# Create the env
env = gym.make(env_id)

# Get the state space and action space
s_size = env.observation_space.shape
a_size = env.action_space
print("_____OBSERVATION SPACE_____ \n")
print("The State Space is: ", s_size)
print("Sample observation", env.observation_space.sample()) # Get a random observation

观察空间**是一个包含 3 个不同元素的字典**

  • achieved_goal:目标的 (x,y,z) 位置。
  • desired_goal:目标位置和当前物体位置之间的 (x,y,z) 距离。
  • observation:末端执行器的 (x,y,z) 位置和速度 (vx, vy, vz)。

鉴于它是作为观察的字典,**我们将需要使用 MultiInputPolicy 策略而不是 MlpPolicy**。

print("\n _____ACTION SPACE_____ \n")
print("The Action Space is: ", a_size)
print("Action Space Sample", env.action_space.sample()) # Take a random action

动作空间是一个包含 3 个值的向量

  • 控制 x、y、z 移动

标准化观察和奖励

强化学习中一个良好的实践是标准化输入特征

为此,有一个包装器将计算输入特征的运行平均值和标准差。

我们还通过添加norm_reward = True来使用相同的包装器标准化奖励。

您应该查看文档以填充此单元格。

env = make_vec_env(env_id, n_envs=4)

# Adding this wrapper to normalize the observation and the reward
env = # TODO: Add the wrapper

解决方案

env = make_vec_env(env_id, n_envs=4)

env = VecNormalize(env, norm_obs=True, norm_reward=True, clip_obs=10.)

创建 A2C 模型 🤖

有关使用 StableBaselines3 实现 A2C 的更多信息,请查看:https://stable-baselines3.readthedocs.io/en/master/modules/a2c.html#notes

为了找到最佳参数,我检查了Stable-Baselines3 团队官方训练的智能体

model = # Create the A2C model and try to find the best parameters

解决方案

model = A2C(policy = "MultiInputPolicy",
            env = env,
            verbose=1)

训练 A2C 智能体 🏃

  • 让我们训练我们的智能体 1,000,000 个时间步长,不要忘记在 Colab 上使用 GPU。这大约需要 25-40 分钟。

model.learn(1_000_000)
# Save the model and  VecNormalize statistics when saving the agent
model.save("a2c-PandaReachDense-v3")
env.save("vec_normalize.pkl")

评估智能体 📈

  • 现在我们的智能体已经训练完成,我们需要**检查其性能**。
  • Stable-Baselines3 提供了一种方法来做到这一点:evaluate_policy
from stable_baselines3.common.vec_env import DummyVecEnv, VecNormalize

# Load the saved statistics
eval_env = DummyVecEnv([lambda: gym.make("PandaReachDense-v3")])
eval_env = VecNormalize.load("vec_normalize.pkl", eval_env)

# We need to override the render_mode
eval_env.render_mode = "rgb_array"

#  do not update them at test time
eval_env.training = False
# reward normalization is not needed at test time
eval_env.norm_reward = False

# Load the agent
model = A2C.load("a2c-PandaReachDense-v3")

mean_reward, std_reward = evaluate_policy(model, eval_env)

print(f"Mean reward = {mean_reward:.2f} +/- {std_reward:.2f}")

将训练好的模型发布到 Hub 🔥

现在我们看到训练后得到了良好的结果,我们可以使用一行代码将训练好的模型发布到 Hub 上。

📚 库文档 👉 https://github.com/huggingface/huggingface_sb3/tree/main#hugging-face—x-stable-baselines3-v20

通过使用 package_to_hub,正如我们在之前的单元中提到的,**您可以评估智能体、记录回放、生成智能体的模型卡片并将其推送到 Hub**。

这样

为了能够与社区分享您的模型,您需要遵循以下三个步骤

1️⃣ (如果尚未完成)在 HF 创建一个帐户 ➡ https://huggingface.co/join

2️⃣ 登录,然后您需要从 Hugging Face 网站存储您的身份验证令牌。

Create HF Token
  • 复制令牌
  • 运行下面的单元格并粘贴令牌
notebook_login()
!git config --global credential.helper store

如果您不想使用 Google Colab 或 Jupyter Notebook,则需要使用以下命令:huggingface-cli login

3️⃣ 现在我们准备使用 package_to_hub() 函数将训练好的智能体推送到 🤗 Hub 🔥。对于此环境,**运行此单元格大约需要 10 分钟**

from huggingface_sb3 import package_to_hub

package_to_hub(
    model=model,
    model_name=f"a2c-{env_id}",
    model_architecture="A2C",
    env_id=env_id,
    eval_env=eval_env,
    repo_id=f"ThomasSimonini/a2c-{env_id}", # Change the username
    commit_message="Initial commit",
)

一些额外的挑战 🏆

学习的最佳方式是**自己尝试**!为什么不试试 PandaPickAndPlace-v3 呢?

如果您想尝试 panda-gym 中更高级的任务,您需要查看使用**TQC 或 SAC**(更适合机器人任务的样本高效算法)完成了什么。在真实的机器人中,您会使用更样本高效的算法,原因很简单:与模拟不同,**如果您移动机器人手臂太多,则有损坏的风险**。

PandaPickAndPlace-v1(此模型使用环境的 v1 版本):https://huggingface.co/sb3/tqc-PandaPickAndPlace-v1

并且不要犹豫,在此处查看 panda-gym 文档:https://panda-gym.readthedocs.io/en/latest/usage/train_with_sb3.html

我们为您提供了训练另一个智能体的步骤(可选)

  1. 定义名为“PandaPickAndPlace-v3”的环境
  2. 创建一个矢量化环境
  3. 添加一个包装器来规范化观察结果和奖励。 查看文档
  4. 创建 A2C 模型(不要忘记将 verbose=1 以打印训练日志)。
  5. 训练 100 万个时间步长
  6. 保存模型和 VecNormalize 统计信息时,也保存智能体
  7. 评估您的智能体
  8. 使用 package_to_hub 将训练好的模型发布到 Hub 🔥

解决方案(可选)

# 1 - 2
env_id = "PandaPickAndPlace-v3"
env = make_vec_env(env_id, n_envs=4)

# 3
env = VecNormalize(env, norm_obs=True, norm_reward=True, clip_obs=10.)

# 4
model = A2C(policy = "MultiInputPolicy",
            env = env,
            verbose=1)
# 5
model.learn(1_000_000)
# 6
model_name = "a2c-PandaPickAndPlace-v3";
model.save(model_name)
env.save("vec_normalize.pkl")

# 7
from stable_baselines3.common.vec_env import DummyVecEnv, VecNormalize

# Load the saved statistics
eval_env = DummyVecEnv([lambda: gym.make("PandaPickAndPlace-v3")])
eval_env = VecNormalize.load("vec_normalize.pkl", eval_env)

#  do not update them at test time
eval_env.training = False
# reward normalization is not needed at test time
eval_env.norm_reward = False

# Load the agent
model = A2C.load(model_name)

mean_reward, std_reward = evaluate_policy(model, eval_env)

print(f"Mean reward = {mean_reward:.2f} +/- {std_reward:.2f}")

# 8
package_to_hub(
    model=model,
    model_name=f"a2c-{env_id}",
    model_architecture="A2C",
    env_id=env_id,
    eval_env=eval_env,
    repo_id=f"ThomasSimonini/a2c-{env_id}", # TODO: Change the username
    commit_message="Initial commit",
)

第七单元见! 🔥

保持学习,保持出色 🤗

< > GitHub 更新