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/15 10:36] – [Génération de textes avec aitextgen et GPT-2] 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==== | ||
* **[[https:// | * **[[https:// | ||
* **[[https:// | * **[[https:// | ||
* **aitextgen** est un outil Python robuste pour la formation et la génération d' intelligence artificielle basée sur du texte à l'aide de l' architecture GPT-2 d' **[[https:// | * **aitextgen** est un outil Python robuste pour la formation et la génération d' intelligence artificielle basée sur du texte à l'aide de l' architecture GPT-2 d' **[[https:// | ||
- | * **[[https:// | ||
+ | ====OpenAI==== | ||
+ | * **[[https:// | ||
+ | |||
+ | ====Controverse sur GPT-2==== | ||
+ | * [[https:// | ||
+ | * [[https:// | ||
+ | * | ||
==== Transformers ==== | ==== Transformers ==== | ||
- | * https:// | + | * **[[https:// |
- | Transformers: | + | ==== BERT ==== |
+ | |||
+ | * **[[https:// | ||
===CamemBERT=== | ===CamemBERT=== | ||
Ligne 34: | Ligne 57: | ||
* https:// | * https:// | ||
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). | ||
+ | |||
+ | =====Générateur de texte en ligne===== | ||
+ | * **[[https:// | ||
+ | ===== Fables de La Fontaine avec un modèle entièrement créé===== | ||
+ | Suite de [[archives: | ||
+ | |||
+ | <code python training.py> | ||
+ | from aitextgen import aitextgen | ||
+ | from aitextgen.TokenDataset import TokenDataset | ||
+ | from aitextgen.tokenizers import train_tokenizer | ||
+ | from aitextgen.utils import GPT2ConfigCPU, | ||
+ | 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() | ||
+ | ai = aitextgen(vocab_file=vocab_file, | ||
+ | |||
+ | 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 | ||
+ | """ | ||
+ | </ | ||
+ | |||
+ | <code python testing.py> | ||
+ | from aitextgen import aitextgen | ||
+ | from aitextgen.utils import GPT2Config | ||
+ | |||
+ | |||
+ | class AiTextGen: | ||
+ | |||
+ | def __init__(self): | ||
+ | """ | ||
+ | sinon le télécharge dans / | ||
+ | |||
+ | self.prompt = " | ||
+ | self.config = self.get_config() | ||
+ | print(" | ||
+ | print(" | ||
+ | |||
+ | print(" | ||
+ | ai = aitextgen() | ||
+ | print(" | ||
+ | |||
+ | self.vocab_file = " | ||
+ | self.merges_file = " | ||
+ | |||
+ | print(" | ||
+ | self.ai = aitextgen(model=" | ||
+ | vocab_file=self.vocab_file, | ||
+ | merges_file=self.merges_file, | ||
+ | config=self.config) | ||
+ | |||
+ | 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() | ||
+ | </ | ||
+ | |||
+ | ====Configuration==== | ||
+ | * [[https:// | ||
+ | |||
+ | <code python> | ||
+ | config = 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 ) | ||
+ | |||
+ | print(config) | ||
+ | """ | ||
+ | GPT2Config {" | ||
+ | " | ||
+ | " | ||
+ | " | ||
+ | " | ||
+ | " | ||
+ | " | ||
+ | " | ||
+ | " | ||
+ | " | ||
+ | " | ||
+ | " | ||
+ | " | ||
+ | " | ||
+ | " | ||
+ | " | ||
+ | " | ||
+ | " | ||
+ | " | ||
+ | " | ||
+ | " | ||
+ | " | ||
+ | """ | ||
+ | |||
+ | ai = aitextgen(model=" | ||
+ | merges_file=merges_file, | ||
+ | |||
+ | ai.generate(n=1, | ||
+ | </ | ||
+ | |||
+ | ===== Mails de La Labomedia ===== | ||
+ | ====Configuration==== | ||
+ | <code python> | ||
+ | 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 | ||
+ | ) | ||
+ | | ||
+ | data = TokenDataset(file_name, | ||
+ | vocab_file=vocab_file, | ||
+ | merges_file=merges_file, | ||
+ | block_size=64) | ||
+ | ai.train(data, | ||
+ | </ | ||
+ | |||
+ | Les datas sont trop pourries, le résultat est très médiocre ! | ||
+ | ===== 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, | ||
+ | |||
+ | 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 == ' | ||
+ | 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.txt · Dernière modification : 2022/02/08 15:59 de serge