首页> 中国专利> 基于统一后端引擎的深度学习框架与硬件设备适配方法

基于统一后端引擎的深度学习框架与硬件设备适配方法

摘要

本发明公开了一种基于统一后端引擎的深度学习框架与硬件设备适配方法,包括如下步骤:S1:深度学习框架添加统一后端引擎;S2:硬件设备添加统一后端引擎;S3:转换计算图,将深度学习框架编译生成的计算图转换为统一后端引擎的中间表示;S4:编译中间表示,统一后端引擎在硬件设备上编译中间表示生成可执行对象;S5:运行可执行对象,深度学习框架在硬件设备上运行可执行对象;S6:统一后端引擎的内存管理。本发明打通了深度学习框架与硬件设备,将深度学习框架源码与芯片底层软件全面对接,尽可能最大限度地释放芯片的硬件能力,为端侧AI提供强劲算力。

著录项

  • 公开/公告号CN113835695A

    专利类型发明专利

  • 公开/公告日2021-12-24

    原文格式PDF

  • 申请/专利权人 之江实验室;

    申请/专利号CN202111408005.4

  • 发明设计人 王宏升;杨非;华炜;鲍虎军;

    申请日2021-11-25

  • 分类号G06F8/34(20180101);G06F8/30(20180101);G06N3/08(20060101);

  • 代理机构11435 北京志霖恒远知识产权代理事务所(普通合伙);

  • 代理人奚丽萍

  • 地址 310023 浙江省杭州市余杭区文一西路1818号

  • 入库时间 2023-06-19 13:49:36

说明书

技术领域

本发明涉及人工智能和国产化AI芯片技术领域,特别涉及一种基于统一后端引擎的深度学习框架与硬件设备适配方法。

背景技术

我国国产化AI芯片相对于国际主流品牌仍有一定的差距。主要是国产芯片计算性能比较薄弱,适配性较差。随着国家对集成电路领域的大力支持,国内华为、百度、旷视科技等都已经开源了国产AI框架,寒武纪、天数智芯、燧原科技等都自研了多款国产AI芯片。但针对国产的适配,仍处于初步阶段,不利于国产自主可控设备的推广建设。主流深度学习框架搭建国产AI芯片,提升国产整机计算能力,面向不同智能化应用场景提供模型算法,推动国产基础平台的应用推广和发展,成为本领域亟待解决的重大课题。而实现上述目的,本领域面临一个现实性的技术难题:如何解决商用AI卡与国产深度学习框架不兼容问题。

发明内容

本发明的目的在于提供一种基于统一后端引擎的深度学习框架与硬件设备适配方法,以克服现有技术中的不足。

为实现上述目的,本发明提供如下技术方案:

本发明公开了一种基于统一后端引擎的深度学习框架与硬件设备适配方法,包括如下步骤:

S1:深度学习框架添加统一后端引擎;

S2:硬件设备添加统一后端引擎;

S3:转换计算图,将深度学习框架编译生成的计算图转换为统一后端引擎的中间表示;

S4:编译中间表示,统一后端引擎在硬件设备上编译中间表示生成可执行对象;

S5:运行可执行对象,深度学习框架在硬件设备上运行可执行对象;

S6:统一后端引擎的内存管理。

所述步骤S1包括如下子步骤:

S11:深度学习框架注册硬件设备,向深度学习框架源码里添加一个硬件设备对应的设备字段,为统一后端引擎针对的硬件创建一个设备类型的枚举类,在设备类型中增加硬件对应的设备字段;

S12:深度学习框架注册统一后端引擎,向深度学习框架添加一个统一后端引擎字段;

S13:深度学习框架添加统一后端引擎的编译器;

S14:深度学习框架注册统一后端引擎的编译器,将新添加的编译器注册到统一后端引擎中;

S15:深度学习框架添加统一后端引擎的计算图可执行对象,为统一后端引擎增加一个对应的计算图可执行对象,并实现运行接口。

所述步骤S2包括如下子步骤:

S21:硬件设备添加统一后端引擎的编译器,硬件设备添加统一后端引擎,在硬件设备对应的基础软件库中添加统一后端引擎的编译器;

S22:硬件设备注册统一后端引擎的编译器;

S23:硬件设备添加统一后端引擎的可执行对象。

所述步骤S3包括如下子步骤:

