Press "Enter" to skip to content

Posts published in “未分类”

TVM 踩坑记

1

遇到了一个错误:

tvm/src/runtime/opencl/opencl_device_api.cc:263: No OpenCL platform matched given existing options …

然后找了好多文章,找到了官方的文档,却发现2019年3月就提出了这个问题,是bug,并且被修复了。

现在是2020年3月7日,我不应该再遇到这个bug,于是看了看源代码,发现获取不到我的CL信息

终端里输入

$ clinfo

却显示

clinfo number of platforms 0

然后找了找教程,安装了一下驱动(大环境是我已经安装了 opencl-icd-dev 之类的包了)

sudo apt install mesa-opencl-icd

然后就修好了, clinfo 能打出来东西了:

Number of platforms 1
Platform Name Clover
Platform Vendor Mesa
Platform Version OpenCL 1.1 Mesa 19.2.8
Platform Profile FULL_PROFILE
Platform Extensions cl_khr_icd
Platform Extensions function suffix MESA

Platform Name Clover
Number of devices 0

NULL platform behavior
clGetPlatformInfo(NULL, CL_PLATFORM_NAME, …) Clover
clGetDeviceIDs(NULL, CL_DEVICE_TYPE_ALL, …) Clover
clCreateContext(NULL, …) [default] No devices found in platform
clCreateContextFromType(NULL, CL_DEVICE_TYPE_DEFAULT) No devices found in platform
clCreateContextFromType(NULL, CL_DEVICE_TYPE_CPU) No devices found in platform
clCreateContextFromType(NULL, CL_DEVICE_TYPE_GPU) No devices found in platform
clCreateContextFromType(NULL, CL_DEVICE_TYPE_ACCELERATOR) No devices found in platform
clCreateContextFromType(NULL, CL_DEVICE_TYPE_CUSTOM) No devices found in platform
clCreateContextFromType(NULL, CL_DEVICE_TYPE_ALL) No devices found in platform

ICD loader properties
ICD loader Name OpenCL ICD Loader
ICD loader Vendor OCL Icd free software
ICD loader Version 2.2.11
ICD loader Profile OpenCL 2.1

然后我用RPC跑GPU测试,又遇到了

CommandLine Error: Option 'help-list' registered more than once!

这个问题,淦!

搜了一会,发现了这样一篇文章:https://discuss.tvm.ai/t/llvm-error-option-registered-more-than-once-while-loading-libtvm-so/269/10

其中有一段话:

This happens when you compile TVM runtime with both set(USE_OPENCL ON) and set(USE_LLVM ON)
You should enable only ONE option but not both.

我试了一下,编译的时候开着OPENCL,LLVM关掉,发现错的更离谱了

然后我把OPENCL关掉,LLVM打开,Vulkan打开,还是出错

我试试LLVM打开,OPENCL关闭,Vulkan关闭

(这不就是之前的状态吗???)

睡了一觉,第二天了,

遇到了新的错误:

Using CPU OpenCL device
No OpenCL device

按照tqchen的说法,make clean 然后 make

还是不行(我重装了llvm)

在https://askubuntu.com/questions/809450/installing-opencl-for-svga-ii-adapter

找到这么一段话:

According to the top answer to this question, the Intel SDK does not work on VMWare. It suggests instead trying to use the AMD APP SDK

Now I'm continuing meet the bug.

TVM DOES NOT SUPPORT openjdk-11 !!!

TVM DOES NOT SUPPORT openjdk-11 !!!

TVM DOES NOT SUPPORT openjdk-11 !!!

apt install openjdk-8-jdk ONLY!

Then set JAVA_HOME in your environment!

I cannot type chinese because I have decided to change my system into Ubuntu 18.04 LTS, and I havn't install any input method yet.

Why?

Because I cannot access GPU in my VMWare system, fuck!

Finally I fix all the issues.

When you compile android_rpc, you HAVE TO specify the libOpenCL.so in jni/config.mk, which pulled from your Android phone. Then, download CL-headers from github!

READ THE OFFICIAL INSTRUCTIONS CAREFULLY!!

使用 TVM 不能用最新的工具

0

Android 6.0 以后 so 文件不默认封装在 apk 里

https://testerhome.com/topics/18463

看上面这个链接

修改 AndroidManifest.xml 的 application 字段,添加 android:extractNativeLibs="true" 即可解决问题

<application
android:extractNativeLibs="true"
android:allowBackup="true"
android:label="@string/app_name"

改成 false 也可以,具体注意事项看上面的链接!

具体注意事项看上面的链接!

具体注意事项看上面的链接!

因为上面的链接里讲了 extractNativeLibes 设置 true 或 false 都会带来哪些影响以及解决方法以及签名的顺序!

TVM 安卓部署踩坑

0

