diff --git a/tests/transformers_utils/test_utils.py b/tests/transformers_utils/test_utils.py new file mode 100644 index 000000000000..beaef04d766b --- /dev/null +++ b/tests/transformers_utils/test_utils.py @@ -0,0 +1,26 @@ +# SPDX-License-Identifier: Apache-2.0 +# SPDX-FileCopyrightText: Copyright contributors to the vLLM project + + +from vllm.transformers_utils.utils import is_cloud_storage, is_gcs, is_s3 + + +def test_is_gcs(): + assert is_gcs("gs://model-path") + assert not is_gcs("s3://model-path/path-to-model") + assert not is_gcs("/unix/local/path") + assert not is_gcs("nfs://nfs-fqdn.local") + + +def test_is_s3(): + assert is_s3("s3://model-path/path-to-model") + assert not is_s3("gs://model-path") + assert not is_s3("/unix/local/path") + assert not is_s3("nfs://nfs-fqdn.local") + + +def test_is_cloud_storage(): + assert is_cloud_storage("gs://model-path") + assert is_cloud_storage("s3://model-path/path-to-model") + assert not is_cloud_storage("/unix/local/path") + assert not is_cloud_storage("nfs://nfs-fqdn.local") diff --git a/vllm/engine/arg_utils.py b/vllm/engine/arg_utils.py index 66c75d944ec8..14fd4e70ad6c 100644 --- a/vllm/engine/arg_utils.py +++ b/vllm/engine/arg_utils.py @@ -86,7 +86,7 @@ from vllm.transformers_utils.config import ( is_interleaved, maybe_override_with_speculators, ) -from vllm.transformers_utils.utils import check_gguf_file, is_s3 +from vllm.transformers_utils.utils import check_gguf_file, is_cloud_storage from vllm.utils.argparse_utils import FlexibleArgumentParser from vllm.utils.mem_constants import GiB_bytes from vllm.utils.network_utils import get_ip @@ -1310,10 +1310,10 @@ class EngineArgs: # Check if the model is a speculator and override model/tokenizer/config # BEFORE creating ModelConfig, so the config is created with the target model - # Skip speculator detection for S3 models since HuggingFace cannot load - # configs directly from S3 URLs. S3 models can still use speculators with - # explicit --speculative-config. - if not is_s3(self.model): + # Skip speculator detection for cloud storage models (eg: S3, GCS) since + # HuggingFace cannot load configs directly from S3 URLs. S3 models can still + # use speculators with explicit --speculative-config. + if not is_cloud_storage(self.model): (self.model, self.tokenizer, self.speculative_config) = ( maybe_override_with_speculators( model=self.model, diff --git a/vllm/transformers_utils/utils.py b/vllm/transformers_utils/utils.py index af2df195f295..1ae42ba622dc 100644 --- a/vllm/transformers_utils/utils.py +++ b/vllm/transformers_utils/utils.py @@ -19,6 +19,14 @@ def is_s3(model_or_path: str) -> bool: return model_or_path.lower().startswith("s3://") +def is_gcs(model_or_path: str) -> bool: + return model_or_path.lower().startswith("gs://") + + +def is_cloud_storage(model_or_path: str) -> bool: + return is_s3(model_or_path) or is_gcs(model_or_path) + + def check_gguf_file(model: str | PathLike) -> bool: """Check if the file is a GGUF model.""" model = Path(model)