Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

手机端高用vulkan失败,不是代码问题,也找到了库文件,也不是库文件的问题,ncnn可以正常使用vulkan #2841

Open
deahhh opened this issue Apr 21, 2024 · 6 comments
Labels
User The user ask question about how to use. Or don't use MNN correctly and cause bug.

Comments

@deahhh
Copy link

deahhh commented Apr 21, 2024

1、Linux下作实验,首先MNN_SEP_BUILD=OFF,将MNN_USE_SYSTEM_LIB=ON时编译时提示找不到vulkan;将MNN_USE_SYSTEM_LIB=OFF时,创建runtime时发现使用的是cpu后端,在main函数里使用dlopen也还是不行。系统安装了libvulkan-dev后就能切换到vulkan后端了,但是耗比使用cpu,4个核多三倍,gpu是rtx2070。

2、Arm64下,android自带了libvulkan.so verion=1.1.0(记得在哪里看到MNN使用的是更高级版本),运行时能找到系统的libvulkan.so在/system/lib64/下,但创建runtime时报出段错误,提示说vkGetDeviceQueue函数调用出现问题。改用MNN_USE_SYSTEM_LIB=OFFMNN_SEP_BUILD=OFF,执行时出错日志一模一样,还是去找库,还是找到了,还是这个函数调用出现段错误。

3、linux下使用了多种测试工具(MNNV2Basic,testMNNFromOnnx,GetMNNInfo)测试了模型转换,运算效率。值得一提的是,测试的时候也会依赖libvulkan,平均耗时比使用时快了几倍,大约比cpu还快一倍,也就是比编译出来(执行前后自己添加了时间戳)快大约8~10倍,也许是库的版本是DEBUG版的原因吧。不知道哪里能看到gpu执行时不支持的算子列表,没这个心里不踏实。

4、反复读了FAQ以及一些Issues,感觉能用的方法都用了,不能确定所述含义的地放就遍历地试,结果还是没用上手机端的gpu。希望大神能不吝指教一二。

在此先表示感谢!

所以,到底怎么加载自带的vulkan,是复制到andoid并覆盖系统自带的libvulkan.so吗?哪里能确定所使用的模型中算子在所用后台上是否支持?当前arm上找到了vulkan却报错是因为版本太低还是硬件不支持呢?

@jxt1234
Copy link
Collaborator

jxt1234 commented Apr 23, 2024

  1. 手机上 vulkan 和 opencl 的使用都是 把 MNN_USE_SYSTEN_LIB 关掉,不要用系统库
  2. 一些Android设备上无法在命令行模式下调用 vulkan ,需要在 Android App 中加载使用
  3. 默认绝大部分算子 gpu 都支持的,遇到回退的情况反映为性能变慢,提 issue 即可
  4. 手机上出于性能考虑建议用 MNN_OPENCL ,优化投入相比 vulkan 更多

@jxt1234 jxt1234 added the User The user ask question about how to use. Or don't use MNN correctly and cause bug. label Apr 23, 2024
@deahhh
Copy link
Author

deahhh commented Apr 23, 2024

非常感谢。
我这系统上没有支持opencl,所以只能用vulkan。
算子的f16和f32看来是一起提供的喽。
不要用系统库,是完全不依赖系统库,还是libMNN.so会去找系统库,不用用户操作?
FQA里面的描述很简单,要么直接把后端编入libMNN.so,要么自己手动加载libMNN_CL.so. 很明显,结合当前所有信息,直接把USE_SYSTEM_LIB=OFF以及MNN_SEP_BUILD=OFF就可以用在arm64上了,但是我这里已经试过好多次了,

@jxt1234
Copy link
Collaborator

jxt1234 commented Apr 23, 2024

  1. 是 mnn 运行时加载 libvulkan.so
  2. 报的错是什么,如果是驱动不支持或者找不到库,会有报错

@deahhh
Copy link
Author

deahhh commented Apr 23, 2024

  1. 是 mnn 运行时加载 libvulkan.so

    1. 报的错是什么,如果是驱动不支持或者找不到库,会有报错

提示说vkGetDeviceQueue函数调用出现问题,错误是个空指针解引用。

@deahhh
Copy link
Author

deahhh commented Apr 23, 2024

系统显示是有vulkan库的,版本是1.1.0,里面的接口函数大概340个,其中包含vkGetDeviceQueue

