Il s'agit du code pour reproduire les expériences du papier EMNLP 2021 "La puissance de l'échelle pour un réglage rapide économe en paramètres" (Lester et al., 2021).
Ces modèles sont construits sur T5X, qui définit le modèle et la boucle d'entraînement; Flaxformer, qui définit le calcul du modèle réel; Le lin, qui définit les couches de modèle de faible niveau; et Jax, qui fournit l'exécution réelle. Les détails de notre implémentation peuvent être trouvés ici.
gs://{bucket-name}/path/to/item/in/bucket . C'est là que nous stockons des ensembles de données mis en cache ainsi que des points de contrôle et des résultats de modèle. Pour plus de référence, certaines des commandes de nuages les plus courantes pour interagir avec les machines virtuelles TPU sont # Create a Cloud TPU VM
$ gcloud alpha compute tpus tpu-vm create ${TPU_NAME}
--zone ${ZONE}
--accelerator-type v3-8
--version v2-alpha
# SSH into a Cloud TPU VM
$ gcloud alpha compute tpus tpu-vm ssh ${TPU_NAME} --zone ${ZONE}
# Delete a Cloud TPU VM
$ gcloud alpha compute tpus tpu-vm delete ${TPU_NAME} --zone ${ZONE}git clone --branch=main https://github.com/google-research/prompt-tuning
cd prompt-tuningpython3 -m pip install .[tpu] -f https://storage.googleapis.com/jax-releases/libtpu_releases.html Si vous rencontrez une erreur où PIP essaie d'installer des versions plus tôt et Earliler des dépendances (TensorFlow par exemple) jusqu'à ce qu'il essaie d'installer la version 0.0.0 , puis échoue, essayez d'ajouter --use-deprecated=legacy-resolver à la commande d'installation. Cette erreur est liée aux versions requises entre les dépendances et le comportement est souvent appelé retour en arrière. Si vous utilisez le drapeau, il est possible que des versions incompatibles de bibliothèques soient installées et vous devez rechercher des avertissements sur les décalages dans la sortie de la commande d'installation.
Remarque: Si vous prévoyez de pirater les internes du réglage rapide et que vous avez besoin d'une installation modifiable (donc les modifications dans le code cloné sont utilisées lorsque vous exécutez la formation) Exécutez pip avec l'indicateur -e et vous devrez peut-être supprimer le fichier pyproject.toml si vous obtenez des erreurs pendant l'installation.
Pour exécuter les tests, installez le package avec l'option [test] (Python3 python3 -m pytest python3 -m pip install .[test] ...
La formation d'une invite est similaire à un réglage fin d'un modèle avec T5X; La principale différence est que nous avons notre propre ensemble de fichiers de configuration de réglage rapide à utiliser.
Nous fournissons un script de démonstration ( prompt_tuning/scripts/sst2-demo.sh ) qui a toutes les pièces requises pour former une invite. Vous pouvez l'utiliser comme point de départ, ou définir des variables d'environnement MODEL_DIR et TFDS_DATA_DIR avec des chemins de chemin vers votre godet de stockage Google Cloud pour exécuter ce script directement.
./prompt-tuning/prompt_tuning/scripts/sst2-demo.shPour aider à la vitesse d'itération, nous avons tendance à spécifier beaucoup plus d'options la ligne de commande plutôt que de regrouper toute la configuration en un seul fichier de gin. Quelques options à noter:
--gin_search_paths :: Une liste de répertoires séparés par des virgules à utiliser comme préfixes de chemin pour les fichiers gin. Nous pouvons utiliser prompt_tuning.scripts.find_module ${module} pour trouver l'emplacement d'installation des bibliothèques qui regroupent les configurations avec eux.--gin_file :: le fichier gin à charger. Nous avons tendance à utiliser les chemins relatifs en commençant par la bibliothèque avec laquelle ils sont installés, c'est-à-dire prompt_tuning/configs/models/t5_1_1_base_prompt.gin sur models/t5_1_1_base_prompt.gin pour éviter toute confusion. L'utilisation de l'indicateur plusieurs fois peut être utilisée pour spécifier plusieurs fichiers de gin qui seront fusionnés. Toutes les options de configuration définies dans plusieurs fichiers utiliseront la valeur du dernier fichier de la liste.--gin.{PARAM}={VALUE} :: Cet indicateur de dépôt général définira PARAM sur VALUE . Cela peut être utilisé pour définir facilement les options de configuration sans les obliger à être des arguments de ligne de commande réels. Par exemple. --gin.utils.SaveCheckpointConfig.keep=20 Enregistrera les 20 derniers points de contrôle.À mesure que les modèles deviennent plus grands, XL et XXL par exemple, ils ne s'adaptent pas aux 8 TPU qui sont livrés avec une seule machine virtuelle TPU. Dans ces cas, nous aurons besoin d'une tranche de POD TPU (plus d'informations sur l'architecture TPU et les configurations disponibles peuvent être trouvées ici). La principale différence entre la formation d'une invite sur une seule machine virtuelle TPU et sur une tranche de pod est que nous avons maintenant plusieurs machines virtuelles TPU et que nous exécuterons le même SPMD JAX à chaque machine virtuelle, cette page a plus d'informations sur les programmes JAX multi-hôte. Ce guide donne une introduction rapide à l'exécution de programmes JAX sur une tranche de pod TPU, mais nous allons frapper les points principaux ici.
$ gcloud alpha compute tpus tpu-vm create ${TPU_NAME}
--zone ${ZONE}
--accelerator-type v3-32
--version v2-alpha--command= Flag et qu'il devrait être exécuté sur toutes nos machines virtuelles (appelées travailleurs) avec --worker=all . $ gcloud alpha compute tpus tpu-vm ssh ${TPU_NAME}
--zone ${ZONE}
--worker=all
--command= " git clone --branch=main https://github.com/google-research/prompt-tuning && cd prompt-tuning && "
python3 -m pip install . -f https://storage.googleapis.com/jax-releases/libtpu_releases.html Écrivez le script pour former votre invite. Nous avons inclus un script de démonstration ( /prompt_tuning/scripts/sst2-xxl-demo.sh ) Les formations une invite pour résoudre l'ensemble de données SST2 à l'aide de T5 1.1 LM100K XXL. Vous pouvez l'utiliser comme point de départ ou simplement compléter les chemins de main vers votre godet de stockage Google Cloud pour spécifier où vous souhaitez enregistrer vos résultats ( MODEL_DIR ) et où mettre en cache les données TFDS ( TFDS_DATA_DIR ), ou les définir comme variables d'environnement.
Copiez votre script de formation à chaque travailleur. Si c'est votre première exécution scp , vous pouvez obtenir une erreur, exécutez la commande ssh-add /.../.ssh/google_compute_engine à partir du message d'erreur et réessayez.
$ gcloud alpha compute tpus tpu-vm scp sst2-xxl-demo.sh ${TPU_NAME} :
--zone= ${ZONE}
--worker=all$ gcloud alpha compute tpus tpu-vm ssh ${TPU_NAME}
--zone ${ZONE}
--worker=all
--command= " ./sst2-xxl-demo.sh " Si l'un des travailleurs a une erreur pendant la formation, vous vous retrouverez avec des processus qui utilisent les TPU sur les autres travailleurs. Cela vous empêchera de redémarrer votre travail jusqu'à ce que ceux-ci traitent un licenciement et libéreront le TPU. La commande suivante doit mettre fin à tous ces processus. Vous pouvez voir la page kill Command Man revenir du travailleur qui a eu l'erreur initiale.
$ gcloud alpha compute tpus tpu-vm ssh ${TPU_NAME}
--zone ${ZONE}
--worker=all
--command= " sudo lsof -t /dev/accel0 | xargs kill -9 "Pour former des invites à l'aide de pièces personnalisées, comme votre propre ensemble de données, suivez les instructions T5X sur les composants personnalisés
Si vous emballez votre code en tant que package Python PIP-installable, vous ne serez pas lié à un seul répertoire, et vous pouvez utiliser python3 -m prompt_tuning.scripts.find_module {your_module} pour aider à définir le gin_search_paths afin que les configurations de gin soient regroupées dans votre bibliothèque. Remarque: Si vous prévoyez de regrouper les configurations de gin dans un package installable, assurez-vous que les répertoires qui contiennent les fichiers de configuration ont un __init__.py car gin nécessite que les fichiers soient dans un package Python.
Si les parties de vos composants personnalisés sont configurables au gin, elles doivent être explicitement importées dans vos fichiers gin; S'ils finissent par être importés après l'analyse des fichiers de gin, ils provoqueront une erreur. Si aucune de vos dépendances ne contient des configurables en gin, vous pouvez éviter d'écrire un fichier de gin en passant --gin.MIXTURE_OR_TASK_MODULE="'path.to.your.module' . Cela importera automatiquement votre module et est pratique lorsque vous faites est d'échanger des ensembles de données.
Notre moyen suggéré de faire l'inférence avec une invite est de charger le point de contrôle d'origine utilisé pour initialiser le modèle et l'invite d'un fichier. Comme expliqué dans cette section, le chargement partiel T5X prend en charge le chargement de certains paramètres du modèle tout en initialisant d'autres à partir de zéro. Nous l'utilisons conjointement avec l'initialisateur invite from_array pour recharger les paramètres gelés du point de contrôle d'origine et du fichier invite un fichier. Le configs/runs/prompt_eval.gin met en place cette configuration pour vous; Il vous suffit de fournir un PROMPT_FILE . Si votre modèle a été formé avec l'un des fichiers prompts/ configuration, vous pouvez les supprimer des arguments au script d'évaluation.
Le script sst2-demo-eval.sh inclus montre un exemple de l'évaluation de cette façon. Tout ce qui est nécessaire est de définir les variables de l'environnement EVAL_DIR et TFDS_DATA_DIR sur les chemins pour stocker respectivement la sortie de l'évaluation et les ensembles de données TensorFlow.
Dans T5X, le script d'évaluation suppose que votre ensemble de données a des étiquettes et publie les résultats finaux des fonctions métriques de votre ensemble de données. Le script d'inférence ne nécessite pas d'étiquettes et émet plutôt la prédiction de votre modèle. Nous incluons un fichier analogue prompt_infer.gin à utiliser avec le script d'inférence.
Si vous souhaitez effectuer une inférence ou une évaluation avec le point de contrôle T5X produit à partir d'une exécution de formation invite, vous pouvez utiliser directement la configuration (eval|infer).gin . Vous devrez cependant mettre à jour les utils.RestoreChekcpointConfig . Vous devez définir path du nouveau point de contrôle, assignment_map=() et fallback_to_scratch=False .
Tous les modèles, formation, évaluation, économie, restauration, etc. La configuration se fait via le gin. Voir le référentiel Gin-Config pour une introduction générale au gin et à cette amorce
Nous suivons la disposition de la configuration T5X:
runs/ :: Contient des configurations pour la formation réelle du modèle. C'est là que les choses comme l'ensemble de données et la configuration d'évaluation se déroulent.architectures/ :: contient des configurations pour le fonctionnement du modèle. C'est là que des choses comme l'encodeur-décodeur vs décodeur uniquement et le partage d'intégration sont configurées.models/ :: contient des configurations qui définissent des paramètres spécifiques au modèle comme le nombre de couches ou la taille de la table d'intégration. Il configure également des choses comme l'emballage du modèle T5x utilisé.models/decoding/ :: Contient des configurations faciles à utiliser pour échanger comment le modèle génère du texte pendant l'inférence, comprend des configurations pour la recherche de faisceau et l'échantillonnage du noyau.models/sizes/ :: Contient les différents paramètres pour créer des modèles de différentes tailles, ceux-ci sont combinés avec les versions par défaut pour créer une version de taille, par exemple, t5_1_1_prompt.gin + sizes/large.gin crée un grand modèle T5 1.1. Quelques combinaisons courantes déjà disponibles sous forme de fichiers gin avec la droite incluent ( t5_1_1_large_prompt.gin pour notre exemple ci-dessus). Remarque: Ces fichiers de taille doivent venir après le fichier du modèle principal.prompts/ :: Notre répertoire supplémentaire contient des configurations qui définissent la variable PROMPT du gin, permettant une commutation facile de l'initialisation de l'invite basée sur le fichier d'invite comme un argument --gin_file (il doit venir après le fichier de models/ gin), Lors de la spécification des arguments --gin_file dans la ligne de commande, l'ordre compte. L'ordre général dans lequel les fichiers de gin doivent être spécifiés est:
models/*.ginprompts/*.ginmodels/sizes/*.gin*models/decoding/*.ginruns/*.gin T5X a certains champs requis comme MIXTURE_OR_TASK_NAME ou TASK_FEATURE_LENGTHS . Nous en ajoutons deux autres:
PROMPT_LENGTH :: La longueur de l'invite que nous utilisons, ceci est utilisé à quelques endroits différents pour que nous l'exiquons en tant que macro de gin que nous pouvons référencer à plusieurs endroits et s'assurer que les valeurs sont synchronisées.PROMPT :: Il s'agit de la configuration du module d'invite réel qui sera utilisé dans les sous-classes de FlaxFormer PromptX . Remarque: le réglage rapide ne prend actuellement pas en charge l'emballage d'exemples. Cela signifie que notre longueur cible maximale n'a besoin que suffisamment de temps pour s'adapter à la cible pour chaque exemple. Cela signifie que notre clé targets dans le mappage TASK_FEATURE_LENGTHS peut être beaucoup plus courte, par exemple autour de 4 pour de nombreuses tâches de superglue (Wang et al., 2019), par rapport à 62, c'est ce que la valeur par défaut P5X.
Il existe plusieurs options pour l'initialisation du paramètre invite. Nous prenons en charge les différentes méthodes de la section 3.2 Notre article, ainsi que l'initialisation d'un fichier. Ce dernier permet de faire des choses comme le train sur Boolq à partir d'une invite apprise sur MNLI.
Tous les initialiseurs suivent l'API initialiseur de lin d'être une fonction paramétrée qui renvoie une fermeture sur la fonction d'initialisation. La fonction d'initialisation réelle a toujours la signature de
def initializer ( rng : Array , shape : Sequence [ int ]) -> Array :
... Nous fournissons chaque schéma d'initialisation en tant que fichier de configuration du gin dans le répertoire configs/prompts . Ils peuvent être utilisés en incluant le fichier gin avec le --gin_file=path/to/configs/prompts/scheme.gin . Ce fichier doit venir après le fichier du modèle principal, sinon la méthode par défaut (uniforme aléatoire) écrasera celle que vous avez sélectionnée. Certaines de ces méthodes d'initialisation vous obligeront à définir des valeurs de gin supplémentaires, soit un drapeau de remplacement de l'un de vos fichiers de gin.
Uniforme aléatoire
Une initialisation standard et aléatoire similaire à ce que les gens ont utilisé pour intégrer l'initialisation. Il s'agit de la valeur par défaut et aucun fichier de gin n'est requis. L'échelle des valeurs aléatoires peut être ajustée en dépassement de prompt_init/linen.initializers.uniform.scale=N .
Vocable échantillonné
Échantillonnez une incorporation de jeton à utiliser comme initialisation pour chaque position rapide avec l'initialiseur from_sample_of_embeddings . Vous pouvez limiter l'échantillonnage aux n tout premiers intégres avec le paramètre prompt_init/prompts.from_samples_of_embeddings.population_size .
Cela peut être utilisé avec --gin_file=prompt_tuning/configs/prompts/from_sampled_vocab.gin . Cette méthode utilise la table d'intégration extraite du point de contrôle du modèle initial. Vous pouvez également fournir votre propre fichier d'intégration avec --gin_file=prompt_tuning/configs/prompts/from_sampled_vocab_numpy.gin . Cette méthode nécessite que vous fournissiez une valeur pour EMBEDDING_FILE qui est un tableau Numpy de la table d'intégration du modèle. Ceci peut être extrait d'un point de contrôle de modèle à l'aide de prompt_tuning.scripts.extract_variable.
Étiquette de classe
Nous prenons en charge l'initialisation des horaires invites avec l'incorporation des étiquettes de classe (aka verbaliseurs ) via l'initialiseur from_embedded_list . Les utilisateurs fournissent une liste de mots (étiquettes de classe) à utiliser. Chaque mots est tokenisé par un vocabulaire fourni; intégré à une table de vocabulaire fournie; agrégé, si nécessaire, entre sous-tokens; et utilisé pour initialiser un pas de temps rapide. Si les jetons fournis ne couvrent pas la longueur de l'invite complète, les jetons manquants sont initialisés à l'aide de l'initialiseur de recule de secours fourni.
Nous pouvons faire correspondre le papier, où les jetons rapides non remplis sont remplis par échantillonnage à partir de la table d'incorporation, en composant cette initialisation avec celle ci-dessus. Il peut être utilisé avec --gin_file=prompt_tuning/configs/prompts/from_class_labels.gin . Cela nécessite de définir CLASS_LABELS , qui est une liste des mots que vous souhaitez intégrer comme initialisation rapide. Vous pouvez également fournir votre propre fichier d'intégration (qui est le même que ci-dessus) avec --gin_file=prompt_tuning/configs/prompts/from_class_labels_numpy.gin . Cela nécessite en outre la définition EMBEDDING_FILE .
De la chaîne
Nous prenons également en charge l'initialisation d'une invite avec l'intégration d'une chaîne, souvent utilisée pour commencer à partir d'une invite discrète ou d'une description de la tâche. Cela utilise l'initialiseur from_embedded_string . La chaîne est tokenisée par le vocabulaire fourni, chaque jeton est recherché dans la table d'incorporation fournie, et la représentation intégrée de la chaîne résultante est utilisée comme initialisation rapide. Si les jetons fournis ne couvrent pas la longueur de l'invite complète, les jetons manquants sont initialisés à l'aide de l'initialiseur de recule de secours fourni.
Remarque: Le vocabulaire convertit simplement la chaîne en une séquence d'ID, vous devrez vous assurer que la chaîne correspond au résultat de tout formatage de texte (espaces autour de la ponctuation, etc.) que le fait votre tâche Seqio.
À partir du fichier
Vous pouvez également charger une invite à partir d'un fichier avec l'initialiseur from_array pour activer le transfert entre les tâches. Cela se fait avec --gin_file=prompt_tuning/configs/prompts/from_file.gin . Cela nécessite de définir PROMPT_FILE avec un chemin d'accès au fichier Numpy avec l'invite à charger. Les versions Numpy de l'invite sont émises par défaut lors de la formation, mais l'invite peut également être extraite avec le script mentionné ci-dessus.
Nous avons publié des points de contrôle natifs T5X des points de contrôle T5 1.1 qui ont eu 100 000 étapes d'adaptation du modèle de langue.
Ceux-ci sont convertis des points de contrôle de TensorFlow à maillage public.
Nous avons publié des invites pré-entraînées sur une variété de tâches et prévoyons d'y ajouter au fil du temps.
Des invites peuvent être trouvées dans le répertoire pretrained_prompts . À partir de là, chaque groupe de sous-résectoral invite par le modèle pour lequel ils ont été formés. La façon la plus simple de référencer ces invites qui sont regroupées avec la bibliothèque est:
--PROMPT_FILE= ` python3 -m prompt_tuning.scripts.find_module prompt_tuning ` /pretrained_prompts/{MODEL_SIZE}/{PROMPT}.npy En raison de l'aléatoire inhérent du calcul parallèle, il existe quelques paramètres qui doivent correspondre entre la formation et l'évaluation pour obtenir exactement les mêmes nombres. Chaque sous-répertoire modèle a un README.md spécifie ce que ces paramètres devraient être. Les paramètres les plus importants à correspondre sont la taille du lot, la topologie TPU et le partitionnement du parallélisme du modèle. Les tables incluent les scores que vous devez vous attendre à voir si vous utilisez ces invites dans t5x.eval
Il s'agit d'une collection de ressources supplémentaires sur le réglage rapide.
Si vous utilisez ce travail comme un point de saut, veuillez citer
@inproceedings { lester-etal-2021-power ,
title = " The Power of Scale for Parameter-Efficient Prompt Tuning " ,
author = " Lester, Brian and
Al-Rfou, Rami and
Constant, Noah " ,
booktitle = " Proceedings of the 2021 Conference on Empirical Methods in Natural Language Processing " ,
month = nov,
year = " 2021 " ,
address = " Online and Punta Cana, Dominican Republic " ,
publisher = " Association for Computational Linguistics " ,
url = " https://aclanthology.org/2021.emnlp-main.243 " ,
doi = " 10.18653/v1/2021.emnlp-main.243 " ,
pages = " 3045--3059 " ,
}Ce n'est pas un produit Google officiellement pris en charge.