基于单机最高能效270亿参数GPT模型的文本生成与理解

作者:李鹏,王玮,陈嘉乐,黄松芳,黄俊

单位:阿里云智能机器学习平台PAI & 达摩院自然语言基础技术

概述

GPT模型能较好的处理文本生成领域的各种任务,比如文本补全,自由问答,完形填空,写作文,写摘要,写小说,写诗歌等等。最近火爆全网的人工智能产品ChatGPT也是以GPT文本生成模型为底座。虽然GPT大模型作用在这些应用领域的效果很好,但是训练成本非常高。以OpenAI推出的1750亿的GPT-3为例,在1024张A100GPU上预估需要34天,一万亿参数的GPT-3在3072张A100显卡上也至少需要84天;微软/英伟达联合推出的5300亿的NLG模型,在2048张A100显卡上耗时了3个月的训练时间才能达到比较好的收敛效果。

针对GPT基础模型参数量大,训练&推理硬件资源消耗过高等问题,基于MoE的稀疏化训练是目前最具竞争力的降本增效途径。MoE的全称是Mixture of Experts,其中的Expert对应的是Transfomrer模型的MLP层,在训练的时候从多个MLP中选取一个MLP进行激活(如下图所示)。这意味着模型可以在不增加计算强度(FLOPS/Bytes)的情况下,通过增加MLP模块的数量来增加模型参数量级,进而提升模型在下游任务上的泛化性能。采用MoE后的稀疏Transformer模型和同等质量(验证集loss以及zeroshot nlu下游任务性能)的稠密模型相比有将近1.2倍的训练吞吐性能提升,1.3倍的推理吞吐性能提升。我们在稀疏架构总体设计的时候,选择让MoE跟纯Transformer Decoder架构的GPT进行有机结合。原因是MoE跟Decoder结合效果通常会好于跟Encoder的结合效果。具体来讲,Encoder是通过随机masking的方式学习语言模型,而这种被随机masked的token会让expert的路由选择出现不均衡。另一方面,考虑到Decoder类的GPT模型比Encoder类的Bert模型有更广泛使用场景,因此我们采用GPT+MoE的技术架构路线,探索单机最高能效的绿色低碳GPT大模型训练&推理软硬一体化适配技术在中文文本生成场景的落地可行性。

基于当前比较成熟的分布式MoE专家路由选择技术,采用Switch Transformer[2]中的top-1路由机制。每个Expert根据如下的softmax函数被赋予一个概率值,取概率最高(top-1)的那个Expert当作网络的FFN层。其中W_r是做路由选择时需要学习的参数。

GPT-MoE训练&推理能效分析

基础预训练模型训练&推理性能分析

任何一种稠密(Dense)的GPT模型,都有一种效果与之对应的训练&推理速度更快的稀疏(MoE)GPT模型。我们的目标是在受限硬件比如单机条件下找到这种GPT-MoE模型配置,然后通过对MoE算法进行改进来进一步提升它的训练能效。我们通过对比稠密&稀疏模型的训练&推理性能,来发现与稠密模型等价的高能效稀疏模型。

8种GPT模型的参数量,模型结构,训练超参数如下表所示:

如下图所示,1.3B+MoE32/64模型在相同的step下对比1.3B dense表现出更低的验证集loss,其中1.3B+MoE-64模型的loss甚至低于2.7B dense模型

5个模型中,0.35B+MoE-64的训练吞吐速度最快,是其他模型的2倍左右。其余四个模型中,吞吐速度较高的是1.3B dense和1.3B+MoE-32,1.3B+MoE-64和2.7B dense的速度相近。如下图所示:

推理吞吐速度方面,1.3B Dense的显存消耗最少,0.35B+MoE64的延迟最低。

input_len = 20

output_len = 128

batch_size = 1

通过以上的图表分析,我们能大致判断出2.7B-Dense模型对应的高能效的稀疏模型是以1.3B的dense模型为底座,同时配置32或者64个专家的MoE模型。下面我们重点分析下1.3B+MoE-32/64和2.7B dense模型的性价比。在单机A100上预训练200个小时后,借助Tensorboard画出预训练验证集loss曲线。我们发现在验证集loss到达2.16时,1.3B+MoE-64模型的收敛速度是2.7B dense的1.17,1.3B+MoE-32的收敛速度落后于2.7B dense模型15%,如下图所示:

从下图中的基于Faster Transformer的单级单卡推理性能上看。1.3B+MoE-32和1.3B+MoE64的吞吐速度差不多且都高于2.6B dense模型,这是符合预期的,因为他们的底座大小都只有1.3B。

中文ZeroShot-NLU效果评测

中文文本生成效果评测

文本补全

诗歌生成

在线体验地址:https://www.modelscope.cn/models/PAI/nlp_gpt3_text-generation_0.35B_MoE-64/summary

广告文案生成

在线体验地址:https://www.modelscope.cn/models/PAI/nlp_gpt3_text-generation_1.3B_MoE-32/summary

