CamemBERT-NER Distilled + Pruned + FP16

Modèle optimisé pour la reconnaissance d'entités nommées (NER) dans les rapports sociaux français

License Model

📋 Description

Ce modèle est une version optimisée triple de CamemBERT pour la reconnaissance d'entités nommées (NER) dans le domaine du travail social français. Il combine :

  1. Distillation : 11 couches (vs 12 du teacher) = -8.3% paramètres
  2. Pruning non-structurel : 20% magnitude-based = 15.14% sparsity effective
  3. Quantization FP16 : Half-precision = -50% taille mémoire

🎯 Objectifs

  • Taille réduite : 196 MB (vs 210 MB baseline, vs 420 MB FP32 original)
  • Vitesse accrue : ~15-20% plus rapide (distillation + FP16)
  • Performance maintenue : F1 85.9% (seuil acceptable >85%)
  • Mémoire optimisée : -50% RAM avec FP16

📊 Résultats d'évaluation

Test set : 447 entités gold standard

Métrique Score vs Baseline (FP16 Teacher 12L)
F1 Score 85.9% -1.3% (87.3% → 85.9%)
Precision 86.1% -2.2% (88.2% → 86.1%)
Recall 85.8% -0.5% (86.3% → 85.8%)
Weighted Score 96.4% -0.2% (96.6% → 96.4%)
False Positives 64 +11 (53 → 64)
Missed Entities 52 +2 (50 → 52)

✅ Trade-off accepté : -1.3% F1 pour -6.7% taille + ~15-20% vitesse

🏷️ Catégories d'entités détectées

Le modèle de base détecte 4 catégories principales :

  • PER (Person) : Personnes, noms, prénoms
  • LOC (Location) : Lieux, villes, pays, régions
  • ORG (Organization) : Organisations, entreprises, institutions
  • MISC (Miscellaneous) : Entités diverses (dates, événements, etc.)

Note : Ce modèle est le composant NER de base du pipeline LaPlume. Les catégories fines (39 types spécialisés comme ETAB_MECS, ID_RSA, LOC_CITY, etc.) sont ajoutées par les post-traitements du pipeline complet (règles regex, gazetteers, reclassification).

🎯 Cas d'usage

Ce modèle est optimisé pour :

  • Rapports sociaux : évaluations, suivis, comptes-rendus
  • Documents médico-sociaux : dossiers patients, orientations
  • Anonymisation : détection d'entités pour pseudonymisation
  • Environnements contraints : serveurs avec RAM limitée, déploiement edge
  • ETAB_MAS, ETAB_FAM, ETAB_ESAT, ETAB_SAVS, ETAB_SAMSAH : Handicap adulte
  • ETAB_CHRS : Hébergement d'urgence
  • ETAB_CMS : Centres médico-sociaux
  • ETAB_SCOLAIRE : Établissements scolaires
  • etc. (voir documentation complète)

🔧 Architecture technique

Modèle de base

  • Base : CamemBERT (RoBERTa français)
  • Vocabulary : 32,000 tokens (SentencePiece BPE)
  • Hidden size : 768
  • Attention heads : 12
  • Layers : 11 (distilled from 12-layer teacher)

Optimisations appliquées

1. Knowledge Distillation (11 layers)

Teacher: camembert-ner (12 layers, F1 87.3%)
Student: 11 layers, distilled with temperature=2.0
Loss: α * CE_loss + (1-α) * KD_loss
Result: F1 81.25% on training → 85.9% final

2. Magnitude-based Pruning (20%)

Target: 20% sparsity (magnitude-based)
Effective: 15.14% (15.6M params zeroed / 102.9M total)
Method: Iterative pruning during distillation

3. FP16 Quantization

Conversion: torch.float32 → torch.float16
Size reduction: 392.71 MB → 196.36 MB (-50.0%)
Quality impact: Minimal (<0.1% F1 degradation)

📦 Spécifications

  • Paramètres totaux : 102,947,333
  • Paramètres non-zéro : 87,350,000 (~85%)
  • Taille mémoire : 196.36 MB (FP16)
  • Temps d'inférence : ~15-20% plus rapide que baseline
  • Compatibilité : Transformers ≥ 4.30.0, PyTorch ≥ 2.0.0

🚀 Usage

Dataset d'entraînement

