Upgrade to Pro — share decks privately, control downloads, hide ads and more …

"Прикладные" нейросети в браузере и на десктопе...

"Прикладные" нейросети в браузере и на десктопе клиента.

Александр Сербул, Head of Data Science, 1С-Битрикс

Avatar for Big Data & AI Conference 2020

Big Data & AI Conference 2020

September 17, 2020
Tweet

More Decks by Big Data & AI Conference 2020

Other Decks in Technology

Transcript

  1. Мы – верим в пользу AI для клиентов и помогаем

    им! • Рекомендательная система для >20 000 интернет-магазинов • Голосовое управление корпоративным порталом • Распознавание лиц сотрудников и клиентов: управление рабочим днем, скидки в CRM • Скоринг Лидов и Сделок в CRM – сотни тысяч активных коммерческих компаний в Битрикс24 • Классификация обращений нейросетью в международной техподдержке Битрикс24 • Активные пилоты – обработка видео в онлайн- конференциях, интенсивные эксперименты с браузерными и десктопными нейросетями
  2. «Прикладные» нейросети – очень широкое понятие • Понять «AlexNet» инженеру

    – просто • Понять «HDRNet»* инженеру – не всегда легко • “DeepSpech”** не понять без базовых знаний акустики, обработки сигналов… • Собрать прототип на pytorch – просто даже школьнику • Оптимизировать нейросеть внутри opencv dnn на opencl на встроенном GPU на AMD-машине – требует глубоких технических знаний • Запустить/дообучить нейросеть на ARM (RISC) процессорах смартфонов быстро – непаханое поле * ”Deep Bilateral Learning for Real-Time Image Enhancements” (https://groups.csail.mit.edu/graphics/hdrnet/) ** https://arxiv.org/abs/1412.5567
  3. С обучением нейросетей – все более-менее «устаканилось» 1. Находим /

    обогащаем / создаем искусственный (“unreal engine” и т.п.) датасет 2. Арендуем машину с GPU с достаточным объемом памяти и/или несколько машин «в облаке» 3. Арендуем ASIC GPU, «заточенные» под определенные задачи, типа TPU (Google) 4. Получаем веса Или используем готовые веса, что даже проще и быстрее. Их можно еще дообучить чуть-чуть: https://github.com/tensorflow/hub https://github.com/onnx/models И многие другие zoo…
  4. И вот мы нашли обученную/обучили нейросеть, решающую задачи клиентов. Попробуем

    ее заставить быстро работать на широком диапазоне устройств…
  5. Что нам нужно от устройства клиента? GPU: • В наших

    задачах, например «размытие фона видеокадра», важно наличие встроенного или дискретного GPU • C GPU latency на обработку кадра может быть 50 мс, без GPU – сотни мс • Работа с GPU может сократить энергопотребление устройства, это тоже важно • Но не для всех нейросетей GPU ускорит inference! Нужно тестировать каждую архитектуру. CPU: Поддержка векторных операций с массивами, SIMD. Многопоточность.
  6. Поддержка популярными нейро- фреймворками GPU не от Nvidia – все,

    пока, плохо В мире существуют GPU других производителей, например дискретные и встроенные видеокарты AMD или встроенная графика Intel. • Tensorflow – официальной поддержки нет (SYCL? tf- coriander?) • Pytorch – официальной поддержки нет (ROCm?) • Можно в «старом» Keras подключить движок «PlaidML» и поработать с GPU через opencl … Cuda/Cudnn – вендорские технологии от Nvidia. А еще есть opencl, opengl, webgl, webgpu (только в начале пути), DirectX, Vulkan (multi platform), Metal (mac)
  7. Новый класс софта – «легкие запускаторы» нейросетей • Opencv (opensource/Intel),

    модуль dnn (C++, SIMD, opencl, cuda*, vulkan**) - можно делать прототипы на opencv-python - можно запускать на мобильных устройствах через tengine • Onnx (Microsoft) • Anakin (Baidu) • OpenVINO (Intel) • NeoML (Abbyy) … Для мобильных платформ: Mnn (Alibaba), Mace (XiaoMi), ncnn (Tencent) и др. Компиляторы, IR-движки: Apache TVM, Intel PlaidML и др. * - не последние версии cuda, ** - не заметили ускорения, есть куда расти
  8. Импорт-экспорт моделей между нейро- фреймворками • Не все, пока, гладко:

    - попробуйте выгрузить HDRnet из pytorch (github.com/creotiv/hdrnet- pytorch) в ONNX - попробуйте загрузить BodyPix в opencv dnn - попробуйте вытащить модель из tensorflow-js обратно в tensorflow* Новые или редкие/сложные слои – скорее всего «запускатором» не будут поддерживаться «из коробки» Тем не менее, недостающие слои можно запрограммировать на C++ и добавить в «запускатор», как сделали мы. * неофициальный работающий «костыль»: github.com/patlevin/tfjs-to-tf
  9. Opencv – удобный нейро-фреймворк для десктопных применений • Поддержка Windows/Linux/Mac

    • Поддержка любых видов GPU (встроенные/дискретные) через opencl • Можно собрать с cuda/cudnn/nvidia и vulkan, openvino • Глубоко-оптимизированная работа с CPU (simd и т.п.) • Интересные, современные алгоритмы улучшения изображения и edge-preserving фильтрации
  10. Плюсы браузера, как «запускатора» обученной нейросети • Кросс-платформенная поддержка ускорения

    операций на GPU через Canvas 2D, WebGL, SVG. • Приближается WebGPU: «Unlike WebGL, WebGPU is not a direct port of any existing native API. It is based on concepts in Vulkan, Metal, and Direct3D 12 and is intended to provide high performance on these modern graphics APIs across mobile and desktop platforms.» • «WebAssembly» – для ускорения работы нейросетей с CPU • «Web Workers» – для многопоточности • Jit-компиляция JavaScript кода, почему бы и нет? Это лучше, чем ее отсутствие в python/php • Новые стандарты языка, добавляющие больше типизации = можно быстрее ускорить выполнение в рантайме • WebGL-текстура = веса нейросети • WebGL-шейдер = функция в нейросети
  11. TensorFlow.js • Знакомый синтаксис tensorflow, но на JavaScript • Поддерживает

    немало типов слоев и операций (но далеко не все) • Поддержка GPU через WebGL • Нейросети работают быстро в браузере, используя GPU через WebGL – AMD, встроенное Intel, Nvidia… • В разных браузерах на разных платформах, в т.ч. мобильных – нейросети работают шустро на GPU и не нужно «сорцы компилить» и драйверы особо настраивать • Импорт моделей из tensorflow и keras (tfjs- converter)
  12. Tensorflow-js – импорт/экспорт • Есть коробочный импорт модели из tensorflow/tfhub

    в tensorflow-js (https://github.com/tensorflow/tfjs/tree/master/tfjs-converter) • Экспорта из tensorflow-js в tensorflow обратно – нет. Люди пишут «хардкорные» парсеры и выкладывают на github (https://github.com/patlevin/tfjs- to-tf) • На tfhub качество моделей может быть “сильно другим”, чем в репозитории tfjs-models • Хорошо помогает визуализация нейросети (https://lutzroeder.github.io/netron/) • Opencv понимает tensorflow frozen-graph, но, иногда, не до конца… Дописывали свои слои, правда очень простые.
  13. Tfjs-models – модели хорошего качества • https://github.com/tensorfl ow/tfjs-models • Очень

    неплохой набор обученных современных нейросетей для браузеров с демками • Node.JS поддерживается, но нужна GPU Nvidia (опять 25) • Мы активно экспериментируем с вырезанием фона, распознаванием эмоций и жестов и другими
  14. Я играюсь с импортом модели tfjs в opencv • Windows,

    GPU Nvidia, TensorFlow.js модель импортирова на с доработками в opencv
  15. Модель tfjs в браузере с ускорением на встроенном GPU •

    Windows, встроенное GPU Intel, TensorFlow.js в браузере
  16. Базовая оптимизация производительности в браузере - tfjs • Понятные вещи,

    кратко: - MobileNet - меньше размер, обычно быстрее - можно руками нейросетку еще «почикать» • Растеризация • Снижение входного разрешения нейросети
  17. Глубокая оптимизация производительности в браузере - tfjs • Ныряем в

    код библиотеки tensorflow-js • Здравствуй TypeScript, Node.js и caniuse.com • «Лишние» массовые обработки массивов и фильтрации пикселей • TypedArrays • Аккуратная работа с canvas, альфа- канал • requestAnimationFrame • JS tasks, microtasks, futures/promises и «ложная» многопоточность • Webassembly? • Webworkers?
  18. Профилирование tfjs в браузере • JS занимается какой-то ерундой и

    не нагружает GPU для обсчета кадров видео модели tfjs
  19. Профилирование tfjs в браузере • Ныряем глубже в отладчике Chrome.

    Рекурсивные вызовы в циклах внутри tfjs – выглядит подозрительно. Будем патчить.
  20. Профилирование tfjs в браузере – было/стало • GPU стал загружен

    гораздо равномернее. Скорость обработки кадров нейросетью tfjs возросла в несколько раз!
  21. Итоги • TensorFlow.js – действительно эффективный и быстрый инструмент для

    запуска обученных нейросетей на разном оборудовании и разных, в т.ч. встроенных, GPU • Браузер является хорошим инструментом доставки нейросетей до клиентов и не нужно специальные драйверы ставить под Nvidia или «сорцы компилить» • Технологии работы браузеров с GPU – развиваются: WebGL довольно эффективен, на подходе WebGPU • Webassembly поможет нейросетям обрабатывать данные на CPU и может скоро стать многопоточным • Webworkers тоже помогут нейросетям для фоновых задач работы с данными • Пишите на TypeScript или последних стандартах JavaScript используя самые последние способы писать строгий, максимально типизируемый код • Используйте, если можно, функциональный подход к программированию. Если нет – строгий ООП. • Обязательно пишите unit и интеграционные тесты к JavaScript-коду – это единственный ключ к успеху и защита от ночных кошмаров в холодном поту  Всем удачи, обнимаю и успешных проектов!!!