输入prompt类型#裙颜色#白色风格#清新图案#刺绣裙下摆#花边裙长#连衣裙裙领型#v领*裙款式#抽褶类型#裤*材质#羊毛
达摩院 1.3B Dense (51200)这款连衣裙采用了清新的白色调,给人一种清爽的感觉,同时,还带来了清爽的视觉感。裙身上的刺绣图案,精致美观,尽显浪漫的气息。而v领的设计,则为其增添了几分优雅的气息。再加上褶皱的裙摆,更是增添了灵动的感觉。这款羊毛裤,采用了羊毛的材质,手感柔软,穿着舒适,且不易变形,且不易变形,耐穿性强。裤子的版型是有点微微的,可以很好的修饰腿型,拉长腿部比例,显得腿部更加修长。
达摩院 2.7B Dense (51200)连衣裙是每个女们的必备,这款连衣裙采用了清新的绿色调,带来一种清新淡淡雅的气质,同时也带来清新的视觉效果。v领的设计,更能衬托出优美的天鹅颈,还可以很好的修饰脸型和脸型,更好的展现出女性的柔美。>裙子上的花朵刺绣花边装饰,更具时尚气息,更是让人眼前一亮。针织衫采用优质的纯棉,手感柔软,穿着舒适透气,穿上身不勒身形。裤身采用了弹力的针织面料,手感舒适,穿着舒适亲肤。裤腿处的侧边采用的开口设计,不仅可以起到修饰腿部的作用,又能够更加的显腿长,同时也能让你轻松拥有型。
PAI 0.35B+MoE-64 (70k)这款连衣裙采用了清新的白色调,搭配精致的刺绣花边,尽显甜美气质。v领的设计,修饰脸型,衬托出精致的脸庞。褶皱花边的袖口,更显甜美气质。这款裤子采用了羊毛的面料,具有较好的弹性和透气性,穿着起来舒适。裤子的版型设计,能够很好的修饰腿型,让你看起来更加的修长。裤子的版型设计,能够很好的修饰腿型,让你的腿部看起来更加的修长。
PAI 1.3B+MoE-32 (70k)这一款碎花连衣裙采用了精致的刺绣花朵,清新的气息。清新的花边,更加的清新颖,让你在春季节的感觉。经典百搭的一款针织衫,在视觉上的设计,让你的同时也很好的穿搭。这款牛仔裤子的裤子采用了经过的设计,更是很好的修饰身体的腿型,穿着舒适又不紧。
PAI 1.3B+MoE-64 (70k)清新的粉红色连衣裙,穿上身后能够衬托出女性的柔美。领口处采用的是花边的设计,让整体的层次感更加的精致,更能凸显甜美。圆领的领口设计,更加的修饰脸型,更显精致,而且不挑人的脸蛋糕裙摆,更能凸显女性的精致魅力这款裤子的版型设计,可以说是腿部的位置,可以很好的拉长了身材比例,而且不会有紧绷的效果,让人看起来更加的有型。而且有着很高的剪裁设计,能够很好的修饰腿型,还能很好的遮肉,让腿部的肉肉,还能很好的展现你的腿部的曲线。

作文生成

在线体验地址:https://www.modelscope.cn/models/PAI/nlp_gpt3_text-generation_1.3B_MoE-64/summary

输入prompt信任老板商店还给气喘吁吁美丽成为现实忘不了逼真
达摩院 1.3B Dense (51200)回到家,我和老妈气喘吁吁地赶到附近的小店去买了一张贺卡。我把写得一片“对联”的纸贴在“商店”的墙上,还给老板20元钱。老板还给我做了一个“会飞”的邮局董事长呢!我还在纸上写了一些祝福语。老板还夸我是一个诚实的好孩子呢!最后,我还当上了董事谁不曾有过那种梦呢?谁不曾有过那种美丽,让人向往的美丽呢?当你忘不了那些令人向往的梦时,那是一种多么诱惑而又美丽的梦啊!在那里人们可以大肆的陶醉一番,而在那里人们也可以过目不忘,可为什么呢?梦总是那么深远大,而又有多远大的吸引力。
达摩院 2.7B Dense (51200)回到家,我急不可待地把这件事说给了他们,他们听,我刚说完还感动万分,立刻向商店去买了盒方便面。谁知>商店里的老板娘火冒三丈,拿起了那盒快就准备好的方便面。“还给?”我急得心都快跳了出来。这时,走进商店,妈妈拿起一件外套心仪已是生了。谁不曾有过那样的梦呢?谁不曾有过那样的理想呢?这毕竟是过去,而将来又会成为现实,忘不了的事,成为记忆中的一页记忆。这其中当然包含了许多道理,也有很多无法用言的东西,但它们都会成为我心中最美丽的梦境,我迷恋着美丽而令我向往的梦!
PAI 0.35B+MoE-64 (70k)回到家,我把我做的手工事一五一十地告诉了他,老板气喘吁吁地说:“你怎么可以这样做!你这样做是不对的,我们应该把你的信任还给你,你看行不行?”听完后,我心情舒畅多了,心想:我以后做事一定要细心。于是,我便把信任还给店里,到了商店,把我买下的信谁不曾有过美丽的梦?谁不曾有过梦的历险?谁不曾有过美丽的梦?谁不曾有过梦的迷茫?谁都不曾有过梦的逼真?我忘不了我的梦,我的梦是成为一名画家;我忘不了我伟大的梦:成为一名作家;我忘不了我的梦是成为一名画家;我更忘不了我的美丽中国
PAI 1.3B+MoE-32 (70k)回到家,我便气喘吁吁地冲到商店,把钱还给老板说:“老板,你,你,我说话算数,还剩15元钱,够本就行了!”老板仍然不信任我,问道:“怎么回事?”“把钱拿去还给老板。”我只好硬着头皮罢了。谁不曾有过这样的梦呢?似乎很逼真,让人忘不了,也很难想象;似乎很难想象,但它终究是现实,梦终究是美丽的, 即使梦不是想象,它终究是逼真,因为美丽的事物总有被我们忽略的一面而不被我们忽略存而已。梦永远在身边,却不在身边,只要随心走
PAI 1.3B+MoE-64 (70k)回到家,老板气喘吁吁地说:“我还给你买了一件衣服,你快去商店给老板买一件衣服吧!我还给你买了一件衣服,你快去商店吧!”老板还不停地点着头。老板不信任他,他就把钱还给了老板。谁不曾有过那种梦呢?我想,那一定是美丽的梦,可是现实却逼真的梦,成为了现实中真实的梦,让人难以忘却。我想,这就是我梦中的美丽梦。我的梦,成真而又真实的梦,让人忘不了。

