Guardar y cargar modelos entrenados

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

En todo el proceso de compilación de modelos, un modelo se encuentra en la memoria y es accesible a lo largo del 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 remotamente, ya no es accesible. Normalmente, los modelos se utilizan en algún momento después de su entrenamiento en otras aplicaciones, ya sea por inferencia o al volver a entrenar. Por lo tanto, es importante almacenar el modelo. Guarde y cargue modelos mediante los pasos descritos en las secciones siguientes de este documento, cuando use la preparación de datos y las canalizaciones de aprendizaje del modelo, como la que se detalla a continuación. 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 canalizaciones de preparación de datos se heredan del mismo conjunto de clases, las firmas del método de guardado y carga para estos componentes es el mismo. Según el caso de uso, puede combinar la canalización de preparación de datos y el modelo en un solo EstimatorChain que generaría un único ITransformer o los separaría creando así un ITransformer independiente para cada uno.

Guardar un modelo de forma local

Al guardar un modelo, se necesitan dos cosas:

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

Después de entrenar el modelo, use el método Save para guardar el modelo entrenado en un archivo denominado model.zip con 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 una versión de ONNX del modelo localmente, necesitará tener instalado el paquete NuGet Microsoft.ML.OnnxConverter.

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

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

Con la secuencia creada, podemos llamar al método ConvertToOnnx y proporcionarle el modelo entrenado, los datos usados para entrenar el modelo y la secuencia. Sin embargo, no todos los instructores y transformadores son exportables a ONNX. Para ver una lista completa, visite las guías Transformaciones y Cómo elegir un algoritmo de ML.NET.

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

Cargar un modelo almacenado localmente

Los modelos almacenados localmente se pueden usar en otros procesos o aplicaciones, como ASP.NET Core y Serverless Web Applications. Consulte los artículos de procedimientos Uso de ML.NET en la API Web e Implementación de la aplicación web sin servidor de ML.NET para obtener más información.

En una aplicación o proceso independiente, use el método Load junto con la ruta de acceso al archivo para obtener el modelo entrenado en la 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);

Cargar un modelo ONNX localmente

Para cargar un modelo ONNX para predicciones, necesitará el paquete NuGet Microsoft.ML.OnnxTransformer.

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

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

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

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

Con los nuevos datos, podemos cargar IDataView con el método LoadFromEnumerable.

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

Ahora podemos usar el nuevo elemento IDataView para adaptarlo a los nuevos datos.

estimator.Fit(newHousingDataView);

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

Cargar un modelo almacenado remotamente

Para cargar canalizaciones de preparación de datos y modelos almacenados en una ubicación remota de la aplicación, use Stream en lugar de una ruta de acceso al 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 una preparación de datos independiente y canalizaciones de modelo

Nota:

Trabajar con una preparación de datos independiente y canalizaciones de entrenamiento de modelos es opcional. La separación de canalizaciones facilita la inspección de parámetros de modelos aprendidos. Para las predicciones, es más fácil guardar y cargar una sola canalización que incluye la preparación de datos y las operaciones de entrenamiento del modelo.

Al trabajar con modelos y canalizaciones de preparación de datos independientes, se aplica el mismo proceso que con las canalizaciones únicas; excepto que ahora ambas canalizaciones deben guardarse y cargarse al mismo tiempo.

Dada la preparación de datos independiente y las canalizaciones 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 la canalización 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");

Cargar la canalización de preparación de datos y el modelo entrenado

En una aplicación o proceso 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);