mirror of
https://github.com/huggingface/lerobot.git
synced 2026-06-02 20:01:25 +00:00
* refactor: RL stack refactoring — RLAlgorithm, RLTrainer, DataMixer, and SAC restructuring * chore: clarify torch.compile disabled note in SACAlgorithm * fix(teleop): keyboard EE teleop not registering special keys and losing intervention state Fixes #2345 Co-authored-by: jpizarrom <jpizarrom@gmail.com> * fix: remove leftover normalization calls from reward classifier predict_reward Fixes #2355 * fix: add thread synchronization to ReplayBuffer to prevent race condition between add() and sample() * refactor: update SACAlgorithm to pass action_dim to _init_critics and fix encoder reference * perf: remove redundant CPU→GPU→CPU transition move in learner * Fix: add kwargs in reward classifier __init__() * fix: include IS_INTERVENTION in complementary_info sent to learner for offline replay buffer * fix: add try/finally to control_loop to ensure image writer cleanup on exit * fix: use string key for IS_INTERVENTION in complementary_info to avoid torch.load serialization error * fix: skip tests that require grpc if not available * fix(tests): ensure tensor stats comparison accounts for reshaping in normalization tests * fix(tests): skip tests that require grpc if not available * refactor(rl): expose public API in rl/__init__ and use relative imports in sub-packages * fix(config): update vision encoder model name to lerobot/resnet10 * fix(sac): clarify torch.compile status * refactor(rl): update shutdown_event type hints from 'any' to 'Any' for consistency and clarity * refactor(sac): simplify optimizer return structure * perf(rl): use async iterators in OnlineOfflineMixer.get_iterator * refactor(sac): decouple algorithm hyperparameters from policy config * update losses names in tests * fix docstring * remove unused type alias * fix test for flat dict structure * refactor(policies): rename policies/sac → policies/gaussian_actor * refactor(rl/sac): consolidate hyperparameter ownership and clean up discrete critic * perf(observation_processor): add CUDA support for image processing * fix(rl): correctly wire HIL-SERL gripper penalty through processor pipeline (cherry picked from commit9c2af818ff) * fix(rl): add time limit processor to environment pipeline (cherry picked from commitcd105f65cb) * fix(rl): clarify discrete gripper action mapping in GripperVelocityToJoint for SO100 (cherry picked from commit494f469a2b) * fix(rl): update neutral gripper action (cherry picked from commit9c9064e5be) * fix(rl): merge environment and action-processor info in transition processing (cherry picked from commit30e1886b64) * fix(rl): mirror gym_manipulator in actor (cherry picked from commitd2a046dfc5) * fix(rl): postprocess action in actor (cherry picked from commitc2556439e5) * fix(rl): improve action processing for discrete and continuous actions (cherry picked from commitf887ab3f6a) * fix(rl): enhance intervention handling in actor and learner (cherry picked from commitef8bfffbd7) * Revert "perf(observation_processor): add CUDA support for image processing" This reverts commit38b88c414c. * refactor(rl): make algorithm a nested config so all SAC hyperparameters are JSON-addressable * refactor(rl): add make_algorithm_config function for RLAlgorithmConfig instantiation * refactor(rl): add type property to RLAlgorithmConfig for better clarity * refactor(rl): make RLAlgorithmConfig an abstract base class for better extensibility * refactor(tests): remove grpc import checks from test files for cleaner code * fix(tests): gate RL tests on the `datasets` extra * refactor: simplify docstrings for clarity and conciseness across multiple files * fix(rl): update gripper position key and handle action absence during reset * fix(rl): record pre-step observation so (obs, action, next.reward) align in gym_manipulator dataset * refactor: clean up import statements * chore: address reviewer comments * chore: improve visual stats reshaping logic and update docstring for clarity * refactor: enforce mandatory config_class and name attributes in RLAlgorithm * refactor: implement NotImplementedError for abstract methods in RLAlgorithm and DataMixer * refactor: replace build_algorithm with make_algorithm for SACAlgorithmConfig and update related tests * refactor: add require_package calls for grpcio and gym-hil in relevant modules * refactor(rl): move grpcio guards to runtime entry points * feat(rl): consolidate HIL-SERL checkpoint into HF-style components Make `RLAlgorithmConfig` and `RLAlgorithm` `HubMixin`s, add abstract `state_dict()` / `load_state_dict()` for critic ensemble, target nets and `log_alpha`, and persist them as a sibling `algorithm/` component next to `pretrained_model/`. Replace the pickled `training_state.pt` with an enriched `training_step.json` carrying `step` and `interaction_step`, so resume restores actor + critics + target nets + temperature + optimizers + RNG + counters from HF-standard files. * refactor(rl): move actor weight-sync wire format from policy to algorithm * refactor(rl): update type hints for learner and actor functions * refactor(rl): hoist grpcio guard to module top in actor/learner * chore(rl): manage import pattern in actor (#3564) * chore(rl): manage import pattern in actor * chore(rl): optional grpc imports in learner; quote grpc ServicerContext types --------- Co-authored-by: Khalil Meftah <khalil.meftah@huggingface.co> * update uv.lock * chore(doc): update doc --------- Co-authored-by: jpizarrom <jpizarrom@gmail.com> Co-authored-by: Steven Palma <imstevenpmwork@ieee.org>
112 lines
4.1 KiB
Python
112 lines
4.1 KiB
Python
# Copyright 2024 The HuggingFace Inc. team. All rights reserved.
|
|
#
|
|
# Licensed under the Apache License, Version 2.0 (the "License");
|
|
# you may not use this file except in compliance with the License.
|
|
# You may obtain a copy of the License at
|
|
#
|
|
# http://www.apache.org/licenses/LICENSE-2.0
|
|
#
|
|
# Unless required by applicable law or agreed to in writing, software
|
|
# distributed under the License is distributed on an "AS IS" BASIS,
|
|
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
# See the License for the specific language governing permissions and
|
|
# limitations under the License.
|
|
# keys
|
|
import os
|
|
from pathlib import Path
|
|
|
|
from huggingface_hub.constants import HF_HOME
|
|
|
|
OBS_STR = "observation"
|
|
OBS_PREFIX = OBS_STR + "."
|
|
OBS_ENV_STATE = OBS_STR + ".environment_state"
|
|
OBS_STATE = OBS_STR + ".state"
|
|
OBS_IMAGE = OBS_STR + ".image"
|
|
OBS_IMAGES = OBS_IMAGE + "s"
|
|
OBS_LANGUAGE = OBS_STR + ".language"
|
|
OBS_LANGUAGE_TOKENS = OBS_LANGUAGE + ".tokens"
|
|
OBS_LANGUAGE_ATTENTION_MASK = OBS_LANGUAGE + ".attention_mask"
|
|
OBS_LANGUAGE_SUBTASK = OBS_STR + ".subtask"
|
|
OBS_LANGUAGE_SUBTASK_TOKENS = OBS_LANGUAGE_SUBTASK + ".tokens"
|
|
OBS_LANGUAGE_SUBTASK_ATTENTION_MASK = OBS_LANGUAGE_SUBTASK + ".attention_mask"
|
|
|
|
ACTION = "action"
|
|
ACTION_PREFIX = ACTION + "."
|
|
ACTION_TOKENS = ACTION + ".tokens"
|
|
ACTION_TOKEN_MASK = ACTION + ".token_mask"
|
|
REWARD = "next.reward"
|
|
TRUNCATED = "next.truncated"
|
|
DONE = "next.done"
|
|
INFO = "info"
|
|
|
|
ROBOTS = "robots"
|
|
TELEOPERATORS = "teleoperators"
|
|
|
|
# files & directories
|
|
CHECKPOINTS_DIR = "checkpoints"
|
|
LAST_CHECKPOINT_LINK = "last"
|
|
PRETRAINED_MODEL_DIR = "pretrained_model"
|
|
TRAINING_STATE_DIR = "training_state"
|
|
ALGORITHM_DIR = "algorithm"
|
|
RNG_STATE = "rng_state.safetensors"
|
|
TRAINING_STEP = "training_step.json"
|
|
OPTIMIZER_STATE = "optimizer_state.safetensors"
|
|
OPTIMIZER_PARAM_GROUPS = "optimizer_param_groups.json"
|
|
SCHEDULER_STATE = "scheduler_state.json"
|
|
|
|
POLICY_PREPROCESSOR_DEFAULT_NAME = "policy_preprocessor"
|
|
POLICY_POSTPROCESSOR_DEFAULT_NAME = "policy_postprocessor"
|
|
|
|
if "LEROBOT_HOME" in os.environ:
|
|
raise ValueError(
|
|
f"You have a 'LEROBOT_HOME' environment variable set to '{os.getenv('LEROBOT_HOME')}'.\n"
|
|
"'LEROBOT_HOME' is deprecated, please use 'HF_LEROBOT_HOME' instead."
|
|
)
|
|
|
|
# cache dir
|
|
default_cache_path = Path(HF_HOME) / "lerobot"
|
|
HF_LEROBOT_HOME = Path(os.getenv("HF_LEROBOT_HOME", default_cache_path)).expanduser()
|
|
# LeRobot's own revision-safe Hub cache (NOT the system-wide ~/.cache/huggingface/hub/).
|
|
# Used as the ``cache_dir`` argument to ``snapshot_download`` so that different
|
|
# dataset revisions are stored in isolated snapshot directories.
|
|
HF_LEROBOT_HUB_CACHE = HF_LEROBOT_HOME / "hub"
|
|
|
|
# calibration dir
|
|
default_calibration_path = HF_LEROBOT_HOME / "calibration"
|
|
HF_LEROBOT_CALIBRATION = Path(os.getenv("HF_LEROBOT_CALIBRATION", default_calibration_path)).expanduser()
|
|
|
|
|
|
# Dataset meta-features (auto-populated by the recording pipeline)
|
|
DEFAULT_FEATURES = {
|
|
"timestamp": {"dtype": "float32", "shape": (1,), "names": None},
|
|
"frame_index": {"dtype": "int64", "shape": (1,), "names": None},
|
|
"episode_index": {"dtype": "int64", "shape": (1,), "names": None},
|
|
"index": {"dtype": "int64", "shape": (1,), "names": None},
|
|
"task_index": {"dtype": "int64", "shape": (1,), "names": None},
|
|
}
|
|
|
|
# ImageNet normalization constants
|
|
IMAGENET_STATS = {
|
|
"mean": [[[0.485]], [[0.456]], [[0.406]]], # (c,1,1)
|
|
"std": [[[0.229]], [[0.224]], [[0.225]]], # (c,1,1)
|
|
}
|
|
|
|
# streaming datasets
|
|
LOOKBACK_BACKTRACKTABLE = 100
|
|
LOOKAHEAD_BACKTRACKTABLE = 100
|
|
|
|
# openpi
|
|
OPENPI_ATTENTION_MASK_VALUE = -2.3819763e38 # TODO(pepijn): Modify this when extending support to fp8 models
|
|
|
|
# Constants for LIBERO observation keys
|
|
LIBERO_KEY_EEF_POS = "robot_state/eef/pos"
|
|
LIBERO_KEY_EEF_QUAT = "robot_state/eef/quat"
|
|
LIBERO_KEY_EEF_MAT = "robot_state/eef/mat"
|
|
LIBERO_KEY_EEF_AXISANGLE = "robot_state/eef/axisangle"
|
|
LIBERO_KEY_GRIPPER_QPOS = "robot_state/gripper/qpos"
|
|
LIBERO_KEY_GRIPPER_QVEL = "robot_state/gripper/qvel"
|
|
LIBERO_KEY_JOINTS_POS = "robot_state/joints/pos"
|
|
LIBERO_KEY_JOINTS_VEL = "robot_state/joints/vel"
|
|
LIBERO_KEY_PIXELS_AGENTVIEW = "pixels/agentview_image"
|
|
LIBERO_KEY_PIXELS_EYE_IN_HAND = "pixels/robot0_eye_in_hand_image"
|