litserve 0.2.4__tar.gz → 0.2.5.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 (36) hide show
  1. {litserve-0.2.4/src/litserve.egg-info → litserve-0.2.5.dev0}/PKG-INFO +1 -1
  2. {litserve-0.2.4 → litserve-0.2.5.dev0}/src/litserve/__about__.py +1 -1
  3. {litserve-0.2.4 → litserve-0.2.5.dev0}/src/litserve/loops.py +10 -5
  4. {litserve-0.2.4 → litserve-0.2.5.dev0}/src/litserve/server.py +12 -12
  5. {litserve-0.2.4 → litserve-0.2.5.dev0}/src/litserve/test_examples/openai_spec_example.py +1 -1
  6. {litserve-0.2.4 → litserve-0.2.5.dev0}/src/litserve/utils.py +9 -0
  7. {litserve-0.2.4 → litserve-0.2.5.dev0/src/litserve.egg-info}/PKG-INFO +1 -1
  8. {litserve-0.2.4 → litserve-0.2.5.dev0}/LICENSE +0 -0
  9. {litserve-0.2.4 → litserve-0.2.5.dev0}/MANIFEST.in +0 -0
  10. {litserve-0.2.4 → litserve-0.2.5.dev0}/README.md +0 -0
  11. {litserve-0.2.4 → litserve-0.2.5.dev0}/requirements.txt +0 -0
  12. {litserve-0.2.4 → litserve-0.2.5.dev0}/setup.cfg +0 -0
  13. {litserve-0.2.4 → litserve-0.2.5.dev0}/setup.py +0 -0
  14. {litserve-0.2.4 → litserve-0.2.5.dev0}/src/litserve/__init__.py +0 -0
  15. {litserve-0.2.4 → litserve-0.2.5.dev0}/src/litserve/__main__.py +0 -0
  16. {litserve-0.2.4 → litserve-0.2.5.dev0}/src/litserve/api.py +0 -0
  17. {litserve-0.2.4 → litserve-0.2.5.dev0}/src/litserve/callbacks/__init__.py +0 -0
  18. {litserve-0.2.4 → litserve-0.2.5.dev0}/src/litserve/callbacks/base.py +0 -0
  19. {litserve-0.2.4 → litserve-0.2.5.dev0}/src/litserve/callbacks/defaults/__init__.py +0 -0
  20. {litserve-0.2.4 → litserve-0.2.5.dev0}/src/litserve/callbacks/defaults/metric_callback.py +0 -0
  21. {litserve-0.2.4 → litserve-0.2.5.dev0}/src/litserve/connector.py +0 -0
  22. {litserve-0.2.4 → litserve-0.2.5.dev0}/src/litserve/docker_builder.py +0 -0
  23. {litserve-0.2.4 → litserve-0.2.5.dev0}/src/litserve/loggers.py +0 -0
  24. {litserve-0.2.4 → litserve-0.2.5.dev0}/src/litserve/middlewares.py +0 -0
  25. {litserve-0.2.4 → litserve-0.2.5.dev0}/src/litserve/python_client.py +0 -0
  26. {litserve-0.2.4 → litserve-0.2.5.dev0}/src/litserve/specs/__init__.py +0 -0
  27. {litserve-0.2.4 → litserve-0.2.5.dev0}/src/litserve/specs/base.py +0 -0
  28. {litserve-0.2.4 → litserve-0.2.5.dev0}/src/litserve/specs/openai.py +0 -0
  29. {litserve-0.2.4 → litserve-0.2.5.dev0}/src/litserve/test_examples/__init__.py +0 -0
  30. {litserve-0.2.4 → litserve-0.2.5.dev0}/src/litserve/test_examples/simple_example.py +0 -0
  31. {litserve-0.2.4 → litserve-0.2.5.dev0}/src/litserve.egg-info/SOURCES.txt +0 -0
  32. {litserve-0.2.4 → litserve-0.2.5.dev0}/src/litserve.egg-info/dependency_links.txt +0 -0
  33. {litserve-0.2.4 → litserve-0.2.5.dev0}/src/litserve.egg-info/entry_points.txt +0 -0
  34. {litserve-0.2.4 → litserve-0.2.5.dev0}/src/litserve.egg-info/not-zip-safe +0 -0
  35. {litserve-0.2.4 → litserve-0.2.5.dev0}/src/litserve.egg-info/requires.txt +0 -0
  36. {litserve-0.2.4 → litserve-0.2.5.dev0}/src/litserve.egg-info/top_level.txt +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: litserve
3
- Version: 0.2.4
3
+ Version: 0.2.5.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
@@ -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.4"
14
+ __version__ = "0.2.5.dev0"
15
15
  __author__ = "Lightning-AI et al."
16
16
  __author_email__ = "community@lightning.ai"
17
17
  __license__ = "Apache-2.0"
@@ -26,7 +26,7 @@ from starlette.formparsers import MultiPartParser
26
26
  from litserve import LitAPI
27
27
  from litserve.callbacks import CallbackRunner, EventTypes
28
28
  from litserve.specs.base import LitSpec
29
- from litserve.utils import LitAPIStatus, PickleableHTTPException
29
+ from litserve.utils import LitAPIStatus, PickleableHTTPException, WorkerSetupStatus
30
30
 
31
31
  mp.allow_connection_pickling()
32
32
 
@@ -399,18 +399,23 @@ def inference_worker(
399
399
  max_batch_size: int,
400
400
  batch_timeout: float,
401
401
  stream: bool,
402
- workers_setup_status: Dict[str, bool],
402
+ workers_setup_status: Dict[int, str],
403
403
  callback_runner: CallbackRunner,
404
404
  ):
