Настройка открытого исходного кода LLM с использованием Axolotl с помощью оптимизации прямых предпочтений (DPO)

LLMы открыли бесчисленные новые возможности для приложений искусственного интеллекта. Если вы когда-либо хотели настроить свою модель, этот руководство покажет вам, как это сделать легко и без написания какого-либо кода. Используя инструменты, такие как Axolotl и DPO, мы шаг за шагом пройдем через процесс.

Что такое LLM?

Большая языковая модель (LLM) – это мощная модель искусственного интеллекта, обученная на огромных объемах текстовых данных – десятки триллионов символов – для прогнозирования следующего набора слов в последовательности. Это стало возможным только в последние 2-3 года благодаря достижениям в области вычислений на графическом процессоре, которые позволили обучать такие огромные модели всего за несколько недель.

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

Почему настраивать LLM?

Разве нельзя просто использовать GPT-4o для всего? Хотя это самая мощная модель на данный момент, она не всегда является самым практичным выбором. Настройка более маленькой модели с количеством параметров от 3 до 14 миллиардов может дать сопоставимые результаты за небольшую долю стоимости. Кроме того, настройка позволяет вам владеть своей интеллектуальной собственностью и уменьшить зависимость от сторонних поставщиков.

Понимание базовых, инструктивных и чатовых моделей

Прежде чем погрузиться в настройку, важно понять различные типы LLM, которые существуют:

  • Базовые модели: они предварительно обучены на больших объемах неструктурированного текста, такого как книги или данные из интернета. Хотя у них есть врожденное понимание языка, они не оптимизированы для вывода и могут производить несвязанные результаты. Базовые модели разрабатываются для использования в качестве отправной точки для разработки более специализированных моделей.
  • Инструктирующие модели: построенные на основе базовых моделей, инструктирующие модели донастраиваются с использованием структурированных данных, таких как пары запрос-ответ. Они созданы для выполнения определенных инструкций или ответа на вопросы.
  • Модели чатов: также созданные на базе базовых моделей, но в отличие от инструктирующих моделей, модели чатов обучены на конверсационных данных, что позволяет им взаимодействовать в диалоге в обе стороны.

Что такое обучение с подкреплением и DPO?

Обучение с подкреплением (RL) – это методика, при которой модели учатся, получая обратную связь по своим действиям. Она применяется к инструктирующим или чат-моделям для дальнейшего улучшения качества их результатов. Обычно обучение с подкреплением не проводится поверх базовых моделей, поскольку оно использует гораздо более низкую скорость обучения, которая недостаточно изменит результат.

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

Когда использовать DPO

DPO особенно полезно, когда вам нужно настроить стиль или поведение вашей модели, например:

  • Настройки стиля: изменение длины ответов, уровня детализации или степени уверенности, выражаемой моделью.
  • Меры безопасности: Обучите модель отклонять ответы на потенциально небезопасные или неподходящие запросы.

Однако DPO не подходит для обучения модели новым знаниям или фактам. Для этой цели более подходят техники Наблюдаемого Тонкого Настройки (SFT) или Генерации с Поиском (RAG).

Создание Набора Данных DPO

В производственной среде вы обычно создаете набор данных DPO, используя обратную связь от ваших пользователей, например:

  • Обратная связь пользователя: Внедрение механизма оценки “палец вверх/палец вниз” на ответах.
  • Сравнительный выбор: Предоставление пользователям двух разных результатов и просьба выбрать лучший.

Если у вас нет данных пользователей, вы также можете создать синтетический набор данных, используя более крупные, более способные LLM. Например, вы можете создавать плохие ответы с помощью более маленькой модели, а затем использовать GPT-4o для их коррекции.

Для простоты мы будем использовать готовый набор данных от HuggingFace: olivermolenschot/alpaca_messages_dpo_test. Если вы проверите набор данных, вы заметите, что он содержит запросы с выбранными и отклоненными ответами – это хорошие и плохие примеры. Эти данные были созданы синтетически с использованием GPT-3.5-turbo и GPT-4.

Обычно вам понадобится от 500 до 1 000 пар данных как минимум для эффективного обучения без переобучения. Самые большие наборы данных DPO содержат до 15 000–20 000 пар.

Тонкая настройка Qwen2.5 3B с инструкциями Axolotl

Мы будем использовать Axolotl для настройки модели Qwen2.5 3B Instruct, которая в настоящее время занимает верхнюю строчку в рейтинге OpenLLM Leaderboard по размеру. С помощью Axolotl вы можете настраивать модель, не писав ни одной строки кода, просто используя файл конфигурации YAML. Ниже приведен config.yml, который мы будем использовать:

