Pular para o conteúdo
mnzes

O que é LoRA em fine-tuning?

PorDiógenes MenezesAprendendo IA em público

12 min de leitura

LoRA, de low-rank adaptation, congela os pesos do modelo e injeta em cada camada duas matrizes pequenas que são treinadas no lugar deles. Você ajusta cerca de 0,1% dos parâmetros e recebe de volta um arquivo de dezenas de megabytes, não um modelo inteiro. É o método padrão de fine-tuning fora dos laboratórios que têm centenas de GPUs.

O problema que ele resolve é de logística antes de ser de qualidade. Ajustar todos os pesos de um modelo de 7B exige guardar, além dos pesos, os gradientes e o estado do otimizador para cada um deles. A conta some com a memória de qualquer placa que não seja de data center, e o resultado é um modelo inteiro para versionar e servir por comportamento treinado.

LoRA é a família mais usada dentro de PEFT, o guarda-chuva dos métodos eficientes, e tem variantes que espremem ainda mais a memória, como o QLoRA. A ideia original, publicada em 2021, é simples o bastante para caber em um parágrafo — e a razão de ela funcionar é mais interessante que a mecânica.

O que o treino move

Wcongelado4.096 × 4.096 = 16,8 M pesos+A · projeta d para rB · projeta r de volta2 × 16 × 4.096= 131 mil pesosΔW = B · Asomado na saída
Figura 1A matriz original nunca é tocada. O que o treino move são duas matrizes finas cujo produto tem o mesmo formato de W e é somado à saída dela.

Cada camada do transformer tem matrizes de peso grandes. Numa camada de atenção de um modelo com 4.096 dimensões, a matriz de projeção de consulta é 4.096 por 4.096, ou 16,8 milhões de números.

O ajuste completo altera esses 16,8 milhões. LoRA não toca em nenhum deles. Em vez disso, acrescenta duas matrizes: uma que projeta as 4.096 dimensões para um espaço bem menor, de posto r, e outra que projeta de volta. Com r = 16, elas somam 2 × 16 × 4.096, ou cerca de 131 mil números — 0,8% da matriz original.

O produto das duas tem exatamente o formato da matriz congelada, e é somado à saída dela. Do ponto de vista do resto da rede, nada mudou de forma: a camada recebe a mesma entrada e devolve algo do mesmo tamanho, só que deslocado pela contribuição do adaptador.

Dois detalhes de inicialização importam mais do que parecem. A primeira matriz começa com valores aleatórios pequenos e a segunda começa em zero, o que faz o produto ser exatamente zero no primeiro passo. O modelo começa idêntico ao original e o adaptador só se afasta disso na medida em que o gradiente pedir. E o resultado é multiplicado por um fator de escala que depende do posto, para que mudar r não mude junto a magnitude do ajuste.

Na hora de servir, a soma pode ser feita uma vez e gravada nos pesos. O modelo resultante roda exatamente como o original, sem nenhuma camada extra no caminho — que é a diferença prática em relação aos métodos de adaptador anteriores, que acrescentavam módulos e, com eles, latência1.

Por que treinar tão pouco funciona

A pergunta óbvia é por que 0,1% dos parâmetros seriam suficientes. A resposta começou a aparecer antes do LoRA existir.

Um trabalho de 2020 investigou por que dá para ajustar um modelo de centenas de milhões de parâmetros com apenas alguns milhares de exemplos rotulados sem que tudo desande. A resposta que eles propõem é dimensão intrínseca: existe uma reparametrização de dimensão baixa tão eficaz quanto o espaço completo de parâmetros. O número que eles mediram é chocante — otimizando apenas 200 parâmetros treináveis, projetados de volta no espaço completo, chegaram a 90% do desempenho do ajuste completo no MRPC2.

Duas observações do mesmo trabalho fecham o argumento. O pré-treino reduz implicitamente a dimensão intrínseca, e modelos maiores tendem a ter dimensão intrínseca menor depois de um número fixo de passos. Quanto maior o modelo, menos graus de liberdade a adaptação precisa.

Os autores do LoRA partiram dessa hipótese e a aplicaram à mudança dos pesos, não aos pesos em si: se a adaptação vive num espaço de dimensão baixa, a diferença entre o modelo ajustado e o original também deve ter posto baixo. A investigação empírica sobre deficiência de posto no próprio paper é o que sustenta a escolha1.

