Share via


Core ML 2 in Xamarin.iOS

Core ML ist eine Machine Learning-Technologie, die unter iOS, macOS, tvOS und watchOS verfügbar ist. Es ermöglicht Apps, Vorhersagen basierend auf Machine Learning-Modellen zu erstellen.

In iOS 12 enthält Core ML eine Batchverarbeitungs-API. Diese API macht Core ML effizienter und bietet Leistungsverbesserungen in Szenarien, in denen ein Modell verwendet wird, um eine Abfolge von Vorhersagen vorzunehmen.

Generieren von Beispieldaten

In ViewController, die Methode der ViewDidLoad Beispiel-App aufruft LoadMLModel, die das enthaltene Core ML-Modell lädt:

void LoadMLModel()
{
    var assetPath = NSBundle.MainBundle.GetUrlForResource("CoreMLModel/MarsHabitatPricer", "mlmodelc");
    model = MLModel.Create(assetPath, out NSError mlErr);
}

Anschließend erstellt die Beispiel-App 100.000 MarsHabitatPricerInput Objekte, die als Eingabe für sequenzielle Core ML-Vorhersagen verwendet werden. Jede generierte Stichprobe hat einen Zufallswert für die Anzahl der Sonnenkollektoren, die Anzahl der Gewächshäuser und die Anzahl von Hektar:

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);
        }
    });
    // ...
}

Wenn Sie auf eine der drei Schaltflächen der App tippen, werden zwei Vorhersagesequenzen ausgeführt: eine mit einer for Schleife und eine andere mit der in iOS 12 eingeführten neuen Batchmethode GetPredictions :

async void RunTest(int num)
{
    // ...
    await FetchNonBatchResults(num);
    // ...
    await FetchBatchResults(num);
    // ...
}

for-Schleife

Die for Schleifenversion des Tests durchläuft naiv die angegebene Anzahl von Eingaben, ruft GetPrediction für jedes und dis Karte das Ergebnis auf. Die Methode gibt an, wie lange es dauert, um die Vorhersagen vorzunehmen:

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 (neue Batch-API)

Die Batchversion des Tests erstellt ein MLArrayBatchProvider Objekt aus dem Eingabearray (da dies ein erforderlicher Eingabeparameter für die GetPredictions Methode ist), erstellt einen MLPredictionOptions-Objekt, das verhindert, dass Vorhersageberechnungen auf die CPU beschränkt werden, und verwendet die GetPredictions API, um die Vorhersagen abzurufen, wobei das Ergebnis erneut getrennt wird Karte:

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;
}

Ergebnisse

Sowohl auf dem Simulator als auch auf dem Gerät GetPredictions wird schneller beendet als die loopbasierten Core ML-Vorhersagen.