Files
Video-Tree-TRM5/scripts/train_videomme.sh
T

89 lines
3.4 KiB
Bash
Executable File
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
#!/usr/bin/env bash
# ============================================================================
# Video-MME 900 自进化训练 —— 消费 video-split 冻结切分(capstone 训练)
# ----------------------------------------------------------------------------
# 自包含实验记录:写死全部参数,零参可复现(GPU 卡号除外)。
#
# Phase 0: 建 adhoc-baseline seedextract infer_adhoc 去重 baseline.db +
# 携带 video-split 冻结 pools.json / manifest;已存在则跳过)
# Phase 1: train --fresh --seed adhoc-baseline3 epochsglobal 冻结切分)
#
# 用法(长时训练,建议 tmux 便于 attach 看实时进度):
# tmux new-session -d -s train_videomme "CUDA_VISIBLE_DEVICES=0 bash scripts/train_videomme.sh 2>&1 | tee logs/train_videomme.log"
# 或直接: CUDA_VISIBLE_DEVICES=0 bash scripts/train_videomme.sh
#
# 日志三重保险即时输出(绝不缓存): PYTHONUNBUFFERED=1(环境级)+ python -u(命令级)
# + loguru 走 stderr 同步写。tee 落盘不影响实时性。
#
# 前置(务必先做,见 research-wiki/reviews/2026-07-16-preflight-final-review.md:
# 1. .env REDIS_CACHE_TTL 为正整数(0 会被 WP4 fail-loud 拒绝启动)
# 2. workspaces/video-split/pools.json 已冻结(build_video_split.sh 产出)
# 3. workspaces/default/harness.db 含 infer_adhoc 基线预测
# ============================================================================
set -euo pipefail
cd "$(dirname "$0")/.."
export CUDA_VISIBLE_DEVICES="${CUDA_VISIBLE_DEVICES:-0}"
export HF_HUB_OFFLINE=1
export TRANSFORMERS_OFFLINE=1
export PYTHONUNBUFFERED=1
set -a
source .env
set +a
PYTHON="$(conda run -n Video-Tree-TRM which python)"
SEED_NAME="adhoc-baseline"
SPLIT_DIR="workspaces/video-split"
BASELINE_DB="workspaces/default/harness.db"
# ── Phase 0: 建 seed(携带冻结 pools.json)──
if [[ ! -d "store/seeds/${SEED_NAME}" ]]; then
echo "=== Phase 0: 建 seed ${SEED_NAME}(携带 video-split 冻结切分)==="
"${PYTHON}" -u -c "
from pathlib import Path
import tempfile
from app.harness.store import extract_run_db, init_seed
split_dir = Path('${SPLIT_DIR}')
pools = split_dir / 'pools.json'
manifest = split_dir / 'split_manifest.json'
assert pools.exists(), f'冻结切分不存在: {pools}(先跑 build_video_split.sh'
tmp = Path(tempfile.mkdtemp()) / 'baseline.db'
# canonical 每 question_id 取首行(902→900),对齐冻结切分口径
extract_run_db(Path('${BASELINE_DB}'), tmp, 'infer_adhoc', dedupe_per_question=True)
init_seed(
store_dir=Path('store'),
name='${SEED_NAME}',
skills_dir=Path('store/skills/v1'),
prompts_dir=Path('store/prompts/v1'),
baseline_db=tmp,
baseline_run_id='infer_adhoc',
parent=None,
description='Video-MME adhoc baseline + video-split 冻结三池(tier 感知 val_ratio=0.4',
pools_json=pools,
split_manifest=manifest,
)
tmp.unlink()
print('Seed created: store/seeds/${SEED_NAME}/')
"
else
echo "=== Phase 0: seed ${SEED_NAME} 已存在,跳过 ==="
fi
# ── Phase 1: Train ──
echo "=== Phase 1: Train (3 epochs, Video-MME 900 global 冻结切分) ==="
"${PYTHON}" -u main.py \
--config config/train_videomme.yaml \
--fresh \
--seed "${SEED_NAME}"
echo "=== 训练完成 ==="
echo "结果查看:"
echo " cat workspaces/train-videomme/analyses/final_test_eval.json"
echo " sqlite3 workspaces/train-videomme/harness.db 'SELECT * FROM dual_metric'"