Toybrick

标题: 请问RK1808S计算棒能够支持并行推理吗 [打印本页]

作者: mailonghua    时间: 2019-11-7 17:17
标题: 请问RK1808S计算棒能够支持并行推理吗
你好,请教一下,py的推理输入接口是一个array,但是却只允许传入一个图片。
所以想确定,加速棒有没有可能允许并行推理,如GPU运作一样,内部有多个核
这样可以将资源充分使用

作者: mailonghua    时间: 2019-11-7 17:21
补充一下,就是输入多个图片能并行加速运算,这样更有效率,并有些模型的比较大,能够充分运用内部资源
而有些模型较为简单,内部资源没有充分运行。所以若有这样的功能,那么简单的模型就可以并行推理,这样是否效率更高
请问支持这样的功能吗
作者: jefferyzhang    时间: 2019-11-8 08:36
1. rknn支持batch size > 1 的 input, 详细请参看rknn文档
2. 也支持多模型同时运行

作者: mailonghua    时间: 2019-11-8 10:50
jefferyzhang 发表于 2019-11-8 08:36
1. rknn支持batch size > 1 的 input, 详细请参看rknn文档
2. 也支持多模型同时运行
...

1.请教一下,你这里描述的batch size >1 的INPUT,应该就是表示多个支持多个图片同时推理
刚又翻看了文档,发现C接口是描述了可以多个输入

但是python接口:inference():inputs:待推理的输入,如经过 cv2处理的图片。格式是 ndarray list。
尝试如下:
(1).outputs = rknn.inference(inputs=[img,img2])

E RKNNAPI: rknn_input_set,  n_inputs = 2, expect 1!
E Catch exception when setting inputs.

(2).outputs = rknn.inference(inputs=[[img],[img2]])
若是这样传递图片,那么 outputs 返回的是None

2.支持多模型同时运行,该如何操作,直接调用API加载两个模型,但是接口是阻塞类型的,如何理解这个并行呢
作者: jefferyzhang    时间: 2019-11-8 10:53
mailonghua 发表于 2019-11-8 10:50
1.请教一下,你这里描述的batch size >1 的INPUT,应该就是表示多个支持多个图片同时推理
刚又翻看了文档 ...

python借口也是支持的,但是你要转成numpy数组,不是这样送进去的,没有list和array混用的。
具体你参考下本论坛有一个mnist多图推理的教程
作者: jefferyzhang    时间: 2019-11-8 10:54
还有就是batch_size需要提前知道,在转换模型时候就必须固定。
作者: mailonghua    时间: 2019-11-8 11:03
jefferyzhang 发表于 2019-11-8 10:53
python借口也是支持的,但是你要转成numpy数组,不是这样送进去的,没有list和array混用的。
具体你参考 ...

好的,谢谢你,我找找帖子
作者: 几头米    时间: 2019-11-8 11:17
jefferyzhang 发表于 2019-11-8 10:54
还有就是batch_size需要提前知道,在转换模型时候就必须固定。

你好,请问后续会考虑加入动态batch_size支持吗, 类似NNIE
作者: mailonghua    时间: 2019-11-8 11:32
本帖最后由 mailonghua 于 2019-11-8 14:01 编辑
jefferyzhang 发表于 2019-11-8 10:53
python借口也是支持的,但是你要转成numpy数组,不是这样送进去的,没有list和array混用的。
具体你参考 ...

是这个吗
http://t.rock-chips.com/forum.ph ... ge=1&extra=#pid4127


作者: jefferyzhang    时间: 2019-11-8 14:13
多图推理:http://t.rock-chips.com/forum.php?mod=viewthread&tid=929
作者: jefferyzhang    时间: 2019-11-8 14:17
几头米 发表于 2019-11-8 11:17
你好,请问后续会考虑加入动态batch_size支持吗, 类似NNIE

理论上是不会支持的,加载模型时候需要知道参数和运算单元数量,并且客户也没有这种场景需求。
会变化batch size不如你搞成1个batch就是了,多batch在复杂模型上并不会提高资源利用率。
作者: mailonghua    时间: 2019-11-8 15:08
jefferyzhang 发表于 2019-11-8 14:13
多图推理:http://t.rock-chips.com/forum.php?mod=viewthread&tid=929

