Improving pipeline tests (#12784)
* Proposal * Testing pipelines slightly better. - Overall same design - Metaclass to get proper different tests instead of subTest (not well supported by Pytest) - Added ANY meta object to make output checking more readable. - Skipping architectures either without tiny_config or without architecture. * Small fix. * Fixing the tests in case of None value. * Oups. * Rebased with more architectures. * Fixing reformer tests (no override anymore). * Adding more options for model tester config. Co-authored-by: Lysandre <lysandre.debut@reseau.eseo.fr>
This commit is contained in:
@@ -14,13 +14,61 @@
|
||||
|
||||
import unittest
|
||||
|
||||
from .test_pipelines_common import MonoInputPipelineCommonMixin
|
||||
from transformers import (
|
||||
MODEL_FOR_SEQUENCE_CLASSIFICATION_MAPPING,
|
||||
TF_MODEL_FOR_SEQUENCE_CLASSIFICATION_MAPPING,
|
||||
TextClassificationPipeline,
|
||||
pipeline,
|
||||
)
|
||||
from transformers.testing_utils import is_pipeline_test, nested_simplify, require_tf, require_torch, slow
|
||||
|
||||
from .test_pipelines_common import ANY, PipelineTestCaseMeta
|
||||
|
||||
|
||||
class TextClassificationPipelineTests(MonoInputPipelineCommonMixin, unittest.TestCase):
|
||||
pipeline_task = "sentiment-analysis"
|
||||
small_models = [
|
||||
"sshleifer/tiny-distilbert-base-uncased-finetuned-sst-2-english"
|
||||
] # Default model - Models tested without the @slow decorator
|
||||
large_models = [None] # Models tested with the @slow decorator
|
||||
mandatory_keys = {"label", "score"} # Keys which should be in the output
|
||||
@is_pipeline_test
|
||||
class TextClassificationPipelineTests(unittest.TestCase, metaclass=PipelineTestCaseMeta):
|
||||
model_mapping = MODEL_FOR_SEQUENCE_CLASSIFICATION_MAPPING
|
||||
tf_model_mapping = TF_MODEL_FOR_SEQUENCE_CLASSIFICATION_MAPPING
|
||||
|
||||
@slow
|
||||
@require_torch
|
||||
def test_pt_bert(self):
|
||||
text_classifier = pipeline("text-classification")
|
||||
|
||||
outputs = text_classifier("This is great !")
|
||||
self.assertEqual(nested_simplify(outputs), [{"label": "POSITIVE", "score": 1.0}])
|
||||
outputs = text_classifier("This is bad !")
|
||||
self.assertEqual(nested_simplify(outputs), [{"label": "NEGATIVE", "score": 1.0}])
|
||||
outputs = text_classifier("Birds are a type of animal")
|
||||
self.assertEqual(nested_simplify(outputs), [{"label": "POSITIVE", "score": 0.988}])
|
||||
|
||||
@slow
|
||||
@require_tf
|
||||
def test_tf_bert(self):
|
||||
text_classifier = pipeline("text-classification", framework="tf")
|
||||
|
||||
outputs = text_classifier("This is great !")
|
||||
self.assertEqual(nested_simplify(outputs), [{"label": "POSITIVE", "score": 1.0}])
|
||||
outputs = text_classifier("This is bad !")
|
||||
self.assertEqual(nested_simplify(outputs), [{"label": "NEGATIVE", "score": 1.0}])
|
||||
outputs = text_classifier("Birds are a type of animal")
|
||||
self.assertEqual(nested_simplify(outputs), [{"label": "POSITIVE", "score": 0.988}])
|
||||
|
||||
def run_pipeline_test(self, model, tokenizer):
|
||||
text_classifier = TextClassificationPipeline(model=model, tokenizer=tokenizer)
|
||||
|
||||
# Small inputs because BartTokenizer tiny has maximum position embeddings = 22
|
||||
valid_inputs = "HuggingFace is in"
|
||||
outputs = text_classifier(valid_inputs)
|
||||
|
||||
self.assertEqual(nested_simplify(outputs), [{"label": ANY(str), "score": ANY(float)}])
|
||||
self.assertTrue(outputs[0]["label"] in model.config.id2label.values())
|
||||
|
||||
valid_inputs = ["HuggingFace is in ", "Paris is in France"]
|
||||
outputs = text_classifier(valid_inputs)
|
||||
self.assertEqual(
|
||||
nested_simplify(outputs),
|
||||
[{"label": ANY(str), "score": ANY(float)}, {"label": ANY(str), "score": ANY(float)}],
|
||||
)
|
||||
self.assertTrue(outputs[0]["label"] in model.config.id2label.values())
|
||||
self.assertTrue(outputs[1]["label"] in model.config.id2label.values())
|
||||
|
||||
Reference in New Issue
Block a user