Dies ist der Code, um die Experimente aus dem EMNLP 2021-Papier "die Skalierungsleistung für die parametereffiziente Eingabeaufforderung" (Lester et al., 2021) zu reproduzieren.
Diese Modelle basieren auf T5X, das das Modell- und Trainingsschleife definiert. Flaxformer, das die tatsächliche Modellberechnung definiert; Flachs, das die Modellschichten auf niedriger Ebene definiert; und Jax, das die tatsächliche Ausführung liefert. Details unserer Implementierung finden Sie hier.
gs://{bucket-name}/path/to/item/in/bucket in diesen Bucket lesen und schreiben. Hier speichern wir zwischengespeicherte Datensätze sowie Modellkontrollpunkte und -ergebnisse. Zur einfachen Referenz sind einige der häufigsten Cloud -Befehle für die Interaktion mit den TPU -VMs # 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 Wenn Sie auf einen Fehler stoßen, bei dem PIP früher und Earliler-Versionen von Abhängigkeiten (z. B. TensorFlow) installieren versucht, bis es versucht, Version 0.0.0 zu installieren, und dann fehlschlägt das Hinzufügen --use-deprecated=legacy-resolver an den Befehl Install. Dieser Fehler bezieht sich auf die erforderlichen Versionen zwischen Abhängigkeiten und das Verhalten wird häufig als Rückverfolgung bezeichnet. Wenn Sie das Flag verwenden, ist es möglich, dass inkompatible Versionen von Bibliotheken installiert werden und Sie nach Warnungen vor Fehlanpassungen in der Ausgabe des Installationsbefehls achten sollten.
HINWEIS: Wenn Sie vorhaben, die Interna mit einem schnellen Tuning zu hacken und eine bearbeitbare Installation zu benötigen (Änderungen im geklonten Code werden beim Ausführen von Training verwendet), führen Sie pip mit dem -e -Flag aus, und Sie müssen möglicherweise die pyproject.toml -Datei löschen, wenn Sie während der Installation Fehler erhalten.
Um die Tests auszuführen, installieren Sie das Paket mit der Option [test] (Python3 python3 -m pytest python3 -m pip install .[test] ...
Training Eine Eingabeaufforderung ähnelt der Feinabstimmung eines Modells mit T5X. Der Hauptunterschied besteht darin, dass wir über einen eigenen Satz von Konfigurationsdateien eingehend zur Verfügung stehen.
Wir bieten ein Demo-Skript ( prompt_tuning/scripts/sst2-demo.sh ) an, das alle erforderlichen Teile für das Training einer Eingabeaufforderung enthält. Sie können dies als Ausgangspunkt verwenden oder MODEL_DIR und TFDS_DATA_DIR -Umgebungsvariablen mit Pfaden zu Ihrem Google Cloud -Speicher -Bucket festlegen, um dieses Skript direkt auszuführen.
./prompt-tuning/prompt_tuning/scripts/sst2-demo.shUm bei der Iterationsgeschwindigkeit zu helfen, geben wir in der Regel viel mehr Optionen in der Befehlszeile an, anstatt die gesamte Konfiguration in eine einzelne GIN -Datei zu bündeln. Ein paar Notizmöglichkeiten:
--gin_search_paths :: Eine von Kommas getrennte Liste von Verzeichnissen, die als Pfadpräfixe für Gin-Dateien verwendet werden. Wir können prompt_tuning.scripts.find_module ${module} verwenden, um den Installationsposition von Bibliotheken zu finden, die Konfigurationen mit ihnen bündeln.--gin_file :: Die zu geladene GIN-Datei. Wir verwenden in der Regel Pfade Relativ, beginnend mit der Bibliothek, mit der sie installiert sind, dh prompt_tuning/configs/models/t5_1_1_base_prompt.gin über models/t5_1_1_base_prompt.gin um Verwirrung zu vermeiden. Die Verwendung des Flag -Mehrfachzeit kann verwendet werden, um mehrere GIN -Dateien anzugeben, die zusammengeführt werden. Alle in mehreren Dateien festgelegten Konfigurationsoptionen verwenden den Wert aus der letzten Datei in der Liste.--gin.{PARAM}={VALUE} :: Dieses allgemeine Überschreibungsflag setzt PARAM auf VALUE . Dies kann verwendet werden, um Konfigurationsoptionen einfach festzulegen, ohne dass sie die tatsächlichen Befehlszeilenargumente sein müssen. Zum Beispiel. --gin.utils.SaveCheckpointConfig.keep=20 speichert die letzten 20 Checkpoints.Wenn Modelle größer werden, passen XL und XXL beispielsweise nicht auf den 8 -tpus, der mit einer einzelnen TPU -VM ausgestattet ist. In diesen Fällen benötigen wir ein Stück TPU -POD (weitere Informationen zur TPU -Architektur und verfügbare Konfigurationen finden Sie hier). Der Hauptunterschied zwischen dem Training einer Eingabeaufforderung auf einem einzelnen TPU-VM und einer Pod-Slice besteht darin, dass wir jetzt über mehrere TPU-VMs verfügen und die gleiche SPMD-JAX pro VM ausführen. Diese Seite enthält weitere Informationen zu Multi-Host-JAX-Programmen. Dieser Leitfaden gibt eine kurze Einführung in das Ausführen von JAX -Programmen in einem TPU -Pod -Slice, aber wir werden hier die Hauptpunkte erreichen.
$ gcloud alpha compute tpus tpu-vm create ${TPU_NAME}
--zone ${ZONE}
--accelerator-type v3-32
--version v2-alpha--command= zu ausgeführt zu werden, und dass er auf allen unseren VMs (als Arbeiter genannt) mit --worker=all ausgeführt werden sollte. $ 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 Schreiben Sie das Skript, um Ihre Eingabeaufforderung zu trainieren. Wir haben ein Demo-Skript ( /prompt_tuning/scripts/sst2-xxl-demo.sh ) eingeschlossen. Die Züge sind eine Eingabeaufforderung zum Lösen des SST2-Datensatzes mit T5 1.1 LM100K xxl. Sie können dies als Ausgangspunkt verwenden oder einfach die Pfade in Ihrem Google Cloud -Speicher -Bucket ausfüllen, um anzugeben, wo Sie Ihre Ergebnisse speichern möchten ( MODEL_DIR ) und wo Sie TFDS -Daten ( TFDS_DATA_DIR ) zwischenspeichern oder als Umgebungsvariablen einstellen können.
Kopieren Sie Ihr Schulungsskript für jeden Mitarbeiter. Wenn Sie scp zum ersten Mal ausgeführt haben, können Sie einen Fehler erhalten, den Befehl ssh-add /.../.ssh/google_compute_engine aus der Fehlermeldung ausführen und erneut versuchen.
$ 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 " Wenn einer der Arbeitnehmer während des Trainings einen Fehler hat, werden Sie Prozesse, die die TPUs für die anderen Arbeiter verwenden, übernommen. Dies verhindern Sie, dass Sie Ihren Job neu starten, bis diese beendet werden und die TPU freigeben. Der folgende Befehl sollte alle diese Prozesse beenden. Sie können sehen, wie die Seite der kill Command Man von dem Arbeiter zurückkommt, der den ersten Fehler hatte.
$ gcloud alpha compute tpus tpu-vm ssh ${TPU_NAME}
--zone ${ZONE}
--worker=all
--command= " sudo lsof -t /dev/accel0 | xargs kill -9 "Befolgen Sie die T5X -Anweisungen für benutzerdefinierte Komponenten, um Eingabeaufforderungen mit benutzerdefinierten Teilen wie Ihrem eigenen Datensatz zu trainieren
gin_search_paths Sie Ihren Code als Pip -installierbares Python -Paket verpacken, werden Sie nicht an ein einzelnes Verzeichnis gebunden, und Sie können python3 -m prompt_tuning.scripts.find_module {your_module} verwenden. Hinweis: Wenn Sie vorhaben, Gin -Konfigurationen in einem installierbaren Paket zu bündeln, stellen Sie sicher, dass die Verzeichnisse, die die Konfigurationsdateien enthalten, über eine __init__.py verfügen, da Gin die Dateien in einem Python -Paket benötigen.
Wenn Teile Ihrer benutzerdefinierten Komponenten GIN konfigurierbar sind, müssen sie explizit in Ihre GIN -Dateien importiert werden. Wenn sie nach der Analyse der GIN -Dateien importiert werden, verursachen sie einen Fehler. Wenn keine Ihrer Abhängigkeiten GIN -Konfigurierungen enthält, können Sie vermeiden --gin.MIXTURE_OR_TASK_MODULE="'path.to.your.module' eine GIN -Datei durch Bestehen zu schreiben.
Unser vorgeschlagener Weg, eine Eingabeaufforderung zu erreichen, besteht darin, den ursprünglichen Checkpoint zu laden, der zum Initialisieren des Modells und der Eingabeaufforderung von einer Datei verwendet wird. Wie in diesem Abschnitt über das teilweise Laden von T5X erläutert, wird das Laden einiger Modellparameter unterstützt, während andere von Grund auf neu initialisiert werden. Wir verwenden dies in Verbindung mit dem von dem from_array forderungsinitializer, um die gefrorenen Parameter aus dem ursprünglichen Checkpoint und der Eingabedatei eine Datei neu zu laden. Die configs/runs/prompt_eval.gin legt diese Konfiguration für Sie ein. Sie müssen nur eine PROMPT_FILE liefern. Wenn Ihr Modell mit einer der prompts/ Konfigurationsdateien trainiert wurde, können Sie diese aus den Argumenten zum Bewertungsskript entfernen.
Das enthaltene Skript sst2-demo-eval.sh zeigt ein Beispiel für die Bewertung auf diese Weise. Alles, was benötigt wird, ist nur das Setzen EVAL_DIR und TFDS_DATA_DIR -Umgebungsvariablen auf den Pfaden, um die Ausgabe der Bewertung und die TensorFlow -Datensätze respektiv zu speichern.
In T5X geht davon aus, dass Ihr Datensatz Beschriftungen enthält und die endgültigen Ergebnisse aus den metrischen Funktionen Ihres Datensatzes ausgibt. Das Inferenzskript erfordert keine Beschriftungen und gibt stattdessen die Vorhersage Ihres Modells aus. Wir fügen eine analoge prompt_infer.gin -Datei mit dem Inferenzskript hinzu.
Wenn Sie mit dem T5X -Checkpoint, der aus einem schnitten Tuning -Trainingslauf erzeugt wird, inferenzieren oder bewertet werden möchten, können Sie die (eval|infer).gin -Konfiguration von T5X direkt verwenden. Sie müssen jedoch die utils.RestoreChekcpointConfig aktualisieren. Sie sollten path zum neuen Checkpoint festlegen, assignment_map=() und fallback_to_scratch=False .
Alle Modell, Schulung, Bewertung, Speichern, Wiederherstellung usw. Die Konfiguration erfolgt über GIN. Eine allgemeine Einführung in Gin und diesen Primer finden Sie im Gin-Config-Repository
Wir folgen dem T5X -Konfigurationslayout:
runs/ :: enthält Konfigurationen für das tatsächliche Modelltraining. Hier gehen Dinge wie Datensatz- und Bewertungskonfiguration.architectures/ :: Enthält Konfigurationen für die Funktionsweise des Modells. Hier werden Dinge wie Encoder-Decoder vs Decoder nur und eingebettetes Teilen konfiguriert.models/ :: enthält Konfigurationen, die modellspezifische Parameter wie die Anzahl der Ebenen oder die Größe der Einbettungstabelle festlegen. Es konfiguriert auch Dinge wie die verwendete T5X -Modellverpackung.models/decoding/ :: enthält einfach zu verwendende Konfigurationen, um herauszuzutauschen, wie das Modell während der Inferenz Text erzeugt, enthält Konfigurationen für Strahlsuche und Kernprobenahme.models/sizes/ :: enthält die verschiedenen Einstellungen zum Erstellen von Modellen verschiedener Größen. Diese werden mit den Standardversionen kombiniert, um eine Größe zu erstellen, z. B. t5_1_1_prompt.gin + sizes/large.gin groß. Einige gemeinsame Kombinationen, die bereits als Gin -Dateien mit dem Recht verfügbar sind, umfassen ( t5_1_1_large_prompt.gin für unser Beispiel oben). HINWEIS: Diese Größendateien müssen nach der Hauptmodelldatei erfolgen.prompts/ :: Unser zusätzliches Verzeichnis enthält Konfigurationen, mit denen die PROMPT Gin -Variable festgelegt wird, und ermöglicht das einfache Wechsel der Eingabeaufforderungsinitialisierung, auf der die Eingabeaufforderung als ein --gin_file -Argument hinzugefügt wird (es muss nach der models/ Gin -Datei erfolgen). Bei der Angabe --gin_file Argumente in der Befehlszeile ist die Bestellung von Bedeutung. Die allgemeine Reihenfolge, in der die GIN -Dateien angegeben werden müssen, lautet:
models/*.ginprompts/*.ginmodels/sizes/*.gin*models/decoding/*.ginruns/*.gin T5X hat einige erforderliche Felder wie MIXTURE_OR_TASK_NAME oder TASK_FEATURE_LENGTHS . Wir fügen zwei weitere hinzu:
PROMPT_LENGTH :: Die Länge der Eingabeaufforderung, die wir verwenden, wird an verschiedenen Stellen verwendet. Wir benötigen sie als Gin -Makro, auf das wir an mehreren Stellen verweisen und sicherstellen können, dass die Werte synchron sind.PROMPT :: Dies ist die Konfiguration des tatsächlichen Eingabeaufforderungsmoduls, das in den Flachformer PromptX -Unterklassen verwendet wird. HINWEIS: Das schnelle Tuning unterstützt derzeit keine Packung von Beispielen. Dies bedeutet, dass unsere maximale Ziellänge nur lang genug sein muss, um das Ziel für jedes Beispiel anzupassen. Dies bedeutet, dass unser targets in der Zuordnung TASK_FEATURE_LENGTHS viel kürzer sein kann, beispielsweise um 4 für viele Aufgaben von Sekundenkleber (Wang et al., 2019), verglichen mit 62, was der P5X -Standard ist.
Es gibt mehrere Optionen für die Initialisierung des Eingabeaufforderungsparameters. Wir unterstützen die verschiedenen Methoden in Abschnitt 3.2 in unserem Artikel sowie die Initialisierung aus einer Datei. Letzteres ermöglicht es einem, Dinge wie Zug auf Boolq zu tun, beginnend mit einer Eingabeaufforderung, die auf MNLI gelernt wurde.
Alle Initialisierer folgen der Flachs -Initialisierer -API einer parametrisierten Funktion, die einen Verschluss gegenüber der Initialisierungsfunktion zurückgibt. Die tatsächliche Initialisierungsfunktion hat immer die Signatur von
def initializer ( rng : Array , shape : Sequence [ int ]) -> Array :
... Wir stellen jedes Initialisierungsschema als GIN -Konfigurationsdatei im Verzeichnis configs/prompts . Sie können verwendet werden, indem die GIN -Datei in die --gin_file=path/to/configs/prompts/scheme.gin einbezogen wird. Diese Datei muss nach der Hauptmodelldatei erfolgen, andernfalls überschreibt die von Ihnen ausgewählte Standardmethode (zufällige Uniform) die, die Sie ausgewählt haben. Bei einigen dieser Initialisierungsmethoden müssen Sie zusätzliche GIN -Werte einstellen, obwohl ein Überschreibungsflag von in einem Ihrer GIN -Dateien.
Zufällige Uniform
Eine Standard -Zufallsinitialisierung ähnlich dem, was Menschen zum Einbetten der Initialisierung verwendet haben. Dies ist die Standardeinstellung und es ist keine GIN -Datei erforderlich. Die Skala der zufälligen Werte kann durch prompt_init/linen.initializers.uniform.scale=N forderdieren.
Stichprob Vokab
Beispiel A Token -Einbettung, um für jede Eingabeaufforderungsposition als Initialisierung mit dem Initialisierer from_sample_of_embeddings zu verwenden. Sie können die Abtastung auf die ersten n -Einbettungen mit der prompt_init/prompts.from_samples_of_embeddings.population_size -Parameter einschränken.
Dies kann mit --gin_file=prompt_tuning/configs/prompts/from_sampled_vocab.gin verwendet werden. Diese Methode verwendet die aus dem anfängliche Modellcheckpunkt extrahierte Einbettungstabelle. Sie können auch Ihre eigene Einbettungsdatei mit --gin_file=prompt_tuning/configs/prompts/from_sampled_vocab_numpy.gin bereitstellen. Diese Methode erfordert, dass Sie einen Wert für die EMBEDDING_FILE der Einbettung der Einbettung des Modells angeben. Dies kann aus einem Modell -Checkpoint unter Verwendung von prompt_tuning.scripts.extract_variable extrahiert werden.
Klassenetikett
Wir unterstützen die Initialisierung der schnellen Zeitschritte mit der Einbettung von Klassenbezeichnungen (auch bekannt als Verbalizer ) über den from_embedded_list Initializer. Benutzer stellen eine Liste von Wörtern (Klassenbezeichnungen) zur Verfügung. Jedes Wörter wird durch ein bereitgestelltes Vokabelle tokenisiert; eingebettet mit einem bereitgestellten Vokababisch; aggregiert, wenn es nötig ist, über Untertoken hinweg aggregiert; und verwendet, um einen schnellen Zeitschritt zu initialisieren. Wenn die bereitgestellten Token die vollständige Eingabeaufforderung nicht abdecken, werden die fehlenden Token mit dem bereitgestellten Rückfall -Initialisierer initialisiert.
Wir können das Papier übereinstimmen, in dem nicht gefüllte schnelle Token durch Probenahme aus der Einbettungstabelle gefüllt werden, indem wir diese Initialisierung mit dem oben genannten verfassen. Es kann mit --gin_file=prompt_tuning/configs/prompts/from_class_labels.gin verwendet werden. Dies erfordert das Einstellen CLASS_LABELS , eine Liste der Wörter, die Sie als Eingabeaufforderung initialisieren möchten. Sie können auch Ihre eigene Einbettungsdatei (die wie oben identisch sind) mit --gin_file=prompt_tuning/configs/prompts/from_class_labels_numpy.gin angeben. Dies erfordert zusätzlich das Einstellen EMBEDDING_FILE .
Aus String
Wir unterstützen auch die Initialisierung einer Eingabeaufforderung mit der Einbettung einer Zeichenfolge, die häufig verwendet wird, um von einer diskreten Aufforderung oder einer Aufgabenbeschreibung zu beginnen. Dadurch wird der Initialisierer from_embedded_string verwendet. Die Saite wird durch das bereitgestellte Vokabular tokenisiert. Jedes Token wird in der bereitgestellten Einbettungstabelle nachgeschlagen, und die resultierende eingebettete Darstellung der Zeichenfolge wird als Einlaufinitialisierung verwendet. Wenn die bereitgestellten Token die vollständige Eingabeaufforderung nicht abdecken, werden die fehlenden Token mit dem bereitgestellten Rückfall -Initialisierer initialisiert.
HINWEIS: Der Wortschatz konvertiert nur die Zeichenfolge in eine Abfolge von IDs. Sie müssen sicherstellen, dass die Zeichenfolge mit dem Ergebnis einer Textformatierung (Räume um Interpunktion usw.) übereinstimmt, die Ihre Seqio -Aufgabe ausführt.
Aus der Datei
Sie können auch eine Eingabeaufforderung aus einer Datei mit dem from_array initializer laden, um die Übertragung über Aufgaben zu ermöglichen. Dies geschieht mit --gin_file=prompt_tuning/configs/prompts/from_file.gin . Dadurch muss PROMPT_FILE mit einem Pfad zur Numpy -Datei eingestellt werden, wobei die Eingabeaufforderung geladen werden muss. Numpy -Versionen der Eingabeaufforderung werden standardmäßig beim Training emittiert, aber die Eingabeaufforderung kann auch mit dem oben genannten Skript extrahiert werden.
Wir haben T5X -native Checkpoints der T5 1.1 -Checkpoints mit 100K -Schritten der Anpassung des Sprachmodells veröffentlicht.
Diese werden aus den Checkpoints für öffentliche Mesh Tensorflow umgewandelt.
Wir haben vorbereitete Eingaben für eine Vielzahl von Aufgaben veröffentlicht und planen, sie im Laufe der Zeit hinzuzufügen.
Eingabeaufforderungen finden Sie im Verzeichnis pretrained_prompts . Von da an fordert jede Unterabrechnung auf, nach dem Modell, für das sie ausgebildet wurden. Der einfachste Weg, um auf diese Eingaben zu verweisen, die mit der Bibliothek gebündelt sind, ist:
--PROMPT_FILE= ` python3 -m prompt_tuning.scripts.find_module prompt_tuning ` /pretrained_prompts/{MODEL_SIZE}/{PROMPT}.npy Aufgrund der inhärenten Zufälligkeit der parallele Berechnung gibt es einige Einstellungen, die zwischen Training und Bewertung übereinstimmen müssen, um genau die gleichen Zahlen zu erhalten. Jedes Modell-Subdirektorium verfügt über eine README.md Das gibt an, welche Einstellungen aussehen sollen. Die wichtigsten Einstellungen sind die Stapelgröße, die TPU -Topologie und die Parallelitätspartitionierung der Modell. Die Tabellen enthalten die Punktzahlen, die Sie erwarten sollten, ob Sie diese Eingabeaufforderungen in t5x.eval verwenden
Dies ist eine Sammlung zusätzlicher Ressourcen zum schnellen Einstellen.
Wenn Sie diese Arbeit als Ausgangspunkt verwenden, zitieren Sie bitte
@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 " ,
}Dies ist kein offiziell unterstütztes Google -Produkt.