Ce référentiel contient du code pour reproduire nos recherches décrites dans "Cramming: Formation d'un modèle de langue sur un seul GPU en une journée". Nous expérimentons le modèle de langue en pré-traçant un modèle de type Bert avec un calcul limité, en vous demandant "à quel point cela peut-il être mauvais"?
Vous pouvez trouver notre article ici: https://arxiv.org/abs/2212.14034, et le résumé ci-dessous:
Les tendances récentes de la modélisation du langage se sont concentrées sur l'augmentation des performances grâce à l'échelle et ont abouti à un environnement où les modèles de langue de formation sont hors de portée pour la plupart des chercheurs et des praticiens. Alors que la plupart de la communauté demande comment repousser les limites du calcul extrême, nous posons la question inverse:
Jusqu'où pouvons-nous obtenir avec un seul GPU en une seule journée?
Nous étudions les performances en aval réalisables avec un modèle de langue basé sur un transformateur formé à partir de zéro avec une modélisation de langage masquée pendant une seule journée sur un seul GPU grand public . En plus de réanalyser presque tous les composants du pipeline de pré-formation pour ce scénario et de fournir un pipeline modifié avec des performances proches de Bert, nous étudions pourquoi la mise à l'échelle est difficile et quelles modifications améliorent réellement les performances dans ce scénario. Nous fournissons des preuves que même dans ce contexte contraint, les performances suivent étroitement les lois de mise à l'échelle observées dans des contextes à grande entreprise. Grâce à la lentille des lois sur l'échelle, nous classons une gamme d'améliorations récentes à la formation et à l'architecture et discutons de leur mérite et de leur applicabilité pratique (ou de leur absence) pour le cadre de calcul limité.
Vous avez besoin de Pytorch 2.0 pour exécuter le nouveau code. Si vous souhaitez rester sur Pytorch 1. *, vous pouvez vérifier l'étiquette Last1.13release . Le nouveau modèle, formé avec la nouvelle base de code est de 1 à 2% mieux sur la colle avec le même budget. Le point de contrôle se trouve sur https://huggingface.co/jonasgeiping/crammed-bert. L'ancien point de contrôle est maintenant https://huggingface.co/jonasgeiping/crammed-bert-legacy.
En outre, le prétraitement des données s'est amélioré, vous pouvez désormais diffuser des données directement à partir de HuggingFace, à partir du téléchargement à https://huggingface.co/datasets/jonasgeiping/the_pile_wordpiex32768_2efdb9d060d1ae95faf952ec1a50f020.
Paramètre:
Exécutez pip install . pour installer toutes les dépendances.
torch (au moins version 2.1)transformers , tokenizers , datasets , evaluatehydra-corepsutil , pynvml , safetensorseinops pip install . Pour installer tous les packages et scripts.curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh , puis git clone https://github.com/google-research/deduplicate-text-datasets/tree/dev-v1 puis exécutez cargo install --target-dir ../cramming/dedupPour vérifier une installation minimale, vous pouvez courir
python pretrain.py name=test arch=hf-bert-base train=bert-base data=sanity-check-2 dryrun=True impl.microbatch_size=2
Cette commande pré-processus un petit ensemble de données de vérification de la raison et exécute une seule étape d'entraînement.
Utilisez le script pretrain.py pour prétraiter avec un calcul limité. Ce référentiel utilise HYDRA (https://hydra.cc/docs/intro/), de sorte que tous les champs de cramming/config peuvent être modifiés sur la ligne de commande. Par exemple, le budget peut être modifié en fournissant budget=48 comme argument supplémentaire (pour fonctionner pendant 48 heures), ou le taux d'apprentissage peut être modifié via train.optim.lr=1e-4 . Consultez le dossier de configuration pour voir tous les arguments.
Votre première étape devrait être de vérifier les packages installés. Pour ce faire, vous pouvez exécuter python pretrain.py dryrun=True , qui exécutera la vérification de la santé mentale par défaut pour une seule itération. De là, vous pouvez activer des fonctionnalités supplémentaires. Par exemple, modifiez l'architecture, par exemple arch=bert-original et la configuration de formation train=bert-original . Pour vraiment former un modèle linguistique, vous devez passer de l'ensemble de données de vérification de la santé mentale à au moins data=pile-readymade . Ensuite, choisissez une configuration de formation améliorée, par exemple train=bert-o4 , et une mise en page améliorée du modèle, par exemple arch=crammed-bert .
Les sources de données à partir de data.sources . Les appels suivants avec la même configuration réutiliseront cette base de données de séquences tokenisées. Par défaut, un nouveau tokenzer sera également construit et enregistré pendant ce processus. Les options de données importantes sont data.max_entries_in_raw_dataset , qui définit la quantité de données brutes qui seront chargées. Par exemple, pour une grande source de données telle que C4, seul un sous-ensemble de données brutes sera téléchargée. Ensuite, max_seq_in_tokenized_dataset Bottlenecks combien de séquences traitées seront stockées dans la base de données. Ce nombre doit être supérieur au nombre de séquences qui devraient être lues dans le budget.
Notes supplémentaires:
data=pile-readymadepython pretrain.py data=... dryrun=True , qui crée à sec la formation, mais exécute le prétraitement complet des données. Les exécutions ultérieures peuvent ensuite réutiliser les données mises en cache.impl.threads . En particulier, le code de déduplication nécessite des quantités substantielles de RAM.bookcorpus-wikipedia uniquement, ce qui se prépare relativement rapidement et seulement à examiner le C4 traité et filtré complet. Pour référence et si vous êtes uniquement intéressé à modifier la formation / l'architecture, vous pouvez trouver des ensembles de données prétraités ici:
Ces sources de données peuvent être diffusées. Pour ce faire, simple définit data=pile-readymade .
Les données prétraitées sont pratiques avec lesquelles travailler, et je pense que les modifications du traitement et du filtrage des données continuent d'être sous-explorées par rapport à la formation et à l'architecture à cause de cela. Il pourrait y avoir plus de gains à avoir avec de meilleures données, qu'avec d'autres ajustements, donc en fin de compte, vous voudrez peut-être envisager de configurer le code et l'environnement pour que le pipeline de traitement des données fonctionne.
Vous pouvez désormais trouver un point de contrôle pour la version finale formée sur the-pile à https://huggingface.co/jonasgeiping/crammed-bert.
Pour évaluer les modèles pré-étendus sur la colle (ou certaines tâches de colle), utilisez eval.py Ce script recherche des modèles enregistrés dans le répertoire de base. Compte tenu du nom d'une exécution précédente, ce script récupérera par défaut le dernier point de contrôle enregistré avec ce nom, puis exécutera des évaluations.
Vous pouvez enregistrer les exécutions vers votre compte de poids et biais. Pour ce faire, modifiez simplement wandb.entity et wandb.project sur la ligne de commande ou sur cramming/config/wandb/default.yaml .
Pour reproduire la recette finale discutée dans le journal, courez
python pretrain.py name=amp_b8192_cb_o4_final arch=crammed-bert train=bert-o4 data=pile-readymade
à prétraiter et
python eval.py eval=GLUE_sane name=amp_b8192_cb_o4_final eval.checkpoint=latest impl.microbatch_size=16 impl.shuffle_in_dataloader=True impl.compile_torch=False
pour évaluer le modèle. La recette appelée "Crammed Bert" dans le document correspond à l'architecture appelée crammed-bert dans la configuration, formée avec la configuration de la formation bert-o4 sur les données the-pile .
Pour des performances optimales, vous devez être sur le dernier Pytorch tous les soirs et définir les variables d'inductance suivantes (qui modifient la configuration torch.compile .
max_autotune_gemm: Truemax_autotune_pointwise: Falsetriton.cudagraphs: Truetriton.cudagraph_trees: False Prestinging: GPU unique, paramètres Bert d'origine:
python pretrain.py name=bert data=bookcorpus-wikipedia arch=bert-original train=bert-original budget=10000000
Paramètres multi-GPU, originaux Bert:
torchrun --nproc_per_node=4 --standalone pretrain.py name=bert4gpu data=bookcorpus-wikipedia arch=bert-original train=bert-original budget=10000000 impl.fullgraph=false impl._inductor_vars.triton.cudagraphs=False
Évaluer un point de contrôle HuggingFace (dans cet exemple sur RTE):
python eval.py eval=GLUE_sane eval/tasks=rte name=bert-finetuning eval.checkpoint=hf://bert-base-uncased impl.shuffle_in_dataloader=True impl.compile_torch=False impl.microbatch_size=16
Évaluez un point de contrôle local (désactiver la compilation, qui attend actuellement des formes fixes):
python eval.py eval=GLUE_sane eval/tasks=rte name=NAME_OF_PRETRAINING_RUN eval.checkpoint=latest impl.shuffle_in_dataloader=True impl.compile_torch=False
Vérification de la santé mentale pour le code distribué sur CPU:
CUDA_VISIBLE_DEVICES= torchrun --nproc_per_node=2 --standalone pretrain.py name=cpu_multi_check dryrun=True data=sanity-check-2 impl.dist_backend=gloo impl.fullgraph=false impl._inductor_vars.triton.cudagraphs=False
Des exemples supplémentaires pour les recettes peuvent être trouvés dans le dossier /scripts .
Les options suivantes sont actuellement rompues / limitées / en cours. Utilisez-les à votre discrétion. Bien sûr, toutes les contributions ici sont très appréciées. Vous pouvez également m'envoyer un message avec plus de questions sur l'un de ces points, si vous voulez les examiner.
Last1.13release . Si vous souhaitez raviver certaines de ces options. N'hésitez pas à ouvrir une demande de traction avec les mises à jour de la nouvelle base de code.S'il vous plaît, n'hésitez pas à nous contacter pour toutes les questions ou à ouvrir un problème sur GitHub.