chineseocr_lite icon indicating copy to clipboard operation
chineseocr_lite copied to clipboard

linux环境下,c++项目的gpu使用问题

Open MakeSenseL opened this issue 5 years ago • 26 comments

我在linux环境下运行成功了c++项目,onnxruntime下载了对应的gpu版本。但是在程序加载完模型后,查看gpu使用情况,其中并没有相应的显存占用,请问如何让onnxruntime使用gpu加速?

MakeSenseL avatar Nov 25 '20 05:11 MakeSenseL

还有一个小问题,c++项目能否设置只检测英文?

MakeSenseL avatar Nov 25 '20 05:11 MakeSenseL

linux下使用cuda,除了onnxruntime需要对应的运行库以外,

  1. linux可能也要安装特定版本的cuda sdk,具体看使用的onnxruntime是哪个版本,要去官方Release页面找说明。
  2. 代码里要启用OrtSessionOptionsAppendExecutionProvider_CUDA(session_options, 0),参考官方的sample,https://github.com/microsoft/onnxruntime/blob/master/samples/c_cxx/imagenet/main.cc。
  3. 以上内容没有条件测试,我只有AMD显卡,在win下使用DirectML版测试(另一种GPU加速的onnxruntime版本),加载模型出错op不支持。

benjaminwan avatar Nov 26 '20 01:11 benjaminwan

linux下使用cuda,除了onnxruntime需要对应的运行库以外,

  1. linux可能也要安装特定版本的cuda sdk,具体看使用的onnxruntime是哪个版本,要去官方Release页面找说明。
  2. 代码里要启用OrtSessionOptionsAppendExecutionProvider_CUDA(session_options, 0),参考官方的sample,https://github.com/microsoft/onnxruntime/blob/master/samples/c_cxx/imagenet/main.cc。
  3. 以上内容没有条件测试,我只有AMD显卡,在win下使用DirectML版测试(另一种GPU加速的onnxruntime版本),加载模型出错op不支持。

感谢回复,加上这行代码就可以使用cuda了,但是用cuda之后速度反而慢了很多很多

MakeSenseL avatar Nov 26 '20 08:11 MakeSenseL

很奇怪,我在本地也进行了验证,这个版本确实是ORT_GPU比CPU要慢,大约慢了10几倍,不知道您这边有没有头绪

onlyhantenghao avatar Dec 23 '20 03:12 onlyhantenghao

我在Linux环境下运行成功了c ++项目,onnxruntime下载了对应的gpu版本。但是在程序加载完模型后,查看gpu使用情况,其中并没有相应的显着占用,请问如何让onnxruntime使用gpu加速?

您好,我在linux下运行 报错 找不到libOcrLiteNcnn.so无法打开共享对象文件:没有这样的文件或目录,您遇到这个问题了吗

xl111 avatar May 14 '21 03:05 xl111

我在Linux环境下运行成功了c ++项目,onnxruntime下载了对应的gpu版本。但是在程序加载完模型后,查看gpu使用情况,其中并没有相应的显着占用,请问如何让onnxruntime使用gpu加速?

您好,我在linux下运行 报错 找不到libOcrLiteNcnn.so无法打开共享对象文件:没有这样的文件或目录,您遇到这个问题了吗

linux最好自己编译。因为有些底层标准库没法静态链接,而linux发行版太多,库版本不一样,cpu架构不一样,别人机编译的静态库可能你用不了。 找不到libOcrLiteNcnn.so,有几个可能原因:

  1. 与windows不同(win只要放到同一个文件夹就行了),linux的so必须配置动态库的搜索路径,参考项目的编译说明里有关部署的说明

  2. 可能这个so依赖底层标准库的版本不一样,导致这个so你用不了。

  3. 可能平台不同,比如x64的so,不能用在x86的平台上,比如arm的so不能用在pc平台上。

  4. ……总之因为提供的信息太少,而其它的可能性也很多,所以这样的问题其实是回答不了。比如使用什么cpu架构,哪个linux发行版,具体哪个系统版本,C标准库的版本多少,ocr的代码来自哪个仓库或分支,都有可能造成问题。

