动态尺寸模型优化实践之 Shape Constraint IR Part II

在本系列分享中我们将介绍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} : indexdisc_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粒度的明显改善以及访存密集型部分总消耗时间的减少。

原文链接

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/510516.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

PolarDB 助力易仓打造跨境行业生态链协同的产业链 SaaS

2022年7月&#xff0c;易仓ECCANG WMS东南亚版正式上线&#xff01;专为东南亚海外仓业务打造&#xff0c;帮助东南亚海外仓企业排忧解难&#xff0c;实现订单、仓库、人员、财务高效管理。易仓科技是头部的跨境行业SaaS服务商&#xff0c;其生态涵盖了300工厂、100000卖家、17…

iLogtail 社区版使用入门 - 采集 MySQL Binlog

iLogtail是阿里云日志服务&#xff08;SLS&#xff09;团队自研的可观测数据采集Agent&#xff0c;拥有的轻量级、高性能、自动化配置等诸多生产级别特性&#xff0c;可以署于物理机、虚拟机、Kubernetes等多种环境中来采集遥测数据。iLogtail在阿里云上服务了数万家客户主机和…

融合数据库生态:利用 EventBridge 构建 CDC 应用

引言 CDC&#xff08;Change Data Capture&#xff09;指的是监听上游数据变更&#xff0c;并将变更信息同步到下游业务以供进一步处理的一种应用场景。近年来事件驱动架构&#xff08;EDA&#xff09;热度逐步上升&#xff0c;日渐成为项目架构设计者的第一选择。EDA 天然契合…

Pandas+ SLS SQL:融合灵活性和高性能的数据透视

Pandas是什么 Pandas是一个十分强大的python数据分析工具&#xff0c;也是各种数据建模的标准工具。Pandas擅长处理数字型数据和时间序列数据。Pandas的第一大优势在于&#xff0c;封装了一些复杂的代码实现过程&#xff0c;只需要调用接口就行了&#xff0c;避免了编写大量的…

iLogtail 开源之路

2022年6月底&#xff0c;阿里云iLogtail代码完整开源&#xff0c;正式发布了完整功能的iLogtail社区版。iLogtail作为阿里云SLS官方标配的采集器&#xff0c;多年以来一直稳定服务阿里集团、蚂蚁集团以及众多公有云上的企业客户&#xff0c;目前已经有千万级的安装量&#xff0…

迁移 Nacos 和 ZooKeeper,有了新工具

背景 注册中心迁移在行业中主要有两个方案&#xff0c;一个是双注册双订阅模式&#xff08;类似数据库双写&#xff09;&#xff0c;一个是 Sync 模式&#xff08;类似于数据库 DTS&#xff09;&#xff1b;MSE 同时支持了两种模式&#xff0c;对于开通 MSE 服务治理客户&…

基于 Serverless+OSS 分分钟实现图片秒变素描

场景介绍 小明接到学校老师安排的任务&#xff0c;需要批量将班级里同学们拍的普通照片转换为素描图&#xff0c;供课堂游戏使用&#xff0c;于是求助到程序员老爸&#xff0c;机智的程序员老爸分分钟用几行Python代码解决&#xff1a;在阿里云Serverless函数计算服务中部署普…

解析 RocketMQ 业务消息 - “顺序消息”

引言 Apache RocketMQ 诞生至今&#xff0c;历经十余年大规模业务稳定性打磨&#xff0c;服务了阿里集团内部业务以及阿里云数以万计的企业客户。作为金融级可靠的业务消息方案&#xff0c;RocketMQ 从创建之初就一直专注于业务集成领域的异步通信能力构建。本篇将继续业务消息…

Koordinator 0.6:企业级容器调度系统解决方案,引入 CPU 精细编排、资源预留与全新的重调度框架

阿里云原生开源的混部系统 Koordinator 基于阿里超大规模混部生产实践经验而来&#xff0c;旨在为用户打造云原生场景下接入成本最低、混部效率最佳的解决方案&#xff0c;助力用户企业实现云原生后提升计算资源利用率、降低 IT 成本。 经过社区多位成员的贡献&#xff0c;Koor…

KubeVela Maintainer 徐佳航:什么样的开源项目将具有可延续的生命力?

云原生的技术价值喻示着它就是未来&#xff0c;加入到一个具有可延续性生命力的开源社区&#xff0c;可以帮助我们更快地到达那里。——徐佳航&#xff0c;KubeVela Maintainer&#xff0c;来自招商银行基础设施研发中心云平台及运维平台开发团队。来自招商银行基础设施研发中心…

