🐒大模型提高(训练量化微调)
type
status
date
slug
summary
tags
category
icon
password
参考资料:
1. 手把手实战transformer
2.
3. 知乎
📝基础入门
transformers库
- 生态
pipeline
- 流水线 拍不烂
- 代码
pipe = pipeline("text-classification", model="uer/roberta-base-finetuned-dianping-chinese")
分词器
- 有 Fast/ Slow Tokenizer之分。
- 编解码,id与token相互转换。
- 填充与截断
- 一般使用:
如何使用本地的模型
- 数据 for i in range(5):print(dataset[i])
- 分词+数据加载 next(enumerate(validloader))[1]
- 模型
- 训练与预测
- 推理: pipeline上场 或有时候可用在 原始数据进行预处理
- model head 全连接层 映射解决不同问题
datasets
意思就是可以不用自己搞个
class MyDataset(Dataset):
使用mapEvaluate
Train
以前的train自己写,现在搞个类
📝实战演练
流程
降显存
- 减少batch_size 增加梯度累加GA
- grad checkPoint 去掉中间一些值的存储 gradient_checkpointing=True, # *** 梯度检查点 ***
- 优化优化器 optim="adafactor"
- 冻结预训练部分的bert 只跑全连接层那部分
效果不好
-
效果不好
数据的长度
📝高效微调
- 有意思的指标:
独显占有率 时间
参数量 model.prompt_encoder
model
.
print_trainable_parameters()
参数量
sum(param
.
numel()
for
param
in
model
.
parameters())
AutoModelForCausalLM
.
from_pretrained("Langboat/bloom-1b4-zh",
low_cpu_mem_usage=True
)
- bitfit : 冻结除去bias的参数,少用
模型创建后动手
保存下来的模型参数,下次接着用
- Prompt-Tuning: 额外加入参数 hard prompt与soft prompt
在模型创建的时候动手
PEFT Step1 配置文件
PEFT Step2 创建模型
加载训练好的PEFT模型
- P-Tuning 优化soft prompt 对prompt那一部分进行进一步的编码计算
依旧是模型创建部分
PEFT Step1 配置文件
PEFT Step2 创建模型
- Prefix-tuning: 不再embedding进行拼接,放到整个Transformer blocks,放在每一层中
- Lora: 内在维度 没有计算量 权重矩阵加两个小分支 会合并故没有额外推理开销
AB的维度,那些权重需要旁系,默认只对key与value调整
合并(导入)
- IA3 比lora多了一份右边的 dense_h_to_4h 参数最少
抑制和放大内部激活,对K、V.FFN三部分的值进行调整,权重合并
- PEFT 进阶操作
适配器
📝低精度训练
降低模型本身的显存占用
4Bytes(单精度32bit) → LP16 半精度(2字节) → int8
常见的低精度数据类型: fp16 (half、半精度)、bfloat16、int8、fp4、nf4
表示数字范围变小:溢出问题 舍入误差
LLAMA2
自回归架构: 极大的复用之前的代码
他在调优的时候遇到了问题:
- 解码出来发现有问题
MAX_LENGTH
=
384
# Llama分词器会将一个中文字切分为多个token,因此需要放开一些最大长度,保证数据的完整性
instruction = tokenizer("\n".join(["Human: " + example["instruction"], example["input"]]).strip() + "\n\nAssistant: ",
add_special_tokens=False
)
- 增加batch_size为2的时候发现,梯度变为0,或者一下子很大,问题是左侧填充
- # 开启梯度检查点时,要执行该方法
- 偷偷做了32 全精度训练 但是要整个模型都是16
# model = model.half() # 当整个模型都是半精度时,需要将adam_epsilon调大
化完还需要
- tokenizer.eos_token 被切碎了 + id
- tokenizer.pad_token_id=2
ChatGLM3
📝番外技能
GPT
Bert模型: 非任务导向的预训练方法
上一篇
大模型开发(使用GPT)
下一篇
多模态探索
Loading...