一种用于神经网络计算的动态图执行方法及装置与流程

文档序号:29957519发布日期:2022-05-11 08:19阅读:169来源:国知局
一种用于神经网络计算的动态图执行方法及装置与流程

1.本发明涉及基于特定计算模型的计算机系统领域,特别涉及一种用于神经网络计算的动态图执行方法及装置。


背景技术:

2.随着人工智能产业化应用的快速发展,研究人员和工程应用者在开发算法模型过程中,用于深度神经网络的动态图计算方法目前仍然是深度学习框架研究人员探索的热点问题。现有图计算技术多数基于一整张静态图执行运行时的计算任务,所以必须将算法模型完整构建完毕才可以进行调试和调优。这样的不足之处是,对于研究人员构建模型的过程中,无法满足即时验证模型的局部子图的需求,也无法满足即时调整模型结构的需求,为了解决对神经网络计算的动态图进行即时调试的难点问题,本发明公开了一种用于神经网络计算的动态图执行方法及装置,提供了一种深度学习训练系统中用于神经网络模型计算的动态图执行方法及装置。


技术实现要素:

3.本发明的目的在于提供一种用于神经网络计算的动态图执行方法及装置,以克服现有技术中的不足。
4.为实现上述目的,本发明提供如下技术方案:本发明公开了一种用于神经网络计算的动态图执行方法,包括如下步骤:s1:构造和分发算子及张量;s2:算子解释器推导算子执行过程;s3:算子解释器构建运行时虚拟机的指令,子步骤如下:s31:构建用于读取和修改张量数据指针的值的指令;s32:构建运行算子的指令;s33:构建释放生命周期已经结束的张量内存的指令;s34:构建指令之间的依赖关系;s4:算子解释器将指令发送到运行时虚拟机;s5:虚拟机调度指令:虚拟机执行当前指令的时候会为输出张量申请显存,调用算子在当前设备上的核函数进行计算并将计算结果写到输出张量,程序在运行期间,虚拟机在调度器线程中不断的轮询,如果有新的可以执行的指令,则执行,否则就继续轮询,其具体过程如下:s51:初始化准备列表,判断当前指令是否可以被下配,如果可以,则把当前指令添加到准备列表中;s52:采用临时列表接收准备列表,遍历临时列表,取出每一条指令;s53:虚拟机下发指令;s6:虚拟机释放已经执行完的指令。
5.作为优选的,所述步骤s1的具体子步骤如下:s11:创建一个在指定硬件设备上的输入张量;s12:构建一个算子的元信息,包括算子的名字,输入输出张量的名字和设备信息;s13:将算子的元信息和输入张量分发到算子解释器。
6.作为优选的,所述步骤s2的具体子步骤如下:s21:算子解释器接收分发的算子对象、输入输出张量和一个上下文对象,遍历输入张量的列表,输入张量的数据指针列表添加当前输入张量的数据指针;s22:推导算子的元信息,所述元信息包括设备信息、输出张量的类型和形状,具体子步骤如下:s221:声明一个张量数据指针对象以及存储输出张量元信息的对象;s222:遍历输出张量列表,申请一个张量类型的指针并初始化为张量对象,并将步骤s221中的存储输出张量元信息的对象在对应位置的值更新为张量对象的元信息;s223:推导算子的设备信息,形状和类型;s23:构造执行算子的核函数:根据算子对象和推导后的设备信息构造一个执行算子核函数。
7.作为优选的,所述步骤s223的具体子步骤如下:第一步:推导算子的设备信息:调用注册算子时定义的设备推导函数获取所推导的设备信息;第二步:推导算子的形状和类型信息:调用注册算子时定义的形状推导和类型推导函数推导当前算子的形状和类型;第三步:遍历输出张量的数据指针,并基于已经推导出的输出张量的元信息更新输出张量的数据指针。
8.作为优选的,所述步骤s3为将深度学习操作系统的运行时抽象为虚拟机,所述虚拟机执行的最小单位就是指令,每一种指令绑定两个属性:(1)分布式描述属性:表示当前执行的执行设备类型;(2)设备流的类型:表示当前指令的执行硬件设备类型,设备流是虚拟机里面对硬件设备的抽象,每一种设备流对应一种硬件设备。
9.作为优选的,所述步骤s34的具体子步骤如下:s341:定义指令的操作数类型,操作数类型包括常量类型、编译期的变量类型和运行时的变量类型,常量类型 对应输入,表示读取数据操作,编译期的变量类型和运行时的变量类型对应输出,表示写入数据操作;s342:消费可读的数据指针对象:遍历当前算子核函数中 常量类型操作数,取出当前操作数在输入张量元组中对应的数据指针对象,当前算子核函数利用上述取得的数据指针对象的值执行计算任务;s343:消费可写的数据指针对象,具体过程如下:(1)遍历当前算子核函数中编译期的变量类型操作数,取出当前操作数在输出张量元组中对应的数据指针对象;(2)当输出张量的数据指对象对应多个指令访问时,为访问当前输出张量的数据指针对象的所有指令维护一个指令列表,将当前指令添加到会访问上述数据指针对象的指
令列表里面;(3)对数据指针的多个读写访问进行加锁:指令访问池根据当前数据指针的访问类型、指令、数据指针对象取出当前数据指针的访问对象,当前指令的访问列表添加上述访问对象,利用上述访问对象更新当前指令的访问列表,当前数据指针对象维护的写操作的访问列表添加上述访问对象,利用上述访问对象更新当前数据指针的写操作的访问列表;s344:构建指令的边:分析两个指令的关系,来分别构造指令边,将两个指令进行连接;所述两个指令的关系为一读一写,或者两个读或者两个写。
10.作为优选的,所述步骤s53的具体步骤如下:s531:将指令添加到对应的设备流上,根据指令的元信息,取出当前指令的设备流,将当前指令添加到当前设备流的运行时指令列表中,再在活跃设备流列表添加当前设备流;s532:设备流准备指令,据设备流的元信息取出当前设备流类型,判断当前设备流类型是否在当前调度器线程上,如果是,则当前设备流类型运行当前指令,否则,将当前指令添加到当前设备流对应的准备指令列表中,然后在单独的线程上运行上述准备指令列表中的指令;s533:设备流运行指令,设备流类型的计算函数接收当前指令,根据当前指令的设备流的设备id,设置设备id,根据指令的元信息,调用指令的计算函数,当前指令执行完之后,设置当前指令的状态为“已完成状态”;s534:预调度指令:上述准备指令列表每次工作时,先将该准备指令列表放到一个临时列表中,在临时列表上不断地调度,上述临时列表接收准备列表中的指令后,所述虚拟机直接去执行临时列表中的指令,与此同时,在工作过程中,一旦发现有可以预调度的指令,则将该指令添加到准备列表中,准备列表可以继续接收解释器发送到虚拟机端的指令。
11.作为优选的,所述步骤s533中根据指令的元信息,调用指令的计算函数的具体过程如下:(1)获取设备上下文信息;(2)获取当前操作数;(3)根据所述的设备上下文信息和操作数,为输出张量分配内存,为临时张量分配内存;(4)根据所述设备上下文信息和操作数,初始化当前算子核函数的状态和缓存;(5)根据所述的设备上下文信息、操作数、算子核函数的状态和缓存,当前算子核函数进行计算。
12.作为优选的,所述步骤s6的具体过程如下:s61:虚拟机主动查询已经完成的当前指令的状态:遍历当前活跃的设备流列表,调用设备流类型的查询接口查询当前指令的状态,判断每个设备流的运行时指令列表中的每条指令是否是“已完成状态”,如果是,则释放当前指令;s62:从当前设备流的运行时指令列表删除当前指令。
13.本发明还公开了一种用于神经网络计算的动态图执行装置,包括解释器和虚拟机,所述解释器负责用户模式与指令模式的交互,将用户代码解析为指令,利用算子注册时
的元信息的推导函数解析出算子的元信息,将算子核函数特化为指定设备上的核函数以及构建虚拟机的指令,最后解释器负责给虚拟机发送当前指令;所述虚拟机负责调度指令,当执行前端用户业务代码时,虚拟机接受解释器发送来的调用算子核函数指令,在执行该指令时为输出张量申请显存,调用算子在用户指定的设备上的核函数进行计算,并将计算结果写入输出张量中。
14.作为优选的,所述装置主要执行过程包括:解释器解析指令过程和虚拟机调度指令以及下发指令到设备流上执行计算过程:所述虚拟机调度过程如下:程序在运行期间,虚拟机在调度线程中不断地轮询,如果有新的可以执行的指令,就执行,否则不断地轮询;在最外层设计一个大循环驱动,不断驱动着调度器,在大循环内部,一旦遇到已经处理完的节点,则从有向无环图中删除,遇到新加入的前端用户代码的业务,则把新指令节点添加到有向无环图中;虚拟机的轮询过程如下:虚拟机通过准备指令列表和添加指令列表将其做成一个迭代的方式,调度器轮询的时候只需要不断处理这两个列表,在有向无环图中有一个动态处理的已经准备就绪的指令列表,所述准备指令列表每次工作时,先将该准备指令列表放到一个临时列表中,在临时列表上不断地调度,在工作过程中,一旦发现有可以预调度的指令,则将该指令添加到准备列表中。
15.本发明还公开了一种用于神经网络计算的动态图执行装置,所述装置包括存储器和一个或多个处理器,所述存储器中存储有可执行代码,所述一个或多个处理器执行所述可执行代码时,用于实现上述的用于神经网络计算的动态图执行方法。
16.本发明的有益效果:本发明提供了一种用于神经网络计算的动态图执行方法及装置,通过将运行时抽象为虚拟机,虚拟机实时地通过解释器获取用户搭建的每一步骤的子图调度和下发执行每个子图,既满足了用户即时调试的需求又可以局部调优,获取最优的局部模型。研究人员和工程应用者开发算法模型过程中,利用所述的用于神经网络计算的动态图执行装置进行即时调试,满足了算法研究人员开发模型过程中即时验证算法正确性和模型局部性能的需求。
附图说明
17.图1是本发明实施例的用于神经网络计算的动态图执行的架构图;图2是本发明实施例的虚拟机调度过程中指令流动示意图;图3是本发明实施例的虚拟机下发一条normalization 的指令的示意图;图4是本发明实施例的虚拟机预调度一条 conv2d 的指令的示意图;图5是本发明实施例的虚拟机预调度一条释放已经完成指令的内存的示意图;图6是本发明实施例的用于神经网络计算的动态图执行装置示意图。
具体实施方式
18.为使本发明的目的、技术方案和优点更加清楚明了,下面通过附图及实施例,对本发明进行进一步详细说明。但是应该理解,此处所描述的具体实施例仅仅用以解释本发明,并不用于限制本发明的范围。此外,在以下说明中,省略了对公知结构和技术的描述,以避免不必要地混淆本发明的概念。
19.本发明实施例设计了一种执行引擎,所述执行引擎主要涉及操作系统工作过程中的程序运行阶段,即运行时,在本实施例中所述执行引擎命名为虚拟机。
20.如图1所示,所述一种用于神经网络计算的动态图执行的架构图。其中,解释器负责用户模式与指令模式的交互,解释器将用户代码解析为指令。虚拟机负责调度指令,并利用指令构建一张动态的由指令节点组成的有向无环图。虚拟机调度指令的过程实际上就是对动态有向无环图增加指令节点、下发指令节点到设备流上执行算子核函数计算、删除已经完成计算的指令节点的过程。
21.本实施例提供了一种用于神经网络计算的动态图执行方法,包括如下步骤:s1:构造和分发算子及张量;s2:算子解释器推导算子执行过程;s3:算子解释器构建运行时虚拟机的指令;s4:算子解释器将指令发送到运行时虚拟机;s5:虚拟机调度指令;s6:虚拟机释放已经执行完的指令。
22.所述步骤s1的具体子步骤如下:s11:创建了一个在指定硬件设备上的输入张量;s12:构建一个算子的元信息,包括算子的名字,输入输出张量的名字和设备信息;s13:将算子的元信息和输入张量分发到算子解释器。
23.所述步骤s2的具体子步骤如下:s21:算子解释器接收分发的算子对象、输入输出张量和一个上下文对象,遍历输入张量的列表,输入张量的数据指针列表添加当前输入张量的数据指针;s22:推导算子的元信息,所述元信息包括设备信息、输出张量的类型和形状,具体子步骤如下:s221:声明一个张量数据指针对象以及存储输出张量元信息的对象;s222:遍历输出张量列表,申请一个张量类型的指针并初始化为张量对象,并将步骤s221中的存储输出张量元信息的对象在对应位置的值更新为张量对象的元信息;s223:推导算子的设备信息,形状和类型,具体子步骤如下:第一步:推导算子的设备信息:调用注册算子时定义的设备推导函数获取所推导的设备信息;第二步:推导算子的形状和类型信息:调用注册算子时定义的形状推导和类型推导函数推导当前算子的形状和类型;第三步:遍历输出张量的数据指针,并基于已经推导出的输出张量的元信息更新输出张量的数据指针;s23:构造执行算子的核函数:根据算子对象和推导后的设备信息构造一个执行算子核函数。
24.所述步骤s3:将深度学习操作系统的运行时抽象为虚拟机。虚拟机执行的最小单位就是指令,每一种指令都会绑定两个属性:一个是分布式描述属性,分布式描述属性表示当前指令在哪些设备上执行;另一个是设备流的类型,设备流类型表示当前指令在哪种硬件设备上执行,如硬件设备是 gpu, 则硬件设备流的类型是cudastream。设备流是虚拟机
里面对硬件设备的抽象,每一种设备流对应一种硬件设备。所述算子解释器构建运行时虚拟机的指令过程包括如下步骤:s31:构建用于读取和修改张量数据指针的值的指令;s32:构建运行一个算子的指令;s33:构建释放生命周期已经结束的张量内存的指令;s34:构建指令之间的依赖关系,具体子步骤如下:s341:定义指令的操作数类型,采用指令的操作数类型构建指令间的依赖关系。操作数的主要类型有 const、mut、mut2。const为常量类型,mut为编译期的变量类型,mut2为运行时的变量类型。const 对应输入,表示读取数据操作。mut 和 mut2 对应输出,表示写入数据操作。用户发射a和b两条指令,然后a指令要求修改操作数c的值,但b指令要求读取操作数c的值,那么a指令就得优先于b指令执行。上述的 a 指令有一个 mut 类型的操作数 c,b 指令有一个 const 类型的操作数 c。通过检查 a 和 b 指令中操作数 c 的类型,就可以在 a 和 b 之间建立依赖关系:b 的推导一定要在 a 推导完成之后、b 的计算一定要在 a 计算之后。操作数类型 mut2 是为了处理一些输出张量的形状需要在运行时才能确定的算子,如果上述 a 以 mut2 擦作数类型的形式持有 c,那么 b 的推导和计算都需要发生在 a 的计算之后;s342:消费可读的数据指针对象,遍历当前算子核函数中 const操作数,取出当前操作数在输入张量元组中对应的数据指针对象,当前算子核函数利用上述取得的数据指针对象的值执行计算任务;s343:消费可写的数据指针对象,具体过程如下:(1)遍历当前算子核函数中 mut操作数,取出当前操作数在输出张量元组中对应的数据指针对象;(2)当输出张量的数据指对象对应多个指令访问时,为访问当前输出张量的数据指针对象的所有指令维护一个指令列表,将当前指令添加到会访问上述数据指针对象的指令列表里面;(3)对数据指针的多个读写访问进行加锁,指令访问池根据当前数据指针的访问类型、指令、数据指针对象取出当前数据指针的访问对象。当前指令的访问列表添加上述访问对象,也就是利用上述访问对象更新当前指令的访问列表。当前数据指针对象维护的写操作的访问列表添加上述指令的访问对象,也就是利用上述指令的访问对象更新当前数据指针的写操作的访问列表,其实就是往当前数据指针里写数据;s344:构建指令的边,分析两个指令的关系,如一个读一个写,或者两个读或者写,来分别构造指令边,将两个指令进行连接。
25.所述步骤s5虚拟机调度指令:运行时虚拟机执行当前指令的时候会为输出张量申请显存,调用算子在当前设备上的核函数进行计算并将计算结果写到输出张量。程序在运行期间,虚拟机会在调度器线程中不断的轮询,如果有新的可以执行的指令,则执行,否则就继续轮询。所述虚拟机调度指令包括如下过程:s51:初始化准备列表判断当前指令是否可以被下配,如果可以,则把当前指令添加到准备列表中;s52:采用一个临时列表接收准备列表。遍历临时列表,取出每一条指令;
s53:虚拟机下发指令。包括以下过程:s531:将指令添加到对应的设备流上,具体步骤如下:第一步、根据指令的元信息,取出当前指令的设备流;第二步、当前设备流的运行时指令列表添加当前指令;第三步、活跃设备流列表添加当前设备流。
26.s532:设备流准备指令,具体步骤如下:第一步、根据设备流的元信息取出当前设备流类型;第二步、判断当前设备流类型是否在当前调度器线程上。如果是,则当前设备流类型运行当前指令。否则,将当前指令添加到当前设备流对应的准备指令列表中。然后在单独的线程上运行上述准备列表中的指令。
27.s533:设备流运行指令,具体步骤如下:第一步、 设备流类型的计算函数接收当前指令;第二步、 根据当前指令的设备流的设备id,设置设备id;第三步、 根据指令的元信息,调用指令的计算函数。
28.所述指令的计算过程包括如下步骤:(1)获取设备上下文信息;(2)获取当前操作数;(3)根据所述的设备上下文信息和操作数,为输出张量分配内存,为临时张量分配内存;(4)根据所述设备上下文信息和操作数,初始化当前算子核函数的状态和缓存;(5)根据所述的设备上下文信息、操作数、算子核函数的状态和缓存,当前算子核函数进行计算;第四步、 当前指令执行完之后,设置当前指令的状态为“已完成状态”。
29.s534:预调度指令:上述准备指令列表每次工作时,先将该准备指令列表放到一个临时列表中,在临时列表上不断地调度,上述临时列表接收准备列表中的指令后,所述虚拟机直接去执行临时列表中的指令,与此同时,在工作过程中,一旦发现有可以预调度的指令,则将该指令添加到准备列表中,准备列表可以继续接收解释器发送到虚拟机端的指令。
30.所述步骤s6的具体过程如下:s61:虚拟机主动查询已经完成的当前指令的状态:遍历当前活跃的设备流列表,调用设备流类型的查询接口查询当前指令的状态,判断每个设备流的运行时指令列表中的每条指令是否是“已完成状态”,如果是,则释放当前指令;s62:从当前设备流的运行时指令列表删除当前指令。
31.本实施例提供了一种深度学习训练系统中用于神经网络模型计算的动态图执行装置。所述装置包括解释器和虚拟机,所述装置主要执行以下两个过程:解释器解析指令过程和虚拟机调度指令以及下发指令到设备流上执行计算过程。
32.解释器解析过程包括如下过程:解释器利用算子注册时的元信息的推导函数推导算子的元信息过程,将算子核函数特化为指定设备上的核函数以及构建虚拟机的指令的过程。最后解释器负责给虚拟机发送当前指令。
33.所定义的虚拟机如下:将运行时抽象为虚拟机。当执行python业务代码时,解释器发送调用算子核函数指令给虚拟机。虚拟机在执行这个指令的时候会为输出张量申请显存,调用算子在指定设备上的核函数进行计算,并将计算结果写入输出张量中。所述指定设备由用户使用设置来决定,最为常见的是英伟达的gpu设备。虚拟机最重要的职责是调度,它本身不完成具体的工作。具体的工作都是具体的算子指令完成。虚拟机将 python 业务序列构建出一个大的有向无环图,虚拟机的主要职责是构建一个动态的有向无环图。虚拟机调度指令的过程实际上就是对动态有向无环图增加、删除节点的过程。增加节点是指对动态有向无环图不断地追加指令节点。删除节点是指去掉已经完成的指令节点。
34.虚拟机的调度过程如下:程序在运行期间,虚拟机在调度线程中不断地轮询,如果有新的可以执行的指令,就执行,否则不断地轮询。在最外层设计一个大循环驱动,不断驱动着调度器。在大循环内部,一旦遇到已经处理完的节点,则从有向无环图中删除。遇到新加入的python 代码的业务,则把新指令节点添加到有向无环图中。
35.虚拟机的具体轮询过程如下:虚拟机通过准备指令列表和添加指令列表将其做成一个迭代的方式,调度器轮询的时候只需要不断处理这两个列表。在有向无环图中有一个动态处理的已经准备就绪的指令列表。该准备指令列表每次工作时,先将该准备指令列表放到一个临时列表中,在临时列表上不断地调度。在工作过程中,一旦发现有可以预调度的指令,则将该指令添加到准备列表中。
36.经过上述步骤,完成了神经网络模型计算的动态图执行实施的全过程,图2展示了虚拟机调度阶段指令流动过程。下面使用英伟达的nvidia nsight systems工具展示 resnet-50模型计算的动态图执行过程。执行的结果里包含了运行时信息:d: 表示虚拟机下发一个指令;s: 表示虚拟机将指令下发到设备流上;p: 虚拟机预调度已经准备好的指令;r:释放已经执行完的指令的操作;所展示 resnet-50模型计算的动态图执行过程得部分示意图过程如下:首先虚拟机下发一条normalization 算子指令,如图3所示。此时,conv2d 算子的指令准备就绪,虚拟机预调度一条 conv2d算子的指令,如图4所示。normalization 算子的输入一旦被用完了,它的输入内存可以开始被释放了。于是,虚拟机开始预调度释放已经完成的normalization 算子指令的内存,如图5所示。
37.参见图6,本发明实施例还提供的一种用于神经网络计算的动态图执行装置,还包括存储器和一个或多个处理器,存储器中存储有可执行代码,所述一个或多个处理器执行所述可执行代码时,用于实现上述实施例中的面向神经网络模型计算的中间表示生成方法。
38.本发明一种用于神经网络计算的动态图执行装置的实施例可以应用在任意具备数据处理能力的设备上,该任意具备数据处理能力的设备可以为诸如计算机等设备或装置。装置实施例可以通过软件实现,也可以通过硬件或者软硬件结合的方式实现。以软件实现为例,作为一个逻辑意义上的装置,是通过其所在任意具备数据处理能力的设备的处理器将非易失性存储器中对应的计算机程序指令读取到内存中运行形成的。从硬件层面而言,如图6所示,为本发明一种用于神经网络计算的动态图执行装置所在任意具备数据处理
能力的设备的一种硬件结构图,除了图6所示的处理器、内存、网络接口、以及非易失性存储器之外,实施例中装置所在的任意具备数据处理能力的设备通常根据该任意具备数据处理能力的设备的实际功能,还可以包括其他硬件,对此不再赘述。上述装置中各个单元的功能和作用的实现过程具体详见上述方法中对应步骤的实现过程,在此不再赘述。
39.对于装置实施例而言,由于其基本对应于方法实施例,所以相关之处参见方法实施例的部分说明即可。以上所描述的装置实施例仅仅是示意性的,其中所述作为分离部件说明的单元可以是或者也可以不是物理上分开的,作为单元显示的部件可以是或者也可以不是物理单元,即可以位于一个地方,或者也可以分布到多个网络单元上。可以根据实际的需要选择其中的部分或者全部模块来实现本发明方案的目的。本领域普通技术人员在不付出创造性劳动的情况下,即可以理解并实施。
40.本发明实施例还提供一种计算机可读存储介质,其上存储有程序,该程序被处理器执行时,实现上述实施例中的面向神经网络模型计算的中间表示生成方法。
41.所述计算机可读存储介质可以是前述任一实施例所述的任意具备数据处理能力的设备的内部存储单元,例如硬盘或内存。所述计算机可读存储介质也可以是任意具备数据处理能力的设备的外部存储设备,例如所述设备上配备的插接式硬盘、智能存储卡(smart media card,smc)、sd卡、闪存卡(flash card)等。进一步的,所述计算机可读存储介质还可以既包括任意具备数据处理能力的设备的内部存储单元也包括外部存储设备。所述计算机可读存储介质用于存储所述计算机程序以及所述任意具备数据处理能力的设备所需的其他程序和数据,还可以用于暂时地存储已经输出或者将要输出的数据。
42.以上所述仅为本发明的较佳实施例而已,并不用以限制本发明,凡在本发明的精神和原则之内所作的任何修改、等同替换或改进等,均应包含在本发明的保护范围之内。
当前第1页1 2 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1