あなたも私も、そして隣のジョンさえも、機械学習によって、与えられたデータを使用して将来の結果を予測することでマシンが「賢く」なったということを知っています。 ML.NET は機械学習の .NET の事実上の標準であり、モデルを事前にトレーニングして正確に予測できるようになります。
以前の乗車データと現在の交通量に基づいて、タクシー料金を予測する ML.NET アプリケーションがあると仮定します。 現在の新型コロナウイルス感染症のパンデミックを考慮すると、消費者の行動には大きな変化が見られます。長距離の移動は最小限に抑えられ、食品や食料品を届けるための配達が増え、一部の地域では完全に封鎖されています。 このアプリケーションの受信データは急速で継続的に変化するため、機械学習モデルは頻繁に再トレーニングされます。 機械学習側がこのデータを読み取ると、速度低下が発生する可能性があります。
このような問題に対処するには、旅行データをキャッシュして、ボトルネックなしで ML.NET アプリケーションにデータにアクセスできるようにする必要があります。 ML.NET はデフォルトのキャッシュを提供しますが、これはスケーラブルではありません。 NCache あります インメモリ分散キャッシュ .NETで。 使用する NCache データ処理では、メモリ内で高速な読み取り/書き込み操作が提供されるため、アプリケーションのパフォーマンスが向上します。 配布中ですが、 NCache データ セットが大きくなりすぎる場合は、実行時に拡張できます。
使い方 NCache 機械学習モデルのスケーリングと再トレーニング
どのように描写するか NCache この ML.NET アプリケーションをよりスケーラブルにし、実行時にモデルをより高速に再トレーニングできるように、Microsoft によって広く使用されている TaxiFarePrediction プロジェクトを拡張して統合しました。 NCache。 この拡張プロジェクトは次のコマンドで見つけることができます。 NCache on GitHubの.
上の図に示すように、アプリケーションは次のように動作します。 図1:
- タクシーの乗車データはキャッシュに保存されます。 リストデータ型 これはの拡張です
IEnumerable IList
。 ML.NET がサポートするLoadFromEnumerable()
メソッドを使用するため、データを特別に操作する必要はありません。 - ML.NET アプリケーションは Pub / Sub 指定されたサイズのデータ チャンクがキャッシュに追加されたときに更新を受信するトピック。
- 初期データ セットの場合、機械学習モデルをトレーニングするために、ML.Net アプリケーションによってデータ (リストとして保存) がフェッチされます。 トレーニング後、モデルはローカル モデル ストアに保存され、モデル パスがキャッシュされます。
- 新しいデータ チャンクがキャッシュに追加されると、Pub/Sub は再トレーニング モデル アプリケーションにデータの更新を通知します。 アプリケーションが新しいデータを取得すると、スライディング ウィンドウの概念に基づいて、以前のデータ チャンクの一部が削除されます。 この場合、以前に使用されていたデータの最初の部分が、新しいデータセットの長さに応じて削除されます。 このトリミングされたデータは新しいデータとマージされ、キャッシュに追加されます。 ここで、このデータのチャンクとすでにトレーニングされたモデルは、新しいモデルの再トレーニング中に使用されます。
- モデルの各トレーニング/再トレーニングの後、変換されたデータに対して単一値の予測が行われ、モデルの精度がテストされます。
NCache 詳細 NCache 機械学習 GitHub ソリューション
データ構造を使用した旅行データのキャッシュ
NCache オファー IEnumerable
分散データ構造。ML.NET は分散データ構造をサポートしているため、ML.NET がデータを直接フェッチして読み取ることが非常に簡単になります。 LoadFromEnumerable()
。 データは List データ型に保存して、トレーニングのために ML.NET モデルに直接ロードすることができます。
次のコード スニペットは、List データ構造を使用してデータをキャッシュに保存する方法を示しています。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
// Create lists in cache to add trip data IDistributedList initialDataList = Cache.DataTypeManager.CreateList(initialData); IDistributedList TrainingData = Cache.DataTypeManager.CreateList(datasetKey); using (StreamReader r = new StreamReader(filepath)) { while ((currentLine = r.ReadLine()) != null) { string[] incomingData = currentLine.Split(","); TaxiTrip data = new TaxiTrip(); data.TripTime = float.Parse(incomingData[0]); ... initialDataList.Add(data); TrainingData.Add(data); } } |
NCache 詳細 NCache 機械学習 GitHub ソリューション
モデルをトレーニングするためのメモリ内データのフェッチ
ML.NET モデルを最初にトレーニングするために、アプリケーションはまず、 リストデータ型 から NCache。 モデルは以下に基づいてトレーニングされます 確率的デュアル座標上昇 (SDCA) 回帰アルゴリズムを使用し、後で使用できるように .zip ファイルの形式で保存します。 これらの保存されたファイルは、将来モデルを再トレーニングするために使用されます。 モデル パスも後で使用できるようにキャッシュされます。
1 2 3 4 5 6 7 8 9 10 11 |
// Get initial data for training from cache as list var datasetTraining = Cache.DataTypeManager.GetList(initialdataKey); var inputDataView = mlContext.Data.LoadFromEnumerable(datasetTraining); // ... Train Model logic here mlContext.Model.Save(trainedModel, transformedData.Schema, ModelPath); ModelTrained = true; // Save ModelPath in cache to use for retraining Cache.Add(ModelPath, ModelPath); |
データ更新時に Pub/Sub 通知を使用してモデルを再トレーニングする
使い方 NCacheさん Pub / Sub、キャッシュ内でより多くのデータが更新されると、データを再トレーニングするためにアプリケーションに対してイベントがトリガーされます。 ML.NET アプリケーションは NCache データ更新に関する通知のトピック。 キャッシュ内のデータが更新されると、 NCache Pub/Sub は、データが更新されたことをアプリケーションに通知し、データが再トレーニングされます。
1 2 3 4 5 6 7 8 9 10 11 12 |
Cache = CacheManager.GetCache("myPartitionedCache"); // Create topic so ML.NET app subscribes for data update notifications Topic = Cache.MessagingService.CreateTopic("TaxiFareNotifications"); Topic.CreateSubscription(TaxiFareDataUpdated); ... // Retrain model when new data is updated static void TaxiFareDataUpdated(object sender, MessageEventArgs args) { RetrainModel(new MLContext(seed: 0)); } |
モデルを再トレーニングするためのリストを使用したスライディング データ
新しいデータがキャッシュに追加されると、スライディング ウィンドウの概念を使用してトレーニング データが入力され、最新のデータがフェッチされます。 これにより、新しいデータとともに以前のデータのチャンクがリスト内に保持されます。 データが更新されると、次を使用してメッセージが購読者に発行されます。 NCacheさん Pub / Sub 再トレーニングができるようにするための仕組みです。 モデルとパイプラインは .zip ファイルからロードされ、ML.NET 再トレーニング アルゴリズムに従って再トレーニングされます。
ステップ 1: データをスライドさせ、Pub/Sub 経由で通知する
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
TaxiTrip data = new TaxiTrip(); ... dataList.Add(data); if(dataList.Count > 100) { // Move sliding window if (TrainingData.Count > dataList.Count) TrainingData.RemoveRange(0, dataList.Count); TrainingData.AddRange(dataList); // Publish message for notifying data update Topic.Publish(new Message("DataSet has been updated."), DeliveryOption.All); } |
ステップ 2: キャッシュからトリップ データをロードし、モデルを再トレーニングする
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
//Load new data from List in Cache IDataView newData = mlContext.Data.LoadFromEnumerable(TrainingData); IDataView transformedNewData = dataPrepPipeline.Transform(newData); // Retrain model RegressionPredictionTransformer retrainedModel = mlContext.Regression.Trainers.OnlineGradientDescent() .Fit(transformedNewData, originalModelParameters); LinearRegressionModelParameters retrainedModelParameters = retrainedModel.Model as LinearRegressionModelParameters; IEstimator dataPrepEstimator = mlContext.Transforms.Concatenate("Features", new string[] { "PassengerCount", "TripTime", "TripDistance", "FareAmount" }) .Append(mlContext.Transforms.NormalizeMinMax("Features")); ... mlContext.Model.Save(retrainedModel, transformedNewData.Schema, ModelPath); |
NCache 詳細 NCache 機械学習 GitHub ソリューション
まとめると…
通常、機械学習用にデータが処理される場合、データは非同期で読み込まれるため、トレーニング モデルはディスクからデータを読み込み、そのデータ上でアルゴリズムを数回実行します。 したがって、データセットをメモリ内にキャッシュするには、 NCache ディスクからの不必要なデータの読み込みを軽減し、Pub/Sub メカニズムを通じて即座に再トレーニングを開始するように ML.NET アプリケーションに通知することが容易になります。 さらに、分散されているため、データセットが大きくなりすぎる場合は実行時にスケーリングされます。 それで、チェックアウトに行ってください NCache そして、それが機械学習アプリケーションのパフォーマンスをどのように向上させることができるかについても説明します。