ray-embedding 0.13.17__py3-none-any.whl → 0.14.5__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.

Potentially problematic release.


This version of ray-embedding might be problematic. Click here for more details.

ray_embedding/deploy.py CHANGED
@@ -1,13 +1,13 @@
1
1
  import os
2
+ from typing import Any, Dict
2
3
 
3
4
  import torch
4
5
  from ray.serve import Application
5
6
 
6
7
  from ray_embedding.dto import AppConfig, ModelDeploymentConfig, DeployedModel, NodeReaperConfig
7
8
  from ray_embedding.embedding_model import EmbeddingModel
8
- from ray_embedding.node_reaper import NodeReaper, NODE_REAPER_DEPLOYMENT_NAME
9
- from ray_embedding.utils import node_affinity_for_head, node_affinity_for_worker
10
9
  from ray_embedding.model_router import ModelRouter
10
+ from ray_embedding.node_reaper import NodeReaper, NODE_REAPER_DEPLOYMENT_NAME
11
11
 
12
12
 
13
13
  def build_model(model_config: ModelDeploymentConfig, node_reaper):
@@ -56,7 +56,7 @@ def build_app(args: AppConfig) -> Application:
56
56
 
57
57
  node_reaper_config = args.node_reaper or NodeReaperConfig()
58
58
 
59
- node_reaper_kwargs = {
59
+ node_reaper_kwargs: Dict[str, Any] = {
60
60
  "ssh_user": node_reaper_config.ssh_user,
61
61
  "ssh_private_key": node_reaper_config.ssh_private_key,
62
62
  }
@@ -67,13 +67,20 @@ def build_app(args: AppConfig) -> Application:
67
67
 
68
68
  node_reaper = NodeReaper.options(
69
69
  name=NODE_REAPER_DEPLOYMENT_NAME,
70
- ray_actor_options={"num_cpus": 0.25, f"node:{HEAD_NODE_IP}": 1},
70
+ ray_actor_options={"num_cpus": 0.25, "resources": {"head_node": 1}},
71
71
  autoscaling_config={"initial_replicas": 1, "min_replicas": 1, "max_replicas": 1}
72
72
  ).bind(**node_reaper_kwargs)
73
-
73
+
74
74
  deployed_models = {model_config.served_model_name: build_model(model_config, node_reaper) for model_config in models}
75
+ model_router_kwargs = {
76
+ "deployed_models": deployed_models,
77
+ "path_prefix": model_router.path_prefix,
78
+ "max_concurrency": model_router.max_concurrency,
79
+ "node_reaper": node_reaper
80
+ }
75
81
  router = ModelRouter.options(
76
- name=model_router.deployment
77
- ).bind(deployed_models, model_router.path_prefix, node_reaper)
82
+ name=model_router.deployment,
83
+ ray_actor_options={"num_cpus": 0.25, "resources": {"worker_node": 1}}
84
+ ).bind(**model_router_kwargs)
78
85
 
79
86
  return router
@@ -25,16 +25,17 @@ class EmbeddingModel:
25
25
  self.served_model_name = served_model_name or os.path.basename(self.model)
26
26
  self.init_device = device
27
27
  self.cuda_memory_flush_threshold = cuda_memory_flush_threshold
28
- if self.init_device is None or self.init_device == "auto":
29
- self.init_device = "cuda" if torch.cuda.is_available() else "cpu"
30
- if self.init_device == "cuda":
31
- self.wait_for_cuda()
28
+ self.node_reaper = node_reaper
32
29
  self.torch_device = torch.device(self.init_device)
33
30
  self.backend = backend or "torch"
34
31
  self.matryoshka_dim = matryoshka_dim
35
32
  self.trust_remote_code = trust_remote_code or False
36
33
  self.model_kwargs = model_kwargs or {}
37
- self.node_reaper = node_reaper
34
+
35
+ if self.init_device is None or self.init_device == "auto":
36
+ self.init_device = "cuda" if torch.cuda.is_available() else "cpu"
37
+ if self.init_device == "cuda":
38
+ self.wait_for_cuda()
38
39
 
39
40
  self.logger.info(f"Initializing embedding model: {self.model}")
