简介:在BladeDISC正式开源三个月后,我们发布了0.2.0版本,该更新包含了大量的性能优化与功能增强。

在BladeDISC正式开源三个月后,我们发布了0.2.0版本,该更新包含了大量的性能优化与功能增强。

BladeDISC是目前业界领先的支持动态shape的深度学习优化编译器。深度学习优化编译器负责将上层的神经网络计算图转换为底层硬件可执行的程序,当前流行的深度学习优化编译器(TVM[1]、XLA[2]、TensorRT[3]等)对静态shape的支持力度较大,对动态shape的支持则有所欠缺。其中,XLA目前只支持静态shape,TensorRT可以支持ranged shape(即指定尺寸范围内的动态shape)。BladeDISC编译器提供了对动态shape的完整支持,可以将包含动态shape语义的上层模型描述转换为高效的底层可执行程序。更多关于BladeDISC的介绍内容,请查看此处[5]。

本文描述BladeDISC v0.2.0版本相对于最初开源版本(即v0.1.0版本)的主要更新内容。

性能优化

当前的神经网络计算图主要由访存密集型算子(主要包括element-wise/elemental算子及reduce算子)和计算密集型算子(主要包括GEMM和Convolution算子)组成。BladeDISC v0.2.0版本相对v0.1.0版本在这两方面都做了大量优化。

访存密集算子的优化

本章重点描述v0.2.0新增的GPU stitch优化(以及附带的shape constraint功能增强)。

GPU上的stitch优化方法来源于我们发表在ASPLOS 2022上的论文AStitch[6],我们正在逐步地将AStitch中的技术迁移到BladeDISC中,目前已完成部分迁移工作。Stitch的方法旨在解决当前深度学习模型在GPU上执行时遇到的大量的kernel调度(scheduling)和发射(launch)开销以及片外访存开销,以及不同shape之下memory-intensive算子的高效schedule问题,其基本方法是通过GPU上多层次的中间结果访存管理(以寄存器,shared memory及global memory作为中间数据的buffer)、层次化的数据同步控制以及自动适配的parallelism-aware的codegen schedule生成,将原先多个不同的fusion kernel给stitch在一起,并生成高效的计算代码。

本次BladeDISC release实现了通过shared memory将原先被reduce算子分割开的多个fusion进行stitch融合的功能,达到计算融合加速效果(跨CUDA thread block的global memory的stitch以及自动适配的parallelism-aware的codegen在本次release中暂未实现)。我们提供了一组示例来展示如何开启stitch优化。

动态shape给stitch优化带来了新的挑战,其最重要的挑战在于,在不知道确切shape的情况下,正确地判断被stitch在一起的op之间的数据局部性,从而正确得为其中的数据传输分配片上存储(即GPU shared memory)。本次更新包含了一系列的shape constraint功能增强,作为GPU stitch功能的基础支撑。其基本思想是挖掘与传播producer op和consumer op之间以及sibling op之间的shape constraint,通过symbolic的方式构建全局的shape等价关系;在此基础上,进一步构建shape dimension之间的乘法关系,用以解析reshape等算子的shape等价性关系。

值得说明的是,在前一个版本中(即BladeDISC开源版本v0.1.0),我们针对CPU上的模型,对部分访存密集型计算子图实现了CPU端的stitch优化,从而更好地增强数据局部性,提升访存效率。

计算密集算子的优化

本章主要介绍本次更新中包含的GEMM合并优化及CPU上计算密集型算子的pre-packing和layout优化。

GEMM 合并优化

本次release实现了以下两种GEMM合并优化:

  1. 两个GEMM算子有公共的操作数,将其合并为一个算子,比如 A x B 和 A x C 可以合并为 A x concat(B, C),真实模型中的典型场景是Attention中的QKV合并;
  2. 两个GEMM有相同的计算形状,将其合并为一个batched GEMM,比如对于 A x B 和 C x D,如果A和C以及B和D的形状相同,那么就可以合并为一个batched GEMM。

GEMM合并带来了两个好处。其一是,GEMM合并可以增加计算尺寸,从而更好地打满硬件的计算峰值,提升计算效率;其二是,GEMM合并可以减少GPU kernel数量,从而降低kernel调度和发射的开销。

CPU上计算密集算子的pre-packing和layout优化

在CPU上,对于GEMM及Convolution计算,BladeDISC支持对GEMM的操作数进行pre-packing优化,通过packing的数据layout转换,使得矩阵乘操作对操作数的访问能够更好地利用数据局部性(比如使得数据访问更好地适配cache line)。具体来说,BladeDISC封装了CPU上的计算库,通过对其提供的packing函数的封装与调用来实现pre-packing功能。我们提供了基于Albert的示例以展示如何开启pre-packing优化。

