Číst v angličtině

Sdílet prostřednictvím


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.

C#
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.

C#
// 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.

C#
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 .

C#
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.

C#
//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.

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

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

C#
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

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

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

C#
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ě.

C#
// 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:

C#
// 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:

C#
// 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:

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