Skip to content

Commit 732604c

Browse files
committed
added consistency output test and bump version
1 parent da61b81 commit 732604c

3 files changed

Lines changed: 197 additions & 2 deletions

File tree

pyproject.toml

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
[tool.poetry]
22
name = "unbabel-comet"
3-
version = "2.2.7"
3+
version = "2.2.8"
44
description = "High-quality Machine Translation Evaluation"
55
authors = ["Ricardo Rei, Craig Stewart, Catarina Farinha, Alon Lavie"]
66
license = "Apache-2.0"
@@ -51,7 +51,7 @@ entmax = "^1.1"
5151
huggingface-hub = ">=0.19.3,<1.0"
5252
protobuf = "^4.24.4"
5353

54-
[tool.poetry.dev-dependencies]
54+
[tool.poetry.group.dev.dependencies]
5555
sphinx-markdown-tables = "0.0.15"
5656
coverage = "^5.5"
5757
scikit-learn = "^1.0"

tests/unit/test_models_predict.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,7 @@ class TestUnifiedMetricPredict(unittest.TestCase):
3737
@classmethod
3838
def tearDownClass(cls):
3939
shutil.rmtree(os.path.join(DATA_PATH, "models--Unbabel--test-model-whimsical-whisper"))
40+
shutil.rmtree(os.path.join(DATA_PATH, "models--Unbabel--eamt22-cometinho-da"))
4041

