Ukládání a načítání natrénovaných modelů

Naučte se ukládat a načítat natrénované modely ve vaší aplikaci.

V průběhu procesu sestavování modelu se model nachází v paměti a je přístupný v průběhu životního cyklu aplikace. Jakmile se ale aplikace přestane spouštět, pokud se model neuloží místně nebo vzdáleně, nebude už přístupný. Modely se obvykle používají v určitém okamžiku po trénování v jiných aplikacích pro odvozování nebo opětovné trénování. Proto je důležité model uložit. Při použití kanálů přípravy dat a trénování modelů můžete modely ukládat a načítat pomocí kroků popsaných v následujících částech tohoto dokumentu. I když tento vzorek používá lineární regresní model, stejný proces se vztahuje na jiné algoritmy 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 kanál přípravy dat a model zkombinovat do jednoho, který by vypíše EstimatorChain jeden ITransformer nebo oddělený, a tím pro každý z nich vytvořil samostatný ITransformer kanál.

Místní uložení modelu

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

  1. Model ITransformer .
  2. ITransformerOčekávaný DataViewSchema vstup.

Po trénování modelu použijte metodu Save k uložení natrénovaného modelu do souboru volaného model.zip pomocí DataViewSchema 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 modelu ONNX budete potřebovat nainstalovaný balíček NuGet Microsoft.ML.OnnxConverter .

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

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

Pomocí vytvořeného datového proudu můžeme volat metodu ConvertToOnnx a dát jí natrénovaný model, data použitá k trénování modelu a datový proud. Ne všechny trenéry a transformátory se ale dají exportovat do ONNX. Úplný seznam najdete v průvodcích transformací a návody k volbě ML.NET algoritmu .

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

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

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

V samostatné aplikaci nebo procesu použijte Load metodu spolu s cestou k souboru a získejte trénovaný model do vaší 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í v modelu ONNX pro předpovědi budete potřebovat balíček NuGet Microsoft.ML.OnnxTransformer .

S nainstalovaným OnnxTransformer balíčkem můžete pomocí ApplyOnnxModel metody načíst existující model ONNX. Povinný parametr je řetězec, který je cestou místního 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 IDataView metody.LoadFromEnumerable

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

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

estimator.Fit(newHousingDataView);

Jakmile použijete metodu Fit na odhadátoru z ApplyOnnxModel, pak ji můžete uložit jako nový model pomocí metody Save zmíněné uložit model místně oddíl.

Vzdálené načtení modelu

K načtení kanálů přípravy dat a modelů uložených ve vzdáleném umístění do aplikace použijte Stream místo cesty k souboru v Load metodě.

// 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 samostatnými kanály přípravy dat a modelu

Poznámka:

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

Při práci s samostatnými kanály a modely přípravy dat platí stejný proces jako u jednotlivých kanálů; kromě toho, že oba kanály musí být uloženy a načteny současně.

Vzhledem k samostatné přípravě dat a trénovacím kanálům 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 natrénovaného modelu

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 natrénovaného modelu

V samostatném procesu nebo aplikaci načtěte kanál přípravy dat a natrénovaný model současně 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);