【问题标题】: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 版

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-08-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-09-25
      相关资源
      最近更新 更多