minimind/docs/resume_experiment_plan.md

7.4 KiB
Raw Blame History

SearchShortQA Resume Experiment Plan

目标:把项目从“跑通过训练流程”推进到“有业务场景、有工程优化、有可复现实验、有简历指标”的状态。所有数字以服务器实际日志和评测结果为准,不提前编造。

目标简历叙事

项目名称建议:

SearchShortQA:面向企业知识库的搜索增强短问答对齐系统

核心叙事:

基于公开 QA/RAG 数据构造 SearchShortQA 数据集,训练 64M baseline 与 100M/300M 级 Decoder-only 模型;将训练后端从 DDP 升级为 DeepSpeed ZeRO-2,并通过 SFT + GRPO 优化短答案准确率、引用合法率和 JSON 格式稳定性。

必跑实验

ID 实验名 目的 产出指标
E0 searchlm64_sft_baseline 保留你已有 64M 作为 baseline loss、F1、引用合法率、格式正确率、延迟
E1 searchlm100_pretrain_ds 验证 DeepSpeed 预训练链路 loss、吞吐、峰值显存、checkpoint 恢复
E2 searchlm100_sft_search SearchShortQA SFT 冷启动 dev F1、EM、引用合法率、格式正确率
E3 searchlm100_grpo_search 对比 SFT 与 GRPO reward、F1、引用合法率、格式正确率提升
E4 searchlm300_pretrain_ds 简历主模型预训练 DeepSpeed 7卡训练日志、峰值显存、有效 batch
E5 searchlm300_sft_grpo 简历主模型业务对齐 主结果表,写入简历
E6 searchlm300_mla_ablation 注意力结构消融 KV cache 理论压缩、吞吐/显存/效果变化
E7 ddp_vs_zero2_100m 工程优化对比 DDP vs ZeRO-2 峰值显存、可用 batch、吞吐
E8 bm25_vs_embedding_negative 数据构造消融 hard negative 命中率、SFT/GRPO dev 指标变化

如果时间不够,优先完成 E0-E5。E6/E7 是加分项。

服务器运行建议

目录约定:

mkdir -p logs reports outputs/search_shortqa

DeepSpeed 主链路:

cd trainer

deepspeed --num_gpus=7 train_pretrain_deepspeed.py \
  --model_profile SearchLM-300M \
  --data_path ../dataset/pretrain_t2t_mini.jsonl \
  --save_weight pretrain_searchlm \
  --dtype float16 \
  --batch_size 8 \
  --accumulation_steps 8

deepspeed --num_gpus=7 train_full_sft_deepspeed.py \
  --model_profile SearchLM-300M \
  --data_path ../dataset/search_shortqa/search_shortqa_sft.jsonl \
  --from_weight pretrain_searchlm \
  --save_weight full_sft_search \
  --dtype float16 \
  --batch_size 4 \
  --accumulation_steps 4

deepspeed --num_gpus=7 train_search_grpo_deepspeed.py \
  --model_profile SearchLM-300M \
  --data_path ../dataset/search_shortqa/search_shortqa_train.jsonl \
  --from_weight full_sft_search \
  --save_weight search_grpo \
  --num_generations 6 \
  --dtype float16 \
  --batch_size 1 \
  --accumulation_steps 4

断点续训:

cd trainer

deepspeed --num_gpus=7 train_search_grpo_deepspeed.py \
  --model_profile SearchLM-300M \
  --data_path ../dataset/search_shortqa/search_shortqa_train.jsonl \
  --from_weight full_sft_search \
  --save_weight search_grpo \
  --num_generations 6 \
  --dtype float16 \
  --batch_size 1 \
  --accumulation_steps 4 \
  --save_interval 25 \
  --from_resume 1

注意:

  • 恢复时 --epochs 是总 epoch,不是剩余 epoch。
  • 严格连续训练时不要改变 GPU 数量、batch、accumulation、数据文件和模型结构。
  • ../checkpoints/ 是完整训练状态;../out/ 是推理权重。在线 GPU 环境要保证这两个目录都在持久磁盘上。

3090 不支持 bf16 的完整高效路径时,优先用 float16。如果 GRPO 显存吃紧,先降:

  • --batch_size 1
  • --num_generations 4
  • --max_seq_len 768
  • --max_gen_len 128

日志与评测产物

训练日志解析:

