PEFT documentation

BOFT

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

BOFT

Orthogonal Butterfly (BOFT) est une méthode générique conçue pour l’ajustement fin des modèles de fondation. Elle améliore l’efficacité paramétrique du paradigme d’ajustement fin — Orthogonal Finetuning (OFT) — en s’inspirant de la transformée de Fourier rapide de Cooley-Tukey, et obtient des résultats favorables lors de l’ajustement fin de différents modèles de fondation, y compris de grands vision transformers, de grands modèles de langage et des modèles de diffusion texte-vers-image.

L'abstract de l'article est :

Les grands modèles de fondation sont devenus omniprésents, mais les entraîner à partir de zéro est prohibitivement coûteux. Ainsi, adapter efficacement ces modèles puissants à des tâches en aval est de plus en plus important. Dans cet article, nous étudions un paradigme d’ajustement fin (finetuning) fondé sur des principes — l’ajustement fin orthogonal (Orthogonal Finetuning, OFT) — pour l’adaptation à des tâches en aval. Malgré une bonne généralisabilité, OFT utilise encore un nombre relativement élevé de paramètres entraînables en raison de la haute dimensionnalité des matrices orthogonales. Pour y remédier, nous commençons par examiner OFT sous l’angle de la transmission d’information, puis nous identifions quelques exigences clés permettant une meilleure efficacité en paramètres. Inspirés par la façon dont l’algorithme de transformée de Fourier rapide de Cooley-Tukey permet une transmission d’information efficace, nous proposons une paramétrisation orthogonale efficace utilisant des structures en papillon (butterfly). Nous appliquons cette paramétrisation à OFT, créant ainsi une nouvelle méthode d’ajustement fin efficace en paramètres, appelée Orthogonal Butterfly (BOFT). En subsumant OFT comme cas particulier, BOFT introduit un cadre généralisé d’ajustement fin orthogonal. Enfin, nous menons une étude empirique approfondie de l’adaptation de grands transformeurs visuels, de grands modèles de langage et de modèles de diffusion texte-vers-image à diverses tâches en aval en vision et en langage.

BOFT se concentre sur la préservation des capacités génératives d'un modèle pré-entraîné tout en étant nettement plus efficace en termes de paramètres que le OFT standard. Comme OFT, BOFT maintient la même similarité cosinus (hyperspherical energy) entre toutes les paires de neurones d'une couche en appliquant une transformation orthogonale à la matrice de poids pré-entraînée, garantissant ainsi que les relations sémantiques entre les neurones sont préservées.

Plutôt que d’utiliser une matrice orthogonale bloc-diagonale, BOFT factorise la transformation orthogonale en un produit de matrices papillon creuses (introduites à l’origine dans la FFT de Cooley–Tukey). Contrairement aux rotations bloc-diagonales de OFT, qui ne mélangent les entrées qu’à l’intérieur de chaque bloc, la structure papillon garantit que chaque entrée peut influencer chaque sortie, produisant une connectivité dense avec seulement O(d log d) paramètres. Cette factorisation préserve l’expressivité tout en réduisant considérablement le nombre de paramètres par rapport à OFT (au prix du temps de calcul).

En pratique, BOFT multiplie chaque matrice de poids préentraînée par une suite de facteurs orthogonaux structurés en papillon, permettant des rotations de neurones efficaces et expressives. Cela rend BOFT particulièrement adapté à la génération contrôlée et aux tâches où le maintien de la représentation du sujet du modèle préentraîné est crucial, tout en permettant de passer à l'échelle vers des modèles plus volumineux avec une empreinte mémoire et un coût de calcul réduits.

BOFT peut être appliqué à n'importe quel sous-ensemble de matrices de poids d'un réseau de neurones afin de réduire le nombre de paramètres entraînables. Étant donné les couches cibles pour l'injection des paramètres BOFT, le nombre de paramètres entraînables peut être déterminé en fonction de la taille des matrices de poids.

Aperçu des benchmarks

Fusionner les poids BOFT dans le modèle de base

De manière similaire à LoRA, les poids appris par BOFT peuvent être intégrés aux matrices de poids préentraînées à l'aide de la fonction [~BOFTModel.merge_and_unload(). Cette fonction fusionne les poids de l'adaptateur avec le modèle de base, ce qui vous permet d'utiliser efficacement le modèle nouvellement fusionné comme un modèle autonome.

Cela fonctionne car, pendant l’entraînement, la matrice de poids orthogonale (R dans le schéma ci-dessus) et les matrices de poids pré-entraînées sont distinctes. Mais une fois l’entraînement terminé, ces poids peuvent en réalité être fusionnés (multipliés) pour former une nouvelle matrice de poids équivalente.

Exemple d'utilisation de BOFT

Pour un exemple d'application de la méthode BOFT à diverses tâches en aval, veuillez consulter les guides suivants :

Consultez les guides étape par étape suivants sur la façon d’affiner un modèle avec BOFT :

Pour la tâche de classification d'images, on peut initialiser la configuration BOFT pour un modèle DinoV2 comme suit :

import transformers
from transformers import AutoModelForSeq2SeqLM, BOFTConfig
from peft import BOFTConfig, get_peft_model

config = BOFTConfig(
    boft_block_size=4,
    boft_n_butterfly_factor=2,
    target_modules=["query", "value", "key", "output.dense", "mlp.fc1", "mlp.fc2"],
    boft_dropout=0.1,
    bias="boft_only",
    modules_to_save=["classifier"],
)

model = transformers.Dinov2ForImageClassification.from_pretrained(
    "facebook/dinov2-large",
    num_labels=100,
)

