File size: 4,805 Bytes
2eafbc4
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
from abc import abstractmethod
from time import perf_counter
from typing import Any, List, Tuple, Union

import numpy as np

from inference.core.cache.model_artifacts import clear_cache, initialise_cache
from inference.core.entities.requests.inference import InferenceRequest
from inference.core.entities.responses.inference import InferenceResponse, StubResponse
from inference.core.models.base import Model
from inference.core.models.types import PreprocessReturnMetadata
from inference.core.utils.image_utils import np_image_to_base64


class ModelStub(Model):
    def __init__(self, model_id: str, api_key: str):
        super().__init__()
        self.model_id = model_id
        self.api_key = api_key
        self.dataset_id, self.version_id = model_id.split("/")
        self.metrics = {"num_inferences": 0, "avg_inference_time": 0.0}
        initialise_cache(model_id=model_id)

    def infer_from_request(
        self, request: InferenceRequest
    ) -> Union[InferenceResponse, List[InferenceResponse]]:
        t1 = perf_counter()
        stub_prediction = self.infer(**request.dict())
        response = self.make_response(request=request, prediction=stub_prediction)
        response.time = perf_counter() - t1
        return response

    def infer(self, *args, **kwargs) -> Any:
        _ = self.preprocess()
        dummy_prediction = self.predict()
        return self.postprocess(dummy_prediction)

    def preprocess(
        self, *args, **kwargs
    ) -> Tuple[np.ndarray, PreprocessReturnMetadata]:
        return np.zeros((128, 128, 3), dtype=np.uint8), {}  # type: ignore

    def predict(self, *args, **kwargs) -> Tuple[np.ndarray, ...]:
        return (np.zeros((1, 8)),)

    def postprocess(self, predictions: Tuple[np.ndarray, ...], *args, **kwargs) -> Any:
        return {
            "is_stub": True,
            "model_id": self.model_id,
        }

    def clear_cache(self) -> None:
        clear_cache(model_id=self.model_id)

    @abstractmethod
    def make_response(
        self, request: InferenceRequest, prediction: dict, **kwargs
    ) -> Union[InferenceResponse, List[InferenceResponse]]:
        pass


class ClassificationModelStub(ModelStub):
    task_type = "classification"

    def make_response(
        self, request: InferenceRequest, prediction: dict, **kwargs
    ) -> Union[InferenceResponse, List[InferenceResponse]]:
        stub_visualisation = None
        if getattr(request, "visualize_predictions", False):
            stub_visualisation = np_image_to_base64(
                np.zeros((128, 128, 3), dtype=np.uint8)
            )
        return StubResponse(
            is_stub=prediction["is_stub"],
            model_id=prediction["model_id"],
            task_type=self.task_type,
            visualization=stub_visualisation,
        )


class ObjectDetectionModelStub(ModelStub):
    task_type = "object-detection"

    def make_response(
        self, request: InferenceRequest, prediction: dict, **kwargs
    ) -> Union[InferenceResponse, List[InferenceResponse]]:
        stub_visualisation = None
        if getattr(request, "visualize_predictions", False):
            stub_visualisation = np_image_to_base64(
                np.zeros((128, 128, 3), dtype=np.uint8)
            )
        return StubResponse(
            is_stub=prediction["is_stub"],
            model_id=prediction["model_id"],
            task_type=self.task_type,
            visualization=stub_visualisation,
        )


class InstanceSegmentationModelStub(ModelStub):
    task_type = "instance-segmentation"

    def make_response(
        self, request: InferenceRequest, prediction: dict, **kwargs
    ) -> Union[InferenceResponse, List[InferenceResponse]]:
        stub_visualisation = None
        if getattr(request, "visualize_predictions", False):
            stub_visualisation = np_image_to_base64(
                np.zeros((128, 128, 3), dtype=np.uint8)
            )
        return StubResponse(
            is_stub=prediction["is_stub"],
            model_id=prediction["model_id"],
            task_type=self.task_type,
            visualization=stub_visualisation,
        )


class KeypointsDetectionModelStub(ModelStub):
    task_type = "keypoint-detection"

    def make_response(
        self, request: InferenceRequest, prediction: dict, **kwargs
    ) -> Union[InferenceResponse, List[InferenceResponse]]:
        stub_visualisation = None
        if getattr(request, "visualize_predictions", False):
            stub_visualisation = np_image_to_base64(
                np.zeros((128, 128, 3), dtype=np.uint8)
            )
        return StubResponse(
            is_stub=prediction["is_stub"],
            model_id=prediction["model_id"],
            task_type=self.task_type,
            visualization=stub_visualisation,
        )