PEFT documentation

VB-LoRA : Fine-tuning extrêmement efficace en termes de paramètres avec des banques de vecteurs

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

VB-LoRA : Fine-tuning extrêmement efficace en termes de paramètres avec des banques de vecteurs

Aperçu

VB-LoRA est une technique de fine-tuning efficace en termes de paramètres qui étend LoRA en apprenant un schéma de partage de paramètres fin au niveau des sous-vecteurs, atteignant ainsi une efficacité paramétrique nettement supérieure. Cela rend VB-LoRA particulièrement utile dans les scénarios où les coûts de stockage et de transmission sont critiques. Elle fonctionne en décomposant les matrices de faible rang — provenant de différentes couches et modules tels que K, Q, V et FFN — en sous-vecteurs, qui sont ensuite partagés globalement via une banque de vecteurs.

L'abstract de l'article est :

À mesure que l’adoption des grands modèles de langage augmente et que le besoin de personnalisation des modèles par utilisateur ou par tâche se développe, les méthodes d’ajustement fin efficace en termes de paramètres (PEFT), telles que l’adaptation de faible rang (LoRA) et ses variantes, engendrent des coûts de stockage et de transmission considérables. Pour réduire davantage les paramètres stockés, nous introduisons un paradigme « diviser et partager » qui brise les barrières de la décomposition de faible rang entre les dimensions des matrices, les modules et les couches en partageant les paramètres globalement via une banque de vecteurs. En tant qu’instanciation de ce paradigme pour LoRA, notre VB-LoRA proposé composite toutes les matrices de faible rang de LoRA à partir d’une banque de vecteurs partagée, avec un module d’admixion top-k différentiable. VB-LoRA atteint une efficacité paramétrique extrême tout en maintenant des performances comparables ou supérieures à celles des méthodes PEFT de l’état de l’art. Des expériences étendues démontrent l’efficacité de VB-LoRA sur les tâches de compréhension du langage naturel, de génération du langage naturel et d’ajustement par instructions. Lors de l’ajustement fin du modèle Llama2-13B, VB-LoRA n’utilise que 0,4 % des paramètres stockés de LoRA, tout en obtenant des résultats supérieurs.

Conseils d'utilisation

  • VB-LoRA utilise un module top-k creux pour apprendre le mécanisme de partage. Lors de l’enregistrement des paramètres de l’adaptateur, vous pouvez soit enregistrer uniquement les poids top-k et leurs indices en définissant save_only_topk_weights = True dans VBLoRAConfig, soit enregistrer tous les logits entraînables en le définissant sur False. L’activation de save_only_topk_weights = True réduit considérablement l’espace de stockage ; par exemple, dans Llama2-7B, la taille du fichier de stockage passe de 308 Mo à 2,5 Mo. Notez que les modèles enregistrés avec save_only_topk_weights = True sont destinés uniquement à la fusion ou à l’inférence et ne peuvent pas être utilisés pour reprendre l’entraînement.

  • VB-LoRA comporte deux ensembles de paramètres d'entraînement : les paramètres de la banque de vecteurs et les paramètres de logits. En pratique, nous avons constaté que les paramètres de logits nécessitent un taux d'apprentissage plus élevé, tandis que les paramètres de la banque de vecteurs en nécessitent un plus faible. Lors de l'utilisation de l'optimiseur AdamW, les taux d'apprentissage typiques sont de 0,01 pour les logits et de 0,001 pour les paramètres de la banque de vecteurs.

Aperçu des benchmarks

API

VBLoRAConfig

classe peft.VBLoRAConfig

< >

( 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 = 4num_vectors: int = 256vector_length: int = 256topk: int = 2target_modules: Optional[Union[list[str], str]] = Noneexclude_modules: Optional[Union[list[str], str]] = Nonesave_only_topk_weights: bool = Falsevblora_dropout: float = 0.0fan_in_fan_out: bool = Falsebias: str = 'none'modules_to_save: Optional[list[str]] = Noneinit_vector_bank_bound: float = 0.02init_logits_std: float = 0.1layers_to_transform: Optional[Union[list[int], int]] = Nonelayers_pattern: Optional[Union[list[str], str]] = None )

