Replies: 1 comment 4 replies
|
Thank you @Sagar-024. You did the thing I asked for and then some: you took a negative result seriously instead of quietly switching to synthetic data and reporting only the timings. Yes to the LeRobot provider. Go for it. One steer on shape: build it as a general tool, not an hflow subsystem. LeRobot to canonical MCAP is useful to people who will never run this project, and we do not want to constrain it to our system or take on a dataset-format matrix inside core. Concretely, that means depending on the format rather than on our internals: A few things that follow from that:
Design questions that need a decision before you go far: how you map LeRobot's per-frame Parquet rows onto MCAP channels and timestamps, and what you do when the MP4 timestamps and the Parquet timestamps disagree. Post your intended mapping here before you write much of it and we will settle it in this thread, cheaply. Yes to the stress scripts as an examples entry, too. "The next stress test is one command" is worth real time, and your 200-episode numbers become reproducible instead of anecdotal. Send it separately from the converter so neither waits on the other. On the rest of the report: Awkward 1 is a real bug and I filed it as #86. I reproduced it. One correction worth making, because it changes the fix: the failure is not entirely silent. The Awkward 2, no local batch path: agreed, and it is the more interesting half. That you had to write a script to run 200 episodes locally is a real gap, and it is also why awkward 1 stayed invisible. Your stress-scripts contribution partly answers it; whether Awkward 3, WSL2 friction: partly fixed already. #75 added a platform section to On the 9 s per episode: that matches where I would expect the cost to sit, and One process note: if something you post here goes quiet, ping it. |
Uh oh!
There was an error while loading. Please reload this page.
Context
In the PR #41 review, @kstonekuan asked me to run hflow against a real corpus like Egocentric-10K and report what breaks, what is slow, and what is awkward. This is that report. I want to be upfront about the path I took, because the most important finding happened before any timing was measured.
Machine: Windows 11 laptop, 16 GB RAM, no GPU, everything run inside WSL2 Ubuntu.
What breaks: the real corpora cannot get in
I started with the dataset named in the review, builddotai/Egocentric-10K, and with LeRobot as the most common public robot corpus.
hflow only reads canonical MCAP, and src/hflow/providers.py defines a single provider, NativeVideoProvider, which is for VLM servers such as vLLM. There is no ingestion provider for WebDataset or for Parquet plus MP4. So neither corpus can enter the pipeline at all. A team holding either dataset has to write an external converter before hflow sees a single episode.
This is the lead finding. The answer to "what breaks" on real data is the door. Everything downstream of ingestion worked once data was in MCAP.
What is slow: 200 episode timing run
Since real data could not enter, I generated a synthetic corpus to measure the pipeline itself: 200 canonical episodes, 175 MB, durations 2 to 10 s, 1 to 3 cameras at 10/15/30 Hz, 20% with black segments, 20% with joint jumps. Ingestion ran sequentially, one episode at a time.
Total about 34 minutes.
The ingestion bottleneck is camera_frame_stats, the ffmpeg decode plus signalstats pass per camera. At 9 s per episode, a 10K hour corpus is out of reach on a laptop and would need much more parallel decode on a server. DuckDB curation is fast and is not the bottleneck.
What is awkward
action_rate records nothing when registered the obvious way. The check requires the topics kwarg, so app.check()(action_rate) never produces a measurement. Ingestion still finishes and reports success, and I confirmed the ingest log contains zero mentions of action_rate. No error, no warning. The column is simply absent from the catalog. The fix is to wrap the check in a lambda that supplies topics. Nothing in the check registry or the docs flags this. I only noticed because my z-score query came back empty.
There is no local batch ingest path. hflow ingest only works through the Airflow runtime. For a local stress run I had to write a small script calling app.process() per file, which is not obvious from hflow --help. A local mode or an examples script would save the next person an hour.
WSL2 setup friction for anyone on Windows: apt asks for an interactive sudo password, pip3 install uv fails with PEP 668 so you need the official installer, and uv sync falls back to full file copies when the repo lives on /mnt/c because it crosses a filesystem boundary. Cloning inside the WSL home directory fixes the last one.
What I would do next
The highest leverage fix is a LeRobot ingestion provider, Parquet plus MP4 to canonical MCAP. It unlocks hundreds of public datasets and makes the real data stress test possible end to end. I would be glad to take that on.
If useful, I can also contribute my two stress scripts as an examples entry so the next stress test is one command.
All reactions