PEFT documentation

TinyLoRA : apprendre à raisonner avec 13 paramètres

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

TinyLoRA : apprendre à raisonner avec 13 paramètres

TinyLoRA est une technique de fine-tuning extrêmement efficace en termes de paramètres, qui s’appuie sur l’approche LoRA-XS en utilisant la décomposition SVD des poids figés et en projetant un petit vecteur entraînable à travers des tenseurs aléatoires fixes. Combinée à des méthodes d’entraînement par apprentissage par renforcement (RL) telles que GRPO, TinyLoRA peut atteindre des performances compétitives avec seulement 1 à 13 paramètres entraînables.

L'innovation clé de TinyLoRA consiste à remplacer la matrice de faible rang entraînable R par une somme pondérée de matrices de projection aléatoires fixes : R = Σᵢ vᵢ Pᵢ, où v ∈ R^u est un petit vecteur entraînable de dimension u et où Pᵢ sont des matrices aléatoires fixes. Cela réduit considérablement le nombre de paramètres entraînables tout en maintenant des performances compétitives.

TinyLoRA prend en charge le partage de poids via le paramètre weight_tying, un ratio compris entre 0.0 et 1.0 qui contrôle le nombre de modules partageant le même vecteur entraînable v. Définir weight_tying=0.0 (la valeur par défaut) signifie qu'il n'y a aucun partage, tandis que weight_tying=1.0 signifie un partage complet entre tous les modules cibles — atteignant ainsi une efficacité paramétrique extrême avec un seul vecteur de u paramètres entraînables pour l'ensemble du modèle.

Lors de l’enregistrement des paramètres de l’adaptateur, il est possible d’éviter de stocker les matrices de projection aléatoire en définissant save_projection=False sur TinyLoraConfig. Dans ce cas, ces matrices seront restaurées à partir de la graine aléatoire fixe définie par l’argument projection_seed. Cela réduit la taille du point de contrôle, mais nous ne pouvons pas garantir la reproductibilité sur tous les appareils ni pour toutes les futures versions de PyTorch. Si vous souhaitez garantir la reproductibilité, définissez save_projection=True (ce qui est la valeur par défaut).

TinyLoRA présente actuellement les contraintes suivantes :

  • Seules les couches nn.Linear, nn.Embedding et transformers.pytorch_utils.Conv1D sont prises en charge.

L'abstract de l'article est :

Des recherches récentes ont montré que les modèles de langage peuvent apprendre à raisonner, souvent via l'apprentissage par renforcement. Certains travaux entraînent même des paramétrages de faible rang pour le raisonnement, mais le LoRA conventionnel ne peut pas être mis à l'échelle en dessous de la dimension du modèle. Nous nous demandons si même un LoRA de rang=1 est nécessaire pour apprendre à raisonner et proposons TinyLoRA, une méthode permettant de mettre à l'échelle les adaptateurs de faible rang jusqu'à des tailles aussi petites qu'un seul paramètre. Au sein de notre nouveau paramétrage, nous parvenons à entraîner la taille de 8B paramètres de Qwen2.5 jusqu'à 91 % de précision sur GSM8K avec seulement 13 paramètres entraînés en bf16 (26 octets au total). Nous constatons que cette tendance se généralise : nous sommes capables de récupérer 90 % des améliorations de performance tout en entraînant 1000 fois moins de paramètres sur une série de benchmarks plus difficiles d'apprentissage du raisonnement, tels que AIME, AMC et MATH500. Notons que nous ne parvenons à atteindre de telles performances élevées qu'avec le RL : les modèles entraînés à l'aide du SFT nécessitent des mises à jour 100 à 1000 fois plus importantes pour atteindre les mêmes performances.

Aperçu des benchmarks

API

TinyLoraConfig

classe peft.TinyLoraConfig

< >

( 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 = 2u: int = 64weight_tying: float = 0.0projection_seed: int = 42save_projection: bool = Trueinit_v_bound: float = 0.02target_modules: Optional[Union[list[str], str]] = Nonetinylora_dropout: float = 0.0fan_in_fan_out: bool = Falsebias: str = 'none'modules_to_save: Optional[list[str]] = Noneinit_weights: Union[bool, str] = Truelayers_to_transform: Optional[Union[list[int], int]] = Nonelayers_pattern: Optional[Union[list[str], str]] = None )

Paramètres

  • r (int, facultatif, par défaut 2) — Rang SVD pour la décomposition U, Sigma, V figée. L’article recommande r=2.
  • u (int, facultatif, valeur par défaut 64) — Dimension du vectoriel entraînable par groupe. Cela contrôle l'expressivité de l'adaptation. Peut descendre aussi bas que 1-13 pour une efficacité paramétrique extrême.
  • weight_tying (float, facultatif, valeur par défaut 0.0) — Degré de liaison des poids entre les modules cibles, exprimé sous forme de ratio compris entre 0.0 et 1.0. Contrôle le nombre de modules partageant le même vecteur entraînable v. 0.0 signifie qu'il n'y a aucun partage (chaque module possède son propre v). 1.0 signifie un partage total (tous les modules partagent un seul v). Les valeurs intermédiaires permettent un partage partiel.
  • projection_seed (int, facultatif, par défaut 42) — Graine aléatoire pour générer les matrices de projection fixes P.
  • save_projection (bool, facultatif, valeur par défaut True) — Indique s'il faut enregistrer les tenseurs de projection P dans le state dict. Si False, ils seront régénérés à partir de la graine lors du chargement.
  • init_v_bound (float, facultatif, valeur par défaut 0.02) — Limite d'initialisation uniforme pour le vecteur v entraînable. Les valeurs sont initialisées dans [-init_v_bound, init_v_bound].
  • target_modules (Union[List[str], str], facultatif) — Les noms des modules auxquels appliquer TinyLoRA. Il peut s’agir d’une liste de noms de modules (par ex. ['q_proj', 'v_proj']), d’un motif regex (par ex. '.*decoder.*(q|v)_proj$') ou du mot-clé spécial "all-linear" pour cibler tous les modules linéaires. Seules les couches nn.Linear, nn.Embedding et transformers.pytorch_utils.Conv1D sont prises en charge.
  • tinylora_dropout (float, facultatif, valeur par défaut 0.0) — Probabilité de dropout pour les couches TinyLoRA.
  • fan_in_fan_out (bool, facultatif, valeur par défaut False) — 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).
  • bias (str, facultatif, par défaut "none") — Type de biais pour TinyLoRA. Peut être ‘none’, ‘all’ ou ‘tinylora_only’.
  • modules_to_save (List[str], facultatif) — Liste des modules, en dehors des couches TinyLoRA, à définir comme entraînables et à enregistrer.
  • init_weights (bool | Literal["uniform"], facultatif, par défaut True) — Méthode d’initialisation du vecteur entraînable v. Passer True (par défaut) initialise v à zéro, ce qui rend l’adaptateur une opération nulle (opération identité). Passer "uniform" initialise v avec des valeurs aléatoires uniformes dans [-init_v_bound, init_v_bound]. Passer False laisse v non initialisé (pour les cas d’usage avancés).
  • layers_to_transform (Union[List[int], int], facultatif) — Les index des couches à transformer. Si spécifié, seules ces couches seront adaptées.
  • layers_pattern (Optional[Union[List[str], str]], facultatif) — Le nom du motif de couche, utilisé uniquement si layers_to_transform est différent de None.

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

TinyLoRA est une méthode d’ajustement fin extrêmement efficace en termes de paramètres, basée sur l’article « Learning to Reason in 13 Parameters » (arXiv:2602.04118). Elle utilise la décomposition SVD des poids figés et projette un petit vecteur entraînable à travers des tenseurs aléatoires fixes.

Article : https://arxiv.org/abs/2602.04118

Exemple :

from peft import get_peft_model, TinyLoraConfig

config = TinyLoraConfig(
    r=2,  # SVD rank (paper recommends 2)
    u=64,  # Trainable vector dimension
    weight_tying=0.0,  # No weight tying (0.0 = none, 1.0 = full)
    target_modules=["q_proj", "v_proj"],
    projection_seed=42,
)
model = get_peft_model(base_model, config)

TinyLoraModel

classe peft.TinyLoraModel

< >

( modelconfigadapter_namelow_cpu_mem_usage = False**kwargs ) → torch.nn.Module

Paramètres

  • model (PreTrainedModel) — Le modèle à adapter.
  • config (TinyLoraConfig) — La configuration du modèle TinyLoRA.
  • adapter_name (str) — Le nom de l'adaptateur, par défaut "default".
  • low_cpu_mem_usage (bool, facultatif, valeur 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 TinyLoRA.

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

TinyLoRA est une méthode d’ajustement fin extrêmement efficace en termes de paramètres, qui utilise la décomposition SVD des poids figés et projette un petit vecteur entraînable à travers des tenseurs aléatoires fixes. Basé sur l’article « Learning to Reason in 13 Parameters » (arXiv:2602.04118).

Exemple :

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

>>> base_model = AutoModelForCausalLM.from_pretrained("facebook/opt-125m")
>>> config = TinyLoraConfig(r=2, u=64, target_modules=["q_proj", "v_proj"])
>>> model = get_peft_model(base_model, config)

Attributs :

delete_adapter

< >

( adapter_name: str )

Supprimer un adaptateur et nettoyer les paramètres partagés v au niveau du modèle.

Update on GitHub