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

gpu版本封装dll供java语言调用,无法使用gpu识别 #102

Closed
qiaonanxiansheng opened this issue Mar 27, 2024 · 5 comments
Closed

Comments

@qiaonanxiansheng
Copy link

自己封装了dll供java调用,为了防止每次初始化模型,所以dll暴漏了3个方法。后面也有截图
1是初始化模型返回识别对象initHandler()
2根据识别对象识别图像rec()
3关闭识别对象closeHandler()

这3个方法暴漏给java调用,在cpu版本运行良好。现在我用gpu版本编译后,直接c++掉,或者生成exe命令行掉都可以使用gpu,但是用java掉rec方法无法使用gpu,jvm会崩溃,初始化和关闭方法没问题。不知道哪里的问题,能否提供一些思路?

java掉初始化handler的时候是成功,也正确返回了handler。掉rec的时候则出问题,报错如下
image

dll中封装的3个方法
image

java调用代码如下:
image

@hiroi-sora
Copy link
Owner

hiroi-sora commented Mar 27, 2024

我怀疑可能是文本编码问题,你可以通过如下思路检查一下:

  1. 在dll中增加一个 test1 接口,传入字符串,原样返回该字符串。java调用该接口,查看输入/输出的字符串是否一致。不一致说明编码有问题。
  2. 在dll中增加一个 test2 接口,传入图片路径,imread读取该图片,保存到另一个位置(如D:/save1.png)。如果java调用报错,说明可能跟opencv有关。如果无报错,说明跟OCR推理组件有关。
  3. 在dll中增加一个 test3 接口,没有参数,固定识别一张图片(如D:/test2.png)。C++调用该接口没问题,那么java调用理论上必然成功。如果java调test2正常而test3报错,说明OCR推理组件在java调用的环境中存在异常。

这样一步步缩减错误范围,最后在小范围内插桩(printf),找到具体的某行问题代码。

@qiaonanxiansheng
Copy link
Author

@hiroi-sora 谢谢哥们,我已经找到问题了,有一个zlibwapi.dll没有拷贝到cuda的bin下面去,这个执行运行没提示,在命令行运行java才提示的。我拷贝进去之后现在可以了,识别速度很快,比mkldnn快3倍左右。另外您封装的这个exe,是不是每次识别都要初始化,那样不是太慢了吗?

@hiroi-sora
Copy link
Owner

是不是每次识别都要初始化

当然不是,只需要初始化一次,后续通过管道传指令识别的时候也是重复调用同一个引擎实例。

@qiaonanxiansheng
Copy link
Author

是不是每次识别都要初始化

当然不是,只需要初始化一次,后续通过管道传指令识别的时候也是重复调用同一个引擎实例。

明白了,我们这边的人可能更习惯dll这种方式,再次感谢您。

@KyleWang-Hunter
Copy link

自己封装了dll供java调用,为了防止每次初始化模型,所以dll暴漏了3个方法。后面也有截图 1是初始化模型返回识别对象initHandler() 2根据识别对象识别图像rec() 3关闭识别对象closeHandler()

这3个方法暴漏给java调用,在cpu版本运行良好。现在我用gpu版本编译后,直接c++掉,或者生成exe命令行掉都可以使用gpu,但是用java掉rec方法无法使用gpu,jvm会崩溃,初始化和关闭方法没问题。不知道哪里的问题,能否提供一些思路?

java掉初始化handler的时候是成功,也正确返回了handler。掉rec的时候则出问题,报错如下 image

dll中封装的3个方法 image

java调用代码如下: image

请问大佬,有没有多线程的版本啊?

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

3 participants