Add inference speed and keep alive

This commit is contained in:
Nicolas Mowen 2025-08-09 21:47:39 -06:00
parent 1bea9aec99
commit 86f682269b
4 changed files with 24 additions and 0 deletions

View File

@ -15,6 +15,7 @@ from frigate.config import FrigateConfig
from frigate.const import CLIPS_DIR, UPDATE_REVIEW_DESCRIPTION from frigate.const import CLIPS_DIR, UPDATE_REVIEW_DESCRIPTION
from frigate.data_processing.types import PostProcessDataEnum from frigate.data_processing.types import PostProcessDataEnum
from frigate.genai import GenAIClient from frigate.genai import GenAIClient
from frigate.util.builtin import EventsPerSecond, InferenceSpeed
from ..post.api import PostProcessorApi from ..post.api import PostProcessorApi
from ..types import DataProcessorMetrics from ..types import DataProcessorMetrics
@ -35,8 +36,13 @@ class ReviewDescriptionProcessor(PostProcessorApi):
self.metrics = metrics self.metrics = metrics
self.tracked_review_items: dict[str, list[tuple[int, bytes]]] = {} self.tracked_review_items: dict[str, list[tuple[int, bytes]]] = {}
self.genai_client = client self.genai_client = client
self.review_desc_speed = InferenceSpeed(self.metrics.review_desc_speed)
self.review_descs_dps = EventsPerSecond()
self.review_descs_dps.start()
def process_data(self, data, data_type): def process_data(self, data, data_type):
self.metrics.review_desc_dps.value = self.review_descs_dps.eps()
if data_type != PostProcessDataEnum.review: if data_type != PostProcessDataEnum.review:
return return
@ -101,11 +107,13 @@ class ReviewDescriptionProcessor(PostProcessorApi):
return return
# kickoff analysis # kickoff analysis
self.review_descs_dps.update()
threading.Thread( threading.Thread(
target=run_analysis, target=run_analysis,
args=( args=(
self.requestor, self.requestor,
self.genai_client, self.genai_client,
self.review_desc_speed,
camera, camera,
final_data, final_data,
copy.copy([r[1] for r in self.tracked_review_items[id]]), copy.copy([r[1] for r in self.tracked_review_items[id]]),
@ -121,10 +129,12 @@ class ReviewDescriptionProcessor(PostProcessorApi):
def run_analysis( def run_analysis(
requestor: InterProcessRequestor, requestor: InterProcessRequestor,
genai_client: GenAIClient, genai_client: GenAIClient,
review_inference_speed: InferenceSpeed,
camera: str, camera: str,
final_data: dict[str, str], final_data: dict[str, str],
thumbs: list[bytes], thumbs: list[bytes],
) -> None: ) -> None:
start = datetime.datetime.now().timestamp()
metadata = genai_client.generate_review_description( metadata = genai_client.generate_review_description(
{ {
"camera": camera, "camera": camera,
@ -135,6 +145,7 @@ def run_analysis(
}, },
thumbs, thumbs,
) )
review_inference_speed.update(datetime.datetime.now().timestamp() - start)
if not metadata: if not metadata:
return None return None

View File

@ -20,6 +20,8 @@ class DataProcessorMetrics:
alpr_pps: Synchronized alpr_pps: Synchronized
yolov9_lpr_speed: Synchronized yolov9_lpr_speed: Synchronized
yolov9_lpr_pps: Synchronized yolov9_lpr_pps: Synchronized
review_desc_speed: Synchronized
review_desc_dps: Synchronized
classification_speeds: dict[str, Synchronized] classification_speeds: dict[str, Synchronized]
classification_cps: dict[str, Synchronized] classification_cps: dict[str, Synchronized]
@ -34,6 +36,8 @@ class DataProcessorMetrics:
self.alpr_pps = manager.Value("d", 0.0) self.alpr_pps = manager.Value("d", 0.0)
self.yolov9_lpr_speed = manager.Value("d", 0.0) self.yolov9_lpr_speed = manager.Value("d", 0.0)
self.yolov9_lpr_pps = manager.Value("d", 0.0) self.yolov9_lpr_pps = manager.Value("d", 0.0)
self.review_desc_speed = manager.Value("d", 0.0)
self.review_desc_dps = manager.Value("d", 0.0)
self.classification_speeds = manager.dict() self.classification_speeds = manager.dict()
self.classification_cps = manager.dict() self.classification_cps = manager.dict()

View File

@ -48,6 +48,7 @@ class OllamaClient(GenAIClient):
self.genai_config.model, self.genai_config.model,
prompt, prompt,
images=images, images=images,
options={"keep_alive": "1h"},
) )
return result["response"].strip() return result["response"].strip()
except (TimeoutException, ResponseError) as e: except (TimeoutException, ResponseError) as e:

View File

@ -356,6 +356,14 @@ def stats_snapshot(
embeddings_metrics.yolov9_lpr_pps.value, 2 embeddings_metrics.yolov9_lpr_pps.value, 2
) )
if embeddings_metrics.review_desc_dps.value > 0.0:
stats["embeddings"]["review_description_speed"] = round(
embeddings_metrics.review_desc_speed.value * 1000, 2
)
stats["embeddings"]["review_descriptions"] = round(
embeddings_metrics.review_desc_dps.value, 2
)
for key in embeddings_metrics.classification_speeds.keys(): for key in embeddings_metrics.classification_speeds.keys():
stats["embeddings"][f"{key}_classification_speed"] = round( stats["embeddings"][f"{key}_classification_speed"] = round(
embeddings_metrics.classification_speeds[key].value * 1000, 2 embeddings_metrics.classification_speeds[key].value * 1000, 2