base_model: Qwen/Qwen2.5-3B-Instruct
strict: false

# Axolotl will automatically map the dataset from HuggingFace to the prompt template of Qwen 2.5
chat_template: qwen_25
rl: dpo
datasets:
  - path: olivermolenschot/alpaca_messages_dpo_test
    type: chat_template.default
    field_messages: conversation
    field_chosen: chosen
    field_rejected: rejected
    message_field_role: role
    message_field_content: content

# We pick a directory inside /workspace since that's typically where cloud hosts mount the volume
output_dir: /workspace/dpo-output

# Qwen 2.5 supports up to 32,768 tokens with a max generation of 8,192 tokens
sequence_len: 8192

# Sample packing does not currently work with DPO. Pad to sequence length is added to avoid a Torch bug
sample_packing: false
pad_to_sequence_len: true

# Add your WanDB account if you want to get nice reporting on your training performance
wandb_project:
wandb_entity:
wandb_watch:
wandb_name:
wandb_log_model:

# Can make training more efficient by batching multiple rows together
gradient_accumulation_steps: 1
micro_batch_size: 1

# Do one pass on the dataset. Can set to a higher number like 2 or 3 to do multiple
num_epochs: 1

# Optimizers don't make much of a difference when training LLMs. Adam is the standard
optimizer: adamw_torch

# DPO requires a smaller learning rate than regular SFT
lr_scheduler: constant
learning_rate: 0.00005

# Train in bf16 precision since the base model is also bf16
bf16: auto

# Reduces memory requirements
gradient_checkpointing: true

# Makes training faster (only suported on Ampere, Ada, or Hopper GPUs)
flash_attention: true

# Can save multiple times per epoch to get multiple checkpoint candidates to compare
saves_per_epoch: 1

logging_steps: 1
warmup_steps: 0

Настройка облачной среды

Для запуска обучения мы будем использовать облачный хостинг, такой как Runpod или Vultr. Вот что вам понадобится:

  • Образ Docker: Клонируйте образ Docker winglian/axolotl-cloud:main, предоставленный командой Axolotl.
  • *Требования к оборудованию: GPU с объемом памяти 80 ГБ VRAM (например, узел PCIe 1×A100) будет более чем достаточным для такой модели.
  • Хранилище: 200 ГБ томового хранилища будет вмещать все необходимые файлы.
  • Версия CUDA: Ваша версия CUDA должна быть не ниже 12.1.

*Этот тип обучения считается полной настройкой LLM и, следовательно, требует много VRAM. Если вы хотите запустить обучение локально, не полагаясь на облачные хосты, вы можете попробовать использовать QLoRA, который является формой Наставляемой настройки. Хотя теоретически возможно комбинировать DPO и QLoRA, это делается очень редко.

Шаги для начала обучения

  1. Установите каталог кеша HuggingFace:
export HF_HOME=/workspace/hf

Это гарантирует, что исходная модель загружается в наше томовое хранилище, которое является постоянным.

  1. Создайте файл конфигурации: Сохраните файл config.yml, который мы создали ранее, в /workspace/config.yml.
  1. Начните обучение:
python -m axolotl.cli.train /workspace/config.yml

И вот! Ваше обучение должно начаться. После того, как Axolotl загрузит модель и обучающие данные, вы должны увидеть вывод, подобный этому:

[2024-12-02 11:22:34,798] [DEBUG] [axolotl.train.train:98] [PID:3813] [RANK:0] loading model

[2024-12-02 11:23:17,925] [INFO] [axolotl.train.train:178] [PID:3813] [RANK:0] Starting trainer...

Обучение должно занять всего несколько минут, так как это небольшой набор данных всего из 264 строк. Полученная модель будет сохранена в /workspace/dpo-output.

Загрузка модели в HuggingFace

Вы можете загрузить свою модель в HuggingFace, используя CLI:

  1. Установите HuggingFace Hub CLI:
pip install huggingface_hub[cli]
  1. Загрузите модель:
huggingface-cli upload /workspace/dpo-output yourname/yourrepo

Замените yourname/yourrepo на ваше реальное имя пользователя HuggingFace и название репозитория.

Оценка вашей донастроенной модели

Для оценки рекомендуется разместить как исходную, так и донастроенную модели с помощью инструмента, например, Text Generation Inference (TGI). Затем выполните вывод на обеих моделях с установкой температуры на 0 (чтобы обеспечить детерминированные выводы) и вручную сравните ответы обеих моделей.

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

Заключение

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

Удачной настройки!

Source:
https://www.sitepoint.com/fine-tuning-llm-with-direct-preference-optimization-dpo/