论文Compiler Technologies in Deep Learning Co-Design: A Survey分享

目录

  • 标题
  • 摘要
  • 引言
  • 背景
    • 深度学习软件和硬件的发展
    • 不同时期的协同设计
    • 深度学习协同设计系统
      • 神经网络架构设计和优化
      • 协同设计技术
  • 用于协同设计的深度学习系统中的编译技术
    • 深度学习编译器
      • TVM 生态系统和MLIR生态系统
      • IR
      • 转换和优化
      • 代码生成
      • 运行时和执行模式
  • Buddy-Compiler: 一个针对协同设计的深度学习编译器框架
    • Buddy Compiler 概述
      • Compiler模块
      • Benchmark模块
      • DSA模块
  • 总结

标题

请添加图片描述

从标题可以看出,这篇文章是一个综述,内容上主要是关于深度学习中的编译器技术。Co-Design 可以理解为软硬件协同设计,它可以包括:

  1. 硬件设计:开发专用集成电路(ASIC)或张量处理单元(TPU)等硬件来加速深度学习计算。
  2. 软件设计:开发和优化深度学习模型、算法以及编译器技术,充分利用硬件的性能。

直白点来说,就是在深度学习模型推理领域,设计硬件时要考虑软件(设计硬件时要考虑算法是怎么做的等等),设计软件时要考虑硬件(设计编译器时要考虑指令在硬件平台上是如何计算的等等),以达到硬件和算法最佳表现。

摘要

深度学习的应用飞速在发展,但是在硬件方面因为摩尔定律的失效导致通用的处理器无法满足深度学习模型的需求,因此需要专用的硬件来加速深度学习计算。本文详细阐述了过去有关深度学习中编译器以及协同设计的工作。 最后,作者针对典型的深度学习协同设计系统提出了一种特定领域的编译框架——Buddy Compiler。

引言

通用处理器无法满足深度学习任务的性能和功耗要求。因此,工业界和学术界都致力于软硬件协同设计,在这个过程中,编译器技术是非常重要的一个环节。

在深度学习软硬件协同设计中,硬件架构的创新是根本,软件设计(算法)是关键,从软件到硬件的映射决定了效果。深度学习系统负责映射和优化,这个过程分为模型级优化、工作负载优化和工作负载映射和硬件接口。为了获得更高的性能,需要在整个过程中进行调整,这对于协同设计至关重要。在实践中,最直接的调优方法是与软硬件团队沟通确定需求。

随着当前深度学习框架和硬件平台的碎片化(意思就是上有各种各样的深度学习框架,下游有各种各样的硬件平台——LPU,TPU,GPU…),编译技术可以在协同设计中发挥关键作用,以避免组合爆炸问题(M中深度学习框架,N中硬件平台,那么组合起来就是MxN中解决方案)。编译技术的本质是抽象,软件和硬件的抽象正在走向统一的IR。

这篇文章的主要贡献如下:

  • 概述了深度学习软件、硬件、协同设计和系统的发展。
  • 总结了深度学习协同设计系统的关键技术。
  • 从软件和硬件两个角度对协同设计中编译技术进行了分析。
  • 讨论了协同设计中编译技术的当前问题和未来趋势。
  • 提出了一种特定领域的编译框架——Buddy Compiler。

背景

深度学习软件和硬件的发展

这部分主要介绍了从1960年开始到深度学习软件和硬件的发展历程,可以用下面这张图概括:

请添加图片描述

在2000年后,Dennard Scaling(丹纳德缩放定律)开始失效。然后人们引入了多核设计,虽然多核的设计没有直接解决功耗问题,但是它通过引入更多的并行度进一步提高了性能,然后深度学习任务本身就有很高的并行性,所以两者刚好对应上。

