PEFT documentation

Adaptateurs de rang élevé creux

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

Adaptateurs de rang élevé creux

Les adaptateurs de rang élevé creux, ou SHiRA, sont un type alternatif d’adaptateur qui présente des avantages significatifs par rapport aux adaptateurs de rang faible. Plus précisément, SHiRA atteint une meilleure précision que LoRA pour une variété de tâches de vision et de langage. Il offre également une fusion multi-adaptateurs plus simple et de meilleure qualité en réduisant considérablement la perte de concept, un problème courant rencontré par les adaptateurs de rang faible. SHiRA ajuste directement un petit nombre de paramètres du modèle de base pour l’adapter à toute tâche d’adaptation.

SHiRA présente actuellement la contrainte suivante :

  • Seules les couches nn.Linear sont prises en charge.

L'abstract de l'article est :

Low Rank Adaptation (LoRA) a suscité un intérêt considérable dans les recherches récentes sur l'IA générative. L'un des principaux avantages de LoRA est sa capacité à être fusionné avec des modèles pré-entraînés, sans surcoût pendant l'inférence. Cependant, du point de vue du déploiement mobile, nous pouvons soit éviter le surcoût d'inférence en mode fusionné mais perdre la capacité à basculer rapidement entre les adaptateurs, soit subir une latence d'inférence significative (jusqu'à 30 % de plus) tout en permettant un basculement rapide en mode non fusionné. LoRA présente également une perte de concept lorsque plusieurs adaptateurs sont utilisés simultanément. Dans cet article, nous proposons Sparse High Rank Adapters (SHiRA), un nouveau paradigme qui ne génère aucun surcoût d'inférence, permet un basculement rapide et réduit considérablement la perte de concept. Plus précisément, SHiRA peut être entraîné en ajustant directement uniquement 1 à 2 % des poids du modèle de base, en laissant les autres inchangés. Cela aboutit à un adaptateur très creux (sparse) qui peut être basculé directement en mode fusionné. Nous fournissons par ailleurs des insights théoriques et empiriques sur la manière dont la forte sparsité de SHiRA peut favoriser la fusion multi-adaptateurs en réduisant la perte de concept. Nos expériences étendues sur les LVMs et les LLMs démontrent que l'ajustement fin d'une petite fraction des paramètres du modèle de base surpasse significativement LoRA tout en permettant à la fois un basculement rapide et une fusion multi-adaptateurs. Enfin, nous fournissons une implémentation de SHiRA efficace en latence et en mémoire, basée sur la bibliothèque Parameter-Efficient Finetuning (PEFT), qui s'entraîne à une vitesse quasi identique à celle de LoRA tout en consommant jusqu'à 16 % de mémoire GPU de pointe en moins, rendant ainsi SHiRA facile à adopter pour des cas d'usage pratiques. Pour démontrer les avantages du basculement rapide pendant l'inférence, nous montrons que le chargement de SHiRA sur un modèle de base peut être 5 à 16 fois plus rapide que la fusion LoRA sur un CPU.

Aperçu des benchmarks

API

ShiraConfig

classe peft.ShiraConfig

< >

( 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 )

Paramètres

  • r (int, facultatif, valeur par défaut 32) — Pour un module cible donné, le nombre de paramètres SHiRA est calculé comme r(m+n), où les dimensions du tenseur d’origine sont m x n. Cela signifie que le nombre de paramètres SHiRA est identique à celui d’un adaptateur LoRA. SHiRA est un adaptateur de rang élevé. La définition de ce paramètre r n’impose pas de limiter le rang à cette valeur.
  • mask_type (str, defaults to random) — 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 instantiating config = ShiraConfig(...) and then setting config.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, facultatif, par défaut None) — graine aléatoire pour le générateur torch de random_mask.
  • target_modules (Union[List[str], str]) — Liste de noms de modules ou expression régulière des noms de modules à remplacer par SHiRA. Par exemple, [‘q’, ‘v’] ou ‘.decoder.(SelfAttention|EncDecAttention).*(q|v)$‘. Seules les couches linéaires sont prises en charge.
  • 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.
  • init_weights (bool, par défaut True) — Initialise les poids de SHiRA avec des valeurs nulles. Si défini à False, les poids de SHiRA sont initialisés avec des valeurs randn au lieu de zéros, ce qui est utilisé uniquement pour les tests.
  • modules_to_save (List[str]) — Liste des modules, à l'exception des couches SHiRA, à définir comme entraînables et à enregistrer dans le point de contrôle final.

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

ShiraModel

classe peft.ShiraModel

< >

( 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 (ShiraConfig) — La configuration du modèle SHiRA.
  • adapter_name (str) — Le nom de l'adaptateur, par défaut "default".

Retourne

torch.nn.Module

Le modèle SHiRA.

Crée un modèle Sparse High Rank Adapter (SHiRA) à partir d'un modèle pré-entraîné.

Exemple :

>>> 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)

Attributs :

Update on GitHub