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

Вам нужен ML?
Машинное обучение отлично подходит для обнаружения закономерностей. Если вы сможете собрать чистый набор данных для своей задачи, обычно это только вопрос времени, прежде чем вы сможете построить модель ML с сверхчеловеческой производительностью. Это особенно верно для классических задач, таких как классификация, регрессия и обнаружение аномалий.
Когда вы готовы решить некоторые из своих бизнес-проблем с помощью ML, вы должны учитывать, где будут работать ваши модели ML. Для некоторых это имеет смысл запускать серверную инфраструктуру. Это имеет преимущество в том, что ваши модели ML остаются приватными, поэтому для конкурентов будет труднее догнать. Кроме того, серверы могут запускать более широкий спектр моделей. Например, модели GPT (ставшие знаменитыми с помощью ChatGPT) в настоящее время требуют современных GPU, поэтому потребительские устройства исключены из вопроса. С другой стороны, поддержание вашей инфраструктуры довольно дорого, и если потребительское устройство может запустить вашу модель, почему платить больше? Кроме того, могут быть проблемы с конфиденциальностью, когда вы не можете отправлять пользовательские данные на удаленный сервер для обработки.
Однако давайте предположим, что имеет смысл использовать устройства iOS ваших клиентов для запуска модели ML. Что может пойти не так?
Ограничения платформы
Ограничения памяти
Устройства iOS имеют гораздо меньше доступной видеопамяти, чем их настольные аналоги. Например, недавний Nvidia RTX 4080 Ti имеет 20 ГБ доступной памяти. Устройства iPhone, с другой стороны, имеют видеопамять, совмещенную с остальной частью RAM в том, что они называют «унифицированной памятью». Для справки iPhone 14 Pro имеет 6 ГБ RAM. Кроме того, если вы выделяете более половины памяти, iOS очень вероятно убьет приложение, чтобы đảmать, что операционная система остается отзывчивой. Это означает, что вы можете рассчитывать только на 2-3 ГБ доступной памяти для вывода нейронной сети.
Исследователи обычно обучают свои модели для оптимизации точности над использованием памяти. Однако также существует исследование по способам оптимизации для скорости и памяти, поэтому вы можете либо искать менее требовательные модели, либо обучить одну сами.
Слои сети (операции) поддержка
Большинство ML и нейронных сетей исходят из известных фреймворков глубокого обучения, а затем преобразуются в CoreML модели с помощью Core ML Tools. CoreML — это движок вывода, написанный Apple, который может запускать различные модели на устройствах 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 рано, чтобы убедиться, что ваша модель будет работать правильно и соответствовать требованиям вашего бизнеса, и следуйте советам, изложенным выше, чтобы обеспечить успех как можно быстрее.












