- 本文件夹📁只能进行单机单卡训练,如果想要使用单机多卡,请查看文件夹📁Chatglm6b_ModelParallel_ptuning。
介绍 | 路径 | 状态 |
---|---|---|
使用lora 训练chatglm6b |
就是本文件夹 | ✅ |
使用ptuning-v2 模型并行训练chatglm6b |
https://github.com/yuanzhoulvpi2017/zero_nlp/tree/main/Chatglm6b_ModelParallel_ptuning | ✅ |
- 目前
langchain + llm
实现知识库搜索非常酷炫,但是很多人不懂内在原理。其实本质上就是sbert + llm
,于是自己开发了一套文档搜索
代码DocumentSearch,欢迎尝玩
- 修复了因为
thuglm
官方代码更新,造成的lora
方法训练失败的问题。:自己在huggingface
上维护了一个老版本的thuglm6b-dddd
:中文名称叫chatglm6b-等等弟弟
模型.
- 修复了Chatglm6b_ModelParallel_ptuning出现的bug 75:IndexError: Out of range: piece id is out of range,这个bug是官方代码更新出现的问题。
- 基于P-Tuning v2代码,实现了模型并行,Chatglm6b_ModelParallel_ptuning
- 训练
chatglm-6b
模型,可以使用模型并行的方式了!!! 请点击链接查看Chatglm6b_ModelParallel,目前这个版本,虽然在训练的过程中,loss下降了,但是模型学习不到内容,这个问题我还在排查。
改名称代码
在文件code02_训练模型全部流程.ipynb
的cell-5
代码的前面,创建一个新的cell
,然后把下面的代码放到这个cell里面
q1 = '''您叫什么名字?
您是谁?
您叫什么名字?这个问题的答案可能会提示出您的名字。
您叫这个名字吗?
您有几个名字?
您最喜欢的名字是什么?
您的名字听起来很好听。
您的名字和某个历史人物有关吗?
您的名字和某个神话传说有关吗?
您的名字和某个地方有关吗?
您的名字和某个运动队有关吗?
您的名字和某个电影或电视剧有关吗?
您的名字和某个作家有关吗?
您的名字和某个动漫角色有关吗?
您的名字和某个节日有关吗?
您的名字和某个动物有关吗?
您的名字和某个历史时期有关吗?
您的名字和某个地理区域有关吗?
您的名字和某个物品有关吗?比如,如果您的名字和铅笔有关,就可以问“您叫什么名字?您是不是用铅笔的人?”
您的名字和某个梦想或目标有关吗?
您的名字和某个文化或传统有关吗?
您的名字和某个电影或电视节目的情节有关吗?
您的名字和某个流行歌手或演员有关吗?
您的名字和某个体育运动员有关吗?
您的名字和某个国际组织有关吗?
您的名字和某个地方的气候或环境有关吗?比如,如果您的名字和春天有关,就可以问“您叫什么名字?春天是不是一种温暖的季节?”
您的名字和某个电影或电视节目的主题有关吗?
您的名字和某个电视节目或电影的角色有关吗?
您的名字和某个歌曲或音乐有关吗?
您叫什么名字?
谁创造了你
'''
q1 = q1.split('\n')
a1 = ["我是良睦路程序员开发的一个人工智能助手", "我是良睦路程序员再2023年开发的AI人工智能助手"]
import random
target_len__ = 6000
d1 = pd.DataFrame({'instruction':[random.choice(q1) for i in range(target_len__)]}).pipe(
lambda x: x.assign(**{
'input':'',
'output':[random.choice(a1) for i in range(target_len__)]
})
)
d1
alldata = d1.copy()
注意:
- 如果想要覆盖模型老知识,你数据需要重复很多次才行~
- 文件不要搞错了,使用我最新的代码文件
- ✅ 解决了
03-27
版本中、在部分设备上、进行单机多卡计算的时候,出现的TypeError: 'NoneType' object is not subscriptable
问题 - ✅ 解决了
03-24
版本中、训练了,但是没效果的问题 - 🎯 添加了一整套的完整的训练代码
code02_训练模型全部流程.ipynb
,使用alpaca数据集格式,包括数据清洗,数据转换,模型训练等一系列步骤。 - ❤️ 感谢
https://github.com/hikariming/alpaca_chinese_dataset
提供的数据
- 🚀 添加了多卡并行的功能
- ✅ 会基于你的显卡数量,自动进行并行计算,也可以自己选择哪些卡,在代码的
train_chatglm6b.py
文件的前两行代码 - 😘 我做的事情:就是改了我就是修改了
thuglm/modeling_chatglm.py
代码,对里面涉及到的变量,做了设备的指定(虽然原始的代码也做了,但是做了并不充分) - 🤗 本质上,使用的就是pytorch的
nn.DataParallel
功能,因为我就是想让他支持transformers
的Trainer
。
- 在使用的时候,第一张卡的压力要大一点。
- 我在测试的时候,发现在3个3090上,是完全没有问题的。但是在4个3090的时候,会出现小bug:
RuntimeError: CUDA error: an illegal memory access was encountered
(说明我的device分配依然不太对)。 我在两个T4的机器上训练,会出现一个小bug:TypeError: 'NoneType' object is not subscriptable
(这个应该是我的代码不对)- 虽然bug不少,但是可以知道在什么地方优化,知道改哪里了,后面将继续优化!!!🎯 冲!!!
- 各位大佬,多提一提bug,让小弟来改。
- 💻 现在可以在16G显存的显卡上进行训练(在
batchsize=1,content_length=512
的情况下) - 🚀使用了
torch.utils.checkpoint
,降低了显存的占用(从之前的24G降低到15.2G左右),但是训练的时间花费更多。(如果你想关闭这个功能,在thuglm/modeling_chatglm.py
文件的第713
行self.gradient_checkpointing = True
中,把True
改为False
即可) - 🤖 精度依然是使用的
fp16
,而不是int8
. - 💨 依然使用了
lora
方法,如果不想使用这个方法,我后续可以把这个方法关闭。 - 📣 现在你可以把
content_length
调整到1024
,batchsize
可以调整到4
,即使这样,显存依然维持在23G左右。
- 💻一个3090消费级的显卡就可以训练
- 🎯支持
tensorboard
等各种花里胡哨小插件 - 🚀也可以多卡并行,训练非常快
- ✅数据只需要文本即可,不管是json还是csv文件,都可以,无监督学习,整理数据更轻松
- 📝训练代码比以往的教程更加简单,可以说是最简单的训练
thu-chatglm-6b
教程了
只是对transofrmers
包的Trainer
类做了修改,对modeling_chatglm.py
代码也做了修改。
这么做,可以让你在拥有22G显存的情况下,可以训练thu-chatglm-6b
模型。
那么,基于Trainer
的丰富方法,你可以做很多事情。而且使用peft
包https://github.com/huggingface/peft的lora
算法,让你在一个消费级别的显卡上,就可以训练thu-chatglm-6b
模型。
上面是文件工程,这里开始说安装包,直接使用pip
安装
pip install protobuf==3.20.0 transformers icetk cpm_kernels peft
就这么简单,不需要安装别的东西了
🎯 在最新的版本中,只需要查看code02_训练模型全部流程.ipynb
文件就行了
- 推理部分,直接看
infer.ipynb
代码 - 能到这里,也是恭喜你,微调模型已经成功了。这个时候,在这个文件夹下,肯定有一个文件夹叫
test003
(就是上面output_dir="test003"
对应的文件夹) - 在这个文件夹下,你肯定可以看到很多
checkpoint-xxx
,选择一个你喜欢的(当然,肯定是最好选择最新的)。
- 你只需要拥有一个3090即可(只要显存有24G就行了)
- 目前还没有尝试过多卡,下次去公司试一试