| # Copyright 2026 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. | |
| """Top-level pipeline config for distributed RL training (actor / learner).""" | |
| from __future__ import annotations | |
| from dataclasses import dataclass | |
| from lerobot.configs.default import DatasetConfig | |
| from lerobot.configs.train import TrainPipelineConfig | |
| from .algorithms.configs import RLAlgorithmConfig | |
| from .algorithms.factory import make_algorithm_config | |
| from .algorithms.sac import SACAlgorithmConfig # noqa: F401 | |
| class TrainRLServerPipelineConfig(TrainPipelineConfig): | |
| # NOTE: In RL, we don't need an offline dataset | |
| # TODO: Make `TrainPipelineConfig.dataset` optional | |
| dataset: DatasetConfig | None = None # type: ignore[assignment] # because the parent class has made it's type non-optional | |
| # Algorithm config. | |
| algorithm: RLAlgorithmConfig | None = None | |
| # Data mixer strategy name. Currently supports "online_offline". | |
| mixer: str = "online_offline" | |
| # Fraction sampled from online replay when using OnlineOfflineMixer. | |
| online_ratio: float = 0.5 | |
| def validate(self) -> None: | |
| super().validate() | |
| if self.algorithm is None: | |
| self.algorithm = make_algorithm_config("sac") | |
| if getattr(self.algorithm, "policy_config", None) is None: | |
| self.algorithm.policy_config = self.policy | |