File size: 10,500 Bytes
ec0a9aa | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 | set -e
set -u
set -o pipefail
COSMOS_PREDICT_PATH="/mnt/data/sftp/data/vla_intern/workspace/binh/dreamgen/dreamgen"
# $$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$
# DATASET_PATH="/work/HHRI-AI/POC/public/pretraining_data/Robotic-Data/Video-Simulation-Data/robocasa/robocasa_30_demos_lerobot_5_chosen_tasks_v3-training-format"
DATASET_PATH="/mnt/data/sftp/data/vla_intern/workspace/binh/dreamgen/dreamgen/datasets/robcoasa_draft"
# EXPERIMENT="debug"F
EXPERIMENT="predict2_video2world_training_2b_groot_gr1_480"
# NUM_GPUS=1 #4
NUM_GPUS=4
MASTER_PORT=12341
unset NCCL_SOCKET_IFNAME
unset NCCL_IB_HCA
# conda activate dg2
export PATH="/home/binhng/conda_setup/miniconda3/envs/dg2/bin:$PATH"
# export PYTHONPATH="${COSMOS_PREDICT_PATH}:${PYTHONPATH:-}"
export PYTHONPATH="${PYTHONPATH:-}:${COSMOS_PREDICT_PATH}"
export CUDA_HOME=/mnt/data/sftp/data/vla_intern/workspace/binh/dreamgen/cuda_setup/cuda_12.4
# export CUDA_DEVICE_ORDER="PCI_BUS_ID"
# export NCCL_SOCKET_IFNAME="ib0"
# export NCCL_IB_DISABLE=0
# export NCCL_DEBUG=INFO
# export NCCL_P2P_DISABLE=1 \
# export NCCL_SHM_DISABLE=1 \
# export NCCL_NET_DISABLE=1
# export NCCL_IB_DISABLE=1
# Keep everything on localhost
unset NCCL_SOCKET_IFNAME
unset NCCL_IB_HCA
export NCCL_DEBUG=INFO
export MASTER_ADDR=127.0.0.1
export MASTER_PORT=12341
export NCCL_SOCKET_IFNAME=eth0
# export CUDA_VISIBLE_DEVICES=0,1,2,3
# Optional: get clearer logs
# export NCCL_DEBUG=INFO
# export CUDA_DEVICE_ORDER="PCI_BUS_ID"
# export NCCL_SOCKET_IFNAME="ib0"
# export NCCL_IB_DISABLE=0
export NCCL_DEBUG=INFO
export CUDA_VISIBLE_DEVICES=0,1,2,3
# $$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$
# export WANDB_API_KEY="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"
export WANDB_API_KEY="4d7d3d768aa4a5e26e287875fad303a3c4586fc6"
# export WANDB_ENTITY="dreamgen"
# export WANDB_PROJECT="Robotics_VLA"
export WANDB_ENTITY="Robotics_VLA"
export WANDB_PROJECT="dreamgen"
export BATCH_SIZE=1
BATCH_SIZE=1 #${BATCH_SIZE:-1}
NUM_WORKERS=${NUM_WORKERS:-8}
MAX_STEPS=${MAX_STEPS:-""}
#############################################################################################################
# =============================================================================
# VALIDATION
# =============================================================================
echo "============================================"
echo "Cosmos Predict2 Training Configuration"
echo "============================================"
echo "Cosmos Predict Path: $COSMOS_PREDICT_PATH"
echo "Dataset Path: $DATASET_PATH"
echo "Experiment: $EXPERIMENT"
echo "Number of GPUs: $NUM_GPUS"
echo "W&B Project: $WANDB_PROJECT"
echo "W&B Entity: $WANDB_ENTITY"
echo "============================================"
echo "Verifying paths and requirements..."
if [ ! -d "$COSMOS_PREDICT_PATH" ]; then
echo "ERROR: Cosmos Predict directory does not exist: $COSMOS_PREDICT_PATH"
exit 1
fi
if [ ! -d "$DATASET_PATH" ]; then
echo "ERROR: Dataset directory does not exist: $DATASET_PATH"
exit 1
fi
METAS_DIR="${DATASET_PATH}/metas"
VIDEOS_DIR="${DATASET_PATH}/videos"
T5_DIR="${DATASET_PATH}/t5_xxl"
if [ ! -d "$METAS_DIR" ]; then
echo "ERROR: Metas directory does not exist: $METAS_DIR"
exit 1
fi
if [ ! -d "$VIDEOS_DIR" ]; then
echo "ERROR: Videos directory does not exist: $VIDEOS_DIR"
exit 1
fi
if [ ! -d "$T5_DIR" ]; then
echo "ERROR: T5 embeddings directory does not exist: $T5_DIR"
echo "Please run the T5 embedding extraction script first!"
exit 1
fi
# Count dataset files
txt_files=$(find "$METAS_DIR" -name "*.txt" | wc -l)
mp4_files=$(find "$VIDEOS_DIR" -name "*.mp4" | wc -l)
pickle_files=$(find "$T5_DIR" -name "*.pickle" | wc -l)
echo "Dataset validation:"
echo " - Text files: $txt_files"
echo " - Video files: $mp4_files"
echo " - T5 embeddings: $pickle_files"
if [ $pickle_files -eq 0 ]; then
echo "ERROR: No T5 embedding files found. Please run embedding extraction first!"
exit 1
fi
# Check GPU availability
if ! command -v nvidia-smi &> /dev/null; then
echo "ERROR: nvidia-smi not found. CUDA not available?"
exit 1
fi
available_gpus=$(nvidia-smi --list-gpus | wc -l)
echo "Available GPUs: $available_gpus"
if [ $available_gpus -lt $NUM_GPUS ]; then
echo "ERROR: Requested $NUM_GPUS GPUs but only $available_gpus available"
exit 1
fi
echo "All validations passed!"
echo ""
########################################################################################
# =============================================================================
# TRAINING SETUP
# =============================================================================
# Change to the Cosmos Predict directory
echo "Changing to Cosmos Predict directory..."
cd "$COSMOS_PREDICT_PATH"
FILTERED_DATASET_PATH="${DATASET_PATH}_filtered"
if [ -d "$FILTERED_DATASET_PATH" ]; then
echo "✅ Filtered dataset already exists at: $FILTERED_DATASET_PATH"
video_count=$(find "$FILTERED_DATASET_PATH/videos" -type f -name "*.mp4" 2>/dev/null | wc -l)
if [ "$video_count" -gt 0 ]; then
echo "Found $video_count videos. Skipping the filtering process."
echo "💡 To force re-filtering, delete the directory: rm -rf \"$FILTERED_DATASET_PATH\""
else
echo "⚠️ WARNING: Filtered directory exists but is empty. Proceeding to re-filter."
fi
else
echo "Filtered dataset not found. Starting video filtering (need 93+ frames)..."
pip install --user ffmpegcv opencv-python-headless 2>/dev/null || echo "Dependencies already installed"
FILTERED_METAS_DIR="${FILTERED_DATASET_PATH}/metas"
FILTERED_VIDEOS_DIR="${FILTERED_DATASET_PATH}/videos"
FILTERED_T5_DIR="${FILTERED_DATASET_PATH}/t5_xxl"
mkdir -p "$FILTERED_METAS_DIR" "$FILTERED_VIDEOS_DIR" "$FILTERED_T5_DIR"
python3 -c "
import os, cv2, shutil
from pathlib import Path
def get_frame_count(video_path):
try:
cap = cv2.VideoCapture(str(video_path))
if not cap.isOpened(): return 0
count = int(cap.get(cv2.CAP_PROP_FRAME_COUNT))
cap.release()
return count
except Exception:
return 0
videos_dir = Path('$VIDEOS_DIR')
metas_dir = Path('$METAS_DIR')
t5_dir = Path('$T5_DIR')
filtered_videos_dir = Path('$FILTERED_VIDEOS_DIR')
filtered_metas_dir = Path('$FILTERED_METAS_DIR')
filtered_t5_dir = Path('$FILTERED_T5_DIR')
MIN_FRAMES = 100
valid_count, total_count = 0, 0
print(f'Starting video filtering (minimum {MIN_FRAMES} frames required)...')
for video_file in sorted(videos_dir.glob('*.mp4')):
total_count += 1
if get_frame_count(video_file) >= MIN_FRAMES:
base_name = video_file.stem
meta_file = metas_dir / f'{base_name}.txt'
t5_file = t5_dir / f'{base_name}.pickle'
if meta_file.exists() and t5_file.exists():
shutil.copy2(video_file, filtered_videos_dir)
shutil.copy2(meta_file, filtered_metas_dir)
shutil.copy2(t5_file, filtered_t5_dir)
valid_count += 1
if total_count % 100 == 0:
print(f'Processed {total_count} videos, kept {valid_count}')
print(f'\nFiltering complete: {valid_count}/{total_count} videos kept')
if valid_count == 0:
print('ERROR: No valid videos found after filtering!')
import sys; sys.exit(1)
"
fi
# Update dataset path to use filtered dataset
DATASET_PATH="$FILTERED_DATASET_PATH"
echo "Using dataset path for training: $DATASET_PATH"
# Symlink dataset to expected path
# $$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$
# EXPECTED_DATASET_PATH="datasets/benchmark_train/gr1"
# # EXPECTED_DATASET_PATH="datasets/robcoasa_draft_filtered"
# echo "Creating dataset symlink for config compatibility..."
# mkdir -p "$(dirname "$EXPECTED_DATASET_PATH")"
# rm -rf "$EXPECTED_DATASET_PATH"
# ln -s "$(readlink -f "$DATASET_PATH")" "$EXPECTED_DATASET_PATH"
# echo "Created symlink: $EXPECTED_DATASET_PATH -> $(readlink -f "$DATASET_PATH")"
# -------------------- Symlink to expected path --------------------
EXPECTED_DATASET_PATH="datasets/benchmark_train/gr1"
echo "Creating dataset symlink for config compatibility..."
mkdir -p "$(dirname "$EXPECTED_DATASET_PATH")"
rm -rf "$EXPECTED_DATASET_PATH"
ln -s "$(readlink -f "$DATASET_PATH")" "$EXPECTED_DATASET_PATH"
# Verify symlink
if [[ -L "$EXPECTED_DATASET_PATH" ]]; then
echo "Created symlink: $EXPECTED_DATASET_PATH -> $(readlink -f "$DATASET_PATH")"
else
echo "ERROR: Failed to create symlink at $EXPECTED_DATASET_PATH" >&2
exit 1
fi
# Create output and log directories
TIMESTAMP=$(date +"%Y%m%d_%H%M%S")
OUTPUT_DIR="/mnt/data/sftp/data/vla_intern/workspace/binh/dreamgen/dreamgen/outputs/training_${EXPERIMENT}_${TIMESTAMP}"
LOG_DIR="$OUTPUT_DIR/logs"
mkdir -p "$LOG_DIR"
echo "Training output directory: $OUTPUT_DIR"
# =============================================================================
# BUILD & EXECUTE TRAINING COMMAND
# =============================================================================
HYDRA_RUN_DIR="$OUTPUT_DIR/hydra_runs"
mkdir -p "$HYDRA_RUN_DIR"
TORCHRUN_CMD="torchrun --standalone --nproc_per_node=$NUM_GPUS --nnodes=1"
# TORCHRUN_CMD="python -m torch.distributed.run --standalone --nproc_per_node=$NUM_GPUS --nnodes=1"
# TRAIN_CMD="-m scripts.train --config=cosmos_predict2/configs/base/config.py -- experiment=${EXPERIMENT}"
TRAIN_CMD="-m scripts.train --config=cosmos_predict2/configs/base/config.py -- experiment=${EXPERIMENT}"
if [ -n "$MAX_STEPS" ]; then
TRAIN_CMD="$TRAIN_CMD max_steps=${MAX_STEPS}"
fi
TRAIN_CMD="$TRAIN_CMD hydra.run.dir=${HYDRA_RUN_DIR} hydra.job.chdir=True"
FULL_CMD="$TORCHRUN_CMD $TRAIN_CMD"
pwd
echo "============================================"
echo "Starting Training"
echo "Command: $FULL_CMD"
echo "Logs will be saved to: $LOG_DIR"
echo "============================================"
# Save command to log file
echo "Command: $FULL_CMD" > "$LOG_DIR/training_command.log"
env | grep -E "(CUDA|NCCL|PYTHON|WANDB)" >> "$LOG_DIR/training_command.log"
# Execute training with logging
exec &> >(tee -a "$LOG_DIR/training_output.log")
echo "Training started at: $(date)"
$FULL_CMD
if [ $? -eq 0 ]; then
echo -e "\n============================================\nTraining completed successfully!\nOutput directory: $OUTPUT_DIR\n============================================"
else
echo -e "\n============================================\nTraining failed! Check logs in: $LOG_DIR\n============================================"
exit 1
fi |