Pull to refresh
22
3.5
Pavel Zloi @efreelancer

Software Developer

Send message

Полагаю имеется ввиду то как это делают на сайтах морфемного анализа, пожалуй это можно было бы через рендер картинки, скажем какой-нибудь canvas или типа того, реализовать

Хорошая идейка, подумаю, спасибо!

Занятный проект, судя по коду поддерживается ограниченное количество моделей и предполагается использовать оригинальные веса, без квантизации GGUF или какой бы то ни было ещё, docker-образов нет, плюс смотрю там нет автоматики и все конфигурации будет необходимо прописывать вручную.

Cпасибо за ссылочку, проект пощупаю и сравню с аналогами.

Если я правильно понял в формате RPC схемы все низовые работы по инференсу происходят на стороне бэкенда, следовательно если мы имеем систему из нескольких серверов работа будет распределена между ними равномерно (с учётом доступной rpc-server RAM или VRAM), следовательно можно предположить, что вся работа с кешем и его хранение будет происходить на бэкенде.

Косвенно для меня это подтверждается в этой issue на гитхабе, если в двух словах, то пользователь жалуется на сегфолты когда он отключает кеширование на стороне бэкенда.

А вот как это всё синхронизируется мне пока что непонятно.

Серъёзных замеров ещё не проводил, поэтому точных цифр дать не смогу, производительность замерял на следующих схемах: 1x RTX 3050, 1x RTX 4090 и пара из этих видекарт соединённых по RPC (сеть 1Гбит), вот gist с замерами.

Это кажется странным, но в режиме RPC инференс либо чуть быстрее, либо такой же как на самой быстрой карте.

UPD. Добавлю, что основная моя цель была не в том, чтобы ускорить инференс (хотя это было бы приятным бонусом), а в том чтобы выпонять его на кластере из маломощных микрокомпьютеров, которые по отдельности не способны на инференс больших моделей, скажем на жмене RaspberryPi CM3.

Тогда зачем в некоторых фреймворках для распребеленного запуска упоминаются требовпния к сети?

Думаю это нужно для того чтобы запустить инференс можно было быстрее, так как инференс выполняет только после того как все слои будут выгружены на бэкенды. Иными словами если у есть модель скажем 13B и чекпоинты которой весят кажется 9Гб и есть два бэкенда нужно залить на каждый бэкенд 4.5Гб данных.

Следовательно моя гипотезав в том, что чем быстрее сеть, тем быстрее запустится инференс.

Добавил чуть больше букв в том месте где была цитата, чтобы было понятно, что там модель нагенерила.

У MTS была публикация про детоксикатор, в этой работе они как-раз создали модель, которая удаляет из сообщений "токсичность". А ещё есть метрика MERA под названием ruDetox, которая оценивает насколько хорошо русскоязычные модели справляются с задачами удаления ругательств из текста.

Так что в контексте языковых моделей под токсичностью имеют ввиду именно нецензурные выражения.

Ну а шуточная модель которую я обучил делает строго противоположную работу, отсюда и название "токсикатор" :)

Правильного ответа на данный вопрос к сожалению не знаю. Мне кажется, что различить подобное крайне сложно, лично у меня градация во время сборки датасета была простая: есть мат - токсичное, нет - обычное. Насколько это оптимальная градация думаю лучше у специалистов из области психологии или лингвистики уточнить.

Конечно можно, если соединить токсикатор и детоксикатор то может получиться неплохой бенчмарк, сейчас попробую собрать нечто подобное.

Вот результаты тестов на 100 образцах текста из сплита dev датасета toxicator-ru.

Отличное замечание, сейчас займусь скриптиком.

Приветствую! Уточните пожалуйста ошибку, если получится то ссылочкой на Gist, чтобы не писать много текста.

В корне проекта будет файл test_gigasaiga.py, он как-раз демонстрирует то как можно запустить дообученный мною слой LoRA адаптера. У Вас получилось его запустить? Заработало ли?

Покопался в исходных кодах проекта rulm, нашёл в скрипте train одну любопытную незадокументированную переменную окружения WORLD_SIZE, по умолчанию она равна 1, а если сделать больше 1, то включается режим DataParallel.

...

world_size = int(os.environ.get("WORLD_SIZE", 1))
ddp = world_size != 1

...

if ddp:
  device_map = {"": int(os.environ.get("LOCAL_RANK") or 0)}
  gradient_accumulation_steps = trainer_config["gradient_accumulation_steps"]
  gradient_accumulation_steps = gradient_accumulation_steps // world_size
  trainer_config["gradient_accumulation_steps"] = gradient_accumulation_steps

И дальше эти параметры передаются модели.

Пример использования:

WORLD_SIZE=2 python3 -m "src.train" ...

У меня сегодня тоже возникла задача решить проблему с нехваткой памяти (уже правда в рамках обучения другой нейросети), поэтому полез настраивать device_map и max_memory опции, чтобы тренировка, если места мало, могла залезать в системную оперативную память, вот как сделал:

model = model_types[model_type].from_pretrained(
  model_name,
  load_in_8bit=True,
  device_map='auto',
  max_memory={0: f'{int(torch.cuda.mem_get_info()[0] / 1024 ** 3) - 2}GB'},
  torch_dtype=torch_dtype,
  use_flash_attention_2=use_flash_attention_2
)

Попробуйте Mistral дообученную на датасетах rulm (есть демка на HuggingFace).

