Перейти к содержанию
Публикация AiManual

RLHF для 20B LLM на одной GPU 24 ГБ: PEFT, 8-битная квантизация и LoRA-адаптеры

Как выполнить RLHF для 20B-параметрической LLM на GPU с 24 ГБ памяти: комбинация PEFT, 8-битной квантизации и LoRA-адаптеров с disable_adapters. Практический ко

Коротко

Что будет в материале

  1. 01

    Проблема: RLHF для больших моделей требует огромных ресурсов

  2. 02

    Ключевые техники: PEFT, 8-битная квантизация и LoRA

  3. 03

    Архитектура решения: как уместить RLHF в 24 ГБ

  4. 04

    Практический конвейер: от IMDB до сентимент-финтюнинга с RL

RLHF для 20B-параметрической модели на одной видеокарте с 24 ГБ памяти - решаемая задача. Комбинация PEFT, 8-битной квантизации и LoRA-адаптеров с контекстным менеджером disable_adapters позволяет провести полный цикл обучения с подкреплением на основе обратной связи от человека без дублирования весов и без аренды кластера. В этой статье разобран практический конвейер: от загрузки модели в 8-битном режиме до сентимент-финтюнинга с PPO на датасете IMDB.

Подход опирается на три техники. PEFT сокращает число обучаемых параметров до долей процента от общего объёма. 8-битная квантизация уменьшает память под веса примерно вдвое. LoRA добавляет низкоранговые матрицы, которые обучаются вместо полных весов. Вместе они снижают требования к VRAM с сотен гигабайт до потребительского уровня.

Проблема: RLHF для больших моделей требует огромных ресурсов

RLHF традиционно считается дорогим этапом. Полноценный цикл включает загрузку активной модели, референсной модели, reward-модели и оптимизатора. Для 20B-параметрической LLM в полной точности только веса занимают около 40 ГБ. Добавьте градиенты, состояния оптимизатора и активации - получится 120–160 ГБ. Это уже уровень A100 80GB в количестве двух-четырёх штук.

Потребительские GPU вроде RTX 3090 или RTX 4090 имеют 24 ГБ. На первый взгляд, запустить RLHF на таком железе невозможно. Но если обучать не все параметры, а только адаптеры, и хранить базовую модель в 8-битном виде, требования к памяти падают радикально. Та же 20B-модель в 8-битном режиме занимает около 20 ГБ, а LoRA-адаптеры добавляют лишь десятки мегабайт.

Этот подход не заменяет полномасштабное обучение на кластерах, но открывает RLHF для прототипирования, исследовательских задач и команд с ограниченным бюджетом. Подробнее о базовых методах экономии памяти можно прочитать в разборе PEFT-методов для дообучения LLM.

Ключевые техники: PEFT, 8-битная квантизация и LoRA

PEFT (Parameter-Efficient Fine-Tuning) - семейство методов, при которых обучается малая доля параметров модели. Вместо обновления всех весов добавляются небольшие обучаемые модули. Это снижает затраты памяти на оптимизатор и градиенты, а также уменьшает размер чекпоинтов с десятков гигабайт до нескольких мегабайт.

8-битная квантизация - метод хранения весов в формате int8 вместо float16 или float32. Библиотека bitsandbytes реализует это через блочное квантование: веса разбиваются на блоки, для каждого блока вычисляется свой коэффициент масштабирования. Точность снижается незначительно, а память экономится в два раза по сравнению с float16.

LoRA (Low-Rank Adaptation) - конкретная реализация PEFT. К весовым матрицам линейных слоёв добавляются две низкоранговые матрицы A и B. Их произведение даёт поправку к исходным весам. Обучаются только A и B, а базовая модель остаётся замороженной. Ранг r обычно выбирают от 4 до 64. При r=16 и скрытой размерности 4096 число обучаемых параметров на слой составляет 16×4096×2 = 131 072 против 16,7 млн полных весов.

Эти техники дополняют друг друга. Квантизация уменьшает память под веса базовой модели. LoRA добавляет обучаемые параметры без раздувания модели. PEFT объединяет подход в единый фреймворк, который поддерживает загрузку 8-битной модели и добавление адаптеров поверх неё.

Архитектура решения: как уместить RLHF в 24 ГБ

Схема состоит из четырёх этапов. Первый - загрузка базовой модели в 8-битном режиме через bitsandbytes. Второй - добавление LoRA-адаптеров к целевым слоям, обычно это query и value проекции в attention. Третий - использование disable_adapters для расчёта логитов референсной модели. Четвёртый - обучение только адаптеров с помощью PPO.

Ключевая экономия достигается за счёт того, что активная и референсная модели разделяют одни и те же веса. В классическом RLHF нужно держать две копии модели: одну с обновляемыми параметрами, другую замороженную. При 20B параметров это удваивает память. С LoRA обе модели - это одна и та же базовая модель, а разница лишь в том, включены адаптеры или выключены.

