基于FPGA的Tensorflow系统加速的设计方法与流程

文档序号:17066200发布日期:2019-03-08 22:56阅读:2292来源:国知局
基于FPGA的Tensorflow系统加速的设计方法与流程

本发明涉及异构计算开发领域,具体是,一种将tensorflow人工智能系统中一些本身由cpu实现的算子,改用现场可编程门阵列(以下简称fpga)来进行实现。



背景技术:

随着人工智能的发展,深度神经网络已经在计算机视觉、自然语言处理和其他跨学科研究领域日益普及。深度神经网络通过多个堆叠层自然地从输入中提取特征,并使用分类器来做出最终决策,这意味着其中蕴含着大量矩阵或卷积运算算子。最近的证据表明,神经网络的深度对于性能至关重要,这极大地增加了对计算能力的要求,传统的cpu已经无法满足日益增长的需求,完成一个深度神经网络的识别往往要很长的时间,已经不适用于现实应用场景中。解决该问题的常用方法是采用具有各种不同计算设备的异构分布式环境,例如dsp,gpu和诸如fpga的定制硬件加速器。然而,尽管fpga具有灵活性,高能效和成本效益,但并没有被纳入最先进的深度学习框架或系统。例如tensorflow中作为计算加速器,这和其传统的开发方式速度非常缓慢有关系。因此,将fpga作为计算加速设备内置于tensorflow中并通过高层次综合来改善fpga加速器的开发效率是一个很有研究意义且具有创新性的。



技术实现要素:

为了解决现有技术中无法很好地使用cpu来支持人工智能神经网络的开发和运行速度,并且当下tensorflow人工智能系统没有对于fpga的设备支持这一系列问题,本发明提供了一种基于fpga的tensorflow系统加速的设计方法,将fpga作为计算加速器添加进入tensorflow系统中。通过将fpga这一可编程的逻辑器件作为基本计算设备并入tensorflow,使其完成tensorflow中的一些计算。同时,实现fpga器件的一组相应的操作内核,以获取fpga上各种张量流操作的计算速度来确保加速效果。

本发明的技术解决方案如下:

一种基于fpga的tensorflow系统的加速方法,其特点征在于,包括如下步骤:

第一步,以python作为上层客户端程序库

第二步,提供合适的c语言接口

将opencl实现的模块封装后作为接口供上层的客户端程序调用;

第三步,通过opencl准备fpga算子开发环境

第四步,通过opencl开发fpga算子

先用c语言来编写需要的内核函数,再通过设备商提供的bsp以及opencl内核编译环境即可自动生成相应的二进制流文件,将生成的二进制流文件烧入fpga后即可在fpga上运行算子;

第五步,通过opencl编译内核算子

将c语言描述的算子作为内核,然后通过设备商提供的bsp来进行映射的过程;

第六步,将fpga设备并入整个系统

将opencl的c语言代码加入c语言接口层,并添加一些注册设备id的代码以方便上层的python,c++客户端直接调用。

所述的通过opencl准备fpga算子开发环境,具体是

通过查询平台,查询设备确定系统中的fpga型号和数量;

通过命令队列和创建缓存来完成待执行的操作类似和带操作数据的存储;

通过bsp将c语言完成的内核映射成fpga可以执行的二进制流文件;

设置执行参数,opencl的主机端按照实际需求执行内核。

所述的执行参数包括执行内核的种类和次数。

所述的通过opencl编译内核算子,具体是

确定fpga的型号种类和其对应的bsp;

将要实现的算子用c语言开发完成;

在设备商提供的环境里执行编译指令;

会生成相应的网表文件和能够烧写进入fpga生成相应硬件的二进制流文件。

与现有技术相比,本发明的优势在于:使用fpga加入tensorflow系统来加速一些神经网络的运算,相较于传统的对于fpga无支持的tensorflow系统提高了神经网络运算速度。并且通过opencl来开发相应的算子,利用opencl本身的特性,相较于传统的用硬件描述语言开发算子,再去一步一步开发相应的数据流管理,通信管理,大大减少了开发难度,也让fpga作为tensorflow系统中的一个设备有了稳定性和实用性的保证。

附图说明

图1是本发明基于fpga的tensorflow系统加速的设计方法的流程图;

图2是fpga算子实现架构图

图3opencl内核实现流程

具体实施方式

