Хабр, привет! Это 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 миллиардов весов, оптимизированную для диалоговых кейсов.

Дообучение

Для дообучения использовались две концепции.

  1. Дообучение через адаптеры, а именно LoRA: Low-Rank Adaptation. Суть подхода заключается в том, чтобы вообще не обучать веса исходной базовой модели, а встроить небольшое количество весов параллельно к старым, уменьшая размерность за счёт перемножения двух матриц более низкого ранга.

  1. 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 для Телеграм. 

Будем рады обратной связи и вашим предложениям!

Комментарии (7)


  1. inkoziev
    21.09.2023 05:55
    +7

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

    А то пока содержимое статьи можно кратко прорезюмировать так: 1) взяли чужие инструктивные данные, 2) взяли чужие диалоговые данные, 3) нагенерили диалоги через апишку openai 4) отфайнтюнили чужую foundation model, причем максимального размера из доступных, стандартным способом с LoRA. 5) на сотне тестовых вопросах как-то проверили, что она выдает. PROFIT!

    Извините за токсичность ;)


    1. just_ai Автор
      21.09.2023 05:55

      Илья, спасибо за комментарий (не токсичный, все ок!)! Действительно, вы правы, примерно так все и есть. И мы не видим здесь чего-то зазорного. Цель нашей статьи как раз в том, чтобы рассказать, что уже сегодня можно сделать на базе Llama-2, не имея эксклюзивного доступа к суперкомпьютерам, ресурсам и данным, а не в том, как создать свою LLM с нуля.

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


  1. Master_Yoda_810
    21.09.2023 05:55
    -2

    GigaChat, JustGPT - опять одни англицизмы. Почему бы не назвать модель "Балалайка" или "Ботаник"? Всему миру пофиг на локальные потуги на фоне триумфа GPT-4, а российским пользователям приятно.


  1. dimnsk
    21.09.2023 05:55
    -3

    делаете то что делаете, а любите то что любите

    скажите результат какой, после того как сделали,
    чем лучше первых двух?

    что выбрать?
    - забыть (если такие же какие первые две)
    - задуматься (если лучше чем первые две)
    - использовать сразу (если сопоставимо с сайгой)



  1. domrik
    21.09.2023 05:55

    А про Сайгу вы не слышали? Тоже тюн Лламы. Или почему именно ваша третья?


    1. den4ik_084720
      21.09.2023 05:55

      И почему ллм собственная....


    1. just_ai Автор
      21.09.2023 05:55

      Конечно, слышали и многому учимся. Технически мы сделали наши дообученные Llama-2 70b примерно одновременно, но про нашу модель правильнее сказать "третья коммерчески доступная", среди моделей, развернутых на инфраструктуре и с интерфейсом в виде продукта.

      Saiga Team - это профессиональная команда, которую мы очень уважаем. И думаем, что Saiga 70b, открытая модель, сопоставима с нами и моделями этого уровня. Будем рады сравнению и попробуем и сами его сделать.