им! • Рекомендательная система для >20 000 интернет-магазинов • Голосовое управление корпоративным порталом • Распознавание лиц сотрудников и клиентов: управление рабочим днем, скидки в CRM • Скоринг Лидов и Сделок в CRM – сотни тысяч активных коммерческих компаний в Битрикс24 • Классификация обращений нейросетью в международной техподдержке Битрикс24 • Активные пилоты – обработка видео в онлайн- конференциях, интенсивные эксперименты с браузерными и десктопными нейросетями
– просто • Понять «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
обогащаем / создаем искусственный (“unreal engine” и т.п.) датасет 2. Арендуем машину с GPU с достаточным объемом памяти и/или несколько машин «в облаке» 3. Арендуем ASIC GPU, «заточенные» под определенные задачи, типа TPU (Google) 4. Получаем веса Или используем готовые веса, что даже проще и быстрее. Их можно еще дообучить чуть-чуть: https://github.com/tensorflow/hub https://github.com/onnx/models И многие другие zoo…
задачах, например «размытие фона видеокадра», важно наличие встроенного или дискретного GPU • C GPU latency на обработку кадра может быть 50 мс, без GPU – сотни мс • Работа с GPU может сократить энергопотребление устройства, это тоже важно • Но не для всех нейросетей GPU ускорит inference! Нужно тестировать каждую архитектуру. CPU: Поддержка векторных операций с массивами, SIMD. Многопоточность.
пока, плохо В мире существуют 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)
модуль 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, ** - не заметили ускорения, есть куда расти
- попробуйте выгрузить HDRnet из pytorch (github.com/creotiv/hdrnet- pytorch) в ONNX - попробуйте загрузить BodyPix в opencv dnn - попробуйте вытащить модель из tensorflow-js обратно в tensorflow* Новые или редкие/сложные слои – скорее всего «запускатором» не будут поддерживаться «из коробки» Тем не менее, недостающие слои можно запрограммировать на C++ и добавить в «запускатор», как сделали мы. * неофициальный работающий «костыль»: github.com/patlevin/tfjs-to-tf
• Поддержка любых видов GPU (встроенные/дискретные) через opencl • Можно собрать с cuda/cudnn/nvidia и vulkan, openvino • Глубоко-оптимизированная работа с CPU (simd и т.п.) • Интересные, современные алгоритмы улучшения изображения и edge-preserving фильтрации
операций на 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-шейдер = функция в нейросети
немало типов слоев и операций (но далеко не все) • Поддержка GPU через WebGL • Нейросети работают быстро в браузере, используя GPU через WebGL – AMD, встроенное Intel, Nvidia… • В разных браузерах на разных платформах, в т.ч. мобильных – нейросети работают шустро на GPU и не нужно «сорцы компилить» и драйверы особо настраивать • Импорт моделей из tensorflow и keras (tfjs- converter)
в 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, но, иногда, не до конца… Дописывали свои слои, правда очень простые.
неплохой набор обученных современных нейросетей для браузеров с демками • Node.JS поддерживается, но нужна GPU Nvidia (опять 25) • Мы активно экспериментируем с вырезанием фона, распознаванием эмоций и жестов и другими
код библиотеки tensorflow-js • Здравствуй TypeScript, Node.js и caniuse.com • «Лишние» массовые обработки массивов и фильтрации пикселей • TypedArrays • Аккуратная работа с canvas, альфа- канал • requestAnimationFrame • JS tasks, microtasks, futures/promises и «ложная» многопоточность • Webassembly? • Webworkers?
запуска обученных нейросетей на разном оборудовании и разных, в т.ч. встроенных, GPU • Браузер является хорошим инструментом доставки нейросетей до клиентов и не нужно специальные драйверы ставить под Nvidia или «сорцы компилить» • Технологии работы браузеров с GPU – развиваются: WebGL довольно эффективен, на подходе WebGPU • Webassembly поможет нейросетям обрабатывать данные на CPU и может скоро стать многопоточным • Webworkers тоже помогут нейросетям для фоновых задач работы с данными • Пишите на TypeScript или последних стандартах JavaScript используя самые последние способы писать строгий, максимально типизируемый код • Используйте, если можно, функциональный подход к программированию. Если нет – строгий ООП. • Обязательно пишите unit и интеграционные тесты к JavaScript-коду – это единственный ключ к успеху и защита от ночных кошмаров в холодном поту Всем удачи, обнимаю и успешных проектов!!!