Uložení a načtení vytrénovaných modelů

Zjistěte, jak ukládat a načítat vytrénované modely ve vaší aplikaci.

Během procesu sestavování modelu se model nachází v paměti a je přístupný po celou dobu životního cyklu aplikace. Jakmile se ale aplikace zastaví a model se neuloží místně nebo vzdáleně, už nebude přístupný. Modely se obvykle používají v určité chvíli po trénování v jiných aplikacích, a to buď k odvozování, nebo k přetrénování. Proto je důležité uložit model. Modely můžete ukládat a načítat pomocí kroků popsaných v následujících částech tohoto dokumentu, pokud používáte kanály pro přípravu dat a trénování modelu, jako je ten, který je podrobně popsaný níže. I když tato ukázka používá model lineární regrese, stejný proces platí pro jiné ML.NET.

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

Vzhledem k tomu, že většina modelů a kanálů přípravy dat dědí ze stejné sady tříd, podpisy metody ukládání a načítání pro tyto komponenty jsou stejné. V závislosti na vašem případu použití můžete buď zkombinovat kanál a EstimatorChainITransformerITransformer model přípravy dat do jednoho, jehož výstupem by byl jeden, nebo je oddělit a vytvořit tak samostatný kanál pro každý z nich.

Místní uložení modelu

Při ukládání modelu potřebujete dvě věci:

  1. Model ITransformer .
  2. Hodnoty DataViewSchema očekávaného ITransformervstupu

Po natrénování modelu pomocí Save metody uložte natrénovaný model do souboru s názvem model.zipDataViewSchema pomocí vstupních dat.

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

Místní uložení modelu ONNX

K místnímu uložení verze ONNX modelu budete potřebovat Microsoft.ML. Nainstalovaný NuGet OnnxConverter.

S nainstalovaným OnnxConverter balíčkem ho můžeme použít k uložení našeho modelu do formátu ONNX. To vyžaduje objekt Stream , který můžeme zadat jako FileStream pomocí File.Create metody . Metoda File.Create přebírá řetězec jako parametr, který bude cestou k modelu ONNX.

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

Když máme vytvořený datový proud, ConvertToOnnx můžeme zavolat metodu a dát jí vytrénovaný model, data používaná k trénování modelu a datový proud. Ne všichni školitelé a transformátory se ale do ONNX exportuje. Úplný seznam najdete v příručkách Transformacea Výběr algoritmu ML.NET.

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

Načtení místně uloženého modelu

Modely uložené místně je možné použít v jiných procesech nebo aplikacích, jako jsou ASP.NET Core a Serverless Web Applications. Další informace najdete v článcích o použití ML.NET ve webovém rozhraní API a nasazení ML.NET bez serveru webové aplikace.

V samostatné aplikaci nebo procesu použijte metodu Load společně s cestou k souboru a natrénovaný model do své aplikace.

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

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

Místní načtení modelu ONNX

K načtení do modelu ONNX pro předpovědi budete potřebovat Microsoft.ML. OnnxTransformer NuGet balíček.

S nainstalovaným OnnxTransformer balíčkem můžete načíst existující model ONNX pomocí ApplyOnnxModel metody . Požadovaný parametr je řetězec, který je cestou k místnímu modelu ONNX.

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

Metoda ApplyOnnxModel vrátí OnnxScoringEstimator objekt . Nejprve musíme načíst nová data.

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

S novými daty je můžeme načíst do pomocí IDataViewLoadFromEnumerable metody .

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

Teď můžeme použít nové, aby se IDataView vešly na nová data.

estimator.Fit(newHousingDataView);

Po použití metody Fit na estimátoru ApplyOnnxModelz nástroje ji pak můžete uložit jako nový model pomocí zmíněné metody Savea uložit model místně.

Načtení modelu uloženého vzdáleně

Pokud chcete do aplikace načíst kanály a modely přípravy dat uložené ve vzdáleném umístění, Stream použijte místo cesty k souboru v metodě Load .

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

Práce s oddělenými kanály pro přípravu dat a model

Poznámka

Práce s oddělenými kanály pro přípravu dat a trénování modelu je volitelná. Oddělení kanálů usnadňuje kontrolu naučených parametrů modelu. V případě předpovědí je snazší uložit a načíst jeden kanál, který zahrnuje operace přípravy dat a trénování modelu.

Při práci s oddělenými kanály a modely přípravy dat platí stejný proces jako pro jednotlivé kanály. Až na to, že teď je potřeba oba kanály uložit a načíst současně.

Samostatné kanály pro přípravu dat a trénování modelu:

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

Uložení kanálu přípravy dat a vytrénovaných modelů

Pokud chcete uložit kanál přípravy dat i natrénovaný model, použijte následující příkazy:

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

Načtení kanálu přípravy dat a vytrénovaných modelů

V samostatném procesu nebo aplikaci načtěte současně kanál přípravy dat a vytrénovaný model následujícím způsobem:

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