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 на основе цикла.