? PEFT
Métodos de última geração de ajuste fino com eficiência de parâmetros (PEFT)
O ajuste fino de grandes modelos pré-treinados costuma ser proibitivamente caro devido à sua escala. Os métodos de ajuste fino com eficiência de parâmetros (PEFT) permitem a adaptação eficiente de grandes modelos pré-treinados a vários aplicativos downstream, ajustando apenas um pequeno número de parâmetros (extras) do modelo, em vez de todos os parâmetros do modelo. Isso diminui significativamente os custos computacionais e de armazenamento. Técnicas PEFT de última geração alcançam desempenho comparável a modelos totalmente ajustados.
PEFT é integrado com Transformers para fácil treinamento e inferência de modelos, Difusores para gerenciar convenientemente diferentes adaptadores e Accelerate para treinamento distribuído e inferência para modelos realmente grandes.
Dica
Visite a organização PEFT para ler sobre os métodos PEFT implementados na biblioteca e ver cadernos que demonstram como aplicar esses métodos a uma variedade de tarefas posteriores. Clique no botão "Assistir repositórios" na página da organização para ser notificado sobre métodos e notebooks recém-implementados!
Verifique a seção Referência da API dos adaptadores PEFT para obter uma lista de métodos PEFT suportados e leia os guias conceituais de Adaptadores, Soft Prompts e IA3 para saber mais sobre como esses métodos funcionam.
Instale o PEFT do pip:
pip install peft
Prepare um modelo para treinamento com um método PEFT como LoRA agrupando o modelo base e a configuração PEFT com get_peft_model
. Para o modelo bigscience/mt0-large, você está treinando apenas 0,19% dos parâmetros!
from transformers import AutoModelForSeq2SeqLM
from peft import get_peft_config , get_peft_model , LoraConfig , TaskType
model_name_or_path = "bigscience/mt0-large"
tokenizer_name_or_path = "bigscience/mt0-large"
peft_config = LoraConfig (
task_type = TaskType . SEQ_2_SEQ_LM , inference_mode = False , r = 8 , lora_alpha = 32 , lora_dropout = 0.1
)
model = AutoModelForSeq2SeqLM . from_pretrained ( model_name_or_path )
model = get_peft_model ( model , peft_config )
model . print_trainable_parameters ()
"trainable params: 2359296 || all params: 1231940608 || trainable%: 0.19151053100118282"
Para carregar um modelo PEFT para inferência:
from peft import AutoPeftModelForCausalLM
from transformers import AutoTokenizer
import torch
model = AutoPeftModelForCausalLM . from_pretrained ( "ybelkada/opt-350m-lora" ). to ( "cuda" )
tokenizer = AutoTokenizer . from_pretrained ( "facebook/opt-350m" )
model . eval ()
inputs = tokenizer ( "Preheat the oven to 350 degrees and place the cookie dough" , return_tensors = "pt" )
outputs = model . generate ( input_ids = inputs [ "input_ids" ]. to ( "cuda" ), max_new_tokens = 50 )
print ( tokenizer . batch_decode ( outputs , skip_special_tokens = True )[ 0 ])
"Preheat the oven to 350 degrees and place the cookie dough in the center of the oven. In a large bowl, combine the flour, baking powder, baking soda, salt, and cinnamon. In a separate bowl, combine the egg yolks, sugar, and vanilla."
Há muitos benefícios em usar o PEFT, mas o principal deles é a enorme economia em computação e armazenamento, tornando o PEFT aplicável a muitos casos de uso diferentes.
Considere os requisitos de memória para treinar os seguintes modelos no conjunto de dadosough/raft/twitter_complaints com uma GPU A100 de 80 GB com mais de 64 GB de CPU RAM.
Modelo | Ajuste fino completo | PEFT-LoRA PyTorch | PEFT-LoRA DeepSpeed com descarregamento de CPU |
---|---|---|---|
bigscience/T0_3B (parâmetros 3B) | GPU de 47,14 GB / CPU de 2,96 GB | GPU de 14,4 GB / CPU de 2,96 GB | GPU de 9,8 GB / CPU de 17,8 GB |
bigscience/mt0-xxl (parâmetros 12B) | GPU OOM | GPU de 56 GB / CPU de 3 GB | GPU de 22 GB / CPU de 52 GB |
bigscience/bloomz-7b1 (parâmetros 7B) | GPU OOM | GPU de 32 GB / CPU de 3,8 GB | GPU de 18,1 GB / CPU de 35 GB |
Com LoRA você pode ajustar totalmente um modelo de parâmetros de 12B que de outra forma ficaria sem memória na GPU de 80GB e ajustar e treinar confortavelmente um modelo de parâmetros de 3B. Quando você olha para o desempenho do modelo de parâmetro 3B, ele é comparável a um modelo totalmente ajustado com uma fração da memória da GPU.
Nome do envio | Precisão |
---|---|
Linha de base humana (crowdsourced) | 0,897 |
Flan-T5 | 0,892 |
lora-t0-3b | 0,863 |
Dica
O desempenho do modelo bigscience/T0_3B não está otimizado na tabela acima. Você pode obter ainda mais desempenho brincando com os modelos de instruções de entrada, hiperparâmetros LoRA e outros hiperparâmetros relacionados ao treinamento. O tamanho final do ponto de verificação deste modelo é de apenas 19 MB em comparação com 11 GB do modelo bigscience/T0_3B completo. Saiba mais sobre as vantagens do ajuste fino com PEFT nesta postagem do blog.
A quantização é outro método para reduzir os requisitos de memória de um modelo, representando os dados com menor precisão. Ele pode ser combinado com métodos PEFT para facilitar ainda mais o treinamento e o carregamento de LLMs para inferência.
O PEFT pode ajudá-lo a economizar armazenamento, evitando o ajuste completo dos modelos em cada tarefa ou conjunto de dados downstream. Em muitos casos, você está ajustando apenas uma fração muito pequena dos parâmetros de um modelo e cada ponto de verificação tem apenas alguns MBs de tamanho (em vez de GBs). Esses adaptadores PEFT menores demonstram desempenho comparável a um modelo totalmente ajustado. Se você tiver muitos conjuntos de dados, poderá economizar muito armazenamento com um modelo PEFT e não precisará se preocupar com o esquecimento catastrófico ou o ajuste excessivo do backbone ou do modelo básico.
O PEFT é amplamente suportado em todo o ecossistema Hugging Face devido à enorme eficiência que traz ao treinamento e à inferência.
O processo de difusão iterativo consome muita memória, o que pode dificultar o treinamento. PEFT pode ajudar a reduzir os requisitos de memória e o tamanho de armazenamento do ponto de verificação do modelo final. Por exemplo, considere a memória necessária para treinar um modelo de difusão estável com LoRA em uma GPU A100 de 80 GB com mais de 64 GB de CPU RAM. O tamanho final do ponto de verificação do modelo é de apenas 8,8 MB!
Modelo | Ajuste fino completo | PEFT-LoRA | PEFT-LoRA com verificação de gradiente |
---|---|---|---|
CompVis/difusão estável-v1-4 | GPU de 27,5 GB / CPU de 3,97 GB | GPU de 15,5 GB / CPU de 3,84 GB | GPU de 8,12 GB / CPU de 3,77 GB |
Dica
Dê uma olhada no script de treinamento exemplos/lora_dreambooth/train_dreambooth.py para tentar treinar seu próprio modelo de difusão estável com LoRA e brinque com o espaço smangrul/peft-lora-sd-dreambooth que está sendo executado em uma instância T4. Saiba mais sobre a integração PEFT em Difusores neste tutorial.
Accelerate é uma biblioteca para treinamento distribuído e inferência em várias configurações e hardware de treinamento (GPUs, TPUs, Apple Silicon, etc.). Os modelos PEFT funcionam com o Accelerate pronto para uso, tornando-o realmente conveniente para treinar modelos realmente grandes ou usá-los para inferência em hardware de consumo com recursos limitados.
O PEFT também pode ser aplicado ao treinamento de LLMs com componentes RLHF, como classificador e política. Comece lendo:
Use este espaço ou verifique a documentação para descobrir quais modelos suportam oficialmente um método PEFT pronto para uso. Mesmo que não veja um modelo listado abaixo, você pode configurar manualmente a configuração do modelo para habilitar o PEFT para um modelo. Leia o guia de arquitetura de novos transformadores para saber como.
Se você gostaria de contribuir para o PEFT, confira nosso guia de contribuições.
Para usar? PEFT em sua publicação, cite-o usando a seguinte entrada do BibTeX.
@Misc { peft ,
title = { PEFT: State-of-the-art Parameter-Efficient Fine-Tuning methods } ,
author = { Sourab Mangrulkar and Sylvain Gugger and Lysandre Debut and Younes Belkada and Sayak Paul and Benjamin Bossan } ,
howpublished = { url{https://github.com/huggingface/peft} } ,
year = { 2022 }
}