Convert formatting to use ruff instead of yapf + isort (#26247)
Signed-off-by: Harry Mellor <19981378+hmellor@users.noreply.github.com>
This commit is contained in:
@@ -23,8 +23,8 @@ def test_compile_config_repr_succeeds():
|
||||
|
||||
# test that repr(config) succeeds
|
||||
val = repr(config)
|
||||
assert 'VllmConfig' in val
|
||||
assert 'inductor_passes' in val
|
||||
assert "VllmConfig" in val
|
||||
assert "inductor_passes" in val
|
||||
|
||||
|
||||
@dataclass
|
||||
@@ -51,8 +51,7 @@ def test_get_field():
|
||||
|
||||
@dataclass
|
||||
class _TestNestedConfig:
|
||||
a: _TestConfigFields = field(
|
||||
default_factory=lambda: _TestConfigFields(a=0))
|
||||
a: _TestConfigFields = field(default_factory=lambda: _TestConfigFields(a=0))
|
||||
|
||||
|
||||
def test_update_config():
|
||||
@@ -79,20 +78,19 @@ def test_update_config():
|
||||
|
||||
# Can remove once --task option is fully deprecated
|
||||
@pytest.mark.parametrize(
|
||||
("model_id", "expected_runner_type", "expected_convert_type",
|
||||
"expected_task"),
|
||||
("model_id", "expected_runner_type", "expected_convert_type", "expected_task"),
|
||||
[
|
||||
("distilbert/distilgpt2", "generate", "none", "generate"),
|
||||
("intfloat/multilingual-e5-small", "pooling", "none", "embed"),
|
||||
("jason9693/Qwen2.5-1.5B-apeach", "pooling", "classify", "classify"),
|
||||
("cross-encoder/ms-marco-MiniLM-L-6-v2", "pooling", "none",
|
||||
"classify"),
|
||||
("cross-encoder/ms-marco-MiniLM-L-6-v2", "pooling", "none", "classify"),
|
||||
("Qwen/Qwen2.5-Math-RM-72B", "pooling", "none", "reward"),
|
||||
("openai/whisper-small", "generate", "none", "transcription"),
|
||||
],
|
||||
)
|
||||
def test_auto_task(model_id, expected_runner_type, expected_convert_type,
|
||||
expected_task):
|
||||
def test_auto_task(
|
||||
model_id, expected_runner_type, expected_convert_type, expected_task
|
||||
):
|
||||
config = ModelConfig(model_id, task="auto")
|
||||
|
||||
assert config.runner_type == expected_runner_type
|
||||
@@ -101,20 +99,19 @@ def test_auto_task(model_id, expected_runner_type, expected_convert_type,
|
||||
|
||||
# Can remove once --task option is fully deprecated
|
||||
@pytest.mark.parametrize(
|
||||
("model_id", "expected_runner_type", "expected_convert_type",
|
||||
"expected_task"),
|
||||
("model_id", "expected_runner_type", "expected_convert_type", "expected_task"),
|
||||
[
|
||||
("distilbert/distilgpt2", "pooling", "embed", "embed"),
|
||||
("intfloat/multilingual-e5-small", "pooling", "embed", "embed"),
|
||||
("jason9693/Qwen2.5-1.5B-apeach", "pooling", "classify", "classify"),
|
||||
("cross-encoder/ms-marco-MiniLM-L-6-v2", "pooling", "classify",
|
||||
"classify"),
|
||||
("cross-encoder/ms-marco-MiniLM-L-6-v2", "pooling", "classify", "classify"),
|
||||
("Qwen/Qwen2.5-Math-RM-72B", "pooling", "embed", "embed"),
|
||||
("openai/whisper-small", "pooling", "embed", "embed"),
|
||||
],
|
||||
)
|
||||
def test_score_task(model_id, expected_runner_type, expected_convert_type,
|
||||
expected_task):
|
||||
def test_score_task(
|
||||
model_id, expected_runner_type, expected_convert_type, expected_task
|
||||
):
|
||||
config = ModelConfig(model_id, task="score")
|
||||
|
||||
assert config.runner_type == expected_runner_type
|
||||
@@ -123,14 +120,14 @@ def test_score_task(model_id, expected_runner_type, expected_convert_type,
|
||||
|
||||
# Can remove once --task option is fully deprecated
|
||||
@pytest.mark.parametrize(
|
||||
("model_id", "expected_runner_type", "expected_convert_type",
|
||||
"expected_task"),
|
||||
("model_id", "expected_runner_type", "expected_convert_type", "expected_task"),
|
||||
[
|
||||
("openai/whisper-small", "generate", "none", "transcription"),
|
||||
],
|
||||
)
|
||||
def test_transcription_task(model_id, expected_runner_type,
|
||||
expected_convert_type, expected_task):
|
||||
def test_transcription_task(
|
||||
model_id, expected_runner_type, expected_convert_type, expected_task
|
||||
):
|
||||
config = ModelConfig(model_id, task="transcription")
|
||||
|
||||
assert config.runner_type == expected_runner_type
|
||||
@@ -200,8 +197,9 @@ def test_disable_sliding_window(model_id_expected):
|
||||
assert model_config.max_model_len == expected
|
||||
|
||||
|
||||
@pytest.mark.skipif(current_platform.is_rocm(),
|
||||
reason="Xformers backend is not supported on ROCm.")
|
||||
@pytest.mark.skipif(
|
||||
current_platform.is_rocm(), reason="Xformers backend is not supported on ROCm."
|
||||
)
|
||||
def test_get_pooling_config():
|
||||
model_id = "sentence-transformers/all-MiniLM-L12-v2"
|
||||
model_config = ModelConfig(model_id)
|
||||
@@ -211,8 +209,9 @@ def test_get_pooling_config():
|
||||
assert model_config.pooler_config.pooling_type == PoolingType.MEAN.name
|
||||
|
||||
|
||||
@pytest.mark.skipif(current_platform.is_rocm(),
|
||||
reason="Xformers backend is not supported on ROCm.")
|
||||
@pytest.mark.skipif(
|
||||
current_platform.is_rocm(), reason="Xformers backend is not supported on ROCm."
|
||||
)
|
||||
def test_get_pooling_config_from_args():
|
||||
model_id = "sentence-transformers/all-MiniLM-L12-v2"
|
||||
pooler_config = PoolerConfig(pooling_type="CLS", normalize=True)
|
||||
@@ -227,16 +226,18 @@ def test_get_pooling_config_from_args():
|
||||
("tomaarsen/Qwen3-Reranker-0.6B-seq-cls", "LAST", "LAST"), # LLM
|
||||
("intfloat/e5-small", "CLS", "MEAN"), # BertModel
|
||||
("Qwen/Qwen2.5-Math-RM-72B", "ALL", "ALL"), # reward
|
||||
("Qwen/Qwen2.5-Math-PRM-7B", "STEP", "STEP") # step reward
|
||||
])
|
||||
("Qwen/Qwen2.5-Math-PRM-7B", "STEP", "STEP"), # step reward
|
||||
],
|
||||
)
|
||||
def test_default_pooling_type(model_id, default_pooling_type, pooling_type):
|
||||
model_config = ModelConfig(model_id)
|
||||
assert model_config._model_info.default_pooling_type == default_pooling_type
|
||||
assert model_config.pooler_config.pooling_type == pooling_type
|
||||
|
||||
|
||||
@pytest.mark.skipif(current_platform.is_rocm(),
|
||||
reason="Xformers backend is not supported on ROCm.")
|
||||
@pytest.mark.skipif(
|
||||
current_platform.is_rocm(), reason="Xformers backend is not supported on ROCm."
|
||||
)
|
||||
def test_get_bert_tokenization_sentence_transformer_config():
|
||||
model_id = "BAAI/bge-base-en-v1.5"
|
||||
bge_model_config = ModelConfig(model_id)
|
||||
@@ -264,17 +265,18 @@ def test_rope_customization():
|
||||
"rope_theta": TEST_ROPE_THETA,
|
||||
},
|
||||
)
|
||||
assert getattr(llama_model_config.hf_config, "rope_scaling",
|
||||
None) == TEST_ROPE_SCALING
|
||||
assert getattr(llama_model_config.hf_config, "rope_theta",
|
||||
None) == TEST_ROPE_THETA
|
||||
assert (
|
||||
getattr(llama_model_config.hf_config, "rope_scaling", None) == TEST_ROPE_SCALING
|
||||
)
|
||||
assert getattr(llama_model_config.hf_config, "rope_theta", None) == TEST_ROPE_THETA
|
||||
assert llama_model_config.max_model_len == 16384
|
||||
|
||||
longchat_model_config = ModelConfig("lmsys/longchat-13b-16k")
|
||||
# Check if LONGCHAT_ROPE_SCALING entries are in longchat_model_config
|
||||
assert all(
|
||||
longchat_model_config.hf_config.rope_scaling.get(key) == value
|
||||
for key, value in LONGCHAT_ROPE_SCALING.items())
|
||||
for key, value in LONGCHAT_ROPE_SCALING.items()
|
||||
)
|
||||
assert longchat_model_config.max_model_len == 16384
|
||||
|
||||
longchat_model_config = ModelConfig(
|
||||
@@ -283,28 +285,37 @@ def test_rope_customization():
|
||||
"rope_scaling": TEST_ROPE_SCALING,
|
||||
},
|
||||
)
|
||||
assert getattr(longchat_model_config.hf_config, "rope_scaling",
|
||||
None) == TEST_ROPE_SCALING
|
||||
assert (
|
||||
getattr(longchat_model_config.hf_config, "rope_scaling", None)
|
||||
== TEST_ROPE_SCALING
|
||||
)
|
||||
assert longchat_model_config.max_model_len == 4096
|
||||
|
||||
|
||||
@pytest.mark.skipif(current_platform.is_rocm(),
|
||||
reason="Encoder Decoder models not supported on ROCm.")
|
||||
@pytest.mark.parametrize(("model_id", "is_encoder_decoder"), [
|
||||
("facebook/opt-125m", False),
|
||||
("openai/whisper-tiny", True),
|
||||
("meta-llama/Llama-3.2-1B-Instruct", False),
|
||||
])
|
||||
@pytest.mark.skipif(
|
||||
current_platform.is_rocm(), reason="Encoder Decoder models not supported on ROCm."
|
||||
)
|
||||
@pytest.mark.parametrize(
|
||||
("model_id", "is_encoder_decoder"),
|
||||
[
|
||||
("facebook/opt-125m", False),
|
||||
("openai/whisper-tiny", True),
|
||||
("meta-llama/Llama-3.2-1B-Instruct", False),
|
||||
],
|
||||
)
|
||||
def test_is_encoder_decoder(model_id, is_encoder_decoder):
|
||||
config = ModelConfig(model_id)
|
||||
|
||||
assert config.is_encoder_decoder == is_encoder_decoder
|
||||
|
||||
|
||||
@pytest.mark.parametrize(("model_id", "uses_mrope"), [
|
||||
("facebook/opt-125m", False),
|
||||
("Qwen/Qwen2-VL-2B-Instruct", True),
|
||||
])
|
||||
@pytest.mark.parametrize(
|
||||
("model_id", "uses_mrope"),
|
||||
[
|
||||
("facebook/opt-125m", False),
|
||||
("Qwen/Qwen2-VL-2B-Instruct", True),
|
||||
],
|
||||
)
|
||||
def test_uses_mrope(model_id, uses_mrope):
|
||||
config = ModelConfig(model_id)
|
||||
|
||||
@@ -338,7 +349,8 @@ def test_generation_config_loading():
|
||||
model_config = ModelConfig(
|
||||
model_id,
|
||||
generation_config="auto",
|
||||
override_generation_config=override_generation_config)
|
||||
override_generation_config=override_generation_config,
|
||||
)
|
||||
|
||||
override_result = correct_generation_config.copy()
|
||||
override_result.update(override_generation_config)
|
||||
@@ -350,17 +362,19 @@ def test_generation_config_loading():
|
||||
model_config = ModelConfig(
|
||||
model_id,
|
||||
generation_config="vllm",
|
||||
override_generation_config=override_generation_config)
|
||||
override_generation_config=override_generation_config,
|
||||
)
|
||||
|
||||
assert model_config.get_diff_sampling_param() == override_generation_config
|
||||
|
||||
|
||||
@pytest.mark.parametrize("pt_load_map_location", [
|
||||
"cuda",
|
||||
{
|
||||
"": "cuda"
|
||||
},
|
||||
])
|
||||
@pytest.mark.parametrize(
|
||||
"pt_load_map_location",
|
||||
[
|
||||
"cuda",
|
||||
{"": "cuda"},
|
||||
],
|
||||
)
|
||||
def test_load_config_pt_load_map_location(pt_load_map_location):
|
||||
load_config = LoadConfig(pt_load_map_location=pt_load_map_location)
|
||||
config = VllmConfig(load_config=load_config)
|
||||
@@ -369,15 +383,18 @@ def test_load_config_pt_load_map_location(pt_load_map_location):
|
||||
|
||||
|
||||
@pytest.mark.parametrize(
|
||||
("model_id", "max_model_len", "expected_max_len", "should_raise"), [
|
||||
("model_id", "max_model_len", "expected_max_len", "should_raise"),
|
||||
[
|
||||
("BAAI/bge-reranker-base", None, 512, False),
|
||||
("BAAI/bge-reranker-base", 256, 256, False),
|
||||
("BAAI/bge-reranker-base", 513, 512, True),
|
||||
("deepseek-ai/DeepSeek-R1-Distill-Qwen-7B", None, 131072, False),
|
||||
("deepseek-ai/DeepSeek-R1-Distill-Qwen-7B", 131073, 131072, True),
|
||||
])
|
||||
def test_get_and_verify_max_len(model_id, max_model_len, expected_max_len,
|
||||
should_raise):
|
||||
],
|
||||
)
|
||||
def test_get_and_verify_max_len(
|
||||
model_id, max_model_len, expected_max_len, should_raise
|
||||
):
|
||||
"""Test get_and_verify_max_len with different configurations."""
|
||||
model_config = ModelConfig(model_id)
|
||||
|
||||
@@ -398,11 +415,14 @@ class MockConfig:
|
||||
self.model_weights = None
|
||||
|
||||
|
||||
@pytest.mark.parametrize("s3_url", [
|
||||
"s3://example-bucket-1/model/",
|
||||
"s3://example-bucket-2/model/",
|
||||
])
|
||||
@patch('vllm.transformers_utils.runai_utils.ObjectStorageModel.pull_files')
|
||||
@pytest.mark.parametrize(
|
||||
"s3_url",
|
||||
[
|
||||
"s3://example-bucket-1/model/",
|
||||
"s3://example-bucket-2/model/",
|
||||
],
|
||||
)
|
||||
@patch("vllm.transformers_utils.runai_utils.ObjectStorageModel.pull_files")
|
||||
def test_s3_url_model_tokenizer_paths(mock_pull_files, s3_url):
|
||||
"""Test that S3 URLs create deterministic local directories for model and
|
||||
tokenizer."""
|
||||
@@ -414,22 +434,24 @@ def test_s3_url_model_tokenizer_paths(mock_pull_files, s3_url):
|
||||
ModelConfig.maybe_pull_model_tokenizer_for_runai(config1, s3_url, s3_url)
|
||||
|
||||
# Check that model and tokenizer point to existing directories
|
||||
assert os.path.exists(
|
||||
config1.model), f"Model directory does not exist: {config1.model}"
|
||||
assert os.path.isdir(
|
||||
config1.model), f"Model path is not a directory: {config1.model}"
|
||||
assert os.path.exists(
|
||||
config1.tokenizer
|
||||
), f"Tokenizer directory does not exist: {config1.tokenizer}"
|
||||
assert os.path.isdir(
|
||||
config1.tokenizer
|
||||
), f"Tokenizer path is not a directory: {config1.tokenizer}"
|
||||
assert os.path.exists(config1.model), (
|
||||
f"Model directory does not exist: {config1.model}"
|
||||
)
|
||||
assert os.path.isdir(config1.model), (
|
||||
f"Model path is not a directory: {config1.model}"
|
||||
)
|
||||
assert os.path.exists(config1.tokenizer), (
|
||||
f"Tokenizer directory does not exist: {config1.tokenizer}"
|
||||
)
|
||||
assert os.path.isdir(config1.tokenizer), (
|
||||
f"Tokenizer path is not a directory: {config1.tokenizer}"
|
||||
)
|
||||
|
||||
# Verify that the paths are different from the original S3 URL
|
||||
assert config1.model != s3_url, (
|
||||
"Model path should be converted to local directory")
|
||||
assert config1.model != s3_url, "Model path should be converted to local directory"
|
||||
assert config1.tokenizer != s3_url, (
|
||||
"Tokenizer path should be converted to local directory")
|
||||
"Tokenizer path should be converted to local directory"
|
||||
)
|
||||
|
||||
# Store the original paths
|
||||
created_model_dir = config1.model
|
||||
@@ -440,27 +462,31 @@ def test_s3_url_model_tokenizer_paths(mock_pull_files, s3_url):
|
||||
ModelConfig.maybe_pull_model_tokenizer_for_runai(config2, s3_url, s3_url)
|
||||
|
||||
# Check that the new directories exist
|
||||
assert os.path.exists(
|
||||
config2.model), f"Model directory does not exist: {config2.model}"
|
||||
assert os.path.isdir(
|
||||
config2.model), f"Model path is not a directory: {config2.model}"
|
||||
assert os.path.exists(
|
||||
config2.tokenizer
|
||||
), f"Tokenizer directory does not exist: {config2.tokenizer}"
|
||||
assert os.path.isdir(
|
||||
config2.tokenizer
|
||||
), f"Tokenizer path is not a directory: {config2.tokenizer}"
|
||||
assert os.path.exists(config2.model), (
|
||||
f"Model directory does not exist: {config2.model}"
|
||||
)
|
||||
assert os.path.isdir(config2.model), (
|
||||
f"Model path is not a directory: {config2.model}"
|
||||
)
|
||||
assert os.path.exists(config2.tokenizer), (
|
||||
f"Tokenizer directory does not exist: {config2.tokenizer}"
|
||||
)
|
||||
assert os.path.isdir(config2.tokenizer), (
|
||||
f"Tokenizer path is not a directory: {config2.tokenizer}"
|
||||
)
|
||||
|
||||
# Verify that the paths are deterministic (same as before)
|
||||
assert config2.model == created_model_dir, (
|
||||
f"Model paths are not deterministic. "
|
||||
f"Original: {created_model_dir}, New: {config2.model}")
|
||||
f"Original: {created_model_dir}, New: {config2.model}"
|
||||
)
|
||||
assert config2.tokenizer == create_tokenizer_dir, (
|
||||
f"Tokenizer paths are not deterministic. "
|
||||
f"Original: {create_tokenizer_dir}, New: {config2.tokenizer}")
|
||||
f"Original: {create_tokenizer_dir}, New: {config2.tokenizer}"
|
||||
)
|
||||
|
||||
|
||||
@patch('vllm.transformers_utils.runai_utils.ObjectStorageModel.pull_files')
|
||||
@patch("vllm.transformers_utils.runai_utils.ObjectStorageModel.pull_files")
|
||||
def test_s3_url_different_models_create_different_directories(mock_pull_files):
|
||||
"""Test that different S3 URLs create different local directories."""
|
||||
# Mock pull_files to avoid actually downloading files during tests
|
||||
@@ -479,16 +505,16 @@ def test_s3_url_different_models_create_different_directories(mock_pull_files):
|
||||
# Verify that different URLs produce different directories
|
||||
assert config1.model != config2.model, (
|
||||
f"Different S3 URLs should create different model directories. "
|
||||
f"URL1 model: {config1.model}, URL2 model: {config2.model}")
|
||||
f"URL1 model: {config1.model}, URL2 model: {config2.model}"
|
||||
)
|
||||
assert config1.tokenizer != config2.tokenizer, (
|
||||
f"Different S3 URLs should create different tokenizer directories. "
|
||||
f"URL1 tokenizer: {config1.tokenizer}, "
|
||||
f"URL2 tokenizer: {config2.tokenizer}")
|
||||
f"URL2 tokenizer: {config2.tokenizer}"
|
||||
)
|
||||
|
||||
# Verify that both sets of directories exist
|
||||
assert os.path.exists(config1.model) and os.path.isdir(config1.model)
|
||||
assert os.path.exists(config1.tokenizer) and os.path.isdir(
|
||||
config1.tokenizer)
|
||||
assert os.path.exists(config1.tokenizer) and os.path.isdir(config1.tokenizer)
|
||||
assert os.path.exists(config2.model) and os.path.isdir(config2.model)
|
||||
assert os.path.exists(config2.tokenizer) and os.path.isdir(
|
||||
config2.tokenizer)
|
||||
assert os.path.exists(config2.tokenizer) and os.path.isdir(config2.tokenizer)
|
||||
|
||||
Reference in New Issue
Block a user