Refactor inference engine and task management: Remove obsolete inference engine and ONNX engine files, update inference processing to utilize batch handling, and enhance task management structure in documentation. Adjust paths for task specifications to align with new directory organization.

This commit is contained in:
Oleksandr Bezdieniezhnykh
2026-03-28 01:04:28 +02:00
parent 1e4ef299f9
commit 5be53739cd
60 changed files with 111875 additions and 208 deletions
+17 -25
View File
@@ -22,7 +22,7 @@ ANNOTATIONS_URL = os.environ.get("ANNOTATIONS_URL", "http://annotations:8080")
loader_client = LoaderHttpClient(LOADER_URL)
inference = None
_event_queues: list[asyncio.Queue] = []
_active_detections: dict[str, bool] = {}
_active_detections: dict[str, asyncio.Task] = {}
class TokenManager:
@@ -109,9 +109,7 @@ class AIConfigDto(BaseModel):
def detection_to_dto(det) -> DetectionDto:
import constants_inf
label = ""
if det.cls in constants_inf.annotations_dict:
label = constants_inf.annotations_dict[det.cls].name
label = constants_inf.get_annotation_name(det.cls)
return DetectionDto(
centerX=det.x,
centerY=det.y,
@@ -197,7 +195,8 @@ def _post_annotation_to_service(token_mgr: TokenManager, media_id: str,
@app.post("/detect/{media_id}")
async def detect_media(media_id: str, request: Request, config: Optional[AIConfigDto] = None):
if media_id in _active_detections:
existing = _active_detections.get(media_id)
if existing is not None and not existing.done():
raise HTTPException(status_code=409, detail="Detection already in progress for this media")
auth_header = request.headers.get("authorization", "")
@@ -208,13 +207,19 @@ async def detect_media(media_id: str, request: Request, config: Optional[AIConfi
cfg = config or AIConfigDto()
config_dict = cfg.model_dump()
_active_detections[media_id] = True
async def run_detection():
loop = asyncio.get_event_loop()
def _enqueue(event):
for q in _event_queues:
try:
q.put_nowait(event)
except asyncio.QueueFull:
pass
try:
inf = get_inference()
if inf.engine is None:
if not inf.is_engine_ready:
raise RuntimeError("Detection service unavailable")
def on_annotation(annotation, percent):
@@ -225,12 +230,7 @@ async def detect_media(media_id: str, request: Request, config: Optional[AIConfi
mediaStatus="AIProcessing",
mediaPercent=percent,
)
for q in _event_queues:
try:
q.put_nowait(event)
except asyncio.QueueFull:
pass
loop.call_soon_threadsafe(_enqueue, event)
if token_mgr and dtos:
_post_annotation_to_service(token_mgr, media_id, annotation, dtos)
@@ -241,11 +241,7 @@ async def detect_media(media_id: str, request: Request, config: Optional[AIConfi
mediaStatus="AIProcessed",
mediaPercent=100,
)
for q in _event_queues:
try:
q.put_nowait(event)
except asyncio.QueueFull:
pass
loop.call_soon_threadsafe(_enqueue, event)
await loop.run_in_executor(
executor, inf.run_detect, config_dict, on_annotation, on_status
@@ -257,15 +253,11 @@ async def detect_media(media_id: str, request: Request, config: Optional[AIConfi
mediaStatus="Error",
mediaPercent=0,
)
for q in _event_queues:
try:
q.put_nowait(error_event)
except asyncio.QueueFull:
pass
_enqueue(error_event)
finally:
_active_detections.pop(media_id, None)
asyncio.create_task(run_detection())
_active_detections[media_id] = asyncio.create_task(run_detection())
return {"status": "started", "mediaId": media_id}