Toybrick

标题: rk3568板子+2个rk1808 NPU [打印本页]

作者: gmi    时间: 2024-6-11 15:04
标题: rk3568板子+2个rk1808 NPU
目前板子是3568,然后集成了2个1808的NPU,也就是说一个板子有3个NPU (3568NPU + 2 1808NPU),接口使用的是rknpu2,那么我在推理的时候怎么能同时使用这3个NPU 还是默认推理3个都会使用?








作者: jefferyzhang    时间: 2024-6-11 15:14
三个是独立的,需要写代码自己分配用哪个
作者: gmi    时间: 2024-6-11 17:19
jefferyzhang 发表于 2024-6-11 15:14
三个是独立的,需要写代码自己分配用哪个

可是rk3568不是不支持分配rknpu核心吗?rknn api接口中也没有在初始化或者推理时指定哪个npu模块,如果有的话麻烦您提供一个示例,还有1808的npu是不是需要rknpu1 的sdk才能运行。
还有一个问题,rknn模型推理时不是串行的吗?分配给两个NPU模块是不是两个同时推理就是并行的了。
最后非常感谢您的回答。
作者: jefferyzhang    时间: 2024-6-11 17:56
gmi 发表于 2024-6-11 17:19
可是rk3568不是不支持分配rknpu核心吗?rknn api接口中也没有在初始化或者推理时指定哪个npu模块,如果有 ...

不支持分配,需要自己调度。rknn不能自动多个npu串行,这个也是没有意义的,传输的时间远超过推理时间。

正确的多NPU设备玩法就是:

1. 三个NPU同时加载同一个模型,然后用负载均衡的方式轮流分配帧给不同的NPU设备推理。这样如果你的视频输入是60fps,但是一个npu推理该模型只能做到20fps,那么三个npu就可以实现60fps

2. 自行把模型拆成三个模型,例如像一些模型有多组backbone结构或者不同尺寸的backbone输入,就可以拆成多个后做成流水线推理
作者: gmi    时间: 2024-6-11 18:24
jefferyzhang 发表于 2024-6-11 17:56
不支持分配,需要自己调度。rknn不能自动多个npu串行,这个也是没有意义的,传输的时间远超过推理时间。

...

您可能理解错了,就是一个板子集成了2个1808的NPU,不是通过pcie接了两个1808终端设备
作者: jefferyzhang    时间: 2024-6-12 08:45
没有区别啊,随便你接多少个,怎么接,都是这样的。
就好比你接了2个CPU或者GPU,你代码逻辑上没写他是不会自动加入运算的
作者: gmi    时间: 2024-6-12 09:45
本帖最后由 gmi 于 2024-6-12 09:50 编辑
jefferyzhang 发表于 2024-6-12 08:45
没有区别啊,随便你接多少个,怎么接,都是这样的。
就好比你接了2个CPU或者GPU,你代码逻辑上没写他是不会 ...

哦哦哦,我明白了,那怎么样才能将模型加载到指定的NPU设备吗?当初我也是这样想的,但是在rknn c api文档中没有找到相关的信息。所以我以为默认都会使用的。rknn_set_core_mask这个接口也不支持3568的设置,然后我就在这卡住了。所以您能给个示例吗?非常感谢。

作者: jefferyzhang    时间: 2024-6-12 09:51
gmi 发表于 2024-6-12 09:45
哦哦哦,我明白了,那怎么样才能将模型加载到指定的NPU设备吗?当初我也是这样想的,但是在rknn c api文档 ...

rknn_set_core_mask是设置npu的核数,3568就一个核,没什么好设置的。
你正常写代码就不可能设置错,init_runtime时候都有指定NPU设备,每个session都是一个独立的npu设备
作者: gmi    时间: 2024-6-12 10:40
jefferyzhang 发表于 2024-6-12 09:51
rknn_set_core_mask是设置npu的核数,3568就一个核,没什么好设置的。
你正常写代码就不可能设置错,init ...

def init_runtime(self, target=None, target_sub_class=None, device_id=None, perf_debug=False, eval_mem=False,  async_mode=False, core_mask=NPU_CORE_AUTO, fallback_prior_device="cpu", update_npu_libs=False)
您说的是python的这个接口吗?这里应该是使用device_id指定终端设备的,就是您说的session,在rknn c api 中rknn_init 应该是对应的init_runtime这个接口吧并没有提供这块的参数

作者: jefferyzhang    时间: 2024-6-12 10:45
都有的,文档先走读一下
作者: brick    时间: 2024-6-12 18:54
同问 C++ 应该怎么调用,我的是3588,集成了一块1808,我怎么让模型跑在rk1808上呢;python可以,c++不会用 - - !请大佬赐教~~~
作者: toybrick-abin    时间: 2024-7-22 14:25
jefferyzhang 发表于 2024-6-12 09:51
rknn_set_core_mask是设置npu的核数,3568就一个核,没什么好设置的。
你正常写代码就不可能设置错,init ...

大佬,请教下rk1808被动模式下,支持零拷贝吗?
作者: jefferyzhang    时间: 2024-7-22 16:01
toybrick-abin 发表于 2024-7-22 14:25
大佬,请教下rk1808被动模式下,支持零拷贝吗?

支持,但0拷贝对src要求很高,你得按模型的尺寸做过归一和量化、缩放,除非定制化训练模型,否则你喂的数据基本不可能满足零拷贝要求。

而且不需要追求0拷贝,就几百乘几百的图片,全cpu for循环一次也花不了几个ms。
项目都做完到了开始按毫秒级别优化了再去做这事...




欢迎光临 Toybrick (https://t.rock-chips.com/) Powered by Discuz! X3.3