Core ML 2 v Xamarin.iOS

Core ML je technologie strojového učení dostupná v systémech iOS, macOS, tvOS a watchOS. Umožňuje aplikacím vytvářet předpovědi na základě modelů strojového učení.

V iOSu 12 obsahuje Core ML rozhraní API pro dávkové zpracování. Díky tomuto rozhraní API je Core ML efektivnější a poskytuje vylepšení výkonu ve scénářích, kdy se model používá k vytvoření posloupnosti předpovědí.

Generování ukázkových dat

Volání ViewControllermetody LoadMLModelukázkové aplikaceViewDidLoad, která načte zahrnutý model Core ML:

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

Pak ukázková aplikace vytvoří 100 000 MarsHabitatPricerInput objektů, které se použijí jako vstup pro sekvenční predikce Core ML. Každý vygenerovaný vzorek má nastavenou náhodnou hodnotu pro počet solárních panelů, počet skleníkových plynů a počet akreů:

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

Když klepnete na některé ze tří tlačítek aplikace, spustí se dvě sekvence předpovědí: jedna pomocí for smyčky a druhá pomocí nové dávkové GetPredictions metody zavedené v iOSu 12:

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

smyčka for

Verze for smyčky testu naively iteruje přes zadaný počet vstupů, volání GetPrediction pro každý výsledek a zahození výsledku. Doba trvání předpovědí metody:

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 (nové rozhraní API služby Batch)

Dávková verze testu vytvoří MLArrayBatchProvider objekt ze vstupního pole (protože se jedná o povinný vstupní parametr pro metodu GetPredictions ), vytvoří MLPredictionOptions objekt, který brání omezení výpočtů předpovědí na procesor a pomocí GetPredictions rozhraní API načítá predikce a znovu zahodí výsledek:

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

Výsledky

Na simulátoru i zařízení GetPredictions se dokončí rychleji než předpovědi Core ML založené na smyčce.