Forwarded from Kirill Gelvan
Для интересующихся: моделька на HF с инструкциями по запуску
Под капотом задача абстрактивной суммаризации, а именно модель mBart дообученная на суммаризацию диалогов в чатах (датасет SamSum который мы перевели на русский язык при помощи GoogleTranslateAPI)
Под капотом задача абстрактивной суммаризации, а именно модель mBart дообученная на суммаризацию диалогов в чатах (датасет SamSum который мы перевели на русский язык при помощи GoogleTranslateAPI)
Forwarded from MarksRemarks (Mark Baushenko)
Так получилось, что я занял первое место 🥇 в квалификации Vk Cup 2022 (почти ничего не делая 🤔 ) и пару человек попросили выложить решение. Так вот оно.
🎁 🎁 🎁 🎁 🎁
Please open Telegram to view this post
VIEW IN TELEGRAM
Forwarded from Архив Программиста
Дорожная карта навыков тестировщика, которая сделает из зёлёного джуна матёрого сеньора (ну или хотя бы мидла).
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
Изначально инфу про статью нашла в канале эйай ньюз
В 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, можно было сделать лучше. Перенес часть препроцессинга из
Основная модель весила больше гигабайта. Я посмотрел на граф и обнаружил, что больше половины весов - это жирная мультиязычная embedding матрица инпута. Пошел в Athena и добыл неразмеченный датасет вида
Кстати, раз у нас есть большой неразмеченный датасет, это звучит как повод устроить pretraining. Адаптировал masked language pretraining пайплайн с huggingface 🤗, и оставил новую, уже уменьшенную модель учиться на недельку. И, наконец, заменил дефолтные веса в основном пайплайне на результат претрейна на этом неразмеченном датасете. Это не только улучшило точность (на разных тестовых датасетах от 10% до 20%) и вторичные метрики вроде калибровки, но и ускорило сходимость, т.е. можно безболезненно уменьшить количество эпох еще на треть.
Итого: за пару недель работы обучение ускорено, потребление памяти упало, точность выросла. Важно подчеркнуть, что ничего из перечисленного не содержало никаких сложных алгоритмов. Если ты не OpenAI, то просто нормально делай - нормально будет.
В комплекте с системой полагался въедливый коллега, который с радостью согласился пойти разгребать авгиевы конюшни датасетов. А я взялся за инженерную часть. Кое-какая инфраструктура уже была: тесты, 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) 🎥🎬
Следовательно, необходимо построить систему для большого количества пользователей, которым ежедневно требуются хорошие рекомендации. Одним из распространенных способов создания системы рекомендаций в мире машинного обучения является постановка задачи классификации с целью предсказать вероятность вовлечения пользователя в контент. Таким образом, постановка задачи будет следующей:Учитывая пользователя и контекст, предсказать вероятность вовлечения для каждого фильма и упорядочить фильмы, используя этот показатель.
Продожение в файле 📁
🎁 🎁 🎁 🎁 🎁
Одним из важных этапов при отборе кандидатов в Big Tech является ML System Design интервью. По своей структуре оно очень похоже на обычное System Design интервью, но с уклоном в сторону ML. Вас попросят спроектировать AI продукт начиная с определения источника данных и заканчивая проведением A/B тестирования.
Сегодня разберем Recommender System (Movie) 🎥🎬
Следовательно, необходимо построить систему для большого количества пользователей, которым ежедневно требуются хорошие рекомендации. Одним из распространенных способов создания системы рекомендаций в мире машинного обучения является постановка задачи классификации с целью предсказать вероятность вовлечения пользователя в контент. Таким образом, постановка задачи будет следующей:
Продожение в файле 📁
Please open Telegram to view this post
VIEW IN TELEGRAM