Досталась мне на работе система, за которую до недавних пор отвечал умный, но неопытный 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, то просто нормально делай - нормально будет.
Досталась мне на работе система, за которую до недавних пор отвечал умный, но неопытный 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, то просто нормально делай - нормально будет.
BY partially unsupervised
Warning: Undefined variable $i in /var/www/group-telegram/post.php on line 260
In February 2014, the Ukrainian people ousted pro-Russian president Viktor Yanukovych, prompting Russia to invade and annex the Crimean peninsula. By the start of April, Pavel Durov had given his notice, with TechCrunch saying at the time that the CEO had resisted pressure to suppress pages criticizing the Russian government. "Markets were cheering this economic recovery and return to strong economic growth, but the cheers will turn to tears if the inflation outbreak pushes businesses and consumers to the brink of recession," he added. But Kliuchnikov, the Ukranian now in France, said he will use Signal or WhatsApp for sensitive conversations, but questions around privacy on Telegram do not give him pause when it comes to sharing information about the war. Asked about its stance on disinformation, Telegram spokesperson Remi Vaughn told AFP: "As noted by our CEO, the sheer volume of information being shared on channels makes it extremely difficult to verify, so it's important that users double-check what they read." Artem Kliuchnikov and his family fled Ukraine just days before the Russian invasion.
from ms