运算方法、装置及相关产品与流程

文档序号:17536060发布日期:2019-04-29 14:00阅读:163来源:国知局
运算方法、装置及相关产品与流程
本公开涉及信息处理
技术领域
,尤其涉及一种运算方法、装置及相关产品。
背景技术
:在人工智能
技术领域
,神经网络算法是最近非常流行的一种机器学习算法,在各种领域中都取得了非常好的效果,比如图像识别,语音识别,自然语言处理等。随着神经网络算法的发展,算法的复杂度也越来越高,为了提高识别度,模型的规模也在逐渐增大。在这种情况下,新的人工智能处理器被提出以提高神经网络模型的运算速度,节约运算时间。技术实现要素:有鉴于此,本公开提出了一种算子融合装置及方法,以集合的形式将算子分配到处理器上执行,从而减少打开、关闭处理器以及拷贝数据的次数,提高运行速度,节省计算时间和带宽。根据本公开的第一方面,提供了一种算子融合方法,包括:获取神经网络的拓扑图中节点之间的拓扑关系;根据拓扑图中节点的类型以及节点之间的拓扑关系从所述拓扑图中提取第一融合集合;其中,拓扑图中的每个节点表示一个算子,第一融合集合中包括一个或多个第一类型的节点。在一种可能的实现方式中,根据拓扑图中节点的类型以及节点之间的拓扑关系从所述拓扑图中提取第一融合集合,包括:遍历所述拓扑图中的每个节点,根据节点的类型以及所述拓扑关系从所述拓扑图中获取第二融合集合;其中,第二融合集合中包括一个或多个第一类型的节点;根据每一个第二融合集合的出节点与入节点之间的关系,对每一个第二融合集合进行拆分处理,得到第一融合集合;其中,所述入节点为所述第二融合集合内的满足以下条件的序号最大的节点:该节点存在前驱节点、且该前驱节点不属于该第二融合集合;所述出节点为所述第二融合集合内的满足以下条件的序号最小的节点:该节点存在后继节点、且该后继节点不属于该第二融合集合。在一种可能的实现方式中,遍历所述拓扑图中的每个节点,根据节点的类型以及所述拓扑关系从所述拓扑图中获取第二融合集合,包括:在第一队列和第二队列中的任意一个队列不为空、且已遍历节点数小于或等于节点总数时,确定遍历类型;其中,遍历类型为遍历的队列的类型;若遍历类型为第一类型、且第一队列不为空,则从第一队列的队首取一个节点出队加入第一集合中、并将该节点作为当前节点;若遍历类型为第一类型、且第一队列为空,则将当前第一集合中的元素作为一个第二融合集合、并清空第一集合,将遍历类型切换为第二类型;遍历当前节点的后继节点,根据当前节点的类型、后继节点的类型,将后继节点加入第一队列或第二队列的队尾,将已遍历节点数加1。在一种可能的实现方式中,遍历所述拓扑图中的每个节点,根据节点的类型以及所述拓扑关系从所述拓扑图中获取第二融合集合,还包括:若遍历类型为第二类型、且第二队列不为空,则从第二队列的队首取一个节点出队作为当前节点;若遍历类型为第二类型、且第二队列为空,则将遍历类型切换为第一类型。在一种可能的实现方式中,遍历所述拓扑图中的每个节点,根据节点的类型以及所述拓扑关系从所述拓扑图中获取第二融合集合,还包括:建立第一队列和第二队列;确定遍历的起始节点以及起始节点的类型;根据起始节点的类型确定初始的遍历类型、并将起始节点放入与起始节点的类型对应的第一队列或者第二队列中,将已遍历节点数加1。在一种可能的实现方式中,遍历当前节点的后继节点,根据当前节点的类型、后继节点的类型,将后继节点加入第一队列或第二队列的队尾,将已遍历节点数加1,包括:在当前节点的后继节点遍历完之前,逐个遍历当前节点的后继节点:将后继节点的入度减一;若后继节点的类型和当前节点的类型不同,则将后继节点加入后继节点的类型对应的队列的队尾,将已遍历节点数加1;若后继节点的类型和当前节点的类型相同、且后继节点的入度为0,则将后继节点加入后继节点的类型对应的队列的队尾,将已遍历节点数加1。在一种可能的实现方式中,根据每一个第二融合集合的出节点与入节点之间的关系,对每一个第二融合集合进行拆分处理,得到第一融合集合,包括:针对每一个第二融合集合,确定该第二融合集合的入节点和出节点;若第二融合集合的出节点的序号小于第二融合集合的入节点的序号,则拆分该第二融合集合得到第一融合集合;若第二融合集合的出节点的序号大于或等于第二融合集合的入节点的序号,则将第二融合集合确定为第一融合集合。在一种可能的实现方式中,若第二融合集合的出节点的序号小于第二融合集合的入节点的序号,则拆分该第二融合集合得到第一融合集合,包括:若第二融合集合的出节点的序号小于第二融合集合的入节点的序号,则从第二融合集合中取出序号最小的两个节点组成第二集合;若第二集合的出节点的序号大于或等于第二集合的入节点的序号,则继续从第二融合集合中取出序号最小的一个节点加入到第二集合中,并判断第二集合的出节点的序号是否大于或等于第二集合的入节点的序号;若第二集合的出节点的序号小于第二集合的入节点的序号,则将第二集合中序号最大的节点取出放回到第二融合集合中,并将第二集合确定为一个第一融合集合,判断第二融合集合的出节点的序号是否大于或等于第二融合集合的入节点的序号。在一种可能的实现方式中,所述方法还包括:将第一融合集合分配给第二处理器,以使第二处理器执行第一融合集合中的算子。根据本公开的第二方面,提供了一种算子融合装置,所述装置应用于第一处理器,所述装置包括:获取模块,用于获取神经网络的拓扑图中节点之间的拓扑关系;提取模块,用于根据拓扑图中节点的类型以及节点之间的拓扑关系从所述拓扑图中提取第一融合集合;其中,拓扑图中的每个节点表示一个算子,第一融合集合中包括一个或多个第一类型的节点。在一种可能的实现方式中,所述提取模块包括:遍历单元,用于遍历所述拓扑图中的每个节点,根据节点的类型以及所述拓扑关系从所述拓扑图中获取第二融合集合;其中,第二融合集合中包括一个或多个第一类型的节点;拆分单元,用于根据每一个第二融合集合的出节点与入节点之间的关系,对每一个第二融合集合进行拆分处理,得到第一融合集合;其中,所述入节点为所述第二融合集合内的满足以下条件的序号最大的节点:该节点存在前驱节点、且该前驱节点不属于该第二融合集合;所述出节点为所述第二融合集合内的满足以下条件的序号最小的节点:该节点存在后继节点、且该后继节点不属于该第二融合集合。在一种可能的实现方式中,所述遍历单元还用于:在第一队列和第二队列中的任意一个队列不为空、且已遍历节点数小于或等于节点总数时,确定遍历类型;其中,遍历类型为遍历的队列的类型;若遍历类型为第一类型、且第一队列不为空,则从第一队列的队首取一个节点出队加入第一集合中、并将该节点作为当前节点;若遍历类型为第一类型、且第一队列为空,则将当前第一集合中的元素作为一个第一融合集合、并清空第一集合,将遍历类型切换为第二类型;遍历当前节点的后继节点,根据当前节点的类型、后继节点的类型,将后继节点加入第一队列或第二队列的队尾,将已遍历节点数加1。在一种可能的实现方式中,所述遍历单元还用于:若遍历类型为第二类型、且第二队列不为空,则从第二队列的队首取一个节点出队作为当前节点;若遍历类型为第二类型、且第二队列为空,则将遍历类型切换为第一类型。在一种可能的实现方式中,所述遍历单元还用于:建立第一队列和第二队列;确定遍历的起始节点以及起始节点的类型;根据起始节点的类型确定初始的遍历类型、并将起始节点放入与起始节点的类型对应的第一队列或者第二队列中,将已遍历节点数加1。在一种可能的实现方式中,所述遍历单元还用于:在当前节点的后继节点遍历完之前,逐个遍历当前节点的后继节点:将后继节点的入度减一;若后继节点的类型和当前节点的类型不同,则将后继节点加入后继节点的类型对应的队列的队尾,将已遍历节点数加1;若后继节点的类型和当前节点的类型相同、且后继节点的入度为0,则将后继节点加入后继节点的类型对应的队列的队尾,将已遍历节点数加1。在一种可能的实现方式中,所述拆分单元还用于:针对每一个第二融合集合,确定该第二融合集合的入节点和出节点;若第二融合集合的出节点的序号小于第二融合集合的入节点的序号,则拆分该第二融合集合得到第一融合集合;若第二融合集合的出节点的序号大于或等于第二融合集合的入节点的序号,则将第二融合集合确定为第一融合集合。在一种可能的实现方式中,所述拆分单元还用于:若第二融合集合的出节点的序号小于第二融合集合的入节点的序号,则从第二融合集合中取出序号最小的两个节点组成第二集合;若第二集合的出节点的序号大于或等于第二集合的入节点的序号,则继续从第二融合集合中取出序号最小的一个节点加入到第二集合中,并判断第二集合的出节点的序号是否大于或等于第二集合的入节点的序号;若第二集合的出节点的序号小于第二集合的入节点的序号,则将第二集合中序号最大的节点取出放回到第二融合集合中,并将第二集合确定为一个第一融合集合,判断第二融合集合的出节点的序号是否大于或等于第二融合集合的入节点的序号。在一种可能的实现方式中,所述装置还包括:分配模块,用于将第一融合集合分配给第二处理器,以使第二处理器执行第一融合集合中的算子。根据本公开的第三方面,提供了一种算子融合方法,所述方法应用于第一处理器,所述方法包括:当将遍历类型由第一类型切换为第二类型时,将当前第一集合中的元素作为一个第二融合集合、并清空第一集合;其中,遍历类型为遍历的队列的类型,第一集合用于保存第一类型的节点,第二融合集合中包括一个或多个第一类型的节点;根据每一个第二融合集合的出节点与入节点之间的关系,对每一个第二融合集合进行拆分处理,得到第一融合集合;其中,所述入节点为所述第二融合集合内的满足以下条件的序号最大的节点:该节点存在前驱节点、且该前驱节点不属于该第二融合集合;所述出节点为所述第二融合集合内的满足以下条件的序号最小的节点:该节点存在后继节点、且该后继节点不属于该第二融合集合。在一种可能的实现方式中,所述方法还包括:在第一队列和第二队列中的任意一个队列不为空、且已遍历节点数小于或等于节点总数时,确定遍历类型;其中,第一队列用于存储将要遍历的第一类型的节点,第二队列用于存储将要遍历的第二类型的节点;若遍历类型为第一类型、且第一队列为空,则将遍历类型有第一类型切换为第二类型。在一种可能的实现方式中,所述方法还包括:若遍历类型为第一类型、且第一队列不为空,则从第一队列的队首取一个节点出队加入第一集合中、并将该节点作为当前节点;遍历当前节点的后继节点,根据当前节点的类型、后继节点的类型,将后继节点加入第一队列或第二队列的队尾,将已遍历节点数加1。在一种可能的实现方式中,所述方法还包括:若遍历类型为第二类型、且第二队列不为空,则从第二队列的队首取一个节点出队作为当前节点;若遍历类型为第二类型、且第二队列为空,则将遍历类型切换为第一类型。在一种可能的实现方式中,遍历当前节点的后继节点,根据当前节点的类型、后继节点的类型,将后继节点加入第一队列或第二队列的队尾,将已遍历节点数加1,包括:在当前节点的后继节点遍历完之前,逐个遍历当前节点的后继节点:将后继节点的入度减一;若后继节点的类型和当前节点的类型不同,则将后继节点加入后继节点的类型对应的队列的队尾,将已遍历节点数加1;若后继节点的类型和当前节点的类型相同、且后继节点的入度为0,则将后继节点加入后继节点的类型对应的队列的队尾,将已遍历节点数加1。在一种可能的实现方式中,所述方法还包括:获取神经网络的拓扑图中节点之间的拓扑关系;建立第一队列和第二队列;确定遍历的起始节点以及起始节点的类型;根据起始节点的类型确定初始的遍历类型、并将起始节点放入与起始节点的类型对应的第一队列或者第二队列中,将已遍历节点数加1。在一种可能的实现方式中,根据每一个第二融合集合的出节点与入节点之间的关系,对每一个第二融合集合进行拆分处理,得到第一融合集合,包括:针对每一个第二融合集合,确定该第二融合集合的入节点和出节点;若第二融合集合的出节点的序号小于第二融合集合的入节点的序号,则拆分该第二融合集合得到第一融合集合;若第二融合集合的出节点的序号大于或等于第二融合集合的入节点的序号,则将第二融合集合确定为第一融合集合。在一种可能的实现方式中,若第二融合集合的出节点的序号小于第二融合集合的入节点的序号,则拆分该第二融合集合得到第一融合集合,包括:若第二融合集合的出节点的序号小于第二融合集合的入节点的序号,则从第二融合集合中取出序号最小的两个节点组成第二集合;若第二集合的出节点的序号大于或等于第二集合的入节点的序号,则继续从第二融合集合中取出序号最小的一个节点加入到第二集合中,并判断第二集合的出节点的序号是否大于或等于第二集合的入节点的序号;若第二集合的出节点的序号小于第二集合的入节点的序号,则将第二集合中序号最大的节点取出放回到第二融合集合中,并将第二集合确定为一个第一融合集合,判断第二融合集合的出节点的序号是否大于或等于第二融合集合的入节点的序号。根据本公开的第四方面,提供了一种算子融合装置,所述装置应用于第一处理器,所述装置包括:遍历模块,用于当将遍历类型由第一类型切换为第二类型时,将当前第一集合中的元素作为一个第二融合集合、并清空第一集合;其中,遍历类型为遍历的队列的类型,第一集合用于保存第一类型的节点,第二融合集合中包括一个或多个第一类型的节点;拆分模块,用于根据每一个第二融合集合的出节点与入节点之间的关系,对每一个第二融合集合进行拆分处理,得到第一融合集合;其中,所述入节点为所述第二融合集合内的满足以下条件的序号最大的节点:该节点存在前驱节点、且该前驱节点不属于该第二融合集合;所述出节点为所述第二融合集合内的满足以下条件的序号最小的节点:该节点存在后继节点、且该后继节点不属于该第二融合集合。在一种可能的实现方式中,所述遍历模块还用于:在第一队列和第二队列中的任意一个队列不为空、且已遍历节点数小于或等于节点总数时,确定遍历类型;其中,第一队列用于存储将要遍历的第一类型的节点,第二队列用于存储将要遍历的第二类型的节点;所述遍历模块还用于:若遍历类型为第一类型、且第一队列为空,则将遍历类型有第一类型切换为第二类型。在一种可能的实现方式中,所述遍历模块还用于:若遍历类型为第一类型、且第一队列不为空,则从第一队列的队首取一个节点出队加入第一集合中、并将该节点作为当前节点;遍历当前节点的后继节点,根据当前节点的类型、后继节点的类型,将后继节点加入第一队列或第二队列的队尾,将已遍历节点数加1。在一种可能的实现方式中,所述遍历模块还用于:若遍历类型为第二类型、且第二队列不为空,则从第二队列的队首取一个节点出队作为当前节点;若遍历类型为第二类型、且第二队列为空,则将遍历类型切换为第一类型。在一种可能的实现方式中,所述遍历模块还用于:在当前节点的后继节点遍历完之前,逐个遍历当前节点的后继节点:将后继节点的入度减一;若后继节点的类型和当前节点的类型不同,则将后继节点加入后继节点的类型对应的队列的队尾,将已遍历节点数加1;若后继节点的类型和当前节点的类型相同、且后继节点的入度为0,则将后继节点加入后继节点的类型对应的队列的队尾,将已遍历节点数加1。在一种可能的实现方式中,所述遍历模块还用于:获取神经网络的拓扑图中节点之间的拓扑关系;建立第一队列和第二队列;确定遍历的起始节点以及起始节点的类型;根据起始节点的类型确定初始的遍历类型、并将起始节点放入与起始节点的类型对应的第一队列或者第二队列中,将已遍历节点数加1。在一种可能的实现方式中,所述拆分模块还用于:针对每一个第二融合集合,确定该第二融合集合的入节点和出节点;若第二融合集合的出节点的序号小于第二融合集合的入节点的序号,则拆分该第二融合集合得到第一融合集合;若第二融合集合的出节点的序号大于或等于第二融合集合的入节点的序号,则将第二融合集合确定为第一融合集合。在一种可能的实现方式中,所述拆分模块还用于:若第二融合集合的出节点的序号小于第二融合集合的入节点的序号,则从第二融合集合中取出序号最小的两个节点组成第二集合;若第二集合的出节点的序号大于或等于第二集合的入节点的序号,则继续从第二融合集合中取出序号最小的一个节点加入到第二集合中,并判断第二集合的出节点的序号是否大于或等于第二集合的入节点的序号;若第二集合的出节点的序号小于第二集合的入节点的序号,则将第二集合中序号最大的节点取出放回到第二融合集合中,并将第二集合确定为一个第一融合集合,判断第二融合集合的出节点的序号是否大于或等于第二融合集合的入节点的序号。根据本公开的第五方面,提供了一种人工智能处理装置,所述装置包括第一处理器和第二处理器,所述第一处理器连接到所述第二处理器,其中,所述第一处理器用于执行上述的算子融合方法,并将根据上述的算子融合方法得到的第一融合集合发送给第二处理器;第二处理器用于执行第一融合集合中的算子。在一种可能的实现方式中,所述第二处理器用于执行人工智能计算,所述第二处理器包括:运算模块以及控制模块,所述运算模块包括:一个主处理电路和多个从处理电路;所述控制模块,用于获取输入数据以及计算指令;所述控制模块,还用于解析该计算指令得到多个运算指令,将该多个运算指令以及所述输入数据发送给所述主处理电路;所述主处理电路,用于对所述输入数据执行前序处理以及与所述多个从处理电路之间传输数据和运算指令;所述多个从处理电路,用于依据从所述主处理电路传输的数据以及运算指令并行执行中间运算得到多个中间结果,并将多个中间结果传输给所述主处理电路;所述主处理电路,用于对所述多个中间结果执行后续处理得到所述计算指令的计算结果。根据拓扑图中节点的类型以及节点之间的拓扑关系,可以将拓扑图中关联的节点合并成算子集合(第一融合集合),关联的节点可以是指相邻的节点,也就是说在执行顺序上是相邻的。一个拓扑图可以提取出一个或多个第一融合集合,每个第一融合集合中可以包括一个或多个第一类型的节点。以集合的形式将算子分配到处理器上执行,从而减少打开、关闭处理器以及拷贝数据的次数,提高运行速度,节省计算时间和带宽。根据下面参考附图对示例性实施例的详细说明,本公开的其它特征及方面将变得清楚。附图说明包含在说明书中并且构成说明书的一部分的附图与说明书一起示出了本公开的示例性实施例、特征和方面,并且用于解释本公开的原理。图1示出根据本公开一实施例的算子融合方法的流程图。图2示出根据本公开一实施例的步骤s12的方法的流程图。图3示出了根据本公开一实施例的步骤s121的方法的流程图。图4示出了根据本公开一实施例的算子融合方法的流程图。图5示出根据本公开一示例的神经网络的拓扑图。图6a-图6d示出对图5中的拓扑图进行遍历过程中第一队列和第二队列的示例。图7示出根据本公开一实施例的遍历当前节点的后继节点的方法的流程图。图8示出根据本公开一实施例的遍历当前节点的后继节点的方法的流程图。图9示出了根据本公开一实施例的步骤s122的方法的流程图。图10a-图10c示出第二融合集合的一些示例。图11示出根据本公开一实施例的步骤s32的方法的流程图。图12示出根据本公开一实施例的算子融合装置的框图。图13示出根据本公开一实施例的算子融合装置的框图。图14示出根据本公开一实施例的人工智能处理装置的框图。图15示出根据本公开一实施例的第二处理器的框图。具体实施方式以下将参考附图详细说明本公开的各种示例性实施例、特征和方面。附图中相同的附图标记表示功能相同或相似的元件。尽管在附图中示出了实施例的各种方面,但是除非特别指出,不必按比例绘制附图。在这里专用的词“示例性”意为“用作例子、实施例或说明性”。这里作为“示例性”所说明的任何实施例不必解释为优于或好于其它实施例。另外,为了更好的说明本公开,在下文的具体实施方式中给出了众多的具体细节。本领域技术人员应当理解,没有某些具体细节,本公开同样可以实施。在一些实例中,对于本领域技术人员熟知的方法、手段、元件和电路未作详细描述,以便于凸显本公开的主旨。在进行人工智能处理的过程中,主处理器在获取输入数据以及算子后,根据与算子绑定的设备,会将算子以及与算子对应的输入数据发送给人工智能处理器(例如,ipu,intelligenceprocessingunit),由人工智能处理器根据算子和与算子对应的输入数据执行人工智能运算。其中,主处理器可以为cpu或者gpu等。本公开对主处理器和人工智能处理器的类型不作具体限定。在上述过程中,每个算子的执行都要有准备数据、拷入数据、生成指令、硬件计算、拷回数据等一系列操作,并且主处理器将每个算子发送给人工智能处理器执行时,人工智能处理器都要先打开设备,运算完成后再关闭设备。如果算子很多的话,多次打开设备带来人工智能处理器的频繁启动和多次数据拷贝等,会耗费很多时间和带宽资源。为了解决上述技术问题,本公开提供了一种算子融合方法,通过本公开个实施例的算子融合方法,能够将关联的算子合并成一个算子集合,将算子集合一起发送给处理器执行,而不是逐个执行,减少了打开、关闭处理器的次数以及拷贝数据的次数,提高运行速度,节省计算时间和带宽。图1示出根据本公开一实施例的算子融合方法的流程图。该方法可以应用于第一处理器,第一处理器可以是主处理器,例如中央处理单元cpu、图形处理单元gpu等,本公开对第一处理器的具体类型不作限定。如图1所示,该方法可以包括:步骤s11,获取神经网络的拓扑图中节点之间的拓扑关系;步骤s12,根据拓扑图中节点的类型以及节点之间的拓扑关系从所述拓扑图中提取第一融合集合;其中,上述拓扑图可以是指整个神经网络的拓扑图,例如mxnet神经网络的拓扑图。拓扑图中的每个节点表示一个算子,算子与算子之间所依赖的关系是边,算子与算子之间所依赖的关系也就是节点之间的拓扑关系。对于步骤s11,可以对整个拓扑图进行预处理,预处理可以包括存储每个节点的前驱节点和后继节点,从而获取到拓扑图中节点之间的拓扑关系。节点的前驱节点可以是指在执行该节点对应的算子之前被执行的相邻节点,节点的后继节点可以是指执行该节点对应的算子之后被执行的相邻节点。相邻节点可以是指,两个节点之间存在直接相连的边。拓扑图中的节点可以具有不同的类型,节点的类型可以通过该节点被存储的位置确定。在本公开的实施方式中,拓扑图中的节点包括第一类型和第二类型,其中,第一类型为ipu类型,第二类型为cpu类型。其中,第一融合集合中可以包括一个或多个第一类型的节点。在一种可能的实现方式中,所述方法还可以包括:将第一融合集合分配给第二处理器,以使第二处理器执行第一融合集合中的算子。其中,第二处理器可以是用于执行人工智能运算的人工智能处理器(ipu),人工智能运算可包括机器学习运算,类脑运算等。其中,机器学习运算包括神经网络运算、k-means运算、支持向量机运算等。该人工智能处理器可例如包括gpu(graphicsprocessingunit,图形处理单元)、npu(neural-networkprocessingunit,神经网络处理单元)、dsp(digitalsignalprocess,数字信号处理单元)、现场可编程门阵列(field-programmablegatearray,fpga)芯片中的一种或组合。本公开对第二处理器的具体类型不作限制。因此,根据拓扑图中节点的类型以及节点之间的拓扑关系,可以将拓扑图中关联的节点合并成算子集合(第一融合集合),关联的节点可以是指相邻的节点,也就是说在执行顺序上是相邻的。一个拓扑图可以提取出一个或多个第一融合集合,每个第一融合集合中可以包括一个或多个第一类型的节点。以集合的形式将算子分配到处理器上执行,从而减少打开、关闭处理器以及拷贝数据的次数,提高运行速度,节省计算时间和带宽。图2示出根据本公开一实施例的步骤s12的方法的流程图。如图2所示,在一种可能的实现方式中,步骤s12可以包括:步骤s121,遍历所述拓扑图中的每个节点,根据节点的类型以及所述拓扑关系从所述拓扑图中获取第二融合集合;其中,第二融合集合中包括一个或多个第一类型的节点;步骤s122,根据每一个第二融合集合的出节点与入节点之间的关系,对每一个第二融合集合进行拆分处理,得到第一融合集合;其中,所述入节点为所述第二融合集合内的满足以下条件的序号最大的节点:该节点存在前驱节点、且该前驱节点不属于该第二融合集合;所述出节点为所述第二融合集合内的满足以下条件的序号最小的节点:该节点存在后继节点、且该后继节点不属于该第二融合集合。需要说明的是,第一融合集合、第二融合集合等的第一、第二并没有顺序等方面的限定,仅仅是为了区分开着两个融合集合;也可以将第二融合集合称为第一融合集合,第一融合集合称为第二融合集合,并不影响对本公开的技术方案的理解。图3示出了根据本公开一实施例的步骤s121的方法的流程图。图4示出了根据本公开一实施例的算子融合方法的流程图。对于步骤s121,可以参见图3和图4。步骤s121可以包括:步骤s21,建立第一队列和第二队列;步骤s22,确定遍历的起始节点以及起始节点的类型;步骤s23,根据起始节点的类型确定初始的遍历类型、并将起始节点放入与起始节点的类型对应的第一队列或者第二队列中,将已遍历节点数加1。步骤s24,在第一队列和第二队列中的任意一个队列不为空、且已遍历节点数小于或等于节点总数时,确定遍历类型;其中,遍历类型为遍历的队列的类型;步骤s25,若遍历类型为第一类型、且第一队列不为空,则从第一队列的队首取一个节点出队加入第一集合中、并将该节点作为当前节点;步骤s26,若遍历类型为第一类型、且第一队列为空,则将当前第一集合中的元素作为一个第二融合集合、并清空第一集合,将遍历类型切换为第二类型;步骤s27,若遍历类型为第二类型、且第二队列不为空,则从第二队列的队首取一个节点出队作为当前节点;步骤s28,若遍历类型为第二类型、且第二队列为空,则将遍历类型切换为第一类型。步骤s29,遍历当前节点的后继节点,根据当前节点的类型、后继节点的类型,将后继节点加入第一队列或第二队列的队尾,将已遍历节点数加1。下面以图4为例对上述流程s21-s29进行详细的说明。对于步骤s21,其中,第一队列可以用于存储ipu节点(也称ipu队列),第二队列可以用于存储cpu节点(也称cpu队列)。第一队列和第二队列都可以为fifo(firstinputfirstoutput,先进先出)队列。对于步骤s22,其中,起始节点var可以为入度为0的节点,节点的入度可以是指以该节点为相邻的后继节点的数量,或者说是与该节点相邻的前驱节点的数量。换言之,入度为0的节点可以是指没有相邻的前驱节点的节点。因此,在一种可能的实现方式中,可以根据获取的节点之间的拓扑关系计算每一个节点的入度,确定入度为0的节点作为遍历的起始节点。起始节点的类型可以根据起始节点存储的位置确定,例如起始节点的类型可以为ipu和/或者cpu。对于步骤s23,根据起始节点的类型确定初始的遍历类型可以是指:若起始节点的类型为ipu,则初始的遍历类型为ipu,也就是先遍历ipu队列(第一队列);若起始节点的类型为cpu,则初始的遍历类型的cpu,也就是先遍历cpu队列(第二队列);默认初始的遍历类型为cpu,也就是默认先遍历cpu队列,比如说,若起始节点的类型为ipu和cpu,那么先遍历cpu队列。另外,若起始节点的类型为ipu,则将起始节点放入ipu队列,若起始节点的类型为cpu,则将起始节点放入cpu队列。另外,在一种可能的实现方式中,还可以设置一个变量记录已遍历节点数,例如,可以是指变量visited_num,visited_num的初始值为0。将起始节点放入与起始节点的类型对应的第一队列或者第二队列中,已遍历起始节点,可以将已遍历节点数加1。节点总数可以设置一个固定变量all_num。对于步骤s24,如图4所示,可以先判断第一队列和第二队列是否为空、以及已遍历节点数是否小于或等于节点总数。在第一队列和第二队列中的任意一个队列不为空、且已遍历节点数小于或等于节点总数时,可以确定遍历类型,此时可以确定遍历类型为在步骤s23中确定的初始的遍历类型为。之后,判断遍历类型对应的队列,是否为空。若确定的遍历类型为第一类型,那么判断第一队列是否为空,根据判断的结果执行步骤s25或者s26。例如,如果为空,则将当前第一集合中的元素作为一个第二融合集合、并清空第一集合,将遍历类型切换为第二类型;如果不为空,则从第一队列的队首取一个节点出队加入第一集合中、并将该节点作为当前节点,然后执行步骤s29。其中,第一集合可以为用于保存ipu节点的集合,在每次将遍历类型由第一类型切换为第二类型时,可以将当前第一集合中的元素作为一个第二融合集合、并清空第一集合。在一种可能的实现方式中,可以设置一个存储区域保存ipu节点的集合,如ipu_block。若确定的遍历类型为第二类型,那么判断第二队列是否为空,根据判断的结果执行步骤s27或者s28。例如,如果为空,则将遍历类型切换为第一类型;如果不为空,则从第二队列的队首取一个节点出队作为当前节点,然后执行步骤s29。步骤s29的具体过程可以为,在当前节点的后继节点遍历完之前,逐个遍历当前节点的后继节点。图7示出根据本公开一实施例的遍历当前节点的后继节点的方法的流程图。步骤s291,将后继节点的入度减一;步骤s292,若后继节点的类型和当前节点的类型不同,则将后继节点加入后继节点的类型对应的队列的队尾,将已遍历节点数加1;步骤s293,若后继节点的类型和当前节点的类型相同、且后继节点的入度为0,则将后继节点加入后继节点的类型对应的队列的队尾,将已遍历节点数加1。图8示出根据本公开一实施例的遍历当前节点的后继节点的方法的流程图。如图7和图8所示,可以先判断当前节点的后继节点是否已全部遍历完,若没有,则继续遍历当前节点的后继节点,若已经遍历完,则回到“判断第一队列和第二队列是否为空、以及已遍历节点数是否小于节点总数”(图4或图3中的步骤s24)的步骤。具体的遍历过程为,将后继节点的入度减一,判断后继节点的类型是否和当前节点的类型相同,若后继节点的类型和当前节点的类型不同,则将后继节点加入后继节点的类型对应的队列的队尾,将已遍历节点数加1。若后继节点的类型和当前节点的类型相同,则可以判断后继节点的入度是否为0,入度为0表示它所依赖的节点已经执行,它可以被执行了:若后继节点的入度为0,则将后继节点加入后继节点的类型对应的队列的队尾,将已遍历节点数加1,然后继续遍历下一个后继节点;若后继节点的入度不为0,可以不进行任何处理。需要说明的是,若第一队列和第二队列都为空、或已遍历节点数大于节点总数,说明已经遍历完所有节点或者出现错误,此时结束算法融合方法的过程。另外,图3所示的方法步骤的顺序,仅仅是本公开的一个示例,本公开不限于此,例如,步骤s21还可以与步骤s22同时执行,或者位于步骤s22之后。步骤s25-步骤s28的执行顺序不分先后,根据具体的判断结果确定。图5示出根据本公开一示例的神经网络的拓扑图。图6a-图6d示出对图5进行遍历过程中第一队列和第二队列的示例。下面以图5所示的拓扑图为例,结合图4-图8对本公开的方法进行示例性说明。建立如图6a示出的两个队列,图5中节点1的入度为0,节点1为cpu类型,则将节点1放入cpu队列。判断ipu队列和cpu队列是否为空、已遍历节点数是否小于或等于节点总数。此时,cpu队列中存储有节点1、不为空,已遍历节点数为1,小于总结点数11。此时,可以确定遍历类型,由于节点1为cpu类型,因此先遍历cpu队列,进入步骤s27或者s28。因为cpu队列不为空,所以,从cpu队列的队首取节点1作为当前节点,然后进入步骤s29,遍历节点1的后继节点。如图7和图5所示,先遍历后继节点2,将节点2的入度减一,此时节点2的入度为0,然后可以确定节点2的类型,节点2的类型为ipu,节点2和节点1的类型不同,则可以将节点2加入到ipu队列的队尾,已遍历节点数加1,此时visited_num=2。然后遍历节点3,将节点3的入度减一,此时节点3的入度为0,然后可以确定节点3的类型,节点3的类型为cpu,节点3和节点1的类型相同、且节点3的入度为0,则可以将节点3加入cpu队列的队尾,已遍历节点数加1,此时visited_num=3。此时,第一队列和第二队列的示例,如图6b所示。需要说明的是,以上遍历当前节点的后继节点的顺序仅仅是本公开的一个示例,对于上述示例,也可以先遍历节点3再遍历节点2,本公开对此不作限定。在遍历完当前节点1的后继节点之后,可以再次判断第一队列和第二队列是否为空、以及已遍历节点数是否小于或等于节点总数。此时,ipu队列和cpu队列都不为空,已遍历节点数为3,小于节点总数11。此时,可以确定遍历类型,遍历类型仍然为cpu,cpu队列不为空,所以,进入步骤s27,从cpu队列的队首取节点3作为当前节点,然后进入步骤s29,遍历节点3的后继节点。如图7和图5所示,遍历后继节点7,将节点7的入度减一,此时节点7的入度为0,然后可以确定节点7的类型,节点7的类型为ipu,节点7和节点3的类型不同,则可以将节点7加入到ipu队列的队尾,已遍历节点数加1,此时visited_num=4。在遍历完当前节点3的后继节点之后,可以再次判断第一队列和第二队列是否为空、以及已遍历节点数是否小于或等于节点总数。此时,ipu队列不为空、cpu队列为空,已遍历节点数为4,小于节点总数11。可以确定遍历类型,遍历类型仍然为cpu,cpu队列为空,所以,进入步骤s28,将遍历类型切换为ipu。ipu队列不为空,进入步骤s25,从ipu队列的队首取节点2加入第一集合中,将节点2作为当前节点,进入步骤s29,遍历节点2的后继节点。如图7和图5所示,先遍历后继节点4,将节点4的入度减一,此时节点4的入度为0,然后可以确定节点4的类型,节点4类型为ipu,节点4和节点2的类型相同、节点4的入度为0,则可以将节点4加入到ipu队列的队尾,已遍历节点数加1,此时visited_num=5。然后遍历节点5,将节点5的入度减一,此时节点5的入度为0,然后可以确定节点5的类型,节点5的类型为cpu,节点5和节点2的类型不同,则可以将节点5加入cpu队列的队尾,已遍历节点数加1,此时visited_num=6。遍历后继节点6,将节点6的入度减一,此时节点6的入度为0,然后可以确定节点6的类型,节点6类型为ipu,节点6和节点2的类型相同、节点6的入度为0,则可以将节点6加入到ipu队列的队尾,已遍历节点数加1,此时visited_num=7。此时,第一队列和第二队列的示例,如图6c所示。在遍历完当前节点2的后继节点之后,可以再次判断第一队列和第二队列是否为空、以及已遍历节点数是否小于或等于节点总数。此时,ipu队列不为空、cpu队列不为空,已遍历节点数为7,小于节点总数11。可以确定遍历类型,遍历类型仍然为ipu,ipu队列不为空,进入步骤s25,从ipu队列的队首取节点7加入第一集合中,将节点7作为当前节点,进入步骤s29,遍历节点7的后继节点。如图7和图5所示,先遍历后继节点8,将节点8的入度减一,此时节点8的入度为0,然后可以确定节点8的类型,节点8类型为ipu,节点8和节点7的类型相同、节点8的入度为0,则可以将节点8加入到ipu队列的队尾,已遍历节点数加1,此时visited_num=8。然后遍历节点9,将节点9的入度减一,此时节点9的入度为0,然后可以确定节点9的类型,节点9的类型为cpu,节点9和节点7的类型不同,则可以将节点9加入cpu队列的队尾,已遍历节点数加1,此时visited_num=9。此时,第一队列和第二队列的示例,如图6d所示。在遍历完当前节点7的后继节点之后,可以再次判断第一队列和第二队列是否为空、以及已遍历节点数是否小于或等于节点总数。此时,ipu队列不为空、cpu队列不为空,已遍历节点数为9,小于节点总数11。可以确定遍历类型,遍历类型仍然为ipu,ipu队列不为空,进入步骤s25,从ipu队列的队首取节点4加入第一集合中,将节点4作为当前节点,进入步骤s29,遍历节点4的后继节点。节点4没有后继节点,继续判断第一队列和第二队列是否为空、以及已遍历节点数是否小于节点总数。此时,ipu队列不为空、cpu队列不为空,已遍历节点数为9,小于节点总数11。可以确定遍历类型,遍历类型仍然为ipu,ipu队列不为空,进入步骤s25,从ipu队列的队首取节点6加入第一集合中,将节点6作为当前节点,进入步骤s29,遍历节点6的后继节点。节点6没有后继节点,继续判断第一队列和第二队列是否为空、以及已遍历节点数是否小于或等于节点总数。此时,ipu队列不为空、cpu队列不为空,已遍历节点数为9,小于节点总数11。可以确定遍历类型,遍历类型仍然为ipu,ipu队列不为空,进入步骤s25,从ipu队列的队首取节点8加入第一集合中,将节点8作为当前节点,进入步骤s29,遍历节点8的后继节点。节点8没有后继节点,继续判断第一队列和第二队列是否为空、以及已遍历节点数是否小于或等于节点总数。此时,ipu队列为空、cpu队列不为空,已遍历节点数为9,小于节点总数11。可以确定遍历类型,遍历类型仍然为ipu,ipu队列为空,进入步骤s25,将当前第一集合{2,7,4,6,8}中的元素作为一个第二融合集合{2,7,4,6,8}、并清空第一集合,此时,第一集合为空。将遍历类型切换为cpu,cpu队列不为空,进入步骤s27……,不断执行以上过程,直到第一队列和第二队列都为空、或者已遍历节点数大于节点总数。根据以上过程,在图5的示例中,最终得到的第二融合集合包括:{2,7,4,6,8}和{10,11}。图9示出了根据本公开一实施例的步骤s122的方法的流程图。对于步骤s122,可以参见图9。步骤s122可以包括:步骤s31,针对每一个第二融合集合,确定该第二融合集合的入节点和出节点;步骤s32,若第二融合集合的出节点的序号小于第二融合集合的入节点的序号,则拆分该第二融合集合得到第一融合集合;步骤s33,若第二融合集合的出节点的序号大于或等于第二融合集合的入节点的序号,则将第二融合集合确定为第一融合集合。对于步骤s31,如上所述,所述入节点为所述第二融合集合内的满足以下条件的序号最大的节点:该节点存在前驱节点、且该前驱节点不属于该第二融合集合;所述出节点为所述第二融合集合内的满足以下条件的序号最小的节点:该节点存在后继节点、且该后继节点不属于该第二融合集合。其中,节点的序号代表了节点对应的算子被执行的顺序。对于每个第二融合集合里的一个节点,如果有外部节点指向该节点,取序号最大的节点作为这个第二融合集合的入节点。图10a-图10c示出第二融合集合的一些示例。如图10a所示,其中2、11、22都是cpu节点,9、19、31是融合在一起的ipu节点。对于这个第二融合集合,因为2指向9,11指向19,没有外部节点指向31,又因为19大于9,所以该第二融合集合的入节点是19。对于图5中的示例,如上文所述,第二融合集合包括:{2,7,4,6,8}和{10,11}。对于第二融合集合{2,7,4,6,8},节点1、3都是cpu节点,节点1指向节点2,节点3指向节点7,没有外部节点指向节点4、6、8。又7大于2,所以该第二融合集合的入节点为7。对于每个第二融合集合里的一个节点,如果有节点指向外部节点,取最小的节点作为这个第二融合集合的出节点。如图10b所示,入节点为19,出节点为9。为了使拓扑图中的节点能够按照顺序被执行,第二融合集合的出节点的序号和入节点的序号需要满足一定的关系,出节点的序号需要大于等于入节点的序号。根据入节点的序号与出节点的序号之间的关系,可以执行步骤s32或s33。如图10b所示,出节点的序号小于入节点的序号,节点13会在节点19之前被遍历到,那么它所依赖的节点9并没有被执行,故它不能被执行。此时,执行步骤s32,需要对图10b中所示的第二融合集合进行拆分得到第一融合集合。图11示出根据本公开一实施例的步骤s32的方法的流程图。如图11所示,步骤s32可以包括:步骤s321,若第二融合集合的出节点的序号小于第二融合集合的入节点的序号,则从第二融合集合中取出序号最小的两个节点组成第二集合;步骤s322,若第二集合的出节点的序号大于或等于第二集合的入节点的序号,则继续从第二融合集合中取出序号最小的一个节点加入到第二集合中,并判断第二集合的出节点的序号是否大于或等于第二集合的入节点的序号;步骤s323,若第二集合的出节点的序号小于第二集合的入节点的序号,则将第二集合中序号最大的节点取出放回到第二融合集合中,并将第二集合确定为一个第一融合集合,判断第二融合集合的出节点的序号是否大于或等于第二融合集合的入节点的序号。换言之,从第二融合集合中取出序号最小的两个节点组成一个第二集合(此时的第二融合集合少了两个元素),确定第二结合的入节点以及出节点,判断第二集合的出节点的序号和入节点的序号的大小关系,并根据判断的结果执行步骤s322或者s323:若第二集合的出节点的序号大于或等于第二集合的入节点的序号,执行步骤s322中的继续从第二融合集合中取出序号最小的一个节点加入到第二集合中(此时的第二融合集合少了三个元素),此时的第二集合由三个元素组成,判断由三个元素组成的第二集合的出节点的序号与入节点的序号的大小关系,并根据判断结果执行步骤s322或者s323;若第二集合的出节点的序号小于第二集合的入节点的序号,则执行步骤s323,将第二集合中序号最大的节点取出放回到第二融合集合中,并将第二集合确定为一个第一融合集合,判断第二融合集合的出节点的序号是否大于或等于第二融合集合的入节点的序号,根据判断结果执行步骤s321或者将第二融合集合确定为一个第一融合集合。举例来说,如图10b所示,取出序号最小的两个节点组成第二集合{9,19},第二集合的入节点为19,出节点为9,出节点的序号小于入节点的序号,执行步骤s323,将19放回第二融合集合,将{9}确定为一个第一融合集合。判断第二融合集合{19,31}的入节点的序号是否大于或等于入节点的序号,第二融合集合{19,31}的入节点和出节点都是19,出节点的序号等于入节点的序号,所以,可以将第二融合集合{19,31}确定为一个第一融合集合。拆分后得到的第一融合集合如图10c所示。对于图5中的示例,上文中提到最终得到的第二融合集合包括:{2,7,4,6,8}和{10,11}。对于第二融合集合{2,7,4,6,8},入节点为7,出节点为2,出节点的序号小于入节点的序号。因此,需要对第二融合集合{2,7,4,6,8}进行拆分。具体的拆分过程如下:取出序号最小的两个节点组成第二集合{2,4},第二集合{2,4}的出节点和入节点都是2,出节点的序号等于入节点的序号,因此,继续从第二融合集合{7,6,8}中取出节点6加入到第二集合中得到第二集合{2,4,6},第二集合{2,4,6}的出节点和入节点都是2,出节点的序号等于入节点的序号,因此,继续从第二融合集合{7,8}中取出节点7加入到第二集合中得到第二集合{2,4,6,7},第二集合的入节点为7,出节点为2,出节点的序号小于入节点的序号,因此,将节点7放回到第二融合集合中得到第二融合集合{7,8},将第二集合{2,4,6}作为一个第一融合集合。判断第二融合集合{7,8}的出节点的序号是否大于或等于入节点的序号,第二融合集合{7,8}的出节点和入节点为8,出节点的序号等于入节点的序号,因此,可以将第二融合集合{7,8}确定为一个第二融合集合。对于第二融合集合{10,11},入节点为11,没有出节点,不需要进行拆分,将第二融合集合{10,11}确定为一个第一融合集合。根据以上过程可知,图5中的拓扑图中的ipu节点,经过本公开的算子融合方法后,可以得到三个第一融合集合:{2,4,6}、{7,8}、{10,11},可以将第一融合集合发送给ipu执行。根据图5的示例,在采用本公开的算子融合方法融合之前,每个算子执行时都要打开和关闭ipu,一共需要打开和关闭7次,而采用本公开的算子融合方法融合形成第一融合集合后,需要打开和关闭3次。因此,根据本公开的算子融合方法,减少了打开、关闭ipu的次数以及拷贝数据的次数,提高运行速度,节省计算时间和带宽。图12示出根据本公开一实施例的算子融合装置的框图。该装置可以应用于第一处理器,第一处理器可以是主处理器,例如中央处理单元cpu、图形处理单元gpu等,本公开对此不作限定。如图12所示,该装置可以包括:获取模块91和提取模块92;获取模块91,用于获取神经网络的拓扑图中节点之间的拓扑关系;所述提取模块92用于根据拓扑图中节点的类型以及节点之间的拓扑关系从所述拓扑图中提取第一融合集合;其中,拓扑图中的每个节点表示一个算子,第一融合集合中包括一个或多个第一类型的节点。根据拓扑图中节点的类型以及节点之间的拓扑关系,可以将拓扑图中关联的节点合并成算子集合(第一融合集合),关联的节点可以是指相邻的节点,也就是说在执行顺序上是相邻的。一个拓扑图可以提取出一个或多个第一融合集合,每个第一融合集合中可以包括一个或多个第一类型的节点。以集合的形式将算子分配到处理器上执行,从而减少打开、关闭处理器以及拷贝数据的次数,提高运行速度,节省计算时间和带宽。图13示出根据本公开一实施例的算子融合装置的框图。如图13所示,在一种可能的实现方式中,所述提取模块92可以包括:遍历单元921,用于遍历所述拓扑图中的每个节点,根据节点的类型以及所述拓扑关系从所述拓扑图中获取第二融合集合;其中,第二融合集合中包括一个或多个第一类型的节点;拆分单元922,用于根据每一个第二融合集合的出节点与入节点之间的关系,对每一个第二融合集合进行拆分处理,得到第一融合集合;其中,所述入节点为所述第二融合集合内的满足以下条件的序号最大的节点:该节点存在前驱节点、且该前驱节点不属于该第二融合集合;所述出节点为所述第二融合集合内的满足以下条件的序号最小的节点:该节点存在后继节点、且该后继节点不属于该第二融合集合。在一种可能的实现方式中,所述遍历单元921还用于:在第一队列和第二队列中的任意一个队列不为空、且已遍历节点数小于或等于节点总数时,确定遍历类型;其中,遍历类型为遍历的队列的类型;若遍历类型为第一类型、且第一队列不为空,则从第一队列的队首取一个节点出队加入第一集合中、并将该节点作为当前节点;若遍历类型为第一类型、且第一队列为空,则将当前第一集合中的元素作为一个第一融合集合、并清空第一集合,将遍历类型切换为第二类型;遍历当前节点的后继节点,根据当前节点的类型、后继节点的类型,将后继节点加入第一队列或第二队列的队尾,将已遍历节点数加1。在一种可能的实现方式中,所述遍历单元921还用于:若遍历类型为第二类型、且第二队列不为空,则从第二队列的队首取一个节点出队作为当前节点;若遍历类型为第二类型、且第二队列为空,则将遍历类型切换为第一类型。在一种可能的实现方式中,所述遍历单921还用于:建立第一队列和第二队列;确定遍历的起始节点以及起始节点的类型;根据起始节点的类型确定初始的遍历类型、并将起始节点放入与起始节点的类型对应的第一队列或者第二队列中,将已遍历节点数加1。在一种可能的实现方式中,所述遍历单元921还用于:在当前节点的后继节点遍历完之前,逐个遍历当前节点的后继节点:将后继节点的入度减一;若后继节点的类型和当前节点的类型不同,则将后继节点加入后继节点的类型对应的队列的队尾,将已遍历节点数加1;若后继节点的类型和当前节点的类型相同、且后继节点的入度为0,则将后继节点加入后继节点的类型对应的队列的队尾,将已遍历节点数加1。在一种可能的实现方式中,所述拆分单元922还用于:针对每一个第二融合集合,确定该第二融合集合的入节点和出节点;若第二融合集合的出节点的序号小于第二融合集合的入节点的序号,则拆分该第二融合集合得到第一融合集合;若第二融合集合的出节点的序号大于或等于第二融合集合的入节点的序号,则将第二融合集合确定为第一融合集合。在一种可能的实现方式中,所述拆分单元922还用于:若第二融合集合的出节点的序号小于第二融合集合的入节点的序号,则从第二融合集合中取出序号最小的两个节点组成第二集合;若第二集合的出节点的序号大于或等于第二集合的入节点的序号,则继续从第二融合集合中取出序号最小的一个节点加入到第二集合中,并判断第二集合的出节点的序号是否大于或等于第二集合的入节点的序号;若第二集合的出节点的序号小于第二集合的入节点的序号,则将第二集合中序号最大的节点取出放回到第二融合集合中,并将第二集合确定为一个第一融合集合,判断第二融合集合的出节点的序号是否大于或等于第二融合集合的入节点的序号。本公开还提供了一种人工智能处理装置,图14示出根据本公开一实施例的人工智能处理装置的框图,如图14所示,所述装置包括第一处理器41和第二处理器42,所述第一处理器41连接到所述第二处理器42,其中,所述第一处理器41用于执行上文所述的算子融合方法,并将得到的第一融合集合发送给第二处理器42;第二处理器42用于执行第一融合集合中的算子。在一种可能的实现方式中,第一处理器41可以是主处理器,例如中央处理单元cpu、图形处理单元gpu等。第一处理器41可用于获取输入数据以及要使用的人工智能算子,并将其传输给第二处理器42,以使第二处理器42执行相应的人工智能运算。本公开对第一处理器的具体类型不作限制。在一种可能的实现方式中,第二处理器42可以是用于执行人工智能运算的人工智能处理器(ipu)。该人工智能处理器可例如包括gpu(graphicsprocessingunit,图形处理单元)、npu(neural-networkprocessingunit,神经网络处理单元)、dsp(digitalsignalprocess,数字信号处理单元)、现场可编程门阵列(field-programmablegatearray,fpga)芯片中的一种或组合。本公开对第二处理器的具体类型不作限制。在一种可能的实施方式中,人工智能处理装置可以是有不同的处理器形成的(例如ipu+cpu);也可以是由多个相同的处理器形成的,例如多个处理器(xpu)形成类似于第一处理器41及第二处理器42的架构。其中,处理器的类型可以是现有的,也可以是新提出的新型处理器,本公开对此不作限制。图15是根据一示例性实施例示出的一种第二处理器的框图。参阅图15,该第二处理器用于执行机器学习计算,该第二处理器包括:控制器单元141和运算单元142,其中,控制器单元141与运算单元142连接,该运算单元142包括:一个主处理电路和多个从处理电路;控制器单元141,用于获取输入数据以及计算指令;控制器单元141获取的计算指令可以是由第一处理器对算子进行融合后的第一融合集合中的一个或多个算子。在一种可选方案中,一个主处理电路和多个从处理电路可以为树型结构、h型结构或者脉冲阵列机结构,本公开对主处理电路和从处理电路之前的连接方式不作限定。在一种可选方案中,具体的,获取输入数据以及计算指令方式可以通过数据输入输出单元得到,该数据输入输出单元具体可以为一个或多个数据i/o接口或i/o引脚。上述计算指令包括但不限于:正向运算指令或反向训练指令,或其他神经网络运算指令等等,例如卷积运算指令,本申请具体实施方式并不限制上述计算指令的具体表现形式。控制器单元141,还用于解析该计算指令得到多个运算指令,将该多个运算指令以及所述输入数据发送给所述主处理电路;主处理电路101,用于对所述输入数据执行前序处理以及与所述多个从处理电路之间传输数据以及运算指令;多个从处理电路102,用于依据从所述主处理电路传输的数据以及运算指令并行执行中间运算得到多个中间结果,并将多个中间结果传输给所述主处理电路;主处理电路101,用于对所述多个中间结果执行后续处理得到所述计算指令的计算结果。本申请提供的技术方案将运算单元设置成一主多从结构,对于正向运算的计算指令,其可以将依据正向运算的计算指令将数据进行拆分,这样通过多个从处理电路即能够对计算量较大的部分进行并行运算,从而提高运算速度,节省运算时间,进而降低功耗。可选的,上述机器学习计算具体可以包括:人工神经网络运算,上述输入数据具体可以包括:输入神经元数据和权值数据。上述计算结果具体可以为:人工神经网络运算的结果即输出神经元数据。对于神经网络中的运算可以为神经网络中的一层的运算,对于多层神经网络,其实现过程是,在正向运算中,当上一层人工神经网络执行完成之后,下一层的运算指令会将运算单元中计算出的输出神经元作为下一层的输入神经元进行运算(或者是对该输出神经元进行某些操作再作为下一层的输入神经元),同时,将权值也替换为下一层的权值;在反向运算中,当上一层人工神经网络的反向运算执行完成后,下一层运算指令会将运算单元中计算出的输入神经元梯度作为下一层的输出神经元梯度进行运算(或者是对该输入神经元梯度进行某些操作再作为下一层的输出神经元梯度),同时将权值替换为下一层的权值。上述机器学习计算还可以包括支持向量机运算,k-近邻(k-nn)运算,k-均值(k-means)运算,主成分分析运算等等。为了描述的方便,下面以人工神经网络运算为例来说明机器学习计算的具体方案。对于人工神经网络运算,如果该人工神经网络运算具有多层运算,多层运算的输入神经元和输出神经元并非是指整个神经网络的输入层中神经元和输出层中神经元,而是对于网络中任意相邻的两层,处于网络正向运算下层中的神经元即为输入神经元,处于网络正向运算上层中的神经元即为输出神经元。以卷积神经网络为例,设一个卷积神经网络有l层,k=1,2,...,l-1,对于第k层和第k+1层来说,我们将第k层称为输入层,其中的神经元为所述输入神经元,第k+1层称为输出层,其中的神经元为所述输出神经元。即除最顶层外,每一层都可以作为输入层,其下一层为对应的输出层。可选的,上述第二处理器还可以包括:该存储单元140和直接内存访问单元50,存储单元140可以包括:寄存器、缓存中的一个或任意组合,具体的,所述缓存,用于存储所述计算指令;所述寄存器,用于存储所述输入数据和标量;所述缓存为高速暂存缓存。直接内存访问单元50用于从存储单元10读取或存储数据。可选的,该控制器单元包括:指令存储单元410、指令处理单元411和存储队列单元413;指令存储单元410,用于存储所述人工神经网络运算关联的计算指令;所述指令处理单元411,用于对所述计算指令解析得到多个运算指令;存储队列单元413,用于存储指令队列,该指令队列包括:按该队列的前后顺序待执行的多个运算指令或计算指令。举例说明,在一个可选的技术方案中,主运算处理电路也可以包括一个控制器单元,该控制器单元可以包括主指令处理单元,具体用于将指令译码成微指令。当然在另一种可选方案中,从运算处理电路也可以包括另一个控制器单元,该另一个控制器单元包括从指令处理单元,具体用于接收并处理微指令。上述微指令可以为指令的下一级指令,该微指令可以通过对指令的拆分或解码后获得,能被进一步解码为各部件、各单元或各处理电路的控制信号。在一种可选方案中,该计算指令的结构可以如下表所示。操作码寄存器或立即数寄存器/立即数…上表中的省略号表示可以包括多个寄存器或立即数。在另一种可选方案中,该计算指令可以包括:一个或多个操作域以及一个操作码。该计算指令可以包括神经网络运算指令。以神经网络运算指令为例,如表1所示,其中,寄存器号0、寄存器号1、寄存器号2、寄存器号3、寄存器号4可以为操作域。其中,每个寄存器号0、寄存器号1、寄存器号2、寄存器号3、寄存器号4可以是一个或者多个寄存器的号码。上述寄存器可以为片外存储器,当然在实际应用中,也可以为片内存储器,用于存储数据,该数据具体可以为n维数据,n为大于等于1的整数,例如,n=1时,为1维数据,即向量,如n=2时,为2维数据,即矩阵,如n=3或3以上时,为多维张量。可选的,该控制器单元还可以包括:所述依赖关系处理单元412,用于在具有多个运算指令时,确定第一运算指令与所述第一运算指令之前的第零运算指令是否存在关联关系,如所述第一运算指令与所述第零运算指令存在关联关系,则将所述第一运算指令缓存在所述指令存储单元内,在所述第零运算指令执行完毕后,从所述指令存储单元提取所述第一运算指令传输至所述运算单元;所述确定该第一运算指令与第一运算指令之前的第零运算指令是否存在关联关系包括:依据所述第一运算指令提取所述第一运算指令中所需数据(例如矩阵)的第一存储地址区间,依据所述第零运算指令提取所述第零运算指令中所需矩阵的第零存储地址区间,如所述第一存储地址区间与所述第零存储地址区间具有重叠的区域,则确定所述第一运算指令与所述第零运算指令具有关联关系,如所述第一存储地址区间与所述第零存储地址区间不具有重叠的区域,则确定所述第一运算指令与所述第零运算指令不具有关联关系。本公开可以是系统、方法和/或计算机程序产品。计算机程序产品可以包括计算机可读存储介质,其上载有用于使处理器实现本公开的各个方面的计算机可读程序指令。计算机可读存储介质可以是可以保持和存储由指令执行设备使用的指令的有形设备。计算机可读存储介质例如可以是――但不限于――电存储设备、磁存储设备、光存储设备、电磁存储设备、半导体存储设备或者上述的任意合适的组合。计算机可读存储介质的更具体的例子(非穷举的列表)包括:便携式计算机盘、硬盘、随机存取存储器(ram)、只读存储器(rom)、可擦式可编程只读存储器(eprom或闪存)、静态随机存取存储器(sram)、便携式压缩盘只读存储器(cd-rom)、数字多功能盘(dvd)、记忆棒、软盘、机械编码设备、例如其上存储有指令的打孔卡或凹槽内凸起结构、以及上述的任意合适的组合。这里所使用的计算机可读存储介质不被解释为瞬时信号本身,诸如无线电波或者其他自由传播的电磁波、通过波导或其他传输媒介传播的电磁波(例如,通过光纤电缆的光脉冲)、或者通过电线传输的电信号。这里所描述的计算机可读程序指令可以从计算机可读存储介质下载到各个计算/处理设备,或者通过网络、例如因特网、局域网、广域网和/或无线网下载到外部计算机或外部存储设备。网络可以包括铜传输电缆、光纤传输、无线传输、路由器、防火墙、交换机、网关计算机和/或边缘服务器。每个计算/处理设备中的网络适配卡或者网络接口从网络接收计算机可读程序指令,并转发该计算机可读程序指令,以供存储在各个计算/处理设备中的计算机可读存储介质中。用于执行本公开操作的计算机程序指令可以是汇编指令、指令集架构(isa)指令、机器指令、机器相关指令、微代码、固件指令、状态设置数据、或者以一种或多种编程语言的任意组合编写的源代码或目标代码,所述编程语言包括面向对象的编程语言—诸如smalltalk、c++等,以及常规的过程式编程语言—诸如“c”语言或类似的编程语言。计算机可读程序指令可以完全地在用户计算机上执行、部分地在用户计算机上执行、作为一个独立的软件包执行、部分在用户计算机上部分在远程计算机上执行、或者完全在远程计算机或服务器上执行。在涉及远程计算机的情形中,远程计算机可以通过任意种类的网络—包括局域网(lan)或广域网(wan)—连接到用户计算机,或者,可以连接到外部计算机(例如利用因特网服务提供商来通过因特网连接)。在一些实施例中,通过利用计算机可读程序指令的状态信息来个性化定制电子电路,例如可编程逻辑电路、现场可编程门阵列(fpga)或可编程逻辑阵列(pla),该电子电路可以执行计算机可读程序指令,从而实现本公开的各个方面。这里参照根据本公开实施例的方法、装置(系统)和计算机程序产品的流程图和/或框图描述了本公开的各个方面。应当理解,流程图和/或框图的每个方框以及流程图和/或框图中各方框的组合,都可以由计算机可读程序指令实现。这些计算机可读程序指令可以提供给通用计算机、专用计算机或其它可编程数据处理装置的处理器,从而生产出一种机器,使得这些指令在通过计算机或其它可编程数据处理装置的处理器执行时,产生了实现流程图和/或框图中的一个或多个方框中规定的功能/动作的装置。也可以把这些计算机可读程序指令存储在计算机可读存储介质中,这些指令使得计算机、可编程数据处理装置和/或其他设备以特定方式工作,从而,存储有指令的计算机可读介质则包括一个制造品,其包括实现流程图和/或框图中的一个或多个方框中规定的功能/动作的各个方面的指令。也可以把计算机可读程序指令加载到计算机、其它可编程数据处理装置、或其它设备上,使得在计算机、其它可编程数据处理装置或其它设备上执行一系列操作步骤,以产生计算机实现的过程,从而使得在计算机、其它可编程数据处理装置、或其它设备上执行的指令实现流程图和/或框图中的一个或多个方框中规定的功能/动作。附图中的流程图和框图显示了根据本公开的多个实施例的系统、方法和计算机程序产品的可能实现的体系架构、功能和操作。在这点上,流程图或框图中的每个方框可以代表一个模块、程序段或指令的一部分,所述模块、程序段或指令的一部分包含一个或多个用于实现规定的逻辑功能的可执行指令。在有些作为替换的实现中,方框中所标注的功能也可以以不同于附图中所标注的顺序发生。例如,两个连续的方框实际上可以基本并行地执行,它们有时也可以按相反的顺序执行,这依所涉及的功能而定。也要注意的是,框图和/或流程图中的每个方框、以及框图和/或流程图中的方框的组合,可以用执行规定的功能或动作的专用的基于硬件的系统来实现,或者可以用专用硬件与计算机指令的组合来实现。以上已经描述了本公开的各实施例,上述说明是示例性的,并非穷尽性的,并且也不限于所披露的各实施例。在不偏离所说明的各实施例的范围和精神的情况下,对于本
技术领域
的普通技术人员来说许多修改和变更都是显而易见的。本文中所用术语的选择,旨在最好地解释各实施例的原理、实际应用或对市场中的技术的技术改进,或者使本
技术领域
的其它普通技术人员能理解本文披露的各实施例。当前第1页12
当前第1页1 2 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1