简介: 在本系列分享中我们将介绍BladeDISC在动态shape语义下做性能优化的一些实践和思考。本次分享的是我们最近开展的有关shape constraint IR的工作,Part II 中我们将介绍shape constraint IR的设计,实现以及一些初步的实验结果

在本系列分享中我们将介绍BladeDISC在动态shape语义下做性能优化的一些实践和思考。本次分享的是我们最近开展的有关shape constraint IR的工作,鉴于篇幅较长,为了提升阅读体验,我们将分享拆分为两个部分:

  • Part I 中我们将介绍问题的背景,面临的主要挑战和以及我们做shape constraint IR的动机;
  • Part II 中我们将介绍shape constraint IR的设计,实现以及一些初步的实验结果;

本篇是关于Part II的介绍,Part I的介绍请参考这里

设计和实现

shape constraint IR的设计

使用IR来建模shape constraint并不是一个很容易的事情。我们需要设计一种方案既方便我们做shape constraint分析,同时又不会使得IR的后续变换变的很复杂。经过多次迭代之后,我们选择了type-based方案来构建shape constraint IR,基本思路如下段伪IR所示。

// original data-computation IR
func @main() {
...
%0 = any_dialect.any_operation(...) : tensor<?x?xf32, [@S0, @S1]>
...
} disc_shape.SymbolicDim @S0 {
range list : [[...], [...], ...]
likely_values : [...]
...
symbolic_shape_graph: @shape_constraint_graph
} disc_shape.SymbolicDim @S1 {
range list : [[...], [...], ...]
likely_values : [...]
...
symbolic_shape_graph: @shape_constraint_graph
} // A separated function to store shape constraint predicates between different symbolic dimensions.
// Each symbolic dim is either bound to a `disc_shape.dim` op or `disc_shape.bind_dim`
func @shape_constraint_graph(...) {
%0 = disc_shape.dim() {ref: @S0} : index
%1 = disc_shape.dim() {ref: @S1} : index
disc_shape.tie_predicate_divisible(d0, d1) // d0 % d1 == 0 // other tie_* ops
// disc_shape.tie_predicate_eq(d0, d1) // d0 == d1
// disc_shape.tie_predicate_lt(d0, d1) // dim less than
// disc_shape.tie_predicate_mul_eq(d0, d1, d2, ...) // d0 = d1 * d2 * ...
// // d0 * d1 = s0 * s1
// disc_shape.tie_predicate_product_eq([d0, d1, ..], [s0, s1, ...])
// // d0 = affine.apply(d1, d2, ...) {affine_attr = ...}
// disc_shape.tie_predicate_affine_eq(d0, d1, d2, ...) {affine_attr = ...}
}

在这个方案中,每一个symbolic dimension size(也即在编译期间无法确定具体大小的dimension size)对应一个全局的disc_shape.SymbolicDimIR对象。该IR对象中存储了关于这个symbolic dimension size的分布相关的约束,同时也存储了对一个shape constraint function的引用。在上图中最下面的部分是一个shape constraint function的例子。在这个function中存储的是symbolic dimension dim之间的相关关系(结构化约束),每一种相关关系用一个op来抽象,比如说这个例子中说展示的整除等价关系便是由tie_predicate_divisibleop来描述。选择type-based方案主data计算图中并不会直接存储shape constraint信息。在上图中的最上面是一个主data计算图的例子。主data计算图中,每一个tensor对应的type中都包含一个attribute,这个attribuet中存储了这个tensor所对应的symblic dimension size的引用。

通过将描述shape constraint的IR和主data计算IR解耦开,一方面可以尽可能减少对已有pattern匹配的逻辑的干扰 (matmul+BiadAdd -> FusedMatmulBiasAdd这个pattern替换并不需要感知到shape constraint IR的存在),另外一方面,不同层级的data计算的IR,比如tensor level IR和buffer level IR,可以用同一套shape constraint的描述。从而可以缓解IR lowering过程中shape constraint信息的丢失问题。

基于shape constraint IR的优化pipeline

将shape constraint IR作为第一等公民引入IR中之后,我们进一步构建了以shape constraint 为中心的优化 pipeline(如下图所示)。通过对shape constraint的充分的挖掘,而非依赖于具体的shape的值来辅助完成各种优化,从而实现在动态shape语义下尽可能接近静态shape优化工具的性能。

下图中展示了目前BladeDISC中主要的几个优化的阶段。从最左边开始看起。第一步是将前端AI框架的计算图lower到MHLO的计算描述。这里值得注意的是除了普通的data计算的lowering,还包含shape constraint的lowering,从而避免在动态shape语义信息的丢失。到MHLO之后,我们首先会完成shape constraint的分析以及分析结果的IR化表示。分析得到的结果将可以指导我们完成计算图上的一些基本化简,比如冗余broadcast op的消除,layout调整等。优化完之后的计算图,我们会进一步对其中的访存密集型算子做融合优化,shape constraint将是决定那些算子可以融合的很重要的判断依据,通过更充分的挖掘shape constraint,我们可以找到更多融合的机会。最后在做代码生成的时候,我们发现在动态shape语义下index计算的开销更加容易成为瓶颈,尤其是当算子融合的数目比较多的时候,利用shape constraint我们可以大幅消除冗余的index计算。以上限制于篇幅并未一一展开进行介绍,感兴趣的同学可以通过这里了解更多的细节。

初步测试

我们目前已经完成了shape constraint IR的第一阶段开发,也即shape constraint IR的引入以及pass pipeline的适配性改造。第一阶段的主要目标是搭建好整体的架子,还并未包含所有设计中优化的实现 (比如likely value的应用),我们将会在后续持续迭代完善shape constraint IR。在以上前提下,我们在一些比较典型的模型上完成初步的评测,下图展示的是部分的评测结果。由于目前shape constraint IR还未应用到计算密集型算子(GEMM/CONV等)的优化 ,故以下测评针对的是模型中访存密集型部分,主要从两个维度来衡量:

  • 访存密集型部分kernel launch的次数,即衡量fusion的粒度,同等情况下次数越少,fusion的粒度越大;
  • 访存密集型部分总消耗时间,即衡量生成的kernel的质量,同等情况下总时间越短,质量越高;

如下图中所示,在CPU和GPU上我们都观测到fusion粒度的明显改善以及访存密集型部分总消耗时间的减少。

原文链接:https://click.aliyun.com/m/1000354603/

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

动态尺寸模型优化实践之Shape Constraint IR Part II的更多相关文章

  1. HBase实践案例:知乎 AI 用户模型服务性能优化实践

    用户模型简介 知乎 AI 用户模型服务于知乎两亿多用户,主要为首页.推荐.广告.知识服务.想法.关注页等业务场景提供数据和服务, 例如首页个性化 Feed 的召回和排序.相关回答等用到的用户长期兴趣特 ...

  2. 百度APP移动端网络深度优化实践分享(一):DNS优化篇

    本文由百度技术团队“蔡锐”原创发表于“百度App技术”公众号,原题为<百度App网络深度优化系列<一>DNS优化>,感谢原作者的无私分享. 一.前言 网络优化是客户端几大技术方 ...

  3. 腾讯技术分享:GIF动图技术详解及手机QQ动态表情压缩技术实践

    本文来自腾讯前端开发工程师“ wendygogogo”的技术分享,作者自评:“在Web前端摸爬滚打的码农一枚,对技术充满热情的菜鸟,致力为手Q的建设添砖加瓦.” 1.GIF格式的历史 GIF ( Gr ...

  4. Unreal Engine 4 动态切割模型实现

    转自:http://gad.qq.com/article/detail/33199 <合金装备:复仇>里面,有一个很有趣的设定,游戏里大部分的场景和物件都可以用主角的刀动态切割. UE4中 ...

  5. etcd 性能优化实践

    https://mp.weixin.qq.com/s/lD2b-DZyvRJ3qWqmlvHpxg 从零开始入门 K8s | etcd 性能优化实践 原创 陈星宇 阿里巴巴云原生 2019-12-16 ...

  6. vivo版本发布平台:带宽智能调控优化实践-平台产品系列03

    vivo 互联网平台产品研发团队 - Peng Zhong 随着分发规模地逐步增长,各企业对CDN带宽的使用越来越多.并且,各类业务使用CDN的场景各式各样,导致带宽会不断地出现骤增骤降等问题.基于成 ...

  7. 直播推流端弱网优化策略 | 直播 SDK 性能优化实践

    弱网优化的场景 网络直播行业经过一年多的快速发展,衍生出了各种各样的玩法.最早的网络直播是主播坐在 PC 前,安装好专业的直播设备(如摄像头和麦克风),然后才能开始直播.后来随着手机性能的提升和直播技 ...

  8. 携程App的网络性能优化实践

    首先介绍一下携程App的网络服务架构.由于携程业务众多,开发资源导致无法全部使用Native来实现业务逻辑,因此有相当一部分频道基于Hybrid实现.网络通讯属于基础&业务框架层中基础设施的一 ...

  9. Glow Android 优化实践

    了解 Glow 的朋友应该知道,我们主营四款 App,分别是Eve.Glow.Nuture和Baby.作为创业公司,我们的四款 App 都处于高速开发中,平均每个 Android App 由两人负责开 ...

  10. Unity3D游戏GC优化总结---protobuf-net无GC版本优化实践

    protobuf-net优化效果图 protobuf-net是Unity3D游戏开发中被广泛使用的Google Protocol Buffer库的c#版本,之所以c#版本被广泛使用,是因为c++版本的 ...

随机推荐

  1. STM32 SPI接口 DMA normal 和circual区别

    DMA有normal和circular两种模式. circular模式: 就调用这个函数一次就可以了,DMA一直开启,一帧数据发送完毕之后里面发送下一帧,中间没有停顿.这样确实是快了,也释放了CPU, ...

  2. 用于演示文稿的新 Dapr 幻灯片

    Dapr 官方博客上(https://blog.dapr.io/posts/2024/03/10/new-dapr-slide-deck-for-your-presentations/)发布了一个新的 ...

  3. day03-1-查看账单&结账功能

    满汉楼03 4.功能实现05 4.8查看账单功能 按照之间搭建起来的框架,在BillService编写方法 4.8.1代码实现 1.修改Bill类 重写Bill类中的toString方法 @Overr ...

  4. github拉项目显示timeOut

    参考:https://blog.csdn.net/qq_37424778/article/details/132018804 自己尝试在github上拉项目,但是报错LibreSSL SSL_read ...

  5. CentOS 同时安装多个版本的Python3

    1.背景 已安装了 Python3.6.4,需要再安装 Python3.9 版本 2.操作步骤 (1)寻找当前 Python3.9 版本最新稳定版的子版本 通过官网查找,目前为 3.9.18,下载到本 ...

  6. 三维模型3DTile格式轻量化压缩在移动智能终端应用方面的重要性分析

    三维模型3DTile格式轻量化压缩在移动智能终端应用方面的重要性分析 随着移动智能终端设备的不断发展和普及,如智能手机.平板电脑等,以及5G网络技术的推广应用,使得在这些设备上频繁使用三维地理空间数据 ...

  7. 记录--7 个沙雕又带有陷阱的 JS 面试题

    这里给大家分享我在网上总结出来的一些知识,希望对大家有所帮助 为了保证的可读性,本文采用意译而非直译. 在 JS 面试中,经常会看到一些简单而又沙雕的题目,这些题目包含一些陷阱,但这些在我们规范的编码 ...

  8. 开发进阶系列:Java并发之从基础到框架

    一  线程基础 1.synchronized取得的锁都是对象锁,哪个线程执行synchronized修饰的方法,哪个线程就获得这个方法所属对象的锁.不同对象不同锁,互不影响. 另一种情况是static ...

  9. -bash: jps:未找到命令 CentOS7

    yum install java-1.8.0-openjdk-devel.x86_64

  10. CSS+HTML+flexible.js+rem实现屏幕缩放适配概念原理解释

    首先理解几个概念: (1)屏幕尺寸:屏幕对角线的长度,一般用英寸表示,1英寸=2.54cm. (2)dp((或者叫dip):设备独立像素,也就是设备屏幕上多少个点. (3)dpi:印刷行业术语,像素密 ...