下面结合附图和实施例对本发明作进一步解释,但不应此限制本发明的保护范围。

本发明所述具体实现主要包括以下几个步骤:

第一步,选择合适的上层客户端程序库

如果要直接通过机器级语言来实现神经网络或者别的向量操作必然是十分费时的。所以tensorflow往往对面向高级语言例如python和c++提供已经封装好的集成库,本发明的实现也是利用这些库,因为这些库里提供的函数不论是实现还是声明都有非常好的抽象。

结合附图1来看,不管是哪种语言实现的库,最后的具体操作还是通过之后的一系列流程最终要落实到设备级的器件上,也就是说上层的高级语言是提供统一的编程模型来方便用户来进行使用,而本发明也是按照这一套规则,将fpga实现的一些加速算子也逐级封装成函数让上层用户直接用高级语言来调用。

第二步,提供合适的c语言接口

结合图2来看,尽管高级语言可以方便上层使用者的开发,但是因为本发明的目标还是将fpga加入整个系统,所以本发明还是需要对连接上层与之后的设备层的c语言接口层做相应的修改。

采用的方法是:参考已有的针对cpu或gpu实现的方法,保留可以进行复用的部分。随后使用opencl来进行开发,因为opencl本身是一个面向异构系统通用的开源标准,同时opencl本身也可以使用c语言来作为实现载体。而且新版本的tensorflow也实现了对opencl以及支持opencl设备的支持,这样可以大大降低接口上的开发难度和提高了接口的稳定度和实用性。

第三步,通过opencl准备fpga算子开发环境

如果要用fpga来完成相应算子的加速,传统的方法是用硬件描述语言来写出相应算子功能。但这样的开发时间很长,而opencl提供了一种可以用c语言来实现算子功能,最后再通过相应设备公司提供的板级支持文件(一下简称bsp)来在fpga上进行实现。

如图3所述,opencl已经提供了一套标准的开发流程,其提供了大量的c语言接口,可以在第二部分中复用。首先,通过查询平台,查询设备确定系统中的fpga型号和数量,再通过命令队列和创建缓存来完成待执行的操作类似和带操作数据的存储,随后通过bsp将c语言完成的内核映射成fpga可以执行的二进制流文件。最后设置一些执行参数例如执行内核的种类和次数,opencl的主机端就会按照实际需求执行内核从而将算子部分通过fpga实现。从上述流程可以发现,opencl大大减少了将fpga接入整个系统的难度。因为它的流程本身就可以完成大部分工作比如附图2中的数据传输迁移到最后的设备管理。

第四步,通过opencl开发fpga算子

需要在fpga上完成的算子都可以通过opencl提供的标准来用c语言来编写内核函数来完成。用c语言完成的内核函数通过设备商提供的bsp以及opencl内核编译环境即可自动生成可以在fpga硬件上运行的算子。

第五步,通过opencl编译内核算子

图3中的编译内核是将c语言描述的算子作为内核,然后通过设备商提供的bsp来进行映射的过程。具体实现方法是确定好fpga的型号种类和其对应的bsp,然后将要实现的算子用c语言开发完成,然后在设备商提供的环境例如英特尔公司的sdkforopencl里执行编译指令。随后会生成相应的网表和实际的硬件实现二进制流,这样就可以让fpga直接实现相应的算子。

第六步,将fpga设备并入整个系统

按照上述步骤完成后,附图1中的内核实现和设备层部分均已完成。而因为使用了opencl的缘故,不要再独立开发主机端和fpga的通信,数据流运行器部分也已经完成。最后仅需将opencl的c语言代码加入c语言接口层,并添加一些关于设备注册id的代码以方便上层的python,c++客户端直接调用。经过上述封装,即可让上层用户在tensorflow系统中用高级语言实现神经网络,并且让fpga实现部分算子可以对网络进行加速。

本发明不仅扩展tensorflow对于新的设备fpga的支持,还在开发模式上进行了创新,通过opencl这一面向异构系统通用的并行编程的开放式、免费的编程环境设计来开发fpga。这样不仅可让tensorflow能充分利用fpga的全新操作来探索fpga的潜力,也通过opencl提供的环境加快了fpga的开发进度,同时也减少了将fpga接入tensorflow带来的诸多接口问题。这样可使得算子运行速度获得提升,同时也增加一些新的算子由fpga来完成以供tensorflow来调用。

当前第1页1 2 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1