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:
- Het
ITransformer
model. ITransformer
DeDataViewSchema
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 FileStream
File.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 ApplyOnnxModel
hebt 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);