from SceneDetector import SceneDetector
from multiprocessing import Pipe, Process
import numpy as np
import time
import cv2
def SceneWorker(pipe_conn, model_path, is_onnx = False):
sd = SceneDetector(model_path, is_onnx = True)
while True:
data = pipe_conn.recv()
if data is None:
break
results = sd.infer_scenes(data)
pipe_conn.send(results)
if __name__ == '__main__':
model_path = 'models/scene_model.onnx'
scene_conn, scene_child_conn = Pipe()
scene_process = Process(target=SceneWorker, args=(scene_child_conn, model_path, True,))
scene_process.start()
test_img = cv2.imread('TestImages/1440P_1000M_8X.jpg')
for _ in range(5000):
scene_conn.send([test_img])
results = scene_conn.recv()[0]
print(results)
time.sleep(0.1) #这里在推理间加入了间隔
scene_conn.send(None)
scene_process.join()
推理本身时间只用不到 2ms ,连续推理时 CPU 占用率会短暂上升,推理结束后立刻归零,但是如果推理之间有间隔,则 CPU 占用则会保持在一个很高的水平。一开始以为是time.sleep
的问题,后来试过了用threading
的Event
和asyncio
的await
做间隔,结果也是一样的。
使用Torch
或者Onnx
的模型结果都是一样的,把cv
预处理删除掉也不影响 CPU 使用,所以也不是cv
的问题。今天还测试了把推理单独开一个进程,也没有改善。
1
tangtang369 2023-12-22 15:05:00 +08:00
```
def SceneWorker(pipe_conn, model_path, is_onnx = False): sd = SceneDetector(model_path, is_onnx = True) while True: data = pipe_conn.recv() if data is None: break results = sd.infer_scenes(data) pipe_conn.send(results) # 在这里增加这个 你再跑下 time.sleep(0) ``` |
2
chinabrowser OP @tangtang369 `time.sleep(0)`的话可以瞬间完成
|
3
chinabrowser OP @tangtang369
500 次推理,通过管道的话是 13 秒,直接在主进程做预测是 3.7 秒,大部分时间在加载模型上 Measure-Command -Expression {python .\PipeLineTest.py} Days : 0 Hours : 0 Minutes : 0 Seconds : 13 Milliseconds : 186 Ticks : 131865097 TotalDays : 0.000152621640046296 TotalHours : 0.00366291936111111 TotalMinutes : 0.219775161666667 TotalSeconds : 13.1865097 TotalMilliseconds : 13186.5097 Measure-Command -Expression {python .\OnnxProfiling.py} Days : 0 Hours : 0 Minutes : 0 Seconds : 3 Milliseconds : 758 Ticks : 37589256 TotalDays : 4.35060833333333E-05 TotalHours : 0.001044146 TotalMinutes : 0.06264876 TotalSeconds : 3.7589256 TotalMilliseconds : 3758.9256 |