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.