Outils pour utilisateurs

Outils du site


aitextgen

Différences

Ci-dessous, les différences entre deux révisions de la page.

Lien vers cette vue comparative

Les deux révisions précédentesRévision précédente
Prochaine révision
Révision précédente
aitextgen [2020/06/18 14:04] sergeaitextgen [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>ia|Intelligence Artificielle}}**     **[[http://translate.google.com/translate?hl=&sl=auto&tl=en&u=https%3A%2F%2Fressources.labomedia.org%2Faitextgen|English Version]]**
 +</WRAP>
 +<WRAP center round box 60% centeralign>
 +**[[les_pages_intelligence_artificielle_en_details|Les Pages Intelligence Artificielle en détails]]**
 +</WRAP>
  
 <WRAP center round box 80% centeralign> <WRAP center round box 80% centeralign>
-**{{tagpage>tal|Traitement Automatique du Langage}}** **{{tagpage>ia|Intelligence Artificielle}}**  +**{{tagpage>tal|Traitement Automatique du Langage}}**  
 </WRAP> </WRAP>
  
 <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> </WRAP>
  
 <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, voire des fausses nouvelles8. cf **[[https://fr.wikipedia.org/wiki/OpenAI#GPT2|W]]**+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, voire des fausses nouvelles. cf **[[https://fr.wikipedia.org/wiki/OpenAI#GPT2|W]]**\\ 
 +Bien sûr, tout a été publié, y compris le modèle big de 1.5 Go.
 </WRAP> </WRAP>
 +
 +=====Why do we like Word2vec?=====
 +{{ :media_10:d0iwslbsoruw1j6q-w.png?direct&600 |}}
 +  * **[[https://towardsdatascience.com/representing-text-in-natural-language-processing-1eead30e57d8|Representing text in natural language processing]]**
 +  * **[[https://nlp.stanford.edu/pubs/glove.pdf|GloVe: Global Vectors for Word Representation]]**
 +
 ===== Ressources ===== ===== Ressources =====
 ====aitextgen==== ====aitextgen====
Ligne 19: Ligne 33:
  
 ====OpenAI==== ====OpenAI====
-  * **[[https://fr.wikipedia.org/wiki/OpenAI|OpenAI sur Wikipedia]]**: OpenAI est une entreprise à « but lucratif plafonné » en intelligence artificielle, basée à San Francisco. L'objectif de cette société est de promouvoir et développer une intelligence artificielle à visage humain qui bénéficiera à toute l'humanité. OpenAI a mis au point une intelligence artificielle nommée **[[https://fr.wikipedia.org/wiki/OpenAI#GPT2|GPT2]]** capable d'écrire des articles de presse et des œuvres de fiction. Reposant sur un générateur de texte qui assimile les mots reçus et détermine la suite la plus logique qu'elle retransmet dans le même style, elle s'avère particulièrement performante, à tel point qu'il est impossible de faire la différence avec un texte écrit par un être humain7.\\ 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, voire des fausses nouvelles8.  +  * **[[https://fr.wikipedia.org/wiki/OpenAI|OpenAI sur Wikipedia]]**: OpenAI est une entreprise à « but lucratif plafonné » en intelligence artificielle, basée à San Francisco. L'objectif de cette société est de promouvoir et développer une intelligence artificielle à visage humain qui bénéficiera à toute l'humanité. OpenAI a mis au point une intelligence artificielle nommée **[[https://fr.wikipedia.org/wiki/OpenAI#GPT2|GPT2]]** capable d'écrire des articles de presse et des œuvres de fiction. Reposant sur un générateur de texte qui assimile les mots reçus et détermine la suite la plus logique qu'elle retransmet dans le même style, elle s'avère particulièrement performante, à tel point qu'il est impossible de faire la différence avec un texte écrit par un être humain.\\ 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, voire des fausses nouvelles.  
  
 ====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===== 
-<code> +  * **[[https://gpt2.ai-demo.xyz/|OpenAI GPT2 Scratch Pad]]** 
-Pourquoi ma pi  http://www.orleans.fr/spip-a-saver-le-move-de-me-sart-pour-nouve-les-et-un-point-de-gestion-de-fable-de-en-d-+===== Fables de La Fontaine avec un modèle entièrement créé===== 
 +Suite de [[archives:textgenrnn#avec_des_fables_de_la_fontaine|Avec des fables de La Fontaine]] 
 + 
 +<code python training.py> 
 +from aitextgen import aitextgen 
 +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  =  "./fables.txt" 
 +    train_tokenizer(file_name, vocab_size=20000) 
 +    vocab_file = "aitextgen-vocab.json" 
 +    merges_file = "aitextgen-merges.txt" 
 + 
 +    config = get_config() 
 +    ai = aitextgen(vocab_file=vocab_file, merges_file=merges_file, config=config) 
 + 
 +    data = TokenDataset(file_name, 
 +                        vocab_file=vocab_file, 
 +                        merges_file=merges_file, 
 +                        block_size=64) 
 + 
 +    ai.train(data, batch_size=32, num_steps=60000) 
 +    ai.generate(5, prompt="Le chien et le lion"
 + 
 +training() 
 + 
 +""" 
 +essai 5 
 +11,472 sets of tokens from ./fables.txt 
 +Loss: 0.094 — Avg: 0.093 
 +"""
 </code> </code>
-<code> + 
-Pourquoi ma pi ubuntu+<code python testing.py
-Je ne suis pas que le temps ou les pistes sont encore sur le +from aitextgen import aitextgen 
-contenu du boireje ne suis pas que je +from aitextgen.utils import GPT2Config 
-c'ai pas le rôle du monde en faire + 
-l'inqui détretre (pour que vous + 
-l'avez bien+class AiTextGen: 
 + 
 +    def __init__(self): 
 +        """Charge le gpt2 model de /aitextgen si existe, 
 +        sinon le télécharge dans /aitextgen.""" 
 + 
 +        self.prompt = "Romeo:
 +        self.config = self.get_config() 
 +        print("Config chargée."
 +        print("    soit:\n", self.config) 
 + 
 +        print("Création de aitextgen():"
 +        ai = aitextgen() 
 +        print("Done."
 + 
 +        self.vocab_file = "aitextgen-vocab.json" 
 +        self.merges_file = "aitextgen-merges.txt" 
 + 
 +        print("Chargement du modèle pytorch ..."
 +        self.ai = aitextgen(model="./trained_model/pytorch_model.bin"
 +                            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, prompt, len_max, temp): 
 +        if isinstance(prompt, str): 
 +            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("Entrer un début de phrase:\n"
 +            except: 
 +                prompt = "Ne jouer pas à ce petit jeu !" 
 +            if isinstance(prompt, str) and len(prompt) > 4: 
 +                resp = self.ai.generate(n=1, 
 +                                        prompt=prompt, 
 +                                        max_length=100, 
 +                                        temperature=0.8, 
 +                                        return_as_list=True) 
 +                print(f"\n\nLa Fontaine n'a pas écrit:\n{resp[0]}\n\n"
 +            else: 
 +                print("Raté"
 + 
 + 
 +if __name__ == "__main__": 
 + 
 +    atg = AiTextGen() 
 +    atg.interactif()
 </code> </code>
-<code> + 
-Pourquoi ma pi  http://www.decripal.fr/ +====Configuration==== 
-  http://www.youtube.com/watch?v=LH00xyFtAI4# +  * [[https://docs.aitextgen.io/tutorials/model-from-scratch/|Training a GPT-2 Model From Scratch]] 
- Nico  + 
- Développeur / Intégrateur Web +<code python> 
- 02 38 62 48 31 +config = GPT2Config(vocab_size=20000, 
- http://labomedia.org  http://labomedia.org+                    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 {"activation_function": "gelu_new", 
 +            "attn_pdrop": 0.1, 
 +            "bos_token_id": 0, 
 +            "dropout": 0.0, 
 +            "embd_pdrop": 0.1, 
 +            "eos_token_id": 0, 
 +            "initializer_range": 0.02, 
 +            "layer_norm_epsilon"1e-05, 
 +            "max_length": 1024, 
 +            "model_type": "gpt2", 
 +            "n_ctx": 1024, 
 +            "n_embd": 768, 
 +            "n_head": 12, 
 +            "n_layer": 12, 
 +            "n_positions": 1024, 
 +            "resid_pdrop": 0.1, 
 +            "summary_activation"null, 
 +            "summary_first_dropout": 0.1, 
 +            "summary_proj_to_labels": true, 
 +            "summary_type": "cls_index", 
 +            "summary_use_proj": true, 
 +            "vocab_size": 20000} 
 +""" 
 + 
 +ai = aitextgen(model="./trained_model/pytorch_model.bin", vocab_file=vocab_file, 
 +                        merges_file=merges_file, config=config) 
 + 
 +ai.generate(n=1, prompt=prompt, max_length=100, temperature=0.8, return_as_list=True)
 </code> </code>
-<code> + 
-Pourquoi ma pi outube pour +===== Mails de La Labomedia ===== 
-souv, j'ai perdre la même temps, c'est un bon sens, il faut pas +====Configuration==== 
-ce qu'on croit que l'élégance  +<code python
-zon est inutile. Ceci est tout à fait à  +def get_config(): 
-part. J'ai eu envie de le dire +    return GPT2Config( 
-</code> +                            vocab_size=20000
-<code> +                            n_positions=1024
-Pourquoi ma pi issus de la +                            n_ctx=1024
-périte. +                            n_embd=768, 
-Enfinvous êtes invité aux amigeaux des plus extrants à tous les artistes +                            n_layer=12, 
-de sonoresau premier au niveau de la ville. +                            n_head=12, 
-Je prends pas de chasse que de la vidéoà l +                            bos_token_id=0
-</code> +                            eos_token_id=0, 
-<code> +                            max_length=1024
-Pourquoi ma pi ubuntu (f.).  +                            dropout=0.0 
-Pour une voiture et revenuele  +                        ) 
-de l'article. +                         
-Après de lire... +data = TokenDataset(file_name, 
-L'utilisation n'anise pas... +                    vocab_file=vocab_file
-Message précédent: +                    merges_file=merges_file
-D'ailleursj'ai un peu plus de bonne bous. +                    block_size=64) 
-Message +ai.train(databatch_size=32, num_steps=150000)
-</code> +
-<code> +
-Pourquoi ma pi ultime+
-De : Nico  nderambure@labomedia.net +
-Ca Biel  mailto:nderambure@labomedia.net +
-À : "adherent-ressource@labomedia.net"  adherent-ressource@labomedia.net  +
-Envoyé le : 21 mars 2013 13h +
-Objet : Re +
-</code> +
-<code> +
-Pourquoi ma pi  http://blog..orleans.fr/fr/news/article/article/04/des-par-le-sun-pun-sil-premier-cil-et-prame-la-vue +
-Message précédent: +
-C'est vraiment +
-</code> +
-<code> +
-Pourquoi ma pi ordre +
-   b +
-Message précédent: +
- Salut Benjamin+
- J'ai pas besoin de mon avis et ce que le logo. +
- L'erreur de l'élégance  +
- tout +
- faitje vais faire un divertissement. +
- A mon avis sur le cf +
-</code> +
-<code> +
-Pourquoi ma pi  https://www.youtube.com/watch?v=1MM +
- Sarkozy-Pure de mes fractuches a lieu... +
-Message précédent: +
- Encore du molardje+
 </code> </code>
  
-{{tag>ia python python3 tal textgenrnn sb rnn}}+Les datas sont trop pourries, le résultat est très médiocre ! 
 +===== Des textes dans le domaine public du Projet Gutemberg ===== 
 +**[[http://www.gutenberg.org/|Free eBooks - Project Gutenberg]]**  
 + 
 +Extrait de [[https://fr.wikipedia.org/wiki/Projet_Gutenberg|Projet Gutenberg]] sur Wikipedia. 
 + 
 +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'auteur soit parce que ces derniers sont expirés. Le projet fut lancé par Michael Hart en 1971 et nommé en hommage à l'imprimeur allemand du XVe siècle Johannes Gutenberg. 
 +  
 +Ce site n'autorise pas les robots, toutes les oeuvres a été téléchargées sur [[http://www.bouquineux.com/index.php?ebooks=36&Hugo&page=1|bouquineux.com]] au format epub. 
 + 
 +Conversion de *.epub vers *.txt avec ebook-convert, puis regroupement de tous les textes dans un seul fichier, en séparant chaque œuvre par '\n\n<|endoftext|>\n\n' 
 + 
 +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'apprentissage: par exemple si il y a beaucoup de saut de ligne, le texte généré aura aussi plein de saut de ligne. 
 + 
 +====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'apprentissage a été coupé pour faire 112 Mo. 
 +  * 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'occupation mémoire = 27 Go au moment de l'encodage du texte 
 + 
 +Efficacité au bout de 144 heures: 
 +{{ :media_10:loss.png?800 |}} 
 + 
 +=====Fables de La Fontaine avec la config de bouquineux===== 
 +==== Avec la configuration de bouquineux et vocab=40000 ==== 
 +{{ :media_10:loss_fables.png?600 |}} 
 +Remarque: Les Fables ont environ 13000 tokens, le vocab devrait se limiter à 14000 !\\ 
 +Testing pas mal mais quand même bourré d'erreur ! 
 + 
 +==== A partir du model tf_gpt2="124M" et vocab = 5000==== 
 +  * 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="124M" et vocab = 50275===== 
 +<WRAP center round tip 60%> 
 +C'est le meilleur générateur de texte, avec un apprentissage de 16 heures ! 
 +</WRAP> 
 +<WRAP center round tip 60%> 
 +tf_gpt2="124M" à une taille de 50275, il faut conserver cette valeur ! 
 +</WRAP> 
 +====Affinage du model existant tf_gpt2="124M"==== 
 +  * [[https://openai.com/blog/gpt-2-1-5b-release/|openai.com/blog/: GPT-2: 1.5B Release]] 
 + 
 +La ligne: 
 +  ai = aitextgen(tf_gpt2="124M"
 +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'apprentissage==== 
 +Pendant le trainning, les test de generate() retourne de l'anglais découpé en petit bout ! 
 +{{ :media_10:training_2020-07-22_20-41-03.png?direct&600 |}} 
 + 
 +====Courbe de loss==== 
 +J'aimerais bien savoir à quoi ça correspond, j'ai peur que ce soit un simple calcul pas du tout représentatif! 
 +{{ :media_10:loss_small_50257.png?direct&600 |}} 
 + 
 +====Testing==== 
 +{{ :media_10:test_fables_small.png?direct&1000 |}} 
 +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, mais c'est quasi de l'astrologie. 
 + 
 +====Développement à suivre==== 
 +Construire sur le gros model de 1.5 Go ! 
 + 
 +====Les sources sur GitHub==== 
 +  * **[[https://github.com/sergeLabo/fables_gpt2_small|fables_gpt2_small]]** 
 + 
 + 
 + 
 +{{tag> ia python sb tal }}
aitextgen.txt · Dernière modification : 2022/02/08 15:59 de serge