Запускаем модель машинного обучения на iPhone

от автора

Чего уж только на Хабре не было, и DOOM на осциллографе, тесте на беременности и калькуляторе запускали, даже сервер Minecraft на зеркалке Canon 200D поднимали. Сегодня же, специально к старту нового потока курса по Machine Learning и углубленного Machine Learning и Deep Learning, попробуем описать кратчайший путь от обучения модели машинного обучения на Python до доказательства концепции iOS-приложения, которое можно развернуть на iPhone. Цель статьи — дать базовый скаффолдинг, оставляя место для дальнейшей настройки, подходящей для конкретного случая использования.


Для простоты мы пропустим некоторые задачи, такие как проверка модели и создание полностью отшлифованного пользовательского интерфейса (UI). К концу этого туториала у вас будет обученная модель, работающая на iOS, которую вы сможете продемонстрировать как прототип и загрузить на своё устройство.

Шаг 1. Настройка среды 

Во-первых, давайте создадим виртуальную среду Python под названием .core_ml_demo, а затем установим необходимые библиотеки: pandas, scikit-learn и coremltools. Чтобы создать виртуальную среду, выполните в терминале эти команды:

python3 -m venv ~/.core_ml_demo source  ~/.core_ml_demo/bin/activate python3 -m pip install \ pandas==1.1.1 \ scikit-learn==0.19.2 \ coremltools==4.0

Далее установим Xcode. XCode — это инструментарий разработки для продуктов Apple. Обратите внимание, что Xcode довольно большой (больше 10 ГБ). Я бы порекомендовал выпить чашку кофе или запустить установку на ночь. 

Примечание: в этом туториале используется Xcode 12.3 (12C33) на MacOS Catalina 10.15.5.

Шаг 2. Обучение модели

Мы будем использовать набор данных Boston Housing Price от scikit-learn для обучения модели линейной регрессии и прогнозирования цен на жильё на основе свойств и социально-экономических атрибутов. 

Поскольку мы стремимся к простоте, ограничим пространство признаков тремя предикторами и как целевую переменную будем использовать цену дома.

import pandas as pd from sklearn.linear_model import LinearRegression from sklearn.datasets import load_boston  # Load data boston = load_boston() boston_df = pd.DataFrame(boston["data"]) boston_df.columns = boston["feature_names"] boston_df["PRICE"]= boston["target"]  y = boston_df["PRICE"] X = boston_df.loc[:,["RM", "AGE", "PTRATIO"]]  # Train a model lm = LinearRegression() lm.fit(X, y)

Шаг 3. Преобразование модели в Core ML

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

Перед импортом в Xcode мы преобразуем нашу модель sklearn в формат Core ML (.mlmodel) с помощью пакета python coremltool; coremltools позволяет назначать метаданные объекту модели, такие как информация об авторстве, описание функций модели и результатов.

# Convert sklearn model to CoreML import coremltools as cml  model = cml.converters.sklearn. \ convert(lm,         ["RM", "AGE", "PTRATIO"],         "PRICE")  # Assign model metadata model.author = "Medium Author" model.license = "MIT" model.short_description = \ "Predicts house price in Boston"  # Assign feature descriptions model.input_description["RM"] = \ "Number of bedrooms" model.input_description["AGE"] = \ "Proportion of units built pre 1940" model.input_description["PTRATIO"] = \ "Pupil-teacher ratio by town" # Assign the output description model.output_description["PRICE"] = \ "Median Value in 1k (USD)"  # Save model model.save('bhousing.mlmodel')

Шаг 4. Создание нового проекта в Xcode

С Python мы закончили. Теперь можно завершить прототип приложения при помощи только Xcode и Swift. Это можно сделать так:

  1. Откройте Xcode и создайте новый проект.

  2. Выберите «iOS» как тип мультиплатформы.

  3. Выберите тип приложения «App».

Создание нового проекта Xcode для iOS
Создание нового проекта Xcode для iOS

4. Дайте проекту название и выберите интерфейс «SwiftUI».

Конфигурация проекта
Конфигурация проекта

Теперь просто перетащите созданный на третьем шаге файл модели .ml в каталог Xcode. Xcode автоматически сгенерирует класс Swift для вашей модели, как показано в редакторе ниже. Если вы посмотрите на класс, то заметите, что он содержит детали, которые мы ввели при сохранении нашей модели на Python с помощью coremltools, такие как описания объектов и целевых полей. Это удобно при управлении моделью.

