コード例 #1
0
ファイル: train_model.py プロジェクト: youlei5898/ParlAI
def setup_args():
    parser = ParlaiParser(True, True)
    train = parser.add_argument_group('Training Loop Arguments')
    train.add_argument('-et', '--evaltask',
                       help=('task to use for valid/test (defaults to the '
                             'one used for training if not set)'))
    train.add_argument('-d', '--display-examples',
                       type='bool', default=False)
    train.add_argument('-e', '--num-epochs', type=float, default=-1)
    train.add_argument('-ttim', '--max-train-time',
                       type=float, default=-1)
    train.add_argument('-ltim', '--log-every-n-secs',
                       type=float, default=2)
    train.add_argument('-vtim', '--validation-every-n-secs',
                       type=float, default=-1)
    train.add_argument('-vme', '--validation-max-exs',
                       type=int, default=-1,
                       help='max examples to use during validation (default '
                            '-1 uses all)')
    train.add_argument('-vp', '--validation-patience',
                       type=int, default=10,
                       help=('number of iterations of validation where result'
                             ' does not improve before we stop training'))
    train.add_argument('-vmt', '--validation-metric', default='accuracy',
                       help='key into report table for selecting best '
                            'validation')
    train.add_argument('-dbf', '--dict-build-first',
                       type='bool', default=True,
                       help='build dictionary first before training agent')
    return parser
コード例 #2
0
 def add_cmdline_args(
     cls, parser: ParlaiParser, partial_opt: Optional[Opt] = None
 ) -> ParlaiParser:
     super().add_cmdline_args(parser, partial_opt)
     parser = parser.add_argument_group('WoW Interactive World Args')
     parser.add_argument(
         '--print-checked-sentence',
         type='bool',
         default=True,
         help='Print sentence that the model checks.',
     )
     return parser
コード例 #3
0
    def add_cmdline_args(
        cls, parser: ParlaiParser, partial_opt: Optional[Opt] = None
    ) -> ParlaiParser:
        """
        Add command-line arguments specifically for this agent.
        """
        agent = parser.add_argument_group('Transformer Arguments')
        add_common_cmdline_args(agent)
        cls.dictionary_class().add_cmdline_args(parser, partial_opt=partial_opt)

        super().add_cmdline_args(parser, partial_opt=partial_opt)
        return agent
コード例 #4
0
 def add_cmdline_args(cls,
                      parser: ParlaiParser,
                      partial_opt: Optional[Opt] = None) -> ParlaiParser:
     super().add_cmdline_args(parser, partial_opt)
     agent = parser.add_argument_group('SaFeRDialogues options')
     agent.add_argument(
         '--recovery',
         type=bool,
         default=True,
         help="Whether or not to include the recovery utterance",
     )
     return parser
コード例 #5
0
 def add_cmdline_args(
     cls, parser: ParlaiParser, partial_opt: Optional[Opt] = None
 ) -> ParlaiParser:
     super().add_cmdline_args(parser, partial_opt)
     agent = parser.add_argument_group('Session Level NormalizedTeacher arguments')
     agent.add_argument(
         '--is-convai2-session-level',
         type=bool,
         default=False,
         help="whether to flatten the persona lines into a single persona line per speaker",
     )
     return agent
コード例 #6
0
ファイル: agents.py プロジェクト: J-Douglas/PodBot
 def add_cmdline_args(cls,
                      parser: ParlaiParser,
                      partial_opt: Optional[Opt] = None) -> ParlaiParser:
     agent = parser.add_argument_group('SQuAD Sentence Teacher Arguments')
     agent.add_argument(
         '--include-context',
         type='bool',
         default=False,
         help='include context within text instead of as a '
         'separate field',
     )
     return parser
コード例 #7
0
ファイル: agents.py プロジェクト: sagar-spkt/ParlAI
 def add_cmdline_args(cls,
                      parser: ParlaiParser,
                      partial_opt: Optional[Opt] = None) -> ParlaiParser:
     super().add_cmdline_args(parser, partial_opt)
     group = parser.add_argument_group("Natural Questions retrieval")
     group.add_argument(
         "--normalize-everything",
         default=False,
         type=bool,
         help="Noramlize text + label in training",
     )
     return parser
