Лидеры мнений

Избегая скрытых опасностей: навигация по неочевидным ловушкам в ML на iOS

mm
Добавьте Unite.AI в избранные источники в Google

Вам нужен ML?

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

Когда вы готовы решить некоторые из своих бизнес-проблем с помощью ML, вы должны учитывать, где будут работать ваши модели ML. Для некоторых это имеет смысл запускать серверную инфраструктуру. Это имеет преимущество в том, что ваши модели ML остаются частными, поэтому конкурентам труднее догнать вас. Кроме того, серверы могут запускать более широкий спектр моделей. Например, модели GPT (ставшие знаменитыми благодаря ChatGPT) в настоящее время требуют современных GPU, поэтому потребительские устройства не подходят. С другой стороны, поддержание вашей инфраструктуры довольно дорого, и если устройство потребителя может запустить вашу модель, почему платить больше? Кроме того, могут быть проблемы с конфиденциальностью, когда вы не можете отправлять пользовательские данные на удаленный сервер для обработки.

Однако давайте предположим, что имеет смысл использовать устройства iOS ваших клиентов для запуска модели ML. Что может пойти не так?

Ограничения платформы

Ограничения памяти

Устройства iOS имеют гораздо меньше доступной видеопамяти, чем их настольные аналоги. Например, недавний Nvidia RTX 4080 Ti имеет 20 ГБ доступной памяти. С другой стороны, iPhone имеют видеопамять, совмещенную с остальной частью ОЗУ в том, что они называют «унифицированной памятью». Для справки iPhone 14 Pro имеет 6 ГБ ОЗУ. Кроме того, если вы выделяете более половины памяти, iOS очень вероятно убьет приложение, чтобы обеспечить отзывчивость операционной системы. Это означает, что вы можете рассчитывать только на 2-3 ГБ доступной памяти для вывода нейронной сети.

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

Слой сети (операции) поддержка

Большинство моделей ML и нейронных сетей исходят из известных фреймворков глубокого обучения, а затем преобразуются в CoreML модели с помощью Core ML Tools. CoreML – это движок вывода, написанный Apple (AAPL ), который может запускать различные модели на устройствах Apple. Слои хорошо оптимизированы для аппаратного обеспечения, и список поддерживаемых слоев довольно длинный, поэтому это отличная отправная точка. Однако также доступны другие варианты, такие как Tensorflow Lite.

Лучший способ увидеть, что возможно с CoreML, – это посмотреть на уже преобразованные модели, используя просмотрщики, такие как Netron. Apple перечисляет некоторые из официально поддерживаемых моделей, но также есть сообщественные зоопарки моделей. Полный список поддерживаемых операций постоянно меняется, поэтому просмотр исходного кода Core ML Tools может быть полезным как отправная точка. Например, если вы хотите преобразовать модель PyTorch, вы можете попытаться найти необходимый слой здесь.

Кроме того, некоторые новые архитектуры могут содержать написанный вручную CUDA-код для некоторых слоев. В таких ситуациях вы не можете ожидать, что CoreML предоставит предварительно определенный слой. Тем не менее, вы можете предоставить свою собственную реализацию, если у вас есть опытный инженер, знакомый с написанием кода GPU.

В целом, лучший совет здесь – попытаться преобразовать вашу модель в CoreML рано, даже до обучения. Если у вас есть модель, которую не преобразовали сразу, возможно изменить определение нейронной сети в вашем фреймворке DL или исходном коде конвертера Core ML Tools, чтобы сгенерировать действительную модель CoreML без необходимости написания пользовательского слоя для вывода CoreML.

Валидация

Баги движка вывода

Нет способа протестировать каждую возможную комбинацию слоев, поэтому движок вывода всегда будет иметь некоторые баги. Например, это распространено, когда разбавленные свертки используют слишком много памяти с CoreML, вероятно, указывая на плохо написанную реализацию с большим ядром, заполненным нулями. Другой распространенный баг – неправильный вывод модели для некоторых архитектур моделей.

В этом случае порядок операций может иметь значение. Возможно получить неправильные результаты в зависимости от того, активация со сверткой или остаточная связь происходит первой. Единственный реальный способ гарантировать, что все работает правильно, – это взять вашу модель, запустить ее на целевом устройстве и сравнить результат с настольной версией. Для этого теста полезно иметь хотя бы полуобученную модель, в противном случае числовая ошибка может накапливаться для плохо инициализированных моделей. Даже если окончательная обученная модель работает хорошо, результаты могут быть довольно разными между устройством и настольной версией для случайно инициализированной модели.

Потеря точности

iPhone использует полуточную точность обширно для вывода. Хотя некоторые модели не имеют заметного ухудшения точности из-за меньшего количества бит в представлении с плавающей запятой, другие модели могут пострадать. Вы можете приблизительно оценить потерю точности, оценив вашу модель на настольном компьютере с полуточной точностью и вычислив тестовый метрический показатель для вашей модели. Еще лучший метод – запустить ее на реальном устройстве, чтобы узнать, работает ли модель так точно, как предполагалось.

Профилирование

Различные модели iPhone имеют разные аппаратные возможности. Последние модели имеют улучшенные процессоры Neural Engine, которые могут повысить общую производительность значительно. Они оптимизированы для определенных операций, и CoreML может интеллектуально распределять работу между CPU, GPU и Neural Engine. Apple GPU также улучшились с течением времени, поэтому нормально видеть колеблющиеся производительности на разных моделях iPhone. Это хорошая идея протестировать ваши модели на минимально поддерживаемых устройствах, чтобы обеспечить максимальную совместимость и приемлемую производительность для старых устройств.

Также стоит упомянуть, что CoreML может оптимизировать некоторые промежуточные слои и вычисления на месте, что может значительно улучшить производительность. Другой фактор, который следует учитывать, заключается в том, что иногда модель, которая работает хуже на настольном компьютере, может фактически выполнять вывод быстрее на iOS. Это означает, что стоит потратить некоторое время на эксперименты с разными архитектурами.

Для еще большей оптимизации Xcode имеет приятный инструмент Instruments с шаблоном именно для моделей CoreML, который может предоставить более подробный взгляд на то, что замедляет вашу модель вывода.

Заключение

Никто не может предвидеть все возможные ловушки при разработке моделей ML для iOS. Однако есть некоторые ошибки, которые можно избежать, если вы знаете, на что обратить внимание. Начните конвертировать, проверять и профилировать ваши модели ML рано, чтобы убедиться, что ваша модель будет работать правильно и соответствовать требованиям вашего бизнеса, и следуйте советам, изложенным выше, чтобы обеспечить успех как можно скорее.

Konstantin Semianov, является техническим директором Neatsy.AI, первого в мире приложения, которое обнаруживает ортопедические и подологические проблемы со здоровьем, используя ИИ и AR, только с помощью камеры iPhone. До Neatsy.AI он работал инженером-исследователем в Prisma Labs, создателях приложения Lensa.