Core ML 2 dans Xamarin.iOS

Core ML est une technologie de Machine Learning disponible sur iOS, macOS, tvOS et watchOS. Il 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 fournit des améliorations de performances dans les scénarios où un modèle est utilisé pour effectuer une séquence de prédictions.

Exemple d’application : MarsHabitatCoreMLTimer

Pour illustrer les prédictions par lots avec Core ML, consultez l’exemple d’application MarsHabitatCoreMLTimer . Cet échantillon utilise un modèle DE ML de base entraîné pour prédire le coût de la construction d’un habitat sur Mars, en fonction de diverses entrées : nombre de panneaux solaires, nombre de serres et nombre d’acres.

Les extraits de code de ce document proviennent de cet exemple.

Générer un exemple de données

Dans ViewController, la méthode de ViewDidLoad l’exemple d’application appelle LoadMLModel, 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);
        }
    });
    // ...
}

Appuyez sur l’un des trois boutons de l’application pour exécuter deux séquences de prédictions : l’une utilisant une for boucle et l’autre utilisant la nouvelle méthode de traitement par lots 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 naïvement sur le nombre spécifié d’entrées, en appelant GetPrediction pour chacune d’elles et en ignorant le résultat. La méthode met en temps 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 (étant donné qu’il s’agit d’un paramètre d’entrée obligatoire pour la GetPredictions méthode), crée un objetMLPredictionOptions objet qui empêche les calculs de prédiction d’être limités au processeur et utilise l’API GetPredictions pour extraire les prédictions, en ignorant à nouveau le résultat :

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 une boucle.