PEFT documentation

MiSS

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

MiSS

MiSS (Matrix Shard Sharing) est une méthode PEFT qui offre un bon équilibre entre les performances du modèle et l'efficacité computationnelle. Elle n'exige qu'une seule matrice entraînable et introduit un mécanisme de partage de shards distinct de LoRA.

L'abstract de l'article est :

Les méthodes de fine-tuning à faible coût paramétrique (PEFT), en particulier l’adaptation de faible rang (LoRA), réduisent efficacement le nombre de paramètres entraînables dans les grands modèles de langage (LLM). Toutefois, à mesure que l’échelle des modèles augmente, la demande en ressources de calcul reste un défi majeur. Les variantes existantes de LoRA peinent souvent à trouver un équilibre optimal entre adaptabilité (performance du modèle et vitesse de convergence) et efficacité (surcharge de calcul, utilisation de la mémoire et temps d’initialisation). Cet article présente MiSS (Matrix Shard Sharing), une nouvelle approche PEFT qui aborde ce compromis par un simple mécanisme de partage de fragments. MiSS exploite le fait qu’une adaptation de faible rang peut être obtenue en décomposant la matrice de poids en plusieurs matrices fragmentaires et en utilisant un fragment commun partagé et entraînable. Cette méthode construit la matrice de mise à jour de faible rang par la réplication de ces fragments partagés et partitionnés. Nous proposons également une implémentation efficace sur le plan matériel et largement applicable pour MiSS. Des expériences étendues menées sur une variété de tâches, accompagnées d’une analyse systématique des performances de calcul, démontrent la supériorité de MiSS. Les résultats montrent que MiSS surpasse significativement LoRA standard et ses variantes notables, tant sur les métriques de performance du modèle que sur l’efficacité de calcul, y compris la vitesse d’initialisation et le débit d’entraînement. En équilibrant efficacement la puissance expressive et l’utilisation des ressources, MiSS offre une solution convaincante pour adapter efficacement les modèles de grande envergure.

Aperçu des benchmarks

Quand utiliser MiSS

MiSS est un bon choix lorsque :

  • Vous souhaitez une initialisation plus rapide et un débit d’entraînement supérieur à celui des schémas d’initialisation LoRA avancés qui utilisent des configurations coûteuses (telles que PiSSA, LoRA-GA ou OLoRA).
  • Vous souhaitez une alternative à LoRA à intégrer directement, avec un minimum de modifications de configuration.

Si vous avez besoin d'une expressivité accrue au détriment de l'efficacité, envisagez la variante d'initialisation bat (voir ci-dessous).

modes de init_weights

MiSS prend en charge trois modes d’initialisation via le paramètre init_weights :

  • True (par défaut) : initialisation MiSS standard. Point de départ idéal pour la plupart des cas d’usage.
  • "bat" : Active des mises à jour non linéaires entre les différents shards. Produit de meilleurs résultats que MiSS standard, mais utilise plus de mémoire et est environ deux fois plus lent. Utilisez cette option lorsque la performance est prioritaire par rapport à l'efficacité.
  • "mini" : utilise un rang plus petit le long de la dimension out_features, contrôlé par mini_r. Cela réduit encore davantage le nombre de paramètres entraînables. Lors de l’utilisation de ce mode, mini_r doit être défini et out_features doit être divisible par mini_r.

Démarrage rapide

import torch
from peft import MissConfig, get_peft_model
from transformers import AutoModelForCausalLM, AutoTokenizer

model = AutoModelForCausalLM.from_pretrained(
    "meta-llama/Llama-2-7b-hf",
    torch_dtype=torch.bfloat16,
    device_map="auto"
)
tokenizer = AutoTokenizer.from_pretrained("meta-llama/Llama-2-7b-hf")
tokenizer.pad_token_id = tokenizer.eos_token_id

# Standard MiSS
config = MissConfig(
    r=64,
    miss_dropout=0.01,
    task_type="CAUSAL_LM"
)

# BAT variant — better performance, more memory
# config = MissConfig(
#     r=64,
#     init_weights="bat",
#     task_type="CAUSAL_LM"
# )

# Mini variant — fewer trainable parameters
# config = MissConfig(
#     r=64,
#     init_weights="mini",
#     mini_r=8,
#     task_type="CAUSAL_LM"
# )

model = get_peft_model(model, config)
model.print_healthcheck()

Pour un exemple complet de fine-tuning incluant l’entraînement et l’inférence, consultez l’exemple de fine-tuning MiSS.

API

MissConfig

classe peft.MissConfig

< >

( 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 = 64miss_dropout: float = 0.0mini_r: int = 1target_modules: Optional[Union[list[str], str]] = Noneexclude_modules: Optional[Union[list[str], str]] = Noneinit_weights: bool | Literal['bat', 'mini'] = Truelayers_to_transform: Optional[Union[list[int], int]] = Nonelayers_pattern: Optional[str] = Nonebias: str = 'none'modules_to_save: Optional[list[str]] = None )

Paramètres

  • r (int) — Le rang de MiSS à travers les différentes couches. Il est préférable de définir « r » sur un nombre pair ; sinon, la méthode d’initialisation par défaut ne fonctionnera pas. Le rang de MiSS correspond à une décomposition de faible rang le long de la dimension in_features.
  • miss_dropout (float) — Probabilité de dropout pour les couches MiSS.
  • mini_r (int) — Le rang de MiSS correspond à une décomposition de rang faible le long de la dimension out_features. Lorsque vous définissez init_weights=mini, vous devez définir mini_r. Veuillez vous assurer que out_features est divisible par mini_r.
  • target_modules (Optional[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 cas de chaîne de caractères, une correspondance par expression régulière est effectuée. En cas de liste de chaînes de caractères, une correspondance exacte est réalisée ou il est vérifié si le nom du module se termine par l’une des chaînes fournies. Si la valeur est « all-linear », tous les modules linéaires 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.
  • init_weights (bool | Literal[“bat”, “mini”]) — Les différentes initialisations correspondent à différentes variantes de MiSS. Par défaut (balance), la méthode la plus efficace et la plus générale de MiSS sera utilisée. ‘bat’ : dans ce mode, vous pouvez activer des mises à jour non linéaires à travers différents shards. ‘mini’ : dans ce mode, vous pouvez définir un rang plus petit pour utiliser moins de paramètres entraînables, mais il est recommandé de conserver out_features % mini_r == 0.
  • 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 (str) — Le nom du motif de couche, utilisé uniquement si layers_to_transform est différent de None.
  • bias (str) — Type de biais pour MiSS. Peut être 'none', 'all' ou 'MiSS_only'.
  • modules_to_save (List[str]) — Liste des modules, en dehors des couches d’adaptateur, à 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 MissModel.

MissModel

classe peft.MissModel

< >

( 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 (torch.nn.Module) — Le modèle auquel les couches d’adaptation du tuner seront attachées.
  • config (MissConfig) — La configuration du modèle MiSS.
  • 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 MiSS.

Crée un modèle Matrix Shard Sharing (MiSS) à partir d'un modèle pré-entraîné. La méthode est décrite dans https://huggingface.co/papers/2409.15371

Exemple :

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

>>> base_model = AutoModelForCausalLM.from_pretrained("facebook/opt-125m")
>>> config = MissConfig(r=64)
>>> model = get_peft_model(base_model, config)

Attributs :

  • model (~torch.nn.Module) — Le modèle à adapter.
  • peft_config (MissConfig) : La configuration du modèle MiSS.
Update on GitHub