Машинное обучение - это не только веб-сервисы на сверхпроизводительных TPU. В реальных условиях может потребоваться возможность применять ML-модели на конечных устройствах.
Например, мобильное приложение, которое должно работать в оффлайн, или Enterprise-сервис, который работает в закрытом контуре.
При этом не всегда есть возможность вместе с моделью внедрить специализированное оборудование и приходится запускаться на чем есть.
В этом докладе на примере одной конкретной модели машинного зрения я покажу, как её запустить:
- в облаке на GPU;
- в браузере клиента;
- на мобильном устройстве;
- на ноутбуке без видеокарты;
- на микросхеме за $10.
Покажу, какой trade-off требуется в каждом случае и что происходит с производительностью и качеством.
6. GPU – это дорого
• Для облака:
– $1000/мес – одна машина
• Для self-hosting:
– ~$1000-1500/host, если начинать с consumer-
class железа
– Страшные цифры, если server-class
12. CPU – кейсы
• Внедрение в существующую
инфраструктуру
– Hadoop-кластер
– Много рабочих станций
– Закрытый ДЦ
13. Как сравнивать скорость GPU и CPU
• GPU – это тысячи медленных ядер с быстрой памятью
• Ядро CPU быстрее, чем ядро GPU
• GPU выигрывает за счет агрессивной параллельности
• Если задача меньше, чем ресурсы GPU
недоутилизированы
• 100% утилизация GPU достигается за счет больших
батчей
14. Как сравнивать скорость GPU и CPU
• CPU – несколько мощных general purpose
ядер
• Батч размера 1 полностью утилизирует весь
процессор
• Батч размера 10 в 10 раз дольше
16. Как сравнивать скорость GPU и CPU
• Часто в прикладных задачах batch size = 1
• GPU менее эффективен
• CPU не так медленно работает
• Инференс в ~100мс/запрос – ок
17. Как внедряться на CPU
• Если Linux+Docker
– Все хорошо
– Можно воспроизвести окружение, идентичное
исследовательскому
– Все работает без изменений
• Если нет Docker (например Hadoop или Windows)
– Сложнее
– Упаковать Py Science-стек в single binary довольно сложно
18. Как внедряться без docker
• Монолит на Golang / C++
• Удобно внедрять – нет зависимостей
• Сложно переносить сложные модели
19. Как перенести NN на другую
платформу
• Сконвертировать модель (если требуется) –
легко
• Синхронизировать логику подготовки и
обработки результатов – сложно
24. Синхронизация кода – сложно
• Синхронизация кода между исследовательским окружением и
боевым – сложная задача
• Пример про Лего
– Хорошо работает в исследовании – 80% recall на конкретный класс
– Плохо работает в приложении – 30% recall на тот же класс
• Оказалось:
– Мобильный разработчик «оптимизировал» код, обрабатывал только
топ-100 самых уверенных bbox из 3500
25. Синхронизация кода – сложно
• Решение: локализовать ответственность в
одной команде
• Научили datascience-команду писать на
golang / Swift
26. CPU – итого
• Пока инференс на 1-10 кадров/секунду –
все хорошо
29. Mobile
• Во многих телефонах встроен NN-ускоритель
– iPhone 7 и выше
– Флагманские Android (например S9, S10, Pixel)
• Доступом к ускорителю управляет фреймворк
– CoreML – iPhone
– Android NNAPI – Android (обычно не используется напрямую)
• ML Kit (TF Lite) – кроссплатформенное решение
30. CoreML vs ML Kit
CoreML ML Kit (TF Lite)
• Cross platform
• Практически весь набор
операторов TF
• Нет гарантии ускорения,
возможен фолбэк на CPU в
некоторых случаях
• iOS only
• Ограниченный (но
достаточно широкий)
набор операций
• Гарантированное
ускорение, если
сконвертировалось
31. Mobile – iPhone
• Достаточно быстрый инференс
ResNet50 performance (batch size = 1):
Nvidia 1080 iPhone X
20ms ~100ms
32. Mobile – нюансы
• Мобильные не предназначены для пиковой
нагрузки
– Если inference 100ms, это не значит, что можно
бесконечно обрабатывать 10 кадров в секунду
• Сильно греется и быстро расходуется батарея: 1-2
часа
• Через несколько минут пиковой нагрузки OS
начинает throttling
• Сложная синхронизация кода
33. Mobile – нюансы: медленный CPU
• Если сложный pre-/postprocessing –
медленно
• Пример:
– U-net для instance segmentation и
постобработка на CPU с поиском связных
компонент
34. Mobile – итого
• Хорошее аппаратное ускорение, сравнимое
с desktop-GPU
• CPU – узкое место
• Синхронизация кода между
исследовательским и боевым окружением
36. Внедрение «в поля»
• Нет ничего
• Обработка видео с локальной камеры
• Максимально дешево
Задачи:
• Захват видео
• Транскодирование / хранение
• ML – обработка
41. Nvidia Jetson Nano – нюансы
• Большой разброс в зависимости от способа
запуска
– ~1-2fps TF
– ~20-25fps TF-TensorRT
– ~65fps Nvidia C++ implementation with TensorRT
42. Nvidia Jetson Nano
• Дешевый = $99
• Комфортная среда исполнения
– Ubuntu Linux + TF
• Достаточно памяти
• Слабый процессор
• Лучший выбор для IoT