Betanított modellek mentése és betöltése

Megtudhatja, hogyan mentheti és töltheti be a betanított modelleket az alkalmazásban.

A modellkészítési folyamat során a modell a memóriában él, és az alkalmazás teljes életciklusa alatt elérhető. Ha azonban az alkalmazás nem fut, a modell helyi vagy távoli mentése nem lesz elérhető. A modelleket általában egy bizonyos ponton használják más alkalmazásokban való betanítás után, következtetés vagy újratanítás céljából. Ezért fontos a modell tárolása. Mentse és töltse be a modelleket a dokumentum következő szakaszaiban ismertetett lépésekkel adatelőkészítési és modellbetanítási folyamatok használatakor, mint az alább részletezett. Bár ez a minta lineáris regressziós modellt használ, ugyanez a folyamat más ML.NET algoritmusokra is vonatkozik.

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

Mivel a legtöbb modell és adat-előkészítési folyamat ugyanabból az osztálykészletből öröklődik, az összetevők mentési és betöltési metódusa ugyanaz. A használati esettől függően kombinálhatja az adat-előkészítési folyamatot és a modellt egyetlen EstimatorChain , egyetlen ITransformer kimenetet eredményező vagy különálló modellbe, így mindegyikhez külön-külön ITransformer jön létre.

Modell helyi mentése

Modell mentésekor két dologra van szükség:

  1. A ITransformer modell.
  2. ITransformerA DataViewSchema várt bemenet.

A modell betanítása után a Save metódussal mentse a betanított modellt a bemeneti adatok használatával DataViewSchema hívott model.zip fájlba.

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

ONNX-modell helyi mentése

A modell ONNX-verziójának helyi mentéséhez telepítve kell lennie a Microsoft.ML.OnnxConverter NuGet csomagnak.

OnnxConverter A csomag telepítve van, és ezzel menthetjük a modellt ONNX formátumban. Ehhez olyan Stream objektumra van szükség, amelyet a File.Create metódus használatával adhatunk megFileStream. A File.Create metódus egy sztringet vesz fel paraméterként, amely az ONNX-modell elérési útja lesz.

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

A stream létrehozásával meghívhatjuk a ConvertToOnnx metódust, és átadhatjuk neki a betanított modellt, a modell betanítása során használt adatokat és a streamet. Azonban nem minden oktató és transzformátor exportálható az ONNX-be. A teljes listát az Átalakítások és a ML.NET algoritmus kiválasztása útmutatókban találja.

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

Helyileg tárolt modell betöltése

A helyileg tárolt modellek más folyamatokban vagy alkalmazásokban is használhatók, például ASP.NET Core és Serverless Web Applications. További információ: ML.NET használata a Web API-ban és ML.NET kiszolgáló nélküli webalkalmazás üzembe helyezése – útmutató cikkek.

Egy külön alkalmazásban vagy folyamatban használja a Load metódust és a fájl elérési útját a betanított modell alkalmazásba való beolvasásához.

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

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

ONNX-modell helyi betöltése

Ha egy ONNX-modellbe szeretne betöltődni az előrejelzésekhez, szüksége lesz a Microsoft.ML.OnnxTransformer NuGet csomagra.

OnnxTransformer A csomag telepítésével betölthet egy meglévő ONNX-modellt a ApplyOnnxModel módszerrel. A szükséges paraméter egy sztring, amely a helyi ONNX-modell elérési útja.

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

A ApplyOnnxModel metódus egy objektumot OnnxScoringEstimator ad vissza. Először be kell töltenünk az új adatokat.

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

Az új adatokkal betölthetjük azokat egy IDataViewLoadFromEnumerable metódusba.

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

Most már az új IDataView adatokkal is elférünk az új adatokon.

estimator.Fit(newHousingDataView);

Miután a Fit metódust egy becslőn ApplyOnnxModelhasználta, az új modellként menthető a helyi mentési szakaszban említett Save metódussal.

Távolról tárolt modell betöltése

Ha távoli helyen tárolt adatelőkészítési folyamatokat és modelleket szeretne betölteni az alkalmazásba, használja Stream a Load metódus fájlelérési útvonala helyett.

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

Különálló adatelőkészítési és modellfolyamatok használata

Feljegyzés

A különálló adatelőkészítési és modellbetanítási folyamatok használata nem kötelező. A folyamatok elkülönítése megkönnyíti a tanult modellparaméterek vizsgálatát. Az előrejelzésekhez egyszerűbb egyetlen folyamatot menteni és betölteni, amely tartalmazza az adat-előkészítési és modellbetanítási műveleteket.

Ha külön adatelőkészítési folyamatokkal és modellekkel dolgozik, ugyanaz a folyamat érvényes, mint az önálló folyamatokra; kivéve, hogy mindkét folyamatot egyszerre kell menteni és betölteni.

Külön adatelőkészítési és modellbetanítási folyamatok:

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

Adatelőkészítési folyamat és betanított modell mentése

Az adatelőkészítési folyamat és a betanított modell mentéséhez használja az alábbi parancsokat:

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

Adatelőkészítési folyamat és betanított modell betöltése

Egy külön folyamatban vagy alkalmazásban egyszerre töltse be az adat-előkészítési folyamatot és a betanított modellt az alábbiak szerint:

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