Поделиться через


Core ML 2 в Xamarin.iOS

Core ML — это технология машинного обучения, доступная в iOS, macOS, tvOS и watchOS. Это позволяет приложениям создавать прогнозы на основе моделей машинного обучения.

В iOS 12 Core ML включает API пакетной обработки. Этот API повышает эффективность ядра машинного обучения и повышает производительность в сценариях, когда модель используется для создания последовательности прогнозов.

Создание примера данных

В ViewControllerпримере метода приложения ViewDidLoad вызывается LoadMLModelметод, который загружает включенную модель Машинного обучения Core:

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

Затем пример приложения создает 100 000 MarsHabitatPricerInput объектов для использования в качестве входных данных для последовательных прогнозов Core ML. Каждый созданный образец имеет случайный набор значений для количества солнечных панелей, количества парников и количества акров:

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

Касание любой из трех кнопок приложения выполняет две последовательности прогнозов: один с помощью for цикла, а другой с помощью нового пакетного метода, введенного GetPredictions в iOS 12:

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

for - цикл

Версия for цикла теста наивно выполняет итерацию по указанному количеству входных данных, вызывая GetPrediction каждое и отсчитывающее результат карта. Время, в течение сколько времени требуется для выполнения прогнозов:

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 (новый API пакетной службы)

Пакетная версия теста создает MLArrayBatchProvider объект из входного массива (так как это обязательный входной параметр для GetPredictions метода), создает объект MLPredictionOptionsОбъект, который предотвращает ограничение вычислений прогнозирования ЦП и использует GetPredictions API для получения прогнозов, снова не карта при этом результат:

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

Результаты

На симуляторе и устройстве выполняется быстрее, GetPredictions чем прогнозы Core ML на основе цикла.