You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Azure Function中ML.NET模型传入PredictionEnginePool的部署与调试疑问

ML.NET模型部署到Azure Function(Http Trigger)指南

核心问题解答

模型文件是否需要包含在部署代码中?

两种方案可选:

  • 嵌入项目:适合模型版本固定、需要快速部署和本地调试的场景,模型文件随代码一起打包部署
  • 外部存储加载:适合需要动态上传更新模型的场景,模型存放在Azure Blob等存储服务,不随代码打包

本地调试的路径问题

本地调试时,只要将模型文件设置为复制到输出目录(如果较新则复制),代码中通过Environment.CurrentDirectory拼接路径即可,本地和部署后都能正确访问。


方案一:模型嵌入项目(便捷调试+部署)

前置准备

  1. 将你的模型文件(如Model.zip/Model.mlnet)放到Azure Function项目根目录
  2. 右键模型文件 → 属性 → 设置复制到输出目录为「如果较新则复制」
  3. 安装NuGet包:Microsoft.ML、Microsoft.Extensions.ML

配置与代码示例

Startup.cs(注册PredictionEnginePool)

using Microsoft.Azure.Functions.Extensions.DependencyInjection;
using Microsoft.Extensions.ML;
using YourNamespace;

[assembly: FunctionsStartup(typeof(Startup))]
namespace YourNamespace
{
    public class Startup : FunctionsStartup
    {
        public override void Configure(IFunctionsHostBuilder builder)
        {
            // 拼接模型路径:本地调试指向输出目录,Azure部署指向网站根目录
            var modelPath = Path.Combine(Environment.CurrentDirectory, "Model.zip");

            // 注册PredictionEnginePool,开启文件变化监控(本地修改模型自动重载)
            builder.Services.AddPredictionEnginePool<ModelInput, ModelOutput>()
                .FromFile(modelPath, watchForChanges: true);
        }
    }
}

Http Trigger函数代码

using Microsoft.AspNetCore.Http;
using Microsoft.AspNetCore.Mvc;
using Microsoft.Azure.WebJobs;
using Microsoft.Azure.WebJobs.Extensions.Http;
using Microsoft.Extensions.Logging;
using Microsoft.Extensions.ML;
using YourNamespace;

namespace YourNamespace
{
    public class PredictionFunction
    {
        private readonly PredictionEnginePool<ModelInput, ModelOutput> _predictionPool;

        // 依赖注入PredictionEnginePool
        public PredictionFunction(PredictionEnginePool<ModelInput, ModelOutput> predictionPool)
        {
            _predictionPool = predictionPool;
        }

        [FunctionName("Predict")]
        public async Task<IActionResult> Run(
            [HttpTrigger(AuthorizationLevel.Function, "post", Route = null)] HttpRequest req,
            ILogger log)
        {
            // 读取请求体中的输入数据(JSON格式)
            var input = await req.ReadFromJsonAsync<ModelInput>();
            if (input == null)
            {
                return new BadRequestObjectResult("无效的输入数据");
            }

            // 执行预测
            var prediction = _predictionPool.Predict(input);

            return new OkObjectResult(prediction);
        }
    }
}

方案二:外部存储加载模型(支持动态更新)

如果需要随时上传更新模型,可将模型存放在Azure Blob Storage,启动时下载到本地临时目录加载。

前置准备

  1. 安装NuGet包:Microsoft.ML、Microsoft.Extensions.ML、Azure.Storage.Blobs
  2. 在Azure Blob Storage创建容器,上传模型文件
  3. 在local.settings.json(本地)和Azure Function配置(部署后)添加Blob连接字符串和模型路径

配置与代码示例

Startup.cs(从Blob下载并加载模型)

using Microsoft.Azure.Functions.Extensions.DependencyInjection;
using Microsoft.Extensions.ML;
using Azure.Storage.Blobs;
using YourNamespace;

[assembly: FunctionsStartup(typeof(Startup))]
namespace YourNamespace
{
    public class Startup : FunctionsStartup
    {
        public override void Configure(IFunctionsHostBuilder builder)
        {
            // 从环境变量读取配置
            var blobConnStr = Environment.GetEnvironmentVariable("BlobConnectionString");
            var blobModelPath = Environment.GetEnvironmentVariable("BlobModelPath"); // 示例:models/Model.zip
            var localTempPath = Path.Combine(Path.GetTempPath(), "Model.zip");

            // 下载模型到本地临时目录
            var blobClient = new BlobClient(blobConnStr, "your-container-name", blobModelPath);
            blobClient.DownloadTo(localTempPath);

            // 注册PredictionEnginePool
            builder.Services.AddPredictionEnginePool<ModelInput, ModelOutput>()
                .FromFile(localTempPath);
        }
    }
}

local.settings.json配置示例

{
  "IsEncrypted": false,
  "Values": {
    "AzureWebJobsStorage": "UseDevelopmentStorage=true",
    "FUNCTIONS_WORKER_RUNTIME": "dotnet",
    "BlobConnectionString": "你的Blob连接字符串",
    "BlobModelPath": "models/Model.zip"
  }
}

说明:如需自动更新模型,可添加定时函数定期检查Blob文件的最后修改时间,有变化则重新下载并调用PredictionEnginePool.Reload()重载模型。


本地调试注意事项

  • 确保模型文件的「复制到输出目录」设置正确,避免本地调试时出现文件找不到的错误
  • 隔离进程模型的Function,Environment.CurrentDirectory指向的是函数输出目录,与进程模型行为一致
  • 使用外部存储时,本地调试可通过Azure Storage Emulator模拟Blob服务

内容的提问来源于stack exchange,提问作者Age of Empires

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.14 23:36:21