ML.NET: "Exception has been thrown by the target of an invocation" после публикации на IIS
Создал и обучил модель классификации изображений. После чего добавил ее в мой ASP.NET веб-API по руководству. При запуске локально все отлично работает. Модель классифицирует изображение. Однако после публикации на IIS происходит ошибка:
"Exception has been thrown by the target of an invocation"
Если убрать из модели ленивую инициализацию PredictionEngine
, то просто логируется необработанное исключение:
"Connection ID "18014398514582257719", Request ID "40000039-0001-fa00-b63f-84710c7967bb": An unhandled exception was thrown by the application."
public partial class Model
{
private readonly MLContext context = new();
private ITransformer? model;
private readonly string filePath;
public Model(string filePath)
{
this.filePath = filePath;
predictionEngine = new(CreatePredictionEngine, LazyThreadSafetyMode.ExecutionAndPublication);
}
public Model(PredictionEnginePool<WineImageData, WineImagePrediction> predictionEnginePool, IOptions<ModelConfiguration> options)
{
filePath = options.Value.FilePath;
predictionEngine = new(() => predictionEnginePool.GetPredictionEngine(options.Value.ModelName), LazyThreadSafetyMode.ExecutionAndPublication);
}
}
Добавление в DI-контейнер:
public static class Extensions
{
public static IServiceCollection AddWineImageModel(this IServiceCollection services, string modelName, string filePath)
{
_ = services.AddPredictionEnginePool<WineImageData, WineImagePrediction>().FromFile(modelName, filePath, true);
_ = services.AddSingleton<ITrainingModel, Model.Model>();
_ = services.AddSingleton<IConsumptionModel, Model.Model>();
return services.Configure<ModelConfiguration>(config =>
{
config.ModelName = modelName;
config.FilePath = filePath;
});
}
}
Изменения #1
Исключение, которoе вызывает проблему System.DllNotFoundException
:
"Unable to load DLL "tensorflow" or one of its dependencies: Не найден указанный модуль. (0x8007007E)"
Ответы (1 шт):
Первым шагом нужно установить vs_redist.x64.exe.
Далее в диспетчере служб IIS в нужном пуле приложений необходимо зайти в дополнительные параметры и во вкладке "Общие" найти поле "Разрешены 32-разрядные приложения". После чего поменять значение этого параметра на False
. Tensorflow работает только в x64-процессах.
После перезапуска приложения вылезло другое исключение, указывающая на то, что библиотеку удалось загрузить:
Unable to find an entry point named 'TF_StringEncodedSize' in DLL 'tensorflow'
Текущее исключение исправляется установкой пакета SciSharp.TensorFlow.Redist, версия которого 2.3.1 или ниже (≤ 2.3.1). После установки пакета и повторной публикации приложения ошибка пропадает.