| #!/usr/bin/env bash |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| set -euo pipefail |
|
|
| ROOT=PROJECT_ROOT |
| MANIFEST_DIR="$ROOT/data/sft_manifests" |
| PRETRAINED_LORA="$ROOT/checkpoints/SFT/sft_v2/best" |
| MODEL_PATH="$ROOT/models/Qwen2.5-VL-3B-Instruct" |
| OUTPUT_DIR="$ROOT/checkpoints/SFT" |
| EXPERIMENT="sft_v3" |
|
|
| MAX_PIXELS=602112 |
|
|
| BATCH_SIZE=2 |
| GRAD_ACCUM=4 |
|
|
| DEBUG_FLAGS="" |
| if [[ "${1:-}" == "--debug" ]]; then |
| DEBUG_FLAGS="--debug --debug_samples 64" |
| EXPERIMENT="sft_v3_debug" |
| BATCH_SIZE=2 |
| GRAD_ACCUM=4 |
| echo "=== DEBUG / SMOKE TEST MODE ===" |
| fi |
|
|
| |
| if [[ ! -d "$PRETRAINED_LORA" ]]; then |
| echo "⚠ SFT v2 checkpoint 不存在: $PRETRAINED_LORA" |
| echo " → 将从 pretrain_v2/stage_b/best_model 冷启动" |
| PRETRAINED_LORA="$ROOT/checkpoints/pretrain_v2/stage_b/best_model" |
| fi |
|
|
| |
| if [[ ! -f "$MANIFEST_DIR/nexar_train.json" ]]; then |
| echo "Manifests not found — generating..." |
| python -m training.SFT.make_split_manifest \ |
| --nexar_root "$ROOT/NEXAR_COLLISION/dataset" \ |
| --dada_root "$ROOT/DADA-2000" \ |
| --out_dir "$MANIFEST_DIR" |
| fi |
|
|
| echo "" |
| echo "=== SFT v3 训练 ===" |
| echo " 改动汇总 vs v2:" |
| echo " belief_strategy : mean_pool → attention_pool" |
| echo " curriculum : False → True" |
| echo " nll_weight : 0.5 → 0.3" |
| echo " vlm_lr_multiplier: 0.1 → 0.05" |
| echo " num_epochs : 10 → 12" |
| echo " tta_head_lr : 1e-3 → 2e-3" |
| echo "" |
| echo " 热启动自: $PRETRAINED_LORA" |
| echo " 输出至 : $OUTPUT_DIR/$EXPERIMENT" |
| echo "" |
|
|
| python -m training.SFT.trainer \ |
| --manifest_dir "$MANIFEST_DIR" \ |
| --model_name "$MODEL_PATH" \ |
| --pretrained_lora "$PRETRAINED_LORA" \ |
| --output_dir "$OUTPUT_DIR" \ |
| --experiment_name "$EXPERIMENT" \ |
| --belief_strategy attention_pool \ |
| --num_epochs 12 \ |
| --batch_size $BATCH_SIZE \ |
| --gradient_accumulation_steps $GRAD_ACCUM \ |
| --learning_rate 1e-4 \ |
| --tta_head_lr 2e-3 \ |
| --vlm_lr_multiplier 0.05 \ |
| --weight_decay 0.01 \ |
| --max_grad_norm 1.0 \ |
| --nll_weight 0.3 \ |
| --max_pixels $MAX_PIXELS \ |
| --no_auto_resume \ |
| --use_wandb \ |
| $DEBUG_FLAGS |
|
|
| echo "" |
| echo "✅ SFT v3 训练完成" |
| echo " Checkpoint: $OUTPUT_DIR/$EXPERIMENT/best" |
| echo "" |
| echo "下一步 — 重新生成 belief 缓存:" |
| echo " python -m training.Policy.cache_beliefs \\" |
| echo " --sft_checkpoint $OUTPUT_DIR/$EXPERIMENT/best \\" |
| echo " --label_dir data/policy_labels \\" |
| echo " --output_dir data/belief_cache_v3" |
| echo "" |
| echo "然后用新缓存重训 policy:" |
| echo " 修改 train_policy_v3.sh 中 CACHE_DIR=data/belief_cache_v3" |
| echo " 并将 SFT_CHECKPOINT 改为 $OUTPUT_DIR/$EXPERIMENT/best" |
|
|