04-18 13:19:52.498  4703  4703 F DEBUG   : signal 11 (SIGSEGV), code 1 (SEGV_MAPERR), fault addr 0x0
04-18 13:19:52.498  4703  4703 F DEBUG   : Cause: null pointer dereference
04-18 13:19:52.498  4703  4703 F DEBUG   :     x0  0000000000000000  x1  0000000000000000  x2  0000000000000000  x3  b400007917ac6648
04-18 13:19:52.498  4703  4703 F DEBUG   :     x4  0000000000000010  x5  0000007796d40698  x6  0000000000000004  x7  0201095c01000341
04-18 13:19:52.498  4703  4703 F DEBUG   :     x8  0000000000000003  x9  b400007917ac6670  x10 b400007957dca580  x11 0000000000000003
04-18 13:19:52.499  4703  4703 F DEBUG   :     x12 0000000000000003  x13 0000000000000003  x14 000124b2e2251400  x15 00000077eb82d208
04-18 13:19:52.499  4703  4703 F DEBUG   :     x16 000000779554c1a0  x17 0000007a984ef2a8  x18 0000007796024000  x19 b400007917ac62d8
04-18 13:19:52.499  4703  4703 F DEBUG   :     x20 b400007917ac6648  x21 0000007796d40938  x22 b400007917ac6308  x23 b400007827af2d40
04-18 13:19:52.499  4703  4703 F DEBUG   :     x24 00000077951f861c  x25 00000077951fa532  x26 0000007796d45000  x27 0000007796d40750
04-18 13:19:52.499  4703  4703 F DEBUG   :     x28 0000000000000000  x29 b400007827af2d40
04-18 13:19:52.499  4703  4703 F DEBUG   :     lr  0000007795424b8c  sp  0000007796d40700  pc  0000007a984ef2a8  pst 0000000060000000
04-18 13:19:52.503  4703  4703 F DEBUG   : backtrace:
04-18 13:19:52.503  4703  4703 F DEBUG   :       #00 pc 00000000000182a8  /system/lib64/libvulkan.so (vkGetDeviceQueue) (BuildId: 405b2739f977f7a6c987dd4826f6aa24)
04-18 13:19:52.503  4703  4703 F DEBUG   :       #01 pc 000000000029fb88  /data/app/~~CMIch1j5Z8hkayJbofLX5g==/com.nigo.gamehelper-SLc3viIYO4xyaCGw9jIUkw==/base.apk!libMNN.so (offset 0x151a000) (BuildId: 6c3b755f85b6ce977b4cc833dbebd3851c2ea564)
04-18 13:19:52.503  4703  4703 F DEBUG   :       #02 pc 00000000002bc0e0  /data/app/~~CMIch1j5Z8hkayJbofLX5g==/com.nigo.gamehelper-SLc3viIYO4xyaCGw9jIUkw==/base.apk!libMNN.so (offset 0x151a000) (BuildId: 6c3b755f85b6ce977b4cc833dbebd3851c2ea564)
04-18 13:19:52.503  4703  4703 F DEBUG   :       #03 pc 00000000002bd5cc  /data/app/~~CMIch1j5Z8hkayJbofLX5g==/com.nigo.gamehelper-SLc3viIYO4xyaCGw9jIUkw==/base.apk!libMNN.so (offset 0x151a000) (BuildId: 6c3b755f85b6ce977b4cc833dbebd3851c2ea564)
04-18 13:19:52.503  4703  4703 F DEBUG   :       #04 pc 0000000000124358  /data/app/~~CMIch1j5Z8hkayJbofLX5g==/com.nigo.gamehelper-SLc3viIYO4xyaCGw9jIUkw==/base.apk!libMNN.so (offset 0x151a000) (BuildId: 6c3b755f85b6ce977b4cc833dbebd3851c2ea564)
04-18 13:19:52.504  4703  4703 F DEBUG   :       #05 pc 0000000000340d5c  /data/app/~~CMIch1j5Z8hkayJbofLX5g==/com.nigo.gamehelper-SLc3viIYO4xyaCGw9jIUkw==/base.apk!libMNN.so (offset 0x151a000) (std::__ndk1::__call_once(unsigned long volatile&, void*, void (*)(void*))+144) (BuildId: 6c3b755f85b6ce977b4cc833dbebd3851c2ea564)
04-18 13:19:52.507   505  4649 D cmr_prev: 14297, prev_pop_preview_buffer: cam_id=1, fd=0x69, chn_id=0x1, valid_num=3, index=10, timestamp=0x2d4a2bae02
04-18 13:19:52.507   505  4649 D cmr_setting: 3007, setting_get_appmode: get appmode -1
04-18 13:19:52.507   505  4649 D cmr_prev: 10996, channel2_dequeue_buffer: app mode =-1

@deahhh
Copy link
Author

deahhh commented May 19, 2024

@jxt1234
非常感谢大神的指点!
请大神再指点一下,这vulkan后端使用怎么会错了呢,linux下本地使用都是正确的,手机端的使用也找到了库文件,而vulkan库经ncnn验证也能调起gpu:

#!/bin/bash
ANDROID_NDK=/home/han/Android/Sdk/ndk/27.0.11718014/

cmake ../../../ \
-DCMAKE_TOOLCHAIN_FILE=$ANDROID_NDK/build/cmake/android.toolchain.cmake \
-DCMAKE_BUILD_TYPE=Release \
-DANDROID_ABI="arm64-v8a" \
-DANDROID_NATIVE_API_LEVEL=android-30  \
-DANDROID_STL=c++_static \
-DMNN_USE_LOGCAT=true \
-DMNN_BUILD_BENCHMARK=ON \
-DMNN_USE_SSE=OFF \
-DMNN_SUPPORT_BF16=OFF \
-DMNN_BUILD_TEST=ON \
-DMNN_BUILD_FOR_ANDROID_COMMAND=true \
-DMNN_VULKAN=ON \
-DMNN_ARM82=ON \
-DMNN_BUILD_CONVERTER=ON \
-DMNN_PORTABLE_BUILD=ON \
-DMNN_SEP_BUILD=OFF \
-DNATIVE_LIBRARY_OUTPUT=. -DNATIVE_INCLUDE_OUTPUT=. $1 $2 $3 $4 $5 $6 $7

2.9.0版是否已经修复这个问题了呢?

@deahhh deahhh changed the title 如何调用自带的 vulkan ,经试验,无论MNN_USE_SYSTEM_LIB怎么设置都还是去找系统的库 手机端高用vulkan失败,不是代码问题,也找到了库文件,也不是库文件的问题,ncnn可以正常使用vulkan May 20, 2024
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
User The user ask question about how to use. Or don't use MNN correctly and cause bug.
Projects
None yet
Development

No branches or pull requests

2 participants