S31:创建统一后端引擎的图加载器,深度学习框架添加一个统一后端引擎的图加载器,所述图加载器继承自框架的计算图算子,并实现前向传播接口,在图计算进入运行期阶段,框架利用运行器开始运行计算图中每个算子的核函数时,选择统一后端引擎编译和运行的路线;

S32:注册统一后端引擎的图加载器,利用所述图加载器接收框架编译生成的计算图,具有如下子步骤:

S321:创建一个全局静态字典,其中key 值是一个枚举类型的元素,枚举出所有可选的图加载器变量, value 值是具体的图加载器的实现;

S322:向枚举类型的 key 值列表里添加统一后端引擎的图加载器枚举成员;

S323:使用统一后端引擎,框架前端将一个统一后端引擎图加载器的 key 值传到注册表中,框架自身的图执行器选择利用对应的统一后端引擎的图加载器 value 值来启动图计算过程;

S33:将计算图转换为统一后端引擎的中间表示,具有如下子步骤:

S331:图计算进入运行期时,框架的图执行器通过统一后端引擎的图加载器将框架计算图加载到后端引擎中,并执行前向传播接口;

S332:在前向传播接口中创建一个计算图转换接口,所述计算图转换接口负责将框架计算图转换为统一后端引擎的中间表示;

S333:所述计算图转换接口首先按照框架计算图的拓扑顺序遍历所有节点,其次,为每个节点中的算子创建其对应的统一后端引擎的中间表示,最后,执行每个算子核函数的计算图转换,生成统一后端引擎的中间表示。

所述步骤S4包括如下子步骤:

S41:框架计算图转换为统一后端引擎的中间表示,框架端统一后端引擎的编译器的编译接口中添加编译中间表示函数,所述中间表示函数输入中间表示;

S42:框架端统一后端引擎的编译器通过中间表示函数接口将中间表示传入硬件设备端的统一后端引擎的编译器的运行后端的接口中;

S43:统一后端引擎的编译器在运行后端的接口中将中间表示编译生成可执行对象。

所述步骤S5中深度学习框架在硬件设备上运行可执行对象的过程如下:硬件设备端统一后端引擎的执行器接收统一后端引擎的编译器生成的可执行对象,运行该可执行对象,输出图计算的结果。

所述步骤S6中分配内存的具体步骤如下:

S61:在框架端创建一个为统一后端引擎分配内存的内存分配器,并新增一个填充内存的接口,所述内存分配器负责在框架端构造好后端引擎需要的内存,并传给统一后端引擎;

S62:内存分配器在框架端的内存是按照后端引擎需要的内存顺序进行申请,当硬件设备全部运行完之后,内存分配器的填充内存的接口把统一后端引擎这部分内存按照原样的内存顺序拷贝到框架端,使得框架为统一后端引擎申请的内存顺序与统一后端引擎内存顺序实现一一映射。

为了使深度学习框架生成的计算图能够在统一后端引擎通过自身的设备字段对象注册的指定硬件设备上编译运行,统一后端引擎必须通过深度学习框架获取用户在框架前端指定的硬件,其方法为:构建一个框架前端用户指定的硬件类型对象与统一后端引擎的设备ID的字段对象一一映射的字典。

所述步骤S13中统一后端引擎的编译器采用了LLVM传统编译器的路线,统一后端引擎的编译器继承自 LLVM 编译器类,并实现对应的编译接口,所述统一后端引擎的编译器的输入是框架自身的计算图,按拓扑顺序遍历子图中的每个节点,依次将计算图节点编译成具体的可执行对象,输出为统一后端引擎的可执行对象。

为方便处理不同类型的算子,统一后端引擎的编译器的编译过程构造了统一后端引擎的算子上下文信息类型和统一后端引擎的算子的核函数类型两个数据结构类型,具体包括如下两个过程:

编译单个算子:统一后端引擎的算子的核函数类型是继承于框架自身的算子的核函数类型,根据算子类型完成单个算子的编译过程,统一后端引擎的算子的核函数编译后输出函数代码、中间缓存,以及函数代码输入和输出对应的参数,将统一后端引擎的算子的核函数注册到统一后端引擎对应的算子核函数工厂中,采用工厂注册模式,可使后端引擎划分子图时可以判断该引擎是否支持某个类型的算子;

