Transformers documentation
Conserver les modules en pleine précision
Conserver les modules en pleine précision
Certains modules perdent plus de précision que d’autres lors de la quantification. Les conserver dans leur précision d’origine coûte un peu de mémoire et permet de récupérer une grande partie de la précision. Cela s’applique lorsque vous quantifiez un modèle lors de son chargement. Un point de contrôle pré-quantifié enregistre déjà quels modules ont été ignorés.
Modules ignorés par défaut
Si vous ne transmettez pas de liste de saut, la plupart des méthodes conservent ces modules non quantifiés.
- Les embeddings de sortie, généralement
lm_head. - Poids liés à d'autres poids, comme les embeddings d'entrée qui partagent leurs poids avec
lm_head. - Le dernier module du modèle.
- Modules que le modèle répertorie dans
_keep_in_fp32_modules.
Quelques méthodes définissent leur propre valeur par défaut. HQQ, FP-Quant et Four Over Six ignorent uniquement lm_head. SINQ ignore uniquement les modules de _keep_in_fp32_modules.
Passer une liste de saut
Transmettez les noms de modules à l’argument de liste de saut de la configuration de la méthode. L’exemple ci-dessous conserve lm_head et les projections descendantes du MLP en bf16 avec bitsandbytes.
from transformers import AutoModelForCausalLM, BitsAndBytesConfig
quantization_config = BitsAndBytesConfig(
load_in_4bit=True,
llm_int8_skip_modules=["lm_head", "mlp.down_proj"],
)
model = AutoModelForCausalLM.from_pretrained(
"Qwen/Qwen3-0.6B",
quantization_config=quantization_config,
device_map="auto",
)Une liste de saut remplace les modules ignorés par défaut au lieu de s’y ajouter, bien que les modules de
_keep_in_fp32_modulesrestent ignorés. Incluezlm_headdans votre liste si vous souhaitez qu’il reste non quantifié. AWQ fait exception et ajoute votre liste aux valeurs par défaut.
Le nom de l’argument dépend de la méthode.
| Argument | Méthodes |
|---|---|
modules_to_not_convert | La plupart des méthodes, y compris AWQ, EETQ, FBGEMM FP8, Fine-grained FP8, Four Over Six, FP-Quant, HIGGS, Metal, MXFP4, NVFP4, Quanto, SINQ et torchao |
llm_int8_skip_modules | bitsandbytes, en mode 4 bits et 8 bits |
skip_modules | HQQ |
GPTQ adopte l'approche inverse. modules_in_block_to_quantize énumère les modules à quantiser, tandis que le reste du bloc est laissé non quantisé.
Correspondance des noms de modules
La plupart des méthodes comparent chaque entrée de la liste de saut aux noms complets des modules issus de model.named_modules(), tels que model.layers.3.mlp.down_proj. HQQ fait exception et correspond aux noms de couches de manière exacte. Une entrée correspond de l'une des trois manières suivantes.
- En tant que suffixe.
mlp.down_projcorrespond à la projection descendante de chaque couche. - En tant que préfixe qui se termine à une limite de module.
model.layers.1correspond àmodel.layers.1.mlpmais pas àmodel.layers.11.mlp. - En tant qu'expression régulière avec la même limite.
model\.layers\.(0|1)correspond aux deux premières couches.
Affichez les noms de modules pour trouver les bonnes entrées.
for name, _ in model.named_modules():
print(name)Choisir les modules à ignorer
Évitez les modules pour lesquels l'erreur d'arrondi affecte le plus la précision au prix de la moindre économie de mémoire. Commencez par les valeurs par défaut, mesurez la précision sur votre tâche et n'ajoutez des modules que si elle diminue.
lm_headgénère les logits pour chaque jeton du vocabulaire, de sorte que les erreurs qui s’y produisent modifient directement le jeton sélectionné. Il est ignoré par défaut. Sur les modèles dotés de grands vocabulaires, il s’agit également de l’une des plus grosses couches individuelles, ce qui permet d’économiser de la mémoire réelle si la précision est maintenue.- Les couches de routeur ou de porte MoE, comme
mlp.gatedans Qwen3-MoE oumlp.routerdans gpt-oss, décident à quels experts chaque jeton est envoyé. Elles sont minuscules, et une simple erreur d’arrondi peut envoyer un jeton vers le mauvais expert, il est donc presque toujours judicieux de les ignorer. - Les encodeurs visuels et les projecteurs multimodaux des modèles vision-langage sont petits par rapport au modèle de langage, et les erreurs qui s’y produisent faussent chaque jeton d’image. Si la compréhension des images se dégrade, ignorez-les.
- Les premières et les dernières couches du décodeur présentent souvent plus de valeurs d’activation aberrantes que les couches intermédiaires. Excluez-les lorsque la précision du modèle quantifié est nettement inférieure à celle en bf16.
Chaque module que vous passez en mode skip conserve sa précision d'origine et consomme de la mémoire. Vérifiez que le modèle tient toujours en mémoire après l'ajout d'éléments à la liste de saut.
Update on GitHub