diff --git a/deepspeed/inference/config.py b/deepspeed/inference/config.py index 2ef43cb0239d..25994a110d31 100644 --- a/deepspeed/inference/config.py +++ b/deepspeed/inference/config.py @@ -310,6 +310,12 @@ def validate_dtype(cls, field_value, values): return field_value raise TypeError(f"Invalid type for dtype: {type(field_value)}") + @field_validator("max_out_tokens") + def validate_max_out_tokens(cls, field_value, values): + if field_value <= 0: + raise ValueError(f"max_out_tokens must be a positive integer, got {field_value}") + return field_value + @field_validator("moe") def moe_backward_compat(cls, field_value, values): if isinstance(field_value, bool): diff --git a/tests/unit/inference/test_inference_config.py b/tests/unit/inference/test_inference_config.py index fcba7e0d601b..4e4a7d2ad664 100644 --- a/tests/unit/inference/test_inference_config.py +++ b/tests/unit/inference/test_inference_config.py @@ -82,3 +82,27 @@ def test_moe_backward_compat_bool(self): config = DeepSpeedInferenceConfig(moe=value) assert isinstance(config.moe, DeepSpeedMoEConfig) assert config.moe.enabled == value + + +@pytest.mark.inference +class TestInferenceConfigValidation: + """CPU-only validation tests for DeepSpeedInferenceConfig.""" + + def test_negative_max_out_tokens_rejected(self): + # Regression test for https://github.com/deepspeedai/DeepSpeed/issues/8339 + from deepspeed.inference.config import DeepSpeedInferenceConfig + + with pytest.raises(ValueError, match="max_out_tokens must be a positive integer"): + DeepSpeedInferenceConfig(max_out_tokens=-1) + + def test_zero_max_out_tokens_rejected(self): + from deepspeed.inference.config import DeepSpeedInferenceConfig + + with pytest.raises(ValueError, match="max_out_tokens must be a positive integer"): + DeepSpeedInferenceConfig(max_out_tokens=0) + + def test_positive_max_out_tokens_accepted(self): + from deepspeed.inference.config import DeepSpeedInferenceConfig + + config = DeepSpeedInferenceConfig(max_out_tokens=128) + assert config.max_out_tokens == 128