Vous, moi et même John à côté savons que l'apprentissage automatique a rendu vos machines "plus intelligentes" en prédisant les résultats futurs, en utilisant les données qui leur sont fournies. ML.NET est la norme de facto dans .NET pour l'apprentissage automatique, qui vous permet de former des modèles à l'avance et de faire des prédictions avec précision.
Supposons que vous disposiez d'une application ML.NET pour prédire les tarifs des taxis, en fonction des données des trajets précédents et du trafic actuel. Compte tenu de la pandémie actuelle de COVID-19, nous avons constaté un changement massif dans le comportement des consommateurs : les déplacements sur de longues distances sont réduits au minimum, davantage de livraisons sont effectuées pour déposer de la nourriture/l'épicerie, certaines zones sont complètement bouclées, etc. Les données entrantes pour cette application sont rapides et changent en permanence, de sorte que le modèle d'apprentissage automatique est fréquemment recyclé. Si le côté Machine Learning lit ces données, cela peut provoquer des ralentissements.
Pour résoudre ces problèmes, vous devez mettre en cache vos données de voyage afin que les données soient accessibles à l'application ML.NET sans aucun goulot d'étranglement. ML.NET fournit une mise en cache par défaut, mais celle-ci n'est pas évolutive. NCache est un cache distribué en mémoire dans .NET. En utilisant NCache pour le traitement des données augmente les performances de l'application car il fournit des opérations de lecture/écriture rapides car il est en mémoire. Être distribué, NCache peut évoluer au moment de l'exécution si les ensembles de données deviennent trop volumineux.
En utilisant NCache pour mettre à l'échelle et recycler les modèles d'apprentissage automatique
Pour décrire comment NCache peut rendre cette application ML.NET plus évolutive et recycler les modèles plus rapidement lors de l'exécution, nous avons étendu le projet TaxiFarePrediction largement utilisé par Microsoft pour intégrer NCache. Vous pouvez trouver ce projet étendu avec NCache on GitHub.
L'application fonctionne comme ceci, comme illustré ci-dessus dans Figure 1:
- Les données de trajet en taxi sont stockées dans le cache en tant que Liste des types de données qui est une extension de
IEnumerable IList
. ML.NET prend en chargeLoadFromEnumerable()
méthode, donc aucune manipulation supplémentaire des données n'est nécessaire. - L'application ML.NET s'abonne au Pub / Sous-marin sujet pour recevoir des mises à jour lorsque d'autres blocs de données de la taille spécifiée sont ajoutés au cache.
- Pour l'ensemble de données initial, les données (stockées sous forme de liste) sont récupérées par l'application ML.Net pour former le modèle d'apprentissage automatique. Après la formation, le modèle est stocké dans un magasin de modèles local et met en cache le chemin du modèle.
- Une fois qu'un nouveau bloc de données est ajouté au cache, Pub/Sub informe l'application du modèle de recyclage de la mise à jour des données. Lorsque l'application obtient de nouvelles données, une partie du bloc de données précédent est supprimée, sur la base du concept de fenêtre glissante. Dans ce cas, la première partie des données précédemment utilisées est supprimée en fonction de la longueur du nouvel ensemble de données. Ces données découpées sont fusionnées avec les nouvelles données et ajoutées au cache. Désormais, ce bloc de données et le modèle déjà formé seront utilisés lors du recyclage du nouveau modèle.
- Après chaque entraînement/recyclage du modèle, des prédictions à valeur unique sont effectuées sur les données transformées pour tester la précision du modèle.
NCache Détails NCache Solution d'apprentissage automatique GitHub
Utilisation de structures de données pour mettre en cache les données de trajet
NCache . IEnumerable
structures de données distribuées, qui permettent à ML.NET de récupérer et de lire directement des données en raison de la prise en charge par ML.NET de LoadFromEnumerable()
. Les données peuvent être facilement stockées dans un type de données List et chargées directement dans le modèle ML.NET pour la formation.
L'extrait de code suivant montre comment les données peuvent être stockées dans le cache à l'aide des structures de données 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 Détails NCache Solution d'apprentissage automatique GitHub
Récupération des données en mémoire pour former le modèle
Pour former initialement le modèle ML.NET, l'application récupère d'abord les données stockées en tant que Liste des types de données de NCache. Le modèle est formé sur la base de StochastiqueDualCoordonnéeAscent (SDCA) et enregistré sous la forme d'un fichier .zip pour une utilisation ultérieure. Ces fichiers enregistrés sont utilisés pour recycler les modèles à l'avenir. Le chemin du modèle est également mis en cache pour être utilisé ultérieurement.
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); |
Utilisation des notifications Pub/Sub lors de la mise à jour des données pour recycler le modèle
En utilisant NCache's Pub / Sous-marin, des événements sont déclenchés vers l'application pour recycler les données à mesure que davantage de données sont mises à jour dans le cache. L'application ML.NET s'abonne au NCache rubrique pour les notifications sur les données en cours de mise à jour. Si les données sont mises à jour dans le cache, NCache Pub/Sub informe l'application que les données ont été mises à jour et que les données sont recyclées.
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)); } |
Données glissantes avec des listes pour le modèle de recyclage
Une fois que de nouvelles données sont ajoutées au cache, les données de formation sont remplies à l'aide du concept de fenêtre coulissante pour récupérer les dernières données. Cela conserve une partie des données précédentes dans la liste avec les nouvelles données. Une fois les données mises à jour, un message est publié aux abonnés à l'aide de NCache's Pub / Sous-marin mécanisme pour que la reconversion puisse avoir lieu. Le modèle et le pipeline sont chargés à partir des fichiers .zip et recyclés conformément à l'algorithme de recyclage ML.NET.
Étape 1 : Faites glisser les données et notifiez via 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); } |
Étape 2 : Charger les données de trajet à partir du cache et recycler le modèle
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 Détails NCache Solution d'apprentissage automatique GitHub
Résumer…
Habituellement, lorsque les données sont traitées pour l'apprentissage automatique, elles sont chargées de manière asynchrone afin que les modèles d'apprentissage chargent les données à partir du disque et exécutent leurs algorithmes plusieurs fois dessus. Par conséquent, la mise en cache des ensembles de données en mémoire avec NCache aide à réduire le chargement inutile de données à partir du disque et facilite la notification aux applications ML.NET pour qu'elles commencent à se recycler instantanément via son mécanisme Pub/Sub. De plus, étant distribué, il s'adapte à l'exécution si les ensembles de données deviennent trop volumineux. Alors, rendez-vous à la caisse NCache et comment il peut améliorer les performances de votre application d'apprentissage automatique !