Хабр, привет! Это Just AI, и мы создали JustGPT – третью большую языковую модель, сопоставимую по качеству ответов с известными LLM для русского языка (GigaChat, YandexGPT). Наша история – про работу над моделью, ее обучение и тестирование. Но в конечном итоге о том, как получить свою LLM на русском языке без космических мощностей и огромных команд.
Совсем немного вводных, и к делу
Выход ChatGPT от OpenAI запустил два процесса:
создание прикладных приложений, использующих GPT-3.5 Turbo или GPT-4,
создание своих больших языковых моделей (Large Language Models, LLM).
Мы в Just AI тоже не смогли остаться в стороне от всех событий – и разработали Jay CoPilot, инструмент по работе с нейросетями, и собственную LLM JustGPT. Пока Just AI не обладает вычислительными ресурсами, достаточными для создания таких мощных LLM, как GPT-3,5. Тем более c нуля.
Тем не менее нам удалось за несколько месяцев сделать LLM, сопоставимую по качеству ответов с двумя известными LLM для русского языка (GigaChat, YandexGPT). Теперь о том, как мы создавали и тестировали JustGPT — третью большую языковую модель, выпущенную российской компанией.
Данные для добучения
Инструктивные данные, подготовленные лингвистами Just AI
Данные из опенсорса:
Русскоязычная часть данных OpenAssistant:
удалены диалоги, где ассистент хотя бы раз отвечал токсично – разные параметры токсичности из колонки detoxify отсеяны по порогу не выше, чем 0,4. Порог подобран мануально.
датасет представлял собой деревья диалогов с разветвлениями на возможные продолжения. Каждое дерево было разбито на несколько диалогов – на каждый вариант развития диалога. Это значит, что начало диалога может дублироваться несколько раз, но завершение уникально.
иногда диалог завершается репликой промптера, а не ассистента. Мы не стали такое убирать, потому что эта последняя реплика может содержать исправление предшествующей реплики ассистента (типа «Ты не прав, я спросил другое…»).
в итоге получилось 692 дерева диалогов и из них 2738 диалогов глубиной от 2 до 6 реплик
Русскоязычные датасеты, созданные с помощью ChatGPT. Часть была отложена для дальнейшего тестирования.
Перевод англоязычных датасетов.
Базовая модель
В качестве базовой модели использовали оригинальную LLama 2 на 70 миллиардов весов, оптимизированную для диалоговых кейсов.
Дообучение
Для дообучения использовались две концепции.
Дообучение через адаптеры, а именно LoRA: Low-Rank Adaptation. Суть подхода заключается в том, чтобы вообще не обучать веса исходной базовой модели, а встроить небольшое количество весов параллельно к старым, уменьшая размерность за счёт перемножения двух матриц более низкого ранга.
LOMO: LOw-Memory Optimization
В этом подходе предлагается новый оптимизатор, LOw-Memory Optimization (LOMO), который объединяет вычисление градиента и обновление параметра в одном шаге для снижения использования памяти. Этот подход позволяет полностью настраивать параметры модели на 7B на одном Nvidia RTX 3090 (24 Gb VRAM), или модели на 65B на одной машине с 8×RTX 3090.
Забегая вперед, должны отметить, что работа над вторым подходом еще ведется, и о результатах пока говорить преждевременно. Поэтому в первый релиз пошла модель, обученная с применением только LoRA-адаптеров.
Оптимизация модели для ускорения инфренса
Для ускорения производительности модели на инференсе использовали оптимизацию GPTQ, реализованную в этом репозитории.
Методы квантизации (квантования) обычно относятся к одной из двух категорий:
Пост-тренировочная квантизация (Post-Training Quantization, PTQ): мы квантуем предварительно обученную модель, используя умеренные ресурсы, такие как набор данных для калибровки и несколько часов вычислений.
Квантование с учетом обучения (Quantization-Aware Training, QAT): квантование выполняется перед обучением или дальнейшей тонкой настройкой (файн-тюнингом, fine-tuning).
GPTQ попадает в категорию PTQ, и это особенно важно для больших LLM, для которых полное обучение модели или даже тонкая настройка может быть очень дорогой как по ресурсам, так и по времени.
В частности, GPTQ использует смешанную схему квантования int4 / fp16, где веса модели квантуются, как int4, а активации остаются в формате float16. Во время инференса веса деквантуются на лету, и фактическое вычисление выполняется в формате float16.
Преимущества этой схемы двояки:
Экономия памяти, близкая к x4 для квантования int4.
Потенциальное ускорение, благодаря экономии времени на передачу данных из-за меньшего битового размера, использованного для весов.
Этот подход позволил получить прирост в производительности в среднем в 2 раза по сравнению с 16-битной JustGPT и в 3 раза по сравнению с 8-битной JustGPT.
Тестирование (и почему не Russian SuperGLUE, а своя методика)
Сейчас первое, что приходит на ум в вопросе тестирования русскоязычных LLM — общепринятый бенчмарк Russian SuperGLUE, а также бенчмарк RUCOLA. Это очень хорошая методика, которая позволяет получить объективную оценку модели по большому числу сложных NLP-задач.
Однако в бою наша модель будет решать другие задачи: либо более повседневные, либо специфичные для наших продуктов, в которых мы будем использовать LLM, а также имеющие явно диалоговый характер. И качество их решения (количественное и качественное) нам тоже важно проверить. Также нам важно проверить, что некоторые задачи модель, напротив, не решает.
Более того, методика RSG в основном предполагает, что модель должна дать короткий ответ, вплоть до выбора одной из альтернатив. Это позволяет однозначно и автоматически оценивать ответы генеративных моделей.
Но в реальной жизни им приходится генерировать полные ответы, поэтому нам понадобилось оценивать и саму генерацию. Так как главной целью дообучения JustGPT было научить модель русскому языку, нам было важно оценить, насколько хорошо это удалось.
Модель может быть бесконечно права, что тренировка должна начинаться с разогрева, но в этом меньше толка, если она назвала его «разогрейкой».
Данные и методика
Чтобы проверить всё, что нас интересует, мы собрали небольшой датасет из 200 примеров инструкций на следующие укрупнённые темы:
креатив: написание текстов разных жанров с заданными условиями,
написание, интерпретация и исправление кода,
анализ диалога, суммаризация и QnA,
эрудиция и общие знания,
этика и безопасность,
рассуждение,
математика и логика,
перевод,
русский язык,
генерация текста со специфическими условиями,
контрольные вопросы, на которые хорошая модель не должна пытаться ответить без доступа в интернет.
Данные для тестирования были взяты из открытых источников, либо придуманы нами. Мы намеренно остановились на небольшом количестве тест-кейсов: нам нужно проверять не одну модель, а разные её версии в процессе дообучения, чтобы отслеживать прогресс. Это не быстро, поэтому тестовый датасет у нас ориентирован больше не на количество, а на качество. Для ускорения проверки каждого ответа мы получили референсные ответы от GPT-4.
После прогона версии модели на тестовом датасете наступает этап оценки результатов. Тут мы тоже оптимизировали процесс и воспользовались оценкой LLM by LLM.
Промпт для такого тестирования содержал тестовый вопрос, ответ от нашей модели и задачу проверить ответ модели. В качестве ответа LLM-тестировщица должна была вернуть оценку True или False, а в случае последнего — еще и выбрать причину или причины из списка:
фактологическая ошибка,
грамматическая ошибка (судя относились также лексические и синтаксические),
логическая ошибка,
отсутствие здравого смысла,
несоответствие инструкции,
неэтично или незаконно.
Результаты оценки by LLM проверялись человеком, чтобы отловить ошибки автоматизации. Да и какая качественная оценка генерации может быть без лишней пары глаз? На определенной итерации тестирования мы расширили инструкцию просьбой обосновать неверность ответа, и это тоже существенно ускорило процесс мануальной валидации.
В качестве валидационной LLM мы взяли GPT-4, так как она отлично следует инструкциям к оцениванию и формату ответа. В итоге для каждого тестового прогона мы получали число верных ответов (accuracy) и примерную небольшую статистику по причинам ошибок. Также можно было видеть, какие темы инструкций больше западают.
Чтобы сравниваться не только с моделями OpenAI, мы включили в тестирование самые известные большие языковые модели для русского языка — GigaChat от Сбера и YandexGPT (первой версии, так как по API на момент написания статьи доступна только она).
Условия тестирования:
GigaChat тестировался с дефолтными параметрами;
для YandexGPT установили лимит числа токенов генерации 4096, так как остальные две модели не поддерживают максимум этой модели в 7400;
результаты YandexGPT оценивались с параметром температуры 0.5, так как прогон с дефолтным значением показал заметно менее хорошие ответы;
YandexGPT предполагает указание instructionText. Мы указали базовый промпт: «Ты — SimpleGPT, русскоязычный автоматический ассистент, созданный в компании SimpleAI. Ты разговариваешь с людьми и помогаешь им».
Результаты
Сразу к цифрам. Количественно результаты JustGPT сопоставимы с YandexGPT и GigaChat: доля верных ответов 146, 143 и 123, соответственно. Важно сказать, что оценку генерации сложно приводить к бинарной шкале, поэтому обязательно надо смотреть на качественную сторону.
Качественно — к последнему тестированию нам удалось существенно полечить Llama 2 от проблем с русским языком, а именно с согласованием и выдумыванием слов, а также с общей стройностью предложений. Например, больше нет «разогрейки» во время тренировок и «амиusing» в списке синонимов для слова «смешной».
Хоть мы еще не догнали идеальный красивый русский язык YandexGPT и GigaChat, JustGPT лидирует в вопросах про использование разных аспектов русского языка — синонимы, морфологический разбор и прочее: 12/13 верных ответа в этой категории.
— Составьте предложение, содержащее два подлежащих и один глагол.
— Я и мой друг играем в футбол.
На различные инструкции про креатив и рассуждение модель дает полные и разнообразные ответы, а на политические и этические вопросы ломается только при использовании ухищрений.
Вот один развернутый пример
— Ты проходишь интервью на позицию продакт-менеджера. Придумай дизайн для продукта: холодильник для детей. Дизайн должен описывать как минимум следующие элементы: название продукта, целевые пользователи и их сегментация, стратегия на рынке.
— Для начала, я бы назвал этот продукт “Kid's Cooler”. Это название отражает основную функцию продукта — хранение продуктов в холодном состоянии, а также его ориентацию на детскую аудиторию.
Целевыми пользователями Kid's Cooler будут дети в возрасте от 3 до 12 лет, а также их родители и опекуны. Сегментация аудитории может быть выполнена по возрасту, по половому признаку, по уровню дохода и по другим параметрам.
Стратегия на рынке Kid's Cooler будет основываться на использовании социальных сетей и онлайн-рекламы для привлечения внимания родителей и детей. Также будет использоваться партнерство с детскими магазинами и онлайн-магазинами, чтобы увеличить доступность продукта. Дизайн Kid's Cooler будет выполнен в ярких и привлекательных цветах, чтобы привлечь внимание детей. Также будет использоваться удобный и простой интерфейс, чтобы дети могли легко использовать холодильник.
Для увеличения безопасности продукта, Kid's Cooler будет оснащен специальными функциями, такими как автоматическое отключение при открытии двери, защита от перегрева и другие.
Последний штрих — JustGPT оказалась самой послушной, так как меньше всех получала замечание о несоответствии ответа инструкции при тестировании LLM by LLM.
Тестовые кейсы и результаты тестирований доступны по ссылке. Мы не включили в публичную версию датасета кейсы на проверку безопасности ответов модели по тем же соображениям.
Над чем нам еще предстоит поработать:
Фактология. Пока что это самая главная причина ошибок, в том числе из-за недостаточного знания российских данных: «НДС — Налоговый доходный статистический отчет», вот так вот. Доля ошибок этого типа примерно с такой же частотой встречалась у YandexGPT, но по существу ошибки при этом менее значимы.
Место для развития у всех моделей — написание и анализ кода. У JustGPT несколько меньше ошибок при анализе или написании кода по сравнению с другими, но пока ей не хочется доверять так же, как GPT-4 или специально дообученным моделям под эту задачу.
Скорость инференса. Тут мы не летаем, но мечтаем научиться.
Дальнейшие шаги
Мы любим, что делаем, и делаем, что любим. Поэтому поделимся некоторыми планами на будущее.
To do list:
Сделать миниверсию JustGPT (в количестве весов) для быстрой проверки гипотез — что хорошо сказывается на обучении, а что плохо.
Решать проблемы, которые подсветили в результатах оценки качества.
Сделать критерий, подобный Russian SuperGLUE, для LLM, чтобы оценивать генеративные способности модели, которые лежат в плоскости не только encoder-ных моделей.
Создать стандартизированный пайплайн обучения для получения доменных LLM на основе JustGPT (JustGPT-bank, JustGPT-telecom и тд) и собрать тренировочные данные для этой цели.
Работать над оптимизацией и ускорением модели, в том числе для возможности установки в контур компаний.
Искать возможности расширения окна контекста.
Ну и конечно, мы будем продолжать работать и над дообучением других моделей, и сравнением результатов!
Где можно протестировать модель и самим сравнить ее возможности с другими LLM на ваших данных? Jay CoPilot (пока по запросу, сейчас мы стартовали программу раннего доступа), с начала следующей недели — в версии Jay для Телеграм.
Будем рады обратной связи и вашим предложениям!