run_squad.py 4.16 KB
Newer Older
1
2
3
4
5
6
7
8
9
10
11
12
13
14
# Copyright 2019 The TensorFlow Authors. All Rights Reserved.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
#     http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
# ==============================================================================
15
"""Run BERT on SQuAD 1.1 and SQuAD 2.0 in TF 2.x."""
16

17
18
19
20
21
22
23
24
25
26
from __future__ import absolute_import
from __future__ import division
from __future__ import print_function

import json

from absl import app
from absl import flags
import tensorflow as tf

27
from official.nlp.bert import configs as bert_configs
Chen Chen's avatar
Chen Chen committed
28
from official.nlp.bert import run_squad_helper
29
from official.nlp.bert import tokenization
30
from official.nlp.data import squad_lib as squad_lib_wp
31
from official.utils.misc import distribution_utils
32
from official.utils.misc import keras_utils
33

Chen Chen's avatar
Chen Chen committed
34

35
36
37
flags.DEFINE_string('vocab_file', None,
                    'The vocabulary file that the BERT model was trained on.')

Chen Chen's avatar
Chen Chen committed
38
39
# More flags can be found in run_squad_helper.
run_squad_helper.define_common_squad_flags()
40

41
42
43
FLAGS = flags.FLAGS


44
45
46
47
def train_squad(strategy,
                input_meta_data,
                custom_callbacks=None,
                run_eagerly=False):
48
  """Run bert squad training."""
Chen Chen's avatar
Chen Chen committed
49
50
51
  bert_config = bert_configs.BertConfig.from_json_file(FLAGS.bert_config_file)
  run_squad_helper.train_squad(strategy, input_meta_data, bert_config,
                               custom_callbacks, run_eagerly)
52
53
54
55


def predict_squad(strategy, input_meta_data):
  """Makes predictions for a squad dataset."""
Chen Chen's avatar
Chen Chen committed
56
57
58
59
60
  bert_config = bert_configs.BertConfig.from_json_file(FLAGS.bert_config_file)
  tokenizer = tokenization.FullTokenizer(
      vocab_file=FLAGS.vocab_file, do_lower_case=FLAGS.do_lower_case)
  run_squad_helper.predict_squad(strategy, input_meta_data, tokenizer,
                                 bert_config, squad_lib_wp)
61
62


Hongkun Yu's avatar
Hongkun Yu committed
63
64
65
66
67
68
69
70
71
72
def export_squad(model_export_path, input_meta_data):
  """Exports a trained model as a `SavedModel` for inference.

  Args:
    model_export_path: a string specifying the path to the SavedModel directory.
    input_meta_data: dictionary containing meta data about input and model.

  Raises:
    Export path is not specified, got an empty string or None.
  """
Chen Chen's avatar
Chen Chen committed
73
74
  bert_config = bert_configs.BertConfig.from_json_file(FLAGS.bert_config_file)
  run_squad_helper.export_squad(model_export_path, input_meta_data, bert_config)
Hongkun Yu's avatar
Hongkun Yu committed
75
76


77
78
79
def main(_):
  # Users should always run this script under TF 2.x
  assert tf.version.VERSION.startswith('2.')
80

81
82
83
  with tf.io.gfile.GFile(FLAGS.input_meta_data_path, 'rb') as reader:
    input_meta_data = json.loads(reader.read().decode('utf-8'))

Hongkun Yu's avatar
Hongkun Yu committed
84
85
86
87
  if FLAGS.mode == 'export_only':
    export_squad(FLAGS.model_export_path, input_meta_data)
    return

88
89
90
91
  # Configures cluster spec for multi-worker distribution strategy.
  if FLAGS.num_gpus > 0:
    _ = distribution_utils.configure_cluster(FLAGS.worker_hosts,
                                             FLAGS.task_index)
92
93
94
  strategy = distribution_utils.get_distribution_strategy(
      distribution_strategy=FLAGS.distribution_strategy,
      num_gpus=FLAGS.num_gpus,
95
      all_reduce_alg=FLAGS.all_reduce_alg,
96
      tpu_address=FLAGS.tpu)
Hongkun Yu's avatar
Hongkun Yu committed
97
  if FLAGS.mode in ('train', 'train_and_predict'):
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
    if FLAGS.log_steps:
      custom_callbacks = [keras_utils.TimeHistory(
          batch_size=FLAGS.train_batch_size,
          log_steps=FLAGS.log_steps,
          logdir=FLAGS.model_dir,
      )]
    else:
      custom_callbacks = None

    train_squad(
        strategy,
        input_meta_data,
        custom_callbacks=custom_callbacks,
        run_eagerly=FLAGS.run_eagerly,
    )
Hongkun Yu's avatar
Hongkun Yu committed
113
  if FLAGS.mode in ('predict', 'train_and_predict'):
114
115
116
117
118
119
120
    predict_squad(strategy, input_meta_data)


if __name__ == '__main__':
  flags.mark_flag_as_required('bert_config_file')
  flags.mark_flag_as_required('model_dir')
  app.run(main)