OpenCLTensorFlow的实现方法及装置、电子设备和存储介质

专利2024-11-07  55


opencl tensorflow的实现方法及装置、电子设备和存储介质
技术领域
1.本公开涉及人工智能技术领域,尤其涉及一种opencl tensorflow的实现方法及装置、电子设备和存储介质。


背景技术:

2.近年来,以深度学习为代表的人工智能算法和模型受到了广泛的关注与研究。在图像识别、文本处理等多个领域中,深度学习取得突破性进展。与此同时,随着模型参数量以及训练所需数据规模的增长,完成模型训练和推理依赖更加强大的计算能力。为了提升深度学习模型对计算设备的使用效率以及简化模型的构建与计算流程,国内外知名公司和科研机构设计实现了多种机器学习框架。
3.目前,以tensorflow为代表的机器学习框架一般使用cpu+加速器的异构计算架构提升模型的计算速度。异构计算架构能够发挥cpu擅长调度管理的特点以及加速器在并行度、单机计算峰值等方面的优势。相比于传统同构计算,异构计算架构计算性能的效率更高、延迟更低。国外厂商gpu的高性能和完善的开发生态,使得tensorflow、pytorch等主流机器学习框架的官方版本基本采用闭源的编程模型开发。
4.主流机器学习框架基本仅支持以国外厂商gpu芯片为主的计算设备,通用加速器尤其是国产加速器在新一代人工智能应用中的巨大潜力难以发挥。国内外最新的深度学习研究成果大多使用国外芯片公司的产品计算,人工智能技术的创新与发展已与这些芯片公司牢牢的绑定在了一起。因此,如何实现主流深度学习框架对不同厂商的多类型异构设备的支持成为亟待解决的问题。


技术实现要素:

