cortex.6.sol / tokenizer /README.md
openhands
openhands
feat(cortex): add CORTEX training pipeline and model audit
6fbe100
|
Raw History Blame Contribute Delete
1.87 kB
# CORTEX — tokenizer
Le tokenizer CORTEX est **réutilisé tel quel** depuis le dépôt distribué
(`Frankenstein-Labs/Cortex-ai`), sous licence MIT. Il n'est ni reconstruit, ni modifié.
| Fichier | Rôle |
|---|---|
| `../tokenizer.json` | tokenizer distribué, à la racine du dépôt (BPE, 129 280 identifiants) |
| `cortex_tokenizer.py` | chargement et validation |
## Chiffres mesurés
| Propriété | Valeur |
|---|---|
| Classe | `PreTrainedTokenizerFast` |
| Modèle | BPE |
| Vocabulaire de base | 128 000 |
| Fusions | 127 741 |
| Tokens ajoutés | 1 283 |
| Identifiants uniques | **129 280** |
| Identifiants en doublon | 3 (ids 0, 1, 2) |
## Le piège du décompte
`128 000 + 1 283 = 129 283`, mais `config.json` déclare `vocab_size: 129280` et les
embeddings ont 129 280 lignes.
Ce n'est pas une incohérence : les identifiants 0, 1 et 2 (`bos`, `eos`, `pad`)
apparaissent **à la fois** comme tokens spéciaux ajoutés et comme entrées du vocabulaire
BPE. Le nombre d'identifiants **uniques** est bien 129 280.
C'est pourquoi `assert_vocab_matches_config()` compare les identifiants uniques et jamais
les compteurs bruts. Toute réutilisation de ce tokenizer doit faire de même.
## Exemple
```python
from tokenizer.cortex_tokenizer import load_tokenizer, assert_vocab_matches_config
tokenizer = load_tokenizer()
assert_vocab_matches_config(tokenizer, 129280)
print(tokenizer.decode(tokenizer.encode("def add(a, b):\n return a + b\n").ids))
```
## Si le fichier est absent
`tokenizer.json` est versionné **à la racine** du dépôt, et le pipeline le charge depuis là :
une seule copie existe, donc aucune divergence n'est possible entre le tokenizer du pipeline et
celui du checkpoint distribué. S'il manque, le récupérer depuis la source :
```bash
hf download Frankenstein-Labs/Cortex-ai tokenizer.json --local-dir .
```