对于Convolution函数,不同硬件vendor的不同计算库可能需要不同的数据layout以得到最佳性能,不同的数据类型在不同layout下的性能表现也会不同(比如,NVIDIA GPU上的FP16在TensorCore上和FP32在SIMT core上对layout的要求有所不同)。本次release针对CPU和GPU上的计算库,结合数据类型的考虑,为Convolution计算自动适配最佳的数据layout。数据layout的转换通过transpose操作来进行,我们实现了前后的transpose的抵消,最大限度减少额外带来的transpose的影响。

性能验证

上图展示了BladeDISC在四个当下流行的模型上的性能效果(在T4 GPU上进行验证,更多模型还在验证中)。图中的Framework表示原始的深度学习框架(FastSpeech2使用了TensorFlow 2.4框架,其他模型使用了PyTorch 1.7.1框架),Static Compiler表示该框架下接入静态优化编译器后的性能(TensorFlow使用XLA,PyTorch通过转onnx来利用TensorRT 8.2进行优化,TensorRT 8.2在优化T5和S2T的过程中失败,因此没有性能数据)。可以看到,BladeDISC相对于基本的深度学习框架可以取得最高达到8倍的性能加速效果,在BERT和FastSpeech2上,BladeDISC取得了与业界先进的静态优化编译器相近的优化效果。

重要功能支持

本次release也包括一系列的重要功能更新,包括:

X86和AArch64 CPU硬件的支持

本次release在X86和AArch64架构的CPU平台上都做了大量更新和支持。

X86平台方面,在已有的访存密集算子codegen支持的基础上(v0.1.0包含的功能),本次release增加了计算密集算子的支持。具体来说,BladeDISC同时支持了MKL和oneDNN两种不同的计算库后端,并支持运行时按需选择。在功能支持之外,本次releaes也包括对计算密集算子的性能优化(如前面章节提到的layout优化和weight pre-packing优化)。

AArch64平台方面,本次release完成了访存密集算子codegen对于AArch64平台的适配,以及计算密集算子库ACL的支持(通过oneDNN的形式)。

在上述功能的支持下,BladeDISC在X86平台以及AArch64平台上都已经端到端可用。具体使用方式及性能效果参见BaldeDISC提供的TF示例PyTorch示例

Blade推理加速器TensorRT的圈图支持

本次release开源了Blade推理加速器[7]两个重要的功能:TorchBlade和TensorFlowBlade。这两部分是Blade推理加速器面向两个最为广泛使用的深度学习框架所做的接入层,旨在提升模型优化的体验和完整度。Blade推理加速器在接入BladeDISC之外,也接入了TensorRT。具体来说,对于PyTorch和TensorFlow的模型,Blade推理加速器会自动识别出可以被TensorRT优化的计算子图,并送给TensorRT优化引擎进行优化。一定程度上提升了使用TensorRT的转换成功率,并且提供了与BladeDISC发挥联合优化作用的可能性。

PyTorch Training的Proof-of-Concept跑通

BladeDISC正在逐步支持PyTorch模型的训练优化,目前已经成功跑通mnist的简单模型。在实现层面,BladeDISC利用PyTorch的Lazy Tensor Core机制,将TorchScript子图优化为高效的可执行程序。

原文链接

本文为阿里云原创内容,未经允许不得转载。

BladeDISC 0.2.0更新发布的更多相关文章

  1. 重大更新!Druid 0.18.0 发布—Join登场,支持Java11

    Apache Druid本质就是一个分布式支持实时数据分析的数据存储系统. 能够快速的实现查询与数据分析,高可用,高扩展能力. 距离上一次更新刚过了二十多天,距离0.17版本刚过了三个多月,Druid ...

  2. 实时流式计算框架Storm 0.9.0发布通知(中文版)

    Storm0.9.0发布通知中文翻译版(2013/12/10 by 富士通邵贤军 有错误一定告诉我 shaoxianjun@hotmail.com^_^) 我们很高兴宣布Storm 0.9.0已经成功 ...

  3. 开源微信管家平台——JeeWx 捷微4.0 微服务版本发布,全新架构,全新UI,提供强大的图文编辑器

    JeeWx捷微4.0   微服务版本发布^_^ 换代产品(全新架构,全新UI,提供强大的图文编辑器) JEEWX 从4.0版本开始,技术架构全新换代,采用微服务架构,插件式开发,每个业务模块都是独立的 ...

  4. Nacos发布0.5.0版本,轻松玩转动态 DNS 服务

    阿里巴巴微服务开源项目Nacos于近期发布v0.5.0版本,该版本主要包括了DNS-basedService Discovery,对Java 11的支持,持续优化Nacos产品用户体验,更深度的与Sp ...

  5. 高级浏览器-SRWare Iron 29.0.1600.0 版本发布

    SRWare Iron是德国一安全公司srware改造的Chrome(铬)命名为铁(iron)的浏览器.于2008年9月18日首次发布. 据官方介绍,Iron浏览器砍掉了Chromium原程序中的很多 ...

  6. Yii2.0数据库缓存依赖发布的使用理解

    对于产品中经常需要生成一些缓存类的东西,比如系统基础配置,商品分类等,每次修改调整后都要手动进行缓存发布,是不是非常麻烦!这时候Yii2.0的缓存依赖发布就起到至关重要的作用了!现将主要的使用流程介绍 ...

  7. 支持边云协同终身学习特性,KubeEdge子项目Sedna 0.3.0版本发布!

    摘要:随着边缘设备数量指数级增长以及设备性能的提升,边云协同机器学习应运而生,以期打通机器学习的最后一公里. 本文分享自华为云社区<支持边云协同终身学习特性,KubeEdge子项目Sedna 0 ...

  8. Spring Authorization Server 0.3.0 发布,官方文档正式上线

    基于OAuth2.1的授权服务器Spring Authorization Server 0.3.0今天正式发布,在本次更新中有几大亮点. 文档正式上线 Spring Authorization Ser ...

  9. 微软Visual Studio Code 0.8.0发布,新增多种主题

    月30日,Build 开发者大会上,正式宣布了 Visual Studio Code 项目;并将其定义为:一个运行于 Mac OS X.Windows和 Linux 之上的,针对于编写现代 Web 和 ...

  10. VisualSVN5.0.1补丁原创发布

    VisualSVN5.0.1补丁原创发布

随机推荐

  1. day02-Spring基本介绍02

    Spring基本介绍02 5.简单模拟Spring基于XML配置的程序 5.1需求说明 自己写一个简单的Spring容器,通过读取beans.xml,获取第一个Javabean:Monster的对象, ...

  2. js实现回调功能实例

    所谓js回调,本人认为无非就是一个函数的参数是另外一个函数,而作为参数的函数就称之为回调函数 <script type="text/javascript">  //要请 ...

  3. .Net Core 你必须知道的source-generators

    源生成器是 C# 9 中引入的一项功能,允许在编译过程中动态生成代码. 它们直接与 C# 编译器集成(Roslyn)并在编译时运行,分析源代码并根据分析结果生成附加代码. 源生成器提供了一种简化的自动 ...

  4. uniapp如何给空包进行签名操作

    这里给大家分享我在网上总结出来的一些知识,希望对大家有所帮助 首先安装sdk https://www.oracle.com/java/technologies/downloads/ 正常下一步即可~安 ...

  5. C#的播放资源文件里的音频例子 - 开源研究系列文章

    今天无聊,想起原来开发的待办列表TodoList里还缺个提醒声音,于是就添加了提供声音模块代码.然后想着记录一下,让更多的读者能够复用这个模块代码,于是就有了此博文.这个例子只是用于播放资源文件里的w ...

  6. MongoDB java.lang.ClassCastException: java.lang.Double cannot be cast to java.lang.Integer

    详细报错如下: java.lang.ClassCastException: java.lang.Double cannot be cast to java.lang.Integer     at or ...

  7. verilog基本语法之always和assign

    always和assign的作用 一.语法定义 assign,连续赋值.always,敏感赋值.连续赋值,就是无条件全等.敏感赋值,就是有条件相等.assign的对象是wire,always的对象是r ...

  8. Jetty的threadpool模块

    Jetty提供的线程池相关的模块,如下: threadpool threadpool-virtual,使用JDK 21提供的virtual threads. threadpool-virtual-pr ...

  9. Go 语言中 For 循环:语法、使用方法和实例教程

    for循环用于多次执行特定的代码块,每次都可以使用不同的值.每次循环执行都称为一次迭代.for循环可以包含最多三个语句: 语法 for 语句1; 语句2; 语句3 { // 每次迭代要执行的代码 } ...

  10. C# 属性概述

    属性概述 属性允许类公开获取和设置值的公共方法,而隐藏实现或验证代码. get 属性访问器用于返回属性值,而 set 属性访问器用于分配新值. 这些访问器可以具有不同的访问级别. 有关详细信息,请参阅 ...