龙蜥社区首推“分层分类”顶设 发展以云为终态的开源产业创新生态

在刚刚结束的 2022 开放原子全球开源峰会 OpenAnolis 分论坛上&#xff0c;龙蜥社区技术委员会主席杨勇做了《OpenAnolis 社区技术发展报告》的主题演讲&#xff0c;分享龙蜥社区如何从 0 到 1 实现原生社区布局&#xff0c;以及发展以云为终态的开源产业创新生态。 全文整理如…

友邦人寿可观测体系设计与落地

业务场景与挑战 友邦保险是香港联合交易所上市的人寿保险集团&#xff0c;覆盖 18 个市场。截至 2021 年 12 月 31 号&#xff0c;总资产 3400 亿美元。 友邦保险于 1992 年在上海设立分公司&#xff0c;是改革开放后最早一批获发个人人身保险业务营业执照的非本土保险机构之…

如何写出有效的单元测试

什么是单元测试 《单元测试的艺术》中对单元测试的定义&#xff1a; 一个单元测试是一段自动化的代码&#xff0c;这段代码调用被测试的工作单元&#xff0c;之后对这个单元的单个最终结果的某些假设进行校验。 单元测试几乎都是用单元测试框架编写的&#xff1b;只要产品代…

测试环境不稳定复杂的必然性及其对策

这篇文章想要讲的&#xff0c;的确是两件事情&#xff1a; 为什么测试环境的不稳定是必然的&#xff0c;怎么让它尽量稳定一点&#xff1f;为什么测试环境比生产环境更复杂&#xff0c;怎么让它尽量简单一点&#xff1f; 此外&#xff0c;还会谈一谈对测试环境和生产环境的区别…

【计算几何】线段相交

问题描述&#xff1a;已知两条线段P1P2和Q1Q2&#xff0c;判断P1P2和Q1Q2是否相交&#xff0c;若相交&#xff0c;求出交点。 两条线段的位置关系可以分为三类&#xff1a;有重合部分、无重合部分但有交点、无交点。 算法的步骤如下&#xff1a; 1.快速排斥实验。 设以线段…

代码圈复杂度治理小结

网上有个段子&#xff0c;说建筑工程师不会轻易答应会给摩天大楼增加一个地下室&#xff0c;但代码开发工程师却经常在干这样的事&#xff0c;并且总有人会对你说“这个需求很简单”。到土里埋个雷&#xff0c;这确实不复杂&#xff0c;但我们往往面临的真实场景其实是“在一片…

MSE 治理中心重磅升级-流量治理、数据库治理、同 AZ 优先

本次 MSE 治理中心在限流降级、数据库治理及同 AZ 优先方面进行了重磅升级&#xff0c;对微服务治理的弹性、依赖中间件的稳定性及流量调度的性能进行全面增强&#xff0c;致力于打造云原生时代的微服务治理平台。 前情回顾 在介绍升级能力之前&#xff0c;先简要回顾 MSE 产…

基于阿里云 Serverless 快速部署 Function 的极致体验

1.Serverless 前世今生 1.1 Serverless 背景介绍 云计算的不断发展&#xff0c;涌现出很多改变传统IT架构和运维方式的新技术&#xff0c;而以虚拟机、容器、微服务为代表的技术更是在各个层面不断提升云服务的技术能力&#xff0c;它们将应用和环境中很多通用能力变成了一种…

性能提升1倍,成本直降50%!基于龙蜥指令加速的下一代云原生网关

​ 技术背景 网络信息传输的可靠性、机密性和完整性要求日渐提升&#xff0c;HTTPS 协议已经广泛应用。HTTPS 的 SSL/TLS 协议涉及加解密、校验、签名等密码学计算&#xff0c;消耗较多 CPU 计算资源。因此 CPU 硬件厂商推出过多种加速卸载方案&#xff0c;如 AES-NI、QAT、KA…

TiDB、OceanBase、PolarDB-X、CockroachDB 二级索引写入性能测评

为什么要做这个测试 二级索引是关系型数据库相较于NoSQL数据库的一个关键差异。二级索引必须是强一致的&#xff0c;因此索引的写入需要与主键的写入放在一个事务当中&#xff0c;事务的性能是二级索引性能的基础。 目前市面上的分布式数据库中&#xff0c;从使用体验的角度看…