В 2020 году машинное обучение на мобильных платформах перестало быть революционным новшеством. Интеграция интеллектуальных функций в приложения стала стандартной практикой.
К счастью, это вовсе не означает, что Apple прекратила разрабатывать инновационные технологии.
В этой публикации я кратко расскажу о новостях в отношении платформы Core ML и других технологий искусственного интеллекта и машинного обучения в экосистеме Apple.
Core ML
В прошлом году платформа Core ML серьёзно обновилась. В этом году всё гораздо скромнее: добавлено несколько новых типов слоёв, поддержка моделей шифрования и возможность размещать обновления модели в CloudKit.
Похоже, было принято решение отказаться от номеров версий. После прошлогоднего обновления платформа стала именоваться Core ML 3, однако сейчас для неё используется название Core ML без номера версии. Тем не менее, пакет coremltools всё-таки был обновлён до версии 4.
Примечание. Внутренняя спецификация mlmodel теперь имеет номер версии 5, а значит, новые модели будут отображаться в Netron с именем «Core ML v5».
Новые типы слоёв в Core ML
Добавлены следующие слои:
Convolution3DLayer, Pooling3DLayer, GlobalPooling3DLayer
: эти слои особенно полезны для обработки видеоданных — теперь для этого можно использовать платформу Vision (в Core ML по-прежнему отсутствует прямая поддержка одномерных свёрточных слоёв, хотя для этого можно использовать обычные двумерные свёрточные слои).OneHotLayer
: обеспечивает прямое унитарное кодирование входных данных.ClampedReLULayer
: обеспечивает активацию ReLU с максимальным значением (удобно использовать для создания ReLU6).- ArgSortLayer: обеспечивает сортировку для входного тензора. При этом вместо фактически отсортированных значений возвращаются отсортированные индексы. Обычный слой сортировки не предусмотрен, однако можно использовать GatherLayer, чтобы переупорядочить элементы из выходных данных argsort.
CumSumLayer
: вычисляет нарастающий итог для входного тензора.SliceBySizeLayer
: в Core ML уже доступно несколько типов слоёв разбиения. Этот слой позволяет передать тензор, содержащий индекс, с которого будет начинаться разбиение. При этом размер сектора всегда остаётся фиксированным.
Такие типы слоёв можно использовать, начиная с версии 5, то есть в iOS 14 и macOS 11.0 или более поздних версиях.
Ещё одно полезное усовершенствование: 8-битовые квантованные операции для следующих слоёв:
InnerProductLayer
BatchedMatMulLayer
В предыдущих версиях Core ML допускалось квантование весовых коэффициентов, однако после загрузки модели они преобразовывались обратно в формат с плавающей запятой. Новая функция int8DynamicQuantize
позволяет сохранять весовые коэффициенты в виде 8-битовых целочисленных значений и выполнять фактические вычисления также с использованием целых чисел.
Вычисления с использованием INT8 могут выполняться гораздо быстрее, чем операции с плавающей запятой. Это предоставляет ЦП определённые преимущества, но нет уверенности в том, повысится ли производительность графических процессоров, поскольку для них операции с плавающей запятой весьма эффективны. Возможно, в будущем обновлении Neural Engine будет реализована встроенная поддержка операций INT8 (всё-таки компания Apple не так давно приобрела Xnor.ai…).
Что касается ЦП, на них Core ML теперь также может использовать 16-битовые операции с плавающей запятой вместо 32-битовых (на A11 Bionic и выше). Как мы уже говорили в видеоролике Explore numerical computing in Swift (Изучаем численные расчёты в Swift), Float16 сегодня стал типом данных Swift первого класса. Благодаря встроенной поддержке 16-битовых операций с плавающей запятой скорость работы Core ML может увеличиться вдвое!
Примечание. В Core ML тип данных Float16 уже использовался на графических процессорах и Neural Engine, так что различия будут заметны только при использовании на ЦП.
Остальные (незначительные) изменения:
UpsampleLayer
теперь поддерживает дробный коэффициент масштабирования. В режиме BILINEAR доступны новые параметры дискретизации точек сетки (метод align-corners). В принципе, это должно решать большинство проблем, которые описывает данная публикация в блоге.- Для
ReorganizeDataLayerParams
добавлен режим PIXEL_SHUFFLE. Это ещё один метод, позволяющий выполнить повышающую дискретизацию. Ранее для перетасовки пикселей можно было использовать несколько слоёв перестановки и изменения формы, однако встроенная функция делает этот процесс значительно более удобным. - Для слоёв
SliceStaticLayer
иSliceDynamicLayer
добавлено свойство squeezeMasks, которое повышает удобство и эффективность разбиения. - Слой
TileLayer
принимает второй входной тензор, благодаря чему можно динамически задавать количество повторов.
Изменений в отношении локального обучения на устройствах, похоже, нет: по-прежнему поддерживаются только полносвязные и свёрточные слои. Класс MLParameterKey
в CoreML.framework теперь содержит параметр конфигурации для оптимизатора RMSprop, однако это усовершенствование пока не включено в NeuralNetwork.proto. Возможно, оно будет добавлено в следующей бета-версии.
Добавлены следующие новые типы моделей:
VisionFeaturePrint.Object
— блок выделения признаков, оптимизированный для распознавания объектов.
SerializedModel
. Не знаю точно, для чего это нужно. Это «частное» определение, которое «может быть изменено без предварительного уведомления и какой-либо ответственности». Может быть, таким образом Apple встраивает патентованные форматы моделей в mlmodel?
Размещение обновлений модели в CloudKit
Этот новый компонент Core ML позволяет обновлять модели отдельно от приложения.
Вместо обновления всего приложения, можно просто загрузить в развёрнутые экземпляры новую версию файла mlmodel. Честно говоря, эта идея не нова, и некоторые сторонние поставщики уже разработали соответствующие пакеты SDK. Кроме того, несложно создать такой пакет самостоятельно. Преимущество решения Apple в данном случае заключается в возможности размещать модели в облаке Apple Cloud.
Поскольку в приложении может быть несколько моделей, новая концепция коллекции моделей позволяет объединить модели в одном пакете, чтобы приложение смогло обновить их все одновременно. Такие коллекции можно создавать с помощью панели управления CloudKit.
Для загрузки обновления моделей и управления ими приложение использует класс MLModelCollection
. В видеоролике WWDC показаны фрагменты кода для выполнения этой задачи.
Для подготовки модели Core ML к развёртыванию теперь доступна кнопка Create Model Archive (Создать архив модели) в Xcode. По нажатию на неё выполняется запись в файл .mlarchive. Такую версию модели можно отправить на панель управления CloudKit, а затем добавить её в коллекцию моделей (mlarchive выглядит как обычный ZIP-архив, в который добавлено содержимое папки mlmodelc).
Очень удобно, что можно выполнить развёртывание различных коллекций моделей для разных пользователей. Например, камера iPhone отличается от камеры iPad, поэтому может потребоваться создать две версии модели и отправить одну из них пользователям iPhone, а вторую — пользователям iPad.
Можно определить правила настройки под различные классы устройств (iPhone, iPad, TV, Watch), различные операционные системы и их версии, коды региона, языковые коды и версии приложения.
Кажется, не предусмотрен механизм, позволяющий разделить пользователей на группы по другим критериям, например, для A/B-тестирования обновлений модели или настройки под конкретные типы устройств – iPhone X или более ранней версии. Однако это по-прежнему можно сделать вручную, создав коллекции с разными именами, а затем явным образом запросив у MLModelCollection
предоставление соответствующей коллекции по заданному имени в среде выполнения.
Развёртывание новой версии модели не всегда выполняется быстро. В определённый момент приложение обнаруживает новую доступную модель и автоматически загружает и размещает её в тестовой среде приложения. Однако вам не предоставляется возможность определять, где и как это произойдёт: Core ML может выполнять загрузку в фоновом режиме, например, пока вы не пользуетесь телефоном.
Из-за этого рекомендуется во всех случаях добавлять в приложение встроенную модель как резервный вариант — например, универсальную модель, которая поддерживает как iPhone, так и iPad.
Несмотря на то, что это удобное решение позволяет пользователям не беспокоиться о самостоятельном размещении моделей, следует иметь в виду, что теперь ваше приложение использует CloudKit. Как я понимаю, коллекции моделей учитываются в общей квоте системы хранения данных, а загрузка моделей учитывается в квотах сетевого трафика.
См. также:
- Развёртывание моделей и обеспечение безопасности в Core ML (видеоролик WWDC)
- Создание и развёртывание коллекции моделей
- Получение развёрнутых коллекций моделей
Примечание. Новую возможность обновления с использованием CloudKit, к сожалению, довольно трудно совместить с локальной персонализацией модели. Не предусмотрено никаких простых способов передать знания, полученные персонализированной моделью, в новую модель или каким-то образом объединить их.
Шифрование модели
До настоящего момента любой злоумышленник мог с лёгкостью выкрасть вашу модель Core ML и интегрировать её в собственное приложение. Начиная с версии iOS 14/macOS 11.0, Core ML поддерживает автоматическое шифрование и дешифрование моделей, ограничивая доступ злоумышленников к вашим папкам mlmodelc. Шифрование можно использовать в сочетании с новой функцией развёртывания через CloudKit или отдельно.
Xcode шифрует скомпилированные модели (mlmodelc), а не исходный файл mlmodel. Модель всегда сохраняется на пользовательском устройстве в зашифрованном виде. И только когда приложение создаёт экземпляр модели, Core ML автоматически выполняет её дешифрование. Дешифрованная версия модели существует только в памяти, но не хранится в виде файла.
Во-первых, теперь вам потребуется ключ шифрования. Хорошая новость: вам не придётся управлять этим ключом самостоятельно! В средстве просмотра моделей Core ML Xcode теперь доступна кнопка Create Encryption Key (Создать ключ шифрования). По нажатию на эту кнопку Xcode создаёт новый ключ шифрования и связывает его с учётной записью вашей команды разработчиков Apple. Вам не придётся иметь дело с запросами на подпись сертификатов и физическими ключами доступа.
В ходе этой процедуры создаётся новый файл .mlmodelkey. Ключ хранится на серверах Apple, однако вы также получаете локальную копию для шифрования моделей в Xcode. Вам не потребуется встраивать этот ключ шифрования в приложение, тем более что этого и не следует делать!
Для шифрования модели Core ML можно добавить флаг компилятора --encrypt YourModel.mlmodelkey
для этой модели. А если вы планируете развёртывать модель с помощью CloudKit, потребуется указать ключ шифрования при создании архива модели.
Чтобы дешифровать модель после того, как приложение создаст её экземпляр, Core ML потребуется по сети получить с серверов Apple ключ шифрования. Для этого, разумеется, необходимо подключение к сети. Core ML выполняет эту процедуру только при первом использовании модели.
Если сетевое соединение отсутствует и ключ шифрования ещё не загружен, приложение не сможет создать экземпляр модели Core ML. По этой причине рекомендуется использовать новую функцию YourModel.load()
. Она содержит завершающий обработчик, который позволяет реагировать на ошибки загрузки. Например, код ошибки modelKeyFetch
сообщает о том, что Core ML не удалось загрузить ключ шифрования с серверов Apple.
Это очень полезная функция, если вы беспокоитесь о том, что кто-то похитит вашу патентованную технологию. К тому же её легко интегрировать в приложение.
См. также:
- Развёртывание моделей и обеспечение безопасности в Core ML (видеоролик WWDC)
- Создание ключа шифрования модели
- Шифрование модели в приложении
Примечание. Согласно информации, приведённой в этом сообщении на форуме разработчиков, зашифрованные модели не поддерживают локальную персонализацию. Звучит разумно.
CoreML.framework
API-интерфейс iOS, предназначенный для работы с моделями Core ML, не особенно сильно изменился. И всё же хочется отметить пару интересных моментов.
Единственный новый класс здесь — MLModelCollection
, который предназначен для развёртывания с помощью CloudKit.
Как вы уже знаете, при добавлении файла mlmodel в свой проект Xcode автоматически генерирует исходный файл Swift или Objective-C, который содержит классы, упрощающие работу с моделью. В этих сгенерированных классах можно заметить пару изменений:
- Стандартный метод
init()
признан устаревшим. Поэтому, записьlet model = YourModel()
вызовет предупреждение компилятора. Вместо устаревшего можно использовать методYourModel(configuration:)
или новый методYourModel.load()
, который позволяет обрабатывать ошибки при загрузке (например, если не удаётся дешифровать зашифрованную модель). - Если в модели используются изображения, то вместо обработки объектов
CVPixelBuffer
можно создать объектYourModelInput
, используя для этого классCGImage
или URL-адрес, указывающий на локальный PNG- или JPG-файл, и составить прогноз на основе этих данных. Тем не менее, при этом не будет возможности применить методcropAndScale
илиcropRect
. То есть, если нужны дополнительные инструменты контроля за изменением размера изображений, вряд ли эти новые методы будут полезны.
В документации по MLModel появилось новое предупреждение:
Используйте экземпляр MLModel только в одном потоке или в одной очереди отправки. Для этого можно сериализовать вызовы метода к модели или создать отдельный экземпляр модели для каждого потока и очереди отправки.
Ой, прошу прощения. Мне казалось, что внутри MLModel использовалась последовательная очередь для обработки запросов, однако я мог ошибаться — или же что-то изменилось. В любом случае, лучше придерживаться этой рекомендации в будущем.
В MLMultiArray
реализован новый инициализатор init(concatenating:axis:dataType:)
, который создаёт новый мульти-массив путём объединения нескольких существующих мульти-массивов. Все они должны иметь одинаковую форму за исключением заданной оси, вдоль которой выполняется объединение. Похоже, эта функция добавлена специально для формирования прогнозов по видеоданным, как в новых моделях классификатора действий в Create ML. Удобно!
Примечание. Перечисление MLMultiArrayDataType
теперь содержит статические свойства .float
и .float64
. Не знаю точно, для чего они нужны, ведь это перечисление уже имеет свойства .float32
и .double
. Ошибка бета-версии?
Средство просмотра моделей Xcode
В Xcode теперь отображается гораздо больше информации о моделях, например, метки классов и все добавленные пользовательские метаданные. Кроме того, выводятся статистические данные о типах слоёв в модели.
Это удобное средство интерактивного просмотра, с помощью которого можно вносить изменения в модель в тестовом режиме, не запуская приложение. В это окно предварительного просмотра можно перетаскивать изображения, видеоролики или текст и сразу же просматривать прогнозы модели. Отличное обновление!
Кроме того, теперь можно использовать модели Core ML в интерактивной среде. Xcode автоматически генерирует для этого класс, который можно использовать в обычном порядке. Это ещё один способ интерактивного тестирования моделей до их добавления в приложение.
coremltools 4
Создавать собственные модели для простых проектов удобно с помощью Create ML, однако гораздо чаще для обучения используются TensorFlow и PyTorch. Чтобы использовать такую модель в Core ML, необходимо сначала конвертировать её в формат mlmodel. Именно для этого используется набор инструментов coremltools.
Отличные новости: документация стала значительно лучше. Рекомендую ознакомиться с ней. Будем надеяться, что руководство для пользователя будет регулярно обновляться, потому что раньше документация не всегда была актуальной.
Примечание. К сожалению, исчезли образцы блокнотов Jupyter. Теперь они включены в руководство для пользователя, но уже не как блокноты.
Серьёзно изменился способ преобразования моделей. Используемые ранее конвертеры нейросетей устарели, и их заменили более новые и гибкие версии.
На сегодняшний день доступно три типа конвертеров:
- Современные конвертеры для TensorFlow (как 1.x, так и 2.x), tf.keras и PyTorch. Все эти конвертеры созданы на основе одних и тех же технологий и используют так называемый промежуточный язык модели (MIL). Для таких моделей больше не нужно использовать tfcoreml или onnx-coreml.
- Старые конвертеры для нейросетей Keras 1.x, Caffe и ONNX. Для каждой из них предусмотрен специализированный конвертер. Их дальнейшая разработка прекращена, в будущем планируется выпускать только исправления. Для преобразования моделей PyTorch больше не рекомендуется использовать ONNX.
- Конвертеры для моделей не на основе нейросетей, таких как scikit-learn и XGBoost.
Для преобразования моделей TensorFlow 1.x, 2.x, PyTorch или tf.keras используется новый единый API-интерфейс преобразования. Он применяется следующим образом:
import coremltools as ct
class_labels = [ "cat", "dog" ]
image_input = ct.ImageType(shape=(1, 224, 224, 3),
bias=[-1, -1, -1],
scale=2/255.)
model = ct.convert(
keras_model,
inputs=[ image_input ],
classifier_config=ct.ClassifierConfig(class_labels)
)
model.save("YourModel.mlmodel")
Функция ct.convert()
проверяет файл модели, чтобы определить её формат, а затем автоматически выбирает соответствующий конвертер. Аргументы несколько отличаются от тех, что использовались прежде: аргументы предварительной обработки передаются с помощью объекта ImageType
, метки классификатора — с помощью объекта ClassifierConfig
и так далее.
Новый API-интерфейс преобразования конвертирует модель в промежуточное представление — т. н. MIL. На сегодняшний день доступны конвертеры для преобразования моделей TensorFlow 1.x в MIL, TensorFlow 2.x в MIL (в том числе tf.keras) и PyTorch в MIL. Если наберёт популярность новая платформа глубокого обучения, она получит собственный конвертер в MIL.
После конвертации модели в формат MIL её можно оптимизировать согласно общим правилам, например, изъять ненужные операции или объединить несколько разных слоёв. Затем модель преобразовывается из MIL в формат mlmodel.
Я ещё не изучил всё это подробно, однако новый подход даёт возможность надеяться, что coremtools 4 сможет создавать более эффективные файлы mlmodel, чем раньше — особенно для графов TF 2.x.
В MIL мне особенно нравится возможность настроить для конвертера способ обработки тех слоёв, которые он ещё не проанализировал. Если ваша модель содержит слой, который не поддерживается в Core ML напрямую, может потребоваться разделить его на более простые операции MIL, такие как матричное умножение или другие арифметические действия.
После этого конвертер сможет использовать так называемые «составные операции» для всех слоёв такого типа. Это намного проще, чем добавлять неподдерживаемые операции с помощью пользовательских слоёв, хотя и это возможно. В документации приведён хороший пример использования таких составных операций.
См. также:
- Get models on device using Core ML Converters (Добавление моделей на устройства с помощью конвертеров Core ML) (видеоролик WWDC)
- Документация по coremltools
Другие платформы Apple, использующие машинное обучение
Несколько других высокоуровневых платформ в пакетах SDK для iOS и macOS также используются для задач, связанных с машинным обучением. Давайте посмотрим, что нового в этой сфере.
Vision
Платформа компьютерного зрения Vision получила ряд новых функций.
На платформе Vision уже использовались модели распознавания лиц, отличительных черт и человеческих тел. В новой версии добавлены следующие функции:
Распознавание положения рук (VNDetectHumanHandPoseRequest
)
Распознавание поз нескольких человек (VNDetectHumanBodyPoseRequest
)
Очень здорово, что Apple включила функции распознавания поз в ОС. Эту функцию поддерживают несколько моделей с открытым исходным кодом, однако они далеко не так эффективны или быстры. Коммерческие же решения отличаются высокой стоимостью. Теперь качественные инструменты распознавания поз доступны бесплатно!
Сейчас, в отличие от рассматривания статических изображений, больше внимания уделяется распознаванию объектов на видеозаписи как в автономном режиме, так и в реальном времени. Для удобства можно задействовать объекты CMSampleBuffer
непосредственно с камеры, используя для этого обработчики запросов.
Также в класс VNImageBasedRequest
добавлен подкласс VNStatefulRequest
, который отвечает за оперативное подтверждение обнаружения искомого объекта. В отличие от стандартного класса VNImageBasedRequest
здесь повторно используется запрос с отслеживанием состояния, охватывающий несколько кадров. Такой запрос выполняет анализ через каждые N кадров видеозаписи.
После обнаружения искомого объекта вызывается завершающий обработчик, содержащий объект VNObservation
, который теперь имеет свойство timeRange
, указывающее время начала и прекращения наблюдения в видеозаписи.
Напрямую класс VNStatefulRequest
не используется. Это абстрактный базовый класс, который в настоящее время делится на подклассы только посредством запроса VNDetectTrajectoriesRequest
для целей распознавания траектории. Это позволяет распознавать формы, движущиеся вдоль параболической траектории, например, при броске мяча или ударе по нему ногой (кажется, в настоящее время это единственная встроенная задача, связанная с видео).
Для анализа видеозаписей в автономном режиме можно использовать VNVideoProcessor.
Этот объект добавляет URL-адрес в локальную видеозапись и выполняет один или несколько запросов Vision через каждые N кадров или N секунд.
Одним из важнейших традиционных приёмов компьютерного зрения для анализа видеозаписей является оптический поток. В Vision теперь доступен запрос VNGenerateOpticalFlowRequest
, который вычисляет направление, в котором каждый пиксель перемещается из одного кадра в другой (плотный оптический поток). В результате создаётся объект VNPixelBufferObservation
, содержащий новое изображение, в котором каждому пикселю соответствуют два 32-битовых или 16-битовых значения с плавающей запятой.
Кроме того, добавлен новый запрос VNDetectContoursRequest
для распознавания контуров объектов в изображении. Такие контуры возвращаются в виде векторных контуров. VNGeometryUtils
предоставляет вспомогательные инструменты для последующей обработки распознанных контуров, например, их упрощения до базовых геометрических фигур.
И последнее нововведение в Vision — новая версия встроенного блока выделения признаков VisionFeaturePrint. В iOS уже реализован блок VisionFeaturePrint.Scene, который особенно удобен для создания классификаторов изображений. Кроме того, теперь доступна новая модель VisionFeaturePrint.Object, которая оптимизирована для выделения признаков, используемых при распознавании объектов.
Эта модель поддерживает входные изображения 299×299 и возвращает два мульти-массива формы (288, 35, 35) и (768, 17, 17), соответственно. Это ещё не четкие ограничивающие рамки, а лишь «необработанные» признаки. Для полноценного распознавания объектов потребуется добавить логику, которая преобразует эти признаки в ограничивающие рамки и метки классов. Эту задачу выполняет Create ML, если обучение инструмента распознавания объектов выполняется с использованием переноса обучения.
См. также:
- Explore Computer Vision APIs (Знакомство с API компьютерного зрения) (видеоролик WWDC)
- Detect Body and Hand Pose with Vision (Распознавание поз и положения рук в Vision) (видеоролик WWDC)
- Explore the Action & Vision app (Знакомство с приложением Action & Vision) (видеоролик WWDC)
Обработка естественного языка
Для задач обработки естественного языка можно использовать платформу Natural Language. Она активно применяет модели, обученные в Create ML.
В этом году добавлено совсем немного новых функций:
NLTagger
иNLModel
теперь находят несколько тегов и предсказывают их достоверность. Раньше достоверность тега определялась только набранным количеством баллов.- Вставка предложений. Вставку слов можно было использовать и раньше, однако теперь
NLEmbedding
поддерживает целые предложения.
При вставке предложений используется встроенная нейросеть для кодирования всего предложения в 512-мерный вектор. Это позволяет получить контекст, в котором слова используются в предложении (вставка слов такую функцию не поддерживает).
См. также:
- Make apps smarter with Natural Language (Добавление интеллектуальных функций в приложения с помощью Natural Language) (видеоролик WWDC)
Анализ речи и звуков
В этой области изменений не было.
Обучение моделей
Обучение моделей с помощью API-интерфейсов Apple впервые стало доступно в iOS 11.3 и на платформе Metal Performance Shaders. За предыдущие несколько лет добавлено множество новых API для обучения, и этот год тоже не стал исключением: по моим подсчётам, нам теперь доступно целых 7 различных API для обучения нейросетей на платформах iOS и macOS!
В настоящее время для обучения моделей машинного обучения — в частности, нейросетей — в iOS и macOS можно использовать следующие API-интерфейсы Apple:
- Локальное обучение в Core ML.
- Create ML: этот интерфейс может быть известен вам в виде приложения, однако это также платформа, доступная в macOS.
- Metal Performance Shaders: API для формирования логического вывода и обучения на графическом процессоре. По сути это два разных API, довольно сложных в использовании, если вы плохо знакомы с Metal. Кроме того, также доступна новая платформа Metal Performance Shaders Graph, которая, похоже, заменит эти устаревшие API.
- BNNS: часть платформы Accelerate. Ранее в BNNS были доступны только процедуры логического вывода, однако в этом году добавлена также поддержка обучения.
- ML Compute: принципиально новая платформа, которая выглядит весьма многообещающе.
- Turi Create: фактически это версия Create ML для Python. В последнее время её создатели о ней подзабыли, хотя поддержка платформы пока не прекращена.
Рассмотрим нововведения в этих API подробнее.
Локальное обучение в Core ML
По сути, никаких масштабных изменений здесь нет. Могла быть добавлена поддержка обновлений ещё для нескольких типов слоёв, но документации по этому вопросу я пока не видел.
Одно из важных нововведений, которого стоит ожидать в будущей бета-версии — оптимизатор RMSprop. В текущую бета-версию он не входит.
Create ML
Платформу Create ML изначально можно было использовать только под управлением macOS. Её можно запустить в среде Swift Playground, чтобы использовать для обучения моделей всего пару строк кода.
В прошлом году Create ML была преобразована в приложение с достаточно ограниченным функционалом, и я с удовольствием отмечаю значительные усовершенствования в этом году. При этом Create ML остаётся платформой, которую всё ещё можно использовать из кодовой части. Фактически приложение представляет собой просто удобный графический интерфейс для работы с платформой.
В предыдущей версии приложения Create ML можно было обучить модель всего один раз. Чтобы что-то изменить, приходилось обучать её повторно с нуля, а это занимало немало времени.
Новая версия Xcode 12 позволяет приостанавливать обучение и возобновлять его позднее, сохранять контрольные точки модели (моментальные снимки) и просматривать предварительные результаты обучения модели. Теперь в нашем распоряжении значительно больше инструментов для управления процессом обучения. Благодаря этому обновлению приложение Create ML действительно становится полезным!
На платформе CreateML.framework также доступны новые API для настройки сеансов обучения, обработки контрольных точек модели и т. д. Я полагаю, большинство специалистов просто будет использовать приложение Create ML, но всё равно приятно видеть, что эта функция теперь доступна и на платформе.
Новые функции Create ML (как на платформе, так и в приложении):
- Перенос стиля для изображений и видеозаписей
- Классификация действий людей в видеозаписях
- Перенос обучения для распознавания объектов
- Перенос обучения с тегированием слов и динамической вставкой слов
Давайте подробнее рассмотрим новую модель классификации действий. Она использует модель распознавания поз, доступную на платформе Vision. Классификатор действий представляет собой нейросеть, которая в качестве входных данных принимает форму (window_size, 3, 18
), при этом первое значение представляет длительность видеофрагмента, указанную в количестве кадров (обычно используются фрагменты около 2 секунд), а (3, 18) представляют ключевые точки позы.
Вместо повторяющихся слоёв нейросеть использует одномерные свёртки. Скорее всего, это вариация свёрточной сети с пространственно-временными графами (STGCN) — тип модели, специально предназначенный для прогнозирования временных рядов. Эти детали не должны вас волновать при использовании таких моделей в приложении. Однако мне всегда хочется узнать, как всё это работает.
Что касается моделей распознавания объектов, можно выбрать обучение всей сети на основе TinyYOLOv2 или же использовать новый режим переноса обучения, в рамках которого задействован новый блок выделения признаков VisionFeaturePrint.Object. Остальная часть модели по-прежнему напоминает YOLO и SSD, однако благодаря переносу её обучение будет гораздо более быстрым, чем обучение всей модели на основе YOLO.
См. также:
- Build an Action Classifier with Create ML (Создание классификатора действий с помощью Create ML) (видеоролик WWDC)
- Build Image and Video Style Transfer models in Create ML (Создание моделей переноса стилей видеозаписи и изображения в Create ML) (видеоролик WWDC)
- Control training in Create ML with Swift (Управление обучением в Create ML с помощью Swift) (видеоролик WWDC)
Metal Performance Shaders
Metal Performance Shaders (MPS) — платформа на базе производительных вычислительных ядер Metal, которая в основном используется для обработки изображений, но с 2016 года предлагает также поддержку нейросетей. Я уже много писал об этом в блоге.
Сегодня большинство пользователей выберут Core ML, а не MPS. Конечно, Core ML всё равно использует возможности MPS при выполнении моделей на графическом процессоре. Однако MPS также можно использовать напрямую, особенно если пользователь планирует проводить обучение самостоятельно (кстати, теперь доступна новая платформа ML Compute, которую рекомендуется использовать вместо MPS. Её описание приведено ниже).
В этом году в MPSCNN мало новых функций, но усовершенствовано несколько существующих.
Добавлены новые классы MPSImageCanny
для распознавания контуров и MPSImageEDLines для распознавания линейных сегментов. Они очень полезны при работе над задачами компьютерного зрения.
Стоит также отметить и ряд других изменений:
- В
MPSCNNConvolutionDataSource
добавлено новое свойствоkernelWeightsDataType
, которое позволяет использовать для весовых коэффициентов тип данных, отличный от того, что применяется при свёртке. Что интересно, весовые коэффициенты не могут относиться к типу данных INT8, даже несмотря на то, что Core ML позволяет использовать этот тип данных для отдельных слоёв. - Если
kernelWeightsDataType
возвращает значение.float32
, свёрточные и полносвязные слои выполняются с использованием 32-битовых операций с плавающей запятой вместо 16-битовых. Ранее поддерживались только 16-битовые. - Функции потерь теперь могут использовать параметр
reduceAcrossBatch
.
По-прежнему можно использовать MPSCNN, если Metal вас не пугает. Однако теперь доступна новая платформа, которая значительно упрощает создание и выполнение таких графов: MPS Graph.
Примечание. В видеоролике WWDC указывается, что MPSNDArray — новый API, но на самом деле он появился ещё в прошлом году. Это гораздо более гибкая структура данных, чем MPSImage, поскольку не все тензоры в вашей модели могут быть изображениями.
Новое: Metal Performance Shaders Graph
В MPS давно доступен API MPSNNGraph
, однако такие графы, по сути, описывают только нейросети. Однако далеко не все графы обязательно должны быть нейросетями, и именно в этом случае будет полезна платформа Metal Performance Shaders Graph.
Эту новую платформу можно использовать для создания универсальных графов вычислительных операций графического процессора. Платформа MPS Graph не зависит от Metal Performance Shaders, хотя и создавалась на её основе.
В предыдущей версии устаревшего API MPSNNGraph
в граф невозможно было добавить пользовательские операции. Новая платформа в этом отношении гораздо более гибкая. Впрочем, добавлять собственные вычислительные ядра Metal нельзя. Потребуется выражать все вычисления с помощью существующих примитивов.
К счастью, компилятор MPSGraph
поддерживает объединение таких примитивов в единое вычислительное ядро, что обеспечивает его максимально эффективную работу на графическом процессоре. Тем не менее, эта схема не сработает, если для какой-то операции невозможно или затруднительно использовать предоставленные примитивы. Я просто не понимаю, почему Apple, создавая новый API вроде этого, никогда не предусматривает возможность создания полноценных пользовательских функций! Но ничего не поделаешь.
Новая платформа MPSGraph
представляет собой достаточно простую и логичную структуру, описывающую связь между операциями в наборе MPSGraphOperations
посредством тензоров MPSGraphTensors
, содержащих результаты операций. Кроме того, можно определить управляющие зависимости, чтобы принудительно запускать отдельные узлы раньше других. После настройки графа, его необходимо выполнить или передать в командный буфер, а затем дождаться результата.
MPSGraph
предоставляет целый набор методов экземпляра, которые позволяют добавлять в граф любые математические операции или операции нейросети.
Кроме того, поддерживается обучение, которое предполагает добавление в граф операции обработки потерь и последующее выполнение операций градиента для всех слоёв в обратном порядке — как и в устаревшем MPSNNGraph
. Для удобства доступен также режим автоматической дифференциации, в рамках которого MPSGraph
автоматически выполняет операции градиента для графа. Это позволяет сэкономить много усилий.
Мне нравится, что для создания таких вычислительных графов теперь есть новый, простой и понятный API. Он гораздо удобнее в использовании, чем предыдущие версии. И для работы с ним не нужно быть экспертом по Metal. Кстати, он во многом похож на графы TensorFlow 1.x, но при этом имеет большое преимущество в плане оптимизации, что позволяет максимально сократить издержки. И всё-таки не хватает возможности добавлять в граф произвольные вычислительные ядра.
См. также:
- Build customized ML models with the Metal Performance Shaders Graph (Создание пользовательских моделей машинного обучения в Metal Performance Shaders Graph) (видеоролик WWDC)
- Добавление пользовательских функций в Shader Graph
BNNS (Basic Neural Network Subroutines)
Если Core ML выполняется на ЦП, то она использует подпрограммы BNSS, которые являются частью платформы Accelerate. Я уже писал о BNNS в этой статье. Поддержка этих функций BNNS на сегодняшний день по большей части прекращена, и они заменены новым набором функций.
Ранее поддерживались только полносвязные слои, функции свёртки, группирования и активации. Это обновление добавляет в BNNS поддержку n-мерных массивов, практически всех типов слоёв Core ML, а также версии обратной совместимости таких слоёв для обучения (включая слои, которые в настоящее время не поддерживают обучение Core ML, например, LSTM).
Стоит также отметить наличие слоя множественного внимания. Такие слои часто используются в моделях Transformer, например, BERT. Ещё один интересный момент — свёртывания тензоров.
Возможно, вы не будете самостоятельно использовать эти функции BNNS — точно так же, как не станете использовать MPS для обучения на графическом процессоре. Вместо этого теперь доступна платформа более высокого уровня ML Compute, которая абстрагирует используемый процессор. В основу ML Compute положены BNNS и MPS, но разработчикам не придётся беспокоиться о таких мелочах.
См. также: документация по платформе BNNS
Новое: ML Compute
ML Compute представляет собой принципиально новую платформу для обучения нейросетей на ЦП или графических процессорах (но, видимо, не на процессорах Neural Engine). На Mac Pro с несколькими графическими процессорами эта платформа может автоматически использовать для обучения их все сразу.
Меня слегка удивило наличие ещё одной платформы для обучения, однако эта платформа действительно всё упрощает, потому что позволяет скрывать низкоуровневые компоненты из BNNS и MPS, а в будущем, может быть, и из Neural Engine.
Что самое интересное, ML Compute также поддерживается системами iOS, а не только на Mac. Забавно, что нигде не упоминается Core ML. ML Compute как будто бы создавалась совершенно отдельно. Эту платформу нельзя использовать для создания моделей Core ML.
По своему опыту могу сказать, что задача ML Compute, — в первую очередь, ускорить работу сторонних инструментов глубокого обучения. Вам не придётся писать код, чтобы работать напрямую с ML Compute. Похоже, предполагается (ну или разработчики надеются на это), что такие инструменты, как TensorFlow, начнут использовать эту платформу, чтобы реализовать в Mac поддержку обучения с аппаратным ускорением.
Доступен примерно тот же набор слоёв, что и в BNNS. Слои необходимо добавить в граф, а затем выполнить его (здесь режим «напряжённого ожидания» не используется).
Чтобы создать граф, необходимо сначала создать экземпляр объекта MLCGraph
и добавить в него узлы. Узел — это подкласс MLCLayer
. Узлы соединяются между собой посредством объектов MLCTensor
, которые содержат выходные данные других слоёв.
Что интересно, операции разделения, конкатенации, переформатирования и переноса представляют собой не отдельные типы слоёв, а операции непосредственно на графе.
Отличная функция отладки — summarizedDOTDescription
. Она возвращает описание DOT для графа, на основе которого затем можно создать график с помощью, например, программы Graphviz или OmniGraffle (кстати, Keras генерирует графики моделей именно так).
ML Compute различает графы логического вывода и графы обучения. Последний содержит дополнительные узлы, например, слой потерь и оптимизатор.
Похоже, способов создания пользовательских слоёв здесь не предусмотрено, поэтому придётся обойтись только типами, доступными в ML Compute.
Странно, что по этой новой платформе не было сессий в рамках WWDC, и документация тоже достаточно разрозненная. Как бы там ни было, я продолжу следить за её развитием, потому что, кажется, это именно тот API, который лучше всего подходит для обучения моделей на устройствах Apple.
См. также: документация по платформе ML Compute
Заключение
В Core ML добавлен ряд новых полезных функций, например, автоматическое обновление моделей и шифрование. Новые типы слоёв на самом деле не очень нужны, потому что слои, добавленные в прошлом году, позволяют решить практически любые задачи. В целом это обновление мне нравится.
В coremltools 4 добавлены важные усовершенствования — новая архитектура конвертера и встроенная поддержка TensorFlow 2 и PyTorch. Я рад, что нам больше не придётся использовать ONNX для преобразования моделей PyTorch.
В Vision добавлено множество новых удобных функций. И мне нравится, что компания Apple добавила функцию анализа видеозаписей. Хотя системы машинного обучения и можно применять для отдельных кадров видеозаписи, в этом случае не учитывается время. Поскольку сегодня мобильные устройства стали достаточно быстрыми, чтобы выполнять машинное обучение на основе видеоданных в реальном времени, я полагаю, в ближайшем будущем видео будет играть более важную роль в разработках технологий компьютерного зрения.
Что касается обучения… не уверен, что нам нужны семь разных API для этой задачи. Полагаю, Apple просто не захотела выводить из обращения устаревшие интерфейсы, пока новые не будут полностью доработаны. О платформе ML Compute пока известно мало. Однако на момент написания этой статьи вышла только первая бета-версия. Кто знает, что нас ждёт впереди…
В докладной картинке использована иконка Freepik с flaticon.com.
Автор: the_ilya_m