按照官方教程来走,先是基于源代码安装 TVM 库,安装之前要把 LLVM 装好。

然后安装 Gradle,Maven

然后编译 TVM4J

编译好之后我开始尝试部署 apps/android_rpc 这个项目

失败。

Gradle 版本不对,Ubuntu 18.04 默认给安装的是 3.x 版本,后来添加的源,upgrade 一下才可以。

然后又遇到了中国傻逼互联网防火墙的问题:Maven 下载速度特别tm慢。

解决了网络的问题之后,我心想能不能把项目丢到 AndroidStudio 里面跑啊,然后我就试了一下

于是

给自己带来了另一个坑

Android Studio 推荐我更新 Gradle

我手贱点了更新

然后版本号对不上了

搞了半天踩意识到是自己手贱更新了Gradle。

折腾了好长一段时间,遇到了新的问题: cannot find class file 'org.apache.tvm.LibInfo' 这个叼问题

我无论怎么 clean 都不行,

然后我重新把 TVM 编译了一遍(我真是傻逼)

clean 了一下,make 了一下,编译完了

依然报错。

折腾了好长一段时间,到了晚上12点,用官方提供的工具怎么也解决不了问题,

Google 了一次又一次,全是失败告终。

我快疯了的时候,突然想到:草,我干嘛不看看他的脚本怎么写的呢

然后发现了这么一段话:

javah -o $CURR_DIR/org_apache_tvm_native_c_api.h -cp "$ROOT_DIR/jvm/core/target/*" org.apache.tvm.LibInfo || exit -1

没错,就是这句话执行失败导致 exit -1,前面还有一堆环境变量:

PATH="$PATH:/usr/local/bin"
CURR_DIR=$(cd dirname $0; pwd)
ROOT_DIR="$CURR_DIR/../../../../../.."

都打到 bash 里,然后运行,

你猜怎么着

报错了!

然后我就查这个 jni 的用法,查到了之后,发现,还是报错

为什么呢?环境变量有问题吗

果然有问题。

(核心)

(上面的那些就是发发牢骚,这里才是解决问题的部分)

我不想继续描述我是怎么发现这个问题的了,就是作出假设 -> 一步步的推翻自己的假设 -> 反馈思考 -> 做出新的假设

重复上面的过程直到问题解决或者我放弃思考

到处翻,发现 android_rpc 项目中的 build.gradle 里面指定了一个 task:(其实是报错给我说的这个 build.gradle 出了错)

task buildJni(type: Exec, description: 'Build JNI libs') {
commandLine 'sh', 'src/main/jni/build.sh'
}

这个 task 的意思是执行 build.sh 这个 script

但是这个 script 里面的 javah 那句话(JNI的命令)会提示找不到 class file 'org.apache.tvm.LibInfo'

奇怪的是 jar 包里有 ‘LibInfo.class’ 这个文件,而且我去看了一下 tvm/jvm/core 文件夹里面,也是有 LibInfo.java 的,所以不应该是我们的包的问题,应该是路径什么的出了错。

把 build.sh 里面的变量打印出来发现,如果我在 tvm/apps/android_rpc/ 这个工作目录里,执行 gradle clean build 的话,$ROOT_DIR 的值并不是它应该有的值,$ROOT_DIR的值应该是 tvm/apps/android_rpc, 也就是这个项目的路径。然而我把这个值打印出来发现, $ROOT_DIR 的值是系统的根目录,在根目录里肯定找不到 LibInfo 啊!

在 android_rpc/app/src/main/jni 这个工作目录执行的话, ROOT_DIR="$CURR_DIR/../../../../../.." 正好跳到 android_rpc 里

然后我手工执行了这个sh,在 build.gradle 里把这个行为给注释掉了

成功!

其实一开始,在 android_rpc 这个目录里执行 gradle clean build 是成功编译出文件的,但是在后面签名的时候给我报了个无法找到什么什么类的错误,然后我决定编译 android_deploy 试试,发现成功了,签名也正常,在 Android 10 手机上也可以正常运行,我就觉得肯定是这个项目的问题。

后来我再次尝试编译 android_rpc 的时候,出现了文章中描述的问题,技艺不精,导致这么长时间才解决这个问题,期间也查阅了大量的资料,中途也想过放弃,但是还是坚持下来了。

2018-3-1 0:36 没有标题

0

0:40 睡觉

明早8:00起来写自我反省。

printf( "Goodbye World. " );

改名啦

0

原先叫

Junyi 的故事客栈 - 一个记录故事的地方

 

现在叫

Junyi 的小屋 - 左之左之 君子宜之

 

 

我也不知道为啥要改名hhh突然就改了。

世界,您好!

1

欢迎使用WordPress。这是您的第一篇文章。编辑或删除它,然后开始写作吧!