**丹纳德缩放定律:**在一个集成电路上,当晶体管的尺寸缩小时,他们在芯片上的密度增加,使得在相同面积的芯片上可以容纳更多的京替换;晶体管尺寸缩小的同时,电压和电流也按比例缩小,以保持功率密度恒定,尽管功率密度保持恒定,更多的晶体管意味着更高的性能和更强的计算能力,这个定律是由Robert H. Dennard在1974年提出的。然而,Dennard Scaling并不是无限制地有效,当晶体管变得非常小时,漏电流增加,导致功耗增加;电压降低到一定程度后,进一步降低电压变得困难,这限制了功率密度的控制;尽管功率密度保持恒定,但整体功耗增加,导致散热问题变得更为严重。

不同时期的协同设计

软硬件协同设计是一种硬件和软件的联合设计方法,以实现协同并满足系统约束,例如性能和功耗。如上图所示:在神经网络的早期兴起和衰落过程中,软件和硬件是交替发展的。到了2010年代,深度学习的硬件和软件开始协同设计,为广泛的协同设计提供了机会。协同设计的范围很大,在不同时期和领域提出了各种方法,软硬件协同设计大约有30年的历史。

深度学习协同设计系统

深度学习系统可以帮助开发者减小开销,在不同层级提供优化的机会。整个系统如下图所示:
请添加图片描述

包括了端到端的深度学习软件和硬件系统,硬件发展方法和协同设计技术。

神经网络架构设计和优化

神经网络架构优化可以减少模型的计算复杂度,常用的方法有设计高效的模型结构、剪枝、量化、硬件感知神经架构搜索等。除过这些,使用编译器技术的协同设计的方法可以获得更好的结果。

协同设计技术

我们相信协同设计的本质是在软件优化和硬件优化之间取得trade-off。在实际中,软件和硬件开发者需要理解对方的设计,高效沟通,一起做决定。根据我们的经验,通用的协同设计过程包括约束的指定,接口的设计,优化策略的迭代。

用于协同设计的深度学习系统中的编译技术

一个传统的编译器可分为三个部分:前端解析语言;中端优化IR;后端生成硬件指令。

深度学习编译器

深度学习编译器的基础设施包括:前端导入,高级语言绑定,多级IR和它的括展机制,张量操作,数据结构,优化过程和管理器以及硬件平台的工具集成。在这些里面,优化技术和IR设计最为重要,因为它们分别决定了执行性能和开发效率。

深度学习编译器的优化可以更好地将神经网络工作负载映射到硬件。深度学习编译器通常将整个模型拆分为子图,然后将图级优化技术应用于子图,例如层优化,算子融合和常量折叠。随后,IR被转换为较低的抽象级别,以进行循环级和硬件相关的优化,例如循环重新排序、循环平铺和内存相关的优化。

XLA,OpenVINO,Glow等编译器定义自己的IR,和对应的前端,优化和后端支持。这些编译器的IR无法复用,必须重复开发优化。为了提升开发效率,深度学习编译器正在形成统一的生态系统。目前主要有两种生态系统,一个是TVM,一个是MLIR。

TVM 生态系统和MLIR生态系统

TVM 将不同深度学习框架的模型转换为一个统一的IR系统,避免了多个前后端带来的组合爆炸问题。TVM使用了Halide的思想,将算法和调度解耦,强大的自动调优和自动调度能力提供高性能的解决方案。在生态系统中,自动内核生成添加了多面体变化来优化张量表达式(TE)。

MLIR 提供了一个核心的抽象,名为方言(dialects),强大的扩展能力。用户可以轻易地添加新的方言和自定义的算子,类型和属性。一些编程模型和特定领域的编程语言也已经纳入MLIR生态系统,例如Triton使用MLIR来做GPU的代码生成。

