Clemylia commited on
Commit
bdf11c8
·
verified ·
1 Parent(s): f3a1d94

Create README.md

Browse files
Files changed (1) hide show
  1. README.md +307 -0
README.md ADDED
@@ -0,0 +1,307 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ ---
2
+ license: mit
3
+ language:
4
+ - fr
5
+ pipeline_tag: text-generation
6
+ tags:
7
+ - child
8
+ - Alphabet
9
+ - récitation
10
+ - Simulation enfantine
11
+ - ABX
12
+ - simulation de ABX
13
+ - jeunes enfants
14
+ - 2 a 7 ans
15
+ ---
16
+ # 🦋 ABX
17
+
18
+ ![Abx-enfant](http://www.image-heberg.fr/files/17607941632935356724.jpg)
19
+
20
+ Bienvenue sur la page de notre modèle `ABX`.
21
+ Ce modèle de machine learning est une idée que Nous avions prototyper avec des règles.
22
+ Mais nous avons considéré l'idée assez créative et intéressante pour faire l'objet de la création d'une IA de ML (machine learning),
23
+ Et d'une version finale fonctionnelle concrète pour l'utilisation.
24
+
25
+ ## 🌷 Ce que fait ABX
26
+
27
+ ABX est une IA qui simule la récitation de l'alphabet par un jeune enfant âgé de 2 a 7 ans.
28
+ L'enfant (ABX) essaye de réciter l'alphabet,
29
+ Mais plus son âge est faible et plus sa température est élevé, plus il oublie les lettres et se trompe.
30
+ Il aura tendance à s'excuser, à pleurer ou à sauter des lettres quand il est en bas âge (2 ou 3 ans), et se tromper de façon perpétuelle.
31
+ Mais ABX, sera extrêmement précis et fera un sans faute quand il est beaucoup plus grand (7 ans).
32
+ Plus sa température est élevée, et plus il est jeune, plus il va faire des boulettes (a l'image d'un vrai enfant).
33
+ Un bébé de 2 ans ne sais pas réciter l'alphabet, mais un enfant de 7 ans sais le faire (enfin normalement 😉).
34
+ ABX simule donc cela.
35
+
36
+ # 🌸 Comment ABX a été entraîné
37
+
38
+ ABX a été entraîné de façon rapide,
39
+ Mais a quand même nécessiter l'activation du GPU pour un entraînement efficace et continue sans plantage de session.
40
+ Pour qu'il apprenne à simuler la récitation de des jeunes enfants,
41
+ nous lui avons montrer l'alphabet correcte en entier,
42
+ puis lui avons aussi donner des données d'entraînement pour les probabilités pour chaque âge.
43
+ Nous avons aussi ajouté des petits messages aléatoires d'excuses, de pleurs et autre...que ABX utilise de temps et autres pour s'excuser et mettre de l'action a sa récitation foireuse de ses bas âge.
44
+
45
+ # 🔥 Que faire avec ABX
46
+
47
+ ABX peut vous être utile pour beaucoup de tâches créatives impliquant de la simulation enfantine.
48
+ (Par exemple : jeux de récitation l'alphabet ou les enfants qui doivent réciter l'alphabet sont des bots gérer par le modèle).
49
+ Trouvez votre propre cas d'usage et amusez vous !
50
+
51
+ # 🩵 Utilisation
52
+
53
+ Voici un exemple de code d'utilisation de ABX :
54
+
55
+ ```
56
+ import torch
57
+ import torch.nn as nn
58
+ import torch.nn.functional as F
59
+ import json
60
+ import os
61
+ from huggingface_hub import hf_hub_download
62
+
63
+ # =================================================================
64
+ # 0. CONFIGURATION ET DÉFINITION DES CLASSES DU MODÈLE
65
+ # =================================================================
66
+
67
+ # --- Configuration du dépôt Hugging Face ---
68
+ HF_REPO_ID = "Clemylia/ABX"
69
+ MODEL_FILENAME = "abx_model_state.pt"
70
+ CONFIG_FILENAME = "config.json"
71
+ VOCAB_FILENAME = "vocab.json"
72
+ DEVICE = torch.device("cuda" if torch.cuda.is_available() else "cpu")
73
+
74
+ print(f"Périphérique utilisé : {DEVICE}")
75
+
76
+ # --- Définition des classes du modèle (Doit être identique à l'entraînement !) ---
77
+
78
+ # 1. Attention (Self-Attention Masquée Causale)
79
+ class Attention(nn.Module):
80
+ def __init__(self, embed_dim, num_heads, dropout):
81
+ super().__init__()
82
+ self.norm = nn.LayerNorm(embed_dim)
83
+ self.attn = nn.MultiheadAttention(embed_dim, num_heads, dropout=dropout, batch_first=True)
84
+ self.dropout_rate = dropout
85
+
86
+ def forward(self, x, mask):
87
+ res = x
88
+ x = self.norm(x)
89
+ attn_output, _ = self.attn(x, x, x, attn_mask=mask, need_weights=False)
90
+ return res + attn_output
91
+
92
+ # 2. Feed Forward (MLP)
93
+ class FeedForward(nn.Module):
94
+ def __init__(self, embed_dim, d_ff, dropout):
95
+ super().__init__()
96
+ self.norm = nn.LayerNorm(embed_dim)
97
+ self.ffn = nn.Sequential(
98
+ nn.Linear(embed_dim, d_ff),
99
+ nn.GELU(),
100
+ nn.Dropout(dropout),
101
+ nn.Linear(d_ff, embed_dim),
102
+ nn.Dropout(dropout)
103
+ )
104
+
105
+ def forward(self, x):
106
+ res = x
107
+ x = self.norm(x)
108
+ return res + self.ffn(x)
109
+
110
+ # 3. Bloc Décodeur
111
+ class DecoderBlock(nn.Module):
112
+ def __init__(self, embed_dim, num_heads, d_ff, dropout):
113
+ super().__init__()
114
+ self.attention = Attention(embed_dim, num_heads, dropout)
115
+ self.feed_forward = FeedForward(embed_dim, d_ff, dropout)
116
+
117
+ def forward(self, x, mask):
118
+ x = self.attention(x, mask)
119
+ x = self.feed_forward(x, )
120
+ return x
121
+
122
+ # 4. Le Modèle ABX Principal
123
+ class ABXModel(nn.Module):
124
+ def __init__(self, vocab_size, embed_dim, num_heads, num_layers, max_seq_len, d_ff, pad_token_id, dropout=0.1):
125
+ super().__init__()
126
+ self.pad_token_id = pad_token_id
127
+ self.token_embedding = nn.Embedding(vocab_size, embed_dim, padding_idx=pad_token_id)
128
+ self.position_embedding = nn.Embedding(max_seq_len, embed_dim)
129
+ self.dropout = nn.Dropout(dropout)
130
+
131
+ self.layers = nn.ModuleList([
132
+ DecoderBlock(embed_dim, num_heads, d_ff, dropout) for _ in range(num_layers)
133
+ ])
134
+
135
+ self.norm = nn.LayerNorm(embed_dim)
136
+ self.output_linear = nn.Linear(embed_dim, vocab_size)
137
+
138
+ def creer_masque(self, taille):
139
+ masque = torch.triu(torch.ones(taille, taille), diagonal=1).bool().to(DEVICE)
140
+ return masque
141
+
142
+ def forward(self, input_ids):
143
+ T = input_ids.size(1)
144
+
145
+ token_embed = self.token_embedding(input_ids)
146
+ positions = torch.arange(T, device=DEVICE).unsqueeze(0)
147
+ pos_embed = self.position_embedding(positions)
148
+
149
+ x = self.dropout(token_embed + pos_embed)
150
+
151
+ masque_causal = self.creer_masque(T)
152
+
153
+ for layer in self.layers:
154
+ x = layer(x, masque_causal)
155
+
156
+ x = self.norm(x)
157
+ logits = self.output_linear(x)
158
+
159
+ return logits
160
+
161
+
162
+ # =================================================================
163
+ # 1. TÉLÉCHARGEMENT DES FICHIERS DE CONFIGURATION ET DES POIDS
164
+ # =================================================================
165
+
166
+ print("Téléchargement des fichiers du dépôt Hugging Face...")
167
+
168
+ # Télécharger les fichiers
169
+ config_path = hf_hub_download(repo_id=HF_REPO_ID, filename=CONFIG_FILENAME)
170
+ vocab_path = hf_hub_download(repo_id=HF_REPO_ID, filename=VOCAB_FILENAME)
171
+ model_weights_path = hf_hub_download(repo_id=HF_REPO_ID, filename=MODEL_FILENAME)
172
+
173
+ # --- Chargement de la Configuration ---
174
+ with open(config_path, 'r') as f:
175
+ config = json.load(f)
176
+
177
+ # --- Chargement du Vocabulaire ---
178
+ with open(vocab_path, 'r') as f:
179
+ # Le vocabulaire a été sauvegardé comme un mapping ID -> Token (string)
180
+ id_to_token_str_keys = json.load(f)
181
+
182
+ # Reconstruire le mapping Token -> ID pour l'inférence
183
+ # Convertir les clés en int
184
+ id_to_token = {int(k): v for k, v in id_to_token_str_keys.items()}
185
+ token_to_id = {v: k for k, v in id_to_token.items()}
186
+
187
+
188
+ # --- Extraction des paramètres ---
189
+ VOCAB_SIZE = config['vocab_size']
190
+ EMBED_DIM = config['embed_dim']
191
+ NUM_HEADS = config['num_heads']
192
+ NUM_LAYERS = config['num_layers']
193
+ MAX_SEQ_LEN = config['max_seq_len']
194
+ D_FF = config['d_ff']
195
+ PAD_TOKEN_ID = config['pad_token_id']
196
+
197
+ # Extraction des tokens spéciaux
198
+ START_TOKEN = config['special_tokens']['start']
199
+ END_TOKEN = config['special_tokens']['end']
200
+ SEP_TOKEN = config['special_tokens']['sep']
201
+ PAD_TOKEN = config['special_tokens']['pad']
202
+
203
+
204
+ # =================================================================
205
+ # 2. INSTANCIATION ET CHARGEMENT DU MODÈLE
206
+ # =================================================================
207
+
208
+ # Instanciation du modèle ABX
209
+ model = ABXModel(
210
+ vocab_size=VOCAB_SIZE,
211
+ embed_dim=EMBED_DIM,
212
+ num_heads=NUM_HEADS,
213
+ num_layers=NUM_LAYERS,
214
+ max_seq_len=MAX_SEQ_LEN,
215
+ d_ff=D_FF,
216
+ pad_token_id=PAD_TOKEN_ID
217
+ ).to(DEVICE)
218
+
219
+ # Chargement des poids entraînés
220
+ model.load_state_dict(torch.load(model_weights_path, map_location=DEVICE))
221
+ model.eval() # Toujours passer en mode évaluation pour l'inférence
222
+
223
+ print("\nModèle et configuration chargés avec succès !")
224
+
225
+ # =================================================================
226
+ # 3. FONCTION DE GÉNÉRATION (Inférence)
227
+ # =================================================================
228
+
229
+ @torch.no_grad()
230
+ def generer_recitation(model, age: int, temperature: float):
231
+ """
232
+ Génère une récitation de l'alphabet à partir de l'âge et de la température.
233
+ """
234
+ model.eval()
235
+
236
+ # Création du prompt initial
237
+ prompt_text = f"{START_TOKEN} [AGE:{age}] {SEP_TOKEN}"
238
+ prompt_tokens = prompt_text.split()
239
+
240
+ # Conversion en IDs
241
+ input_ids = [token_to_id.get(token, PAD_TOKEN_ID) for token in prompt_tokens]
242
+ input_tensor = torch.tensor([input_ids], dtype=torch.long, device=DEVICE)
243
+ output_ids = input_ids[:]
244
+
245
+ # Boucle de génération
246
+ for _ in range(len(prompt_tokens), MAX_SEQ_LEN):
247
+
248
+ logits = model(input_tensor)
249
+ next_token_logits = logits[0, -1, :]
250
+
251
+ # Application de la Température (échantillonnage)
252
+ if temperature <= 0.01:
253
+ next_token_id = torch.argmax(next_token_logits).item()
254
+ else:
255
+ probabilities = F.softmax(next_token_logits / temperature, dim=-1)
256
+
257
+ if torch.isnan(probabilities).any() or probabilities.sum() == 0:
258
+ next_token_id = torch.argmax(next_token_logits).item()
259
+ else:
260
+ next_token_id = torch.multinomial(probabilities, num_samples=1).item()
261
+
262
+ # Condition d'arrêt
263
+ if id_to_token.get(next_token_id) == END_TOKEN:
264
+ break
265
+
266
+ output_ids.append(next_token_id)
267
+
268
+ # Mise à jour de la séquence d'entrée
269
+ next_token_tensor = torch.tensor([[next_token_id]], dtype=torch.long, device=DEVICE)
270
+ input_tensor = torch.cat([input_tensor, next_token_tensor], dim=1)
271
+
272
+ # Conversion en texte et nettoyage
273
+ output_text = " ".join([id_to_token.get(id) for id in output_ids])
274
+ output_text = output_text.replace(f"{START_TOKEN} [AGE:{age}] {SEP_TOKEN}", "").replace(END_TOKEN, "").replace(PAD_TOKEN, "").strip()
275
+
276
+ return output_text
277
+
278
+
279
+ # =================================================================
280
+ # 4. EXEMPLES D'UTILISATION POUR L'UTILISATEUR
281
+ # =================================================================
282
+
283
+ print("\n" + "="*50)
284
+ print(" TESTS UTILISATEUR ABX")
285
+ print("="*50)
286
+
287
+ # Scénario 1: L'enfant ne se concentre pas (Age bas, Température haute)
288
+ age_test_1 = 2
289
+ temp_test_1 = 1.3
290
+ result_1 = generer_recitation(model, age_test_1, temp_test_1)
291
+ print(f"-> Âge: {age_test_1} ans, Température: {temp_test_1} (Distrait)")
292
+ print(f"Récitation: {result_1}\n")
293
+
294
+ # Scénario 2: L'enfant fait un effort (Age moyen, Température modérée)
295
+ age_test_2 = 5
296
+ temp_test_2 = 0.7
297
+ result_2 = generer_recitation(model, age_test_2, temp_test_2)
298
+ print(f"-> Âge: {age_test_2} ans, Température: {temp_test_2} (Normal)")
299
+ print(f"Récitation: {result_2}\n")
300
+
301
+ # Scénario 3: L'enfant est très attentif (Age haut, Température basse)
302
+ age_test_3 = 7
303
+ temp_test_3 = 0.1
304
+ result_3 = generer_recitation(model, age_test_3, temp_test_3)
305
+ print(f"-> Âge: {age_test_3} ans, Température: {temp_test_3} (Précis)")
306
+ print(f"Récitation: {result_3}")
307
+ ```