没有合适的资源?快使用搜索试试~ 我知道了~
TensorFlow框架中OpenCL核函数的测试验证方案设计与实现.docx
1.该资源内容由用户上传,如若侵权请联系客服进行举报
2.虚拟产品一经售出概不退款(资源遇到问题,请及时私信上传者)
2.虚拟产品一经售出概不退款(资源遇到问题,请及时私信上传者)
版权申诉
0 下载量 44 浏览量
2022-11-02
16:46:11
上传
评论
收藏 112KB DOCX 举报
温馨提示
试读
17页
TensorFlow框架中OpenCL核函数的测试验证方案设计与实现.docx
资源详情
资源评论
资源推荐
引言
在深度学习领域,模型训练时所进行的计算通常是大规模数据的简单运算,
利用 GPU 可大幅加速计算,节省训练时间。深度学习框架 TensorFlow
[1]
提供了
基于 CUDA 并行计算编程模型
[2]
的 GPU 加速版本,为使用 NVIDIA GPU 的机器
学习研究提供了便利。对于不支持 CUDA 的国产加速设备,实现 TensorFlow
对 OpenCL 的支持,是使 TensorFlow 可在国产设备上运行的关键。参考已有的
CUDA 核函数,实现相对应的 OpenCL 核函数,是实现 TensorFlow 的 OpenCL
版本的基础。在代码开发过程中,如何验证和测试 OpenCL 核函数就成为了确
保软件研发质量的一个重要问题。
对于验证部分代码正确性的问题,常规方法是编写并执行相关代码的单元
测试
[3]
。TensorFlow 在源码诸多关键目录都提供了测试文件,可以通过 bazel
的测试功能进行各个测试文件所定义的测试
[4-5]
。其中,TensorFlow 源码中与核
函数相关的测试是针对高层封装算子的功能测试,没有针对核函数的直接测试。
如果不先对 OpenCL 核函数进行单元测试,无法保证将 OpenCL 核函数集成到
TensorFlow 后框架系统的正确性,缺陷不容易被发现,致使系统存在隐患;出错
时,也很难快速定位错误。针对以上问题,本文提出了一种与 TensorFlow 源码
框架分离的核函数测试方法,实现了对 OpenCL 核函数快速、便捷和有针对性
的测试。
TensorFlow 提供了一种通过动态链接库加载用户自定义算子的方法
[6]
,本
文使用该方法设计实现 OpenCL 自定义算子,实现了 OpenCL 核函数相关代码
与 TensorFlow 框架源码的分离,以及 OpenCL 相关代码在测试时的快速编译和
运行。TensorFlow 还提供了 raw_ops 命名空间
[7]
,该命名空间下的接口可以对
原始算子进行直接调用。基于动态链接库实现的自定义算子和 raw_ops 命名
空间,本文提出了 OpenCL 核函数的测试验证方案,包括 OpenCL 核函数的自定
义算子代码编写规范、测试代码编写规范、静态测试的代码审核方法和动态测
试流程。本项目依照制定的规范和流程完成了 TensorFlow 下 135 个 CUDA 核
函数向 OpenCL 核函数转换的审核和测试。审核测试按照制定的规范执行,工
作整体行进标准有序,测试反馈及时。
综上所述,本文提出了 TensorFlow 框架中 OpenCL 核函数的测试验证方案,
主要的创新和贡献为:(1)制定了 OpenCL 自定义算子的代码编写规范;(2)
制定了 OpenCL 核函数测试代码的编写规范;(3)制定了 OpenCL 算子代码和
测试代码的审核方法;(4)制定了本项目 OpenCL 核函数的测试流程;(5)完
成了本项目 TensorFlow 源码下 135 个 OpenCL 核函数的测试。
本文第 1 章介绍了和本文相关的已有工作;第 2 章主要介绍了测试方案的
具体设计;第 3 章介绍了利用该方案进行的 OpenCL 核函数测试结果;第 4 章对
本文工作进行了总结。
1 相 关 工 作
1.1 TensorFlow 官方单元测试
TensorFlow 由众多开源工作者共同进行开发维护,为了保证贡献代码的可
行性,TensorFlow 项目要求贡献者对其所贡献的代码单元按照一定的规则设计
必要的测试,这些测试即为 TensorFlow 的官方单元测试。如果一名开发者写了
一个 foo.py 文件,那么他应该相应地写一个 foo_test.py 文件,并在 foo_test.py
文件中实现对 foo.py 文件里面的功能的测试。TensorFlow 的源码遍布带_test
后缀的文件,体现出 TensorFlow 测试的多而繁杂。
TensorFlow 的测试文件可以通过 bazel 工具执行并输出测试日志。有两
种方法可以运行 TensorFlow 官方测试,一种方法是依赖直接安装在操作 系统
上的工具和库进行测试,另一种方法是使用 docker 工具和 TensorFlow 的持续
集成测试脚本进行测试
[8]
。对于依赖直接安装在操作系统上的工具和库进行测
试的方法,在系统安装了 TensorFlow 所需依赖后,可以在设置合适的编译选项
后用“bazel test”命令 去 执 行 指 定 文 件夹下的测 试 。 对 于 使 用 docker 工 具 和
TensorFlow 的持续集成测试脚本进行的测试,只需将测试指令写进持续集成测
试脚本,再使用 TensorFlow 官方提供的 docker 容器执行脚本,即可进行测试,省
去了在本地安装环境的步骤。
TensorFlow 源码内各 处测试的 目的不尽相同,有的测试 计算图构建,有 的
测 试 分 布 式 计 算 。 其 中 , 与 算 子 功 能 相 关 的 测 试 主 要 位 于
tensorflow/python/kernel_tests 目录。该目录下共有 315 个测试文件,对应的
测试对象为 TensorFlow 的官方算子。算子与核函数是多对多关系,即一个算子
可以包含一个或多个核函数,一个核函数可以被一个或多个算子调用。
对于转换的 OpenCL 核函数,只有进一步封装成 OpenCL 算子,并集成嵌入
到 TensorFlow 源码框架中,才能执行官方的算子单元测试。但这样做有三点不
足:第一,算子与核函数是多对多的关系,算子在直接调用核函数之前还会有其
它的处理或者计算的执行,算子单元测试的结果为错误时很难将问题直接定位
到核函数代码;第二,将 OpenCL 核函数集成到框架需要开发者去理清源码代码
逻辑,需要对代码的很多部分进行大量修改,导致核函数无法及时地进行测试和
正确性验证;第三,官方测试编译依赖过多、编译时间较长,测试整体耗时过长,极
大地影响测试的迭代速度。因此,本文设计并实现了针对 OpenCL 核函数的单
元测试解决方案。
1.2 基于动态 链接库的用户自 定义算子
TensorFlow 提供了用户自定义算子的功能,以满足用户用 C++语言设计并
使用 TensorFlow 没有提供的特定运算需求。设计一个自定义算子,包括以下
步骤:
(1) 定义算子接口。自定义算子定义接口的方式与源码内的算子的定义
方式一致,都是通过将接口注册到 TensorFlow 系统来定义。在注册中,需要指
定算子的名称、输入的类型和名称、输出的类型和名称,以及文档字符串和该
算子可能需要的任意特性。通过对 REGISTER_OP 宏的调用可以实现上述功
能。示例代码如下:
REGISTER_OP("NkBiasNHWC")
.Attr("T: numbertype")
.Input("input: T")
.Input("bias: T")
.Output("output: T");
(2) 实现算子的内核。定义算子接口之后,需要为算子提供一个或多个
实现,多个实现一般而言是指注册在不同设备上的实现。对于一个待实现的算
子内 核,首 先需要创建一个继承 OpKernel 类并重写其 Compute 方法的类,在
Compute 方法中,可以通过 context 入参获取输入张量和输出张量等有用信息,
并定义运算逻辑。完成内核的实现后,同样需要将其注册到 TensorFlow 系统,
具体做法是通过 REGISTER_KERNEL_BUILDER 宏将内核指定注册在特定设
备上,如下代码所示:
#define REGISTER_KERNEL(type) \
REGISTER_KERNEL_BUILDER( \
剩余16页未读,继续阅读
罗伯特之技术屋
- 粉丝: 3691
- 资源: 1万+
下载权益
C知道特权
VIP文章
课程特权
开通VIP
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功
评论0