File size: 8,746 Bytes
9097cac
 
 
 
 
d2b4e23
5c4379b
 
 
9097cac
9ca37a9
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
9077595
 
 
 
27a3d1b
9077595
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
27a3d1b
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
---
library_name: transformers
model-index:
- name: the-smallest-llm-real-words
  results: []
license: other
language:
- fr
pipeline_tag: text-generation
---

# 👶 Small-ever : Le Modèle "Hello World" (112 Paramètres)

![small-ever](http://www.image-heberg.fr/files/17632874174113928896.jpg)

## 🌟 Vue d'Ensemble

Le modèle **`Small-ever`** est un **SLM** délibérément sous-dimensionné** et minimaliste, conçu uniquement à des fins de **démonstration** et d'**apprentissage**.

Avec seulement **112 paramètres au total**, il s'agit du modèle le plus petit possible tout en conservant l'architecture de base d'un Transformateur pour la modélisation du langage.

Il a été créé par l'**experte Clemylia** pour servir de **"Hello World"** avant d'introduire des modèles plus complexes, comme ceux de la série 202k et 3.8M de paramètres.

## 🎯 Objectif Pédagogique Principal

L'objectif unique de ce modèle est d'être un outil pédagogique :

  * **Démonstration Basique :** Montrer aux **enfants** et aux **débutants** en Machine Learning que la création, l'entraînement et la publication d'un modèle de langage sur Hugging Face sont des étapes accessibles, même pour une architecture minimale.
  * **Comprendre l'Échelle :** Illustrer la différence entre un modèle capable de mémoriser une seule relation et les modèles de millions de paramètres (ceux de Clemylia) nécessaires pour la généralisation et l'intelligence artificielle utile.
  * **Test d'Infra :** Servir de test ultra-rapide pour la configuration d'un environnement (CPU/GPU) avant de lancer des entraînements plus longs sur de gros modèles.

## ⚙️ Détails Techniques

| Caractéristique | Valeur | Note |
| :--- | :--- | :--- |
| **Architecture** | GPT-2 (Causal Language Modeling) | Architecture standard de Transformateur. |
| **Paramètres Totaux** | **112** (Environ $112 \times 10^{-6}$ M) | Extrêmement réduit. |
| **Vocabulaire Entraîné** | 4 Tokens | Vocabulaire minimaliste (`Clem`, `Creatrice`, `<pad>`, `<unk>`). |
| **Séquence Apprise** | `Clem` $\rightarrow$ `Creatrice` | Le modèle n'a appris qu'une seule transition par cœur. |
| **Implémentation** | Pytorch / Hugging Face `transformers` | Entièrement compatible avec l'écosystème Hugging Face. |

## 🚀 Utilisation (Inférence)

Ce modèle est uniquement destiné à prédire la suite de la séquence sur laquelle il a été entraîné. Toute autre entrée résultera en une prédiction aléatoire ou le token de remplissage (`<pad>`).

### Code Python pour le Test (Forward Pass Direct)

Étant donné sa configuration non standard, la méthode la plus fiable pour l'inférence est le *forward pass* direct, comme suit :

```python
import torch
from transformers import AutoModelForCausalLM, AutoConfig
# Pour ce modèle minimal, nous devons recréer le tokenizer personnalisé en mémoire
# car il n'est pas standard ({"Clem": 0, "Creatrice": 1, ...})

# 1. Configuration des IDs
MODEL_NAME = "Clemylia/the-smallest-llm-real-words" 
REAL_TOKENS = ["Clem", "Creatrice"] 
INPUT_TEXT = "Clem"
INPUT_ID = 0  # L'ID que le modèle a appris pour "Clem"
EXPECTED_OUTPUT = "Creatrice"
IDS_TO_TOKENS = {0: "Clem", 1: "Creatrice", 2: "<pad>", 3: "<unk>"}

# 2. Chargement du Modèle
try:
    model = AutoModelForCausalLM.from_pretrained(MODEL_NAME)
    model.eval() 
except Exception as e:
    print(f"Erreur de chargement : {e}")
    exit()

# 3. Préparation de l'Input (Tenseur de l'ID 0)
input_ids = torch.tensor([[INPUT_ID]], dtype=torch.long)

# 4. Forward Pass pour obtenir les logits
with torch.no_grad():
    outputs = model(input_ids)
    
# 5. Détermination de la Prédiction
next_token_logits = outputs.logits[0, -1, :] 
predicted_id = torch.argmax(next_token_logits).item()
predicted_token = IDS_TO_TOKENS.get(predicted_id, "TOKEN INCONNU")

print(f"Input: {INPUT_TEXT} ({INPUT_ID})")
print(f"Prédiction: {predicted_token} ({predicted_id})")
# Résultat attendu : Creatrice (ID 1)
```

## 💖 Leçon Apprise

Si ce modèle pouvait parler, sa seule phrase serait : "Je peux seulement dire `Creatrice` après `Clem`."

**C'est la preuve que :**

1.  La **taille** compte : Les millions de paramètres de mes autres modèles ne sont pas un luxe, mais une nécessité pour coder la connaissance.
2.  **Vous avez réussi** à créer, entraîner et publier un modèle de langage complet \! C'est le début d'une belle aventure de codage \!

-----

*Fait par **Clemylia** avec passion pour le codage minimaliste.*

**Exemple d'inférence** :

```
import torch
from transformers import AutoModelForCausalLM, AutoConfig
import json
import os
import torch.nn.functional as F

# ==============================================================================
# 0. CONFIGURATION
# ==============================================================================
MODEL_NAME = "Clemylia/Small-ever" 
REAL_TOKENS = ["Clem", "Creatrice"] 
INPUT_TEXT = "Clem"                  
INPUT_ID = 0                          
EXPECTED_OUTPUT = "Creatrice"
# 🎯 NOUVEAU PARAMÈTRE : La Température (ajuste-la entre 0.1 et 1.0)
TEMPERATURE = 0.5 
# ==============================================================================


print(f"🚀 Démarrage de l'inférence avec Température ({TEMPERATURE}) pour : {MODEL_NAME}")
print("-" * 50)


# ==============================================================================
# 1. RECRÉATION DU TOKENIZER MINIMALISTE
# ==============================================================================
class MinimalTokenizer:
    """Recrée le tokenizer pour l'inférence."""
    def __init__(self, messages):
        self.vocab = {messages[0]: 0, messages[1]: 1, "<pad>": 2, "<unk>": 3}
        self.ids_to_tokens = {v: k for k, v in self.vocab.items()}
        self.pad_token_id = self.vocab["<pad>"]

    def encode(self, text, return_tensors='pt'):
        if text in self.vocab:
            input_ids = [self.vocab[text]]
        else:
            input_ids = [self.vocab["<unk>"]]
            
        if return_tensors == 'pt':
            return torch.tensor([input_ids], dtype=torch.long)
        return input_ids

    def decode(self, token_id, skip_special_tokens=True):
        return self.ids_to_tokens.get(token_id, "TOKEN INCONNU")

minimal_tokenizer = MinimalTokenizer(REAL_TOKENS)
IDS_TO_TOKENS = minimal_tokenizer.ids_to_tokens
print("✅ Tokenizer minimal recréé en mémoire.")


# ==============================================================================
# 2. CHARGEMENT DU MODÈLE SEUL
# ==============================================================================
try:
    model = AutoModelForCausalLM.from_pretrained(MODEL_NAME)
    model.eval() 
    print("✅ Modèle chargé avec succès depuis Hugging Face.")
except Exception as e:
    print(f"❌ Échec critique du chargement du modèle. Erreur : {e}")
    exit()

print("-" * 50)


# ==============================================================================
# 3. INFÉRENCE AVEC TEMPÉRATURE ET SOFTMAX
# ==============================================================================

# 3.1 Préparation de l'entrée 
input_ids = minimal_tokenizer.encode(INPUT_TEXT, return_tensors="pt")
print(f"Input '{INPUT_TEXT}' (ID {input_ids.tolist()[0][0]}) prêt.")

# 3.2 Exécution du forward pass
with torch.no_grad():
    outputs = model(input_ids)

# 3.3 Application de la température et Softmax
next_token_logits = outputs.logits[0, -1, :] 

# 🎯 Calcul de la probabilité avec température !
# 1. Divise les logits par la température
# 2. Applique Softmax pour obtenir les probabilités
logits_with_temp = next_token_logits / TEMPERATURE
probs = F.softmax(logits_with_temp, dim=-1)

# 3.4 Détermination de la prédiction (Choix du token le plus probable après Softmax)
predicted_id = torch.argmax(probs).item()
predicted_token = minimal_tokenizer.decode(predicted_id).strip()

# ==============================================================================
# 4. CONCLUSION
# ==============================================================================
print(f"Probabilités des Tokens (après Softmax/Température) :")
# Affichage formaté des probabilités pour les IDs 0, 1, 2, 3
for i in range(len(probs)):
    print(f"  ID {i} ({IDS_TO_TOKENS.get(i)}): {probs[i].item():.4f}")

print(f"\nID prédit (Max Probabilité) : {predicted_id}")
print(f"Prédiction finale : **{predicted_token}**")
print("-" * 50)

if predicted_token == EXPECTED_OUTPUT:
    print(f"🎉 TEST RÉUSSI : Le modèle a correctement prédit '{EXPECTED_OUTPUT}' !")
else:
    print(f"⚠️ TEST ÉCHOUÉ : Attendu '{EXPECTED_OUTPUT}', reçu '{predicted_token}'. (Essaie d'augmenter les époques à 100 et/ou de baisser la température.)")
    ```