创建张量流图时出现异常CallbackOnCollectedDelegate

时间:2017-09-09 14:30:08

标签: c# tensorflow exception tensorflowsharp

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

  

托管调试助手'CallbackOnCollectedDelegate'

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

我试图找出它意味着什么,但我没有完全理解这些解释。这是抛出异常的代码的一部分:

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

有人知道我应该做些什么来防止这种异常吗?

布鲁诺

2 个答案:

答案 0 :(得分:2)

我认为这是TensorflowSharp中的一个错误。

该错误在CLR代码中看起来通常是不一致的访问冲突(通常仅在重负载或随机尝试次数下发生)。引用微软docs

  

callbackOnCollectedDelegate托管调试助手(MDA)是   如果委托从托管代码封送到非托管代码,则激活   函数指针和回调放在该函数指针上   代表被垃圾收集后。

当从中创建函数指针并向非托管代码公开的委托被垃圾回收时,会发生此类错误。当非托管组件尝试调用函数指针时,它会生成访问冲突。失败似乎是随机的,因为它取决于何时发生垃圾收集。

解决方案可能很困难,因为一旦委托被编组为非托管函数指针,垃圾收集器就无法跟踪其生命周期。相反,需要在非托管函数指针的生命周期内保留对委托的引用。为了做到这一点,必须在TensorFlowShapr的代码(或您的代码)中识别收集的错误委托。

  

您还可以启用gcUnmanagedToManaged MDA来强制垃圾   每次回调到运行时之前的集合。这将删除   通过确保垃圾收集引入的不确定性   垃圾回收总是在回调之前发生。一旦你知道   收集了什么代理,更改代码以保持对引用的引用   在编组生命周期内委托管理方   非托管函数指针。

所以,我想最好把它报告给图书馆的制作者。

答案 1 :(得分:2)

我只看到这个错误的一个好候选人,Buffer.cs中的一个委托。但是Miguel已经在7月27日修复了这个bug,差异is here。因此,请务必更新您的副本。如果您是从Nuget获得的,那么请确保您至少拥有版本1.30