Этот репо содержит исходный код пакета Python loralib
и несколько примеров того, как интегрировать его с моделями Pytorch, например, в обнимании лица. Мы только поддерживаем Pytorch. Смотрите нашу статью для подробного описания Лоры.
Лора: адаптация с низким уровнем моделей крупных языков
Эдвард Дж. Ху*, Йелонг Шен*, Филипп Уоллис, Зейуан Аллен-чжу, Юаньжи Ли, Шин Ван, Лу Ван, Вейху Чен
Бумага: https://arxiv.org/abs/2106.09685
Объяснитель видео: https://www.youtube.com/watch?v=dhrotonCyze
ОБНОВЛЕНИЕ 2/2023: LORA теперь поддерживается современной библиотекой точной настройки (PEFT), обнимая лицо.
Лора уменьшает количество обучаемых параметров, изучая пары матриц по сбору рангов, замораживая исходные веса. Это значительно уменьшает требования хранения для крупных языковых моделей, адаптированных к конкретным задачам и позволяет эффективно переключение задач во время развертывания без введения задержки вывода. Лора также превосходит несколько других методов адаптации, включая адаптер, настройку префикса и тонкую настройку.
Мы получаем результат сопоставимым или превосходящим полную производительность на клеевом эталоне с использованием базы Roberta (Liu et al., 2019), а также Lagry и Deberta (He et al., 2020) XXL 1,5b, в то время как тренировка и хранение фракции параметров Полем Нажмите на номера ниже, чтобы загрузить контрольные точки Роберты и Деберта Лора.
Роберта База Тонкая настройка | Роберта База Лора | Деберта XXL Тонкая настройка | Деберта XXL Лора | ||
---|---|---|---|---|---|
# обучаемых параметров. | 125 м | 0,8 м | 1,5B | 4,7 м | |
Mnli (m-acc/mm-acc) | 87.6 | 87,5 ± .3/86,9 ± .3 | 91,7/ 91,9 | 91,9 ± .1/ 91,9 ± .2 | |
SST2 (ACC) | 94,8 | 95,1 ± .2 | 97.2 | 96,9 ± .2 | |
MRPC (ACC) | 90.2 | 89,7 ± 0,7 | 92.0 | 92,6 ± .6 | |
Кола (Корр Мэтью) | 63,6 | 63,4 ± 1,2 | 72,0 | 72,4 ± 1,1 | |
Qnli (acc) | 92,8 | 93,3 ± .3 | 96.0 | 96,0 ± .1 | |
QQP (ACC) | 91.9 | 90,8 ± .1 | 92.7 | 92,9 ± .1 | |
RTE (ACC) | 78.7 | 86,6 ± .7 | 93,9 | 94,9 ± .4 | |
STSB (Pearson/Spearman Corr) | 91.2 | 91,5 ± .2/ 91,3 ± .2 | 92.9 /92.6 | 93,0 ± .2/ 92,9 ± .3 | |
Средний | 86.40 | 87.24 | 91.06 | 91.32 |
Примечание. Вам все еще нужна оригинальная предварительно обученная контрольная точка от обнимающего лица, чтобы использовать контрольные точки Lora.
Точные настройки взяты из Liu et al. (2019) и он и др. (2020). Мы включаем доверительные интервалы на результаты наших экспериментов. Пожалуйста, следуйте инструкциям в examples/NLU/
чтобы воспроизвести наши результаты.
На GPT-2 Лора выгодно сравнивается как с полным созданием, так и с другими эффективными методами настройки, такими как адаптер (Houlsby et al., 2019) и настройка префикса (Li and Liang, 2021). Мы оценили на e2e nlg Challenge, Dart и Webnlg:
Метод | # обучаемых параметров | E2e (bleu) | Дарт (Bleu) | Webnlg (bleu-u/s/a) | |
---|---|---|---|---|---|
GPT-2 M (тонкая настройка) | 354,92M | 68.2 | 46.0 | 30,4 / 63,2 /47,6 | |
GPT-2 M (адаптер) | 0,37 м | 66.3 | 42.4 | 45,1/54,5/50,2 | |
GPT-2 M (префикс) | 0,35 м | 69,7 | 45,7 | 44,1/63,1/54,4 | |
GPT-2 M (LORA) | 0,35 м | 70,4 ± .1 | 47,1 ± .2 | 46,7 ± .4/ 62,1 ± .2/ 55,3 ± .2 | |
GPT-2 L (тонкая настройка) | 774.03M | 68.5 | 46.5 | 41,7 / 64,6 /54,2 | |
GPT-2 L (адаптер) | 0,88 м | 69,1 ± .1 | 45,7 ± .1 | 49,8 ± .0/61,1 ± .0/56,0 ± .0 | |
GPT-2 L (префикс) | 0,77м | 70.3 | 46.5 | 47,0/64,2/56,4 | |
GPT-2 L (LORA) | 0,77м | 70,4 ± .1 | 47,5 ± .1 | 48,4 ± .3/ 64,0 ± .3/ 57,0 ± .1 |
Базовые линии не Лора, за исключением адаптера на GPT-2, взяты из Li и Liang (2021). Мы включаем доверительные интервалы на результаты наших экспериментов.
Загрузите контрольные точки GPT-2 LORA:
Пожалуйста, следуйте инструкциям в examples/NLG/
для воспроизведения нашего результата.
(Первоначальный выпуск этого репо был архив в филиале «Снимок-9-15-2021»)
В этом репо есть несколько каталогов:
loralib
, который необходимо установить для запуска приведенных нами примеров;loralib
в GPT-2, Roberta и Deberta v2 loralib
просто pip install loralib
# Alternatively
# pip install git+https://github.com/microsoft/LoRA
loralib
. Мы только поддерживаем nn.Linear
, nn.Embedding
и nn.Conv2d
на данный момент. Мы также поддерживаем MergedLinear
для случаев, когда один nn.Linear
представляет более одного уровня, например, в некоторых реализациях проекции внимания qkv
(см. Дополнительные примечания для большего). # ===== Before =====
# layer = nn.Linear(in_features, out_features)
# ===== After ======
import loralib as lora
# Add a pair of low-rank adaptation matrices with rank r=16
layer = lora . Linear ( in_features , out_features , r = 16 )
import loralib as lora
model = BigModel ()
# This sets requires_grad to False for all parameters without the string "lora_" in their names
lora . mark_only_lora_as_trainable ( model )
# Training loop
for batch in dataloader :
...
state_dict
, который содержит только параметры LORA. # ===== Before =====
# torch.save(model.state_dict(), checkpoint_path)
# ===== After =====
torch . save ( lora . lora_state_dict ( model ), checkpoint_path )
load_state_dict
обязательно установите strict=False
. # Load the pretrained checkpoint first
model . load_state_dict ( torch . load ( 'ckpt_pretrained.pt' ), strict = False )
# Then load the LoRA checkpoint
model . load_state_dict ( torch . load ( 'ckpt_lora.pt' ), strict = False )
Несмотря на то, что мы сосредотачиваемся на простой, но настройке эффекта, а именно адаптации только проекции q
и v
в трансформаторе, в наших примерах LORA может применяться к любым подмножеству предварительно обученных весов. Мы рекомендуем вам изучить различные конфигурации, такие как адаптация слоя встраивания путем замены nn.Embedding
lora.Embedding
и/или адаптации слоев MLP. Весьма вероятно, что оптимальная конфигурация варьируется для различных архитектур модели и задач.
Некоторая реализация трансформатора использует один nn.Linear
для проекционных матриц для запросов, ключа и значения. Если кто -то хочет ограничить ранг обновлений отдельных матриц, нужно либо разбить его на три отдельные матрицы, либо использовать lora.MergedLinear
. Обязательно измените контрольную точку соответственно, если вы решите разбить слой.
# ===== Before =====
# qkv_proj = nn.Linear(d_model, 3*d_model)
# ===== After =====
# Break it up (remember to modify the pretrained checkpoint accordingly)
q_proj = lora . Linear ( d_model , d_model , r = 8 )
k_proj = nn . Linear ( d_model , d_model )
v_proj = lora . Linear ( d_model , d_model , r = 8 )
# Alternatively, use lora.MergedLinear (recommended)
qkv_proj = lora . MergedLinear ( d_model , 3 * d_model , r = 8 , enable_lora = [ True , False , True ])
lora
. Вы можете отметить некоторые предвзятости как обучение, передавая «все» или «lora_only» bias=
при вызове mark_only_lora_as_trainable
. Не забудьте передать соответствующий bias=
аргумент lora_state_dict
при сохранении контрольной точки. # ===== Before =====
# lora.mark_only_lora_as_trainable(model) # Not training any bias vectors
# ===== After =====
# Training all bias vectors associated with modules we apply LoRA to
lora . mark_only_lora_as_trainable ( model , bias = 'lora_only' )
# Alternatively, we can train *all* bias vectors in the model, including LayerNorm biases
lora . mark_only_lora_as_trainable ( model , bias = 'all' )
# When saving a checkpoint, use the same bias= ('all' or 'lora_only')
torch . save ( lora . lora_state_dict ( model , bias = 'all' ), checkpoint_path )
model.eval()
запустит слияние параметров LORA с соответствующими предварительно предварительно подготовленными, что устраняет дополнительную задержку для последующих проходов вперед. Calling model.train()
снова отменит слияние. Это может быть отключено путем передачи merge_weights=False
to lora layers. Пожалуйста, свяжитесь с нами или опубликуйте проблему, если у вас есть какие -либо вопросы.
По вопросам, связанным с пакетом loralib
:
Пример GPT-2:
Пример Роберты/Деберта:
Мы благодарим в алфавитном порядке Цзянфенг Гао, Джейд Хуанг, Цзяюан Хуанг, Лиза Сян Ли, Сяодон Лю, Ябин Лю, Бенджамин Ван Дурм, Луис Варгас, Хоран Вэй, Питер Велдер и Грег Ян за обеспечение ценной способности.
@inproceedings {
hu2022lora,
title = { Lo{RA}: Low-Rank Adaptation of Large Language Models } ,
author = { Edward J Hu and Yelong Shen and Phillip Wallis and Zeyuan Allen-Zhu and Yuanzhi Li and Shean Wang and Lu Wang and Weizhu Chen } ,
booktitle = { International Conference on Learning Representations } ,
year = { 2022 } ,
url = { https://openreview.net/forum?id=nZeVKeeFYf9 }
}
Этот проект приветствует вклады и предложения. Большинство взносов требуют, чтобы вы согласились с лицензионным соглашением о участнике (CLA), заявив, что вы имеете право и фактически предоставить нам права на использование вашего вклада. Для получения подробной информации, посетите https://cla.opensource.microsoft.com.
Когда вы отправляете запрос на привлечение, бот CLA автоматически определит, нужно ли вам предоставить CLA и правильно украсить PR (например, проверка состояния, комментарий). Просто следуйте инструкциям, предоставленным ботом. Вам нужно будет сделать это только один раз во всех репо, используя наш CLA.
Этот проект принял код поведения с открытым исходным кодом Microsoft. Для получения дополнительной информации см. Кодекс поведения FAQ или свяжитесь с [email protected] с любыми дополнительными вопросами или комментариями.