如题:在板块上写了个程序,同时获取4路视频(RTSP流),使用yolov5进行目标识别,然后基于quart实现对分析画面对实时查看。
实现过程:
1.在主进程完成,acl初始化和设备对指定
2.创建4个线程,在各个线程中分别创建一个context,并分别捕获对画面进行模型推理。 这块是参考yolo_acl_sample例程的代码
3.基于quart异步框架实现分析画面对实时查看。
websocket + img传输
存在的问题:
1.有时acl.mdl.execute会执行失败,返回ret为507011。 出现的比较随机,有时一路画面一直都执行失败,需要重启程序,有时零星报几个后能恢复,但还是比较常见。
画面分辨率是 :640*480
分析帧率控制在了:10帧
2.执行模型推理会造成quart异步阻塞的告警。
正常来说线程里面执行是不会影响到主线程对事件循环的,打印了执行时间的输出,大部分“execute”函数执行的时间在0.05秒左右,个别会到0.1。
但是就是会产生异步的告警,我用time.sleep(1)来代替execute的执行,就不会产生异步告警。
是模型推理函数中有一些IO阻塞类似对操作? 是否有办法解决或优化?
cpu和内存对占用率都不太高,CPU在60%左右(4核--将AI CPU 的数量配置为 了0),内存使用2.2G
3.我执行ACL资源申请对过程是否正确? 主线程中初始化acl和device,然后子线程中各自申请context,再各自执行推理。是否有更加稳定和高性能对方案?
如题:在板块上写了个程序,同时获取4路视频(RTSP流),使用yolov5进行目标识别,然后基于quart实现对分析画面对实时查看。
实现过程:
1.在主进程完成,acl初始化和设备对指定
def init_acl(device_id): '''acl初始化函数''' ret = acl.init() # 0-成功,其它失败 if ret: raise RuntimeError(ret) ret = acl.rt.set_device(device_id) if ret: raise RuntimeError(ret) print('ACL init Device Successfully') return True2.创建4个线程,在各个线程中分别创建一个context,并分别捕获对画面进行模型推理。 这块是参考yolo_acl_sample例程的代码
self.context, ret = acl.rt.create_context(device_id) # 显式创建一个Context if ret: raise RuntimeError(ret)def execute(self, input_list): '''创建输入dataset对象, 推理完成后, 将输出数据转换为numpy格式''' self._gen_input_dataset(input_list) # 创建模型输入dataset结构 ret = acl.mdl.execute(self.model_id, self.input_dataset, self.output_dataset) # 调用离线模型的execute推理数据 if ret: self.mylogger.error(f"acl.mdl.execute fail!--{ret}") self._release_dataset(self.input_dataset) # 失败时释放dataset --创建输入空间失败时会释放。 return None out_numpy = self._output_dataset_to_numpy() # 将推理输出的二进制数据流解码为numpy数组, 数组的shape和类型与模型输出规格一致 self._release_dataset(self.input_dataset) # 释放dataset return out_numpy3.基于quart异步框架实现分析画面对实时查看。
websocket + img传输
存在的问题:
1.有时acl.mdl.execute会执行失败,返回ret为507011。 出现的比较随机,有时一路画面一直都执行失败,需要重启程序,有时零星报几个后能恢复,但还是比较常见。
画面分辨率是 :640*480
分析帧率控制在了:10帧
2.执行模型推理会造成quart异步阻塞的告警。
正常来说线程里面执行是不会影响到主线程对事件循环的,打印了执行时间的输出,大部分“execute”函数执行的时间在0.05秒左右,个别会到0.1。
outputs = None start_time = time.time() outputs = self.execute([img,])#创建input,执行模型,返回结果 --失败返回None #time.sleep(1) end_time = time.time() print(f"1Processing time: {end_time - start_time} seconds")但是就是会产生异步的告警,我用time.sleep(1)来代替execute的执行,就不会产生异步告警。
是模型推理函数中有一些IO阻塞类似对操作? 是否有办法解决或优化?
cpu和内存对占用率都不太高,CPU在60%左右(4核--将AI CPU 的数量配置为 了0),内存使用2.2G
3.我执行ACL资源申请对过程是否正确? 主线程中初始化acl和device,然后子线程中各自申请context,再各自执行推理。是否有更加稳定和高性能对方案?