自研GPT-MoE算法创新&实验分析

背景

Top-1 Gating 是目前最主流也最有效的 Routing 算法,但是也有着明显的缺点。例如,在 Top-1 Gating 中,每一个 Token 仅会被交给一个 expert 处理,因此,时常会出现某些 expert 需要处理很多 token,而有些 expert 仅需处理极少数量的 token 的情况,这导致处理极少 token 的 expert 无法获得足够多的信息,无法得到充分的利用。

高能效专家路由选择

因此,我们自研了新的路由算法,如下图所示。我们的算法让 expert 主动选择固定数量(capacity)的 token,同一个 token 可以同时被不同的 expert 处理,从而使每一个 expert 都能得到充分的训练。

最后生成的 token 的表示,则采用 weighted sum 的方式,将来自不同 expert 生成的表示加权求和并经过Expert Residual模块,以获得最终的 token 表示。这样的表示,由于有多个 expert 的共同作用,因此更加鲁棒。

  1. 计算 expert 对 token 的偏好:

S = X ∗ W e S=X∗We S=XWe

其中 X ∈ R n ∗ d X \in \mathbb{R}^{n*d} XRnd 是输入的 tokens 的表示, W e ∈ R d ∗ e W_{e} \in \mathbb{R}^{d*e} WeRde 是 experts 的权重, n n n表示输入 token 的数量, e e e表示 expert 的数量, d d d表示隐藏特征的维度, S ∈ R n ∗ e S \in \mathbb{R}^{n*e} SRne为每一个 expert 对输入的每一个 token 的偏好程度;

  1. L-Softmax 算法训练expert权重

训练过程中利用 L-Softmax loss 优化 experts 的权重 W e W_{e} We,实现每一个expert对token都具有可区分的的偏好。

  1. 每个 expert 选取固定数量的 token:

I = Topk ( S , k ) I = \text{Topk}(S, k) I=Topk(S,k)

其中, k k k就是我们预先确定的,每个 expert 可以处理的最多 token 的数量, I ∈ R e ∗ k I \in \mathbb{R}^{e*k} IRek记录了每个 expert 需要处理的 tokens 的索引;

4.** 计算最后的输出:

X o u t = a ∗ E x p e r t R e s i d u a l ( E x p e r t s ( X , I ) ) + ( 1 − a ) ∗ E x p e r t s ( X , I ) Xout=a∗ExpertResidual(Experts(X,I))+(1−a)∗Experts(X,I) Xout=aExpertResidual(Experts(X,I))+(1a)Experts(X,I)

每一个 expert 根据索引计算出对应 tokens 的表示,并将不同 expert 对同一 token 生成的表示加权求和,最后通过 Expert Residual 模块生成最终的输出 X o u t Xout Xout

实验分析

下图是采用自研算法与 Top-1 Gating、s-BASE 算法的验证集 loss 随训练 step 变化的曲线图,我们可以发现,采用自研算法的验证集 loss 始终低于 top-1 gating 和 s-BASE 算法的验证集 loss,证明了我们自研算法的有效性。

image.png

同时,我们观察到,验证集 loss 首次低于 2.7 的时间,自研算法的速度是 s-BASE 的 1.48 倍,极大的减少了模型训练的开销。

image.png
此外,我们也分析了自研算法和 Top-1 Gating、s-BASE 的训练吞吐,如下图所示,采用自研算法相比于 s-BASE 的训练吞吐提升了 1.17 倍。

image.png

基于PAI DLC的GPT-MoE预训练

Rapidformer为EasyNLP中各种Transformer模型提供训练加速能力,这是通过有机整合微软的DeepSpeed,英伟达的Megatron来做到的,如下图所示:

