关于自然语言处理:超级AI助手全新提升中文NLP训练框架快速上手海量训练数据

3次阅读

共计 8322 个字符,预计需要花费 21 分钟才能阅读完成。

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

1. 简介

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

    • 从开源社区,整顿了海量的训练数据,帮忙用户能够疾速上手;
    • 同时也凋谢训练数据模版,能够疾速解决垂直畛域数据;
    • 联合多线程、内存映射等更高效的数据处理形式,即便须要解决 百 GB规模的数据,也是轻而易举;
  3. 流程:每一个我的项目有残缺的模型训练步骤,如:数据荡涤、数据处理、模型构建、模型训练、模型部署、模型图解;
  4. 模型 :以后曾经反对gpt2clipgpt-neoxdollyllamachatglm-6bVisionEncoderDecoderModel 等多模态大模型;
  5. 多卡串联
    :以后,少数的大模型的尺寸曾经远远大于单个生产级显卡的显存,须要将多个显卡串联,能力训练大模型、能力部署大模型。因而对局部模型构造进行批改,实现了 训练时 推理时
    的多卡串联性能。
  • 模型训练
中文名称 文件夹名称 数据 数据荡涤 大模型 模型部署 图解
中文文本分类 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模型教程

  1. 本文件夹📁只能进行单机单卡训练,如果想要应用单机多卡,请查看文件夹📁Chatglm6b_ModelParallel_ptuning。
介绍 门路 状态
应用 lora 训练chatglm6b 就是本文件夹
应用 ptuning-v2 模型并行训练chatglm6b https://github.com/yuanzhoulvpi2017/zero_nlp/tree/main/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__)]
    })
)
d1
alldata = d1.copy()

留神:

  1. 如果想要笼罩模型老常识,你数据须要反复很屡次才行~
  2. 文件不要搞错了,应用我最新的代码文件

只是对 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.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, 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)
  • 血的教训
  1. 肯定要从 huggingface 上把 chatglm-v2-6b 的所有文件都下载下来,放在一个文件夹下;这样即便他更新了,也不会影响到你。如果你不下载,你会很被动😒
  • 相干的 BUG

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

  1. 肯定要看我下面折叠的那一块货色,就是 🚨留神 局部。
  2. 查看 transformers 的版本,如果太低,就更新一下,倡议更新:pip install transformers -U

4. 中文的 dolly_v2_3b 模型

  • 训练中文的 dolly_v2_3b 模型

    1. dolly_v2_3b模型实质上就是应用的 gpt_neox 模型框架,能够商用, 而且也都进去很多年了。
    2. 以后有很多人基于 llamagptjchatglm-6b 等模型,做了很多微调,有些也都做过了,有些不能商用,有些还要申请,切实是太惋惜了,太麻烦了。
    3. 既然 dolly_v2_3b 能够商用,那咱们就主打一个随便,略微动动手就能够训练一个属于咱们的模型。
    4. 本仓库用到的代码,来源于 databrickslabs/dolly,对代码做了局部调整和交融。反正就是 复制粘贴 懂得都懂
    5. 模型叫什么名字:小黑子 😛,已将模型放在https://huggingface.co/yuanzhoulvpi/xiaoheizi-3b
    1. 🎯 反对多卡模型并行:也不晓得 databrickslabs/dolly 为啥要应用 gpt_neox 模型,这个模型 transformers 对他反对的其实个别,于是我把代码魔改了一部分,减少了多卡并行计算性能 (次要是是 模型并行).
    2. 🥱 尽管代码是从 databrickslabs/dolly 复制的,然而简化了很多不必要的代码,更简略一点,我不喜爱简单的代码,越简略越好。
    3. 😵 反对 bp16:我本来的打算是说反对fp16 的,然而发现 fp16 怎么搞都不行,然而 bp16 倒是能够。
      # 下一步优化方向
    4. 😆 增加 lora 等微调训练代码,这个简略,等前面都训练好了,我增加一下。
  • 模型训练状况

    1. 训练数据:BelleGroup/train_1M_CN
    2. 训练工夫:280 小时左右
    3. 训练设施: 4 台 3090
  • 更多

    1. 以后的模型参数是 3b,然而当你把整个流程跑通之后,能够很轻松的将3b 模型换成 7b 模型或者更大的 gpt_neox 模型。而你只须要将硬件进行晋升即可,无需调整代码~
    2. 以后的 3b 模型是否满足你的需要还不确定,前面你能够试一试。(以后还没公布)
    3. 到底是大模型好还是小模型好,能够看看这句话:吴恩达:有多少应用程序须要用到像 GPT- 4 这样的最大型模型,而不是云提供商提供的更小(更便宜)的模型,甚至是本地托管的模型(比方运行在桌面上的 gpt4all)还有待察看
    4. 对于集体或者小企业,强调的的就是在 垂直畛域 疾速迭代 ,心愿3b 模型能够帮忙到你!

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;
  • 体验
  • bloom-560m_chat: 想要体验一个轻量的,那就间接体验5.6 亿参数https://huggingface.co/yuanzhoulvpi/chinese_bloom_560m
  • bloom-7b_chat: 想要体验一个更大的,那就能够试一试70 亿参数https://huggingface.co/yuanzhoulvpi/chinese_bloom_7b_chat
  • 🎉 在 hugginface 上部署了一个 cpu 版本的(有点慢,毕竟是🆓)https://huggingface.co/spaces/yuanzhoulvpi/chinese_bloom_560_chat
  • 模型
  • bloom模型反对 中文 英文 代码 法语 西班牙语
  1. bloom-3b: https://huggingface.co/bigscience/bloom-3b
  2. 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']`;
  • 能够基于这些数据款式,制作本人的数据,并训练;
  • 步骤
  • 数据局部

    1. 运行 data_proj/process_data.ipynb 代码;或者模拟后果,制作本人的数据集;
    2. 运行完结之后,有一个文件夹 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在中文畛域有极大的后劲

  • 体验

    1. chinese_bloom_560m模型,能够在这里体验 https://huggingface.co/spaces/yuanzhoulvpi/chinese_bloom_560_chat
    2. chinese_bloom_7b模型,能够在这里体验 http://101.68.79.42:7861

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

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

正文完
 0