dataset / scripts /experiments /run_exp2.sh
Albert711's picture
Upload folder using huggingface_hub
e6f9ec5 verified
Raw
History Blame Contribute Delete
5.68 kB
#!/bin/bash
# 实验二:证明"盲目蒸馏会传递教师的幻觉(Confidently Wrong)"
#
# 两阶段流程:
# 阶段一(需要 GPU):用 main_generation.py(Ray + FSDP + vLLM)生成学生回复
# 阶段二(只需 CPU + 教师 vLLM API):打标签、PPL计算、分组、教师续写、统计
#
# 用法:
# bash scripts/experiments/run_exp2.sh
#
# 如果学生生成已完成,可以跳过阶段一,直接运行阶段二:
# SKIP_STUDENT_GEN=1 bash scripts/experiments/run_exp2.sh
set -e
# ============================================================
# 环境配置
# ============================================================
export PATH="./conda/envs/verl_opd_topk/bin:$PATH"
export PYTHONPATH="./verl-distillation-ori:$PYTHONPATH"
PROJECT_PATH=./verl-distillation-ori
cd $PROJECT_PATH
# ============================================================
# 参数配置
# ============================================================
# 数据
DATA_PATH="$PROJECT_PATH/data/deepmath_new/deepmath_new_train.parquet"
SAMPLE_SIZE=2000
OUTPUT_DIR="$PROJECT_PATH/exp2_results"
# 学生模型(阶段一:main_generation.py 使用)
STUDENT_MODEL_PATH="./Models/DeepSeek-R1-Distill-Qwen-1.5B"
GPUS_PER_NODE=1
# 教师模型(阶段二:vLLM API 使用)
TEACHER_IP_POOL="xx.xxx.xx.xxx"
TEACHER_MODEL_NAME="Skywork-OR1-7B"
# 分桶参数
N_BINS=4
SPLIT_METHOD="quartile"
# 续写参数
N_CONTINUATIONS=4
TEACHER_TEMPERATURE=0.6
TRUNCATE_RATIO=0.6
MAX_TOKENS=32768
# 跳过标志(已完成的步骤可设为 1 跳过)
SKIP_STUDENT_GEN=${SKIP_STUDENT_GEN:-0} # 1=跳过学生生成(已有 student_gen.parquet)
SKIP_LABEL=${SKIP_LABEL:-0} # 1=跳过打标签(已有 student_gen_labeled.parquet)
SKIP_PPL=${SKIP_PPL:-0} # 1=跳过PPL计算(已有 wrong_samples_with_ppl.parquet)
SAMPLE_PATH="$OUTPUT_DIR/train_sample.parquet"
STUDENT_GEN_PATH="$OUTPUT_DIR/student_gen.parquet"
echo "======================================================"
echo "实验二:证明盲目蒸馏会传递教师幻觉"
echo "======================================================"
echo "数据: $DATA_PATH (采样 $SAMPLE_SIZE 条)"
echo "学生模型: $STUDENT_MODEL_PATH"
echo "教师模型: $TEACHER_MODEL_NAME"
echo "分桶: ${N_BINS}组(${SPLIT_METHOD}), 续写${N_CONTINUATIONS}次"
echo "输出目录: $OUTPUT_DIR"
echo ""
mkdir -p "$OUTPUT_DIR"
# ============================================================
# 阶段一 Step 0:采样训练集子集
# ============================================================
if [ "$SKIP_STUDENT_GEN" != "1" ]; then
echo "------------------------------------------------------"
echo "阶段一 Step 0: 采样训练集子集(${SAMPLE_SIZE} 条)"
echo "------------------------------------------------------"
python3 scripts/experiments/exp2_teacher_hallucination.py \
--step prepare_data \
--data_path "$DATA_PATH" \
--sample_size $SAMPLE_SIZE \
--output_dir "$OUTPUT_DIR"
echo ""
# ============================================================
# 阶段一 Step 1:main_generation.py 生成学生回复(需要 GPU)
# ============================================================
echo "------------------------------------------------------"
echo "阶段一 Step 1: 学生模型生成回复(Ray + FSDP + vLLM)"
echo "------------------------------------------------------"
python3 -m verl.trainer.main_generation \
--config-path "$PROJECT_PATH/scripts/experiments" \
--config-name exp2_generation \
data.path="$SAMPLE_PATH" \
data.output_path="$STUDENT_GEN_PATH" \
model.path="$STUDENT_MODEL_PATH" \
trainer.n_gpus_per_node=$GPUS_PER_NODE
echo "学生生成完成: $STUDENT_GEN_PATH"
echo ""
else
echo "[跳过阶段一] 使用已有学生生成结果: $STUDENT_GEN_PATH"
echo ""
fi
# ============================================================
# 阶段二:教师分析(不需要 GPU)
# ============================================================
echo "------------------------------------------------------"
echo "阶段二: 教师分析(打标签 + PPL + 分组 + 续写 + 统计)"
echo "------------------------------------------------------"
# 构造跳过参数
SKIP_ARGS=""
if [ "$SKIP_LABEL" == "1" ]; then
SKIP_ARGS="$SKIP_ARGS --skip_label"
fi
if [ "$SKIP_PPL" == "1" ]; then
SKIP_ARGS="$SKIP_ARGS --skip_ppl"
fi
python3 scripts/experiments/exp2_teacher_hallucination.py \
--step analyze \
--student_gen_path "$STUDENT_GEN_PATH" \
--student_model_path "$STUDENT_MODEL_PATH" \
--teacher_ip_pool "$TEACHER_IP_POOL" \
--teacher_model_name "$TEACHER_MODEL_NAME" \
--n_bins $N_BINS \
--split_method "$SPLIT_METHOD" \
--truncate_ratio $TRUNCATE_RATIO \
--n_continuations $N_CONTINUATIONS \
--teacher_temperature $TEACHER_TEMPERATURE \
--max_tokens $MAX_TOKENS \
--output_dir "$OUTPUT_DIR" \
$SKIP_ARGS
echo ""
echo "======================================================"
echo "实验完成!结果保存在 $OUTPUT_DIR"
echo " train_sample.parquet 采样的训练子集"
echo " student_gen.parquet 学生生成结果"
echo " student_gen_labeled.parquet 打标签后的结果"
echo " wrong_samples_with_ppl.parquet 错误样本 + 教师PPL + 截断前缀"
echo " teacher_continuation_results.parquet 教师续写结果 + 恢复率"
echo " summary_stats.json 最终统计(四组恢复率对比)"
echo "======================================================"