论文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。

总结

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

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

(软工) 功能性和非功能性需求是什么?

文章目录 前言🌟功能性需求⭐⭐⭐系统应该做什么?或者应该提供什么功能?⭐⭐⭐🫰举例 🌟非功能性需求⭐⭐⭐系统应该在哪些条件下能执行这些功能,且执行的很好。⭐⭐⭐❤️‍🔥质量属性(Quality…

(2024|ICML,Mamba2,SSD,SSM,SMA,矩阵变换,张量收缩,张量并行)Transformer 是 SSM

Transformers are SSMs: Generalized Models and Efficient Algorithms Through Structured State Space Duality 公和众和号:EDPJ(进 Q 交流群:922230617 或加 VX:CV_EDPJ 进 V 交流群) 目录 0. 摘要 1. 引言 2. …

SQL实验 数据的插入、修改和删除操作

一、实验目的 1.掌握Management Studio的使用。 2.掌握SQL中INSERT、UPDATE、DELETE命令的使用。 二、实验内容及要求 用SQL语句完成下列功能。使用数据库为SCHOOL数据库。 1、新开设一门课程,名叫网络安全与防火墙,学时40&#x…

Leetcode - 周赛400

目录 一,3168. 候诊室中的最少椅子数 二,3169. 无需开会的工作日 三,3170. 删除星号以后字典序最小的字符串 四,3171. 找到按位与最接近 K 的子数组 一,3168. 候诊室中的最少椅子数 本题是一道模拟题,直…

Bootstrap框架最新V5 快速入门直通

目录 Bootstrap - 前言 Bootstrap - 下载 Bootstrap - 使用 Bootstrap - 学习 Bootstrap - 栅格系统 Bootstrap - 全局样式 Bootstrap - 组件(Coponents) Bootstrap - 字体图标 Bootstrap - 前言 Bootstrap是由Twitter公司开发维护的前端UI框架,它提供了大量…

【YOLOv5/v7改进系列】引入Slimneck-GSConv

一、导言 GSConv旨在平衡模型的准确度与速度,针对自动驾驶车辆中目标检测任务设计。从类脑研究中得到的直观理解是,具有更多神经元的模型能够获得更强的非线性表达能力。但是,不容忽视的是生物大脑处理信息的强大能力和低能耗远远超过计算机…

【Linux】Linux项目自动化构建工具——make/Makefile

1.背景 会不会写makefile,从一个侧面说明了一个人是否具备完成大型工程的能力一个工程中的源文件不计数,其按类型、功能、模块分别放在若干个目录中,makefile定义了一系列的 规则来指定,哪些文件需要先编译,哪些文件需…

前端框架前置知识之Node.js:fs模块、path模块、http模块、端口号介绍

什么是模块? 类似插件,封装了方法 / 属性 fs 模块- 读写文件 代码示例 // 1. 加载 fs 模块对象 const fs require(fs) // 2. 写入文件内容 fs.writeFile(./test.txt, hello, Node.js, (err) > {if (err) console.log(err) //若 err不为空&#xf…

Linux的网络配置

查看网络配置命令 一、查看所有活动的网络接口信息 ifconfig ifconfig 展示的是当前设备正在工作的网卡(启动的设备) ifconfig -a 展示所有的网络设备 ifconfig ens33 查看指定网卡设备 ifconfig ens33 down 关闭网卡 或者 ifdown ens33 &#xff0…

Java集合概述

分类 分为两大类:Collection接口类和Map接口类 这两个接口都继承自一个共同的接口:Iterable接口,意为可迭代的 Iterable接口当中有一个Iterator迭代器接口对象,作为接口的变量(public static final修饰)…

MySQL—约束—外键约束中删除和更新行为(基础)

一、引言 上一个博客讲解并演示给字段加外键约束,以及通过外键来保证数据的一致性和完整性。我们一旦为子表 emp 字段 dept_id 添加外键关联之后,再去删除父表的数据之后,判断当前父表的这条数据是否在子表关联关系。如果存在,则不…

11.6 归并排序

目录 11.6 归并排序 11.6.1 算法流程 11.6.2 算法特性 11.6.3 链表排序 11.6 归并排序 归并排序(merge sort)是一种基于分治策略的排序算法,包含图 11-10 所示的“划分”和“合并”阶段。 划分阶段:通过递归不断地…

vue前端实现页面禁止缩放 前端适配问题处理 前端项目多端适配解决方案

在前端项目中,如果一个系统页面可以缩放可能会导致多种异常情况,这些异常情况涉及到页面布局、元素尺寸、事件触发、响应式设计和用户体验等方面。 1.布局错乱:页面元素在缩放后可能会出现错位、重叠或部分隐藏的情况,导致页面布局混乱,影响用户对页面内容的理解和操作。这…

接口签名和postman预处理生成签名

nestjs后端代码 controller Get(md5hmacSHA1b64)postMd5hmacSHA1b64(Req() request: Request, Query() query) {// 获取GET请求参数const queryParamsMap new Map(Object.entries(query));return this.handleMd5hmacSHA1b64(queryParamsMap, request);}Post(md5hmacSHA1b64)U…

达梦数据库相关SQL及适配Mysql配置总结

🍓 简介:java系列技术分享(👉持续更新中…🔥) 🍓 初衷:一起学习、一起进步、坚持不懈 🍓 如果文章内容有误与您的想法不一致,欢迎大家在评论区指正🙏 🍓 希望这篇文章对你有所帮助,欢…

ApiJson简单使用

前言 最近在正式迭代中插入了一个大屏演示项目,因为后端开发人员任务都安排满了,而演示项目逻辑比较简单,大多是直接查表就能搞定,所以只能想办法让前端直接和数据库交互,增加开发速度。在找工具时发现了ApiJson。尝试…

C语言学习之结构体

结构体: c语言---提供的一种方式,可以让用户自定义数据类型,用于处理复杂的数据类型。 struct 结构体名 { 成员表列 }; 构造一个结构体 结构体变量的引用: 方法: 结构体变量名.成员名 . 结构体成员运算符 //表示 从属关系 s.name //表…

MySQL-权限管理(二)

一 host中的含义 /usr/local/mysql/bin/mysql -pLXYlxy2:024.#8u} -S /data/mysql/tmp/mysqld.sock select user,host,authentication_string from mysql.user; %:主要允许从任何主机连接到MySQL服务器,即外部连接localhost: 代表只允许本地主机连接到MySQL服务器&…

SpringBoot——整合Servlet的三大组件:过滤器(Filter)

目录 过滤器 一、用过滤器检查用户是否登录 LoginFilter自定义过滤器 FilterConfig配置类 FilterController控制器 SpringbootFilterApplication启动类 二、用过滤器统计资源访问量 LoginFilter FilterController 在开发SpringBoot项目时,开发人员经常需…

使用Obfuscar 混淆WPF(Net6)程序

Obfuscar 是.Net 程序集的基本混淆器,它使用大量的重载将.Net程序集中的元数据(方法,属性、事件、字段、类型和命名空间的名称)重命名为最小集。详细使用方式参见:Obfuscar 在NetFramework框架进行的WPF程序的混淆比较…