Getrainde modellen opslaan en laden

Meer informatie over het opslaan en laden van getrainde modellen in uw toepassing.

Tijdens het proces voor het bouwen van modellen bevindt een model zich in het geheugen en is het gedurende de levenscyclus van de toepassing toegankelijk. Zodra de toepassing echter niet meer wordt uitgevoerd, is het niet meer toegankelijk als het model niet lokaal of op afstand wordt opgeslagen. Normaal gesproken worden modellen op een bepaald moment na de training in andere toepassingen gebruikt voor deductie of hertraining. Daarom is het belangrijk om het model op te slaan. Sla modellen op en laad deze met behulp van de stappen die in de volgende secties van dit artikel worden beschreven bij het gebruik van pijplijnen voor gegevensvoorbereiding en modeltraining, zoals hier wordt weergegeven. Hoewel in dit voorbeeld een lineair regressiemodel wordt gebruikt, is hetzelfde proces van toepassing op andere ML.NET algoritmen.

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

Omdat de meeste modellen en gegevensvoorbereidingspijplijnen zijn afgeleid van dezelfde set klassen, zijn de signaturen van de methoden voor opslaan en laden voor deze componenten dezelfde. Afhankelijk van uw toepassing kunt u de pijplijn voor gegevensvoorbereiding en het model combineren in één EstimatorChain, dat één ITransformer oplevert, of ze van elkaar scheiden en zo voor elk een afzonderlijke ITransformer maken.

Een model lokaal opslaan

Wanneer u een model opslaat, hebt u twee dingen nodig:

  1. De ITransformer van het model.
  2. De DataViewSchema van de verwachte invoer van ITransformer.

Nadat het model is getraind, gebruikt u de methode Save om het getrainde model op te slaan in een bestand met de naam model.zip met behulp van de DataViewSchema van de invoergegevens.

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

Een ONNX-model lokaal opslaan

Als u lokaal een ONNX-versie (Open Neural Network Exchange) van uw model wilt opslaan, moet u het NuGet-pakket Microsoft.ML.OnnxConverter installeren.

Als het OnnxConverter pakket is geïnstalleerd, kunt u het gebruiken om uw model op te slaan in de ONNX-indeling. Hiervoor is een Stream object vereist, dat u als een FileStream kunt doorgeven met behulp van de methode File.Create. De File.Create methode gebruikt een tekenreeksparameter die het pad van het ONNX-model vertegenwoordigt.

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

Nadat de stream is gemaakt, kunt u de methode ConvertToOnnx aanroepen, waarbij u het getrainde model, de gegevens waarmee het model is getraind en de stream doorgeeft. Niet alle trainers en transformatoren zijn echter exporteerbaar naar ONNX. Zie de handleidingen Transforms en Het kiezen van een ML.NET Algoritme voor een volledige lijst.

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

Een model laden dat lokaal is opgeslagen

Important

Laad alleen modellen uit vertrouwde bronnen. Het laden van modellen van niet-vertrouwde bronnen is een beveiligingsrisico.

Modellen die lokaal zijn opgeslagen, kunnen worden gebruikt in andere processen of toepassingen, zoals ASP.NET Core en serverloze web-apps. Zie Use ML.NET in Web API and Deploy ML.NET Serverless Web App voor meer informatie.

Gebruik in een afzonderlijke toepassing of een afzonderlijk proces de Load methode samen met het bestandspad om het getrainde model op te halen in uw toepassing.

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

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

Een ONNX-model lokaal laden

Als u een ONNX-model wilt laden voor voorspellingen, installeert u het NuGet-pakket Microsoft.ML.OnnxTransformer.

Als het OnnxTransformer pakket is geïnstalleerd, kunt u een bestaand ONNX-model laden met behulp van de ApplyOnnxModel methode. De vereiste parameter is een tekenreeks die het pad van het lokale ONNX-model is.

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

De ApplyOnnxModel methode retourneert een OnnxScoringEstimator object. Eerst moet u de nieuwe gegevens laden.

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

Laad de nieuwe gegevens in een IDataView met behulp van de LoadFromEnumerable methode.

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

U kunt nu de nieuwe IDataView gebruiken om op de nieuwe gegevens te passen.

estimator.Fit(newHousingDataView);

Nadat u de Fit methode op een estimator van waaruit ApplyOnnxModelhebt gebruikt, kan deze worden opgeslagen als een nieuw model met behulp van de methode Opslaan die wordt beschreven in het lokaal opslaan van een model .

Een model laden dat op afstand is opgeslagen

Als u pijplijnen en modellen voor gegevensvoorbereiding wilt laden die zijn opgeslagen op een externe locatie in uw toepassing, gebruikt u een Stream in plaats van een bestandspad in de 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);
}

Werken met afzonderlijke gegevensvoorbereidings- en modelpijplijnen

Opmerking

Het werken met afzonderlijke pijplijnen voor gegevensvoorbereiding en modeltraining is optioneel. Door pijplijnen te scheiden, is het eenvoudiger om de geleerde modelparameters te inspecteren. Voor voorspellingen is het eenvoudiger om één pijplijn op te slaan en te laden die de bewerkingen voor gegevensvoorbereiding en modeltraining bevat.

Wanneer u met afzonderlijke pijplijnen en modellen voor gegevensvoorbereiding werkt, geldt hetzelfde proces als voor afzonderlijke pijplijnen. Het verschil is dat beide pijplijnen tegelijkertijd moeten worden opgeslagen en geladen.

Opgegeven afzonderlijke pijplijnen voor gegevensvoorbereiding en modeltraining:

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

Pijplijn voor gegevensvoorbereiding en getraind model opslaan

Gebruik de volgende opdrachten om zowel de pijplijn voor gegevensvoorbereiding als het getrainde model op te slaan:

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

Pijplijn voor gegevensvoorbereiding en getraind model laden

Laad in een afzonderlijk proces of een afzonderlijke toepassing de pijplijn voor gegevensvoorbereiding en het getrainde model als volgt:

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