Speichern und Laden trainierter Modelle
Erfahren Sie, wie Sie trainierte Modelle in Ihrer Anwendung speichern und laden.
Während des gesamten Modellbauprozesses befindet sich ein Modell im Arbeitsspeicher und kann während des gesamten Lebenszyklus der Anwendung zugänglich sein. Sobald die Anwendung jedoch nicht mehr ausgeführt wird, wenn das Modell nicht lokal oder remote gespeichert wird, kann nicht mehr darauf zugegriffen werden. Modelle werden in der Regel ab einem bestimmten Punkt nach dem Training entweder für Rückschlüsse oder erneutes Training in anderen Anwendungen verwendet. Daher ist es wichtig, das Modell zu speichern. Speichern und laden Sie Modelle mithilfe der in den nachfolgenden Abschnitten dieses Artikels beschriebenen Schritte, wenn Sie Datenvorbereitungs- und Modellschulungspipelinen wie die hier gezeigte verwenden. Obwohl in diesem Beispiel ein lineares Regressionsmodell verwendet wird, gilt derselbe Prozess für andere ML.NET Algorithmen.
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");
Da die meisten Modelle und Datenvorbereitungspipelines von demselben Klassensatz erben, sind die Speicher- und Lademethodensignaturen für diese Komponenten identisch. Abhängig von Ihrem Anwendungsfall können Sie entweder Datenvorbereitungspipeline und Modell in einer einzelnen EstimatorChain
kombinieren, sodass ein einzelner ITransformer
ausgeben würde, oder sie trennen und für beide jeweils einen separaten ITransformer
erstellen.
Lokales Speichern eines Modells
Beim Speichern eines Modells benötigen Sie zwei Dinge:
- Den
ITransformer
des Modells. - Das
DataViewSchema
der erwarteten Eingabe desITransformer
.
Verwenden Sie nach dem Trainieren des Modells die Save
-Methode, um das trainierte Modell in einer Datei mit dem Namen model.zip
mithilfe der DataViewSchema
der Eingabedaten zu speichern.
// Save Trained Model
mlContext.Model.Save(trainedModel, data.Schema, "model.zip");
Lokales Speichern eines ONNX-Modells
Um eine Open Neural Network Exchange (ONNX)-Version Ihres Modells lokal zu speichern, müssen Sie das Microsoft.ML.OnnxConverter NuGet-Paket installieren.
Wenn das OnnxConverter
-Paket installiert ist, können Sie es verwenden, um Ihr Modell im ONNX-Format zu speichern. Dies erfordert ein Stream
-Objekt, das Sie als FileStream
mithilfe der File.Create
-Methode bereitstellen können. Die File.Create
-Methode verwendet einen Zeichenfolgenparameter, der den Pfad des ONNX-Modells darstellt.
using FileStream stream = File.Create("./onnx_model.onnx");
Nachdem der Datenstrom erstellt wurde, können Sie die ConvertToOnnx
-Methode aufrufen, indem Sie ihr das trainierte Modell, die zum Trainieren des Modells verwendeten Daten und den Datenstrom übergeben. Allerdings können nicht alle Trainer und Transformer nach ONNX exportiert werden. Eine vollständige Liste finden Sie in den Leitfäden Transformationen und Auswählen eines ML.NET-Algorithmus.
mlContext.Model.ConvertToOnnx(trainedModel, data, stream);
Lokal gespeichertes Modell laden
Lokal gespeicherte Modelle können in anderen Prozessen oder Anwendungen wie ASP.NET Core- und serverlosen Web-Apps verwendet werden. Weitere Informationen finden Sie unter Verwenden von ML.NET in Web-API- und Deploy ML.NET Serverless Web App.
Verwenden Sie in einer separaten Anwendung oder einem separaten Prozess die Load
Methode zusammen mit dem Dateipfad, um das trainierte Modell in Ihre Anwendung zu integrieren.
//Define DataViewSchema for data preparation pipeline and trained model
DataViewSchema modelSchema;
// Load trained model
ITransformer trainedModel = mlContext.Model.Load("model.zip", out modelSchema);
Lokales Laden eines ONNX-Modells
Um ein ONNX-Modell für Vorhersagen zu laden, installieren Sie das NuGet-Paket Microsoft.ML.OnnxTransformer.
Wenn das OnnxTransformer
-Paket installiert ist, können Sie ein vorhandenes ONNX-Modell mithilfe der ApplyOnnxModel
-Methode laden. Der erforderliche Parameter ist eine Zeichenfolge, die den Pfad des lokalen ONNX-Modells darstellt.
OnnxScoringEstimator estimator = mlContext.Transforms.ApplyOnnxModel("./onnx_model.onnx");
Die ApplyOnnxModel
-Methode gibt ein OnnxScoringEstimator
-Objekt zurück. Zuerst müssen Sie die neuen Daten laden.
HousingData[] newHousingData = new HousingData[]
{
new()
{
Size = 1000f,
HistoricalPrices = new[] { 300_000f, 350_000f, 450_000f },
CurrentPrice = 550_00f
}
};
Laden Sie die neuen Daten in eine IDataView
. Verwenden Sie hierzu die LoadFromEnumerable-Methode.
IDataView newHousingDataView = mlContext.Data.LoadFromEnumerable(newHousingData);
Jetzt können Sie die neue IDataView
verwenden, um sie an die neuen Daten anzupassen.
estimator.Fit(newHousingDataView);
Nachdem Sie die Fit
-Methode für einen Schätzer aus ApplyOnnxModel
ausgeführt haben, können Sie das neue Modell mithilfe der Save-Methode speichern, die im -Abschnitt zum lokalen Speichern eines Modells erwähnt wird.
Ein Modell von einem entfernten Speicherort laden
Um Datenvorbereitungspipelines und an einem Remotespeicherort gespeicherte Modelle in Ihre Anwendung zu laden, verwenden Sie einen Stream
anstatt eines Dateipfads in der Load
-Methode.
// 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);
}
Arbeiten mit separaten Datenvorbereitungs- und Modellpipelines
Anmerkung
Das Arbeiten mit separaten Datenvorbereitungs- und Modellschulungspipelines ist optional. Die Trennung von Pipelines erleichtert das Überprüfen der gelernten Modellparameter. Für Vorhersagen ist es einfacher, eine einzelne Pipeline zu speichern und zu laden, die die Datenvorbereitungs- und Modellschulungsvorgänge umfasst.
Beim Arbeiten mit separaten Datenvorbereitungspipelines und -modellen gilt derselbe Prozess wie bei einzelnen Pipelines. Der Unterschied besteht darin, dass beide Pipelines gleichzeitig gespeichert und geladen werden müssen.
Bei separaten Datenvorbereitungs- und Modelltrainingspipelines:
// 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);
Speichern der Datenvorbereitungspipeline und des trainierten Modells
Verwenden Sie die folgenden Befehle, um sowohl die Datenvorbereitungspipeline als auch das trainierte Modell zu speichern:
// 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");
Laden von Datenvorbereitungspipeline und trainiertem Modell
Laden Sie in einem separaten Prozess oder einer separaten Anwendung die Datenvorbereitungspipeline und das trainierte Modell gleichzeitig wie folgt:
// 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);