Skip to content

feat(dataprep): export LeRobot datasets in the isolated runtime - #4395

Merged
mustafab0 merged 7 commits into
mainfrom
cc/feat/isolated-lerobot-export
Oct 29, 2026
Merged

mustafab0 merged 7 commits into
mainfrom
cc/feat/isolated-lerobot-export

Conversation

@TomCC7

@TomCC7 TomCC7 commented Oct 2, 2026 •

Copy link
Copy Markdown
Member

Problem

  • LeRobot conversion needs its own dependency environment and standard training feature keys.
  • Recording and conversion duplicate the same schema through inheritance.

Solution

  • Export and inspect datasets through the isolated LeRobot runtime, using its official validation and fixed feature naming.
  • Keep one RecordingSchema for stream projections, episode extraction, and alignment. DataPrepConfig combines that schema with input and output settings.
  • Publish completed datasets atomically, including inspection metadata.

Validation

  • The assembled stack passed 257 relevant host tests and 30 real LeRobot conversion tests using cached dependencies.
  • Scoped production mypy, changed-file pre-commit, and executable dataprep examples passed. Remote CI has not been polled.

@github-actions github-actions Bot left a comment •

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

go2 replay realtime

Details
Benchmark suite Current: fc43395 Previous: 7529659 Ratio
first frame wall 9.961 s 11.519 s 0.86
first frame cpu 20.776 s 23.908 s 0.87
run cpu 30.972 s 33.323 s 0.93
run cpu (user) 23.784 s 25.718 s 0.92
run cpu (system) 7.187 s 7.604 s 0.95
peak memory 2724.402 MB 2705.062 MB 1.01
peak threads 399 threads 406 threads 0.98
disk read 49.477 MB 35.621 MB 1.39
disk write 10.828 MB 11.242 MB 0.96
network (transport) 2714.992 MB 2728.796 MB 0.99
network (external rx) 0.071 MB 0.059 MB 1.20
network (external tx) 0.283 MB 0.147 MB 1.93

This comment was automatically generated by workflow using github-action-benchmark.

@github-actions github-actions Bot left a comment •

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Performance Alert ⚠️

Possible performance regression was detected for benchmark 'go2 replay realtime'.
Benchmark result of this commit is worse than the previous benchmark result exceeding threshold 1.08.

Benchmark suite Current: fc43395 Previous: 7529659 Ratio
disk read 49.477 MB 35.621 MB 1.39
network (external rx) 0.071 MB 0.059 MB 1.20
network (external tx) 0.283 MB 0.147 MB 1.93

This comment was automatically generated by workflow using github-action-benchmark.

@codecov

codecov Bot commented Oct 2, 2026 •

Copy link
Copy Markdown

❌ 1 Tests Failed:

Tests completed Failed Passed Skipped
7510 1 7509 62
View the top 1 failed test(s) by shortest run time
dimos.e2e_tests.test_dimsim_spatial_memory::test_go_to_the_bed
Stack Traces | 271s run time
lcm_spy = <dimos.e2e_tests.lcm_spy.LcmSpy object at 0x7757a824ca40>
start_blueprint = <function start_blueprint.<locals>.set_name_and_start at 0x7757a7420180>
wait_for_system_ready = <function wait_for_system_ready.<locals>.wait at 0x7757a7420220>
human_input = <function human_input.<locals>.send_human_input at 0x7757a7420360>
dim_sim = <dimos.e2e_tests.dim_sim_client.DimSimClient object at 0x7759176ce180>
explore_house = <function explore_house.<locals>.explore at 0x7757a7420b80>

    @pytest.mark.self_hosted_large
    def test_go_to_the_bed(
        lcm_spy, start_blueprint, wait_for_system_ready, human_input, dim_sim, explore_house
    ) -> None:
        start_blueprint(
            "run",
            "unitree-go2-agentic",
            simulator="dimsim",
        )
        wait_for_system_ready(timeout=300.0)
    
        explore_house()
    
        human_input("go to the bed")
    
>       lcm_spy.wait_until_odom_position(-3.567, -1.332, threshold=3, timeout=180)

dim_sim    = <dimos.e2e_tests.dim_sim_client.DimSimClient object at 0x7759176ce180>
explore_house = <function explore_house.<locals>.explore at 0x7757a7420b80>
human_input = <function human_input.<locals>.send_human_input at 0x7757a7420360>
lcm_spy    = <dimos.e2e_tests.lcm_spy.LcmSpy object at 0x7757a824ca40>
start_blueprint = <function start_blueprint.<locals>.set_name_and_start at 0x7757a7420180>
wait_for_system_ready = <function wait_for_system_ready.<locals>.wait at 0x7757a7420220>

