PEFT documentation
MiSS
MiSS
MiSS (Matrix Shard Sharing) — это метод PEFT, обеспечивающий хороший баланс между производительностью модели и вычислительной эффективностью. Он требует лишь одной обучаемой матрицы и вводит механизм разделения на фрагменты (shard-sharing), отличный от LoRA.
Аннотация из статьи:
Методы параметрически эффективной дообучения (PEFT), в частности Low-Rank Adaptation (LoRA), эффективно сокращают количество обучаемых параметров в больших языковых моделях (LLM). Однако по мере дальнейшего роста масштабов моделей потребность в вычислительных ресурсах остаётся серьёзной проблемой. Существующие варианты LoRA часто не позволяют найти оптимальный баланс между адаптивностью (качеством модели и скоростью сходимости) и эффективностью (вычислительными накладными расходами, использованием памяти и временем инициализации). В данной статье представлен MiSS (Matrix Shard Sharing) — новый подход PEFT, который решает эту дилемму с помощью простого механизма общего использования фрагментов (shards). MiSS использует наблюдение о том, что низко-ранговая адаптация может быть достигнута путём разложения матрицы весов на несколько фрагментных матриц и использования общей обучаемой фрагментной матрицы. Данный метод строит матрицу низко-рангового обновления путём дублирования этих общих, разбитых на части фрагментов. Мы также предлагаем аппаратно-эффективную и широко применимую реализацию MiSS. Обширные эксперименты, проведённые на широком спектре задач, а также систематический анализ вычислительной производительности демонстрируют превосходство MiSS. Результаты показывают, что MiSS значительно превосходит стандартный LoRA и его популярные варианты как по метрикам качества модели, так и по вычислительной эффективности, включая скорость инициализации и пропускную способность обучения. Эффективно балансируя выразительную способность и использование ресурсов, MiSS предлагает убедительное решение для эффективной адаптации моделей большого масштаба.
Обзор бенчмарков
Когда использовать MiSS
MiSS — хороший выбор, когда:
- Вы хотите более быструю инициализацию и более высокую пропускную способность обучения, чем у продвинутых схем инициализации LoRA, использующих сложные конфигурации (такие как PiSSA, LoRA-GA или OLoRA).
- Вы ищете готовую замену LoRA с минимальными изменениями конфигурации.
Если вам нужна более высокая выразительность ценой некоторой потери эффективности, рассмотрите вариант инициализации bat (см. ниже).
режимы init_weights
MiSS поддерживает три режима инициализации с помощью параметра init_weights:
True(по умолчанию): стандартная инициализация MiSS. Оптимальная отправная точка для большинства сценариев использования."bat": Включает нелинейные обновления между различными шардами. Даёт лучшие результаты, чем стандартный MiSS, но потребляет больше памяти и работает примерно в два раза медленнее. Используйте этот вариант, когда приоритетом является производительность, а не эффективность."mini": Использует меньший ранг вдоль измеренияout_features, управляемый параметромmini_r. Это дополнительно уменьшает количество обучаемых параметров. При использовании этого режима необходимо задатьmini_r, аout_featuresдолжно делиться нацело наmini_r.
Быстрый старт
import torch
from peft import MissConfig, get_peft_model
from transformers import AutoModelForCausalLM, AutoTokenizer
model = AutoModelForCausalLM.from_pretrained(
"meta-llama/Llama-2-7b-hf",
torch_dtype=torch.bfloat16,
device_map="auto"
)
tokenizer = AutoTokenizer.from_pretrained("meta-llama/Llama-2-7b-hf")
tokenizer.pad_token_id = tokenizer.eos_token_id
# Standard MiSS
config = MissConfig(
r=64,
miss_dropout=0.01,
task_type="CAUSAL_LM"
)
# BAT variant — better performance, more memory
# config = MissConfig(
# r=64,
# init_weights="bat",
# task_type="CAUSAL_LM"
# )
# Mini variant — fewer trainable parameters
# config = MissConfig(
# r=64,
# init_weights="mini",
# mini_r=8,
# task_type="CAUSAL_LM"
# )
model = get_peft_model(model, config)
model.print_healthcheck()Полный пример дообучения, включающий обучение и вывод, см. в примере дообучения MiSS.
API
MissConfig
класс peft.MissConfig
< source >( 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 = Falser: int = 64miss_dropout: float = 0.0mini_r: int = 1target_modules: Optional[Union[list[str], str]] = Noneexclude_modules: Optional[Union[list[str], str]] = Noneinit_weights: bool | Literal['bat', 'mini'] = Truelayers_to_transform: Optional[Union[list[int], int]] = Nonelayers_pattern: Optional[str] = Nonebias: str = 'none'modules_to_save: Optional[list[str]] = None )
Параметры
- r (
int) — Ранг MiSS для разных слоёв. Лучше всего устанавливать ‘r’ в чётное число; в противном случае метод инициализации по умолчанию не будет работать. Ранг MiSS соответствует разложению низкого ранга вдоль измерения in_features. - miss_dropout (
float) — Вероятность dropout для слоёв MiSS. - mini_r (
int) — Ранг MiSS соответствует разложению низкого ранга вдоль измерения out_features. При установкеinit_weights=miniнеобходимо задатьmini_r. Убедитесь, чтоout_featuresделится нацело наmini_r. - target_modules (
Optional[Union[List[str], str]]) — Имена модулей, к которым следует применить адаптер. Если это значение указано, будут заменены только модули с указанными именами. При передаче строки выполняется сопоставление по регулярному выражению. При передаче списка строк выполняется точное совпадение или проверяется, заканчивается ли имя модуля каким-либо из переданных строк. Если это значение указано как ‘all-linear’, выбираются все линейные модули, за исключением выходного слоя. Если это значение не указано, модули выбираются в соответствии с архитектурой модели. Если архитектура неизвестна, будет выброшена ошибка — в этом случае следует указать целевые модули вручную. - exclude_modules (
Optional[Union[List[str], str]]) — Имена модулей, к которым не следует применять адаптер. При передаче строки выполняется сопоставление по регулярному выражению. При передаче списка строк выполняется точное совпадение или проверяется, заканчивается ли имя модуля каким-либо из переданных строк. - init_weights (bool | Literal[“bat”, “mini”]) —
Различные варианты инициализации соответствуют различным вариантам MiSS. По умолчанию (balance) используется наиболее эффективный и универсальный метод в MiSS. ‘bat’: в этом режиме можно включить нелинейные обновления между различными шардами. ‘mini’: в этом режиме можно задать меньший ранг, чтобы использовать меньше обучаемых параметров, но рекомендуется сохранять
out_features % mini_r == 0. - layers_to_transform (
Union[List[int], int]) — Индексы слоёв, подлежащих трансформации. Если передан список целых чисел, адаптер будет применён к слоям с индексами, указанными в этом списке. Если передано одно целое число, трансформации будут применены к слою с этим индексом. - layers_pattern (
str) — Имя шаблона слоя, используется только в том случае, еслиlayers_to_transformотличается отNone. - bias (
str) — Тип смещения для MiSS. Может быть'none','all'или'MiSS_only'. - modules_to_save (
List[str]) — Список модулей, помимо адаптерных слоёв, которые нужно сделать обучаемыми и сохранить в итоговой контрольной точке.
Это класс конфигурации для хранения конфигурации модели MissModel.
MissModel
класс peft.MissModel
< source >( 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 (
torch.nn.Module) — Модель, к которой будут прикреплены слои адаптивного тюнера. - config (MissConfig) — конфигурация модели MiSS.
- adapter_name (
str) — имя адаптера, по умолчанию"default". - low_cpu_mem_usage (
bool,optional, по умолчаниюFalse) — Создаёт пустые веса адаптера на meta-устройстве. Полезно для ускорения процесса загрузки.
Возвращает
torch.nn.Module
Модель MiSS.
Создаёт модель Matrix Shard Sharing (MiSS) на основе предобученной модели. Метод описан в https://huggingface.co/papers/2409.15371
Пример:
>>> from transformers import AutoModelForCausalLM
>>> from peft import MissConfig, get_peft_model
>>> base_model = AutoModelForCausalLM.from_pretrained("facebook/opt-125m")
>>> config = MissConfig(r=64)
>>> model = get_peft_model(base_model, config)Атрибуты:
- model (
~torch.nn.Module) — Модель, подлежащая адаптации. - peft_config (MissConfig): конфигурация модели MiSS.