Paramètres

  • r (int) — Le rang des matrices incrémentales.
  • num_vectors (int) — Nombre de vecteurs dans la banque de vecteurs. Utilisez des valeurs plus élevées lorsque la taille du modèle augmente.
  • vector_length (int) — La longueur des vecteurs dans la banque de vecteurs. La longueur des vecteurs doit être divisible par la dimension cachée du modèle.
  • topk (int) — La valeur de K pour la sélection top-K. Une valeur de K plus grande augmente la taille du modèle enregistré. En pratique, fixer K=2 offre généralement les meilleures performances et l’efficacité paramétrique optimale. Pour plus de détails, reportez-vous à la discussion dans l’article.
  • target_modules (Union[List[str], str]) — Les noms des modules auxquels appliquer l’adaptateur. Si ce paramètre est spécifié, seuls les modules portant les noms indiqués seront remplacés. En passant une chaîne de caractères, une correspondance par expression régulière est effectuée. En passant une liste de chaînes de caractères, 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. Si ce paramètre est spécifié comme ‘all-linear’, tous les modules linéaires/Conv1D sont sélectionnés, à l’exception de la couche de sortie. Si ce paramètre n’est pas spécifié, les modules sont choisis en fonction de l’architecture du modèle. Si l’architecture est inconnue, une erreur est levée — dans ce cas, vous devez spécifier manuellement les modules cibles.
  • 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.
  • save_only_topk_weights (bool) — Indique s'il faut enregistrer uniquement les poids topk. Définir save_only_topk_weights = True réduit considérablement l'espace de stockage. Cependant, les modèles enregistrés dans ce mode ne peuvent être utilisés que pour la fusion ou l'inférence, et non pour reprendre l'entraînement.
  • vblora_dropout (float) — Probabilité de dropout pour les couches VBLoRA.
  • 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 VBLoRA. Peut être ‘none’, ‘all’ ou ‘vblora_only’. Si ‘all’ ou ‘vblora_only’, les biais correspondants seront mis à jour pendant l’entraînement. Sachez 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 VBLoRA, à définir comme entraînables et à enregistrer dans le point de contrôle final.
  • init_vector_bank_bound (float) — La banque de vecteurs est initialisée avec une distribution uniforme entre -init_vector_bank_bound et init_vector_bank_bound. Évitez d'initialiser la banque de vecteurs avec des zéros pour prévenir les gradients nuls. Une petite valeur, telle que 0.02, est généralement efficace. L'initialisation avec une grande valeur peut provoquer une instabilité de l'entraînement.
  • init_logits_std (float) — Les logits sont initialisés avec une distribution normale ayant un écart-type de init_logits_std. La valeur par défaut est 0.1.
  • layers_to_transform (Union[List[int],int]) — Les indices de couches à transformer. Si une liste d'entiers est transmise, l'adaptateur sera appliqué aux indices de couches spécifiés dans cette liste. Si un seul entier est transmis, les transformations seront 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. 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 VBLoRAModel.

Article : https://huggingface.co/papers/2405.15179

VBLoRAModel

classe peft.VBLoRAModel

< >

( 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 (PreTrainedModel) — Le modèle à adapter.
  • config (VBLoRAConfig) — La configuration du modèle VBLoRA.
  • 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 VBLoRA.

Crée un modèle VBLoRA à partir d'un modèle transformers pré-entraîné.

La méthode est décrite en détail dans https://huggingface.co/papers/2405.15179.

Exemple :

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

>>> base_model = AutoModelForCausalLM.from_pretrained("facebook/opt-125m")
>>> config = VBLoRAConfig(
...     task_type="SEQ_CLS",
...     r=4,
...     target_modules=["fc1", "fc2", "k_proj", "out_proj", "q_proj", "v_proj"],
...     num_vectors=60,
...     vector_length=256,
...     save_only_topk_weights=True,
... )
>>> model = get_peft_model(base_model, config)

Attributs :

get_nb_savable_parameters

< >

( adapter = 'default' )

Retourne le nombre de paramètres VB-LoRA sauvegardables et d'autres paramètres sauvegardables.

print_savable_parameters

< >

( )

Affiche le nombre de paramètres VB-LoRA sauvegardables et le nombre total de paramètres sauvegardables.

Update on GitHub