chore: harden generate_ar30.sh (drop no-op mock, add zero-gain early stop)
This commit is contained in:
Executable
+108
@@ -0,0 +1,108 @@
|
|||||||
|
#!/usr/bin/env bash
|
||||||
|
# AR 专项出题 — 循环直到生成够 30 题
|
||||||
|
#
|
||||||
|
# 用法:
|
||||||
|
# bash scripts/generate_ar30.sh # 正常运行(需真实 LLM/VLM 凭据)
|
||||||
|
# EARLY_STOP_ROUNDS=3 bash scripts/generate_ar30.sh # 放宽早停阈值
|
||||||
|
#
|
||||||
|
# 行为:
|
||||||
|
# - 每轮调用 generate-v2 --task-types "Action Recognition"
|
||||||
|
# - AR 走 grounded selector(候选池 + VLM 视觉打分),产出真实 near-miss 干扰项
|
||||||
|
# - 检查 output JSON 中的题目数
|
||||||
|
# - 不够 30 题则换 seed 重跑(断点续跑 + 追加写入)
|
||||||
|
# - 够了就停;连续 EARLY_STOP_ROUNDS 轮 0 产出也停(避免空跑满 MAX_ROUNDS)
|
||||||
|
#
|
||||||
|
# 注意:
|
||||||
|
# - 利用管线的断点续跑 + on_accept 逐题追加机制
|
||||||
|
# - 每轮换 seed 使采样多样化,但 output_dir 不变(追加到同一文件)
|
||||||
|
# - selector 让每题多次 VLM 调用:更慢更贵、AR 产量低于普通题型,属正常
|
||||||
|
# - 无 mock 模式:本管线不读 LLM_MOCK/VLM_MOCK,需 .env 配好真实 VL_LLM_* / JUDGE_LLM_*
|
||||||
|
|
||||||
|
set -euo pipefail
|
||||||
|
|
||||||
|
cd "$(dirname "$0")/.."
|
||||||
|
|
||||||
|
TARGET=30
|
||||||
|
CONFIG="${CONFIG:-config/question_gen_ar30.yaml}"
|
||||||
|
STORE_DIR="${STORE_DIR:-store}"
|
||||||
|
DB_PATH="${DB_PATH:-logs/question_gen_ar30.db}"
|
||||||
|
OUTPUT="store/questions/generated-ar30/accepted_questions.json"
|
||||||
|
MAX_ROUNDS=10
|
||||||
|
BASE_SEED=2024
|
||||||
|
EARLY_STOP_ROUNDS="${EARLY_STOP_ROUNDS:-2}" # 连续 N 轮 0 产出则提前停止
|
||||||
|
|
||||||
|
export PYTHONUNBUFFERED=1
|
||||||
|
export HF_HUB_OFFLINE=1
|
||||||
|
export TRANSFORMERS_OFFLINE=1
|
||||||
|
|
||||||
|
# shellcheck source=../.env
|
||||||
|
source .env
|
||||||
|
|
||||||
|
PYTHON="$(conda run -n Video-Tree-TRM which python)"
|
||||||
|
|
||||||
|
count_accepted() {
|
||||||
|
if [ -f "$OUTPUT" ]; then
|
||||||
|
"$PYTHON" -c "
|
||||||
|
import json, sys
|
||||||
|
try:
|
||||||
|
data = json.loads(open('$OUTPUT').read())
|
||||||
|
print(len(data))
|
||||||
|
except Exception:
|
||||||
|
print(0)
|
||||||
|
"
|
||||||
|
else
|
||||||
|
echo 0
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
echo "=== AR 出题循环 — 目标 ${TARGET} 题 ==="
|
||||||
|
echo "配置: ${CONFIG}"
|
||||||
|
echo "输出: ${OUTPUT}"
|
||||||
|
echo "早停: 连续 ${EARLY_STOP_ROUNDS} 轮 0 产出则停止"
|
||||||
|
echo ""
|
||||||
|
|
||||||
|
zero_streak=0
|
||||||
|
|
||||||
|
for round in $(seq 1 "$MAX_ROUNDS"); do
|
||||||
|
current=$(count_accepted)
|
||||||
|
echo "[Round ${round}/${MAX_ROUNDS}] 当前已有 ${current}/${TARGET} 题"
|
||||||
|
|
||||||
|
if [ "$current" -ge "$TARGET" ]; then
|
||||||
|
echo "✓ 已达目标 ${TARGET} 题,停止"
|
||||||
|
break
|
||||||
|
fi
|
||||||
|
|
||||||
|
remaining=$((TARGET - current))
|
||||||
|
seed=$((BASE_SEED + round - 1))
|
||||||
|
echo " 需要 ${remaining} 题,seed=${seed}"
|
||||||
|
|
||||||
|
"$PYTHON" tools/generate_questions.py generate-v2 \
|
||||||
|
--store-dir "$STORE_DIR" \
|
||||||
|
--config "$CONFIG" \
|
||||||
|
--db-path "$DB_PATH" \
|
||||||
|
--seed "$seed" \
|
||||||
|
--task-types "Action Recognition" \
|
||||||
|
2>&1 | tee -a "logs/generate_ar30_round${round}.log"
|
||||||
|
|
||||||
|
new_count=$(count_accepted)
|
||||||
|
gained=$((new_count - current))
|
||||||
|
echo " 本轮生成 ${gained} 题 (累计 ${new_count}/${TARGET})"
|
||||||
|
|
||||||
|
if [ "$gained" -eq 0 ]; then
|
||||||
|
zero_streak=$((zero_streak + 1))
|
||||||
|
echo " ⚠ 本轮 0 产出(连续 ${zero_streak}/${EARLY_STOP_ROUNDS})"
|
||||||
|
if [ "$zero_streak" -ge "$EARLY_STOP_ROUNDS" ]; then
|
||||||
|
echo "⚠ 连续 ${zero_streak} 轮 0 产出(selector/gate 可能持续拒题),提前停止"
|
||||||
|
break
|
||||||
|
fi
|
||||||
|
else
|
||||||
|
zero_streak=0
|
||||||
|
fi
|
||||||
|
echo ""
|
||||||
|
done
|
||||||
|
|
||||||
|
final=$(count_accepted)
|
||||||
|
echo "=== 完成:共 ${final} 道 AR 题 ==="
|
||||||
|
if [ "$final" -lt "$TARGET" ]; then
|
||||||
|
echo "⚠ 未达目标(${final}/${TARGET}),可能需要调整 retry_limit 或检查 gate 通过率"
|
||||||
|
fi
|
||||||
Reference in New Issue
Block a user