model2service 0.0.1__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.
- model2service/__init__.py +9 -0
- model2service/src/__init__.py +5 -0
- model2service/src/model2service.py +33 -0
- model2service/src/model_repositories/__init__.py +2 -0
- model2service/src/model_repositories/mlflow_repository.py +12 -0
- model2service/src/model_repositories/model_repository.py +12 -0
- model2service/src/service_registries/__init__.py +2 -0
- model2service/src/service_registries/redis_registry.py +39 -0
- model2service/src/service_registries/service_registry.py +27 -0
- model2service-0.0.1.dist-info/METADATA +17 -0
- model2service-0.0.1.dist-info/RECORD +13 -0
- model2service-0.0.1.dist-info/WHEEL +5 -0
- model2service-0.0.1.dist-info/top_level.txt +1 -0
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
from __future__ import annotations
|
|
2
|
+
|
|
3
|
+
import abc
|
|
4
|
+
from .service_registries import ServiceRegistry, ModelServiceRegistry
|
|
5
|
+
from .model_repositories import ModelRepository, Model
|
|
6
|
+
|
|
7
|
+
from pydantic import BaseModel
|
|
8
|
+
|
|
9
|
+
# class Model2ServiceMapping(BaseModel):
|
|
10
|
+
# service_registry: ServiceRegistry
|
|
11
|
+
# model_repository: ModelRepository
|
|
12
|
+
|
|
13
|
+
|
|
14
|
+
class Model2Service():
|
|
15
|
+
|
|
16
|
+
def __init__(self,
|
|
17
|
+
service_registry: ServiceRegistry,
|
|
18
|
+
model_repository: ModelRepository
|
|
19
|
+
):
|
|
20
|
+
self.mode
|
|
21
|
+
|
|
22
|
+
def model_save(self, model: Model):
|
|
23
|
+
self.model_repository.save(model)
|
|
24
|
+
|
|
25
|
+
def model_load(self, model_name: str) -> Model:
|
|
26
|
+
return self.model_repository.load(model_name)
|
|
27
|
+
|
|
28
|
+
def service_register(self, model_service_registry: ModelServiceRegistry):
|
|
29
|
+
self.service_registry.register(model_service_registry)
|
|
30
|
+
|
|
31
|
+
def service_discover(self, model_name: str) -> ModelServiceRegistry:
|
|
32
|
+
return self.service_registry.discovery(model_name)
|
|
33
|
+
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
from mlflow.pyfunc.model import PythonModel, PythonModelContext
|
|
2
|
+
from .model_repository import Model
|
|
3
|
+
|
|
4
|
+
from .model_repository import ModelRepository
|
|
5
|
+
|
|
6
|
+
class MlflowRepository(ModelRepository):
|
|
7
|
+
def save(self, model: Model):
|
|
8
|
+
pass
|
|
9
|
+
|
|
10
|
+
def load(self) -> Model:
|
|
11
|
+
pass
|
|
12
|
+
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
from .service_registry import ServiceRegistry, ModelServiceRegistry
|
|
2
|
+
import redis
|
|
3
|
+
import os
|
|
4
|
+
from typing import Optional
|
|
5
|
+
|
|
6
|
+
ENVIRONMENT_VARIABLE_HOST = "REDIS_HOST"
|
|
7
|
+
ENVIRONMENT_VARIABLE_PORT = "REDIS_PORT"
|
|
8
|
+
|
|
9
|
+
class RedisServices(ServiceRegistry):
|
|
10
|
+
_instace = None
|
|
11
|
+
|
|
12
|
+
def __new__(cls):
|
|
13
|
+
if cls._instance is None:
|
|
14
|
+
instance = super().__new__(cls)
|
|
15
|
+
instance.client = redis.Redis(
|
|
16
|
+
host=instance.host,
|
|
17
|
+
port=int(instance.port),
|
|
18
|
+
decode_responses=True
|
|
19
|
+
)
|
|
20
|
+
cls._instance = instance
|
|
21
|
+
return cls._instance
|
|
22
|
+
|
|
23
|
+
def register(self, model_service: ModelServiceRegistry):
|
|
24
|
+
# registra o nome do modelo e a fila no serviço
|
|
25
|
+
key = f"model_queue:{model_service.service_name}"
|
|
26
|
+
self.client.set(key, model_service.queue_name)
|
|
27
|
+
|
|
28
|
+
def discovery(self, service_name: str) -> Optional[str]:
|
|
29
|
+
# retorna o nome da fila associada ao modelo
|
|
30
|
+
key = f"model_queue:{service_name}"
|
|
31
|
+
return self.client.get(key)
|
|
32
|
+
|
|
33
|
+
@property
|
|
34
|
+
def host(self):
|
|
35
|
+
return os.getenv(ENVIRONMENT_VARIABLE_HOST)
|
|
36
|
+
|
|
37
|
+
@property
|
|
38
|
+
def port(self):
|
|
39
|
+
return os.getenv(ENVIRONMENT_VARIABLE_PORT)
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
import abc
|
|
2
|
+
from pydantic import BaseModel
|
|
3
|
+
from collections.abc import Callable
|
|
4
|
+
from typing import Optional
|
|
5
|
+
from pika.spec import BasicProperties
|
|
6
|
+
|
|
7
|
+
|
|
8
|
+
#TODO this class does not belong in this file, maybe a MessageConsumer interface
|
|
9
|
+
class CallBackArguments(BaseModel):
|
|
10
|
+
body : bytes
|
|
11
|
+
#TODO make less coupling, maybe use dict[str, Any] for now
|
|
12
|
+
properties: BasicProperties
|
|
13
|
+
|
|
14
|
+
class ModelServiceRegistry(BaseModel):
|
|
15
|
+
service_name: str
|
|
16
|
+
queue_name: str
|
|
17
|
+
#TODO 'process' does not belong in this class, this class is only for registration
|
|
18
|
+
process: Callable[[CallBackArguments], Optional[BaseModel]]
|
|
19
|
+
|
|
20
|
+
@abc.abstractmethod
|
|
21
|
+
class ServiceRegistry(abc.ABC):
|
|
22
|
+
|
|
23
|
+
@abc.abstractmethod
|
|
24
|
+
def register(self, model_service: ModelServiceRegistry): ...
|
|
25
|
+
|
|
26
|
+
@abc.abstractmethod
|
|
27
|
+
def discovery(self, service_name: str) -> Optional[str]: ...
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
Metadata-Version: 2.4
|
|
2
|
+
Name: model2service
|
|
3
|
+
Version: 0.0.1
|
|
4
|
+
Author-email: Diego Pinheiro <diego.silva@unicap.br>
|
|
5
|
+
Project-URL: Homepage, https://github.com/projeto-carcara/model2service
|
|
6
|
+
Keywords: service
|
|
7
|
+
Classifier: Programming Language :: Python :: 3
|
|
8
|
+
Classifier: License :: OSI Approved :: MIT License
|
|
9
|
+
Classifier: Operating System :: OS Independent
|
|
10
|
+
Requires-Python: >=3.9
|
|
11
|
+
Description-Content-Type: text/markdown
|
|
12
|
+
Requires-Dist: pydantic==2.13.2
|
|
13
|
+
Requires-Dist: debugpy==1.8.20
|
|
14
|
+
Requires-Dist: pika==1.3.2
|
|
15
|
+
Requires-Dist: redis==7.4.0
|
|
16
|
+
|
|
17
|
+
# model2service
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
model2service/__init__.py,sha256=5toIgenSzxa_HnWEoKNnmbiQhhA23u_UshDna0LxFyo,261
|
|
2
|
+
model2service/src/__init__.py,sha256=VL8NWeATFuncXuBV7M7U3WMWuJ0WpWNVUgcyt8eldYE,99
|
|
3
|
+
model2service/src/model2service.py,sha256=YV_uKYR1lu6CBxpeI9CbVF92F1kHSkSrmuFDbTDuchE,992
|
|
4
|
+
model2service/src/model_repositories/__init__.py,sha256=9oor5e8p4hoyHnb3WEdyXfRoJ8mJCpkXeH_Xdym7q7s,64
|
|
5
|
+
model2service/src/model_repositories/mlflow_repository.py,sha256=QnZW-tfyJ1KP2pG7uAuNN7RHJHDYoAcsc8KaxYX-hcI,282
|
|
6
|
+
model2service/src/model_repositories/model_repository.py,sha256=PbXsVnAgpvyUcUdiaxdRQb9uhzHME2P2Bm3DhPm7kxc,210
|
|
7
|
+
model2service/src/service_registries/__init__.py,sha256=Qxy8TPYAOUCSQVLCKQwO8I0MmaCUYsR9buD4vkDxXzc,61
|
|
8
|
+
model2service/src/service_registries/redis_registry.py,sha256=zfFMf2jXohv1Cgvrzn_oEGpUIxHqzFBD3bDI7BU2FVA,1206
|
|
9
|
+
model2service/src/service_registries/service_registry.py,sha256=_KXQ_IsV-3CUdBjZ-rhSI8V6VW3CBwN84ulB2xUKiiQ,841
|
|
10
|
+
model2service-0.0.1.dist-info/METADATA,sha256=ohujwzvDFZYG58626Ny72abFcIlbXBUHnBybqNMhB3g,544
|
|
11
|
+
model2service-0.0.1.dist-info/WHEEL,sha256=aeYiig01lYGDzBgS8HxWXOg3uV61G9ijOsup-k9o1sk,91
|
|
12
|
+
model2service-0.0.1.dist-info/top_level.txt,sha256=U0j5cvdpPM8qMQ298RD6JqavG0TzGd_ijNhAw-hhPBQ,14
|
|
13
|
+
model2service-0.0.1.dist-info/RECORD,,
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
model2service
|