范文健康探索娱乐情感热点
投稿投诉
热点动态
科技财经
情感日志
励志美文
娱乐时尚
游戏搞笑
探索旅游
历史星座
健康养生
美丽育儿
范文作文
教案论文
国学影视

GLM国产大模型训练加速性能最高提升3倍,显存节省13

  作者|BBuf、谢子鹏、冯文
  2017 年,Google 提出了 Transformer 架构,随后 BERT 、GPT、T5等预训练模型不断涌现,并在各项任务中都不断刷新 SOTA 纪录。去年,清华提出了 GLM 模型( https://github.com/THUDM/GLM  ),不同于上述预训练模型架构,它采用了一种自回归的空白填充方法, 在 NLP 领域三种主要的任务(自然语言理解、无条件生成、有条件生成)上都取得了不错的结果。
  很快,清华基于 GLM 架构又推出了 GLM-130B( https://keg.cs.tsinghua.edu.cn/glm-130b/zh/posts/glm-130b/  ),这是一个开源开放的双语(中文和英文)双向稠密模型,拥有 1300 亿参数,在语言理解、语言建模、翻译、Zero-Shot 等方面都更加出色。
  预训练模型的背后离不开开源深度学习框架的助力。在此之前,GLM 的开源代码主要是由 PyTorch、DeepSpeed 以及 Apex 来实现,并且基于 DeepSpeed 提供的数据并行和模型并行技术训练了 GLM-Large(335M),GLM-515M(515M),GLM-10B(10B)等大模型,这在一定程度上降低了 GLM 预训练模型的使用门槛。
  即便如此,对更广大范围的普通用户来说,训练 GLM 这样的模型依然令人头秃,同时,预训练模型的性能优化还有更大的提升空间。
  为此,我们近期将原始的 GLM 项目移植到了使用 OneFlow 后端进行训练的 One-GLM 项目。得益于 OneFlow 和 PyTorch 无缝兼容性,我们快速且平滑地移植了 GLM,并成功跑通了预训练任务(训练 GLM-large)。
  此外,由于 OneFlow 原生支持 DeepSpeed 和 Apex 的很多功能和优化技术,用户不再需要这些插件就可训练 GLM 等大模型。更重要的是,针对当前 OneFlow 移植的 GLM 模型,在简单调优后就能在性能以及显存占用上有大幅提升。
  具体是怎么做到的?下文将进行揭晓。 One-GLM:https://github.com/Oneflow-Inc/one-glm OneFlow:https://github.com/Oneflow-Inc/oneflow
  1、GLM-large 训练性能和显存的表现
  首先先展示一下分别使用官方的 GLM 仓库以及 One-GLM 仓库训练 GLM-large 网络的性能和显存表现(数据并行技术),硬件环境为 A100 PCIE 40G,BatchSize 设置为 8。
  可以看到,在 GLM-large 的训练任务中,相比原始的基于 PyTorch、DeepSpeed、Apex 的 GLM 实现,OneFlow的性能有 120% - 276% 的加速,并且显存占用降低了10% -30%(测试结果均可用 oneflow >=0.9.0 复现)。
  2、GLM 迁移,只需修改几行代码
  由于 OneFlow 无缝兼容了 PyTorch 的生态,只需改动几行代码,就可以让用户轻松迁移 GLM 大模型到 One-GLM: 将 import torch 替换为 import oneflow as torch 将 import torch.xx 替换为 import oneflow.xx 将 from apex.optimizers import FusedAdam as Adam 替换为 from oneflow.optim import Adam 将 from apex.normalization.fused_layer_norm import FusedLayerNorm as LayerNorm 替换为 from oneflow.nn import LayerNorm 注释掉 torch.distributed.ReduceOp,torch.distributed.new_group,,torch.distributed.TCPStore,torch.distributed.all_reduce 这些API,它们是 PyTorch DDP 所需要的,但 OneFlow 的数据并行是由内部的 SBP 和 Global Tensor 机制实现,并不需要这些 API。
  其它许多模型的迁移更简单,比如在和 torchvision 对标的 flowvision 中,许多模型只需通过在 torchvision 模型文件中加入 import oneflow as torch 即可得到,让用户几乎没有额外成本。
  此外,OneFlow 还提供全局 "mock torch" 功能( https://docs.oneflow.org/master/cookies/oneflow_torch.html  ),在命令行运行 eval $(oneflow-mock-torch) 就可以让接下来运行的所有 Python 脚本里的 import torch 都自动指向 oneflow。
  3、两大调优手段
  loss 计算部分的优化
  在原始的 GLM 实现中,loss计算部分使用到了 mpu.vocab_parallel_cross_entropy 这个函数 ( https://github.com/THUDM/GLM/blob/main/pretrain_glm.py#L263  ) 。
  通过分析这个函数,发现它实现了 sparse_softmax_cross_entropy 的功能,但在实现过程中,原始的 GLM 仓库使用了 PyTorch 的 autograd.Function 模块,并且使用了大量的小算子来拼接出 sparse_softmax_cross_entropy 整体的功能。而在 OneFlow 的算子库中,已经有 sparse_softmax_cross_entropy 这个算子对应的 CUDA 实现了,也就是 flow.sparse_softmax_cross_entropy 这个 API。
  所以,我们将 GLM 对 sparse_softmax_cross_entropy 的 naive 实现替换为 flow.sparse_softmax_cross_entropy 这个 API,并进行了 loss 对齐实验。
  结果如何?下图展示了基于 OneFlow 的 Graph 模式训练 GLM-large 模型前 1000 轮的 loss 对齐情况,并分别测试了 FP32 和 AMP 模式:
  可以看到,将原始 GLM 的 naive sparse_softmax_cross_entropy 实现替换为 flow.sparse_softmax_cross_entropy 之后 loss 是完全对齐的,可以保证正确性。
  相比原始的 GLM 的单卡性能,这个替换使得 One-GLM 的单卡性能有大幅提升,主要原因是 OneFlow 对 sparse_softmax_cross_entropy 算子做了极致的性能优化,并且减少了原始 GLM 中大量的碎算子拼凑带来的访存开销。此外,这样做也降低了 torch.autograd.Function 本身带来的一些系统开销。
  CUDA Kernel Fuse
  除上述优化外,GLM 模型本质上就是一个编解码的 Transformer 架构,所以我们将之前优化 GPT、BERT 的一些 Fuse Pattern 也带给了 One-GLM 模型。具体包含以下两个 Fuse Pattern : fused_bias_add_gelu: 将 bias_add 和 gelu 算子融合在一起。 fused_bias_add_dropout:将 bias_add 和 dropout 算子融合在一起。
  这两个 fuse 都可以显著改善计算的访存,并减少 Kernel Launch 带来的开销,由于 GLM 模型越大则层数就会越多,那么这种 Fuse Pattern 带来的的优势也会不断放大。
  最终,在上述两方面的优化作用下,在 A100 PCIE 40G,batch_size = 8 环境中的训练 GLM-large 的任务时,单卡 FP32 模式的性能相比原始的 GLM 取得了 280%(FP32 模式) 和 307%( AMP 模式) 的训练加速。
  4、LiBai 也能轻松搞定 GLM 推理
  当模型规模过于庞大,单个 GPU 设备无法容纳大规模模型参数时,便捷好用的分布式训练和推理需求就相继出现,业内也随之推出相应的工具。
  基于 OneFlow 构建的 LiBai 模型库让分布式上手难度降到最低,用户不需要关注模型如何分配在不同的显卡设备,只需要修改几个配置数据就可以设置不同的分布式策略。当然,加速性能更是出众。 LiBai :https://github.com/Oneflow-Inc/libai LiBai 相关介绍:大模型训练之难,难于上青天?预训练易用、效率超群的「李白」模型库来了!
  GLM:https://github.com/Oneflow-Inc/libai/tree/glm_project/projects/GLM
  用 LiBai 搭建的 GLM 可以便捷地实现model parallel + pipeline parallel推理, 很好地解决单卡放不下大规模模型的问题。
  那么,用户如何利用大规模模型训练与推理仓库 LiBai 来构建 GLM 的分布式推理部分?下面用一个小例子解释一下。
  分布式推理具有天然优势
  要知道,模型的参数其实就是许多 tensor,也就是以矩阵的形式出现,大模型的参数也就是大矩阵,并行策略就是把大矩阵分为多个小矩阵,并分配到不同的显卡或不同的设备上,基础的 LinearLayer 在LiBai中的实现代码如下:class Linear1D(nn.Module):     def __init__(self, in_features, out_features, parallel="data", layer_idx=0, ...):         super().__init__()          if parallel == "col":             weight_sbp = dist.get_nd_sbp([flow.sbp.broadcast, flow.sbp.split(0)])         elif parallel == "row":             weight_sbp = dist.get_nd_sbp([flow.sbp.broadcast, flow.sbp.split(1)])         elif parallel == "data":             weight_sbp = dist.get_nd_sbp([flow.sbp.broadcast, flow.sbp.broadcast])         else:             raise KeyError(f"{parallel} is not supported! Only support ("data", "row" and "col")")          self.weight = flow.nn.Parameter(             flow.empty(                 (out_features, in_features),                 dtype=flow.float32,                 placement=dist.get_layer_placement(layer_idx),  # for pipeline parallelism placement                 sbp=weight_sbp,             )         )         init_method(self.weight)         ...          def forward(self, x):         ...
  在这里,用户可选择去如何切分 Linear 层的矩阵,如何切分数据矩阵,而OneFlow 中的 SBP 控制竖着切、横着切以及其他拆分矩阵的方案(模型并行、数据并行),以及通过设置 Placement 来控制这个 LinearLayer 是放在第几张显卡上(流水并行)。
  所以,根据 LiBai 中各种 layer 的设计原理以及基于 OneFlow 中 tensor 自带的 SBP 和 Placement 属性的天然优势,使得用户搭建的模型能够很简单地就实现数据并行、模型并行以及流水并行操作。
  GLM 推理的 Demo 演示
  这里为用户展示 LiBai 中 GLM 的单卡和便捷的多卡推理 Demo,模型可在 HuggingFace 上获取: https://huggingface.co/models?filter=glm 单卡 generate 任务,我们选择 glm-10b 模型: python demo.py# demo.py import oneflow as flow from projects.GLM.tokenizer.glm_tokenizer import GLMGPT2Tokenizer from libai.utils import distributed as dist from projects.GLM.configs.glm_inference import cfg from projects.GLM.modeling_glm import GLMForConditionalGeneration from projects.GLM.utils.glm_loader import GLMLoaderHuggerFace from omegaconf import DictConfig  tokenizer = GLMGPT2Tokenizer.from_pretrained("/data/home/glm-10b") input_ids = tokenizer.encode(     [         "Ng is an adjunct professor at [MASK] (formerly associate professor and Director of its Stanford AI Lab or SAIL ). Also a pioneer in online education, Ng co-founded Coursera and deeplearning.ai."     ],     return_tensors="of", ) inputs = {"input_ids": input_ids, "attention_mask": flow.ones(input_ids.size())} inputs = tokenizer.build_inputs_for_generation(inputs, max_gen_length=512)  sbp = dist.get_nd_sbp([flow.sbp.broadcast, flow.sbp.broadcast]) placement = dist.get_layer_placement(0)  dist.set_device_type("cpu") loader = GLMLoaderHuggerFace(GLMForConditionalGeneration, cfg, "/path/to/glm-10b") model = loader.load() model = model.half().cuda()  dist.set_device_type("cuda") outputs = model.generate(     inputs=inputs["input_ids"].to_global(sbp=sbp, placement=placement),      position_ids=inputs["position_ids"].to_global(sbp=sbp, placement=placement),      generation_attention_mask=inputs["generation_attention_mask"].to_global(sbp=sbp, placement=placement).half(),      max_length=512 ) res = tokenizer.decode(outputs[0]) print(res) >>> [CLS] Ng is an adjunct professor at [MASK] (formerly associate professor and Director of its Stanford AI Lab or SAIL ). Also a pioneer in online education, Ng co-founded Coursera and deeplearning.ai.<|endoftext|> <|startofpiece|>  Stanford University and a co-founder of <|endofpiece|>4卡 model parallel+pipeline parallel generate 任务,选择 glm-10b 模型: python3 -m oneflow.distributed.launch --nproc_per_node 4 demo.py# demo.py import oneflow as flow from projects.GLM.tokenizer.glm_tokenizer import GLMGPT2Tokenizer from libai.utils import distributed as dist from projects.GLM.configs.glm_inference import cfg from projects.GLM.modeling_glm import GLMForConditionalGeneration from projects.GLM.utils.glm_loader import GLMLoaderHuggerFace from omegaconf import DictConfig  # 只需简单配置并行方案 parallel_config = DictConfig(     dict(         data_parallel_size=1,         tensor_parallel_size=2,         pipeline_parallel_size=2,         pipeline_num_layers=2 * 24     ) ) dist.setup_dist_util(parallel_config)  tokenizer = GLMGPT2Tokenizer.from_pretrained("/data/home/glm-10b") input_ids = tokenizer.encode(     [         "Ng is an adjunct professor at [MASK] (formerly associate professor and Director of its Stanford AI Lab or SAIL ). Also a pioneer in online education, Ng co-founded Coursera and deeplearning.ai."     ],     return_tensors="of", ) inputs = {"input_ids": input_ids, "attention_mask": flow.ones(input_ids.size())} inputs = tokenizer.build_inputs_for_generation(inputs, max_gen_length=512)  sbp = dist.get_nd_sbp([flow.sbp.broadcast, flow.sbp.broadcast]) placement = dist.get_layer_placement(0)  loader = GLMLoaderHuggerFace(GLMForConditionalGeneration, cfg, "/path/to/glm-10b") model = loader.load()  outputs = model.generate(     inputs=inputs["input_ids"].to_global(sbp=sbp, placement=placement),      position_ids=inputs["position_ids"].to_global(sbp=sbp, placement=placement),      generation_attention_mask=inputs["generation_attention_mask"].to_global(sbp=sbp, placement=placement),      max_length=512 ) res = tokenizer.decode(outputs[0]) if dist.is_main_process():     print(res) >>> [CLS] Ng is an adjunct professor at [MASK] (formerly associate professor and Director of its Stanford AI Lab or SAIL ). Also a pioneer in online education, Ng co-founded Coursera and deeplearning.ai.<|endoftext|> <|startofpiece|>  Stanford University and a co-founder of <|endofpiece|>使用 One- GLM 训练的模型进行推理
  LiBai对于OneFlow的模型加载同样方便,如果你希望使用one-glm训练后的模型进行推理,只需简单的将上述demo中的 GLMLoaderHuggerFace 替换为 GLMLoaderLiBai。
  5、结语
  基于 OneFlow 来移植 GLM 大模型非常简单,相比于原始版本 PyTorch GLM 训练 GLM-large 模型,OneFlow 能大幅提升性能和节省显存。
  此外,通过使用 GLM-10B 这个百亿级大模型做推理,表明基于 OneFlow 的 LiBai 来做大模型推理可以开箱即用,并实现更高的推理速度,如果你想配置不同的并行方式来推理大模型,只需要简单配置文件的几个参数即可。
  未来,OneFlow团队将探索使用 OneFlow 训练更大的 GLM-130B 千亿模型的可行性,相信基于 OneFlow 可以更快地训练 GLM-130B 千亿级别模型,加速国产大模型训练和推理任务。
  欢迎Star、试用One-GLM: One-GLM:https://github.com/Oneflow-Inc/one-glm OneFlow:https://github.com/Oneflow-Inc/oneflow
  欢迎 Star、试用 OneFlow 最新版本: https://github.com/Oneflow-Inc/oneflow/

我六十多了帮女儿带孩子,常常被指责作主过多,我该怎么做?我和你一样,帮女儿带孩子。女儿工作忙,每天早出晚归,孩子完全交给我。晚上回来后,她只跟孩子亲热,对我不理不睬,毫不关心,从来没有一句暖心话,进出招呼都不打一个,好像我欠她似的。开始大衣哥朱之文究竟多有钱,算是当地首富吗?除了他们县长镇长,应该算是最有钱的一个吧!应该不算,但肯定算有钱的了。毕竟演艺圈一个十八线小明星都能挣很多钱了。何况大衣哥已经算很出名的了。不过我觉得大衣哥一家子算很务实的了,一点陈亚男为什么会受到全网关注?跟亚男其实一个是一个不错的女孩子,素质也很好,但他和居家的联姻就是悲剧的开始,在这场婚姻之中,陈亚男也是受害者。陈亚楠以后也是网络的红人,祝他顺利!陈亚楠和老朱家的恩恩怨怨大家只是有什么零碎时间可以玩的竞技卡牌类手游推荐?(一)苹果骑士(AppleKnight)一款复古像素画风的横版闯关冒险手游。有点像是红白机的超级玛丽。游戏的玩法和操作较为普通,玩家可以控制角色左右移动,跳跃,攻击,前冲,远程攻击绝地求生雪地地图最上方的大陆是什么?里面也有物资可以搜寻吗?经常玩雪地地图的小伙伴可能发现一些有趣的事情,比如在雪地地图左上方就有一大片空白的冰岛,那么这个地方是怎么样的呢?是否有资源和有船只供我们去探索?首先能确定的是地图最上边的冰岛,飞有些女人接吻为什么要闭着眼睛?这是什么心理?接吻时闭眼其实有两点原因,第一是为了享受这一美好的时刻,第二是减少身体中的某种负荷。如果问你,在什么时候你会闭上你的眼睛?请不要说睡觉,因为当你用心享受一件事时,你就会不自觉地闭上有一点事情就焦虑不安,失眠,为什么年纪越大越经不住事了?我们几位老友都有这个经历。说点体会。小事即焦虑,主要原因来自两个方面一是负面回忆。过去生活工作中不如意的事,懊悔的事,退休前后的人情冷暖等等,杂七杂八袭上心头,又不宜说与人知,憋闷请教一个问题,从中医角度来讲,运动出汗更多是排掉体内湿气还是在损耗阳气?我是良医,为您解答,要从中医理论解答这个问题,首先要了解一个概念什么是气?中医认为气是维持人体正常生命活动的物质基础。分为元气,宗气,营气,卫气。元气,位于肾中,乃肾中所藏先天精气一年级报英语班好还是二年级报好?对于为孩子报英语班进行英语学习这个问题,如果单从语言学习的角度来考试,当然是越早越好。3到6岁这个时间段是孩子语言敏感期,不论学习任何语言,这一时期的孩子对语言吸收能力都非常的好。东京奥运会以后,陈梦每次与冠军无缘,陈梦时代就这样结束了吗?对于时代这个词,刘国梁李隼都进行了纠正。以陈梦东京奥运后的表现,她也撑不起自己的时代,球迷也不用老是刻意纠结这个事。世界杯总决赛失利,陈梦确实遇到了一些困难。队友在迅速涨球,陈梦生为什么浙江省衢州第一中学放假时间如此之短,学生春节假期只有十天?谢邀回答。总的来说无非是文化传承竞争压力学生及家长要求。其一,本校的文化传统。既然能称得一中都不是一般中学能相提并论的。几乎所有的建校为一中的,文化底蕴都是比较深,历史也算的上悠久
再次来袭的林旋风,能给CBA带来哪些启示北京时间2月16日,高雄钢铁人队官方宣布林书豪当选P联赛第15周周最佳球员。此前林书豪在联赛首秀中表现出色,砍下21分13助攻6篮板的数据,帮助钢铁人在主场以9580击败梦想家,151分!单场10记3分!这新援,太阳果然疯了太阳官方宣布,球队正式签下特伦斯罗斯。挣扎了小半个赛季,被嫌弃了小半个赛季,被嘲讽了小半个赛季,太阳果然疯了。疯狂补强啊!之前还有传言说太阳想要签下安东尼,是的,就是那个安东尼。不男篮快讯广州被曝签约伯顿!辽宁弃用吴昌泽,国产汤神难回CBA在上赛季结束之后,效力广东男篮的汤杰并没有得到续约合同,还记得在2021年夏天,汤杰还选择参加了NBA选秀,大家也都明白他是炒作,毕竟当时在福建他都只是一个替补。因为他在场上速度特川崎前锋VS横滨水手卡迪夫城VS雷丁川崎前锋VS横滨水手川崎前锋川崎前锋最早成立于1955年,球队前身为富士通足球俱乐部,是日本足球联盟元老俱乐部之一。由于部分原因俱乐部在上世纪遭到降级,直到2000年才重返顶级联赛那些全年带孩子自驾游的人都是怎么想的?读万卷书,行万里路,行万里路?太贵!可世界这么大,我也想去看看。足不出户,就可以和孩子一起走进自然,爱上自然,那得多好!想不想让孩子在轻松幽默谈笑间打开认识自然世界的大门?想不想你油菜花开了!阳山大崀镇油菜花开乡村美,游客踏青赏花来满目尽是金黄香,一方春色惹人醉。随着春天的气息愈发浓厚,阳山县大崀镇沙田村的油菜花竞相绽放,形成大片金色花海,与远山近水村落交相辉映,构成一幅春意盎然的美丽乡村画卷。走进沙田村油菜在路上2022。1。31随笔。放弃不难,但坚持一定很酷!现在的生活也很丰富吧!怎么形容呢?是很充实,也很精彩吧!既然自己创造了机会,那我定会抓住这来之不易的机会。现在总会想起高中时一起奋上海市最新版星级公园名单出炉静安19座公园上榜,五星公园总数全市领先!经过2021年及2022年连续两年的综合测评,上海市最新版星级公园名单于近日公布。名单中,全市五星级公园共32座四星级公园共41座三星级公园143座二星级公园56座基本级公园66座上海欢乐谷过山车一个月内两次故障,游客滞留空中达十分钟记者李如嘉编辑殷宴2月15日,有游客反映上海欢乐谷过山车绝顶雄风出现故障。一位称自己当时正在故障车辆上的网友向界面新闻表示,过山车在空中停滞了十分钟左右,随后工作人员带着游客系了安超越上海,登顶全国第一!这座万亿大城,开启狂飙文丨西部菌最近一段时间,地方两会陆续召开。各地在过去一年的发展成绩,以及未来一年的发展雄心,都有更具体的展露。这其中,作为西北第一大城市的西安,当地政府工作报告所公布的一系列数据,上海嘉定政策协同发力护航高质量发展嘉定区是上海市制造业发展的集聚区和科创中心的重要承载区。新年伊始,上海市嘉定区市场监管局紧紧围绕区委区政府重点工作,以开局就是决战起步就是冲刺的态度与决心,推行政务服务网络化标准化