У Серёжи есть мама Татьяна и папа Денис. И ещё у Серёжи есть брат Иван. Кем Ивану приходится Татьяна?
Иван - сын Татьяны, так как он является братом Серёжи, а мама Серёжи - Татьяна.

Я пошёл в магазин и купил 10 яблок. Два яблока я отдал соседу и два ремонтнику. Потом я купил ещё 5 яблок и одно из них съел. Также я отдал три банана моему брату. Сколько яблок у меня осталось?
Вы купили 10 яблок, отдали два соседу и два ремонтнику, что составляет 4 яблока. Затем вы купили ещё 5 яблок и съели одно из них, что оставляет вам 4-3=1 яблоко. Также вы отдали три банана своему брату, но это не влияет на количество яблок у вас. Осталось вам 1 яблоко.

Приветствую! Рад что публикация пригодилась, я как-раз и хотел чтобы как можно больше людей смогло попробовать дообучить свою версию ruGPT-3.5.

Мельком видел несколько примеров, в которых LoRA слои подключали к модели передавая массив строк (вероятно потом в цикле выполнялся merge_and_unload), но не предал этому значения, однако, после Вашего объяснения до меня дошло, что их похоже подключали "гирляндой".

Идея натренировать множество разных LoRA слоёв и подключать их по надобности в момент инференса мне кажется отличной (хотя я и не совсем уверен в том насколько это эффективный способ, возможно какой-нибудь reload по таймеру будет проще чем при каждом запросе), обязательно попробую этот вариант, технически он выглядит не сложно и таким образом будет очень легко выполнять плавное обновление модели "на лету" или собрать свою модель словно из деталей пазла.

Теперь даже любопытно попробовать обучить ruGPT-3.5 на каждом из 7 датасетов Saiga по отдельности, после чего собрать в кучу, полагаю будет хуже чем "всё и сразу", но если получится примерно на одном и том же уровне, то это будет очень хорошо. Наверняка будет очень важна очерёдность вливания слоёв.

В общем над этой темой надо будет очень основательно подумать, спасибо за наводку.

Насчёт размера контекста, мне попадалось пару любопытных моделей: LLaMA 2 7b 32k (32k токенов), MosaicML 7b и вариации (8к токенов) среди которых самая примечательная была MosaicML 7b-storywriter (65к токенов), возможно ссылочки пригодятся. У меня один из планов попробовать дообучить StoryWriter версию, она как-раз удовлетворяет некоторым моим потребностям связанных с кодингом.

проходит ли он такие тесты?

Попробовал задать модели предложенные вопросы, получилось конечно не очень, но с этим в принципе можно работать, вот тут можно посмотреть Gist с результатами.

На просьбы исправить реагирует не очень адекватно, вероятно в датасетах на которых выполнялось обучение подобного мало.

Не думаете ли о возможности создавать в процессе диалогов материалы для дообучения?

Вот это любопытный момент, как-раз задумываюсь о том как бы это хорошо реализовать, быть может получится хороший датасет собрать, у меня скопилась уже большая пачка диалогов с ChatGPT, их надо бы подчистить да собрать в кучку.

Полагаю многие крупные компании нечто подобное делают со своими продуктами (только само собой у них выборка побольше будет), а для энтузиастов есть к примеру портал ShareGPT, с него полагаю возможно спарсить диалоги после чего выполнить перевод и собрать датасет, подобный подход использовался для Saiga (смотри IlyaGusev/ru_sharegpt_cleaned на HuggingFace).

там даже пары дюжин примеров для годной коррекции поведения может хватать.

С этим дело как-раз и хочется разобраться, пока не совсем понятно возможно ли в принципе корректировать веса как-то на лету (в смысле без переобучения постоянного), например если мне не понравился или наоборот понравился ответ.

Добрый день, рад что статья пригодилась!

То что отображается в консоли не критическая ошибка, а скорее предупреждение, вылезает оно потому что датасеты Saiga (rulm) оптимизированы под модели семейства LLaMA, а у лам размер окна контекста 4096 токенов. В то же время модель ruGPT-3.5 имеет контекст 2048 токенов поэтому на этапе валидации датасета отображается это сообщение.

Но не переживайте, на качество обучения модели это если и повлияет, то на уровне погрешности.

Мне давно хотелось сделать себе просто универсального помощника в виде self-hosted нейросети, доступной через телеграм-бота, которую я бы мог дорабатывать под свои нужды (ещё до релиза ChatGPT-3.5), а получившееся решение может поддерживать осмысленный диалог на правильном русском языке и выполнять многие из поставленных мною задачек (навроде исправления опечаток, создания скелета публикаций по описанию, выполнения простых математических расчетов, брейнсторминга и так далее).

Хотя из-за маленького контекста (всего 2048 токенов) она забывает начало продолжительного диалога, но в пределах 3-5 вопросов-ответов контекст держит приемлемо, однако, судя по тому что рассказывали ребята из Sber AI на Sber SmartDev 2023 скоро будет релиз ruGPT-4, а размер контекста на слайдах был помечен как NDA, то есть, полагаю, он изменится и скорее всего в большую сторону.

Пока что текущее решение умеет далеко не всё, что мне хотелось бы, прежде всего хочется чтобы она стала чуть лучше писать код, для этого нужен датасет и благодаря проекту rulm я теперь знаю как подобные датасеты собирать и могу спокойно заниматься доработкой.

1

Information

Rating
1,131-st
Location
Россия
Registered
Activity

Specialization

Backend Developer, ML Engineer
Lead
Linux
PHP
Python
Multiple thread
Neural networks
Machine learning
Kubernetes
Golang
High-loaded systems