Transformer等主流文本生成算法。逐字生成对适合并行计算的GPU不友好,会导致GPU利用率低。并行构建有助于此。不久前,字节跳动火山翻译团队的平行翻译系统GLAT获得了WMT2021De-En/En-De双料冠军。为了帮助大家跟进这个成果,火山翻译开源了一个名为ParaGen的Pytorch深度学习框架,里面包含了GLAT模型复现和WMT21的代码。代码地址:https://github.com/bytedance/ParaGen文本生成是自然语言处理的一个重要研究方向,具有广泛的应用场景。如文本摘要、机器翻译、文案生成等。与分类、标注等一般任务不同,文本生成不仅要考虑每个词的重要性以提高词的预测准确率,还要考虑词与词之间的搭配以保持整个文本的流畅性。因此,一般的做法是一个词一个词地生成,每生成一个词都会考虑与已有词的关系。这类通过以上步骤生成文本的模型称为自回归模型,比如目前主流的生成算法Transformer。该模型首先对原始文本进行编码,例如机器翻译中的待翻译文本或文本摘要中的原始文本。然后从左到右逐字解码,生成翻译文本或摘要。基于该算法的开源软件有tensor2tensor、fairseq等。但逐字生成对适合并行计算的GPU不友好,导致GPU利用率低,句子生成速度慢。因此,近年来,许多研究探索了如何并行生成文本并减少响应延迟。此前,字节跳动人工智能实验室(AI-Lab)火山翻译团队开发了并行生成的翻译系统GlancingTransformer(GLAT)(见《ACL 2021 | 字节跳动 Glancing Transformer:惊鸿一瞥的并行生成模型》),并用它拿下了WMT2021De-En/ThedoubleEn-De冠军(见《并行生成奇点临近!字节跳动 GLAT 斩获 WMT2021 大语种德英自动评估第一》),凸显了并联发电的强大潜力。ParaGen正是在这样的背景下应运而生。团队研究人员发现,对于并行生成,仅靠模型的改进已经不能满足研究的需要,训练方法和解码算法的改进变得越来越重要。ParaGen的开发是为了释放并行生成研究的生产力。在ParaGen,火山翻译开源了GLAT模型递归和WMT21代码,帮助大家更好的跟进并行生成的研究成果。未来,火山翻译还将开源更多与并行生成相关的技术,推动并行生成技术的进一步发展,帮助并行生成技术逐步走向更多的生产应用。同时,除了并行生成,ParaGen还支持多种自然语言处理任务,包括自回归翻译、多语言翻译、预训练模型、生成任务、抽取任务、分类任务等,并提供零-reproducibility代码帮助刚接触自然语言处理研究的同学更快进入研究状态。ParaGen让开发更灵活、更自由、更轻松。ParaGen支持多达13个可定制模块,包括数据读取、数据预处理、数据采样、数据加载、网络模块、训练模型、推理模型、优化目标,与同类文本生成框架相比,搜索算法、优化器、数值规划器、训练算法和评估目标大大提高了二次开发的灵活性。对于不同的模块,ParaGen采用微内核设计,每个模块只提供一些通用的和基础的实现,相互独立,如数值优化器中的InverseSquareRootRateScheduler,网络模块中的positionalembedding,数据读取的JsonDataset等。也正是得益于这次对13种模块的详细拆解,使得ParaGen可以更轻松地进行定制。比如要实现扫视训练的方式。在ParaGen中,只需要重载一个forward_loss函数,就可以以模块化的方式实现自定义训练。importtorchfromparagen.trainers.trainerimportTrainerfromparagen.trainersimportregister_trainer@register_trainerclassGLATTrainer(Trainer):"""Trainerwithglancingstrategy""def_forward_loss(self,samples):glancing_output=self._generator(**samples['net_input_samples=fusingself_](**samples['net_inputs_]glancing_output)logging_states=self._criterion(**fused_samples)returnloss不同于以往的流程开发,ParaGen更倾向于汇编开发。在流程开发中,框架固定一个流程代码,用户自己想办法填写每个模块进入流程,ParaGen的组装开发完全不同,想象一下你要执行一个任务,ParaGen就像一个工具箱,你可以根据你想要的功能组装一个完整的流程,比如你可以选择合适的数据读取的Dataset类和批处理的Sampler.Combine,选择Metric进行结果评估,甚至定义自己的训练过程等。当遇到未实现的工具时,可以将ParaGen的工具作为父类,通过重载一小部分功能来定制自己的专属工具,以适应更多的任务。同时,对ParaGen代码结构进行了更详细的反汇编。用户只需要花2-3个小时阅读代码,就可以了解整个项目的框架,定制属于自己的任务。不仅如此,ParaGen还提供了相应的教程,帮助初学者了解整个ParaGen代码的基础知识和使用方法。ParaGen让开发更稳定ParaGen可以很好地支持不同方向的同步开发。ParaGen支持可插拔代码开发,让用户无需框架即可开发。用户可以在任意目录下开发自己的专属模块,通过--lib{my_lib}命令导入到ParaGen中执行,使得二次开发代码独立于主代码,更有利于二次开发的维护代码和维护主框架的稳定性,保证了不同项目开发的并行性和稳定性,不会造成彼此代码之间的冲突。ParaGen采用apache2开源协议,协议非常宽松,比如允许其他开发者二次开发后闭源等,方便更多优秀的开发者或团队参与。作为第一个翻译质量超过传统自回归模型的并行文本生成软件,ParaGen证明了速度和质量的可行性,为后续研究提供了可重现的实现。在应用层面,极大地满足了终端部署低功耗、快速响应的性能需求。在后续的开发中,ParaGen将探索更多的并行算法,比如条件随机场模型,进一步提升性能。另一方面,也将开放更多的部署环境,如移动端、嵌入式系统等,方便更多实际场景下的应用开发。
