Команда Computer Vision Mail.ru предоставляет решения для нескольких продуктов Mail.ru: Облако, Vision (b2b-продукт), Почта. Спектр проектов достаточно широкий и включает в себя такие задачи (но не ограничивается ими), как Face Recognition, OCR и реставрация фотографий. За несколько лет работы мы споткнулись обо всевозможные грабли и встречаем одни и те же челленжи:
* Какие архитектуры нейросеток, подходы, хаки работают на большом спектре задач ?
* Как организовать инфраструктуру для удобного обучения моделей ?
* Каким образом катить и сервить модели в проде, чтобы это было удобно для всех?
В своем докладе расскажу о полном жизненном цикле проектов в Computer Vision: от постановки задачи до запуска в production.
Video: https://www.youtube.com/watch?v=oOtBt2jqXgw&feature=youtu.be&list=PLH-XmS0lSi_yY4rQCIZyx5Np57zc77OyE&t=21658
15. – Общаться с продактом на данных
• в идеале – тест-сет
– Постановка – совместная работа ML + Product
• Иначе => куча итераций переделок
Постановка AI-продукта
16. Постановка задачи – ваша ответственность,
пока вы не научите продакта
AI-продукты
47. Результаты
– Сеть учит семантический embedding
– Не забывает классы OpenImages
Model mAP
Arcface 92.8
+Knowledge Distil 93.8
(+1%)
Transfer with Knowledge distillation
68. – Кастомная сборка Pytorch с Apex
– Использовать Automatic Mixed Precision
• FP16_Optimizer – больше контроля, гемора и только Adam
…
FP16 Training
69. 0 100 200 300 400 500 600
Inference
Training
Tesla T4, Resnet50, 64 batch
FP16+Apex FP16 FP32
Результаты
– Качество обучения не страдает
– Ускорение: 2x
– 20% от Apex на обучении
ms
FP16 Training
77. – Постановка
– На данных, тест-сет, работаем вместе с продактом
Recap
78. – Постановка
– На данных, тест-сет, работаем вместе с продактом
– Данные
– Чистим кластеризацией (CLink)
Recap
79. – Постановка
– На данных, тест-сет, работаем вместе с продактом
– Данные
– Чистим кластеризацией (CLink)
– Обучение
– Metric learning: Arcface
– Knowledge distillation for Transfer learning
– Multi-head
– FP16 Apex
Recap
80. – Постановка
– На данных, тест-сет, работаем вместе с продактом
– Данные
– Чистим кластеризацией (CLink)
– Обучение
– Metric learning: Arcface
– Knowledge distillation for Transfer learning
– Multi-head
– FP16 Apex
– Inference
– Pytorch C++
Recap
сократить t2m & улучшить качество (interchangeable)
когда я думал
основа всего
я хочу чтобы было красиво
не привыкли, нет навыка такого
получили интересную задачу, вы радуетесь, звоните маме
либо сразу проясните все тонкости, либо в конце и будете переделывать
сделать задачи, а потом выясниться
фолз: лицо маладенца vs локоть
inclusive
в тест-сет может заложить все то что нужно продакту
в процессе работы задача уточняется на edge cases
наша с вами задача обучать, если не мы, то кто
чтобы они не учились на вас
а датасеты шумные
их можно почистить
то же самое можно делать для объединения похожих кластеров
TODO: оч мелкие картинки. Надо рассмотреть эти картинки. Возможно спилить слайд
порог один
какая из этих картинок авто-сгенерирована ?
пила не хватит, если не приглядитесь то не поймете, что это не реальные данные
3d моделирование
Про блендер:
1) OpenSource
2) Отличное PythonAPI, доступ почти до всего
3) Два встроенных рендера (движка):
1. встройнный - говно качество, очень быстрый, не работает с популярными форматами моделей (fbx)
2. Cycles - рейтрейс, работает с fbx, довольно медленно, но на нескольких GPU за несколько дней можно нарендерить датасет
4) Скоро будет апдейт - будет новый рендер Eevee, который будет работать качественно, быстро и без рейтрейса, при этом работать с fbx
Модели
1) Есть халявные - как правило валяются везде по отельности (типа, там кто-то сделал бутылку с колой, тут на другом сайте кто-то коробку с печеньем, все в разных форматах собирать заколебешься)
2) Есть дорогие - часто поставляются целыми паками (куча объектов в одном паке). Качество моделей намного выше
3) Еще, модели могут требовать ручную обработку, чтобы их использовать для синтетической даты
Ручная обработка моделей
1) Модели могу неправильно импортиться, например была проблема, что все прозрачные материалы были тупо черными
2) Несколько объектов могут быть склеены в один, приходится их расклеивать. Автоматически это сделать тяжеловато
на примере распознавания достопримечательностей
То что заходит лучше. На примере FR
-В обычном софтмаксе у нас точки разделены плоскостью, в случае двух классов - на основе двух векторов весов.
-Если сделать норму ембеддингов 1 то мы получим картинку справа. Точки лягут на окружность (т.е. на сферу в n-мерном случае).
Тут мы видим, что за разделение векторов отвечает угол между векторами. И будем оптимизировать угол между.
Если мы просто перейдем к оптимизации угла, то задача по факту не изменится, т.к. мы ее просто переформулировали в других терминах. Наша цель сделать кластера более компактными.
-чтобы достичь этого нужно дополнительно потребовать большего угла между классами.
-Это достигается за счет введение параметра m который управляет разницей косинусов углов.
вместо линейного слоя
Мы делали поиск похожих картинок
притрейн с OI
Catastrophic forgetting: семантически верно, но расово неверно
не забывай свои корни
доминируют выдачу
crowd human – часто в датасетах есть и связанная разметка ( голова)
помимо тушки
byte pair encoding - compression algorithm (that iteratively replaces the most frequent pair of characters in a sequence with a single, unused byte.)
База -> потом хотим учесть слова, это можно сделать если предсказывать доп голову с ними
градиент сильнее от bpe через l, гораздо сильнее чем от одной буквы!
С инференсом все понятно, В пайторче half + scale loss в районе нуля
FP_optimizer работает только с Adam, да и то только с тем Adam, который есть в Apex (да, у них свой Adam в репозитории, который имеет совершенно другой интерфейс, чем пайторчевый)
FP16_opt – больше контроля, но сложнее (just scale loss 128 and you have to use .half()). AMP работает через black/whitelist, которые он проверяет на каждый call и принимает решение есть ли профит от cast в fp16. Реализовано через monkey_patch всех операторов.
У нас куча фреймворков, но в деплое, но для обучения используем пайторч, самый насущный вопрос
переучивать модели, заменять слои
docker_image под модель чтобы отконвертить
мы потестили
но сука быстрый
ex: лонг инты не поддерживаются, reshape, transpose
не хватает документации: надо смотреть доку питона и .h файлы
resnet50 в 2 раза медленее чем на питоне – issue (проблема с линковой cudnn) сабмитили чинтале issue
если один раз это пройти, то все ок
внутри jit по сути питон
финалочка: надеюсь попробуете эти трюки и это улучшит ваше прод. результаты и скорость