Das vorliegende Repo enthält den Code, der dem Blog-Beitrag beiliegt? Wie man mit Transfer Learning eine hochmoderne Konversations-KI aufbaut.
Bei diesem Code handelt es sich um eine saubere und kommentierte Codebasis mit Trainings- und Testskripten, die zum Trainieren eines Dialogagenten verwendet werden können, indem Transfer Learning aus einem OpenAI-GPT- und GPT-2-Transformer-Sprachmodell genutzt wird.
Diese Codebasis kann verwendet werden, um die Ergebnisse der Teilnahme von HuggingFace am NeurIPS 2018-Dialogwettbewerb ConvAI2 zu reproduzieren, der in Bezug auf automatische Metriken auf dem neuesten Stand war. Die mehr als 3.000 Zeilen Wettbewerbscode wurden in etwa 250 Zeilen Trainingscode mit verteilten und FP16-Optionen destilliert, um das aktuelle Repository zu bilden.
Dieses Modell kann in etwa einer Stunde auf einer 8-V100-Cloud-Instanz trainiert werden (kostet derzeit etwa 25 US-Dollar) und es wird auch ein vorab trainiertes Modell zur Verfügung gestellt.
Um die Trainings- und Inferenzskripte zu installieren und zu verwenden, klonen Sie bitte das Repo und installieren Sie die Anforderungen:
git clone https://github.com/huggingface/transfer-learning-conv-ai
cd transfer-learning-conv-ai
pip install -r requirements.txt
python -m spacy download en
Für die Installation mit Docker erstellen Sie bitte das eigenständige Image:
docker build -t convai .
Hinweis: Stellen Sie sicher, dass Ihr Docker-Setup genügend Speicher für die Erstellung des Containers zuweist. Das Erstellen mit dem Standardwert von 1,75 GB schlägt aufgrund des großen Pytorch-Rads fehl.
Anschließend können Sie das Bild eingeben
ip-192-168-22-157:transfer-learning-conv-ai loretoparisi$ docker run --rm -it convai bash
root@91e241bb823e:/ # ls
Dockerfile README.md boot dev home lib media models proc root sbin sys train.py utils.py
LICENCE bin convai_evaluation.py etc interact.py lib64 mnt opt requirements.txt run srv tmp usr var
Anschließend können Sie das Skript interact.py
für das vorab trainierte Modell ausführen:
python3 interact.py --model models/
Wir stellen hier ein vorab trainiertes und fein abgestimmtes Modell auf unserem S3 zur Verfügung. Der einfachste Weg, dieses Modell herunterzuladen und zu verwenden, besteht darin, einfach das Skript interact.py
auszuführen, um mit dem Modell zu kommunizieren. Ohne Angabe von Gründen lädt dieses Skript unser Modell automatisch herunter und speichert es zwischen.
Das Trainingsskript kann in Einzel-GPU- oder Multi-GPU-Einstellungen verwendet werden:
python ./train.py # Single GPU training
python -m torch.distributed.launch --nproc_per_node=8 ./train.py # Training on 8 GPUs
Das Trainingsskript akzeptiert mehrere Argumente, um das Training zu optimieren:
Argument | Typ | Standardwert | Beschreibung |
---|---|---|---|
dataset_path | str | "" | Pfad oder URL des Datensatzes. Wenn leer, Download von S3. |
dataset_cache | str | './dataset_cache.bin' | Pfad oder URL des Datensatzcaches |
Modell | str | "openai-gpt" | Pfad, URL oder Kurzname des Modells |
Anzahl_Kandidaten | int | 2 | Anzahl der Kandidaten für die Ausbildung |
max_history | int | 2 | Anzahl früherer Austausche, die im Verlauf gespeichert werden sollen |
train_batch_size | int | 4 | Chargengröße für das Training |
valid_batch_size | int | 4 | Batchgröße für die Validierung |
gradient_accumulation_steps | int | 8 | Akkumulieren Sie Steigungen auf mehreren Stufen |
lr | float | 6.25e-5 | Lernrate |
lm_coef | float | 1.0 | LM-Verlustkoeffizient |
mc_coef | float | 1.0 | Multiple-Choice-Verlustkoeffizient |
max_norm | float | 1.0 | Clipping-Gradientennorm |
n_Epochen | int | 3 | Anzahl der Trainingsepochen |
persönlichkeitspermutationen | int | 1 | Anzahl der Permutationen von Persönlichkeitssätzen |
Gerät | str | "cuda" if torch.cuda.is_available() else "cpu" | Gerät (Cuda oder CPU) |
fp16 | str | "" | Für fp16-Training auf O0, O1, O2 oder O3 einstellen (siehe Apex-Dokumentation) |
local_rank | int | -1 | Lokaler Rang für verteiltes Training (-1: nicht verteilt) |
So reproduzieren Sie unsere Ergebnisse auf einem Server mit 8 V100-GPUs (passen Sie die Anzahl der Knoten und die Stapelgrößen an Ihre Konfiguration an):
python -m torch.distributed.launch --nproc_per_node=8 ./train.py --gradient_accumulation_steps=4 --lm_coef=2.0 --max_history=2 --n_epochs=1 --num_candidates=4 --personality_permutations=2 --train_batch_size=2 --valid_batch_size=2
Dieses Modell sollte unter Verwendung des convai2-Bewertungsskripts (siehe unten) einen Hits@1 über 79, eine Perplexität von 20,5 und einen F1 von 16,5 ergeben.
Diese Zahlen sind etwas niedriger als die Zahl, die wir im ConvAI2-Wettbewerb erhalten haben. Folgendes können Sie optimieren, um die gleichen Ergebnisse zu erzielen:
Das Trainingsskript speichert alle Experimente und Prüfpunkte in einem Unterordner, der mit dem Zeitstempel des Experiments im Ordner ./runs
des Repository-Basisordners benannt ist.
Sie können dann das interaktive Skript verwenden, um mit dem Modell zu interagieren, indem Sie einfach auf diesen Ordner zeigen.
Hier ist ein Beispiel einer Befehlszeile zum Ausführen des interaktiven Skripts:
python ./interact.py --model_checkpoint ./data/Apr17_13-31-38_thunder/ # run the interactive script with a training checkpoint
python ./interact.py # run the interactive script with the finetuned model on our S3
Das fein abgestimmte Modell ergibt FINAL Hits@1: 0,715
Das interaktive Skript akzeptiert einige Argumente, um den Dekodierungsalgorithmus zu optimieren:
Argument | Typ | Standardwert | Beschreibung |
---|---|---|---|
dataset_path | str | "" | Pfad oder URL des Datensatzes. Wenn leer, Download von S3. |
dataset_cache | str | './dataset_cache.bin' | Pfad oder URL des Datensatzcaches |
Modell | str | "openai-gpt" | Pfad, URL oder Kurzname des Modells |
max_history | int | 2 | Anzahl früherer Äußerungen, die im Verlauf gespeichert werden sollen |
Gerät | str | cuda wenn torch.cuda.is_available() sonst cpu | Gerät (Cuda oder CPU) |
no_sample | Aktion store_true | Legen Sie fest, dass Greedy-Dekodierung anstelle von Sampling verwendet wird | |
max_length | int | 20 | Maximale Länge der Ausgabeäußerungen |
min_länge | int | 1 | Mindestlänge der Ausgabeäußerungen |
Samen | int | 42 | Samen |
Temperatur | int | 0.7 | Probenahme der Softmax-Temperatur |
top_k | int | 0 | Filtern Sie Top-K-Token vor dem Sampling ( <=0 : keine Filterung) |
top_p | float | 0.9 | Kernfilterung (top-p) vor der Probenahme ( <=0.0 : keine Filterung) |
Um die Evaluierungsskripte der ConvAI2-Challenge auszuführen, müssen Sie ParlAI
zunächst wie folgt im Repo-Basisordner installieren:
git clone https://github.com/facebookresearch/ParlAI.git
cd ParlAI
python setup.py develop
Anschließend können Sie das Evaluierungsskript im ParlAI
Basisordner ausführen:
cd ParlAI
python ../convai_evaluation.py --eval_type hits@1 # to download and evaluate our fine-tuned model on hits@1 metric
python ../convai_evaluation.py --eval_type hits@1 --model_checkpoint ./data/Apr17_13-31-38_thunder/ # to evaluate a training checkpoint on hits@1 metric
Das Bewertungsskript akzeptiert einige Argumente, um die Bewertungsmetrik auszuwählen und den Decodierungsalgorithmus zu optimieren:
Argument | Typ | Standardwert | Beschreibung |
---|---|---|---|
eval_type | str | "hits@1" | Bewerten Sie das Modell anhand hits@1 , ppl oder f1 -Metrik im ConvAI2-Validierungsdatensatz |
Modell | str | "openai-gpt" | Pfad, URL oder Kurzname des Modells |
max_history | int | 2 | Anzahl früherer Äußerungen, die im Verlauf gespeichert werden sollen |
Gerät | str | cuda wenn torch.cuda.is_available() sonst cpu | Gerät (Cuda oder CPU) |
no_sample | Aktion store_true | Legen Sie fest, dass Greedy-Dekodierung anstelle von Sampling verwendet wird | |
max_length | int | 20 | Maximale Länge der Ausgabeäußerungen |
min_länge | int | 1 | Mindestlänge der Ausgabeäußerungen |
Samen | int | 42 | Samen |
Temperatur | int | 0.7 | Probenahme der Softmax-Temperatur |
top_k | int | 0 | Filtern Sie Top-K-Token vor dem Sampling ( <=0 : keine Filterung) |
top_p | float | 0.9 | Kernfilterung (top-p) vor der Probenahme ( <=0.0 : keine Filterung) |
siehe example_entry.py
und den Kommentar oben.
Wenn Sie diesen Code in Ihrer Forschung verwenden, können Sie unser NeurIPS CAI-Workshop-Papier zitieren:
@article{DBLP:journals/corr/abs-1901-08149,
author = {Thomas Wolf and
Victor Sanh and
Julien Chaumond and
Clement Delangue},
title = {TransferTransfo: {A} Transfer Learning Approach for Neural Network
Based Conversational Agents},
journal = {CoRR},
volume = {abs/1901.08149},
year = {2019},
url = {http://arxiv.org/abs/1901.08149},
archivePrefix = {arXiv},
eprint = {1901.08149},
timestamp = {Sat, 02 Feb 2019 16:56:00 +0100},
biburl = {https://dblp.org/rec/bib/journals/corr/abs-1901-08149},
bibsource = {dblp computer science bibliography, https://dblp.org}
}