405
405
  callback_runner.trigger_event(EventTypes.BEFORE_SETUP, lit_api=lit_api)
406
- lit_api.setup(device)
406
+ try:
407
+ lit_api.setup(device)
408
+ except Exception:
409
+ logger.exception(f"Error setting up worker {worker_id}.")
410
+ workers_setup_status[worker_id] = WorkerSetupStatus.ERROR
411
+ return
407
412
  lit_api.device = device
408
413
  callback_runner.trigger_event(EventTypes.AFTER_SETUP, lit_api=lit_api)
409
414
 
410
- print(f"Setup complete for worker {worker_id}.")
415
+ logger.info(f"Setup complete for worker {worker_id}.")
411
416
 
412
417
  if workers_setup_status:
413
- workers_setup_status[worker_id] = True
418
+ workers_setup_status[worker_id] = WorkerSetupStatus.READY
414
419
 
415
420
  if lit_spec:
416
421
  logging.info(f"LitServe will use {lit_spec.__class__.__name__} spec")
@@ -44,18 +44,10 @@ from litserve.middlewares import MaxSizeMiddleware, RequestCountMiddleware
44
44
  from litserve.python_client import client_template
45
45
  from litserve.specs import OpenAISpec
46
46
  from litserve.specs.base import LitSpec
47
- from litserve.utils import LitAPIStatus, call_after_stream
47
+ from litserve.utils import LitAPIStatus, WorkerSetupStatus, call_after_stream
48
48
 
49
49
  mp.allow_connection_pickling()
50
50
 
51
- try:
52
- import uvloop
53
-
54
- asyncio.set_event_loop_policy(uvloop.EventLoopPolicy())
55
-
56
- except ImportError:
57
- print("uvloop is not installed. Falling back to the default asyncio event loop.")
58
-
59
51
  logger = logging.getLogger(__name__)
60
52
 
61
53
  # if defined, it will require clients to auth with X-API-Key in the header
@@ -233,7 +225,7 @@ class LitServer:
233
225
  if len(device) == 1:
234
226
  device = device[0]
235
227
 
236
- self.workers_setup_status[worker_id] = False
228
+ self.workers_setup_status[worker_id] = WorkerSetupStatus.STARTING
237
229
 
238
230
  ctx = mp.get_context("spawn")
239
231
  process = ctx.Process(
@@ -328,7 +320,7 @@ class LitServer:
328
320
  async def health(request: Request) -> Response:
329
321
  nonlocal workers_ready
330
322
  if not workers_ready:
331
- workers_ready = all(self.workers_setup_status.values())
323
+ workers_ready = all(v == WorkerSetupStatus.READY for v in self.workers_setup_status.values())
332
324
 
333
325
  if workers_ready:
334
326
  return Response(content="ok", status_code=200)
@@ -436,6 +428,13 @@ class LitServer:
436
428
  except Exception as e:
437
429
  logger.exception(f"Error copying file: {e}")
438
430
 
431
+ def verify_worker_status(self):
432
+ while not any(v == WorkerSetupStatus.READY for v in self.workers_setup_status.values()):
433
+ if any(v == WorkerSetupStatus.ERROR for v in self.workers_setup_status.values()):
434
+ raise RuntimeError("One or more workers failed to start. Shutting down LitServe")
435
+ time.sleep(0.05)
436
+ logger.debug("One or more workers are ready to serve requests")
437
+
439
438
  def run(
440
439
  self,
441
440
  host: str = "0.0.0.0",
@@ -473,7 +472,7 @@ class LitServer:
473
472
 
474
473
  if sys.platform == "win32":
475
474
  warnings.warn(
476
- "Windows does not support forking. Using threads" " api_server_worker_type will be set to 'thread'"
475
+ "Windows does not support forking. Using threads api_server_worker_type will be set to 'thread'"
477
476
  )
478
477
  api_server_worker_type = "thread"
479
478
  elif api_server_worker_type is None:
@@ -481,6 +480,7 @@ class LitServer:
481
480
 
482
481
  manager, litserve_workers = self.launch_inference_worker(num_api_servers)
483
482
 
483
+ self.verify_worker_status()
484
484
  try:
485
485
  servers = self._start_server(port, num_api_servers, log_level, sockets, api_server_worker_type, **kwargs)
486
486
  print(f"Swagger UI is available at http://0.0.0.0:{port}/docs")
@@ -66,7 +66,7 @@ class OpenAIBatchContext(LitAPI):
66
66
  for ctx in context:
67
67
  ctx["temperature"] = 1.0
68
68
  output = (
69
- "Hi! It's nice to meet you. Is there something I can help you with " "or would you like to chat?"
69
+ "Hi! It's nice to meet you. Is there something I can help you with or would you like to chat?"
70
70
  ).split()
71
71
  for out in output:
72
72
  time.sleep(0.01) # fake delay
@@ -12,6 +12,7 @@
12
12
  # See the License for the specific language governing permissions and
13
13
  # limitations under the License.
14
14
  import asyncio
15
+ import dataclasses
15
16
  import logging
16
17
  import pickle
17
18
  from contextlib import contextmanager
@@ -78,3 +79,11 @@ async def call_after_stream(streamer: AsyncIterator, callback, *args, **kwargs):
78
79
  logger.exception(f"Error in streamer: {e}")
79
80
  finally:
80
81
  callback(*args, **kwargs)
82
+
83
+
84
+ @dataclasses.dataclass
85
+ class WorkerSetupStatus:
86
+ STARTING: str = "starting"
87
+ READY: str = "ready"
88
+ ERROR: str = "error"
89
+ FINISHED: str = "finished"
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: litserve
3
- Version: 0.2.4
3
+ Version: 0.2.5.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
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes