!!! Sie können dieses Notebook entweder lokal (wenn Sie über alle Abhängigkeiten und eine GPU verfügen) oder auf Google Colab ausführen.
Bitte stellen Sie sicher, dass die folgenden Softwareanforderungen erfüllt sind, wenn Sie lokal arbeiten:
python 3.6 .9
docker - ce > 19.03 . 5
docker - API 1.40
nvidia - container - toolkit > 1.3 . 0 - 1
nvidia - container - runtime > 3.4 . 0 - 1
nvidia - docker2 > 2.5 . 0 - 1
nvidia - driver >= 455.23
Der SQuAD2.0-Datensatz kombiniert die 100.000 Fragen in SQuAD1.1 mit über 50.000 unbeantwortbaren Fragen, die von Crowdworkern kontrovers geschrieben wurden, um beantwortbaren Fragen ähnlich zu sein.
Hier ist ein Beispielformat für einen Kader-Fragen-Antwort-Datensatz:
Jeder title
verfügt über einen oder mehrere paragraph
, die jeweils aus den context
und question-answer entries (qas)
bestehen.
Jeder Frage-Antwort-Eintrag hat eine question
und eine global eindeutige id
Das boolesche Flag is_impossible
zeigt an, ob eine Frage beantwortbar ist oder nicht: Wenn die Frage beantwortbar ist, enthält ein answer
den Textbereich und seinen Startzeichenindex im Kontext. Wenn die Frage nicht beantwortbar ist, wird eine leere answers
angezeigt.
!!! Für die QA-Aufgabe akzeptiert das NVIDIA Toolkit Daten im SQuAD JSON-Format. Wenn Sie Ihre Daten in einem anderen Format haben, konvertieren Sie sie unbedingt wie unten beschrieben in das SQuAD-Format.
{
"data" : [
{
"title" : "Super_Bowl_50" ,
"paragraphs" : [
{
"context" : "Super Bowl 50 was an American football game to determine the champion of the National Football League (NFL) for the 2015 season. The American Football Conference (AFC) champion Denver Broncos defeated the National Football Conference (NFC) champion Carolina Panthers 24 u2013 10 to earn their third Super Bowl title. The game was played on February 7, 2016, at Levi's Stadium in the San Francisco Bay Area at Santa Clara, California. As this was the 50th Super Bowl, the league emphasized the " golden anniversary " with various gold-themed initiatives, as well as temporarily suspending the tradition of naming each Super Bowl game with Roman numerals (under which the game would have been known as " Super Bowl L " ), so that the logo could prominently feature the Arabic numerals 50." ,
"qas" : [
{
"question" : "Where did Super Bowl 50 take place?" ,
"is_impossible" : "false" ,
"id" : "56be4db0acb8001400a502ee" ,
"answers" : [
{
"answer_start" : "403" ,
"text" : "Santa Clara, California"
}
]
},
{
"question" : "What was the winning score of the Super Bowl 50?" ,
"is_impossible" : "true" ,
"id" : "56be4db0acb8001400a502ez" ,
"answers" : [
]
}
]
}
]
}
]
}
Es ist im Wesentlichen jeweils nur ein Befehl zum Ausführen der Datenvorverarbeitung, des Trainings, der Feinabstimmung, der Auswertung, der Inferenz und des Exports! Alle Konfigurationen erfolgen über YAML-Spezifikationsdateien. Es stehen bereits Beispiel-Spezifikationsdateien zur Verfügung, die Sie direkt verwenden oder als Referenz für die Erstellung eigener Dateien verwenden können. Mithilfe dieser Spezifikationsdateien können Sie viele Regler wie Modell, Datensatz, Hyperparameter, Optimierer usw. optimieren.
Zum Trainieren eines QA-Modells im NVIDIA-Format verwenden wir die folgenden Befehle:
# set language model and tokenizer to be used
config . model . language_model . pretrained_model_name = "bert-base-uncased"
config . model . tokenizer . tokenizer_name = "bert-base-uncased"
# path where model will be saved
config . model . nemo_path = f" { WORK_DIR } /checkpoints/bert_squad_v2_0.nemo"
trainer = pl . Trainer ( ** config . trainer )
model = BERTQAModel ( config . model , trainer = trainer )
trainer . fit ( model )
trainer . test ( model )
model . save_to ( config . model . nemo_path )
Weitere Einzelheiten zu diesen Argumenten finden Sie in der Datei Question_Answering.ipynb
!!! Die Bewertungsdateien (zur Validierung und zum Testen) folgen dem oben genannten Format, mit der Ausnahme, dass sie mehr als eine Antwort auf dieselbe Frage liefern können. !!!Die Inferenzdatei folgt dem oben genannten Format, außer dass die Schlüsselwörter answers
und is_impossible
nicht erforderlich sind.
# Load saved model
model = BERTQAModel . restore_from ( config . model . nemo_path )
eval_device = [ config . trainer . devices [ 0 ]] if isinstance ( config . trainer . devices , list ) else 1
model . trainer = pl . Trainer (
devices = eval_device ,
accelerator = config . trainer . accelerator ,
precision = 16 ,
logger = False ,
)
config . exp_manager . create_checkpoint_callback = False
exp_dir = exp_manager ( model . trainer , config . exp_manager )
def dump_json ( filepath , data ):
with open ( filepath , "w" ) as f :
json . dump ( data , f )
def create_inference_data_format ( context , question ):
squad_data = { "data" : [{ "title" : "inference" , "paragraphs" : []}], "version" : "v2.1" }
squad_data [ "data" ][ 0 ][ "paragraphs" ]. append (
{
"context" : context ,
"qas" : [
{ "id" : 0 , "question" : question ,}
],
}
)
return squad_data
context = "The Amazon rainforest is a moist broadleaf forest that covers most of the Amazon basin of South America. This basin encompasses 7,000,000 square kilometres (2,700,000 sq mi), of which 5,500,000 square kilometres (2,100,000 sq mi) are covered by the rainforest. The majority of the forest is contained within Brazil, with 60% of the rainforest, followed by Peru with 13%, and Colombia with 10%."
question = "Which country has the most?"
inference_filepath = "inference.json"
inference_data = create_inference_data_format ( context , question )
dump_json ( inference_filepath , inference_data )
predictions = model . inference ( "inference.json" )
question = predictions [ 1 ][ 0 ][ 0 ][ "question" ]
answer = predictions [ 1 ][ 0 ][ 0 ][ "text" ]
probability = predictions [ 1 ][ 0 ][ 0 ][ "probability" ]
print ( f" n > Question: { question } n > Answer: { answer } n Probability: { probability } " )
100 % | ██████████ | 1 / 1 [ 00 : 00 < 00 : 00 , 184.29 it / s ]
100 % | ██████████ | 1 / 1 [ 00 : 00 < 00 : 00 , 8112.77 it / s ]
> Question : Which country has the most ?
> Answer : Brazil
Probability : 0.9688649039578262
In dieser Studie wird es aus questions-answering-training-final.ipynb verwendet. Weitere Informationen finden Sie hier.