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

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

Tout au long du processus de création de modèle, un modèle vit en mémoire et est accessible tout au long du cycle de vie de l’application. Toutefois, une fois l’application arrêtée de s’exécuter, si le modèle n’est pas enregistré localement ou à distance, il n’est plus accessible. En règle générale, les modèles sont utilisés à un moment donné après l’entraînement dans d’autres applications pour l’inférence ou la réentraînation. Par conséquent, il est important de stocker le modèle. Enregistrez et chargez des modèles à l’aide des étapes décrites dans les sections suivantes de cet article lors de l’utilisation de pipelines de préparation des données et de formation de modèle comme celui présenté ici. Bien que cet exemple utilise un modèle de régression linéaire, le même processus s’applique à d’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 de méthode d’enregistrement et de chargement pour ces composants sont identiques. En fonction de votre cas d’usage, vous pouvez combiner le pipeline de préparation des données et le modèle en un seul EstimatorChain qui génère un seul ITransformer ou les sépare, créant ainsi un autre pour ITransformer chacun d’eux.

Enregistrer un modèle localement

Pour enregistrer un modèle, il vous faut deux éléments :

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

Après avoir entraîné le modèle, utilisez la Save méthode pour enregistrer le modèle entraîné dans un fichier appelé model.zip à l’aide 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 localement une version d’open neural network Exchange (ONNX) de votre modèle, vous devez installer le package NuGet Microsoft.ML.OnnxConverter.

Une fois le OnnxConverter package installé, vous pouvez l’utiliser pour enregistrer votre modèle au format ONNX. Cela nécessite un objet Stream, que vous pouvez fournir sous la forme d’un FileStream à l’aide de la méthode File.Create. La File.Create méthode prend un paramètre de chaîne qui représente le chemin d’accès du modèle ONNX.

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

Avec le flux créé, vous pouvez appeler la ConvertToOnnx méthode et lui donner le modèle entraîné, les données utilisées pour entraîner le modèle et le flux. Toutefois, tous les formateurs et transformateurs ne sont pas exportables vers ONNX. Pour obtenir une liste complète, consultez les guides Transforms et How to Choose an ML.NET Algorithm.

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

Charger un modèle stocké localement

Important

Chargez uniquement des modèles à partir de sources approuvées. Le chargement de modèles à partir de sources non approuvées est un risque de sécurité.

Les modèles stockés localement peuvent être utilisés dans d’autres processus ou applications comme ASP.NET Core et les applications web serverless. Pour plus d’informations, consultez Utiliser ML.NET dans l’API web et Deploy ML.NET Serverless Web App.

Dans une application ou un processus distinct, utilisez la Load méthode ainsi que le chemin d’accès au 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 un modèle ONNX afin d’effectuer des prédictions, installez le package NuGet Microsoft.ML.OnnxTransformer.

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

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

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

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

Chargez les nouvelles données dans un(e) IDataView à l’aide de la méthode LoadFromEnumerable.

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

Vous pouvez maintenant utiliser le nouveau IDataView pour s’adapter aux nouvelles données.

estimator.Fit(newHousingDataView);

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

Charger un modèle stocké à distance

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

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

Note

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

Lorsque vous travaillez avec des pipelines et des modèles de préparation de données distincts, le même processus que les pipelines uniques s’applique. La différence est que les deux pipelines doivent être enregistrés et chargés simultanément.

Compte tenu des pipelines de préparation des données et d’apprentissage de modèle 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 un processus ou une application distinct, chargez simultanément le pipeline de préparation des données et le modèle entraîné 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);