深度強化學習課程文件
使用 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_loginPandaReachDense-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_spaceprint("_____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 再見!🔥