62 lines
3.9 KiB
Bash
Executable File
62 lines
3.9 KiB
Bash
Executable File
#!/usr/bin/env bash
|
||
# ============================================================================
|
||
# 结果驱动视频级切分 —— capstone 可复现实验(离线管线最后一步,薄脚本)
|
||
# ----------------------------------------------------------------------------
|
||
# 编排全部在 Python CLI(app.harness.video_split_cli)内联,本脚本只写死参数、
|
||
# 零参可复现(GPU 卡号除外)、日志即时不缓存。全部旋钮写死在 config/video_split.yaml。
|
||
#
|
||
# 用法:
|
||
# CUDA_VISIBLE_DEVICES=0 bash scripts/build_video_split.sh
|
||
# MODE=mock bash scripts/build_video_split.sh # smoke:仅校验两阶段装配
|
||
#
|
||
# ============================================================================
|
||
# 两阶段流程(CLI 内联自动按序跑,无需分开手动执行)
|
||
# ----------------------------------------------------------------------------
|
||
# ① 离线诊断(run_baseline_diagnosis)——LLM 重活,断点续跑幂等
|
||
# 对 baseline run(infer_adhoc,workspaces/default/harness.db 内错题)逐题跑
|
||
# 诊断瀑布,把 defect/lapse/infra/degraded 投影为 tier 信号,逐行 upsert 到
|
||
# harness.db 的 baseline_diagnosis 表(主键含 diag_fingerprint,重复运行幂等)。
|
||
# ② 冻结切分(build_split)——纯 code-controlled
|
||
# 读 canonical 基线预测 + 诊断信号 → 构建全视频画像 → 贪心选择 trainval/test →
|
||
# 视频组原子切三池 → 原子冻结 pools.json + 溯源 manifest → 六条防御断言 →
|
||
# McNemar 功效护栏(val 错题数达阈校验,不足 fail loud)。
|
||
#
|
||
# ============================================================================
|
||
# 标定程序(诊断跑完 → 用真实 T2 分布把 config/video_split.yaml 的占位值定死)
|
||
# ----------------------------------------------------------------------------
|
||
# 诊断落库后,读 baseline_diagnosis 表各 task_type 的 T2(defect) 计数,据此定值:
|
||
# 1. floor_k : 每个高信号题型取 floor = min(可用 defect 数, 3),避免把该类
|
||
# 信号全抽进 trainval(会让 test 失去代表性)。
|
||
# 2. n_trainval : trainval 目标视频数,取 ~100(总 300 视频约 1/3),给多样性
|
||
# 阶段留足填充预算,同时保证 test ≥ 2/3 保代表性。
|
||
# 3. epsilon : test 相对全局最大分布偏差,取 0.1(题型/难度逐桶容忍 10%)。
|
||
# 4. val_wrong_min : validation 池最少错题数,取 McNemar 功效阈 ≈ 20;切分后 val
|
||
# 错题不足此值 → 验证信号不可靠 → CLI fail loud。
|
||
# 5. report_floor : per-type 报告门限,题数 ≥ 27 的 task_type 才入 ε 约束(滤长尾)。
|
||
# ============================================================================
|
||
|
||
set -euo pipefail
|
||
|
||
cd "$(dirname "$0")/.."
|
||
|
||
export CUDA_VISIBLE_DEVICES="${CUDA_VISIBLE_DEVICES:-0}"
|
||
# 日志即时输出、绝不缓存(便于实时排错 / tmux attach 看进度 / 管道 tee 落盘)。
|
||
# 三重保险:PYTHONUNBUFFERED=1(环境级)+ python -u(命令级)+ loguru 走 stderr 同步写。
|
||
export PYTHONUNBUFFERED=1
|
||
|
||
# MODE=mock → --dry-run smoke:仅校验两阶段装配 + 打印指纹,不真调 LLM、不冻结产物。
|
||
DRY_RUN_FLAG=""
|
||
if [ "${MODE:-}" = "mock" ]; then
|
||
DRY_RUN_FLAG="--dry-run"
|
||
fi
|
||
|
||
# 诊断并发上限(asyncio.Semaphore):默认 12,可用 CONCURRENCY 环境变量覆盖。
|
||
# 注:LLM 熔断阈值/冷却是工程配置,走 .env(LLM_CIRCUIT_BREAKER_THRESHOLD / _COOLDOWN),
|
||
# 当前 threshold=32(连续 32 次失败触发熔断),不在本脚本设置。
|
||
CONCURRENCY="${CONCURRENCY:-12}"
|
||
|
||
# conda run --no-capture-output:不需 conda init(非交互脚本可跑),且实时直出不缓冲。
|
||
conda run --no-capture-output -n Video-Tree-TRM python -u -m app.harness.video_split_cli \
|
||
--config config/video_split.yaml \
|
||
--concurrency "${CONCURRENCY}" ${DRY_RUN_FLAG}
|