コード例 #8
0
 def add_cmdline_args(cls,
                      parser: ParlaiParser,
                      partial_opt: Optional[Opt] = None) -> ParlaiParser:
     group = parser.add_argument_group('FixedResponse Arguments')
     group.add_argument(
         '-fr',
         '--fixed-response',
         type='nonestr',
         default="I don't know.",
         help='fixed response the agent always returns',
     )
     return parser
コード例 #9
0
ファイル: client.py プロジェクト: bwubrian/ParlAI
def setup_args():
    """
    Set up args, specifically for the port number.

    :return: A parser that parses the port from commandline arguments.
    """
    parser = ParlaiParser(False, False)
    parser_grp = parser.add_argument_group('Discord Chat')
    parser_grp.add_argument(
        '--port', default=35496, type=int, help='Port to run the discord chat server'
    )
    return parser.parse_args()
コード例 #10
0
ファイル: agents.py プロジェクト: kimsan0622/anonymous_kowow
 def add_cmdline_args(cls,
                      parser: ParlaiParser,
                      partial_opt: Optional[Opt] = None) -> ParlaiParser:
     super().add_cmdline_args(parser, partial_opt)
     agent = parser.add_argument_group('Wizard arguments')
     agent.add_argument(
         '--ln',
         type=str,
         default='en',
         help='language code. default: en',
     )
     return parser
コード例 #11
0
ファイル: train_model.py プロジェクト: yaoh82/ParlAI
def setup_args(parser=None):
    if parser is None:
        parser = ParlaiParser(True, True)
    train = parser.add_argument_group('Training Loop Arguments')
    train.add_argument('-et', '--evaltask',
                       help=('task to use for valid/test (defaults to the '
                             'one used for training if not set)'))
    train.add_argument('--display-examples', type='bool', default=False)
    train.add_argument('-eps', '--num-epochs', type=float, default=-1)
    train.add_argument('-ttim', '--max-train-time',
                       type=float, default=-1)
    train.add_argument('-ltim', '--log-every-n-secs',
                       type=float, default=2)
    train.add_argument('-vtim', '--validation-every-n-secs',
                       type=float, default=-1,
                       help='Validate every n seconds. Whenever the the best '
                            'validation metric is found, saves the model to '
                            'the model_file path if set.')
    train.add_argument('-stim', '--save-every-n-secs',
                       type=float, default=-1,
                       help='Saves the model to model_file.checkpoint after '
                            'every n seconds (default -1, never).')
    train.add_argument('-sval', '--save-after-valid', type='bool',
                       default=False,
                       help='Saves the model to model_file.checkpoint after '
                            'every validation (default True).')
    train.add_argument('-vme', '--validation-max-exs',
                       type=int, default=-1,
                       help='max examples to use during validation (default '
                            '-1 uses all)')
    train.add_argument('-vp', '--validation-patience',
                       type=int, default=10,
                       help=('number of iterations of validation where result'
                             ' does not improve before we stop training'))
    train.add_argument('-vmt', '--validation-metric', default='accuracy',
                       help='key into report table for selecting best '
                            'validation')
    train.add_argument('-vmm', '--validation-metric-mode', default='max',
                       type=str, choices=['max', 'min'],
                       help='how to optimize validation metric (max or min)')
    train.add_argument('-vcut', '--validation-cutoff',
                       type=float, default=1.0,
                       help='value at which training will stop if exceeded by '
                            'training metric')
    train.add_argument('-dbf', '--dict-build-first',
                       type='bool', default=True,
                       help='build dictionary first before training agent')
    train.add_argument('-lfc', '--load-from-checkpoint',
                       type='bool', default=False,
                       help='load model from checkpoint if available')
    TensorboardLogger.add_cmdline_args(parser)
    parser = setup_dict_args(parser)
    return parser
コード例 #12
0
 def add_cmdline_args(
     cls, parser: ParlaiParser, partial_opt: Optional[Opt] = None
 ) -> ParlaiParser:
     super().add_cmdline_args(parser, partial_opt)
     parser = parser.add_argument_group('ConvAI2 Interactive World')
     parser.add_argument(
         '--display-partner-persona',
         type='bool',
         default=True,
         help='Display your partner persona at the end of the chat',
     )
     return parser
コード例 #13
0
ファイル: worlds.py プロジェクト: simplecoka/cortx
 def add_cmdline_args(cls,
                      parser: ParlaiParser,
                      partial_opt: Optional[Opt] = None) -> ParlaiParser:
     super().add_cmdline_args(parser, partial_opt)
     parser = parser.add_argument_group('LIGHT Interactive World')
     parser.add_argument(
         '--add-task-string',
         type='bool',
         default=False,
         help='Add _task_speech to text input to model or not',
     )
     return parser
コード例 #14
0
 def add_cmdline_args(cls,
                      parser: ParlaiParser,
                      partial_opt: Optional[Opt] = None) -> ParlaiParser:
     super().add_cmdline_args(parser, partial_opt=partial_opt)
     agent = parser.add_argument_group('DistillTransformer arguments')
     agent.add_argument(
         '--copy-teacher-weights',
         type='bool',
         default=True,
         help='Copy weights from the teacher model to the student model',
     )
     return agent
コード例 #15
0
 def add_cmdline_args(cls,
                      parser: ParlaiParser,
                      partial_opt: Optional[Opt] = None) -> ParlaiParser:
     BasePolyencoderAgent.add_cmdline_args(parser, partial_opt)
     group = parser.add_argument_group('Return Weights Poly Group')
     group.add_argument(
         '--top-k',
         type=int,
         default=100,
         help='How many tokens to output when outputting relevant tokens',
     )
     return parser
コード例 #16
0
ファイル: agents.py プロジェクト: kimsan0622/anonymous_kowow
 def add_cmdline_args(cls,
                      parser: ParlaiParser,
                      partial_opt: Optional[Opt] = None) -> ParlaiParser:
     super().add_cmdline_args(parser, partial_opt)
     group = parser.add_argument_group('ELI5 Knowledge arguments')
     group.add_argument(
         '--knowledge',
         type='bool',
         default=True,
         help='Whether to include supporting document knowledge',
     )
     return parser
コード例 #17
0
 def add_cmdline_args(cls,
                      parser: ParlaiParser,
                      partial_opt: Optional[Opt] = None) -> ParlaiParser:
     agent = parser.add_argument_group('World Logging')
     agent.add_argument(
         '--log-keep-fields',
         type=str,
         default=KEEP_ALL,
         help=
         'Fields to keep when logging. Should be a comma separated list',
     )
     return parser
コード例 #18
0
ファイル: profile_train.py プロジェクト: xlrshop/Parl
def setup_args(parser=None):
    if parser is None:
        parser = ParlaiParser(True, True)
    parser = train_args(parser)
    profile = parser.add_argument_group('Profiler Arguments')
    profile.add_argument('--torch', type='bool', default=False,
        help='If true, use the torch profiler. Otherwise use cProfile.')
    profile.add_argument('--torch-cuda', type='bool', default=False,
        help='If true, use the torch cuda profiler. Otherwise use cProfile.')
    profile.add_argument('--debug', type='bool', default=False,
        help='If true, enter debugger at end of run.')
    return parser
コード例 #19
0
ファイル: agents.py プロジェクト: simplecoka/cortx
 def add_cmdline_args(cls,
                      parser: ParlaiParser,
                      partial_opt: Optional[Opt] = None) -> ParlaiParser:
     super().add_cmdline_args(parser, partial_opt=partial_opt)
     agent = parser.add_argument_group('IGCResponseOnly Arguments')
     agent.add_argument(
         '--igc-multi-ref',
         type='bool',
         default=False,
         help='specify true to evaluate on multi-reference labels',
     )
     return parser
コード例 #20
0
 def add_cmdline_args(cls,
                      parser: ParlaiParser,
                      partial_opt: Optional[Opt] = None) -> ParlaiParser:
     super().add_cmdline_args(parser, partial_opt)
     parser = parser.add_argument_group('Multiturn Safety Teacher Args')
     parser.add_argument(
         '--single-turn',
         type='bool',
         default=False,
         help='only include the single turn data and not the context info',
     )
     return parser
コード例 #21
0
 def add_cmdline_args(cls,
                      parser: ParlaiParser,
                      partial_opt: Optional[Opt] = None) -> ParlaiParser:
     super().add_cmdline_args(parser, partial_opt)
     agent = parser.add_argument_group('Corrupt-Example-Arguments')
     agent.add_argument(
         '--exclude-invalid-data',
         type='bool',
         default=True,
         help='Whether to include corrupt examples in the data',
     )
     return parser
