| #!/bin/bash |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
|
|
| 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" |
|
|
| |
| STUDENT_MODEL_PATH="./Models/DeepSeek-R1-Distill-Qwen-1.5B" |
| GPUS_PER_NODE=1 |
|
|
| |
| 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 |
|
|
| |
| SKIP_STUDENT_GEN=${SKIP_STUDENT_GEN:-0} |
| SKIP_LABEL=${SKIP_LABEL:-0} |
| SKIP_PPL=${SKIP_PPL:-0} |
|
|
| 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" |
|
|
| |
| |
| |
| 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 "" |
|
|
| |
| |
| |
| 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 |
|
|
| |
| |
| |
| 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 "======================================================" |
|
|