当前位置: 首页 > 科技观察

一行代码让Bert推理提速12倍,OpenAI编程语言支持的引擎大行其道

时间:2023-03-15 14:58:10 科技观察

一行代码有多强大?今天要介绍的Kernl库可以让用户仅用一行代码就可以在GPU上以数倍的速度运行Pytorchtransformer模型,从而大大加快模型的推理速度。具体来说,在Kernl的加持下,Bert的推理速度比HuggingFacebaseline快了12倍。这一成就很大程度上归功于Kernl使用新的OpenAI编程语言Triton和TorchDynamo编写定制GPU内核。项目作者来自LefebvreSarrut。GitHub地址:https://github.com/ELS-RD/kernl/以下是Kernl与其他推理引擎的对比。横坐标括号中的数字分别表示批量大小和序列长度,纵坐标表示推理的加速度。基准测试在3090RTXGPU和12核IntelCPU上运行。从上面的结果来看,Kernl可以说是对于长序列输入(上图右半部分)最快的推理引擎,而对于短输入序列则接近NVIDIA的TensorRT(上图左半部分)).此外,Kernl内核代码非常简短,易于理解和修改。该项目甚至添加了Triton调试器和工具(基于Fx)来简化内核替换,因此无需修改PyTorch模型源代码。项目作者Micha?lBenesty总结了这项研究,他们发布了Kernl,这是一个用于加速transformer推理的库,它非常快,有时可以达到SOTA性能,并且可以被破解以匹配大多数transformer架构。他们还在T5上进行了测试,速度提高了6倍,Benesty表示这仅仅是个开始。为什么要创建Kernl?在LefebvreSarrut,项目作者在生产中运行了多个transformers模型,其中一些对延迟敏感,主要是搜索和recsys。他们还使用OnnxRuntime和TensorRT,甚至创建了transformer-deployOSS库来与社区分享知识。最近,作者一直在测试生成语言,并试图加快它们的速度。然而,事实证明,使用传统工具做到这一点非常困难。在他们看来,Onnx是另一种有趣的格式,它是一种专为机器学习设计的开放文件格式,用于存储经过训练的模型,并且具有广泛的硬件支持。然而,当他们处理新的LLM架构时,Onnx生态系统(主要是推理引擎)受到几个限制:将没有控制流的模型导出到Onnx很简单,因为可以依赖跟踪。但是动态行为更难获得;与PyTorch不同,ONNXRuntime/TensorRT尚不原生支持多GPU任务以实现张量并行;TensorRT无法管理具有相同配置文件的变压器模型的2个动态轴。但是由于通常希望能够提供不同长度的输入,因此需要为每个批次大小构建1个模型;非常大的模型很常见,但是Onnx(作为protobuff文件)在文件大小方面有一些限制,需要将权重存储在模型外部才能解决问题。一个非常恼人的事实是,新模型永远不会加速,你需要等待别人为此编写自定义CUDA内核。现有的解决方案还不错,OnnxRuntime的一大优势是它的多硬件支持,而TensorRT以非常快着称。因此,项目作者希望在Python/PyTorch上拥有一个与TensorRT一样快的优化器,这就是他们创建Kernl的原因。怎么做?内存带宽往往是深度学习的瓶颈,而要加速推理,减少内存访问往往是一个不错的策略。在短输入序列上,瓶颈通常与CPU开销有关,必须消除。项目作者主要利用了以下3种技术:首先是OpenAITriton,这是一种用于编写CUDA等GPU核心的语言,不要与NvidiaTriton推理服务器混淆,后者效率更高。多个操作的融合得到改进,因此它们可以在不将中间结果保留在GPU内存中的情况下链接计算。作者用它来重写attention(被FlashAttention取代)、线性层和激活以及Layernorm/Rmsnorm。第二个是CUDA图。在预热步骤中,它会保存每个启动的内核及其参数。项目作者随后重构了整个推理过程。最后是TorchDynamo,Meta提出的帮助项目作者处理动态行为的原型。在预热步骤中,它会跟踪模型并提供Fx图(静态计算图)。他们用自己的内核替换了Fx图的一些操作,用Python重新编译。未来,项目路线图将涵盖更快的预热、粗糙推理(padding中无损失计算)、训练支持(长序列支持)、多GPU支持(多并行模式)、量化(PTQ)、cutlassfor新批次内核测试和改进硬件支持等。有关更多详细信息,请参阅原始项目。