本公开的示例通常涉及在主机计算系统上执行的神经网络应用与神经网络加速器之间的通信。
背景技术:
机器学习是使计算系统无需明确编程即可采取行动的科学。传统机器学习包括各种聚类和分类技术,包括k-means聚类、线性和逻辑回归、随机梯度下降、关联规则学习等。深度学习是机器学习中的较新前沿。深度学习是一类机器学习算法,其使用多层非线性处理单元进行特征提取和变换。深度学习算法可以是不受监督(例如,模式分析)或受监督(例如,分类)的。深度学习算法可以使用人工神经网络(ann)(在本文中称为“神经网络”)的层来实现。
一般而言,神经网络是在曲线图中连接的节点(即“神经元”)的集合。神经网络中的节点计算加权输入的总和,并且向总和添加可选偏差。节点的输出是最终总和的函数(称为“激活函数”)。示例激活函数包括s形函数、双曲正切(tanh)函数、整流线性单元(relu)函数和恒等函数。神经网络模型通常被组织为节点的层,这些层定义了特定拓扑结构以及对应的权重和偏差。权重和偏差称为网络参数。
一般而言,神经网络包括输入层和输出层,并且可以可选地包括输入层与输出层之间的一个或多个隐藏层。用于深度学习应用的神经网络通常包括许多隐藏层,这导致出现术语深度神经网络(dnn)”。神经网络的层可以紧密连接(例如,一层中的每个节点都完全连接到上一层中的所有节点),还可以稀疏连接(例如,一层中的每个节点仅连接到上一层中的节点中的部分节点)。卷积神经网络(cnn)是一种dnn,其包括一个或多个稀疏连接的层,被称为卷积层。cnn非常适合处理图像或视频数据。其他类型的dnn包括递归神经网络(rnn),其非常适合处理语音和文本数据。
现代现场可编程门阵列(fpga)提供了数百万个查找表以及数千个数字信号处理(dsp)块和随机存取存储器(bram)块,其可以被用于创建大规模并行硬件系统。fpga中的可编程逻辑可以形成一个或多个内核,该一个或多个内核可以使用并行硬件系统执行神经网络加速器(通常称为加速电路)。
提高fpga的利用率可以提高神经网络应用的性能。因此,fpga忙于执行由神经网络应用提供的任务的时间越长,神经网络可以处理和提供结果的速度就越快。然而,神经网络设计人员可能不具备充分利用fpga上的神经网络加速器所需的技能和专业知识。
技术实现要素:
描述了用于调度神经网络的技术。一个示例是一种用于将提交给神经网络加速器的任务流水线化方法。该方法包括:从神经网络应用接收要由神经网络加速器处理的第一任务;生成分组,该分组包含流水线中的多个阶段使用的信息;以及在多个阶段对该分组进行处理,其中多个阶段中的至少一个阶段执行对执行神经网络加速器的硬件系统的调用并且其中流水线与处理分组并行地处理与第二任务相对应的至少一个其他分组。该方法还包括:使用流水线将处理的分组的结果返回给神经网络应用。
在一些实施例中,在多个阶段处对分组进行处理可以包括:在预处理阶段处对分组进行处理;在预处理阶段之后发生的执行阶段对分组进行处理,其中对硬件系统的调用可以在执行阶段期间发生;并且在执行阶段之后的后处理阶段处对分组进行处理。
在一些实施例中,在预处理阶段处对分组进行处理可以包括:将与第一任务相对应的数据从神经网络应用所使用的第一格式转换为硬件系统所使用的第二格式。在后处理阶段处对分组进行处理可以包括:将结果从第二格式转换为第一格式。
在一些实施例中,多个阶段中的每个阶段可以包括独立于其他线程处理分组的相应的线程。
在一些实施例中,该方法还可以包括:生成存储器映射,该存储器映射将用于神经网络应用的分配的存储器块映射到硬件系统中的用于神经网络加速器的分配的存储器块;以及将基于存储器映射的从神经网络应用接收的第一存储器地址转换为硬件系统中的存储器块的第二存储器地址。
在一些实施例中,该方法还可以包括:以矩阵格式将用于执行神经网络的多个层的权重传送到硬件系统;识别与新任务相对应的权重的子集;以及向硬件系统传输指示当处理分组时要使用的权重的子集的偏移。
在一些实施例中,该方法还可以包括:获得关于在硬件系统上的神经网络加速器的执行的度量;输出用于显示的度量的视觉表示;以及调整执行流水线中的多个阶段的硬件资源,以增加神经网络加速器的利用。
在一些实施例中,可以在库中定义流水线中的多个阶段。该库可以包括应用程序接口(api),该应用程序接口被配置为准许不同类型的神经网络应用使用流水线中的多个阶段来向神经网络加速器提交任务。
在一些实施例中,该方法还可以包括:定制分组中用于向神经网络加速器提供信息的多个字段。定制的多个字段可以根据神经网络加速器的类型而变化,并且不同类型的神经网络加速器可以使用不同的字段。
在一些实施例中,该方法还可以包括:确定调试功能是否激活;以及在将分组提交给神经网络加速器和将分组提交给执行神经网络应用的主机中的一个或多个计算机处理器之间进行切换。
另一示例是一种存储指令的非暂态计算机可读存储介质,该指令当在一个或多个处理设备上执行时,执行用于将提交给神经网络加速器的任务流水线化的操作。该操作包括:从神经网络应用接收要由神经网络加速器处理的第一任务;生成分组,该分组包含流水线中的多个阶段所使用的信息;以及在多个阶段处对分组进行处理,其中多个阶段中的至少一个阶段执行对执行神经网络加速器的硬件系统的调用,其中流水线与处理分组并行地处理与第二任务相对应的至少一个其他分组。该操作还包括:将使用流水线处理分组的结果返回给神经网络应用。
另一示例是一种计算系统,其包括处理器和存储器。该存储器包括库,其当由处理器执行时,执行操作。该操作包括:从神经网络应用接收要由神经网络加速器处理的第一任务;生成分组,该分组包含流水线中多个阶段所使用的信息;以及在多个阶段处对分组进行处理,其中多个阶段中的至少一个阶段执行对执行神经网络加速器的硬件系统的调用,其中流水线与处理分组并行地处理与第二任务相对应的至少一个其他分组。该操作还包括:将使用流水线处理分组的结果返回给神经网络应用。
在一些实施例中,在多个阶段处对分组进行处理可以包括:在预处理阶段处对分组进行处理;在预处理阶段之后发生的执行阶段对分组进行处理,其中对硬件系统的调用可以在执行阶段期间发生;以及在执行阶段之后的后处理阶段对分组进行处理。
在一些实施例中,在预处理阶段处对分组进行处理可以包括:将与第一任务相对应的数据从神经网络应用所使用的第一格式转换为硬件系统所使用的第二格式;并且在后处理阶段处对分组进行处理可以包括:将结果从第二格式转换为第一格式。
在一些实施例中,该操作还可以包括:生成存储器映射,该存储器映射将用于神经网络应用的分配的存储器块映射到硬件系统中的用于神经网络加速器的分配的存储器块;以及将基于存储器映射的从神经网络应用接收的第一存储器地址转换为硬件系统中的存储器块的第二存储器地址。
在一些实施例中,该操作还可以包括:以矩阵格式将用于执行神经网络的多个层的权重传送到硬件系统;识别与新任务相对应的权重的子集;以及向硬件系统传输指示当处理分组时要使用的权重的子集的偏移。
在一些实施例中,该操作还可以包括:获得关于在硬件系统上的神经网络加速器的执行的度量;输出用于显示的度量的视觉表示;以及调整执行流水线中的多个阶段的硬件资源,以增加神经网络加速器的利用。
在一些实施例中,可以在库中定义流水线中的多个阶段。该库可以包括api,该api被配置为准许不同类型的神经网络应用使用流水线中的多个阶段来向神经网络加速器提交任务。
在一些实施例中,该操作还可以包括:定制分组中用于向神经网络加速器提供信息的多个字段。定制的多个字段可以根据神经网络加速器的类型而变化,并且不同类型的神经网络加速器可以使用不同的字段。
在一些实施例中,计算系统还可以包括:确定调试功能是否激活;以及在将分组提交给神经网络加速器和将分组提交给执行神经网络应用的主机中的一个或多个计算机处理器之间进行切换。
附图说明
为了更详细理解上述特征的方式,可以通过参考示例实现方式来获得上文所简要概述的更具体描述,其中一些示例实现方式在附图中图示。然而,应当指出,附图仅图示了典型的示例实现方式,因此不应视为对其范围的限制。
图1图示了根据示例的多层神经网络。
图2根据示例的用于使神经网络加速器与神经网络应用接合的系统。
图3图示了根据示例的神经网络加速器与神经网络应用之间的通信流程。
图4是根据示例的用于流水线化从神经网络应用接收的任务以用于在神经网络加速器中执行的流程图。
图5图示了根据示例的用于由神经网络应用提交的任务的流水线。
图6是根据示例的用于调整由神经网络应用提交的任务的流水线的执行的流程图。
图7是根据示例的与流水线化由神经网络应用提交的任务相对应的时序图。
图8是描绘了根据示例的用于实现神经网络的系统的框图。
图9是描绘了根据示例的计算系统的框图。
图10是描绘了根据示例的加速电路的框图。
图11是描绘了根据示例的可编程集成电路(ic)的框图。
图12图示了根据示例的可编程ic的现场可编程门阵列(fpga)实施方式。
为了便于理解,在可能的情况下,相同的附图标记已经用于指定附图中相同的元件。应当设想,一个示例的元件可以有益地并入其他示例中。
具体实施方式
在下文中参考附图对各种特征进行描述。应当指出,附图可以按比例绘制,也可以不按比例绘制,并且在整个附图中,相似结构或功能的元件由相似的附图标记表示。应当指出,附图仅旨在便于特征的描述。它们不旨在作为说明书的详尽描述或对权利要求范围的限制。另外,说明的示例不必具有所示的所有方面或优点。结合特定示例描述的方面或优点不必限于该示例,并且即使未如此示出或未明确描述,也可以在任何其他示例中实践。
本文中的实施例描述了使用库将神经网络应用与神经网络加速器接合的技术。例如,神经网络应用可以在主机计算系统上执行,而神经网络加速器可以在大规模并行硬件系统(例如,fpga、图形处理单元(gpu)或特殊设计的专用集成电路(asic))上执行。在一个实施例中,该库(其还可以被称为加速器与神经网络应用之间的接合引擎或适配器)包括代码,该代码操作用于将从神经网络应用接收的任务提交给神经网络加速器的流水线。在一个实施例中,流水线包括分别对应于不同线程的预处理阶段、fpga执行阶段和后处理阶段。当从神经网络应用接收到任务时,该库将生成分组,该分组包括流水线中不同阶段执行任务所需的信息。因为这些阶段与不同的线程相对应,所以库可以并行处理多个分组。也就是说,库可以在预处理阶段处理第一分组,以及在执行阶段处理第二分组,并且在后处理阶段处理第三分组。这样做可能会增加神经网络加速器在大规模并行硬件系统上的利用率。也就是说,在每个处理周期期间,库可以在执行阶段提交不同的分组(或任务),从而将神经网络加速器正在等待新数据的或库检索已经处理的数据的停机时间降至最低。
在一个实施例中,该库在主机计算系统中的分配给神经网络应用的存储器块与在大规模并行硬件系统中的分配给神经网络加速器的存储器块之间维持存储器映射。该库可以检测到主机计算系统中存储器块的改变,并且自动镜像大规模并行硬件系统中存储器块中的这些改变。在另一示例中,该库可以对大规模并行硬件系统中的存储器块执行一次写入,然后根据该存储器映射使用偏移地址来减少两个系统之间传送的数据量。
在另一实施例中,该库提供关于神经网络加速器的利用率的度量。这些度量可以实时(或有延迟)以视觉方式输出到神经网络的操作员,该操作员然后可以识别流水线的调整。例如,如果神经网络加速器在从预处理阶段获得下一分组之前可以在执行阶段期间完成处理分组,则操作员可以将附加的硬件资源(例如,更大的处理能力)指派给执行预处理阶段的线程以加快流水线的整体执行。
图1图示了根据示例的多层神经网络100。如本文中所使用的,神经网络100是用于机器学习的计算模块,并且基于称为人工神经元的连接单元的大集合,其中神经元之间的连接运送不同强度的激活信号。可以根据示例对神经网络100进行训练,而非对其进行明确编程。在一个实施例中,神经网络100中的神经元连接在各个层中,例如,层1,2,3等,其中数据从第一层(例如,层1)行进到最后一层(例如,层7)。尽管图1中示出了七个层,但是神经网络100可以包括数百或数千个不同的层。
神经网络可以执行任何数目的任务,诸如计算机视觉、特征检测、语音识别等。在图1中,神经网络100检测数字图像中的特征,诸如对图像中的对象进行分类,执行面部识别,识别文本等。为此,图像数据101馈送到神经网络中的第一层中,该第一层执行对应功能(在该示例中为图像数据101的10×10卷积)。然后,该功能的结果传递到下一层,例如,层2,该层在将处理后的图像数据传递到下一层之前执行其功能,依此类推。在由各个层处理之后,在图像分类器102处接收数据,该图像分类器102可以检测图像数据中的特征。
按顺序次序定义各个层,使得在层2之前执行层1,在层3之前执行层2,依此类推。因此,下层与(多个)上层之间存在数据依赖性。尽管层2等待从层1接收数据,但是在一个实施例中,神经网络100可以并行化,使得每个层可以同时地操作。也就是说,在每个时钟周期期间,各个层可以接收新数据,并且输出经处理的数据。例如,在每个时钟周期期间,新图像数据101可以提供给层1。为了简单起见,假设在每个时钟周期期间,新图像提供给层1,并且每个层都可以输出前一时钟周期内接收的图像数据的经处理的数据。如果这些层以硬件实现以形成并行化流水线,则在七个时钟周期之后,层中的每个层同时地运行以处理图像数据(尽管是在七个不同的图像上)。因此,当与一次一个地操作各个层相比较时,以硬件实现各个层以形成并行流水线可以大大提高神经网络的吞吐量。随着神经网络100中的层数的增加,在大规模并行硬件系统中调度各个层的时序益处进一步提高。
图2是根据示例的用于将神经网络加速器165与神经网络应用120接合的系统200。该系统200包括主机105(例如,主机计算系统)和fpga150。尽管具体示出了fpga,但是本文中的实施例可以用于使用库130将托管在任何类型的硬件系统(例如,gpu或asic)上的神经网络加速器165(例如,加速电路或内核加速器电路)与神经网络应用120接合。
主机105包括处理器110和存储器115。处理器110表示任意数目的处理元件,每个处理器元件可以包括任意数目的处理核。存储器115可以包括易失性存储元件、非易失性存储元件及其组合。而且,存储器115可以跨不同的介质(例如,网络存储或外部硬盘驱动器)分布。
存储器115包括神经网络应用120,其在一个实施例中是由处理器110执行的软件应用;然而,在其他示例中,神经网络应用120可以包括硬件元件。神经网络应用120建立神经网络(例如,图1中所示的神经网络100),该神经网络可以具有执行不同功能(例如,卷积、最大池化、im2col、矩阵乘法等)的任意数目的层。尽管未示出,但是神经网络应用120可以使用神经网络来处理存储在存储器115中或来自外部源的数据(例如,图像数据或音频数据)。例如,主机105可以通信地耦合到门户网站,该门户网站准许用户提交图像,该图像然后由神经网络应用120处理。
在下面的实施例中,神经网络应用120通信地耦合到fpga150上的神经网络加速器165,这可以改善神经网络的性能,例如,使得神经网络能够更快地执行多个层,而非仅仅依赖处理器110。然而,神经网络应用120可以使用与神经网络加速器165的格式不同的格式来处理数据。进一步地,主机105和fpga150的存储器可以是不同的非相干存储器。
库130提供用于将神经网络应用120通信地耦合到神经网络加速器165的方法和操作。该库包括存储器映射140(例如,数据结构或数据库),该存储器映射140将神经网络应用120的分配的存储器块125映射到fpga150中的神经网络加速器165的分配的存储器块175。在一个实施例中,主机105可以为存储要处理的不同图像的神经网络应用120分配大存储器组块(即,分配的块125)。例如,当处理不同的图像时,神经网络应用120可以向库130传送到存储有特定图像的分配的块125中的偏移。使用存储器映射140,库可以识别fpga150中的对应的分配的一个或多个块175。在一个实施例中,库130在主机105和fpga150分配块125和块175之后生成存储器映射140,因此在主机105中的存储器115与fpga150中的存储器170之间可以正确相关与相同图像或音频文件相对应的数据。
另外,库130包括流水线式阶段135,其对要由神经网络加速器165完成的由神经网络应用120提交的任务进行处理。也就是说,不是从神经网络应用120接收任务、而是将任务提交给神经网络加速器165并且等待结果,库130使用流水线式阶段135来并行处理不同阶段的多个任务。在一个实施例中,当接收到新任务时,库130生成包括用于完成任务的数据的分组。在一个实施例中,分组是独立的,使得每个分组可以在阶段135处单独处理,而没有对流水线中其他分组的数据依赖性。如果库130形成具有三个阶段135(例如,预处理阶段、fpga执行阶段和后处理阶段)的流水线,则库130可以使用三个阶段并行处理三个分组(每个分组可以对应于应用120所提交的不同任务)。这样做可以提高神经网络加速器的利用率和神经网络的整体运行时间。
在一个实施例中,库130准许神经网络操作员使用神经网络加速器165,而操作员不必知道如何在fpga150中配置或有效执行神经网络加速器165。也就是说,操作员不需要了解寄存器传送逻辑(rtl),其通常用于配置fpga150中的可编程逻辑155。取而代之的是,库130使用流水线式阶段135和存储器映射140抽象化神经网络应用120与神经网络加速器165之间的通信。而且,库130可以提供可以与不同类型的神经网络(和神经网络应用)一起使用的通用应用程序接口(api),以与神经网络加速器165通信。
存储器115还包括fpga驱动器145,该fpga驱动器145使得能够在主机105与fpga150之间进行通信。在一个实施例中,fpga驱动器145使得库130及其对应功能和运算符能够与fpga150进行通信。而且fpga驱动器145可以接收(或请求)关于fpga150中的硬件的度量,诸如可编程逻辑155和存储器170的利用率。在一个实施例中,库130可以使用这些度量来输出神经网络加速器165的利用率的视觉表示,该视觉表示可以在调整流水线式阶段135时帮助操作员以增加吞吐量。
fpga150包括可编程逻辑155和存储器170。可编程逻辑155可以包括可编程逻辑块的阵列以及使得逻辑块能够通信地耦合的可重配置互连的层次。在图2中,可编程逻辑155形成一个或多个内核160,每个内核可以执行一个或多个神经网络加速器165。在一个示例中,神经网络加速器165包括dsp块,当对神经网络执行卷积时,该dsp块是有用的。在另一实施例中,加速器165将接收的图像数据转换成2d矩阵(称为im2col),使得矩阵乘法可以用于执行卷积。然而,神经网络应用120可以将其他类型的神经网络功能卸载到神经网络加速器165,诸如最大池化(其可以放大图像中的特征,因此当缩放图像时,特征不会丢失),整流线性单元(relu)(其是激活函数或斜坡函数)等。
存储器170可以包括易失性存储器元件和非易失性存储器元件,诸如ddrram。当在神经网络应用120之间建立通信时,fpga150将分配的块175指派给神经网络加速器165。然而,因为fpga150中的存储器170可能不与主机105中的存储器115共享,所以用于分配的块175的地址不与主机105中的分配的块125的地址相对应。此外,分配的块125和175可能不是存储器中的连续块,或者可以在不同的时间被指派。如上文所提及的,库130包括存储器映射140,其可以将分配的块125和175中的各个块映射到彼此。因此,当库130接收到位于分配的块125中的地址a处的图像的任务时,库130可以将该地址转换为分配的块175中的地址b,用于执行该任务。同样,当从分配的块175读取结果时,库130可以将地址映射到对应的目的地地址,用于将结果存储在分配的块125中。
图3图示了根据示例的神经网络应用120与神经网络加速器165之间的通信流程300。如所示出的,库130和fpga驱动器145在通信流程300中位于神经网络应用120与神经网络加速器165之间。因此,神经网络应用120向给库130提交任务,该库130又使用fpga驱动器145生成读取/写入命令,并且将数据传输到神经网络加速器165。
神经网络加速器165可以执行多种操作,诸如im2col205、矩阵乘法210、relu215和最大池化220,以完成由神经网络应用120指派的任务。在一个实施例中,神经网络应用120提交神经网络加速器165的任务,以执行神经网络的单个层,例如,执行10×10卷积或执行最大池化。网络加速器165还可以直接执行诸如卷积之类的操作,而无需经历单独的im2col/矩阵乘法步骤。在另一实施例中,神经网络应用120可以基于每个图像提交任务,在这种情况下,库130和fpga驱动器145指令神经网络加速器165执行神经网络中的所有层以处理图像,而非执行神经网络中的各个层中的一个选择的层。
神经网络加速器165包括逻辑(例如,如果在fpga上实现则为可编程逻辑),其用于执行一个或多个功能,诸如im2col205、矩阵乘法(mm)210、relu215、最大池化220等。在一个实施例中,可以对这些功能进行流水线化,使得形成神经网络加速器165的逻辑块可以并行执行。也就是说,神经网络加速器165中的硬件逻辑可以与库130提供的功能一起并行化。
沿相反方向移动,神经网络加速器165在处理任务之后,将经处理的数据传送到fpga驱动器145,该fpga驱动器145将数据转发到库130。使用一个或多个流水线式阶段,库130处理结果,并且将结果传输到神经网络应用120。在一个实施例中,库130改变当从神经网络应用120向加速器165传输数据时以及从加速器165向应用120传输结果时的格式。库130可以使用流水线式阶段来同时处理多个任务。
图4是根据示例的用于流水线化从神经网络应用接收的任务以在神经网络加速器中执行的方法400的流程图。在框405处,库从神经网络应用接收新任务。在一个实施例中,任务包括主机存储器中的存储器地址,该主机存储器存储神经网络应用想要神经网络加速器处理的数据。存储器地址可以是相对于分配给神经网络应用的存储器块的起始存储器地址的偏移。例如,主机可以向神经网络应用分配大存储器块,然后使用存储器偏移来引用存储器内的子块。
在一个实施例中,库中的存储器映射存储指针,该指针将主机中的分配的存储器子块映射到执行神经网络加速器的fpga中的对应存储器块。例如,神经网络应用可以引用存储在子块中的一个子块中的特定图像。使用存储器映射,该库可以识别fpga中的对应的地址块。因此,存储器映射可以使分配给神经网络应用的主机中的存储器与分配给神经网络加速的fpga中的存储器同步。在一个实施例中,库可以将在分配给神经网络应用的存储器中所做的任何改变镜像到分配给神经网络加速器的存储器。然而,库可以选择何时以及是否将存储器中的改变传播到另一平台。因为ddr存储器传送非常昂贵,所以该库可以最大程度地减少向主机的ddr传送,并且尽可能将数据保持在fpga上。例如,如果神经网络加速器在fpga上顺序地执行四个卷积(例如,conv1->conv2->conv3->conv4),则库可能不会自动地同步所有卷积操作的输入/输出,而是仅将卷积操作中的第一卷积操作和最后卷积操作同步到主机中的存储器。也就是说,主机中的存储器中所做的任何改变都会自动传播到fpga中的对应存储器,反之亦然。在一个实施例中,当在主机和fpga中分配存储器时,库可以填充存储器映射和用于映射存储器的指针。
而且,该库会花费大量时间在主机与fpga之间传送数据。神经网络使用权重来表征网络中神经元之间连接的幅度。用于神经网络的每一层的权重可能会有所不同。因此,当将任务传送到神经网络加速器时,神经网络应用还可以传输一个或多个层的权重。神经网络加速器可以多次执行神经网络(例如,每当接收到新图像时),这可能意味着每当一个或多个层被执行时,库将权重传输到fpga。取而代之的是,在一个实施例中,库在一次传送中发送由神经网络加速器执行的各层的权重。在一个实施例中,该库以大矩阵将权重发送到fpga。当库接收到需要具有不同权重的不同层的新任务时,库可以将偏移传输到矩阵中而非传送权重,从而识别应当使用权重的哪个子集来执行任务。这样,库可以在一次传送中传输权重,然后使用偏移存储器地址来识别矩阵用于中特定任务的相关权重。
在一个实施例中,该库使用存储器映射中的标志来识别哪些数据已经传送到fpga。例如,在将权重传送到fpga之后,库可以标记存储权重的主机中的存储器地址。因此,无论何时神经网络应用将标记的存储器地址发送到库,库都可以确定存储在该存储器地址的数据先前已经发送到fpga。该库可以只发送数据在fpga中存储的对应地址,无需重新发送数据。除了权重之外,库还可以使用标志来指示先前已经传送到fpga的图像数据或音频数据。
在一个实施例中,当分配存储器时,该库将新存储器块保存到使用的集合中,并且当被指令而释放存储器时,该库将这些块从使用的集合移动到未使用的集合。只要有可能,该库就会在分配不同的存储器之前尝试重用未使用的存储器块。换句话说,当接收到用于分配存储器的请求时,库首先尝试从未使用的集合中分配存储器,因为这可以减少对齐的存储器块中存储器碎片的发生。而且,这样做还利用了深度神经网络的特性,其中在每个正向传播中分配的存储器的大小和模式可以相同。
在框410处,库生成第一数据分组,该第一数据分组包含由流水线式阶段用于执行任务的信息。在一个实施例中,数据分组包含流水线式阶段中的每个流水线式阶段执行其工作所需的所有信息。例如,当处理分组时,每个阶段可以在分组中使用一个或多个不同的字段。因此,一个阶段可以使用分组中的第一字段而非第二字段,而另一阶段可以使用第二字段而非第一字段。库可以在分组中填充的字段的非限制性示例包括矩阵尺寸、到权重的存储器偏移、要处理的数据的存储器地址、应当存储结果的存储器地址、到主机存储器中的存储器偏移等等。在一个实施例中,该库可以针对不同的神经网络加速器(例如,不同的内核)定制字段。也就是说,不同类型的加速器或不同内核可能使用不同的字段。
在框415处,库使用与流水线中的每个阶段相对应的线程来处理第一数据分组。在一个实施例中,在其他线程处理其他分组的同时,每个线程(即,每个阶段)可以处理一个分组。这样,流水线可以并行处理与不同任务相对应的不同分组。而且,来自一个流的分组可以与来自其他流的分组并行处理。例如,神经网络应用可以从门户网站接收第一图像流以及保存在本地存储器中的第二图像流。该库可以根据两个流中的图像生成独立分组,这些分组可以由流水线式阶段并行处理。也就是说,因为分组是独立的或彼此独立,所以流水线可以并行处理来自不同源的分组。
图5图示了根据示例的用于由神经网络应用提交的任务的流水线500。流水线500包括三个阶段:预处理阶段、fpga执行阶段和后处理阶段。每个分组通过每个阶段,但是在其他实施例中,一些分组可以跳过阶段中的一个或多个阶段。例如,可以格式化一个分组中的数据,使得库无需执行预处理阶段和后处理阶段。
在图5中,在时间段a-f期间,流水线500对四个分组进行处理。在时间段a期间,分组a由与预处理阶段相对应的线程处理。在时间段b期间,预处理阶段(其已经完成对分组a的处理)对分组b进行处理,而fpga执行阶段则对分组a进行处理。在时间段c期间,预处理阶段与fpga执行阶段对分组b进行处理和后处理阶段对分组c进行处理并行对分组c进行处理。只要从神经网络应用接收到新任务,流水线500就可以在每个时间段期间并行处理三个分组。
在一个实施例中,根据执行时间最长的阶段来设置时间段的持续时间。换句话说,库等待直到该时间段期间的所有阶段都已完成,然后再将分组传递到流水线中的下一阶段并且开始后续时间段。例如,如果预处理阶段完成时间最长,则库等待到该阶段完成,然后再移动到下一时间段,这意味着fpga执行阶段和后处理阶段已经完成并且处于空闲状态。在一个实施例中,阶段的持续时间可以变化,这可以导致时间段的持续时间改变。也就是说,在时间段c期间,fpga执行阶段耗费最长的时间用于执行,但是在时间段d期间,后处理阶段耗费最长的时间用于执行。
在一个实施例中,库使用锁定功能来控制各阶段之间以及新时间段开始时的分组流动。例如,当预处理线程完成对分组的处理后,该线程可以锁定fpga执行线程的输入队列。虽然被锁定,但是线程可以将处理分组的结果从预处理线程的输出缓冲器移动到fpga执行阶段的输入队列,解锁队列,并且发信号通知fpga执行阶段的线程准备好处理下一分组。锁定阶段减轻了当在阶段之间切换分组时数据可能损坏的可能性。
在一个实施例中,预处理阶段将从神经网络应用接收的数据更改为可以由执行神经网络加速器的硬件处理的格式。在一个示例中,神经网络应用可以对浮点格式(例如,32位浮点)的数据进行处理,但是fpga中的硬件逻辑对定点值(例如,16位或8位定点)进行操作。预处理阶段将浮点值转换为可以由神经网络加速器处理的定点值。
而且,预处理阶段可以将从神经网络应用接收的数据转换为矩阵格式(例如,32×64数据块)。数据的矩阵可以帮助在fpga执行阶段期间并行执行神经网络加速器的操作。一旦完成了预处理阶段,分组中的数据就以某个格式进行排列,该格式可以由fpga中的硬件逻辑更轻松地进行处理。
在fpga执行阶段期间,对应的线程将分组(或其中的数据的一部分)传输到fpga。例如,用于执行阶段的线程可以传输分组的字段(例如,存储器地址),其指示对应的数据和权重在存储器中存储的位置。在一个实施例中,用于fpga执行阶段的线程执行将分组的一部分写到fpga中的适当存储器中(使用存储器映射),监测执行神经网络加速器的内核,并且执行读取以从fpga的存储器中取回经处理的结果。在一个实施例中,线程使用排队命令将数据移动到fpga,指令一个或多个内核执行,并且从与内核相对应的缓冲器中读取结果。这样,fpga执行阶段的线程(其在主机上操作)可以将命令传输到fpga,以便于控制和监测神经网络加速器。一旦完成了神经网络加速器并且取回结果,fpga执行阶段的线程就将更新的分组传递到后处理阶段。
在一个实施例中,后处理阶段将分组中的数据从fpga使用的数据格式转换为神经网络应用所使用的数据格式。例如,后处理阶段的线程相对于预处理阶段执行反向转换。例如,fpga的结果可以从定点值转换为浮点值。而且,线程可能不再将数据以矩阵存储。
在完成了后处理阶段后,该库将相关数据存储在主机存储器中,并且通知神经网络应用该任务已完成。在一个实施例中,库仅将分组的一部分保存到存储器中。例如,分组中的字段可以仅由流水线式阶段使用,因此,当分组已经遍历了流水线500时,将这些字段丢弃。
虽然图5图示了包括三个阶段的流水线500,但是库可以建立包括任何数目的阶段的流水线。例如,对于一些神经网络应用,该库可能仅使用fpga执行阶段和后处理阶段。对于其他应用,该库可能包括具有三个以上阶段的流水线,其中分组在同一fpga或不同fpga中的不同神经网络加速器之间传递。
返回到方法400,在框420处,库在对第一数据分组进行处理的同时使用线程来对其他分组进行处理。也就是说,图5所示的流水线500可以对多个线程进行并行处理。因此,在预处理阶段对第一分组进行处理的同时,fpga执行阶段和后处理阶段同时对其他分组进行处理(假设神经网络应用已经提交了多个任务)。结果,流水线可以减少停机时间并且提高执行神经网络加速器的内核的利用率。例如,一旦神经网络加速器完成对当前分组的处理,预处理阶段所处理的分组就可以传送到fpga,以便神经网络加速器可以立即开始处理该分组。
在框425处,库使用神经网络加速器将处理第一分组的结果返回给神经网络应用。也就是说,一旦第一分组遍历了流水线(例如,预处理阶段、fpga执行阶段和后处理阶段),库就可以将结果存储到神经网络应用的分配的存储器中并且向该应用指示任务已经完成。因为阶段为流水线式,所以库可以对多个任务(或分组)进行并行处理。因此,在每个时间段结束时,库可以将完成任务的结果传送到神经网络应用。如果未对阶段进行流水线化,则库必须等待任务完成后才能启动神经网络应用所提交的新任务。在这种情况下,当库执行预处理操作和后处理操作时,神经网络加速器处于空闲状态。
图6是根据示例的用于调整由神经网络应用提交的任务的流水线的执行的方法600的流程图。在框605处,库获得关于神经网络加速器的执行的度量。在一个实施例中,该库与fpga驱动器通信,该fpga驱动器准许该库监测fpga中的硬件元件。例如,驱动器可以将度量报告给库,诸如执行神经网络加速器的内核或计算节点何时开始执行以及工作完成前需要多长时间。此外,驱动器可以报告对存储器的读取和写入以及读取和写入花费多长时间(其依据正在被读取或被写入的数据的量而有所不同)。
在一个实施例中,库可以向驱动器请求该数据。备选地,驱动器可以自动地监测用于fgpa的硬件接口,并且将这些度量报告给库。
在框610处,库以实时图形显示度量。在一个实施例中,该库输出图表,该图表指示执行fpga中的神经网络加速器的一个或多个内核的利用率。该图表使得神经网络的操作员能够可视化内核的利用率,并且识别改进由库所建立的流水线的方式。
图7是根据示例的与流水线化由神经网络应用提交的任务相对应的时序图700。图表700包括用于使用内核a对分组进行处理的读取705、ddr写入710和ddr写入715以及用于使用内核b对分组进行处理的读取720、ddr写入725和ddr写入730。在该实施例中,fpga包括两个内核,这两个内核可以并行执行两个神经网络加速器。换句话说,在流水线的fpga执行阶段期间,库可以提交任务以由内核a和b并行执行。
此外,在该实施例中,库将一批任务提交给内核。本文中,该库将八个任务或分组作为一批提交给内核中的每个内核。内核进而依次地对八个任务进行处理。例如,ddr写入710可以包括n个点,其表示用于将n个任务的数据写入到分配给内核a和对应的神经网络加速器的存储器中的库。同样,ddr写入725还包括相同的n个点,其表示写入到分配给内核b的存储器中的不同批的n个任务。ddr写入715指示来自由库生成的分组的信息被传送到fpga的时间。
内核a的圆圈和内核b的x指示这些内核何时开始处理任务,而线指示这些任务所花费的时间的长度。如所示出的,内核几乎一直在执行任务。也就是说,内核具有很高的利用率。这点在视觉上通过内核完成一项任务与开始一项新任务之间几乎没有空间(或间隙)的事实得以表明。
读取705和720示出了库何时从处理任务的内核中取回结果。读取705包括n个方形,其指示由内核a提供的读取结果,而读取720包括n个加号,其指示由内核b提供的读取结果。这样,图表700使内核a和b的利用以及对存储器的读取和写入可视化,从而可以帮助神经网络的操作员确定在内核上执行的神经网络加速器的利用或效率。
在一个实施例中,库实时更新图表700。也就是说,该库可以在执行内核并且执行读取和写入时生成图表(从左到右)。因此,操作员可以观看图表700正在被生成。在一个实施例中,操作员可以放大图表或及时移回图表以查看过去结果。
尽管显示了时序图,但可以其他方式显示fpga中的内核和ddr存储器的度量。该库可以输出利用百分比,其指示空闲时间与执行时间的比例,而不是时序图。在另一示例中,该库可以输出条形图,该条形图说明了内核的平均利用。
返回到方法600,在框615处,库从神经网络的操作员接收优化参数,该优化参数更改了流水线阶段的执行。当查看图表700时,操作员可能已经识别出预处理阶段的执行时间通常比fpga执行阶段和后处理阶段的执行时间更长。结果,内核可能在等待预处理阶段时处于空闲状态,使得可以提交新分组(或分组批)以供神经网络加速器处理。作为响应,操作员可以提供优化参数,该参数可以更改流水线阶段中的一个或多个流水线阶段的执行时间。在该示例中,优化参数可以减少预处理阶段的持续时间。
在一个实施例中,优化参数是指派以执行流水线阶段的线程的硬件资源的数量。例如,如果预处理阶段的执行时间始终需要比流水线中的其他阶段的更长的执行时间,则操作员可以在主机中指派其他处理核以执行预处理阶段。这样做可以减少其持续时间,使得就平均而言,预处理阶段的持续时间与其他阶段的持续时间短。结果,流水线的总执行时间可能会减少,fpga中内核的利用可能会增加。
在另一示例中,优化参数可以包括向执行流水线式阶段的线程指派更多虚拟存储器,或者使得线程能够使用更快的存储器元件或通信总线。例如,可以通过准许库和驱动器使用更快的主机到fpga通信方案(例如,pcie)来增加fpga执行阶段的持续时间。
在框620处,库根据接收的优化参数调整用于执行流水线的线程的硬件资源,以增加神经网络加速器的利用。如上文所提及的,该库可以增加指派给执行流水线式阶段中的一个流水线式阶段的线程的处理核的数目,准许线程使用更快的存储器元件,或者实现主机与fpga之间的更快的通信路径。
在一个实施例中,调整硬件资源更紧密地对齐于流水线中的阶段的持续时间。换句话说,该库可以调整阶段的持续时间,使得它们更相等,这意味着可以更有效地利用fpga。这样做可能会增加阶段中的一些阶段的持续时间。例如,如果后处理阶段的持续时间短于fpga执行阶段,但预处理阶段的持续时间长于fpga执行阶段,则操作员可以将先前被指派以执行后处理阶段的处理核指派给预处理阶段。结果,后处理阶段的持续时间增加,而预处理阶段的持续时间减少。但是,如果这些持续时间与fpga执行阶段的持续时间相同,则流水线的总执行时间和执行神经网络加速器的内核的利用都会增加。
在一个实施例中,该库包括调试功能,该调试功能用于在向外部神经网络加速器或向主机的提交任务之间进行切换。例如,当调试时,库可以使用主机上的处理器执行任务,而非将任务提交给fpga。这可能会花费更多时间,但是这样做可以确定问题是由神经网络的设计还是由神经网络加速器的设计引起。换句话说,通过将任务提交给主机,操作员可以确定是否任何错误是由于在fpga上执行任务而导致。这样,主机处理器可以用作调试fgpa功能的基线。在一个实施例中,该库将相同的任务提交给fpga上的神经网络加速器和主机上的处理器,并且比较结果。
图8是描绘了根据示例的用于实现神经网络的系统800的框图。系统800包括计算机系统802和一个或多个计算机系统808。计算机系统802包括传统计算部件,其被配置为执行提供一个或多个设计工具804的软件。每个计算机系统808执行一个或多个神经网络810(如同在上述示例中的任一示例中一样)。(多个)神经网络810使用应用812(如同在上述示例中的任一示例中一样)、加速库814(如同在上述示例中的任一示例中一样)和一个或多个硬件加速器816(如同在上述示例中的任一示例中一样)来实现。
在一个示例中,(多个)硬件加速器816包括可编程ic,诸如fpga。加速库814提供与(多个)硬件加速器816接合的api。加速库814还可以包括提供神经网络功能的库,该神经网络功能包括神经网络层和其他类型的神经网络结构的预先定义和优化的实现方式。因此,(多个)神经网络810可以包括在(多个)硬件加速器816中实现的硬件部分以及在加速库814中实现的软件部分两者。应用812调用加速库814的api以编程和控制(多个)硬件加速器816以实现(多个)神经网络816。
设计人员与(多个)设计工具804交互以定义(多个)神经网络810。(多个)设计工具804可以生成用于对(多个)硬件加速器816进行编程的文件(例如,fpga的配置位流)、提供加速库814的文件、以及提供应用812的文件。设计人员可以使用寄存器传送语言(rtl)或使用编程语言(诸如c、c 、opencl等)或rtl和(多个)可编程语言的组合来定义(多个)神经网络810的硬件部分。用户可以使用诸如c、c 、opencl等之类的编程语言来定义(多个)神经网络810的软件部分。(多个)设计工具804编译软件定义的神经网络以生成用于对(多个)硬件加速器816进行编程的文件和用于加速库814的库文件。设计人员可以利用提供类别库、模板库等的库106来帮助开发(多个)神经网络810的硬件和软件部分。
用户可以使用编程语言(例如,c、c 、python等)定义应用812。用户可以利用神经网络框架和库,诸如caffe、tensorflow、mxnet等。
图9是描绘了根据示例的计算系统808的框图。计算系统808包括硬件904和在硬件904上执行的软件906。硬件904包括处理系统910、系统存储器916、存储设备(“存储918”)和硬件加速器816。软件906包括操作系统(os)944、加速库814和应用812。
处理系统910包括微处理器912、支持电路914和外围总线915。微处理器912可以是任何类型的通用中央处理单元(cpu),诸如基于x86的处理器、基于
系统存储器916是允许诸如可执行指令和数据之类的信息被存储和取回的设备。系统存储器916可以包括例如一个或多个随机存取存储器(ram)模块,诸如双倍数据速率(ddr)动态ram(dram)。存储设备918包括本地存储设备(例如,一个或多个硬盘、闪存模块、固态盘和光盘)和/或使得计算系统808能够与一个或多个网络数据存储系统进行通信的存储接口。硬件904可以包括各种其他传统设备和计算系统的外围设备,诸如图形卡、通用串行总线(usb)接口等。
硬件加速器816包括可编程ic928、非易失性存储器924和ram926。可编程ic928可以是fpga等、或者具有fpga等的soc。nvm924可以包括任何类型的非易失性存储器,诸如闪存等。ram926可以包括ddrdram等。可编程ic928耦合到nvm924和ram926。可编程ic928还耦合到处理系统910的外围总线915。
os914可以是本领域中已知的任何商业操作系统,诸如
在操作中,可编程ic928配置有加速电路930。在一个示例中,加速电路930是图2中的神经网络加速器165,但是本文中的实施例不限于此,并且可以是其他类型的神经网络加速器或其他类型的硬件加速器。加速电路930通常包括基础平台930a和内核930b。例如,可以使用静态区域934和可编程区域936来实现加速电路930。静态区域934包括支持电路940,其用于提供到外围总线915、nvm924和ram926的接口。区域936可以包括一个或多个内核电路(“(多个)内核938”)。使用静态区域934实现基础平台930a,并且使用可编程区域936实现内核930b。在另一示例中,还可以使用可编程区域936的一部分来实现基础平台930a。因此,在一些示例中,可编程区域936还包括一些接口电路。在一些示例中,加速电路930可以包括多于一个的可编程区域936,每个可编程区域可以由(多个)内核938被单独地配置。
静态区域934是“静态的”,在于其电路系统在可编程区域936的重新配置中保持恒定。在示例中,支持电路940包括pcie端点电路、直接存储器访问(dma)控制器、互连、存储器控制器、存储器接口电路(例如,ddr接口)、解耦器电路(以支持部分重新配置)、闪存编程器、调试电路等。在一些示例中,可编程区域936不包括任何支持电路940。在其他示例中,一些支持电路在可编程区域936中实现。在这种情况下,可编程区域936可以被称为“扩展可编程区域”。在任一情况下,在一个示例中,静态区域934中总是存在一些支持电路940,诸如pcie电路和dma电路。
图10是描绘了根据示例的加速电路930的框图。加速电路930包括支持电路940和内核938。在示例中,支持电路940包括pcie端点电路(“pcie端点1002”)、pciedma控制器1004、互连电路(“互连1006”)、存储器控制器1010和存储器接口1012。支持电路940可以包括其他电路,为了清楚起见省略了其他电路(例如,解耦器电路、调试电路等)。pcie端点1002提供到外围总线915的物理接口。pciedma控制器1004促进到ram926和内核938的dma操作。互连1006将pciedma控制器1004耦合到存储器控制器1010和内核938。存储器控制器1010被耦合到存储器接口1012。存储器接口1012被耦合到ram926。
在操作中,加速库946可以直接通过pciedma控制器1004访问ram926。加速库946还可以通过pciedma控制器1004访问内核938。内核938可以通过存储器控制器1010访问ram926。可以使用系统存储器916与ram926之间的dma操作在软件906与内核938之间交换数据。
在该示例中,内核938使用接口1030,1031和1032与互连1006通信。具体地,这些接口可以包括第一读取接口1030、第二读取接口1031和读取/写入接口1032。例如,读取接口1030可以用作控制内核938的控制接口。读取接口1031可以用于通过存储器接口1012中的第一存储器接口从ram926读取。读取/写入接口1032可以用于通过存储器接口1012中的第二存储器接口从ram926读取和写入。
内核938包括互连接口1004、控制逻辑1042和处理电路1041。处理电路1041包括im2col电路(“im2col1044”)、读取控制电路(“读取控制1046”)、多路复用器1056、第一先进先出电路(“fifo1058”)、dsp阵列1062、缩放器电路(“缩放器1064”)、最大池化电路(“最大池化1066”)、多路复用器1068、fifo1054、写入控制电路(“写入控制1052”)、高速缓存1048、读取控制电路(“读取控制1050”)和fifo1060。互连接口1040被耦合到接口1030,1031和1032、控制逻辑1042和处理电路1041。互连接口1040可以包括开关、时钟转换器等,以促进逻辑1042与接口1030之间以及处理电路1041与接口1031和1032之间的通信。
在该示例中,互连接口1040被耦合到im2col电路1044、读取控制电路1046、高速缓存1048和写入控制电路1052的输入。im2col电路1044和读取控制电路1046的输出被耦合到多路复用器1056的输入。多路复用器1056的输出被耦合到fifo1056的输入。fifo1056的输出被耦合到计算阵列1062的输入。高速缓存1048的输出被耦合到读取控制电路1050的输入。读取控制电路1050的输出被耦合到fifo1060的输入。fifo1060的输出被耦合到计算阵列1062的第二输入。计算阵列1062的输出被耦合到缩放器1064的输入。缩放器1064的输出被耦合到最大池化电路1066的输入和多路复用器1068的输入。最大池化电路1066的输出被耦合到多路复用器1068的输入。多路复用器1068的输出被耦合到fifo1054的输入。fifo1054的输出被耦合到写入控制电路1052。
在操作中,计算阵列1062执行矩阵乘法操作以实现神经网络。计算阵列1062的输入从fifo1058接收输入激活矩阵,并且从fifo1060接收权重矩阵。可以使用读取控制电路1046直接从ram926读取输入激活矩阵。备选地,可以从ram926读取输入激活并且由im2col电路1044处理以输入到计算阵列1062。下文对im2col电路1044的实施例进行描述。权重矩阵可以由读取控制电路1050从ram926读取,并且缓存在高速缓存1048中。缩放器1064可以缩放计算阵列1062的输出。最大池化电路1066可以在计算阵列1062的经缩放的输出上实现最大池化功能。在一个示例中,最大池化电路966使用可配置逻辑块(clb)或其他可配置逻辑来实现。最大池化电路1066或缩放器1064的输出可以被存储在fifo1054中。写入控制电路1052将fifo中的数据写入ram926。控制逻辑1042控制处理电路1041中的各个电路,诸如im2col电路1044、读取控制电路1046、多路复用器1056和1068、读取控制电路1050和缩放器1064、最大池化电路1066和写入控制电路1052。
图11是描绘了根据示例的可编程ic928的框图。可编程ic228包括可编程逻辑3、配置逻辑25和配置存储器26。可编程ic928可以被耦合到外部电路,诸如nvm924、ram926和其他电路29。可编程逻辑3包括逻辑单元30、支持电路31和可编程互连32。逻辑单元30包括可以被配置为实现多个输入的通用逻辑功能的电路。支持电路31包括专用电路,诸如收发器、输入/输出块、数字信号处理器、存储器等。逻辑单元和支持电路31可以使用可编程互连32互连。用于对逻辑单元30进行编程,用于设置支持电路31的参数以及用于对可编程互连32进行编程的信息由配置逻辑25存储在配置存储器26中。配置逻辑25可以从非易失性存储器924或任何其他源(例如,dram28或从其他电路29)获得配置数据。在一些示例中,可编程ic928包括处理系统2。处理系统2可以包括(多个)微处理器、存储器、支持电路、io电路等。例如,处理系统2可以包括与处理系统910类似的电路。在一些示例中,可以使用处理系统2来代替处理系统910。在这种情况下,可以使用可编程ic928来实现整个计算系统808,其中软件906在处理系统2上执行。
图12图示了可编程ic928的fpga实现方式,其中包括大量不同的可编程图块,其包括收发器37、clb33、bram34、输入/输出块(“iob”)36、配置和时钟逻辑(“config/clocks”)42、dsp35、专用输入/输出块(“i/o”)41(例如,配置端口和时钟端口)、以及其他可编程逻辑39(诸如数字时钟管理器、模数转换器、系统监测逻辑等)。fpga还可以包括pcie接口40、模数转换器(adc)38等。
在一些fpga中,每个可编程图块可以包括至少一个可编程互连元件(“int”)43,其具有到相同图块内的可编程逻辑元件的输入和输出端子48的连接,如图12的顶部包括的示例所示。每个可编程互连元件43还可以包括到同一图块或(多个)其他图块中的(多个)相邻可编程互连元件的互连段49的连接。每个可编程互连元件43还可以包括到逻辑块(未示出)之间的通用路由资源的互连段50的连接。通用路由资源可以包括逻辑块(未示出)之间的路由通道,该路由通道包括互连段(例如,互连段50)的轨道和用于连接互连段的切换块(未示出)。通用路由资源的互连段(例如,互连段50)可以跨越一个或多个逻辑块。可编程互连元件43与通用路由资源一起实现了用于所图示的fpga的可编程互连结构(“可编程互连”)。
在示例实现方式中,clb33可以包括可配置逻辑元件(“cle”)44,其可以被编程为实现用户逻辑以及单个可编程互连元件(“int”)43。除了一个或多个可编程互连元件之外,bram34还可以包括bram逻辑元件(“brl”)45。通常,图块中包括的互连元件的数目取决于图块的高度。在所图示的示例中,bram图块具有与五个clb相同的高度,但是还可以使用其他数目(例如,四个)。除了适当数目的可编程互连元件之外,dsp图块35还可以包括dsp逻辑元件(“dspl”)46。除了可编程互连元件43的一个实例之外,iob36还可以包括例如输入/输出逻辑元件(“iol”)47的两个实例。本领域技术人员应当清楚,例如连接到i/o逻辑元件47的实际i/o板通常不局限于输入/输出逻辑元件47的区域。
在所图示的示例中,管芯的中心附近的水平区域(如图12所示)用于配置、时钟和其他控制逻辑。从该水平区域或列延伸的竖直列51用于跨fpga的整个宽度分布时钟和配置信号。
利用图12所图示的体系架构的一些fpga包括附加逻辑块,这些逻辑块破坏了构成fpga很大一部分的规则柱状结构。附加逻辑块可以是可编程块和/或专用逻辑。
应当指出,图12仅旨在说明示例性fpga体系架构。例如,图12顶部处包括的一行中逻辑块的数目、行的相对宽度、行的数目和次序、行中包括的逻辑块的类型、逻辑块的相对大小、以及互连/逻辑实现方式纯粹是示例性的。例如,在实际fpga中,无论clb出现在何处,通常都包括一个以上的相邻clb行,以促进用户逻辑的有效实现,但是相邻clb行的数目随fpga的整体大小而变化。
前面参考了本公开所提出的实施例。然而,本公开的范围不限于特定描述的实施例。相反,可以设想本文中所描述的特征和元件的任何组合,无论是否与不同的实施例有关,都可以实现和实践所设想的实施例。更进一步地,尽管本文中所公开的实施例可以实现优于其他可能的解决方案或优于现有技术的优点,但是通过给定实施例是否实现特定优点并不限制本公开的范围。因此,除非在(多项)权利要求中明确叙述,否则本文中所描述的方面、特征、实施例和优点仅是说明性的,并且不被认为是所附权利要求的要素或限制。同样,对“本发明”的引用不应解释为本文中所公开的任何发明主题的概括,并且除非在一项或多项权利要求中明确叙述,否则不应认为是所附权利要求的要素或限制。
本文中所描述的各个方面可以采取以下形式:完全硬件实施例、完全软件实施例(包括固件、驻留软件、微代码等)或结合了软件和硬件方面的实施例,其在本文中通常都被称为“模块”或“系统”。
本发明可以是系统、方法和/或计算机程序产品。该计算机程序产品可以包括其上具有用于使处理器执行本发明的各个方面的计算机可读程序指令的计算机可读存储介质。
该计算机可读存储介质可以是有形设备,该有形设备可以保留和存储由指令执行设备使用的指令。计算机可读存储介质可以是例如但不限于电子存储设备、磁存储设备、光存储设备、电磁存储设备、半导体存储设备、或任何合适前述的组合。计算机可读存储介质的更具体示例的非详尽列表包括以下各项:便携式计算机磁盘、硬盘、随机存取存储器(ram)、只读存储器(rom)、可擦可编程只读存储器(eprom或闪存)、静态随机存取存储器(sram)、便携式光盘只读存储器(cd-rom)、数字多功能磁盘(dvd)、记忆棒、软盘、机械编码设备(诸如打孔卡或凹槽中的凸起结构,其上记录有指令)、以及任何合适前述的组合。如本文中所使用的,计算机可读存储介质不应被理解为本身是瞬时信号,诸如无线电波或其他自由传播的电磁波、通过波导或其他传输介质传播的电磁波(例如,穿过光缆的光脉冲)、或通过电线传输的电信号。
本文中所描述的计算机可读程序指令可以从计算机可读存储介质下载到相应的计算/处理设备,或者经由网络(例如,互联网、局域网、广域网和/或无线网络)下载到外部计算机或外部存储设备。该网络可以包括铜传输电缆、光传输纤维、无线传输、路由器、防火墙、交换机、网关计算机和/或边缘服务器。每个计算/处理设备中的网络适配器卡或网络接口从网络接收计算机可读程序指令,并且转发计算机可读程序指令以存储在相应的计算/处理设备内的计算机可读存储介质中。
用于执行本发明的操作的计算机可读程序指令可以是汇编程序指令、指令集架构(isa)指令、机器指令、机器相关指令、微代码、固件指令、状态设置数据、或结合一种或多种编程语言(包括面向对象的编程语言,诸如smalltalk、c 等)和常规过程式编程语言(诸如“c”编程语言或类似编程语言)的任意组合编写的源代码或对象代码用代码。计算机可读程序指令可以完全在用户计算机上、作为独立软件包部分在用户计算机上、、部分在用户计算机上并且部分在远程计算机上或完全在远程计算机或服务器上而执行。在后一场景中,远程计算机可以通过任何类型的网络(包括局域网(lan)或广域网(wan))连接到用户的计算机,或者可以与外部计算机建立连接(例如,通过使用互联网服务提供商的互联网)。在一些实施例中,包括例如可编程逻辑电路、现场可编程门阵列(fpga)或可编程逻辑阵列(pla)的电子电路系统可以通过利用计算机可读程序指令的状态信息来执行计算机可读程序指令来使电子电路系统个性化,以便执行本发明的各个方面。
本文中参考根据本发明的实施例的方法、装置(系统)和计算机程序产品的流程图和/或框图对本发明的各方面进行了描述。应当理解,流程图图示和/或框图的每个框以及流程图图示和/或框图中的各个框的组合可以通过计算机可读程序指令来实现。
这些计算机可读程序指令可以提供给通用计算机、专用计算机或其他可编程数据处理装置的处理器,以产生机器,使得经由计算机或其他可编程数据处理装置的处理器执行的该指令产生用于实现流程图和/或一个或多个框图方框中指定的功能/动作的器件。这些计算机可读程序指令还可以被存储在计算机可读存储介质中,该计算机可读存储介质可以指导计算机、可编程数据处理装置和/或其他设备以特定方式起作用,使得其中存储有指令的计算机可读存储介质包括制品,该制品包括实现在流程图和/或一个或多个框图方框中指定的功能/动作的各方面的指令。
计算机可读程序指令还可以被加载到计算机、其他可编程数据处理装置或其他设备上,以使得一系列操作步骤在计算机、其他可编程装置或其他设备上被执行以产生计算机实现的过程,使得在计算机、其他可编程装置或其他设备上执行的指令实现了流程图和/或一个或多个框图方框中指定的功能/动作。
附图中的流程图和框图图示了根据本发明的各个实施例的系统、方法和计算机程序产品的可能实施方式的体系架构、功能和操作。就这点而言,流程图或框图中的每个方框可以表示指令的模块、段或部分,其包括用于实现(多个)指定逻辑功能的一个或多个可执行指令。在一些备选实现方式中,框中指出的功能可以不按图中指出的次序发生。例如,依据所涉及的功能,实际上可以基本上同时执行连续示出的两个框,或者有时可以以相反次序执行这些框。还应当指出,框图和/或流程图的每个框以及框图和/或流程图的各个框的组合可以由执行指定功能或动作或执行专用硬件和计算机指令的组合的基于专用硬件的系统来实现。
虽然前述内容针对特定示例,但是在不脱离其基本范围的情况下,可以设计其他或另外的示例,并且其范围由所附权利要求确定。
1.一种用于将提交给神经网络加速器的任务流水线化方法,所述方法包括:
从神经网络应用接收要由所述神经网络加速器处理的第一任务;
使用一个或多个计算机处理器来生成分组,所述分组包含流水线中的多个阶段所使用的信息;
在所述多个阶段处对所述分组进行处理,其中所述多个阶段中的至少一个阶段执行对执行所述神经网络加速器的硬件系统的调用,并且其中所述流水线与处理所述分组并行地处理与第二任务相对应的至少一个其他分组;以及
使用所述流水线将处理所述分组的结果返回给所述神经网络应用。
2.根据权利要求1所述的方法,其中在所述多个阶段处对所述分组进行处理包括:
在预处理阶段处对所述分组进行处理;
在所述预处理阶段之后发生的执行阶段对所述分组进行处理,其中对所述硬件系统的所述调用在所述执行阶段期间发生;以及
在所述执行阶段之后的后处理阶段处对所述分组进行处理。
3.根据权利要求2所述的方法,其中在所述预处理阶段处对所述分组进行处理包括:
将与所述第一任务相对应的数据从所述神经网络应用所使用的第一格式转换为所述硬件系统所使用的第二格式,
其中在所述后处理阶段处对所述分组进行处理包括:将所述结果从所述第二格式转换为所述第一格式。
4.根据权利要求1所述的方法,其中所述多个阶段中的每个阶段包括独立于其他线程处理所述分组的相应的线程。
5.根据权利要求1所述的方法,还包括:
生成存储器映射,所述存储器映射将用于所述神经网络应用的分配的存储器块映射到所述硬件系统中的用于所述神经网络加速器的分配的存储器块;以及
将基于所述存储器映射的从所述神经网络应用接收的第一存储器地址转换为所述硬件系统中的所述存储器块的第二存储器地址。
6.根据权利要求1所述的方法,还包括:
以矩阵格式将用于执行神经网络的多个层的权重传送到所述硬件系统;
识别与新任务相对应的所述权重的子集;以及
向所述硬件系统传输指示当处理所述分组时要使用的所述权重的所述子集的偏移。
7.根据权利要求1所述的方法,还包括:
获得关于在所述硬件系统上的所述神经网络加速器的执行的度量;
输出用于显示的所述度量的视觉表示;以及
调整执行所述流水线中的所述多个阶段的硬件资源,以增加所述神经网络加速器的利用。
8.根据权利要求1所述的方法,其中在库中定义所述流水线中的所述多个阶段,其中所述库包括应用程序接口api,所述应用程序接口被配置为准许不同类型的神经网络应用使用所述流水线中的所述多个阶段来向所述神经网络加速器提交任务。
9.一种计算系统,包括:
处理器;以及
存储器,包括库,其中所述库在由所述处理器执行时,执行以下操作:
从神经网络应用接收要由神经网络加速器处理的第一任务;
使用一个或多个计算机处理器来生成分组,所述分组包含流水线中多个阶段所使用的信息;
在所述多个阶段处对所述分组进行处理,其中所述多个阶段中的至少一个阶段执行对执行所述神经网络加速器的硬件系统的调用,其中所述流水线与处理所述分组并行地处理与第二任务相对应的至少一个其他分组;以及
将使用所述流水线处理所述分组的结果返回给所述神经网络应用。
10.根据权利要求9所述的计算系统,其中在所述多个阶段处对所述分组进行处理包括:
在预处理阶段处对所述分组进行处理;
在所述预处理阶段之后发生的执行阶段对所述分组进行处理,其中对所述硬件系统的所述调用在所述执行阶段期间发生;以及
在所述执行阶段之后的后处理阶段对所述分组进行处理。
11.根据权利要求10所述的计算系统,其中在所述预处理阶段处对所述分组进行处理包括:
将与所述第一任务相对应的数据从所述神经网络应用所使用的第一格式转换为所述硬件系统所使用的第二格式,
其中在所述后处理阶段处对所述分组进行处理包括:将所述结果从所述第二格式转换为所述第一格式。
12.根据权利要求9所述的计算系统,其中所述操作还包括:
生成存储器映射,所述存储器映射将用于所述神经网络应用的分配的存储器块映射到所述硬件系统中的用于所述神经网络加速器的分配的存储器块;以及
将基于所述存储器映射的从所述神经网络应用接收的第一存储器地址转换为所述硬件系统中的存储器块的第二存储器地址。
13.根据权利要求9所述的计算系统,其中所述操作还包括:
以矩阵格式将用于执行神经网络的多个层的权重传送到所述硬件系统;
识别与新任务相对应的所述权重的子集;以及
向所述硬件系统传输指示当处理所述分组时要使用的所述权重的所述子集的偏移。
14.根据权利要求9所述的计算系统,其中所述操作还包括:
获得关于在所述硬件系统上的所述神经网络加速器的执行的度量;
输出用于显示的所述度量的视觉表示;以及
调整执行所述流水线中的所述多个阶段的硬件资源,以增加所述神经网络加速器的利用。
15.根据权利要求9所述的计算系统,其中在所述库中定义所述流水线中的所述多个阶段,其中所述库包括api,所述api被配置为准许不同类型的神经网络应用使用所述流水线中的所述多个阶段来向所述神经网络加速器提交任务。
技术总结