1、如果需要一个进程线程的处理多个实例,这块该如何处理呢?
2、现在写的两个实例订阅的topic是不同的。
3、模型是跑的yolov5 slim的,模型大小8.62M,目前为止是创建了两个实例就会出现这个问题,单独构建一个实例则不会有问题。刚刚尝试了如下操作,出现如下问题:
1、如果需要一个进程线程的处理多个实例,这块该如何处理呢?
2、现在写的两个实例订阅的topic是不同的。
3、模型是跑的yolov5 slim的,模型大小8.62M,目前为止是创建了两个实例就会出现这个问题,单独构建一个实例则不会有问题。刚刚尝试了如下操作,出现如下问题:
可以做两个测试:
1、使用tros中示例测试。dnn_node_example或者dnn_node_sample的main中,直接创建两个推理node实例测试。
2、你的程序中创建完两个推理node实例后,使用
while(rclcpp::ok()) {
sleep(1);
}
把推理程序hung住,验证下只加载模型是否有问题。
刚刚尝试了一下直接跑视频发布hobot_image_publisher 、hobot_codec、websocket node,发现如果视频是tros例子里的MP4的格式视频两路运行就会报错,如果是h264格式(6.54M)的就不会报错。把自己的MP4视频转成h264的格式(44M),还是报错
目前尝试了单进程二路视频流推理,当使用720P小分辨率时可以跑通流程,但是infer time模型推理阶段相比较单进程单路视频差了十几倍,如下图所示(图一为单进程单路视频, 图二为单进程双路视频),请问对此是什么原因可能导致的呢,有什么办法能解决这个问题呢,目前用的模型大小为8.62M
使用hrut_somstatus命令查下两种方式下的bpu使用率。
单进程单路视频:
单进程双路视频:
1、多路之后推理耗时增加是正常的,你的模型增加的确实比较多,不确定是不是模型问题。
2、我也验证了下单进程两路推理,推理耗时波动更大,但是没有达到倍数,结果符合预期。你这边可以按照我的方法复现下我的结果。
单进程单路结果:
单进程两路推理结果:
修改patch(没法上传附近,直接贴出来了):
repo: Sign in · GitLab
基于tag:tros_1.1.4
From 79f89bf52d84f368f08bb0ea9e15458c4728e65d Mon Sep 17 00:00:00 2001From: "kao.zhu" <kao.zhu@horizon.ai>Date: Thu, 2 Mar 2023 10:35:09 +0800Subject: [PATCH] support multi-channle prediction--- dnn_node_example/include/dnn_example_node.h | 1 + dnn_node_example/src/dnn_example_node.cpp | 3 ++- dnn_node_example/src/example.cpp | 9 ++++++++- 3 files changed, 11 insertions(+), 2 deletions(-)diff --git a/dnn_node_example/include/dnn_example_node.h b/dnn_node_example/include/dnn_example_node.hindex dfe61bd..73a90a9 100644--- a/dnn_node_example/include/dnn_example_node.h+++ b/dnn_node_example/include/dnn_example_node.h@@ -90,6 +90,7 @@ class DnnExampleNode : public DnnNode { int PostProcess(const std::shared_ptr<DnnNodeOutput> &outputs) override; private:+ std::string node_name_; // 解析配置文件,包好模型文件路径、解析方法等信息 int LoadConfig(); // 用于解析的配置文件,以及解析后的数据diff --git a/dnn_node_example/src/dnn_example_node.cpp b/dnn_node_example/src/dnn_example_node.cppindex b5026a9..69f6711 100644--- a/dnn_node_example/src/dnn_example_node.cpp+++ b/dnn_node_example/src/dnn_example_node.cpp@@ -99,6 +99,7 @@ int ResizeNV12Img(const char *in_img_data, DnnExampleNode::DnnExampleNode(const std::string &node_name, const NodeOptions &options) : DnnNode(node_name, options) {+ node_name_ = node_name; // 更新配置 this->declare_parameter<int>("feed_type", feed_type_); this->declare_parameter<std::string>("image", image_);@@ -545,7 +546,7 @@ int DnnExampleNode::PostProcess( // 如果当前帧有更新统计信息,输出统计信息 if (node_output->rt_stat->fps_updated) {- RCLCPP_WARN(rclcpp::get_logger("example"),+ RCLCPP_WARN(rclcpp::get_logger(node_name_), "Sub img fps: %.2f, Smart fps: %.2f, infer time ms: %d, " "post process time ms: %d", node_output->rt_stat->input_fps,diff --git a/dnn_node_example/src/example.cpp b/dnn_node_example/src/example.cppindex 46782e3..652b38e 100644--- a/dnn_node_example/src/example.cpp+++ b/dnn_node_example/src/example.cpp@@ -21,8 +21,15 @@ int main(int argc, char** argv) { rclcpp::init(argc, argv); RCLCPP_WARN(rclcpp::get_logger("example"), "This is dnn node example!");+ // rclcpp::spin(std::make_shared<DnnExampleNode>("body_det"); - rclcpp::spin(std::make_shared<DnnExampleNode>("body_det"));+ auto node1 = std::make_shared<DnnExampleNode>("det1");+ auto node2 = std::make_shared<DnnExampleNode>("det2");+ auto options = rclcpp::ExecutorOptions();+ auto exes = std::make_shared<rclcpp::executors::MultiThreadedExecutor>();+ exes->add_node(node1);+ exes->add_node(node2);+ exes->spin(); rclcpp::shutdown(); return 0;-- 2.25.1
启动命令:ros2 launch dnn_node_example hobot_dnn_node_example.launch.py config_file:=config/yolov5workconfig.json image_width:=480 image_height:=272
说明:MIPI摄像头以30fps输出图像数据,dnn_node_example创建两个node,使用yolov5模型推理,相当于单进程两路推理。
另外,如果你只是跑yolo这种检测模型,推理不依赖序列,没必要多路推理,直接单进程单路推理就可以了,通过img msg中的frame_id字段(其他字段也可以)区分哪一路。
我这里尝试了dnn_node_example,这边的耗时也是很高:
你这边推理和后处理耗时都要高很多。
是使用我发的启动命令,使用mipi cam作为输入是吧。
另外锁定CPU频率对比看下:`echo performance > /sys/devices/system/cpu/cpufreq/policy0/scaling_governor`
把线程数变为4,时间下降了很多,但是fps还是达不到单进程单路视频的:
BPU使用率已经快满了,基本上就这个帧率了。
主要yolo模型无法发挥出BPU的最佳性能,对于多路推理,如果对帧率有要求,推荐使用fcos模型,基本上能达到4路30fps推理输出。
好的,这个我再看看
替换了efficient net 网络,模型参数变小了,bpu占用也不高,但是fps还是提不上去,这是什么情况?
这属于模型性能调优,在做模型转换的时候有相关说明。
也可以在板端使用hrt_model_exec命令实测模型性能,例如测fcos模型:hrt_model_exec perf --model_file /app/model/basic/fcos_512x512_nv12.bin
这有问题么,目前efficient 用的图一模型,之前的yolo是图2
他两个bpu,单进程单路的时候两个bpu同时跑,加起来超过30fps,现在单进程双路,每个bpu跑一路,所以17左右,是这样么?