Skip to content

Commit 01c2fe7

Browse files
ps2181claude
andcommitted
[LLM] Fix dependency graph paper cuts: move imports to top level
Addresses two violations from #57890: 1. Move CloudFileSystem import from inside on_before_download_model_files_distributed() to module top level in cloud_downloader.py. 2. Audit all imports in python/ray/llm/_internal and move unjustified function-body imports to module top level: - common/utils/lora_utils.py: filelock.FileLock - batch/observability/usage_telemetry/usage.py: TagKey, HEAD_NODE_RESOURCE_NAME, PlacementGroupSchedulingStrategy - serve/observability/usage_telemetry/usage.py: TagKey, HEAD_NODE_RESOURCE_NAME, PlacementGroupSchedulingStrategy, AcceleratorType, AutoscalingConfig Remaining deferred imports are intentional: - serve/core/ingress/builder.py: LLMRouter kept lazy — router.py instantiates FastAPI() at module level with @serve.ingress(), which breaks Sphinx autodoc when fastapi is mocked. - Optional deps (vllm, transformers, sglang, huggingface_hub) stay lazy. - VLLMEngine/VLLMEngineConfig stay lazy to avoid hard vllm module-level dep. - Benchmark CLI imports stay lazy for startup performance. Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com> Signed-off-by: ps2181 <hellopritam31@gmail.com>
1 parent 0907fcf commit 01c2fe7

4 files changed

Lines changed: 11 additions & 19 deletions

File tree

python/ray/llm/_internal/batch/observability/usage_telemetry/usage.py

Lines changed: 3 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -2,9 +2,11 @@
22
from typing import Callable, Dict, List, Tuple, Union
33

44
import ray
5-
from ray._common.usage.usage_lib import record_extra_usage_tag
5+
from ray._common.constants import HEAD_NODE_RESOURCE_NAME
6+
from ray._common.usage.usage_lib import TagKey, record_extra_usage_tag
67
from ray.llm._internal.batch.observability.logging import get_logger
78
from ray.llm._internal.common.base_pydantic import BaseModelExtended
9+
from ray.util.scheduling_strategies import PlacementGroupSchedulingStrategy
810

911
LLM_BATCH_TELEMETRY_NAMESPACE = "llm_batch_telemetry"
1012
LLM_BATCH_TELEMETRY_ACTOR_NAME = "llm_batch_telemetry"
@@ -89,8 +91,6 @@ def generate_report(self) -> Dict[str, str]:
8991

