PushT-with-obstacles β Columbia Diffusion Policy Finetune
A finetune of Columbia's official Diffusion Policy
on a custom PushT environment with random obstacles. Trained for 500 epochs
(~115k optimizer steps) on a single RTX 5080, starting from Columbia's
train_2/epoch=1850/test_mean_score=0.898 PushT image-policy checkpoint.
Source code: https://github.com/Zengxy0624/xarm7_collect/tree/main/push_t/columbia_ft
Headline numbers (n=200 final eval)
| Metric | Value | 95% CI |
|---|---|---|
success_rate (max coverage β₯ 0.95) |
0.490 | [0.42, 0.56] |
obstacle_hit_rate |
0.175 | β |
mean_score (mean max coverage) |
0.676 | β |
Statistically tied with the parallel lerobot finetune baseline (success
0.465 Β± 0.07). Bottleneck identified as dataset size (101 episodes), not
training stack β see docs/03_lerobot_vs_columbia.md.
File index
checkpoints/
columbia_ft_best_epoch300_score0.695.ckptβ Best ckpt picked by Columbia's TopK manager (monitor=test/mean_score). Use this for inference / as a finetune starting point.columbia_ft_latest_epoch499.ckptβ Final epoch 499 weights (overfit, val_loss 70Γ higher than best). Useful only for studying overfitting trajectory.
Each ckpt is ~4 GB. Format: dill-pickled torch state dict containing state_dicts.{model, ema_model, optimizer} + cfg (the full Hydra training config). Load with torch.load(path, pickle_module=dill, weights_only=False, map_location="cpu").
data/
pusht_obstacles_dp.zarr.tar.gzβ Training data: 101 episodes, 15758 frames @ 10 fps, 96Γ96 RGB images with obstacles already drawn into the rendered scene. Schema matchesdiffusion_policy.dataset.pusht_image_dataset.PushTImageDataset:data/img(N, 96, 96, 3) uint8data/state(N, 5) float32 β [agent_x, agent_y, block_x, block_y, block_ΞΈ]data/action(N, 2) float32meta/episode_ends(E,) int64
Untar before use: tar -xzf pusht_obstacles_dp.zarr.tar.gz.
logs/
train_logs.jsonlβ Per-step + per-epoch metrics for the full 500-epoch run. ~115k JSON lines. Each line hastrain_loss,global_step,epoch,lr. Lines at epoch boundaries also haveval_loss,train_action_mse_error,test/mean_score,test/success_rate,test/obstacle_hit_rate. Use to plot training curves or replay rollout history.
eval/
columbia_ft_eval_n200.jsonβ Final n=200 evaluation of the best ckpt againstobstacle_set=legacy. Headline result. Contains per-seed reward + aggregated mean_score / success_rate / obstacle_hit_rate.columbia_zero_shot_eval_n50.jsonβ Zero-shot baseline: Columbia's stock PushT ckpt directly applied to the obstacle env (no finetune). success=0.06, obstacle_hit=0.72. Reference for "how much did finetune help".columbia_official_pusht_eval_n50.jsonβ Sanity check: Columbia's stock ckpt on Columbia's stock PushT env (no obstacles). success=0.76, mean_score=0.86. Reproduces paper Table I within 5%; verifies the training stack itself is correctly set up.
docs/
01_stack_setup.mdβ How the dp conda env was built, what versions diverge from upstream and why (torch 2.8 for sm_120 GPUs, shapely 2.x, huggingface_hub<0.26). Includes the exact reproduction commands.02_finetune_results.mdβ Full training trajectory analysis. Per-rollout table, three training phases (rapid acquisition β plateau β overfit), train_loss vs val_loss divergence (val rises 70Γ while train falls 135Γ). Identifies the small-data overfitting signature.03_lerobot_vs_columbia.mdβ Cross-stack comparison with the lerobot finetune baseline (n=200 vec-env eval on both). Statistical analysis of why the previously reported lerobot 0.61 was a small-sample artifact (n=100, CI Β±13pp). Discussion of which stack to pick for downstream work.
Minimum loading example
import dill, torch
from diffusion_policy.workspace.train_diffusion_unet_hybrid_workspace import (
TrainDiffusionUnetHybridWorkspace,
)
# Download from HF
from huggingface_hub import hf_hub_download
ckpt_path = hf_hub_download(
repo_id="zengxy0624/pusht-obstacles-columbia-ft",
filename="checkpoints/columbia_ft_best_epoch300_score0.695.ckpt",
)
# Load
payload = torch.load(ckpt_path, map_location="cpu", pickle_module=dill, weights_only=False)
cfg = payload["cfg"] # full Hydra training config
workspace = TrainDiffusionUnetHybridWorkspace(cfg)
workspace.load_payload(payload)
# Use the EMA model for inference (this is what the rollout scores measured)
policy = workspace.ema_model
policy.eval().to("cuda")
# Inference: see push_t/columbia_ft/eval_zero_shot.py in the source repo
Reproducing the training run
# 1. Clone source
git clone https://github.com/Zengxy0624/xarm7_collect.git
cd xarm7_collect
# 2. Set up dp env (see push_t/columbia_ft/requirements_dp.txt for exact pip install commands)
conda create -n dp python=3.9 pip=22.2.2 -y
conda activate dp
pip install setuptools==65.5.0 wheel==0.38.4
pip install -r push_t/columbia_ft/requirements_dp.txt --extra-index-url https://download.pytorch.org/whl/cu128
pip install --no-deps robomimic==0.2.0
# 3. Download Columbia's PushT image-policy ckpt (used as init)
bash push_t/columbia_ft/download_columbia_ckpt.sh
# 4. Get the dataset (this HF repo)
hf download zengxy0624/pusht-obstacles-columbia-ft data/pusht_obstacles_dp.zarr.tar.gz \
--local-dir push_t/data --local-dir-use-symlinks=False
cd push_t/data && tar -xzf pusht_obstacles_dp.zarr.tar.gz && cd ../..
# 5. Train
git clone https://github.com/real-stanford/diffusion_policy.git ~/diffusion_policy
export PYTHONPATH=$PWD:$HOME/diffusion_policy:$PYTHONPATH
cd ~/diffusion_policy
python train.py \
--config-dir=$HOME/.../push_t/columbia_ft/config \
--config-name=image_pusht_obstacle_ft.yaml \
hydra.run.dir=outputs/columbia_ft_$(date +%Y%m%d_%H%M%S)
Training takes ~3.5 hours on RTX 5080 (faster on H100). See docs/01_stack_setup.md for full setup notes.
Evaluating the released ckpt
# Sync vec-env eval (matches the published n=200 number)
python -m push_t.columbia_ft.eval_zero_shot \
--checkpoint /path/to/columbia_ft_best_epoch300_score0.695.ckpt \
--output-dir push_t/eval_results/repro_n200 \
--n-test 200 --obstacle-set legacy
Citation / credits
- Underlying algorithm: Chi et al. 2023, "Diffusion Policy: Visuomotor Policy Learning via Action Diffusion" β https://diffusion-policy.cs.columbia.edu/
- Init checkpoint: Columbia official PushT image-policy run train_2/epoch=1850 from https://diffusion-policy.cs.columbia.edu/data/experiments/image/pusht/diffusion_policy_cnn/
- This finetune + obstacle env extension: zengxy0624 / 2026-05
License
MIT (matches Columbia's diffusion_policy repo). The PushT environment is derived from Yunsheng Chi's original PushT.