存储元信息和编译结果:统一后端引擎的算子上下文信息类型临时存储编译需要的元信息和编译结果,为统一后端引擎的算子的核函数提供必要的接口,统一后端引擎的算子上下文信息类型接受两个输入,当前计算图节点和当前所有已经创建过的参数,将经过统一后端引擎的算子的核函数编译后输出的函数代码、中间缓存,以及函数代码输入和输出对应的参数填充到该上下文信息类型的对应成员变量中。

本发明的有益效果:本发明基于统一后端引擎的深度学习框架与硬件设备适配方法,考虑到采用统一后端引擎对接深度学习框架源码与硬件设备的底层软件,将框架计算图转换为统一后端引擎的中间表示,该中间表示可以直接被统一后端引擎编译成目标平台的可执行代码,可以直接执行,不需要框架自身运行时代码的参与,本发明打通了深度学习框架与硬件设备,将深度学习框架源码与芯片底层软件全面对接,尽可能地最大限度释放芯片的硬件能力,为端侧AI提供强劲的算力。

本发明的特征及优点将通过实施例结合附图进行详细说明。

附图说明

图1为基于统一后端引擎的深度学习框架与硬件设备适配方法的架构图;

图2为深度学习框架/硬件设备添加统一后端引擎流程图;

图3为创建统一后端引擎的图加载器的过程示意图;

图4为单算子兼容性测试结果。

具体实施方式

为使本发明的目的、技术方案和优点更加清楚明了,下面通过附图及实施例,对本发明进行进一步详细说明。但是应该理解,此处所描述的具体实施例仅仅用以解释本发明,并不用于限制本发明的范围。此外,在以下说明中,省略了对公知结构和技术的描述,以避免不必要地混淆本发明的概念。

实施例一

如图1所示,基于统一后端引擎的深度学习框架与硬件设备适配方法的架构图。

本发明提供了一种基于统一后端引擎的深度学习框架与硬件设备适配方法,整个过程分为六个步骤,具体包含如下步骤:

第一步:深度学习框架添加统一后端引擎

深度学习框架增加一个后端引擎需要考虑该后端引擎所需的最小执行环境,一个最简单的执行环境包括输入输出、中间结果以及执行具体计算逻辑的硬件代码。深度学习框架添加统一后端引擎流程如图2所示。深度学习框架添加统一后端引擎的具体过程如下:

步骤1:深度学习框架注册硬件设备。向深度学习框架源码里添加一个硬件设备对应的设备字段。为统一后端引擎针对的硬件创建一个设备类型的枚举类,在设备类型中增加硬件对应的设备字段,如GPU_CUDA、DTU_TOPSDNN等。考虑到深度学习框架生成的计算图需要统一后端引擎在指定硬件设备上编译运行,而且统一后端引擎是通过自身的设备ID字段对象注册指定硬件,统一后端引擎通过深度学习框架获取用户在框架前端指定的硬件的方法如下:构建一个框架前端用户指定的设备类型对象和统一后端引擎的设备ID字段对象一一映射的字典。这样统一后端引擎启动时可以根据从框架前端的计算图中获取到的设备类型对象的类型,选择设备ID字段对象的类型,如当设备类型是 XrtDevice::DTU_TOPSDNN时,设备ID字段选择 xla::dtu::dtuPlatformID。

步骤2:深度学习框架注册统一后端引擎。向深度学习框架添加一个统一后端引擎字段,如XLA、TENSORRT、TVM等。

步骤3: 深度学习框架添加统一后端引擎的编译器。考虑到统一后端引擎运行一个可执行子图时,需要一个将该子图编译成后端引擎对应的可执行对象的编译器。因此,添加一个统一后端引擎对应的编译器。为了既满足编译产物的执行性能,又满足对算法的通用性、跨平台有高度的兼容性,统一后端引擎的编译器采用了LLVM传统编译器的路线。统一后端引擎的编译器继承自 LLVM 编译器类,并实现对应的编译接口。该编译器的输入是框架自身的计算图,按拓扑顺序遍历子图中的每个节点,依次将计算图节点编译成具体的可执行对象,输出为统一后端引擎的可执行对象。为方便处理不同类型的算子,统一后端引擎的编译器的编译过程构造了统一后端引擎的算子上下文信息类型和统一后端引擎的算子的核函数类型两个数据结构类型,具体包括如下两个过程:

