Skip to content

Commit 0896a3b

Browse files
committed
fix(huggingface): preserve batching when pad_token_id is zero
1 parent a325e52 commit 0896a3b

2 files changed

Lines changed: 45 additions & 3 deletions

File tree

‎runtimes/huggingface/mlserver_huggingface/common.py‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -63,7 +63,7 @@ def load_pipeline_from_settings(
6363
# If max_batch_size > 1 we need to ensure tokens are padded
6464
if settings.max_batch_size > 1:
6565
model = hf_pipeline.model
66-
if not hf_pipeline.tokenizer.pad_token_id:
66+
if hf_pipeline.tokenizer.pad_token_id is None:
6767
eos_token_id = model.config.eos_token_id # type: ignore
6868
if eos_token_id:
6969
hf_pipeline.tokenizer.pad_token_id = [str(eos_token_id)] # type: ignore

‎runtimes/huggingface/tests/test_common.py‎

Lines changed: 44 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -243,8 +243,8 @@ def test_pipeline_cpu_device_set(
243243
"hf-internal-testing/tiny-bert-for-token-classification",
244244
"token-classification",
245245
10,
246-
1,
247-
), # Neither pad_token nor eos_token defined revert to 1
246+
10,
247+
),
248248
],
249249
)
250250
def test_pipeline_checks_for_eos_and_pad_token(
@@ -265,3 +265,45 @@ def test_pipeline_checks_for_eos_and_pad_token(
265265
m = load_pipeline_from_settings(hf_settings, model_settings)
266266

267267
assert m._batch_size == expected_batch_size
268+
269+
270+
@pytest.mark.parametrize("pad_token_id", [0, 1])
271+
@pytest.mark.parametrize("eos_token_id", [None, 2])
272+
@patch("mlserver_huggingface.common._get_pipeline_class")
273+
def test_pipeline_preserves_configured_padding(
274+
mock_pipeline_factory, pad_token_id: int, eos_token_id: Optional[int], caplog
275+
):
276+
hf_settings = HuggingFaceSettings(pretrained_model="some-model")
277+
model_settings = ModelSettings(
278+
name="foo", implementation=HuggingFaceRuntime, max_batch_size=8
279+
)
280+
mock_pipeline = mock_pipeline_factory.return_value.return_value
281+
mock_pipeline.tokenizer.pad_token_id = pad_token_id
282+
mock_pipeline.model.config.eos_token_id = eos_token_id
283+
mock_pipeline._batch_size = model_settings.max_batch_size
284+
285+
pipeline = load_pipeline_from_settings(hf_settings, model_settings)
286+
287+
assert pipeline._batch_size == model_settings.max_batch_size
288+
assert pipeline.tokenizer.pad_token_id == pad_token_id
289+
assert "setting batch size to 1" not in caplog.text
290+
291+
292+
@patch("mlserver_huggingface.common._get_pipeline_class")
293+
def test_pipeline_without_padding_or_eos_uses_single_batch(
294+
mock_pipeline_factory, caplog
295+
):
296+
hf_settings = HuggingFaceSettings(pretrained_model="some-model")
297+
model_settings = ModelSettings(
298+
name="foo", implementation=HuggingFaceRuntime, max_batch_size=8
299+
)
300+
mock_pipeline = mock_pipeline_factory.return_value.return_value
301+
mock_pipeline.tokenizer.pad_token_id = None
302+
mock_pipeline.model.config.eos_token_id = None
303+
mock_pipeline._batch_size = model_settings.max_batch_size
304+
305+
pipeline = load_pipeline_from_settings(hf_settings, model_settings)
306+
307+
assert pipeline._batch_size == 1
308+
assert pipeline.tokenizer.pad_token_id is None
309+
assert "setting batch size to 1" in caplog.text

0 commit comments

Comments
 (0)