Speichern und Laden trainierter ModelleSave and load trained models

Erfahren Sie, wie Sie trainierte Modelle in Ihre Anwendung laden und dort speichern.Learn how to save and load trained models in your application.

Im gesamten Modellerstellungsprozess liegt ein Modell im Arbeitsspeicher vor, auf das während des gesamten Lebenszyklus der Anwendung zugegriffen werden kann.Throughout the model building process, a model lives in memory and is accessible throughout the application's lifecycle. Doch sobald die Ausführung der Anwendung beendet wird, kann auf das Modell nicht mehr zugegriffen werden, wenn es nicht lokal oder remote gespeichert wird.However, once the application stops running, if the model is not saved somewhere locally or remotely, it's no longer accessible. 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.Typically models are used at some point after training in other applications either for inference or re-training. Aus diesem Grund ist es wichtig, das Modell zu speichern.Therefore, it's important to store the model. Speichern und laden Sie Modelle mithilfe der in den nachfolgenden Abschnitten dieses Dokuments beschriebenen Schritte, wenn Sie Datenvorbereitungs- und Modelltrainingpipelines wie die nachfolgend beschriebenen verwenden.Save and load models using the steps described in subsequent sections of this document when using data preparation and model training pipelines like the one detailed below. Obwohl in diesem Beispiel ein lineares Regressionsmodell verwendet wird, gilt der gleiche Prozess für andere ML.NET-Algorithmen.Although this sample uses a linear regression model, the same process applies to other ML.NET algorithms.

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.Because most models and data preparation pipelines inherit from the same set of classes, the save and load method signatures for these components is the same. 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.Depending on your use case, you can either combine the data preparation pipeline and model into a single EstimatorChain which would output a single ITransformer or separate them thus creating a separate ITransformer for each.

Lokales Speichern eines ModellsSave a model locally

Beim Speichern eines Modells benötigen Sie zwei Dinge:When saving a model you need two things:

  1. Den ITransformer des Modells.The ITransformer of the model.
  2. Das DataViewSchema der erwarteten Eingabe des ITransformer.The DataViewSchema of the ITransformer's expected input.

Speichern Sie nach dem Training des Modells das trainierte Modell mit der Save-Methode in einer Datei namens model.zip unter Verwendung des DataViewSchema der Eingabedaten.After training the model, use the Save method to save the trained model to a file called model.zip using the DataViewSchema of the input data.

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

Laden eines lokal gespeicherten ModellsLoad a model stored locally

Lokal gespeicherte Modelle können in anderen Prozessen oder Anwendungen wie ASP.NET Core und Serverless Web Applications verwendet werden.Models stored locally can be used in other processes or applications like ASP.NET Core and Serverless Web Applications. Unter Vorgehensweise: Bereitstellen eines Machine Learning-Modells über die ASP.NET Core-Web-API und Vorgehensweise: Verwenden des ML.NET-Modells in Azure Functions finden Sie nähere Anleitungen.See Use ML.NET in Web API and Deploy ML.NET Serverless Web App how-to articles to learn more.

Verwenden Sie in separaten Anwendungen oder Prozessen die Load-Methode zusammen mit den Dateipfad, um das trainierte Modell in Ihre Anwendung zu laden.In a separate application or process, use the Load method along with the file path to get the trained model into your application.

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

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

Laden eines remote gespeicherten ModellsLoad a model stored remotely

Um Datenvorbereitungspipelines und an einem Remotespeicherort gespeicherte Modelle in Ihre Anwendung zu laden, verwenden Sie einen Stream anstatt eines Dateipfads in der Load-Methode.To load data preparation pipelines and models stored in a remote location into your application, use a Stream instead of a file path in the Load method.

// 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 ModellpipelinesWorking with separate data preparation and model pipelines

Hinweis

Arbeiten mit separaten Datenvorbereitungs- und Modelltrainingspipelines ist optional.Working with separate data preparation and model training pipelines is optional. Die Trennung von Pipelines erleichtert die Überprüfung der gelernten Modellparameter.Separation of pipelines makes it easier to inspect the learned model parameters. Für Vorhersagen ist es einfacher, eine einzelne Pipeline zu speichern und zu laden, die die Datenvorbereitungs- und Modelltrainingsvorgänge enthält.For predictions, it's easier to save and load a single pipeline that includes the data preparation and model training operations.

Bei der Arbeit mit separaten Datenvorbereitungspipelines und Modellen wird derselbe Prozess wie bei einzelnen Pipelines durchgeführt, mit dem Unterschied, dass nun beide Pipelines gleichzeitig gespeichert und geladen werden müssen.When working with separate data preparation pipelines and models, the same process as single pipelines applies; except now both pipelines need to be saved and loaded simultaneously.

Bei separaten Datenvorbereitungs- und Modelltrainingspipelines:Given separate data preparation and model training pipelines:

// 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 von Datenvorbereitungspipeline und trainiertem ModellSave data preparation pipeline and trained model

Um Datenvorbereitungspipeline und trainiertes Modell zu speichern, verwenden Sie die folgenden Befehle:To save both the data preparation pipeline and trained model, use the following commands:

// 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 ModellLoad data preparation pipeline and trained model

Laden Sie in einem separaten Prozess oder einer separaten Anwendung die Datenvorbereitungspipeline und das trainierte Modell gleichzeitig wie folgt:In a separate process or application, load the data preparation pipeline and trained model simultaneously as follows:

// 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);