编译单个算子。统一后端引擎的算子的核函数类型是继承于框架自身的算子的核函数类型,根据算子类型完成单个算子的编译过程。统一后端引擎的算子的核函数编译后输出函数代码、中间缓存,以及函数代码输入和输出对应的参数。最后,将算子的核函数类型注册到统一后端引擎对应的算子的核函数工厂中。为了处理不同类型的算子,采用工厂注册模式,并且这种模式在统一后端引擎划分子图时可以用来判断该引擎是否支持某个类型的算子。

存储元信息和编译结果。统一后端引擎的算子上下文信息类型临时存储编译需要的元信息和编译结果,为算子的核函数类型提供必要的接口。算子上下文信息类型接受两个输入,当前计算图节点和当前所有已经创建过的参数。将经过算子的核函数类型编译后输出的函数代码、中间缓存,以及函数代码输入和输出对应的参数填充到算子上下文信息类型的对应成员变量中。

步骤4:深度学习框架注册统一后端引擎的编译器。将新添加的编译器注册到统一后端引擎中。

步骤5:深度学习框架添加统一后端引擎的计算图可执行对象。为统一后端引擎增加一个对应的计算图可执行对象,并实现运行接口。为了尽可能简单,统一后端引擎的计算图可执行对象只包含输出、中间结果和编排好的函数调用列表,以及每个函数的输入输出参数对应的缓存。

第二步:硬件设备添加统一后端引擎

首先在硬件设备对应的基础软件库中新增一个统一后端模块,新添加的统一后端引擎编译器的类全部放在该后端模块中。该后端模块主要包含两个功能:首先为硬件设备添加一个统一后端的编译器;其次为硬件设备添加一个统一后端的执行器。

步骤1: 硬件设备添加统一后端引擎的编译器。硬件设备添加统一后端引擎,首先在硬件设备对应的基础软件库中添加统一后端引擎的编译器。在统一后端模块中,新增一个统一后端的编译器类,继承自 LLVM 编译器类,并实现运行统一后端接口。运行统一后端接口的输入是统一后端引擎的中间表示,输出是后端引擎的可执行对象。

步骤2: 硬件设备注册统一后端引擎的编译器。步骤1中硬件设备添加统一后端引擎编译器的运行后端接口都是通过继承 LLVM 编译器类并且重写 LLVM 编译器的运行后端接口的方式实现的,其中统一后端引擎在执行运行后端接口时是选择指定的硬件设备对应的统一后端编译器的实现:首先,统一后端引擎构建一个设备ID字段对象,然后新增一个指定设备对应的设备ID字段对象。同时,将步骤1新增的统一后端引擎的编译器类通过统一后端引擎的设备ID字段注册到统一后端引擎中。以上步骤就完成统一后端引擎通过设备ID字段选择指定硬件设备的过程。当完成将硬件设备注册到统一后端引擎的编译器中的过程,在编译期阶段统一后端引擎被启动以后,后端引擎就会选择到指定硬件设备对应的后端编译器,具体地,选择执行指定硬件设备对应的统一后端编译器的运行后端接口的实现上。

步骤3: 硬件设备添加统一后端引擎的可执行对象。上述步骤1编译器生成的可执行对象交给统一后端引擎运行,所以需要添加运行可执行对象的统一后端引擎的图可执行器。在统一后端模块中,新增一个统一后端的图可执行对象的执行器类,该类继承自统一后端引擎的图可执行类,并实现运行可执行对象的接口。当统一后端引擎在运行可执行对象时,实际上执行的是对应硬件设备添加的统一后端引擎的图可执行器的运行可执行对象的接口的实现。

第三步:转换计算图,将深度学习框架编译生成的计算图转换为统一后端引擎的中间表示

深度学习框架需要通过统一后端引擎在指定硬件设备上编译和执行计算图,所以首先创建统一后端引擎的图加载器,然后利用该图加载器接收框架编译生成的计算图,并将其转换为统一后端引擎的中间表示。最后由统一后端引擎的编译器编译中间表示的计算图,生成图可执行对象。

步骤1:创建统一后端引擎的图加载器。深度学习框架添加一个统一后端引擎的图加载器,该图加载器继承自框架的计算图算子的核函数,并实现前向传播接口。在图计算进入运行期阶段,框架利用运行器开始运行计算图中每个算子核函数时,选择统一后端引擎编译和运行的路线。具体地,原先每个算子是利用自身的启动器启动图计算的,当使用统一后端引擎的情况下,每个算子是利用新添加的统一后端引擎的图加载器启动图计算,并将计算图加载到统一后端引擎的编译器中。创建统一后端引擎的图加载器的过程如图3所示。

步骤2:注册统一后端引擎的图加载器。步骤1已经创建了统一后端引擎的图加载器,其中该图加载器加载框架编译生成的计算图的方法如下:实际上是向框架接收到的计算图中每个算子的核函数的元信息里添加一个统一后端引擎的图加载器类型。首先,创建一个全局静态字典,key 值是一个枚举类型的元素,列举出所有可选的图加载器变量,value 值是具体的图加载器的实现,如统一后端引擎的图加载器。然后,向枚举类型的 key值列表里添加统一后端引擎的图加载器枚举成员。当用户使用统一后端引擎时,框架前端就会将一个统一后端引擎图加载器的 key 值传到注册表中,因此框架自身的图执行器就会选择利用对应的统一后端引擎的图加载器 value 值来启动图计算过程。

步骤3:将计算图转换为统一后端引擎的中间表示。图计算进入运行期时,框架的图执行器通过统一后端引擎的图加载器将框架计算图加载到后端引擎中,并执行前向传播接口。在前向传播接口中创建一个计算图转换接口,该计算图转换接口负责将框架计算图转换为统一后端引擎的中间表示。计算图转换接口首先按照框架计算图的拓扑顺序遍历所有节点;其次,为每个节点中的算子创建其对应的统一后端引擎的中间表示;最后,执行每个算子核函数的计算图转换,生成统一后端引擎的中间表示。

第四步:编译中间表示,统一后端引擎在硬件设备上编译中间表示生成可执行对象

统一后端引擎在硬件设备上编译中间表示生成可执行对象的过程如下:首先,框架计算图转换为统一后端引擎的中间表示,框架端统一后端引擎的编译器的编译接口中添加编译中间表示的编译接口,该编译接口输入中间表示;然后,框架端统一后端引擎的编译器通过编译接口接口将中间表示传入硬件设备端的统一后端模块的统一后端引擎编译器的运行后端接口中;最后,统一后端引擎的编译器在运行后端接口中将中间表示编译生成可执行对象。

第五步:运行可执行对象,深度学习框架在硬件设备上运行可执行对象

深度学习框架在硬件设备上运行可执行对象的过程如下:硬件设备端统一后端引擎的执行器执行可执行对象,该执行器接收统一后端引擎的编译器生成的可执行对象。具体地,执行器的运行可执行对象接口运行可执行对象,输出图计算的结果。

第六步:统一后端引擎的内存管理

首先,在框架端创建一个为统一后端引擎分配内存的内存分配器类,并新增一个填充内存的接口。该内存分配器负责在框架端构造好后端引擎需要的内存,并传给统一后端引擎。由于硬件设备端的统一后端引擎编译器生成的一个可执行对象的内存包含两部分:一部分是可执行对象输出的内存;另一部分是中间计算用到的临时内存,所以内存分配器为统一后端引擎分配内存是有顺序的,该内存分配器在框架端的内存是按照后端引擎需要的内存顺序进行申请的;其次,框架的内存分配器按照后端引擎需要的内存顺序申请内存的方法如下:当硬件设备全部运行完之后,内存分配器的填充内存的接口把统一后端引擎这部分内存按照原样的内存顺序拷贝到框架端。所以框架为统一后端引擎申请的内存顺序与统一后端引擎内存顺序实现了一一映射。

实施例二

为了进一步说明本发明的技术方案和优点,现利用Tensorflow 的加速线性代数深度学习编译器(Accelerated Linear Algebra,简称 XLA)作为统一后端引擎,下面将以主流深度学习框架基于XLA对接燧原 DTU 1.0 芯片为例对本发明的技术方案做进一步的详细描述。

主流深度学习框架与DTU芯片快速适配方法,包括如下步骤:

步骤一、深度学习框架添加统一后端引擎;

步骤二、硬件设备添加统一后端引擎;

步骤三、转换计算图,将深度学习框架编译生成的计算图转换为统一后端引擎XLA的中间表示;

步骤四、编译中间表示,统一后端引擎XLA在DTU芯片上编译中间表示生成可执行对象;

步骤五、运行可执行对象,深度学习框架在DTU芯片上运行可执行对象;

步骤六、统一后端引擎XLA的内存管理。

所述步骤一中深度学习框架添加统一后端引擎XLA过程如下:考虑到统一后端引擎XLA在DTU芯片上编译中间表示生成可执行对象,因此深度学习框架添加一个新的后端引擎XLA,只需要添加一个XLA后端可执行对象和将框架子图编译成对应XLA后端可执行对象的编译器类。深度学习框架添加统一后端引擎的具体过程如下:深度学习框架增加一个XLA后端引擎需要考虑该后端引擎所需的最小执行环境,一个最简单的执行环境包括输入输出、中间结果以及执行具体计算逻辑的硬件代码。

步骤1:深度学习框架注册DTU芯片。向深度学习框架源码里添加一个DTU芯片对应的硬件设备字段。为统一后端引擎XLA针对的硬件创建一个可支持XLA后端的硬件设备的枚举类,在该枚举类中增加硬件对应的设备字段DTU_TOPSDNN。考虑到深度学习框架生成的计算图需要统一后端引擎在DTU芯片上编译运行,而且统一后端引擎XLA是通过自身的设备ID字段对象注册指定硬件,其中统一后端引擎XLA通过深度学习框架获取用户在框架前端指定的DTU芯片硬件的方法如下:构建一个框架前端用户指定的硬件类型对象与统一后端引擎的设备ID字段对象一一映射的字典。这样统一后端引擎启动时可以根据从框架前端的计算图中获取到的可支持XLA后端的硬件设备对象的类型,选择设备ID字段对象的类型,如当硬件设备对象的类型是 xlaDevice::DTU_TOPSDNN时,设备ID字段对象的类型选择 xla::dtu::dtuPlatformID。

步骤2:深度学习框架注册统一后端引擎。向深度学习框架添加一个统一后端引擎字段XLA。

步骤3:深度学习框架添加统一后端引擎的编译器。考虑到统一后端引擎运行一个XLA后端可执行对象子图时,需要一个将该子图编译成后端引擎对应的可执行对象的编译器。因此,添加一个XLA后端可执行对象对应的编译器。为了既满足编译产物的执行性能,又满足对算法的通用性、跨平台有高度的兼容性,统一后端引擎的编译器采用了LLVM传统编译器的路线,该编译器继承自 LLVM 编译器类,并实现对应的编译接口。该编译器的输入是框架自身编译器编译生成的计算图,按拓扑顺序遍历子图中的每个节点,依次将计算图节点编译成具体的可执行对象,输出为统一后端引擎的可执行对象。为方便处理不同类型的算子,统一后端引擎的编译器的编译过程构造了统一后端引擎的算子上下文信息类型和统一后端引擎的算子的核函数类型两个数据结构类型,具体包括如下两个过程:

编译单个算子。统一后端引擎XLA的算子的核函数类型是继承于框架自身的算子的核函数类型。根据算子类型完成单个算子的编译过程,统一后端引擎XLA的算子的核函数编译后输出函数代码、中间缓存,以及函数代码输入和输出对应的参数,将算子的核函数类型注册到统一后端引擎XLA对应的算子的核函数工厂中,采用工厂注册模式,可使后端引擎XLA划分子图时可以判断该引擎是否支持某个类型的算子;

存储元信息和编译结果。统一后端引擎XLA的算子上下文信息类型 临时存储编译需要的元信息和编译结果,为算子的核函数类型提供必要的接口,算子上下文信息类型接受两个输入,当前计算图节点和当前所有已经创建过的参数,将经过算子的核函数类型编译后输出的函数代码、中间缓存,以及函数代码输入和输出对应的参数填充到算子上下文信息类型的对应成员变量中。

步骤4:深度学习框架注册统一后端引擎的编译器。将新添加的统一后端引擎XLA的编译器注册到统一后端引擎XLA中。

步骤5:深度学习框架添加统一后端引擎的计算图可执行对象。为统一后端引擎XLA增加一个对应的计算图可执行对象,并实现运行可执行对象的接口。为了尽可能简单,该运行接口只包含输出、中间结果和编排好的函数调用列表,以及每个函数的输入输出参数对应的缓存。

所述步骤二中硬件设备添加统一后端引擎的过程如下:硬件设备DTU芯片添加统一后端引擎的过程主要是为了继承统一后端引擎中与编译器关联的类,首先在硬件设备对应的基础软件库中新增一个统一后端模块,新添加的统一后端引擎编译器的类全部放在该统一后端模块中。该后端模块主要包含两个功能:首先为硬件设备添加一个统一后端的编译器;其次为硬件设备添加一个统一后端的执行器。

步骤1:硬件设备添加统一后端引擎的编译器。硬件设备添加统一后端引擎,首先在硬件设备对应的基础软件库中添加统一后端引擎的编译器。在统一后端模块中,新增一个 DTU的编译器类,继承自 LLVM 编译器,并实现运行统一后端引擎的运行统一后端接口。运行统一后端接口的输入是统一后端引擎的中间表示,输出是后端引擎的可执行对象。

步骤2:硬件设备注册统一后端引擎的编译器。步骤1中硬件设备添加统一后端引擎编译器的运行统一后端接口都是通过继承 LLVM 编译器并且重写 LLVM 编译器的运行统一后端接口的方式实现的,其中统一后端引擎在执行运行统一后端接口时选择到指定的硬件设备对应的 DTU 编译器的实现上的方法如下:首先,统一后端引擎构建一个设备ID字段对象,然后新增一个DTU设备ID字段对象类型。同时,将步骤1新增的统一后端引擎的编译器类通过DTU设备ID字段对象注册到统一后端引擎中。以上步骤就完成统一后端引擎通过设备ID对象选择指定硬件设备的过程。当完成将硬件设备注册到统一后端引擎的编译器中的过程,在编译期阶段统一后端引擎被启动以后,后端引擎就会选择到指定硬件设备DTU对应的编译器,具体地,选择执行指定硬件设备DTU对应的 编译器的运行统一后端的实现上。

步骤3:硬件设备添加统一后端引擎的可执行对象。上述步骤1编译器生成的可执行对象交给统一后端引擎运行,所以需要添加运行可执行对象的统一后端引擎的图可执行器类。在统一后端模块中,新增一个统一后端的图可执行对象的执行器类,该类继承自统一后端引擎的图可执行类,并实现运行可执行对象的运行可执行对象的接口接口。当统一后端引擎在运行可执行对象时,实际上执行的是对应硬件设备添加的统一后端引擎的图可执行器的运行可执行对象的接口的实现。

所述步骤三中转换计算图,将深度学习框架编译生成的计算图转换为统一后端引擎的中间表示的过程如下:在不使用统一后端引擎的情况下,深度学习框架中计算图的执行是由框架自身运行时的代码驱动的;考虑到采用统一后端引擎对接深度学习框架源码与硬件设备的底层软件,将框架计算图转换为统一后端引擎的中间表示,该中间表示可以直接被统一后端引擎编译成目标平台的可执行代码,可以直接执行,不需要框架自身运行时代码的参与。

每个深度学习框架自身都有一个执行计算图中每个算子的 kernel 的运行器,同时,计算图中算子的核函数类型都有一个启动自身执行计算的启动器。在图计算进入运行期时,该图运行器负责运行框架计算图中每个算子的 kernel,其中,每个算子利用自身的启动器启动图计算。考虑到深度学习框架需要通过统一后端引擎在指定硬件设备上编译和执行计算图,所以首先创建统一后端引擎的图加载器,然后利用该图加载器接收框架编译生成的计算图,并将其转换为统一后端引擎的中间表示。最后由统一后端引擎的编译器编译中间表示的计算图,生成图可执行对象。

步骤1:创建统一后端引擎的图加载器。深度学习框架添加一个统一后端引擎的图加载器,该图加载器继承自框架的计算图算子的核函数类,并实现前向传播接口。在图计算进入运行期阶段,框架利用运行器开始运行计算图中每个算子 kernel 时,选择统一后端引擎编译和运行的路线。具体地,原先每个算子是利用自身的启动器启动图计算的,当使用统一后端引擎的情况下,每个算子是利用新添加的统一后端引擎的图加载器启动图计算,并将计算图加载到统一后端引擎的编译器中。

创建统一后端引擎的图加载器的过程如图3所示。

