baichuan-7B模型介绍及微调

百川智能公司发布了70亿参数的baichuan-7B模型,它基于Transformer结构,在多个评测中表现出色。文章介绍了如何使用HuggingFace加载和进行推理,以及处理GPU显存不足的方法。此外,还详细阐述了使用LoRA进行模型微调的过程和效果,表明微调能改善模型对人类意图的理解。
摘要由CSDN通过智能技术生成

baichuan-7B介绍

2023年6月15日,搜狗创始人王小川创立的百川智能公司,发布了70 亿参数量的中英文预训练大模型——baichuan-7B。

baichuan-7B 基于 Transformer 结构,在大约 1.2 万亿 tokens 上训练的 70 亿参数模型,支持中英双语,上下文窗口长度为 4096。

baichuan-7B 不仅在 C-Eval、AGIEval 和 Gaokao 中文权威评测榜单上,以显著优势全面超过了 ChatGLM-6B 等其他大模型,并且在 MMLU 英文权威评测榜单上,大幅领先 LLaMA-7B。

C-Eval榜单

在这里插入图片描述

在中文 C-EVAL 的评测中,baichuan-7B 的综合评分达到了 42.8 分,超过了 ChatGLM-6B 的 38.9 分,甚至比某些参数规模更大的模型还要出色。

开源地址:

Hugging Face:https://huggingface.co/baichuan-inc/baichuan-7B

Github:https://github.com/baichuan-inc/baichuan-7B

Model Scope:https://modelscope.cn/models/baichuan-inc/baichuan-7B/summary

baichuan-7B 推理

编辑predict.py文件如下:

from transformers import AutoModelForCausalLM, AutoTokenizer

tokenizer = AutoTokenizer.from_pretrained("/data/sim_chatgpt/baichuan-7B", trust_remote_code=True)
model = AutoModelForCausalLM.from_pretrained("/data/sim_chatgpt/baichuan-7B", device_map="auto", trust_remote_code=True)
inputs = tokenizer('登鹳雀楼->王之涣\n夜雨寄北->', return_tensors='pt')
inputs = inputs.to('cuda:0')
pred = model.generate(**inputs, max_new_tokens=64,repetition_penalty=1.1)
print(tokenizer.decode(pred.cpu()[0], skip_special_tokens=True))

运行代码

python predict.py

显存报错
在这里插入图片描述
显存不够,本GPU显存为16G,但模型加载需要27-28G,故考虑使用其量化版本进行加载。
修改如下:

model = AutoModelForCausalLM.from_pretrained("/data/sim_chatgpt/baichuan-7B", device_map="auto", load_in_4bit = true, trust_remote_code=True)

还需要安装下面两个包

pip install bitsandbytes
pip install scipy

运行后结果如下:

登鹳雀楼->王之涣 夜雨寄北->

2.杜甫
3. 夜雨寄北 还家十余日,家住洛桥边. 白日依山尽,思归多苦颜,(崔颢《黄鹤楼》) 黄河入海口. (崔颢《黄鹤楼》) 王之涣的《登鹳雀楼》诗. 日出江花红胜火: 黄河远上,归期何时道,一别西风又一年.” 4,洛阳亲友如相问? 白日依山尽.
-----杜甫《春日忆李白》 王之涣《凉州词(黄河远上白云间)》 《凉州词(黄河远上白云间)》 (王之涣) 黄河远上

开放协议
baichuan-7B 代码采用 Apache-2.0 协议,模型权重采用了免费商用协议,只需进行简单登记即可免费商用。

尽管baichuan-7B在一些评估数据集上效果很好,但是并不能开箱即用,因为它没有 supervised finetune 这一步,没有和人类意图进行对齐,经常听不懂你下达的指令。

baichuan-7B 微调

本次微调参考项目:https://github.com/wp931120/baichuan_sft_lora

下载项目仓库

git clone https://github.com/wp931120/baichuan_sft_lora.git
cd baichuan_sft_lora

配置环境

conda create -n baichuan-7b python=3.9
conda activate baichuan-7b
pip install -r requirements.txt

数据集下载

下载地址:https://huggingface.co/datasets/BelleGroup/train_0.5M_CN/tree/main
该数据集一共有519255条样本。

微调过程

  • 先将百川LLM 采用qlora的 nf4 和双重量化方式进行量化
  • 再采用lora进行指令微调

修改并运行sft_lora.py文件

  • 将sft_lora.py中的模型路径设置为自己的模型路径
  • 执行python sft_lora.py运行代码
    在这里插入图片描述显存占用为9G左右。

测试过程如下图所示:
在这里插入图片描述
相关参数的设置在sft_lora.py中可以找到。
验证集数量:VAL_SET_SIZE = 2000
文本最大长度:CUTOFF_LEN=1024
训练eochs数: num_train_epochs=1
训练batch_size:per_device_train_batch_size=1
验证batch_size:per_device_eval_batch_size=1
学习率:learning_rate=3e-4
梯度累积:gradient_accumulation_steps=4
LoRA中低秩近似的秩:r=8
低秩矩阵缩放超参数:lora_alpha=16
LoRA层的dropout:lora_dropout=0.05

使用微调后的模型推理

训练速度还是比较慢的,花了大概48个小时的时间,训练了72000(18000 * 4)条数据,loss基本在1.4左右。(因为梯度累积参数为4,所以训练集517255/4正好是129313)
在这里插入图片描述

train loss
在这里插入图片描述
在这里插入图片描述
挑选数据集中的数据:
输入:"写一个制作披萨的步骤指南。 "
输出:“1. 准备面团:将面粉、盐、酵母和水混合搅拌,揉成面团,放在温暖通风处发酵。 2. 切配佐料:准备用于披萨的酱料、奶酪和各种佐料,如蔬菜、香肠、火腿等。 3. 擀面皮:将发酵好的面团擀成薄饼状,越薄越好。 4. 加入酱料:把酱料均匀地涂在面皮上。 5. 撒上奶酪和佐料:撒上足够的奶酪和各种佐料。 6. 烘烤:将披萨放进预热好的烤箱,烘烤10-15分钟,或者直到表面变为金黄色。 7. 切片享用:取出披萨,切成适当的大小,稍微冷却一下,即可食用。”

我们先看下未经过微调的模型,推理看下。
在这里插入图片描述
未经微调的模型仅仅是一个生成模型。

我们使用微调18000条数据后的模型进行推理,看效果还是可以的,但推理速度还是挺慢的,大概需要1~2分钟。
在这里插入图片描述
可以看出,已经能够明白意图了。

我们再下载已经微调好的权重来看下。
下载地址:https://huggingface.co/wp931120x/baichuan_4bit_lora
在这里插入图片描述

参考:

https://zhuanlan.zhihu.com/p/637343740

https://zhuanlan.zhihu.com/p/637785176

https://github.com/wp931120/baichuan_sft_lora

https://huggingface.co/wp931120x/baichuan_4bit_lora

https://github.com/baichuan-inc/baichuan-7B/issues/23

评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值