儲存並載入定型的模型

了解如何在您的應用程式中儲存並載入已定型模型。

在整個模型建置流程中,模型會存留在記憶體中,並可在整個應用程式的生命週期內存取。 不過,一旦應用程式停止執行,如果模型未儲存在本機或遠端的某個位置,即無法再存取。 模型一般會用在其他應用程式定型後的某個點,用於推斷或重新定型。 因此,請務必儲存模型。 使用資料準備和模型定型管線時 (如以下詳加說明者),使用本文件後續章節所述的步驟儲存並載入模型。 雖然這個範例使用線性迴歸模型,但相同的程序適用於其他 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 CoreServerless Web Applications。 若要深入了解,請參閱在 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);