代码:https://github.com/Continual-Intelligence
脚本命令用法:knowledge-incorporation/README.md
生成self-edit数据
脚本:sbatch knowledge-incorporation/scripts/make_squad_data.sh
vllm serve启动Qwen2.5-7B模型的服务。
执行self-edit合成:
--k是指定每篇文章生成多少个self-edit
Squad数据(knowledge-incorporation/data/squad_train.json):
默认用的这个prompt:
(如果用的instruct model,只需要按照该model的标签和role来写即可:)
调用vllm api,生成一批self-edit:
(所有文章数n,每篇生成k个self-edit,一共是n*k个prompt,其中每个文章的k个prompt是相同的)(最后输出到文件)
对self-edit进行SFT, 在QA上评测正确率
sbatch knowledge-incorporation/scripts/TTT_server.sh
启动vllm加载模型:
启动ZMQ服务,
该ZMQ服务接受一组参数:
用train_sequences对model进行lora SFT训练,用训练前和训练后的模型分别评测eval_questions,得到2组正确率指标;
用peft.get_peft_model从base model拿到lora model:
使用transformers.Trainer,trainer.train()训练lora模型:
将训练完的模型存到文件里。加载文件至vllm(给vllm服务发送/v1/load_lora_adapter请求):
评测完毕后,再将vllm的lora模型给卸掉(卸掉后vllm上是base model):
评测时,只输入Q,不输入self-edit:
评测调用vllm的/v1/completions,吧model名称传入进去:
评测用的prompt,包含Q、A、模型生成的值:
用gpt-4.1做的评测:
可对比base模型和adaper模型在这批Q上的答对率,分出高下。
返回几个指标:
accuracy: 答对的题数/总题数
texts: 所有题目的推理结果
correct: 所有题目的对错(true/false)
adapter_gain: adapter相比base model的增益,即adapter_acc - base_acc
gains: 1/(-1)/0的数组,该题目adapter对了base错了,则为1;adapter错base对,则为-1;否则为0
将self-edit读入并整理,调用上面的SFT服务进行Fine tune和评测:
sbatch knowledge-incorporation/scripts/query_server.sh
每个文章生成了多组self-edit:
每组edit,是1.2.3.4...这样一条一条的,每条用\n分隔:
选项SPLIT_NEWLINES控制是否将每组的1、2、3、4用\n分割后,当成1个batch来喂给SFT模型去训练;默认是true,当成1个batch。如果设为false,则这组的4条信息整个当成1条样本交给SFT模型去训练。
注意:除了self-edit,还要把原文(即context)也加入到SFT训练数据集里:
注释里也强调了这点:
EVAL_TIMES控制对每组self-edit,进行几次evalute。每次evalute包括了SFT train和QA评判。(这里SFT train有些浪费?我感觉每组self-edit只做1次SFT train,QA评判多次,就可以了?)
构造RL训练数据集:
python3 knowledge-incorporation/src/EM/build_SFT_dataset.py <path/to/result/of/run.json>
读取上一步存盘的结果文件。把prompt(指令+原始文章内容)及其在SFT评测中表现最好的k(默认k=1)个self-edit,存入文件。
跑训练
sbatch knowledge-incorporation/scripts/train_SFT.sh
上一步输出的结果是jsonl文件:
prompt是指令+原文;completion是self-edit(在多个self-edit里,SFT后评测得分最高的那个)。
使用了accelerate:
--deepspeed_config_file内容:
综上,用了:多卡,ZERO-3, offload,bf16,lora
上面的jsonl数据文件,可以被datasets.load_dataset直接加载至dataset:
用的trl.SFTTrainer:
将lora参数和base model合并至一个model:
保存:
Continoual实验:
sbatch knowledge-incorporation/scripts/continual_self_edits.sh
最外面:多次实验(N_SEQUENCES=8),每次采样一批文章,从同一个模型ckpt开始做continue training,统计这N组实验的平均效果。
里面:每次实验,采样N_DATAPOINTS篇文章;每篇文章,生成self-edit,做SFT训练更新,统计训练过的文章所对应的QA在当前模型上的正确率。这篇文章SFT训练更新后的lora模型,被merge进当前model,生成新的model ckpt,作为下一篇文章的加载模型。