神经 络加速器软件编程系统设计探讨

神经 络加速器为提升神经 络算法的实现性能提供了基础架构,而神经 络应用的实际执行必须有合适的软件编程系统配合,才能充分发挥神经 络加速器的硬件优势。在实际应用场景中,无论所采用的硬件平台是云端服务器、移动端设备,还是嵌入式设备,其中神经 络加速器的运行都离不开编程系统。编程系统的设计直接决定着前端开发的敏捷性,并对测试和调试过程中的编程友好性产生影响。此外,编程系统的可移植性也是实际应用中的另一个重要方面,决定了应用是否可以方便地部署和移植到目标平台上。用户希望模型在移植到新平台上时只需要尽可能少的调试,就可以保持初始神经 络模型的正确性和准确性。在理想情况下,移植后的程序仍然可以对加速器的硬件性能进行充分的利用。

编程系统的设计主要可以分为两个部分,分别是神经 络编程方法和神经 络模型编译及优化。用户在特定的加速器硬件上进行开发时,编程方法是编程界面的第一层级,用户直接使用结构化描述来进行神经 络模型设计。 络模型的编译过程则是将对神经 络模型不同层次的描述翻译成加速器可以执行的一系列机器语言。由于不同加速器可能使用不同的指令集架构,它们的编译方法也各不相同。对于特定的硬件架构,可以有针对性地进行编程工具的优化,以充分发挥硬件优势。

神经 络加速器编程方法

编程方法是神经 络模型设计过程中需要首先考虑的问题之一。当前神经 络算法仍然在快速发展,神经 络模型的规模和复杂程度也在不断增加。这些都对神经 络编程方法提出了更高的要求。当前主要有两种编程方法:一种是利用深度学习编程框架,另一种是使用编程语言直接进行编程。

深度学习编程框架目前学术界和工业界已有多个通用的深度学习编程框架,例如TensorFlow、PyTorch、Caffe、MXNet等。这些编程框架使得神经 络的表示更加简洁。部分编程框架是基于计算图表示,另一些则是基于层表示。通过使用注册和封装在编程框架中的算子,用户可以方便地描述神经 络模型的结构。

编程语言包括通用编程语言和领域专用语言。面向人工智能领域,传统通用编程语言难以同时满足高开发效率、高性能和高可移植性的需求,而智能编程语言则是同时满足上述三大需求的重要技术途径。作为连接编程框架和神经 络加速器的桥梁,智能编程语言既是实现编程框架算子的基础,也是神经 络加速器高效编程的核心用户入口。针对神经 络的结构特点,智能编程语言除了提供智能计算核心操作(算子)级别的高层操作语义,其抽象层次也在不断提高,向高层次和专用化的方向发展;与此同时,为了满足较高的实现性能,智能编程语言也为用户提供了足够丰富的硬件细节;而对于不同的神经 络加速器平台,用户还可以针对特定的硬件结构特点来设计专用编程语言,用于编译和优化。

神经 络加速器编译及优化

神经 络模型的编译及优化是神经 络加速器编程系统的核心,也是连接应用和底层硬件的桥梁。神经 络模型编译就是基于输入的神经 络模型描述,得到可在神经 络加速器上运行的指令的过程。在编译过程中,代码可以根据模型结构特征、访存特征和加速器架构进行优化,从而使得应用算法可以充分利用硬件资源,获得更高的运算速率和更低的功耗。

神经 络模型编译器的输入是对神经 络模型的描述,通常情况下,神经 络模型描述是采用计算图的形式。编译器首先将计算图转变成中间表示(IR),以方便优化和代码生成。编译器中间表示可以包含不同的层次,例如高级中间表示或低级中间表示等。编译器可对不同层次的中间表示进行优化,生成二进制硬件执行代码。研究人员提出了一种基于张量的中间表示方法DLIR,其内置的张量表示可以直接映射到神经 络加速器硬件上,从而产生更高效的硬件代码。DLIR还包含了编译器和运行时,编译器可以将输入的计算图用DLIR的架构进行描述,再进行优化和代码生成。谷歌提出了XLA编译器用于编译TensorFlow生成的计算图。XLA接收的输入是TensorFlow计算图,然后将其转化为中间表示HLO,在对HLO进行优化之后生成代码。它可以和不同种类的神经 络加速器后端相匹配,例如CPU、GPU和自定义的神经 络加速器等。TVM是一个端到端的编译器,它可以支持深度学习任务部署在不同的编程框架以及不同的神经 络加速器架构上。TVM使用RelayIR描述计算图,并提供了多种调度原语,如循环顺序交换、分块计算,等等。用户或编译器可以通过这些调度原语实现对不同操作的优化。TVM也可以生成不同后端的代码,实现对不同硬件架构的支持。

计算图的优化和代码生成是决定神经 络加速器性能是否得到充分发挥的关键环节之一。优化内容主要包括对计算图的化简、数据布局优化、数据转移优化以及与硬件架构相结合的运算并行性优化等。过去的编译优化主要是通过手动编写汇编指令实现的,这种方法虽然可以起到较好的效果,但需要用户付出巨大的时间成本。随着神经 络复杂性的增加,手动编写汇编代码的方法已经无法满足需求,因此编译器需要实现优化操作的自动化或半自动化。当前,几乎所有的神经 络编译器都内置了自动优化功能。部分编译器提供了通用优化方法,例如XLA提供了两种不同的优化,分别是目标相关优化和目标无关优化。目标无关优化主要基于计算图的结构信息进行优化,与硬件信息无关,方法包括代数化简、常数折叠、公共子表达式消元和层融合等;目标相关优化需要结合硬件信息,因此对于不同的硬件架构,优化方法也有所不同。TVM提供了不同层级的优化,优化过程可以划分为3个步骤:(1)计算图优化,TVM通过将多个算子整合到一起实现算子融合,并进行数据布局优化;(2)算子层面的优化和代码生成,包括张量化、时间及空间优化、嵌套并行、延迟隐藏等;(3)TVM通过硬件感知优化原语针对硬件架构进行优化,最终生成适用于神经 络后端的底层优化程序。

声明:本站部分文章及图片源自用户投稿,如本站任何资料有侵权请您尽早请联系jinwei@zod.com.cn进行处理,非常感谢!

上一篇 2021年5月5日
下一篇 2021年5月5日

相关推荐