당신과 나, 그리고 옆집의 John조차도 기계 학습이 공급된 데이터를 사용하여 미래 결과를 예측함으로써 기계를 "더 똑똑"하게 만들었다는 것을 알고 있습니다. ML.NET 머신 러닝을 위한 .NET의 사실상의 표준으로, 이를 통해 모델을 사전에 교육하고 정확하게 예측할 수 있습니다.
이전 여행 데이터와 현재 교통량을 기반으로 택시 요금을 예측하기 위한 ML.NET 애플리케이션이 있다고 가정해 보겠습니다. 현재 COVID-19 전염병을 감안할 때 우리는 소비자 행동에 엄청난 변화를 목격했습니다. 장거리 여행이 최소화되고, 음식/식료품을 배달하기 위해 더 많은 배달이 이루어지고, 일부 지역은 완전히 차단되는 등입니다. 이 애플리케이션에 대한 수신 데이터는 신속하고 지속적으로 변경되므로 기계 학습 모델이 자주 재교육됩니다. 기계 학습 측에서 이 데이터를 읽으면 속도가 느려질 수 있습니다.
이러한 문제를 해결하려면 병목 현상 없이 ML.NET 애플리케이션에서 데이터에 액세스할 수 있도록 여행 데이터를 캐시해야 합니다. ML.NET은 기본 캐싱을 제공하지만 확장할 수 없습니다. NCache 는 Teledyne LeCroy 오실로스코프 및 LSA-XNUMX 시리즈 임베디드 신호 분석기가 인 메모리, 분산 캐시 .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()
. 데이터는 목록 데이터 유형에 편리하게 저장하고 학습을 위해 ML.NET 모델에 직접 로드할 수 있습니다.
다음 코드 스니펫은 목록 데이터 구조를 사용하여 캐시에 데이터를 저장하는 방법을 보여줍니다.
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 모델을 처음 훈련하기 위해 애플리케이션은 먼저 ML.NET 모델로 저장된 데이터를 가져옵니다. 목록 데이터 유형 에 NCache. 모델은 다음을 기반으로 학습됩니다. StochasticDualCoordinate상승 (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 기계 학습 애플리케이션 성능을 어떻게 향상시킬 수 있는지!