PEFT documentation

VeRA: Vector-based Random Matrix Adaptation

You are viewing main version, which requires installation from source. If you'd like regular pip install, checkout the latest stable version (v0.21.0).
Hugging Face's logo
Join the Hugging Face community

and get access to the augmented documentation experience

to get started

VeRA: Vector-based Random Matrix Adaptation

VeRA é uma técnica de ajuste fino eficiente em parâmetros, semelhante ao LoRA, mas que requer ainda menos parâmetros extras, prometendo desempenho semelhante ou até superior. Dessa forma, é particularmente útil quando o orçamento de parâmetros é muito limitado, por exemplo, ao escalar para modelos muito grandes. A redução no número de parâmetros treináveis é alcançada compartilhando as mesmas matrizes de baixo posto entre todas as camadas e treinando apenas dois vetores adicionais por camada.

Como o VeRA funciona

LoRA atualiza um modelo base congelado aprendendo duas pequenas matrizes de baixo posto para cada camada adaptada. O posto é a dimensão interna dessas matrizes e controla a capacidade do adaptador. No LoRA, aumentar r ou adaptar mais camadas aumenta rapidamente o número de parâmetros treináveis, pois cada camada adaptada aprende seu próprio par de matrizes de baixo posto.

VeRA mantém a mesma ideia de adaptação de baixo rank, mas altera quais parâmetros são treinados. Em vez de aprender matrizes de baixo rank separadas para cada camada, o VeRA usa um par de matrizes de baixo rank congeladas e inicializadas aleatoriamente, A e B, que é compartilhado entre as camadas. Cada camada adaptada aprende apenas dois vetores de escala, vera_lambda_d e vera_lambda_b, que reescalam as matrizes compartilhadas para produzir uma atualização específica da camada. Como vera_lambda_d tem tamanho r, a contagem de parâmetros treináveis do VeRA ainda aumenta com r e com o número de camadas adaptadas. No entanto, esse crescimento é muito mais lento do que o do LoRA, pois as grandes matrizes A e B são compartilhadas e congeladas, em vez de serem aprendidas separadamente para cada camada.

É por isso que o VeRA pode usar menos parâmetros treináveis do que o LoRA. Na contagem simplificada de parâmetros do artigo, o LoRA escala com 2 * L_tuned * d_model * r, onde L_tuned é o número de camadas adaptadas, d_model é a dimensão do modelo e r é o rank. O VeRA escala com L_tuned * (d_model + r) porque as grandes matrizes de baixo rank são compartilhadas e congeladas, enquanto apenas os vetores menores por camada são treinados.

Ao salvar os parâmetros do adaptador, é possível evitar o armazenamento das matrizes de baixo rank definindo save_projection=False no VeraConfig. Nesse caso, essas matrizes serão restauradas com base na semente aleatória fixa do argumento projection_prng_key. Isso reduz o tamanho do checkpoint, mas não podemos garantir a reprodutibilidade em todos os dispositivos e para todas as versões futuras do PyTorch. Se você deseja garantir a reprodutibilidade, defina save_projection=True (que é o padrão).

Para lidar com diferentes formas das camadas adaptadas, o VeRA inicializa as matrizes compartilhadas A e B com o maior tamanho necessário para cada dimensão. Durante a passagem direta, as submatrizes A e B para uma camada dada são extraídas dessas matrizes compartilhadas e usadas conforme descrito no artigo. Por exemplo, adaptar duas camadas lineares de formas (100, 20) e (80, 50) criará matrizes A e B de formas (rank, 50) e (100, rank), respectivamente. Em seguida, para adaptar uma camada de forma (100, 20), submatrizes A e B de formas (rank, 20) e (100, rank) serão extraídas.

Atualmente, o VeRA possui a seguinte restrição:

  • Apenas camadas nn.Linear são suportadas.

O resumo do artigo é:

A adaptação de baixo posto (LoRA) é um método popular que reduz o número de parâmetros treináveis ao fazer o ajuste fino de grandes modelos de linguagem, mas ainda enfrenta desafios agudos de armazenamento ao escalar para modelos ainda maiores ou ao implantar inúmeros modelos adaptados por usuário ou por tarefa. Neste trabalho, apresentamos a Adaptação de Matriz Aleatória Baseada em Vetores (VeRA), que reduz significativamente o número de parâmetros treináveis em comparação com o LoRA, mas mantém o mesmo desempenho. Ela alcança isso usando um único par de matrizes de baixo posto compartilhado entre todas as camadas e aprendendo pequenos vetores de escala no lugar. Demonstramos sua eficácia nos benchmarks GLUE e E2E, em tarefas de classificação de imagens, e mostramos sua aplicação no ajuste fino por instruções de modelos de linguagem de 7B e 13B.

Quando usar o VeRA

VeRA é uma boa escolha quando:

  • Você deseja minimizar o número de parâmetros treináveis mantendo um desempenho comparável ao do LoRA.
  • Você precisa armazenar ou implantar muitos adaptadores específicos para tarefas, onde checkpoints de adaptadores menores reduzem os requisitos de armazenamento.
  • Você está ajustando finamente modelos de linguagem muito grandes sob orçamentos rígidos de memória ou parâmetros.

Quando não usar o VeRA

