!!! Você pode executar este notebook localmente (se tiver todas as dependências e uma GPU) ou no Google Colab.
Certifique-se dos seguintes requisitos de software se você trabalhar localmente:
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
O conjunto de dados SQuAD2.0 combina as 100.000 perguntas do SQuAD1.1 com mais de 50.000 perguntas sem resposta escritas de forma adversa por crowdworkers para parecerem semelhantes às que podem ser respondidas.
Aqui está um exemplo de formato para um conjunto de dados de resposta a perguntas de esquadrão:
Cada title
tem uma ou várias entradas paragraph
, cada uma consistindo nas entradas de context
e question-answer entries (qas)
.
Cada entrada de pergunta-resposta tem uma question
e um id
globalmente exclusivo
O sinalizador booleano is_impossible
, que mostra se uma pergunta pode ser respondida ou não: Se a pergunta for respondível, uma entrada answer
contém a extensão do texto e seu índice de caracteres inicial no contexto. Se a pergunta não puder ser respondida, uma lista de answers
vazia será fornecida.
!!! Para a tarefa de controle de qualidade, o kit de ferramentas NVIDIA aceita dados no formato SQuAD JSON. Se você tiver seus dados em qualquer outro formato, certifique-se de convertê-los para o formato SQuAD conforme abaixo.
{
"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" : [
]
}
]
}
]
}
]
}
É essencialmente apenas um comando para executar pré-processamento de dados, treinamento, ajuste fino, avaliação, inferência e exportação! Todas as configurações acontecem por meio de arquivos de especificação YAML. Já existem arquivos de especificações de amostra disponíveis para você usar diretamente ou como referência para criar o seu próprio. Através desses arquivos de especificações, você pode ajustar vários botões, como modelo, conjunto de dados, hiperparâmetros, otimizador, etc.
Para treinar um modelo de QA no formato NVIDIA, usamos os seguintes comandos:
# 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 )
Mais detalhes sobre esses argumentos estão presentes em Question_Answering.ipynb
!!! Os arquivos de avaliação (para validação e teste) seguem o formato acima, exceto pelo fato de poderem fornecer mais de uma resposta para a mesma pergunta. !!!O arquivo de inferência segue o formato acima, exceto por não exigir as answers
e as palavras-chave 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
Neste estudo, ele é utilizado em question-answering-training-final.ipynb. Você pode encontrar mais informações aqui.