L'objectif de ce dépôt est de fournir une implémentation simple des modèles GPT qui peuvent être utilisés pour les applications de production. Le code prend actuellement en charge les cas d'utilisation suivants:
N'hésitez pas à alimenter ce dépôt et à l'utiliser comme modèle pour développer vos propres applications GPT.
Nous voulons éventuellement inclure le réglage fin basé sur RL de Chatgpt. En général, cela ne change pas le modèle de connaissances sous-jacent, mais rend l'interaction avec le modèle plus humain.
La configuration du code est assez minime et peut être facilement reproduite dans les environnements VM locaux ou cloud. *
conda create -n python38 python=3.8
conda activate python38
conda install --file requirements.txt
* À l'avenir, nous essaierons de fournir une version docker de cette configuration.
Nous fournissons un exemple de code qui télécharge et prépare le jeu de données Tiny-Shakespeare pour la formation et le réglage fin. Utilisez ce code comme modèle pour créer du prétraitement des données pour vos propres données.
python src/data_io/fetch_shakespeare.py
Formation d'un très petit modèle GPT à partir de zéro sur l'ensemble de données Tiny-Shakespeare créé à l'étape précédente. Le modèle résultant ne sera pas très généralisable car il est plutôt petit et formé sur un très petit ensemble de données, mais il peut générer des citations de type Shakespeare.
Modifiez le fichier de configuration et afin de former un modèle à partir de zéro sur vos propres données. À ce stade, vous pouvez techniquement évoluer vers de très grandes tailles de modèle en fonction de la taille et des ressources de vos données. *
python src/training/train_main.py --config_file config/train_shakespeare_small.yml
* Pour cette étape, vous aurez probablement besoin d'un ou de plusieurs GPU.
Affliger le modèle GPT2 open source sur vos propres données. Il est possible d'utiliser n'importe quel modèle de type GPT open source (GPT2-Medium, GPT2-XL, etc.). Il s'agit de l'option la plus courante car elle nécessite moins de données et de ressources (il est possible de l'exécuter même sur un CPU) et est bien plus rapide que la formation à partir de zéro.
python src/training/train_main.py --config_file config/finetune_shakespeare.yml
Échantillonnez un certain nombre de sorties d'un modèle formé avec une invite d'entrée. Cela peut être utilisé pour l'inférence par lots.
python src/inference/sample_main.py --config_file config/sample_shakespeare.yml
Un serveur Lightweigth qui sert un modèle formé dans une API REST.
uvicorn src.inference.service_main:app --reload --reload-include config/sample_gpt2.yml
Une fois le serveur en cours d'exécution, vous pouvez interroger le point de terminaison avec une invite (en tant que demande de poste). Pour plus de détails sur les détails des requêtes, jetez un œil au script de test suivant.
Une fois votre serveur en cours d'exécution, vous pouvez tester le point de terminaison à l'aide du script suivant.
python src/inference/test_query.py
Ce dépôt a été déployé avec une application de production à l'esprit et comprend des tests d'unité et d'intégration.
* Tesing n'est pas un guichet automatique étendu, mais nous essaierons d'augmenter la couverture à l'avenir.
Des tests unitaires ont été inclus pour couvrir la fonctionnalité principale. Vous pouvez exécuter la suite complète des tests unitaires avec la commande suivante:
pytest test/unit/
En plus des tests unitaires, nous avons inclus des tests d'intégration pour les flux de travail de formation, de réglage fin et d'échantillonnage.
pytest test/integration/
* Les tests d'intégration nécessitent actuellement des données pour fonctionner (voir ci-dessus).
Il est généralement conseillé d'activer les crochets pré-engagés lorsque vous travaillez avec le repo. Effectue actuellement des vérifications de formatage de base et exécute la suite de tests unitaires (mais pas les tests d'intégration).
conda install -c conda-forge pre-commit
pre-commit install
La mise en œuvre du GPT dans ce dépôt est inspirée par le repo nanogpt d'Andrej Karpathy. Notre objectif était de réimplémenter, de la transucturer et de l'étendre avec des modules qui facilitent la création de différents types d'applications de production en plus.