VeRA pode não ser a melhor escolha quando:

  • Você precisa de matrizes de baixo posto independentes para cada camada adaptada, o que oferece maior flexibilidade nos parâmetros do adaptador aprendidos.
  • Seu modelo requer a adaptação de tipos de módulos diferentes de nn.Linear, pois o VeRA atualmente suporta apenas camadas lineares.
  • Seu modelo contém camadas lineares adaptadas com dimensões de entrada e saída amplamente diferentes. Como o VeRA compartilha um único par de matrizes de projeção entre todas as camadas adaptadas, essas matrizes devem ser dimensionadas para o maior formato. Modelos com grande variação nos formatos das camadas (por exemplo, camadas de projeção para cima e para baixo em transformers) podem, portanto, exigir o superdimensionamento das matrizes de projeção compartilhadas, reduzindo parte da vantagem de eficiência de parâmetros do VeRA.

Visão geral do benchmark

API

VeRAConfig

classe peft.VeraConfig

< >

( task_type: Optional[Union[str, TaskType]] = Nonepeft_type: Optional[Union[str, PeftType]] = Noneauto_mapping: Optional[dict] = Nonepeft_version: Optional[str] = Nonebase_model_name_or_path: Optional[str] = Nonerevision: Optional[str] = Noneinference_mode: bool = Falser: int = 256target_modules: Optional[Union[list[str], str]] = Noneprojection_prng_key: int = 0save_projection: bool = Truevera_dropout: float = 0.0d_initial: float = 0.1fan_in_fan_out: bool = Falsebias: str = 'none'modules_to_save: Optional[list[str]] = Noneinit_weights: bool = Truelayers_to_transform: Optional[Union[list[int], int]] = Nonelayers_pattern: Optional[Union[list[str], str]] = None )

Parâmetros

  • r (int, opcional, padrão 256) — Dimensão do parâmetro do VeRA (“rank”). Escolha valores maiores que os ranks do LoRA aqui, pois o VeRA usa muito menos parâmetros que o LoRA (veja a Tabela 1).
  • target_modules (Union[List[str], str]) — Os nomes dos módulos aos quais a Vera será aplicada. Somente camadas lineares são suportadas.
  • projection_prng_key (int) — Chave de inicialização do PRNG Vera. Usada para inicializar vera_A e vera_B para novos modelos ou ao carregar um checkpoint que não incluía essas projeções. O valor padrão é 0.
  • save_projection (bool) — Se as projeções vera_A / vera_B devem ser salvas no state dict junto com os pesos lambda_b / lambda_d por camada. Isso aumentará o tamanho do checkpoint, mas garantirá que o checkpoint possa ser recarregado em todas as configurações de sistema. O valor padrão é True.
  • vera_dropout (float) — A probabilidade de dropout para as camadas Vera.
  • d_initial (float, opcional, padrão 0.1) — Valor inicial de inicialização para o vetor vera_lambda_d usado ao inicializar os parâmetros do VeRA. Valores pequenos (<=0.1) são recomendados (veja a Tabela 6c no artigo).
  • fan_in_fan_out (bool) — Defina como True se a camada a ser substituída armazenar os pesos como (fan_in, fan_out). Por exemplo, o gpt-2 usa Conv1D, que armazena os pesos como (fan_in, fan_out), e portanto este parâmetro deve ser definido como True.
  • bias (str) — Tipo de viés para Vera. Pode ser ‘none’, ‘all’ ou ‘vera_only’. Se for ‘all’ ou ‘vera_only’, os vieses correspondentes serão atualizados durante o treinamento. Tenha em mente que isso significa que, mesmo ao desativar os adaptadores, o modelo não produzirá a mesma saída que o modelo base teria sem adaptação.
  • modules_to_save (List[str]) — Lista de módulos, além das camadas Vera, que devem ser configurados como treináveis e salvos no checkpoint final.
  • init_weights (bool) — Se as camadas Vera devem ter seus pesos inicializados com a inicialização padrão. Não altere esta configuração, a menos que saiba exatamente o que está fazendo.
  • layers_to_transform (Union[List[int],int]) — Os índices das camadas a serem transformadas. Se este argumento for especificado, as transformações Vera serão aplicadas aos índices das camadas especificados nesta lista. Se um único inteiro for passado, as transformações Vera serão aplicadas à camada neste índice.
  • layers_pattern (Optional[Union[List[str], str]]) — O nome do padrão de camadas, usado apenas se layers_to_transform for diferente de None. Isso deve apontar para o nn.ModuleList do modelo, que frequentemente é chamado de 'layers' ou 'h'.

Esta é a classe de configuração para armazenar a configuração de um VeraModel.

Artigo: https://huggingface.co/papers/2310.11454.

VeRAModel

classe peft.VeraModel

< >

( modelpeft_config: Union[PeftConfig, dict[str, PeftConfig]]adapter_name: strlow_cpu_mem_usage: bool = Falsestate_dict: Optional[dict[str, torch.Tensor]] = None ) → torch.nn.Module

Parâmetros

  • model (PreTrainedModel) — O modelo a ser adaptado.
  • config (VeraConfig) — A configuração do modelo Vera.
  • adapter_name (str) — O nome do adaptador, padrão é "default".
  • low_cpu_mem_usage (bool, optional, defaults to False) — Cria pesos de adaptador vazios no dispositivo meta. Útil para acelerar o processo de carregamento.

Retorna

torch.nn.Module

O modelo Vera.

Cria um modelo de Vector-based Random Matrix Adaptation (Vera) a partir de um modelo de transformers pré-treinado.

Exemplo:

>>> from transformers import AutoModelForCausalLM
>>> from peft import VeraConfig, get_peft_model

>>> base_model = AutoModelForCausalLM.from_pretrained("facebook/opt-125m")
>>> config = VeraConfig(r=128)
>>> model = get_peft_model(base_model, config)

Atributos:

Update on GitHub