谢谢,这个刚才有参考修改模型(使用了提供的mobilenet_v1的test case),但是出现了警告,从total time上看好像还是只推理了一张图片,唯一不同的是输入是个彩色图片(3通道),而ex是灰度图片,这并不影响吧?
报出的警告如下:
--> Init runtime environment
done
--> Running model
W RKNNAPI: warning: inputs[0] expected input len is 150528, but actual len is 451584!
----------------------------------------
[array([[0.        , 0.        , 0.        , ..., 0.        , 0.        ,
        0.00028157]], dtype=float32)]
----------------------------------------
done
--> Begin evaluate model performance
W RKNNAPI: warning: inputs[0] expected input len is 150528, but actual len is 451584!
========================================================================
                               Performance                              
========================================================================
Total Time(us): 7679
FPS: 130.23
========================================================================

主要将输入进行了修改如下:
# Set inputs
      img = cv2.imread('./dog_224x224.jpg')
      img = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)
      img = cv2.resize(img,(224,224),interpolation = cv2.INTER_AREA)
   
      img1 = cv2.imread('./dog.jpg')
      img1 = cv2.cvtColor(img1, cv2.COLOR_BGR2RGB)
      img1 = cv2.resize(img1,(224,224),interpolation = cv2.INTER_AREA)
   
      img2 = cv2.imread('./dog1.jpg')
      img2 = cv2.cvtColor(img2, cv2.COLOR_BGR2RGB)
      img2 = cv2.resize(img2,(224,224),interpolation = cv2.INTER_AREA)                        
   
      img3 = cv2.imread('./dog2.jpg')
      img3 = cv2.cvtColor(img3, cv2.COLOR_BGR2RGB)
      img3 = cv2.resize(img3,(224,224),interpolation = cv2.INTER_AREA)
   
     image_array=[]
     image_array.append(img1)
     image_array.append(img2)
     image_array.append(img3)
  
     #im = img3.reshape(224,224,3)
     #image_array.append(im)
  
     mat = np.array(image_array).reshape(3,224,224,3)
作者: jefferyzhang    时间: 2019-11-8 15:42
mailonghua 发表于 2019-11-8 15:08
谢谢,这个刚才有参考修改模型(使用了提供的mobilenet_v1的test case),但是出现了警告,从total time ...

看具体运行时间,不用看评估。
评估的好像只会是一个batch的时间。

只要网络大于NPU的计算单元,3个batch的时间一定是约等于 3倍1个batch的时间的。
NPU模块很小,你们一直在误解能跟GPU一样多batch提高利用率,但你仔细看看NPU的面积才多少,除非你网络真的非常小,否则不存在一个batch跑不满NPU计算单元的情况出现。

作者: mailonghua    时间: 2019-11-8 15:47
jefferyzhang 发表于 2019-11-8 15:42
看具体运行时间,不用看评估。
评估的好像只会是一个batch的时间。

感谢提醒和帮助
那么上面的warning是正常的吗?其是在提示输入单元(3*224*224*3)个数超过了实际要求(224*224*3),感觉这个提醒表示操作不对啊?
输入完全按照帖子来进行的,不同的是这里使用的是彩色图片
作者: jefferyzhang    时间: 2019-11-8 16:00
mailonghua 发表于 2019-11-8 15:47
感谢提醒和帮助
那么上面的warning是正常的吗?其是在提示输入单元(3*224*224*3)个数超过了实际要求(2 ...

应该是你build时候batchsize就不对。。rknn转换时候压根就没设进去batch=3
作者: mailonghua    时间: 2019-11-8 16:10
jefferyzhang 发表于 2019-11-8 16:00
应该是你build时候batchsize就不对。。rknn转换时候压根就没设进去batch=3

牛,牛,厉害,非常感谢
作者: 几头米    时间: 2019-11-13 10:41
jefferyzhang 发表于 2019-11-8 14:17
理论上是不会支持的,加载模型时候需要知道参数和运算单元数量,并且客户也没有这种场景需求。
会变化bat ...

我们用的小模型在NPU上推理耗时 < 1ms, 使用上输入的batch数是不确定的,当前NPU也是类似外挂的形式,使用batch也是为了减少数据拷贝时间




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