9092
def record(self, telemetry: BatchModelTelemetry) -> None:
9193
"""Append and record telemetries."""
92-
from ray._common.usage.usage_lib import TagKey
93-
9494
self._tracking_telemetries.append(telemetry)
9595
telemetry_dict = self.generate_report()
9696
for key, value in telemetry_dict.items():
@@ -107,9 +107,6 @@ def __init__(self):
107107
LLM_BATCH_TELEMETRY_ACTOR_NAME, namespace=LLM_BATCH_TELEMETRY_NAMESPACE
108108
)
109109
except ValueError:
110-
from ray._common.constants import HEAD_NODE_RESOURCE_NAME
111-
from ray.util.scheduling_strategies import PlacementGroupSchedulingStrategy
112-
113110
self.remote_telemetry_agent = _TelemetryAgent.options(
114111
# Ensure the actor is created on the head node.
115112
resources={HEAD_NODE_RESOURCE_NAME: 0.001},

python/ray/llm/_internal/common/callbacks/cloud_downloader.py

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
from pydantic import BaseModel, field_validator
66

77
from .base import CallbackBase
8+
from ray.llm._internal.common.utils.cloud_utils import CloudFileSystem
89

910
logger = logging.getLogger(__name__)
1011

@@ -74,8 +75,6 @@ def __init__(self, **kwargs: Any) -> None:
7475

7576
def on_before_download_model_files_distributed(self) -> None:
7677
"""Download files from cloud storage to local paths before model files are downloaded."""
77-
from ray.llm._internal.common.utils.cloud_utils import CloudFileSystem
78-
7978
paths = self.kwargs["paths"]
8079
start_time = time.monotonic()
8180
for cloud_uri, local_path in paths:

python/ray/llm/_internal/common/utils/lora_utils.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,8 @@
1313
from functools import wraps
1414
from typing import Any, Callable, List, Optional, TypeVar, Union
1515

16+
from filelock import FileLock
17+
1618
from ray.llm._internal.common.constants import (
1719
CLOUD_OBJECT_EXISTS_EXPIRE_S,
1820
CLOUD_OBJECT_MISSING_EXPIRE_S,
@@ -113,8 +115,6 @@ def sync_files_with_lock(
113115
substrings_to_include: Optional[List[str]] = None,
114116
) -> None:
115117
"""Sync files from bucket_uri to local_path with file locking."""
116-
from filelock import FileLock
117-
118118
logger.info("Downloading %s to %s", bucket_uri, local_path)
119119

120120
with FileLock(local_path + ".lock", timeout=timeout or -1):

python/ray/llm/_internal/serve/observability/usage_telemetry/usage.py

Lines changed: 5 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -5,14 +5,19 @@
55

66
import ray
77
from ray import serve
8+
from ray._common.constants import HEAD_NODE_RESOURCE_NAME
89
from ray._common.usage.usage_lib import (
10+
TagKey,
911
get_hardware_usages_to_report,
1012
record_extra_usage_tag,
1113
)
1214
from ray.llm._internal.common.base_pydantic import BaseModelExtended
1315
from ray.llm._internal.common.observability.telemetry_utils import DEFAULT_GPU_TYPE
1416
from ray.llm._internal.common.utils.lora_utils import get_lora_model_ids
17+
from ray.llm._internal.serve.core.configs.accelerators import AcceleratorType
1518
from ray.llm._internal.serve.observability.logging import get_logger
19+
from ray.serve.config import AutoscalingConfig
20+
from ray.util.scheduling_strategies import PlacementGroupSchedulingStrategy
1621

1722
if TYPE_CHECKING:
1823
from ray.llm._internal.serve.core.configs.llm_config import LLMConfig
@@ -172,8 +177,6 @@ def generate_report(self) -> Dict[str, str]:
172177

173178
def record(self, model: Optional[TelemetryModel] = None) -> None:
174179
"""Record telemetry model."""
175-
from ray._common.usage.usage_lib import TagKey
176-
177180
if model:
178181
self.models.append(model)
179182

@@ -192,9 +195,6 @@ def _get_or_create_telemetry_agent() -> TelemetryAgent:
192195
LLM_SERVE_TELEMETRY_ACTOR_NAME, namespace=LLM_SERVE_TELEMETRY_NAMESPACE
193196
)
194197
except ValueError:
195-
from ray._common.constants import HEAD_NODE_RESOURCE_NAME
196-
from ray.util.scheduling_strategies import PlacementGroupSchedulingStrategy
197-
198198
telemetry_agent = TelemetryAgent.options(
199199
# Ensure the actor is created on the head node.
200200
resources={HEAD_NODE_RESOURCE_NAME: 0.001},
@@ -251,8 +251,6 @@ def infer_gpu_from_hardware(self) -> str:
251251
"""Infer the GPU type from the hardware when the accelerator type on llm config is
252252
not specified.
253253
"""
254-
from ray.llm._internal.serve.core.configs.accelerators import AcceleratorType
255-
256254
all_accelerator_types = [t.value for t in AcceleratorType]
257255
gcs_client = ray.experimental.internal_kv.internal_kv_get_gcs_client()
258256
hardwares = self._get_hardware_fn(gcs_client)
@@ -288,8 +286,6 @@ def push_telemetry_report_for_all_models(
288286
use_autoscaling = model.deployment_config.get("autoscaling_config") is not None
289287
num_replicas, min_replicas, max_replicas = 1, 1, 1
290288
if use_autoscaling:
291-
from ray.serve.config import AutoscalingConfig
292-
293289
autoscaling_config = AutoscalingConfig(
294290
**model.deployment_config["autoscaling_config"]
295291
)

0 commit comments

Comments
 (0)