2017-09-09 28 views
11

tôi cố gắng xây dựng một ứng dụng tensorflow chút với TensorFlowSharp và đôi khi tôi nhận được ngoại lệ này:Exception CallbackOnCollectedDelegate khi tạo tensorflow graph

Managed Debugging Assistant 'CallbackOnCollectedDelegate'

Đối với chức năng TensorFlowSharp! TensorFlow.TFBuffer + BufferReleaseFunc :: Gọi

Tôi đã cố gắng tìm hiểu ý nghĩa của nó nhưng tôi đã không hoàn toàn underst và giải thích. Đây là một phần của mã nơi ngoại lệ được ném:

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

Có ai biết tôi nên làm gì để ngăn chặn ngoại lệ này không?

Bruno

+0

https://github.com/pythonnet/pythonnet/issues/473 – denfromufa

+0

@Bruno Vấn đề thực sự là gì? – wp78de

Trả lời

2

Tôi cho rằng đây là lỗi trong TensorflowSharp.

Lỗi có vẻ như vi phạm quyền truy cập thường xuyên không nhất quán trong mã CLR (thường xảy ra dưới tải nặng hoặc số lần thử ngẫu nhiên). Trích dẫn từ Microsoft docs:

Các callbackOnCollectedDelegate quản lý gỡ lỗi trợ lý (MDA) được kích hoạt nếu một đại biểu được marshaled từ quản lý đến mã không được quản lý như một con trỏ hàm và gọi lại được đặt vào đó chức năng con trỏ sau khi các đại biểu đã được thu gom rác.

Loại lỗi này xảy ra khi đại biểu mà từ đó con trỏ hàm được tạo và tiếp xúc với mã không được quản lý là rác được thu thập. Khi thành phần không được quản lý cố gắng gọi trên con trỏ hàm, nó tạo ra một sự vi phạm truy cập. Sự thất bại xuất hiện ngẫu nhiên bởi vì nó phụ thuộc vào khi thu gom rác xảy ra.

Độ phân giải có thể khó khăn, vì khi một đại biểu đã được sắp xếp thành một con trỏ hàm không được quản lý, bộ thu gom rác không thể theo dõi tuổi thọ của nó. Thay vào đó, nó là cần thiết để giữ một tham chiếu đến các đại biểu cho đời của con trỏ hàm không được quản lý. Để làm điều này, đại biểu bị lỗi đã được thu thập, phải được xác định trong mã của TensorFlowShapr (hoặc mã của bạn).

Bạn cũng có thể bật MDA gcUnmanagedToManaged để buộc thu gom rác thải trước mỗi lần gọi lại vào thời gian chạy. Điều này sẽ loại bỏ sự không chắc chắn được giới thiệu bởi bộ sưu tập rác bằng cách đảm bảo rằng một bộ sưu tập rác luôn xảy ra trước khi gọi lại. Khi bạn đã biết đại biểu nào được thu thập, hãy thay đổi mã của bạn để giữ tham chiếu đến ủy quyền đó ở bên được quản lý trong suốt thời gian của con trỏ chức năng không được quản lý không được quản lý.

Vì vậy, tôi đoán tốt nhất là báo cáo điều này với nhà sản xuất thư viện.

2

Tôi chỉ thấy một ứng cử viên tốt cho lỗi này, một đại biểu trong Buffer.cs. Nhưng Miguel đã sửa lỗi này vào ngày 27 tháng 7, sự khác biệt is here. Vì vậy, hãy đảm bảo cập nhật bản sao của bạn. Nếu bạn nhận được nó từ Nuget thì hãy đảm bảo bạn có ít nhất phiên bản 1.30

Các vấn đề liên quan