共用方式為


儲存和載入定型的模型

瞭解如何在應用程式中儲存和載入定型的模型。

在整個模型建置程式中,模型會存留在記憶體中,而且在整個應用程式的生命週期中都可存取。 不過,一旦應用程式停止執行,如果模型未儲存在本機或遠端位置,就無法再存取。 一般而言,模型會在其他應用程式中定型之後於某個時間點使用,以進行推斷或重新定型。 因此,請務必儲存模型。 使用本文後續各節所述的步驟來儲存和載入模型時,採用像這裡所示的資料準備和模型訓練管線。 雖然此範例使用線性回歸模型,但相同的程式會套用至其他 ML.NET 演算法。

HousingData[] housingData = new HousingData[]
{
    new HousingData
    {
        Size = 600f,
        HistoricalPrices = new float[] { 100000f, 125000f, 122000f },
        CurrentPrice = 170000f
    },
    new HousingData
    {
        Size = 1000f,
        HistoricalPrices = new float[] { 200000f, 250000f, 230000f },
        CurrentPrice = 225000f
    },
    new HousingData
    {
        Size = 1000f,
        HistoricalPrices = new float[] { 126000f, 130000f, 200000f },
        CurrentPrice = 195000f
    }
};

// Create MLContext
MLContext mlContext = new MLContext();

// Load Data
IDataView data = mlContext.Data.LoadFromEnumerable<HousingData>(housingData);

// Define data preparation estimator
EstimatorChain<RegressionPredictionTransformer<LinearRegressionModelParameters>> pipelineEstimator =
    mlContext.Transforms.Concatenate("Features", new string[] { "Size", "HistoricalPrices" })
        .Append(mlContext.Transforms.NormalizeMinMax("Features"))
        .Append(mlContext.Regression.Trainers.Sdca());

// Train model
ITransformer trainedModel = pipelineEstimator.Fit(data);

// Save model
mlContext.Model.Save(trainedModel, data.Schema, "model.zip");

由於大部分的模型和數據準備管線都繼承自同一組類別,因此這些元件的儲存和載入方法簽章相同。 根據您的使用情境,您可以將數據準備管線和模型合併成單一的 EstimatorChain,以輸出單一的 ITransformer,或將它們分開,為各自建立一個單獨的 ITransformer

在本機儲存模型

儲存模型時,您需要兩件事:

  1. 模型的 ITransformer
  2. ITransformer預期輸入的 DataViewSchema

將模型定型之後,請使用 Save 方法來使用輸入數據的 DataViewSchema,將定型的模型儲存至名為 model.zip 的檔案。

// Save Trained Model
mlContext.Model.Save(trainedModel, data.Schema, "model.zip");

在本機儲存 ONNX 模型

若要在本機儲存模型的開放式類神經網路交換 (ONNX) 版本,您必須安裝 Microsoft.ML.OnnxConverter NuGet 套件。

安裝 OnnxConverter 套件後,您可以使用它將模型儲存成 ONNX 格式。 這需要 Stream 物件,您可以使用 File.Create 方法,以 FileStream 的形式提供。 File.Create 方法會採用代表 ONNX 模型路徑的字串參數。

using FileStream stream = File.Create("./onnx_model.onnx");

建立數據流之後,您可以呼叫 ConvertToOnnx 方法,並將定型的模型、用來定型模型的數據以及數據流提供給它。 不過,並非所有訓練器和轉換器都可以導出至 ONNX。 如需完整清單,請參閱 轉換如何選擇 ML.NET 演算法 指南。

mlContext.Model.ConvertToOnnx(trainedModel, data, stream);

載入儲存在本機的模型

儲存在本機的模型可用於其他進程或應用程式,例如 ASP.NET Core 和無伺服器 Web 應用程式。 如需詳細資訊,請參閱 在 Web API 中使用 ML.NET 和 部署 ML.NET 無伺服器 Web 應用程式

在不同的應用程式或程式中,使用 Load 方法以及檔案路徑,將定型的模型放入您的應用程式。

//Define DataViewSchema for data preparation pipeline and trained model
DataViewSchema modelSchema;

