PEFT documentation
Быстрый тур
Быстрый тур
PEFT предлагает параметрически эффективные методы дообучения крупных предобученных моделей. Традиционный подход предполагает дообучение всех параметров модели для каждой конкретной задачи, однако из-за огромного количества параметров в современных моделях это становится чрезвычайно затратным и непрактичным. Вместо этого более эффективно обучать меньшее количество параметров промптов или использовать методы репараметризации, такие как адаптация низкого ранга (LoRA), чтобы сократить число обучаемых параметров.

В этом быстром туре вы познакомитесь с основными возможностями PEFT и узнаете, как обучать модели или выполнять инференс на больших моделях, которые обычно недоступны на потребительских устройствах.
Конфигурация PEFT и модель
Для любого метода PEFT необходимо создать конфигурацию, содержащую все параметры, определяющие способ применения метода PEFT, в первую очередь — какие слои существующей модели следует выбрать для обучения. После настройки конфигурации передайте её вместе с базовой моделью в функцию get_peft_model(), чтобы создать обучаемую модель PeftModel.
Возьмём LoRA в качестве примера, но обсудим только общие параметры — возможно, вы захотите использовать один из многих других методов PEFT. Обычно конфигурация включает в себя следующее:
target_modules: какие модули базовой модели адаптироватьtask_type(по умолчанию:None, см. доступныеTaskType): тип обучаемой задачи; если указан, может помочь автоматически сохранить соответствующие слои вместе с весами адаптера или предупредить о несовместимостяхinference_mode(по умолчанию:False): используется ли модель для инференса
В зависимости от выбранного вами метода PEFT вы добавляете специфические параметры, которые, например, определяют размер матриц обновления. Вот пример конфигурации, которую вы можете встретить на практике:
from peft import LoraConfig, TaskType
peft_config = LoraConfig(target_modules=["q_proj"], task_type=TaskType.CAUSAL_LM, inference_mode=False, r=8, lora_alpha=32, lora_dropout=0.1)См. руководство по конфигурации, чтобы узнать больше о том, как работает конфигурация PEFT под капотом.
После настройки LoraConfig создайте PeftModel с помощью функции get_peft_model(). Она принимает базовую модель — которую можно (но не обязательно) загрузить из библиотеки Transformers — и LoraConfig, содержащий параметры для настройки модели под обучение с использованием LoRA.
Загрузите базовую модель, которую вы хотите дообучить.
from transformers import AutoModelForCausalLM
model = AutoModelForCausalLM.from_pretrained("meta-llama/Llama-3.2-1B")Теперь оберните базовую модель и peft_config функцией get_peft_model(), чтобы создать PeftModel.
Wrapping означает, что PEFT заменяет целевые слои (здесь: все слои q_proj) на слой, специфичный для адаптера и соответствующий типу целевого слоя. Поскольку мы работаем с линейными слоями, в данном случае это будет слой lora.Linear. Обратите внимание, что эти изменения выполняются in-place для экономии памяти, поэтому ваша базовая модель теперь изменена.
Обратите внимание, что мы указали только q_proj, но на самом деле мы нацеливаемся на все слои model.layers[:].self_attn.q_proj. Это происходит потому, что PEFT по умолчанию ищет совпадающие суффиксы. Передайте строку с регулярным выражением, если вы хотите нацелиться на более сложные паттерны слоёв.