Le modèle student distillé a été entraîné sur 50 000 phrases provenant de trois sources complémentaires :

  1. Contexte médico-social français :
    • Rapports sociaux fictifs mais réalistes (générés pour l'entraînement)
    • Rapports publics sur l'organisation médico-sociale et bonnes pratiques
  2. Narratif littéraire : Grands romans français du XXe siècle (dialogues, descriptions de personnages)
  3. Articles Wikipedia français : Contenu encyclopédique général

Cette diversité de sources permet une bonne généralisation tout en conservant une spécialisation pour le domaine médico-social, sans utiliser de données confidentielles réelles.

Installation

pip install transformers torch

Chargement du modèle

from transformers import AutoTokenizer, AutoModelForTokenClassification
import torch

# Charger le modèle et le tokenizer
model_name = "jmdanto/titibongbong_camemBERT_NER"
tokenizer = AutoTokenizer.from_pretrained(model_name)
model = AutoModelForTokenClassification.from_pretrained(
    model_name,
    torch_dtype=torch.float16  # Force FP16 pour bénéficier des optimisations
)

# Exemple d'inférence
text = "Marie Dupont habite à Paris et travaille à l'Hôpital Sainte-Anne."
inputs = tokenizer(text, return_tensors="pt")

with torch.no_grad():
    outputs = model(**inputs)
    predictions = torch.argmax(outputs.logits, dim=-1)

# Décoder les prédictions
tokens = tokenizer.convert_ids_to_tokens(inputs["input_ids"][0])
labels = [model.config.id2label[p.item()] for p in predictions[0]]

for token, label in zip(tokens, labels):
    if label != "O":
        print(f"{token}: {label}")

# Résultat attendu :
# Marie: B-PER
# Dupont: I-PER
# Paris: B-LOC
# Hôpital: B-ORG
# Sainte: I-ORG
# -: I-ORG
# Anne: I-ORG

Pipeline complet avec post-traitement

from transformers import pipeline

# Créer le pipeline NER
ner_pipeline = pipeline(
    "ner",
    model=model_name,
    tokenizer=model_name,
    aggregation_strategy="simple",  # Fusionne les sous-tokens
    device=0 if torch.cuda.is_available() else -1
)

# Analyser un texte
text = """
Rapport social concernant M. Bernard Martin, 
domicilié au 23 rue de la Paix, 69000 Lyon.
Suivi par le Centre Médico-Social de Lyon-Confluence.
"""

entities = ner_pipeline(text)

for entity in entities:
    print(f"{entity['entity_group']}: {entity['word']} (score: {entity['score']:.2f})")

# Résultat attendu :
# PER: Bernard Martin (score: 0.99)
# LOC: rue de la Paix (score: 0.95)
# LOC: Lyon (score: 0.98)
# ORG: Centre Médico-Social de Lyon-Confluence (score: 0.92)

📈 Benchmarks

Comparaison des modèles

Modèle Taille F1 Précision Rappel FP Manqués
Baseline FP16 (Teacher 12L) 210 MB 87.3% 88.2% 86.3% 53 50
Distilled FP32 (Student 11L) 393 MB 85.8% 85.9% 85.8% 65 52
Distilled FP16 (Ce modèle) 196 MB 85.9% 86.1% 85.8% 64 52

Trade-offs :

  • Taille : -6.7% vs baseline, meilleure efficacité
  • Vitesse : ~15-20% plus rapide (distillation + FP16)
  • ⚠️ Qualité : -1.3% F1 (acceptable, >85% seuil requis)

Performance par criticité

Criticité Rappel Précision F1 Entités
CRIT (NIR, etc.) 96.8% 100% 98.4% 19
HIGH (PER, ID) 93.0% 95.7% 94.4% 176
MED (ORG, ETAB) 81.4% 77.4% 79.3% 199
LOW (LOC, DATE) 69.4% 74.5% 71.9% 49

✅ Points forts :

  • Excellente détection des données critiques
  • Précision élevée sur les personnes
  • Bon équilibre précision/rappel global

🎓 Entraînement

Dataset

  • Domaine : Rapports sociaux français (ASE, RSA, handicap, hébergement)
  • Taille : 10 fichiers d'entraînement annotés manuellement
  • Annotations : Format IOB2 avec 39 catégories d'entités
  • Augmentation : Gazetteers spécialisés (FINESS, prénoms, associations)

Hyperparamètres

# Distillation
teacher: camembert-ner-12layers-fp16
student_layers: 11
temperature: 2.0
alpha: 0.5

# Pruning
method: magnitude_based
target_sparsity: 0.20
effective_sparsity: 0.1514

# Training
learning_rate: 2e-5
batch_size: 16
epochs: 10
optimizer: AdamW
warmup_ratio: 0.1

# Quantization
dtype: float16
method: torch.half()

⚠️ Limitations

  1. Domaine spécialisé : Optimisé pour les rapports sociaux français, performances moindres sur d'autres domaines
  2. Trade-off qualité : -1.3% F1 vs baseline pour gain taille/vitesse
  3. Faux positifs : +11 FP vs baseline (64 vs 53), vérification recommandée
  4. Entités rares : Performance réduite sur catégories peu fréquentes (LOC, DATE)
  5. Hardware : FP16 nécessite GPU compatible (Pascal+) ou CPU moderne

📄 Licence

Apache 2.0

🤝 Citation

@model{camembert-ner-distilled-pruned-fp16,
  title={CamemBERT-NER Distilled + Pruned + FP16},
  author={Danto, Patrick},
  year={2024},
  publisher={HuggingFace},
  url={https://huggingface.co/jmdanto/titibongbong_camemBERT_NER}
}

@model{camembert-ner-teacher,
  title={CamemBERT-NER: Fine-tuned CamemBERT for NER task},
  author={Pollé, Jean-Baptiste},
  year={2020},
  publisher={HuggingFace},
  url={https://huggingface.co/Jean-Baptiste/camembert-ner}
}

📞 Contact

🔄 Versions

  • v1.0 (Nov 2024) : Version initiale distillée + prunée + FP16
    • 11 layers, 20% pruning, FP16 quantization
    • F1: 85.9%, Size: 196 MB
    • Évalué sur 447 entités gold standard

Note : Ce modèle fait partie du projet La Plume, un pipeline de pseudonymisation pour documents médico-sociaux français. Le pipeline complet est un projet privé protégé au titre de la propriété intellectuelle, mais ce modèle est publié sous licence MIT.

Downloads last month
100
Safetensors
Model size
0.1B params
Tensor type
F16
·
Inference Providers NEW
This model isn't deployed by any Inference Provider. 🙋 Ask for provider support

Model tree for jmdanto/titibongbong_camemBERT_NER

Finetuned
(4)
this model