From 577f14337ae9ecc9912b7a5e41cfc7e088653aa7 Mon Sep 17 00:00:00 2001 From: Khalil Meftah Date: Mon, 27 Apr 2026 16:20:13 +0200 Subject: [PATCH] refactor(tests): remove grpc import checks from test files for cleaner code --- src/lerobot/rl/__init__.py | 16 ++++++---------- tests/policies/test_gaussian_actor_policy.py | 15 ++++++--------- tests/rl/test_data_mixer.py | 4 ---- tests/rl/test_queue.py | 4 ---- tests/rl/test_sac_algorithm.py | 5 +---- tests/rl/test_trainer.py | 4 ---- tests/utils/test_process.py | 2 -- tests/utils/test_replay_buffer.py | 1 - 8 files changed, 13 insertions(+), 38 deletions(-) diff --git a/src/lerobot/rl/__init__.py b/src/lerobot/rl/__init__.py index 77efe1784..8b2d18c54 100644 --- a/src/lerobot/rl/__init__.py +++ b/src/lerobot/rl/__init__.py @@ -12,15 +12,12 @@ # See the License for the specific language governing permissions and # limitations under the License. +"""Reinforcement learning modules. + +Distributed actor / learner entry points (``actor``, ``learner``, +``learner_service``) require ``pip install 'lerobot[hilserl]'``. Algorithms, +buffer, data sources and trainer are gRPC-free and usable standalone. """ -Reinforcement learning modules. - -Requires: ``pip install 'lerobot[hilserl]'`` -""" - -from lerobot.utils.import_utils import require_package - -require_package("grpcio", extra="hilserl", import_name="grpc") from .algorithms.base import RLAlgorithm as RLAlgorithm from .algorithms.configs import RLAlgorithmConfig as RLAlgorithmConfig, TrainingStats as TrainingStats @@ -28,7 +25,7 @@ from .algorithms.factory import ( make_algorithm as make_algorithm, make_algorithm_config as make_algorithm_config, ) -from .algorithms.sac import SACAlgorithm as SACAlgorithm, SACAlgorithmConfig as SACAlgorithmConfig +from .algorithms.sac.configuration_sac import SACAlgorithmConfig as SACAlgorithmConfig from .buffer import ReplayBuffer as ReplayBuffer from .data_sources import DataMixer as DataMixer, OnlineOfflineMixer as OnlineOfflineMixer from .trainer import RLTrainer as RLTrainer @@ -39,7 +36,6 @@ __all__ = [ "TrainingStats", "make_algorithm", "make_algorithm_config", - "SACAlgorithm", "SACAlgorithmConfig", "RLTrainer", "ReplayBuffer", diff --git a/tests/policies/test_gaussian_actor_policy.py b/tests/policies/test_gaussian_actor_policy.py index ea807c907..a4af959f2 100644 --- a/tests/policies/test_gaussian_actor_policy.py +++ b/tests/policies/test_gaussian_actor_policy.py @@ -15,9 +15,6 @@ # limitations under the License. import pytest - -pytest.importorskip("grpc") - import torch from torch import Tensor, nn @@ -240,7 +237,7 @@ def test_gaussian_actor_policy_forward(batch_size: int, state_dim: int, action_d @pytest.mark.parametrize("batch_size,state_dim,action_dim", [(2, 6, 6), (1, 10, 10)]) -def test_sac_training_through_algorithm(batch_size: int, state_dim: int, action_dim: int): +def test_gaussian_actor_training_through_sac(batch_size: int, state_dim: int, action_dim: int): config = create_default_config(state_dim=state_dim, continuous_action_dim=action_dim) algorithm, policy = _make_algorithm(config) @@ -270,7 +267,7 @@ def test_sac_training_through_algorithm(batch_size: int, state_dim: int, action_ @pytest.mark.parametrize("batch_size,state_dim,action_dim", [(2, 6, 6), (1, 10, 10)]) -def test_sac_training_with_visual_input(batch_size: int, state_dim: int, action_dim: int): +def test_gaussian_actor_training_with_visual_input(batch_size: int, state_dim: int, action_dim: int): config = create_config_with_visual_input(state_dim=state_dim, continuous_action_dim=action_dim) algorithm, policy = _make_algorithm(config) @@ -331,7 +328,7 @@ def test_gaussian_actor_policy_with_pretrained_encoder( assert actor_loss.shape == () -def test_sac_training_with_shared_encoder(): +def test_gaussian_actor_training_with_shared_encoder(): batch_size = 2 action_dim = 10 state_dim = 10 @@ -358,7 +355,7 @@ def test_sac_training_with_shared_encoder(): algorithm.optimizers["actor"].step() -def test_sac_training_with_discrete_critic(): +def test_gaussian_actor_training_with_discrete_critic(): batch_size = 2 continuous_action_dim = 9 full_action_dim = continuous_action_dim + 1 @@ -475,7 +472,7 @@ def test_sac_algorithm_with_critics_number_of_heads(num_critics: int): def test_gaussian_actor_policy_save_and_load(tmp_path): """Test that the policy can be saved and loaded from pretrained.""" - root = tmp_path / "test_sac_save_and_load" + root = tmp_path / "test_gaussian_actor_save_and_load" state_dim = 10 action_dim = 10 @@ -506,7 +503,7 @@ def test_gaussian_actor_policy_save_and_load(tmp_path): def test_gaussian_actor_policy_save_and_load_with_discrete_critic(tmp_path): """Discrete critic should be saved/loaded as part of the policy.""" - root = tmp_path / "test_sac_save_and_load_discrete" + root = tmp_path / "test_gaussian_actor_save_and_load_discrete" state_dim = 10 action_dim = 6 diff --git a/tests/rl/test_data_mixer.py b/tests/rl/test_data_mixer.py index 113cb87c8..90e9e492f 100644 --- a/tests/rl/test_data_mixer.py +++ b/tests/rl/test_data_mixer.py @@ -13,10 +13,6 @@ # limitations under the License. """Tests for RL data mixing (DataMixer, OnlineOfflineMixer).""" -import pytest - -pytest.importorskip("grpc") - import torch from lerobot.rl.buffer import ReplayBuffer diff --git a/tests/rl/test_queue.py b/tests/rl/test_queue.py index a5a96a9d6..b6716fbd6 100644 --- a/tests/rl/test_queue.py +++ b/tests/rl/test_queue.py @@ -18,10 +18,6 @@ import threading import time from queue import Queue -import pytest - -pytest.importorskip("grpc") - from torch.multiprocessing import Queue as TorchMPQueue from lerobot.rl.queue import get_last_item_from_queue diff --git a/tests/rl/test_sac_algorithm.py b/tests/rl/test_sac_algorithm.py index 4c4568da0..6f04db8b7 100644 --- a/tests/rl/test_sac_algorithm.py +++ b/tests/rl/test_sac_algorithm.py @@ -16,9 +16,6 @@ """Tests for the RL algorithm abstraction and SACAlgorithm implementation.""" import pytest - -pytest.importorskip("grpc") - import torch from lerobot.configs.types import FeatureType, PolicyFeature @@ -31,7 +28,7 @@ from lerobot.utils.constants import ACTION, OBS_IMAGE, OBS_STATE from lerobot.utils.random_utils import set_seed # --------------------------------------------------------------------------- -# Helpers (reuse patterns from tests/policies/test_sac_policy.py) +# Helpers (reuse patterns from tests/policies/test_gaussian_actor_policy.py) # --------------------------------------------------------------------------- diff --git a/tests/rl/test_trainer.py b/tests/rl/test_trainer.py index 985ab9a6b..47eaf6ad3 100644 --- a/tests/rl/test_trainer.py +++ b/tests/rl/test_trainer.py @@ -14,10 +14,6 @@ # See the License for the specific language governing permissions and # limitations under the License. -import pytest - -pytest.importorskip("grpc") - import torch from torch import Tensor diff --git a/tests/utils/test_process.py b/tests/utils/test_process.py index 7ca880057..e2b00cae9 100644 --- a/tests/utils/test_process.py +++ b/tests/utils/test_process.py @@ -22,8 +22,6 @@ from unittest.mock import patch import pytest -pytest.importorskip("grpc") - from lerobot.rl.process import ProcessSignalHandler diff --git a/tests/utils/test_replay_buffer.py b/tests/utils/test_replay_buffer.py index 1b2af39f1..e6517596f 100644 --- a/tests/utils/test_replay_buffer.py +++ b/tests/utils/test_replay_buffer.py @@ -19,7 +19,6 @@ from collections.abc import Callable import pytest -pytest.importorskip("grpc") pytest.importorskip("datasets", reason="datasets is required (install lerobot[dataset])") import torch # noqa: E402