aitextgen
Différences
Ci-dessous, les différences entre deux révisions de la page.
| Les deux révisions précédentesRévision précédenteProchaine révision | Révision précédente | ||
| aitextgen [2020/06/20 07:25] – [Exemple] serge | aitextgen [2022/02/08 15:59] (Version actuelle) – Tag0 Removed: text_gen serge | ||
|---|---|---|---|
| Ligne 1: | Ligne 1: | ||
| ====== Génération de textes avec aitextgen et GPT-2====== | ====== Génération de textes avec aitextgen et GPT-2====== | ||
| + | |||
| + | <WRAP center round box 60% centeralign> | ||
| + | **{{tagpage> | ||
| + | </ | ||
| + | <WRAP center round box 60% centeralign> | ||
| + | **[[les_pages_intelligence_artificielle_en_details|Les Pages Intelligence Artificielle en détails]]** | ||
| + | </ | ||
| <WRAP center round box 80% centeralign> | <WRAP center round box 80% centeralign> | ||
| - | **{{tagpage> | + | **{{tagpage> |
| </ | </ | ||
| <WRAP center round box 80% centeralign> | <WRAP center round box 80% centeralign> | ||
| - | **Cette page est la suite de [[textgenrnn|Générer du texte en python avec textgenrnn]]** | + | **Cette page est la suite de [[archives:textgenrnn|Générer du texte en python avec textgenrnn]]** |
| </ | </ | ||
| <WRAP center round box 80% centeralign> | <WRAP center round box 80% centeralign> | ||
| - | Les chercheurs retardent la publication de leurs recherches car ils estiment que GPT2 a un potentiel « trop dangereux », étant donné que cette IA pourrait à terme servir à des actes mal intentionnées comme générer des avis négatifs ou positifs sur des produits, des spams, des textes complotistes, | + | Les chercheurs retardent la publication de leurs recherches car ils estiment que GPT2 a un potentiel « trop dangereux », étant donné que cette IA pourrait à terme servir à des actes mal intentionnées comme générer des avis négatifs ou positifs sur des produits, des spams, des textes complotistes, |
| + | Bien sûr, tout a été publié, y compris le modèle big de 1.5 Go. | ||
| </ | </ | ||
| + | |||
| + | =====Why do we like Word2vec? | ||
| + | {{ : | ||
| + | * **[[https:// | ||
| + | * **[[https:// | ||
| + | |||
| ===== Ressources ===== | ===== Ressources ===== | ||
| ====aitextgen==== | ====aitextgen==== | ||
| Ligne 19: | Ligne 33: | ||
| ====OpenAI==== | ====OpenAI==== | ||
| - | * **[[https:// | + | * **[[https:// |
| ====Controverse sur GPT-2==== | ====Controverse sur GPT-2==== | ||
| Ligne 44: | Ligne 58: | ||
| The FlauBERT model was proposed in the paper FlauBERT: Unsupervised Language Model Pre-training for French by Hang Le et al. It’s a transformer pre-trained using a masked language modeling (MLM) objective (BERT-like). | The FlauBERT model was proposed in the paper FlauBERT: Unsupervised Language Model Pre-training for French by Hang Le et al. It’s a transformer pre-trained using a masked language modeling (MLM) objective (BERT-like). | ||
| - | =====Exemple===== | + | =====Générateur de texte en ligne===== |
| - | < | + | * **[[https:// |
| - | Pourquoi ma pi ubuntu. | + | ===== Fables de La Fontaine avec un modèle entièrement créé===== |
| - | Je ne suis pas que le temps ou les pistes sont encore sur le | + | Suite de [[archives: |
| - | contenu du boire, je ne suis pas que je | + | |
| - | c'ai pas le rôle du monde en faire | + | < |
| - | l' | + | from aitextgen import aitextgen |
| - | l'avez bien | + | from aitextgen.TokenDataset import TokenDataset |
| + | from aitextgen.tokenizers import train_tokenizer | ||
| + | from aitextgen.utils import GPT2ConfigCPU, GPT2Config | ||
| + | from aitextgen import aitextgen | ||
| + | |||
| + | def get_config(): | ||
| + | return GPT2Config( | ||
| + | vocab_size=20000, | ||
| + | n_positions=1024, | ||
| + | n_ctx=1024, | ||
| + | n_embd=768, | ||
| + | n_layer=12, | ||
| + | n_head=12, | ||
| + | bos_token_id=0, | ||
| + | eos_token_id=0, | ||
| + | max_length=1024, | ||
| + | dropout=0.0 | ||
| + | ) | ||
| + | |||
| + | def training(): | ||
| + | file_name | ||
| + | train_tokenizer(file_name, | ||
| + | vocab_file = " | ||
| + | merges_file = " | ||
| + | |||
| + | config = get_config() | ||
| + | | ||
| + | |||
| + | data = TokenDataset(file_name, | ||
| + | vocab_file=vocab_file, | ||
| + | merges_file=merges_file, | ||
| + | block_size=64) | ||
| + | |||
| + | ai.train(data, | ||
| + | ai.generate(5, | ||
| + | |||
| + | training() | ||
| + | |||
| + | """ | ||
| + | essai 5 | ||
| + | 11,472 sets of tokens from ./ | ||
| + | Loss: 0.094 — Avg: 0.093 | ||
| + | """ | ||
| </ | </ | ||
| - | < | + | |
| - | Pourquoi ma pi outube pour | + | < |
| - | souv, j'ai perdre la même temps, c'est un bon sens, il faut pas | + | from aitextgen import aitextgen |
| - | ce qu'on croit que l' | + | from aitextgen.utils import GPT2Config |
| - | zon est inutile. Ceci est tout à fait à | + | |
| - | part. J'ai eu envie de le dire | + | |
| + | class AiTextGen: | ||
| + | |||
| + | def __init__(self): | ||
| + | """ | ||
| + | sinon le télécharge dans / | ||
| + | |||
| + | self.prompt = " | ||
| + | self.config = self.get_config() | ||
| + | print(" | ||
| + | print(" | ||
| + | |||
| + | print(" | ||
| + | | ||
| + | print(" | ||
| + | |||
| + | self.vocab_file = " | ||
| + | self.merges_file = " | ||
| + | |||
| + | print(" | ||
| + | self.ai = aitextgen(model=" | ||
| + | vocab_file=self.vocab_file, | ||
| + | | ||
| + | | ||
| + | |||
| + | def get_config(self): | ||
| + | return GPT2Config( | ||
| + | vocab_size=20000, | ||
| + | n_positions=1024, | ||
| + | n_ctx=1024, | ||
| + | n_embd=768, | ||
| + | n_layer=12, | ||
| + | n_head=12, | ||
| + | bos_token_id=0, | ||
| + | eos_token_id=0, | ||
| + | max_length=1024, | ||
| + | dropout=0.0 | ||
| + | ) | ||
| + | |||
| + | def get_irc_response(self, | ||
| + | if isinstance(prompt, | ||
| + | resp = self.ai.generate(n=1, | ||
| + | prompt=prompt, | ||
| + | max_length=len_max, | ||
| + | temperature=temp, | ||
| + | return_as_list=True) | ||
| + | return resp | ||
| + | |||
| + | |||
| + | def interactif(self): | ||
| + | while 1: | ||
| + | try: | ||
| + | prompt = input(" | ||
| + | except: | ||
| + | prompt = "Ne jouer pas à ce petit jeu !" | ||
| + | if isinstance(prompt, | ||
| + | resp = self.ai.generate(n=1, | ||
| + | prompt=prompt, | ||
| + | max_length=100, | ||
| + | temperature=0.8, | ||
| + | return_as_list=True) | ||
| + | print(f" | ||
| + | else: | ||
| + | print(" | ||
| + | |||
| + | |||
| + | if __name__ == " | ||
| + | |||
| + | atg = AiTextGen() | ||
| + | atg.interactif() | ||
| </ | </ | ||
| - | < | + | |
| - | Pourquoi ma pi issus de la | + | ====Configuration==== |
| - | périte. | + | * [[https:// |
| - | Enfin, vous êtes invité aux amigeaux des plus extrants à tous les artistes | + | |
| - | de sonores, au premier au niveau de la ville. | + | < |
| - | Je prends pas de chasse que de la vidéo, à l | + | config = GPT2Config(vocab_size=20000, |
| + | | ||
| + | n_ctx=1024, | ||
| + | n_embd=768, | ||
| + | n_layer=12, | ||
| + | n_head=12, | ||
| + | bos_token_id=0, | ||
| + | eos_token_id=0, | ||
| + | max_length=1024, | ||
| + | dropout=0.0 ) | ||
| + | |||
| + | print(config) | ||
| + | """ | ||
| + | GPT2Config {" | ||
| + | " | ||
| + | " | ||
| + | " | ||
| + | " | ||
| + | " | ||
| + | " | ||
| + | " | ||
| + | " | ||
| + | " | ||
| + | " | ||
| + | " | ||
| + | " | ||
| + | " | ||
| + | " | ||
| + | " | ||
| + | " | ||
| + | " | ||
| + | " | ||
| + | " | ||
| + | " | ||
| + | " | ||
| + | """ | ||
| + | |||
| + | ai = aitextgen(model=" | ||
| + | merges_file=merges_file, | ||
| + | |||
| + | ai.generate(n=1, | ||
| </ | </ | ||
| - | < | + | |
| - | Pourquoi ma pi ordre | + | ===== Mails de La Labomedia ===== |
| - | b | + | ====Configuration==== |
| - | Message précédent: | + | < |
| - | Salut Benjamin, | + | def get_config(): |
| - | J'ai pas besoin de mon avis et ce que le logo. | + | |
| - | L' | + | |
| - | tout | + | |
| - | fait, je vais faire un divertissement. | + | |
| - | A mon avis sur le cf | + | |
| + | | ||
| + | | ||
| + | bos_token_id=0, | ||
| + | eos_token_id=0, | ||
| + | max_length=1024, | ||
| + | dropout=0.0 | ||
| + | ) | ||
| + | |||
| + | data = TokenDataset(file_name, | ||
| + | vocab_file=vocab_file, | ||
| + | merges_file=merges_file, | ||
| + | block_size=64) | ||
| + | ai.train(data, | ||
| </ | </ | ||
| - | =====Pense bête pour NFS===== | + | Les datas sont trop pourries, le résultat est très médiocre ! |
| - | * [[https:// | + | ===== Des textes dans le domaine public du Projet Gutemberg |
| + | **[[http:// | ||
| + | |||
| + | Extrait de [[https:// | ||
| + | |||
| + | Le projet Gutenberg est une bibliothèque de versions électroniques libres de livres physiquement existants. Les textes fournis sont essentiellement du domaine public, soit parce qu'ils n'ont jamais été sujets à des droits d' | ||
| + | |||
| + | Ce site n' | ||
| + | |||
| + | Conversion de *.epub vers *.txt avec ebook-convert, puis regroupement de tous les textes dans un seul fichier, en séparant chaque œuvre par ' | ||
| + | |||
| + | Les fichiers non nettoyés font 300 Mo, et nettoyés font 280 Mo. | ||
| + | |||
| + | ===Nettoyage des datas=== | ||
| + | Les sauts de lignes, les sommaires ... doivent être nettoyés: avec clean_txt.py | ||
| + | |||
| + | Le plus grand nettoyage est fait avec une détection de langue: | ||
| + | from langdetect import detect_langs | ||
| + | je garde la ligne si langue.lang == 'fr' and langue.prob > 0.4: | ||
| + | Cela supprime les textes en anglais, en particulier les licences, les chiffres romains ... | ||
| + | |||
| + | Le nettoyage des datas est très important, ce n'est pas drôle, il faut vérifier le résultat obtenu en tapant au hasard dans le texte, ça prend un temps fou ... | ||
| + | |||
| + | La génération de texte est une représentation fidèle du texte d' | ||
| + | |||
| + | ====Training==== | ||
| + | ===OOM = Out Of Memory=== | ||
| + | Finetuning the 355M GPT-2 model or larger on a GPU will cause the GPU to go OOM, even 16 GB VRAM GPUs | ||
| + | |||
| + | * Le fichier d' | ||
| + | * vocab_size = 40 000 | ||
| + | * batch_size = 48, valeur maxi possible avec 6 Go de Ram GPU (1060 GTX) | ||
| + | * Ram CPU = 16 Go, Swap=64 Go, valeur totale de l' | ||
| + | |||
| + | Efficacité au bout de 144 heures: | ||
| + | {{ : | ||
| + | |||
| + | =====Fables de La Fontaine avec la config de bouquineux===== | ||
| + | ==== Avec la configuration de bouquineux et vocab=40000 ==== | ||
| + | {{ : | ||
| + | Remarque: Les Fables ont environ 13000 tokens, le vocab devrait se limiter à 14000 !\\ | ||
| + | Testing pas mal mais quand même bourré d' | ||
| + | |||
| + | ==== A partir du model tf_gpt2=" | ||
| + | * vocab_size=5000 | ||
| + | * Apprentissage très rapide | ||
| + | * texte générés comme les précédents | ||
| + | |||
| + | =====Fables de La Fontaine à partir du model tf_gpt2=" | ||
| + | <WRAP center round tip 60%> | ||
| + | C'est le meilleur générateur de texte, avec un apprentissage de 16 heures ! | ||
| + | </ | ||
| + | <WRAP center round tip 60%> | ||
| + | tf_gpt2=" | ||
| + | </ | ||
| + | ====Affinage du model existant tf_gpt2=" | ||
| + | * [[https:// | ||
| + | |||
| + | La ligne: | ||
| + | ai = aitextgen(tf_gpt2=" | ||
| + | va télécharger automatiquement le model.\\ | ||
| + | Le training va affiner ce model. C'est un model construit sur un texte anglais, et pourtant cela va générer du texte français. | ||
| + | |||
| + | |||
| + | ====Shot de l' | ||
| + | Pendant le trainning, les test de generate() retourne de l' | ||
| + | {{ : | ||
| + | |||
| + | ====Courbe de loss==== | ||
| + | J' | ||
| + | {{ : | ||
| + | |||
| + | ====Testing==== | ||
| + | {{ : | ||
| + | Le résultat comporte peu de mots mal construits, inexistants en français. Par contre, il n'y a aucun sens au texte, c'est mieux que du Nostradamus, | ||
| + | |||
| + | ====Développement à suivre==== | ||
| + | Construire sur le gros model de 1.5 Go ! | ||
| + | |||
| + | ====Les sources sur GitHub==== | ||
| + | * **[[https:// | ||
| + | |||
| - | {{tag>ia python | + | {{tag> ia python sb tal }} |
aitextgen.1592637901.txt.gz · Dernière modification : de serge
