Skip to content
GitLab
Menu
Projects
Groups
Snippets
Loading...
Help
Help
Support
Community forum
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in
Toggle navigation
Menu
Open sidebar
chenpangpang
transformers
Commits
dfc76b25
Unverified
Commit
dfc76b25
authored
Jun 09, 2022
by
amyeroberts
Committed by
GitHub
Jun 09, 2022
Browse files
has_attentions - consistent test skipping logic and tf tests (#17495)
parent
66e86567
Changes
9
Hide whitespace changes
Inline
Side-by-side
Showing
9 changed files
with
146 additions
and
120 deletions
+146
-120
tests/models/convnext/test_modeling_convnext.py
tests/models/convnext/test_modeling_convnext.py
+4
-0
tests/models/cvt/test_modeling_cvt.py
tests/models/cvt/test_modeling_cvt.py
+4
-0
tests/models/flava/test_modeling_flava.py
tests/models/flava/test_modeling_flava.py
+4
-0
tests/models/poolformer/test_modeling_poolformer.py
tests/models/poolformer/test_modeling_poolformer.py
+4
-0
tests/models/regnet/test_modeling_regnet.py
tests/models/regnet/test_modeling_regnet.py
+4
-0
tests/models/resnet/test_modeling_resnet.py
tests/models/resnet/test_modeling_resnet.py
+4
-0
tests/models/van/test_modeling_van.py
tests/models/van/test_modeling_van.py
+4
-0
tests/test_modeling_common.py
tests/test_modeling_common.py
+105
-109
tests/test_modeling_tf_common.py
tests/test_modeling_tf_common.py
+13
-11
No files found.
tests/models/convnext/test_modeling_convnext.py
View file @
dfc76b25
...
...
@@ -158,6 +158,10 @@ class ConvNextModelTest(ModelTesterMixin, unittest.TestCase):
def
create_and_test_config_common_properties
(
self
):
return
@
unittest
.
skip
(
reason
=
"ConvNext does not output attentions"
)
def
test_attention_outputs
(
self
):
pass
@
unittest
.
skip
(
reason
=
"ConvNext does not use inputs_embeds"
)
def
test_inputs_embeds
(
self
):
pass
...
...
tests/models/cvt/test_modeling_cvt.py
View file @
dfc76b25
...
...
@@ -173,6 +173,10 @@ class CvtModelTest(ModelTesterMixin, unittest.TestCase):
def
create_and_test_config_common_properties
(
self
):
return
@
unittest
.
skip
(
reason
=
"Cvt does not output attentions"
)
def
test_attention_outputs
(
self
):
pass
@
unittest
.
skip
(
reason
=
"Cvt does not use inputs_embeds"
)
def
test_inputs_embeds
(
self
):
pass
...
...
tests/models/flava/test_modeling_flava.py
View file @
dfc76b25
...
...
@@ -695,6 +695,10 @@ class FlavaImageCodebookTest(ModelTesterMixin, unittest.TestCase):
expected_arg_names
=
[
"pixel_values"
]
self
.
assertListEqual
(
arg_names
[:
1
],
expected_arg_names
)
@
unittest
.
skip
(
reason
=
"Flava does not output attentions"
)
def
test_attention_outputs
(
self
):
pass
def
test_model_common_attributes
(
self
):
# No embedding in multimodal model
pass
...
...
tests/models/poolformer/test_modeling_poolformer.py
View file @
dfc76b25
...
...
@@ -142,6 +142,10 @@ class PoolFormerModelTest(ModelTesterMixin, unittest.TestCase):
config_and_inputs
=
self
.
model_tester
.
prepare_config_and_inputs
()
self
.
model_tester
.
create_and_check_model
(
*
config_and_inputs
)
@
unittest
.
skip
(
reason
=
"PoolFormer does not output attentions"
)
def
test_attention_outputs
(
self
):
pass
@
unittest
.
skip
(
"PoolFormer does not use inputs_embeds"
)
def
test_inputs_embeds
(
self
):
pass
...
...
tests/models/regnet/test_modeling_regnet.py
View file @
dfc76b25
...
...
@@ -147,6 +147,10 @@ class RegNetModelTest(ModelTesterMixin, unittest.TestCase):
def
create_and_test_config_common_properties
(
self
):
return
@
unittest
.
skip
(
reason
=
"RegNet does not output attentions"
)
def
test_attention_outputs
(
self
):
pass
@
unittest
.
skip
(
reason
=
"RegNet does not use inputs_embeds"
)
def
test_inputs_embeds
(
self
):
pass
...
...
tests/models/resnet/test_modeling_resnet.py
View file @
dfc76b25
...
...
@@ -147,6 +147,10 @@ class ResNetModelTest(ModelTesterMixin, unittest.TestCase):
def
create_and_test_config_common_properties
(
self
):
return
@
unittest
.
skip
(
reason
=
"ResNet does not output attentions"
)
def
test_attention_outputs
(
self
):
pass
@
unittest
.
skip
(
reason
=
"ResNet does not use inputs_embeds"
)
def
test_inputs_embeds
(
self
):
pass
...
...
tests/models/van/test_modeling_van.py
View file @
dfc76b25
...
...
@@ -144,6 +144,10 @@ class VanModelTest(ModelTesterMixin, unittest.TestCase):
def
create_and_test_config_common_properties
(
self
):
return
@
unittest
.
skip
(
reason
=
"Van does not output attentions"
)
def
test_attention_outputs
(
self
):
pass
@
unittest
.
skip
(
reason
=
"Van does not use inputs_embeds"
)
def
test_inputs_embeds
(
self
):
pass
...
...
tests/test_modeling_common.py
View file @
dfc76b25
...
...
@@ -485,123 +485,119 @@ class ModelTesterMixin:
loss
.
backward
()
def
test_attention_outputs
(
self
):
if
not
self
.
has_attentions
:
pass
config
,
inputs_dict
=
self
.
model_tester
.
prepare_config_and_inputs_for_common
()
config
.
return_dict
=
True
else
:
config
,
inputs_dict
=
self
.
model_tester
.
prepare_config_and_inputs_for_common
()
seq_len
=
getattr
(
self
.
model_tester
,
"seq_length"
,
None
)
decoder_seq_length
=
getattr
(
self
.
model_tester
,
"decoder_seq_length"
,
seq_len
)
encoder_seq_length
=
getattr
(
self
.
model_tester
,
"encoder_seq_length"
,
seq_len
)
decoder_key_length
=
getattr
(
self
.
model_tester
,
"decoder_key_length"
,
decoder_seq_length
)
encoder_key_length
=
getattr
(
self
.
model_tester
,
"key_length"
,
encoder_seq_length
)
chunk_length
=
getattr
(
self
.
model_tester
,
"chunk_length"
,
None
)
if
chunk_length
is
not
None
and
hasattr
(
self
.
model_tester
,
"num_hashes"
):
encoder_seq_length
=
encoder_seq_length
*
self
.
model_tester
.
num_hashes
for
model_class
in
self
.
all_model_classes
:
inputs_dict
[
"output_attentions"
]
=
True
inputs_dict
[
"output_hidden_states"
]
=
False
config
.
return_dict
=
True
model
=
model_class
(
config
)
model
.
to
(
torch_device
)
model
.
eval
()
with
torch
.
no_grad
():
outputs
=
model
(
**
self
.
_prepare_for_class
(
inputs_dict
,
model_class
))
attentions
=
outputs
.
encoder_attentions
if
config
.
is_encoder_decoder
else
outputs
.
attentions
self
.
assertEqual
(
len
(
attentions
),
self
.
model_tester
.
num_hidden_layers
)
seq_len
=
getattr
(
self
.
model_tester
,
"seq_length"
,
None
)
decoder_seq_length
=
getattr
(
self
.
model_tester
,
"decoder_seq_length"
,
seq_len
)
encoder_seq_length
=
getattr
(
self
.
model_tester
,
"encoder_seq_length"
,
seq_len
)
decoder_key_length
=
getattr
(
self
.
model_tester
,
"decoder_key_length"
,
decoder_seq_length
)
encoder_key_length
=
getattr
(
self
.
model_tester
,
"key_length"
,
encoder_seq_length
)
chunk_length
=
getattr
(
self
.
model_tester
,
"chunk_length"
,
None
)
if
chunk_length
is
not
None
and
hasattr
(
self
.
model_tester
,
"num_hashes"
):
encoder_seq_length
=
encoder_seq_length
*
self
.
model_tester
.
num_hashes
for
model_class
in
self
.
all_model_classes
:
inputs_dict
[
"output_attentions"
]
=
True
inputs_dict
[
"output_hidden_states"
]
=
False
config
.
return_dict
=
True
model
=
model_class
(
config
)
model
.
to
(
torch_device
)
model
.
eval
()
with
torch
.
no_grad
():
outputs
=
model
(
**
self
.
_prepare_for_class
(
inputs_dict
,
model_class
))
attentions
=
outputs
.
encoder_attentions
if
config
.
is_encoder_decoder
else
outputs
.
attentions
self
.
assertEqual
(
len
(
attentions
),
self
.
model_tester
.
num_hidden_layers
)
# check that output_attentions also work using config
del
inputs_dict
[
"output_attentions"
]
config
.
output_attentions
=
True
model
=
model_class
(
config
)
model
.
to
(
torch_device
)
model
.
eval
()
with
torch
.
no_grad
():
outputs
=
model
(
**
self
.
_prepare_for_class
(
inputs_dict
,
model_class
))
attentions
=
outputs
.
encoder_attentions
if
config
.
is_encoder_decoder
else
outputs
.
attentions
self
.
assertEqual
(
len
(
attentions
),
self
.
model_tester
.
num_hidden_layers
)
if
chunk_length
is
not
None
:
self
.
assertListEqual
(
list
(
attentions
[
0
].
shape
[
-
4
:]),
[
self
.
model_tester
.
num_attention_heads
,
encoder_seq_length
,
chunk_length
,
encoder_key_length
],
)
else
:
self
.
assertListEqual
(
list
(
attentions
[
0
].
shape
[
-
3
:]),
[
self
.
model_tester
.
num_attention_heads
,
encoder_seq_length
,
encoder_key_length
],
)
out_len
=
len
(
outputs
)
if
self
.
is_encoder_decoder
:
correct_outlen
=
5
# loss is at first position
if
"labels"
in
inputs_dict
:
correct_outlen
+=
1
# loss is added to beginning
# Question Answering model returns start_logits and end_logits
if
model_class
in
get_values
(
MODEL_FOR_QUESTION_ANSWERING_MAPPING
):
correct_outlen
+=
1
# start_logits and end_logits instead of only 1 output
if
"past_key_values"
in
outputs
:
correct_outlen
+=
1
# past_key_values have been returned
self
.
assertEqual
(
out_len
,
correct_outlen
)
# decoder attentions
decoder_attentions
=
outputs
.
decoder_attentions
self
.
assertIsInstance
(
decoder_attentions
,
(
list
,
tuple
))
self
.
assertEqual
(
len
(
decoder_attentions
),
self
.
model_tester
.
num_hidden_layers
)
self
.
assertListEqual
(
list
(
decoder_attentions
[
0
].
shape
[
-
3
:]),
[
self
.
model_tester
.
num_attention_heads
,
decoder_seq_length
,
decoder_key_length
],
)
# check that output_attentions also work using config
del
inputs_dict
[
"output_attentions"
]
config
.
output_attentions
=
True
model
=
model_class
(
config
)
model
.
to
(
torch_device
)
model
.
eval
()
with
torch
.
no_grad
():
outputs
=
model
(
**
self
.
_prepare_for_class
(
inputs_dict
,
model_class
))
attentions
=
outputs
.
encoder_attentions
if
config
.
is_encoder_decoder
else
outputs
.
attentions
self
.
assertEqual
(
len
(
attentions
),
self
.
model_tester
.
num_hidden_layers
)
# cross attentions
cross_attentions
=
outputs
.
cross_attentions
self
.
assertIsInstance
(
cross_attentions
,
(
list
,
tuple
))
self
.
assertEqual
(
len
(
cross_attentions
),
self
.
model_tester
.
num_hidden_layers
)
self
.
assertListEqual
(
list
(
cross_attentions
[
0
].
shape
[
-
3
:]),
[
self
.
model_tester
.
num_attention_heads
,
decoder_seq_length
,
encoder_key_length
,
],
)
if
chunk_length
is
not
None
:
self
.
assertListEqual
(
list
(
attentions
[
0
].
shape
[
-
4
:]),
[
self
.
model_tester
.
num_attention_heads
,
encoder_seq_length
,
chunk_length
,
encoder_key_length
],
)
else
:
self
.
assertListEqual
(
list
(
attentions
[
0
].
shape
[
-
3
:]),
[
self
.
model_tester
.
num_attention_heads
,
encoder_seq_length
,
encoder_key_length
],
)
out_len
=
len
(
outputs
)
if
self
.
is_encoder_decoder
:
correct_outlen
=
5
# loss is at first position
if
"labels"
in
inputs_dict
:
correct_outlen
+=
1
# loss is added to beginning
# Question Answering model returns start_logits and end_logits
if
model_class
in
get_values
(
MODEL_FOR_QUESTION_ANSWERING_MAPPING
):
correct_outlen
+=
1
# start_logits and end_logits instead of only 1 output
if
"past_key_values"
in
outputs
:
correct_outlen
+=
1
# past_key_values have been returned
self
.
assertEqual
(
out_len
,
correct_outlen
)
# decoder attentions
decoder_attentions
=
outputs
.
decoder_attentions
self
.
assertIsInstance
(
decoder_attentions
,
(
list
,
tuple
))
self
.
assertEqual
(
len
(
decoder_attentions
),
self
.
model_tester
.
num_hidden_layers
)
self
.
assertListEqual
(
list
(
decoder_attentions
[
0
].
shape
[
-
3
:]),
[
self
.
model_tester
.
num_attention_heads
,
decoder_seq_length
,
decoder_key_length
],
)
# Check attention is always last and order is fine
inputs_dict
[
"output_attentions"
]
=
True
inputs_dict
[
"output_hidden_states"
]
=
True
model
=
model_class
(
config
)
model
.
to
(
torch_device
)
model
.
eval
()
with
torch
.
no_grad
():
outputs
=
model
(
**
self
.
_prepare_for_class
(
inputs_dict
,
model_class
))
# cross attentions
cross_attentions
=
outputs
.
cross_attentions
self
.
assertIsInstance
(
cross_attentions
,
(
list
,
tuple
))
self
.
assertEqual
(
len
(
cross_attentions
),
self
.
model_tester
.
num_hidden_layers
)
self
.
assertListEqual
(
list
(
cross_attentions
[
0
].
shape
[
-
3
:]),
[
self
.
model_tester
.
num_attention_heads
,
decoder_seq_length
,
encoder_key_length
,
],
)
if
hasattr
(
self
.
model_tester
,
"num_hidden_states_types"
):
added_hidden_states
=
self
.
model_tester
.
num_hidden_states_types
elif
self
.
is_encoder_decoder
:
added_hidden_states
=
2
else
:
added_hidden_states
=
1
self
.
assertEqual
(
out_len
+
added_hidden_states
,
len
(
outputs
))
# Check attention is always last and order is fine
inputs_dict
[
"output_attentions"
]
=
True
inputs_dict
[
"output_hidden_states"
]
=
True
model
=
model_class
(
config
)
model
.
to
(
torch_device
)
model
.
eval
()
with
torch
.
no_grad
():
outputs
=
model
(
**
self
.
_prepare_for_class
(
inputs_dict
,
model_class
))
self_attentions
=
outputs
.
encoder_attentions
if
config
.
is_encoder_decoder
else
outputs
.
attentions
if
hasattr
(
self
.
model_tester
,
"num_hidden_states_types"
):
added_hidden_states
=
self
.
model_tester
.
num_hidden_states_types
elif
self
.
is_encoder_decoder
:
added_hidden_states
=
2
else
:
added_hidden_states
=
1
self
.
assertEqual
(
out_len
+
added_hidden_states
,
len
(
outputs
))
self
.
assertEqual
(
len
(
self_attentions
),
self
.
model_tester
.
num_hidden_layers
)
if
chunk_length
is
not
None
:
self
.
assertListEqual
(
list
(
self_attentions
[
0
].
shape
[
-
4
:]),
[
self
.
model_tester
.
num_attention_heads
,
encoder_seq_length
,
chunk_length
,
encoder_key_length
],
)
else
:
self
.
assertListEqual
(
list
(
self_attentions
[
0
].
shape
[
-
3
:]),
[
self
.
model_tester
.
num_attention_heads
,
encoder_seq_length
,
encoder_key_length
],
)
self_attentions
=
outputs
.
encoder_attentions
if
config
.
is_encoder_decoder
else
outputs
.
attentions
self
.
assertEqual
(
len
(
self_attentions
),
self
.
model_tester
.
num_hidden_layers
)
if
chunk_length
is
not
None
:
self
.
assertListEqual
(
list
(
self_attentions
[
0
].
shape
[
-
4
:]),
[
self
.
model_tester
.
num_attention_heads
,
encoder_seq_length
,
chunk_length
,
encoder_key_length
],
)
else
:
self
.
assertListEqual
(
list
(
self_attentions
[
0
].
shape
[
-
3
:]),
[
self
.
model_tester
.
num_attention_heads
,
encoder_seq_length
,
encoder_key_length
],
)
@
slow
def
test_torchscript_simple
(
self
):
...
...
tests/test_modeling_tf_common.py
View file @
dfc76b25
...
...
@@ -978,9 +978,10 @@ class TFModelTesterMixin:
dict_inputs
=
self
.
_prepare_for_class
(
inputs_dict
,
model_class
)
check_equivalence
(
model
,
tuple_inputs
,
dict_inputs
,
{
"output_hidden_states"
:
True
})
tuple_inputs
=
self
.
_prepare_for_class
(
inputs_dict
,
model_class
)
dict_inputs
=
self
.
_prepare_for_class
(
inputs_dict
,
model_class
)
check_equivalence
(
model
,
tuple_inputs
,
dict_inputs
,
{
"output_attentions"
:
True
})
if
self
.
has_attentions
:
tuple_inputs
=
self
.
_prepare_for_class
(
inputs_dict
,
model_class
)
dict_inputs
=
self
.
_prepare_for_class
(
inputs_dict
,
model_class
)
check_equivalence
(
model
,
tuple_inputs
,
dict_inputs
,
{
"output_attentions"
:
True
})
# Not all models accept "labels" in the forward pass (yet :) )
if
"labels"
in
inspect
.
signature
(
model
.
call
).
parameters
.
keys
():
...
...
@@ -992,15 +993,16 @@ class TFModelTesterMixin:
dict_inputs
=
self
.
_prepare_for_class
(
inputs_dict
,
model_class
,
return_labels
=
True
)
check_equivalence
(
model
,
tuple_inputs
,
dict_inputs
,
{
"output_hidden_states"
:
True
})
tuple_inputs
=
self
.
_prepare_for_class
(
inputs_dict
,
model_class
,
return_labels
=
True
)
dict_inputs
=
self
.
_prepare_for_class
(
inputs_dict
,
model_class
,
return_labels
=
True
)
check_equivalence
(
model
,
tuple_inputs
,
dict_inputs
,
{
"output_attentions"
:
True
})
if
self
.
has_attentions
:
tuple_inputs
=
self
.
_prepare_for_class
(
inputs_dict
,
model_class
,
return_labels
=
True
)
dict_inputs
=
self
.
_prepare_for_class
(
inputs_dict
,
model_class
,
return_labels
=
True
)
check_equivalence
(
model
,
tuple_inputs
,
dict_inputs
,
{
"output_attentions"
:
True
})
tuple_inputs
=
self
.
_prepare_for_class
(
inputs_dict
,
model_class
,
return_labels
=
True
)
dict_inputs
=
self
.
_prepare_for_class
(
inputs_dict
,
model_class
,
return_labels
=
True
)
check_equivalence
(
model
,
tuple_inputs
,
dict_inputs
,
{
"output_hidden_states"
:
True
,
"output_attentions"
:
True
}
)
tuple_inputs
=
self
.
_prepare_for_class
(
inputs_dict
,
model_class
,
return_labels
=
True
)
dict_inputs
=
self
.
_prepare_for_class
(
inputs_dict
,
model_class
,
return_labels
=
True
)
check_equivalence
(
model
,
tuple_inputs
,
dict_inputs
,
{
"output_hidden_states"
:
True
,
"output_attentions"
:
True
}
)
def
test_inputs_embeds
(
self
):
config
,
inputs_dict
=
self
.
model_tester
.
prepare_config_and_inputs_for_common
()
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
.
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment