PEFT documentation

IA3

You are viewing main version, which requires installation from source. If you'd like regular pip install, checkout the latest stable version (v0.21.0).
Hugging Face's logo
Join the Hugging Face community

and get access to the augmented documentation experience

to get started

IA3

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

IA3 introduces three vectors, lv, lk and lff to scale value, key and feed-forward activations (image source).

Infused Adapter by Inhibiting and Amplifying Inner Activations, or IA3, is a method that adds three learned vectors to rescale the keys and values of the self-attention and encoder-decoder attention layers, and the intermediate activation of the position-wise feed-forward network.

Аннотация из статьи:

Обучение с несколькими примерами в контексте (Few-shot in-context learning, ICL) позволяет предобученным языковым моделям выполнять ранее не встречавшуюся задачу без обучения на основе градиентов, передавая небольшое количество обучающих примеров в качестве части входных данных. ICL требует значительных вычислительных, энергетических и затрат на хранение, поскольку предполагает обработку всех обучающих примеров при каждом выполнении предсказания. Эффективное по параметрам дообучение (Parameter-efficient fine-tuning, PEFT) (например, адаптерные модули, prompt tuning, методы разреженного обновления и т. д.) предлагает альтернативный подход, при котором обучается небольшой набор параметров, чтобы модель могла выполнять новую задачу. В данной статье мы строго сравниваем few-shot ICL и PEFT и показываем, что второй вариант обеспечивает более высокую точность, а также значительно меньшие вычислительные затраты. По ходу работы мы представляем новый метод PEFT, названный (IA)^3, который масштабирует активации с помощью обучаемых векторов, достигая более высоких результатов при введении относительно небольшого количества новых параметров. Мы также предлагаем простой рецепт на основе модели T0, названный T-Few, который можно применять к новым задачам без настройки или модификаций, специфичных для конкретной задачи. Мы подтверждаем эффективность T-Few на полностью новых задачах, применив его к бенчмарку RAFT, впервые достигнув сверхчеловеческих результатов и превзойдя текущий уровень (state-of-the-art) на 6% в абсолютном выражении. Весь код, использованный в наших экспериментах, доступен публично.

To make fine-tuning more efficient, IA3 (Infused Adapter by Inhibiting and Amplifying Inner Activations) rescales inner activations with learned vectors. These learned vectors are injected in the attention and feedforward modules in a typical transformer-based architecture. These learned vectors are the only trainable parameters during fine-tuning, and thus the original weights remain frozen. Dealing with learned vectors (as opposed to learned low-rank updates to a weight matrix like LoRA) keeps the number of trainable parameters much smaller.

Похоже на LoRA, IA3 обладает многими преимуществами:

  • IA3 делает дообучение более эффективным, значительно сокращая количество обучаемых параметров. (Для T0 модель IA3 содержит лишь около 0,01% обучаемых параметров, тогда как даже у LoRA их больше 0,1%)
  • Исходные предобученные веса остаются замороженными, что позволяет создавать множество лёгких и переносимых моделей IA3 для различных задач, построенных на их основе.
  • Производительность моделей, дообученных с использованием IA3, сопоставима с производительностью полностью дообученных моделей.
  • IA3 не увеличивает задержку вывода, так как веса адаптера можно объединить с базовой моделью.

В принципе, IA3 можно применять к любому подмножеству матриц весов в нейронной сети для уменьшения количества обучаемых параметров. Согласно реализации авторов, веса IA3 добавляются к слоям key, value и feedforward в модели Transformer. Конкретно для моделей transformer веса IA3 добавляются к выходам слоёв key и value, а также ко входу второго feedforward-слоя в каждом блоке transformer.

Зная целевые слои для внедрения параметров IA3, количество обучаемых параметров можно определить на основе размеров матриц весов.

Использование

Для авторегрессионных моделей нацельтесь на k_proj, v_proj и down_proj — это слои, которые авторы признали наиболее эффективными. Установите feedforward_modules=["down_proj"], чтобы IA3 понимал, какие модули являются слоями прямой передачи, и мог применять правильное масштабирование.

Для задачи классификации последовательности конфигурацию IA3 для модели Llama можно инициализировать следующим образом:

from peft import IA3Config, TaskType, get_peft_model
from transformers import AutoModelForCausalLM

model = AutoModelForCausalLM.from_pretrained("HuggingFaceTB/SmolLM-135M")
peft_config = IA3Config(
    task_type=TaskType.CAUSAL_LM,
    target_modules=["k_proj", "v_proj", "down_proj"],
    feedforward_modules=["down_proj"],
)
model = get_peft_model(model, peft_config)
model.print_healthcheck()

Когда использовать IA3, а когда LoRA