benjaminwan avatar May 14 '21 03:05 benjaminwan

环境是 liunx redhat6.9 ,我现在是把OcrLiteNcnnJvm.jar 放入到javaweb项目中,中间件weblogic启动,jdk1.7, package com.benjaminwan.ocrlibrary

import java.io.File

class OcrEngine() { init { try { System.load("\home\weblogic\user_projects\domains\test_domain\WebRoot\Linux-Lib-CPU\libOcrLiteNcnn.so"); } catch (e: Exception) { e.printStackTrace() } }

在 2021-05-14 11:45:33,"benjamin wan" @.***> 写道:

我在Linux环境下运行成功了c ++项目,onnxruntime下载了对应的gpu版本。但是在程序加载完模型后,查看gpu使用情况,其中并没有相应的显着占用,请问如何让onnxruntime使用gpu加速?

您好,我在linux下运行 报错 找不到libOcrLiteNcnn.so无法打开共享对象文件:没有这样的文件或目录,您遇到这个问题了吗

linux最好自己编译。因为有些底层标准库没法静态链接,而linux发行版太多,库版本不一样,cpu架构不一样,别人机编译的静态库可能你用不了。 找不到libOcrLiteNcnn.so,有几个可能原因:

与windows不同(win只要放到同一个文件夹就行了),linux的so必须配置动态库的搜索路径,参考项目的编译说明里有关部署的说明

可能这个so依赖底层标准库的版本不一样,导致这个so你用不了。

可能平台不同,比如x64的so,不能用在x86的平台上,比如arm的so不能用在pc平台上。

……总之因为提供的信息太少,而其它的可能性也很多,所以这样的问题其实是回答不了。比如使用什么cpu架构,哪个linux发行版,具体哪个系统版本,C标准库的版本多少,ocr的代码来自哪个仓库或分支,都有可能造成问题。

— You are receiving this because you commented. Reply to this email directly, view it on GitHub, or unsubscribe.

xl111 avatar May 14 '21 06:05 xl111

@xl111

  1. libOcrLiteNcnn.so如果是来自demo ,demo是ubuntu16.04 lts编译的,先用demo里的脚本验证redhat6.9是否能正常跑。
  2. run-test脚本如果能正常得到结果,那么证明so是可以用的,就不需要自己编译so,OcrLiteNcnnJvm.jar只是个最简demo,最好不要直接调用,应该把其中有用的代码集成到自己的项目里,java调用jni也需要配置so搜索路径,自己参考run-test脚本的相关内容。
  3. 如果run-test脚本运行出错,那么证明so不能用,得自己从C++源码编译。

benjaminwan avatar May 14 '21 07:05 benjaminwan

把动态库所在路径加入LD_LIBRARY_PATH搜索路径 这个操作步骤,您那边有吗,怎么添加LD_LIBRARY_PATH搜索路径

在 2021-05-14 15:17:08,"benjamin wan" @.***> 写道:

@xl111

libOcrLiteNcnn.so如果是来自demo ,demo是ubuntu16.04 lts编译的,先用demo里的脚本验证redhat6.9是否能正常跑。 run-test脚本如果能正常得到结果,那么证明so是可以用的,就不需要自己编译so,OcrLiteNcnnJvm.jar只是个最简demo,最好不要直接调用,应该把其中有用的代码集成到自己的项目里,java调用jni也需要配置so搜索路径,自己参考run-test脚本的相关内容。 如果run-test脚本运行出错,那么证明so不能用,得自己从C++源码编译。

— You are receiving this because you were mentioned. Reply to this email directly, view it on GitHub, or unsubscribe.

xl111 avatar May 14 '21 08:05 xl111

@xl111 这个仓库了包含了python,C++,android,C#等项目,之前一直以为你说是C++项目,所以提到了配置LD_LIBRARY_PATH搜索路径。 后来才知道你说的是java项目,是我搞错了,java只需要配置 java.library.path,这个变量百度搜一下就行了,相关文章很多,就不复制粘贴了。

benjaminwan avatar May 14 '21 08:05 benjaminwan

现在运行测试 ./run-test-java.sh 提示Exception in thread "main" java.lang.UnsatisfiedLinkError: no OcrLiteNcnn in java.library.path

@.*** home]# ./run-test-java.sh Setting the Number of Threads=4 Using an OpenMP Environment Variable Gpu版本测试前请先安装Vulkan SDK v1.2.162.0,https://vulkan.lunarg.com/sdk/home 请输入测试选项并回车: 1)CPU, 2)GPU 1 java.library.path=Linux-Lib-CPU modelsDir=models, detName=dbnet_op, clsName=angle_op, recName=crnn_lite_op, keysName=keys.txt, imagePath=images/1.jpg gpuIndex=-1 Exception in thread "main" java.lang.UnsatisfiedLinkError: no OcrLiteNcnn in java.library.path at java.lang.ClassLoader.loadLibrary(ClassLoader.java:1886) at java.lang.Runtime.loadLibrary0(Runtime.java:849) at java.lang.System.loadLibrary(System.java:1088) at com.benjaminwan.ocrlibrary.OcrEngine.(OcrEngine.kt:6) at com.benjaminwan.ocr.MainKt.main(main.kt:53)

