Enregistrer et charger des modèles entraînés

Découvrez comment enregistrer et charger des modèles entraînés dans votre application.

Durant le processus de création de modèle, un modèle se trouve dans la mémoire et est accessible tout au long du cycle de vie de l’application. Toutefois, dès la fin de l’exécution de l’application, le modèle n’est plus accessible s’il n’est pas enregistré localement ou à distance. En général, les modèles sont utilisés après l’entraînement dans d’autres applications à des fins d’inférence ou de réentraînement. C’est pourquoi il est important de stocker le modèle. Enregistrez et chargez les modèles à l’aide de la procédure décrite dans les sections suivantes de ce document quand vous utilisez des pipelines de préparation des données et d’entraînement de modèle semblables à celui détaillé ci-après. Bien que cet exemple utilise un modèle de régression linéaire, le même processus s’applique aux autres algorithmes 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");

Étant donné que la plupart des modèles et des pipelines de préparation des données héritent du même ensemble de classes, les signatures des méthodes d’enregistrement et de chargement pour ces composants sont les mêmes. Selon votre cas d’usage, vous pouvez combiner le pipeline de préparation des données et le modèle en un seul EstimatorChain, ce qui devrait produire un seul ITransformer, ou les séparer et créer ainsi un ITransformer distinct pour chacun.

Enregistrer un modèle localement

Quand vous enregistrez un modèle, vous avez besoin de deux choses :

  1. Le ITransformer du modèle.
  2. Le DataViewSchema de l’entrée prévue du ITransformer.

Après avoir entraîné le modèle, utilisez la méthode Save pour enregistrer le modèle entraîné dans un fichier appelé model.zip à l’aide du DataViewSchema des données d’entrée.

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

Enregistrer un modèle ONNX localement

Pour enregistrer une version ONNX de votre modèle localement, vous devez installer le package NuGet Microsoft.ML.OnnxConverter.

Une fois le package OnnxConverter installé, nous pouvons l’utiliser pour enregistrer notre modèle au format ONNX. Cela nécessite un objet Stream que nous pouvons fournir en tant que FileStream à l’aide de la méthode File.Create. La méthode File.Create prend une chaîne en tant que paramètre qui constitue le chemin du modèle ONNX.

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

Une fois le flux créé, nous pouvons appeler la méthode ConvertToOnnx et lui indiquer le modèle entraîné, les données utilisées pour effectuer l’apprentissage du modèle et le flux. Toutefois, certains formateurs et transformateurs ne sont pas exportables vers ONNX. Pour obtenir la liste complète, consultez les guides Transformations et Guide pratique pour choisir un algorithme ML.NET.

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

Charger un modèle stocké localement

Les modèles stockés localement peuvent être utilisés dans d’autres processus ou applications comme ASP.NET Core et Serverless Web Applications. Consultez les articles de procédure Utiliser ML.NET dans l’API web et Déployer une application web serverless ML.NET pour en savoir plus.

Dans une application ou processus distinct, utilisez la méthode Load ainsi que le chemin de fichier pour obtenir le modèle entraîné dans votre application.

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

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

Charger un modèle ONNX localement

Pour charger dans un modèle ONNX pour les prédictions, vous avez besoin du package NuGet Microsoft.ML.OnnxTransformer.

Une fois le package OnnxTransformer installé, vous pouvez charger un modèle ONNX existant à l’aide de la méthode ApplyOnnxModel. Le paramètre requis est une chaîne qui est le chemin du modèle ONNX local.

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

La méthode ApplyOnnxModel retourne un objet OnnxScoringEstimator. Tout d’abord, nous devons charger les nouvelles données.

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

Avec les nouvelles données, nous pouvons les charger dans IDataView à l’aide de la méthode LoadFromEnumerable.

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

Maintenant, nous pouvons utiliser le nouveau IDataView pour s’adapter aux nouvelles données.

estimator.Fit(newHousingDataView);

Après avoir utilisé la méthode Fit sur un estimateur à partir de ApplyOnnxModel, il peut être enregistré en tant que nouveau modèle à l’aide de la méthode Save mentionnée dans la section Enregistrer un modèle localement.

Charger un modèle stocké à distance

Pour charger dans votre application des modèles et des pipelines de préparation des données stockés dans un emplacement distant, utilisez un Stream au lieu d’un chemin de fichier dans la méthode 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);
}

Utilisation de pipelines de modèle et de préparation des données distincts

Notes

L’utilisation de pipelines d’entraînement de modèle et de préparation des données distincts est facultative. La séparation des pipelines facilite l’inspection des paramètres de modèle appris. Pour les prédictions, il est plus facile d’enregistrer et de charger un seul pipeline qui inclut les opérations de préparation des données et d’entraînement de modèle.

Quand vous utilisez des modèles et des pipelines de préparation des données distincts, le même processus que pour les pipelines uniques s’applique ; la seule différence est qu’à présent les deux pipelines doivent être enregistrés et chargés simultanément.

Soient des pipelines d’entraînement de modèle et de préparation des données distincts :

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

Enregistrer le pipeline de préparation des données et le modèle entraîné

Pour enregistrer le pipeline de préparation des données et le modèle entraîné, utilisez les commandes suivantes :

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

Charger le pipeline de préparation des données et le modèle entraîné

Dans une application ou un processus distinct, chargez le pipeline de préparation des données et le modèle entraîné simultanément comme suit :

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