O tamanho do arquivo é o ponto

parâmetros treináveis, na mesma escala7 bilhões de pesos · ajuste completo← 8,4 milhões · LoRA de posto 16 nas projeções de atençãoa barra verde tem 0,12% da largura da cinza e some nesta escala;o estado de otimizador cai de cerca de 112 GB para cerca de 130 MB
Figura 2Na mesma escala, a barra dos parâmetros treináveis do adaptador some. É o que dispensa o estado de otimizador do modelo inteiro.

Os números do paper original são de outra escala e ajudam a fixar a ordem de grandeza. Comparado ao GPT-3 de 175B ajustado com Adam, o LoRA reduziu os parâmetros treináveis em dez mil vezes e a memória de GPU em três vezes, com qualidade igual ou melhor em RoBERTa, DeBERTa, GPT-2 e GPT-31.

Refaça a conta num tamanho que você provavelmente usaria. Um modelo de 7B com 32 camadas e 4.096 dimensões, com adaptadores de posto 16 nas projeções de consulta e valor, tem cerca de 8,4 milhões de parâmetros treináveis. É 0,12% do total.

A economia de memória não vem dos pesos, que continuam carregados. Vem do que acompanha os pesos treináveis. Num treino de precisão mista com Adam, cada parâmetro treinável arrasta consigo gradiente e dois momentos do otimizador — na contabilidade usual, algo em torno de 16 bytes por parâmetro. Para 7 bilhões disso são mais de 100 GB, além dos 14 GB do modelo em bf16. Para 8,4 milhões, são cerca de 130 MB.

É essa diferença que muda o projeto de “precisamos de um nó com oito placas” para “cabe na placa que já temos”. O QLoRA empurrou o limite mais um degrau ao quantizar o modelo base em 4 bits: os autores ajustaram um modelo de 65B numa única GPU de 48 GB, e a melhor família que publicaram saiu de 24 horas de uma placa só3.

Que posto usar

A resposta curta é: comece em 8 ou 16 e suba se o seu conjunto de avaliação pedir. A resposta longa é mais interessante, porque o posto certo depende do que você está tentando ensinar.

Para ajuste de estilo, formato e vocabulário, postos baixos costumam bastar, e foi esse regime que popularizou o método. Para ensinar capacidade nova, a evidência recente é menos animadora. Um estudo de 2024 comparou LoRA e ajuste completo em programação e matemática, tanto em instruction tuning com cerca de 100 mil pares quanto em pré-treino continuado com 20 bilhões de tokens, e encontrou o LoRA substancialmente abaixo nos postos usuais4.

O mesmo trabalho traz a medição que mais ajuda na hora de escolher r: o ajuste completo aprende perturbações com posto 10 a 100 vezes maior que as configurações típicas de LoRA. Se a sua tarefa exige mudar bastante o modelo, um r de 8 é pequeno demais por construção, e nenhuma quantidade de épocas conserta isso.

O lado bom do mesmo estudo: o adaptador esquece menos. Fora do domínio alvo, o LoRA preservou melhor o desempenho do modelo base do que o ajuste completo, e melhor do que regularizações comuns como decaimento de peso e dropout4. Menos capacidade nova, menos estrago no que já funcionava. Para a maioria dos casos de produção, essa troca é boa.

Onde aplicar o adaptador

A segunda decisão de configuração é em quais matrizes injetar as duas matrizes pequenas, e ela interage com o posto.

O paper original aplicou às projeções de consulta e de valor da atenção, e é ainda o padrão das bibliotecas. A justificativa é econômica antes de ser teórica: são as matrizes onde o mesmo orçamento de parâmetros rendeu mais nos experimentos deles1. Trabalhos posteriores estenderam para todas as projeções lineares, incluindo as camadas densas da rede de avanço, que concentram a maior parte dos pesos de um transformer moderno.

A regra que funciona na prática: aplicar a mais matrizes com posto menor costuma render mais que aplicar a poucas com posto alto, para o mesmo número de parâmetros treináveis. Faz sentido com o que o estudo de 2024 mediu — se a mudança que a tarefa exige tem posto alto, concentrá-la em duas matrizes só a espreme mais ainda.