Слой базовой модели будет обернут, сохранен и не будет обучаться, в то время как добавляются и комбинируются новые обучаемые веса. То, как эти новые веса структурированы и комбинируются с весами базовой модели, во многом определяет различия между методами PEFT.
Перед началом обучения выполните проверку состояния, чтобы подтвердить состояние адаптера и проверить количество обучаемых параметров.
from peft import get_peft_model, LoraConfig
peft_config = LoraConfig() # or your other PEFT method of choice
peft_model = get_peft_model(model, peft_config)
peft_model.print_healthcheck()Healthcheck включает долю обучаемых параметров наряду с состоянием адаптера, конфигурацией модели и окружением.
Выполнить проверку состояния
Используйте print_healthcheck(), чтобы выявить подозрительные состояния, такие как объединённые или несовместимые адаптеры, и создать краткий отчёт для сообщения об ошибке.
peft_model.print_healthcheck()
Это должно выглядеть примерно так:
PEFT healthcheck
Model:
ID: meta-llama/Llama-3.2-1B, type: LlamaForCausalLM, adapters: default (LORA)
Environment:
peft: 0.21.0, transformers: 5.18.0.dev0, torch: 2.14.0+cu130, Python: 3.13.9
Runtime:
training: True, devices: cpu, dtypes: bfloat16=1,235,814,400, float32=851,968, gradient checkpointing: False
Parameters:
trainable: 851,968, total: 1,236,666,368, percent trainable: 0.0689%, adapter layers: 32
State:
adapter is enabled: True, active: default, merged: none
Layer types:
default:
lora.Linear=32Вывод команды print может меняться, поэтому не пытайтесь его парсить. Для программного использования вместо этого вызывайте healthcheck(), который возвращает ту же информацию в виде словаря, сериализуемого в JSON.
Всё готово 🎉! Теперь вы можете обучать модель с помощью Trainer из Transformers, Accelerate или любого пользовательского цикла обучения PyTorch.
Например, для обучения с использованием класса Trainer настройте класс TrainingArguments с некоторыми гиперпараметрами обучения.
training_args = TrainingArguments(
output_dir="your-name/meta-llama/my-llama3.2-adapter",
learning_rate=1e-3,
per_device_train_batch_size=32,
per_device_eval_batch_size=32,
num_train_epochs=2,
weight_decay=0.01,
eval_strategy="epoch",
save_strategy="epoch",
load_best_model_at_end=True,
)Передайте в Trainer модель, аргументы обучения, набор данных, токенизатор и любые другие необходимые компоненты, затем вызовите train, чтобы запустить обучение.
trainer = Trainer(
model=peft_model,
args=training_args,
train_dataset=tokenized_datasets["train"],
eval_dataset=tokenized_datasets["test"],
data_collator=data_collator,
compute_metrics=compute_metrics,
)
trainer.train()Сохранить модель
После завершения обучения модели вы можете сохранить её в каталог с помощью функции save_pretrained().
peft_model.save_pretrained("output_dir")You can also save your model to the Hub (make sure you’re logged in to your Hugging Face account first) with the push_to_hub function.
from huggingface_hub import notebook_login
notebook_login()
peft_model.push_to_hub("your-name/my-llama3.2-adapter")Оба метода сохраняют только дополнительные веса PEFT, которые были обучены, что делает их хранение, передачу и загрузку чрезвычайно эффективными. Например, модель facebook/opt-350m, обученная с помощью LoRA, содержит всего два файла: adapter_config.json и adapter_model.safetensors. Файл adapter_model.safetensors занимает всего 6,3 МБ!
Вывод
См. справочник по API AutoPeftModel для полного списка доступных классов
AutoPeftModel.
Легко загрузите любую модель, обученную с PEFT, для инференса с помощью класса AutoPeftModel и метода from_pretrained:
from peft import AutoPeftModelForCausalLM
from transformers import AutoTokenizer
import torch
device = torch.accelerator.current_accelerator().type if hasattr(torch, "accelerator") else "cuda"
peft_model = AutoPeftModelForCausalLM.from_pretrained("ybelkada/opt-350m-lora")
tokenizer = AutoTokenizer.from_pretrained("facebook/opt-350m")
peft_model = peft_model.to(device)
peft_model.eval()
inputs = tokenizer("Preheat the oven to 350 degrees and place the cookie dough", return_tensors="pt")
outputs = peft_model.generate(input_ids=inputs["input_ids"].to(peft_model.device), max_new_tokens=50)
print(tokenizer.batch_decode(outputs.detach().cpu().numpy(), skip_special_tokens=True)[0])
"Preheat the oven to 350 degrees and place the cookie dough in the center of the oven. In a large bowl, combine the flour, baking powder, baking soda, salt, and cinnamon. In a separate bowl, combine the egg yolks, sugar, and vanilla."Для других задач, которые не поддерживаются явно с помощью класса AutoPeftModelFor — например, автоматического распознавания речи, — вы всё равно можете использовать базовый класс AutoPeftModel для загрузки модели под нужную задачу.
from peft import AutoPeftModel
peft_model = AutoPeftModel.from_pretrained("smangrul/openai-whisper-large-v2-LORA-colab")Самый универсальный способ загрузки обученного адаптера PEFT в модель — использовать from_pretrained():
from transformers import AutoPeftModelForCausalLM
from peft import PeftModel
base_model = AutoModelForCausalLM.from_pretrained("meta-llama/llama3.2-1B")
peft_model = PeftModel.from_pretrained(base_model, "my-user/my-llama-adapter") # you can also pass a directory instead of a hub pathНесколько адаптеров
PEFT поддерживает установку нескольких адаптеров (одного и того же типа, в данном документе это LoRA) поверх базовой модели. При вызове get_peft_model существует только один адаптер с именем "default", но вы можете добавить любое количество дополнительных адаптеров, вызвав peft_model.add_adapter(adapter_name=...).
Это работает, потому что обёрнутый слой действительно имеет уникальный набор обучаемых весов для каждого имени адаптера. Не каждый адаптер активен и обучаем по умолчанию. Вы должны явно активировать адаптеры по имени, прежде чем они станут активными. Это позволяет быстро переключаться между адаптерами, когда требуются знания, специфичные для задачи, или обслуживать различные сценарии использования поверх одной модели.

Просто не забудьте сначала вызвать peft_model.set_adapter(<adapter_name>), чтобы включить адаптер.
Быстрый пример:
peft_model.add_adapter(adapter_name='new_adapter')
peft_model.set_adapter('new_adapter')Дальнейшие шаги
Теперь, когда вы узнали, как обучать модель с помощью одного из методов PEFT, мы рекомендуем вам попробовать и другие методы, например prompt tuning. Шаги очень похожи на те, что показаны в quicktour:
- подготовьте PeftConfig для метода PEFT, например LoraConfig или другой конфиг (см. обзор методов)
- используйте метод get_peft_model() для создания PeftModel на основе конфигурации и базовой модели
Затем вы можете обучать его любым удобным для вас способом! Чтобы загрузить модель PEFT для инференса, вы можете использовать класс AutoPeftModel.
Вы также можете ознакомиться с руководствами по задачам, если вас интересует обучение модели с использованием другого метода PEFT для конкретной задачи, такой как семантическая сегментация, многоязычное автоматическое распознавание речи, DreamBooth, классификация токенов и другие.
Update on GitHub