
Un package Python simple qui enveloppe les scripts de réglage fin et de génération du modèle existant pour le modèle de génération de texte GPT-2 d'OpenAI (en particulier les versions hyperparamètres "Small" 124M et "Medium" 355M). De plus, ce package permet une génération de texte plus facile, générant un fichier pour une conservation facile, permettant aux préfixes de forcer le texte à commencer par une phrase donnée.
Ce package intègre et apporte un minimum de modifications de niveau de bas niveau:
Pour la fintuning, il est fortement recommandé d'utiliser un GPU, bien que vous puissiez générer à l'aide d'un CPU (bien que beaucoup plus lentement). Si vous vous entraînez dans le cloud, l'utilisation d'un ordinateur portable colaboratoire ou d'une machine virtuelle de moteur Google Calcul avec l'image en profondeur TensorFlow est fortement recommandée. (comme le modèle GPT-2 est hébergé sur GCP)
Vous pouvez utiliser GPT-2-Simple pour recycler un modèle en utilisant un GPU gratuitement dans ce cahier de colaboratoire, qui démos également des fonctionnalités supplémentaires du package.
Remarque: le développement sur GPT-2-Simple a été principalement remplacé par Aitextgen, qui a des capacités de génération de texte d'IA similaires avec un temps de formation et une utilisation de ressources plus efficaces. Si vous n'avez pas besoin d'utiliser TensorFlow, je recommande d'utiliser AITEXTGER à la place. Les points de contrôle formés à l'aide de GPT-2-Simple peuvent également être chargés à l'aide d'Aitextgen.
GPT-2-Simple peut être installé via PYPI:
pip3 install gpt-2-simple Vous devrez également installer la version TensorFlow 2.x correspondante (MIN 2.5.1) pour votre système (par exemple tensorflow ou tensorflow-gpu ).
Un exemple pour télécharger le modèle sur le système local, en le faisant en train de le faire sur un ensemble de données. et générer du texte.
AVERTISSEMENT: Le modèle de 124m pré-entraîné, et donc tout modèle à finetume, est de 500 Mo! (Le modèle de 355 m pré-entraîné est de 1,5 Go)
import gpt_2_simple as gpt2
import os
import requests
model_name = "124M"
if not os . path . isdir ( os . path . join ( "models" , model_name )):
print ( f"Downloading { model_name } model..." )
gpt2 . download_gpt2 ( model_name = model_name ) # model is saved into current directory under /models/124M/
file_name = "shakespeare.txt"
if not os . path . isfile ( file_name ):
url = "https://raw.githubusercontent.com/karpathy/char-rnn/master/data/tinyshakespeare/input.txt"
data = requests . get ( url )
with open ( file_name , 'w' ) as f :
f . write ( data . text )
sess = gpt2 . start_tf_sess ()
gpt2 . finetune ( sess ,
file_name ,
model_name = model_name ,
steps = 1000 ) # steps is max number of training steps
gpt2 . generate ( sess ) Les points de contrôle du modèle généré sont par défaut dans /checkpoint/run1 . Si vous souhaitez charger un modèle à partir de ce dossier et générer du texte à partir de celui-ci:
import gpt_2_simple as gpt2
sess = gpt2 . start_tf_sess ()
gpt2 . load_gpt2 ( sess )
gpt2 . generate ( sess ) Comme pour TextGenrnn, vous pouvez générer et enregistrer du texte pour une utilisation ultérieure (par exemple une API ou un bot) en utilisant le paramètre return_as_list .
single_text = gpt2 . generate ( sess , return_as_list = True )[ 0 ]
print ( single_text ) Vous pouvez transmettre un paramètre run_name à finetune et load_gpt2 si vous souhaitez stocker / charger plusieurs modèles dans un dossier checkpoint .
Il existe également une interface de ligne de commande pour la finetuning et la génération avec de fortes défauts pour exécuter simplement sur une machine virtuelle cloud avec GPU. Pour la finetuning (qui téléchargera également le modèle s'il n'est pas présent):
gpt_2_simple finetune shakespeare.txt Et pour la génération, qui génère des textes sur les fichiers dans un dossier gen :
gpt_2_simple generateLa plupart des mêmes paramètres disponibles dans les fonctions sont disponibles sous forme d'arguments CLI, par exemple:
gpt_2_simple generate --temperature 1.0 --nsamples 20 --batch_size 20 --length 50 --prefix " <|startoftext|> " --truncate " <|endoftext|> " --include_prefix False --nfiles 5Voir ci-dessous pour voir ce que font certains arguments de la CLI.
NB: Redémarrez d'abord la session Python si vous souhaitez FineTune sur un autre ensemble de données ou chargez un autre modèle.
La méthode que GPT-2 utilise pour générer du texte est légèrement différente de celles comme d'autres packages comme TextGenrnn (en particulier, générant la séquence de texte intégral uniquement dans le GPU et le décodant plus tard), qui ne peut pas être facilement fixé sans pirater le code de modèle sous-jacent. Par conséquent:
truncate à une fonction generate pour collecter du texte uniquement jusqu'à un jeton d'extrémité spécifié. Vous voudrez peut-être réduire length de manière appropriée.)prefix ciblant les séquences de jeton de début et un truncate ciblant la séquence de jeton d'extrémité. Vous pouvez également définir include_prefix=False pour rejeter le jeton de préfixe lors de la génération (par exemple, si c'est quelque chose de indésirable comme <|startoftext|> )..csv à colonne unique sur finetune() , il analysera automatiquement le CSV dans un format idéal pour la formation avec GPT-2 (y compris la mise en avant <|startoftext|> et le suffixing <|endoftext|> à chaque document texte, donc les astuces truncate ci-dessus sont utiles lors de la production de sortie). Ceci est nécessaire pour gérer correctement les citations et les Newlines dans chaque document texte.batch_size qui est divisible en nsamples , résultant en une génération beaucoup plus rapide. Fonctionne très bien avec un GPU (peut définir batch_size jusqu'à 20 sur K80 de Colaboratory)!batch_size=1 , et environ 88% du GPU V100.overwrite=True à Finetune, qui continuera de la formation et supprimera l'itération précédente du modèle sans créer de copie en double. Cela peut être particulièrement utile pour l'apprentissage du transfert (par exemple, fortement Finetune GPT-2 sur un ensemble de données, puis Finetune sur un autre ensemble de données pour obtenir une "fusion" des deux ensembles de données).gpt2.encode_dataset(file_path) . La sortie est un fichier .npz compressé qui se chargera beaucoup plus rapidement dans le GPU pour la finetuning.gpt2.load_gpt2(sess, model_name='774M') et gpt2.generate(sess, model_name='774M') .Max Woolf (@minimaxir)
Les projets open source de Max sont soutenus par son Patreon. Si vous avez trouvé ce projet utile, toutes les contributions monétaires au Patreon sont appréciées et seront mises à une bonne utilisation créative.
Mit
Ce repo n'a aucune affiliation ni relation avec OpenAI.