コード例 #22
0
ファイル: agents.py プロジェクト: sagar-spkt/ParlAI
 def add_cmdline_args(cls,
                      parser: ParlaiParser,
                      partial_opt: Optional[Opt] = None) -> ParlaiParser:
     super().add_cmdline_args(parser, partial_opt)
     group = parser.add_argument_group("Google SGD Out Domain Parser")
     group.add_argument(
         "--filter-single-goal-episodes",
         type=bool,
         default=False,
         help=
         "Filter for only conversations where the original has single goals",
     )
コード例 #23
0
ファイル: agents.py プロジェクト: rpatil524/ParlAI
 def add_cmdline_args(cls,
                      parser: ParlaiParser,
                      partial_opt=None) -> ParlaiParser:
     super().add_cmdline_args(parser, partial_opt)
     arg_group = parser.add_argument_group(
         'Jericho World Action Teacher Args')
     arg_group.add_argument(
         '--include-knowledge-graph',
         type='bool',
         default=True,
         help='Whether to include the knowledge graph.',
     )
コード例 #24
0
 def add_cmdline_args(cls,
                      parser: ParlaiParser,
                      partial_opt: Optional[Opt] = None) -> ParlaiParser:
     super().add_cmdline_args(parser, partial_opt=partial_opt)
     agent = parser.add_argument_group('MyCustom Transformer Arguments')
     parser.add_argument(
         '--decoder-ffn-variants',
         type=DecoderFeedForwardVariant,
         default=DecoderFeedForwardVariant.ONE,
         help='Some variants in the decoder FFN implementation',
     )
     return agent  # type: ignore
コード例 #25
0
 def add_cmdline_args(cls,
                      parser: ParlaiParser,
                      partial_opt: Optional[Opt] = None) -> ParlaiParser:
     ChunkTeacher.add_cmdline_args(parser, partial_opt)
     agent = parser.add_argument_group('LM Task Arguments')
     agent.add_argument(
         '--root-dir',
         type=str,
         default=None,
         help="Root directory with generated world logs.",
     )
     agent.add_argument(
         '--validation-data-indices',
         type=str,
         default='',
         help="comma separated list of validation data indices",
     )
     agent.add_argument(
         '--shared-knowledge-entity',
         type='bool',
         help=
         'If True, only include examples with an entity in the knowledge that is also in the label',
         default=False,
     )
     agent.add_argument(
         '--min-knowledge-length',
         type=int,
         help=
         'minimum length of the knowledge required to include the example. Default -1 means no min length',
         default=5,
     )
     agent.add_argument(
         '--min-knowledge-overlap',
         type=float,
         help=
         'minimum overlap between knowledge and target sentence. Default 0 means no overlap required.',
         default=0,
     )
     agent.add_argument(
         '--skip-empty-context',
         type=bool,
         help='whether to exclude examples with empty context.',
         default=False,
     )
     agent.add_argument(
         '--exclude-retrieved-docs',
         type='bool',
         default=False,
         help=
         'specify to not include retrieved docs in the episodes. hopefully reduces memory footprint.',
     )
     return parser
コード例 #26
0
    def test_bool(self):
        """
        test add_argument(type=bool)
        """
        parser = ParlaiParser(True, True)
        parser.add_argument('--foo', type=bool)
        opt = parser.parse_args(['--foo', 'true'])
        assert opt['foo'] is True
        opt = parser.parse_args(['--foo', 'False'])
        assert opt['foo'] is False
        opt = parser.parse_args(['--foo', '0'])
        assert opt['foo'] is False

        group = parser.add_argument_group('foo container')
        group.add_argument('--bar', type=bool)
        opt = parser.parse_args(['--bar', 'true'])
        assert opt['bar'] is True
        opt = parser.parse_args(['--bar', 'False'])
        assert opt['bar'] is False
        opt = parser.parse_args(['--bar', '0'])
        assert opt['bar'] is False

        parser = ParlaiParser(True, True)
        parser.add_argument('--foo', type='bool')
        opt = parser.parse_args(['--foo', 'true'])
        assert opt['foo'] is True
        opt = parser.parse_args(['--foo', 'False'])
        assert opt['foo'] is False
        opt = parser.parse_args(['--foo', '0'])
        assert opt['foo'] is False

        group = parser.add_argument_group('foo container')
        group.add_argument('--bar', type='bool')
        opt = parser.parse_args(['--bar', 'true'])
        assert opt['bar'] is True
        opt = parser.parse_args(['--bar', 'False'])
        assert opt['bar'] is False
        opt = parser.parse_args(['--bar', '0'])
        assert opt['bar'] is False
