我尝试使用TensorFlowSharp构建一个小的tensorflow应用程序,有时我会收到此异常:
托管调试助手'CallbackOnCollectedDelegate'
对于函数 TensorFlowSharp!TensorFlow.TFBuffer + BufferReleaseFunc :: Invoke
我试图找出它意味着什么,但我没有完全理解这些解释。这是抛出异常的代码的一部分:
var graph = new TFGraph();
var model = File.ReadAllBytes(ModelsFile);
graph.Import(model, "");
有人知道我应该做些什么来防止这种异常吗?
布鲁诺
答案 0 :(得分:2)
我认为这是TensorflowSharp中的一个错误。
该错误在CLR代码中看起来通常是不一致的访问冲突(通常仅在重负载或随机尝试次数下发生)。引用微软docs:
callbackOnCollectedDelegate
托管调试助手(MDA)是 如果委托从托管代码封送到非托管代码,则激活 函数指针和回调放在该函数指针上 代表被垃圾收集后。
当从中创建函数指针并向非托管代码公开的委托被垃圾回收时,会发生此类错误。当非托管组件尝试调用函数指针时,它会生成访问冲突。失败似乎是随机的,因为它取决于何时发生垃圾收集。
解决方案可能很困难,因为一旦委托被编组为非托管函数指针,垃圾收集器就无法跟踪其生命周期。相反,需要在非托管函数指针的生命周期内保留对委托的引用。为了做到这一点,必须在TensorFlowShapr的代码(或您的代码)中识别收集的错误委托。
您还可以启用gcUnmanagedToManaged MDA来强制垃圾 每次回调到运行时之前的集合。这将删除 通过确保垃圾收集引入的不确定性 垃圾回收总是在回调之前发生。一旦你知道 收集了什么代理,更改代码以保持对引用的引用 在编组生命周期内委托管理方 非托管函数指针。
所以,我想最好把它报告给图书馆的制作者。
答案 1 :(得分:2)
我只看到这个错误的一个好候选人,Buffer.cs中的一个委托。但是Miguel已经在7月27日修复了这个bug,差异is here。因此,请务必更新您的副本。如果您是从Nuget获得的,那么请确保您至少拥有版本1.30