O arquivo continua pequeno em qualquer dos dois casos. Os 8,4 milhões de parâmetros do exemplo anterior, guardados em bf16, dão cerca de 17 MB. Estendendo a todas as projeções lineares, algo em torno de 80 MB. Contra os 14 GB do modelo base, a diferença entre as duas configurações não importa para o armazenamento. Importa para a qualidade.

Um modelo base, muitos comportamentos

modelo base 7Bcarregado uma veztom do suporteformato jurídicodialeto de SQLtamanho do resumorótulos de triagemadaptadores · dezenas de MB cadaos cinco cabem na mesma GPU porque nenhum deles carregauma cópia dos pesos do modelo
Figura 3O modelo base fica carregado uma vez e os adaptadores entram e saem por cima. É o que torna cinco comportamentos servíveis por uma GPU só.

A consequência arquitetural é a que mais muda o desenho de um sistema, e é a que menos aparece nas explicações introdutórias.

Como o adaptador é pequeno e separável, você pode manter uma cópia do modelo base na GPU e trocar o adaptador por requisição. Cinco comportamentos diferentes viram cinco arquivos de dezenas de megabytes, não cinco modelos de 14 GB.

Isso virou um problema de sistemas por mérito próprio. Um trabalho de 2023 tratou a memória de adaptadores como paginação, mantendo todos em memória principal e trazendo para a GPU só os que as requisições em execução precisam, num pool unificado com o cache de chave-valor. Com isso, serviram milhares de adaptadores em uma GPU, com ganho de até 4 vezes na vazão em relação às bibliotecas disponíveis na época5.

O que isso permite na prática é granularidade. Um adaptador por cliente, um por idioma, um por tipo de documento — decisões que seriam economicamente absurdas se cada uma exigisse um modelo próprio servido em separado.

Onde falha

Posto pequeno demais para a tarefa. É o modo de falha mais comum e o mais fácil de diagnosticar errado, porque parece falta de dados. Se a perda de treino para de cair cedo e subir o número de exemplos não ajuda, tente r maior antes de mexer no conjunto.

Equivalência aparente com o ajuste completo. Um estudo de 2024 analisou as matrizes de peso resultantes dos dois métodos pela decomposição em valores singulares e encontrou estruturas diferentes. As treinadas com LoRA ganham direções singulares novas e de alta ordem, que os autores chamam de dimensões intrusas, e que não aparecem no ajuste completo. Intervindo causalmente nelas, mostraram que são elas que causam o esquecimento — e que reduzir a escala dessas direções recupera boa parte do desempenho na distribuição de pré-treino com queda pequena na tarefa6.

Acúmulo em treino sequencial. O mesmo trabalho mostra que essas dimensões se acumulam quando você ajusta várias vezes em sequência, e que nesse cenário os modelos treinados com LoRA se saem pior6. Se o seu plano é aplicar um adaptador sobre outro ao longo dos meses, esse é o problema que você vai encontrar.

Escala mal configurada. O fator que multiplica o adaptador é ajustado em relação ao posto. Trocar r sem trocar o fator, ou copiar a configuração de outro projeto, produz um ajuste fraco demais ou instável, e o sintoma não se parece com um erro de configuração.

Somar sobre um modelo quantizado. Se você treinou com o base em 4 bits e vai somar o adaptador aos pesos, some sobre a versão em precisão cheia. Somar sobre a versão quantizada introduz erro que não estava lá durante o treino.

Como configurar a primeira rodada

  1. Comece com r = 16 e escala igual a 32, aplicando o adaptador às projeções de atenção. É o ponto de partida mais comum e funciona para a maioria dos ajustes de comportamento.
  2. Meça o baseline antes, com o modelo base e o melhor prompt. Sem isso não há como saber se o adaptador ajudou.
  3. Rode uma a três épocas sobre algumas centenas de exemplos revisados. Mais épocas com pouco dado produzem memorização, não generalização.
  4. Se não houver sinal nenhum, suba o posto antes de aumentar o conjunto. É a mudança mais barata e resolve o caso em que a tarefa exigia mais capacidade de ajuste do que r permitia.
  5. Estenda o adaptador às camadas densas se o posto maior também não bastar. É mais caro e costuma render mais que subir r indefinidamente.
  6. Avalie fora do domínio. O adaptador esquece menos que o ajuste completo, mas não esquece zero, e só o conjunto de fora mostra quanto.

O passo 4 é o que mais economiza tempo. Quando o ajuste não pega, o instinto é duplicar o conjunto de treino, o que custa semanas. Trocar um número na configuração custa uma tarde e responde a mesma pergunta.

