Интересное что-то
546 subscribers
2.77K photos
253 videos
140 files
4.57K links
Материалы и мысли, понадерганные отовсюду
Блог: https://t.iss.one/asisakov_channel
Чат: https://t.iss.one/youknowds_chat
Download Telegram
Дорожная карта навыков тестировщика, которая сделает из зёлёного джуна матёрого сеньора (ну или хотя бы мидла).
Forwarded from DLStories
Open-Vocabulary Semantic Segmentation with Mask-Adapted CLIP

В Meta придумали, как использовать CLIP для решения задачи open-vocabulary semantic segmentation. Если совсем честно, то у них получился не прям “open-open”-vocabulary, но идея все равно хорошая.

Вот как она работает:
Берем MaskFormer — это сеть для задачи обычной сегментации на С классов. Работает она так: для каждой входной картинки MaskFormer выдает N пар (mask, class). Mask — бинарная маска одного из объектов на входной картинке. Class — вектор длины С — распределение вероятностей по классам для объекта, для которого построена маска.

Теперь немного модифицируем выход MaskFormer и обучающий датасет. Смотрите, берем датасет для сегментации, например, COCO-Staff. В нем для каждой картинки есть набор пар (mask, class). Для каждой такой пары берем текстовое название сlass и прогоняем его через текстовый энкодер CLIP. В итоге получаем, что в нашем датасете для каждой картинки теперь есть набор пар (mask, emb). Тут emb — CLIP-эмбеддинг названия класса, которому принадлежит объект с маской mask.

Ну и будем теперь учить MaskFormer для входной картинки выдавать не пару (mask, class), а (mask, emb). Т.е. наша модель учится не классифицировать найденный объект на один из С классов, а выдавать для него CLIP-like эмбеддинг, который содержит информацию о том, что это за объект. И когда на вход модели приходит новая картинка, мы берем MaskFormer и получаем наборы (mask, emb). Потом сравниваем emb с эмбеддингами CLIP’а для разных названий классов (‘стул’, ‘человек’, …) и выдаем в качестве класса объекта тот, который ближе всего к эмбеддингу emb.

Тут становится понятно, в каком месте модель не слишком “open”-vocabulary. В датасете COCO размечены конечное количество классов (а именно, 171). Ну и не приходится ожидать, что модель, которая училась находить бинарные маски для людей-собак-кошек, вдруг начнет выдавать отдельные маски для носа-глаз-рук-ног.
Но потенциально модель может выдать эмбеддинг emb с произвольным смыслом, это да.

Ну и последнее замечание: описанной выше модели авторам показалось мало. Поэтому они предложили добавить второй способ получения классов для mask:
Как мы сказали, MaskFormer выдает пары (mask, emb). Мы можем взять mask, вырезать кусок картинки, которому соответствует эта mask и подать этот кусок картинки на вход CLIP. CLIP выдаст эмбеддинг этой картинки, который мы так же сможем сравнить с эмбеддингами для разных названий классов (‘стул’, ‘человек’, …), и таким образом получить нужный класс объекта для нашей маски. Правда, в таким виде алгоритм работает не очень хорошо: CLIP все же не был обучен под такой вид картинок. Поэтому в Meta собрали небольшой датасет “кусок картинки — класс” и дообучили на нем CLIP. Как именно собирали датасет и дообучали, читайте в оригинальной статье.

Ну и итоговое предсказание модели сегментации авторы получают, усредняя emb из MaskFormer и эмбеддинг из CLIP, полученный на основе mask. Работает это все хорошо, бьет предыдущие open-vocabulary нейронки по метрике mIoU.

Ссылки:
Страница проекта
Статья
Код на GitHub
Изначально инфу про статью нашла в канале эйай ньюз
Forwarded from DLStories
This media is not supported in your browser
VIEW IN TELEGRAM
На сайте работы, ктстаи, обнаружена отличная гифка с иллюстраницей устройства модели. Тут верхний flow — первый способ получения эмбеддингов классов (emb из MaskFormer), нижний flow — второй способ получения эмбеддингов классов (вырезаем куски картинки, соотв. mask, подаем в CLIP)
Forwarded from partially unsupervised
Досталась мне на работе система, за которую до недавних пор отвечал умный, но неопытный PhD. Задача по сути сводится к text classification, внутри некий трансформер и все по классике: много кастомного, вычурный оптимайзер, дубликаты в данных и так далее. И, конечно, все надо улучшать - от точности до скорости.

В комплекте с системой полагался въедливый коллега, который с радостью согласился пойти разгребать авгиевы конюшни датасетов. А я взялся за инженерную часть. Кое-какая инфраструктура уже была: тесты, CI, обучение в докере - до этого мы с другим коллегой занимались переносом этого хозяйства из jupyter ноутбуков во что-то воспроизводимое. Так что надо можно было более или менее смело лезть в сам training pipeline.

Обучение занимало ~10-11 часов на одной A100, что в целом приемлемо, но, судя по низкой нагрузке и CPU, и GPU, можно было сделать лучше. Перенес часть препроцессинга из __getitem__ в __init__, избавился от pandas, выкинул лишние данные из памяти, что-то закэшировал, увеличил количество воркеров для датасетов, увеличил батчи - и GPU стала загружаться на ~95-98%, а обучение стало втрое быстрее. С такими скоростями уже можно быстро итерироваться.

