PEFT documentation
VeRA: Vector-based Random Matrix Adaptation
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.Linearsã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
< source >( 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ão256) — 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ão0.1) — Valor inicial de inicialização para o vetorvera_lambda_dusado 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 usaConv1D, que armazena os pesos como (fan_in, fan_out), e portanto este parâmetro deve ser definido comoTrue. - 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 selayers_to_transformfor diferente deNone. Isso deve apontar para onn.ModuleListdo modelo, que frequentemente é chamado de'layers'ou'h'.
Esta é a classe de configuração para armazenar a configuração de um VeraModel.
VeRAModel
classe peft.VeraModel
< source >( 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 toFalse) — 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:
- model (PreTrainedModel) — O modelo a ser adaptado.
- peft_config (VeraConfig): A configuração do modelo Vera.