litserve 0.2.6__tar.gz → 0.2.6.dev0__tar.gz
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.
- {litserve-0.2.6/src/litserve.egg-info → litserve-0.2.6.dev0}/PKG-INFO +6 -21
- {litserve-0.2.6 → litserve-0.2.6.dev0}/requirements.txt +0 -1
- {litserve-0.2.6 → litserve-0.2.6.dev0}/src/litserve/__about__.py +1 -1
- {litserve-0.2.6 → litserve-0.2.6.dev0}/src/litserve/__init__.py +0 -3
- {litserve-0.2.6 → litserve-0.2.6.dev0}/src/litserve/api.py +65 -10
- litserve-0.2.6.dev0/src/litserve/loops.py +631 -0
- {litserve-0.2.6 → litserve-0.2.6.dev0}/src/litserve/server.py +38 -68
- {litserve-0.2.6 → litserve-0.2.6.dev0}/src/litserve/specs/base.py +1 -8
- {litserve-0.2.6 → litserve-0.2.6.dev0}/src/litserve/specs/openai.py +8 -19
- {litserve-0.2.6 → litserve-0.2.6.dev0}/src/litserve/specs/openai_embedding.py +5 -11
- {litserve-0.2.6 → litserve-0.2.6.dev0}/src/litserve/utils.py +0 -59
- {litserve-0.2.6 → litserve-0.2.6.dev0/src/litserve.egg-info}/PKG-INFO +6 -21
- {litserve-0.2.6 → litserve-0.2.6.dev0}/src/litserve.egg-info/SOURCES.txt +1 -7
- {litserve-0.2.6 → litserve-0.2.6.dev0}/src/litserve.egg-info/requires.txt +0 -1
- litserve-0.2.6/src/litserve/loops/__init__.py +0 -38
- litserve-0.2.6/src/litserve/loops/base.py +0 -362
- litserve-0.2.6/src/litserve/loops/continuous_batching_loop.py +0 -286
- litserve-0.2.6/src/litserve/loops/loops.py +0 -96
- litserve-0.2.6/src/litserve/loops/simple_loops.py +0 -253
- litserve-0.2.6/src/litserve/loops/streaming_loops.py +0 -234
- litserve-0.2.6/src/litserve/zmq_queue.py +0 -179
- {litserve-0.2.6 → litserve-0.2.6.dev0}/LICENSE +0 -0
- {litserve-0.2.6 → litserve-0.2.6.dev0}/MANIFEST.in +0 -0
- {litserve-0.2.6 → litserve-0.2.6.dev0}/README.md +0 -0
- {litserve-0.2.6 → litserve-0.2.6.dev0}/setup.cfg +0 -0
- {litserve-0.2.6 → litserve-0.2.6.dev0}/setup.py +0 -0
- {litserve-0.2.6 → litserve-0.2.6.dev0}/src/litserve/__main__.py +0 -0
- {litserve-0.2.6 → litserve-0.2.6.dev0}/src/litserve/callbacks/__init__.py +0 -0
- {litserve-0.2.6 → litserve-0.2.6.dev0}/src/litserve/callbacks/base.py +0 -0
- {litserve-0.2.6 → litserve-0.2.6.dev0}/src/litserve/callbacks/defaults/__init__.py +0 -0
- {litserve-0.2.6 → litserve-0.2.6.dev0}/src/litserve/callbacks/defaults/metric_callback.py +0 -0
- {litserve-0.2.6 → litserve-0.2.6.dev0}/src/litserve/connector.py +0 -0
- {litserve-0.2.6 → litserve-0.2.6.dev0}/src/litserve/docker_builder.py +0 -0
- {litserve-0.2.6 → litserve-0.2.6.dev0}/src/litserve/loggers.py +0 -0
- {litserve-0.2.6 → litserve-0.2.6.dev0}/src/litserve/middlewares.py +0 -0
- {litserve-0.2.6 → litserve-0.2.6.dev0}/src/litserve/python_client.py +0 -0
- {litserve-0.2.6 → litserve-0.2.6.dev0}/src/litserve/schema/__init__.py +0 -0
- {litserve-0.2.6 → litserve-0.2.6.dev0}/src/litserve/schema/image.py +0 -0
- {litserve-0.2.6 → litserve-0.2.6.dev0}/src/litserve/specs/__init__.py +0 -0
- {litserve-0.2.6 → litserve-0.2.6.dev0}/src/litserve/test_examples/__init__.py +0 -0
- {litserve-0.2.6 → litserve-0.2.6.dev0}/src/litserve/test_examples/openai_embedding_spec_example.py +0 -0
- {litserve-0.2.6 → litserve-0.2.6.dev0}/src/litserve/test_examples/openai_spec_example.py +0 -0
- {litserve-0.2.6 → litserve-0.2.6.dev0}/src/litserve/test_examples/simple_example.py +0 -0
- {litserve-0.2.6 → litserve-0.2.6.dev0}/src/litserve.egg-info/dependency_links.txt +0 -0
- {litserve-0.2.6 → litserve-0.2.6.dev0}/src/litserve.egg-info/entry_points.txt +0 -0
- {litserve-0.2.6 → litserve-0.2.6.dev0}/src/litserve.egg-info/not-zip-safe +0 -0
- {litserve-0.2.6 → litserve-0.2.6.dev0}/src/litserve.egg-info/top_level.txt +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
Metadata-Version: 2.
|
|
1
|
+
Metadata-Version: 2.1
|
|
2
2
|
Name: litserve
|
|
3
|
-
Version: 0.2.6
|
|
3
|
+
Version: 0.2.6.dev0
|
|
4
4
|
Summary: Lightweight AI server.
|
|
5
5
|
Home-page: https://github.com/Lightning-AI/litserve
|
|
6
6
|
Download-URL: https://github.com/Lightning-AI/litserve
|
|
@@ -29,11 +29,6 @@ Description-Content-Type: text/markdown
|
|
|
29
29
|
License-File: LICENSE
|
|
30
30
|
Requires-Dist: fastapi>=0.100
|
|
31
31
|
Requires-Dist: uvicorn[standard]>=0.29.0
|
|
32
|
-
Requires-Dist: pyzmq>=22.0.0
|
|
33
|
-
Provides-Extra: perf
|
|
34
|
-
Requires-Dist: jsonargparse; extra == "perf"
|
|
35
|
-
Requires-Dist: tenacity; extra == "perf"
|
|
36
|
-
Requires-Dist: uvloop; extra == "perf"
|
|
37
32
|
Provides-Extra: test
|
|
38
33
|
Requires-Dist: asgi-lifespan; extra == "test"
|
|
39
34
|
Requires-Dist: coverage[toml]>=7.5.3; extra == "test"
|
|
@@ -52,20 +47,10 @@ Requires-Dist: python-multipart; extra == "test"
|
|
|
52
47
|
Requires-Dist: requests; extra == "test"
|
|
53
48
|
Requires-Dist: torch>2.0.0; extra == "test"
|
|
54
49
|
Requires-Dist: transformers; extra == "test"
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
Dynamic: description-content-type
|
|
60
|
-
Dynamic: download-url
|
|
61
|
-
Dynamic: home-page
|
|
62
|
-
Dynamic: keywords
|
|
63
|
-
Dynamic: license
|
|
64
|
-
Dynamic: project-url
|
|
65
|
-
Dynamic: provides-extra
|
|
66
|
-
Dynamic: requires-dist
|
|
67
|
-
Dynamic: requires-python
|
|
68
|
-
Dynamic: summary
|
|
50
|
+
Provides-Extra: perf
|
|
51
|
+
Requires-Dist: jsonargparse; extra == "perf"
|
|
52
|
+
Requires-Dist: tenacity; extra == "perf"
|
|
53
|
+
Requires-Dist: uvloop; extra == "perf"
|
|
69
54
|
|
|
70
55
|
<div align='center'>
|
|
71
56
|
|
|
@@ -11,7 +11,7 @@
|
|
|
11
11
|
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
12
12
|
# See the License for the specific language governing permissions and
|
|
13
13
|
# limitations under the License.
|
|
14
|
-
__version__ = "0.2.6"
|
|
14
|
+
__version__ = "0.2.6.dev0"
|
|
15
15
|
__author__ = "Lightning-AI et al."
|
|
16
16
|
__author_email__ = "community@lightning.ai"
|
|
17
17
|
__license__ = "Apache-2.0"
|
|
@@ -18,9 +18,6 @@ from litserve.callbacks import Callback
|
|
|
18
18
|
from litserve.loggers import Logger
|
|
19
19
|
from litserve.server import LitServer, Request, Response
|
|
20
20
|
from litserve.specs import OpenAIEmbeddingSpec, OpenAISpec
|
|
21
|
-
from litserve.utils import configure_logging
|
|
22
|
-
|
|
23
|
-
configure_logging()
|
|
24
21
|
|
|
25
22
|
__all__ = [
|
|
26
23
|
"LitAPI",
|
|
@@ -11,6 +11,7 @@
|
|
|
11
11
|
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
12
12
|
# See the License for the specific language governing permissions and
|
|
13
13
|
# limitations under the License.
|
|
14
|
+
import inspect
|
|
14
15
|
import json
|
|
15
16
|
import warnings
|
|
16
17
|
from abc import ABC, abstractmethod
|
|
@@ -56,9 +57,10 @@ class LitAPI(ABC):
|
|
|
56
57
|
|
|
57
58
|
return inputs
|
|
58
59
|
|
|
60
|
+
@abstractmethod
|
|
59
61
|
def predict(self, x, **kwargs):
|
|
60
62
|
"""Run the model on the input and return or yield the output."""
|
|
61
|
-
|
|
63
|
+
pass
|
|
62
64
|
|
|
63
65
|
def _unbatch_no_stream(self, output):
|
|
64
66
|
if isinstance(output, str):
|
|
@@ -111,16 +113,75 @@ class LitAPI(ABC):
|
|
|
111
113
|
def device(self, value):
|
|
112
114
|
self._device = value
|
|
113
115
|
|
|
114
|
-
def
|
|
115
|
-
self.max_batch_size = max_batch_size
|
|
116
|
+
def _sanitize(self, max_batch_size: int, spec: Optional[LitSpec]):
|
|
116
117
|
if self.stream:
|
|
117
118
|
self._default_unbatch = self._unbatch_stream
|
|
118
119
|
else:
|
|
119
120
|
self._default_unbatch = self._unbatch_no_stream
|
|
120
121
|
|
|
122
|
+
# we will sanitize regularly if no spec
|
|
123
|
+
# in case, we have spec then:
|
|
124
|
+
# case 1: spec implements a streaming API
|
|
125
|
+
# Case 2: spec implements a non-streaming API
|
|
121
126
|
if spec:
|
|
127
|
+
# TODO: Implement sanitization
|
|
122
128
|
self._spec = spec
|
|
123
|
-
|
|
129
|
+
return
|
|
130
|
+
|
|
131
|
+
original = self.unbatch.__code__ is LitAPI.unbatch.__code__
|
|
132
|
+
if (
|
|
133
|
+
self.stream
|
|
134
|
+
and max_batch_size > 1
|
|
135
|
+
and not all([
|
|
136
|
+
inspect.isgeneratorfunction(self.predict),
|
|
137
|
+
inspect.isgeneratorfunction(self.encode_response),
|
|
138
|
+
(original or inspect.isgeneratorfunction(self.unbatch)),
|
|
139
|
+
])
|
|
140
|
+
):
|
|
141
|
+
raise ValueError(
|
|
142
|
+
"""When `stream=True` with max_batch_size > 1, `lit_api.predict`, `lit_api.encode_response` and
|
|
143
|
+
`lit_api.unbatch` must generate values using `yield`.
|
|
144
|
+
|
|
145
|
+
Example:
|
|
146
|
+
|
|
147
|
+
def predict(self, inputs):
|
|
148
|
+
...
|
|
149
|
+
for i in range(max_token_length):
|
|
150
|
+
yield prediction
|
|
151
|
+
|
|
152
|
+
def encode_response(self, outputs):
|
|
153
|
+
for output in outputs:
|
|
154
|
+
encoded_output = ...
|
|
155
|
+
yield encoded_output
|
|
156
|
+
|
|
157
|
+
def unbatch(self, outputs):
|
|
158
|
+
for output in outputs:
|
|
159
|
+
unbatched_output = ...
|
|
160
|
+
yield unbatched_output
|
|
161
|
+
"""
|
|
162
|
+
)
|
|
163
|
+
|
|
164
|
+
if self.stream and not all([
|
|
165
|
+
inspect.isgeneratorfunction(self.predict),
|
|
166
|
+
inspect.isgeneratorfunction(self.encode_response),
|
|
167
|
+
]):
|
|
168
|
+
raise ValueError(
|
|
169
|
+
"""When `stream=True` both `lit_api.predict` and
|
|
170
|
+
`lit_api.encode_response` must generate values using `yield`.
|
|
171
|
+
|
|
172
|
+
Example:
|
|
173
|
+
|
|
174
|
+
def predict(self, inputs):
|
|
175
|
+
...
|
|
176
|
+
for i in range(max_token_length):
|
|
177
|
+
yield prediction
|
|
178
|
+
|
|
179
|
+
def encode_response(self, outputs):
|
|
180
|
+
for output in outputs:
|
|
181
|
+
encoded_output = ...
|
|
182
|
+
yield encoded_output
|
|
183
|
+
"""
|
|
184
|
+
)
|
|
124
185
|
|
|
125
186
|
def set_logger_queue(self, queue: Queue):
|
|
126
187
|
"""Set the queue for logging events."""
|
|
@@ -137,9 +198,3 @@ class LitAPI(ABC):
|
|
|
137
198
|
)
|
|
138
199
|
return
|
|
139
200
|
self._logger_queue.put((key, value))
|
|
140
|
-
|
|
141
|
-
def has_active_requests(self) -> bool:
|
|
142
|
-
raise NotImplementedError("has_active_requests is not implemented")
|
|
143
|
-
|
|
144
|
-
def has_capacity(self) -> bool:
|
|
145
|
-
raise NotImplementedError("has_capacity is not implemented")
|