zhiyun.xu
update demo
d573b56
|
raw
history blame
8.66 kB

悟了悟了模型训练

一、前言

增量预训练(Incremental Pretraining)

增量预训练是指在一个已经预训练过的模型基础上,引入新的数据或特定领域的数据来进一步训练模型,旨在使模型适应新的领域或任务。训练数据不需要标注,模型从中学习通用特征和先验知识。

特点

  • 数据规模大:通常需要大量的新数据,这些数据可能与原始预训练数据分布不同。
  • 目标:增强模型的整体能力和适应性,使其能够处理更广泛的任务和数据。
  • 应用场景:适用于模型需要覆盖新的领域或任务时。例如,一个通用的语言模型需要适应医疗领域的文本处理。

指令微调(Instruction Fine-tuning)

指令微调通过在特定任务的数据上进一步训练预训练模型,使其在特定任务上表现更好。指令微调特别关注模型对特定指令或任务的理解和执行能力。

特点

  • 数据规模小:通常使用较小的数据集,专注于某个具体任务的数据,如情感分析、文本分类等。
  • 目标:优化模型在特定任务上的表现,使其能够更好地理解和执行特定指令。
  • 应用场景:适用于模型已经具有足够的通用知识,但需要在特定任务上进行优化时。例如,一个通用的语言模型需要在情感分析任务上表现更好。

一般而言,做"领域知识注入"时,使用指令微调会比增量预训练的效率更高,另外一般大模型泛化性已经比较好了,直接加个RAG也能用,所以如果是基于chat模型做些角色扮演、聊天机器人、学习某种风格等简单任务用微调的方式最好。

但如果你有海量的特定领域数据,或者想让模型学会某个行业深入的知识,可以试试看增量预训练。前提还是得有大量高质量的领域数据,可以是未标注过的,因为模型是去学数据的分布(续写能力)。

本模型是基于xtuner训练,基于此前数据制作一栏的数据即可直接训练,数据格式也可以参考官方文档xtuner数据集格式和loss计算

二、模型训练

配置文件

增量预训练和指令微调训练流程都差不多,通过使用不同的配置文件来加载对应模型和数据即可。

一般要修改的就是base模型、数据源、训练超参数,每个参数的意义可以看官方的config介绍

增量预训练

增量预训练配置文件可以参考 wulewule/xtuner_config/pretrain/internlm2_5-1_8b-chat_pretrain.py ,下面列出几个重要的

+ pretrained_model_name_or_path = '/root/models/internlm2_5-1_8b-chat' # 修改成自己的模型路径
+ data_dir="/root/wulewule/data"
+ data_files = [f'{data_dir}/heishenghua_pretraining.jsonl'] # 改成自己的数据路径
+ # prompt_template = PROMPT_TEMPLATE.internlm2_chat #增量预训练用不到
+ accumulative_counts = 1 #单卡训练切记改成1,不然模型学不会东西,切记切记!!!


## qlora的配置
model = dict(
    type=SupervisedFinetune,
    use_varlen_attn=use_varlen_attn,
    llm=dict(
        type=AutoModelForCausalLM.from_pretrained,
        pretrained_model_name_or_path=pretrained_model_name_or_path,
        trust_remote_code=True,
        torch_dtype=torch.float16,
        quantization_config=dict(
            type=BitsAndBytesConfig,
            load_in_4bit=True,
            load_in_8bit=False,
            llm_int8_threshold=6.0,
            llm_int8_has_fp16_weight=False,
            bnb_4bit_compute_dtype=torch.float16,
            bnb_4bit_use_double_quant=True,
            bnb_4bit_quant_type='nf4')),
    lora=dict(
        type=LoraConfig,
        r=64,
        lora_alpha=128,
        lora_dropout=0.1,
        bias='none',
        task_type='CAUSAL_LM'))
+ #另外把两处带shuffle的改成False了,想尽量保持原始顺序去学习数据分布

指令微调

指令微调配置文件可以参考 wulewule/xtuner_config/finetune/internlm2_5_chat_1_8b_qlora_wulewule_all_test.py,下面列出几个重要的

+ pretrained_model_name_or_path = 'pretrain/merged_internlm2_5-1_8b-chat_pretrain' # 修改成自己的模型路径
+ data_dir="/root/wulewule/data"
+ data_files = [f'{data_dir}/self_cognition_100.jsonl',  f'{data_dir}/huixiangdou_conversations.jsonl'] # 改成自己的数据路径
+ prompt_template = PROMPT_TEMPLATE.internlm2_chat #internlm2_chat默认的
+ accumulative_counts = 1 #单卡训练切记改成1,不然模型学不会东西,切记切记!!!