Footnotes

  1. Hu et al. (2021) relatam, comparando com o GPT-3 de 175B ajustado com Adam, redução de 10.000 vezes nos parâmetros treináveis e de 3 vezes na memória de GPU, sem latência extra na inferência. 2 3 4

  2. Aghajanyan et al. (2020) mediram a dimensão intrínseca do ajuste fino e chegaram a 90% do desempenho completo no MRPC otimizando apenas 200 parâmetros projetados de volta no espaço completo.

  3. Dettmers et al. (2023) ajustaram um modelo de 65B numa GPU de 48 GB quantizando o base em 4 bits e treinando adaptadores de posto baixo por cima dele.

  4. Biderman et al. (2024) compararam LoRA e ajuste completo em programação e matemática: o adaptador fica abaixo nos postos usuais, esquece menos fora do domínio, e o ajuste completo aprende perturbações de posto 10 a 100 vezes maior. 2

  5. Sheng et al. (2023) mantiveram os adaptadores em memória principal e os paginaram para a GPU sob demanda, servindo milhares deles em uma placa com ganho de até 4 vezes na vazão.

  6. Shuttleworth et al. (2024) encontraram, na decomposição em valores singulares, direções novas que só aparecem com LoRA, mostraram por intervenção causal que elas causam o esquecimento, e que elas se acumulam em ajustes sequenciais. 2

Perguntas frequentes

O que é LoRA, explicado de forma simples?
LoRA congela os pesos do modelo e treina, em cada camada, duas matrizes pequenas cujo produto é somado à matriz original. Você treina 0,1% dos parâmetros em vez de todos, e o resultado é um arquivo de adaptador de dezenas de megabytes que se aplica sobre o modelo base.
Qual posto usar em LoRA?
Comece em 8 ou 16 e só suba se o conjunto de avaliação pedir. Para ajuste de estilo e formato, postos baixos costumam bastar. Para ensinar capacidade nova, como um domínio de código, um trabalho de 2024 encontrou que o ajuste completo aprende perturbações de posto 10 a 100 vezes maior que as configurações usuais.
O que é um adaptador LoRA?
É o arquivo com as duas matrizes treinadas de cada camada, mais a configuração de posto e escala. Tem dezenas de megabytes em vez dos gigabytes de um modelo inteiro, e se aplica sobre o modelo base no carregamento. Vários adaptadores podem ser servidos a partir da mesma cópia do modelo.
LoRA tem a mesma qualidade do ajuste completo?
Depende do que você está ensinando. Os autores relataram qualidade igual ou superior em várias tarefas de linguagem. Um estudo de 2024 em programação e matemática encontrou o contrário nos postos usuais: o adaptador aprende menos no domínio alvo, mas preserva melhor o desempenho fora dele.
LoRA deixa a inferência mais lenta?
Não, se você somar as matrizes aos pesos originais antes de servir. O produto das duas tem o mesmo formato da matriz congelada, então a soma pode ser feita uma vez e o modelo resultante roda igual ao original. Mantendo o adaptador separado, cabe trocá-lo por requisição, com um custo pequeno.
Qual a diferença entre LoRA e QLoRA?
QLoRA é LoRA com o modelo base quantizado em 4 bits, mais algumas técnicas de memória. O objetivo é caber em GPU menor: os autores ajustaram um modelo de 65B em uma única placa de 48 GB. O adaptador continua sendo treinado em precisão maior e o modelo base continua congelado.

Referências

  1. Hu, E. J. et al.. LoRA: Low-Rank Adaptation of Large Language Models (2021)arXiv:2106.09685
  2. Aghajanyan, A. et al.. Intrinsic Dimensionality Explains the Effectiveness of Language Model Fine-Tuning (2020)arXiv:2012.13255
  3. Dettmers, T. et al.. QLoRA: Efficient Finetuning of Quantized LLMs (2023)arXiv:2305.14314
  4. Biderman, D. et al.. LoRA Learns Less and Forgets Less (2024)arXiv:2405.09673
  5. Shuttleworth, R. et al.. LoRA vs Full Fine-tuning: An Illusion of Equivalence (2024)arXiv:2410.21228
  6. Sheng, Y. et al.. S-LoRA: Serving Thousands of Concurrent LoRA Adapters (2023)arXiv:2311.03285