Основная модель весила больше гигабайта. Я посмотрел на граф и обнаружил, что больше половины весов - это жирная мультиязычная embedding матрица инпута. Пошел в Athena и добыл неразмеченный датасет вида SELECT * FROM DATA WHERE THINGS ARE NOT LIKE FULL GARBAGE LIMIT OVERDOHOOYA, прогнал его через токенайзер, подтвердил гипотезу, что реально используется <50% токенов. Значит, можно переучить токенайзер и заменить эмбеддинг слой на значительно меньший, предварительно скопировав предобученные веса полезных токенов. Это уменьшает размер модели примерно до 60% от оригинального (правда, без заметного эффекта на скорости инференса). Потребление памяти важно для рантайма, ведь можно держать в памяти одного инстанса больше моделей, там как раз был боттлнек.

Кстати, раз у нас есть большой неразмеченный датасет, это звучит как повод устроить pretraining. Адаптировал masked language pretraining пайплайн с huggingface 🤗, и оставил новую, уже уменьшенную модель учиться на недельку. И, наконец, заменил дефолтные веса в основном пайплайне на результат претрейна на этом неразмеченном датасете. Это не только улучшило точность (на разных тестовых датасетах от 10% до 20%) и вторичные метрики вроде калибровки, но и ускорило сходимость, т.е. можно безболезненно уменьшить количество эпох еще на треть.

Итого: за пару недель работы обучение ускорено, потребление памяти упало, точность выросла. Важно подчеркнуть, что ничего из перечисленного не содержало никаких сложных алгоритмов. Если ты не OpenAI, то просто нормально делай - нормально будет.
Forwarded from MarksRemarks (Mark Baushenko)
Recommender_System_(Movie).pdf
4 MB
#ml_system_design
Одним из важных этапов при отборе кандидатов в Big Tech является ML System Design интервью. По своей структуре оно очень похоже на обычное System Design интервью, но с уклоном в сторону ML. Вас попросят спроектировать AI продукт начиная с определения источника данных и заканчивая проведением A/B тестирования.

Сегодня разберем Recommender System (Movie) 🎥🎬

Следовательно, необходимо построить систему для большого количества пользователей, которым ежедневно требуются хорошие рекомендации. Одним из распространенных способов создания системы рекомендаций в мире машинного обучения является постановка задачи классификации с целью предсказать вероятность вовлечения пользователя в контент. Таким образом, постановка задачи будет следующей: Учитывая пользователя и контекст, предсказать вероятность вовлечения для каждого фильма и упорядочить фильмы, используя этот показатель.

Продожение в файле 📁

🎁🎁🎁🎁🎁
Please open Telegram to view this post
VIEW IN TELEGRAM
#приёмы
В старом посте я описывал приём AV: решение задачи разделения обучения и теста позволяет понять
1) какие признаки стабильны,
2) как отобрать обучающую подвыборку максимально похожую на тест.

Из того, что я тогда не сказал, но это полезно:
1) логично встроить AV в процедуру отбора признаков (чтобы отбиралось не просто подпространство с высоким качеством решения, но и стабильное),
2) когда нет теста (а его на практике часто и нет) можно разбить объекты по времени (странно, но при решении прикладных задач это делают очень редко),
3) из нестабильных признаков часто получаются хорошие стабильные, причём с помощью простых приёмов (например, доход клиента делим на медианных доход в этом месяце). Поэтому AV можно встроить и в генератор признаков;)
Forwarded from Записки MLEшника (Egor)
По наводке коллеги прочитал годную статью по библиотеке requests.

Чего полезного умеют:
1. Можно задать базовый URL, а дальше передавать только путь до ресурса. Почему я об этом узнал только сейчас? 🥲
2. Можно проверить, что запрос отработал без ошибок (400ые и 500ые статус кодов). Если ошибка, то поднимается питонячее исключение. Если хочется, то есть возможность сделать такую проверку автоматической на каждый ответ через хуки.
3. Хуки 🙂. Получается, можно вешать выполнение любого вашего кода на все запросы, ответы и др.
4. Выставлять ретраи на определённые коды ошибок. При том время повторных запросов экспонентально увеличивается. По умолчанию делается 10 ретраев без какой-либо задержки по времени 🙈
5. Как мокать ответы при написании юниттестов.


Крч, годная и к тому же весьма короткая статья. Рекомендую к прочтению.
Forwarded from Complete AI (Andrey Kuznetsov)
🔥 Scalable Diffusion Models with Transformers

Вчера вышла интересная работа от ребят из UC Berkeley и NY University про комбинацию диффузии и трансформеров (Diffusion Transformers или DiT).

Ребята заменяют U-Net на трансформер и работают с патчами в латентном пространстве. DiT-XL/2 превосходит все class-conditional диффузионные модели на ImageNet 512x512 и 256x256 бенчмарках и достигает FID=2.27 для низкого разрешения. Более вычислительно тяжёлые DiT позволяют генерировать сэмплы очень высокого качества.

статья
гитхаб
колаб

@complete_ai