Исключение CallbackOnCollectedDelegate при создании графика тензорного потока

Я пытаюсь создать небольшое приложение tensorflow с TensorFlowSharp, и иногда я получаю это исключение:

Управляемый помощник по отладке 'CallbackOnCollectedDelegate'

Для функции TensorFlowSharp! TensorFlow.TFBuffer + BufferReleaseFunc:: Invoke

Я попытался выяснить, что это значит, но я не совсем понял объяснения. Это часть кода, в котором выбрано исключение:

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

Кто-нибудь знает, что я должен сделать, чтобы предотвратить это исключение?

Бруно

Ответ 1

Я предполагаю, что это ошибка в TensorflowSharp.

Ошибка выглядит как обычно несогласованное нарушение доступа в коде CLR (обычно это происходит только при большой нагрузке или при случайном числе попыток). Цитирование из Microsoft docs:

Управляемый помощник отладки callbackOnCollectedDelegate (MDA) активируется, если делегат переводится с управляемого на неуправляемый код, как указатель функции и обратный вызов помещаются на этот указатель функции после того, как делегат был собран мусором.

Этот тип ошибки возникает, когда делегат, из которого был создан указатель функции и подвергается неуправляемому коду, был собран мусором. Когда неуправляемый компонент пытается вызвать указатель на функцию, он генерирует нарушение доступа. Ошибка возникает случайным образом, поскольку она зависит от того, когда происходит сбор мусора.

Разрешение может быть затруднено, поскольку после делегирования делегата как неуправляемого указателя функции сборщик мусора не может отслеживать его срок службы. Вместо этого требуется сохранить ссылку на делегат на время жизни неуправляемого указателя функции. Чтобы это сделать, ошибочный делегат, который был собран, должен быть идентифицирован в коде TensorFlowShapr (или вашем коде).

Вы также можете включить gcUnmanagedToManaged MDA, чтобы заставить мусор перед каждым обратным вызовом во время выполнения. Это приведет к удалению неопределенность, введенная сбором мусора, путем обеспечения того, чтобы сборка мусора всегда возникает перед обратным вызовом. Как только вы знаете какой делегат был собран, измените свой код, чтобы сохранить ссылку на что делегат на управляемой стороне в течение всей жизни маршалин неуправляемый указатель функции.

Итак, я думаю, лучше сообщить об этом создателю библиотеки.

Ответ 2

Я вижу только одного хорошего кандидата для этой ошибки, делегата в Buffer.cs. Но Мигель уже исправил эту ошибку 27 июля, здесь находится . Поэтому просто убедитесь, что вы обновили свою копию. Если вы получили его от Nuget, убедитесь, что у вас есть хотя бы версия 1.30