Guardar y cargar modelos entrenados

Obtenga información sobre cómo guardar y cargar modelos entrenados en la aplicación.

A lo largo del proceso de creación de modelos, un modelo reside en la memoria y es accesible durante el ciclo de vida de la aplicación. Sin embargo, una vez que la aplicación deja de ejecutarse, si el modelo no se guarda en algún lugar local o remoto, ya no es accesible. Normalmente, los modelos se usan en algún momento después del entrenamiento en otras aplicaciones para la inferencia o el reentrenamiento. Por lo tanto, es importante almacenar el modelo. Guarde y cargue modelos mediante los pasos descritos en las secciones posteriores de este artículo al usar canalizaciones de entrenamiento de modelos y preparación de datos, como la que se muestra aquí. Aunque en este ejemplo se usa un modelo de regresión lineal, el mismo proceso se aplica a otros algoritmos de 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");

Dado que la mayoría de los modelos y las canalizaciones de preparación de datos heredan del mismo conjunto de clases, las firmas del método save y load para estos componentes son las mismas. En función de su caso de uso, puede combinar la canalización de preparación de datos y el modelo en un único EstimatorChain, que produciría un único ITransformer, o bien separarlos, creando así un ITransformer independiente para cada uno.

Guardar un modelo localmente

Al guardar un modelo, necesitas dos cosas:

  1. El ITransformer del modelo.
  2. El DataViewSchema de la entrada esperada de ITransformer.

Después de entrenar el modelo, use el Save método para guardar el modelo entrenado en un archivo denominado model.zip mediante el DataViewSchema de los datos de entrada.

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

Guardar un modelo ONNX localmente

Para guardar localmente una versión de Open Neural Network Exchange (ONNX) del modelo, debe instalar el paquete NuGet Microsoft.ML.OnnxConverter.

Con el OnnxConverter paquete instalado, puede usarlo para guardar el modelo en el formato ONNX. Esto requiere un objeto Stream, que puedes proporcionar como un FileStream mediante el método File.Create. El método File.Create acepta un parámetro de tipo cadena que representa la ruta de acceso del modelo ONNX.

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

Con la secuencia creada, puede llamar al ConvertToOnnx método y asignarle el modelo entrenado, los datos usados para entrenar el modelo y la secuencia. Sin embargo, no todos los entrenadores y transformadores se pueden exportar a ONNX. Para obtener una lista completa, consulte las guías Transforms y Cómo elegir un algoritmo de ML.NET.

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

Cargar un modelo almacenado localmente

Importante

Cargue solo modelos de fuentes de confianza. La carga de modelos desde orígenes que no son de confianza es un riesgo de seguridad.

Los modelos almacenados localmente se pueden usar en otros procesos o aplicaciones como ASP.NET Core y aplicaciones web sin servidor. Para obtener más información, consulte Use ML.NET en Web API y Deploy ML.NET Serverless Web App.

En una aplicación o proceso independiente, use el método Load junto con la ruta de acceso al archivo para cargar el modelo entrenado en su aplicación.

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

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

Carga local de un modelo ONNX

Para cargar en un modelo ONNX para predicciones, instale el paquete NuGet Microsoft.ML.OnnxTransformer.

Con el OnnxTransformer paquete instalado, puede cargar un modelo ONNX existente mediante el ApplyOnnxModel método . El parámetro obligatorio es una cadena con la ruta de acceso al modelo ONNX local.

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

El ApplyOnnxModel método devuelve un OnnxScoringEstimator objeto . En primer lugar, debe cargar los datos nuevos.

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

Cargue los nuevos datos en un IDataView usando el método LoadFromEnumerable.

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

Ahora puedes usar el nuevo IDataView para ajustarlo a los nuevos datos.

estimator.Fit(newHousingDataView);

Después de usar el Fit método en un estimador de ApplyOnnxModel, se puede guardar como un nuevo modelo mediante el método Save descrito en la sección guardar un modelo localmente .

Cargar un modelo almacenado de forma remota

Para cargar en su aplicación canalizaciones de preparación de datos y modelos almacenados en una ubicación remota, use Stream en lugar de una ruta de archivo en el método 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);
}

Trabajar con canalizaciones independientes de preparación de datos y de modelos

Note

Trabajar con canalizaciones de entrenamiento de modelos y preparación de datos independientes es opcional. La separación de canalizaciones facilita la inspección de los parámetros del modelo aprendido. En el caso de las predicciones, es más fácil guardar y cargar una sola canalización que incluya las operaciones de preparación de datos y entrenamiento del modelo.

Al trabajar con canalizaciones y modelos de preparación de datos independientes, se aplica el mismo proceso que las canalizaciones únicas. La diferencia es que ambas canalizaciones deben guardarse y cargarse simultáneamente.

Teniendo en cuenta flujos independientes de preparación de datos y de entrenamiento de modelos:

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

Guardar flujo de preparación de datos y el modelo entrenado

Para guardar la canalización de preparación de datos y el modelo entrenado, use los siguientes comandos:

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

Canalización de preparación de datos de carga y modelo entrenado

En un proceso o aplicación independiente, cargue la canalización de preparación de datos y el modelo entrenado simultáneamente de la siguiente manera:

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