## qlora的配置
model = dict(
    type=SupervisedFinetune,
    use_varlen_attn=use_varlen_attn,
    llm=dict(
        type=AutoModelForCausalLM.from_pretrained,
        pretrained_model_name_or_path=pretrained_model_name_or_path,
        trust_remote_code=True,
        torch_dtype=torch.float16,
        quantization_config=dict(
            type=BitsAndBytesConfig,
            load_in_4bit=True,
            load_in_8bit=False,
            llm_int8_threshold=6.0,
            llm_int8_has_fp16_weight=False,
            bnb_4bit_compute_dtype=torch.float16,
            bnb_4bit_use_double_quant=True,
            bnb_4bit_quant_type='nf4')),
    lora=dict(
        type=LoraConfig,
        r=64,
        lora_alpha=128,
        lora_dropout=0.1,
        bias='none',
        task_type='CAUSAL_LM'))
+ SYSTEM = "你是悟了悟了,由xzyun2011开发的AI助手,专注于回答和《黑神话:悟空》这款游戏相关的问题,你想帮助玩家了解更多这款游戏背后的故事和文化知识。\n" #修改为自己制作数据集时的prompt

至于学习率等超参数,需要自己多调试,就经验而言学习了一般设置量级1e-5左右,epoch轮数最好10以下,尽量避免灾难性遗忘问题;

模型训练

使用了deepspeed加速训练

#增量预训练
xtuner train ./xtuner_config/pretrain/internlm2_5-1_8b-chat_pretrain.py  --work-dir ./pretrain --deepspeed deepspeed_zero1

#指令微调
xtuner train ./xtuner_config/finetune/internlm2_5_chat_1_8b_qlora_wulewule_all_test.py  --work-dir ./finetune --deepspeed deepspeed_zero1

loss可视化,读取对应目录tensorboard数据,打开http://localhost:6006/

#指令微调为例
tensorboard --logdir ./finetune/work_dirs/internlm2_5_chat_1_8b_qlora_wulewule_all_test.py/20241010_230522/vis_data

模型转换 + LoRA 合并

在训练完成后,我们会得到几个 .pth 文件,这些文件存储了 QLoRA 算法训练过程所更新的参数,而不是模型的全部参数。因此我们需要将这些 .pth 文件转换为 HuggingFace 格式,并合并入原始的语言模型权重中。

模型转换

XTuner 已经集成好了将模型转换为 HuggingFace 格式的工具,我们只需要执行,pth_file改为自己需要转换的LoRA模型

export MKL_SERVICE_FORCE_INTEL=1
export MKL_THREADING_LAYER=GNU

## 需要看loss曲线和测试集表现,选择对应的模型
##指令微调为例子,先获取最后保存的一个pth文件
pth_file=`ls -t ./finetune/internlm2_5_chat_1_8b_qlora_wulewule_all_test.py/*.pth | head -n 1| sed 's/:$//' `
# 转换格式
xtuner convert pth_to_hf ./internlm2_5_chat_1_8b_qlora_wulewule_all_test.py ${pth_file} ./hf

LoRA 合并

XTuner 也已经集成好了合并 LoRA 权重的工具,我们只需执行如下指令

# 合并参数
xtuner convert merge /root/models/internlm2_5-1_8b-chat ./hf /root/wulewule/models/wulewule_v1_1_8b --max-shard-size 2GB

与转换命令类似,该条合并参数命令会读取原始参数路径 /root/models/internlm2_5-1_8b-chat 以及转换为 hf 格式的部分参数路径 ./h,将两部分参数合并后保存于 /root/wulewule/models/wulewule_v1_1_8b,其中每个参数切片的最大文件大小为 2GB。

与模型对话

在合并权重后,为了更好地体会到模型的能力,XTuner 也集成了与模型对话的工具。通过如下命令,便可以启动一个与模型对话的简易 Demo。

export MKL_SERVICE_FORCE_INTEL=1
export MKL_THREADING_LAYER=GNU
xtuner chat ./merged --prompt-template internlm2_chat --system "your system"

其中 ./merged 是合并后的权重路径,--prompt-template internlm2_chat 指定了对话模板为 InternLM2-Chat,--system 则是指定了与模型对话时的 System Prompt,保持和数据训练时一致。