Toybrick

楼主: jefferyzhang

RK1808入门教程(1)1808多计算棒并行运算思路分析

jefferyzhang

版主

积分
12952
楼主
发表于 2019-8-23 10:34:05    查看: 29467|回复: 18 | [复制链接]    打印 | 显示全部楼层
本帖最后由 jefferyzhang 于 2019-10-12 09:49 编辑


简介:

1808计算棒作为一个扩充运算单元,是完全可以组成计算棒阵列运算的。这里我们会提出几种思路讨论,并提供一个主动模式的多计算棒运行Sample给大家。
一般来说,使用多计算棒组成阵列的目的是为了:

1. 后端集群运算,避免前端重新改造。
2. 整合计算资源,共享计算资源,提高资源利用率。
3. 解决单个计算棒计算瓶颈,提高帧率。
4. 为上位机提供更多算力。


思路分析:

针对不同的需求,一般来说有3种设计思路:

1.  每个计算棒拥有同样的一个或多个完整模型,通过负载均衡分配每个计算棒推理任务。
2.  每个计算棒只运行模型的一部分,多个计算棒流水线作业,共同计算完成一个模型。
3.  每个计算棒拥有不同的模型,一个上位机通过连接多个计算棒同时进行多种模型的计算。(DEMO主要提供这种)

对于第一种情况:多个计算棒都在运行同一种模型,针对每个计算棒进行负载均衡,那么就可以通过重复瓶颈的方式提高帧率。运行速度取决于重复瓶颈的数量。
对于第二种情况:需要将一个模型拆分成多个子模型,分布在不同的计算棒上做成流水线串行运算,那么就可以通过拆分瓶颈的方式提高帧率。运行帧率取决于最慢的那个子模型。
对于第三种情况:有些案例是需要多个模型协作的,那通过部署多个计算棒,每个计算棒运行单一模型,可以直接扩充上位机运算能力。


三种情况其实对于上位机和计算棒的物理连接并没有太大区别,仅仅是之间的软件设计交互不同而已。
下面我们针对最简单的第三种情况来进行实例操作。


物理连接方式:



1. 计算棒切为主动模式运行。主动模式计算棒会虚拟为一个USB网卡和上位机通讯
2. 多个计算棒通过USB和上位机相连
3. 多个IPCamera通过以太网和上位机网卡相连


网络拓扑:



1. 网络结构上,计算棒通过上位机桥接,得到和上位机、IPCamera同一个网段IP。
2. 所有设备数据都在同一网段收发,这样开发上就方便了许多。


1808计算棒业务逻辑:

1. 直接通过网络获取需要的数据流(本Demo里是通过rtsp获取ipcamera数据)
2. 进行网络推理,处理输出结果。
3. 将最终推理结果发送给上位机


上位机业务逻辑:

1. 控制计算棒开关和工作模式,分配计算棒工作任务
2. 接受各个计算棒发来的结果数据
3. 对结果数据进行应用(本Demo不做其他应用)


FAQ:

Q:计算棒能否支持及联?
A:支持,需要自己开发逻辑代码,没有通用业务逻辑。计算棒仅仅是作为一个运算单元使用而已,不写代码他是不会知道你想如何及联或并行运算的。

Q:如何拆分模型?
A:转换RKNN时候根据设定不同的input和output节点来实现模型的拆分(建议不要拆散“卷积-激活-池化”这样一组操作)。

