Эффективная тонкая настройка LLAMA-3.1 с помощью Unsloth: оптимизация для данных, скорости и стоимости

Оптимизируйте свою модель LLAMA-3.1 с помощью эффективных методов тонкой настройки от Unsloth. Узнайте, как использовать LoRA и QLoRA для более быстрого обучения, меньших требований к VRAM и улучшенной производительности модели. Изучите влияние гиперпараметров на вашу модель с тонкой настройкой. Исследуйте пользовательский интерфейс чата Unsloth для бесшовного взаимодействия с вашими пользовательскими LLM.

24 февраля 2025 г.

party-gif

Раскройте силу точной настройки с LLAMA-3.1, самым простым способом адаптировать языковые модели к вашим конкретным потребностям. Узнайте, как эффективно обучать свою собственную модель LLAMA-3.1 с использованием передовых методик Unsloth, включая LoRa и QLoRa, чтобы достичь впечатляющих результатов с минимальными ресурсами GPU. Этот блог-пост предоставляет пошаговое руководство, чтобы помочь вам максимально использовать потенциал ваших данных и создать адаптированную языковую модель, отвечающую вашим уникальным требованиям.

Различные этапы обучения: предварительное обучение, контролируемая тонкая настройка и согласование предпочтений

Для крупных языковых моделей обычно выделяют три основных этапа обучения:

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

  2. Контролируемая доводка: Чтобы сделать базовую модель более полезной, второй этап - это контролируемая доводка. На этом этапе модель обучается на парах вопрос-ответ или инструкция-ответ. Входные данные - это вопрос или инструкция, а выходные данные - желаемый ответ. Этот этап позволяет модели приобрести специфические для задачи знания и возможности.

  3. Согласование предпочтений: Необязательный третий этап - это согласование предпочтений, где модель обучается понимать, что предпочитает пользователь в плане ответов, или приводится в соответствие с определенными принципами. Это часто делается с использованием таких методик, как обучение с подкреплением на основе обратной связи от человека (RLHF) или оптимизация политики дебатов (DPO).

Цель этого видео - сосредоточиться на этапе контролируемой доводки, в частности, на том, как доводить модель Llama 3.1 с помощью библиотеки Unsloth. В видео будут рассмотрены различные методы доводки, такие как полная доводка, LoRA и QLoRA, и обсуждаться компромиссы между ними с точки зрения производительности и требований к памяти.

Методы контролируемой тонкой настройки: полная тонкая настройка, LoRA и QLoRA

Существует три популярных варианта контролируемой доводки:

  1. Полная доводка: В этом подходе вы берете исходную модель и обновляете веса с помощью набора данных для доводки по инструкциям. Это даст вам лучшую производительность, но требования к VRAM будут высокими.

  2. LoRA (Low-Rank Adaptation): Вместо прямого обновления весов вы добавляете внешние адаптеры к модели. Количество параметров в этих внешних адаптерах можно контролировать. Обновления весов для этих адаптеров выполняются с точностью 16 бит, а затем объединяются обратно в исходные веса модели. Этот подход обеспечивает быструю тренировку, но все еще дорогостоящий из-за операций с 16-битной точностью.

  3. QLoRA (Quantized LoRA): Это похоже на LoRA, но обновления весов выполняются с точностью 4 бита, и веса модели также хранятся в 4-битном формате. Это требует меньше VRAM, но производительность может быть не такой высокой, как у LoRA или полной доводки.

Настройка LoRA-адаптеров: ранг, LoRA-альфа и LoRA-выпадение

Для настройки адаптеров LoRA есть несколько ключевых параметров, которые нужно учитывать:

  1. Ранг: Ранг адаптеров LoRA контролирует количество параметров, которые будут обновляться во время доводки. Более низкий ранг означает меньше параметров, что снижает требования к VRAM, но также может ограничить способность модели адаптироваться. Наоборот, более высокий ранг позволяет большую гибкость, но требует больше VRAM.

  2. Альфа LoRA: Этот параметр контролирует вклад адаптеров LoRA в окончательные веса модели. Более высокое значение альфа LoRA означает, что адаптеры LoRA будут оказывать более сильное влияние, в то время как более низкое значение означает более слабое влияние.

  3. Отсев LoRA: Этот параметр контролирует коэффициент отсева, применяемый к адаптерам LoRA во время обучения. Увеличение коэффициента отсева может помочь предотвратить переобучение, но также может снизить производительность модели.

Подготовка данных: шаблон подсказки и токен конца последовательности

Чтобы подготовить данные для доводки, нам нужно настроить шаблон подсказки и указать токен конца последовательности.

Шаблон подсказки имеет решающее значение, так как он определяет формат входных данных, на которых будет обучаться модель. Для семейства Llama 3.1 мы будем использовать шаблон подсказки Alpaca, который включает инструкцию и ввод, предоставляющий дополнительный контекст. Ожидается, что модель сгенерирует соответствующий ответ.

