flairNLP / flair

A very simple framework for state-of-the-art Natural Language Processing (NLP)
https://flairnlp.github.io/flair/
Other
13.89k stars 2.1k forks source link

Can't load NER model: 'LanguageModel' object has no attribute '_modules' #2359

Closed daniellebitt closed 3 years ago

daniellebitt commented 3 years ago

Describe the bug NER model fails to load after download inside torch nn

To Reproduce

from flair.models import SequenceTagger
from flair.data import Sentence

# load the model you trained
model = SequenceTagger.load('X:/Public/Danielle/RadOncFlairExpts/Files/ner_2021/Output/best-model.pt')

# create example sentence
sentence = Sentence('I love 30 Gy Berlin with a boost')

# predict tags and print
model.predict(sentence)

print(sentence.to_tagged_string())

Expected behavior Tagged sentence

Output

2021-07-30 17:26:57,318 loading file X:/Public/Danielle/RadOncFlairExpts/Files/ner_2021/Output/best-model.pt
Traceback (most recent call last):
  File "evaluate-tester2.py", line 5, in <module>
    model = SequenceTagger.load('X:/Public/Danielle/RadOncFlairExpts/Files/ner_2021/Output/best-model.pt')
  File "X:\Public\Danielle\RadOncFlairExpts\Files\ner_2021\.venv\lib\site-packages\flair\nn.py", line 90, in load
    model = cls._init_model_with_state_dict(state)
  File "X:\Public\Danielle\RadOncFlairExpts\Files\ner_2021\.venv\lib\site-packages\flair\models\sequence_tagger_model.py", line 295, in _init_model_with_state_dict
    reproject_embeddings=reproject_embeddings,
  File "X:\Public\Danielle\RadOncFlairExpts\Files\ner_2021\.venv\lib\site-packages\flair\models\sequence_tagger_model.py", line 233, in __init__
    self.to(flair.device)
  File "X:\Public\Danielle\RadOncFlairExpts\Files\ner_2021\.venv\lib\site-packages\torch\nn\modules\module.py", line 612, in to
    return self._apply(convert)
  File "X:\Public\Danielle\RadOncFlairExpts\Files\ner_2021\.venv\lib\site-packages\torch\nn\modules\module.py", line 359, in _apply
    module._apply(fn)
  File "X:\Public\Danielle\RadOncFlairExpts\Files\ner_2021\.venv\lib\site-packages\torch\nn\modules\module.py", line 359, in _apply
    module._apply(fn)
  File "X:\Public\Danielle\RadOncFlairExpts\Files\ner_2021\.venv\lib\site-packages\torch\nn\modules\module.py", line 359, in _apply
    module._apply(fn)
  File "X:\Public\Danielle\RadOncFlairExpts\Files\ner_2021\.venv\lib\site-packages\flair\models\language_model.py", line 406, in _apply
    for child_module in self.children():
  File "X:\Public\Danielle\RadOncFlairExpts\Files\ner_2021\.venv\lib\site-packages\torch\nn\modules\module.py", line 1172, in children
    for name, module in self.named_children():
  File "X:\Public\Danielle\RadOncFlairExpts\Files\ner_2021\.venv\lib\site-packages\torch\nn\modules\module.py", line 1190, in named_children
    for name, module in self._modules.items():
  File "X:\Public\Danielle\RadOncFlairExpts\Files\ner_2021\.venv\lib\site-packages\torch\nn\modules\module.py", line 779, in __getattr__
    type(self).__name__, name))
torch.nn.modules.module.ModuleAttributeError: 'LanguageModel' object has no attribute '_modules'

Environment (please complete the following information):

whoisjones commented 3 years ago

Hi @daniellebitt can you give more details about how you trained the model?

daniellebitt commented 3 years ago

Hi - Sure, I used this code:

import sys
from pathlib import Path

from flair.data import Corpus
from flair.datasets import ColumnCorpus
#import flair.data
from flair.data_fetcher import NLPTaskDataFetcher, NLPTask
from flair.visual.training_curves import Plotter
from flair.embeddings import TokenEmbeddings, WordEmbeddings, StackedEmbeddings, CharacterEmbeddings, FlairEmbeddings, BertEmbeddings, ELMoEmbeddings
from typing import List
import argparse

#do not add test file if tuning
parser = argparse.ArgumentParser(description='Flair trainer for concepts')
parser.add_argument('-d','--data_folder', required=True, help='base folder with Conll formatted file with gold standard data')
parser.add_argument('-e', '--conll_train_file', required=True, help='conll train file name')
parser.add_argument('-f', '--conll_test_file', required=False, help='conll test file name')
parser.add_argument('-g', '--conll_dev_file', required=True, help='conll dev file name')

def main(args):
    args = parser.parse_args()
    #print(args)

    # 1. get the corpus
    column_dict = {0:'word', 1:'pos', 2:'ner'}
    corpus = ColumnCorpus(data_folder=Path(args.data_folder),
        column_format=column_dict,
        train_file=args.conll_train_file,
        test_file=args.conll_test_file,
        dev_file=args.conll_dev_file,
        tag_to_bioes='ner')
    print(corpus)

    # 2. what tag do we want to predict?
    tag_type = 'ner'

    # 3. make the tag dictionary from the corpus
    tag_dictionary = corpus.make_tag_dictionary(tag_type=tag_type)
    print(tag_dictionary.idx2item)

    # 4. initialize embeddings
    embedding_types = [

        WordEmbeddings('glove'),

        # comment in this line to use character embeddings
        # CharacterEmbeddings(),

        # comment in these lines to use contextual string embeddings
        FlairEmbeddings('news-forward'),
        FlairEmbeddings('news-backward'),

        # comment in these lines to use Bert embeddings
        # BertEmbeddings(),

        # comment in these lines to use Elmo embeddings
        # ELMoEmbeddings(),
    ]

    embeddings = StackedEmbeddings(embeddings=embedding_types)

    # 5. initialize sequence tagger
    from flair.models import SequenceTagger

    tagger = SequenceTagger(hidden_size=64,
                                            embeddings=embeddings,
                                            tag_dictionary=tag_dictionary,
                                            tag_type=tag_type,
                                            use_crf=True)

    # 6. initialize trainer
    from flair.trainers import ModelTrainer

    trainer = ModelTrainer(tagger, corpus)

    # 7. start training
    trainer.train('resources/taggers/glove5',
                learning_rate=0.1,
                mini_batch_size=32,
                max_epochs=50,
                embeddings_storage_mode='gpu',
                checkpoint=True,
                param_selection_mode=False)

if __name__ == '__main__':
    main(sys.argv[1:])
daniellebitt commented 3 years ago

I am sorry, I realized that there was an issue with how my model had been saved. It works now.