目标
:基于pytorch
、transformers
做中文领域的nlp开箱即用的训练框架,提供全套的训练、微调模型(包括大模型、文本转向量、文本生成、多模态等模型)的解决方案;数据
: 百GB
规模的数据,也是轻而易举;流程
:每一个项目有完整的模型训练步骤,如:数据清洗、数据处理、模型构建、模型训练、模型部署、模型图解;模型
:当前已经支持gpt2
、clip
、gpt-neox
、dolly
、llama
、chatglm-6b
、VisionEncoderDecoderModel
等多模态大模型;多卡串联
:当前,多数的大模型的尺寸已经远远大于单个消费级显卡的显存,需要将多个显卡串联,才能训练大模型、才能部署大模型。因此对部分模型结构进行修改,实现了训练时
、推理时
的多卡串联功能。中文名称 | 文件夹名称 | 数据 | 数据清洗 | 大模型 | 模型部署 | 图解 |
---|---|---|---|---|---|---|
中文文本分类 | chinese_classifier | ✅ | ✅ | ✅ | ❌ | ✅ |
中文gpt2 | chinese_gpt2 | ✅ | ✅ | ✅ | ✅ | ❌ |
中文clip | chinese_clip | ✅ | ✅ | ✅ | ❌ | ✅ |
图像生成中文文本 | VisionEncoderDecoderModel | ✅ | ✅ | ✅ | ❌ | ✅ |
vit核心源码介绍 | vit model | ❌ | ❌ | ❌ | ❌ | ✅ |
Thu-ChatGlm-6b(v1) | simple_thu_chatglm6b | ✅ | ✅ | ✅ | ✅ | ❌ |
🌟chatglm-v2-6b🎉 | chatglm_v2_6b_lora | ✅ | ✅ | ✅ | ❌ | ❌ |
中文dolly_v2_3b | dolly_v2_3b | ✅ | ✅ | ✅ | ❌ | ❌ |
中文llama | chinese_llama | ✅ | ✅ | ✅ | ❌ | ❌ |
中文bloom | chinese_bloom | ✅ | ✅ | ✅ | ❌ | ❌ |
中文falcon(注意:falcon模型和bloom结构类似) | chinese_bloom | ✅ | ✅ | ✅ | ❌ | ❌ |
中文预训练代码 | model_clm | ✅ | ✅ | ✅ | ❌ | ❌ |
百川大模型 | model_baichuan | ✅ | ✅ | ✅ | ✅ | ❌ |
模型修剪✂️ | model_modify | ✅ | ✅ | ✅ | ||
llama2 流水线并行 | pipeline | ✅ | ✅ | ✅ | ❌ | ❌ |
thu-chatglm-6b
模型教程介绍 | 路径 | 状态 |
---|---|---|
使用lora训练chatglm6b | 就是本文件夹 | ✅ |
使用ptuning-v2模型并行训练chatglm6b | https://github.com/yuanzhoulvpi2017/zero_nlp/tree/main/Chatglm6b_ModelParallel_ptuning | ✅ |
在文件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()
注意:
只是对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
,选择一个你喜欢的(当然,肯定是最好选择最新的)。添加了上面的参数,确实可以进行模型并行,但是,这是在chatglm
模型代码没有bug的情况下,目前已经定位到bug,并且修复了bug,我也提交PR给chatglm团队,可以点击这个链接查看https://huggingface.co/THUDM/chatglm2-6b/discussions/54#64b542b05c1ffb087056001c
考虑到他们团队效率问题,如果他们还没有修改这个bug,那你们可以自己修改,主要是这么做:
在modeling_chatglm.py
的第955
行代码附近(也就是modeling_chatglm.py/ChatGLMForConditionalGeneration.forward
的loss
部分):
原始代码:
loss = None
if labels is not None:
lm_logits = lm_logits.to(torch.float32)
# Shift so that tokens < n predict n
shift_logits = lm_logits[..., :-1, :].contiguous()
shift_labels = labels[..., 1:].contiguous() #<<<------------------看这里
# Flatten the tokens
loss_fct = CrossEntropyLoss(ignore_index=-100)
loss = loss_fct(shift_logits.view(-1, shift_logits.size(-1)), shift_labels.view(-1))
lm_logits = lm_logits.to(hidden_states.dtype)
loss = loss.to(hidden_states.dtype)
if not return_dict:
output = (lm_logits,) + transformer_outputs[1:]
return ((loss,) + output) if loss is not None else output
return CausalLMOutputWithPast(
loss=loss,
logits=lm_logits,
past_key_values=transformer_outputs.past_key_values,
hidden_states=transformer_outputs.hidden_states,
attentions=transformer_outputs.attentions,
)
修改为:
loss = None
if labels is not None:
lm_logits = lm_logits.to(torch.float32)
# Shift so that tokens < n predict n
shift_logits = lm_logits[..., :-1, :].contiguous()
shift_labels = labels[..., 1:].contiguous().to(shift_logits.device) #<<<--------------------看这里
# Flatten the tokens
loss_fct = CrossEntropyLoss(ignore_index=-100)
loss = loss_fct(shift_logits.view(-1, shift_logits.size(-1)), shift_labels.view(-1))
lm_logits = lm_logits.to(hidden_states.dtype)
loss = loss.to(hidden_states.dtype)
if not return_dict:
output = (lm_logits,) + transformer_outputs[1:]
return ((loss,) + output) if loss is not None else output
return CausalLMOutputWithPast(
loss=loss,
logits=lm_logits,
past_key_values=transformer_outputs.past_key_values,
hidden_states=transformer_outputs.hidden_states,
attentions=transformer_outputs.attentions,
)
是的,就修改那一行即可
然后就可以正常跑起来了~
ADGEN 数据集任务为根据输入(content)生成一段广告词(summary)。
{
"content": "类型#上衣*版型#宽松*版型#显瘦*图案#线条*衣样式#衬衫*衣袖型#泡泡袖*衣款式#抽绳",
"summary": "这件衬衫的款式非常的宽松,利落的线条可以很好的隐藏身材上的小缺点,穿在身上有着很好的显瘦效果。领口装饰了一个可爱的抽绳,漂亮的绳结展现出了十足的个性,配合时尚的泡泡袖型,尽显女性甜美可爱的气息。"
}
从 Google Drive
或者 Tsinghua Cloud 下载处理好的 ADGEN
数据集,将解压后的 AdvertiseGen
目录放到本目录下。
3090
显卡即可(24G显存左右)14G
--max_source_length 64 \
--max_target_length 128 \
--per_device_train_batch_size 1 \
--per_device_eval_batch_size 1 \
--lora_r 32
.vscode/launch.json
里面;sh train.sh
infer_lora.ipynb
lora
推理from transformers import AutoTokenizer, AutoModel
from peft import PeftModel, PeftConfig
import torch
import os
os.environ['CUDA_VISIBLE_DEVICES'] = '1'
#原始的模型路径
model_name_or_path = "/media/yuanz/新加卷/训练代码/chatglm6b_v2_0716/chatglm2-6b_model"
#训练后的lora保存的路径
peft_model_id = "output/adgen-chatglm2-6b-lora_version/checkpoint-880"
tokenizer = AutoTokenizer.from_pretrained(model_name_or_path, trust_remote_code=True)
model = AutoModel.from_pretrained(model_name_or_path, trust_remote_code=True, device_map='auto',
torch_dtype=torch.bfloat16) # .half().cuda()
model = PeftModel.from_pretrained(model, peft_model_id)
model = model.eval()
response, history = model.chat(tokenizer, "类型#上衣*材质#牛仔布*颜色#白色*风格#简约*图案#刺绣*衣样式#外套*衣款式#破洞",
history=[])
print(response)
huggingface
上把chatglm-v2-6b
的所有文件都下载下来,放在一个文件夹下;这样即使他更新了,也不会影响到你。如果你不下载,你会很被动😒很多人在跑多卡的时候,会遇到一些莫名其妙的错误,建议您按照下面两个步骤进行排查:
🚨注意
部分。transformers
的版本,如果太低,就更新一下,建议更新:pip install transformers -U
dolly_v2_3b
模型dolly_v2_3b
模型
dolly_v2_3b
模型本质上就是使用的gpt_neox
模型框架,可以商用,而且也都出来很多年了。llama
、gptj
、chatglm-6b
等模型,做了很多微调,有些也都做过了,有些不能商用,有些还要申请,实在是太可惜了,太麻烦了。dolly_v2_3b
可以商用,那我们就主打一个随意,稍微动动手就可以训练一个属于我们的模型。databrickslabs/dolly
,对代码做了部分调整和融合。反正就是复制粘贴
、懂得都懂
~小黑子
😛,已将模型放在https://huggingface.co/yuanzhoulvpi/xiaoheizi-3b
databrickslabs/dolly
为啥要使用gpt_neox
模型,这个模型transformers
对他支持的其实一般,于是我把代码魔改了一部分,增加了多卡并行计算功能(主要是是模型并行
).databrickslabs/dolly
复制的,但是简化了很多不必要的代码,更简单一点,我不喜欢复杂的代码,越简单越好。bp16
:我原本的打算是说支持fp16
的,但是发现fp16
怎么搞都不行,但是bp16
倒是可以。下一步优化方向
lora
等微调训练代码,这个简单,等后面都训练好了,我添加一下。BelleGroup/train_1M_CN
4台3090
3b
,但是当你把整个流程跑通之后,可以很轻松的将3b
模型换成7b
模型或者更大的gpt_neox
模型。而你只需要将硬件进行提升即可,无需调整代码~3b
模型是否满足你的需求还不确定,后面你可以试一试。(当前还没发布)吴恩达:有多少应用程序需要用到像GPT-4这样的最大型模型,而不是云提供商提供的更小(更便宜)的模型,甚至是本地托管的模型(比如运行在桌面上的gpt4all)还有待观察
垂直领域
做快速迭代
,希望3b
模型可以帮助到你!falcon模型
做sft~
sft
格式数据对bloom
、falcon
模型微调;
deepspeed-zero2
、deepspeed-zero3
;
bloom
本身的能力,微调后的模型支持中文
、英文
、代码
、法语
、西班牙语
等;
bloom
模型,如560m
、3b
、7b
、13b
;
falcon
模型,如https://huggingface.co/tiiuae/falcon-7b
;
bloom-560m_chat
: 想要体验一个轻量的,那就直接体验5.6亿参数
https://huggingface.co/yuanzhoulvpi/chinese_bloom_560mbloom-7b_chat
: 想要体验一个更大的,那就可以试一试70亿参数
https://huggingface.co/yuanzhoulvpi/chinese_bloom_7b_chatbloom
模型支持中文
、英文
、代码
、法语
、西班牙语
。具体的训练数据的语言占比如下👇。
bloom-3b
: https://huggingface.co/bigscience/bloom-3b
bloom-系列模型
: https://huggingface.co/bigscience
BelleGroup
,主要是用到这几个数据集:['BelleGroup/generated_chat_0.4M', 'BelleGroup/school_math_0.25M', 'BelleGroup/train_2M_CN', 'BelleGroup/train_1M_CN', 'BelleGroup/train_0.5M_CN', 'BelleGroup/multiturn_chat_0.8M']
;data_proj/process_data.ipynb
代码;或者模仿结果,制作自己的数据集;data_proj/opendata
。文件夹下有若干个json
格式的文件。sh base_run.sh
deepspeed
运行策略sh ds_all.sh
infer.ipynb
文件gradio
交互界面:https://huggingface.co/spaces/yuanzhoulvpi/chinese_bloom_560_chat 因为是使用的huggingface的免费的cpu版本,所以推理速度比较慢。bloom-7b
在中文领域有极大的潜力chinese_bloom_560m
模型,可以在这里体验https://huggingface.co/spaces/yuanzhoulvpi/chinese_bloom_560_chatchinese_bloom_7b
模型,可以在这里体验http://101.68.79.42:7861项目链接:https://github.com/yuanzhoulvpi2017/zero_nlp