# Шаблон подсказки Alpaca
prompt_template = "Ниже приведена инструкция, описывающая задачу, в сочетании с вводом, который предоставляет дополнительный контекст. Ответьте соответствующим выходом.\n\nИнструкция: {instruction}\nВвод: {input}\nВыход:"

Кроме того, нам нужно указать токен конца последовательности, чтобы предотвратить бесконечную генерацию текста моделью. Это важный шаг, с которым многие сталкивались при использовании квантованных версий моделей с LamaCPP.

# Установить токен конца последовательности
end_token = "</s>"

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

Обучение модели с помощью тренера SFT

Для обучения модели мы будем использовать тренировщик SFT (Supervised Fine-Tuning) из пакета TRL, созданного и поддерживаемого Hugging Face.

Первым делом мы предоставляем нашу модель, токенизатор и набор данных тренировщику SFT. В данном случае мы используем столбец text из набора данных, так как мы настроили наш шаблон подсказки на использование этого поля.

Мы также устанавливаем максимальную длину последовательности, которая должна основываться на примерах в ваших тренировочных данных. Имейте в виду, что более высокая длина последовательности увеличит требования к VRAM.

Затем мы настраиваем аргументы обучения, такие как устройство (в данном случае T4 GPU на Google Colab с около 15 ГБ VRAM) и количество шагов обучения.

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

Обучение заняло около 8 минут, а пиковая зарезервированная память составила около 8 ГБ, что составляет около 53% доступного VRAM на GPU T4. Это демонстрирует эффективность подхода Unsloth, который позволяет проводить доводку с относительно низкими требованиями к VRAM.

Вывод и потоковая передача

Для выполнения вывода мы можем использовать класс или метод for_inference класса FastLanguageModel. Нам нужно предоставить обученную модель и входную подсказку в формате Alpaca. Мы также можем установить максимальное количество генерируемых токенов.

# Выполнить вывод
input_prompt = alpaca_prompt(instruction, input)
output = model.for_inference(input_prompt, max_new_tokens=256)
print(output)

Чтобы включить потоковую передачу, мы можем создать объект Streamer и передать его в метод for_inference. Это будет отображать ответы по одному токену за раз.

# Включить потоковую передачу
streamer = Streamer()
output = model.for_inference(input_prompt, max_new_tokens=256, streamer=streamer)

С этим вы теперь можете выполнять вывод на своей доведенной модели и даже включать потоковую передачу для более интерактивного опыта.

Сохранение, загрузка и тонкая настройка моделей

Чтобы сохранить доведенную модель и токенизатор, вы можете использовать функцию save_pretrained() на модели и токенизаторе:

model.save_pretrained("path/to/save/model")
tokenizer.save_pretrained("path/to/save/tokenizer")

Это сохранит веса модели и токенизатор в указанные каталоги в виде набора JSON-файлов.

Чтобы загрузить сохраненную модель и токенизатор, вы можете использовать тот же класс FastLanguageModel и указать локальные каталоги:

model = FastLanguageModel.from_pretrained("path/to/save/model")
tokenizer = FastLanguageModel.from_pretrained("path/to/save/tokenizer")

Это загрузит модель и токенизатор из сохраненных файлов.

Еще одна отличная функция Unsloth - возможность сохранять модели в разных форматах, таких как 16-битная плавающая точка для VLLM или непосредственно в формате GGUF для LamaCPP. Это позволяет легко развертывать и интегрировать модели в различные платформы и фреймворки.

Unsloth также представляет новый пользовательский интерфейс на основе Gradio, который позволяет запускать модели, обученные с помощью Unsloth, и участвовать в интерактивных сеансах чата. Вы можете клонировать репозиторий Unsloth Studio и запустить предоставленный блокнот Colab, чтобы испытать эту функцию.

Новый чат-интерфейс Unsloth

Unsloth представил новый чат-интерфейс на основе библиотеки Radish, который позволяет легко взаимодействовать с языковыми моделями, обученными с помощью Unsloth. Этот чат-интерфейс предоставляет удобный интерфейс для общения с моделями и исследования их возможностей.

Чтобы использовать чат-интерфейс, вы можете клонировать репозиторий Unsloth Studio и запустить предоставленный блокнот Google Colab. Это настроит необходимую среду и запустит чат-интерфейс, где вы сможете начать общение с языковой моделью.

Чат-интерфейс Unsloth поддерживает функции, такие как потоковая передача ответов, позволяющая вам видеть вывод модели по мере его генерации. Это может быть полезно для наблюдения за процессом мышления модели и тем, как она генерирует ответы.

Кроме того, чат-интерфейс Unsloth позволяет сохранять и загружать ваши доведенные модели, что упрощает продолжение работы с вашими настроенными языковыми моделями. Вы также можете экспортировать ваши модели в различных форматах, таких как 16-битная плавающая точка для VLLM или формат GGUF для LamaCPP, что обеспечивает гибкость в использовании и развертывании ваших моделей.

В целом, новый чат-интерфейс Unsloth является ценным инструментом для взаимодействия и исследования возможностей языковых моделей, обученных с помощью фреймворка Unsloth.

Часто задаваемые вопросы