!!! Вы можете запустить этот блокнот локально (если у вас есть все зависимости и графический процессор) или в Google Colab.
Если вы будете работать локально, убедитесь, что соблюдены следующие требования к программному обеспечению:
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
Набор данных SQuAD2.0 объединяет 100 000 вопросов из SQuAD1.1 с более чем 50 000 вопросов, на которые нет ответа, написанных состязательно краудворкерами, чтобы выглядеть похожими на вопросы, на которые можно ответить.
Вот пример формата набора данных для ответов на вопросы отряда:
Каждый title
имеет один или несколько paragraph
, каждый из которых состоит из context
и question-answer entries (qas)
.
Каждая запись вопроса-ответа имеет question
и глобально уникальный id
Логический флаг is_impossible
, который показывает, можно ли ответить на вопрос или нет: если на вопрос можно ответить, одна запись answer
содержит текстовый диапазон и индекс его начального символа в контексте. Если на вопрос нет ответа, предоставляется пустой список answers
.
!!! Для задачи контроля качества набор инструментов NVIDIA принимает данные в формате SQuAD JSON. Если у вас есть данные в любом другом формате, обязательно преобразуйте их в формат SQuAD, как показано ниже.
{
"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" : [
]
}
]
}
]
}
]
}
По сути, это всего лишь одна команда для предварительной обработки, обучения, точной настройки, оценки, вывода и экспорта данных! Все конфигурации выполняются через файлы спецификаций YAML. Уже доступны примеры файлов спецификаций, которые вы можете использовать напрямую или в качестве справочной информации для создания своих собственных. С помощью этих файлов спецификаций вы можете настроить множество параметров, таких как модель, набор данных, гиперпараметры, оптимизатор и т. д.
Для обучения модели контроля качества в формате NVIDIA мы используем следующие команды:
# 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 )
Более подробная информация об этих аргументах представлена в файле Question_Answering.ipynb.
!!! Файлы оценки (для проверки и тестирования) имеют указанный выше формат, за исключением того, что они могут содержать более одного ответа на один и тот же вопрос. !!!Файл вывода имеет указанный выше формат, за исключением того, что он не требует answers
и ключевых слов 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
В этом исследовании он используется из вопроса-ответа-обучения-final.ipynb. Дополнительную информацию можно найти здесь.