LLM PEFT - ChatGLM3-6B + LoRA
通用 LLM
千亿大模型(130B、ChatGPT)和小规模的大模型(6B、LLaMA2)都是通用 LLM
- 通用 LLM 都是通过常识进行预训练的
- 在实际使用过程中,需要 LLM 具备某一特定领域知识的能力 - 对 LLM 的能力进行增强
增强方式
Method | Desc |
---|---|
微调 | 让预先训练好的 LLM 适应特定任务或数据集的方案,成本相对低 LLM 学会训练者提供的微调数据,并具备一定的理解能力 |
知识库 | 使用向量数据库或者其它数据库存储数据,为 LLM 提供信息来源外挂 |
API | 与知识库类似,为 LLM 提供信息来源外挂 |
互不冲突,可以同时使用几种方案来优化 LLM,提升内容输出能力
LoRA / QLoRA / 知识库 / API
LLM Performance = 推理效果
落地过程
Method | Pipeline |
---|---|
微调 | 准备数据 -> 微调 -> 验证 -> 提供服务 |
知识库 | 准备数据 -> 构建向量库 -> 构建智能体 -> 提供服务 |
API | 准备数据 -> 开发接口 -> 构建智能体 -> 提供服务 |
需求分析
法律小助手用来解决日常生活中遇到的法律问题,以问答的方式进行 - 知识库 or 微调
知识库
一旦数据集不足,可以随时补充,即时生效
- 将数据集拆分成一条一条的知识,放入到向量库
- 然后通过 Agent 从向量库检索,在输入给 LLM
微调
- 法律知识有时候需要一定的逻辑能力,不是纯文本检索
- 微调 - 通过在一定量的数据集上的训练,增加 LLM 法律相关的常识及思维,从而进行推理
准备数据
原始数据
https://github.com/SophonPlus/ChineseNlpCorpus/blob/master/datasets/lawzhidao/intro.ipynb
字段 | 说明 |
---|---|
title | 问题的标题 |
question | 问题内容(可为空) |
reply | 回复内容 |
is_best | 是否为页面上显示的最佳回答 |
微调数据
1 | { |
让 ChatGPT 生成转换代码
1 | 原始数据是CSV格式,包含4列:title、question、reply、is_best,需要通过Python语言处理该CSV文件,来构建大语言模型的微调数据集,目标数据集格式是JSON的,单条数据格式为:{"conversations":[{"role":"user","content":"value1"},{"role":"assistant","content":"value2"}]},需要将原始CSV文件里的title列填充到目标JSON文件里的value1处,原始CSV文件里的reply填充到目标JSON文件里的value1处,请注意:最终生成的不是JSON数组,而是每个JSON对象生成一行,出示示例代码。 |
微调
依赖
1 | $ sudo apt install libopenmpi-dev |
数据
- 训练需要至少准备两个数据集,一个用来训练,一个用来验证
- train.json 与 dev.json 格式相同
- 当 LLM 在训练过程中,会自动进行测试验证,输出微调效果
1 | $ tree data/ |
配置
configs/lora.yaml
1 | data_config: |
微调
Parameter | Desc |
---|---|
训练数据集所在的目录 | data |
模型所在目录 | ../model |
微调配置 | configs/lora.yaml |
1 | $ python3 finetune_hf.py data ../model/ configs/lora.yaml |
trainable params 为 1.9M,整个参数量为 6B,训练比为 3%
- trainable params 指的是在模型训练过程中可以被优化或更新的参数数量
- 在深度学习模型中,这些参数通常是网络的权重和偏置
- 它们是可训练的
- 因为在训练过程中,通过反向传播算法,这些参数会根据损失函数的梯度不断更新
- 以减少模型输出与真实标签之间的差异
- 通过调整 lora.yaml 中的 peft_config 的 r 参数来改变可训练参数的数量
- r 越大,trainable params 就越大
- r - LoRA 矩阵的秩
loss
- 损失函数衡量模型预测的输出与实际数据之间的差异
- 在训练过程中,目标是最小化该损失值,从而提高模型的准确性
grad_norm
梯度范数 - 参数更新幅度
- 在训练深度学习模型时,通过反向传播算法计算参数的梯度,以便更新这些参数
- 梯度范数是这些梯度向量的大小或者长度,提供了关于参数更新幅度的信息
- 如果梯度范数非常大,可能表示模型在训练过程中遇到了梯度爆炸问题
- 如果梯度范数太小,可能表示梯度消失问题
learning_rate
学习率 - 控制参数更新幅度的超参数
- 在优化算法中,学习率决定了在反向传播期间参数更新的步长大小
- 学习率太高,会导致训练过程不稳定
- 学习率太低,会导致训练进展缓慢或者陷入局部最小值
epoch
- epoch - 训练算法在整个训练数据集上的一次完整遍历
- 通常需要多个 epochs 来训练模型,以确保模型能够充分学习数据集中的模式
- 每个 epoch 后,通常会评估模型在验证集上的表现,以监控和调整训练过程
验证
加载
output/checkpoint-3000 - 新生成的权重
模型启动时,会将原模型和新权重全部加载,然后进行推理
1 | $ python3 inference_hf.py output/checkpoint-3000/ --prompt "xxxxxxxxxxxx" |
微调前
微调后
微调数据集中有对应内容,微调效果明显
服务
微调完成后,即验证后得知整体效果满足一定的百分比,可以对外服务
通过 API 组件将模型的输入输出封装成接口对外提供服务
- 模型的推理性能 - 效果
- 模型的推理吞吐量
- 服务的限流,适当保护 LLM 集群
- 当 LLM 服务不可用时,服务降级,开关控制
All articles in this blog are licensed under CC BY-NC-SA 4.0 unless stating additionally.