Роль disable_adapters в расчёте логитов

В RLHF для расчёта KL-штрафа нужны логиты от активной модели (с адаптерами) и от референсной (без адаптеров). Вместо загрузки двух копий используется одна модель, а контекстный менеджер disable_adapters временно отключает LoRA-слои. Это позволяет получить логиты базовой модели без дублирования весов.

Пример кода:

import torch
from peft import PeftModel
from transformers import AutoModelForCausalLM, AutoTokenizer

model = AutoModelForCausalLM.from_pretrained(
    "model-20b",
    load_in_8bit=True,
    device_map="auto"
)
model = PeftModel.from_pretrained(model, "lora-adapter")

# Логиты активной модели (адаптеры включены)
with torch.no_grad():
    active_logits = model(input_ids).logits

# Логиты референсной модели (адаптеры отключены)
with model.disable_adapter():
    with torch.no_grad():
        reference_logits = model(input_ids).logits

Этот приём экономит 20 ГБ памяти, которые ушли бы на вторую копию модели. Без него RLHF на 24 ГБ был бы невозможен для 20B-модели.

Практический конвейер: от IMDB до сентимент-финтюнинга с RL

Полный пайплайн начинается с дообучения LoRA-адаптера на датасете IMDB для задачи сентимент-анализа. Это даёт модели базовое понимание тональности текста. Затем настраивается RLHF с reward-моделью, которая поощряет позитивные отзывы. Финальный этап - обучение с PPO.

Шаг 1: supervised fine-tuning адаптера. Загружается базовая 20B-модель в 8-битном режиме, добавляется LoRA с рангом 16, альфой 32 и dropout 0.05. Обучение идёт на 25 000 отзывах IMDB с learning rate 1e-4, batch size 4 и gradient accumulation steps 4. Задача - классификация тональности. После 3 эпох адаптер уверенно различает позитивные и негативные отзывы.

Шаг 2: настройка reward-модели. В простейшем случае reward - это вероятность позитивного класса от обученного адаптера. Для каждого сгенерированного текста модель оценивает, насколько он позитивен. Это значение используется как награда в RL.

Шаг 3: обучение с PPO. Активная модель генерирует ответы на промпты, reward-модель оценивает их, а PPO обновляет параметры LoRA-адаптеров. KL-штраф между активной и референсной моделью рассчитывается через disable_adapter. Гиперпараметры: learning rate 1.41e-5, PPO epochs 4, clip range 0.2, KL coefficient 0.05. На одной RTX 4090 полный цикл занимает несколько часов.

Результат: модель начинает генерировать более позитивные отзывы, сохраняя грамматическую связность. Это базовый пример, который легко адаптировать под другие reward-сигналы: полезность, безопасность, стиль.

Ограничения и пути масштабирования

Обучение на одной GPU медленнее, чем на мульти-GPU конфигурации. Причина - последовательная обработка батчей и отсутствие параллелизма. Для 20B-модели скорость составляет примерно 2–4 итерации в секунду на RTX 4090, что приемлемо для прототипа, но недостаточно для продакшена.

8-битная квантизация вносит небольшую потерю точности. В большинстве случаев она незначительна, но для задач с тонкими различиями в тональности или сложной логикой может проявиться. Если точность критична, стоит рассмотреть 4-битную квантизацию с NF4 или полный переход на float16 с offloading.

Масштабирование возможно в нескольких направлениях. Первое - использование нескольких GPU с распределением адаптеров: базовая модель остаётся на одной карте, а адаптеры разных рангов распределяются по другим. Второе - применение более агрессивной квантизации, например 4-bit, что освобождает память под больший batch size. Третье - offloading части слоёв в CPU RAM, хотя это снижает скорость.

Для тех, кто работает с ограниченным железом, полезны материалы по пресетам для локальных LLM на RTX 5060 Ti и оптимизации инференса на одном GPU. Они дают практические ориентиры по скорости и памяти.

Заключение: RLHF стал доступнее

Комбинация PEFT, 8-битной квантизации и LoRA с disable_adapters позволяет выполнять RLHF для 20B-моделей на одной GPU с 24 ГБ памяти. Экономия достигается за счёт трёх факторов: квантованные веса занимают вдвое меньше места, обучаются только низкоранговые адаптеры, а референсная модель не требует отдельной копии.

Практическая ценность для инди-разработчиков и исследователей очевидна: RLHF перестаёт быть привилегией команд с кластерами. Полный цикл от дообучения на IMDB до сентимент-финтюнинга с PPO воспроизводится на потребительском железе за несколько часов. Попробуйте запустить конвейер на своей задаче и адаптируйте reward-модель под нужный сигнал.

Подписаться на канал