Merge pull request #6 from vincentccc/main
Fix model load/save && open-loop script
This commit is contained in:
@@ -76,6 +76,7 @@ Training script path configuration
|
|||||||
- Robot DOF configuration
|
- Robot DOF configuration
|
||||||
- Training hyperparameters
|
- Training hyperparameters
|
||||||
|
|
||||||
|
Download the Flow/FAST pretrained model and run:
|
||||||
```bash
|
```bash
|
||||||
bash ./workspace/lerobot_example/run.sh
|
bash ./workspace/lerobot_example/run.sh
|
||||||
```
|
```
|
||||||
|
|||||||
@@ -38,8 +38,7 @@ gt_traj = torch.zeros((total_frames, action_dim))
|
|||||||
pred_traj = torch.zeros((total_frames, action_dim))
|
pred_traj = torch.zeros((total_frames, action_dim))
|
||||||
|
|
||||||
for idx, batch in enumerate(dataloader):
|
for idx, batch in enumerate(dataloader):
|
||||||
gt_traj[idx] = batch['action_chunk'][0, 0,:action_dim]
|
if idx % pred_horizon ==0 and idx + pred_horizon < total_frames:
|
||||||
if idx % 32 ==0 and idx + 32 < total_frames:
|
|
||||||
batch = batch.to("cuda")
|
batch = batch.to("cuda")
|
||||||
with torch.no_grad():
|
with torch.no_grad():
|
||||||
outputs = model(
|
outputs = model(
|
||||||
@@ -50,7 +49,13 @@ for idx, batch in enumerate(dataloader):
|
|||||||
predict_mode="fast"
|
predict_mode="fast"
|
||||||
)
|
)
|
||||||
pred_traj[idx : idx + pred_horizon] = outputs['predict_action'].detach().cpu()
|
pred_traj[idx : idx + pred_horizon] = outputs['predict_action'].detach().cpu()
|
||||||
|
|
||||||
|
# Denormalize ground truth actions
|
||||||
|
gt_action_chunk = batch['action_chunk'][:, :, :action_dim]
|
||||||
|
dof_mask = batch["dof_mask"].to(gt_action_chunk.dtype)
|
||||||
|
denormalized_gt = model.action_preprocessor.normalizer_action.unnormalize_data(gt_action_chunk, ["x2_normal"], dof_mask)
|
||||||
|
gt_traj[idx : idx + pred_horizon] = denormalized_gt.detach().cpu()
|
||||||
|
|
||||||
|
|
||||||
gt_traj_np = gt_traj.numpy()
|
gt_traj_np = gt_traj.numpy()
|
||||||
pred_traj_np = pred_traj.numpy()
|
pred_traj_np = pred_traj.numpy()
|
||||||
|
|||||||
@@ -207,7 +207,7 @@ class DataCollator:
|
|||||||
self.load_processor()
|
self.load_processor()
|
||||||
|
|
||||||
def load_processor(self):
|
def load_processor(self):
|
||||||
processor_path = self.config["processor_path"]
|
processor_path = self.config["pretrained_qwen_vl_path"]
|
||||||
action_tokenizer_path = self.config["action_tokenizer_path"]
|
action_tokenizer_path = self.config["action_tokenizer_path"]
|
||||||
|
|
||||||
# Use cached processors if available
|
# Use cached processors if available
|
||||||
|
|||||||
@@ -1,6 +1,7 @@
|
|||||||
import os
|
import os
|
||||||
import torch
|
import torch
|
||||||
import numpy as np
|
import numpy as np
|
||||||
|
import glob
|
||||||
import torch.nn as nn
|
import torch.nn as nn
|
||||||
from torchdiffeq import odeint
|
from torchdiffeq import odeint
|
||||||
from dataclasses import dataclass
|
from dataclasses import dataclass
|
||||||
@@ -685,7 +686,6 @@ class Qwen2_5_VLMoEForAction(Qwen2_5_VLForConditionalGeneration):
|
|||||||
"""
|
"""
|
||||||
|
|
||||||
# Load model components from pretrained path
|
# Load model components from pretrained path
|
||||||
model_path = os.path.join(pretrained_model_path, "model.safetensors")
|
|
||||||
config_path = os.path.join(pretrained_model_path, "config.json")
|
config_path = os.path.join(pretrained_model_path, "config.json")
|
||||||
config = cls.config_class.from_pretrained(config_path)
|
config = cls.config_class.from_pretrained(config_path)
|
||||||
processor = AutoProcessor.from_pretrained(pretrained_model_path, use_fast=True)
|
processor = AutoProcessor.from_pretrained(pretrained_model_path, use_fast=True)
|
||||||
@@ -703,8 +703,13 @@ class Qwen2_5_VLMoEForAction(Qwen2_5_VLForConditionalGeneration):
|
|||||||
model.resize_token_embeddings(len(processor.tokenizer))
|
model.resize_token_embeddings(len(processor.tokenizer))
|
||||||
|
|
||||||
# Load model state dict from safetensors file
|
# Load model state dict from safetensors file
|
||||||
state_dict = load_file(model_path, device="cpu")
|
safetensor_files = glob.glob(os.path.join(pretrained_model_path, "*.safetensors"))
|
||||||
msg = model.load_state_dict(state_dict, strict=False)
|
state_dict = {}
|
||||||
|
for file in safetensor_files:
|
||||||
|
sd = load_file(file, device="cpu")
|
||||||
|
state_dict.update(sd)
|
||||||
|
|
||||||
|
model.load_state_dict(state_dict, strict=False)
|
||||||
|
|
||||||
return model
|
return model
|
||||||
|
|
||||||
|
|||||||
@@ -108,7 +108,7 @@ class QwenVlAct_Trainer:
|
|||||||
ValueError: If required configuration keys are missing
|
ValueError: If required configuration keys are missing
|
||||||
"""
|
"""
|
||||||
# Validate required configuration keys
|
# Validate required configuration keys
|
||||||
required_keys = ["processor_path", "qwen_vl_act_config_path", "learning_rate", "num_epoch"]
|
required_keys = ["learning_rate", "num_epoch"]
|
||||||
for key in required_keys:
|
for key in required_keys:
|
||||||
if key not in config:
|
if key not in config:
|
||||||
raise ValueError(f"Missing required configuration key: {key}")
|
raise ValueError(f"Missing required configuration key: {key}")
|
||||||
@@ -197,6 +197,9 @@ class QwenVlAct_Trainer:
|
|||||||
self.train_loop(epoch)
|
self.train_loop(epoch)
|
||||||
self.accelerator.wait_for_everyone()
|
self.accelerator.wait_for_everyone()
|
||||||
|
|
||||||
|
if (epoch + 1) % self.config.get("epoch_save_interval", 10) == 0:
|
||||||
|
self.save_checkpoint(epoch)
|
||||||
|
|
||||||
# Validation after each epoch
|
# Validation after each epoch
|
||||||
self.val_loop()
|
self.val_loop()
|
||||||
self.accelerator.wait_for_everyone()
|
self.accelerator.wait_for_everyone()
|
||||||
|
|||||||
@@ -2,6 +2,12 @@
|
|||||||
|
|
||||||
This document explains the key configuration parameters that can be modified for Wall-X training.
|
This document explains the key configuration parameters that can be modified for Wall-X training.
|
||||||
|
|
||||||
|
## Enable FAST tokenizer
|
||||||
|
To fine-tune using the FAST tokenizer, please download the repository and update the `action_tokenizer_path`. Make sure to set `use_fast_tokenizer` to `true`:
|
||||||
|
```bash
|
||||||
|
git clone https://huggingface.co/physical-intelligence/fast
|
||||||
|
```
|
||||||
|
|
||||||
## Quick Start Checklist
|
## Quick Start Checklist
|
||||||
1. **Update run.sh**: Set `code_dir` and `config_path` to your actual paths
|
1. **Update run.sh**: Set `code_dir` and `config_path` to your actual paths
|
||||||
2. **Configure GPUs**: Set `CUDA_VISIBLE_DEVICES` for your available GPUs
|
2. **Configure GPUs**: Set `CUDA_VISIBLE_DEVICES` for your available GPUs
|
||||||
|
|||||||
@@ -5,9 +5,8 @@
|
|||||||
log_name: "robotic_training"
|
log_name: "robotic_training"
|
||||||
log_project: "vla_training"
|
log_project: "vla_training"
|
||||||
model_type: qwen2_5
|
model_type: qwen2_5
|
||||||
processor_path: "/path/to/model/"
|
pretrained_qwen_vl_path: "/path/to/wallx_model/"
|
||||||
pretrained_qwen_vl_path: "/path/to/qwen_vl_model/"
|
use_fast_tokenizer: false # True: train FAST, False: train Flow
|
||||||
qwen_vl_act_config_path: "/path/to/config.json"
|
|
||||||
action_tokenizer_path: "/path/to/fast/"
|
action_tokenizer_path: "/path/to/fast/"
|
||||||
save_path: "/path/to/workspace/"
|
save_path: "/path/to/workspace/"
|
||||||
|
|
||||||
@@ -27,6 +26,7 @@ num_epoch: 100
|
|||||||
gradient_accumulation_steps: 32
|
gradient_accumulation_steps: 32
|
||||||
batch_size_per_gpu: 8
|
batch_size_per_gpu: 8
|
||||||
padding_side: left
|
padding_side: left
|
||||||
|
epoch_save_interval: 10
|
||||||
|
|
||||||
# Robot configuration - Define degrees of freedom for each component
|
# Robot configuration - Define degrees of freedom for each component
|
||||||
dof_config:
|
dof_config:
|
||||||
@@ -52,10 +52,10 @@ agent_pos_config:
|
|||||||
height: 1
|
height: 1
|
||||||
car_pose: 3
|
car_pose: 3
|
||||||
|
|
||||||
# Checkpoint resuming configuration
|
# # Checkpoint resuming configuration
|
||||||
resume:
|
# resume:
|
||||||
ckpt: "/path/to/resume_model/"
|
# ckpt: "/path/to/resume_model/"
|
||||||
load_ckpt_only: true
|
# load_ckpt_only: true
|
||||||
|
|
||||||
# Data configuration
|
# Data configuration
|
||||||
data:
|
data:
|
||||||
|
|||||||
Reference in New Issue
Block a user