Bru*_*uno 11 c# exception tensorflow tensorflowsharp
我尝试用TensorFlowSharp构建一个小的tensorflow应用程序,有时我收到这个异常:
托管调试助手'CallbackOnCollectedDelegate'
对于函数TensorFlowSharp!TensorFlow.TFBuffer + BufferReleaseFunc :: Invoke
我试图找出它意味着什么,但我没有完全理解这些解释.这是引发异常的代码的一部分:
var graph = new TFGraph();
var model = File.ReadAllBytes(ModelsFile);
graph.Import(model, "");
Run Code Online (Sandbox Code Playgroud)
有人知道我应该做些什么来防止这种异常吗?
布鲁诺
我认为这是 TensorflowSharp 中的一个错误。
该错误看起来像是 CLR 代码中通常不一致的访问冲突(通常仅在重负载或随机尝试次数时发生)。引用微软文档:
如果委托
callbackOnCollectedDelegate作为函数指针从托管代码编组到非托管代码,并且在委托被垃圾收集后在该函数指针上放置回调,则托管调试助手 (MDA) 将被激活。
当创建函数指针并暴露给非托管代码的委托被垃圾收集时,就会发生此类错误。当非托管组件尝试调用函数指针时,它会生成访问冲突。失败看起来是随机的,因为它取决于垃圾收集发生的时间。
解决方案可能很困难,因为一旦委托被编组为非托管函数指针,垃圾收集器就无法跟踪其生命周期。相反,需要在非托管函数指针的生命周期内保留对委托的引用。为此,必须在 TensorFlowShapr 的代码(或您的代码)中识别所收集的错误委托。
您还可以启用 gcUnmanagedToManaged MDA 在每次回调到运行时之前强制进行垃圾回收。通过确保垃圾收集始终在回调之前发生,这将消除垃圾收集带来的不确定性。一旦您知道收集了哪些委托,请更改代码以在封送非托管函数指针的生命周期内在托管端保留对该委托的引用。
所以,我想最好向图书馆的制造者报告这一点。