PaddleXCsharp icon indicating copy to clipboard operation
PaddleXCsharp copied to clipboard

在C#端无法正常使用GPU做推理

Open zhoujianwen opened this issue 3 years ago • 2 comments

在C#端可以正常使用CPU加载模型与推理,但是使用GPU只能加载模型而不能正常推理,会提示如下错误信息。在C++环境下可以正常CPU和GPU的加载与推理,CPU与GPU的推理接口一样的。 image image

image

W0206 01:15:36.804785 19100 device_context.cc:260] device: 0, cuDNN Version: 7.5. 引发的异常:“System.AccessViolationException”(位于 PaddleXCsharp.exe 中) “System.AccessViolationException”类型的未经处理的异常在 PaddleXCsharp.exe 中发生 尝试读取或写入受保护的内存。这通常指示其他内存已损坏。

“PaddleXCsharp.exe”(CLR v4.0.30319: PaddleXCsharp.exe): 已加载“D:\Program Files (x86)\Microsoft Visual Studio\2019\Enterprise\Common7\IDE\Remote Debugger\x64\Runtime\Microsoft.VisualStudio.Debugger.Runtime.Desktop.dll”。已跳过加载符号。模块进行了优化,并且调试器选项“仅我的代码”已启用。 程序“[2484] PaddleXCsharp.exe: 程序跟踪”已退出,返回值为 0 (0x0)。 程序“[2484] PaddleXCsharp.exe”已退出,返回值为 -1 (0xffffffff)。

系统环境,Windows 10,i5 9400f ,DDR4 24G,RTX 2070 8G,Visual Studio 2019

zhoujianwen avatar Feb 05 '21 17:02 zhoujianwen

在GPU状态下调试接口你可能会遇到以下问题: 1、经过测试之后,发现可能GC提前回收资源导致该问题出现,因为在C++环境使用编译好的DLL测试GPU与CPU模式都是正常的,所在你可能需要解决托管与非托管资源回收的问题。

2、在C#托管内存中,内存回收一般是有GC自动完成的,如果遇到找不到找不到对象的情况,报错信息是“未将对象引用设置到对象的实例”,而非托管内存的找不到对象报错信息是:尝试读取或写入受保护的内存,这通常指示其他内存已损坏。

3、一个非托管对象的操作方式是指针,当内存中的对象被清理掉时,这段内存地址就拒绝指针随意访问,这时指针如果继续访问这段内存,就会报尝试读取或写入受保护的内存这个错误。

zhoujianwen avatar Feb 09 '21 01:02 zhoujianwen

在GPU状态下调试接口你可能会遇到以下问题: 1、经过测试之后,发现可能GC提前回收资源导致该问题出现,因为在C++环境使用编译好的DLL测试GPU与CPU模式都是正常的,所在你可能需要解决托管与非托管资源回收的问题。

2、在C#托管内存中,内存回收一般是有GC自动完成的,如果遇到找不到找不到对象的情况,报错信息是“未将对象引用设置到对象的实例”,而非托管内存的找不到对象报错信息是:尝试读取或写入受保护的内存,这通常指示其他内存已损坏。

3、一个非托管对象的操作方式是指针,当内存中的对象被清理掉时,这段内存地址就拒绝指针随意访问,这时指针如果继续访问这段内存,就会报尝试读取或写入受保护的内存这个错误。

谢谢你的反馈,尽力修复!

LiKangyuLKY avatar Feb 09 '21 11:02 LiKangyuLKY