Q:被动模式是否可以多计算棒运行?
A:可以,在支持被动模式的上位机上可以识别不同计算棒ID,通过ID指定运行的计算棒(当前版本C/Python均已支持

Q:主动模式是否可以多计算棒运行?
A:可以,主动模式和上位机会识别成USB网卡,插入多个计算棒相当于插入了多个网卡,根据你的路由器或者DHCP服务器,每个计算棒都会有一个独立IP可以访问

Q:上位机Linux如何桥接计算棒?
A:二楼Sample里我会放出脚本。


------------- Sample 请继续看2楼 -------------->

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
回复

使用道具 举报

jefferyzhang

版主

积分
12952
沙发
 楼主| 发表于 2019-8-23 10:34:19 | 显示全部楼层
本帖最后由 jefferyzhang 于 2019-8-28 10:44 编辑

多计算棒SAMPLE


附件1  Linux上位机桥接脚本:




(执行之前请先ifconfig确认下节点名字。)

a. 桥接eth0 和 usb0 usb1
  1. chmod +x bridge-setup.sh
  2. ./bridge-setup.sh eth0 usb0 usb1
复制代码

b. 断开桥接 br0:
  1. chmod +x bridge-clean.sh
  2. ./bridge-clean.sh br0
复制代码



附件2 1808计算棒运行脚本(主动模式):



a. Python功能库安装
  1. dnf install -y python3-numpy libdrm
  2. pip3 install toybrick-0.1.9-py3-none-any.whl
复制代码

b. Rockx功能库安装(1808)
  1. dnf install rockx
复制代码

c. 桥接1808后,需要将1808改为DHCP模式从外部路由器获取IP地址。
(具体参看wiki:http://t.rock-chips.com/wiki.php?mod=view&id=63

d. 模型脚本执行方式(每个计算棒运行一个)
  1. ./tb1808_body.py <id>
  2. ./tb1808_obj.py <id>
复制代码
其中<id>为sample的1808索引,其中一个写1,另外一个就要写2


附件3 上位机运行脚本



a. 运行方式:
  1. ./root/host_server.py
复制代码


b. 说明:
由于上位机不一定是Toybrick设备,所以代码里注释掉了仅在toybrick上可绘制的效果图部分,大家其实可以改成所有设备通用的OpenCV显示方式。
但是真正项目应该不会去绘制这些debug信息,可接收到上位机发来的信息即可。


计算棒配置说明:

首先要进入计算棒将计算棒改为主动模式和DHCP模式,具体教程参见wiki:http://t.rock-chips.com/wiki.php?mod=view&id=63
配置完DHCP后你可能无法即使得知计算棒的IP地址,这时候可以使用nmap命令等方式来扫描网段端口,得知计算棒的内网IP:
  1. nmap 192.168.1.1-254 -p 22 --open    # 其中192.168是你DHCP的网段
复制代码
1808改为DHCP模式后他默认的192.168.180.8的IP还是存在的,也可以通过这个IP单独访问计算棒


上位机和1808计算棒交互说明

1. 上位机启动脚本里会启动一个广播线程,不停的向网络广播自己位置和摄像头地址以及每个摄像头任务需求2. 计算棒启动时候接收广播,就可以知道对应任务的摄像头地址(数据流获取地址)和上位机地址(结果发送地址)
3. 计算棒做成开机自启动方式,这样计算棒就无需改动,修改上位机广播内容就可以通知计算棒获取对应任务的数据地址。


配置计算棒开机启动

  1. vi /usr/local/bin/tb.local.after
复制代码
将运行脚本加入尾部,例如:
  1. python3 ./tb1808_body.py 1 > /dev/null &
复制代码



上位机EAIDK310双计算棒演示程序搭建包(RK展会双计算棒演示程序):
链接: https://pan.baidu.com/s/1inq6XfcgwuAXhrihXjKS1Q 提取码: r435

注意:
1. 如果你的上位机不是EAIDK310,是无法显示的,但是可以收到双计算棒处理后的数据


本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
回复

使用道具 举报

jefferyzhang

版主

积分
12952
板凳
 楼主| 发表于 2019-8-26 11:19:35 | 显示全部楼层
sanshin 发表于 2019-8-26 11:11
楼主,请问一个具体问题,请给出一点建议?
》1.  每个计算棒拥有同样的一个或多个完整模型,通过负载均 ...

a. 目前API完全够用,我们经常有将网络拆分使用的情况(例如不支持的op会拆到上位机中cpu或者gpu运算),但是没有拆给其他1808运算的sample。用户无法直接操作NPU的运算单元,但是可以通过转换为RKNN的计算图形式交给NPU运算。

b. 拆分模型的目的是为了在当前方案下达到足够的帧率,流水线作业可以保证帧率,但是延迟是会变高的(如你说的读写传输是会加大延迟的)。每个芯片方案都有各自的优缺点,我们社区也只能跟当前方案对比,无法跟jetson对比。

c. 暂时没有这样的sample。
回复

使用道具 举报

jefferyzhang

版主

积分
12952
地板
 楼主| 发表于 2019-8-26 12:36:58 | 显示全部楼层
本帖最后由 jefferyzhang 于 2019-8-26 12:50 编辑
sanshin 发表于 2019-8-26 12:35
谢谢,可以问另外一个具体问题吗?
我用一台电脑接3个1808stick(一个直接接电脑,另外2个通过USB3.0 hub ...

请看一楼FAQ,目前python的被动模式API是不支持多计算棒的。
请使用c api;或者计算棒主动模式
回复

使用道具 举报

jefferyzhang

版主

积分
12952
5#
 楼主| 发表于 2019-8-26 14:10:30 | 显示全部楼层
sanshin 发表于 2019-8-26 13:54
谢谢,
请问是否可以提供一个动作测试用的3个1808 stick分别跑不同模型的c api的sample吗?
...

自己写吧,我们API文档都有提供那么详细了。。。。
回复

使用道具 举报

jefferyzhang

版主

积分
12952
6#
 楼主| 发表于 2019-8-26 15:32:10 | 显示全部楼层
sanshin 发表于 2019-8-26 15:06
请问你们没有测试代码吗?测试代码也可以?
我们自己写也可以,但是没有找到说明文档,都是python的。
怎 ...

请参看rknn-api 文档《RK3399Pro_Linux&Android_RKNN_API_V0.9.8_20190626》
第3.1.1节:  rknn_init & rknn_init2

rknn_init_extend* extend: 扩展信息的指针,如用于设置或获取当前 init 的信息, 如设置设备的ID号device_id(详见rknn_api.h的rknn_init_extend定义)。如不用, 可赋 NULL。
回复

使用道具 举报

jefferyzhang

版主

积分
12952
7#
 楼主| 发表于 2020-4-7 14:17:26 | 显示全部楼层
xmhy66 发表于 2020-4-7 12:38
什么是计算棒主动模式?

主动模式: 把计算棒当开发版,直接在计算棒上运行程序,和上位机通过计算棒之间的虚拟网卡socket编程交互。

被动模式:把计算棒当计算资源,在上位机开发程序,通过调用rknn接口让计算棒进行运算。
回复

使用道具 举报

jefferyzhang

版主

积分
12952
8#
 楼主| 发表于 2020-7-29 08:25:33 | 显示全部楼层
frank-edw 发表于 2020-7-28 15:21
1)RK3399 可以通过USB3.0同时接入两个RK1808计算棒吗?,他们的API能否支持俩个计算棒同时计算处理?
2) ...

1. 可以,api通过init_runtime区分运行的计算棒
2. 是的
回复

使用道具 举报

jefferyzhang

版主

积分
12952
9#
 楼主| 发表于 2020-7-29 08:26:07 | 显示全部楼层
xmhy66 发表于 2020-4-7 16:38
有被动计算的demo吗?计算棒的算力与3399pro比,差别大吗?

同样的NPU,demo论坛和rknntoolkit、rknnapi里都有
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

产品中心 购买渠道 开源社区 Wiki教程 资料下载 关于Toybrick


快速回复 返回顶部 返回列表