5.本公开提供了一种opencl tensorflow的实现方法及装置、电子设备和存储介质。其主要目的在于解决tensorflow对不同厂商的多类型异构设备的支持的问题。
6.根据本公开的第一方面,提供了一种opencl tensorflow的实现方法,其中,包括:
7.基于opencl编程标准,实现tensorflow设备层的opencl device支持;
8.参照tensorflow中的预设kernel的计算功能,基于opencl编程标准,实现对应计算功能的opencl kernel和opencl算子;
9.基于opencl编程标准,实现opencl element-wise算子库;
10.将任务所需的计算加速库,进行opencl标准的适配;
11.利用第一opencl计算加速库的api接口实现集成调用;
12.实现streamexecutor对opencl的支持,利用streamexecutor的opencl后端实现对第二opencl计算加速库的集成调用。
13.可选的,所述基于opencl编程标准,实现tensorflow设备层的opencl device支持包括:
14.通过继承的方式实现opencl device的不同功能的类,利用所述不同功能的类实
现各类算子计算过程中获取设备与相关上下文的功能。
15.可选的,所述参照tensorflow中的预设kernel的计算功能,基于opencl编程标准实现对应计算功能的opencl kernel和opencl算子包括:
16.将opencl kernel封装成opencl算子,并实现opencl算子在tensorflow中的注册。
17.可选的,所述基于opencl编程标准,实现opencl element-wise算子库包括:
18.将所述element-wise算子逐个实现底层opencl kernel;
19.将所述底层opencl kernel进行封装,生成opencl算子。
20.可选的,所述将任务所需要的计算加速库,进行opencl标准的适配包括:
21.将计算加速库的算子实现对应的底层opencl kernel,并封装生成对应opencl算子,并在tensorflow中注册。
22.可选的,所述实现streamexecutor对opencl的支持,利用streamexecutor的opencl后端实现对第二opencl计算加速库的集成调用包括:
23.在streamexecutor中实现opencl platform,并注册到tensorflow框架中;
24.所述opencl platform为根据指令进行创建、指定对应的设备platform;
25.在streamexecutor中实现opencl executor,并注册到tensorflow框架中;
26.在streamexecutor中的librarysupport层完成计算加速库的注册和接入;
27.在tensorflow框架中将计算加速库中对应的算子与opencl设备绑定并进行注册。
28.可选的,所述方法还包括:
29.对opencl kernel和opencl算子的实现过程进行优化。
30.可选的,所述对opencl kernel和opencl算子的实现过程进行优化包括:
31.使用单例模式实现opencl平台、设备、上下文和命令队列的初始化;
32.缓存opencl kernel程序的编译结果;
33.利用规约算法优化原子操作。
34.根据本公开的第二方面,提供了一种opencl tensorflow的实现装置,包括:
35.第一生成单元,用于实现tensorflow设备层的opencl device支持;
36.第二生成单元,用于参照tensorflow中的预设kernel的计算功能,基于opencl编程标准,实现对应计算功能的opencl kernel和opencl算子;
37.第三生成单元,用于基于opencl标准,实现opencl element-wi se算子库;
38.适配单元,用于将任务所需的计算加速库,进行opencl标准的适配;
39.第一调用单元,用于利用第一opencl计算加速库的api接口实现集成调用;
40.第二调用单元,用于实现streamexecutor对opencl的支持,利用streamexecutor的opencl后端实现对opencl计算加速库的集成调用。
41.可选的,所述第一生成单元还用于:
42.通过继承的方式实现opencl device的不同功能的类,利用所述不同功能的类实现各类算子计算过程中获取设备与相关上下文的功能。
43.可选的,所述第二生成单元还用于:
44.将opencl kernel封装成opencl算子,并实现opencl算子在tensorflow中的注册。
45.可选的,所述第三生成单元包括:
46.第一生成模块,用于将所述element-wise算子逐个实现底层opencl kernel;
47.封装模块,用于将所述底层opencl kernel的设备端代码和功能进行封装,生成opencl算子。
48.可选的,所述适配单元还用于:
49.将计算加速库的算子实现对应的底层opencl kernel,并封装生成对应opencl算子,并在tensorflow中注册。
50.可选的,所述第二调用单元包括:
51.第二生成模块,用于在streamexecutor中实现opencl platform,并注册到tensorflow框架中;
52.创建模块,用于所述opencl platform为根据指令进行创建、指定对应的设备platform;
53.第三生成模块,用于在streamexecutor中实现opencl executor,并注册到tensorflow框架中;
54.注册模块,用于在streamexecutor中的librarysupport层完成计算加速库的注册和接入;
55.绑定模块,用于在tensorflow框架中将计算加速库中对应的算子与opencl设备绑定并进行注册。
56.可选的,所述装置还包括:
57.优化单元,用于对opencl kernel和opencl算子的实现过程进行优化。
58.可选的,所述优化单元包括:
59.初始化模块,用于使用单例模式实现opencl平台、设备、上下文和命令队列opencl的初始化;
60.缓存模块,用于缓存opencl kernel程序的编译结果;
61.优化模块,用于利用规约算法优化原子操作。
62.根据本公开的第三方面,提供了一种电子设备,包括:
63.至少一个处理器;以及
64.与所述至少一个处理器通信连接的存储器;其中,
65.所述存储器存储有可被所述至少一个处理器执行的指令,所述指令被所述至少一个处理器执行,以使所述至少一个处理器能够执行前述第一方面所述的方法。
66.根据本公开的第四方面,提供了一种存储有计算机指令的非瞬时计算机可读存储介质,其中,所述计算机指令用于使所述计算机执行前述第一方面所述的方法。
67.根据本公开的第五方面,提供了一种计算机程序产品,包括计算机程序,所述计算机程序在被处理器执行时实现如前述第一方面所述的方法。
68.本公开提供一种opencl tensorflow的实现方法及装置、电子设备和存储介质。基于opencl编程标准,实现tensorflow设备层的opencl device支持;参照tensorflow中的预设kernel的计算功能,基于opencl编程标准实现对应计算功能的opencl kernel和opencl算子;基于opencl编程标准,实现opencl element-wise算子库;将任务所需的计算加速库,进行opencl标准的适配;利用第一opencl计算加速库的api接口实现集成调用;实现streamexecutor对opencl的支持,利用streamexecutor的opencl后端实现对第二opencl计算加速库的集成调用。本发明实现了opencl版本的tensorflow框架,从而实现tensorflow
框架对不同厂商的多类型异构设备的支持。
69.应当理解,本部分所描述的内容并非旨在标识本技术的实施例的关键或重要特征,也不用于限制本技术的范围。本技术的其它特征将通过以下的说明书而变得容易理解。
附图说明
70.附图用于更好地理解本方案,不构成对本公开的限定。其中:
71.图1为本公开实施例提供的一种opencl tensorflow的实现方法的流程示意图;
72.图2为本公开实施例提供的一种典型openclkernel代码中opencl接口执行时间占比统计示意图;
73.图3为本公开实施例提供的一种tensorflow单例类示意图;
74.图4为本公开实施例提供的一种tensorflow中多工作组原子操作计算示意图;
75.图5为本公开实施例提供的一种两步规约计算示意图
76.图6为本公开实施例提供的一种opencl tensorflow的实现装置的结构示意图;
77.图7为本公开实施例提供的另一种opencl tensorflow的实现装置的结构示意图;
78.图8为本公开实施例提供的示例电子设备300的示意性框图。
具体实施方式
79.以下结合附图对本公开的示范性实施例做出说明,其中包括本公开实施例的各种细节以助于理解,应当将它们认为仅仅是示范性的。因此,本领域普通技术人员应当认识到,可以对这里描述的实施例做出各种改变和修改,而不会背离本公开的范围和精神。同样,为了清楚和简明,以下的描述中省略了对公知功能和结构的描述。
80.下面参考附图描述本公开实施例的opencl tensorflow的实现方法及装置、电子设备和存储介质。
81.图1为本公开实施例所提供的一种opencl tensorflow的实现方法的流程示意图。
82.如图1所示,该方法包含以下步骤:
83.步骤101,基于opencl编程标准,实现tensorflow设备层的opencl device支持。
84.opencl device支持主要需要完成内存的分配与释放、tensor生命周期管理、数据交互支持、支持kernel的执行、管理与存储设备相关的对象或属性。
85.步骤102,参照tensorflow中的预设kernel的计算功能,基于opencl编程标准,实现对应计算功能的opencl kernel和opencl算子。
86.参照tensorflow中已有编程模型的kernel的计算功能,实现对应的opencl kernel,完成在opencl设备上的计算功能的并行实现。
87.步骤103,基于opencl编程标准,实现opencl element-wise算子库。
88.element-wise算子作为tensorflow框架中的重要组成部分,在tensorflow框架中使用广泛,实现了较多的计算功能。将element-wise算子逐个实现底层opencl kernel,并逐个算子注册到深度学习框架中。
89.步骤104,将任务所需的计算加速库,进行opencl标准的适配。
90.按照不同任务的需求,可以将不同的计算加速库集成到tensorflow框架中。在本公开实施例中还需要对计算加速库进行opencl标准的适配。
91.步骤105,利用第一opencl计算加速库的api接口实现集成调用。
92.在tensorflow框架中,计算加速库的集成调用可以基于streamexecutor调用,也可以自主实现对加速库api接口的直接调用。所述第一opencl计算加速库为直接进行调用的opencl计算加速库。
93.步骤106,实现streamexecutor对opencl的支持,利用streamexecutor的opencl后端实现对第二opencl计算加速库的集成调用。
94.streamexecutor的opencl后端实现了对opencl计算加速库的集成调用,包括opencl dnn库、opencl blas库和opencl高性能计算库。集成调用不同的计算加速库能够在特定运算中提升深度学习框架的效率。所述第二opencl计算加速库为利用streamexecutor进行调用的opencl计算加速库。
95.本公开提供一种opencl tensorflow的实现方法。基于opencl编程标准,实现tensorflow设备层的opencl device支持;参照tensorflow中的预设kernel的计算功能,基于opencl编程标准实现对应计算功能的opencl kernel和opencl算子;基于opencl编程标准,实现opencl element-wise算子库;将任务所需的计算加速库,进行opencl标准的适配;利用第一opencl计算加速库的api接口实现集成调用;实现streamexecutor对opencl的支持,利用streamexecutor的opencl后端实现对第二opencl计算加速库的集成调用。本发明实现了opencl版本的tensorflow框架,从而实现tensorflow框架对不同厂商的多类型异构设备的支持。
96.在本技术实施例中,根据前述的方法构建了一种opencl版本的tensorflow框架ncl-tensorflow。
97.作为本技术实施例的一种可行方式,可以采用但不局限于以下方法:
98.进一步的,在本技术实施例中,所述基于opencl编程标准,实现tensorflow设备层的opencl device支持包括:
99.通过继承的方式实现opencl device的不同功能的类,利用所述不同功能的类实现各类算子计算过程中获取设备与相关上下文的功能。
100.基于tensorflow框架中的类型继承规则,继承实现opencl设备的allocator、device_context、device_factory和device类,以支持tensorflow框架中各类算子计算过程获取设备与相关上下文的功能。
101.实现opencl设备的内存分配与释放支持:基于继承tensorflow框架中的allocator类,实现opencl设备的内存分配与释放功能。实现基于opencl设备的tensor创建与释放功能。
102.实现主机端与opencl设备的数据交互与管理:基于继承tensorflow框架中的devicecontext类,实现opencl设备端与主机端的tensor拷贝功能和tensor生命周期管理功能。通过实现devicecontext类,用户无需显式地拷贝与管理数据存储位置,并且无需显式地管理tensor,由devicecontext管理tensor的生命周期并自动释放内存。
103.实现opencl设备的支持:基于继承tensorflow框架中的localdevice类,实现opencl的device类,并绑定allocator与devicecontext对象,以实现内存分配、创建tensor、内存管理等功能。基于继承tensorflow框架中的devicefactory类,实现使用工厂模式创建opencl设备。其中opencl的device类一方面实现了内存分配与管理等工作,另一
方面实现了存储opencl设备相关信息和属性的功能,如内存限制、设备名称、最大工作组大小、共享内存大小等。
104.进一步的,在本技术实施例中,所述参照tensorflow中的预设kernel的计算功能,基于opencl编程标准实现对应计算功能的opencl kernel和opencl算子包括:
105.将opencl kernel封装成opencl算子,并实现opencl算子在tensorflow中的注册。
106.tensorflow源码中cudakernel包含的算子数目众多、计算类型和功能多样,总结出一套标准转换流程能够极大地提升转换效率和代码质量,减少在转换过程中的代码编写错误。本技术实施例基于对tensorflow源码中cudakernel实现特点的研究与分析,将一般情况下tensorflow中cudakernel到openclkernel的转换流程归纳为以下三步:
107.kernel中c++代码实现替换为符合opencl的c99标准的代码实现;
108.tensorflow中的cudakernel基于c++开发,而opencl 1.2标准中kernel代码只支持c99标准。因此,对于c++中reinterpret_cast()等操作符需要进行替换。对于部分包含结构体或类作为入参的cudakernel,需要将结构体或类里面的成员声明为openclkernel的入参,类中的方法改写成能被openclkernel直接调用的子函数。
109.kernel修饰符和接口函数替换;
110.在kernel的转换过程中,需要基于表1中cuda与opencl基本概念对应关系对cudakernel修饰符与接口函数进行替换。例如,将cudakernel中的__global__限定符修改为opencl中的kernel;将cudakernel中用于同步的syncthreads()函数替换为opencl中的barrier()。
111.区别于一般情况下的cudakernel代码,tensorflow源码中的cudakernel内通常包含对cuda内建变量或接口的封装。此外,还需要对cuda代码中主机端的部分接口函数进行修改。例如,对于cuda主机端代码中用于将kernel发送到gpu上的cudalaunchkernel()函数,需要替换为opencl中的clenqueuendrangekernel()函数。
112.表1
[0113][0114]
kernel中device函数代码重写;
[0115]
cudakernel中经常将部分计算功能抽象为“__device__”修饰符限定的函数在cudakernel中调用。由于在opencl标准中没有对应的修饰符,本文在转换时会重新实现一个功能相同的子函数,在openclkernel中调用。
[0116]
进一步的,在本技术实施例中,所述基于opencl编程标准,实现opencl element-wise算子库包括:
[0117]
将所述element-wise算子逐个实现底层opencl kernel;
[0118]
将所述底层opencl kernel进行封装,生成opencl算子。
[0119]
根据element-wise算子的运算符共性,生成通用的两个算子类;通过继承方式,分别执行两个算子类中计算功能的封装;基于opencl标准,将所述element-wise算子逐个实现底层opencl kernel;将所述底层opencl kernel的设备端代码和功能进行封装。
[0120]
在分析opencl执行特点后,重写了base结构体,利用函数get_kernel_src在不同的子类中实现对应的opencl kernel字符串生成功能,其依据传入的输入数据类型和输出数据类型,生成完成对应功能、使用不同数据类型的opencl设备端代码字符串。
[0121]
进一步的,在本技术实施例中,所述将任务所需要的计算加速库,进行opencl标准的适配包括:
[0122]
将计算加速库的算子实现对应的底层opencl kernel,并封装生成对应opencl算子,并在tensorflow中注册。
[0123]
tensorflow框架中可以集成不同的计算加速库,实现在特定的计算中提高计算的效率。在ncl-tensorflow框架中需要对不同的计算加速库进行opencl版本的适配。
[0124]
opencl dnn库(ocldnn)和opencl高性能计算库(oclcub)的适配。其中,ocldnn库实现了深度神经网络中的常见算子,例如卷积、池化等;oclcub库实现了常见算法的并行实现,以及实现针对opencl多线程的排序、扫描、规约运算等。
[0125]
进一步的,在本技术实施例中,所述实现streamexecutor对opencl的支持,利用streamexecutor的opencl后端实现对第二opencl计算加速库的集成调用包括:
[0126]
在streamexecutor中实现opencl platform,并注册到tensorflow框架中;所述opencl platform为根据指令进行创建、指定对应的设备platform;
[0127]
在streamexecutor中实现opencl executor,并注册到tensorflow框架中;
[0128]
在streamexecutor中的librarysupport层完成计算加速库的注册和接入;
[0129]
在tensorflow框架中将计算加速库中对应的算子与opencl设备绑定并进行注册。
[0130]
executor层隐藏了platform的复杂设计,并向上层调用提供了统一的streamexecutor类。librarysupport层提供了用机器学习计算的底层库的接入,将计算加速库注册并接入librarysupport,则streamexecutor在进行计算时便能调用计算加速库进行加速计算。
[0131]
进一步的,在本技术实施例中,所述方法还包括:
[0132]
对opencl kernel和opencl算子的实现过程进行优化。
[0133]
通过实际测试,发现转换后openclkernel在性能上存在进一步优化和提升的空间。因此,特别研究了opencl代码在设备初始化、编译执行等过程中的特性,设计实现了三种优化方法。
[0134]
进一步的,在本技术实施例中,所述对opencl kernel和opencl算子的实现过程进行优化包括:
[0135]
使用单例模式实现opencl平台、设备、上下文和命令队列的初始化;
[0136]
缓存opencl kernel程序的编译结果;
[0137]
利用规约算法优化原子操作。
[0138]
使用单例模式实现opencl平台、设备、上下文和命令队列的初始化;
[0139]
opencl程序的主机端代码初始化时,需要通过clcreatecontext()、clcreatecommandqueue()等接口函数执行查找platform(平台)和device(设备)、创建context(上下文)和commandqueue(命令队列)等操作。完成opencl kernel运算后,需要通过调用clrelease()将初始化时申请将设备、上下文、命令队列等资源进行释放。
[0140]
图2展示了在机器学习模型中出现频率较高的6个opencl kernel在单次执行时,opencl接口函数的时间占比情况。从图中不难看出,opencl初始化与释放相关的clcreatecontext()、clcreatecommandqueue()、clrelease()等接口合计占用了约90%的代码执行时间。在机器学习模型中单个操作经常需要一次执行多个kernel。这意味着相关opencl接口函数会反复被调用,整个模型的执行效率将大幅降低。
[0141]
实际上,根据opencl标准,查找平台、申请设备以及创建上下文等与初始化相关的接口函数在运行不同kernel时只需调用一次。因此,本文采用c++中的单例模式对这些接口函数进行封装。图3展示了本文针对opencl中部分接口函数设计的类图。执行opencl代码
时,如果单例对象未被创建则新建一个对象并且对其中的成员变量进行初始化。如果单例对象已经被创建,则直接返回已有对象。对于初始化设备、创建上下文或创建命令队列等操作,可通过getdevice()、getcontext(),getqueue()这些接口来获取已完成初始化的device、context、commandqueue等变量。
[0142]
缓存opencl kernel程序的编译结果;执行opencl kernel的基本流程是:首先,调用clcreateprogramwithsource()函数将opencl kernel的字符串编译为cl_program对象。其次,将cl_program对象作为参数传入clcreatekernel()函数中生成cl_kernel对象。最后,将cl_kernel发送到设备上运行。从以上流程不难看出,若一个opencl程序中多次调用某个kernel,程序会反复编译这个kernel,严重影响了opencl代码的执行效率。
[0143]
基于opencl kernel源码编译生成的cl_program对象可以重复使用,单个cl_program对象可以用来生成多个cl_kernel对象。在图3展示的singleton单例类中,本文构造了unordered_map《string,cl_program》类型的变量program_record,用于将kernel源码编译生成的cl_program以kernel的字符串作为索引进行缓存。程序首先检查在缓存中是否存在与待调用kernel字符串对应的cl_program。若存在则直接取出使用,若不存在则对kernel字符串进行编译,同时将生成的cl_program进行缓存。
[0144]
将opencl kernel编译结果进行缓存的方式可以减少编译相同opencl kernel时的性能损耗,提升程序整体的运行效率。其他基于opencl的机器学习框架或数学库,也可采用相同的思路进行设计或实现进一步优化。
[0145]
利用规约算法优化原子操作;
[0146]
当kernel中需要多次调用原子操作修改相同内存地址时,由于进程间的竞争关系,一系列原子操作只能串行完成。因此,使用原子操作的计算性能有时甚至不如单线程循环。如图4所示,尽管在opencl中通过多个工作组(work group)并行完成原子操作能够提升一定的计算性能,但输入数据量较大时,进程阻塞导致的性能损耗仍不可忽视。
[0147]
为了充分利用opencl多线程处理计算任务的优势,进一步提升转换后opencl kernel的性能。本文特别研究了如何使用规约思想优化opencl原子操作的方法。如图5所示,考虑到opencl仅支持工作组内线程同步,在计算规约结果时本文使用两步规约(two-stage reduction)算法:首先,完成工作组内部规约并保存每个组的规约结果。其次,使用单个工作组对第一步中所有规约结果再次执行规约,得到最终结果。
[0148]
规约算法能否正确运行的关键在于opencl kernel中全局工作线程(global_work_size)和局部工作线程(local_work_size)大小的设置以及保存中间结果所需空间的计算。本文中将局部工作线程数设为2的n次方,并基于输入数据对全局工作线程数以及保存第一步中间结果所需空间的大小进行调整。
[0149]
与上述的opencl tensorflow的实现方法相对应,本发明还提出一种opencl tensorflow的实现装置。由于本发明的装置实施例与上述的方法实施例相对应,对于装置实施例中未披露的细节可参照上述的方法实施例,本发明中不再进行赘述。
[0150]
图6为本公开实施例提供的一种opencl tensorflow的实现装置的结构示意图,如图6所示,包括:第一生成单元21、第二生成单元22、第三生成单元23、适配单元24、第一调用单元25、第二调用单元26。
[0151]
第一生成单元21,用于实现tensorflow设备层的opencl device支持;
[0152]
第二生成单元22,用于参照tensorflow中的预设kernel的计算功能,基于opencl编程标准,实现对应计算功能的opencl kernel和opencl算子;
[0153]
第三生成单元23,用于基于opencl标准,实现opencl element-wise算子库;
[0154]
适配单元24,用于将任务所需的计算加速库,进行opencl标准的适配;
[0155]
第一调用单元25,用于利用第一opencl计算加速库的api接口实现集成调用;
[0156]
第二调用单元26,用于实现streamexecutor对opencl的支持,利用streamexecutor的opencl后端实现对第二opencl计算加速库的集成调用。
[0157]
进一步的,在本公开实施例中,所述第一生成单元21还用于:
[0158]
通过继承的方式实现opencl device的不同功能的类,利用所述不同功能的类实现各类算子计算过程中获取设备与相关上下文的功能。
[0159]
进一步的,在本公开实施例中,所述第二生成单元22还用于:
[0160]
将opencl kernel封装成opencl算子,并实现opencl算子在tensorflow中的注册。
[0161]
进一步的,在本公开实施例中,如图7所示,所述第三生成单元23包括:
[0162]
第一生成模块231,用于将所述element-wise算子逐个实现底层opencl kernel;
[0163]
封装模块232,用于将所述底层opencl kernel的设备端代码和功能进行封装,生成opencl算子。
[0164]
进一步的,在本公开实施例中,所述适配单元24还用于:
[0165]
将计算加速库的算子实现对应的底层opencl kernel,并封装生成对应opencl算子,并在tensorflow中注册。
[0166]
进一步的,在本公开实施例中,如图7所示,所述第二调用单元26包括:
[0167]
第二生成模块261,用于在streamexecutor中实现opencl platform,并注册到tensorflow框架中;
[0168]
创建模块262,用于所述opencl platform为根据指令进行创建、指定对应的设备platform;
[0169]
第三生成模块263,用于在streamexecutor中实现opencl executor,并注册到tensorflow框架中;
[0170]
注册模块264,用于在streamexecutor中的librarysupport层完成计算加速库的注册和接入;
[0171]
绑定模块265,用于在tensorflow框架中将计算加速库中对应的算子与opencl设备绑定并进行注册。
[0172]
进一步的,在本公开实施例中,如图7所示,所述装置还包括:
[0173]
优化单元27,用于对opencl kernel和opencl算子的实现过程进行优化。
[0174]
进一步的,在本公开实施例中,如图7所示,所述优化单元27包括:
[0175]
初始化模块271,用于使用单例模式实现opencl平台、设备、上下文和命令队列opencl的初始化;
[0176]
缓存模块272,用于缓存opencl kernel程序的编译结果;
[0177]
优化模块273,用于利用规约算法优化原子操作。
[0178]
需要说明的是,前述对方法实施例的解释说明,也适用于本实施例的装置,原理相同,本实施例中不再限定。
[0179]
根据本公开的实施例,本公开还提供了一种电子设备、一种可读存储介质和一种计算机程序产品。
[0180]
图8示出了可以用来实施本公开的实施例的示例电子设备300的示意性框图。电子设备旨在表示各种形式的数字计算机,诸如,膝上型计算机、台式计算机、工作台、个人数字助理、服务器、刀片式服务器、大型计算机、和其它适合的计算机。电子设备还可以表示各种形式的移动装置,诸如,个人数字处理、蜂窝电话、智能电话、可穿戴设备和其它类似的计算装置。本文所示的部件、它们的连接和关系、以及它们的功能仅仅作为示例,并且不意在限制本文中描述的和/或者要求的本公开的实现。
[0181]
如图8所示,设备300包括计算单元301,其可以根据存储在rom(read-only memory,只读存储器)302中的计算机程序或者从存储单元308加载到ram(random access memory,随机访问/存取存储器)303中的计算机程序,来执行各种适当的动作和处理。在ram 303中,还可存储设备300操作所需的各种程序和数据。计算单元301、rom 302以及ram 303通过总线304彼此相连。i/o(input/output,输入/输出)接口305也连接至总线304。
[0182]
设备300中的多个部件连接至i/o接口305,包括:输入单元303,例如键盘、鼠标等;输出单元307,例如各种类型的显示器、扬声器等;存储单元308,例如磁盘、光盘等;以及通信单元309,例如网卡、调制解调器、无线通信收发机等。通信单元309允许设备300通过诸如因特网的计算机网络和/或各种电信网络与其他设备交换信息/数据。
[0183]
计算单元301可以是各种具有处理和计算能力的通用和/或专用处理组件。计算单元301的一些示例包括但不限于cpu(central processing unit,中央处理单元)、gpu(graphic processing units,图形处理单元)、各种专用的ai(artificial intelligence,人工智能)计算芯片、各种运行机器学习模型算法的计算单元、dsp(digital signal processor,数字信号处理器)、以及任何适当的处理器、控制器、微控制器等。计算单元301执行上文所描述的各个方法和处理,例如opencl tensorflow的实现方法。例如,在一些实施例中,opencl tensorflow的实现方法可被实现为计算机软件程序,其被有形地包含于机器可读介质,例如存储单元308。在一些实施例中,计算机程序的部分或者全部可以经由rom 302和/或通信单元309而被载入和/或安装到设备300上。当计算机程序加载到ram 303并由计算单元301执行时,可以执行上文描述的方法的一个或多个步骤。备选地,在其他实施例中,计算单元301可以通过其他任何适当的方式(例如,借助于固件)而被配置为执行前述opencl tensorflow的实现方法。
[0184]
本文中以上描述的系统和技术的各种实施方式可以在数字电子电路系统、集成电路系统、fpga(field programmable gate array,现场可编程门阵列)、asic(application-specific integrated circuit,专用集成电路)、assp(application specific standard product,专用标准产品)、soc(system on chip,芯片上系统的系统)、cpld(complex programmable logic device,复杂可编程逻辑设备)、计算机硬件、固件、软件、和/或它们的组合中实现。这些各种实施方式可以包括:实施在一个或者多个计算机程序中,该一个或者多个计算机程序可在包括至少一个可编程处理器的可编程系统上执行和/或解释,该可编程处理器可以是专用或者通用可编程处理器,可以从存储系统、至少一个输入装置、和至少一个输出装置接收数据和指令,并且将数据和指令传输至该存储系统、该至少一个输入装置、和该至少一个输出装置。
[0185]
用于实施本公开的方法的程序代码可以采用一个或多个编程语言的任何组合来编写。这些程序代码可以提供给通用计算机、专用计算机或其他可编程数据处理装置的处理器或控制器,使得程序代码当由处理器或控制器执行时使流程图和/或框图中所规定的功能/操作被实施。程序代码可以完全在机器上执行、部分地在机器上执行,作为独立软件包部分地在机器上执行且部分地在远程机器上执行或完全在远程机器或服务器上执行。
[0186]
在本公开的上下文中,机器可读介质可以是有形的介质,其可以包含或存储以供指令执行系统、装置或设备使用或与指令执行系统、装置或设备结合地使用的程序。机器可读介质可以是机器可读信号介质或机器可读储存介质。机器可读介质可以包括但不限于电子的、磁性的、光学的、电磁的、红外的、或半导体系统、装置或设备,或者上述内容的任何合适组合。机器可读存储介质的更具体示例会包括基于一个或多个线的电气连接、便携式计算机盘、硬盘、ram、rom、eprom(electrically programmable read-only-memory,可擦除可编程只读存储器)或快闪存储器、光纤、cd-rom(compact disc read-only memory,便捷式紧凑盘只读存储器)、光学储存设备、磁储存设备、或上述内容的任何合适组合。
[0187]
为了提供与用户的交互,可以在计算机上实施此处描述的系统和技术,该计算机具有:用于向用户显示信息的显示装置(例如,crt(cathode-ray tube,阴极射线管)或者lcd(liquid crystal display,液晶显示器)监视器);以及键盘和指向装置(例如,鼠标或者轨迹球),用户可以通过该键盘和该指向装置来将输入提供给计算机。其它种类的装置还可以用于提供与用户的交互;例如,提供给用户的反馈可以是任何形式的传感反馈(例如,视觉反馈、听觉反馈、或者触觉反馈);并且可以用任何形式(包括声输入、语音输入或者、触觉输入)来接收来自用户的输入。
[0188]
可以将此处描述的系统和技术实施在包括后台部件的计算系统(例如,作为数据服务器)、或者包括中间件部件的计算系统(例如,应用服务器)、或者包括前端部件的计算系统(例如,具有图形用户界面或者网络浏览器的用户计算机,用户可以通过该图形用户界面或者该网络浏览器来与此处描述的系统和技术的实施方式交互)、或者包括这种后台部件、中间件部件、或者前端部件的任何组合的计算系统中。可以通过任何形式或者介质的数字数据通信(例如,通信网络)来将系统的部件相互连接。通信网络的示例包括:lan(local area network,局域网)、wan(wide area network,广域网)、互联网和区块链网络。
[0189]
计算机系统可以包括客户端和服务器。客户端和服务器一般远离彼此并且通常通过通信网络进行交互。通过在相应的计算机上运行并且彼此具有客户端-服务器关系的计算机程序来产生客户端和服务器的关系。服务器可以是云服务器,又称为云计算服务器或云主机,是云计算服务体系中的一项主机产品,以解决了传统物理主机与vps服务("virtual private server",或简称"vps")中,存在的管理难度大,业务扩展性弱的缺陷。服务器也可以为分布式系统的服务器,或者是结合了区块链的服务器。
[0190]
其中,需要说明的是,人工智能是研究使计算机来模拟人的某些思维过程和智能行为(如学习、推理、思考、规划等)的学科,既有硬件层面的技术也有软件层面的技术。人工智能硬件技术一般包括如传感器、专用人工智能芯片、云计算、分布式存储、大数据处理等技术;人工智能软件技术主要包括计算机视觉技术、语音识别技术、自然语言处理技术以及机器学习/深度学习、大数据处理技术、知识图谱技术等几大方向。
[0191]
应该理解,可以使用上面所示的各种形式的流程,重新排序、增加或删除步骤。例
如,本发公开中记载的各步骤可以并行地执行也可以顺序地执行也可以不同的次序执行,只要能够实现本公开公开的技术方案所期望的结果,本文在此不进行限制。
[0192]
上述具体实施方式,并不构成对本公开保护范围的限制。本领域技术人员应该明白的是,根据设计要求和其他因素,可以进行各种修改、组合、子组合和替代。任何在本公开的精神和原则之内所作的修改、等同替换和改进等,均应包含在本公开保护范围之内。