在GPT-MoE大模型的预训练中,我们用到的主要训练加速核心技术包括:

混合精度训练(Mixed Precision Training) 采用混合精度训练的好处主要有以下两点:1. 减少显存占用,由于FP16的内存占用只有FP32的一半,自然地就可以帮助训练过程节省一半的显存空间。2. 加快训练和推断的计算,FP16除了能节约内存,还能同时节省模型的训练时间。具体原理如下图所示,核心是在反向传播参数更新的时候需要维护一个FP32的备份来避免舍入误差,另外会通过Loss Scaling来缓解溢出错误。

选择性激活重算(Selective Activation Recomputation)在神经网络中间设置若干个检查点(checkpoint),检查点以外的中间结果全部舍弃,反向传播求导数的时间,需要某个中间结果就从最近的检查点开始计算,这样既节省了显存,又避免了从头计算的繁琐过程。实际使用时,有些layers产生的激活值大但是计算量小,需要选择性的过滤掉这一部分的激活值,保留重要的激活值,以节省重计算量。

Zero优化器状态切分The Zero Redundancy Optimizer)是一种用于大规模分布式深度学习的新型内存优化技术。ZeRO具有三个主要的优化阶段分别对应于优化器状态,梯度和参数的划分。我们这里使用的是Zero-1优化器状态分区。

序列并行Sequence Parallelism)是一种对长序列进行切分从而加速训练的技术,在Tensor Parallelism的基础上,将Transformer核的LayerNorm以及Dropout层的输入按Sequence Length维度进行了切分,使得各个设备上面只需要做一部分的Dropout和LayerNorm即可。这样做的好处有两个:1. LayerNorm和Dropout的计算被平摊到了各个设备上,减少了计算资源的浪费;2. LayerNorm和Dropout所产生的激活值也被平摊到了各个设备上,进一步降低了显存开销。

接下来我们通过PAI-DLC产品来演示如何执行GPT-MoE的基础预训练。

环境准备

首先通过阿里云产品机器学习平台PAI页进入容器训练DLC创建新的训练任务,如下图所示。

有三个关键的地方需要配置,分别是专属镜像,数据集以及执行命令。节点镜像地址配置为:http://pai-image-manage-registry.cn-shanghai.cr.aliyuncs.com/pai/pai-rf-image-poc-moe:0.2。执行命令配置为:

cd /workspace/RapidformerPro/examples/megatron &&
bash dlc_run_pretrain_megatron_gpt.sh run 1 jiebabpe 0.125B 8 0 1 1 sel none 10000

其中dlc_run_pretrain_megatron_gpt.sh可以从EasyNLP的github中获取:https://github.com/alibaba/EasyNLP/blob/master/examples/rapidformer/gpt_moe/run_pretrain_megatron_gpt.sh 传递给dlc_run_pretrain_megatron_gpt.sh的主要有以下11个参数,分别是:

MODE=$1                     #run or debug
GPUS_PER_NODE=$2            #申请的卡数
TOKENIZER=$3                #中文jiebabpe,英文gpt2bpe
MODEL_SIZE=$4               #0.125B, 0.35B, 1.3B, 3.6B 等等
MOE=$5                      #专家数量
RT=$6                       #路由类型
BATCH_SIZE=$7               #batch size
TP=$8                       #模型并行度
AC=$9                       #激活检查点类型
ZERO=${10}                  #是否打开zero-1
SAVE_INTERVAL=${11}         #报错ckpt的step数

资源&数据准备

由于预训练数据集体积比较大,采用下载的方式不是很方便。借助于DLC提供的OSS路径的挂载功能,可以很方便的直接使用存储在OSS上的大规模预训练数据集。

任务资源配置建议使用单机八卡A100来训练1.3B以上的GPT-MoE模型。

任务创建

任务创建完成后,进入任务监控页面观察任务执行状态,如下所示:

点击日志查看运行状态,如下所示:

基于PAI DSW的GPT-MoE微调诗歌生成

使用DLC完成GPT-MoE的基础预训练后,还需要对模型进行微调才能在下游任务生成领域比如诗歌,小说,文等领域获得比较好的生成效果。接下来我们通过PAI-DSW产品来演示如何执行GPT-MoE的下游任务微调。我们以0.35B+MoE64的GPT大模型为例,尝试对诗歌生成任务进行微调来获得比较好的生成效果。

环境准备

首先创建DSW任务,资源类型选择单机八卡V100-32G,如下所示:

由于预训练checkpoint体积比较大,采用下载的方式不是很方便。借助于DSW提供的OSS路径的挂载功能,可以很方便的直接使用存储在OSS上的预训练模型来进行下游任务微调,配置方法如下图所示。

接着配置镜像,采用和DLC中同样的镜像地址:http://pai-image-manage-registry.cn-shanghai.cr.aliyuncs.com/pai/pai-rf-image-poc-moe:0.2

创建好后,点击打开进入到DSW交互式开发环境

数据准备

首先,您需要下载用于本示例的训练和测试集,并创建保存模型的文件夹,命令如下:

