PEFT documentation
MiSS
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 dimensionout_features, contrôlé parmini_r. Cela réduit encore davantage le nombre de paramètres entraînables. Lors de l’utilisation de ce mode,mini_rdoit être défini etout_featuresdoit être divisible parmini_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
< 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 = 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 dimensionout_features. Lorsque vous définissezinit_weights=mini, vous devez définirmini_r. Veuillez vous assurer queout_featuresest divisible parmini_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 silayers_to_transformest différent deNone. - 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
< 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
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éfautFalse) — 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.