tvm arm gpu opencl
2019.4.27
描述在手机上运行tvm的过程,分gpu/cpu两种情况.
手机上运行tvm的话,考虑到要支持android和ios两个平台,用c++来提高可移植性.
用c++调用tvm,参考本文末尾的 参考2 和 参考3 就可以了.
在手机上安装 参考5(Opencl-Z),能查看手机gpu信息。
华为mate7根本不支持gpu运算.
华为麦芒5看起来支持gpu运算,但tvm会运行出错.
华为Mate10/P10/小米6就可以运行tvm, 华为麦芒5/小米5就不行。
要在手机上运行gpu,需要参考本文末尾的参考4才行.
参考4和参考2/3的区别是:
device_type从kDLCPU变成了kDLGPU.
为了在手机上运行gpu,参考4内的 kDLGPU,要修改成 kDLOpenCL;
如果直接操作了gpu数据,opencl会报告错误:
OpenCL Error, code=-38: CL_INVALID_MEM_OBJECT
参考4和参考2/3还有一个重要的区别,就是对输入/输出数据的处理。
为了把数据复制进gpu,必须调用 TVMArrayCopyFromBytes
。
为了把数据从gpu复制出来,必须调用 TVMArrayCopyToBytes
。
Pc上使用nvida gpu的话,编程接口用cuda.
手机上使用gpu的话,编程接口需要用OpenCL库.
编译tvm,需要opencl的头文件.
从参考6下载opencl.h头文件.
手机上编译tvm,还需要 libOpenCL.so文件.
可以直接从你的手机内,找到libOpenCL.so,下载下来,放到你的ndk目录内去.
我的手机和pc上的ndk目录位置:
手机指令集 | 从手机上下载 | 复制到NDK目录 |
---|---|---|
Armeabi-v7 | /vendor/lib/libOpenCL.so | C:\Users |
Arm64-v8 | /vendor/lib64/libOpenCL.so | C:\Users |
准备好以上的c++代码,opencl.h/.so,就可以编译出tvm so库文件了。
为了在手机上运行起来,需要java UI界面。
可以用tvm自带的android demo(参考7),编译后运行起来。
Tvm自带的代码会从网络下载数据,并且由于调用了linux命令,只能在linux下编译。
编译出android demo app后,就能在手机上测试了。
我们使用gpu的目的是为了提高速度,但是据说是opencl的一个bug,导致tvm gpu在手机上失去了速度优势。
. 问题1是:tvm第一次加载运行模型,opencl调用会非常慢,然后后面就会快起来。对手机app来讲,启动慢,是不可忍受的。
. 问题2是:tvm使用gpu的话,推理(run)确实很快,但是要取得推理(run)的结果(get_output),却非常慢。
问题2参见参考8。
考虑到这两个问题,在手机上,还是用cpu吧,gpu还没法实用。
. 名词1 TVM: 优化模型运算速度,生成能在手机上运行的二进制代码。
. 名词2 GPU:比cpu运算快,专门用于大数据运算.
. 名词3 Tensorflow: google推的人工智能模型训练框架.
tvm网站 https://tvm.ai/
在CPP下使用TVM来部署mxnet模型(以Insightface为例)
https://zhuanlan.zhihu.com/p/55996985?utm_source=wechat_timeline&utm_medium=social&utm_oi=882552529345466368&from=timeline
一步一步解读神经网络编译器TVM(二)利用TVM完成C++端的部署
https://zhuanlan.zhihu.com/p/60981432
tvm_deploy_gpu_sample.cpp
https://gist.github.com/masahi/d6ad36890d087f866de185f19aac3814
检测 android是否支持 opencl(GPU)
https://stackoverflow.com/questions/26795921/does-android-support-opencl
You can use OpenCL-Z Android to check the available and capabilities of OpenCL on Android devices.
OpenCL-Z apk:
https://www.allfreeapk.com/opencl-z,1359401/download.html
https://stackoverflow.com/questions/29082524/android-studio-fatal-error-cl-cl-h-no-such-file-or-directory
Apps/android_deploy
https://github.com/dmlc/tvm/tree/master/apps/android_deploy
https://github.com/dmlc/tvm/issues/979?from=timeline
clEnqueueReadBuffer is too slow
https://stackoverflow.com/questions/32190761/clenqueuereadbuffer-is-too-slow?from=timeline