!wget https://atp-modelzoo-sh.oss-cn-shanghai.aliyuncs.com/release/tutorials/text_generation_datasets/poetry/train.tsv
!wget https://atp-modelzoo-sh.oss-cn-shanghai.aliyuncs.com/release/tutorials/text_generation_datasets/poetry/dev.tsv
--2023-01-05 06:45:39--  https://atp-modelzoo-sh.oss-cn-shanghai.aliyuncs.com/release/tutorials/text_generation_datasets/poetry/train.tsv
Resolving atp-modelzoo-sh.oss-cn-shanghai.aliyuncs.com (atp-modelzoo-sh.oss-cn-shanghai.aliyuncs.com)... 47.101.88.27
Connecting to atp-modelzoo-sh.oss-cn-shanghai.aliyuncs.com (atp-modelzoo-sh.oss-cn-shanghai.aliyuncs.com)|47.101.88.27|:443... connected.
HTTP request sent, awaiting response... 200 OK
Length: 43411824 (41M) [text/tab-separated-values]
Saving to: ‘train.tsv’train.tsv           100%[===================>]  41.40M  33.2MB/s    in 1.2s    2023-01-05 06:45:40 (33.2 MB/s) - ‘train.tsv’ saved [43411824/43411824]--2023-01-05 06:45:41--  https://atp-modelzoo-sh.oss-cn-shanghai.aliyuncs.com/release/tutorials/text_generation_datasets/poetry/dev.tsv
Resolving atp-modelzoo-sh.oss-cn-shanghai.aliyuncs.com (atp-modelzoo-sh.oss-cn-shanghai.aliyuncs.com)... 47.101.88.27
Connecting to atp-modelzoo-sh.oss-cn-shanghai.aliyuncs.com (atp-modelzoo-sh.oss-cn-shanghai.aliyuncs.com)|47.101.88.27|:443... connected.
HTTP request sent, awaiting response... 200 OK
Length: 208167 (203K) [text/tab-separated-values]
Saving to: ‘dev.tsv’dev.tsv             100%[===================>] 203.29K  --.-KB/s    in 0.1s    2023-01-05 06:45:41 (1.69 MB/s) - ‘dev.tsv’ saved [208167/208167]

数据下载完成后,可以通过以下代码查看第一条数据。在训练集验证集中,每一行为一条诗歌数据。

print('Training data sample:')
! head -n 1 train.tsv
print('Development set data sample:')
! head -n 1 dev.tsv
Training data sample:
半生长以客为家,罢直初来瀚海槎。始信人间行不尽,天涯更复有天涯。
Development set data sample:
云髻高梳鬓不分,扫除虚室事元君。新糊白纸屏风上,尽画蓬莱五色云。

初始化

在EasyNLP专属镜像环境下,我们首先引入模型运行需要的各种库,并做一些初始化。在本教程中,我们使用gpt-moe-0.35B+MoE64作为预训练模型底座。

from functools import partial
import torch
from megatron import get_args
from megatron.model import ModelType
from megatron.utils import (average_losses_across_data_parallel_group,
get_ltor_masks_and_position_ids)
from rapidformer.application.zeroshot_nlu.zeroshot_gpt_finetuner import \
GPTFinetuner
from rapidformer.dataset.gpt_dataset import GPTDataset
from rapidformer.engine.engine import RapidformerEngine
from rapidformer.engine.initialize import get_tokenizer
from rapidformer.model.transformer.gpt_model import GPTModel

模型训练&评估

finetuner = MegatronGPTMoEFinetuner(engine=engine)
finetuner.train()

一步执行

值得一提的是,上述所有训练/评估,都已经被集成到EasyNLP/examples/rapidformer/gpt_moe/finetune_megatron_gpt.py中,可采用直接执行脚本文件EasyNLP/examples/rapidformer/gpt_moe/run_finetune_text_generation_gpt.sh的方式,一步执行上述所有训练/评估。根据脚本run_finetune_text_generation_gpt.sh,需要设置的具体参数如下:

TASK_NAME=$1                    #任务名称,这里是poetry
TRAIN_DATASET_PATH=$2           #训练集路径
VALID_DATASET_PATH=$3           #验证集路径
PRETRAIN_CHECKPOINT_PATH=$4     #预训练模型路径
MODEL_SIZE=$5                   #预训练模型大小
MOE=$6                          #专家数量
RT=$7                           #路由类型
BATCH_SIZE=$8                   #batch size
EPOCH=$9                        #训练轮次
TP=${10}                        #模型并行度
AC=${11}                        #激活检查点类型
ZERO=${12}                      #降显存类型
SEQ_LEN=${13}                   #序列长度
sh run_finetune_text_generation_gpt.sh
poetry
/mnt/workspace/train.tsv
/mnt/workspace/train.tsv
/workspace/checkpoints/wudao-megatron-gpt-moe-64-0.35B-lr-3e-4-bs-4-gbs-256-tp-1-ac-sel-zero-none
0.35B
64
0 
16
2
1
sel
none
128

分析Tensorboard

分析Tensorboard,对比不同实验参数设置,比如我们选择调试训练轮次分别是2和5,观察收敛曲线的变化,如下所示:

