深度强化学习课程文档
使用 Panda-Gym 🤖 进行机器人仿真的优势演员评论家 (A2C)
并获得增强的文档体验
开始使用
使用 Panda-Gym 🤖 进行机器人仿真的优势演员评论家 (A2C)
现在你已经学习了优势演员评论家 (A2C) 的理论,你已经准备好使用 Stable-Baselines3 在机器人环境中训练你的 A2C 智能体了。
- 机械臂🦾移到正确的位置。
我们将使用
要验证此动手操作以进行认证过程,您需要将两个训练好的模型推送到 Hub 并获得以下结果
PandaReachDense-v3
得到 >= -3.5 的结果。
要查找您的结果,请前往排行榜并找到您的模型,结果 = mean_reward - reward 的标准差
有关认证过程的更多信息,请查看此部分 👉 https://huggingface.co/deep-rl-course/en/unit0/introduction#certification-process
要开始动手操作,请点击“在 Colab 中打开”按钮 👇
单元 6:使用 Panda-Gym 🤖 进行机器人仿真的优势演员评论家 (A2C)
🎮 环境:
📚 强化学习库:
我们正在不断努力改进我们的教程,因此,**如果您在本笔记本中发现任何问题**,请在 GitHub 仓库上提出问题。
本笔记本的目标 🏆
在本笔记本结束时,您将:
- 能够使用Panda-Gym,环境库。
- 能够使用 A2C 训练机器人。
- 理解为什么我们需要规范化输入。
- 能够将你训练好的智能体和代码上传到 Hub,并附带精彩的视频回放和评估分数 🔥。
先决条件 🏗️
在深入学习本笔记本之前,您需要:
🔲 📚 通过阅读单元 6 学习演员-评论家方法 🤗
让我们训练我们的第一个机器人 🤖
设置 GPU 💪
- 为了加速智能体的训练,我们将使用 GPU。为此,请转到
Runtime > Change Runtime type

硬件加速器 > GPU

创建虚拟显示器 🔽
在笔记本中,我们需要生成一个重播视频。为此,在 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()
安装依赖 🔽
我们将安装多个
体育馆
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` 中,机器人必须将其末端执行器放置在目标位置(绿色球)。
我们将使用此环境的密集版本。这意味着我们将获得一个**密集奖励函数**,它将**在每个时间步提供奖励**(代理越接近完成任务,奖励越高)。与**稀疏奖励函数**相反,稀疏奖励函数**仅在任务完成时才返回奖励**。
此外,我们将使用**末端执行器位移控制**,这意味着**动作对应于末端执行器的位移**。我们不控制每个关节的单独运动(关节控制)。

这样训练会更容易。
创建环境
环境 🎮
在 `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**。
通过这种方式
- 你可以展示我们的工作 🔥
- 你可以可视化你的智能体在玩游戏 👀
- 你可以与社区分享一个其他人可以使用的智能体 💾
- 你可以**访问排行榜 🏆 查看你的代理与同学的表现如何** 👉 https://huggingface.co/spaces/huggingface-projects/Deep-Reinforcement-Learning-Leaderboard
为了能够与社区分享你的模型,还需要完成三个步骤
1️⃣ (如果尚未完成)创建 HF 帐户 ➡ https://huggingface.co/join
2️⃣ 登录后,你需要从 Hugging Face 网站存储你的身份验证令牌。
- 创建一个新令牌(https://huggingface.co/settings/tokens),并赋予写入权限

- 复制令牌
- 运行下方单元格并粘贴令牌
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
我们为您提供了训练另一个代理的步骤(可选)
- 定义名为“PandaPickAndPlace-v3”的环境
- 创建一个向量化环境
- 添加一个包装器来规范化观测和奖励。查看文档
- 创建 A2C 模型(别忘了使用 verbose=1 打印训练日志)。
- 训练 100 万个时间步
- 保存模型和 VecNormalize 统计数据
- 评估您的代理
- 使用 `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",
)
单元 7 再见!🔥