前提条件
- 大模型学习机预装了Llama 2-7b-chat模型与stable-diffuison-base-v2.1模型,以及配套的开源服务框架text-generation-webui与stable-diffuison-webui,使您不需单独进行下载模型与配置环境。
- 云主机开通与如何登录网页页面参见部署文档。
1. 模型微调简介
由于基础大模型参数量极多,训练需要的资源量极大,因此基于基础大模型进行微调的小模型应运而生。学习机内框架自带的LoRA技术便是其中最主流的一种。
LoRA小模型无法独立使用,需要在加载完基础大模型后再进行加载,对基础大模型的能力进行扩展。
已有LoRA模型,如何加载可参考文本生成模型使用最佳实践。
2. 准备训练数据
模型训练支持多种输入格式,主要分为格式化数据(Formatted Dataset)与原始文本数据(Raw text file)。
2.1 格式化数据(Formated Dataset)
格式化数据一般用于对话领域,以json形式进行组织,可以在/root/text-generation-webui/training/formats目录下找到各类格式的配置文件。以alpaca-chatbot-format为例,
每条数据包括instruction, output或instruction,input,output三个部分。参考示例数据如下:
[
{
"instruction":
"我想基于天翼云云主机通过镜像部署大模型学习机,你能告诉我具体怎么操作吗?",
"output":
"当然可以。首先,您需要登录云主机控制台,并选择创建云主机资源池,然后点击“创建云主机”按钮。"
},
{
"instruction": "好的,我已经点击了“创建云主机”按钮,接下来应该怎么做?",
"output":
"在当前可用选项中,您可以在重庆-重庆2或宁夏-中卫5购买GPU计算加速型云主机的Pi7规格;或者在重庆-重庆2购买GPU计算加速型云主机的Pi2规格。"
}
]
您需要将私有数据组织成上述格式,并保存为[文件名].json文件。例如xuexiji_chatdata.json
参考/root/text-generation-webui/training/formats/alpaca-chatbot-format.json文件内容, 格式化输入数据将被组织成 User: %instruction%\nAssistant: %output%
输入模型,此处的 User
和 Assistant
务必与Parameter页面的Chat标签下的Character和User的Name保持一致。对话时的角色标签对大模型来说是一个很强的特征。
需要参考下图将Parameter页Chat标签下默认的Name 修改为Character’s Name: Assistant;User Name:User 。否则在进行chat 对话时小模型几乎完全无效 。
2.2 原始文本数据(Raw text file)
原始文本数据直接将文章或对话的原文作为输入,没有格式转化的过程,框架自动进行切分和训练。
例如我们直接截取大模型学习机部署文档作为输入:
本文基于天翼云云主机,为您介绍通过镜像部署大模型学习机的具体操作。
购买云主机。
登录云主机控制台,选择创建云主机资源池,点击“创建云主机”按钮。
当前您可在重庆-重庆2、宁夏-中卫5购买GPU计算加速型云主机的Pi7规格;也可在重庆-重庆2购买GPU计算加速型云主机的Pi2规格。
您需要将私有数据以utf8编码格式写入到文件中,并保存为[文件名].txt文件。例如xuexiji_docdata.txt。
3. 数据上传到云主机
windows系统使用命令提示符, macos/linux系统使用终端,执行scp命令将数据文件上传到云主机的/root/text-generation-webui/training/datasets目录下。
scp [本机文件路径] root@[ip]:/root/text-generation-webui/training/datasets
如果您擅长使用linux系统,也可采用例如ftp,lrzsz等其他方式将数据从本地上传到云主机内。
4. 启动训练
4.1 加载基础大模型
由于小模型需要在基础大模型的基础上才能使用,因此在训练前也要先保证在Model页完成了基础大模型的加载。
- Llama 2-7b模型在训练时,默认的fp16精度大约要消耗18G显存,入门款T4显卡机型无法支持。需要在加载基础模型时选择load-in-8bit以降低内存占用。
- 如果刚才进行过训练,则已加载进显存/内存的基础大模型也已经受到了训练的影响,需要先进行模型reload恢复初始状态。
4.2 训练参数配置
在Trainning页面进行参数配置。
- Name: 必填参数,输出模型将以此命名写入到/root/text-generation-webui/loras文件夹下。
- LoRA rank:小模型的维度,取值越大学习能力越强(但模型也越大)。可以直接采用默认值32,如果发现模型效果不佳,可以逐步增加到128进行尝试。
- LoRA Alpha:推荐保持为LoRA rank的两倍。
- Batch Size:每一批参与训练的数据条数。采用默认值128即可。如果您的训练数据条数过少,则也可修改为64或32。
- Epochs:数据训练的重复次数。一般保持1-3即可。如果您的训练数据特别少(例如不足1000条),则可以适当增大epoch以重复使用训练数据。例如本示例只用了30条训练数据,可以使用epochs=50或100以加强训练效果(实际使用时不推荐过大的epoch,示例仅为了保证能够训练出明显效果,已达到过拟合的状态)。
其他参数的设定需要有足够的背景知识,这里不做详细介绍,您可自行学习模型训练时的基本参数。
4.3 加载样本配置
在Trainning页面进行样本配置。您可以选择以下的其中一种数据进行训练。
4.3.1 加载格式化数据(Formatted Dataset)
选择Formatted Dataset,设置Data Format和Dataset为刚才准备好的数据文件。如果无法查看到文件,尝试点击右侧的刷新按钮重新加载,以及检查文件名后缀是否为.json。
4.3.2 加载原始文本数据(Raw text file)
选择Raw text file,设置Text file为刚才准备好的数据文件。如果无法查看到文件,尝试点击右侧的刷新按钮重新加载,以及检查文件名后缀是否为.txt。
4.4 启动训练
在启动前保证Model页已经Load过基础模型。
点击页面右下方 Start LoRA Training按钮,下方将会出现提示文字,等待模型完成训练与保存。
说明1. 在此阶段您可能会遇到各类问题导致训练失败,建议参考服务启停最佳实践文档[文档链接]中关于打印服务日志的内容。常见例如:中文不是utf8编码,显存不足等。
2. 在打印的日志中可以查看到模型训练时的loss指标。 一般loss下降到0.02以下即为基本训练达标。
3. 由于huggingface.io网站访问受限,学习机在启动服务时需要检查是否在启动脚本run.sh里写入了export HF_HUB_OFFLINE=1,否则在训练启动和结束时都会自动访问huggingface网站导致超时失败。
4.5 加载微调过的模型
完成训练后,LoRA小模型会被保存到/root/text-generation-webui/loras目录下。
注意训练完成后已加载进显存/内存的基础大模型也已经受到了训练的影响,需要先进行模型reload恢复初始状态, 再进行其他任何操作。
回到Model页,右侧LoRA标签下选择刚才训练出的模型并点击Apply LoRAs按钮,在基础大模型之上加载LoRA小模型(如果看不到小模型,尝试点击Apply LoRAs按钮左侧的刷新按钮)。
4.6 使用模型示例
在不加载LoRA小模型前,生成效果以英文为主,且内容不贴合训练数据。
4.6.1 对话(chat)模式
参见本文2.1节的“注意”部分,先确保已将Parameter页Chat标签下默认的Name修改为Character’s Name: Assistant;User Name:User。否则在进行chat对话时小模型几乎完全无效。
加载基于alpaca-chatbot-format格式数据训练的LoRA小模型后,回答内容贴合训练数据。
注意大模型生成存在随机性,一定完全符合预期,您可参考”大模型学习机文本生成最佳实践”文档,调整参数降低模型随机性。 如果始终无法符合预期,则可能是训练epoch不足,可以继续加大epoch测试。
说明对话(chat)模式的本质是先将输入数据组织成[role属性] Assistant: [文本] User:[文本] Assistant:[文本]的格式,然后再作为prompt输入模型。
4.6.2 默认(default)模式
加载基于raw text file数据训练的LoRA小模型后,生成内容贴合训练数据。
注意大模型生成存在随机性,不一定完全符合预期,您可参考”大模型学习机文本生成最佳实践”文档,调整参数降低模型随机性。如果始终无法符合预期,则可能是训练epoch不足,可以继续加大epoch测试。