写点什么

超级 AI 助手:全新提升!中文 NLP 训练框架,快速上手,海量训练数据

  • 2023-08-25
    浙江
  • 本文字数:5825 字

    阅读完需:约 19 分钟

超级AI助手:全新提升!中文NLP训练框架,快速上手,海量训练数据

“超级 AI 助手:全新提升!中文 NLP 训练框架,快速上手,海量训练数据,ChatGLM-v2、中文 Bloom、Dolly_v2_3b 助您实现更智能的应用!”

1.简介

  1. 目标:基于pytorchtransformers做中文领域的 nlp 开箱即用的训练框架,提供全套的训练、微调模型(包括大模型、文本转向量、文本生成、多模态等模型)的解决方案;

  2. 数据

  3. 从开源社区,整理了海量的训练数据,帮助用户可以快速上手;

  4. 同时也开放训练数据模版,可以快速处理垂直领域数据;

  5. 结合多线程、内存映射等更高效的数据处理方式,即使需要处理百GB规模的数据,也是轻而易举;

  6. 流程:每一个项目有完整的模型训练步骤,如:数据清洗、数据处理、模型构建、模型训练、模型部署、模型图解;

  7. 模型:当前已经支持gpt2clipgpt-neoxdollyllamachatglm-6bVisionEncoderDecoderModel等多模态大模型;

  8. 多卡串联:当前,多数的大模型的尺寸已经远远大于单个消费级显卡的显存,需要将多个显卡串联,才能训练大模型、才能部署大模型。因此对部分模型结构进行修改,实现了训练时推理时的多卡串联功能。


  • 模型训练


2.thu-chatglm-6b模型教程

  1. 本文件夹📁只能进行单机单卡训练,如果想要使用单机多卡,请查看文件夹📁Chatglm6b_ModelParallel_ptuning



在文件code02_训练模型全部流程.ipynbcell-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__)] }))d1alldata = d1.copy()
复制代码


注意:


  1. 如果想要覆盖模型老知识,你数据需要重复很多次才行~

  2. 文件不要搞错了,使用我最新的代码文件


只是对transofrmers包的Trainer类做了修改,对modeling_chatglm.py代码也做了修改。这么做,可以让你在拥有 22G 显存的情况下,可以训练thu-chatglm-6b模型。


那么,基于Trainer的丰富方法,你可以做很多事情。而且使用pefthttps://github.com/huggingface/peftlora算法,让你在一个消费级别的显卡上,就可以训练thu-chatglm-6b模型。


  • 安装


上面是文件工程,这里开始说安装包,直接使用pip安装


pip install protobuf==3.20.0 transformers icetk cpm_kernels peft
复制代码


就这么简单,不需要安装别的东西了



  1. 推理部分,直接看infer.ipynb代码

  2. 能到这里,也是恭喜你,微调模型已经成功了。这个时候,在这个文件夹下,肯定有一个文件夹叫test003(就是上面output_dir="test003"对应的文件夹)

  3. 在这个文件夹下,你肯定可以看到很多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.forwardloss部分):


原始代码:



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 目录放到本目录下。


  • 硬件要求


  1. 有个3090显卡即可(24G 显存左右)

  2. 在下面这个参数下,显存只需要14G


    --max_source_length 64 \    --max_target_length 128 \    --per_device_train_batch_size 1 \    --per_device_eval_batch_size 1 \     --lora_r 32
复制代码


  • 训练脚本


  1. 使用 vscode 调试,就在.vscode/launch.json里面;

  2. 直接使用 sh,sh train.sh


  • 推理


  1. 使用文件:infer_lora.ipynb


  • 使用lora推理


from transformers import AutoTokenizer, AutoModelfrom peft import PeftModel, PeftConfigimport torchimport 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)
复制代码


  • 血的教训


  1. 一定要从huggingface上把chatglm-v2-6b的所有文件都下载下来,放在一个文件夹下;这样即使他更新了,也不会影响到你。如果你不下载,你会很被动😒


  • 相关的 BUG


很多人在跑多卡的时候,会遇到一些莫名其妙的错误,建议您按照下面两个步骤进行排查:


  1. 一定要看我上面折叠的那一块东西,就是🚨注意部分。

  2. 检查transformers的版本,如果太低,就更新一下,建议更新:pip install transformers -U

4.中文的dolly_v2_3b模型

  • 训练中文的dolly_v2_3b模型

  • dolly_v2_3b模型本质上就是使用的gpt_neox模型框架,可以商用,而且也都出来很多年了。

  • 当前有很多人基于llamagptjchatglm-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



5.chinese_bloom

  1. 支持对falcon模型做 sft~

  2. ✅ 基于stanford_alpaca项目,使用sft格式数据对bloomfalcon模型微调;

  3. ✅ 支持deepspeed-zero2deepspeed-zero3

  4. ✅ 支持自定义数据,支持大数据训练;

  5. ✅ 得益于bloom本身的能力,微调后的模型支持中文英文代码法语西班牙语等;

  6. ✅ 微调后的模型,中文能力显著提升;

  7. ✅ 支持不同尺寸bloom模型,如560m3b7b13b

  8. ✅ 支持falcon模型,如https://huggingface.co/tiiuae/falcon-7b;


  • 体验



  1. 🎉 在 hugginface 上部署了一个 cpu 版本的(有点慢,毕竟是🆓)https://huggingface.co/spaces/yuanzhoulvpi/chinese_bloom_560_chat


  • 模型


  1. bloom模型支持中文英文代码法语西班牙语

  2. bloom-3b: https://huggingface.co/bigscience/bloom-3b

  3. bloom-系列模型: https://huggingface.co/bigscience


  • 数据


  1. 数据来源于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']

  2. 可以基于这些数据样式,制作自己的数据,并训练;


  • 步骤

  • 数据部分

  • 运行data_proj/process_data.ipynb代码;或者模仿结果,制作自己的数据集;

  • 运行结束之后,有一个文件夹data_proj/opendata。文件夹下有若干个json格式的文件。

  • 运行模型


  1. 基础运行策略


sh base_run.sh
复制代码


  1. deepspeed运行策略


sh ds_all.sh
复制代码


  • 推理代码


  1. infer.ipynb文件

  2. gradio交互界面:https://huggingface.co/spaces/yuanzhoulvpi/chinese_bloom_560_chat 因为是使用的 huggingface 的免费的 cpu 版本,所以推理速度比较慢。


  • 效果不管是写代码还是写文案,bloom-7b在中文领域有极大的潜力








项目链接:https://github.com/yuanzhoulvpi2017/zero_nlp


更多优质内容请关注公号:汀丶人工智能;会提供一些相关的资源和优质文章,免费获取阅读。


发布于: 刚刚阅读数: 3
用户头像

本博客将不定期更新关于NLP等领域相关知识 2022-01-06 加入

本博客将不定期更新关于机器学习、强化学习、数据挖掘以及NLP等领域相关知识,以及分享自己学习到的知识技能,感谢大家关注!

评论

发布
暂无评论
超级AI助手:全新提升!中文NLP训练框架,快速上手,海量训练数据_人工智能_汀丶人工智能_InfoQ写作社区