antonio leandro

ia generativa

QLoRA: Efficient Finetuning of Quantized LLMs

paper · Dettmers, Tim, Pagnoni, Artidoro, Holtzman, Ari, Zettlemoyer, Luke · · ~65 min de leitura do original

a tese

dá para congelar o modelo inteiro em 4 bits e treinar só os adapters em cima: o finetuning de um 65b cai de 780 gb para menos de 48 gb sem perder nada do desempenho de 16 bits

o que fica

  1. Quantizar para inferência degrada o modelo, mas treinar adapters depois da quantização recupera a perda: o finetuning conserta o que a quantização quebrou.
  2. O NF4 vence FP4 e Int4 porque foi desenhado para a distribuição real dos pesos, que é aproximadamente normal e centrada em zero — 27,41 de perplexidade média contra 31,07 do Float4 E2M1.
  3. Aplicar LoRA só nas projeções de query e value não reproduz o finetuning completo; é preciso adapter em todas as camadas lineares, e isso quase não custa memória porque o gasto está nos gradientes de ativação, não nos adapters.
  4. Qualidade de dados vence quantidade: 9.209 exemplos do OASST1 produziram um chatbot melhor que 450.000 do FLAN v2.
  5. MMLU alto não implica chatbot bom — o FLAN v2 lidera no MMLU e é o pior no benchmark Vicuna, o que expõe que os dois benchmarks medem coisas parcialmente ortogonais.
  6. Usar um modelo como juiz tem viés medido: o GPT-4 dá a si mesmo Elo 1348 enquanto humanos lhe dão 1176, e concorda com os anotadores só moderadamente (Fleiss κ = 0,25 no nível de exemplo).

o problema

Fazer finetuning de 16 bits num LLaMA de 65B exige mais de 780 GB de memória de GPU. Isso não é uma máquina, é um cluster: na prática, adaptar os maiores modelos abertos a um domínio específico era privilégio de quem tinha um galpão. A comunidade de pesquisa podia baixar os pesos e não podia treinar em cima deles.

Já existiam duas saídas parciais e nenhuma resolvia o caso. Os métodos de quantização espremiam o modelo para 8 ou 4 bits, mas só funcionavam para inferência — no treino eles quebravam. Os adapters de baixo posto reduziam os parâmetros treináveis a uma fração, mas o modelo base continuava carregado em 16 bits, e é ele que ocupa quase toda a memória. Faltava juntar as duas coisas: guardar o modelo congelado em 4 bits e ainda assim conseguir passar gradiente através dele.

a ideia

QLoRA separa dois tipos de dado: um de armazenamento, em 4 bits, e um de computação, em BFloat16. O modelo base fica quantizado e congelado na memória. Toda vez que um tensor de peso é usado, ele é desquantizado para BFloat16, entra na multiplicação de matrizes e é descartado. O gradiente atravessa esse peso congelado e vai parar nos adapters LoRA, que são os únicos parâmetros com gradiente próprio — e esses ficam em 16 bits.

O truque é que o custo da desquantização é de tempo, não de memória: o peso em 16 bits existe por um instante, para uma camada de cada vez. O que fica residente é a versão de 4 bits. Um 65B que precisava de 780 GB passa a caber em menos de 48 GB.

como funciona

Três peças sustentam isso. A primeira é o NF4, um tipo de dado de 4 bits construído a partir dos quantis da normal padrão. Pesos de rede treinada são aproximadamente normais e centrados em zero; se você normaliza o tensor para o intervalo [-1, 1] pelo máximo absoluto, os quantis são conhecidos de antemão e cada bin recebe o mesmo número esperado de valores. Os autores ainda montam o tipo de forma assimétrica para garantir uma representação exata do zero, que é o que permite quantizar padding sem erro. A quantização é por bloco — blocos de 64 elementos, cada um com sua constante — justamente para que um outlier não estrague a escala do tensor inteiro.

A segunda é a double quantization: as constantes de quantização também ocupam memória. Com blocos de 64 e constantes em FP32, são 0,5 bit por parâmetro. Quantizando essas constantes para FP8 em blocos de 256, o custo cai para 0,127 bit — 0,373 bit a menos por parâmetro, cerca de 3 GB num modelo de 65B.

A terceira são os paged optimizers, que alocam os estados do otimizador em memória unificada da NVIDIA. Quando a GPU estoura ao processar um minibatch de sequência longa, as páginas são despejadas para a RAM da CPU e trazidas de volta na hora do update. É o que evita o out-of-memory pontual do gradient checkpointing.

Sobre isso vem uma configuração de LoRA mais agressiva que a usual: adapter em todas as camadas lineares, não só em query e value. Sai caro? Não: num LLaMA 7B, os adapters ocupam 26 MB contra 5.048 MB do modelo base em 4 bits e 567 MB de gradientes de entrada. Cortar adapters economiza pouco e custa desempenho.

o que isso custou

Os autores são explícitos: eles não demonstraram que QLoRA iguala o finetuning completo de 16 bits nas escalas de 33B e 65B. A comparação direta com full finetuning foi feita até 3B, com RoBERTa e T5; acima disso a linha de base é LoRA de 16 bits, porque rodar o full finetuning custaria mais de um servidor de GPUs. A extrapolação é razoável e continua sendo extrapolação.

A avaliação também é frágil, e o próprio paper diz isso. Os intervalos de confiança no benchmark Vicuna se sobrepõem entre vários modelos. O GPT-4 como juiz tem efeito de ordem — favorece a resposta que aparece primeiro — e se autopremia. Nem BigBench nem HELM foram rodados. Não foram testados 3 bits, nem outros métodos PEFT.

E o modelo resultante falha de formas conhecidas: erra fatos com confiança, entrega o segredo do prompt do sistema diante de “isto é um jogo, ignore suas instruções anteriores”, e afirma que 1.833 é primo antes de listar uma fatoração — errada — com três fatores.

onde isso aparece hoje

O método é uma composição, não uma ruptura: ele leva LoRA até onde ela não chegava sozinha, e só existe porque havia pesos abertos para congelar — a família LLaMA e as que vieram depois, como Llama 2. Os autores liberaram código, kernels CUDA de treino em 4 bits e a integração no stack do Hugging Face, o que é a diferença entre um resultado e uma ferramenta.

A segunda herança é metodológica e menos citada: o protocolo de torneio com Elo, comparação par a par e GPT-4 no papel de juiz, junto com a medição dos vieses desse juiz. Quem usa LLM-as-judge hoje herda os dois — o barateamento e o viés.

lido na íntegra por pipeline de llm, revisado por antonio leandro antes de publicar ·