4142
def test_predict(self):
4243
model_output = self.model.predict(TEST_SAMPLES, batch_size=12, gpus=self.gpus)
Lines changed: 194 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,194 @@
1+
# -*- coding: utf-8 -*-
2+
import json
3+
import os
4+
import shutil
5+
import unittest
6+
7+
import numpy as np
8+
import torch
9+
10+
from comet import download_model, load_from_checkpoint
11+
from comet.models import XCOMETMetric
12+
from tests.data import DATA_PATH
13+
14+
with open(f"{DATA_PATH}/expected_outputs.json") as fr:
15+
TEST_SAMPLES = json.load(fr)
16+
17+
class BaseOutputConsistencyUnifiedMetric(unittest.TestCase):
18+
""" Detect UnifiedMetric output changes caused by COMET updates. """
19+
model_name = None
20+
referenceless = False
21+
22+
@classmethod
23+
def setUpClass(cls):
24+
if cls is BaseOutputConsistencyUnifiedMetric:
25+
raise unittest.SkipTest("Base class must not be executed.")
26+
27+
cls.model = load_from_checkpoint(
28+
download_model(cls.model_name, saving_directory=DATA_PATH)
29+
)
30+
cls.gpus = 1 if torch.cuda.device_count() > 0 else 0
31+
32+
def test_predict(self):
33+
if self.referenceless:
34+
self.model_name = f"{self.model_name}_referenceless"
35+
36+
test_samples = TEST_SAMPLES[self.model_name]
37+
38+
if self.referenceless:
39+
test_samples = [{k: v for k, v in sample.items() if k != "ref"} for sample in test_samples]
40+
41+
model_output = self.model.predict(
42+
test_samples,
43+
batch_size=12,
44+
gpus=self.gpus
45+
)
46+
47+
assert "error_spans" in model_output.metadata
48+
assert "src_scores" in model_output.metadata
49+
50+
if not self.referenceless:
51+
assert "ref_scores" in model_output.metadata
52+
assert "unified_scores" in model_output.metadata
53+
54+
# Check every expected score
55+
score_types = ["score", "src_score", "mqm_score"]
56+
57+
if not self.referenceless:
58+
score_types += ["ref_score", "unified_score"]
59+
60+
for score_type in score_types:
61+
expected_scores = np.array(
62+
[sample[score_type] for sample in test_samples]
63+
)
64+
65+
if score_type == "score":
66+
actual_scores = np.array(model_output.scores)
67+
else:
68+
actual_scores = np.array(
69+
model_output.metadata[f"{score_type}s"]
70+
)
71+
72+
np.testing.assert_almost_equal(
73+
expected_scores,
74+
actual_scores,
75+
decimal=5
76+
)
77+
78+
if score_type == "score":
79+
np.testing.assert_almost_equal(
80+
expected_scores.mean(),
81+
model_output.system_score,
82+
decimal=5
83+
)
84+
85+
# Check error spans
86+
expected_error_spans = [sample["error_spans"] for sample in test_samples]
87+
self.assertEqual(expected_error_spans, model_output.metadata["error_spans"])
88+
89+
90+
class TestXCOMETXLQE(BaseOutputConsistencyUnifiedMetric):
91+
model_name = "Unbabel/XCOMET-XL"
92+
referenceless = True
93+
94+
@classmethod
95+
def tearDownClass(cls):
96+
shutil.rmtree(os.path.join(DATA_PATH, "models--Unbabel--XCOMET-XL"))
97+
98+
99+
class TestXCOMETXL(BaseOutputConsistencyUnifiedMetric):
100+
model_name = "Unbabel/XCOMET-XL"
101+
102+
@classmethod
103+
def tearDownClass(cls):
104+
shutil.rmtree(os.path.join(DATA_PATH, "models--Unbabel--XCOMET-XL"))
105+
106+
class TestXCOMETXXL(BaseOutputConsistencyUnifiedMetric):
107+
model_name = "Unbabel/XCOMET-XXL"
108+
109+
@classmethod
110+
def tearDownClass(cls):
111+
shutil.rmtree(os.path.join(DATA_PATH, "models--Unbabel--XCOMET-XXL"))
112+
113+
114+
class TestXCOMETXXLQE(BaseOutputConsistencyUnifiedMetric):
115+
model_name = "Unbabel/XCOMET-XXL"
116+
referenceless = True
117+
118+
@classmethod
119+
def tearDownClass(cls):
120+
shutil.rmtree(os.path.join(DATA_PATH, "models--Unbabel--XCOMET-XXL"))
121+
122+
123+
class BaseOutputConsistencyRegressionMetric(unittest.TestCase):
124+
""" Detect RegressionMetric output changes caused by COMET updates. """
125+
126+
model_name = None
127+
referenceless = False
128+
129+
@classmethod
130+
def setUpClass(cls):
131+
if cls is BaseOutputConsistencyRegressionMetric:
132+
raise unittest.SkipTest("Base class must not be executed.")
133+
134+
cls.model = load_from_checkpoint(
135+
download_model(cls.model_name, saving_directory=DATA_PATH)
136+
)
137+
cls.gpus = 1 if torch.cuda.device_count() > 0 else 0
138+
139+
def test_predict(self):
140+
if self.referenceless:
141+
self.model_name = f"{self.model_name}_referenceless"
142+
143+
test_samples = TEST_SAMPLES[self.model_name]
144+
145+
if self.referenceless:
146+
test_samples = [{k: v for k, v in sample.items() if k != "ref"} for sample in test_samples]
147+
148+
model_output = self.model.predict(
149+
test_samples,
150+
batch_size=12,
151+
gpus=self.gpus
152+
)
153+
154+
assert "scores" in model_output
155+
assert "system_score" in model_output
156+
157+
# Check scores
158+
expected_scores = np.array([sample["score"] for sample in test_samples])
159+
np.testing.assert_almost_equal(
160+
expected_scores,
161+
model_output.scores,
162+
decimal=5
163+
)
164+
np.testing.assert_almost_equal(
165+
expected_scores.mean(),
166+
model_output.system_score,
167+
decimal=5
168+
)
169+
170+
171+
class TestWMT22CometDA(BaseOutputConsistencyRegressionMetric):
172+
model_name = "Unbabel/wmt22-comet-da"
173+
174+
@classmethod
175+
def tearDownClass(cls):
176+
shutil.rmtree(os.path.join(DATA_PATH, "models--Unbabel--wmt22-comet-da"))
177+
178+
179+
class TestWMT22CometKiwiDA(BaseOutputConsistencyRegressionMetric):
180+
model_name = "Unbabel/wmt22-cometkiwi-da"
181+
referenceless = True
182+
183+
@classmethod
184+
def tearDownClass(cls):
185+
shutil.rmtree(os.path.join(DATA_PATH, "models--Unbabel--wmt22-cometkiwi-da"))
186+
187+
188+
class TestWMT23CometKiwiDA(BaseOutputConsistencyRegressionMetric):
189+
model_name = "Unbabel/wmt23-cometkiwi-da-xl"
190+
referenceless = True
191+
192+
@classmethod
193+
def tearDownClass(cls):
194+
shutil.rmtree(os.path.join(DATA_PATH, "models--Unbabel--wmt23-cometkiwi-da-xl"))

0 commit comments

Comments
 (0)