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.
- {litserve-0.2.4/src/litserve.egg-info → litserve-0.2.5.dev0}/PKG-INFO +1 -1
- {litserve-0.2.4 → litserve-0.2.5.dev0}/src/litserve/__about__.py +1 -1
- {litserve-0.2.4 → litserve-0.2.5.dev0}/src/litserve/loops.py +10 -5
- {litserve-0.2.4 → litserve-0.2.5.dev0}/src/litserve/server.py +12 -12
- {litserve-0.2.4 → litserve-0.2.5.dev0}/src/litserve/test_examples/openai_spec_example.py +1 -1
- {litserve-0.2.4 → litserve-0.2.5.dev0}/src/litserve/utils.py +9 -0
- {litserve-0.2.4 → litserve-0.2.5.dev0/src/litserve.egg-info}/PKG-INFO +1 -1
- {litserve-0.2.4 → litserve-0.2.5.dev0}/LICENSE +0 -0
- {litserve-0.2.4 → litserve-0.2.5.dev0}/MANIFEST.in +0 -0
- {litserve-0.2.4 → litserve-0.2.5.dev0}/README.md +0 -0
- {litserve-0.2.4 → litserve-0.2.5.dev0}/requirements.txt +0 -0
- {litserve-0.2.4 → litserve-0.2.5.dev0}/setup.cfg +0 -0
- {litserve-0.2.4 → litserve-0.2.5.dev0}/setup.py +0 -0
- {litserve-0.2.4 → litserve-0.2.5.dev0}/src/litserve/__init__.py +0 -0
- {litserve-0.2.4 → litserve-0.2.5.dev0}/src/litserve/__main__.py +0 -0
- {litserve-0.2.4 → litserve-0.2.5.dev0}/src/litserve/api.py +0 -0
- {litserve-0.2.4 → litserve-0.2.5.dev0}/src/litserve/callbacks/__init__.py +0 -0
- {litserve-0.2.4 → litserve-0.2.5.dev0}/src/litserve/callbacks/base.py +0 -0
- {litserve-0.2.4 → litserve-0.2.5.dev0}/src/litserve/callbacks/defaults/__init__.py +0 -0
- {litserve-0.2.4 → litserve-0.2.5.dev0}/src/litserve/callbacks/defaults/metric_callback.py +0 -0
- {litserve-0.2.4 → litserve-0.2.5.dev0}/src/litserve/connector.py +0 -0
- {litserve-0.2.4 → litserve-0.2.5.dev0}/src/litserve/docker_builder.py +0 -0
- {litserve-0.2.4 → litserve-0.2.5.dev0}/src/litserve/loggers.py +0 -0
- {litserve-0.2.4 → litserve-0.2.5.dev0}/src/litserve/middlewares.py +0 -0
- {litserve-0.2.4 → litserve-0.2.5.dev0}/src/litserve/python_client.py +0 -0
- {litserve-0.2.4 → litserve-0.2.5.dev0}/src/litserve/specs/__init__.py +0 -0
- {litserve-0.2.4 → litserve-0.2.5.dev0}/src/litserve/specs/base.py +0 -0
- {litserve-0.2.4 → litserve-0.2.5.dev0}/src/litserve/specs/openai.py +0 -0
- {litserve-0.2.4 → litserve-0.2.5.dev0}/src/litserve/test_examples/__init__.py +0 -0
- {litserve-0.2.4 → litserve-0.2.5.dev0}/src/litserve/test_examples/simple_example.py +0 -0
- {litserve-0.2.4 → litserve-0.2.5.dev0}/src/litserve.egg-info/SOURCES.txt +0 -0
- {litserve-0.2.4 → litserve-0.2.5.dev0}/src/litserve.egg-info/dependency_links.txt +0 -0
- {litserve-0.2.4 → litserve-0.2.5.dev0}/src/litserve.egg-info/entry_points.txt +0 -0
- {litserve-0.2.4 → litserve-0.2.5.dev0}/src/litserve.egg-info/not-zip-safe +0 -0
- {litserve-0.2.4 → litserve-0.2.5.dev0}/src/litserve.egg-info/requires.txt +0 -0
- {litserve-0.2.4 → litserve-0.2.5.dev0}/src/litserve.egg-info/top_level.txt +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.
|
|
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[
|
|
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
|
-
|
|
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
|
-
|
|
415
|
+
logger.info(f"Setup complete for worker {worker_id}.")
|
|
411
416
|
|
|
412
417
|
if workers_setup_status:
|
|
413
|
-
workers_setup_status[worker_id] =
|
|
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] =
|
|
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
|
|
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
|
|
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"
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|