| #!/bin/bash |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| set -euo pipefail |
|
|
|
|
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
|
|
| set -euo pipefail |
|
|
| if [ -n "${SLURM_SUBMIT_DIR:-}" ]; then |
| PROJECT_DIR="$SLURM_SUBMIT_DIR" |
| else |
| PROJECT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" |
| fi |
| cd "$PROJECT_DIR" |
|
|
| IMAGE_SHARDS_DIR="$PROJECT_DIR/dataset/image10k/train" |
| VIDEO_SHARDS_DIR="$PROJECT_DIR/dataset/dataset_10m" |
|
|
| |
| |
| STAGE1_CKPT="${STAGE1_CKPT:-checkpoints/stage1_5/balanced/mavt-stage1_5-balanced-step=0120000-val/loss=0.1238.ckpt}" |
|
|
| |
| |
| |
| RESUME_CKPT="${RESUME_CKPT:-}" |
|
|
| mkdir -p logs checkpoints/stage2 |
|
|
| |
| |
| PYTHON_BIN="${PYTHON_BIN:-$PROJECT_DIR/.venv/bin/python}" |
| export PATH="$PROJECT_DIR/.venv/bin:${PATH:-}" |
|
|
| export PYTHONPATH="$PROJECT_DIR/src:${PYTHONPATH:-}" |
| export TORCH_NCCL_BLOCKING_WAIT=1 |
| export OMP_NUM_THREADS=8 |
| export TOKENIZERS_PARALLELISM=false |
|
|
| NUM_GPUS=$("$PYTHON_BIN" -c "import torch; print(torch.cuda.device_count())" 2>/dev/null || echo "1") |
|
|
| |
| |
| |
| INIT_ARGS=() |
| CKPT_ARG="" |
| if [ -n "$RESUME_CKPT" ] && [ -f "$RESUME_CKPT" ]; then |
| CKPT_ARG="--ckpt_path $RESUME_CKPT" |
| MODE="resume from $RESUME_CKPT" |
| elif [ -f "$STAGE1_CKPT" ]; then |
| INIT_ARGS+=( --model.init_from_ckpt "$STAGE1_CKPT" ) |
| MODE="init weights from $STAGE1_CKPT" |
| else |
| echo "[WARN] Neither RESUME_CKPT nor STAGE1_CKPT exists. Training from scratch." |
| MODE="from scratch" |
| fi |
|
|
| |
| W_TEMP="${W_TEMP:-0.1}" |
| W_SEM="${W_SEM:-0.3}" |
| W_LPIPS="${W_LPIPS:-0.3}" |
| BATCH_SIZE="${BATCH_SIZE:-8}" |
| NUM_WORKERS="${NUM_WORKERS:-4}" |
| VIDEO_MAX_SHARDS="${VIDEO_MAX_SHARDS:-0}" |
|
|
| echo "========================================" |
| echo " MAVT Stage 2 — Image + Video" |
| echo " GPUs: $NUM_GPUS" |
| echo " Image shards:$IMAGE_SHARDS_DIR" |
| echo " Video shards:$VIDEO_SHARDS_DIR (max=$VIDEO_MAX_SHARDS, 0=unlimited)" |
| echo " Mode: $MODE" |
| echo " Batch size: $BATCH_SIZE (× accumulate=2 → effective 16)" |
| echo " w_temp=$W_TEMP w_sem=$W_SEM w_lpips=$W_LPIPS" |
| echo "========================================" |
|
|
| MAX_SHARDS_ARG=() |
| if [ "$VIDEO_MAX_SHARDS" != "0" ]; then |
| MAX_SHARDS_ARG=( --data.video_max_shards "$VIDEO_MAX_SHARDS" ) |
| fi |
|
|
| "$PYTHON_BIN" train.py fit \ |
| --config configs/model/mavt_base.yaml \ |
| --config configs/train/universal_data/stage2_universal.yaml \ |
| --config configs/train/universal_data/stage2_3_paths.yaml \ |
| --data.image_shards_dir "$IMAGE_SHARDS_DIR" \ |
| --data.video_shards_dir "$VIDEO_SHARDS_DIR" \ |
| "${MAX_SHARDS_ARG[@]}" \ |
| --data.active_modalities '["image", "video"]' \ |
| --model.active_modalities '["image", "video"]' \ |
| --data.image_resolution 256 \ |
| --data.video_frames 16 \ |
| --data.video_resolution 256 \ |
| --data.batch_size "$BATCH_SIZE" \ |
| --data.num_workers "$NUM_WORKERS" \ |
| --data.pin_memory true \ |
| --data.persistent_workers true \ |
| --data.prefetch_factor 4 \ |
| --model.training_stage 2 \ |
| --model.init_siglip2 true \ |
| --model.use_lpips true \ |
| --model.use_clip false \ |
| --model.w_lpips "$W_LPIPS" \ |
| --model.w_sem "$W_SEM" \ |
| --model.w_temp "$W_TEMP" \ |
| --model.warmup_steps 500 \ |
| --model.total_steps 200000 \ |
| "${INIT_ARGS[@]}" \ |
| --trainer.devices "$NUM_GPUS" \ |
| --trainer.precision bf16-mixed \ |
| --trainer.max_steps 200000 \ |
| --trainer.accumulate_grad_batches 2 \ |
| --trainer.log_every_n_steps 50 \ |
| --trainer.val_check_interval 2000 \ |
| --trainer.logger.class_path lightning.pytorch.loggers.WandbLogger \ |
| --trainer.logger.init_args.project mavt \ |
| --trainer.logger.init_args.name "stage2_decoder_v2_w3" \ |
| $CKPT_ARG |
|
|