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.
Files changed (47) hide show
  1. {litserve-0.2.6/src/litserve.egg-info → litserve-0.2.6.dev0}/PKG-INFO +6 -21
  2. {litserve-0.2.6 → litserve-0.2.6.dev0}/requirements.txt +0 -1
  3. {litserve-0.2.6 → litserve-0.2.6.dev0}/src/litserve/__about__.py +1 -1
  4. {litserve-0.2.6 → litserve-0.2.6.dev0}/src/litserve/__init__.py +0 -3
  5. {litserve-0.2.6 → litserve-0.2.6.dev0}/src/litserve/api.py +65 -10
  6. litserve-0.2.6.dev0/src/litserve/loops.py +631 -0
  7. {litserve-0.2.6 → litserve-0.2.6.dev0}/src/litserve/server.py +38 -68
  8. {litserve-0.2.6 → litserve-0.2.6.dev0}/src/litserve/specs/base.py +1 -8
  9. {litserve-0.2.6 → litserve-0.2.6.dev0}/src/litserve/specs/openai.py +8 -19
  10. {litserve-0.2.6 → litserve-0.2.6.dev0}/src/litserve/specs/openai_embedding.py +5 -11
  11. {litserve-0.2.6 → litserve-0.2.6.dev0}/src/litserve/utils.py +0 -59
  12. {litserve-0.2.6 → litserve-0.2.6.dev0/src/litserve.egg-info}/PKG-INFO +6 -21
  13. {litserve-0.2.6 → litserve-0.2.6.dev0}/src/litserve.egg-info/SOURCES.txt +1 -7
  14. {litserve-0.2.6 → litserve-0.2.6.dev0}/src/litserve.egg-info/requires.txt +0 -1
  15. litserve-0.2.6/src/litserve/loops/__init__.py +0 -38
  16. litserve-0.2.6/src/litserve/loops/base.py +0 -362
  17. litserve-0.2.6/src/litserve/loops/continuous_batching_loop.py +0 -286
  18. litserve-0.2.6/src/litserve/loops/loops.py +0 -96
  19. litserve-0.2.6/src/litserve/loops/simple_loops.py +0 -253
  20. litserve-0.2.6/src/litserve/loops/streaming_loops.py +0 -234
  21. litserve-0.2.6/src/litserve/zmq_queue.py +0 -179
  22. {litserve-0.2.6 → litserve-0.2.6.dev0}/LICENSE +0 -0
  23. {litserve-0.2.6 → litserve-0.2.6.dev0}/MANIFEST.in +0 -0
  24. {litserve-0.2.6 → litserve-0.2.6.dev0}/README.md +0 -0
  25. {litserve-0.2.6 → litserve-0.2.6.dev0}/setup.cfg +0 -0
  26. {litserve-0.2.6 → litserve-0.2.6.dev0}/setup.py +0 -0
  27. {litserve-0.2.6 → litserve-0.2.6.dev0}/src/litserve/__main__.py +0 -0
  28. {litserve-0.2.6 → litserve-0.2.6.dev0}/src/litserve/callbacks/__init__.py +0 -0
  29. {litserve-0.2.6 → litserve-0.2.6.dev0}/src/litserve/callbacks/base.py +0 -0
  30. {litserve-0.2.6 → litserve-0.2.6.dev0}/src/litserve/callbacks/defaults/__init__.py +0 -0
  31. {litserve-0.2.6 → litserve-0.2.6.dev0}/src/litserve/callbacks/defaults/metric_callback.py +0 -0
  32. {litserve-0.2.6 → litserve-0.2.6.dev0}/src/litserve/connector.py +0 -0
  33. {litserve-0.2.6 → litserve-0.2.6.dev0}/src/litserve/docker_builder.py +0 -0
  34. {litserve-0.2.6 → litserve-0.2.6.dev0}/src/litserve/loggers.py +0 -0
  35. {litserve-0.2.6 → litserve-0.2.6.dev0}/src/litserve/middlewares.py +0 -0
  36. {litserve-0.2.6 → litserve-0.2.6.dev0}/src/litserve/python_client.py +0 -0
  37. {litserve-0.2.6 → litserve-0.2.6.dev0}/src/litserve/schema/__init__.py +0 -0
  38. {litserve-0.2.6 → litserve-0.2.6.dev0}/src/litserve/schema/image.py +0 -0
  39. {litserve-0.2.6 → litserve-0.2.6.dev0}/src/litserve/specs/__init__.py +0 -0
  40. {litserve-0.2.6 → litserve-0.2.6.dev0}/src/litserve/test_examples/__init__.py +0 -0
  41. {litserve-0.2.6 → litserve-0.2.6.dev0}/src/litserve/test_examples/openai_embedding_spec_example.py +0 -0
  42. {litserve-0.2.6 → litserve-0.2.6.dev0}/src/litserve/test_examples/openai_spec_example.py +0 -0
  43. {litserve-0.2.6 → litserve-0.2.6.dev0}/src/litserve/test_examples/simple_example.py +0 -0
  44. {litserve-0.2.6 → litserve-0.2.6.dev0}/src/litserve.egg-info/dependency_links.txt +0 -0
  45. {litserve-0.2.6 → litserve-0.2.6.dev0}/src/litserve.egg-info/entry_points.txt +0 -0
  46. {litserve-0.2.6 → litserve-0.2.6.dev0}/src/litserve.egg-info/not-zip-safe +0 -0
  47. {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.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
- Dynamic: author
56
- Dynamic: author-email
57
- Dynamic: classifier
58
- Dynamic: description
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
 
@@ -1,3 +1,2 @@
1
1
  fastapi >=0.100
2
2
  uvicorn[standard] >=0.29.0
3
- pyzmq >=22.0.0
@@ -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
- raise NotImplementedError("predict is not implemented")
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 pre_setup(self, max_batch_size: int, spec: Optional[LitSpec]):
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
- spec.pre_setup(self)
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")