在未经过微调的pretrained LLM中,模型只会尽量去拟合你的输入,也就是说模型并没有意识到你在提问,因此需要微调来修正。
LLM的下游应用中,增量预训练和指令跟随是经常会用到的两种的微调模式。
增量预训练微调
使用场景:让基座模型学习到一些新知识,如某个垂类领域的常识
训练数据:文章、书籍、代码等
指令跟随微调
使用场景:让模型学会对话模板,根据人类指令进行对话
训练数据:高质量的对话、问答数据
指令跟随微调
指令跟随微调是为了得到能够实际对话的LLM。介绍指令跟随微调前,需要先了解如何使用LLM进行对话。
在实际对话时,通常会有三种角色
System:给定一些上下文信息,比如“你是一个安全的AI助手"
User:实际用户,会提出一些问题,比如“世界第一高峰是?”
Assistant:根据 User 的输入,结合 System 的上下文信息,做出回答,比如“珠穆朗玛峰”
与增量预训练的区别在于,数据中会有Input和Ouput,希望模型学会的是答案(Output),而不是问题(Input),训练时只会对答案(Output)部分计算Loss。
增量预训练微调
输入的数据形式并不是问答的形式,而是只是陈述句。因此实际的模板如下:
System:“”
User:“”
Assistant:根据 User 的输入,结合 System 的上下文信息,做出回答,比如“珠穆朗玛峰”
LoRA:LOW-RANK ADAPTATION OF LARGE LANGUAGE MODELS
LLM的参数量主要集中在模型中的Linear中,训练这些参数会消耗大量显存。而LoRA通过在原本的Linear旁,新增一个支路,包含两个连续的小Linear,新增的这个支路通常叫做Adapter。而这个Adapter的参数量远远小于原本的Linear中的参数量,可以 大幅度降低训练的显存消耗。
QLoRA是LoRA的一种改进方法。
1.安装
pip install xtuner
2.挑选配置模板
xtuner list-cfg -p internlm_20b
3.一键训练
xtuner trian interlm_20b_qlora_oasst1_512_e3
Config的命名规则:
4.模型对话
Float 16模型对话
xtuner chat internlm/internlm-chat-20b
或4bit模型对话
xtuner chat internlm/internlm-chat-20b --bits 4
加载Adapter模型对话
xtuner chat internlm/internlm-chat-20b --adapater $ADAPATER_DIR
5.工具类模型对话
XTuner还支持工具类模型的对话。
同时支持多种热门数据集的映射函数和多种对话模板映射函数。使得开发者可以专注于数据内容,而不必花费精力处理复杂的数据格式。
下面提到的两个技巧都是XTuner中重要的两个优化技巧。
Flash Attention 将Attention 计算并行化,避免了计算过程中Attention Score NxN的显存占用。
ZeRO优化,通过将训练过程中的参数、梯度和优化器状态切片保存,能够在多GPU训练时显著节省显存。除了将训练中间状态切片外, DeepSpeed训练时使用FP16的权重,相较于Pytorch的AMP(自动混合精度) 训练,在单 GPU 上也能大幅节省显存