boft_model = get_peft_model(model, config)

API

BOFTConfig

classe peft.BOFTConfig

< >

( 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 = Falseboft_block_size: int = 4boft_block_num: int = 0boft_n_butterfly_factor: int = 1target_modules: Optional[Union[list[str], str]] = Noneexclude_modules: Optional[Union[list[str], str]] = Noneboft_dropout: float = 0.0fan_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 )

Paramètres

  • boft_block_size (int) — Taille des blocs de la matrice BOFT à travers les différentes couches, exprimée en int. Des tailles de blocs plus grandes entraînent des matrices de mise à jour plus denses, avec un plus grand nombre de paramètres entraînables. Choisissez boft_block_size de manière à ce qu’il soit divisible par la dimension d’entrée de la plupart des couches (in_features), par exemple 4, 8, 16. Veuillez également ne spécifier que boft_block_size ou boft_block_num, mais pas les deux simultanément, ni laisser les deux à 0, car boft_block_size x boft_block_num doit être égal à la dimension d’entrée de la couche.
  • boft_block_num (int) — Nombre de blocs BOFT par couche injectée. Un boft_block_num plus grand entraîne des matrices de mise à jour plus creuses avec moins de paramètres entraînables. Notez que vous devez choisir boft_block_num de manière à ce qu’il soit divisible par la dimension d’entrée de la plupart des couches (in_features), par exemple 4, 8, 16. Spécifiez uniquement boft_block_size ou boft_block_num, mais pas les deux simultanément, ni les laisser à 0, car boft_block_size x boft_block_num doit être égal à la dimension d’entrée de la couche.
  • boft_n_butterfly_factor (int) — Nombre de facteurs de papillon à travers les différentes couches. Pour boft_n_butterfly_factor=1, BOFT est identique à l'OFT classique ; pour boft_n_butterfly_factor=2, la taille effective des blocs de l'OFT est doublée et le nombre de blocs est divisé par deux.
  • target_modules (Union[List[str],str]) — Les noms des modules auxquels appliquer l’adaptateur.
  • exclude_modules (Optional[Union[List[str], str]]) — Les noms des modules auxquels l’adaptateur ne doit pas être appliqué. Si une chaîne de caractères est transmise, une correspondance par expression régulière est effectuée. Si une liste de chaînes de caractères est transmise, une correspondance exacte est effectuée ou il est vérifié si le nom du module se termine par l’une des chaînes transmises.
  • boft_dropout (float) — Probabilité de dropout multiplicatif, consistant à définir les blocs OFT comme l'identité pendant l'entraînement, de manière similaire à la couche de dropout dans LoRA.
  • fan_in_fan_out (bool) — Définissez cette valeur sur True si la couche à remplacer stocke les poids sous la forme (fan_in, fan_out). Par exemple, gpt-2 utilise Conv1D qui stocke les poids sous la forme (fan_in, fan_out) et il convient donc de définir cette valeur sur True.
  • bias (str) — Type de biais pour BOFT. Peut être ‘none’, ‘all’ ou ‘boft_only’. Si ‘all’ ou ‘boft_only’, les biais correspondants seront mis à jour pendant l’entraînement. Notez que cela signifie que, même en désactivant les adaptateurs, le modèle ne produira pas la même sortie que le modèle de base sans adaptation.
  • modules_to_save (List[str]) — Liste des modules, à l'exception des couches BOFT, à définir comme entraînables et à enregistrer dans le point de contrôle final.
  • layers_to_transform (Union[List[int],int]) — Les index des couches à transformer. Si cet argument est spécifié, les transformations BOFT sont appliquées aux index de couches indiqués dans cette liste. Si un seul entier est transmis, les transformations BOFT sont appliquées à la couche située à cet index.
  • layers_pattern (Optional[Union[List[str], str]]) — Le nom du motif de couche, utilisé uniquement si layers_to_transform est différent de None et si le motif de couche ne figure pas dans les motifs de couches courants. Il doit cibler le nn.ModuleList du modèle, souvent appelé 'layers' ou 'h'.

Ceci est la classe de configuration destinée à stocker la configuration d'un BOFTModel.

BOFTModel

classe peft.BOFTModel

< >

( 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

Paramètres

  • model (transformers.PreTrainedModel) — Le modèle à adapter.
  • config (BOFTConfig) — La configuration du modèle BOFT.
  • adapter_name (str) — Le nom de l'adaptateur, par défaut "default".
  • low_cpu_mem_usage (bool, optional, par défaut False) — Crée des poids d'adaptateurs vides sur l'appareil méta. Utile pour accélérer le processus de chargement.

Retourne

torch.nn.Module

Le modèle BOFT.

Crée un modèle BOFT et OFT à partir d'un modèle transformers pré-entraîné. Article : https://huggingface.co/papers/2311.06243 https://huggingface.co/papers/2306.07280

Exemple :

>>> import transformers
>>> from peft import BOFTConfig, get_peft_model

>>> config = BOFTConfig(
...     boft_block_size=8,
...     boft_n_butterfly_factor=1,
...     target_modules=["query", "value", "key", "output.dense", "mlp.fc1", "mlp.fc2"],
...     boft_dropout=0.1,
...     bias="boft_only",
...     modules_to_save=["classifier"],
... )

>>> model = transformers.Dinov2ForImageClassification.from_pretrained(
...     "facebook/dinov2-large",
...     num_labels=100,
... )
>>> boft_model = get_peft_model(model, config)

Attributs :

Update on GitHub