!!! Vous pouvez exécuter ce notebook soit localement (si vous disposez de toutes les dépendances et d'un GPU), soit sur Google Colab.
Veuillez vous assurer de la configuration logicielle suivante si vous travaillez en local :
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
L'ensemble de données SQuAD2.0 combine les 100 000 questions de SQuAD1.1 avec plus de 50 000 questions sans réponse rédigées de manière contradictoire par des travailleurs participatifs pour ressembler à celles auxquelles il est possible de répondre.
Voici un exemple de format pour un ensemble de données de questions-réponses d'équipe :
Chaque title
comporte une ou plusieurs entrées paragraph
, chacune composée d'entrées context
et question-answer entries (qas)
.
Chaque entrée question-réponse a une question
et un id
globalement unique
L'indicateur booléen is_impossible
, qui indique si une question peut être répondue ou non : si la question peut être répondue, une entrée answer
contient l'étendue du texte et son index de caractère de départ dans le contexte. Si la question ne peut pas répondre, une liste answers
vide est fournie.
!!! Pour la tâche QA, le kit d'outils NVIDIA accepte les données au format SQuAD JSON. Si vous avez vos données dans un autre format, assurez-vous de les convertir au format SQuAD comme ci-dessous.
{
"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" : [
]
}
]
}
]
}
]
}
Il s'agit essentiellement d'une seule commande chacune pour exécuter le prétraitement, la formation, le réglage fin, l'évaluation, l'inférence et l'exportation des données ! Toutes les configurations s'effectuent via des fichiers de spécifications YAML. Il existe déjà des exemples de fichiers de spécifications que vous pouvez utiliser directement ou comme référence pour créer les vôtres. Grâce à ces fichiers de spécifications, vous pouvez régler de nombreux boutons tels que le modèle, l'ensemble de données, les hyperparamètres, l'optimiseur, etc.
Pour entraîner un modèle QA au format NVIDIA, nous utilisons les commandes suivantes :
# 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 )
Plus de détails sur ces arguments sont présents dans le Question_Answering.ipynb
!!! Les fichiers d'évaluation (pour la validation et les tests) suivent le format ci-dessus, sauf qu'ils peuvent fournir plus d'une réponse à la même question. !!!Le fichier d'inférence suit le format ci-dessus sauf qu'il ne nécessite pas les answers
et les mots-clés is_impossible
.
# 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
Dans cette étude, il est utilisé à partir de question-answering-training-final.ipynb. Vous pouvez trouver plus d’informations ici.