Artigo de Cinthia Kleiner, Cientista de Dados – Semantix
Introdução:
Um paradigma no desenvolvimento de modelos do tipo foundation envolve o treinamento inicial extensivo deste modelo em dados genéricos em grande escala, seguido pela etapa de adaptação do modelo para domínios ou tarefas específicas.
À medida que a escala aumenta, a viabilidade de realizar o processo de fine-tuning completo, o qual exige o treinamento de todos os parâmetros do modelo, diminui. Por exemplo, ao usar um modelo como o GPT 3.5, que possui 175 bilhões de parâmetros [1], o processo de fine-tuning torna-se extensivo em termos de requisitos computacionais e de memória. Para enfrentar este desafio, pesquisadores da Microsoft introduziram a técnica de Low-Rank-Adaptation, ou LoRA, essa técnica se destaca como uma metodologia eficiente para lidar com os desafios relacionados ao processo de fine-tuning de modelos extensos.
LoRA apresenta uma solução que utiliza a preservação dos pesos do modelo pré-treinado, enquanto existem camadas treináveis, conhecidas como matrizes de decomposição de rank.
Com essa abordagem, ocorre uma redução significativa nos parâmetros treináveis, o que acarreta na redução de demandas de memória de GPU necessárias, pois elimina a necessidade de calcular gradientes para a maioria dos pesos do modelo, reduzindo também requisitos computacionais [3].
Além disso, o cenário de fine-tuning também foi transformado por uma nova técnica introduzida em 2023, conhecida como Quantized Low-Rank Adaptation (QLoRA), essa metodologia emprega estratégias avançadas para otimizar ainda mais os requisitos de memória enquanto mantém o desempenho do modelo. Ao introduzir novas abordagens, como a quantização NormalFloat4, dupla quantização e otimizadores do tipo paged, QLoRA foi capaz de aprimorar o processo de fine-tuning tornando-o mais acessível e eficiente.
Este post tem como objetivo explorar as técnicas mencionadas, abordando os desafios de se aplicar uma metodologia de fine-tuning completo em um modelo extenso, como os Large Language Models. Também é demonstrado o papel destas metodologias e seu potencial transformador no processo de fine-tuning.
Qual a importância do processo de fine-tuning ?
Fine tuning é um método que visa reajustar os parâmetros de um modelo, adaptando-o para um tarefa ou domínio específico, ao invés de treinar um modelo do zero para esta determinada tarefa.
Neste processo, um modelo pré-treinado, o qual já aprendeu em passos anteriores quais são as características importantes em contextos gerais, passa por um treinamento adicional em um conjunto de dados mais reduzido e de domínio.
A Figura 1 demonstra um pipeline de fine-tuning para modelos como Large Language Models. Essa abordagem se mostra valiosa para aprimorar a versatilidade dos modelos pré-treinados, visando aumentar seu desempenho em várias aplicações práticas [3-5]. Esse processo pode gerar também benefícios significativos em cenários específicos tais como:
- Melhora na performance para tarefas específicas: Ao adaptar um modelo pré-treinado para um tarefa ou domínio específico, é possível refinar o conhecimento do modelo com a complexidade dessa tarefa, melhorando assim o desempenho do mesmo no domínio em questão [5-6]
- Redução em requisitos de volume de dados e tempo de treinamento: Quando comparado com o treinamento de modelos base, o processo de fine-tuning requer menos recursos computacionais, volume de dados e tempo de processamento [5-6].
- Generalização aprimorada: Com o fine-tuning, os modelos são capazes de aprimorar sua generalização para novos dados, extraindo características relevantes dos mesmos [5-6].
Figura 1: Pipeline de fine-tuning para um Large Language Model
Os desafios do fine-tuning completo:
Especialmente no contexto de Large Language Model, o processo de fine-tuning considerando todos os parâmetros do modelo é extremamente extenso, uma vez que exige extensos recursos computacionais e de memória para lidar com os pesos do modelo e com o estado do otimizador.
É importante observar que os gradientes e os estados do otimizador tipicamente podem resultar em uma necessidade de memória até 12 vezes maior que o próprio peso do modelo.
Consequentemente, um novo campo conhecido como “Parameter Efficient Fine Tuning ou Fine-tuning com parâmetros eficientes” também conhecido como PEFT, emergiu com abordagens inovadoras para lidar com essas limitações.
As metodologias propostas por PEFT são projetadas para realizar o fine-tuning apenas em uma porção de parâmetros do modelo. Essas abordagens, exemplificadas por técnicas como o LoRA e o QLoRA, são capazes não apenas de minimizar os recursos necessários, mas também de acelerar o processo de treinamento [7].
Adaptação de baixo Rank – Low Rank Adaptation (LoRA):
LoRA é uma abordagem projetada para aprimorar a acessibilidade e eficiência do processo de fine-tuning. Ela se baseia em um importante insight: a diferença entre os pesos do modelo ajustado para uma determinada tarefa e os do modelo original frequentemente exibem um “baixo rank”, isso significa que estes pesos podem ser aproximados por uma matriz de baixo rank [2].
Um baixo rank indica que a matriz possui um número limitado de colunas linearmente independentes, reduzindo assim sua complexidade. Matrizes de baixo rank podem por sua vez ser expressas como produto de duas matrizes menores, processo conhecido como decomposição de matrizes.
Isso leva à hipótese de que a diferença dos pesos do modelo pré-treinado com o modelo após processo de adaptação pode ser representada como o produto de duas pequenas matrizes, resultando em ganhos significativos em eficiência computacional [7, 12, 14].
No framework LoRA, a matriz de peso original permanece estática durante o processo de fine-tuning, enquanto que duas matrizes, denotadas de A e B são submetidas ao processo (Figura 2).
Figura 2: Metodologia LoRA [2]
A Figura 2 pode ser representada por uma equação que exemplifica como uma rede neural pode ser adaptada durante o processo de fine-tuning com a metodologia LoRA.
Equation 01 – Adaptação de uma rede neural durante fine-tuning com LoRA[4]
Com a equação 01, é possível notar que a saída (output) do modelo é representada por duas partes: a primeira envolve a multiplicação do dado de entrada pelo peso original do modelo pré-treinado, já a segunda envolve a multiplicação dos dados de entrada com a aproximação de baixo rank.
Por fim, estes termos são somados para representar o output final. Com essa adaptação, a metodologia LoRA é capaz de alcançar notáveis reduções nos requisitos computacionais e de memória [4].
Quando se trata do valor final de parâmetros treináveis nessa abordagem, esse valor depende do tamanho das matrizes de baixo rank utilizadas, o qual é uma função da forma da matriz de peso original e do valor de rank escolhido durante o processo de treinamento [4].
Implementação de LoRA na arquitetura Transformers:
Com o objetivo de reduzir o número total de parâmetros treináveis, a técnica LoRA pode ser aplicada em um conjunto específico de matrizes de pesos que compõem uma rede neural.
Quando se trata da arquitetura Tranformers, isso inclui as matrizes de peso no módulo de self-attention (auto atenção) (Wq, Wk, Wv e Wo) e dois módulos de múltiplas camadas (multi-layer-perceptron), por uma questão de simplicidade e eficiência de parâmetros, a metodologia LoRA é convencionalmente aplicado nos blocos de atenção [2,3], como demonstrado na Figura 3.
No paper original, os autores demonstraram que considerando um rank=4 e aplicando LoRA apenas nos módulos de atenção Wq e Wv a metodologia foi capaz de alcançar melhores resultados em alguns benchmarks como WikiSQL e MultiNLI quando comparado com diferentes configurações de rank e blocos de atenção [2].
Figura 3: LoRA aplicado nos blocos de atenção na arquitetura Transformers [17]
Principais parâmetros:
Ao trabalhar com a técnica LoRA, é importante compreender os seguintes parâmetros.
- Rank (r): Rank é uma medida de como os pesos originais do modelo são decompostos em duas matrizes reduzidas. Esse parâmetro é relacionado aos requisitos computacionais e de memória. Ranks mais baixos podem aprimorar a velocidade de treinamento do modelo, contudo, podem reduzir o desempenho [9]
- lora_alpha: Escala relacionada ao rank utilizado. Este parâmetro ajusta a compensação entre o modelo original e a sua aproximação de baixo rank. Valores mais altos amplificam a influência da aproximação no processo de fine-tuning [9].
- lora_dropout: Dropout é uma técnica de regularização que visa evitar o overfitting de modelos. Este valor representa a probabilidade de supressão de cada neurônio durante a etapa de treinamento [9].
As vantagens do LoRA:
A metodologia LoRA tem demonstrado notáveis vantagens,incluindo:
- Compartilhar modelo pré-treinado: Com a técnica LoRA é possível compartilhar um modelo pré-treinado em diferentes tarefas, sendo necessário apenas criar adaptadores especialistas para diferentes propósitos [10-12]
- Aprimorar eficiência de treinamento: A metodologia é capaz de aprimorar a eficiência de treinamento além de reduzir as barreiras de hardware necessárias. Isso é possível devido a redução de parâmetros treinados, fazendo com que os estados do otimizador e o cálculo dos gradientes seja realizado apenas para uma fração de parâmetros, uma vez que a técnica LoRA foca na otimização das matrizes de baixo rank, simplificando o processo de treinamento [10 – 12].
- Inferência com baixa latência: O design proposto pela metodologia LoRA permite a integração perfeita das matrizes treináveis com os pesos congelados do modelo base, minimizando atrasos durante o processo de deploy [10 – 12].
- Versatilidade e Compatibilidade: LoRA é compatível com diferentes métodos. Por exemplo, a metodologia pode ser empregada com técnicas como prefix-tuning. Com essa compatibilidade, LoRA torna-se uma solução versátil para uma ampla gama de aplicações [2, 11].
A técnica de Adaptação de baixo rank quantizada – Quantized Low-Rank Adaptation (QLoRA):
Embora a técnica LoRA seja eficaz na redução das demandas de armazenamento, ainda é necessária a utilização de uma GPU robusta para a etapa de treinamento. É neste GAP em que o QLoRA desempenha um papel crucial [13].
Essa metodologia utiliza uma abordagem inovadora de alta precisão para quantizar o modelo pré-treinado para 4 bits. seguido pela incorporação de um compacto conjunto de pesos aprendidos, os quais são representados pelo uso dos adaptadores de baixo rank.
Estes pesos são ajustados com a etapa de retropropagação (backpropagation) por meio dos pesos quantizados. Para essa finalidade, a técnica QLoRa introduz uma variedade de estratégias inovadoras destinadas a reduzir o consumo de memória, mantendo o desempenho do modelo. Estas inovações incluem:
- 4-bit NormalFloat: Um tipo de dado de quantização que, do ponto de vista informacional, é considerado ótimo. Especialmente adequado para dados que seguem uma distribuição normal. Em resultados empíricos, supera consistentemente inteiros de 4-bit e floats de 4-bits [4].
- Quantização Dupla: Método que quantiza as constantes da quantização para obter maior economia de memória. Desta forma, a dupla quantização utiliza a primiera quantização como entrada para a segunda. Com este processo, um modelo de 65 bilhões de parâmetros economiza quase 3 GB, resultando em uma economia média de 0.37 bits por parâmetro [4].
- Otimizadores-Paged: Estes otimizadores utilizam o recurso de memória unificada da NVIDIA para evitar picos durante o processo de gradient-checkpointing ao processar lotes com dados de longa sequência, prevenindo erros de falta de memória que restringem o fine-tuning de Large Language Models em uma única GPU [4].
Em resumo, a técnica QLoRA emprega um tipo de dado de armazenamento de baixa precisão (4-bit NormalFloat) ao lado de um tipo de dado para o processo de computação (16 bit brain float).
As etapas de propagação (forward pass) e retropropagação (backpropagation) envolvem a de-quantização do tipo de dado de armazenamento para o tipo de dado de computação, então sempre que um tensor é utilizado, primeiro ele é de-quantizado para BFloat16, seguido pela multiplicação de matriz em precisão de 16 bits.
Dessa maneira, é possível observar que os gradientes de peso são calculados apenas usando a precisão BFloat16 [4]. Após o processo de computação, todos os pesos retornam para 4 bits. A Figura 4 apresenta algumas diferenças chaves entre QLora, Lora e o fine-tuning completo.
Figura 4: Requisitos de memória de diferentes metodologias de fine-tuning[4]
O processo implementado na metodologia QLoRA envolve várias etapas, conforme apresentado abaixo:
- Quantização para NF4: O Large Language Model é quantizado para a representação de 4 bits, isso significa que as matrizes do modelo são armazenadas neste tipo de dado, ocasionando uma redução significativa no uso de memória [16].
- Treinamento: Todos os passos de computação são realizados com uma precisão de 16-bit ou 32-bit. Assim, os pesos do modelo são temporariamente de-quantizados para a precisão de cálculo. Uma vez concluídas as etapas de computação, estes elementos são revertidos para o formato de 4-bit [16].
- Armazenamento seletivo em precisão de cálculo: Apenas os adaptadores são temporariamente armazenados na precisão de cálculo, enquanto a maioria dos pesos permanecem no formato de 4-bits. Com essa estratégia o requerimento de memória é reduzido. [13, 16].
QLoRA e suas vantagens:
QLoRA representa o primeiro método capaz de realizar o fine-tuning em um modelo com 33 bilhões de parâmetros em uma única GPU e de consumir 65 bilhões de parâmetros em uma GPU profissional, todas estas conquistas sem comprometer o desempenho do modelo quando comparado com um baseline de fine-tuning completo [4]. As principais vantagens deste método estão presentes nos seguintes tópicos:
- Eficiência de memória: Ao introduzir a quantização na arquitetura do LoRa, a técnica QLoRA vai um passo além na otimização do uso de memória, tornando a mesma extremamente valiosa para implantar modelos extensos em dispositivos com recursos limitados, como por exemplo dispositivos edge e smartphones [15]. Além disso, através da utilização da técnica de dupla quantização, foi possível reduzir ainda mais a necessidade de memória mantendo o desempenho do modelo [16].
- NormalFloat 4: O artigo original da técnica QLoRa destaca o desempenho do NormalFloat 4 em relação ao Float4 padrão, demonstrando como a utilização do mesmo acarreta um aumento significativo no desempenho [13].
Conclusões:
A ampla disponibilidade de técnicas de fine-tuning para Large Language Models representa mais do que um avanço tecnológico, ela atua como suporte para inovação em diversos domínios.
Com o aumento da acessibilidade do processo de fine-tuning, técnicas como LoRA e QLoRA desbloqueiam oportunidades para pesquisadores individuais e desenvolvedores.
Com este processo, é possível oferecer desempenho aprimorado em tarefas específicas e reduzir a necessidade de recursos extensos, sendo possível aproveitar a capacidade de modelos avançados para criar soluções que anteriormente estavam fora do alcance de muitos.
Essas técnicas são capazes de reduzir o número de parâmetros treináveis, resultando na necessidade de requisitos computacionais mais acessíveis. Embora o processo de fine-tuning seja extensivo em recursos, as técnicas de LoRA e QLoRA com suas respectivas abordagens da adaptação de matrizes de baixo rank e a quantização com formatos de dados do tipo NF4, conseguem contornar estes desafios sem penalizar a eficiência do modelo.
Com isso, essas abordagens são capazes de oferecer versatilidade na implementação de modelos, reduzindo as barreiras de hardware. Quando as técnicas são comparadas, nota-se que o QLoRA se destaca com equilíbrio entre precisão e eficiência computacional, demonstrando uma abordagem democrática para o fine-tuning de Large Language Models.