Импорт файла .coreml в проект Xcode
Импорт файла .coreml в проект Xcode

Шаг 5. Создание UI модели 

Далее создадим базовый пользовательский интерфейс, изменив файл contentView.swift. Приведённый ниже код на Swift отображает пользовательский интерфейс, который позволяет пользователям настраивать атрибуты дома, а затем прогнозировать его цену. Есть несколько элементов, которые мы можем здесь рассмотреть.

NavigationView содержит необходимый пользовательский интерфейс. Он включает:

  • Степпер (строки 19–30) для каждой из наших трёх функций, который позволяет пользователям изменять значения функций. Степперы — это в основном виджеты, которые изменяют @State атрибутных переменных нашего дома (строки 6–8).

  • Кнопку на панели навигации (строки 31–40) для вызова нашей модели из функции predictPrice (строка 46). На экране появится предупреждающее сообщение с прогнозируемой ценой.

За пределами NavigationView у нас есть функция predictPrice (строки 46–62). Она создаёт экземпляр класса Swift Core ML model и генерирует прогноз в соответствии с хранящимися в состояниях объектов значениями.

import SwiftUI import CoreML import Foundation  struct ContentView: View {   @State private var rm = 6.5   @State private var age = 84.0   @State private var ptratio = 16.5        @State private var alertTitle = ""   @State private var alertMessage = ""   @State private var showingAlert = false        var body: some View {       NavigationView {         VStack {         Text("House Attributes")             .font(.title)         Stepper(value: $rm, in: 1...10,                 step: 0.5) {             Text("Rooms: \(rm)")           }           Stepper(value: $age, in: 1...100,               step: 0.5) {           Text("Age: \(age)")           }           Stepper(value: $ptratio, in: 12...22,               step: 0.5) {           Text("Pupil-teacher ratio: \(ptratio)")           }           .navigationBarTitle("Price Predictor")           .navigationBarItems(trailing:               Button(action: predictPrice) {                   Text("Predict Price")               }           )           .alert(isPresented: $showingAlert) {               Alert(title: Text(alertTitle),                     message: Text(alertMessage),               dismissButton: .default(Text("OK")))           }         }       }   }              func predictPrice() {     let model = bhousing()     do { let p = try       model.prediction(           RM: Double(rm),           AGE: Double(age),           PTRATIO: Double(ptratio))          alertMessage = "$\(String((p.PRICE * 1000)))"       alertTitle = "The predicted price is:"   } catch {     alertTitle = "Error"     alertMessage = "Please retry."   }     showingAlert = true } }  struct ContentView_Previews: PreviewProvider {     static var previews: some View {         ContentView()     } }

И, наконец, самое интересное: мы можем создать и запустить симуляцию приложения в Xcode, чтобы увидеть нашу модель в действии. В приведённом ниже примере я создал симуляцию с помощью iPhone 12.

Симуляция модели работает на iOS.
Симуляция модели работает на iOS.

Заключение

И это всё. Первый прототип завершён. Здесь есть что добавить, например валидацию модели, тесты для подтверждения ожидаемой производительности после импорта в iOS и более гладкий/дружественный пользовательский интерфейс. Тем не менее я надеюсь, что статья послужит полезным справочником по развёртыванию машинного обучения на мобильном устройстве.

Новые и усовершенствованные инструменты продолжают делать поиски в мобильной разработке более доступными для сообщества Data Science, и в мобильном мире есть большое пространство для творчества. Поскольку мобильная техника мультимедийная по своей сути, она даёт богатство типов данных (например, аудио, видео, движение и местоположение) наряду с уникальными вариантами применения приложений для расширения инструментария Data Science.

Если вы кодите на Python и столкнулись в работе с задачами машинного обучения — обратите внимание на наш курс Machine Learning, на котором вы сможете систематизировать и углубить полученные самостоятельно знания, пообщаться с профессионалами и применить модели Machine Learning на практике. Даже можно будет ворваться на хакатоны Kaggle.

Если же есть намерение сменить сферу деятельности и погрузиться в ML более плотно — то можно посмотреть на продвинутый курс Machine Learning и Deep Learning, на котором вы освоите основные алгоритмы машинного обучения, обучите рекомендательную систему и создадите несколько нейронных сетей.

Узнайте, как прокачаться и в других специальностях или освоить их с нуля:

Другие профессии и курсы

ссылка на оригинал статьи https://habr.com/ru/company/skillfactory/blog/552402/


Комментарии

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *