Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

关于模型加载的一些问题 #63

Open
yuhan159 opened this issue Dec 10, 2024 · 12 comments
Open

关于模型加载的一些问题 #63

yuhan159 opened this issue Dec 10, 2024 · 12 comments

Comments

@yuhan159
Copy link

我们现在的流程是从decode-yolov8-bytetrack-distributor-resnet-converger->process(业务处理)的一个流程,但是发现这种流程对tpu的使用率挺高的。然后我们将resnet单独提取出来build成一个so,在process中加载它,打算通过trackId来控制图片的输入,但是在模型加载上碰到了一些问题:
流程1: decode->process(加载resnet模型)->encode,可行
流程2:decode->yolov8->bytetrack->process(加载resnet模型)->encode,出错了
通过日志定位,发现在 BMNNHandlePtr handle = make_shared(dev_id);时,并没有成功(bm_dev_request没有获取到返回值),而后面的make_shared(handle, bmodel_file.c_str());到是读取了模型,请问这种情况会是啥原因?

@Yi-sir
Copy link

Yi-sir commented Dec 10, 2024

好像看不出原因,resnet单独编一个so是改了啥呢,element的结构还在吗?还是说so里只包含load模型和推理的功能?

bm_dev_request没拿到返回值挺奇怪的,这个时候yolov8还正常吗?这个是bmlib的底层接口了,有什么报错的log吗?

@Yi-sir
Copy link

Yi-sir commented Dec 10, 2024

也许可以把“通过trackId控制图片的输入”这部分详细描述下,我们看下怎样修改pipeline更合适

@yuhan159
Copy link
Author

就是基于sophgo_demo项目里面的Resnet代码,build了一个so, 只包含了load模型和推理的功能。没有element的结构了,yolov8还是使用element框架中的load方式,是正常的。
通过trackId控制图片的输入: 比如说,我在画面中,第一帧经过yolov8->bytetrack得到的trackId是1,然后通过resnet识别了身上的衣服之类的,第二帧过来后,trackid如果没有变,我就不想再进入resnet去做推理了,就这么个功能

@yuhan159
Copy link
Author

bm_dev_request 没有打印错误日志,在我上面说的的流程1的时候,会返回一个1,流程2的时候就没有返回,挺奇怪的,我先以为handle 创建失败了,但是我看模型加载(bmContext->network(0))到是将
*** Run in SOC mode ***

########################
NetName: resnet
---- stage 0 ----
Input 0) 'input.1' shape=[ 1 3 224 224 ] dtype=FLOAT32 scale=1
Output 0) '502_Gemm' shape=[ 1 105 ] dtype=FLOAT32 scale=1
########################
模型结构打印出来了。

源码:
RESNET::RESNET(string bmodel_file, int dev_id)
{
cout << "ResNet create bmodel_file" << bmodel_file << endl;
try
{
BMNNHandlePtr handle = make_shared(dev_id);
cout << "set device id: " << dev_id << endl;
m_bmContext = make_shared(handle, bmodel_file.c_str());
cout << "m_bmContext init done" << endl;
}
catch (const exception &e)
{
cerr << e.what() << '\n';
}

}

@Yi-sir
Copy link

Yi-sir commented Dec 11, 2024

就是基于sophgo_demo项目里面的Resnet代码,build了一个so, 只包含了load模型和推理的功能。没有element的结构了,yolov8还是使用element框架中的load方式,是正常的。 通过trackId控制图片的输入: 比如说,我在画面中,第一帧经过yolov8->bytetrack得到的trackId是1,然后通过resnet识别了身上的衣服之类的,第二帧过来后,trackid如果没有变,我就不想再进入resnet去做推理了,就这么个功能

可以这样:resnet还是用stream里面的element形式,在bytetrack后面加一个element用来过滤trackId,如果框里的id是见过的,就把框删掉/直接不向后传递。这样resnet拿到的数据就少了很多

@Yi-sir
Copy link

Yi-sir commented Dec 11, 2024

bm_dev_request 没有打印错误日志,在我上面说的的流程1的时候,会返回一个1,流程2的时候就没有返回,挺奇怪的,我先以为handle 创建失败了,但是我看模型加载(bmContext->network(0))到是将 *** Run in SOC mode ***

######################## NetName: resnet ---- stage 0 ---- Input 0) 'input.1' shape=[ 1 3 224 224 ] dtype=FLOAT32 scale=1 Output 0) '502_Gemm' shape=[ 1 105 ] dtype=FLOAT32 scale=1 ######################## 模型结构打印出来了。

源码: RESNET::RESNET(string bmodel_file, int dev_id) { cout << "ResNet create bmodel_file" << bmodel_file << endl; try { BMNNHandlePtr handle = make_shared(dev_id); cout << "set device id: " << dev_id << endl; m_bmContext = make_shared(handle, bmodel_file.c_str()); cout << "m_bmContext init done" << endl; } catch (const exception &e) { cerr << e.what() << '\n'; }

}

bm_dev_request正常应该返回0吧..就是BM_SUCCESS那个enum。返回1好像也不对。
流程2没有返回 --> 这个没太理解,函数没返回,是卡死在里面了吗?

@yuhan159
Copy link
Author

bm_dev_request 没有打印错误日志,在我上面说的的流程1的时候,会返回一个1,流程2的时候就没有返回,挺奇怪的,我先以为handle 创建失败了,但是我看模型加载(bmContext->network(0))到是将 *** Run in SOC mode ***
######################## NetName: resnet ---- stage 0 ---- Input 0) 'input.1' shape=[ 1 3 224 224 ] dtype=FLOAT32 scale=1 Output 0) '502_Gemm' shape=[ 1 105 ] dtype=FLOAT32 scale=1 ######################## 模型结构打印出来了。
源码: RESNET::RESNET(string bmodel_file, int dev_id) { cout << "ResNet create bmodel_file" << bmodel_file << endl; try { BMNNHandlePtr handle = make_shared(dev_id); cout << "set device id: " << dev_id << endl; m_bmContext = make_shared(handle, bmodel_file.c_str()); cout << "m_bmContext init done" << endl; } catch (const exception &e) { cerr << e.what() << '\n'; }
}

bm_dev_request正常应该返回0吧..就是BM_SUCCESS那个enum。返回1好像也不对。 流程2没有返回 --> 这个没太理解,函数没返回,是卡死在里面了吗?

对,是0,昨天说错了。这是正常模型加载返回日志:
[13:15:27 +08:00] [engine] [info] [/workspace/sophon-stream_v0.0.4-rc4_10a8ed8_20231115/element/multimedia/osd/src/osd.cc:90] 初始化resnet SDK
ResNet create bmodel_file/data/sophon_stream/hankun_algorithm/data/models/BM1684/resnet50.bmodel
BMNNHandle init
bm_dev_request ret: 0
set device id: 0
[2024-12-11 13:15:27] [connect] Successful connection
[13:15:27 +08:00] [engine] [info] [/workspace/sophon-stream_v0.0.4-rc4_10a8ed8_20231115/element/multimedia/osd/src/osd.cc:66] upload url连接成功
[BMRT][bmcpu_setup:406] INFO:cpu_lib 'libcpuop.so' is loaded.
bmcpu init: skip cpu_user_defined
open usercpu.so, init user_cpu_init
[BMRT][load_bmodel:1084] INFO:Loading bmodel from [/data/sophon_stream/hankun_algorithm/data/models/BM1684/resnet50.bmodel]. Thanks for your patience...
[BMRT][load_bmodel:1023] INFO:pre net num: 0, load net num: 1
num: 0name: resnet
m_bmContext init done
Init RESNET
m_network_names :1
m_netinfo valid: resnet
m_netinfo valid input: 1
*** Run in SOC mode ***

########################
NetName: resnet
---- stage 0 ----
Input 0) 'input.1' shape=[ 1 3 224 224 ] dtype=FLOAT32 scale=1
Output 0) '502_Gemm' shape=[ 1 105 ] dtype=FLOAT32 scale=1
########################

