Core ML 2 dans Xamarin.iOS
Core ML est une technologie machine learning disponible sur iOS, macOS, tvOS et watchOS. Elle permet aux applications d’effectuer des prédictions basées sur des modèles Machine Learning.
Dans iOS 12, Core ML inclut une API de traitement par lots. Cette API rend Core ML plus efficace et améliore les performances dans les scénarios où un modèle est utilisé pour effectuer une séquence de prédictions.
Générer un exemple de données
Dans ViewController
, l’exemple d’appel LoadMLModel
de méthode de ViewDidLoad
l’application, qui charge le modèle Core ML inclus :
void LoadMLModel()
{
var assetPath = NSBundle.MainBundle.GetUrlForResource("CoreMLModel/MarsHabitatPricer", "mlmodelc");
model = MLModel.Create(assetPath, out NSError mlErr);
}
Ensuite, l’exemple d’application crée 100 000 MarsHabitatPricerInput
objets à utiliser comme entrée pour les prédictions Core ML séquentielles. Chaque échantillon généré a une valeur aléatoire définie pour le nombre de panneaux solaires, le nombre de serres et le nombre d’acres :
async void CreateInputs(int num)
{
// ...
Random r = new Random();
await Task.Run(() =>
{
for (int i = 0; i < num; i++)
{
double solarPanels = r.NextDouble() * MaxSolarPanels;
double greenHouses = r.NextDouble() * MaxGreenHouses;
double acres = r.NextDouble() * MaxAcres;
inputs[i] = new MarsHabitatPricerInput(solarPanels, greenHouses, acres);
}
});
// ...
}
En appuyant sur l’un des trois boutons de l’application, deux séquences de prédictions sont exécutées : une à l’aide d’une for
boucle et une autre à l’aide de la nouvelle méthode de traitement GetPredictions
introduite dans iOS 12 :
async void RunTest(int num)
{
// ...
await FetchNonBatchResults(num);
// ...
await FetchBatchResults(num);
// ...
}
for (boucle)
La for
version de boucle du test itère naivement sur le nombre d’entrées spécifié, appelant GetPrediction
chacun et dis carte le résultat. La méthode prend le temps nécessaire pour effectuer les prédictions :
async Task FetchNonBatchResults(int num)
{
Stopwatch stopWatch = Stopwatch.StartNew();
await Task.Run(() =>
{
for (int i = 0; i < num; i++)
{
IMLFeatureProvider output = model.GetPrediction(inputs[i], out NSError error);
}
});
stopWatch.Stop();
nonBatchMilliseconds = stopWatch.ElapsedMilliseconds;
}
GetPredictions (nouvelle API batch)
La version par lot du test crée un MLArrayBatchProvider
objet à partir du tableau d’entrée (car il s’agit d’un paramètre d’entrée requis pour la GetPredictions
méthode), crée un objet MLPredictionOptions
objet qui empêche les calculs de prédiction d’être limités à l’UC et utilise l’API GetPredictions
pour extraire les prédictions, à nouveau dis carte ing the result :
async Task FetchBatchResults(int num)
{
var batch = new MLArrayBatchProvider(inputs.Take(num).ToArray());
var options = new MLPredictionOptions()
{
UsesCpuOnly = false
};
Stopwatch stopWatch = Stopwatch.StartNew();
await Task.Run(() =>
{
model.GetPredictions(batch, options, out NSError error);
});
stopWatch.Stop();
batchMilliseconds = stopWatch.ElapsedMilliseconds;
}
Résultats
Sur le simulateur et l’appareil, GetPredictions
se termine plus rapidement que les prédictions Core ML basées sur la boucle.