python scripts/parse_train_log.py \
  --log logs/searchlm300_grpo_search.log \
  --experiment searchlm300_grpo_search \
  --output reports/searchlm300_grpo_search_train.json \
  --csv reports/searchlm300_grpo_search_train.csv \
  --drop_records

离线预测:

python scripts/predict_search_shortqa.py \
  --model_profile SearchLM-300M \
  --data dataset/search_shortqa/search_shortqa_dev.jsonl \
  --output outputs/search_shortqa/searchlm300_grpo_dev_pred.jsonl \
  --save_dir out \
  --weight search_grpo \
  --load_from model \
  --dtype float16

评测并落盘:

python scripts/eval_search_shortqa.py \
  --data dataset/search_shortqa/search_shortqa_dev.jsonl \
  --pred outputs/search_shortqa/searchlm300_grpo_dev_pred.jsonl \
  --by id \
  --experiment searchlm300_grpo_search \
  --json_output reports/searchlm300_grpo_search_eval.json \
  --bad_cases_output reports/searchlm300_grpo_search_bad_cases.jsonl

聚合报告:

python scripts/aggregate_experiment_report.py \
  --inputs reports/searchlm64_sft_baseline_train.json reports/searchlm64_sft_baseline_eval.json reports/searchlm300_grpo_search_train.json reports/searchlm300_grpo_search_eval.json \
  --baseline searchlm64_sft_baseline \
  --output_md reports/search_shortqa_experiment_report.md \
  --output_csv reports/search_shortqa_experiment_report.csv

业务 Demo:

streamlit run scripts/search_shortqa_demo.py -- \
  --data dataset/examples/search_shortqa_raw_demo.jsonl

数据构造消融:

python scripts/build_search_shortqa_dataset.py \
  --inputs dataset/raw/dureader_train.jsonl \
  --output_dir dataset/search_shortqa_bm25 \
  --negative_mining bm25

python scripts/build_search_shortqa_dataset.py \
  --inputs dataset/raw/dureader_train.jsonl \
  --output_dir dataset/search_shortqa_embedding \
  --negative_mining embedding \
  --embedding_model BAAI/bge-small-zh-v1.5

简历指标填充模板

跑完实验后,把报告里的数字填进去:

构建 SearchShortQA 搜索增强短问答数据集,统一问题、检索片段、短答案和引用来源字段;基于 DeepSpeed ZeRO-2 在 7×RTX3090 上训练 300M 级 Decoder-only 模型,有效 batch size 为 xx,峰值显存为 xxGB。

设计 GRPO 奖励函数,综合答案 F1、引用合法率、JSON 格式正确率、简洁性和重复惩罚;相比 SFT baseline,dev 集答案 F1 从 xx.x% 提升至 xx.x%,引用合法率从 xx.x% 提升至 xx.x%,格式正确率提升至 xx.x%。

对比 GQA/MQA/MLA 注意力结构,MLA 将 KV Cache 理论占用由 xx 降至 xx floats/token/layer,压缩 xx.x%,并在 SearchShortQA 长上下文评测中对比吞吐、显存和答案质量。

构建可交互 SearchShortQA Demo,支持检索片段编辑、模型 JSON 输出检查、引用合法性高亮和 reward 分解,用于 bad case 分析和业务侧效果展示。

64M 模型处理

不需要直接废弃 64M。它最适合做 baseline:

  • 如果结构、tokenizer、hidden/layer/head 配置没变,只是把 DDP 改成 DeepSpeed,不需要重新预训练。
  • 如果改成 SearchLM-100M/300M、MLA/MoE、新 FFN 或新 tokenizer,需要重新预训练。
  • 简历写法是“64M baseline + 300M 主模型 + 结构/训练后端消融”,不要把 64M 写成主成果。

面试可追问点

准备回答这些问题:

  • 为什么 7×3090 不从零训练 2B?
  • DeepSpeed ZeRO-2 比 DDP 省在哪里,ZeRO-1/2/3 区别是什么?
  • GRPO 为什么比 PPO 简化,reference model 和 KL 惩罚分别做什么?
  • 引用合法率如何定义,如何避免模型凭空编 citation?
  • MLA 的 KV cache 为什么能降,和 GQA/MQA 的区别是什么?
  • 如果检索片段本身没有答案,奖励函数会怎样处理?