get input
get output

加上yolov8模型加载后,再初始化resnet:
[13:20:10 +08:00] [engine] [info] [/workspace/sophon-stream_v0.0.4-rc4_10a8ed8_20231115/element/multimedia/osd/src/osd.cc:90] 初始化resnet SDK
ResNet create bmodel_file/data/sophon_stream/hankun_algorithm/data/models/BM1684/resnet50.bmodel
set device id: 0
[BMRT][bmcpu_setup:406] INFO:cpu_lib 'libcpuop.so' is loaded.
bmcpu init: skip cpu_user_defined
open usercpu.so, init user_cpu_init
[BMRT][load_bmodel:1084] INFO:Loading bmodel from [/data/sophon_stream/hankun_algorithm/data/models/BM1684/resnet50.bmodel]. Thanks for your patience...
[BMRT][load_bmodel:1023] INFO:pre net num: 0, load net num: 1
[2024-12-11 13:20:10] [connect] Successful connection
[2024-12-11 13:20:10] [connect] WebSocket Connection 127.0.0.1:9000 v-2 "WebSocket++/0.8.2" /server_api/socket/1354 101
Connected to server
[13:20:10 +08:00] [engine] [info] [/workspace/sophon-stream_v0.0.4-rc4_10a8ed8_20231115/element/multimedia/osd/src/osd.cc:66] upload url连接成功
m_bmContext init done
Init RESNET
*** Run in SOC mode ***

########################
NetName: resnet
---- stage 0 ----
Input 0) 'input.1' shape=[ 1 3 224 224 ] dtype=FLOAT32 scale=1
Output 0) '502_Gemm' shape=[ 1 105 ] dtype=FLOAT32 scale=1
########################

get input
Segmentation fault

中间这个BMNNHandle init
bm_dev_request ret: 0 就没了,然后gdb调试说m_bmNetwork->inputTensor(0)出错了

@yuhan159
Copy link
Author

就是基于sophgo_demo项目里面的Resnet代码,build了一个so, 只包含了load模型和推理的功能。没有element的结构了,yolov8还是使用element框架中的load方式,是正常的。 通过trackId控制图片的输入: 比如说,我在画面中,第一帧经过yolov8->bytetrack得到的trackId是1,然后通过resnet识别了身上的衣服之类的,第二帧过来后,trackid如果没有变,我就不想再进入resnet去做推理了,就这么个功能

可以这样:resnet还是用stream里面的element形式,在bytetrack后面加一个element用来过滤trackId,如果框里的id是见过的,就把框删掉/直接不向后传递。这样resnet拿到的数据就少了很多

我明白您的意思,这也是一种解决方法,只是觉得使用so的方式会更灵活点。

@WilsonHu
Copy link

@Yi-sir 您好,这个问题是否可以帮忙跟底层SDK研发确认下,我们也遇到了一样的问题,现在整体项目就卡在这个地方

@Yi-sir
Copy link

Yi-sir commented Dec 12, 2024

@Yi-sir 您好,这个问题是否可以帮忙跟底层SDK研发确认下,我们也遇到了一样的问题,现在整体项目就卡在这个地方

麻烦具体描述一下问题?

@WilsonHu
Copy link

就是前面yuhan159描述的,我们需要再stream框架中已用ResNet50的so库,进行灵活的调用

@Yi-sir
Copy link

Yi-sir commented Dec 12, 2024

前面的log没看懂,为什么

BMNNHandle init
bm_dev_request ret: 0
set device id: 0

这段打印没了?

然后,看到报错是段错误,这种情况建议先gdb一下。感觉根本原因不像是bm_dev_request的问题,而是代码组织上的问题。

此外,如果确定是bm_dev_request的问题,不妨组织一个最小复现case。如果这个api有问题的话那应该和stream框架也没关系。

最后,如果紧急,建议联系一下商务同事来处理。在github上主要是面向大部分用户解决普遍性的问题,这里定制化的问题在github上解决,效率不高。

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

3 participants