PEFT documentation
VB-LoRA : Fine-tuning extrêmement efficace en termes de paramètres avec des banques de vecteurs
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 = TruedansVBLoRAConfig, soit enregistrer tous les logits entraînables en le définissant surFalse. L’activation desave_only_topk_weights = Trueré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 avecsave_only_topk_weights = Truesont 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
< 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 = 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éfinirsave_only_topk_weights = Trueré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 utiliseConv1Dqui stocke les poids sous la forme (fan_in, fan_out) et il convient donc de définir cette valeur surTrue. - 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 silayers_to_transformest différent deNone. Il doit cibler lenn.ModuleListdu modèle, souvent appelé'layers'ou'h'.
Ceci est la classe de configuration destinée à stocker la configuration d'un VBLoRAModel.
VBLoRAModel
classe peft.VBLoRAModel
< 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 (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é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 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 :
- model (PreTrainedModel) — Le modèle à adapter.
- peft_config (VBLoRAConfig) : La configuration du modèle VBLoRAConfig.
Retourne le nombre de paramètres VB-LoRA sauvegardables et d'autres paramètres sauvegardables.
Affiche le nombre de paramètres VB-LoRA sauvegardables et le nombre total de paramètres sauvegardables.