Compare commits
8
Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
1d87b37d10 | ||
|
|
f8fb4335c9 | ||
|
|
bebaa14039 | ||
|
|
2d5d86e037 | ||
|
|
af077b15e2 | ||
|
|
3268ebd229 | ||
|
|
6c5297a423 | ||
|
|
40255ab002 |
No files matched your search
@@ -119,10 +119,11 @@ def convert_pt_checkpoint_to_tf(model_type, pytorch_checkpoint_path, config_file
|
||||
tf_inputs = tf.constant(inputs_list)
|
||||
tfo = tf_model(tf_inputs, training=False) # build the network
|
||||
|
||||
pt_model = pt_model_class.from_pretrained(None,
|
||||
state_dict = torch.load(pytorch_checkpoint_path, map_location='cpu')
|
||||
pt_model = pt_model_class.from_pretrained(pretrained_model_name_or_path=None,
|
||||
config=config,
|
||||
state_dict=torch.load(pytorch_checkpoint_path,
|
||||
map_location='cpu'))
|
||||
state_dict=state_dict)
|
||||
|
||||
pt_inputs = torch.tensor(inputs_list)
|
||||
with torch.no_grad():
|
||||
pto = pt_model(pt_inputs)
|
||||
@@ -139,7 +140,7 @@ def convert_pt_checkpoint_to_tf(model_type, pytorch_checkpoint_path, config_file
|
||||
|
||||
|
||||
def convert_all_pt_checkpoints_to_tf(args_model_type, tf_dump_path, model_shortcut_names_or_path=None, config_shortcut_names_or_path=None,
|
||||
compare_with_pt_model=False, use_cached_models=False, only_convert_finetuned_models=False):
|
||||
compare_with_pt_model=False, use_cached_models=False, remove_cached_files=False, only_convert_finetuned_models=False):
|
||||
assert os.path.isdir(args.tf_dump_path), "--tf_dump_path should be a directory"
|
||||
|
||||
if args_model_type is None:
|
||||
@@ -187,13 +188,15 @@ def convert_all_pt_checkpoints_to_tf(args_model_type, tf_dump_path, model_shortc
|
||||
|
||||
if os.path.isfile(model_shortcut_name):
|
||||
model_shortcut_name = 'converted_model'
|
||||
|
||||
convert_pt_checkpoint_to_tf(model_type=model_type,
|
||||
pytorch_checkpoint_path=model_file,
|
||||
config_file=config_file,
|
||||
tf_dump_path=os.path.join(tf_dump_path, model_shortcut_name + '-tf_model.h5'),
|
||||
compare_with_pt_model=compare_with_pt_model)
|
||||
os.remove(config_file)
|
||||
os.remove(model_file)
|
||||
if remove_cached_files:
|
||||
os.remove(config_file)
|
||||
os.remove(model_file)
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
@@ -226,6 +229,9 @@ if __name__ == "__main__":
|
||||
parser.add_argument("--use_cached_models",
|
||||
action='store_true',
|
||||
help = "Use cached models if possible instead of updating to latest checkpoint versions.")
|
||||
parser.add_argument("--remove_cached_files",
|
||||
action='store_true',
|
||||
help = "Remove pytorch models after conversion (save memory when converting in batches).")
|
||||
parser.add_argument("--only_convert_finetuned_models",
|
||||
action='store_true',
|
||||
help = "Only convert finetuned models.")
|
||||
@@ -245,4 +251,5 @@ if __name__ == "__main__":
|
||||
config_shortcut_names_or_path=[args.config_file] if args.config_file is not None else None,
|
||||
compare_with_pt_model=args.compare_with_pt_model,
|
||||
use_cached_models=args.use_cached_models,
|
||||
remove_cached_files=args.remove_cached_files,
|
||||
only_convert_finetuned_models=args.only_convert_finetuned_models)
|
||||
@@ -318,7 +318,8 @@ class PreTrainedModel(nn.Module):
|
||||
model = BertModel.from_pretrained('./tf_model/my_tf_checkpoint.ckpt.index', from_tf=True, config=config)
|
||||
|
||||
"""
|
||||
if "albert" in pretrained_model_name_or_path and "v2" in pretrained_model_name_or_path:
|
||||
if pretrained_model_name_or_path is not None and (
|
||||
"albert" in pretrained_model_name_or_path and "v2" in pretrained_model_name_or_path):
|
||||
logger.warning("There is currently an upstream reproducibility issue with ALBERT v2 models. Please see " +
|
||||
"https://github.com/google-research/google-research/issues/119 for more information.")
|
||||
|
||||
|
||||
@@ -233,80 +233,6 @@ class TFCommonTestCases:
|
||||
self.model_tester.seq_length,
|
||||
self.model_tester.key_len if hasattr(self.model_tester, 'key_len') else self.model_tester.seq_length])
|
||||
|
||||
def test_headmasking(self):
|
||||
pass
|
||||
# config, inputs_dict = self.model_tester.prepare_config_and_inputs_for_common()
|
||||
|
||||
# config.output_attentions = True
|
||||
# config.output_hidden_states = True
|
||||
# configs_no_init = _config_zero_init(config) # To be sure we have no Nan
|
||||
# for model_class in self.all_model_classes:
|
||||
# model = model_class(config=configs_no_init)
|
||||
# model.eval()
|
||||
|
||||
# # Prepare head_mask
|
||||
# # Set require_grad after having prepared the tensor to avoid error (leaf variable has been moved into the graph interior)
|
||||
# head_mask = torch.ones(self.model_tester.num_hidden_layers, self.model_tester.num_attention_heads)
|
||||
# head_mask[0, 0] = 0
|
||||
# head_mask[-1, :-1] = 0
|
||||
# head_mask.requires_grad_(requires_grad=True)
|
||||
# inputs = inputs_dict.copy()
|
||||
# inputs['head_mask'] = head_mask
|
||||
|
||||
# outputs = model(**inputs)
|
||||
|
||||
# # Test that we can get a gradient back for importance score computation
|
||||
# output = sum(t.sum() for t in outputs[0])
|
||||
# output = output.sum()
|
||||
# output.backward()
|
||||
# multihead_outputs = head_mask.grad
|
||||
|
||||
# attentions = outputs[-1]
|
||||
# hidden_states = outputs[-2]
|
||||
|
||||
# # Remove Nan
|
||||
|
||||
# self.assertIsNotNone(multihead_outputs)
|
||||
# self.assertEqual(len(multihead_outputs), self.model_tester.num_hidden_layers)
|
||||
# self.assertAlmostEqual(
|
||||
# attentions[0][..., 0, :, :].flatten().sum().item(), 0.0)
|
||||
# self.assertNotEqual(
|
||||
# attentions[0][..., -1, :, :].flatten().sum().item(), 0.0)
|
||||
# self.assertNotEqual(
|
||||
# attentions[1][..., 0, :, :].flatten().sum().item(), 0.0)
|
||||
# self.assertAlmostEqual(
|
||||
# attentions[-1][..., -2, :, :].flatten().sum().item(), 0.0)
|
||||
# self.assertNotEqual(
|
||||
# attentions[-1][..., -1, :, :].flatten().sum().item(), 0.0)
|
||||
|
||||
|
||||
def test_head_pruning(self):
|
||||
pass
|
||||
# if not self.test_pruning:
|
||||
# return
|
||||
|
||||
# config, inputs_dict = self.model_tester.prepare_config_and_inputs_for_common()
|
||||
|
||||
# for model_class in self.all_model_classes:
|
||||
# config.output_attentions = True
|
||||
# config.output_hidden_states = False
|
||||
# model = model_class(config=config)
|
||||
# model.eval()
|
||||
# heads_to_prune = {0: list(range(1, self.model_tester.num_attention_heads)),
|
||||
# -1: [0]}
|
||||
# model.prune_heads(heads_to_prune)
|
||||
# outputs = model(**inputs_dict)
|
||||
|
||||
# attentions = outputs[-1]
|
||||
|
||||
# self.assertEqual(
|
||||
# attentions[0].shape[-3], 1)
|
||||
# self.assertEqual(
|
||||
# attentions[1].shape[-3], self.model_tester.num_attention_heads)
|
||||
# self.assertEqual(
|
||||
# attentions[-1].shape[-3], self.model_tester.num_attention_heads - 1)
|
||||
|
||||
|
||||
def test_hidden_states_output(self):
|
||||
config, inputs_dict = self.model_tester.prepare_config_and_inputs_for_common()
|
||||
|
||||
@@ -323,43 +249,6 @@ class TFCommonTestCases:
|
||||
list(hidden_states[0].shape[-2:]),
|
||||
[self.model_tester.seq_length, self.model_tester.hidden_size])
|
||||
|
||||
|
||||
def test_resize_tokens_embeddings(self):
|
||||
pass
|
||||
# original_config, inputs_dict = self.model_tester.prepare_config_and_inputs_for_common()
|
||||
# if not self.test_resize_embeddings:
|
||||
# return
|
||||
|
||||
# for model_class in self.all_model_classes:
|
||||
# config = copy.deepcopy(original_config)
|
||||
# model = model_class(config)
|
||||
|
||||
# model_vocab_size = config.vocab_size
|
||||
# # Retrieve the embeddings and clone theme
|
||||
# model_embed = model.resize_token_embeddings(model_vocab_size)
|
||||
# cloned_embeddings = model_embed.weight.clone()
|
||||
|
||||
# # Check that resizing the token embeddings with a larger vocab size increases the model's vocab size
|
||||
# model_embed = model.resize_token_embeddings(model_vocab_size + 10)
|
||||
# self.assertEqual(model.config.vocab_size, model_vocab_size + 10)
|
||||
# # Check that it actually resizes the embeddings matrix
|
||||
# self.assertEqual(model_embed.weight.shape[0], cloned_embeddings.shape[0] + 10)
|
||||
|
||||
# # Check that resizing the token embeddings with a smaller vocab size decreases the model's vocab size
|
||||
# model_embed = model.resize_token_embeddings(model_vocab_size - 15)
|
||||
# self.assertEqual(model.config.vocab_size, model_vocab_size - 15)
|
||||
# # Check that it actually resizes the embeddings matrix
|
||||
# self.assertEqual(model_embed.weight.shape[0], cloned_embeddings.shape[0] - 15)
|
||||
|
||||
# # Check that adding and removing tokens has not modified the first part of the embedding matrix.
|
||||
# models_equal = True
|
||||
# for p1, p2 in zip(cloned_embeddings, model_embed.weight):
|
||||
# if p1.data.ne(p2.data).sum() > 0:
|
||||
# models_equal = False
|
||||
|
||||
# self.assertTrue(models_equal)
|
||||
|
||||
|
||||
def test_model_common_attributes(self):
|
||||
config, inputs_dict = self.model_tester.prepare_config_and_inputs_for_common()
|
||||
|
||||
@@ -369,40 +258,6 @@ class TFCommonTestCases:
|
||||
x = model.get_output_embeddings()
|
||||
assert x is None or isinstance(x, tf.keras.layers.Layer)
|
||||
|
||||
|
||||
def test_tie_model_weights(self):
|
||||
pass
|
||||
# config, inputs_dict = self.model_tester.prepare_config_and_inputs_for_common()
|
||||
|
||||
# def check_same_values(layer_1, layer_2):
|
||||
# equal = True
|
||||
# for p1, p2 in zip(layer_1.weight, layer_2.weight):
|
||||
# if p1.data.ne(p2.data).sum() > 0:
|
||||
# equal = False
|
||||
# return equal
|
||||
|
||||
# for model_class in self.all_model_classes:
|
||||
# if not hasattr(model_class, 'tie_weights'):
|
||||
# continue
|
||||
|
||||
# config.torchscript = True
|
||||
# model_not_tied = model_class(config)
|
||||
# params_not_tied = list(model_not_tied.parameters())
|
||||
|
||||
# config_tied = copy.deepcopy(config)
|
||||
# config_tied.torchscript = False
|
||||
# model_tied = model_class(config_tied)
|
||||
# params_tied = list(model_tied.parameters())
|
||||
|
||||
# # Check that the embedding layer and decoding layer are the same in size and in value
|
||||
# self.assertGreater(len(params_not_tied), len(params_tied))
|
||||
|
||||
# # Check that after resize they remain tied.
|
||||
# model_tied.resize_token_embeddings(config.vocab_size + 10)
|
||||
# params_tied_2 = list(model_tied.parameters())
|
||||
# self.assertGreater(len(params_not_tied), len(params_tied))
|
||||
# self.assertEqual(len(params_tied_2), len(params_tied))
|
||||
|
||||
def test_determinism(self):
|
||||
config, inputs_dict = self.model_tester.prepare_config_and_inputs_for_common()
|
||||
|
||||
@@ -461,29 +316,5 @@ def ids_tensor(shape, vocab_size, rng=None, name=None, dtype=None):
|
||||
return output
|
||||
|
||||
|
||||
class TFModelUtilsTest(unittest.TestCase):
|
||||
@pytest.mark.skipif('tensorflow' not in sys.modules, reason="requires TensorFlow")
|
||||
def test_model_from_pretrained(self):
|
||||
pass
|
||||
# logging.basicConfig(level=logging.INFO)
|
||||
# for model_name in list(BERT_PRETRAINED_MODEL_ARCHIVE_MAP.keys())[:1]:
|
||||
# config = BertConfig.from_pretrained(model_name)
|
||||
# self.assertIsNotNone(config)
|
||||
# self.assertIsInstance(config, PretrainedConfig)
|
||||
|
||||
# model = BertModel.from_pretrained(model_name)
|
||||
# model, loading_info = BertModel.from_pretrained(model_name, output_loading_info=True)
|
||||
# self.assertIsNotNone(model)
|
||||
# self.assertIsInstance(model, PreTrainedModel)
|
||||
# for value in loading_info.values():
|
||||
# self.assertEqual(len(value), 0)
|
||||
|
||||
# config = BertConfig.from_pretrained(model_name, output_attentions=True, output_hidden_states=True)
|
||||
# model = BertModel.from_pretrained(model_name, output_attentions=True, output_hidden_states=True)
|
||||
# self.assertEqual(model.config.output_attentions, True)
|
||||
# self.assertEqual(model.config.output_hidden_states, True)
|
||||
# self.assertEqual(model.config, config)
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
unittest.main()
|
||||
@@ -167,7 +167,7 @@ class XLNetModelTest(CommonTestCases.CommonModelTester):
|
||||
[[self.seq_length, self.batch_size, self.hidden_size]] * self.num_hidden_layers)
|
||||
|
||||
def create_and_check_xlnet_base_model_with_att_output(self, config, input_ids_1, input_ids_2, input_ids_q, perm_mask, input_mask,
|
||||
target_mapping, segment_ids, lm_labels, sequence_labels, is_impossible_labels):
|
||||
target_mapping, segment_ids, lm_labels, sequence_labels, is_impossible_labels, token_labels):
|
||||
model = XLNetModel(config)
|
||||
model.eval()
|
||||
|
||||
|
||||
@@ -66,7 +66,7 @@ class AlbertTokenizer(PreTrainedTokenizer):
|
||||
def __init__(self, vocab_file,
|
||||
do_lower_case=True, remove_space=True, keep_accents=False,
|
||||
bos_token="[CLS]", eos_token="[SEP]", unk_token="<unk>", sep_token="[SEP]",
|
||||
pad_token="<pad>", cls_token="[CLS]", mask_token="[MASK]>", **kwargs):
|
||||
pad_token="<pad>", cls_token="[CLS]", mask_token="[MASK]", **kwargs):
|
||||
super(AlbertTokenizer, self).__init__(bos_token=bos_token, eos_token=eos_token,
|
||||
unk_token=unk_token, sep_token=sep_token,
|
||||
pad_token=pad_token, cls_token=cls_token,
|
||||
|
||||
@@ -51,7 +51,7 @@ class CamembertTokenizer(PreTrainedTokenizer):
|
||||
|
||||
def __init__(self, vocab_file, bos_token="<s>", eos_token="</s>", sep_token="</s>",
|
||||
cls_token="<s>", unk_token="<unk>", pad_token='<pad>', mask_token='<mask>',
|
||||
additional_special_tokens=['<s>NOTUSED', '<s>NOTUSED'], **kwargs):
|
||||
additional_special_tokens=['<s>NOTUSED', '</s>NOTUSED'], **kwargs):
|
||||
super(CamembertTokenizer, self).__init__(max_len=512, bos_token=bos_token, eos_token=eos_token, unk_token=unk_token,
|
||||
sep_token=sep_token, cls_token=cls_token, pad_token=pad_token,
|
||||
mask_token=mask_token, additional_special_tokens=additional_special_tokens,
|
||||
@@ -125,7 +125,7 @@ class CamembertTokenizer(PreTrainedTokenizer):
|
||||
|
||||
@property
|
||||
def vocab_size(self):
|
||||
return self.fairseq_offset + len(self.sp_model)
|
||||
return len(self.fairseq_tokens_to_ids) + len(self.sp_model)
|
||||
|
||||
def _tokenize(self, text):
|
||||
return self.sp_model.EncodeAsPieces(text)
|
||||
@@ -134,6 +134,9 @@ class CamembertTokenizer(PreTrainedTokenizer):
|
||||
""" Converts a token (str/unicode) in an id using the vocab. """
|
||||
if token in self.fairseq_tokens_to_ids:
|
||||
return self.fairseq_tokens_to_ids[token]
|
||||
elif self.sp_model.PieceToId(token) == 0:
|
||||
# Convert sentence piece unk token to fairseq unk token index
|
||||
return self.unk_token_id
|
||||
return self.fairseq_offset + self.sp_model.PieceToId(token)
|
||||
|
||||
def _convert_id_to_token(self, index):
|
||||
|
||||
Reference in new issue
Block a user