深度強化學習課程文件

使用 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 的結果。

要查詢您的結果,請前往排行榜並找到您的模型,結果 = mean_reward - reward 的標準差

有關認證過程的更多資訊,請檢視此部分 👉 https://huggingface.co/deep-rl-course/en/unit0/introduction#certification-process

要開始動手操作,請點選“在 Colab 中開啟”按鈕 👇

Open In Colab

單元 6:使用 Panda-Gym 🤖 進行機器人模擬的優勢演員評論家 (A2C)

🎮 環境:

📚 強化學習庫:

我們正在不斷努力改進我們的教程,因此,**如果您在本筆記本中發現任何問題**,請在 GitHub 倉庫上提出問題

本筆記本的目標 🏆

在本筆記本結束時,您將:

  • 能夠使用Panda-Gym,環境庫。
  • 能夠使用 A2C 訓練機器人
  • 理解為什麼我們需要規範化輸入
  • 能夠將你訓練好的智慧體和程式碼上傳到 Hub,並附帶精彩的影片回放和評估分數 🔥。

先決條件 🏗️

在深入學習本筆記本之前,您需要:

🔲 📚 透過閱讀單元 6 學習演員-評論家方法 🤗

讓我們訓練我們的第一個機器人 🤖

設定 GPU 💪

  • 為了加速智慧體的訓練,我們將使用 GPU。為此,請轉到 Runtime > Change Runtime type
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()

安裝依賴 🔽

我們將安裝多個

  • 體育館
  • 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",
)

單元 7 再見!🔥

繼續學習,保持出色 🤗

< > 在 GitHub 上更新

© . This site is unofficial and not affiliated with Hugging Face, Inc.