コード例 #27
0
def main():
    # Get command line arguments
    argparser = ParlaiParser(True, True)
    build = argparser.add_argument_group('Data Building Args')
    build.add_argument('--datafile',
                       help=('The file to be loaded, preprocessed, and saved'))
    build.add_argument('--pytorch_buildteacher', type=str, default='',
        help='Which teacher to use when building the pytorch data')
    build.add_argument('--pytorch_preprocess', type='bool', default=True,
        help='Whether the agent should preprocess the data while building'
             'the pytorch data')
    opt = argparser.parse_args()
    build_data(opt)
コード例 #28
0
 def add_cmdline_args(cls,
                      parser: ParlaiParser,
                      partial_opt=None) -> ParlaiParser:
     super().add_cmdline_args(parser, partial_opt)
     arg_group = parser.add_argument_group('Search Query Teacher')
     arg_group.add_argument(
         '--only-last-search-query',
         type='bool',
         default=CONST.ONLY_LAST_QUERY_DEFAULT,
         help=
         'Whether to include only the last search before sending the response.',
     )
     return parser
コード例 #29
0
ファイル: new_data.py プロジェクト: J-Douglas/PodBot
 def add_cmdline_args(
     cls, parser: ParlaiParser, partial_opt: Optional[Opt] = None
 ) -> ParlaiParser:
     parser = gend_utils.add_common_args(parser)
     agent = parser.add_argument_group('New data gender')
     agent.add_argument(
         '--labels-to-use',
         type=str,
         default='all',
         choices=['all', 'self', 'partner', 'about'],
         help='Which labels to use for this teacher',
     )
     return parser
コード例 #30
0
 def add_cmdline_args(cls,
                      parser: ParlaiParser,
                      partial_opt: Optional[Opt] = None) -> ParlaiParser:
     super().add_cmdline_args(parser, partial_opt)
     parser = parser.add_argument_group('MSC Summary Teacher Args')
     parser.add_argument(
         '--include-last-session',
         type=bool,
         default=False,
         help="whether to include session 4 for valid and test splits",
     )
     SessionBasePersonaSummaryTeacher.add_cmdline_args(parser, partial_opt)
     return parser
コード例 #31
0
 def add_cmdline_args(cls,
                      parser: ParlaiParser,
                      partial_opt=None) -> ParlaiParser:
     super().add_cmdline_args(parser, partial_opt)
     arg_group = parser.add_argument_group(
         'Wizard Dialog Knowledge arguments')
     arg_group.add_argument(
         '--prepend-gold-knowledge',
         type='bool',
         default=False,
         help='If true, prepend text with checked sentences',
     )
     return parser
コード例 #32
0
ファイル: build_pytorch_data.py プロジェクト: ahiroto/ParlAI
def main():
    # Get command line arguments
    argparser = ParlaiParser(True, True)
    build = argparser.add_argument_group('Data Building Args')
    build.add_argument('--datafile',
                       help=('The file to be loaded, preprocessed, and saved'))
    build.add_argument('--pytorch-buildteacher', type=str, default='',
        help='Which teacher to use when building the pytorch data')
    build.add_argument('--pytorch-preprocess', type='bool', default=True,
        help='Whether the agent should preprocess the data while building'
             'the pytorch data')
    opt = argparser.parse_args()
    build_data(opt)
コード例 #33
0
ファイル: train_model.py プロジェクト: jojonki/ParlAI
def main():
    # Get command line arguments
    parser = ParlaiParser(True, True)
    train = parser.add_argument_group('Training Loop Arguments')
    train.add_argument('-et', '--evaltask',
                       help=('task to use for valid/test (defaults to the '
                             'one used for training if not set)'))
    train.add_argument('-d', '--display-examples',
                       type='bool', default=False)
    train.add_argument('-e', '--num-epochs', type=float, default=-1)
    train.add_argument('-ttim', '--max-train-time',
                       type=float, default=-1)
    train.add_argument('-ltim', '--log-every-n-secs',
                       type=float, default=2)
    train.add_argument('-vtim', '--validation-every-n-secs',
                       type=float, default=-1)
    train.add_argument('-vme', '--validation-max-exs',
                       type=int, default=-1,
                       help='max examples to use during validation (default '
                            '-1 uses all)')
    train.add_argument('-vp', '--validation-patience',
                       type=int, default=5,
                       help=('number of iterations of validation where result'
                             ' does not improve before we stop training'))
    train.add_argument('-vmt', '--validation-metric', default='accuracy',
                       help='key into report table for selecting best '
                            'validation')
    train.add_argument('-dbf', '--dict-build-first',
                       type='bool', default=True,
                       help='build dictionary first before training agent')
    opt = parser.parse_args()
    # Possibly build a dictionary (not all models do this).
    if opt['dict_build_first'] and 'dict_file' in opt:
        if opt['dict_file'] is None and opt.get('model_file'):
            opt['dict_file'] = opt['model_file'] + '.dict'
        print("[ building dictionary first... ]")
        build_dict.build_dict(opt)
    # Create model and assign it to the specified task
    agent = create_agent(opt)
    world = create_task(opt, agent)

    train_time = Timer()
    validate_time = Timer()
    log_time = Timer()
    print('[ training... ]')
    parleys = 0
    total_exs = 0
    max_exs = opt['num_epochs'] * len(world)
    max_parleys = math.ceil(max_exs / opt['batchsize'])
    best_valid = 0
    impatience = 0
    saved = False
    valid_world = None
    while True:
        world.parley()
        parleys += 1

        if opt['num_epochs'] > 0 and parleys >= max_parleys:
            print('[ num_epochs completed: {} ]'.format(opt['num_epochs']))
            break
        if opt['max_train_time'] > 0 and train_time.time() > opt['max_train_time']:
            print('[ max_train_time elapsed: {} ]'.format(train_time.time()))
            break
        if opt['log_every_n_secs'] > 0 and log_time.time() > opt['log_every_n_secs']:
            if opt['display_examples']:
                print(world.display() + '\n~~')

            logs = []
            # time elapsed
            logs.append('time:{}s'.format(math.floor(train_time.time())))
            logs.append('parleys:{}'.format(parleys))

            # get report and update total examples seen so far
            if hasattr(agent, 'report'):
                train_report = agent.report()
                agent.reset_metrics()
            else:
                train_report = world.report()
                world.reset_metrics()

            if hasattr(train_report, 'get') and train_report.get('total'):
                total_exs += train_report['total']
                logs.append('total_exs:{}'.format(total_exs))

            # check if we should log amount of time remaining
            time_left = None
            if opt['num_epochs'] > 0:
                exs_per_sec = train_time.time() / total_exs
                time_left = (max_exs - total_exs) * exs_per_sec
            if opt['max_train_time'] > 0:
                other_time_left = opt['max_train_time'] - train_time.time()
                if time_left is not None:
                    time_left = min(time_left, other_time_left)
                else:
                    time_left = other_time_left
            if time_left is not None:
                logs.append('time_left:{}s'.format(math.floor(time_left)))

            # join log string and add full metrics report to end of log
            log = '[ {} ] {}'.format(' '.join(logs), train_report)

            print(log)
            log_time.reset()

        if (opt['validation_every_n_secs'] > 0 and
                validate_time.time() > opt['validation_every_n_secs']):
            valid_report, valid_world = run_eval(
                agent, opt, 'valid', opt['validation_max_exs'],
                valid_world=valid_world)
            if valid_report[opt['validation_metric']] > best_valid:
                best_valid = valid_report[opt['validation_metric']]
                impatience = 0
                print('[ new best {}: {} ]'.format(
                    opt['validation_metric'], best_valid))
                world.save_agents()
                saved = True
                if opt['validation_metric'] == 'accuracy' and best_valid == 1:
                    print('[ task solved! stopping. ]')
                    break
            else:
                impatience += 1
                print('[ did not beat best {}: {} impatience: {} ]'.format(
                        opt['validation_metric'], round(best_valid, 4),
                        impatience))
            validate_time.reset()
            if opt['validation_patience'] > 0 and impatience >= opt['validation_patience']:
                print('[ ran out of patience! stopping training. ]')
                break
    world.shutdown()
    if not saved:
        world.save_agents()
    else:
        # reload best validation model
        agent = create_agent(opt)

    run_eval(agent, opt, 'valid', write_log=True)
    run_eval(agent, opt, 'test', write_log=True)