LeRobot 文件

從 Hub 載入環境

Hugging Face's logo
加入 Hugging Face 社群

並獲得增強的文件體驗

開始使用

從 Hub 載入環境

EnvHub 功能讓您只需一行代碼即可直接從 Hugging Face Hub 載入模擬環境。這開啟了一種強大的協作新模式:環境不再被鎖定在龐大的庫中,任何人都可以發佈自定義環境並與社群分享。

什麼是 EnvHub?

EnvHub 讓您可以使用自己的機器人模型和場景建立自定義的機器人模擬環境,並透過 LeRobot 框架使其易於讓任何人使用。

EnvHub 套件儲存在 Hugging Face Hub 上,並可以透過 LeRobot 只需一行代碼,即可無縫地拉取並用於您的 AI 機器人專案中。

感謝 EnvHub,您可以

  1. 建立並發佈環境 到 Hugging Face Hub 作為 Git 儲存庫,無需繁瑣的打包過程即可分發複雜的物理模擬
  2. 動態地載入環境,而無需將其安裝為套件
  3. 使用 Git 語義來版本化並追蹤環境變更
  4. 發掘社群分享的新模擬任務

這種設計意味著您可以從在 Hub 上發現有趣的環境,到運行實驗只需幾秒鐘;或者建立自己的自定義機器人和環境,而無需擔心依賴項衝突或複雜的安裝程序。

當您建立一個 EnvHub 套件時,您可以在其中構建任何您想要的內容,並使用任何您喜歡的模擬工具:這是您專屬的實驗空間。唯一的要求是套件中必須包含一個 env.py 檔案,該檔案定義了環境並允許 LeRobot 載入並使用您的 EnvHub 套件。

這個 env.py 檔案需要暴露一個小型的 API,以便 LeRobot 可以載入並運行它。具體而言,您必須提供一個 make_env(n_envs: int = 1, use_async_envs: bool = False)make_env(n_envs: int = 1, use_async_envs: bool = False, cfg: EnvConfig) 函式,這是 LeRobot 的主要入口點。它應該返回以下內容之一:

  • 一個 gym.vector.VectorEnv (最常見)
  • 單個 gym.Env (將自動被封裝)
  • 一個映射 {suite_name: {task_id: VectorEnv}} 的字典 (用於多任務基準測試)

您還可以將 EnvConfig 物件傳遞給 make_env 來設定環境(例如環境數量、任務、相機名稱、初始狀態、控制模式、回合長度等)。

最後,您的環境必須實現標準的 gym.vector.VectorEnv 介面,以便它能與 LeRobot 搭配運作,包括 resetstep 等方法。

快速入門

從 Hub 載入環境非常簡單,如下所示

from lerobot.envs.factory import make_env

# Load a hub environment (requires explicit consent to run remote code)
env = make_env("lerobot/cartpole-env", trust_remote_code=True)
**安全性通知**:從 Hub 載入環境會執行來自第三方儲存庫的 Python 代碼。請僅對您信任的儲存庫使用 `trust_remote_code=True`。我們強烈建議固定(pin)到特定的 commit hash,以確保可重現性和安全性。

儲存庫結構

為了讓您的環境可以從 Hub 載入,您的儲存庫必須至少包含

必要檔案

env.py (或自定義 Python 檔案)

  • 必須暴露一個 make_env(n_envs: int, use_async_envs: bool) 函式
  • 此函式應該返回以下內容之一
    • 一個 gym.vector.VectorEnv (最常見)
    • 單個 gym.Env (將自動被封裝)
    • 一個映射 {suite_name: {task_id: VectorEnv}} 的字典 (用於多任務基準測試)

選用檔案

requirements.txt

  • 列出環境所需的任何額外依賴項
  • 使用者在載入您的環境之前需要手動安裝這些項目

README.md

  • 文件化您的環境:實現了什麼任務、觀測/動作空間、獎勵等。
  • 包含用法示例和任何特殊的安裝說明

.gitignore

  • 從您的儲存庫中排除不必要的檔案

範例儲存庫結構

my-environment-repo/
├── env.py                 # Main environment definition (required)
├── requirements.txt       # Dependencies (optional)
├── README.md             # Documentation (recommended)
├── assets/               # Images, videos, etc. (optional)
│   └── demo.gif
└── configs/              # Config files if needed (optional)
    └── task_config.yaml

建立您的環境儲存庫

第 1 步:定義您的環境

建立一個帶有 make_env 函式的 env.py 檔案

# env.py
import gymnasium as gym

def make_env(n_envs: int = 1, use_async_envs: bool = False):
    """
    Create vectorized environments for your custom task.

    Args:
        n_envs: Number of parallel environments
        use_async_envs: Whether to use AsyncVectorEnv or SyncVectorEnv

    Returns:
        gym.vector.VectorEnv or dict mapping suite names to vectorized envs
    """
    def _make_single_env():
        # Create your custom environment
        return gym.make("CartPole-v1")

    # Choose vector environment type
    env_cls = gym.vector.AsyncVectorEnv if use_async_envs else gym.vector.SyncVectorEnv

    # Create vectorized environment
    vec_env = env_cls([_make_single_env for _ in range(n_envs)])

    return vec_env

第 2 步:在本地測試

在發佈之前,請先在本地測試您的環境

from lerobot.envs.utils import _load_module_from_path, _call_make_env, _normalize_hub_result

# Load your module
module = _load_module_from_path("./env.py")

# Test the make_env function
result = _call_make_env(module, n_envs=2, use_async_envs=False)
normalized = _normalize_hub_result(result)

# Verify it works
suite_name = next(iter(normalized))
env = normalized[suite_name][0]
obs, info = env.reset()
print(f"Observation shape: {obs.shape if hasattr(obs, 'shape') else type(obs)}")
env.close()

第 3 步:上傳到 Hub

將您的儲存庫上傳到 Hugging Face

# Install huggingface_hub if needed
pip install huggingface_hub

# Login to Hugging Face
hf auth login

# Create a new repository
hf repo create my-org/my-custom-env

# Initialize git and push
git init
git add .
git commit -m "Initial environment implementation"
git remote add origin https://huggingface.co/my-org/my-custom-env
git push -u origin main

或者,使用 huggingface_hub Python API

from huggingface_hub import HfApi

api = HfApi()

# Create repository
api.create_repo("my-custom-env", repo_type="space")

# Upload files
api.upload_folder(
    folder_path="./my-env-folder",
    repo_id="username/my-custom-env",
    repo_type="space",
)

從 Hub 載入環境

基本使用

from lerobot.envs.factory import make_env

# Load from the hub
envs_dict = make_env(
    "username/my-custom-env",
    n_envs=4,
    trust_remote_code=True
)

# Access the environment
suite_name = next(iter(envs_dict))
env = envs_dict[suite_name][0]

# Use it like any gym environment
obs, info = env.reset()
action = env.action_space.sample()
obs, reward, terminated, truncated, info = env.step(action)

進階:固定到特定版本

為了可重現性和安全性,請固定到特定的 Git revision

# Pin to a specific branch
env = make_env("username/my-env@main", trust_remote_code=True)

# Pin to a specific commit (recommended for papers/experiments)
env = make_env("username/my-env@abc123def456", trust_remote_code=True)

# Pin to a tag
env = make_env("username/my-env@v1.0.0", trust_remote_code=True)

自定義檔案路徑

如果您的環境定義不在 env.py

# Load from a custom file
env = make_env("username/my-env:custom_env.py", trust_remote_code=True)

# Combine with version pinning
env = make_env("username/my-env@v1.0:envs/task_a.py", trust_remote_code=True)

非同步環境

在多個環境下獲得更好的效能

envs_dict = make_env(
    "username/my-env",
    n_envs=8,
    use_async_envs=True,  # Use AsyncVectorEnv for parallel execution
    trust_remote_code=True
)

URL 格式參考

hub URL 格式支援多種模式

模式 說明 範例
使用者/儲存庫 從 main 分支載入 env.py make_env("lerobot/pusht-env")
使用者/儲存庫@修訂版本 從特定修訂版本載入 make_env("lerobot/pusht-env@main")
使用者/儲存庫:路徑 載入自定義檔案 make_env("lerobot/envs:pusht.py")
使用者/儲存庫@修訂版本:路徑 修訂版本 + 自定義檔案 make_env("lerobot/envs@v1:pusht.py")

多任務環境

對於擁有多個任務的基準測試(如 LIBERO),請返回一個巢狀字典

def make_env(n_envs: int = 1, use_async_envs: bool = False):
    env_cls = gym.vector.AsyncVectorEnv if use_async_envs else gym.vector.SyncVectorEnv

    # Return dict: {suite_name: {task_id: VectorEnv}}
    return {
        "suite_1": {
            0: env_cls([lambda: gym.make("Task1-v0") for _ in range(n_envs)]),
            1: env_cls([lambda: gym.make("Task2-v0") for _ in range(n_envs)]),
        },
        "suite_2": {
            0: env_cls([lambda: gym.make("Task3-v0") for _ in range(n_envs)]),
        }
    }