dimos/e2e_tests/test_dimsim_spatial_memory.py:33: 
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 
dimos/e2e_tests/lcm_spy.py:143: in wait_until_odom_position
    self.wait_for_message_result(
        predicate  = <function LcmSpy.wait_until_odom_position.<locals>.predicate at 0x7757a724e520>
        self       = <dimos.e2e_tests.lcm_spy.LcmSpy object at 0x7757a824ca40>
        threshold  = 3
        timeout    = 180
        x          = -3.567
        y          = -1.332
dimos/e2e_tests/lcm_spy.py:129: in wait_for_message_result
    wait_until(
        event      = <threading.Event at 0x7757b8e7fa70: unset>
        fail_message = 'Failed to get to position x=-3.567, y=-1.332'
        listener   = <function LcmSpy.wait_for_message_result.<locals>.listener at 0x7757a724e480>
        predicate  = <function LcmSpy.wait_until_odom_position.<locals>.predicate at 0x7757a724e520>
        self       = <dimos.e2e_tests.lcm_spy.LcmSpy object at 0x7757a824ca40>
        timeout    = 180
        topic      = '/odom#geometry_msgs.PoseStamped'
        type       = <class 'dimos.msgs.geometry_msgs.PoseStamped.PoseStamped'>
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 

predicate = <bound method Event.is_set of <threading.Event at 0x7757b8e7fa70: unset>>

    def wait_until(
        predicate: Callable[[], bool],
        *,
        timeout: float,
        interval: float = 0.1,
        message: str | None = None,
    ) -> None:
        """Poll ``predicate`` until it returns truthy or ``timeout`` elapses."""
        deadline = time.monotonic() + timeout
        while time.monotonic() < deadline:
            if predicate():
                return
            time.sleep(interval)
>       raise TimeoutError(message or f"Timed out after {timeout}s waiting for condition")
E       TimeoutError: Failed to get to position x=-3.567, y=-1.332

deadline   = 9687528.054045612
interval   = 0.1
message    = 'Failed to get to position x=-3.567, y=-1.332'
predicate  = <bound method Event.is_set of <threading.Event at 0x7757b8e7fa70: unset>>
timeout    = 180

.../utils/testing/waiting.py:35: TimeoutError

To view more test analytics, go to the Test Analytics Dashboard
📋 Got 3 mins? Take this short survey to help us improve Test Analytics.

@greptile-apps

greptile-apps Bot commented Oct 2, 2026 •

Copy link
Copy Markdown
Contributor

RetriggerView in GreptileConfidence Score: 5/5

[Medium impact] No blocking finding remains; the inspection omission is non-blocking, and compatibility with removed core.py exports depends on the restoration in PR #4088.

Findings

  1. P1 Failed rebuild loses previous dataset ▶
  2. P2 Inspection hides exported features ▶

Summary

Moves LeRobot export and inspection into the isolated Python project.

  • LeRobot exports and inspections run through the isolated project’s dataset APIs.
  • MCAP stores can load native codecs from metadata when callers opt in.
  • CI discovers the isolated project’s tests using standard pytest names.
  • Dataprep types are imported directly from the schema module.

Compatibility for callers of the removed core.py exports depends on PR #4088, whose supplied revision restores those exports; this PR does not contain that fix. With that stack dependency, no blocking issue remains in this review.

Reviews (3) · Last reviewed commit: "test(dataprep): remove overlapping LeRob..." · Reviewed by Greptile

Comment thread dimos/imitation/dataprep/lerobot.md Resolved
Comment thread dimos/imitation/dataprep/core.py Resolved
@TomCC7
TomCC7 force-pushed the cc/feat/isolated-lerobot-export branch from 1a6e6c3 to 1ee6c54 Compare October 28, 2026 19:11
@TomCC7
TomCC7 force-pushed the cc/feat/isolated-lerobot-export branch from 1ee6c54 to 73393eb Compare October 28, 2026 19:16
@TomCC7
TomCC7 removed this pull request from stack #4448 October 28, 2026 19:43
@TomCC7
TomCC7 added this pull request to stack #4888 October 28, 2026 19:43
@github-actions github-actions Bot added the ready-to-merge Required CI checks have passed on this PR label Oct 28, 2026
@TomCC7
TomCC7 removed this pull request from stack #4888 October 28, 2026 22:49
@TomCC7
TomCC7 added this pull request to stack #4892 October 28, 2026 22:49
@TomCC7
TomCC7 removed this pull request from stack #4892 October 28, 2026 23:23
@TomCC7
TomCC7 added this pull request to stack #4895 October 28, 2026 23:23
@TomCC7
TomCC7 removed this pull request from stack #4895 October 29, 2026 00:07
@TomCC7
TomCC7 added this pull request to stack #4898 October 29, 2026 00:07
@mustafab0
mustafab0 merged commit d39375d into main Oct 29, 2026
40 of 41 checks passed
@mustafab0
mustafab0 deleted the cc/feat/isolated-lerobot-export branch October 29, 2026 06:55

This branch was previously deployed

1 inactive deployment
cachix — 1e253c0f Deployed Oct 28, 2026 by TomCC7 via cachix-build-macos #14763
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

ready-to-merge Required CI checks have passed on this PR

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants