通用 LLM

千亿大模型(130B、ChatGPT)和小规模的大模型(6B、LLaMA2)都是通用 LLM

  1. 通用 LLM 都是通过常识进行预训练
  2. 在实际使用过程中,需要 LLM 具备某一特定领域知识的能力 - 对 LLM 的能力进行增强

增强方式

Method Desc
微调 让预先训练好的 LLM 适应特定任务或数据集的方案,成本相对低
LLM 学会训练者提供的微调数据,并具备一定的理解能力
知识库 使用向量数据库或者其它数据库存储数据,为 LLM 提供信息来源外挂
API 与知识库类似,为 LLM 提供信息来源外挂

互不冲突,可以同时使用几种方案来优化 LLM,提升内容输出能力

LoRA / QLoRA / 知识库 / API

image-20240816163919085

LLM Performance = 推理效果

落地过程

Method Pipeline
微调 准备数据 -> 微调 -> 验证 -> 提供服务
知识库 准备数据 -> 构建向量库 -> 构建智能体 -> 提供服务
API 准备数据 -> 开发接口 -> 构建智能体 -> 提供服务

需求分析

法律小助手用来解决日常生活中遇到的法律问题,以问答的方式进行 - 知识库 or 微调

知识库

一旦数据集不足,可以随时补充即时生效

  1. 将数据集拆分成一条一条的知识,放入到向量库
  2. 然后通过 Agent 从向量库检索,在输入给 LLM

微调

  1. 法律知识有时候需要一定的逻辑能力,不是纯文本检索
  2. 微调 - 通过在一定量的数据集上的训练,增加 LLM 法律相关的常识及思维,从而进行推理

准备数据

原始数据

https://github.com/SophonPlus/ChineseNlpCorpus/blob/master/datasets/lawzhidao/intro.ipynb

字段 说明
title 问题的标题
question 问题内容(可为空)
reply 回复内容
is_best 是否为页面上显示的最佳回答

微调数据

1
2
3
4
5
6
7
8
9
10
11
12
{
"conversations": [
{
"role": "user",
"content": "类型#裙*裙长#半身裙"
},
{
"role": "assistant",
"content": "这款百搭时尚的仙女半身裙,整体设计非常的飘逸随性,穿上之后每个女孩子都能瞬间变成小仙女啦。料子非常的轻盈,透气性也很好,穿到夏天也很舒适。"
}
]
}

让 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对象生成一行,出示示例代码。

image-20240816183045914

微调

依赖

1
2
3
4
5
6
7
8
9
$ sudo apt install libopenmpi-dev

$ ChatGLM3/finetune_demo/
$ pip3 install -r requirements.txt

$ pip3 install nltk
$ pip3 install typer
$ pip3 install sentencepiece
$ pip3 install deepspeed==0.14.4

image-20240816224024027

数据

  1. 训练需要至少准备两个数据集,一个用来训练,一个用来验证
  2. train.json 与 dev.json 格式相同
  3. 当 LLM 在训练过程中,会自动进行测试验证,输出微调效果
1
2
3
4
5
6
7
8
$ tree data/
data/
├── dev.json
└── train.json

$ du -sh data/*
64K data/dev.json
29M data/train.json

配置

configs/lora.yaml

1
2
3
4
5
6
7
8
data_config:
train_file: /home/ubuntu/peft/ChatGLM3/finetune_demo/data/train.json
val_file: /home/ubuntu/peft/ChatGLM3/finetune_demo/data/dev.json
test_file: /home/ubuntu/peft/ChatGLM3/finetune_demo/data/dev.json
training_args:
output_dir: /home/ubuntu/peft/ChatGLM3/finetune_demo/output
max_steps: 3000 # 最大训练轮数
save_steps: 500 # 每训练多少轮保存权重

image-20240816225750003

微调

Parameter Desc
训练数据集所在的目录 data
模型所在目录 ../model
微调配置 configs/lora.yaml
1
$ python3 finetune_hf.py data ../model/ configs/lora.yaml

trainable params 为 1.9M,整个参数量为 6B,训练比为 3%

image-20240817001459446

  1. trainable params 指的是在模型训练过程中可以被优化更新的参数数量
  2. 深度学习模型中,这些参数通常是网络权重偏置
  3. 它们是可训练
    • 因为在训练过程中,通过反向传播算法,这些参数会根据损失函数梯度不断更新
    • 以减少模型输出与真实标签之间的差异
  4. 通过调整 lora.yaml 中的 peft_config 的 r 参数来改变可训练参数的数量
    • r 越大,trainable params 就越大
    • r - LoRA 矩阵的秩

image-20240817001802203

image-20240817003456160

loss

  1. 损失函数衡量模型预测的输出实际数据之间的差异
  2. 在训练过程中,目标是最小化损失值,从而提高模型的准确性

grad_norm

梯度范数 - 参数更新幅度

  1. 在训练深度学习模型时,通过反向传播算法计算参数的梯度,以便更新这些参数
  2. 梯度范数是这些梯度向量大小或者长度,提供了关于参数更新幅度的信息
  3. 如果梯度范数非常大,可能表示模型在训练过程中遇到了梯度爆炸问题
  4. 如果梯度范数太小,可能表示梯度消失问题

learning_rate

学习率 - 控制参数更新幅度超参数

  1. 在优化算法中,学习率决定了在反向传播期间参数更新步长大小
  2. 学习率太高,会导致训练过程不稳定
  3. 学习率太低,会导致训练进展缓慢或者陷入局部最小值

epoch

  1. epoch - 训练算法整个训练数据集上的一次完整遍历
  2. 通常需要多个 epochs 来训练模型,以确保模型能够充分学习数据集中的模式
  3. 每个 epoch 后,通常会评估模型在验证集上的表现,以监控调整训练过程

image-20240817004644007

验证

加载

output/checkpoint-3000 - 新生成的权重
模型启动时,会将原模型新权重全部加载,然后进行推理

1
$ python3 inference_hf.py output/checkpoint-3000/ --prompt "xxxxxxxxxxxx"

image-20240817005053174

微调前

image-20240817005425390

微调后

微调数据集中有对应内容,微调效果明显

image-20240817005718296

服务

微调完成后,即验证后得知整体效果满足一定的百分比,可以对外服务
通过 API 组件将模型的输入输出封装成接口对外提供服务

  1. 模型的推理性能 - 效果
  2. 模型的推理吞吐量
  3. 服务的限流,适当保护 LLM 集群
  4. 当 LLM 服务不可用时,服务降级,开关控制