Transformers documentation
Utilitaires d'incorporations rotationnelles
Utilitaires d'incorporations rotationnelles
Cette page explique comment l’incorporation rotative est calculée et appliquée dans Transformers et quels types de RoPE sont pris en charge.
Aperçu
Les Rotary Position Embeddings sont une technique utilisée pour injecter des informations positionnelles dans les mécanismes d'attention sans recourir à des encodages de position explicites.
Au lieu d'ajouter des vecteurs de position aux embeddings de jetons, RoPE fait pivoter les vecteurs de requête et de clé dans le plan complexe en fonction de leurs positions, permettant ainsi une prise en compte relative des positions et une meilleure extrapolation vers des longueurs de séquence non vues.
La bibliothèque Transformers fournit une implémentation flexible et extensible des différents types de RoPE définis dans ~modeling_rope_utils.ROPE_VALIDATION_FUNCTIONS, incluant à la fois les variantes par défaut et celles mises à l'échelle :
| Type de Rope | Description |
|---|---|
"default" | Intégration rotative standard, comme dans LLaMA. |
"linear" | RoPE à échelle linéaire permettant des fenêtres de contexte plus longues. |
"dynamic" | Mise à l'échelle tenant compte du NTK, calculée en rééchelonnant la base de fréquence (θ) pour un contexte plus long. |
"yarn" | Variante de mise à l'échelle YaRN offrant une extrapolation plus fluide et une meilleure stabilité. |
"longrope" | Mise à l'échelle LongRoPE comme dans la série de modèles Phi-2. |
"llama3" | Mise à l'échelle de RoPE comme dans Llama3.1. |
Configuration dans les fichiers de configuration des modèles
Pour activer et personnaliser les embeddings rotatifs, ajoutez un champ rope_parameters au fichier de configuration de votre modèle (config.json). Ce champ contrôle le comportement de RoPE à travers les couches du modèle. Notez que chaque variante de RoPE définit son propre ensemble de clés attendues et les clés manquantes déclencheront une erreur. Consultez l’exemple ci-dessous qui crée une configuration llama avec des paramètres RoPE par défaut :
from transformers import LlamaConfig
config = LlamaConfig()
config.rope_parameters = {
"rope_type": "default", # type of RoPE to use
# rope_theta is optional — omitting it uses the model’s default_theta (typically 10000.0)
}
# If we want to apply a scaled RoPE type, we need to pass extra parameters
config.rope_parameters = {
"rope_type": "linear",
"rope_theta": 10000.0, # can be omitted to fall back to default_theta
"factor": 8.0 # scale factor for context extension
}Configuration de RoPE par type de couche
Certains modèles, comme Gemma-3, utilisent différents types de couches avec des mécanismes d’attention distincts, c’est-à-dire une « attention complète » dans certains blocs et une « attention à fenêtre glissante » dans d’autres. Transformers permet de spécifier des paramètres RoPE distincts par type de couche pour ces modèles. Dans ce cas, rope_parameters doit être un dictionnaire imbriqué, où les clés de premier niveau correspondent à config.layer_types et les valeurs sont les paramètres RoPE par type. Lors de l’initialisation du modèle, chaque couche décodeur recherche automatiquement la configuration RoPE correspondante en fonction de son type de couche déclaré.
from transformers import Gemma3Config
config = Gemma3Config()
config.rope_parameters = {
"full_attention": {
"rope_type": "dynamic",
"rope_theta": 1000000.0,
"factor": 8.0,
"original_max_position_embeddings": 8096,
},
"sliding_attention": {
"rope_type": "default",
"rope_theta": 10000.0,
}
}MRoPE
MRoPE est un type de rotation appliqué dans les modèles multimodaux et défini par mrope_section. Il ne constitue pas une entrée distincte dans le tableau rope_type. Il est toujours possible d’appliquer un redimensionnement de rope (linear, dynamic) avec celui-ci.
mrope_section définit les tailles des bandes de fréquences contiguës pour les axes temporel, hauteur et largeur (la somme de ces tailles est égale à head_dim // 2). Les fréquences sont ensuite répétées afin que l’embedding couvre la totalité de head_dim. Pour les entrées multimodales (généralement la vision), RoPE est appliqué en une seule passe (matmul ou multiplication élément par élément des fréquences avec les positions). mrope_section ne réordonne ces fréquences que le long de (t, h, w) en premier, comme dans recomposition_frequencies de Qwen2-VL. Le texte du prompt et les jetons générés conservent un RoPE 1D standard en utilisant des identifiants de position identiques sur les trois grilles THW.
from transformers import Qwen2VLConfig
config = Qwen2VLConfig()
config.text_config.rope_parameters = {
"rope_type": "default",
"rope_theta": 1000000.0,
"mrope_section": [16, 24, 24], # temporal, height, width frequency band sizes
}Qwen2-VL utilise mrope_section = [16, 24, 24] (16 temporel, 24 hauteur, 24 largeur lorsque head_dim est 128). Les modèles multimodaux utilisent souvent cette disposition dans le tronc de texte (Qwen2-VL, GLM-4V). Certains VLM n’utilisent pas MRoPE et restent sur le RoPE de texte 2D standard. Vérifiez mrope_section dans la configuration du texte.
RoPE axial
Par ailleurs, "axial" est un rope_type enregistré pour les modèles de vision, mais il n'est pas répertorié dans ROPE_INIT_FUNCTIONS. La configuration des fréquences reste à la charge du modèle. Il applique généralement les mêmes fréquences (head_dim // 4 par axe spatial) pour les positions de hauteur et de largeur, et n'autorise pas de mise à l'échelle supplémentaire. Des exemples incluent le modèle de vision Qwen2-VL et d'autres piles de vision telles que Pixtral.
Utilitaires
classe transformers.RopeParameters
< source >( )
Paramètres
- rope_theta (
float, facultatif, par défautRotaryEmbeddingConfigMixin.default_theta) — La période de base des embeddings RoPE. Facultatif dans les configurations sérialisées — s'il est omis, ledefault_thetadu modèle (généralement 10000.0) est utilisé. - rope_type (
str, facultatif, par défaut “default”) — La sous-variante de RoPE à utiliser. Peut être l’un des éléments de [‘default’, ‘linear’, ‘dynamic’, ‘yarn’, ‘longrope’, ‘llama3’, ‘proportional’, ‘axial’], ‘default’ correspondant à l’implémentation originale de RoPE. - partial_rotary_factor (
float, facultatif) — Le pourcentage des embeddings des têtes de requête et de clé sur lequel RoPE sera appliqué. - factor (
float, facultatif) — Utilisé avec tous les types de rope sauf ‘default’. Le facteur d’échelle à appliquer aux embeddings RoPE. Dans la plupart des types d’échelle, unfactorde x permet au modèle de traiter des séquences de longueur x * longueur maximale pré-entraînée d’origine. - original_max_position_embeddings (
int, facultatif) — Utilisé avec ‘yarn’, ‘longrope’ et ‘llama3’. Les embeddings de position maximaux d’origine utilisés lors de la préformation. - attention_factor (
float, facultatif) — Utilisé avec ‘yarn’ et ‘longrope’. Le facteur d’échelle à appliquer au calcul de l’attention. S’il n’est pas spécifié, il prend par défaut la valeur recommandée par l’implémentation, en utilisant le champfactorpour en déduire la valeur suggérée. - beta_fast (
float, facultatif) — Utilisé uniquement avec ‘yarn’. Paramètre pour définir la limite d’extrapolation (uniquement) dans la fonction de rampe linéaire. S’il n’est pas spécifié, sa valeur par défaut est 32. - beta_slow (
float, facultatif) — Utilisé uniquement avec ‘yarn’. Paramètre pour définir la limite de l’interpolation (uniquement) dans la fonction de rampe linéaire. S’il n’est pas spécifié, sa valeur par défaut est 1. - short_factor (
list[float], facultatif) — Utilisé uniquement avec ‘longrope’. Le facteur d’échelle à appliquer aux contextes courts (<original_max_position_embeddings). Doit être une liste de nombres de la même longueur que la taille cachée divisée par le nombre de têtes d’attention divisé par 2 - long_factor (
list[float], facultatif) — Utilisé uniquement avec ‘longrope’. Le facteur d’échelle à appliquer aux contextes longs (<original_max_position_embeddings). Doit être une liste de nombres de même longueur que la taille cachée divisée par le nombre de têtes d’attention divisé par 2 - low_freq_factor (
float, facultatif) — Utilisé uniquement avec ‘llama3’. Facteur d’échelle appliqué aux composantes de basse fréquence du RoPE - high_freq_factor (
float, facultatif) — Utilisé uniquement avec ‘llama3’. Facteur d’échelle appliqué aux composantes de haute fréquence du RoPE - mscale (
float, facultatif) — Utilisé uniquement avec ‘yarn’. Siattention_factorestNoneet quemscaleetmscale_all_dimsont fournis,mscaleagit comme un scalaire augmentantlog(factor)lors du calcul du numérateur pour la valeur déduite deattention_factor. S’il n’est pas fourni,attention_factorsera calculé sur la base defactoruniquement. - mscale_all_dim (
float, facultatif) — Utilisé uniquement avec ‘yarn’. Siattention_factorestNoneet quemscaleetmscale_all_dimsont fournis,mscale_all_dimagit comme un scalaire augmentantlog(factor)lors du calcul du dénominateur pour la valeur déduite deattention_factor. S’il n’est pas fourni,attention_factorsera calculé sur la base defactoruniquement. - truncate (
bool, facultatif) — Utilisé uniquement avec ‘yarn’. Indique s’il faut tronquer la plage de correction à l’aide demath.flooretmath.ceil. Si non spécifié, la valeur par défaut estTrue. - mrope_section (
list[int], facultatif) — Utilisé avec Multimodal RoPE (MRoPE). Tailles des bandes de fréquences contiguës pour les axes multimodaux (généralement temporel, hauteur et largeur, dont la somme est égale àhead_dim // 2).
dict() -> nouveau dictionnaire vide dict(mapping) -> nouveau dictionnaire initialisé à partir des paires (clé, valeur) d'un objet mapping dict(iterable) -> nouveau dictionnaire initialisé comme si via : d = {} for k, v in iterable: d[k] = v dict(**kwargs) -> nouveau dictionnaire initialisé avec les paires name=value de la liste d'arguments par mot-clé. Par exemple : dict(one=1, two=2)