Tengine支持GPU / CPU异构调度丨OPEN AI LAB

随着深度学习的快速发展,把深度学习算法部署到嵌入式设备的需求也日益增加。

目前开源的嵌入式推理框架中,有支持ARM CPU加速推理的,也有支持GPU加速的,但这些移动端推理框架中,还没有一个框架能够进行CPU / GPU异构调度。

如今,Tengine作为ARM人工智能平台的软件框架,首次发布支持CPU / GPU异构调度。

Tengine的GPU / CPU异构调度的原理是:

根据算子对计算图(图表)进行切分,切分的子图(子图)再通过调度器分配给相应的设备由于GPU的编程较复杂,我们优先支持神经网络中的常用算子(例如:CONV,POOL,FC等),而对于某些网络中特有的算子(例如检测网络SSD中的PRIORBOX等),我们将这些算子分配给CPU进行计算。
Tengine 的GPU / CPU异构调度的原理
Tengine 的GPU / CPU异构调度的原理

下面我们将演示,如何调用Tengine进行GPU / CPU异构调度,进行检测网络MobilenetSSD的推理加速。

我们的测试环境是Linux的测试平台是开发板萤火虫RK3399:

GPU:Mali-T860CPU:双核Cortex-A72 +四核Cortex-A53

Tengine是通过调用Arm Compute Library(ACL)进行GPU加速,我们使用的ACL版本为18.05:

git clone https://github.com/ARM-software/ComputeLibrary.gitgit checkout v18.05scons Werror = 1 -j4 debug = 0 asserts = 1 neon = 0 opencl = 1 embed_kernels = 1 os = linux arch = arm64-v8a

 为了发挥GPU的最高性能,我们需要设置GPU的频率到最高频率:

sudo suecho“performance”> /sys/devices/platform/ff9a0000.gpu/devfreq/ff9a0000.gpu/governorcat /sys/devices/platform/ff9a0000.gpu/devfreq/ff9a0000.gpu/cur_freq

显示的 GPU 频率应该是 800000000 。 

git clone Tengine项目:

git clone https://github.com/OAID/Tengine.gitcp makefile.config.example makefile.config

在配置文件中打开开关CONFIG_ACL_GPU = y,并指定ACL路径:

CONFIG_ACL_GPU = YACL_ROOT = /家庭/萤火虫/ ComputeLibrary

编译:

make -j4make install

下载MobilenetSSD模型,可以从[Tengine model zoo](https://pan.baidu.com/s/1LXZ8vOdyOo50IXS0CUPp8g)(psw:57vb)下载模型〜/ tengine / models /路径下:

cd example / mobilenet_ssdcmake -DTENGINE_DIR = / home / firefly / tengine

执行时需要设置一些环境变量:

export GPU_CONCAT = 0#禁用gpu run concat,避免cpu和gpu之间频繁的数据传输export ACL_FP16 = 1#enable gpu fp16导出REPEAT_COUNT = 100#重复计数以运行mssd,获得平均时间taskset 0x1 ./MSSD -d acl_opencl#-d acl_opencl使用gpu  ```

设置GPU_CONCAT = 0,是为了避免GPU / CPU在的concat这一层在GPU / CPU频繁来回传输数据造成性能损失;

设置ACL_FP16 = 1,是支持GPU用float16的数据格式进行推理计算;

设置REPEAT_COUNT = 100,是让算法重复执行100次,取平均时间作为性能数据;

taskset 0x1用于绑定CPU0(1A53)执行程序;执行的时候需要加-d acl_opencl来打开使用gpu的开关。

从下图可以看到,GPU用半浮点精度float16的检测结果是正确的。

GPU用半浮点精度float16的检测结果正确无误
GPU用半浮点精度float16的检测结果正确无误

我们对比了 Tengine 用纯 CPU 进行 MobilenetSSD 的推理计算的性能:

Tengine 用纯 CPU 进行 MobilenetSSD 的推理计算的性能对比
 Tengine 用纯 CPU 进行 MobilenetSSD 的推理计算的性能对比

可以看出,通过GPU / CPU异构调度(GPU + 1A53)的性能大约是两个CPU大核A72的性能,且A53的占用率为50%左右。

Tengine支持的GPU / CPU异构调度,有两个方面的优势:

一方面,把NN网络中的主要算子在GPU运行,把特定算子在CPU上运行,使得开发者的开发成本大大降低,开发者可以快速通过Tengine将深度学习算法在GPU / CPU上运行起来。

另一方面,把深度学习算法跑在GPU上,其余的CPU计算资源就可以用于其他算法,比如SLAM中的特征提取,路径规划等算法,充分利用了GPU / CPU计算资源。


关于OPEN AI LAB

OPEN AI LAB(开放智能实验室)于2016年12月成立,由Arm中国联合产业伙伴发起,致力于推动芯片、硬件、算法软件整个产业链的深度合作,加速人工智能产业化应用部署和应用场景边界拓展,为最终实现万物智能贡献力量。

业务合作:[email protected]

了解更多:http://www.openailab.com/?csdn010702

猜你喜欢

转载自blog.csdn.net/weixin_43476455/article/details/85994540