当前位置: 首页 > news >正文

建设企业网站公司临沂做网站推广的公司有

建设企业网站公司,临沂做网站推广的公司有,网约车多少钱一辆,商场设计费全套解决方案#xff1a;基于pytorch、transformers的中文NLP训练框架#xff0c;支持大模型训练和文本生成#xff0c;快速上手#xff0c;海量训练数据#xff01; 1.简介 目标#xff1a;基于pytorch、transformers做中文领域的nlp开箱即用的训练框架#xff0c;提…全套解决方案基于pytorch、transformers的中文NLP训练框架支持大模型训练和文本生成快速上手海量训练数据 1.简介 目标基于pytorch、transformers做中文领域的nlp开箱即用的训练框架提供全套的训练、微调模型包括大模型、文本转向量、文本生成、多模态等模型的解决方案数据 从开源社区整理了海量的训练数据帮助用户可以快速上手同时也开放训练数据模版可以快速处理垂直领域数据结合多线程、内存映射等更高效的数据处理方式即使需要处理百GB规模的数据也是轻而易举 流程每一个项目有完整的模型训练步骤如数据清洗、数据处理、模型构建、模型训练、模型部署、模型图解模型当前已经支持gpt2、clip、gpt-neox、dolly、llama、chatglm-6b、VisionEncoderDecoderModel等多模态大模型多卡串联 当前多数的大模型的尺寸已经远远大于单个消费级显卡的显存需要将多个显卡串联才能训练大模型、才能部署大模型。因此对部分模型结构进行修改实现了训练时、推理时 的多卡串联功能。 模型训练 中文名称文件夹名称数据数据清洗大模型模型部署图解中文文本分类chinese_classifier✅✅✅❌✅中文gpt2chinese_gpt2✅✅✅✅❌中文clipchinese_clip✅✅✅❌✅图像生成中文文本VisionEncoderDecoderModel✅✅✅❌✅vit核心源码介绍vit model❌❌❌❌✅Thu-ChatGlm-6b(v1)simple_thu_chatglm6b✅✅✅✅❌chatglm-v2-6bchatglm_v2_6b_lora✅✅✅❌❌中文dolly_v2_3bdolly_v2_3b✅✅✅❌❌中文llamachinese_llama✅✅✅❌❌中文bloomchinese_bloom✅✅✅❌❌中文falcon(注意falcon模型和bloom结构类似)chinese_bloom✅✅✅❌❌中文预训练代码model_clm✅✅✅❌❌百川大模型model_baichuan✅✅✅✅❌模型修剪✂️model_modify✅✅✅llama2 流水线并行pipeline✅✅✅❌❌ 2.文本分类模型 本部分介绍中文的文本分类模型适用于二分类、多分类等情况。使用transformers库。 处理数据code_01_processdata.ipynb数据介绍 本案例使用的是一个外卖平台的评论数据对评论的文本做了分类分为好评和差评当你把code_01_processdata.ipynb文件跑完之后就可以看到在data_all里面有一个data里面有三个文件样式都是像下面这样的 上图是一个batch的数据或者所有的文本分类的数据样式 text下面的红色条就是一个个句子。label里面有红色有绿色就是表示标签分类。transformers包做分类的时候数据要求就这两列。 注意点 数据需要分为train_data.csv,test_data.csv,valid_data.csv,这三个csv文件注意是使用,分割开的。数据不可以有缺失值数据最好只含有两列label,text label:表示标签最好为整型数值。0,1,2,3,4等text:表示文本看你需求可以有符号也可以没有标点符号 train_data.csv,test_data.csv,valid_data.csv这三个数据里面不要有数据相同的不然会造成数据泄漏。 训练模型code_02_trainmodel.ipynb 数据训练流程 以一个batch为例 Tokenizer会将数据中的text转换成三个矩阵(或者叫三个Tensor)分别叫input_ids,token_type_ids,attention_mask至于怎么转换的我们先不做详细介绍本仓库后续会介绍。pretrained model在被加载之前需要设置一大堆模型的参数至于要设置什么参数我们也不做详细介绍。Trainer就是一个训练器也需要预先设置好一大堆参数。至于要设置什么参数我们也不做详细介绍。Trainer会把input_ids,token_type_ids,attention_mask还有数据自带的标签label还有pretrained model都加载进来进行训练当所有batch的数据更新完之后最终就会生成一个模型。your new model就诞生了。对于刚开始学习大模型做nlp分类的任务其实不需要考虑那么多细节只需要注意数据流程。 注意点 这个步骤非常看显存大小。显卡显存越大越好。batch_size,eval_size大小取决于显存大小。在实际工程中会先使用Tokenizer把所有的文本转换成input_ids,token_type_ids,attention_mask然后在训练的时候这步就不再做了目的是减少训练过程中cpu处理数据的时间不给显卡休息时间。在使用Tokenizer把所有的文本做转换的期间如果设置的文本的长度上限为64那么会把大于64的文本截断那些少于64的文本会在训练的时候在喂入模型之前把长度补齐这么做就是为了减少数据对内存的占用。 预测code_03_predict.ipynb 这个时候就是搞个句子然后丢给一个pipeline(这个就是把Tokenizer和你的大模型放在一起了)然后这个pipeline就给你返回一个分类结果。 常见的就是使用pipeline如果更加复杂的话比如修改模型这个时候就比较复杂了后面会再次介绍。 部署 简单的部署相对于预测其实就是再加一层web端口fastapi包就可以实现。 高级一点的部署相对于预测就需要把模型从pytorch转换成onnx格式的这样可以提高推理效率也不一定就是举个例子可能也不会使用web端口http协议了会使用rpc协议等方法。这部分现在先不看。 3.中文gpt2 本文将介绍如何使用中文语料训练一个gpt2可以使用你自己的数据训练用来写新闻、写古诗、写对联等我这里也训练了一个中文gpt2模型使用了612万个样本每个样本有512个tokens总共相当于大约31亿个tokens 安装包 需要准备好环境也就是安装需要的包 pip install -r requirements.txt像是pytorch这种基础的包肯定也是要安装的就不提了。 数据来源 获得数据:数据链接关注公众号【统计学人】然后回复【gpt2】即可获得。获得我训练好的模型(使用了15GB的数据(31亿个tokens)在一张3090上训练了60多小时) 数据格式 数据其实就是一系列文件夹然后每一个文件夹里面有大量的文件每一个文件都是.csv格式的文件。其中有一列数据是content每一行的content就代表一句话虽然数据有15GB那么大但是处理起来一点也不复杂使用 datasets 包可以很轻松的处理大数据而我只需要传递所有的文件路径即可这个使用 glob 包就能完成。 训练代码train_chinese_gpt2.ipynb 现在训练一个gpt2代码其实很简单的。抛开处理数据问题技术上就三点:tokenizer、gpt2_model、Trainertokenizer使用的是bert-base-chinese 然后再添加一下bos_token、eos_token、pad_token。gpt2_model使用的是gpt2这里的gpt2我是从0开始训练的。而不是使用别人的预训练的gpt2模型。Trainer训练器使用的就是transformers的Trainer模块。支撑多卡并行tensorboard等都写好的直接调用就行了非常好用 模型 推理代码infer.ipynb 这个是chinese-gpt2的推理代码 将代码中的model_name_or_path checkpoint-36000里面的checkpoint-36000,修改为模型所在的路径。然后运行下面一个代码块即可输出文本生成结果可以参考这个代码制作一个api或者打包成一个函数或者类。 交互机器人界面chatbot.py 修改代码里面的第4行这一行值为模型所在的位置修改为我分享的模型文件路径。 model_name_or_path checkpoint-36000运行 python chatbot.py点击链接即可在浏览器中打开机器人对话界面 更多 这个完整的项目下来其实我都是全靠huggingface文档、教程度过来的.我做的东西也就是把Tokenizer改成中文的了然后也整理了数据别的大部分东西都不是我做的了.原文链接为https://huggingface.co/course/zh-CN/chapter7/6?fwpt. 其实我更喜欢做应用但是也要理解相关的背后原理目前还在研究相关的gpt2原理还有相关的推理细节这是我整理的链接希望可以共同进步 https://huggingface.co/blog/how-to-generatehttps://huggingface.co/gpt2https://huggingface.co/gpt2-large 4.中文clip模型 本文将介绍如何从0到1的训练一个中文clip模型。在处理数据的过程中训练的过程中需要的注意事项。从数据流的角度看看clip模型是怎么处理数据的模型是怎么构建的。image和text的模型的差异性两个模型是怎么合并起来计算loss的。 clip模型介绍 CLIP的英文全称是Contrastive Language-Image Pre-training即一种基于对比文本-图像对的预训练方法或者模型。 CLIP是一种基于对比学习的多模态模型与CV中的一些对比学习方法如moco和simclr不同的是 CLIP的训练数据是文本-图像对一张图像和它对应的文本描述这里希望通过对比学习 模型能够学习到文本-图像对的匹配关系。 如下图所示CLIP包括两个模型 Text Encoder和Image Encoder其中Text Encoder用来提取文本的特征可以采用NLP中常用的text transformer模型 Image Encoder用来提取图像的特征可以采用常用CNN模型或者vision transformer。 上面这段文字来源于https://zhuanlan.zhihu.com/p/493489688 从数据上看之前相似度计算都是两个文本对text - text。只不过现在都是text - image了。clip是两个模型具体长什么样子后面再说 2.1 text-model负责把text转换成向量。2.2 image-model负责把image转换成向量。2.3 然后把上面两个向量做交叉计算loss然后loss反向传播这样两个模型的参数都会更新。 其实你想啊这个image-model处理图像的其实也可以改为处理视频、处理3d模型等。那简直是格局打开了。我现在没有数据后面也打算做一个。你再想想text-image text-image-video-3d这样联合起来是不是更好。没数据没机器做不了。有些人可能感觉你这人就知道TMD吹牛来来来我带你研究研究clip模型的源码。 数据 直接点击链接https://pan.baidu.com/s/1wGmXUNP021OWnW7Kik7q1A?pwdgd3c 来获得。把下载好的文件也就是test-2.6w.csv、train-137w.csv放在文件夹bigdata/raw_data里面。以此运行processdta_01.ipynb、processdta_02.ipynb、processdta_02.ipynb用来处理数据。 3.1 processdta_01.ipynb用来下载数据大概下载了10多个小时。3.2 processdta_02.ipynb用来筛选数据不是所有的图片数据都是可以用的这一步非常坑。需要留意。如果图片没有筛选好在你训练到中间的时候突然一下因为图片无法加载导致错误从而训练中断了。3.3 processdta_03.ipynb用来把数据干净的数据处理好合并好生成新的漂亮的训练数据。 其实完整下来看数据清洗就是把符合格式的照片筛选出来然后进行训练。 数据总结 说到底你的数据只要整理成这样的一个样式即可 textimage_path河南一村民继承祖上的一金碗,专家鉴定:此碗是溥仪皇帝用过的bigdata/image_data/test-9282.jpg著名钢琴家郎朗:我永远不会放弃演奏bigdata/image_data/test-2644.jpg科幻动作电影《超体》10月24日来袭bigdata/image_data/test-13199.jpg text这一列对应图片的标注或者和图片相关的文本。image_path这一列对应图片所在你电脑本地上的路径。是的搞了半天数据就是这么简单。 数据预处理 这里的数据预处理是我随便起的名字。说白了就是这么会是 使用tokenizer把text转换成input_ids和attention_mask. 使用processor把image转换成pixel_values. 处理text那还是很快的。百万级别的数据可能23分钟就行了。 因为image太大了只能在训练的时候每一batch才能去加载image 这就导致训练的时候特别慢。倒不是因为我的3090算力不行全都TMD卡在计算机IO上了非常让人难受。 模型部分 终于讲解到clip的模型部分了。这个clip模型实在是太灵活了你可以做很多个版本这里我们挑几个比较常见的结构来分享一下。 常见的clip模型 这里值得是常见的clip模型特指的是transformers包的clip模型。 clip主要就是分为两个部分一个是CLIPTextTransformer,一个是CLIPVisionTransformer说白了就是一个处理text一个处理image。CLIPTextTransformer和CLIPVisionTransformer的核心都共用了一个模型结构CLIPEncoder 。也就是CLIP编码部分。这里说的共用值得是模型框架相同而不是模型训练的时候参数也相同。 Q有些人就问了text和image两个生成的数据都不一样比如text转换成input_ids和attention_maskimage 转换成pixel_values他们怎么可以使用一个模型结构CLIPEncoder A这个也是非常好回答的因他俩又不是直接使用CLIPEncoder 前后都加了一些万金油的模型组件比如embedding、linear 等模型输出的时候也是这么做的。还是应了那句话就看你怎么吧数据转换成hidden_states以及怎么把hidden_states输出出去。 QCLIPTextTransformer和CLIPVisionTransformer输出的维度也不一定一样吧怎么计算交叉损失 A 也很简单啦加个linear对齐一下就行了。 看看CLIPTextTransformer和CLIPVisionTransformer的内心 中文版本的clip模型 上面的常见的clip模型确实是好其实你只要换一个支持中文的新tokenizer然后从0️⃣开始训练即可。 但是这么搞没什么创意呀。其实我第一次就是这么干的直接支持中文的新tokenizer。但是训练了一天loss基本上没变化。我内心其实是崩溃的。 后来我研究了一下transformers包里面的chinese-clip模型代码。我发现chinese-clip相对于clip 。就是把常规的CLIPTextTransformer换成了bert版本的。啊对这就破案了。这个奉上代码截图。 后续改进 因为训练image这类型的任务非常吃资源不管是我的显存还是我的磁盘。目前数据占用我硬盘100GB针对loss不下降下次如果再让我做我打算先把clip模型的vit部分先固定住然后训练bert来拟合vit-output。也可也固定bert模型训练vit模型也可以拆开做反正本质上都是Encoder然后计算相似度。 5. 图生文image-encoder-decoder 之前在huggingfacehttps://huggingface.co/nlpconnect/vit-gpt2-image-captioning上看到这个模型. 感觉这个模型很有趣想法很好。发现这个模型关于中文的不多。之前的clip训练其实挺失败的loss没有下降. 主要也就是抱着学习的态度把源码看懂把流程跑通。分享中间的细节和踩坑经历。 使用vit来作为encoder部分输出encoder_hidden_states绿色部分1。使用gpt2来作为decoder部分,接受encoder_hidden_states,绿色部分3。如果encoder输出的encoder_hidden_states和decoder接受的encoder_hidden_states维度不一样就加个linear,绿色部分2。 模型训练需要的数据样式 训练的时候模型需要的数据主要有两个维度 pixel_valueimage通过processor生成labeltext通过tokenizer生成的input_ids。计算loss的时候其实和gpt2一模一样的自回归本质上就是向后错位一下。 目前已经把训练好的模型发布在huggingface上了。https://huggingface.co/yuanzhoulvpi/vit-gpt2-image-chinese-captioning 本模块处理数据的方式和clip模型差不多可以看隔壁文件夹训练clip的数据处理思路。 只要把processdta_02.ipynb文件替换即可。执行顺序依然按照着processdta_01.ipynb、processdta_02.ipynb、processdta_03.ipynb。 训练部分train_encoder_decoder.ipynb 处理图像使用的是google/vit-base-patch16-224模型。处理文本使用的是yuanzhoulvpi/gpt2_chinese模型。最后就是把两个模型通过VisionEncoderDecoderModel粘起来。 训练的loss 训练的信息 gpu使用的是3090模型大概是2.16亿个参数。花了超过20个小时。但是大部分时间都是卡在IO上加载图片上 推理用你自己训练 参考infer_encoder_decoder.ipynb 直接用 from transformers import (VisionEncoderDecoderModel, AutoTokenizer,ViTImageProcessor) import torch from PIL import Imagevision_encoder_decoder_model_name_or_path yuanzhoulvpi/vit-gpt2-image-chinese-captioning#vit-gpt2-image-chinese-captioning/checkpoint-3200processor ViTImageProcessor.from_pretrained(vision_encoder_decoder_model_name_or_path) tokenizer AutoTokenizer.from_pretrained(vision_encoder_decoder_model_name_or_path) model VisionEncoderDecoderModel.from_pretrained(vision_encoder_decoder_model_name_or_path) device torch.device(cuda if torch.cuda.is_available() else cpu) model.to(device) max_length 16 num_beams 4 gen_kwargs {max_length: max_length, num_beams: num_beams}def predict_step(image_paths):images []for image_path in image_paths:i_image Image.open(image_path)if i_image.mode ! RGB:i_image i_image.convert(modeRGB)images.append(i_image)pixel_values processor(imagesimages, return_tensorspt).pixel_valuespixel_values pixel_values.to(device)output_ids model.generate(pixel_values, **gen_kwargs)preds tokenizer.batch_decode(output_ids, skip_special_tokensTrue)preds [pred.strip() for pred in preds]return predspredict_step([bigdata/image_data/train-1000200.jpg]) 6.vit 源码 之前都搞过clip、image-encoder-decoder。现在哪里还怕搞不懂vit.这里主要分享一下vit的最核心的部分。 vit 核心的数据内容 vit想法非常牛但是数据处理的思想更牛之前都没提出来过。 载对于一个图片将一个图片分割成N块。巧妙的使用nn.Conv2d。 初始化 import torch from torch import nn #base parameterimage_size224 # 图片的width和height patch_size16 # 将图片的分为块每一块的大小为16x16这样就有(224//16)^2 14 ^2 196个 num_channels3 # R,G, B hidden_size768 # 输出的hidden_size batch_size 16 # 一批数据有多少创建一个分块器和一个样本数据(一个batch) #分块器 project nn.Conv2d(num_channels, hidden_size, kernel_sizepatch_size, stridepatch_size)#样本数据(一个batch) #batch_size, num_channels, height, width pixel_values.shape pixel_values torch.randn(batch_size, num_channels, image_size, image_size)pixel_values.shape 输出分块的大小 project(pixel_values).shape # torch.Size([16, 768, 14, 14])数据再转换一下image的embedding就完成了。 image_embedding project(pixel_values).flatten(2).transpose(1, 2) image_embedding.shape # torch.Size([16, 196, 768]) # batch_size, seq_length, embedding_dim这个时候就已经和文本的数据一样了。维度都是(batch_size, seq_length, embedding_dim)再向下推导就是transformers了。没什么可介绍的了。 项目链接https://github.com/yuanzhoulvpi2017/zero_nlp 更多优质内容请关注公号汀丶人工智能会提供一些相关的资源和优质文章免费获取阅读。
http://mrfarshtey.net/news/3074/

相关文章: