“超级AI助手:全新晋升!中文NLP训练框架,疾速上手,海量训练数据,ChatGLM-v2、中文Bloom、Dolly_v2_3b助您实现更智能的利用!”
1.简介
指标
:基于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 | ✅ | ✅ | ✅ | ❌ | ❌ |
2.thu-chatglm-6b
模型教程
- 本文件夹只能进行单机单卡训练,如果想要应用单机多卡,请查看文件夹Chatglm6b_ModelParallel_ptuning。
介绍 | 门路 | 状态 |
---|---|---|
应用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 randomtarget_len__ = 6000d1 = 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__)] }))d1alldata = 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
,抉择一个你喜爱的(当然,必定是最好抉择最新的)。
3.chatglm_v2_6b_lora
增加了下面的参数,的确能够进行模型并行,然而,这是在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调试,就在
.vscode/launch.json
外面; - 间接应用sh,
sh train.sh
- 推理
- 应用文件:
infer_lora.ipynb
- 应用
lora
推理
from transformers import AutoTokenizer, AutoModelfrom peft import PeftModel, PeftConfigimport torchimport osos.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
的所有文件都下载下来,放在一个文件夹下;这样即便他更新了,也不会影响到你。如果你不下载,你会很被动
- 相干的BUG
很多人在跑多卡的时候,会遇到一些莫名其妙的谬误,建议您依照上面两个步骤进行排查:
- 肯定要看我下面折叠的那一块货色,就是
留神
局部。 - 查看
transformers
的版本,如果太低,就更新一下,倡议更新:pip install transformers -U
4.中文的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
- 训练工夫:280小时左右
- 训练设施:
4台3090
- 训练数据:
更多
- 以后的模型参数是
3b
,然而当你把整个流程跑通之后,能够很轻松的将3b
模型换成7b
模型或者更大的gpt_neox
模型。而你只须要将硬件进行晋升即可,无需调整代码~ - 以后的
3b
模型是否满足你的需要还不确定,前面你能够试一试。(以后还没公布) - 到底是大模型好还是小模型好,能够看看这句话:
吴恩达:有多少应用程序须要用到像GPT-4这样的最大型模型,而不是云提供商提供的更小(更便宜)的模型,甚至是本地托管的模型(比方运行在桌面上的gpt4all)还有待察看
- 对于集体或者小企业,强调的的就是在
垂直畛域
做疾速迭代
,心愿3b
模型能够帮忙到你!
- 以后的模型参数是
5.chinese_bloom
- 反对对
falcon模型
做sft~ - ✅ 基于stanford_alpaca我的项目,应用
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_chat- 在hugginface上部署了一个cpu版本的(有点慢,毕竟是)https://huggingface.co/spaces/yuanzhoulvpi/chinese_bloom_560_chat
- 模型
bloom
模型反对中文
、英文
、代码
、法语
、西班牙语
。
bloom-3b
: https://huggingface.co/bigscience/bloom-3bbloom-系列模型
: 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
更多优质内容请关注公号:汀丶人工智能;会提供一些相干的资源和优质文章,收费获取浏览。