7.4 KiB
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降至xxfloats/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 的区别是什么?
- 如果检索片段本身没有答案,奖励函数会怎样处理?