在 2021-05-14 16:36:01,"benjamin wan" @.***> 写道:

@xl111 这个仓库了包含了python,C++,android,C#等项目,之前一直以为你说是C++项目,所以提到了配置LD_LIBRARY_PATH搜索路径。 后来才知道你说的是java项目,是我搞错了,java只需要配置 java.library.path,这个变量百度搜一下就行了,相关文章很多,就不复制粘贴了。

— You are receiving this because you were mentioned. Reply to this email directly, view it on GitHub, or unsubscribe.

xl111 avatar May 14 '21 08:05 xl111

linux 下 /etc/profile文件中已经添加了,还是出现Exception in thread "main" java.lang.UnsatisfiedLinkError: no OcrLiteNcnn in java.library.path

LD_LIBRARY_PATH=/usr/lib/Linux-Lib-CPU export LD_LIBRARY_PATH

日志信息 @.*** home]# ./run-test-java.sh Setting the Number of Threads=4 Using an OpenMP Environment Variable Gpu版本测试前请先安装Vulkan SDK v1.2.162.0,https://vulkan.lunarg.com/sdk/home 请输入测试选项并回车: 1)CPU, 2)GPU 1 java.library.path=Linux-Lib-CPU modelsDir=models, detName=dbnet_op, clsName=angle_op, recName=crnn_lite_op, keysName=keys.txt, imagePath=images/1.jpg gpuIndex=-1 Exception in thread "main" java.lang.UnsatisfiedLinkError: no OcrLiteNcnn in java.library.path at java.lang.ClassLoader.loadLibrary(ClassLoader.java:1886) at java.lang.Runtime.loadLibrary0(Runtime.java:849) at java.lang.System.loadLibrary(System.java:1088) at com.benjaminwan.ocrlibrary.OcrEngine.(OcrEngine.kt:6) at com.benjaminwan.ocr.MainKt.main(main.kt:53)

在 2021-05-14 16:36:01,"benjamin wan" @.***> 写道:

@xl111 这个仓库了包含了python,C++,android,C#等项目,之前一直以为你说是C++项目,所以提到了配置LD_LIBRARY_PATH搜索路径。 后来才知道你说的是java项目,是我搞错了,java只需要配置 java.library.path,这个变量百度搜一下就行了,相关文章很多,就不复制粘贴了。

— You are receiving this because you were mentioned. Reply to this email directly, view it on GitHub, or unsubscribe.

xl111 avatar May 14 '21 08:05 xl111

@xl111

  1. java不需要配置LD_LIBRARY_PATH,只需要配置java.library.path就行了

  2. run-test-java.sh里已经配置了java.library.path,所以你运行这个脚本时,该配置的都已经配置好了,那么还是出现找不到so的问题,基本可以确定这个so不能用于你的系统。

  3. 需要注意的是demo提供的这个so是x64的,不能用于32位系统,查看你之前提供的信息,并没有提到你的系统redhat6.9是32位还是64位,所以这里不能判断到底是因为32位系统不能用,还是因为依赖的底层库版本问题。

  4. 这样就只能从源码编译了,需要注意的是,源码编译C++项目时,它的依赖库还有opencv和ncnn,也必须从源码编译。

benjaminwan avatar May 14 '21 09:05 benjaminwan

Linux内核信息 Linux 2.6.32-696.el6.x86_64 #1 SMP Tue Feb 21 00:53:17 EST 2017 x86_64 x86_64 x86_64 GNU/Linux

在 2021-05-14 17:13:02,"benjamin wan" @.***> 写道:

@xl111

java不需要配置LD_LIBRARY_PATH,只需要配置java.library.path就行了

run-test-java.sh里已经配置了java.library.path,所以你运行这个脚本时,该配置的都已经配置好了,那么还是出现找不到so的问题,基本可以确定这个so不能用于你的系统。

需要注意的是demo提供的这个so是x64的,不能用于32位系统,查看你之前提供的信息,并没有提到你的系统redhat6.9是32位还是64位,所以这里不能判断到底是因为32位系统不能用,还是因为依赖的底层库版本问题。

这样就只能从源码编译了,需要注意的是,源码编译C++项目时,它的依赖库还有opencv和ncnn,也必须从源码编译。

— You are receiving this because you were mentioned. Reply to this email directly, view it on GitHub, or unsubscribe.

xl111 avatar May 14 '21 09:05 xl111

@xl111 x86_64是64位的。

benjaminwan avatar May 14 '21 09:05 benjaminwan

嗯嗯 g++ 要不要升级6以上版本呢

在 2021-05-14 17:25:17,"benjamin wan" @.***> 写道:

@xl111 x86_64是64位的。

— You are receiving this because you were mentioned. Reply to this email directly, view it on GitHub, or unsubscribe.

xl111 avatar May 14 '21 10:05 xl111

@xl111 ncnn版编译jni要求g++>=6, onnx版编译jni要求g++>=5, 这个是根据测试结果得出的结论,并非各个依赖库或代码有这样明确的要求。 ncnn版用g++5也能编译通过,但运行的时候会报错。

benjaminwan avatar May 14 '21 14:05 benjaminwan

大神,我这边按照github中的linux环境编译文档,操作不了,您那边有编译linux动态库的方法吗?

在 2021-05-14 22:38:12,"benjamin wan" @.***> 写道:

@xl111 ncnn版编译jni要求g++>=6, onnx版编译jni要求g++>=5, 这个是根据测试结果得出的结论,并非各个依赖库或代码有这样明确的要求。 ncnn版用g++5也能编译通过,但运行的时候会报错。

— You are receiving this because you were mentioned. Reply to this email directly, view it on GitHub, or unsubscribe.

xl111 avatar May 19 '21 03:05 xl111

@xl111 操作不了是碰到什么问题? 文档就是我写的。 如果环境是ubuntu 16,直接用群里提供的完整工程代码就行了。 不是ubuntu的话,就得自己从ncnn,opencv开始研究怎么编译,这就得自己去它俩的开源仓库学习编译需要的环境和工具,等你自己把依赖库编译好了,再替换到到C++工程项目里编译本体,大概就是这样的步骤。

benjaminwan avatar May 19 '21 03:05 benjaminwan

我这边执行build.sh 提示没有文件

在 2021-05-19 11:36:45,"benjamin wan" @.***> 写道:

@xl111 操作不了是碰到什么问题? 文档就是我写的。 如果环境是ubuntu 16,直接用群里提供的完整工程代码就行了。 不是ubuntu的话,就得自己从ncnn,opencv开始研究怎么编译,这就得自己去它俩的开源仓库学习编译需要的环境和工具,等你自己把依赖库编译好了,再替换到到C++工程项目里编译本体,大概就是这样的步骤。

— You are receiving this because you were mentioned. Reply to this email directly, view it on GitHub, or unsubscribe.

xl111 avatar May 19 '21 05:05 xl111

是不是我看的文档错了,您能把编译动态库的流程文档连接 给我发下吗?

