def model_fn(features, labels, mode, params): # pylint: disable=unused-argument """The `model_fn` for TPUEstimator.""" logging.info("*** Features ***") for name in sorted(features.keys()): logging.info(" name = %s, shape = %s" % (name, features[name].shape)) def reform_a_input(raw_input): return tf.reshape(raw_input, [dict_run_config.inner_batch_size, -1]) def reform_b_input(raw_input): return tf.reshape(raw_input, [dict_run_config.def_per_batch, -1]) input_ids = reform_a_input(features["input_ids"]) # [batch_size, def] input_mask = reform_a_input(features["input_mask"]) segment_ids = reform_a_input(features["segment_ids"]) d_input_ids = reform_b_input(features["d_input_ids"]) d_input_mask = reform_b_input(features["d_input_mask"]) d_location_ids = reform_a_input(features["d_location_ids"]) ab_mapping = features["ab_mapping"] if hasattr(ssdr_config, "blind_dictionary") and ssdr_config.blind_dictionary: logging.info("Hide dictionary") d_input_ids = tf.zeros_like(d_input_ids) d_input_mask = tf.zeros_like(d_input_mask) if dict_run_config.prediction_op == "loss": seed = 0 else: seed = None if dict_run_config.prediction_op == "loss_fixed_mask" or train_config.fixed_mask: masked_input_ids = input_ids masked_lm_positions = reform_a_input( features["masked_lm_positions"]) masked_lm_ids = reform_a_input(features["masked_lm_ids"]) masked_lm_weights = reform_a_input(features["masked_lm_weights"]) else: masked_input_ids, masked_lm_positions, masked_lm_ids, masked_lm_weights \ = random_masking(input_ids, input_mask, train_config.max_predictions_per_seq, MASK_ID, seed) if dict_run_config.use_d_segment_ids: d_segment_ids = reform_b_input(features["d_segment_ids"]) else: d_segment_ids = None if dict_run_config.use_ab_mapping_mask: ab_mapping_mask = reform_a_input(features["ab_mapping_mask"]) else: ab_mapping_mask = None if ssdr_config.compare_attrib_value_safe("consistency", True): print("masked_input_ids", masked_input_ids.shape) print('d_input_ids', d_input_ids.shape) print("ab_mapping_mask", ab_mapping_mask.shape) masked_input_ids = tf.tile(masked_input_ids, [2, 1]) input_mask = tf.tile(input_mask, [2, 1]) segment_ids = tf.tile(segment_ids, [2, 1]) dummy = tf.zeros_like(d_input_ids, tf.int32) #d_input_ids = tf.concat([d_input_ids, dummy], axis=0) #d_input_mask = tf.concat([d_input_mask, dummy], axis=0) #if d_segment_ids is not None: # d_segment_ids = tf.concat([d_segment_ids, dummy], axis=0) d_location_ids = tf.concat( [d_location_ids, tf.zeros_like(d_location_ids, tf.int32)], axis=0) #ab_mapping = tf.concat([ab_mapping, tf.zeros_like(ab_mapping, tf.int32)], axis=0) ab_mapping_mask = tf.concat( [ab_mapping_mask, tf.zeros_like(ab_mapping_mask, tf.int32)], axis=0) masked_lm_positions = tf.tile(masked_lm_positions, [2, 1]) masked_lm_ids = tf.tile(masked_lm_ids, [2, 1]) masked_lm_weights = tf.tile(masked_lm_weights, [2, 1]) print("masked_input_ids", masked_input_ids.shape) print('d_input_ids', d_input_ids.shape) print("ab_mapping_mask", ab_mapping_mask.shape) is_training = (mode == tf.estimator.ModeKeys.TRAIN) model = model_class( config=bert_config, ssdr_config=ssdr_config, is_training=is_training, input_ids=masked_input_ids, input_mask=input_mask, token_type_ids=segment_ids, d_input_ids=d_input_ids, d_input_mask=d_input_mask, d_segment_ids=d_segment_ids, d_location_ids=d_location_ids, ab_mapping=ab_mapping, ab_mapping_mask=ab_mapping_mask, use_one_hot_embeddings=train_config.use_one_hot_embeddings, ) (masked_lm_loss, masked_lm_example_loss, masked_lm_log_probs) = get_masked_lm_output( bert_config, model.get_sequence_output(), model.get_embedding_table(), masked_lm_positions, masked_lm_ids, masked_lm_weights) total_loss = masked_lm_loss tvars = tf.compat.v1.trainable_variables() init_vars = {} scaffold_fn = None if train_config.init_checkpoint: if dict_run_config.is_bert_checkpoint: map1, map2, init_vars = dict_model_fn.get_bert_assignment_map_for_dict( tvars, train_config.init_checkpoint) def load_fn(): tf.compat.v1.train.init_from_checkpoint( train_config.init_checkpoint, map1) tf.compat.v1.train.init_from_checkpoint( train_config.init_checkpoint, map2) else: map1, init_vars = get_assignment_map_as_is( tvars, train_config.init_checkpoint) def load_fn(): tf.compat.v1.train.init_from_checkpoint( train_config.init_checkpoint, map1) if train_config.use_tpu: def tpu_scaffold(): load_fn() return tf.compat.v1.train.Scaffold() scaffold_fn = tpu_scaffold else: load_fn() logging.info("**** Trainable Variables ****") for var in tvars: init_string = "" if var.name in init_vars: init_string = ", *INIT_FROM_CKPT*" logging.info(" name = %s, shape = %s%s", var.name, var.shape, init_string) logging.info("Total parameters : %d" % get_param_num()) output_spec = None if mode == tf.estimator.ModeKeys.TRAIN: if train_config.gradient_accumulation == 1: train_op = optimization.create_optimizer_from_config( total_loss, train_config) else: logging.info("Using gradient accumulation : %d" % train_config.gradient_accumulation) train_op = get_accumulated_optimizer_from_config( total_loss, train_config, tvars, train_config.gradient_accumulation) output_spec = tf.compat.v1.estimator.tpu.TPUEstimatorSpec( mode=mode, loss=total_loss, train_op=train_op, scaffold_fn=scaffold_fn) elif mode == tf.estimator.ModeKeys.EVAL: eval_metrics = (metric_fn_lm, [ masked_lm_example_loss, masked_lm_log_probs, masked_lm_ids, masked_lm_weights ]) output_spec = tf.compat.v1.estimator.tpu.TPUEstimatorSpec( mode=mode, loss=total_loss, eval_metrics=eval_metrics, scaffold_fn=scaffold_fn) else: if dict_run_config.prediction_op == "gradient": logging.info("Fetching gradient") gradient = dict_model_fn.get_gradients( model, masked_lm_log_probs, train_config.max_predictions_per_seq, bert_config.vocab_size) predictions = { "masked_input_ids": masked_input_ids, "d_input_ids": d_input_ids, "masked_lm_positions": masked_lm_positions, "gradients": gradient, } elif dict_run_config.prediction_op == "scores": logging.info("Fetching input/d_input and scores") predictions = { "masked_input_ids": masked_input_ids, "d_input_ids": d_input_ids, "masked_lm_positions": masked_lm_positions, "masked_lm_ids": masked_lm_ids, "ab_mapping": ab_mapping, "d_location_ids": d_location_ids, "scores": model.scores, } elif dict_run_config.prediction_op == "loss" or dict_run_config.prediction_op == "loss_fixed_mask": logging.info("Fetching loss") predictions = { "masked_lm_example_loss": masked_lm_example_loss, } else: raise Exception("prediction target not specified") output_spec = tf.compat.v1.estimator.tpu.TPUEstimatorSpec( mode=mode, loss=total_loss, predictions=predictions, scaffold_fn=scaffold_fn) return output_spec
def model_fn(features, labels, mode, params): # pylint: disable=unused-argument """The `model_fn` for TPUEstimator.""" log_features(features) def reform_a_input(raw_input): return tf.reshape(raw_input, [dict_run_config.inner_batch_size, -1]) def reform_b_input(raw_input): return tf.reshape(raw_input, [dict_run_config.def_per_batch, -1]) input_ids = reform_a_input(features["input_ids"]) input_mask = reform_a_input(features["input_mask"]) segment_ids = reform_a_input(features["segment_ids"]) tf_logging.info("input_ids, input_mask") # input_ids = features["input_ids"] # input_mask = features["input_mask"] # segment_ids = features["segment_ids"] if mode == tf.estimator.ModeKeys.PREDICT: tf.random.set_seed(0) seed = 0 else: seed = None # tf_logging.info("Doing dynamic masking (random)") # masked_input_ids, masked_lm_positions, masked_lm_ids, masked_lm_weights \ # = random_masking(input_ids, input_mask, train_config.max_predictions_per_seq, MASK_ID, seed) # if dict_run_config.prediction_op == "loss_fixed_mask" or train_config.fixed_mask: masked_input_ids = input_ids masked_lm_positions = reform_a_input(features["masked_lm_positions"]) masked_lm_ids = reform_a_input(features["masked_lm_ids"]) masked_lm_weights = reform_a_input(features["masked_lm_weights"]) is_training = (mode == tf.estimator.ModeKeys.TRAIN) if model_name == "APR": model = APR( masked_input_ids, input_mask, segment_ids, is_training, train_config.use_one_hot_embeddings, bert_config, ssdr_config, dict_run_config.def_per_batch, dict_run_config.inner_batch_size, dict_run_config.max_def_length, ) elif model_name == "BERT": model = BertModel( config=bert_config, is_training=is_training, input_ids=masked_input_ids, input_mask=input_mask, token_type_ids=segment_ids, use_one_hot_embeddings=train_config.use_one_hot_embeddings, ) else: assert False masked_lm_loss, masked_lm_example_loss, masked_lm_log_probs \ = get_masked_lm_output(bert_config, model.get_sequence_output(), model.get_embedding_table(), masked_lm_positions, masked_lm_ids, masked_lm_weights) loss = masked_lm_loss tvars = tf.compat.v1.trainable_variables() assignment_fn = dict_model_fn.get_bert_assignment_map_for_dict initialized_variable_names, init_fn = align_checkpoint_twice( tvars, train_config.init_checkpoint, assignment_fn) scaffold_fn = get_tpu_scaffold_or_init(init_fn, train_config.use_tpu) log_var_assignments(tvars, initialized_variable_names) TPUEstimatorSpec = tf.compat.v1.estimator.tpu.TPUEstimatorSpec if mode == tf.estimator.ModeKeys.TRAIN: if ssdr_config.compare_attrib_value_safe("use_two_lr", True): tf_logging.info("Using two lr for each parts") train_op = create_optimizer_with_separate_lr( loss, train_config) else: tf_logging.info("Using single lr ") train_op = optimization.create_optimizer_from_config( loss, train_config) output_spec = TPUEstimatorSpec(mode=mode, loss=loss, train_op=train_op, training_hooks=[OomReportingHook()], scaffold_fn=scaffold_fn) elif mode == tf.estimator.ModeKeys.EVAL: eval_metrics = (metric_fn_lm, [ masked_lm_example_loss, masked_lm_log_probs, masked_lm_ids, masked_lm_weights, ]) output_spec = TPUEstimatorSpec(mode=mode, loss=loss, eval_metrics=eval_metrics, scaffold_fn=scaffold_fn) else: predictions = { "input_ids": input_ids, "masked_input_ids": masked_input_ids, "masked_lm_ids": masked_lm_ids, "masked_lm_example_loss": masked_lm_example_loss, "masked_lm_positions": masked_lm_positions, } output_spec = TPUEstimatorSpec(mode=mode, loss=loss, predictions=predictions, scaffold_fn=scaffold_fn) return output_spec
def model_fn(features, labels, mode, params): # pylint: disable=unused-argument """The `model_fn` for TPUEstimator.""" tf_logging.info("*** Features ***") for name in sorted(features.keys()): tf_logging.info(" name = %s, shape = %s" % (name, features[name].shape)) input_ids = features["input_ids"] input_mask = features["input_mask"] segment_ids = features["segment_ids"] instance_id = features["instance_id"] next_sentence_labels = get_dummy_next_sentence_labels(input_ids) tf_logging.info("Doing dynamic masking (random)") masked_input_ids, masked_lm_positions, masked_lm_ids, masked_lm_weights \ = random_masking(input_ids, input_mask, train_config.max_predictions_per_seq, MASK_ID) is_training = (mode == tf.estimator.ModeKeys.TRAIN) model = model_class( config=model_config, is_training=is_training, input_ids=masked_input_ids, input_mask=input_mask, token_type_ids=segment_ids, use_one_hot_embeddings=train_config.use_one_hot_embeddings, ) (masked_lm_loss, masked_lm_example_loss, masked_lm_log_probs) = get_masked_lm_output( model_config, model.get_sequence_output(), model.get_embedding_table(), masked_lm_positions, masked_lm_ids, masked_lm_weights) total_loss = masked_lm_loss tvars = tf.compat.v1.trainable_variables() use_multiple_checkpoint = is_multiple_checkpoint( train_config.checkpoint_type) initialized_variable_names, initialized_variable_names2, init_fn\ = align_checkpoint_for_lm(tvars, train_config.checkpoint_type, train_config.init_checkpoint, train_config.second_init_checkpoint, use_multiple_checkpoint) scaffold_fn = get_tpu_scaffold_or_init(init_fn, train_config.use_tpu) log_var_assignments(tvars, initialized_variable_names, initialized_variable_names2) output_spec = None if mode == tf.estimator.ModeKeys.PREDICT: predictions = { "input_ids": input_ids, "masked_lm_example_loss": masked_lm_example_loss, "instance_id": instance_id } output_spec = tf.compat.v1.estimator.tpu.TPUEstimatorSpec( mode=mode, loss=total_loss, predictions=predictions, scaffold_fn=scaffold_fn) return output_spec
def model_fn(features, labels, mode, params): # pylint: disable=unused-argument tf_logging.info("model_fn_apr_lm") """The `model_fn` for TPUEstimator.""" log_features(features) input_ids = features["input_ids"] input_mask = features["input_mask"] segment_ids = features["segment_ids"] if mode == tf.estimator.ModeKeys.PREDICT: tf.random.set_seed(0) seed = 0 else: seed = None tf_logging.info("Doing dynamic masking (random)") masked_input_ids, masked_lm_positions, masked_lm_ids, masked_lm_weights \ = random_masking(input_ids, input_mask, train_config.max_predictions_per_seq, MASK_ID, seed) is_training = (mode == tf.estimator.ModeKeys.TRAIN) tf_logging.info("Using masked_input_ids") model = APR( masked_input_ids, input_mask, segment_ids, is_training, train_config.use_one_hot_embeddings, bert_config, ssdr_config, dict_run_config.def_per_batch, dict_run_config.inner_batch_size, dict_run_config.max_def_length, # MainTransformer, # SecondTransformerEmbeddingLess, ) masked_lm_loss, masked_lm_example_loss, masked_lm_log_probs \ = get_masked_lm_output(bert_config, model.get_sequence_output(), model.get_embedding_table(), masked_lm_positions, masked_lm_ids, masked_lm_weights) loss = masked_lm_loss tvars = tf.compat.v1.trainable_variables() assignment_fn = dict_model_fn.get_bert_assignment_map_for_dict initialized_variable_names, init_fn = align_checkpoint_twice( tvars, train_config.init_checkpoint, assignment_fn) scaffold_fn = get_tpu_scaffold_or_init(init_fn, train_config.use_tpu) log_var_assignments(tvars, initialized_variable_names) TPUEstimatorSpec = tf.compat.v1.estimator.tpu.TPUEstimatorSpec if mode == tf.estimator.ModeKeys.TRAIN: if ssdr_config.compare_attrib_value_safe("use_two_lr", True): tf_logging.info("Using two lr for each parts") train_op = create_optimizer_with_separate_lr( loss, train_config) else: tf_logging.info("Using single lr ") train_op = optimization.create_optimizer_from_config( loss, train_config) output_spec = TPUEstimatorSpec(mode=mode, loss=loss, train_op=train_op, training_hooks=[OomReportingHook()], scaffold_fn=scaffold_fn) elif mode == tf.estimator.ModeKeys.EVAL: eval_metrics = (metric_fn_lm, [ masked_lm_example_loss, masked_lm_log_probs, masked_lm_ids, masked_lm_weights, ]) output_spec = TPUEstimatorSpec(mode=mode, loss=loss, eval_metrics=eval_metrics, scaffold_fn=scaffold_fn) else: predictions = { "input_ids": input_ids, "masked_input_ids": masked_input_ids, "masked_lm_ids": masked_lm_ids, "masked_lm_example_loss": masked_lm_example_loss, "masked_lm_positions": masked_lm_positions, } output_spec = TPUEstimatorSpec(mode=mode, loss=loss, predictions=predictions, scaffold_fn=scaffold_fn) return output_spec
def model_fn(features, labels, mode, params): # pylint: disable=unused-argument """The `model_fn` for TPUEstimator.""" logging.info("*** Features ***") for name in sorted(features.keys()): logging.info(" name = %s, shape = %s" % (name, features[name].shape)) input_ids = features["input_ids"] input_mask = features["input_mask"] segment_ids = features["segment_ids"] next_sentence_labels = features["next_sentence_labels"] seed = 0 threshold = 1e-2 logging.info("Doing All Masking") masked_input_ids, masked_lm_positions, masked_lm_ids, masked_lm_weights \ = random_masking(input_ids, input_mask, train_config.max_predictions_per_seq, MASK_ID, seed) is_training = (mode == tf.estimator.ModeKeys.TRAIN) prefix1 = "MaybeBERT" prefix2 = "MaybeNLI" with tf.compat.v1.variable_scope(prefix1): model = BertModel( config=bert_config, is_training=is_training, input_ids=input_ids, input_mask=input_mask, token_type_ids=segment_ids, use_one_hot_embeddings=train_config.use_one_hot_embeddings, ) (masked_lm_loss, masked_lm_example_loss1, masked_lm_log_probs2) = get_masked_lm_output( bert_config, model.get_sequence_output(), model.get_embedding_table(), masked_lm_positions, masked_lm_ids, masked_lm_weights) all_layers1 = model.get_all_encoder_layers() with tf.compat.v1.variable_scope(prefix2): model = BertModel( config=bert_config, is_training=is_training, input_ids=input_ids, input_mask=input_mask, token_type_ids=segment_ids, use_one_hot_embeddings=train_config.use_one_hot_embeddings, ) all_layers2 = model.get_all_encoder_layers() preserved_infos = [] for a_layer, b_layer in zip(all_layers1, all_layers2): layer_diff = a_layer - b_layer is_preserved = tf.less(tf.abs(layer_diff), threshold) preserved_infos.append(is_preserved) t = tf.cast(preserved_infos[1], dtype=tf.int32) #[batch_size, seq_len, dims] layer_1_count = tf.reduce_sum(t, axis=2) tvars = tf.compat.v1.trainable_variables() initialized_variable_names, init_fn = get_init_fn_for_two_checkpoints(train_config, tvars, train_config.init_checkpoint, prefix1, train_config.second_init_checkpoint, prefix2) scaffold_fn = get_tpu_scaffold_or_init(init_fn, train_config.use_tpu) log_var_assignments(tvars, initialized_variable_names) output_spec = None if mode == tf.estimator.ModeKeys.PREDICT: predictions = { "input_ids": input_ids, "layer_count": layer_1_count } output_spec = tf.compat.v1.estimator.tpu.TPUEstimatorSpec( mode=mode, loss=None, predictions=predictions, scaffold_fn=scaffold_fn) return output_spec
def model_fn(features, labels, mode, params): # pylint: disable=unused-argument """The `model_fn` for TPUEstimator.""" logging.info("*** Features ***") for name in sorted(features.keys()): logging.info(" name = %s, shape = %s" % (name, features[name].shape)) input_ids = features["input_ids"] input_mask = features["input_mask"] segment_ids = features["segment_ids"] next_sentence_labels = features["next_sentence_labels"] n_trial = 25 logging.info("Doing All Masking") masked_input_ids, masked_lm_positions, masked_lm_ids, masked_lm_weights \ = planned_masking(input_ids, input_mask, train_config.max_predictions_per_seq, MASK_ID, n_trial) is_training = (mode == tf.estimator.ModeKeys.TRAIN) repeat_input_mask = tf.tile(input_mask, [n_trial, 1]) repeat_segment_ids = tf.tile(segment_ids, [n_trial, 1]) prefix1 = "MaybeBERT" prefix2 = "MaybeBFN" with tf.compat.v1.variable_scope(prefix1): model = BertModel( config=bert_config, is_training=is_training, input_ids=masked_input_ids, input_mask=repeat_input_mask, token_type_ids=repeat_segment_ids, use_one_hot_embeddings=train_config.use_one_hot_embeddings, ) (masked_lm_loss, masked_lm_example_loss1, masked_lm_log_probs2) = get_masked_lm_output( bert_config, model.get_sequence_output(), model.get_embedding_table(), masked_lm_positions, masked_lm_ids, masked_lm_weights) with tf.compat.v1.variable_scope(prefix2): model = BertModel( config=bert_config, is_training=is_training, input_ids=masked_input_ids, input_mask=repeat_input_mask, token_type_ids=repeat_segment_ids, use_one_hot_embeddings=train_config.use_one_hot_embeddings, ) (masked_lm_loss, masked_lm_example_loss2, masked_lm_log_probs2) = get_masked_lm_output( bert_config, model.get_sequence_output(), model.get_embedding_table(), masked_lm_positions, masked_lm_ids, masked_lm_weights) n_mask = train_config.max_predictions_per_seq def reform(t): t = tf.reshape(t, [n_trial, -1, n_mask]) t = tf.transpose(t, [1, 0, 2]) return t grouped_positions = reform(masked_lm_positions) grouped_loss1 = reform(masked_lm_example_loss1) grouped_loss2 = reform(masked_lm_example_loss2) tvars = tf.compat.v1.trainable_variables() scaffold_fn = None initialized_variable_names, init_fn = get_init_fn_for_two_checkpoints( train_config, tvars, train_config.init_checkpoint, prefix1, train_config.second_init_checkpoint, prefix2) if train_config.use_tpu: def tpu_scaffold(): init_fn() return tf.compat.v1.train.Scaffold() scaffold_fn = tpu_scaffold else: init_fn() log_var_assignments(tvars, initialized_variable_names) output_spec = None if mode == tf.estimator.ModeKeys.PREDICT: predictions = { "input_ids": input_ids, "input_mask": input_mask, "segment_ids": segment_ids, "grouped_positions": grouped_positions, "grouped_loss1": grouped_loss1, "grouped_loss2": grouped_loss2, } output_spec = tf.compat.v1.estimator.tpu.TPUEstimatorSpec( mode=mode, loss=None, predictions=predictions, scaffold_fn=scaffold_fn) return output_spec
def model_fn(features, labels, mode, params): # pylint: disable=unused-argument tf_logging.info("model_fn_nli_lm") """The `model_fn` for TPUEstimator.""" log_features(features) input_ids = features["input_ids"] # [batch_size, seq_length] input_mask = features["input_mask"] segment_ids = features["segment_ids"] batch_size, seq_max = get_shape_list2(input_ids) if "nli_input_ids" in features: nli_input_ids = features[ "nli_input_ids"] # [batch_size, seq_length] nli_input_mask = features["nli_input_mask"] nli_segment_ids = features["nli_segment_ids"] else: nli_input_ids = input_ids nli_input_mask = input_mask nli_segment_ids = segment_ids features["label_ids"] = tf.ones([batch_size], tf.int32) if mode == tf.estimator.ModeKeys.PREDICT: tf.random.set_seed(0) seed = 0 else: seed = None is_training = (mode == tf.estimator.ModeKeys.TRAIN) tf_logging.info("Doing dynamic masking (random)") masked_input_ids, masked_lm_positions, masked_lm_ids, masked_lm_weights \ = random_masking(input_ids, input_mask, train_config.max_predictions_per_seq, MASK_ID, seed) sharing_model = sharing_model_factory( config, train_config.use_one_hot_embeddings, is_training, masked_input_ids, input_mask, segment_ids, nli_input_ids, nli_input_mask, nli_segment_ids) sequence_output_lm = sharing_model.lm_sequence_output() nli_feature = sharing_model.get_tt_feature() masked_lm_loss, masked_lm_example_loss, masked_lm_log_probs \ = get_masked_lm_output(config, sequence_output_lm, sharing_model.get_embedding_table(), masked_lm_positions, masked_lm_ids, masked_lm_weights) masked_lm_log_probs = tf.reshape(masked_lm_log_probs, [batch_size, -1]) masked_lm_per_inst_loss = tf.reshape(masked_lm_example_loss, [batch_size, -1]) task = Classification(3, features, nli_feature, is_training) nli_loss = task.loss task_prob = tf.nn.softmax(task.logits, axis=-1) arg_like = task_prob[:, 1] + task_prob[:, 2] vars = sharing_model.model.all_layer_outputs grads_1 = tf.gradients(ys=masked_lm_loss, xs=vars) # List[ batch_szie, grads_2 = tf.gradients(ys=arg_like, xs=vars) l = [] for g1, g2 in zip(grads_1, grads_2): if g1 is not None and g2 is not None: a = tf.reshape(g1, [batch_size * 2, seq_max, -1])[:batch_size] a = a / masked_lm_per_inst_loss b = tf.reshape(g2, [batch_size * 2, seq_max, -1])[batch_size:] l.append(tf.abs(a * b)) h_overlap = tf.stack(l, axis=1) h_overlap = tf.reduce_sum(h_overlap, axis=2) loss = combine_loss_fn(masked_lm_loss, nli_loss) tvars = tf.compat.v1.trainable_variables() assignment_fn = get_bert_assignment_map initialized_variable_names, init_fn = get_init_fn( tvars, train_config.init_checkpoint, assignment_fn) scaffold_fn = get_tpu_scaffold_or_init(init_fn, train_config.use_tpu) log_var_assignments(tvars, initialized_variable_names) TPUEstimatorSpec = tf.compat.v1.estimator.tpu.TPUEstimatorSpec if mode == tf.estimator.ModeKeys.TRAIN: train_op = optimization.create_optimizer_from_config( loss, train_config) output_spec = TPUEstimatorSpec(mode=mode, loss=loss, train_op=train_op, scaffold_fn=scaffold_fn) elif mode == tf.estimator.ModeKeys.EVAL: eval_metrics = (metric_fn_lm, [ masked_lm_example_loss, masked_lm_log_probs, masked_lm_ids, masked_lm_weights, ]) output_spec = TPUEstimatorSpec(mode=mode, loss=loss, eval_metrics=eval_metrics, scaffold_fn=scaffold_fn) else: predictions = { "input_ids": input_ids, "masked_input_ids": masked_input_ids, "masked_lm_ids": masked_lm_ids, "masked_lm_example_loss": masked_lm_example_loss, "masked_lm_positions": masked_lm_positions, "masked_lm_log_probs": masked_lm_log_probs, "h_overlap": h_overlap, } output_spec = TPUEstimatorSpec(mode=mode, predictions=predictions, scaffold_fn=scaffold_fn) return output_spec
def model_fn(features, labels, mode, params): # pylint: disable=unused-argument tf_logging.info("*** Features ***") for name in sorted(features.keys()): tf_logging.info(" name = %s, shape = %s" % (name, features[name].shape)) input_ids = features["input_ids"] input_mask = features["input_mask"] segment_ids = features["segment_ids"] if "next_sentence_labels" in features: next_sentence_labels = features["next_sentence_labels"] else: next_sentence_labels = get_dummy_next_sentence_labels(input_ids) tlm_prefix = "target_task" with tf.compat.v1.variable_scope(tlm_prefix): priority_score = tf.stop_gradient(priority_model(features)) priority_score = priority_score * target_model_config.amp masked_input_ids, masked_lm_positions, masked_lm_ids, masked_lm_weights\ = biased_masking(input_ids, input_mask, priority_score, target_model_config.alpha, train_config.max_predictions_per_seq, MASK_ID) is_training = (mode == tf.estimator.ModeKeys.TRAIN) model = model_class( config=bert_config, is_training=is_training, input_ids=masked_input_ids, input_mask=input_mask, token_type_ids=segment_ids, use_one_hot_embeddings=train_config.use_one_hot_embeddings, ) (masked_lm_loss, masked_lm_example_loss, masked_lm_log_probs) = get_masked_lm_output( bert_config, model.get_sequence_output(), model.get_embedding_table(), masked_lm_positions, masked_lm_ids, masked_lm_weights) (next_sentence_loss, next_sentence_example_loss, next_sentence_log_probs) = get_next_sentence_output( bert_config, model.get_pooled_output(), next_sentence_labels) total_loss = masked_lm_loss + next_sentence_loss all_vars = tf.compat.v1.all_variables() tf_logging.info("We assume priority model is from v2") if train_config.checkpoint_type == "v2": assignment_map, initialized_variable_names = assignment_map_v2_to_v2( all_vars, train_config.init_checkpoint) assignment_map2, initialized_variable_names2 = get_assignment_map_remap_from_v2( all_vars, tlm_prefix, train_config.second_init_checkpoint) else: assignment_map, assignment_map2, initialized_variable_names \ = get_tlm_assignment_map_v2(all_vars, tlm_prefix, train_config.init_checkpoint, train_config.second_init_checkpoint) initialized_variable_names2 = None def init_fn(): if train_config.init_checkpoint: tf.compat.v1.train.init_from_checkpoint( train_config.init_checkpoint, assignment_map) if train_config.second_init_checkpoint: tf.compat.v1.train.init_from_checkpoint( train_config.second_init_checkpoint, assignment_map2) scaffold_fn = get_tpu_scaffold_or_init(init_fn, train_config.use_tpu) tvars = [v for v in all_vars if not v.name.startswith(tlm_prefix)] log_var_assignments(tvars, initialized_variable_names, initialized_variable_names2) output_spec = None if mode == tf.estimator.ModeKeys.TRAIN: train_op = optimization.create_optimizer_from_config( total_loss, train_config, tvars) output_spec = tf.compat.v1.estimator.tpu.TPUEstimatorSpec( mode=mode, loss=total_loss, train_op=train_op, scaffold_fn=scaffold_fn) elif mode == tf.estimator.ModeKeys.EVAL: eval_metrics = (metric_fn, [ masked_lm_example_loss, masked_lm_log_probs, masked_lm_ids, masked_lm_weights, next_sentence_example_loss, next_sentence_log_probs, next_sentence_labels ]) output_spec = tf.compat.v1.estimator.tpu.TPUEstimatorSpec( mode=mode, loss=total_loss, eval_metrics=eval_metrics, scaffold_fn=scaffold_fn) else: predictions = { "input_ids": input_ids, "masked_input_ids": masked_input_ids, "priority_score": priority_score, "lm_loss1": features["loss1"], "lm_loss2": features["loss2"], } output_spec = tf.compat.v1.estimator.tpu.TPUEstimatorSpec( mode=mode, loss=total_loss, predictions=predictions, scaffold_fn=scaffold_fn) return output_spec
def model_fn(features, labels, mode, params): # pylint: disable=unused-argument tf_logging.info("model_fn_nli_lm") """The `model_fn` for TPUEstimator.""" log_features(features) input_ids = features["input_ids"] # [batch_size, seq_length] input_mask = features["input_mask"] segment_ids = features["segment_ids"] batch_size, _ = get_shape_list2(input_ids) if "nli_input_ids" in features: nli_input_ids = features[ "nli_input_ids"] # [batch_size, seq_length] nli_input_mask = features["nli_input_mask"] nli_segment_ids = features["nli_segment_ids"] else: nli_input_ids = input_ids nli_input_mask = input_mask nli_segment_ids = segment_ids features["label_ids"] = tf.ones([batch_size], tf.int32) if mode == tf.estimator.ModeKeys.PREDICT: tf.random.set_seed(0) seed = 0 else: seed = None is_training = (mode == tf.estimator.ModeKeys.TRAIN) tf_logging.info("Doing dynamic masking (random)") masked_input_ids, masked_lm_positions, masked_lm_ids, masked_lm_weights \ = random_masking(input_ids, input_mask, train_config.max_predictions_per_seq, MASK_ID, seed) sharing_model = sharing_model_factory( config, train_config.use_one_hot_embeddings, is_training, masked_input_ids, input_mask, segment_ids, nli_input_ids, nli_input_mask, nli_segment_ids) sequence_output_lm = sharing_model.lm_sequence_output() nli_feature = sharing_model.get_tt_feature() masked_lm_loss, masked_lm_example_loss, masked_lm_log_probs \ = get_masked_lm_output(config, sequence_output_lm, sharing_model.get_embedding_table(), masked_lm_positions, masked_lm_ids, masked_lm_weights) masked_lm_log_probs = tf.reshape(masked_lm_log_probs, [batch_size, -1]) top_guess = masked_lm_log_probs task = Classification(3, features, nli_feature, is_training) nli_loss = task.loss overlap_score = shared_gradient_fine_grained( masked_lm_example_loss, task.logits, train_config.max_predictions_per_seq) loss = combine_loss_fn(masked_lm_loss, nli_loss) tvars = tf.compat.v1.trainable_variables() assignment_fn = get_bert_assignment_map initialized_variable_names, init_fn = get_init_fn( tvars, train_config.init_checkpoint, assignment_fn) scaffold_fn = get_tpu_scaffold_or_init(init_fn, train_config.use_tpu) log_var_assignments(tvars, initialized_variable_names) TPUEstimatorSpec = tf.compat.v1.estimator.tpu.TPUEstimatorSpec if mode == tf.estimator.ModeKeys.TRAIN: train_op = optimization.create_optimizer_from_config( loss, train_config) output_spec = TPUEstimatorSpec(mode=mode, loss=loss, train_op=train_op, scaffold_fn=scaffold_fn) elif mode == tf.estimator.ModeKeys.EVAL: eval_metrics = (metric_fn_lm, [ masked_lm_example_loss, masked_lm_log_probs, masked_lm_ids, masked_lm_weights, ]) output_spec = TPUEstimatorSpec(mode=mode, loss=loss, eval_metrics=eval_metrics, scaffold_fn=scaffold_fn) else: predictions = { "input_ids": input_ids, "masked_input_ids": masked_input_ids, "masked_lm_ids": masked_lm_ids, "masked_lm_example_loss": masked_lm_example_loss, "masked_lm_positions": masked_lm_positions, "masked_lm_log_probs": masked_lm_log_probs, "overlap_score": overlap_score, "top_guess": top_guess, } output_spec = TPUEstimatorSpec(mode=mode, predictions=predictions, scaffold_fn=scaffold_fn) return output_spec
def model_fn(features, labels, mode, params): # pylint: disable=unused-argument """The `model_fn` for TPUEstimator.""" logging.info("*** Features ***") for name in sorted(features.keys()): logging.info(" name = %s, shape = %s" % (name, features[name].shape)) input_ids = features["input_ids"] input_mask = features["input_mask"] segment_ids = features["segment_ids"] d_input_ids = features["d_input_ids"] d_input_mask = features["d_input_mask"] d_location_ids = features["d_location_ids"] next_sentence_labels = features["next_sentence_labels"] if dict_run_config.prediction_op == "loss": seed = 0 else: seed = None if dict_run_config.prediction_op == "loss_fixed_mask" or train_config.fixed_mask: masked_input_ids = input_ids masked_lm_positions = features["masked_lm_positions"] masked_lm_ids = features["masked_lm_ids"] masked_lm_weights = tf.ones_like(masked_lm_positions, dtype=tf.float32) else: masked_input_ids, masked_lm_positions, masked_lm_ids, masked_lm_weights \ = random_masking(input_ids, input_mask, train_config.max_predictions_per_seq, MASK_ID, seed) if dict_run_config.use_d_segment_ids: d_segment_ids = features["d_segment_ids"] else: d_segment_ids = None is_training = (mode == tf.estimator.ModeKeys.TRAIN) model = model_class( config=bert_config, d_config=dbert_config, is_training=is_training, input_ids=masked_input_ids, input_mask=input_mask, d_input_ids=d_input_ids, d_input_mask=d_input_mask, d_location_ids=d_location_ids, use_target_pos_emb=dict_run_config.use_target_pos_emb, token_type_ids=segment_ids, use_one_hot_embeddings=train_config.use_one_hot_embeddings, d_segment_ids=d_segment_ids, pool_dict_output=dict_run_config.pool_dict_output, ) (masked_lm_loss, masked_lm_example_loss, masked_lm_log_probs) = get_masked_lm_output( bert_config, model.get_sequence_output(), model.get_embedding_table(), masked_lm_positions, masked_lm_ids, masked_lm_weights) (next_sentence_loss, next_sentence_example_loss, next_sentence_log_probs) = get_next_sentence_output( bert_config, model.get_pooled_output(), next_sentence_labels) total_loss = masked_lm_loss if dict_run_config.train_op == "entry_prediction": score_label = features["useful_entry"] # [batch, 1] score_label = tf.reshape(score_label, [-1]) entry_logits = bert_common.dense(2, bert_common.create_initializer(bert_config.initializer_range))\ (model.get_dict_pooled_output()) print("entry_logits: ", entry_logits.shape) losses = tf.nn.sparse_softmax_cross_entropy_with_logits(logits=entry_logits, labels=score_label) loss = tf.reduce_mean(losses) total_loss = loss if dict_run_config.train_op == "lookup": lookup_idx = features["lookup_idx"] lookup_loss, lookup_example_loss, lookup_score = \ sequence_index_prediction(bert_config, lookup_idx, model.get_sequence_output()) total_loss += lookup_loss tvars = tf.compat.v1.trainable_variables() init_vars = {} scaffold_fn = None if train_config.init_checkpoint: if dict_run_config.is_bert_checkpoint: map1, map2, init_vars = get_bert_assignment_map_for_dict(tvars, train_config.init_checkpoint) def load_fn(): tf.compat.v1.train.init_from_checkpoint(train_config.init_checkpoint, map1) tf.compat.v1.train.init_from_checkpoint(train_config.init_checkpoint, map2) else: map1, init_vars = get_assignment_map_as_is(tvars, train_config.init_checkpoint) def load_fn(): tf.compat.v1.train.init_from_checkpoint(train_config.init_checkpoint, map1) if train_config.use_tpu: def tpu_scaffold(): load_fn() return tf.compat.v1.train.Scaffold() scaffold_fn = tpu_scaffold else: load_fn() logging.info("**** Trainable Variables ****") for var in tvars: init_string = "" if var.name in init_vars: init_string = ", *INIT_FROM_CKPT*" logging.info(" name = %s, shape = %s%s", var.name, var.shape, init_string) logging.info("Total parameters : %d" % get_param_num()) output_spec = None if mode == tf.estimator.ModeKeys.TRAIN: if train_config.gradient_accumulation == 1: train_op = optimization.create_optimizer_from_config(total_loss, train_config) else: logging.info("Using gradient accumulation : %d" % train_config.gradient_accumulation) train_op = get_accumulated_optimizer_from_config(total_loss, train_config, tvars, train_config.gradient_accumulation) output_spec = tf.compat.v1.estimator.tpu.TPUEstimatorSpec( mode=mode, loss=total_loss, train_op=train_op, scaffold_fn=scaffold_fn) elif mode == tf.estimator.ModeKeys.EVAL: eval_metrics = (metric_fn, [ masked_lm_example_loss, masked_lm_log_probs, masked_lm_ids, masked_lm_weights, next_sentence_example_loss, next_sentence_log_probs, next_sentence_labels ]) output_spec = tf.compat.v1.estimator.tpu.TPUEstimatorSpec( mode=mode, loss=total_loss, eval_metrics=eval_metrics, scaffold_fn=scaffold_fn) else: if dict_run_config.prediction_op == "gradient": logging.info("Fetching gradient") gradient = get_gradients(model, masked_lm_log_probs, train_config.max_predictions_per_seq, bert_config.vocab_size) predictions = { "masked_input_ids": masked_input_ids, #"input_ids": input_ids, "d_input_ids": d_input_ids, "masked_lm_positions": masked_lm_positions, "gradients": gradient, } elif dict_run_config.prediction_op == "loss" or dict_run_config.prediction_op == "loss_fixed_mask": logging.info("Fetching loss") predictions = { "masked_lm_example_loss": masked_lm_example_loss, } else: raise Exception("prediction target not specified") output_spec = tf.compat.v1.estimator.tpu.TPUEstimatorSpec( mode=mode, loss=total_loss, predictions=predictions, scaffold_fn=scaffold_fn) return output_spec
def model_fn(features, labels, mode, params): # pylint: disable=unused-argument log_features(features) input_ids = features["input_ids"] input_mask = features["input_mask"] segment_ids = features["segment_ids"] next_sentence_labels = features["next_sentence_labels"] masked_input_ids, masked_lm_positions, masked_lm_ids, masked_lm_weights \ = random_masking(input_ids, input_mask, train_config.max_predictions_per_seq, MASK_ID) is_training = (mode == tf.estimator.ModeKeys.TRAIN) prefix1 = "MaybeBERT" prefix2 = "MaybeBFN" with tf.compat.v1.variable_scope(prefix1): model1 = BertModel( config=bert_config, is_training=is_training, input_ids=masked_input_ids, input_mask=input_mask, token_type_ids=segment_ids, use_one_hot_embeddings=train_config.use_one_hot_embeddings, ) (masked_lm_loss, masked_lm_example_loss1, masked_lm_log_probs1) = get_masked_lm_output( bert_config, model1.get_sequence_output(), model1.get_embedding_table(), masked_lm_positions, masked_lm_ids, masked_lm_weights) masked_lm_example_loss1 = tf.reshape(masked_lm_example_loss1, masked_lm_ids.shape) with tf.compat.v1.variable_scope(prefix2): model2 = BertModel( config=bert_config, is_training=is_training, input_ids=masked_input_ids, input_mask=input_mask, token_type_ids=segment_ids, use_one_hot_embeddings=train_config.use_one_hot_embeddings, ) (masked_lm_loss, masked_lm_example_loss2, masked_lm_log_probs2) = get_masked_lm_output( bert_config, model2.get_sequence_output(), model2.get_embedding_table(), masked_lm_positions, masked_lm_ids, masked_lm_weights) print(model2.get_sequence_output().shape) masked_lm_example_loss2 = tf.reshape(masked_lm_example_loss2, masked_lm_ids.shape) model = model_class( config=bert_config, is_training=is_training, input_ids=input_ids, input_mask=input_mask, token_type_ids=segment_ids, use_one_hot_embeddings=train_config.use_one_hot_embeddings, ) loss_model = IndependentLossModel(bert_config) loss_model.train_modeling(model.get_sequence_output(), masked_lm_positions, masked_lm_weights, tf.stop_gradient(masked_lm_example_loss1), tf.stop_gradient(masked_lm_example_loss2)) total_loss = loss_model.total_loss loss1 = loss_model.loss1 loss2 = loss_model.loss2 per_example_loss1 = loss_model.per_example_loss1 per_example_loss2 = loss_model.per_example_loss2 losses1 = tf.reduce_sum(per_example_loss1, axis=1) losses2 = tf.reduce_sum(per_example_loss2, axis=1) prob1 = loss_model.prob1 prob2 = loss_model.prob2 checkpoint2_1, checkpoint2_2 = train_config.second_init_checkpoint.split( ",") tvars = tf.compat.v1.trainable_variables() initialized_variable_names_1, init_fn_1 = get_init_fn_for_two_checkpoints( train_config, tvars, checkpoint2_1, prefix1, checkpoint2_2, prefix2) assignment_fn = get_bert_assignment_map assignment_map2, initialized_variable_names_2 = assignment_fn( tvars, train_config.init_checkpoint) initialized_variable_names = {} initialized_variable_names.update(initialized_variable_names_1) initialized_variable_names.update(initialized_variable_names_2) def init_fn(): init_fn_1() tf.compat.v1.train.init_from_checkpoint( train_config.init_checkpoint, assignment_map2) scaffold_fn = get_tpu_scaffold_or_init(init_fn, train_config.use_tpu) log_var_assignments(tvars, initialized_variable_names) if mode == tf.estimator.ModeKeys.TRAIN: train_op = optimization.create_optimizer_from_config( total_loss, train_config) output_spec = tf.compat.v1.estimator.tpu.TPUEstimatorSpec( mode=mode, loss=total_loss, train_op=train_op, scaffold_fn=scaffold_fn) elif mode == tf.estimator.ModeKeys.EVAL: def metric_fn(per_example_loss1, per_example_loss2): loss1 = tf.compat.v1.metrics.mean(values=per_example_loss1) loss2 = tf.compat.v1.metrics.mean(values=per_example_loss2) return { "loss1": loss1, "loss2": loss2, } eval_metrics = (metric_fn, [losses1, losses2]) output_spec = tf.compat.v1.estimator.tpu.TPUEstimatorSpec( mode=mode, loss=total_loss, eval_metrics=eval_metrics, scaffold_fn=scaffold_fn) else: predictions = { "prob1": prob1, "prob2": prob2, "per_example_loss1": per_example_loss1, "per_example_loss2": per_example_loss2, "input_ids": input_ids, "masked_lm_positions": masked_lm_positions, } output_spec = tf.compat.v1.estimator.tpu.TPUEstimatorSpec( mode=mode, loss=total_loss, predictions=predictions, scaffold_fn=scaffold_fn) return output_spec
def model_fn(features, labels, mode, params): # pylint: disable=unused-argument tf_logging.info("model_fn_apr_lm") """The `model_fn` for TPUEstimator.""" log_features(features) raw_input_ids = features["input_ids"] # [batch_size, seq_length] raw_input_mask = features["input_mask"] raw_segment_ids = features["segment_ids"] word_tokens = features["word"] word_input_mask = tf.cast(tf.not_equal(word_tokens, 0), tf.int32) word_segment_ids = tf.ones_like(word_tokens, tf.int32) if mode == tf.estimator.ModeKeys.PREDICT: tf.random.set_seed(0) seed = 0 else: seed = None input_ids = tf.concat([word_tokens, raw_input_ids], axis=1) input_mask = tf.concat([word_input_mask, raw_input_mask], axis=1) segment_ids = tf.concat([word_segment_ids, raw_segment_ids], axis=1) is_training = (mode == tf.estimator.ModeKeys.TRAIN) tf_logging.info("Using masked_input_ids") masked_input_ids, masked_lm_positions, masked_lm_ids, masked_lm_weights \ = random_masking(input_ids, input_mask, train_config.max_predictions_per_seq, MASK_ID, seed) model = BertModel( config=config, is_training=is_training, input_ids=masked_input_ids, input_mask=input_mask, token_type_ids=segment_ids, use_one_hot_embeddings=train_config.use_one_hot_embeddings, ) (masked_lm_loss, masked_lm_example_loss, masked_lm_log_probs) = get_masked_lm_output( config, model.get_sequence_output(), model.get_embedding_table(), masked_lm_positions, masked_lm_ids, masked_lm_weights) loss = masked_lm_loss tvars = tf.compat.v1.trainable_variables() assignment_fn = tlm.training.assignment_map.get_bert_assignment_map initialized_variable_names, init_fn = get_init_fn( tvars, train_config.init_checkpoint, assignment_fn) scaffold_fn = get_tpu_scaffold_or_init(init_fn, train_config.use_tpu) log_var_assignments(tvars, initialized_variable_names) TPUEstimatorSpec = tf.compat.v1.estimator.tpu.TPUEstimatorSpec if mode == tf.estimator.ModeKeys.TRAIN: tf_logging.info("Using single lr ") train_op = optimization.create_optimizer_from_config( loss, train_config) output_spec = TPUEstimatorSpec(mode=mode, loss=loss, train_op=train_op, scaffold_fn=scaffold_fn) elif mode == tf.estimator.ModeKeys.EVAL: eval_metrics = (metric_fn_lm, [ masked_lm_example_loss, masked_lm_log_probs, masked_lm_ids, masked_lm_weights, ]) output_spec = TPUEstimatorSpec(mode=mode, loss=loss, eval_metrics=eval_metrics, scaffold_fn=scaffold_fn) else: predictions = { "input_ids": input_ids, "masked_input_ids": masked_input_ids, "masked_lm_ids": masked_lm_ids, "masked_lm_example_loss": masked_lm_example_loss, "masked_lm_positions": masked_lm_positions } output_spec = TPUEstimatorSpec(mode=mode, loss=loss, predictions=predictions, scaffold_fn=scaffold_fn) return output_spec
def model_fn(features, labels, mode, params): # pylint: disable=unused-argument tf_logging.info("model_fn_sero_lm") """The `model_fn` for TPUEstimator.""" log_features(features) input_ids = features["input_ids"] # [batch_size, seq_length] input_mask = features["input_mask"] segment_ids = features["segment_ids"] is_sero_modeling = "sero" in modeling if is_sero_modeling: use_context = features["use_context"] elif modeling == "bert": batch_size, _ = get_shape_list(input_mask) use_context = tf.ones([batch_size, 1], tf.int32) else: assert False if mode == tf.estimator.ModeKeys.PREDICT: tf.random.set_seed(0) seed = 0 else: seed = None is_training = (mode == tf.estimator.ModeKeys.TRAIN) tf_logging.info("Using masked_input_ids") if is_sero_modeling: stacked_input_ids, stacked_input_mask, stacked_segment_ids, \ = split_and_append_sep(input_ids, input_mask, segment_ids, config.total_sequence_length, config.window_size, CLS_ID, EOW_ID) input_ids_2d = r3to2(stacked_input_ids) input_mask_2d = r3to2(stacked_input_mask) elif modeling == "bert": stacked_input_ids, stacked_input_mask, stacked_segment_ids = input_ids, input_mask, segment_ids input_ids_2d = stacked_input_ids input_mask_2d = stacked_input_mask else: assert False tf_logging.info("Doing dynamic masking (random)") # TODO make stacked_input_ids 2D and recover masked_input_ids_2d, masked_lm_positions_2d, masked_lm_ids_2d, masked_lm_weights_2d \ = random_masking(input_ids_2d, input_mask_2d, train_config.max_predictions_per_seq, MASK_ID, seed, [EOW_ID]) if is_sero_modeling: masked_input_ids = tf.reshape(masked_input_ids_2d, stacked_input_ids.shape) elif modeling == "bert": masked_input_ids = tf.expand_dims(masked_input_ids_2d, 1) stacked_input_mask = tf.expand_dims(stacked_input_mask, 1) stacked_segment_ids = tf.expand_dims(stacked_segment_ids, 1) else: assert False if modeling == "sero": model_class = SeroDelta elif modeling == "sero_epsilon": model_class = SeroEpsilon with tf.compat.v1.variable_scope("sero"): model = model_class(config, is_training, train_config.use_one_hot_embeddings) sequence_output_3d = model.network_stacked(masked_input_ids, stacked_input_mask, stacked_segment_ids, use_context) masked_lm_loss, masked_lm_example_loss, masked_lm_log_probs \ = get_masked_lm_output(config, sequence_output_3d, model.get_embedding_table(), masked_lm_positions_2d, masked_lm_ids_2d, masked_lm_weights_2d) predictions = None if prediction_op == "gradient_to_long_context": predictions = {} for idx, input_tensor in enumerate(model.upper_module_inputs): g = tf.abs(tf.gradients(ys=masked_lm_loss, xs=input_tensor)[0]) main_g = g[:, :config.window_size, :] context_g = g[:, config.window_size:, :] main_g = tf.reduce_mean(tf.reduce_mean(main_g, axis=2), axis=1) context_g = tf.reduce_mean(tf.reduce_mean(context_g, axis=2), axis=1) predictions['main_g_{}'.format(idx)] = main_g predictions['context_g_{}'.format(idx)] = context_g loss = masked_lm_loss #+ bert_task.masked_lm_loss tvars = tf.compat.v1.trainable_variables() if train_config.init_checkpoint: assignment_fn = get_assignment_map_from_checkpoint_type( train_config.checkpoint_type, config.lower_layers) else: assignment_fn = None initialized_variable_names, init_fn = get_init_fn( tvars, train_config.init_checkpoint, assignment_fn) log_var_assignments(tvars, initialized_variable_names) scaffold_fn = get_tpu_scaffold_or_init(init_fn, train_config.use_tpu) TPUEstimatorSpec = tf.compat.v1.estimator.tpu.TPUEstimatorSpec if mode == tf.estimator.ModeKeys.TRAIN: train_op = optimization.create_optimizer_from_config( loss, train_config) output_spec = TPUEstimatorSpec(mode=mode, loss=loss, train_op=train_op, training_hooks=[OomReportingHook()], scaffold_fn=scaffold_fn) elif mode == tf.estimator.ModeKeys.EVAL: output_spec = TPUEstimatorSpec(mode=model, loss=loss, eval_metrics=None, scaffold_fn=scaffold_fn) else: if predictions is None: predictions = { "input_ids": input_ids, "masked_input_ids": masked_input_ids, "masked_lm_ids": masked_lm_ids_2d, "masked_lm_example_loss": masked_lm_example_loss, "masked_lm_positions": masked_lm_positions_2d, } output_spec = TPUEstimatorSpec(mode=mode, loss=loss, predictions=predictions, scaffold_fn=scaffold_fn) return output_spec