1
0
Fork 0
onnx-web/api/onnx_web/worker/worker.py

72 lines
2.3 KiB
Python
Raw Normal View History

2023-02-26 05:49:39 +00:00
from logging import getLogger
2023-03-06 03:37:39 +00:00
from os import getpid
2023-03-07 14:02:53 +00:00
from queue import Empty
2023-02-28 04:52:43 +00:00
from sys import exit
2023-02-26 18:24:51 +00:00
from traceback import format_exception
2023-02-26 20:15:30 +00:00
2023-02-26 19:09:24 +00:00
from setproctitle import setproctitle
2023-02-26 05:49:39 +00:00
2023-02-26 18:32:48 +00:00
from ..server import ServerContext, apply_patches
2023-02-26 21:21:58 +00:00
from ..torch_before_ort import get_available_providers
2023-02-26 20:15:30 +00:00
from .context import WorkerContext
2023-02-26 05:49:39 +00:00
logger = getLogger(__name__)
2023-03-06 03:37:39 +00:00
EXIT_ERROR = 1
EXIT_INTERRUPT = 0
EXIT_MEMORY = 2
EXIT_REPLACED = 3
EXIT_SUCCESS = 0
2023-02-26 18:32:48 +00:00
def worker_main(context: WorkerContext, server: ServerContext):
2023-02-26 18:32:48 +00:00
apply_patches(server)
2023-02-26 20:15:30 +00:00
setproctitle("onnx-web worker: %s" % (context.device.device))
2023-02-26 18:32:48 +00:00
2023-02-26 21:21:58 +00:00
logger.info("checking in from worker, %s", get_available_providers())
# make leaking workers easier to recycle
context.progress.cancel_join_thread()
context.finished.cancel_join_thread()
2023-02-26 05:49:39 +00:00
while True:
2023-02-27 02:09:42 +00:00
try:
if not context.is_current():
2023-03-07 14:02:53 +00:00
logger.warning(
"worker %s has been replaced by %s, exiting",
getpid(),
context.get_current(),
)
2023-03-06 03:37:39 +00:00
exit(EXIT_REPLACED)
2023-02-28 04:45:29 +00:00
name, fn, args, kwargs = context.pending.get(timeout=1.0)
logger.info("worker for %s got job: %s", context.device.device, name)
2023-02-27 23:35:31 +00:00
context.job = name # TODO: hax
context.clear_flags()
2023-02-27 02:09:42 +00:00
logger.info("starting job: %s", name)
2023-02-26 17:16:33 +00:00
fn(context, *args, **kwargs)
logger.info("job succeeded: %s", name)
2023-02-28 04:45:29 +00:00
context.set_finished()
2023-02-28 04:37:43 +00:00
except Empty:
pass
2023-02-28 04:52:43 +00:00
except KeyboardInterrupt:
2023-02-28 05:12:53 +00:00
logger.info("worker got keyboard interrupt")
2023-03-06 03:37:39 +00:00
exit(EXIT_INTERRUPT)
2023-02-28 05:12:53 +00:00
except ValueError as e:
logger.info(
"value error in worker, exiting: %s",
format_exception(type(e), e, e.__traceback__),
)
2023-03-06 03:37:39 +00:00
exit(EXIT_ERROR)
2023-02-26 17:16:33 +00:00
except Exception as e:
e_str = str(e)
if "Failed to allocate memory" in e_str or "out of memory" in e_str:
logger.error("detected out-of-memory error, exiting: %s", e)
2023-03-06 03:37:39 +00:00
exit(EXIT_MEMORY)
else:
logger.error(
"error while running job: %s",
format_exception(type(e), e, e.__traceback__),
)