模型训练1
训练sft准备
考虑到该大模型已经进行过预训练,因此我们在本次模型训练中直接从sft过程开始。
基于上文中的模型训练框架,首先编写 ds_sft.sh
的脚本来保证训练。
accelerate launch src/train_sft.py \
--model_name_or_path /home/mnt/workspace/model/chatglm2-6b-32k \
--dataset judgement \
--do_train \
--finetuning_type lora \
--output_dir /home/mnt/workspace/trained \
--overwrite_cache \
--per_device_train_batch_size 1 \
--gradient_accumulation_steps 1 \
--lr_scheduler_type cosine \
--logging_steps 10 \
--save_steps 1000 \
--learning_rate 1e-3 \
--num_train_epochs 15.0 \
--plot_loss \
--fp16
设置在记录日志 log
文件中每进行十步进行一次简单记录,并且将所有的模型参数在1000次进行一个简单的保存,其余简单参数如上述我们构建的代码所示,初始学习率调整为1e-3
,训练轮次调整为15次,数据集选择我们之前处理好的的数据集jugment
。
jugment
内的内容大致如下:
部分敏感的内容已经被用xxxx处理
{
"instruction": "提取下面这份审判书里的法律条文相关的信息:xxxxxx\t执行案件结案通知书\t(2021)xxxxx\txxxxxxx\t元氏县通顺塑业有限公司\t关于河北省烟草公司石家庄市公司申请执行xxxxxxxxx,本院于2021年04月13日立案执行,xxxx人民法院(2020)x0132xxx1329号民事判决书已发生法律效力,权利人xxxxxxxxxxxxxxxxxxxxx司要求被执行人按生效判决的义务履行。\t本案执行过程中,被执行人已按生效判决的义务全部履行。本院(2020)xx0132xx1329号民事判决书确定的义务已履行完毕,依照《最高人民法院关于人民法院执行问题若干问题的规定(试行)》第64条规定,通知如下:\t本院(2021)xxx0132执xxxx号房屋租赁合同纠纷一案执行完毕。\t特此通知。\txxxxx",
"input": "",
"output": "抽取出的法律条文依据和内容如下:\n\n1. 最高人民法院关于人民法院执行问题若干问题的规定(试行)第xxx条:\n - 法律条文依据:依照《最高人民法院关于人民法院执行问题若干问题的规定(试行)》第xxx条规定\n - 法律条文内容:本案执行完毕,特此通知。\n\n2. (2021)xxxxxx执xxxx号房屋租赁合同纠纷一案:\n - 法律条文依据:(2021)xxxx执xxx号房屋租赁合同纠纷一案\n - 法律条文内容:本案执行完毕。\n\n3. 元氏县人民法院(2020)xxxxxxxxxxx号民事判决书:\n - 法律条文依据:xxxxxx(2020)xxxxxxxxxxxx民事判决书\n - 法律条文内容:被执行人已按生效判决的义务全部履行,xxxxxxxxxxxxx号民事判决书确定的义务已履行完毕。\n\n以上是根据给定判决书内容抽取出的相关法律条文依据和条文内容。"
},
随后我们部署在服务器上执行ds_sft
,进行运行,并持续等待结果,整个模型的训练过程会将模型中间训练的若干信息保存到 /home/mnt/workspace/trained
目录下,这些基础的操作都是在整个代码目录下的utils
包中的函数和tramsformers
库中的相关函数实现的。
该目录在一次训练下会包括:
adapter_model.bin
微调过后模型的参数,日后导入时候采用。
adapter_config.json
微调后的模型配置文件,需要和上述文件一起用于导入进模型的应用中。
all_results.json
和 train_results.json
经过这次模型训练后最终的结果,包括损失,运行时间等,如下:
{
"epoch": 15.0,
"train_loss": 0.18230768630901972,
"train_runtime": 1412.5561,
"train_samples_per_second": 2.124,
"train_steps_per_second": 0.531
}
finetuning_args.json
参数配置用于对神经网络模型进行LoRA(Low-Rank Adaptation)的微调。包括LoRA要运用的模块等信息。
{
"finetuning_type": "lora",
"lora_alpha": 32.0,
"lora_dropout": 0.1,
"lora_rank": 8,
"lora_target": [
"query_key_value",
"dense_h_to_4h",
"dense_4h_to_h"
],
"name_module_trainable": "mlp,self_attention",
"num_hidden_layers": 32,
"num_layer_trainable": 3
}
trainer_log.jsonl
调试日志,根据我们的.sh
文件可知,我们每10步在log日志中记录一次相关信息,其中的total_steps
是根据批次和训练轮次来进行计算后的结果,在本次训练中我们共有200条使用的数据,共分为50个批次,则总批次 =
50
×
15
=
750
50\times15=750
50×15=750 次。并且通过估算剩余时间进行一个简单的保存。
计算每步训练的平均时间:
a r e r a g e _ t i m e _ p e r _ s t e p = e l a p s e d _ t i m e _ i n _ s e c o n d s c u r r e n t _ s t e p s arerage\_time\_per\_step = \frac{elapsed\_time\_in\_seconds}{current\_steps} arerage_time_per_step=current_stepselapsed_time_in_seconds
然后,估算剩余时间:
r e m a i n i n g _ s t e p s = t o t a l _ s t e p s − c u r r e n t _ s t e p s remaining\_steps = total\_steps-current\_steps remaining_steps=total_steps−current_steps
r e m a i n i n g _ t i m e _ i n _ s e c o n d s = r e m a i n i n g _ s t e p × a v e r a g e _ t i m e _ p e r _ s t e p remaining\_time\_in\_seconds = remaining\_step\times average\_time\_per\_step remaining_time_in_seconds=remaining_step×average_time_per_step
最后,将剩余时间转换为 “小时:分钟:秒” 的格式。
最后,将剩余时间转换为 “小时:分钟:秒” 的格式。
示例:
{"current_steps": 10, "total_steps": 750, "loss": 1.1622, "reward": null, "learning_rate": 0.001, "epoch": 0.2, "percentage": 1.33, "elapsed_time": "0:00:59", "remaining_time": "1:13:25"}
trainer_state.json
文件存储了本次训练的有用信息以及损失变化历史以及其他有用的信息
训练sft结果
训练过后根据其损失和学习率的变化数值,可以绘制对应的变化图像:
损失与迭代次数的图像:
学习率与迭代次数的图像:
损失与step的图像:
学习率与step的图像:
初步感觉效果比较不错。