步骤2:注册统一后端引擎的图加载器。步骤1已经创建了统一后端引擎的图加载器,其中该图加载器加载框架编译生成的计算图的方法如下:实际上是向框架接收到的计算图中每个算子的核函数的元信息里添加一个统一后端引擎的图加载器类型。首先,创建一个全局静态字典,key 值是一个枚举类型的元素,列举出所有可选的图加载器变量,value 值是具体的图加载器的实现,如统一后端引擎的图加载器。然后,向枚举类型的 key值列表里添加统一后端引擎的图加载器枚举成员。当用户使用统一后端引擎时,框架前端就会将一个统一后端引擎图加载器的 key 值传到注册表中,因此框架自身的图执行器就会选择利用对应的统一后端引擎的图加载器 value 值来启动图计算过程。

步骤3:将计算图转换为统一后端引擎的中间表示。图计算进入运行期时,框架的图执行器通过统一后端引擎的图加载器将框架计算图加载到后端引擎中,并执行前向传播接口。在前向传播接口中创建一个计算图转换接口,该计算图转换接口负责将框架计算图转换为统一后端引擎的中间表示。计算图转换接口首先按照框架计算图的拓扑顺序遍历所有节点;其次,为每个节点中的算子创建其对应的统一后端引擎的中间表示;最后,执行每个算子的核函数的计算图转换,生成统一后端引擎的中间表示。

所述步骤四中编译中间表示,统一后端引擎在硬件设备上编译中间表示生成可执行对象的过程如下:首先,框架计算图转换为统一后端引擎的中间表示,框架端统一后端引擎的编译器的编译接口中添加编译中间表示的编译接口,该 编译接口输入中间表示;然后,框架端统一后端引擎的编译器通过该编译接口将中间表示传入硬件设备端统一后端模块的统一后端引擎的编译器的运行后端的接口中;最后,统一后端引擎的编译器在运行后端接口中将中间表示编译生成可执行对象。

所述步骤五中运行可执行对象,深度学习框架在硬件设备上运行可执行对象的过程如下:硬件设备端统一后端引擎的运行可执行对象的执行器接收统一后端引擎的编译器生成的可执行对象。具体地,该执行器的运行可执行对象的接口运行可执行对象,输出图计算的结果。

所述步骤六中统一后端引擎的内存管理的过程如下:统一后端引擎在运行时需要分配内存。其分配内存的方法如下:首先,在框架端创建一个为统一后端引擎分配内存的内存分配器类,并新增一个填充内存的接口。该内存分配器负责在框架端构造好后端引擎需要的内存,并传给统一后端引擎。由于硬件设备端的统一后端引擎编译器生成的一个可执行对象的内存包含两部分:一部分是可执行对象输出的内存;另一部分是中间计算用到的临时内存,所以内存分配器为统一后端引擎分配内存是有顺序的,该内存分配器在框架端的内存是按照后端引擎需要的内存顺序进行申请的;其次,框架的内存分配器按照后端引擎需要的内存顺序申请内存的方法如下:当硬件设备全部运行完之后,内存分配器的填充内存的接口把统一后端引擎这部分内存按照原样的内存顺序拷贝到框架端。所以框架为统一后端引擎申请的内存顺序与统一后端引擎内存顺序实现了一一映射。

经过上述步骤,完成了主流深度学习框架基于XLA对接燧原 DTU 1.0 芯片的全过程。下面利用已对接好的深度学习框架在燧原 DTU 1.0 芯片上分别进行单算子测试兼容性测试。

利用已对接好的深度学习框架在燧原 DTU 1.0 芯片上分别运行不同批次batch_size 大小的卷积算子的正反向,选择主流AI 硬件设备GPU 作为对比。单算子测试输入张量的形状是 224 x 224,通道数为3。测试结果如图4所示。

测试结果表明,对比主流AI 硬件设备GPU,DTU 的平均误差范围在10e-3范围内,且运行速度略比GPU快。所以基于XLA的技术路线对接的深度学习框架与燧原 DTU 1.0 芯片的兼容性良好。

以上所述仅为本发明的较佳实施例而已,并不用以限制本发明,凡在本发明的精神和原则之内所作的任何修改、等同替换或改进等,均应包含在本发明的保护范围之内。

去获取专利,查看全文>

相似文献

  • 专利
  • 中文文献
  • 外文文献
获取专利

客服邮箱:kefu@zhangqiaokeyan.com

京公网安备:11010802029741号 ICP备案号:京ICP备15016152号-6 六维联合信息科技 (北京) 有限公司©版权所有
  • 客服微信

  • 服务号