LeRobot datasets are hosted on Hugging Face Hub and can be loaded with a single line:
from lerobot.datasets.lerobot_dataset import LeRobotDataset# Load a dataset from the Hubdataset = LeRobotDataset("lerobot/aloha_mobile_cabinet")print(f"Number of episodes: {dataset.num_episodes}")print(f"Number of frames: {dataset.num_frames}")
# Extract features for policy configurationfeatures = dataset_to_policy_features(dataset_metadata.features)output_features = {key: ft for key, ft in features.items() if ft.type is FeatureType.ACTION}input_features = {key: ft for key, ft in features.items() if key not in output_features}# Initialize policy with configurationcfg = ACTConfig(input_features=input_features, output_features=output_features)policy = ACTPolicy(cfg)policy.train()policy.to(device)# Create preprocessor and postprocessorpreprocessor, postprocessor = make_pre_post_processors( cfg, dataset_stats=dataset_metadata.stats)
4
Prepare Dataset
# Configure temporal data loading for ACTdelta_timestamps = { "action": [i / dataset_metadata.fps for i in cfg.action_delta_indices],}# Add image features if presentdelta_timestamps.update({ k: [i / dataset_metadata.fps for i in cfg.observation_delta_indices] for k in cfg.image_features})# Load datasetdataset = LeRobotDataset(dataset_id, delta_timestamps=delta_timestamps)# Create dataloaderoptimizer = torch.optim.Adam(policy.parameters(), lr=1e-4)dataloader = torch.utils.data.DataLoader( dataset, batch_size=32, shuffle=True, num_workers=4, pin_memory=device.type != "cpu", drop_last=True,)
5
Training Loop
# Training configurationtraining_steps = 5000log_freq = 100# Training loopstep = 0done = Falsewhile not done: for batch in dataloader: # Preprocess batch batch = preprocessor(batch) # Forward pass loss, _ = policy.forward(batch) # Backward pass loss.backward() optimizer.step() optimizer.zero_grad() # Logging if step % log_freq == 0: print(f"Step {step}: loss = {loss.item():.4f}") step += 1 if step >= training_steps: done = True break
6
Save Model
# Save checkpoint locallypolicy.save_pretrained(output_dir)preprocessor.save_pretrained(output_dir)postprocessor.save_pretrained(output_dir)# Optionally push to Hub# policy.push_to_hub("<your-username>/my_act_policy")# preprocessor.push_to_hub("<your-username>/my_act_policy")# postprocessor.push_to_hub("<your-username>/my_act_policy")
The complete training example is available in the repository at examples/training/train_policy.py.
# Find camera indiceslerobot-find-cameras# Find robot serial portlerobot-find-port# Calibrate robot motorslerobot-calibrate --robot=so100# Set up motors (if needed)lerobot-setup-motors --robot=so100 --port=/dev/ttyUSB0
# Teleoperate the robot to test controllerobot-teleoperate \ --robot=so100 \ --robot.port=/dev/ttyUSB0 \ --teleoperator=gamepad
2
Record Demonstrations
# Record demonstrations to a new datasetlerobot-record \ --robot=so100 \ --robot.port=/dev/ttyUSB0 \ --teleoperator=gamepad \ --output_dir=data/my_task \ --num_episodes=50
3
Replay and Verify
# Replay recorded episodes to verify qualitylerobot-replay \ --dataset_dir=data/my_task \ --episode_index=0
4
Push to Hub (Optional)
from lerobot.datasets.lerobot_dataset import LeRobotDataset# Load local datasetdataset = LeRobotDataset.from_disk("data/my_task")# Push to Hugging Face Hubdataset.push_to_hub("<your-username>/my_task")
import torchfrom lerobot.datasets.lerobot_dataset import LeRobotDataset, LeRobotDatasetMetadatafrom lerobot.policies.act.modeling_act import ACTPolicyfrom lerobot.policies.act.configuration_act import ACTConfigfrom lerobot.policies.factory import make_pre_post_processorsfrom lerobot.datasets.utils import dataset_to_policy_featuresfrom lerobot.configs.types import FeatureType# Load dataset and metadatadataset_id = "lerobot/pusht"metadata = LeRobotDatasetMetadata(dataset_id)features = dataset_to_policy_features(metadata.features)# Configure policyoutput_features = {k: ft for k, ft in features.items() if ft.type is FeatureType.ACTION}input_features = {k: ft for k, ft in features.items() if k not in output_features}cfg = ACTConfig(input_features=input_features, output_features=output_features)# Initializepolicy = ACTPolicy(cfg)preprocessor, postprocessor = make_pre_post_processors(cfg, dataset_stats=metadata.stats)# Train (simplified)optimizer = torch.optim.Adam(policy.parameters(), lr=1e-4)# ... training loop ...# Savepolicy.save_pretrained("outputs/my_policy")preprocessor.save_pretrained("outputs/my_policy")postprocessor.save_pretrained("outputs/my_policy")