トレーニング済みのモデルを保存して読み込む

トレーニング済みのモデルをアプリケーションに保存して読み込む方法について説明します。

モデル構築プロセス全体を通して、モデルはメモリ内に存在し、アプリケーションのライフサイクル全体でアクセスできます。 ただし、アプリケーションの実行が停止すると、モデルがローカルまたはリモートのどこかに保存されていない場合は、アクセスできなくなります。 通常、モデルは、推論または再トレーニングのために、他のアプリケーションでトレーニングした後のある時点で使用されます。 そのため、モデルを格納することが重要です。 次に示すようなデータ準備パイプラインとモデル トレーニング パイプラインを使用する場合は、この記事の後続のセクションで説明する手順を使用して、モデルを保存して読み込みます。 このサンプルでは線形回帰モデルを使用していますが、他の 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");

ほとんどのモデルとデータ準備パイプラインは同じクラス のセットから継承されるため、これらのコンポーネントの保存メソッドシグネチャと読み込みメソッドシグネチャは同じです。 ユース ケースに応じて、データ準備パイプラインとモデルを 1 つの EstimatorChain に組み合わせて 1 つの ITransformer を出力するか、個別に分割して、それぞれに個別の ITransformer を作成することができます。

モデルをローカルに保存する

モデルを保存する場合は、次の 2 つのものが必要です。

  1. モデルの ITransformer
  2. ITransformer の想定入力の DataViewSchema

モデルをトレーニングした後、Saveメソッドを使用して、入力データのmodel.zipを使用して、トレーニング済みのモデルを DataViewSchema というファイルに保存します。

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

ONNX モデルをローカルに保存する

モデルの Open Neural Network Exchange (ONNX) バージョンをローカルに保存するには、Microsoft.ML.OnnxConverter NuGet パッケージをインストールする必要があります。

OnnxConverter パッケージをインストールすると、それを使用してモデルを ONNX 形式に保存できます。 これには、Stream オブジェクトが必要です。FileStream メソッドを使用してFile.Createとして指定できます。 File.Create メソッドは、ONNX モデルのパスを表す文字列パラメーターを受け取ります。

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

ストリームを作成したら、 ConvertToOnnx メソッドを呼び出して、トレーニング済みのモデル、モデルのトレーニングに使用されるデータ、ストリームを指定できます。 ただし、すべてのトレーナーとトランスフォーマーを ONNX にエクスポートできるわけではありません。 完全な一覧については、Transforms および ML.NET アルゴリズムの選択方法 ガイドを参照してください。

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

ローカルに格納されているモデルを読み込む

Important

信頼できるソースからのみモデルを読み込みます。 信頼されていないソースからモデルを読み込むと、セキュリティ上のリスクがあります。

ローカルに格納されたモデルは、ASP.NET Coreやサーバーレス Web アプリなどの他のプロセスやアプリケーションで使用できます。 詳細については、「 Web API で ML.NET を使用するサーバーレス Web アプリ ML.NET デプロイするを参照してください。

別のアプリケーションまたはプロセスで、 Load メソッドとファイル パスを使用して、トレーニング済みのモデルをアプリケーションに取り込みます。

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

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

ONNX モデルをローカルに読み込む

予測のために ONNX モデルに読み込むには、Microsoft.ML.OnnxTransformer NuGet パッケージをインストールします。

OnnxTransformer パッケージをインストールすると、ApplyOnnxModel メソッドを使用して既存の ONNX モデルを読み込むことができます。 必須パラメーターは、ローカル ONNX モデルのパスである文字列です。

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

ApplyOnnxModel メソッドは、OnnxScoringEstimator オブジェクトを返します。 まず、新しいデータを読み込む必要があります。

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

IDataView メソッドを使用して、新しいデータをLoadFromEnumerableに読み込みます。

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

これで、新しい IDataView を使用して新しいデータに合わせることができるようになりました。

estimator.Fit(newHousingDataView);

Fitの推定器で ApplyOnnxModel メソッドを使用した後、「モデルをローカルに保存する」セクションで説明されている Save メソッドを使用して、新しいモデルとして保存できます。

リモートで格納されているモデルを読み込む

リモートの場所に格納されているデータ準備パイプラインとモデルをアプリケーションに読み込むには、Stream メソッドのファイル パスではなく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);
}

個別のデータ準備パイプラインとモデル パイプラインを操作する

Note

個別のデータ準備パイプラインとモデル トレーニング パイプラインの操作は省略可能です。 パイプラインを分離すると、学習したモデル パラメーターを簡単に調べることができます。 予測の場合、データ準備とモデルトレーニング操作を含む単一のパイプラインを保存して読み込む方が簡単です。

個別のデータ準備パイプラインとモデルを使用する場合、単一のパイプラインと同じプロセスが適用されます。 違いは、両方のパイプラインを同時に保存して読み込む必要があるということです。

個別のデータ準備パイプラインとモデル トレーニング パイプラインを指定します。

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

データ準備パイプラインとトレーニング済みモデルを保存する

データ準備パイプラインとトレーニング済みモデルの両方を保存するには、次のコマンドを使用します。

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

データ準備パイプラインとトレーニング済みモデルを読み込む

別のプロセスまたはアプリケーションで、次のようにデータ準備パイプラインとトレーニング済みモデルを同時に読み込みます。

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