Views
No views yet
| Property | Value |
|---|---|
| Data | Full 10K-hour UMI corpus (~1M episodes, 70+ tasks) |
| Initialization | VLM: tencent/HY-Embodied-0.5; Action Expert: random |
| Objective | Conditional flow matching (no co-training) |
| Steps | 200K |
| Global batch size | 1,024 |
| Learning rate | 5e-5 (linear warmup 1K → decay to 5e-6 over 160K → constant 40K) |
| Optimizer | AdamW, bfloat16 mixed precision |
| Hardware | 64 GPUs (8 nodes × 8) |
tencent/Hy-Embodied-0.5-VLA-UMI/
├── model.safetensors # Model weights
├── config.json # HyVLA configuration
├── tokenizer.json # Tokenizer for the VLM backbone
├── tokenizer_config.json
├── special_tokens_map.json
├── chat_template.jinja # Chat template for instruction formatting
├── preprocessor_config.json # Image preprocessing config
├── norm_stats.pkl # Pre-computed normalization statistics
└── LICENSE1import torch
2from huggingface_hub import snapshot_download
3from hy_vla import HyVLA, HyVLAConfig
4
5ckpt = snapshot_download("tencent/Hy-Embodied-0.5-VLA-UMI")
6
7config = HyVLAConfig.from_pretrained(ckpt)
8policy = HyVLA.from_pretrained(ckpt, config=config)
9policy.enable_video_encoder_if_needed() # K=1 in pretrain; call this before fine-tuning with K>1
10policy = policy.to(device="cuda", dtype=torch.bfloat16).eval()
11
12# (B, K, C, H, W); K=1 history slot (pre-trained mode)
13img = torch.zeros(1, 1, 3, 224, 224, device="cuda", dtype=torch.bfloat16)
14# Normalized dual-arm EEF: [xyz(3) + rot6d(6) + gripper(1)] * 2
15state = torch.zeros((1, config.max_state_dim), device="cuda", dtype=torch.bfloat16)
16batch = {
17 "observation.images.top_head": img,
18 "observation.images.hand_left": img,
19 "observation.images.hand_right": img,
20 "observation.state": state,
21 "task": ["pick up the bottle"],
22}
23
24with torch.no_grad():
25 actions = policy.forward_evaluate(batch)["pred"]
26 actions = actions[..., : config.action_feature.shape[0]]
27print(actions.shape)1# Fine-tune on RoboTwin 2.0
2export CHIEF_IP=<chief-ip> INDEX=0
3bash scripts/train_robotwin_umi.shnorm_stats.pkl derived from the full UMI pre-training corpus. If you are fine-tuning on a new dataset with substantially different statistics, you can regenerate them:1python scripts/compute_norm_lance.py \
2 --lance-source /path/to/your/data \
3 --output norm_stats.pkl1@article{zhang2026hy,
2 title={Hy-Embodied-0.5-VLA: From Vision-Language-Action Models to a Real-World Robot Learning Stack},
3 author={Zhang, He and Xiang, Lingzhu and Lin, Haitao and Huang, Zeyu and Wang, Minghui and Zhong, Dingyan and Dong, Yubo and Wu, Yihao and Rao, Yongming and Zhang, Dongsheng and others},
4 journal={arXiv preprint arXiv:2606.14409},
5 year={2026}
6}