MAVT / train_stage3_dgx.sh
Anbinh93's picture
Initial upload: code + configs + Stage 3 live progress (rgat-demo branch)
251713e verified
Raw
History Blame Contribute Delete
4.94 kB
#!/bin/bash
#SBATCH --job-name=mavt-s3-threed
#SBATCH --partition=defq
#SBATCH --nodes=1
#SBATCH --ntasks-per-node=2
#SBATCH --gpus-per-node=2
#SBATCH --cpus-per-task=24
#SBATCH --mem=120G
#SBATCH --time=48:00:00
#SBATCH --output=logs/stage3_dgx_%j.log
#SBATCH --error=logs/stage3_dgx_%j.err
# ============================================================================
# MAVT Stage 3 — Image + Video + 3D triplane
# - Init from stage1_5 step=120k (best converged Stage 1 ckpt;
# Stage 2 has no ckpt >15k due to save_top_k=1 bug in old config).
# - 2x A100 DDP, bf16-mixed
# - 50k steps, batch=6/GPU × 2 GPU × accum=2 = effective batch 24
# - LR 2e-5, warmup 500
# - SigLIP2 fully unfrozen (stage 3)
# - 3D from dataset/universal_3d/ (30 519 triplane objects, captions/3d.json)
#
# Prerequisites (already in place):
# - dataset/universal_3d/3d_objects/renders → symlink to dataset/tripplane
# - dataset/universal_3d/captions/3d.json (30 519 LVIS captions)
# - dataset/image10k/train (WDS image shards)
# - dataset/dataset_10m (video shards; 51% known corrupt, loader handles)
#
# Submit:
# sbatch train_stage3_dgx.sh
# ============================================================================
set -euo pipefail
PROJECT_DIR="/home/user02/linhdang/Antokenizer"
cd "$PROJECT_DIR"
# --- Data paths -----------------------------------------------------------
IMAGE_SHARDS_DIR="$PROJECT_DIR/dataset/image10k/train"
VIDEO_SHARDS_DIR="$PROJECT_DIR/dataset/dataset_10m"
UNIVERSAL_ROOT="$PROJECT_DIR/dataset/universal_3d"
# --- Init checkpoint ------------------------------------------------------
INIT_CKPT="checkpoints/stage1_5/balanced/mavt-stage1_5-balanced-step=0120000-val/loss=0.1238.ckpt"
mkdir -p logs checkpoints/stage3_dgx
# --- Environment ----------------------------------------------------------
if [ -d "$PROJECT_DIR/.venv" ]; then
source "$PROJECT_DIR/.venv/bin/activate"
elif [ -d "$HOME/miniconda3" ]; then
source "$HOME/miniconda3/etc/profile.d/conda.sh"
conda activate base
fi
export PYTHONPATH="$PROJECT_DIR/src:${PYTHONPATH:-}"
export TORCH_NCCL_BLOCKING_WAIT=1
export OMP_NUM_THREADS=8
export TOKENIZERS_PARALLELISM=false
# --- 3D data sanity -------------------------------------------------------
THREED_RENDERS="$UNIVERSAL_ROOT/3d_objects/renders"
N_3D=$(find -L "$THREED_RENDERS" -mindepth 1 -maxdepth 1 -type d 2>/dev/null | wc -l)
echo "========================================"
echo " MAVT Stage 3 — Image + Video + 3D"
echo " GPUs requested: 2"
echo " Image shards: $IMAGE_SHARDS_DIR"
echo " Video shards: $VIDEO_SHARDS_DIR"
echo " Universal root: $UNIVERSAL_ROOT"
echo " 3D objects: $N_3D renders"
echo " Init ckpt: $INIT_CKPT"
echo "========================================"
if [ "$N_3D" -lt 1000 ]; then
echo "[FATAL] Too few 3D objects ($N_3D). Expected ≥ 1000."
exit 1
fi
if [ ! -f "$INIT_CKPT" ]; then
echo "[FATAL] Init checkpoint not found: $INIT_CKPT"
exit 1
fi
# Use init_from_ckpt (soft restart, keeps model weights but resets optimizer).
# For Stage 3 init from Stage 1, this is the intended behavior — new threed
# poolers are created via prepare_poolers() during setup('fit').
CKPT_ARG="--model.init_from_ckpt $INIT_CKPT"
# --- Launch ---------------------------------------------------------------
srun --mpi=none python train.py fit \
--config configs/model/mavt_base.yaml \
--config configs/train/universal_data/stage3_universal.yaml \
--config configs/train/universal_data/stage3_paths.yaml \
--data.image_shards_dir "$IMAGE_SHARDS_DIR" \
--data.video_shards_dir "$VIDEO_SHARDS_DIR" \
--data.video_max_shards 100 \
--data.universal_data_root "$UNIVERSAL_ROOT" \
--data.active_modalities '["image", "video", "threed"]' \
--model.active_modalities '["image", "video", "threed"]' \
--data.image_resolution 256 \
--data.video_frames 16 \
--data.video_resolution 256 \
--data.triplane_res 256 \
--data.batch_size 6 \
--data.num_workers 6 \
--data.pin_memory true \
--data.persistent_workers true \
--data.prefetch_factor 3 \
--model.training_stage 3 \
--model.init_siglip2 true \
--model.use_lpips true \
--model.use_clip false \
--model.w_l1 1.0 \
--model.w_lpips 0.2 \
--model.w_sem 0.3 \
--model.w_temp 0.05 \
--model.warmup_steps 500 \
--model.total_steps 50000 \
--model.weight_decay 0.01 \
--model.grad_clip 1.0 \
$CKPT_ARG \
--trainer.devices 2 \
--trainer.strategy ddp_find_unused_parameters_true \
--trainer.precision bf16-mixed \
--trainer.max_steps 50000 \
--trainer.accumulate_grad_batches 2 \
--trainer.log_every_n_steps 50 \
--trainer.val_check_interval 1000 \
--trainer.logger.class_path lightning.pytorch.loggers.WandbLogger \
--trainer.logger.init_args.project mavt \
--trainer.logger.init_args.name stage3_threed