技术特征:
1.一种opencl tensorflow的实现方法,其特征在于,包括:基于opencl编程标准,实现tensorflow设备层的opencldevice支持;参照tensorflow中的预设kernel的计算功能,基于opencl编程标准实现对应计算功能的openclkernel和opencl算子;基于opencl编程标准,实现opencl element-wise算子库;将任务所需的计算加速库,进行opencl标准的适配;利用第一opencl计算加速库的api接口实现集成调用;实现streamexecutor对opencl的支持,利用streamexecutor的opencl后端实现对第二opencl计算加速库的集成调用。2.根据权利要求1所述的方法,其特征在于,所述基于opencl编程标准,实现tensorflow设备层的opencl device支持包括:通过继承的方式实现opencl device的不同功能的类,利用所述不同功能的类实现各类算子计算过程中获取设备与相关上下文的功能。3.根据权利要求1所述的方法,其特征在于,所述参照tensorflow中的预设kernel的计算功能,基于opencl编程标准实现对应计算功能的opencl kernel和opencl算子包括:将openclkernel封装成opencl算子,并实现opencl算子在tensorflow中的注册。4.根据权利要求1所述的方法,其特征在于,所述基于opencl编程标准,实现opencl element-wise算子库包括:将所述element-wise算子逐个实现底层openclkernel;将所述底层openclkernel进行封装,生成opencl算子。5.根据权利要求1所述的方法,其特征在于,所述将任务所需要的计算加速库,进行opencl标准的适配包括:将计算加速库的算子实现对应的底层openclkernel,并封装生成对应opencl算子,并在tensorflow中注册。6.根据权利要求1所述的方法,其特征在于,所述实现streamexecutor对opencl的支持,利用streamexecutor的opencl后端实现对第二opencl计算加速库的集成调用包括:在streamexecutor中实现opencl platform,并注册到tensorflow框架中;所述opencl platform为根据指令进行创建、指定对应的设备platform;在streamexecutor中实现opencl executor,并注册到tensorflow框架中;在streamexecutor中的librarysupport层完成计算加速库的注册和接入;在tensorflow框架中将计算加速库中对应的算子与opencl设备绑定并进行注册。7.根据权利要求1-5所述的方法,其特征在于,所述方法还包括:对openclkernel和opencl算子的实现过程进行优化。8.根据权利要求7所述的方法,其特征在于,所述对openclkernel和opencl算子的实现过程进行优化包括:使用单例模式实现opencl平台、设备、上下文和命令队列的初始化;缓存openclkernel程序的编译结果;利用规约算法优化原子操作。9.一种opencl tensorflow的实现装置,其特征在于,包括:
第一生成单元,用于基于opencl编程标准,实现tensorflow设备层的opencl device支持;第二生成单元,用于参照tensorflow中的预设kernel的计算功能,基于opencl编程标准,实现对应计算功能的openclkernel和opencl算子;第三生成单元,用于基于opencl编程标准,实现openclelement-wise算子库;适配单元,用于将任务所需的计算加速库,进行opencl标准的适配;第一调用单元,用于利用第一opencl计算加速库的api接口实现集成调用;第二调用单元,用于实现streamexecutor对opencl的支持,利用streamexecutor的opencl后端实现对第二opencl计算加速库的集成调用。10.根据权利要求9所述的装置,其特征在于,所述第一生成单元还用于:通过继承的方式实现opencl device的不同功能的类,利用所述不同功能的类实现各类算子计算过程中获取设备与相关上下文的功能。11.根据权利要求9所述的装置,其特征在于,所述第二生成单元还用于:将opencl kernel封装成opencl算子,并实现opencl算子在tensorflow中的注册。12.根据权利要求9所述的装置,其特征在于,所述第三生成单元包括:第一生成模块,用于将所述element-wise算子逐个实现底层opencl kernel;封装模块,用于将所述底层opencl kernel的设备端代码和功能进行封装,生成opencl算子。13.根据权利要求9所述的装置,其特征在于,所述适配单元还用于:将计算加速库的算子实现对应的底层opencl kernel,并封装生成对应opencl算子,并在tensorflow中注册。14.根据权利要求9所述的装置,其特征在于,所述第二调用单元包括:第二生成模块,用于在streamexecutor中实现opencl platform,并注册到tensorflow框架中;创建模块,用于所述opencl platform为根据指令进行创建、指定对应的设备platform;第三生成模块,用于在streamexecutor中实现opencl executor,并注册到tensorflow框架中;注册模块,用于在streamexecutor中的librarysupport层完成计算加速库的注册和接入;绑定模块,用于在tensorflow框架中将计算加速库中对应的算子与opencl设备绑定并进行注册。15.根据权利要求9-13所述的装置,其特征在于,所述装置还包括:优化单元,用于对opencl kernel和opencl算子的实现过程进行优化。16.根据权利要求15所述的装置,其特征在于,所述优化单元包括:初始化模块,用于使用单例模式实现opencl平台、设备、上下文和命令队列opencl的初始化;缓存模块,用于缓存opencl kernel程序的编译结果;优化模块,用于利用规约算法优化原子操作。
17.一种电子设备,其特征在于,包括:至少一个处理器;以及与所述至少一个处理器通信连接的存储器;其中,所述存储器存储有可被所述至少一个处理器执行的指令,所述指令被所述至少一个处理器执行,以使所述至少一个处理器能够执行权利要求1-8中任一项所述的方法。18.一种存储有计算机指令的非瞬时计算机可读存储介质,其特征在于,所述计算机指令用于使所述计算机执行根据权利要求1-8中任一项所述的方法。19.一种计算机程序产品,其特征在于,包括计算机程序,所述计算机程序在被处理器执行时实现根据权利要求1-8中任一项所述的方法。

技术总结
本公开提供一种OpenCL TensorFlow的实现方法及装置、电子设备和存储介质。基于OpenCL编程标准,实现TensorFlow设备层的OpenCL Device支持;参照TensorFlow中的预设kernel的计算功能,基于OpenCL编程标准实现对应计算功能的OpenCL kernel和OpenCL算子;基于OpenCL编程标准,实现OpenCLElement-wise算子库;将任务所需的计算加速库,进行OpenCL标准的适配;利用第一OpenCL计算加速库的API接口实现集成调用;实现StreamExecutor对OpenCL的支持,利用StreamExecutor的OpenCL后端实现对第二OpenCL计算加速库的集成调用。本发明实现了OpenCL版本的TensorFlow框架,从而实现TensorFlow框架对不同厂商的多类型异构设备的支持。的支持。的支持。


技术研发人员:张玉志 孙羽菲 陈锐 隋轶丞 郭强 石昌青 程大果 陈禹乔 张宇哲
受保护的技术使用者:南开大学
技术研发日:2022.06.20
技术公布日:2022/11/1
转载请注明原文地址: https://tieba.8miu.com/read-10144.html

最新回复(0)