40
41
  self.embedding_model = SentenceTransformer(self.model, device=self.init_device, backend=self.backend,
@@ -4,7 +4,6 @@ import time
4
4
  from typing import Optional, Dict, List, Tuple
5
5
 
6
6
  from fastapi import FastAPI, HTTPException
7
- import ray
8
7
  from ray import serve
9
8
  from ray.serve.handle import DeploymentHandle
10
9
 
@@ -116,12 +115,12 @@ class ModelRouter:
116
115
  raise HTTPException(status_code=400, detail=f"The API path prefix specified is invalid: '{path_prefix}'")
117
116
  return {"object": "list", "data": self.available_models}
118
117
 
119
- def check_health(self):
118
+ async def check_health(self):
120
119
  if not self.node_reaper:
121
120
  return
122
121
 
123
122
  try:
124
- unhealthy_node_ips = ray.get(self.node_reaper.get_unhealthy_node_ips.remote())
123
+ unhealthy_node_ips = await self.node_reaper.get_unhealthy_node_ips.remote()
125
124
  except Exception as exc:
126
125
  self.logger.warning(f"Unable to fetch node reaper data: {exc}")
127
126
  return
@@ -5,17 +5,12 @@ from pathlib import Path
5
5
  from typing import Dict, Any, List, Optional, Set
6
6
 
7
7
  from ray import serve
8
- from ray_embedding.utils import HEAD_NODE_IP
9
8
 
10
9
 
11
10
  NODE_REAPER_DEPLOYMENT_NAME = "NodeReaper"
12
11
 
13
12
 
14
- @serve.deployment(
15
- name=NODE_REAPER_DEPLOYMENT_NAME,
16
- ray_actor_options={"num_cpus": 0.25, f"node:{HEAD_NODE_IP}": 1},
17
- autoscaling_config={"initial_replicas": 1, "min_replicas": 1, "max_replicas": 1},
18
- )
13
+ @serve.deployment
19
14
  class NodeReaper:
20
15
  def __init__(
21
16
  self,
ray_embedding/utils.py CHANGED
@@ -1,15 +1,12 @@
1
1
  from typing import Optional, Tuple
2
2
 
3
- import ray
4
3
  from ray import serve
5
4
  from ray.serve.handle import DeploymentHandle
6
5
  from ray.util import get_node_ip_address, state
7
- from ray.util.scheduling_strategies import NodeAffinitySchedulingStrategy, NotIn
8
6
 
9
7
  from ray_embedding.node_reaper import NODE_REAPER_DEPLOYMENT_NAME
10
8
 
11
9
 
12
-
13
10
  def get_head_node_id() -> Tuple[str, str]:
14
11
  try:
15
12
  nodes = state.list_nodes(filters=[("is_head_node", "=", True)])
@@ -21,17 +18,6 @@ def get_head_node_id() -> Tuple[str, str]:
21
18
  raise RuntimeError("Unable to locate the head node ID for NodeReaper deployment.") from exc
22
19
 
23
20
 
24
- HEAD_NODE_ID, HEAD_NODE_IP = get_head_node_id()
25
-
26
-
27
- def node_affinity_for_head() -> NodeAffinitySchedulingStrategy:
28
- return NodeAffinitySchedulingStrategy(node_id=HEAD_NODE_ID, soft=False)
29
-
30
-
31
- def node_affinity_for_worker() -> NodeAffinitySchedulingStrategy:
32
- return NodeAffinitySchedulingStrategy(node_id=NotIn(HEAD_NODE_ID), soft=False)
33
-
34
-
35
21
  def get_node_reaper_handle() -> DeploymentHandle:
36
22
  try:
37
23
  return serve.context.get_deployment_handle(NODE_REAPER_DEPLOYMENT_NAME)
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: ray-embedding
3
- Version: 0.13.17
3
+ Version: 0.14.5
4
4
  Summary: Deploy SentenceTransformers embedding models to a ray cluster
5
5
  Author: Crispin Almodovar
6
6
  Author-email:
@@ -0,0 +1,11 @@
1
+ ray_embedding/__init__.py,sha256=YS5LAZfRIwwVvE3C9g7hsauvjgIkqKtHyxkwMFFfAGY,46
2
+ ray_embedding/deploy.py,sha256=Q3J-zVVqGkJ0CiIL_cevDrPWhOzLf5i-5Oz2wjlPR48,4111
3
+ ray_embedding/dto.py,sha256=6JuAcD6pLfzUL48HfyPnZI7Hb-o66KFM5UtYZOOgwc8,1739
4
+ ray_embedding/embedding_model.py,sha256=_X4W4uozmcPgfFhSGaP2UDVMLQVoXlZjcFpNqFoIRxg,4906
5
+ ray_embedding/model_router.py,sha256=0CKlT4AvnzY-7OjzGF8L5-HA4vvmdJ9MUfHmKdWp1Pw,6650
6
+ ray_embedding/node_reaper.py,sha256=ISwSHnQs22B_f3PihND3KYTLkJSDbg1JWIAaKS-qCm0,4800
7
+ ray_embedding/utils.py,sha256=FAV1xQWa9GeAIm5w2HrP-pgFZBkB0LYUcX6ly6zlYg0,1805
8
+ ray_embedding-0.14.5.dist-info/METADATA,sha256=QBBj7TFoIqZB35c3hPsSKS7FnUzq6YTHujFP9zdADAw,1094
9
+ ray_embedding-0.14.5.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
10
+ ray_embedding-0.14.5.dist-info/top_level.txt,sha256=ziCblpJq1YsrryshFqxTRuRMgNuO1_tgvAAkGShATNA,14
11
+ ray_embedding-0.14.5.dist-info/RECORD,,
@@ -1,11 +0,0 @@
1
- ray_embedding/__init__.py,sha256=YS5LAZfRIwwVvE3C9g7hsauvjgIkqKtHyxkwMFFfAGY,46
2
- ray_embedding/deploy.py,sha256=xFPRUQVYkjBp9WbOV8Ag-l8I4Hjq7iZijXZzDl09GK0,3882
3
- ray_embedding/dto.py,sha256=6JuAcD6pLfzUL48HfyPnZI7Hb-o66KFM5UtYZOOgwc8,1739
4
- ray_embedding/embedding_model.py,sha256=Zr5lxVuy60y8-JgsOmKDD44FZlbTL1tiiY-3_72sTR4,4905
5
- ray_embedding/model_router.py,sha256=W2c0hvqwDe1iCfNx4ee2UT7wKduywMP8dY0Ggb8xBvU,6658
6
- ray_embedding/node_reaper.py,sha256=MBTf20RmXvW90w3ufwNCIiakWeVOhfXZey2GCnE816Q,5041
7
- ray_embedding/utils.py,sha256=NcxUbZVonN0FZIvRdJt3nuyKT7JSPM4x6i2-9Ncv3h4,2241
8
- ray_embedding-0.13.17.dist-info/METADATA,sha256=aoLmk2j7H9iDCSLy6eOZGr21guKA47Rbq4o0UmmouZA,1095
9
- ray_embedding-0.13.17.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
10
- ray_embedding-0.13.17.dist-info/top_level.txt,sha256=ziCblpJq1YsrryshFqxTRuRMgNuO1_tgvAAkGShATNA,14
11
- ray_embedding-0.13.17.dist-info/RECORD,,