总的来说,TVM是一个端到端的深度学习编译器,而MLIR是一个可复用以及可扩展的编译基础设施。虽然他们的核心理念不同,但是构建的生态系统具有可比性。TVM的可扩展性源于张量表达和优化机制,并提供强大的自动化设计来实现高的性能,然而它的领域可扩展性相对有限。MLIR的可扩展性源于IR的设计和LLVM集成,强大的IR扩展机制允许更大的生态系统。但是具体的实施需要足够的领域知识和经验才能达到预期的结果。下图展示了TVM和IREE的比较:
在这里插入图片描述

AOT 编译:编译时机,在程序运行之前,将源代码编译成机器码或中间语言;运行时,程序运行时使用已经编译好的代码,省去了运行时的编译步骤。
JIT编译:编译时机,在程序运行时即时编译,将字节码或中间语言语言转为机器码;运行时,程序在执行过程中实时编译和优化代码。

IR

IR是编译器中最重要的部分,它用来解耦深度学习框架和硬件平台。传统编译器的IR在程序语言和目标之间搭建了一个桥梁,并在IR上进行编译优化。深度学习编译器也要依赖传统编译器的IR,这是为了重用他们现有的后端生成能力。LLVM IR 是最广泛使用的传统IR。然而LLVM IR 只有单级抽象和细粒度操作,所以很难将高级抽象和粗粒度操作的深度学习模型映射到它上面去。因此,编译器会定义一个高级的IR来解决这个问题。不同级别的IR旨在扩大优化空间并缩小与低级别IR的差距,虽然多级IR并不是一个新的编译技术,但却是深度学习编译器的一个重要特性。

TVM 的IR设计可以分为两个级别。Relay IR负责映射深度学习模型和执行图级别的优化,Tensor IR(TIR)负责调度和调整。Relay IR具有带let-binding 结构的函数式风格,支持自动微分。在降级的过程中,TVM 提供TE来构建TIR,并且TE支持各种调度原语来指定优化(例如:平铺,向量化和并行化)。另外,TVM使用TOPI机制来定义常用的算子,可以减小手动编写TE的开销。经过调度和调整后,生成的TIR进一步被转为LLVM IR。

MLIR使用方言的概念来表达一个抽象级别。在IREE项目中的IR可以分为MLIR核心方言,IREE自定义方言,和第三方的方言。作为基础设施,MLIR提供了很多机制来帮助用户设计IR。它提供了一个ODS框架来定义IR。

TVM IR设计与MLIR的思路相似,但原则和系统上存在差异。本质区别在于IR的结构,虽然两者都代表深度学习模型的数据流,但TVM使用的非范式(ANF) IR结构和MLIR 使用的SSA IR结构不同。基于ANF的设计可以轻松表达功能语义和指定计算范围,从而消除语义上的歧义。基于SSA的设计可以轻松执行例如常量传播以及死代码消除这样的优化。

总结就是:TVM好上手,但是对于编译器的开发者来说难以扩展;MLIR提拱了模块化的IR设计,减少开发时间,但是对编译器的使用者要求较高

转换和优化

深度学习编译器可以执行转换和优化来提升模型执行效率。在图级别,优化方法主要包括高级抽象中的融合和数据布局转换。fusion可以减少内存访问和中间数据的通信开销,数据布局转换可以产生后端友好的数据格式。

在进一步降级后,可以执行基于滑动窗口的 peehole optimization 和 基于数据流分析的全局优化。与此同时,可以采用许多具体的优化算法来利用硬件加速架构。以CPU为导向的优化方法主要包括SIMD/vector扩展的向量化,针对多核架构的并行计算以及针对内存层次结构的内存访问优化。 虽然GPU 没有CPU那么大的cache和频率,但是他们的高吞吐和并行结构帮助加速模型。因此,以GPU为导向的加速方法通常采用多线程和访存优化。对于不同的架构,auto-tuning 技术可以提高编译器优化的效率。编译器将优化策略参数化以此形成一个搜索空间,目标机器报告每个搜索步骤的结果。不断迭代搜索过程,直到满足目标约束。除了依赖编译器优化之外,程序员还可以使用硬件编程模型手动优化代码。有了许多的优化技术,下面讨论实现优化的编译器基础设施。

