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 opnieuw trainen. 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 document worden beschreven bij het gebruik van pijplijnen voor gegevensvoorbereiding en modeltraining, zoals hieronder beschreven. Hoewel in dit voorbeeld een lineair regressiemodel wordt gebruikt, geldt hetzelfde proces voor 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 pijplijnen voor gegevensvoorbereiding overnemen van dezelfde set klassen, zijn de handtekeningen voor opslaan en laden van methoden voor deze onderdelen hetzelfde. Afhankelijk van uw use-case kunt u de pijplijn voor gegevensvoorbereiding en het model combineren in één EstimatorChain pijplijn die één ITransformer uitvoer zou opleveren of die afzonderlijk zou maken ITransformer .

Een model lokaal opslaan

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

  1. Het ITransformer model.
  2. ITransformerDe DataViewSchema verwachte invoer.

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

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

Een ONNX-model lokaal opslaan

Als u een ONNX-versie van uw model lokaal wilt opslaan, moet het NuGet-pakket Microsoft.ML.OnnxConverter zijn geïnstalleerd.

Als het OnnxConverter pakket is geïnstalleerd, kunnen we het gebruiken om ons model op te slaan in de ONNX-indeling. Hiervoor is een Stream object vereist dat we als methode FileStreamFile.Create kunnen opgeven. De File.Create methode neemt een tekenreeks in als een parameter die het pad van het ONNX-model is.

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

Nu de stroom is gemaakt, kunnen we de ConvertToOnnx methode aanroepen en het getrainde model, de gegevens die worden gebruikt om het model te trainen en de stream geven. Niet alle trainers en transformatoren zijn echter exporteerbaar naar ONNX. Ga naar de handleidingen Transformaties en Een ML.NET Algoritme kiezen voor een volledige lijst.

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

Een model laden dat lokaal is opgeslagen

Modellen die lokaal zijn opgeslagen, kunnen worden gebruikt in andere processen of toepassingen zoals ASP.NET Core en Serverless Web Applications. Zie Use ML.NET in Web API and Deploy ML.NET Serverless Web App how-to articles 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 wilt laden in een ONNX-model voor voorspellingen, hebt u het NuGet-pakket Microsoft.ML.OnnxTransformer nodig.

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 moeten we de nieuwe gegevens laden.

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

Met de nieuwe gegevens kunnen we die laden in een IDataView methode.LoadFromEnumerable

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

Nu kunnen we de nieuwe IDataView gebruiken om op de nieuwe gegevens te passen.

estimator.Fit(newHousingDataView);

Nadat u de methode Fit op een estimator van waaruit ApplyOnnxModelhebt gebruikt, kan deze worden opgeslagen als een nieuw model met behulp van de methode Save die wordt vermeld , slaat u een lokaal model op.

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 gegevensvoorbereiding en modelpijplijnen

Notitie

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.

Bij het werken met afzonderlijke pijplijnen en modellen voor gegevensvoorbereiding geldt hetzelfde proces als voor individuele pijplijnen; behalve nu moeten beide pijplijnen tegelijkertijd 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);