fix(docs): dagger num_episodes

This commit is contained in:
Steven Palma
2026-04-19 17:46:48 +02:00
parent 14c7a25ce4
commit 02d8a34829
3 changed files with 22 additions and 6 deletions
+2 -1
View File
@@ -274,7 +274,8 @@ python src/lerobot/scripts/lerobot_train.py \
Once trained, we recommend deploying policies using inference-time RTC: Once trained, we recommend deploying policies using inference-time RTC:
```bash ```bash
python examples/rtc/eval_with_real_robot.py \ lerobot-rollout \
--strategy.type=base \
--policy.path=your-username/your-repo-id \ --policy.path=your-username/your-repo-id \
--policy.device=cuda \ --policy.device=cuda \
--robot.type=unitree_g1 \ --robot.type=unitree_g1 \
+16 -1
View File
@@ -142,7 +142,9 @@ class DAggerStrategyConfig(RolloutStrategyConfig):
windows, where each correction becomes its own episode. windows, where each correction becomes its own episode.
""" """
num_episodes: int = 10 # Number of correction episodes to collect (corrections-only mode).
# When None, falls back to ``--dataset.num_episodes``.
num_episodes: int | None = None
record_autonomous: bool = False record_autonomous: bool = False
upload_every_n_episodes: int = 5 upload_every_n_episodes: int = 5
# Target video file size in MB for episode rotation (record_autonomous # Target video file size in MB for episode rotation (record_autonomous
@@ -258,6 +260,19 @@ class RolloutConfig:
"--dataset.streaming_encoding=true --dataset.encoder_threads=2" "--dataset.streaming_encoding=true --dataset.encoder_threads=2"
) )
# DAgger: resolve num_episodes from dataset config when not explicitly set.
if isinstance(self.strategy, DAggerStrategyConfig) and self.strategy.num_episodes is None:
if self.dataset is not None:
self.strategy.num_episodes = self.dataset.num_episodes
logger.info(
"DAgger num_episodes not set — using --dataset.num_episodes=%d",
self.strategy.num_episodes,
)
else:
raise ValueError(
"DAgger num_episodes must be set either via --strategy.num_episodes or --dataset.num_episodes"
)
# --- Policy loading --- # --- Policy loading ---
if self.robot is None: if self.robot is None:
raise ValueError("--robot.type is required for rollout") raise ValueError("--robot.type is required for rollout")
@@ -187,7 +187,7 @@ class TestRTCDenoiseWithRelativeLeftovers:
class TestFullPipelineRelativeRTC: class TestFullPipelineRelativeRTC:
"""End-to-end test of the RTC + relative actions pipeline matching eval_with_real_robot.py flow.""" """End-to-end test of the RTC + relative actions pipeline matching lerobot-rollout flow."""
def test_preprocessor_caches_state_for_postprocessor(self): def test_preprocessor_caches_state_for_postprocessor(self):
"""Preprocessor's relative step should cache state so postprocessor can convert back.""" """Preprocessor's relative step should cache state so postprocessor can convert back."""
@@ -240,7 +240,7 @@ class TestFullPipelineRelativeRTC:
torch.testing.assert_close(recovered, actions, atol=1e-5, rtol=1e-5) torch.testing.assert_close(recovered, actions, atol=1e-5, rtol=1e-5)
def test_eval_loop_simulation(self): def test_eval_loop_simulation(self):
"""Simulate the eval_with_real_robot.py loop with relative actions. """Simulate the lerobot-rollout loop with relative actions.
Iteration 1: No leftovers model generates relative actions store for RTC Iteration 1: No leftovers model generates relative actions store for RTC
Iteration 2: Use leftovers as RTC guidance model generates new relative actions Iteration 2: Use leftovers as RTC guidance model generates new relative actions
@@ -401,12 +401,12 @@ class TestStateRebasingApproximation:
def _detect_relative_actions(preprocessor) -> bool: def _detect_relative_actions(preprocessor) -> bool:
"""Mirror of the helper in eval_with_real_robot.py for testing without importing it.""" """Mirror of the helper in lerobot-rollout for testing without importing it."""
return any(isinstance(step, RelativeActionsProcessorStep) and step.enabled for step in preprocessor.steps) return any(isinstance(step, RelativeActionsProcessorStep) and step.enabled for step in preprocessor.steps)
class TestDetectRelativeActions: class TestDetectRelativeActions:
"""Test the _detect_relative_actions helper logic used by eval_with_real_robot.py.""" """Test the _detect_relative_actions helper logic used by lerobot-rollout."""
def test_detects_enabled_relative_step(self): def test_detects_enabled_relative_step(self):
class FakePipeline: class FakePipeline: