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 шт):

Автор решения: boom5251

Первым шагом нужно установить 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). После установки пакета и повторной публикации приложения ошибка пропадает.

→ Ссылка