在 2021-05-19 13:36:51,"15910250522" @.***> 写道:

我这边执行build.sh 提示没有文件

在 2021-05-19 11:36:45,"benjamin wan" @.***> 写道:

@xl111 操作不了是碰到什么问题? 文档就是我写的。 如果环境是ubuntu 16,直接用群里提供的完整工程代码就行了。 不是ubuntu的话,就得自己从ncnn,opencv开始研究怎么编译,这就得自己去它俩的开源仓库学习编译需要的环境和工具,等你自己把依赖库编译好了,再替换到到C++工程项目里编译本体,大概就是这样的步骤。

— You are receiving this because you were mentioned. Reply to this email directly, view it on GitHub, or unsubscribe.

xl111 avatar May 19 '21 05:05 xl111

@xl111 https://github.com/DayBreak-u/chineseocr_lite/tree/onnx/cpp_projects/OcrLiteNcnn

benjaminwan avatar May 19 '21 06:05 benjaminwan

您的这个linux下编译说明 第四个步骤,中的build.sh文件在哪里能找到???

在 2021-05-19 14:02:50,"benjamin wan" @.***> 写道:

@xl111 https://github.com/DayBreak-u/chineseocr_lite/tree/onnx/cpp_projects/OcrLiteNcnn

— You are receiving this because you were mentioned. Reply to this email directly, view it on GitHub, or unsubscribe.

xl111 avatar May 19 '21 06:05 xl111

@xl111 https://github.com/DayBreak-u/chineseocr_lite/blob/onnx/cpp_projects/OcrLiteNcnn/build.sh

benjaminwan avatar May 19 '21 06:05 benjaminwan

大神,您好,咱们这个识别工具对GLIBC还有要求么 现在出现 java.lang.UnsatisfiedLinkError: /home/Desktop/Linux-Lib-CPU/libOcrLiteNcnn.so: /lib64/libm.so.6: version `GLIBC_2.27' not found (required by /home/xuyl/Desktop/Linux-Lib-CPU/libOcrLiteNcnn.so)

Exception in thread "main" java.lang.UnsatisfiedLinkError: /home/Desktop/Linux-Lib-CPU/libOcrLiteNcnn.so: /lib64/libm.so.6: version `GLIBC_2.27' not found (required by /home/xuyl/Desktop/Linux-Lib-CPU/libOcrLiteNcnn.so) at java.lang.ClassLoader$NativeLibrary.load(Native Method) at java.lang.ClassLoader.loadLibrary1(ClassLoader.java:1965) at java.lang.ClassLoader.loadLibrary0(ClassLoader.java:1890) at java.lang.ClassLoader.loadLibrary(ClassLoader.java:1880) at java.lang.Runtime.loadLibrary0(Runtime.java:849) at java.lang.System.loadLibrary(System.java:1088) at com.benjaminwan.ocrlibrary.OcrEngine.(OcrEngine.kt:6) at com.benjaminwan.ocr.MainKt.main(main.kt:53)

在 2021-05-19 14:13:23,"benjamin wan" @.***> 写道:

@xl111 https://github.com/DayBreak-u/chineseocr_lite/blob/onnx/cpp_projects/OcrLiteNcnn/build.sh

— You are receiving this because you were mentioned. Reply to this email directly, view it on GitHub, or unsubscribe.

xl111 avatar May 21 '21 02:05 xl111

@xl111 linux没有办法完全静态编译,意思就是说像标准C库这种底层的库,必须调用系统自带的,那么系统自带的就有不同的版本了。 比如在某linux(假设为GLIBC2.27)上编译的可执行文件,复制到另一台linux(假设GLIBC2.03或GLIBC2.93),那可能就不能用了。 所以linux都有在线软件仓库(就是官方给你按当前系统编译好的),不然随便要用一个软件都得自己编译就要命了。

解决办法是: 1.正道:从源码编译依赖库,以及项目本身。 2.改ELF:https://blog.csdn.net/Mr_HHH/article/details/83104485

benjaminwan avatar May 21 '21 02:05 benjaminwan