Usted, yo e incluso John al lado sabemos que el aprendizaje automático ha hecho que sus máquinas sean "más inteligentes" al predecir resultados futuros, utilizando los datos que se les suministran. ML.NET es el estándar de facto en .NET para el aprendizaje automático, que le permite entrenar modelos por adelantado y hacer predicciones con precisión.
Supongamos que tiene una aplicación ML.NET para predecir tarifas de taxi, según los datos de viajes anteriores y el tráfico actual. Dada la pandemia actual de COVID-19, hemos visto un cambio masivo en el comportamiento del consumidor: se minimizan los viajes de larga distancia, se realizan más entregas para dejar alimentos/comestibles, algunas áreas están acordonadas por completo, etc. Los datos entrantes para esta aplicación son rápidos y cambian continuamente, por lo que el modelo de aprendizaje automático se vuelve a entrenar con frecuencia. Si el lado de Machine Learning lee estos datos, puede causar ralentizaciones.
Para abordar estos problemas, debe almacenar en caché los datos de su viaje para que la aplicación ML.NET pueda acceder a los datos sin cuellos de botella. ML.NET proporciona almacenamiento en caché predeterminado, pero no es escalable. NCache es un caché distribuida en memoria en la red. Utilizando NCache para el procesamiento de datos aumenta el rendimiento de la aplicación ya que proporciona operaciones rápidas de lectura/escritura ya que está en la memoria. Siendo repartido, NCache puede escalar en tiempo de ejecución si los conjuntos de datos se vuelven demasiado grandes.
Usar NCache para escalar y volver a entrenar modelos de aprendizaje automático
Para representar cómo NCache puede hacer que esta aplicación ML.NET sea más escalable y volver a entrenar los modelos más rápido en el tiempo de ejecución, hemos ampliado el proyecto TaxiFarePrediction ampliamente utilizado por Microsoft para integrar NCache. Puede encontrar este proyecto ampliado con NCache on GitHub.
La aplicación funciona así, como se ilustra arriba en Figura 1 y XNUMX:
- Los datos del viaje en taxi se almacenan en la memoria caché como un Tipo de datos de lista que es una extensión de
IEnumerable IList
. ML.NET es compatibleLoadFromEnumerable()
método, por lo que no es necesaria ninguna manipulación adicional de los datos. - La aplicación ML.NET se suscribe a la Pub / Sub tema para recibir actualizaciones cuando se agreguen más fragmentos de datos del tamaño especificado a la memoria caché.
- Para el conjunto de datos inicial, la aplicación ML.Net recupera los datos (almacenados como una lista) para entrenar el modelo de aprendizaje automático. Después del entrenamiento, el modelo se almacena en una tienda de modelos local y almacena en caché la ruta del modelo.
- Una vez que se agrega un nuevo fragmento de datos al caché, Pub/Sub notifica la actualización de datos a la aplicación del modelo de reentrenamiento. Cuando la aplicación obtiene datos nuevos, se elimina una parte de los datos anteriores, según el concepto de ventana deslizante. En esto, la primera parte de los datos utilizados anteriormente se elimina de acuerdo con la longitud del nuevo conjunto de datos. Estos datos recortados se fusionan con los nuevos datos y se agregan a la memoria caché. Ahora, esta porción de datos y el modelo ya entrenado se usarán mientras se vuelve a entrenar el nuevo modelo.
- Después de cada entrenamiento/reentrenamiento del modelo, se realizan predicciones de valor único en los datos transformados para probar la precisión del modelo.
NCache Detalles NCache Solución GitHub de aprendizaje automático
Uso de estructuras de datos para almacenar en caché los datos de viaje
NCache ofrece IEnumerable
estructuras de datos distribuidas, que hacen que sea muy sencillo para ML.NET obtener y leer datos directamente debido a la compatibilidad de ML.NET con LoadFromEnumerable()
. Los datos pueden almacenarse convenientemente en un tipo de datos de lista y cargarse directamente en el modelo ML.NET para el entrenamiento.
El siguiente fragmento de código muestra cómo se pueden almacenar los datos en la memoria caché utilizando estructuras de datos de lista.
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 Detalles NCache Solución GitHub de aprendizaje automático
Obtener datos en memoria para entrenar el modelo
Para entrenar inicialmente el modelo ML.NET, la aplicación primero obtiene los datos almacenados como un Tipo de datos de lista en NCache. El modelo se entrena en base a EstocásticoDualCoordinateAscent (SDCA) algoritmo de regresión y guardado en forma de un archivo .zip para su uso posterior. Estos archivos guardados se utilizan para volver a entrenar modelos en el futuro. La ruta del modelo también se almacena en caché para usarse más adelante.
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); |
Uso de notificaciones Pub/Sub en la actualización de datos para volver a entrenar el modelo
Usar NCache, Pub / Sub, los eventos se desencadenan en la aplicación para volver a entrenar los datos a medida que se actualizan más datos en la memoria caché. La aplicación ML.NET se suscribe a la NCache Tema para notificaciones sobre los datos que se están actualizando. Si los datos se actualizan en el caché, NCache Pub/Sub notifica a la aplicación que los datos se han actualizado y se vuelven a entrenar.
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)); } |
Datos deslizantes con listas para el modelo de reentrenamiento
Una vez que se agregan nuevos datos a la memoria caché, los datos de entrenamiento se completan utilizando el concepto de ventana deslizante para obtener los datos más recientes. Esto mantiene una parte de los datos anteriores en la lista junto con los nuevos datos. Una vez que se actualizan los datos, se publica un mensaje a los suscriptores utilizando NCache, Pub / Sub mecanismo para que pueda llevarse a cabo la readaptación. El modelo y la canalización se cargan desde los archivos .zip y se vuelven a entrenar de acuerdo con el algoritmo de entrenamiento de ML.NET.
Paso 1: Deslice los datos y notifique a través de 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); } |
Paso 2: Cargue los datos de viaje desde la memoria caché y vuelva a entrenar el modelo
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 Detalles NCache Solución GitHub de aprendizaje automático
Para resumirlo…
Por lo general, cuando los datos se procesan para el aprendizaje automático, se cargan de forma asíncrona, por lo que los modelos de entrenamiento cargan datos desde el disco y ejecutan sus algoritmos varias veces. Por lo tanto, el almacenamiento en caché de conjuntos de datos en la memoria con NCache ayuda a reducir la carga innecesaria de datos del disco y facilita la notificación de las aplicaciones ML.NET para que comiencen a volver a capacitarse instantáneamente a través de su mecanismo Pub/Sub. Además, al estar distribuido, escala en tiempo de ejecución si los conjuntos de datos son demasiado grandes. Entonces, dirígete a la caja NCache ¡y cómo puede mejorar el rendimiento de su aplicación de aprendizaje automático!