В этой статье я использую мой опыт обучения больших языковых моделей (смотрите серию видео на канале Ruslan Dev), чтобы выявить и описать основные фазы разработки собственной LLM.
На сегодняшний день разработчики GenAI моделей, как правило, используют веса базовых (foundational) моделей, а не обучают нейросеть с нуля. В качестве данных для обучения часто используются ответы state-of-the-art LLM, таких как GPT-4. Этот подход получил распространение с тех пор, как создатели Stanford Alpaca показали, что инференс небольшой модели наподобие Llama 7B можно приблизить по качеству к GPT-3 путем файнтюнинга на ответах последней.
С тех пор и коммерческие, и опенсорс-модели шагнули вперед. Я работал с базовой моделью Llama-3, обученной на беспрецедентно огромном корпусе из 15 триллионов текстовых токенов, что дает широкие возможности для файнтюнинга. А датасет для обучения я собирал с помощью последней модели OpenAI - GPT-4o. Как видите, переменные изменились, но уравнение осталось то же - подход Альпаки работает по-прежнему.
![](https://habrastorage.org/getpro/habr/upload_files/927/e76/f20/927e76f200981ebba7b1d84246e44e8d.png)
Первую фазу создания LLM - сбор данных - я уже упомянул, за ней следует собственно обучение (точнее, файнтюнинг), evaluation (оценка) и квантизация. Индустрия AI пока формируется, и среди инструментов для разработки LLM нет единого стандарта - для каждой из этих фаз программисты используют то, что им подходит. Я считаю, что наличие фреймворка, предлагающего стандартную реализацию вместо беспорядочного скриптинга, не повредит инновациям - даже наоборот. Поэтому две наиболее сложные в вычислительном плане фазы разработки - обучение и квантизацию модели - я реализовал в моем фреймворке gptchain.
Что касается сбора данных, этот процесс в рассмотренном случае сводится к выполнению запросов к API GPT-4o, для чего я написал отдельный скрипт - он прилагается к моему датасету, опубликованному на Huggingface.
Промпты я взял из мультиязычного датасета Tagengo. При этом я решил отфильтровать промпты, на которые модель отвечает типа - извините, не могу с этим помочь. Чаще всего это потому, что промпт не проходит цензуру.
Я сделал выборку промптов на нескольких языках. Меня интересует русский, а также я решил добавить английский и китайский. Размер выборки для каждого из этих языков я задал на тысячу примеров, чтобы начать с небольшого датасета и посмотреть, что получится.
После получения ответа на каждый промпт все диалоги мержатся с помощью Pandas, а затем конвертируются в датасет в формате Huggingface. Как видите, скрипт для сбора данных функционально получился достаточно простой. Суть идеи в том, что громко анонсированная модель GPT-4o с улучшенными мультиязычными возможностями поможет существенно улучшить навыки ламы-3 справляться с задачами на следование инструкциям.
Для фазы обучения я использовал виртуальную машину с GPU NVIDIA H100[ссылка удалена мод.] на облачном сервисе immers.cloud. Как настроить виртуальную машину, установить виртуальное окружение python и необходимые пакеты, я рекомендую прочитать в этой статье или посмотреть видео.
Я добавил поддержку своего нового датасета в gptchain, который, как и Tagengo, загружается с Huggingface в ShareGPT формате, а затем конвертируется моим фреймворком в ChatML.
Я обучал на 3 эпохи. Так как датасет маленький - 3 тысячи примеров, 3 эпохи не заняли много времени - примерно полчаса. Следует учесть, что это для Llama-3 8B, QLoRA с 4-битной квантизацией.
Как показывают метрики wandb, после трех эпох обучения train loss уменьшился с 1.4 до 0.8.
Прежде, чем перейти к следующей фазе - оценке модели на бенче, давайте сравним ее инференс с моими предыдущими экспериментами, чтобы почувствовать разницу чисто субъективно.
После файнтюнинга на датасете Tagengo (состоящем из ответов GPT-4):
Я: Из чего состоит нейронная сеть?
ИИ: Нейронная сеть состоит из нескольких основных компонентов, которые работают вместе для обработки и анализа данных. Вот основные компоненты нейронной сети:
Нейроны (или узлы): Это основные вычислительные единицы нейронной сети. Нейроны принимают входные данные, обрабатывают их и генерируют выходные данные. [...]
После файнтюнинга на моем датасете (на ответах GPT-4o):
Я: Из чего состоит нейронная сеть?
ИИ: Нейронная сеть состоит из набора узлов, или нейронов, которые имитируют работу биологических нейронов. Эти нейроны связаны друг с другом через синаптические соединения, которые представляют собой веса или коэффициенты, определяющие силу передаваемых сигналов. Основные компоненты нейронной сети включают:
Входные нейроны: принимают данные для обработки. В зависимости от задачи, данные могут быть в виде числовых значений, изображений, звуковых сигналов и т.д. [...]
Какой ответ лучше, оставлю судить вам. Важно отменить, что для генерации первого ответа использована Llama-3 70B, второго - Llama-3 8B.
Теперь пора оценить мою новую модель. Я использовал мультиязычный MT-Bench, и генерация ответов на тестовые вопросы на английском и на русском заняла у меня больше времени, чем сам файнтюнинг.
Кстати, техническую инструкцию, как выполнить мультиязычный MT-Bench на своей модели, смотрите в этой статье.
Результат моей модели на английском бенче составил 6.6, это значительно хуже, чем у той же Suzume, что впрочем неудивительно - в моем датасете всего тысяча англоязычных ответов, против 15 тысяч в датасете Tagengo.
Я попробовал и русскоязычный бенчмарк ru_mt_bench. На нем я получил 7.3, не так плохо, близко к GPT-3.5, но все еще слабее Suzume.
Подытожим. Для моего эксперимента мне хватило одной Виртуальной Машины с одним H100, но как бы этот процесс выглядел, будь это серьезный продакшн? Очевидно, добавился бы model parallelism - для более серьезного обучения лама параллелилась бы на несколько H100 одновременно. Я не затронул последнюю фазу - квантизацию, которая нужна для деплоя модели на компьютер или сервер пользователя. Для этого хорошо подходит GGUF формат, поддерживаемый библиотекой llama.cpp.
Можно представить, что для "фабрики LLM" наподобие той, что работает за закрытыми дверями "Open" AI, все эти фазы должны быть автоматизированы - включая дата-пайплайн и бенчмарки. Сделать это проще в облаке при наличии фреймворка наподобие gptchain, но все же остается нетривиальной задачей. Все описанные фазы разработки LLM можно посмотреть в действии - в моем последнем видео.