从上图可以看出,训练轮次越大,验证集loss越低,收敛效果越好。于是我们选择训练5个epoch后的ckpt来做诗歌生成的预测

模型预测

文本生成效果预测已经被集成到EasyNLP/examples/rapidformer/gpt_moe/generate_text_gpt.py中,可采用直接执行脚本文件EasyNLP/examples/rapidformer/gpt_moe/run_text_generation_gpt.sh的方式,一步执行诗歌生成和预测。首先按照如何格式准备预测用的数据集。

[{"id": 0,"txt": "大漠孤烟直"},{"id": 1,"txt": "江上归帆天际开"}
]

然后根据脚本run_finetune_text_generation_gpt.sh里面的参数设置,运行命令:sh run_text_generation_gpt.sh

CHECKPOINT_PATH=$1           #微调后的模型路径
MODEL_SIZE=$2                #模型大小
MOE=$3                       #专家数量
SEQ_LEN=$4                   #序列长度
TOP_K=$5                     #topk
INPUT_SEQ_LEN=$6             #输入最大长度
OUTPUT_SEQ_LEN=$7            #输出最大长度
INPUT_FILE=$8                #输入文件路径
OUTPUT_FILE=$9               #输出文件路径
sh run_text_generation_gpt.sh
/workspace/checkpoints/finetune-poetry-ckpts
0.35B
64
128
5
20
128
input_poetry
output_poetry

生成结果如下:

{"id": 0,"prompt": "大漠孤烟直","output_poetry": "大漠孤烟直,雄哉太山岑。万古长松树,青青如碧玉。"
}
{"id": 1,"prompt": "江上归帆天际开","output_poetry": "江上归帆天际开,一帆秋色望中来。何当一洗三千丈,万里风风尽下来。"
}

基于PAI EAS的在线推理部署

使用DSW完成GPT-MoE在下游任务上的微调后,就可以在线部署下游文本生成任务的服务了。接下来我们通过PAI-EAS产品来演示如何执行GPT-MoE的下游任务服务的在线部署。

开发基于FasterTransformer的Processor

首先使用Faster Transformer Converter将微调后的诗歌模型进行格式转换

cd ~/RapidformerPro/examples/fastertransformer

sh run_convert.sh

model_type=$1             #模型类型:dense or moe
tokenizer=$2              #分词器类型:gpt2bpe or jiebabpe
infer_gpu_num=$3          #推理用的卡数
INPUT_DIR=$4              #微调后的模型路径名
SAVED_DIR=$5              #转换后的模型路径名

然后基于EAS提供的开发参考https://help.aliyun.com/document_detail/130248.html,开发文本生成processor。核心process方法参考如下

    def process(self, data):""" process the request data"""data_str = data.decode('utf-8')data_json = json.loads(data_str)data = self.pre_proccess(data)contexts = [data_json['inputs'][0]]user_parameters = data_json['parameters']max_length = int(user_parameters['max_length'])seed = 42top_k = int(user_parameters['top_k'])self.top_k = top_kself.output_len = max_lengthstart_ids = [torch.IntTensor(self.tokenzer.tokenize(c.replace('\n', '\n').replace('\"', '"')))for c in contexts]start_lengths = [len(ids) for ids in start_ids]start_ids = pad_sequence(start_ids,batch_first=True,padding_value=self.end_id)start_lengths = torch.IntTensor(start_lengths)torch.manual_seed(seed)random_seed_tensor = torch.zeros([1], dtype=torch.int64)with torch.no_grad():tokens_batch = self.gpt(start_ids, start_lengths, self.output_len, self.beam_width,self.top_k *torch.ones(size=[self.max_batch_size], dtype=torch.int32),self.top_p *torch.ones(size=[self.max_batch_size], dtype=torch.float32),self.beam_search_diversity_rate *torch.ones(size=[self.max_batch_size], dtype=torch.float32),self.temperature *torch.ones(size=[self.max_batch_size], dtype=torch.float32),self.len_penalty *torch.ones(size=[self.max_batch_size], dtype=torch.float32),self.repetition_penalty *torch.ones(size=[self.max_batch_size], dtype=torch.float32),random_seed_tensor, self.return_output_length,self.return_cum_log_probs)if self.return_cum_log_probs > 0:tokens_batch, _, cum_log_probs = tokens_batchprint('[INFO] Log probs of sentences:', cum_log_probs)outputs = []batch_size = min(len(contexts), self.max_batch_size)outputs_token = np.ones([batch_size, self.output_len], dtype=int)tokens_batch = tokens_batch.cpu().numpy()for i, (context, tokens) in enumerate(zip(contexts, tokens_batch)):for beam_id in range(self.beam_width):token = tokens[beam_id][:start_lengths[i] +self.output_len]token = token[~np.isin(token, torch.tensor([7]))]output = self.tokenzer.detokenize(token)outputs.append(output)print(f'[INFO] batch {i}, beam'f' {beam_id}:'f' \n[Context]\n{context}\n\n[Output]\n{output}\n')output_token = tokens[beam_id][start_lengths[i]:start_lengths[i] + self.output_len]outputs_token[i] = output_tokenoutputs = [o.replace('\n', '\n') for o in outputs]result_dict = {'text': outputs[0]}return get_result_str(result_dict=result_dict)