在IR级别,TVM 和 IREE都可以实现上述优化。然而,优化策略的实现不同。TVM 拆分算法的定义和调度,这样可以增加算法的可读性并允许有效利用调度表示进行调优。IREE使用MLIR 基础设施来添加自定义的方言并且使用混合抽象来实现优化passes。TVM和IREE中的优化策略都被实现为编译器中的pass,每一个pass都是IR级别的转换,pass基础设施具有相似的组件来管理定义,注册和执行。实现细节的差异源于不同的IR设计。MLIR引入了一种声明式的定义机制,允许pass支持灵活和可扩展的IR。多级抽象设计,加上混合方言的使用策略,在MLIRpass pipeline 中提出了挑战。一些高级优化passes 通过多种方言需要仔细安排passes才可以达到预期效果。

代码生成

传统编译器的代码生成是将IR转为目标平台的汇编代码,这个过程中的关键是指令选择和寄存器分配。指令调度可以在寄存器分配之间和之后执行,生成高质量的代码来利用ILP(指令级并行性)。

深度学习编译器执行模型,根据不同的执行方法生成相应的代码,并将生成的代码提供给处理器和执行器。 在这一部分,代码生成被分为机器代码生成和引擎指令执行。

运行时和执行模式

IR抽象出了深度学习模型的结构,代码生成将IR翻译为可以行文件。为了在目标硬件平台上运行这些可执行程序,有必要维护一个与操作系统和其他系统软件交互的运行时环境。

与程序执行类似,深度学习模型可以分为AOT编译,解释性执行和即时(JIT)编译。AOT编译将模型转为机器码,并将其他程序链接到可以直接在目标机器上运行的可执行文件。解释执行与将代码直接编译为机器码的方式不同,在解释执行中,程序并不会被完全编译为底层机器码,而是被转换成某种中间表示(如抽象语法树AST,图表示或者字节码),然后由解释器或虚拟机(VM)逐步解释和执行这些中间表示。JIT编译结合了AOT编译和解释执行的特性,在运行时将IR编译为机器码,可以根据运行时信息、平衡性能和灵活性进一步优化。

Buddy-Compiler: 一个针对协同设计的深度学习编译器框架

如下图所示,这个框架被分为5个模块:compier框架,benchmark框架,DSA平台,协同设计模块以及compiler作为服务平台。
在这里插入图片描述

  • compiler框架(buddy-mlir)可以帮助开发者轻松设计和实现针对具体领域的编译器。
  • benchmark框架(buddy-benchmark)可以帮助开发者评估性能。

Buddy Compiler 概述

作为一个编译器框架,buddy Compiler基于MLIR和RISC-V致力于构建一个可扩展和灵活的硬件-软件协同设计的生态系统。

Compiler模块

编译器模块(buddy-mlir)围绕MLIR构建,专门用于为DSL到DSA提供编译支持。 关于DSL支持,语言绑定具有成熟的实现方法,尤其是Python绑定。前端可以使用MLIR的Python绑定与深度学习框架(Pytorch2.0)进行对接,也具有独立的DSL支持,通过Antlr实现DSL到MLIR的映射,简化了编译器开发。中端通过自定义的MLIR方言,实现特定领域的优化。

Benchmark模块

Benchmark 模块主要是提供多级性能评估。

DSA模块

DSA模块主要是为了基于RISC-V的可编程加速器的设计和实现,并为软硬协同设计提供接口。在可编程方面,RISC-V生态系统是现在最好的选择,因为它的模块和可扩展的设计概念,并且buddy-mlir模块支持自定义RISC-V指令集的编译。从协同设计的角度来看,硬件和软件的交集是MLIR。

总结

在神经网络的历史上,软件和硬件彼此相互推动,在过去的十年中,协同设计越来越重要。在计算机架构和特定领域编译器的黄金年代,我们认为基于编译器技术的协同设计方法将会是未来深度学习系统的突破口。

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

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

相关文章

如何在 iPhone 上恢复已删除的短信

本文介绍如何检索已删除的短信和 iMessage 以及恢复丢失的消息。说明适用于 iOS 17 及更高版本。 如何在 iOS 17及更高版本中恢复文本 恢复已删除短信的最简单方法是使用 iOS 17。从删除短信到恢复它有 30 到 40 天的时间。 在“信息”的对话屏幕中,选择“过滤器”…

梯度提升决策树(GBDT)

GBDT(Gradient Boosting Decision Tree),全名叫梯度提升决策树,是一种迭代的决策树算法,又叫 MART(Multiple Additive Regression Tree),它通过构造一组弱的学习器(树&am…

Valgo,类型安全,表达能⼒强的go验证器

valgo 是一个为 Go 语言设计的类型安全、表达性强且可扩展的验证库。该库的特点包括: github.com/cohesivestack/valgo 类型安全:利用 Go 语言的泛型特性(从 Go 1.18 版本开始支持),确保验证逻辑的类型安全。表达性&a…

关于Stream.toList()方法使用小记

对照示例 public static void main(String[] args) {final List<String> list new ArrayList<>();list.add("aa");list.add("bb");list.add("cc");list.remove("cc");System.out.println(list);}结果&#xff1a; Stre…

【谣传】不能完全取代HR

https://arxiv.org/pdf/2405.18113 这份研究论文提出了 MockLLM&#xff0c;一个利用大型语言模型&#xff08;LLM&#xff09;角色扮演能力来促进招聘场景中人和职位匹配的框架。它通过模拟面试过程来生成额外的匹配证据&#xff0c;从而提高匹配的准确性。 主要问题和挑战&am…

使用python绘制季节图

使用python绘制季节图 季节图效果代码 季节图 季节图&#xff08;Seasonal Plot&#xff09;是一种数据可视化图表&#xff0c;用于展示时间序列数据的季节性变化。它通过将每个时间段&#xff08;如每个月、每个季度&#xff09;的数据绘制在同一张图表上&#xff0c;使得不同…

移动安全赋能化工能源行业智慧转型

随着我国能源化工企业的不断发展&#xff0c;化工厂中经常存在火灾爆炸的危险&#xff0c;特别是生产场所&#xff0c;约有80%以上生产场所区域存在爆炸性物质。而目前我国化工危险场所移动通信设备的普及率高&#xff0c;但是对移动通信设备的安全防护却有所忽视&#xff0c;包…

关系数据库标准查询语言-SQL-SQL语言概述

一、SQL(Structured Query Language)语言 1、是高度非过程化的语言 2、关系数据库管理系统(RDBMS)都支持SQL标准 3、具有定义、查询、更新、控制四大功能 4、数据库对象由数据库&#xff08;Database&#xff09;、基本表&#xff08;Table&#xff09;、视图&#xff08;V…

string经典题目(C++)

文章目录 前言一、最长回文子串1.题目解析2.算法原理3.代码编写 二、字符串相乘1.题目解析2.算法原理3.代码编写 总结 前言 一、最长回文子串 1.题目解析 给你一个字符串 s&#xff0c;找到 s 中最长的回文子串。 示例 1&#xff1a; 输入&#xff1a;s “babad” 输出&am…

自动化测试-Selenium-元素定位

一.元素定位 因为使用selenium进行自动化测试&#xff0c;元素定位是必不可少的&#xff0c;所以这篇文章用于自动化测试中的selenium中的元素定位法。 1.根据id属性进行定位&#xff08;id是唯一的&#xff09; id定位要求比较高&#xff0c;要求这个元素的id必须是固定且唯…

Java的自动装箱和自动拆箱

自动装箱和拆箱在Java开发中的应用与注意事项 在Java开发中&#xff0c;自动装箱&#xff08;Autoboxing&#xff09;和自动拆箱&#xff08;Unboxing&#xff09;是指基本数据类型与其对应的包装类之间的自动转换。这些特性可以使代码更加简洁和易读&#xff0c;但在实际项目…

CANoe-Trace窗口无法解析SOME/IP报文、Demo License激活方式改变

1、Trace窗口无法解析SOME/IP报文 在文章《如何让CANoe或Wireshark自动解析应用层协议》中,我们通过设置指定端口号为SOME/IP报文的方式,可以让CANoe中的Trace窗口对此端口号的报文当成是SOME/IP报文进行解析。 Trace窗口就可以根据传输层端口号对payload数据按照SOME/IP协议…

linuxDNS域名解析

文章目录 DNS 是域名系统的简称正向解析反向解析主从服务器解析bond网卡 DNS 是域名系统的简称 域名和IP地址之间的映射关系 互联网中&#xff0c;IP地址是通信的唯一标识&#xff0c;逻辑地址 访问网站 域名解析的目的就是为了实现&#xff0c;访问域名就等于访问IP地址 …

JS(JavaScript)的引用方式介绍与代码演示

天行健&#xff0c;君子以自强不息&#xff1b;地势坤&#xff0c;君子以厚德载物。 每个人都有惰性&#xff0c;但不断学习是好好生活的根本&#xff0c;共勉&#xff01; 文章均为学习整理笔记&#xff0c;分享记录为主&#xff0c;如有错误请指正&#xff0c;共同学习进步。…

SpringBoot+Vue体育馆管理系统(前后端分离)

技术栈 JavaSpringBootMavenMySQLMyBatisVueShiroElement-UI 角色对应功能 学生管理员 功能截图

Linux安装MySQL教程【带图文命令巨详细】

巨详细Linux安装MySQL 1、查看是否有自带数据库或残留数据库信息1.1检查残留mysql1.2检查并删除残留mysql依赖1.3检查是否自带mariadb库 2、下载所需MySQL版本&#xff0c;上传至系统指定位置2.1创建目录2.2下载MySQL压缩包 3、安装MySQL3.1创建目录3.2解压mysql压缩包3.3安装解…

DBeaver无法连接Clickhouse,连接失败

DBeaver默认下载的是0.2.6版本的驱动&#xff0c;但是一直连接失败&#xff1a; 报错提示 解决办法 点击上图中的Open Driver Configuration点击库 - 重置为默认状态在弹出的窗口中修改驱动版本号为0.2.4或者其他版本&#xff08;我没有试用过其他版本&#xff09;&#xff0…

vscode软件上安装 Fitten Code插件及使用

一. 简介 前面几篇文章学习了 Pycharm开发工具上安装 Fitten Code插件&#xff0c;以及 Fitten Code插件的使用。 Fitten Code插件是是一款由非十大模型驱动的 AI 编程助手&#xff0c;它可以自动生成代码&#xff0c;提升开发效率&#xff0c;帮您调试 Bug&#xff0c;节省…

FPGA通过移位相加实现无符号乘法器(参数化,封装成IP可直接调用)

目录 1.前言2.原理3.移位无符号乘法器实现&#xff0c;并参数化 微信公众号获取更多FPGA相关源码&#xff1a; 1.前言 在硬件设计中&#xff0c;乘法器是非常重要的一个器件&#xff0c;乘法器的种类繁多&#xff0c;常见的有并行乘法器、移位相加乘法器和查找表乘法器。 并…

Java——简单图书管理系统

前言&#xff1a; 一、图书管理系统是什么样的&#xff1f;二、准备工作分析有哪些对象&#xff1f;画UML图 三、实现三大模块用户模块书架模块管理操作模块管理员操作有这些普通用户操作有这些 四、Test测试类五、拓展 哈喽&#xff0c;大家好&#xff0c;我是无敌小恐龙。 写…