创建 TensorFlow 图时出现“CallbackOnCollectedDelegate 异常”。

11

我尝试使用TensorFlowSharp构建一个小型的tensorflow应用程序,有时会收到以下异常:

Managed Debugging Assistant 'CallbackOnCollectedDelegate'

对于函数TensorFlowSharp!TensorFlow.TFBuffer+BufferReleaseFunc::Invoke

我尝试找出其含义,但没有完全理解说明。这是抛出异常的代码部分:

var graph = new TFGraph();
var model = File.ReadAllBytes(ModelsFile);
graph.Import(model, "");

有人知道我应该怎么做来防止这个异常吗?

Bruno


https://github.com/pythonnet/pythonnet/issues/473 - denfromufa
{btsdaf} - wp78de
2个回答

2
我认为这是TensorflowSharp中的一个错误。
错误看起来像是CLR代码中通常发生的不一致访问冲突(通常只在重负载或尝试次数随机时发生)。引用微软docs的说法:
“如果将委托从托管代码封送到非托管代码作为函数指针,并且在委托被垃圾回收后在该函数指针上放置回调,则会激活callbackOnCollectedDelegate(MDA)托管调试助手。”
当委托从创建函数指针并暴露给非托管代码的状态变为垃圾回收时,就会出现这种类型的错误。当非托管组件尝试调用函数指针时,会生成访问冲突。失败似乎是随机的,因为它取决于何时进行垃圾回收。
解决这个问题可能会很困难,因为一旦委托被封送成非托管函数指针,垃圾回收器就无法跟踪其生命周期。相反,需要在非托管函数指针的生命周期内保留对委托的引用。为了做到这一点,在 TensorFlowSharp 的代码(或您的代码)中必须识别出已收集的有故障的委托。

您还可以启用 gcUnmanagedToManaged MDA,在每次回调运行时之前强制进行垃圾回收。这将通过确保在回调之前始终进行垃圾回收来消除垃圾回收引入的不确定性。一旦知道哪个委托被收集,就更改您的代码,以便在封送的非托管函数指针的生命周期内保留对该委托的引用。

所以,我想最好向库的制造商报告此问题。

2

我只看到这个 bug 的一个好的候选者,就是 Buffer.cs 中的委托。但是 Miguel 已经在 7 月 27 日修复了这个 bug,差异在这里。所以请确保更新您的副本。如果您从 Nuget 获取它,请确保您至少有版本 1.30。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接