rntc commited on
Commit
4a7f500
·
0 Parent(s):

Initial release

Browse files
.gitattributes ADDED
@@ -0,0 +1,37 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ *.7z filter=lfs diff=lfs merge=lfs -text
2
+ *.arrow filter=lfs diff=lfs merge=lfs -text
3
+ *.bin filter=lfs diff=lfs merge=lfs -text
4
+ *.bz2 filter=lfs diff=lfs merge=lfs -text
5
+ *.ckpt filter=lfs diff=lfs merge=lfs -text
6
+ *.ftz filter=lfs diff=lfs merge=lfs -text
7
+ *.gz filter=lfs diff=lfs merge=lfs -text
8
+ *.h5 filter=lfs diff=lfs merge=lfs -text
9
+ *.joblib filter=lfs diff=lfs merge=lfs -text
10
+ *.lfs.* filter=lfs diff=lfs merge=lfs -text
11
+ *.mlmodel filter=lfs diff=lfs merge=lfs -text
12
+ *.model filter=lfs diff=lfs merge=lfs -text
13
+ *.msgpack filter=lfs diff=lfs merge=lfs -text
14
+ *.npy filter=lfs diff=lfs merge=lfs -text
15
+ *.npz filter=lfs diff=lfs merge=lfs -text
16
+ *.onnx filter=lfs diff=lfs merge=lfs -text
17
+ *.ot filter=lfs diff=lfs merge=lfs -text
18
+ *.parquet filter=lfs diff=lfs merge=lfs -text
19
+ *.pb filter=lfs diff=lfs merge=lfs -text
20
+ *.pickle filter=lfs diff=lfs merge=lfs -text
21
+ *.pkl filter=lfs diff=lfs merge=lfs -text
22
+ *.pt filter=lfs diff=lfs merge=lfs -text
23
+ *.pth filter=lfs diff=lfs merge=lfs -text
24
+ *.rar filter=lfs diff=lfs merge=lfs -text
25
+ *.safetensors filter=lfs diff=lfs merge=lfs -text
26
+ saved_model/**/* filter=lfs diff=lfs merge=lfs -text
27
+ *.tar.* filter=lfs diff=lfs merge=lfs -text
28
+ *.tar filter=lfs diff=lfs merge=lfs -text
29
+ *.tflite filter=lfs diff=lfs merge=lfs -text
30
+ *.tgz filter=lfs diff=lfs merge=lfs -text
31
+ *.wasm filter=lfs diff=lfs merge=lfs -text
32
+ *.xz filter=lfs diff=lfs merge=lfs -text
33
+ *.zip filter=lfs diff=lfs merge=lfs -text
34
+ *.zst filter=lfs diff=lfs merge=lfs -text
35
+ *tfevents* filter=lfs diff=lfs merge=lfs -text
36
+ pareto_doc_ner.png filter=lfs diff=lfs merge=lfs -text
37
+ camembert-bio-logo.png filter=lfs diff=lfs merge=lfs -text
README.md ADDED
@@ -0,0 +1,112 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ ---
2
+ language:
3
+ - fr
4
+ license: mit
5
+ library_name: transformers
6
+ tags:
7
+ - biomedical
8
+ - clinical
9
+ - encoder
10
+ - modernbert
11
+ - fill-mask
12
+ datasets:
13
+ - rntc/biomed-fr
14
+ - almanach/OntoBook
15
+ base_model:
16
+ - almanach/ModernCamemBERT-bio-large
17
+ pipeline_tag: fill-mask
18
+ widget:
19
+ - text: "Le patient présente une [MASK] aiguë du myocarde."
20
+ ---
21
+
22
+ <a href=https://camembert-bio-model.fr/>
23
+ <img width="210px" src="./camembert-bio-logo.png">
24
+ </a>
25
+
26
+ # ModernCamemBERT-bio-v2-large
27
+
28
+ ModernCamemBERT-bio-v2-large is a French biomedical encoder for document-level tasks. It is obtained by continuing the pretraining of [ModernCamemBERT-bio-large](https://huggingface.co/almanach/ModernCamemBERT-bio-large) with an OntoBook phase, with an 8,192-token context window. On our French biomedical document benchmark it reaches 72.8 micro-F1, the best score we measured for coding and long-document classification at this size.
29
+
30
+ ### Authors
31
+
32
+ Rian Touchent and Eric de la Clergerie
33
+ Sorbonne Université, Inria Paris
34
+
35
+ ## Overview
36
+
37
+ ModernCamemBERT-bio is already adapted to French biomedical text through a CLM detour. The v2 variant adds a second continued-pretraining phase that we call OntoBook. Rather than plain masked language modeling, we train on ontology-grounded synthetic textbooks built from CIM-10, CCAM and ATC ontology walks, mixed with clinical text. The goal is to inject structured coding knowledge without adding any task-specific head. This model is our document specialist.
38
+
39
+ | Architecture | ModernBERT |
40
+ |---|---|
41
+ | Parameters | 350M |
42
+ | Context length | 8,192 tokens |
43
+ | Language | French |
44
+ | Base model | [almanach/ModernCamemBERT-bio-large](https://huggingface.co/almanach/ModernCamemBERT-bio-large) |
45
+
46
+ ## Usage
47
+
48
+ ```python
49
+ from transformers import AutoTokenizer, AutoModelForMaskedLM
50
+
51
+ model_id = "rntc/ModernCamemBERT-bio-v2-large"
52
+ tokenizer = AutoTokenizer.from_pretrained(model_id)
53
+ model = AutoModelForMaskedLM.from_pretrained(model_id)
54
+
55
+ text = "Le patient présente une [MASK] aiguë du myocarde."
56
+ inputs = tokenizer(text, return_tensors="pt")
57
+ logits = model(**inputs).logits
58
+ i = inputs["input_ids"][0].tolist().index(tokenizer.mask_token_id)
59
+ print(tokenizer.decode(logits[0, i].argmax(-1)))
60
+ ```
61
+
62
+ ## Evaluation
63
+
64
+ Per-task results on the document core of our French biomedical benchmark, scored with micro-F1 and averaged over nine seeds.
65
+
66
+ | Model | FrACCO-30 | FrACCO-100 | CANTEMIST | MORFITT | MedDialog-FR | Avg |
67
+ |---|---|---|---|---|---|---|
68
+ | ModernCamemBERT-bio-v2-large | 82.0 | 67.8 | 74.6 | 74.3 | 65.2 | 72.8 |
69
+ | ModernCamemBERT-bio-v2-base | 78.0 | 63.7 | 70.9 | 73.5 | 63.7 | 70.0 |
70
+ | ModernCamemBERT-bio-base | 74.2 | 61.1 | 71.2 | 72.9 | 63.7 | 68.6 |
71
+ | DoctoModernBERT | 74.0 | 58.3 | 69.3 | 73.9 | 64.7 | 68.0 |
72
+ | DrBERT | 54.2 | 39.6 | 41.2 | 71.0 | 64.1 | 54.0 |
73
+ | DoctoBERT | 51.6 | 34.7 | 36.2 | 73.5 | 62.1 | 51.6 |
74
+ | CamemBERT-bio | 44.0 | 22.3 | 17.7 | 70.9 | 45.8 | 40.1 |
75
+
76
+ ModernCamemBERT-bio-v2-large has the best average and the best score on each coding task. It scores 4.2 points above ModernCamemBERT-bio-base, the strongest publicly available French biomedical encoder we evaluated.
77
+
78
+
79
+ ## Environmental impact
80
+
81
+ The OntoBook phase reported here ran for about 3.4 GPU-hours on a single H100, on the Jean Zay cluster (GENCI-IDRIS) in France. We estimate roughly 0.10 kg CO2eq for this phase. This figure covers the continued-pretraining step only and does not include the pretraining of the base model.
82
+
83
+ ## License
84
+
85
+ MIT
86
+
87
+ ## Citation
88
+
89
+ ```bibtex
90
+ @inproceedings{touchent:hal-05697506,
91
+ TITLE = {{OntoBook: Ontology-Grounded Synthetic Textbooks for Medical Encoder Pretraining}},
92
+ AUTHOR = {Touchent, Rian and de la Clergerie, {\'E}ric},
93
+ URL = {https://hal.science/hal-05697506},
94
+ BOOKTITLE = {{Proceedings of Knowledge Graphs and Large Language Models Workshop}},
95
+ ADDRESS = {Palma de Mallorca, Spain},
96
+ YEAR = {2026},
97
+ MONTH = May,
98
+ PDF = {https://hal.science/hal-05697506v1/file/main.pdf},
99
+ HAL_ID = {hal-05697506},
100
+ HAL_VERSION = {v1},
101
+ }
102
+
103
+ @misc{touchent2026causallanguagemodelingdetour,
104
+ title={A Causal Language Modeling Detour Improves Encoder Continued Pretraining},
105
+ author={Rian Touchent and Eric de la Clergerie},
106
+ year={2026},
107
+ eprint={2605.12438},
108
+ archivePrefix={arXiv},
109
+ primaryClass={cs.CL},
110
+ url={https://arxiv.org/abs/2605.12438},
111
+ }
112
+ ```
camembert-bio-logo.png ADDED

Git LFS Details

  • SHA256: 2f18d2e02f8c3645699fd46cc090b8fad6123812419d2cbeffd21a44dfebfe5d
  • Pointer size: 131 Bytes
  • Size of remote file: 223 kB
config.json ADDED
@@ -0,0 +1,43 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "architectures": [
3
+ "ModernBertForMaskedLM"
4
+ ],
5
+ "attention_bias": false,
6
+ "attention_dropout": 0.0,
7
+ "bos_token_id": 1,
8
+ "classifier_activation": "gelu",
9
+ "classifier_bias": false,
10
+ "classifier_dropout": 0.0,
11
+ "classifier_pooling": "mean",
12
+ "cls_token_id": 1,
13
+ "decoder_bias": true,
14
+ "deterministic_flash_attn": false,
15
+ "embedding_dropout": 0.0,
16
+ "eos_token_id": 2,
17
+ "global_attn_every_n_layers": 3,
18
+ "global_rope_theta": 160000.0,
19
+ "gradient_checkpointing": false,
20
+ "hidden_activation": "gelu",
21
+ "hidden_size": 1024,
22
+ "initializer_cutoff_factor": 2.0,
23
+ "initializer_range": 0.02,
24
+ "intermediate_size": 2624,
25
+ "layer_norm_eps": 1e-05,
26
+ "local_attention": 128,
27
+ "local_rope_theta": 160000.0,
28
+ "max_position_embeddings": 8192,
29
+ "mlp_bias": false,
30
+ "mlp_dropout": 0.0,
31
+ "model_type": "modernbert",
32
+ "norm_bias": false,
33
+ "norm_eps": 1e-05,
34
+ "num_attention_heads": 16,
35
+ "num_hidden_layers": 28,
36
+ "pad_token_id": 0,
37
+ "position_embedding_type": "rotary",
38
+ "sep_token_id": 2,
39
+ "tie_word_embeddings": true,
40
+ "torch_dtype": "float32",
41
+ "transformers_version": "4.48.0",
42
+ "vocab_size": 32768
43
+ }
model.safetensors ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ version https://git-lfs.github.com/spec/v1
2
+ oid sha256:8b183c79f95db3f0e551d20c29e4f0681209b32dfd9f3a76b106490bd515e4b8
3
+ size 1645602688
pareto_doc_ner.png ADDED

Git LFS Details

  • SHA256: 0c4dfb0bdcd54675064eaa12185ea38f5ddd4190f497dfa966d5d4f1f4ddfe8d
  • Pointer size: 131 Bytes
  • Size of remote file: 119 kB
special_tokens_map.json ADDED
@@ -0,0 +1,51 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "bos_token": {
3
+ "content": "[CLS]",
4
+ "lstrip": false,
5
+ "normalized": false,
6
+ "rstrip": false,
7
+ "single_word": false
8
+ },
9
+ "cls_token": {
10
+ "content": "[CLS]",
11
+ "lstrip": false,
12
+ "normalized": false,
13
+ "rstrip": false,
14
+ "single_word": false
15
+ },
16
+ "eos_token": {
17
+ "content": "[SEP]",
18
+ "lstrip": false,
19
+ "normalized": false,
20
+ "rstrip": false,
21
+ "single_word": false
22
+ },
23
+ "mask_token": {
24
+ "content": "[MASK]",
25
+ "lstrip": true,
26
+ "normalized": false,
27
+ "rstrip": false,
28
+ "single_word": false
29
+ },
30
+ "pad_token": {
31
+ "content": "[PAD]",
32
+ "lstrip": false,
33
+ "normalized": false,
34
+ "rstrip": false,
35
+ "single_word": false
36
+ },
37
+ "sep_token": {
38
+ "content": "[SEP]",
39
+ "lstrip": false,
40
+ "normalized": false,
41
+ "rstrip": false,
42
+ "single_word": false
43
+ },
44
+ "unk_token": {
45
+ "content": "[UNK]",
46
+ "lstrip": false,
47
+ "normalized": false,
48
+ "rstrip": false,
49
+ "single_word": false
50
+ }
51
+ }
tokenizer.json ADDED
The diff for this file is too large to render. See raw diff
 
