Dela via


Spara och läs in tränade modeller

Lär dig hur du sparar och läser in tränade modeller i ditt program.

Under hela modellskapandeprocessen finns en modell i minnet och är tillgänglig under programmets livscykel. Men när programmet slutar köras, om modellen inte sparas någonstans lokalt eller via fjärranslutning, är den inte längre tillgänglig. Modeller används vanligtvis någon gång efter träning i andra program, antingen för slutsatsdragning eller omträning. Därför är det viktigt att lagra modellen. Spara och läs in modeller med hjälp av stegen som beskrivs i efterföljande avsnitt i det här dokumentet när du använder pipelines för dataförberedelse och modellträning, till exempel den som beskrivs nedan. Även om det här exemplet använder en linjär regressionsmodell gäller samma process för andra ML.NET algoritmer.

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

Eftersom de flesta modeller och pipelines för dataförberedelse ärver från samma uppsättning klasser är signaturerna för spara- och inläsningsmetoden för dessa komponenter desamma. Beroende på ditt användningsfall kan du antingen kombinera dataförberedelsepipelinen och modellen till en enda EstimatorChain som skulle mata ut en enda ITransformer eller separera dem och därmed skapa en separat ITransformer för var och en.

Spara en modell lokalt

När du sparar en modell behöver du två saker:

  1. Modellens ITransformer .
  2. För DataViewSchema förväntade ITransformerindata.

När du har tränat modellen använder du Save metoden för att spara den tränade modellen i en fil som heter model.zip med hjälp DataViewSchema av indata.

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

Spara en ONNX-modell lokalt

För att spara en ONNX-version av din modell lokalt behöver du NuGet-paketet Microsoft.ML.OnnxConverter installerat.

OnnxConverter Med paketet installerat kan vi använda det för att spara vår modell i ONNX-format. Detta kräver ett Stream objekt som vi kan ange som ett FileStream med hjälp av File.Create metoden. Metoden File.Create tar in en sträng som en parameter som är sökvägen till ONNX-modellen.

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

När strömmen har skapats kan vi anropa ConvertToOnnx metoden och ge den den tränade modellen, de data som används för att träna modellen och strömmen. Alla tränare och transformatorer kan dock inte exporteras till ONNX. En fullständig lista finns i guiderna Transformeringar och Så här väljer du en ML.NET-algoritm .

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

Läsa in en modell som lagras lokalt

Modeller som lagras lokalt kan användas i andra processer eller program som ASP.NET Core och Serverless Web Applications. Mer information finns i Använda ML.NET i webb-API och distribuera ML.NET serverlösa webbappar .

I ett separat program eller en separat process använder du Load metoden tillsammans med filsökvägen för att hämta den tränade modellen till ditt program.

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

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

Läsa in en ONNX-modell lokalt

Om du vill läsa in en ONNX-modell för förutsägelser behöver du NuGet-paketet Microsoft.ML.OnnxTransformer .

OnnxTransformer När paketet är installerat kan du läsa in en befintlig ONNX-modell med hjälp ApplyOnnxModel av metoden . Den obligatoriska parametern är en sträng som är sökvägen till den lokala ONNX-modellen.

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

Metoden ApplyOnnxModel returnerar ett OnnxScoringEstimator objekt. Först måste vi läsa in nya data.

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

Med de nya data kan vi läsa in dem i en IDataView med hjälp av LoadFromEnumerable metoden.

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

Nu kan vi använda den nya IDataView för att få plats med nya data.

estimator.Fit(newHousingDataView);

När du har använt fit-metoden på en skattare från ApplyOnnxModelkan den sedan sparas som en ny modell med hjälp av save-metodensom nämns spara en modell lokalt.

Läsa in en modell som lagras på distans

Om du vill läsa in pipelines och modeller för förberedelse av data som lagras på en fjärrplats i ditt program använder du en Stream i stället för en filsökväg i Load metoden.

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

Arbeta med separata dataförberedelser och modellpipelines

Kommentar

Det är valfritt att arbeta med separata pipelines för dataförberedelse och modellträning. Separation av pipelines gör det enklare att inspektera inlärda modellparametrar. För förutsägelser är det enklare att spara och läsa in en enda pipeline som innehåller dataförberedelser och modellträningsåtgärder.

När du arbetar med separata pipelines och modeller för dataförberedelse gäller samma process som enskilda pipelines. förutom nu måste båda pipelines sparas och läsas in samtidigt.

Givet separata pipelines för dataförberedelse och modellträning:

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

Spara pipeline för förberedelse av data och tränad modell

Om du vill spara både dataförberedelsepipelinen och den tränade modellen använder du följande kommandon:

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

Läsa in pipeline för förberedelse av data och tränad modell

I en separat process eller ett program läser du in pipelinen för förberedelse av data och tränad modell samtidigt på följande sätt:

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