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