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

(更多…)

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。这是您的第一篇文章。编辑或删除它,然后开始写作吧!