Arrêtez d’entraîner 4 modèles NLP : comment une architecture multi-têtes divise drastiquement vos coûts d’inférence

Optimisez vos pipelines NLP en production en mutualisant un seul backbone transformers pour plusieurs tâches de classification simultanées.
Auteur·rice

Nicolas Decoopman

Date de publication

13 avril 2026

Mots clés

NLP, Production, Deep Learning, PyTorch Lightning, Transformers, Multi-Task Learning, Inférence

Imaginez que vous deviez analyser des avis clients selon quatre dimensions indépendantes : le prix, la cuisine, le service et l’ambiance.

L’approche classique consiste souvent à entraîner quatre modèles distincts. Mais en production, charger simultanément quatre instances de CamemBERT-Large est une recette parfaite pour un désastre opérationnel : saturation immédiate de la VRAM (Out-Of-Memory), latence de requêtage élevée et factures de compute qui explosent.

Voici comment passer d’une approche “force brute” à une architecture multi-têtes (Multi-Head) efficace.

1 Le problème : le mur de la VRAM

Pour beaucoup d’équipes data, multiplier les modèles semble être la solution la plus simple pour gérer des tâches de classification multiples. Pourtant, cette stratégie n’est pas “scalable”. Chaque modèle CamemBERT supplémentaire nécessite son propre espace mémoire et ses propres cycles de calcul pour traiter le même texte d’entrée.

Charger quatre modèles massifs pour un seul processus de prédiction crée un goulot d’étranglement inutile, alors que le texte analysé reste identique.

2 L’approche : le multi-task learning (MTL)

L’idée est simple : mutualiser l’intelligence. Au lieu de dupliquer le cerveau (le backbone), nous utilisons un seul socle CamemBERT partagé qui “forke” dynamiquement vers quatre têtes de classification indépendantes.

2.1 Pourquoi ça fonctionne ?

Le Multi-Task Learning permet au modèle d’apprendre des représentations sémantiques communes tout en se spécialisant sur chaque aspect en fin de réseau. Lors de la phase d’entraînement, toutes les pertes (losses) locales de chaque tête sont sommées pour mettre à jour le socle commun.

3 Implémentation technique avec PyTorch Lightning

L’utilisation de PyTorch Lightning permet d’orchestrer cette architecture complexe de manière élégante. Voici les quatre piliers de la pipeline :

  1. Allocation unique du socle : on charge AutoModel.from_pretrained('camembert/camembert-large') une seule fois pour factoriser les blocs d’attention et la tokenization.
  2. Génération des têtes à la volée : on utilise un nn.ModuleDict pour mapper les états latents (la sortie du backbone) vers nos quatre labels de sortie.
  3. Centralisation des features : on récupère l’état latent du token [CLS] à la fin du traitement du backbone pour nourrir simultanément toutes les têtes.
  4. Agrégation de la perte : durant la backpropagation, on somme les pertes individuelles : total_loss += loss.

3.1 Zoom sur le code

Le fichier plm_classifier.py devient le cœur de votre architecture. En voici l’essentiel :

import torch.nn as nn
from transformers import AutoModel

class MultiHeadClassifier(nn.Module):
    def __init__(self, aspects):
        super().__init__()
        # (1) Le Backbone est factorisé UNE seule fois
        self.backbone = AutoModel.from_pretrained('camembert/camembert-large')
        
        # (2) Le ModuleDict crée X têtes sans multiplier la VRAM
        self.classifiers = nn.ModuleDict({
            aspect: nn.Linear(self.backbone.config.hidden_size, 4) 
            for aspect in aspects
        })

    def forward(self, input_ids, attention_mask):
        outputs = self.backbone(input_ids=input_ids, attention_mask=attention_mask)
        # On utilise le token [CLS]
        cls_output = outputs.last_hidden_state[:, 0, :]
        
        logits = {aspect: self.classifiers[aspect](cls_output) for aspect in self.classifiers}
        return logits

4 Stratégie d’adoption : ne tombez pas dans le piège

Passer au multi-têtes demande un peu de préparation méthodologique :

  • Fusionnez vos datasets : rassemblez vos jeux de données isolés en un seul dataset combiné où les annotations sont présentées sous forme matricielle.
  • Maitrisez le fine-tuning : implémentez des taux d’apprentissage différentiels (Differential Learning Rates). Utilisez un LR lent pour le backbone (déjà pré-entraîné) et un LR plus agressif pour vos nouvelles têtes afin d’éviter l’oubli catastrophique (Catastrophic Forgetting).
  • Abandonnez les classes standards : débranchez les AutoModelForSequenceClassification classiques du hub HuggingFace. Ils ne sont pas conçus pour gérer plusieurs sorties nativement.

5 Conclusion : un gain massif en production

Le passage à une architecture multi-têtes offre des bénéfices immédiats : * Réduction du temps de chargement : environ -75% en API. * Optimisation mémoire : une consommation RAM quasiment identique à celle d’un seul modèle. * Débit d’inférence : une vitesse démultipliée puisque le texte n’est “encodé” qu’une seule fois pour toutes les prédictions.

Cette architecture est le cœur technique du projet FeelingsAnalysis.

6 Références et lectures complémentaires

  1. Caruana, R. (1997). Multitask Learning. Machine Learning, 28(1), 41–75. L’article fondateur qui théorise le partage de représentations entre tâches connexes.
  2. Martin, L., et al. (2020). CamemBERT: a Tasty French Language Model. Proceedings of the 58th Annual Meeting of the Association for Computational Linguistics. La référence pour l’utilisation du backbone optimisé pour la langue française.
  3. Wolf, T., et al. (2020). Transformers: State-of-the-Art Natural Language Processing. Proceedings of the 2020 Conference on Empirical Methods in Natural Language Processing. Documentation sur l’écosystème HuggingFace utilisé pour l’implémentation.
  4. Falcon, W., & The PyTorch Lightning team. (2019). PyTorch Lightning. GitHub. Framework utilisé pour la structuration du code de recherche et de mise en production.
  5. Howard, J., & Ruder, S. (2018). Universal Language Model Fine-tuning for Text Classification. Pour approfondir les stratégies de “Discriminative Fine-Tuning” et éviter l’oubli.