IA3 особенно эффективна, когда вам нужны адаптеры минимального размера для развёртывания с ограниченным хранилищем или когда требуется быстрая сходимость при меньшем количестве обучаемых параметров. LoRA может быть предпочтительнее, если вам нужен более широкий набор вариантов LoRA (DoRA, QLoRA и т. д.) или если вы хотите использовать наиболее протестированный подход с обширной поддержкой сообщества.

Обзор бенчмарков

API

IA3Config

класс peft.IA3Config

< >

( task_type: Optional[Union[str, TaskType]] = Nonepeft_type: Optional[Union[str, PeftType]] = Noneauto_mapping: Optional[dict] = Nonepeft_version: Optional[str] = Nonebase_model_name_or_path: Optional[str] = Nonerevision: Optional[str] = Noneinference_mode: bool = Falsetarget_modules: Optional[Union[list[str], str]] = Noneexclude_modules: Optional[Union[list[str], str]] = Nonefeedforward_modules: Optional[Union[list[str], str]] = Nonefan_in_fan_out: bool = Falsemodules_to_save: Optional[list[str]] = Noneinit_ia3_weights: bool = True )

Параметры

  • target_modules (Optional[Union[List[str], str]]) — Имена модулей, к которым следует применить адаптер. Если это значение указано, будут заменены только модули с указанными именами. При передаче строки выполняется сопоставление по регулярному выражению. При передаче списка строк выполняется точное совпадение или проверяется, заканчивается ли имя модуля каким-либо из переданных строк. Если это значение указано как ‘all-linear’, выбираются все линейные/Conv1D модули, за исключением выходного слоя. Если это значение не указано, модули выбираются в соответствии с архитектурой модели. Если архитектура неизвестна, будет выброшена ошибка — в этом случае следует указать целевые модули вручную.
  • exclude_modules (Optional[Union[List[str], str]]) — Имена модулей, к которым не следует применять адаптер. При передаче строки выполняется сопоставление по регулярному выражению. При передаче списка строк выполняется точное совпадение или проверяется, заканчивается ли имя модуля каким-либо из переданных строк.
  • feedforward_modules (Optional[Union[List[str], str]]) — Имена модулей, которые следует рассматривать как модули прямого распространения, как в оригинальной статье. Для этих модулей векторы (IA)³ будут умножаться на вход, а не на выход. feedforward_modules должно быть именем или подмножеством имён, присутствующих в target_modules.
  • fan_in_fan_out (bool) — Установите это значение в True, если заменяемый слой хранит веса в формате (fan_in, fan_out). Например, gpt-2 использует Conv1D, который хранит веса в формате (fan_in, fan_out), поэтому это значение должно быть установлено в True.
  • modules_to_save (Optional[List[str]]) — Список модулей, помимо слоёв (IA)³, которые нужно сделать обучаемыми и сохранить в итоговом контрольном пункте.
  • init_ia3_weights (bool) — Определяет, следует ли инициализировать векторы в слоях (IA)³. По умолчанию True. Установка значения False не рекомендуется.

Это класс конфигурации для хранения конфигурации модели IA3Model.

IA3Model

класс peft.IA3Model

< >

( modelpeft_config: Union[PeftConfig, dict[str, PeftConfig]]adapter_name: strlow_cpu_mem_usage: bool = Falsestate_dict: Optional[dict[str, torch.Tensor]] = None ) → torch.nn.Module

Параметры

  • model (PreTrainedModel) — Модель, подлежащая адаптации.
  • config (IA3Config) — конфигурация модели (IA)^3.
  • adapter_name (str) — имя адаптера, по умолчанию "default".
  • low_cpu_mem_usage (bool, optional, по умолчанию False) — Создаёт пустые веса адаптера на meta-устройстве. Полезно для ускорения процесса загрузки.

Возвращает

torch.nn.Module

Модель (IA)^3.

Создаёт модель Infused Adapter by Inhibiting and Amplifying Inner Activations ((IA)^3) на основе предобученной модели transformers. Метод подробно описан в https://huggingface.co/papers/2205.05638

Пример:

>>> from transformers import AutoModelForSeq2SeqLM
>>> from peft import IA3Config, get_peft_model

>>> config = IA3Config(
...     peft_type="IA3",
...     task_type="SEQ_2_SEQ_LM",
...     target_modules=["k", "v", "w0"],
...     feedforward_modules=["w0"],
... )

>>> model = AutoModelForSeq2SeqLM.from_pretrained("t5-base")
>>> ia3_model = get_peft_model(model, config)

Атрибуты:

  • model (PreTrainedModel) — Модель, подлежащая адаптации.
  • peft_config (IA3Config): конфигурация модели (IA)^3.

add_weighted_adapter

< >

( adapters: list[str]weights: list[float]adapter_name: str )

Параметры

  • adapters (list) — Список имён адаптеров, которые будут объединены.
  • weights (list) — Список весов для каждого адаптера.
  • adapter_name (str) — Имя нового адаптера.

Этот метод добавляет новый адаптер, объединяя указанные адаптеры с заданными весами.

Update on GitHub