CamemBERT-NER Distilled + Pruned + FP16
Modèle optimisé pour la reconnaissance d'entités nommées (NER) dans les rapports sociaux français
📋 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 :
- Distillation : 11 couches (vs 12 du teacher) = -8.3% paramètres
- Pruning non-structurel : 20% magnitude-based = 15.14% sparsity effective
- 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 adulteETAB_CHRS: Hébergement d'urgenceETAB_CMS: Centres médico-sociauxETAB_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 :
- 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
- Narratif littéraire : Grands romans français du XXe siècle (dialogues, descriptions de personnages)
- 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
- Domaine spécialisé : Optimisé pour les rapports sociaux français, performances moindres sur d'autres domaines
- Trade-off qualité : -1.3% F1 vs baseline pour gain taille/vitesse
- Faux positifs : +11 FP vs baseline (64 vs 53), vérification recommandée
- Entités rares : Performance réduite sur catégories peu fréquentes (LOC, DATE)
- 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
- Email : [email protected]
🔄 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
Model tree for jmdanto/titibongbong_camemBERT_NER
Base model
Jean-Baptiste/camembert-nerEvaluation results
- F1self-reported0.859
- Precisionself-reported0.861
- Recallself-reported0.858