PEFT documentation
Adaptadores de Rango Alto Esparsos
Adaptadores de Rango Alto Esparsos
Sparse High Rank Adapters ou SHiRA é um tipo alternativo de adaptador e tem se mostrado com vantagens significativas em relação aos adaptadores de baixo rank. Especificamente, o SHiRA atinge melhor precisão que o LoRA para uma variedade de tarefas de visão e linguagem. Ele também oferece fusão de múltiplos adaptadores mais simples e de maior qualidade, reduzindo significativamente a perda de conceito, um problema comum enfrentado pelos adaptadores de baixo rank. O SHiRA faz o ajuste fino diretamente de um pequeno número de parâmetros do modelo base para ajustar o modelo a qualquer tarefa de adaptação.
SHiRA atualmente possui a seguinte restrição:
- Apenas camadas
nn.Linearsão suportadas.
O resumo do artigo é:
A Low Rank Adaptation (LoRA) tem recebido enorme atenção na pesquisa recente de IA generativa. Uma das principais vantagens da LoRA é sua capacidade de ser fundida com modelos pré-treinados, sem adicionar sobrecarga durante a inferência. No entanto, do ponto de vista de implantação em dispositivos móveis, podemos evitar a sobrecarga de inferência no modo fundido, mas perdemos a capacidade de alternar adaptadores rapidamente, ou sofrer latência de inferência significativa (até 30% maior) ao permitir alternância rápida no modo não fundido. A LoRA também exibe perda de conceito quando múltiplos adaptadores são usados simultaneamente. Neste artigo, propomos os Sparse High Rank Adapters (SHiRA), um novo paradigma que não incorre em sobrecarga de inferência, permite alternância rápida e reduz significativamente a perda de conceito. Especificamente, o SHiRA pode ser treinado ajustando diretamente apenas 1-2% dos pesos do modelo base, mantendo os demais inalterados. Isso resulta em um adaptador altamente esparsa que pode ser alternado diretamente no modo fundido. Fornecemos, além disso, insights teóricos e empíricos sobre como a alta esparsidade no SHiRA pode auxiliar a fusão de múltiplos adaptadores ao reduzir a perda de conceito. Nossos extensos experimentos em LVMs e LLMs demonstram que o ajuste fino de apenas uma pequena fração dos parâmetros no modelo base supera significativamente a LoRA, ao mesmo tempo em que permite alternância rápida e fusão de múltiplos adaptadores. Por fim, fornecemos uma implementação de SHiRA eficiente em latência e memória, baseada na Library Parameter-Efficient Finetuning (PEFT), que treina em uma velocidade quase a mesma da LoRA, consumindo até 16% menos memória de pico na GPU, tornando o SHiRA fácil de adotar para casos de uso práticos. Para demonstrar os benefícios da alternância rápida durante a inferência, mostramos que carregar o SHiRA em um modelo base pode ser 5x a 16x mais rápido do que a fusão da LoRA em uma CPU.
Visão geral do benchmark
API
ShiraConfig
classe peft.ShiraConfig
< 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 = 32mask_type: Literal['random'] = 'random'random_seed: Optional[int] = Nonetarget_modules: Optional[Union[list[str], str]] = Nonefan_in_fan_out: bool = Falseinit_weights: bool = Truemodules_to_save: Optional[list[str]] = None )
Parâmetros
- r (
int, opcional, padrão32) — Para um módulo de destino específico, o número de parâmetros SHiRA é calculado como r(m+n), onde as dimensões originais do tensor são m x n. Isso significa que o número de parâmetros SHiRA é o mesmo que o de um adaptador LoRA. SHiRA é um adaptador de alto rank. Definir este parâmetro r não restringe o rank a esse valor. - mask_type (
str, defaults torandom) — Type of mask function. Defaults to a random sparse mask. An optional user-defined mask_fn to compute the mask value can also be supplied by instantiatingconfig = ShiraConfig(...)and then settingconfig.mask_fn = <your custom mask function>. For a pretrained weight with shape m x n, the custom mask function must return only one mask (shape: m x n) which must be binary 0 or 1 with num_shira_parameters = r(m + n) for linear layers. Device and dtype of mask must be same as base layer’s weight’s device and dtype. Please see mask_functions.py for more details and to see the default random sparse mask implementation. - random_seed (
int, opcional, padrãoNone) — semente aleatória para o gerador do torch para random_mask. - 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 SHiRA. Por exemplo, [‘q’, ‘v’] ou ‘.decoder.(SelfAttention|EncDecAttention).*(q|v)$‘. Somente camadas lineares são suportadas. - 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. - init_weights (
bool, padrãoTrue) — Inicializa o peso do SHiRA com valores zero. Se definido como False, os pesos do SHiRA são inicializados com valores randn em vez de zeros, e isso é usado apenas para testes. - modules_to_save (
List[str]) — Lista de módulos, além das camadas SHiRA, que devem ser configurados como treináveis e salvos no checkpoint final.
Esta é a classe de configuração para armazenar a configuração de um ShiraModel.
ShiraModel
classe peft.ShiraModel
< 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 (ShiraConfig) — A configuração do modelo SHiRA.
- adapter_name (
str) — O nome do adaptador, padrão é"default".
Retorna
torch.nn.Module
O modelo SHiRA.
Cria um modelo Sparse High Rank Adapter (SHiRA) a partir de um modelo pré-treinado.
Exemplo:
>>> from transformers import AutoModelForCausalLM
>>> from peft import ShiraConfig, get_peft_model
>>> base_model = AutoModelForCausalLM.from_pretrained("facebook/opt-125m")
>>> config = ShiraConfig(r=32)
>>> model = get_peft_model(base_model, config)Atributos:
- model (PreTrainedModel) — O modelo a ser adaptado.
- peft_config (ShiraConfig): A configuração do modelo SHiRA.