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