Menyimpan dan memuat model terlatih

Pelajari cara menyimpan dan memuat model terlatih di aplikasi Anda.

Sepanjang proses pembuatan model, model hidup dalam memori dan dapat diakses sepanjang siklus hidup aplikasi. Namun, setelah aplikasi berhenti berjalan, jika model tidak disimpan di suatu tempat secara lokal atau jarak jauh, aplikasi tidak lagi dapat diakses. Biasanya model digunakan pada beberapa titik setelah pelatihan di aplikasi lain baik untuk inferensi atau pelatihan ulang. Oleh karena itu, penting untuk menyimpan model. Simpan dan muat model menggunakan langkah-langkah yang dijelaskan di bagian berikutnya dari dokumen ini saat menggunakan persiapan data dan alur pelatihan model seperti yang dijelaskan di bawah ini. Meskipun sampel ini menggunakan model regresi linier, proses yang sama berlaku untuk algoritma ML.NET lainnya.

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

Karena sebagian besar model dan alur persiapan data mewarisi dari serangkaian kelas yang sama, tanda tangan metode simpan dan muat untuk komponen ini sama. Tergantung pada kasus penggunaan Anda, Anda dapat menggabungkan alur persiapan data dan model menjadi satu EstimatorChain yang akan menghasilkan satu ITransformer atau memisahkannya sehingga membuat terpisah ITransformer untuk masing-masing.

Menyimpan model secara lokal

Saat menyimpan model, Anda memerlukan dua hal:

  1. Dari ITransformer model.
  2. Input DataViewSchema yang ITransformerdiharapkan.

Setelah melatih model, gunakan Save metode untuk menyimpan model terlatih ke file yang disebut model.zip menggunakan DataViewSchema data input.

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

Menyimpan model ONNX secara lokal

Untuk menyimpan versi ONNX model Anda secara lokal, Anda akan memerlukan paket NuGet Microsoft.ML.OnnxConverter yang terinstal.

Dengan paket yang OnnxConverter diinstal, kita dapat menggunakannya untuk menyimpan model kita ke dalam format ONNX. Ini memerlukan Stream objek yang dapat kita sediakan FileStreamFile.Create sebagai menggunakan metode . Metode ini File.Create mengambil string sebagai parameter yang akan menjadi jalur model ONNX.

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

Dengan aliran yang dibuat, kita dapat memanggil ConvertToOnnx metode dan memberinya model terlatih, data yang digunakan untuk melatih model, dan aliran. Namun, tidak semua pelatih dan transformator dapat diekspor ke ONNX. Untuk daftar lengkapnya, kunjungi panduan Transformasi dan Cara Memilih Algoritma ML.NET.

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

Memuat model yang disimpan secara lokal

Model yang disimpan secara lokal dapat digunakan dalam proses atau aplikasi lain seperti ASP.NET Core dan Serverless Web Applications. Lihat Menggunakan ML.NET di API Web dan Menyebarkan artikel cara menggunakan Aplikasi Web Tanpa Server ML.NET untuk mempelajari selengkapnya.

Dalam aplikasi atau proses terpisah, gunakan Load metode bersama dengan jalur file untuk mendapatkan model terlatih ke dalam aplikasi Anda.

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

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

Memuat model ONNX secara lokal

Untuk memuat dalam model ONNX untuk prediksi, Anda memerlukan paket NuGet Microsoft.ML.OnnxTransformer .

Dengan paket yang OnnxTransformer diinstal, Anda dapat memuat model ONNX yang ada dengan menggunakan metode .ApplyOnnxModel Parameter yang diperlukan adalah string yang merupakan jalur model ONNX lokal.

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

Metode ApplyOnnxModel mengembalikan OnnxScoringEstimator objek. Pertama, kita perlu memuat data baru.

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

Dengan data baru, kita dapat memuatnya ke dalam IDataView menggunakan LoadFromEnumerable metode .

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

Sekarang, kita dapat menggunakan yang baru IDataView agar sesuai dengan data baru.

estimator.Fit(newHousingDataView);

Setelah menggunakan metode Fit pada estimator dari ApplyOnnxModel, kemudian dapat disimpan sebagai model baru menggunakan metode Simpan yang disebutkan menyimpan model secara lokal.

Memuat model yang disimpan dari jarak jauh

Untuk memuat alur dan model persiapan data yang disimpan di lokasi jarak jauh ke aplikasi Anda, gunakan Stream alih-alih jalur file dalam Load metode .

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

Bekerja dengan persiapan data terpisah dan alur model

Catatan

Bekerja dengan persiapan data terpisah dan alur pelatihan model bersifat opsional. Pemisahan alur memudahkan untuk memeriksa parameter model yang dipelajari. Untuk prediksi, lebih mudah untuk menyimpan dan memuat satu alur yang mencakup persiapan data dan operasi pelatihan model.

Saat bekerja dengan alur dan model persiapan data terpisah, proses yang sama dengan alur tunggal berlaku; kecuali sekarang kedua alur perlu disimpan dan dimuat secara bersamaan.

Mengingat persiapan data terpisah dan alur pelatihan model:

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

Menyimpan alur persiapan data dan model terlatih

Untuk menyimpan alur persiapan data dan model terlatih, gunakan perintah berikut:

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

Memuat alur persiapan data dan model terlatih

Dalam proses atau aplikasi terpisah, muat alur persiapan data dan model terlatih secara bersamaan sebagai berikut:

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