7,652
社区成员
发帖
与我相关
我的任务
分享高通 AI Edge Box 部署多模型推理时,出现 “推理队列阻塞” 或 “任务堆积”,该如何设计任务调度?
多模型部署不能简单地把多个推理任务同时丢给 NPU,否则很容易出现队列阻塞、内存抢占和响应延迟。
import queue
import threading
task_queue = queue.Queue(maxsize=100)
def producer():
while True:
frame = capture_frame()
task_queue.put(frame)
def consumer():
while True:
frame = task_queue.get()
result = model_infer(frame)
postprocess(result)
task_queue.task_done()
这样可以避免采集和推理互相阻塞。import heapq
priority_queue = []
def add_task(priority, task):
heapq.heappush(priority_queue, (priority, task))
def get_task():
return heapq.heappop(priority_queue)[1]
def add_task_with_limit(task, max_size=100):
if task_queue.qsize() >= max_size:
drop_oldest_task()
task_queue.put(task)
session = qnn.create_session()
def infer_with_session(frame):
input_tensor = preprocess(frame)
output_tensor = session.run(input_tensor)
return postprocess(output_tensor)
这是典型的端侧视觉 AI 场景问题,不能只靠模型本身解决,需要同时优化成像、预处理和模型策略。
camera_set_exposure(33000);
camera_set_gain_limit(16);
camera_set_wb_mode(WB_AUTO);
camera_set_digital_zoom(1.0);
如果是夜间人脸、行人、车辆检测,建议开启低照度专用成像模式。import cv2
def low_light_enhance(image):
gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
clahe = cv2.createCLAHE(clipLimit=2.0, tileGridSize=(8,8))
enhanced = clahe.apply(gray)
denoised = cv2.fastNlMeansDenoising(enhanced, None, 3, 7, 21)
return denoised
def select_model_by_light(lux_value):
if lux_value < 10:
return night_model
elif lux_value < 50:
return low_light_model
else:
return day_model
多模型部署不能简单地把多个推理任务同时丢给 NPU,否则很容易出现队列阻塞、内存抢占和响应延迟。
task_queue = queue.Queue(maxsize=100)
def producer():
while True:
frame = capture_frame()
task_queue.put(frame)
def consumer():
while True:
frame = task_queue.get()
result = model_infer(frame)
postprocess(result)
task_queue.task_done()
这样可以避免采集和推理互相阻塞。
3. 增加任务优先级
不同业务任务不能平等处理。例如:
安全检测:高优先级
异常识别:高优先级
统计分析:中优先级
日志上报:低优先级
参考优先级队列思路:
```python
import heapq
priority_queue = []
def add_task(priority, task):
heapq.heappush(priority_queue, (priority, task))
def get_task():
return heapq.heappop(priority_queue)[1]
drop_oldest_task()
task_queue.put(task)5. 复用推理会话
不要每次推理都重新创建会话。会话复用能显著减少启动开销。
```python
session = qnn.create_session()
def infer_with_session(frame):
input_tensor = preprocess(frame)
output_tensor = session.run(input_tensor)
return postprocess(output_tensor)
多模型部署不能简单地把多个推理任务同时丢给 NPU,否则很容易出现队列阻塞、内存抢占和响应延迟。
import queue
import threading
task_queue = queue.Queue(maxsize=100)
def producer():
while True:
frame = capture_frame()
task_queue.put(frame)
def consumer():
while True:
frame = task_queue.get()
result = model_infer(frame)
postprocess(result)
task_queue.task_done()
这样可以避免采集和推理互相阻塞。import heapq
priority_queue = []
def add_task(priority, task):
heapq.heappush(priority_queue, (priority, task))
def get_task():
return heapq.heappop(priority_queue)[1]
def add_task_with_limit(task, max_size=100):
if task_queue.qsize() >= max_size:
drop_oldest_task()
task_queue.put(task)
session = qnn.create_session()
def infer_with_session(frame):
input_tensor = preprocess(frame)
output_tensor = session.run(input_tensor)
return postprocess(output_tensor)