共计 15667 个字符,预计需要花费 40 分钟才能阅读完成。
作者:李鹏,王玮,陈嘉乐,黄松芳,黄俊
单位:阿里云智能机器学习平台 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 的独特作用,因而更加鲁棒。
- 计算 expert 对 token 的偏好:
\(S=X∗We \)
其中 \(X \in \mathbb{R}^{n*d} \) 是输出的 tokens 的示意,
\(W_{e} \in \mathbb{R}^{d*e} \)
是 experts 的权重,\(n \)示意输出 token 的数量,\(e \)示意 expert 的数量,\(d \)示意暗藏特色的维度,\(S \in \mathbb{R}^{n*e} \)为每一个 expert 对输出的每一个 token 的偏好水平;
- L-Softmax 算法训练 expert 权重
训练过程中利用 L-Softmax loss 优化 experts 的权重 W_{e},实现每一个 expert 对 token 都具备可辨别的的偏好。
- 每个 expert 选取固定数量的 token:
\(I = \text{Topk}(S, k) \)
其中,\(k \)就是咱们预先确定的,每个 expert 能够解决的最多 token 的数量,\(I \in \mathbb{R}^{e*k} \)记录了每个 expert 须要解决的 tokens 的索引;
4. 计算最初的输入:
\(Xout=a∗ExpertResidual(Experts(X,I))+(1−a)∗Experts(X,I) \)
每一个 expert 依据索引计算出对应 tokens 的示意,并将不同 expert 对同一 token 生成的示意加权求和,最初通过 Expert Residual 模块生成最终的输入 \(Xout \)。
试验剖析
下图是采纳自研算法与 Top-1 Gating、s-BASE 算法的验证集 loss 随训练 step 变动的曲线图,咱们能够发现,采纳自研算法的验证集 loss 始终低于 top-1 gating 和 s-BASE 算法的验证集 loss,证实了咱们自研算法的有效性。
同时,咱们察看到,验证集 loss 首次低于 2.7 的工夫,自研算法的速度是 s-BASE 的 1.48 倍,极大的缩小了模型训练的开销。
此外,咱们也剖析了自研算法和 Top-1 Gating、s-BASE 的训练吞吐,如下图所示,采纳自研算法相比于 s-BASE 的训练吞吐晋升了 1.17 倍。
基于 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)
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)
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 = 42
top_k = int(user_parameters['top_k'])
self.top_k = top_k
self.output_len = max_length
start_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_batch
print('[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_token
outputs = [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/organization/PAI
咱们能够批改 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 大模型落地 — 通往低成本 & 高性能多任务通用自然语言了解的要害里程碑