安全性考量

**重要**:必須使用 `trust_remote_code=True` 旗標才能執行來自 Hub 的環境代碼。這是為了安全性的刻意設計。

當從 Hub 載入環境時

  1. 先審查代碼:在載入前造訪儲存庫並檢查 env.py
  2. 固定到 commit:使用特定的 commit hash 以確保可重現性
  3. 檢查依賴項:審查 requirements.txt 中是否有可疑的套件
  4. 使用信任的來源:優先選擇官方組織或知名的研究人員
  5. 視需要使用沙箱:在隔離環境(如容器、虛擬機)中運行不信任的代碼

安全用法範例

# ❌ BAD: Loading without inspection
env = make_env("random-user/untrusted-env", trust_remote_code=True)

# ✅ GOOD: Review code, then pin to specific commit
# 1. Visit https://huggingface.co/trusted-org/verified-env
# 2. Review the env.py file
# 3. Copy the commit hash
env = make_env("trusted-org/verified-env@a1b2c3d4", trust_remote_code=True)

範例:來自 Hub 的 CartPole

這裡有一個使用參考 CartPole 環境的完整範例

from lerobot.envs.factory import make_env
import numpy as np

# Load the environment
envs_dict = make_env("lerobot/cartpole-env", n_envs=4, trust_remote_code=True)

# Get the vectorized environment
suite_name = next(iter(envs_dict))
env = envs_dict[suite_name][0]

# Run a simple episode
obs, info = env.reset()
done = np.zeros(env.num_envs, dtype=bool)
total_reward = np.zeros(env.num_envs)

while not done.all():
    # Random policy
    action = env.action_space.sample()
    obs, reward, terminated, truncated, info = env.step(action)
    total_reward += reward
    done = terminated | truncated

print(f"Average reward: {total_reward.mean():.2f}")
env.close()

EnvHub 的好處

給環境作者

  • 輕鬆分發:不需要 PyPI 打包
  • 版本控制:使用 Git 進行環境版本管理
  • 快速迭代:即時推播更新
  • 文件化:Hub 的 README 渲染效果極佳
  • 社群:直接接觸 LeRobot 使用者

給研究人員

  • 快速實驗:一行代碼即可載入任何環境
  • 可重現性:固定到特定的 commit
  • 發現新任務:在 Hub 上瀏覽各種環境
  • 無衝突:不需要安裝衝突的套件

給社群

  • 成長中的生態系統:更多樣化的模擬任務
  • 標準化:共通的 make_env API
  • 協作:Fork 並改進現有的環境
  • 可及性:降低分享研究成果的門檻

疑難排解

“Refusing to execute remote code”

您必須顯式傳遞 trust_remote_code=True

env = make_env("user/repo", trust_remote_code=True)

“Module X not found”

hub 環境有您需要安裝的依賴項

# Check the repo's requirements.txt and install dependencies
pip install gymnasium numpy

“make_env not found in module”

您的 env.py 必須暴露一個 make_env 函式

def make_env(n_envs: int, use_async_envs: bool):
    # Your implementation
    pass

環境返回錯誤的類型

make_env 函式必須返回

  • 一個 gym.vector.VectorEnv,或者
  • 一個單獨的 gym.Env,或者
  • 一個字典 {suite_name: {task_id: VectorEnv}}

最佳實踐

  1. 文件化您的環境:在 README 中包含觀測/動作空間描述、獎勵結構和終止條件
  2. 加入 requirements.txt:列出所有依賴項及其版本
  3. 徹底測試:在推播之前驗證您的環境在本地可以正常運作
  4. 使用語義化版本管理:使用版本號標記 release
  5. 加入範例:在 README 中包含用法範例
  6. 保持簡潔:盡可能減少依賴項
  7. 為您的工作加上授權:加入 LICENSE 檔案以澄清使用條款

未來方向

EnvHub 生態系統賦予了令人期待的可能性

  • GPU 加速物理模擬:分享 Isaac Gym 或 Brax 環境
  • 寫實渲染:分發具有進階圖形效果的環境
  • 多智能體場景:複雜的互動任務
  • 真實世界模擬器:物理裝置的數位孿生
  • 程式化生成:無限的任務變化
  • 域隨機化 (Domain randomization):預先配置的 DR 流程

隨著越來越多的研究人員和開發者加入貢獻,可用環境的多樣性和品質將不斷提升,使整個機器人學習社群受益。

參見

在 GitHub 上更新

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