tokenizer_config.json ADDED
@@ -0,0 +1,61 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "add_prefix_space": true,
3
+ "added_tokens_decoder": {
4
+ "0": {
5
+ "content": "[PAD]",
6
+ "lstrip": false,
7
+ "normalized": false,
8
+ "rstrip": false,
9
+ "single_word": false,
10
+ "special": true
11
+ },
12
+ "1": {
13
+ "content": "[CLS]",
14
+ "lstrip": false,
15
+ "normalized": false,
16
+ "rstrip": false,
17
+ "single_word": false,
18
+ "special": true
19
+ },
20
+ "2": {
21
+ "content": "[SEP]",
22
+ "lstrip": false,
23
+ "normalized": false,
24
+ "rstrip": false,
25
+ "single_word": false,
26
+ "special": true
27
+ },
28
+ "3": {
29
+ "content": "[UNK]",
30
+ "lstrip": false,
31
+ "normalized": false,
32
+ "rstrip": false,
33
+ "single_word": false,
34
+ "special": true
35
+ },
36
+ "4": {
37
+ "content": "[MASK]",
38
+ "lstrip": true,
39
+ "normalized": false,
40
+ "rstrip": false,
41
+ "single_word": false,
42
+ "special": true
43
+ }
44
+ },
45
+ "bos_token": "[CLS]",
46
+ "clean_up_tokenization_spaces": true,
47
+ "cls_token": "[CLS]",
48
+ "eos_token": "[SEP]",
49
+ "errors": "replace",
50
+ "mask_token": "[MASK]",
51
+ "model_input_names": [
52
+ "input_ids",
53
+ "attention_mask"
54
+ ],
55
+ "model_max_length": 8192,
56
+ "pad_token": "[PAD]",
57
+ "sep_token": "[SEP]",
58
+ "tokenizer_class": "PreTrainedTokenizerFast",
59
+ "trim_offsets": true,
60
+ "unk_token": "[UNK]"
61
+ }