def do_save_inference_model(args):

    test_prog = fluid.default_main_program()
    startup_prog = fluid.default_startup_program()

    with fluid.program_guard(test_prog, startup_prog):
        test_prog.random_seed = args.random_seed
        startup_prog.random_seed = args.random_seed

        with fluid.unique_name.guard():

            context_wordseq = fluid.data(
                name='context_wordseq',
                shape=[-1, 1],
                dtype='int64',
                lod_level=1)
            response_wordseq = fluid.data(
                name='response_wordseq',
                shape=[-1, 1],
                dtype='int64',
                lod_level=1)
            labels = fluid.data(name='labels', shape=[-1, 1], dtype='int64')

            input_inst = [context_wordseq, response_wordseq, labels]
            input_field = InputField(input_inst)
            data_reader = fluid.io.PyReader(
                feed_list=input_inst, capacity=4, iterable=False)

            logits = create_net(
                is_training=False, model_input=input_field, args=args)

    if args.use_cuda:
        place = fluid.CUDAPlace(0)
    else:
        place = fluid.CPUPlace()

    exe = fluid.Executor(place)
    exe.run(startup_prog)

    assert (args.init_from_params) or (args.init_from_pretrain_model)

    if args.init_from_params:
        save_load_io.init_from_params(args, exe, test_prog)
    elif args.init_from_pretrain_model:
        save_load_io.init_from_pretrain_model(args, exe, test_prog)

    # saving inference model
    fluid.io.save_inference_model(
        args.inference_model_dir,
        feeded_var_names=[
            input_field.context_wordseq.name,
            input_field.response_wordseq.name,
        ],
        target_vars=[logits, ],
        executor=exe,
        main_program=test_prog,
        model_filename="model.pdmodel",
        params_filename="params.pdparams")

    print("save inference model at %s" % (args.inference_model_dir))
Beispiel #2
0
def do_predict(args):
    """
    predict function
    """
    test_prog = fluid.default_main_program()
    startup_prog = fluid.default_startup_program()

    with fluid.program_guard(test_prog, startup_prog):
        test_prog.random_seed = args.random_seed
        startup_prog.random_seed = args.random_seed

        with fluid.unique_name.guard():

            context_wordseq = fluid.data(name='context_wordseq',
                                         shape=[-1, 1],
                                         dtype='int64',
                                         lod_level=1)
            response_wordseq = fluid.data(name='response_wordseq',
                                          shape=[-1, 1],
                                          dtype='int64',
                                          lod_level=1)
            labels = fluid.data(name='labels', shape=[-1, 1], dtype='int64')

            input_inst = [context_wordseq, response_wordseq, labels]
            input_field = InputField(input_inst)
            data_reader = fluid.io.PyReader(feed_list=input_inst,
                                            capacity=4,
                                            iterable=False)

            logits = create_net(is_training=False,
                                model_input=input_field,
                                args=args)
            logits.persistable = True

            fetch_list = [logits.name]
    #for_test is True if change the is_test attribute of operators to True
    test_prog = test_prog.clone(for_test=True)
    if args.use_cuda:
        place = fluid.CUDAPlace(int(os.getenv('FLAGS_selected_gpus', '0')))
    else:
        place = fluid.CPUPlace()

    exe = fluid.Executor(place)
    exe.run(startup_prog)

    assert (args.init_from_params) or (args.init_from_pretrain_model)
    if args.init_from_params:
        save_load_io.init_from_params(args, exe, test_prog)
    if args.init_from_pretrain_model:
        save_load_io.init_from_pretrain_model(args, exe, test_prog)

    compiled_test_prog = fluid.CompiledProgram(test_prog)

    processor = reader.DataProcessor(data_path=args.predict_file,
                                     max_seq_length=args.max_seq_len,
                                     batch_size=args.batch_size)

    batch_generator = processor.data_generator(place=place,
                                               phase="test",
                                               shuffle=False,
                                               sample_pro=1)
    num_test_examples = processor.get_num_examples(phase='test')

    data_reader.decorate_batch_generator(batch_generator)
    data_reader.start()

    scores = []
    while True:
        try:
            results = exe.run(compiled_test_prog, fetch_list=fetch_list)
            scores.extend(results[0])
        except fluid.core.EOFException:
            data_reader.reset()
            break

    scores = scores[:num_test_examples]
    print("Write the predicted results into the output_prediction_file")
    fw = io.open(args.output_prediction_file, 'w', encoding="utf8")
    for index, score in enumerate(scores):
        fw.write("%s\t%s\n" % (index, score))
    print("finish........................................")