???? Upd. Добавили пример запуска в Colab'е.
Друзья, свершилось. Сегодня мы рады сообщить вам о релизе в открытый доступ нейросетевой модели, которая лежит в основе сервиса GigaChat.
Про то, что такое GigaChat и как мы его обучаем, вы можете прочитать в нашей предыдущей статье. Скажу лишь, что главной его частью, ядром, порождающим креативный ответ на ваш запрос, является языковая модель, обученная на огромном количестве разнообразных текстов — сотен тысяч книг, статей, программного кода и т.д. Эта часть (pretrain) затем дообучается на инструкциях, чтобы лучше соответствовать заданной форме ответа. Обучение такого претрейна занимает около 99% от всего цикла обучения и требует значительного количества ресурсов, которыми обычно обладают только крупные компании.
Этот претрейн, названный ruGPT-3.5, мы выкладываем на Hugging Face под лицензией MIT, которая является открытой и позволяет использовать модель в коммерческих целях. Поговорим о модели подробнее.
Языковая модель
Напомним читателям, что речь у нас идёт о языковой модели. Языковое моделирование подразумевает под собой способность некоторого алгоритма предсказывать следующий токен (для простоты можно считать его за одно слово), учитывая предыдущие. На каждом таком шаге строится распределение, в котором у каждого токена есть своя вероятность появления. Выбирать из этой вероятности (сэмплировать) также можно различными способами.
Модели, имеющие достаточно большое количество обучаемых параметров (весов), принято называть большими (Large Language Model, LLM). За большое количество тут можно считать от 1 миллиарда параметров и более, хотя четкого разграничения нет.
На данный момент есть ряд открытых нейросетевых языковых моделей, например, LLaMA, Falcon, MPT, OPT и другие. К сожалению, все они обучались на ограниченном количестве данных, если говорить о русском языке. Обычно это русская википедия и часть данных из интернета (Common Crawl), если в нём оставляли русскоязычные тексты.
Такое сокращение данных отрицательно влияет на понимание языка и, как следствие, на качество ответов, если вы будете использовать такой претрейн для инструктивного обучения. Помимо этого, размер токенов, который мы ранее посчитали за слово, на самом деле может быть гораздо короче. Вплоть до 1 символа для языков, слабо представленных в датасете при обучении токенизатора. А так как размер контекста, который можно поместить в модель, это длина текста в токенах, то получается дополнительное ограничение на размер входного запроса.
Ограничения относительно русского для этих моделей нормальны, так как они обучались в основном для работы с английским. Наша же модель направлена в первую очередь на русский язык и позволяет обрабатывать его более качественно.
ruGPT-3.5 13B
Количество параметров у ruGPT-3.5 составляет 13 миллиардов. Это декодерная модель (подробнее про трансформерную архитектуру, лежащую в основе всех вышеперечисленных моделей, включая нашу, можно почитать в статье Джея Аламмара), которая может использоваться для решения широкого круга NLP задач.
Длина контекста у неё 2048 токенов. Рассказ Чехова "Хамелеон" разобьется примерно на 1650 токенов.
Модель была обучена в два этапа. Сначала она обучалась около полутора месяцев на 300 Гб данных, состоящих из книг, энциклопедийных и научных статей, социальных ресурсов и других источников. Затем мы провели дообучение («дотрейн») на 110 Гб данных, включающих код из датасета The Stack, юридические документы и обновленные тексты википедий.
Этот пост у нас получился более новостным, поэтому пишите, про что вам было бы интересно узнать — дообучение модели через LoRA, инструкции, примеры использования или что-то ещё. Постараемся раскрыть тему полнее и будем ждать от вас идей и обратной связи.
Надеемся, что эта модель принесет пользу сообществу в развитии русскоязычного NLP.
Пример запуска
Наже дружное сообщество уже наделало квантизованных версий ruGPT-3.5, поэтому собрали с ними небольшой Colab. Надо иметь в виду, что качество при квантизации немного проседает, но поиграться можно.
Ссылка на Colab с ruGPT-3.5 13B (4 bit)
Благодарности
В заключение хотел бы отметить работавших над созданием этой модели коллег из SberDevices, Sber AI и AIRI, которые денно и нощно вносят вклад в обучение больших нейронных сетей и русскоязычного NLP.
Ссылки
Веса модели ruGPT-3.5 13B на Hugging Face.
Модель также доступна для разработчиков на платформе Cloud.
Наш чатик в Telegram — Salute AI Community. В нём можно напрямую поспрашивать про все, что связано с машинным обучением и просто пообщаться.
Colab для запуска квантизованной версии (4 bit).
Комментарии (82)
AigizK
20.07.2023 08:08+3В каком объеме представлены другие языки?
averkij Автор
20.07.2023 08:08+6Привет! В этом претрейне был в основном русский и английский (около 10%) так как за основу бралась ruGPT 13B, которая была обучена на первой версии датасета. Мультиязычность сейчас в новых данных есть, на них обучается следующая модель.
ponikrf
20.07.2023 08:08+4Можно было бы какую нибудь супер короткую инструкцию написать, как ее запустить. А то вроде бы и запустил бы, да вот что для этого нужно непонятно. Хотя скорее всего это вопрос нескольких команд в консоли.
vazir
20.07.2023 08:08На сколько я понимаю, это PyTorch модель, т.е. ищите инструкцию на LLAMA/ALPACA и все то же самое.
averkij Автор
20.07.2023 08:08+11Привет, сам код стандартный, но так как модель большая, то будет проблематично запускать в Colab'е. Даже с load_in_8bit=True. Мы еще посмотрим как оптимизировать запуск и сделаем примеры дообучения с LoRA.
# !pip install transformers accelerate bitsandbytes from transformers import GPT2TokenizerFast, AutoModelForCausalLM tokenizer = GPT2TokenizerFast.from_pretrained('ai-forever/ruGPT-3.5-13B') model = AutoModelForCausalLM.from_pretrained('ai-forever/ruGPT-3.5-13B') text = "Гладить манула лучше следующим образом:" encoded_input = tokenizer(text, return_tensors='pt').to('cuda:0') output = model.generate( **encoded_input, num_beams=5, max_new_tokens=100, no_repeat_ngram_size=2, num_return_sequences=5, ) print(tokenizer.decode(output[0], skip_special_tokens=True))
ScavS
20.07.2023 08:08ставите https://github.com/oobabooga/text-generation-webui и качаете модель GPTQ 4бит или 8бит, https://huggingface.co/models?sort=modified&search=rugpt на 4бит требуется более 8Гб VRAM.
Erewok
20.07.2023 08:08+4Спасибо за релиз!
Интересно узнать подробнее про этап, как pretrain дообучался на инструкциях и какие есть советы о том, чтобы дообучить такую модель уже на специфичных для своей задачи инструкциях
averkij Автор
20.07.2023 08:08+2Именно при дообучении на инструкциях (SFT, supervised fine-tuning), особенных проблем быть не должно, главное собрать соответствующий датасет. Соберем Colab с дообучением на LoRA и QLoRA с примерами.
janvarev
20.07.2023 08:08О, а кстати есть какой-то эффективный формат запроса? Типа Альпака/Викуна? Или выложена модель без тренировки на инструкциях?
MountainGoat
20.07.2023 08:08+5Рассказ чехова "Хамелеон" - 901 слово. Получается 1.8 токена на слово, что очень хорошо.
holodoz
20.07.2023 08:08Хотел искать рассказ, но знал, что кто-то должен был уже это сделать, спасибо тебе, добрый и быстрый человек. Жаль, что этого не сделал автор, эта информация напрашивается в абзац про то, что у других моделей один знак равен одному токену для русского языка.
MountainGoat
20.07.2023 08:08Я бы сказал - подозрительно хорошо получается.
averkij Автор
20.07.2023 08:08+1Ну размер токенизатора довольно большой, 52k. Обучалась в основном на русскоязычных текстах, поэтому да, для русского нужно меньше токенов при токенизации.
savvadesogle
20.07.2023 08:08+1Подскажите, пожалуйста, а какие " юридические документы" участвовали в дообучении?
averkij Автор
20.07.2023 08:08Различные обезличенные документы, что-то типа заявлений, обращений, апелляций. Это должно помочь модели генерировать похожие документы по таким свободным шаблонам.
domrik
20.07.2023 08:08Возможна ли ее квантизация и запуск в убабуге/кобольде?
averkij Автор
20.07.2023 08:08+1Как несильно в них тыкал, там же в gglm формате нужны чекпоинты?
janvarev
20.07.2023 08:08+1Да, вроде как делается стандартным преобразованием через llama.cpp в формат ggml. Желательно несколько вариантов квантизаций - под разные требования к памяти. Ggml кстати вполне себе эффективно запускается на видеокарте, если VRAM достаточно.
AigizK
20.07.2023 08:08+8Мне кажется, если сделаете сразу ggml формат с разными версиями квантизации, упростите всем жизнь. Не у всех все таки A100 имеется, как у сбера ????
averkij Автор
20.07.2023 08:08+1Это да, надо заняться. Ты сам не пробовал в ggml конвертить?
epicfilemcnulty
20.07.2023 08:08+2я пробовал, валиться на первом же этапе конвертации в ggml fp16 формат.
Вы бы выложили веса модели хотя бы в стандартном hugging face FP16, а то так хрен запустишь генерацию стандартными методами даже на RTX 4090, что вообще какое-то безобразие для такой сравнительно небольшой модели.
dimnsk
20.07.2023 08:08есть сравнение c **Llama2, Falcon? Vicuna в основных тестах?
janvarev
20.07.2023 08:08+2А что вы называете основными тестами? Есть всякие западные варианты, но они тестятся на англоязычных моделях. А на русских тестах особо результатов западных моделей нет.
Antra
20.07.2023 08:08Мне было бы интересно такого рода сравнение:
берется запрос на английском и прогоняется через условную LLama. Результат на английском (собственно, такие уже есть)
берется такой же запрос на, к примеру, испанском, и прогоняется через ту же LLama. Результат на испанском. Разумеется, похуже, чем на английском.
берется запрос на русском и прогоняется через ruGPT. Результат на русском.
Я думаю, что на русском ответ будет лучше, чем на испанском, но насколько? Почти как на английском?
Сравнение "выдачи" оценивать вручную же (перевод ручной, т.е погрешности не внесет).
Lexicon
20.07.2023 08:08+3Думаю, в данном контексте это оффтоп, тк вопрос про гигачат, но все же спрошу
Месяц назад знакомые из сбера как раз трогали гигачат через API и пришли к тому, что ответы ОЧЕНЬ серьезно отставали от GPT-3 или LLama, настолько катастрофически, что последние справлялись с задачами банка, в то время, как внутреннее решение не могло работать с контекстом осмысленно и формировать идентичные по содержимому ответы, например - использовать ссылки, тезисы или термины из контекста, не смотря на ответы ощутимо быстрее альтернатив, осмысленность полученного результата была попросту недостаточна.
Слышал даже, что во внутренних презентациях банка иногда использовали заглушки или другие модели, чтобы продемонстрировать желаемый, но недостижимый эффект.
Для меня это было достаточно удивительно, тк альтернативные сетки преимущественно англоязычны и вполне ожидаемо могли бы хуже справляться с запросами на русском.Было бы интересно узнать, чего не хватает(или не хватало, если вдруг совсем недавно пофиксили) в обучении, а может даже в реализации модели на ваш взгляд?
averkij Автор
20.07.2023 08:08+1Для этого мы и раскатываем систему сначала внутри, чтобы собрать фидбек и итеративно улучшать модели. Инструктивные версии сейчас постоянно меняются.
Deliter321
20.07.2023 08:08+4"Привет, это GigaChat. К сожалению, сейчас я не могу вам ответить."
Moog_Prodigy
20.07.2023 08:08+5"Все видеокарты заняты, дождитесь своей очереди, ваш номер в очереди 11967"
kolabaister
20.07.2023 08:08+3Хорошо бы рассказать что вызвало такое странное поведение с раздачей доступов - их обещали каждую неделю, а потом просто бац и полное молчание на месяцы. И даже сейчас статья на хабре есть, а чаты и каналы куда так активно приглашали для получения наисвежайшей информации - молчат.
averkij Автор
20.07.2023 08:08+3Да обычная история, на самом деле, для крупной компании — опять куча различных согласований понадобилась отовсюду, доделки на лету и т.д. Но, насколько я знаю, там уже есть надежда на скорый запуск.
dom333
20.07.2023 08:08Как ее можно использовать в своем проекте для проверки текстов?
averkij Автор
20.07.2023 08:08А как проверять тексты хотите? Вы учтите, что модель довольно большая.
dom333
20.07.2023 08:08проверка комментариев пользователей на агрессию и непристойность, указание контактов в тексте, наличие смысла и т.п.
что значит большая?averkij Автор
20.07.2023 08:08+2Большая в том смысле, что, если онлайн хотите в своем проекте использовать, но ее надо будет где-то хостить с GPU и т.д. Может быть дорого.
На такие задачи да, можно дообучать. Можно сначала во few-shot попробовать, когда несколько примеров подаете на вход с каждым запросом.
domrik
20.07.2023 08:08+1Большинство LLMок успешно справляются с подобным запросом:
Classify the text into neutral, negative or positive.
Text: Shut your fuck up asshole!
Sentiment:
averkij Автор
20.07.2023 08:08+4AnyKey80lvl
20.07.2023 08:08+5между 2) и 3)
==== вы закончитесь здесь ===
averkij Автор
20.07.2023 08:08+8Надо тестировать
Wesha
20.07.2023 08:08Рассказать ему, что он самый лучший медведь на свете
Это скорее "как подружиться с женой".
frex
20.07.2023 08:08+1Как суммаризатор может работать?
averkij Автор
20.07.2023 08:08Может, контекст у модели 2048 токенов. Это претрейн (модель общего назначения), под конкретную задачу типа суммаризации надо дообучать.
Evengard
20.07.2023 08:08Скажу честно, я в ML полный профан, но хотел бы узнать - а контекст каким-то образом увеличить можно? Хотя бы раз в десять, а вообще желательно в 100. Есть одна идея, но для этого нужен контекст большой.
Aldrog
20.07.2023 08:08+3У OpenAI есть модель с контекстом в 32000 токенов, но их токенизация на русский не очень расчитана. А вообще, как я понимаю, расширение контекста — актуальная проблема, над которой сообщество активно бьётся и простых решений пока нет.
nikich340
20.07.2023 08:08+1Будут ли модели с количеством параметров поменьше? Интересует дообучение на примерах диалогов из игр для получения "говорилки в стиле персонажа А". На английском для этого есть dialoGPT, на русском до сих пор ничего внятного.
averkij Автор
20.07.2023 08:08Поменьше уже есть — например, FRED-T5 1.7B, это полный трансформер (ruGPT, LLaMA и т.д. — это декодерные модели. Можно почитать про это в хорошем посте Алламара). Есть ruGPT-XL 1.3B.
Возможно, еще обучим ruGPT меньшего объема на новом сете.
0x131315
20.07.2023 08:08+1Браво, большой респект.
Llama2 очень понравилась, надеюсь русскоязычная моделька будет более актуальна.
averkij Автор
20.07.2023 08:08+1А в LLaMA2 именно в английский понравилась? В русский из коробки не очень работает, так как там 0.13% русского было при обучении претрейна.
pechenov
20.07.2023 08:08+2Сделал вчера 8-битную версию ruGPT-3.5-13B-8bit, но она всё равно получилась довольно большой, из-за того, что оригинальная модель огромная.
В колабе получилось запустить только 4-битную, но её на HF нет возможности залить.
PrinceKorwin
20.07.2023 08:08Наивный вопрос, но - на Apple ноутбуках возможно запустить? Как?
entze
20.07.2023 08:08+2Дождаться конвертации в формат поддерживаемый llama.cpp - https://github.com/ggerganov/llama.cpp
работает без GPU
averkij Автор
20.07.2023 08:08+1Собрал небольшой колаб на квантованой сообществом модели (имейте в виду, что качество немного падает при квантизации):
https://colab.research.google.com/drive/1KyDX_D-rsKN8qpIvo3YMXSYmT3poaBGN
Antra
20.07.2023 08:08Прошу прощения, это так и задумано или у меня что-то пошло не так?
Или 4 бит - чисто проверить, что хоть как-то запускается, и ждем хотя бы 8B для убабуги или gpt4all?
averkij Автор
20.07.2023 08:08+1:) Да, может разное генерить. Попробуйте разные виды сэмплинга, это очень гибко на результат влияет.
Вот тут можно почитать:
Yuriks111
20.07.2023 08:08вот тут у вас много моделей в т.ч. T5, Bert, FRED разных размеров.
Это были эксперименты по поиску архитектуры или у всех будет продолжение?averkij Автор
20.07.2023 08:08Это все разные виды архитектур, у каждой есть свои преиимущества.
Большинство моделей, которые дообучают на инструкциях для работы в режиме чата, декодерные, типа LLaMA и ruGPT.
mirt
20.07.2023 08:08Файнтюнить не получается даже на H100. С batch_size=1 выдает OOM. Это норма?
averkij Автор
20.07.2023 08:08Вообще в fp16 с батчем 1 должно влезть. У вас же 80gb памяти?
mirt
20.07.2023 08:08Да, 80гб. Вот такой код уходит в OOM.
averkij Автор
20.07.2023 08:08Интересно. Ну, во-первых, gradient accumulation надо поставить 4, например, чтобы эффективный батч стал 4.
И попробуйте с gradient_checkpointing=True еще, это небольшой выигрыш по памяти даст, хотя и замедлит немного.
Тоже чуть позже попробую, напишу.
mirt
20.07.2023 08:08Вот такой код с device_map='auto' также падает с OOM в районе 500-го бачта на 8xA10080gb
Alexey2005
20.07.2023 08:08Затестил 8-битный вариант модели, взятый отсюда. Естественно, что с тем кодом, который там приведён на карточке модели, она не запустилась.
Поэтому на всякий случай прикладываю краткую инструкцию по запуску.- Установить transformers и auto_gptq (в моём случае это были версии 4.31.0 и 0.3.0, которые среди прочих зависимостей подтягивают pytorch 2.0.1).
- Скачать все файлы модели, поместив в подкаталог model
- Переименовать gptq_model-8bit-128g.bin в pytorch_model.bin (или создать соответствующий симлинк).
- Использовать следующий код:
from transformers import AutoTokenizer from auto_gptq import AutoGPTQForCausalLM, BaseQuantizeConfig quantize_config = BaseQuantizeConfig(bits=8, group_size=128, damp_percent=0.01, desc_act=False, sym=True, true_sequential=True) model = AutoGPTQForCausalLM.from_quantized('model', device="cuda:0", use_triton=True, quantize_config=quantize_config) tokenizer = AutoTokenizer.from_pretrained('model') request = """Покупка сахара, она затягивает. Сегодня ты купил одну пачку, завтра хочется уже повысить градус адреналина и купить две. А потом ты видишь на соседней кассе бабку с шестнадцатью пачками на тележке и чувствуешь себя слабаком и неудачником. И проверяешь, сколько у тебя денег на карте, а потом возвращаешься в торговый зал и набираешь на всю котлету (а это, на минуточку, 19 пачек) и уже победоносно смотришь на бабок. Ты ставишь будильник на 7.15, чтобы в 7.35 уже стоять и ждать открытия магазина среди двадцати таких же ловцов удачи. Ты переоборудовал спальню под сахарохранилище и думаешь, что если постелить в кухне на полу, то и зал тебе не особо нужен. При виде пачки сахара или даже мысли о ней у тебя мгновенно возникает эрекция. Ты продаешь мебель, потому что, во-первых, тебе нужны деньги на сахар, а во-вторых, без мебели в квартире поместится больше сахара. Ты жадно мониторишь новости и на каждую из них""" encoded_input = tokenizer(request, return_tensors='pt', \ add_special_tokens=False).to('cuda') tokens_number = len(encoded_input.input_ids[0]) print(f"Number of tokens: {tokens_number}") output = model.generate( **encoded_input, num_beams=1, top_p=0.98, temperature=0.6, top_k=40, repetition_penalty = 1.04, do_sample=True, max_new_tokens=100 ) print(tokenizer.decode(output[0][tokens_number:], skip_special_tokens=True))
РезультатТакая 8-битная модель требует 15 Гб VRAM и в процессе загрузки пиковое потребление оперативной памяти (RAM) достигает 30 Гб (потом, когда модель закидывается в видеокарту, падает до скромных 2.5Гб).
Время генерации на 4090, ограниченной по Power Limit до 150 Вт, составляет порядка 4 сек.Что же касается качества, то оно заметно выше, чем у FRED-T5-1.7B, однако лишь при условии, что затравка достаточной длины. Модель зачастую выдаёт чушь, если затравка слишком короткая, и начинает полностью раскрываться, когда на вход подаётся длинный текст от 500 токенов. Качество достигает пика где-то в районе 1000 токенов, а дальше начинает плавно проседать.
vazir
Да все интересно и дорбучение и инструкции и примеры.
1. На каком ускорителе ее можно покрутить в домашних условиях? Могу я ее покрутить на 1080ti 12gb или нужен более новый или только больше памяти? 2. Какова скорость работы на цпу?
wooferclaw
int8 должен запуститься на бесплатной T4 в колабе. Так что у вас думаю тоже заработает.
vazir
В колабе вроде 16г GPU. Если инт8 на 13b то я правильно понимаю что 12gb маловато? До int4 говорят как то можно ужать?
wooferclaw
да, просто укажите load_in_4bit=True
MountainGoat
Я сейчас пойду упрашивать TheBloke сделать GGML. Если сделает, то хоть на четвёртом пне без GPU будет терпимая скорость.
Ktator
На 1080ti 11 гигов. Если модель требует 12 Гб, она не влезет!
ScavS
вот 4 битная модель https://huggingface.co/fffrrt/ruGPT-3.5-13B-GPTQ она влезет работает в https://github.com/oobabooga/text-generation-webui
averkij Автор
Можно в Colab'е (4bit).
averkij Автор
Вот на CPU не смотрел, но будет супер медленно. Тут надо конвертацию в GGML поисследовать.