AllenNLP 2.0: использование `allennlp прогноз` с MultiTaskDatasetReader приводит к RuntimeError

Я обучил многозадачную модель с помощью allennlp 2.0 и теперь хочу делать прогнозы на новых примерах с помощью команды allennlp predict.

Проблема / ошибка: я использую следующую команду: allennlp predict results/model.tar.gz new_instances.jsonl --include-package mtl_sd --predictor mtlsd_predictor --use-dataset-reader --dataset-reader-choice validation

Это дает мне следующую ошибку:

Traceback (most recent call last):
File ".../mtl_sd_venv/bin/allennlp", line 10, in <module>
sys.exit(run())
File ".../mtl_sd_venv/lib/python3.7/site-packages/allennlp/__main__.py", line 34, in run
main(prog="allennlp")
File ".../mtl_sd_venv/lib/python3.7/site-packages/allennlp/commands/__init__.py", line 119, in main
args.func(args)
File ".../mtl_sd_venv/lib/python3.7/site-packages/allennlp/commands/predict.py", line 220, in _predict
manager.run()
File ".../mtl_sd_venv/lib/python3.7/site-packages/allennlp/commands/predict.py", line 186, in run
for batch in lazy_groups_of(self._get_instance_data(), self._batch_size):
File ".../mtl_sd_venv/lib/python3.7/site-packages/allennlp/common/util.py", line 139, in lazy_groups_of
s = list(islice(iterator, group_size))
File ".../mtl_sd_venv/lib/python3.7/site-packages/allennlp/commands/predict.py", line 180, in _get_instance_data
yield from self._dataset_reader.read(self._input_file)
File ".../mtl_sd_venv/lib/python3.7/site-packages/allennlp/data/dataset_readers/multitask.py", line 31, in read
raise RuntimeError("This class is not designed to be called like this")
RuntimeError: This class is not designed to be called like this

Насколько я понимаю, вот что происходит:

Этот потому что read()-метод MultiTaskDatasetReader не должен вызываться сам по себе. read()-метод должен вызываться только для определенных DatasetReaders в MultiTaskDatasetReader.readers.

Метод read () объекта MultiTaskDatasetReader вызывается потому, что в конфигурации jsonnet я указал DatasetsReaders следующим образом:

"dataset_reader": {
    "type": "multitask",
    "readers": {
        "SemEval2016": {
            "type": "SemEval2016",
            "max_sequence_length": 509,
            "token_indexers": {
                "bert": {
                    "type": "pretrained_transformer",
                    "model_name": "bert-base-cased"
                }
            },
            "tokenizer": {
                "type": "pretrained_transformer",
                "model_name": "bert-base-cased"
            }
        }, ...
    }
}

Обычно type в dataset_reader указывает класс средства чтения набора данных, который должен быть создан для прогнозирования. Но в этом случае type просто указывает MultiTaskDatasetReader, в котором не реализован read()-метод и который содержит несколько DatasetReader.

Насколько я понимаю, при использовании allennlp predict мне нужно каким-то образом указать, какой из нескольких DatasetReaders следует использовать.

Вопрос:

Как я могу указать, какой конкретный DatasetReader (из нескольких DatasetReader в MultiTaskDatasetReader.readers) должен использоваться при выполнении allennlp predict? Или в более общем плане: как заставить allennlp predict работать с MultiTaskDatasetReader?

Дополнительный код для полноты: Предиктор:

@Predictor.register('mtlsd_predictor')
class MTLSDPredictor(Predictor):

    def predict(self, sentence: str) -> JsonDict:
        return self.predict_json({'sentence': sentence})

    @overrides
    def _json_to_instance(self, json_dict: JsonDict) -> Instance:
        target = json_dict['text1']
        claim = json_dict['text2']
        return self._dataset_reader.text_to_instance(target, claim)

person sinaj    schedule 11.02.2021    source источник
comment
Это кажется серьезной проблемой. Я поместил проблему GitHub на github.com/allenai/allennlp/issues/4973 и рассмотрим это.   -  person Dirk Groeneveld    schedule 12.02.2021
comment
Спасибо, оценил.   -  person sinaj    schedule 13.02.2021
comment
Я поместил здесь исправление: github.com/allenai/allennlp/pull/4991 I Я не уверен, что рассмотрел все варианты использования. Можете ли вы попробовать это и сообщить мне, сработает ли это?   -  person Dirk Groeneveld    schedule 18.02.2021
comment
Спасибо и прошу прощения за медленный ответ. Я по-прежнему получаю NotImplementedError от _json_to_instance () по адресу com / allenai / allennlp / blob /. Отслеживание ошибки назад:   -  person sinaj    schedule 25.02.2021
comment
Так как у меня нет предиктора по умолчанию, указанного для каждой модели-головы (github.com/allenai/allennlp/blob/). Я вижу, что для каждой головы создается экземпляр обычного Predictor по адресу github.com/allenai/allennlp/blob/. А затем, когда возникает ошибка, вызывается _json_to_instance (), хотя он не реализован для обычного предсказателя.   -  person sinaj    schedule 25.02.2021
comment
У меня возникает вопрос: могу ли я указать предиктор по умолчанию для каждой модели-головы? Если да, то как это сделать в jsonnet-файле?   -  person sinaj    schedule 25.02.2021
comment
Сообщение об ошибке (также разделенное на части из-за ограничения количества символов): Файл ... / mtl_sd_venv / bin / allennlp, строка 8, в ‹module› sys.exit (run ()) Файл ... / mtl_sd_venv / lib /python3.8/site-packages/allennlp/__main__.py, строка 34, в основном файле выполнения (prog = allennlp) ... / mtl_sd_venv / lib / python3.8 / site-packages / allennlp / commands / __ init__.py , строка 119, в основном файле args.func (args) ... / mtl_sd_venv / lib / python3.8 / site-packages / allennlp / commands / expect.py, строка 239, в _predict manager.run ()   -  person sinaj    schedule 25.02.2021
comment
Файл ... / mtl_sd_venv / lib / python3.8 / site-packages / allennlp / commands / expect.py, строка 211, при запуске для model_input_json, результат zip (batch_json, self._predict_json (batch_json)): Файл .. ./mtl_sd_venv/lib/python3.8/site-packages/allennlp/commands/predict.py, строка 157, в _predict_json results = [self._predictor.predict_json (batch_data [0])] Файл ... / mtl_sd_venv / /python3.8/site-packages/allennlp/predictors/predictor.py, строка 54, в instance_json instance = self._json_to_instance (входы)   -  person sinaj    schedule 25.02.2021
comment
Файл ... / mtl_sd_venv / lib / python3.8 / site-packages / allennlp / predors / multitask.py, строка 74, в _json_to_instance instance = predictor._json_to_instance (json_dict) Файл ... / mtl_sd_venv / lib / python3.8 /site-packages/allennlp/predictors/predictor.py, строка 287, в _json_to_instance поднять NotImplementedError NotImplementedError   -  person sinaj    schedule 25.02.2021
comment
Ничего! Мне просто нужно было установить default_predictor в качестве атрибута класса головок моделей на "mtlsd_predictor". Теперь все работает! Спасибо!   -  person sinaj    schedule 26.02.2021
comment
Милая! Я постараюсь уловить некоторые из них в официальном ответе.   -  person Dirk Groeneveld    schedule 27.02.2021


Ответы (1)


Здесь есть две проблемы. Одна из них - ошибка в AllenNLP, исправленная в версии 2.1.0. Во-вторых, у @sinaj отсутствовал default_predictor в его модельной голове.

person Dirk Groeneveld    schedule 26.02.2021