Install
Grab a v0.1.2 CPU wheel from the GitHub release (not on PyPI yet), or build the C++ tree. CUDA is a source build with nvcc — those wheels are CPU-only.
python -m pip install flowedge-0.1.2-*.whl
Products / FlowEdge
Runtime · v0.1.2
A C++ runtime for flow-matching and LeRobot Diffusion Policy. Convert the checkpoint once, load it into a fixed arena, and every control tick you get an action — or a defined miss: hold, drop, or raise. Not a trainer. Not a safety controller. Cameras and e-stop stay in LeRobot.
Sensors and the RGB encoder stay outside. Core only samples the policy head, then either ships an action chunk or applies the miss policy.
Grab a v0.1.2 CPU wheel from the GitHub release (not on PyPI yet), or build the C++ tree. CUDA is a source build with nvcc — those wheels are CPU-only.
python -m pip install flowedge-0.1.2-*.whl
Map a pinned Hugging Face / LeRobot checkpoint into layouts the engine already knows (backbone.*, flow.*, dp.*). After that, Core never talks to the training graph.
Run one trajectory against the converted file. Python and the CLI call the same engine.
python examples/core/flow_sample.py models/mamba_flow.safetensors euler 10
# or
./build/flow_sample models/mamba_flow.safetensors euler 10
Each tick: observation in, action out. If this sample is late, say what the motors get. Limits and e-stop are still yours / LeRobot’s.
--period-ms 10 --on-miss hold # or drop | raise
Matched Diffusion Policy PushT replay vs LeRobot / PyTorch on the same observation file. Same load → warmup (malloc 0) → DDIM. First bar to 100% in each pair is faster. Not a 10 ms loop — that is the robot’s tick, not this checkpoint’s p50.
0.38× the PyTorch CUDA p50. Encoder still in LeRobot. Not TensorRT, not Jetson.
0.60× the LeRobot / PyTorch p50. The fair compare. At 4 threads: 633 vs 819 ms.
From the README: PyTorch, LeRobot, TensorRT, and generic model servers are good at training or at running arbitrary graphs. They are a weak fit as the thing inside the robot loop.
They train. FlowEdge runs the tick.
Cameras, normalization, joint limits, and e-stop stay in LeRobot. The published numbers are a matched Diffusion Policy replay against that stack on the same file — not a generated-token speedup.
Graph compilers. FlowEdge is not one.
Each head is hand-assembled into a sized arena. There is no graph interpreter (ADR 0005). The 131 vs 345 ms CUDA figure is vs PyTorch CUDA on a GTX 1650, not TensorRT or Jetson/ARM.
Throughput and a growing KV cache.
A 100 Hz loop wants malloc 0 after load and a defined miss: hold, drop, or raise. A p50 is not a miss count. Optional Relay is local IPC around Core, not the default DP path.
More NFE than a short flow ODE.
Diffusion Policy is first-class when that is the trained checkpoint. Flow matching is the default head — Euler / Heun / RK4, gated by ULP vs the same PyTorch reference (~1e-6 rel). No published flow p50 yet.
Evidence and how to regenerate: performance docs.