PEFT documentation
FourierFT: Ajuste fino da Transformada Discreta de Fourier
FourierFT: Ajuste fino da Transformada Discreta de Fourier
FourierFT é uma técnica de ajuste fino com eficiência de parâmetros que utiliza a Transformada Discreta de Fourier para comprimir os pesos ajustáveis do modelo. Esse método supera o LoRA no benchmark GLUE e em tarefas comuns de classificação de ViT, utilizando muito menos parâmetros.
O FourierFT possui atualmente as seguintes restrições:
- Apenas camadas
nn.Linearsão suportadas. - Camadas quantizadas não são suportadas.
Se essas restrições não funcionarem para o seu caso de uso, considere outros métodos.
O resumo do artigo é:
A adaptação de baixo rank (LoRA) tem ganhado muito interesse recentemente no ajuste fino de modelos de fundação. Ela reduz efetivamente o número de parâmetros treináveis ao incorporar matrizes de baixo rank A e B para representar a mudança de peso, ou seja, Delta W=BA. Apesar dos avanços do LoRA, ele enfrenta desafios de armazenamento ao lidar com adaptações de personalização extensas ou modelos base maiores. Neste trabalho, nosso objetivo é comprimir ainda mais os parâmetros treináveis aproveitando a poderosa expressividade da transformada de Fourier. Especificamente, introduzimos o FourierFT, que trata Delta W como uma matriz no domínio espacial e aprende apenas uma pequena fração de seus coeficientes espectrais. Com os coeficientes espectrais treinados, implementamos a transformada discreta de Fourier inversa para recuperar Delta W. Empiricamente, nosso método FourierFT mostra desempenho comparável ou superior ao do LoRA com menos parâmetros em diversas tarefas, incluindo compreensão de linguagem natural, geração de linguagem natural, ajuste de instruções e classificação de imagens. Por exemplo, ao realizar ajuste de instruções no modelo LLaMA2-7B, o FourierFT supera o LoRA com apenas 0.064M de parâmetros treináveis, em comparação com os 33.5M do LoRA.
Visão geral do benchmark
API
FourierFTConfig
classe peft.FourierFTConfig
< 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 = Falsen_frequency: int = 1000scaling: float = 150.0random_loc_seed: Optional[int] = 777fan_in_fan_out: bool = Falsetarget_modules: Optional[Union[list[str], str]] = Noneexclude_modules: Optional[Union[list[str], str]] = Nonebias: str = 'none'modules_to_save: Optional[list[str]] = Nonelayers_to_transform: Optional[Union[list[int], int]] = Nonelayers_pattern: Optional[Union[list[str], str]] = Nonen_frequency_pattern: Optional[dict] = <factory>init_weights: bool = False )
Parâmetros
- n_frequency (
int) — Número de frequências aprendíveis para a Transformada Discreta de Fourier. ‘n_frequency’ é um inteiro que é maior que 0 e menor ou igual a d^2 (assumindo que o peso W tem dimensões de d por d). Além disso, é o número de parâmetros treináveis necessários para atualizar cada peso delta W. ‘n_frequency’ afetará o desempenho e a eficiência para PEFT. Especificamente, tem pouco impacto na velocidade de treinamento, mas valores mais altos (tipicamente) resultam em maiores custos de memória de GPU e melhor precisão. Com o mesmotarget_modules, o número de parâmetros de LoRA é (2dr/n_frequency) vezes o de FourierFT. Os seguintes exemplos de configurações em relação a ‘n_frequency’ podem ser usados como referência para os usuários. Para tarefas de NLU com o modelo RoBERTa-large, adotar ‘n_frequency’: 1000 pode quase alcançar resultados similares aos de ‘r’: 8 em LoRA. Neste caso, o número de parâmetros de LoRA é cerca de 16 vezes o de FourierFT. Para tarefas de classificação de imagem com modelos Vit-large, adotar ‘n_frequency’: 3000 pode quase alcançar resultados similares aos de ‘r’: 16 em LoRA, onde o número de parâmetros de LoRA é cerca de 11 vezes o de FourierFT. - scaling (
float) — O valor de escala para a matriz delta W. Este é um hiperparâmetro importante usado para escalonamento, semelhante ao parâmetro ‘lora_alpha’ no método LoRA. ‘scaling’ pode ser determinado durante o processo de busca de hiperparâmetros. No entanto, se os usuários quiserem pular esse processo, podem se referir às configurações nos seguintes cenários. Este parâmetro pode ser definido como 100.0 ou 150.0 para os modelos RoBERTa-base e RoBERTa-large em todas as tarefas de NLU (GLUE). Este parâmetro pode ser definido como 300.0 para os modelos da família LLaMA em todo o instruction tuning. Este parâmetro pode ser definido como 300.0 para os modelos ViT-base e ViT-large em todas as tarefas de classificação de imagem. - random_loc_seed (
int) — Semente para a localização aleatória das frequências, ou seja, a matriz de entrada espectral. - target_modules (
Union[list[str],str]) — Lista de nomes de módulos ou expressão regular dos nomes de módulos a serem substituídos por FourierFT. Por exemplo, [‘q’, ‘v’] ou ‘.decoder.(SelfAttention|EncDecAttention).*(q|v)$‘. Somente camadas lineares são suportadas. - exclude_modules (
Optional[Union[List[str], str]]) — Os nomes dos módulos para os quais o adaptador não deve ser aplicado. Ao passar uma string, será realizada uma correspondência por expressão regular. Ao passar uma lista de strings, será realizada uma correspondência exata ou será verificado se o nome do módulo termina com qualquer uma das strings passadas. - fan_in_fan_out (
bool) — Defina como True se a camada a ser substituída armazenar os pesos como (fan_in, fan_out). - bias (
str) — Tipo de viés para FourierFT. Pode ser ‘none’, ‘all’ ou ‘fourier_only’. - modules_to_save (
list[str]) — Lista de módulos, além das camadas FourierFT, que devem ser configurados como treináveis e salvos no checkpoint final. Por exemplo, em tarefas de Classificação de Sequência ou Classificação de Token, a camada finalclassifier/scoreé inicializada aleatoriamente e, portanto, precisa ser treinável e salva. - layers_to_transform (
Union[list[int],int]) — Os índices das camadas a serem transformadas. Se este argumento for especificado, o PEFT transformará apenas os índices das camadas especificados dentro desta lista. Se um único inteiro for passado, o PEFT transformará apenas a camada neste índice. - layers_pattern (
Optional[Union[List[str], str]]) — O nome do padrão de camadas, usado apenas selayers_to_transformfor diferente de None e se o padrão de camadas não estiver no padrão de camadas comum. Isso deve apontar para onn.ModuleListdo modelo, que frequentemente é chamado de'layers'ou'h'. - n_frequency_pattern (
dict) — O mapeamento de nomes de camadas ou expressões regulares para n_frequency que são diferentes do padrão especificado. Por exemplo,{model.decoder.layers.0.encoder_attn.k_proj: 1000}. - init_weights (
bool) — A inicialização dos pesos de Fourier. Defina este valor como False (o padrão) se o espectro for inicializado com uma distribuição normal padrão. Defina este valor como True se o espectro for inicializado com zeros.
Esta é a classe de configuração para armazenar a configuração de um FourierFTModel.
FourierFTModel
classe peft.FourierFTModel
< 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 (
torch.nn.Module) — O modelo a ser adaptado. - config (FourierFTConfig) — A configuração do modelo FourierFT.
- 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 FourierFT.
Cria um modelo FourierFT a partir de um modelo transformers pré-treinado.
O método é descrito em detalhes em https://huggingface.co/papers/2405.03003.
Atributos:
- model (PreTrainedModel) — O modelo a ser adaptado.
- peft_config (FourierFTConfig): A configuração do modelo Fourier.