搭建在线服务

基于ModelScope的在线文本生成演示

我们已经搭建了诗歌,广告文案,作文三个文本生成服务,具体的在线体验地址是:https://www.modelscope.cn/models?name=moe&page=1

我们可以修改modelscope页面上的README.md信息来设计应用样式

tasks:
- text-generation
widgets:
- examples:
- name: 1
title: 诗歌生成
inputs:
- name: text
data: 大漠孤烟直
parameters:
- name: max_length
type: int
value: 128
- name: top_k
type: int
value: 5

在modelscope上呈现出来的效果如下所示:

参考文献

[1] . Outrageously Large Neural Networks: The Sparsely-Gated Mixture-of-Experts Layer

[2]. GShard: Scaling Giant Models with Conditional Computation and Automatic Sharding

[3]. Switch Transformers: Scaling to Trillion Parameter Models with Simple and Efficient Sparsity

[4]. BASE Layers: Simplifying Training of Large, Sparse Models

[5]. Hash Layers For Large Sparse Models

[6]. TAMING SPARSELY ACTIVATED TRANSFORMER WITH STOCHASTIC EXPERTS

[7]. GLaM: Efficient Scaling of Language Models with Mixture-of-Experts

[8]. Unified Scaling Laws for Routed Language Models

[9]. Designing Effective Sparse Expert Models

[10]. Large Margin Deep Networks for Classification

相关阅读

阿里灵杰:中文稀疏GPT大模型落地 — 通往低成本&高性能多任务通用自然语言理解的关键里程碑

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/8855.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

ChatGPT的因果关系基础:数据科学的实践与发展!

数据会说谎?如何正确的挖掘并使用数据? 前沿的科学实验如何做? 实验又是如何欺骗你的? ChatGPT等AIGC技术如何与因果学习双向赋能? 数据中台如何发挥功效? 用户增长有捷径吗? 数据科学的最佳实践…

最新ChatGPT商用网站源码+支持ai绘画+GPT4.0+GPT3.5+Prompt角色+实时语音识别输入+后台一键版本更新!

程序已支持ChatGPT4.0、Midjourney绘画、GPT3.5 API绘画、新增绘画广场功能、Prompt面具角色扮演功能,后台自定义添加,用户也可自定义添加实时语音识别输入、用户会员套餐、用户每日签到功能、后台管理、一键更新版本。支持手机电脑不同布局页面自适应。…

2023最新ChatGPT商业运营网站源码+支持ChatGPT4.0+新增GPT联网功能+支持ai绘画+实时语音识别输入+用户会员套餐+免费更新版本

2023最新ChatGPT商业运营网站源码支持ChatGPT4.0新增GPT联网功能支持ai绘画实时语音识别输入用户会员套餐免费更新版本 一、AI创作系统二、系统程序下载三、系统介绍四、安装教程五、主要功能展示六、更新日志 一、AI创作系统 提问:程序已经支持GPT3.5、GPT4.0接口…

Mantis系列:MantisBT 注册新用户时设置密码

修改\xampp\htdocs\mantis\config_defaults_inc.php配置文件 找到 $g_send_reset_password 修改前:$g_send_reset_password ON; 修改后: $g_send_reset_password OFF;

使用Foxmail 登录qq邮箱使用第三发授权码登录失败

上午通过 mac 来登录qq邮箱本来很简单的,账户授权码就可以了,但是总是登录不上去,这里来总结一下 客户端Foxmail 这里填写一个授权码就可以了,剧情的授权码到自己的qq邮箱 中获取: QQ邮箱->设置->账户-> 前…

常见邮件发送失败原因分析以及解决方法

本文来自:http://www.maikongjian.com/style/info/shownews2.asp?id439 一.发到 sina.com 的邮件会被退回 我发到 sina 的邮件会被退回,并提示"remote server said: 553 Spam Mail http://mail.sina.com.cn/FAQ.html";错误,怎么…

TP6验证码的使用和验证失败的原因以及解决办法

首先使用Composer安装think-captcha扩展包&#xff1a; composer require topthink/think-captcha项目根目录下 在模版内添加验证码的显示代码 <div>{:captcha_img()}</div>或者 <div><img src"{:captcha_src()}" alt"captcha" /&…

java程序通过腾讯邮箱发送邮件失败:javax.mail.AuthenticationFailedException: 535 Error: authentication failed, syste

1.问题描述 通过java程序实现邮箱发送验证码的功能使用一段时间后出现发送邮件失败的问题排查后提示&#xff1a;javax.mail.AuthenticationFailedException: 535 Error: authentication failed, syste完整日志 DEBUG: setDebug: JavaMail version 1.4.7 DEBUG: getProvider(…

登陆163邮箱显示服务器验证失败是什么原因?微信怎么登陆邮箱?

周末休息的时候呆在家里&#xff0c;突然收到老板打来的电话&#xff0c;说有一封紧急邮件要马上回复。于是急急忙忙打开电脑登录企业邮箱&#xff0c;却发现登录邮箱时显示服务器验证失败&#xff0c;这是怎么回事呢&#xff1f;有没有其他电子邮箱入口来登录邮箱&#xff1f;…

第三方客户端登录QQ邮箱遇到“无法验证账户名或密码”问题解决

由于好久没有再登录QQ邮箱了&#xff0c;今天使用MBP的mail客户端登录了下&#xff0c;竟然一直出现无法验证账户名或密码的问题&#xff0c;很是纳闷呀。。。以图为证? 解决步骤&#xff1a; 登录qq邮箱https://mail.qq.com/cgi-bin/frame_html 开启IMAP/SMTP服务 在打开过…

Foxmail 添加QQ邮箱失败 提示密码错误

今天使用Foxmail的时候一直弹出密码错误提示框&#xff0c;输入QQ密码和邮箱独立密码都不行。上网查资料得以解决&#xff0c;在此记录下以备之后再次遇到这个问题。 首先查看邮箱的POP3/SMTP服务是否开启 在网页端登录QQ&#xff0c;在 设置 -> 账户 -> POP3/IMAP/SMTP…

QQ邮箱第三方密码验证失败解决方法

日常学习中&#xff0c;使用第三方邮箱进行接受邮件很常用&#xff0c;但是有时候更改了QQ的密码之后&#xff0c;就会出现重新验证&#xff0c;每次都搞了一大会&#xff0c;而且还很麻烦&#xff0c;感觉很智障&#xff0c;下面我来告诉大家快捷的方法&#xff0c;比起百度那…

imap账号验证失败

在使用第三方客户端登录qq邮箱比如网易邮箱&#xff0c;有时出现imap账号验证失败时&#xff0c;此时可以通过以下方式解决&#xff1a; 1. 首先登录qq邮箱&#xff0c;进入账号设置页面 2. 开启下面所示的服务 3. 此时会要求你输入qq安全中心显示的6位数动态密码 4. 打开qq安…

从 AI 绘画到 ChatGPT,聊聊生成式 AI

我们小时候经常有幻想&#xff0c;未来不用再去上班了&#xff0c;在工厂工作的都是机器人。在家也不用打扫卫生&#xff0c;机器人可以包揽一切。不知不觉间&#xff0c;我们小时候的幻想已经慢慢变成现实&#xff0c;工厂里有了多种型号的机械臂&#xff0c;代替了部分流水线…

论文投稿查重

这里写自定义目录标题 欢迎使用Markdown编辑器新的改变功能快捷键合理的创建标题&#xff0c;有助于目录的生成如何改变文本的样式插入链接与图片如何插入一段漂亮的代码片生成一个适合你的列表创建一个表格设定内容居中、居左、居右SmartyPants 创建一个自定义列表如何创建一个…

论文查重原理及实现

论文查重原理及实现 原理: 在知网上的论文检测为整篇的进行上传但是本人却是提交自己的正式论文部分上去的(paperpass), 上传的文章格式对检测结果可能会造成影响(在paperpass上存在两种类型(分别为.doc, .docx), 但有的还可以是.txt文件), 此影响为几十个字的小段可能检测不…

ChatGPT 新应用时代来临!CSDN AIGC 与大模型技术应用峰会全日程公布

我们正处在一个什么样的时代节点&#xff1f; 比尔盖茨直指人工智能时代已经开启&#xff0c;并这样表示&#xff1a;在我有生之年&#xff0c;见证了两次革命性的技术展示。一次是 1980 年看到图形用户界面&#xff1b;一次就是 OpenAI 带来的 ChatGPT 与 GPT-4。 英伟达的黄教…

【可乐荐书】Python自动化办公应用大全(ChatGPT版):从零开始教编程小白一键搞定烦琐工作

本栏目将推荐一些经典的、有趣的、有启发性的书籍&#xff0c;这些书籍涵盖了各个领域&#xff0c;包括文学、历史、哲学、科学、技术等等。相信这些书籍不仅可以让你获得知识&#xff0c;还可以让你感受到阅读的乐趣和魅力。 今天给大家推荐的书籍是&#xff1a;《Python自动…

ChatGPT 速通手册——开源社区的进展

开源社区的进展 在 ChatGPT 以外&#xff0c;谷歌、脸书等互联网巨头&#xff0c;也都发布过千亿级参数的大语言模型&#xff0c;但在交谈问答方面表现相对 ChatGPT 来说都显得一般。根据科学人员推测&#xff0c;很重要的一部分原因是缺失了RLHF(Reinforcement Learning with…

2023最新ChatGPT网站源码+支持ChatGPT4.0+支持Midjourney绘画+用户会员套餐+用户每日签到领取+后台管理+一键更新版本

2023最新ChatGPT网站源码支持ChatGPT4.0支持Midjourney绘画用户会员套餐用户每日签到领取后台管理一键更新版本&#xff0c;支持手机电脑不同布局页面自适应。 一、系统安装教程 一台VPS服务器&#xff08;CentOS 7 64 &#xff09; 搭建宝塔面板 解析绑定域名 上传程序至根目录…