// Load trained model
ITransformer trainedModel = mlContext.Model.Load("model.zip", out modelSchema);

在本機載入 ONNX 模型

若要在 ONNX 模型中載入預測,請安裝 Microsoft.ML.OnnxTransformer NuGet 套件。

安裝 OnnxTransformer 套件後,您可以使用 ApplyOnnxModel 方法來載入現有的 ONNX 模型。 必要的參數是本機 ONNX 模型路徑的字串。

OnnxScoringEstimator estimator = mlContext.Transforms.ApplyOnnxModel("./onnx_model.onnx");

ApplyOnnxModel 方法會傳回 OnnxScoringEstimator 物件。 首先,您必須載入新資料。

HousingData[] newHousingData = new HousingData[]
{
    new()
    {
        Size = 1000f,
        HistoricalPrices = new[] { 300_000f, 350_000f, 450_000f },
        CurrentPrice = 550_00f
    }
};

使用 LoadFromEnumerable 方法,將新數據載入 IDataView

IDataView newHousingDataView = mlContext.Data.LoadFromEnumerable(newHousingData);

現在您可以使用新的 IDataView 來配合新的數據。

estimator.Fit(newHousingDataView);

在對來自 ApplyOnnxModel的估算器使用 Fit 方法之後,可以使用 儲存模型至本機 章節中描述的 Save 方法將其儲存為新模型。

載入遠端儲存的模型

若要將數據準備管線和儲存在遠端位置的模型載入應用程式,請使用 Stream,而不是 Load 方法中的檔案路徑。

// Create MLContext
MLContext mlContext = new MLContext();

// Define DataViewSchema and ITransformers
DataViewSchema modelSchema;
ITransformer trainedModel;

// Load data prep pipeline and trained model
using (HttpClient client = new HttpClient())
{
    Stream modelFile = await client.GetStreamAsync("<YOUR-REMOTE-FILE-LOCATION>");

    trainedModel = mlContext.Model.Load(modelFile, out modelSchema);
}

使用個別的資料準備和模型流程

注意

使用個別的數據準備和模型定型管線是選擇性的。 管線分離可讓您更輕鬆地檢查學習的模型參數。 針對預測,將數據準備和模型訓練操作整合在一個管道中進行儲存和載入會比較容易。

使用個別的數據準備管線和模型時,會套用與單一管線相同的過程。 差異在於這兩個管線需要同時被儲存和載入。

假設個別的資料準備和模型定型流程:

// Define data preparation estimator
IEstimator<ITransformer> dataPrepEstimator =
    mlContext.Transforms.Concatenate("Features", new string[] { "Size", "HistoricalPrices" })
        .Append(mlContext.Transforms.NormalizeMinMax("Features"));

// Create data preparation transformer
ITransformer dataPrepTransformer = dataPrepEstimator.Fit(data);

// Define StochasticDualCoordinateAscent regression algorithm estimator
var sdcaEstimator = mlContext.Regression.Trainers.Sdca();

// Pre-process data using data prep operations
IDataView transformedData = dataPrepTransformer.Transform(data);

// Train regression model
RegressionPredictionTransformer<LinearRegressionModelParameters> trainedModel = sdcaEstimator.Fit(transformedData);

儲存資料準備流程和訓練後的模型

若要同時儲存數據準備管線和定型模型,請使用下列命令:

// Save Data Prep transformer
mlContext.Model.Save(dataPrepTransformer, data.Schema, "data_preparation_pipeline.zip");

// Save Trained Model
mlContext.Model.Save(trainedModel, transformedData.Schema, "model.zip");

載入資料處理流程和已訓練模型

在不同的進程或應用程式中,同時載入數據準備管線和定型的模型,如下所示:

// Create MLContext
MLContext mlContext = new MLContext();

// Define data preparation and trained model schemas
DataViewSchema dataPrepPipelineSchema, modelSchema;

// Load data preparation pipeline and trained model
ITransformer dataPrepPipeline = mlContext.Model.Load("data_preparation_pipeline.zip",out dataPrepPipelineSchema);
ITransformer trainedModel = mlContext.Model.Load("model.zip", out modelSchema);