Toybrick

标题: RKNN前传报错 [打印本页]

作者: kyo055    时间: 2020-6-5 11:25
标题: RKNN前传报错
采用ShuffleNet的网络结构,最后一层是一个组卷积,但是没有接ReLU和BatchNorm 直接作为输出了


--> Running model
ASSERT in NeuralNet.cpp.decompressKernel(1889): readBias == 0
terminate called after throwing an instance of 'bool'






作者: kyo055    时间: 2020-6-5 11:48
补充,当选择optimization_level=0 时候,模型居然build出错

###
  1. E Traceback (most recent call last):
  2. E   File "rknn/api/rknn_base.py", line 737, in rknn.api.rknn_base.RKNNBase.build
  3. E   File "rknn/api/rknn_base.py", line 1644, in rknn.api.rknn_base.RKNNBase._quantize2
  4. E   File "rknn/base/RKNNlib/app/medusa/quantization.py", line 105, in rknn.base.RKNNlib.app.medusa.quantization.Quantization.run
  5. E   File "rknn/base/RKNNlib/app/medusa/quantization.py", line 41, in rknn.base.RKNNlib.app.medusa.quantization.Quantization._run_quantization
  6. E   File "rknn/base/RKNNlib/range/analyze_range.py", line 390, in rknn.base.RKNNlib.range.analyze_range.sparse_network
  7. E   File "rknn/base/RKNNlib/range/analyze_range.py", line 288, in rknn.base.RKNNlib.range.analyze_range.analyze_operation
  8. E   File "rknn/base/RKNNlib/range/analyze_range.py", line 187, in rknn.base.RKNNlib.range.analyze_range._a_bn
  9. E   File "rknn/base/RKNNlib/range/analyze_range.py", line 30, in rknn.base.RKNNlib.range.analyze_range._bn_channel_range
  10. E TypeError: unsupported operand type(s) for /: 'NoneType' and 'float'
  11. Build pre-compile shufflenet_v2 failed!

  12. Process finished with exit code 255
复制代码

作者: leok    时间: 2020-6-5 14:47
kyo055 发表于 2020-6-5 11:48
补充,当选择optimization_level=0 时候,模型居然build出错

###

把信息帖全一些;
rknn toolkit版本、其它toolkit版本、原始模型推理是否正确、原始模型如果推理正确的情况下,是否有固化等。
作者: kyo055    时间: 2020-6-5 15:37
leok 发表于 2020-6-5 14:47
把信息帖全一些;
rknn toolkit版本、其它toolkit版本、原始模型推理是否正确、原始模型如果推理正确的情 ...

rknn toolkit v1.3.0 版本, 模型build都正确,原始模型也推理正确,在Caffe也测试过; 就是转出来后, rknn.Inference的时候报错;
后来尝试optimize_level=0, 就会报后面那个错误
作者: leok    时间: 2020-6-5 16:06
kyo055 发表于 2020-6-5 15:37
rknn toolkit v1.3.0 版本, 模型build都正确,原始模型也推理正确,在Caffe也测试过; 就是转出来后, r ...

先参照下这个文档看看能否解决:
https://github.com/rockchip-linu ... olkit_V1.3.2_CN.pdf
作者: kyo055    时间: 2020-6-5 16:31
leok 发表于 2020-6-5 16:06
先参照下这个文档看看能否解决:
https://github.com/rockchip-linux/rknn-toolkit/blob/master/doc/Rock ...

这里面都是RKNN转换,没有这个trouble的解决方法; 而且这个是我在Ubuntu环境下,在PC端进行simulator时产生的错误。 所以这个错误,是因为NeuralNet.cpp 中的decompressKernel()这个函数中有一个断言错误,不清楚板端有没有这个错误。
作者: leok    时间: 2020-6-8 08:50
kyo055 发表于 2020-6-5 16:31
这里面都是RKNN转换,没有这个trouble的解决方法; 而且这个是我在Ubuntu环境下,在PC端进行simulator时 ...

1.3.2版本:https://github.com/rockchip-linux/rknn-toolkit/
同时可以试试在板子上看看
作者: kyo055    时间: 2020-6-8 10:09
leok 发表于 2020-6-8 08:50
1.3.2版本:https://github.com/rockchip-linux/rknn-toolkit/
同时可以试试在板子上看看 ...

我先试一下,你们那些Python的转换工具和模拟工具能开源?
作者: leok    时间: 2020-6-10 08:48
kyo055 发表于 2020-6-8 10:09
我先试一下,你们那些Python的转换工具和模拟工具能开源?

上层python toolkit是开源的。
底层实现和芯片相关。
作者: kyo055    时间: 2020-6-10 12:30
leok 发表于 2020-6-10 08:48
上层python toolkit是开源的。
底层实现和芯片相关。

你好像只发布了 wheel文件, 但是在里面的转换规则 看不到哦,所以能不能给个转换规则或者C++的仿真库,也好做点贡献
作者: kyo055    时间: 2020-6-12 10:30
leok 发表于 2020-6-10 08:48
上层python toolkit是开源的。
底层实现和芯片相关。

还是一样会报错,
  1. --> Export RKNN model
  2. done
  3. --> Init runtime environment
  4. W [set_chip_platform_env:187]evaluate model on RK1808
  5. W [op_optimize:333]Split copy 0 tensor.
  6. W [op_optimize:333]Split copy 0 tensor.
  7. W [op_optimize:333]Split copy 0 tensor.
  8. W [op_optimize:333]Split copy 0 tensor.
  9. W [op_optimize:333]Split copy 0 tensor.
  10. W [op_optimize:333]Split copy 0 tensor.
  11. W [op_optimize:333]Split copy 0 tensor.
  12. W [op_optimize:333]Split copy 0 tensor.
  13. W [op_optimize:333]Split copy 0 tensor.
  14. W [op_optimize:333]Split copy 0 tensor.
  15. W [op_optimize:333]Split copy 0 tensor.
  16. W [op_optimize:333]Split copy 0 tensor.
  17. W [op_optimize:333]Split copy 0 tensor.
  18. done
  19. --> Running model
  20. ASSERT in NeuralNet.cpp.decompressKernel(1889): readBias == 0
  21. terminate called after throwing an instance of 'bool'
  22. Aborted (core dumped)
复制代码

作者: kyo055    时间: 2020-6-12 10:51
leok 发表于 2020-6-10 08:48
上层python toolkit是开源的。
底层实现和芯片相关。

你们这个Conv2d是不是不支持,groups,组卷积操作,对于BatchNorm,是完全支持的吗?还有就是Caffe的 ChannelShuffle操作,这个转换的时候是支持的,那仿真库是同样支持的吗
作者: leok    时间: 2020-6-12 14:50
kyo055 发表于 2020-6-10 12:30
你好像只发布了 wheel文件, 但是在里面的转换规则 看不到哦,所以能不能给个转换规则或者C++的仿真库, ...

转换规则只是从一个格式转到另一个格式,对使用者来说意义不大。
作者: kyo055    时间: 2020-6-12 16:45
leok 发表于 2020-6-12 14:50
转换规则只是从一个格式转到另一个格式,对使用者来说意义不大。

我看了一下  好像都支持 就是PC 仿真的时候 前传报错,纠结啊; 要是NPU不能够使用,就打算采用其他方案了。
作者: xsky    时间: 2020-6-13 17:00
leok 发表于 2020-6-10 08:48
上层python toolkit是开源的。
底层实现和芯片相关。

toolkit 开源吗,在哪下?
作者: kyo055    时间: 2020-7-8 17:10
leok 发表于 2020-6-12 14:50
转换规则只是从一个格式转到另一个格式,对使用者来说意义不大。

这会在板端调试啥信息都正确,但是结果全是0,是怎么回事呢?
  1. 2017-08-05 23:04:05.362 20048-20233/com.rockchip.gpadc.ssddemo E/rkssd4j: 查找的设备[0]: type=USB_DEVICE, id=0123456789ABCDEF
  2. 2017-08-05 23:04:09.608 20048-20233/com.rockchip.gpadc.ssddemo E/rkssd4j: model input num: 1, output num: 1
  3. 2017-08-05 23:04:26.675 20048-20233/com.rockchip.gpadc.ssddemo E/rkssd4j: model input[0] : , dim: 4, fmt: 0, type: 3, qnt_type: 2

  4. # 测试代码
  5. std::string lands_model_path = "/data/user/0/com.rockchip.gpadc.ssddemo/cache/shuffle-stage.rknn";
  6.     FILE *fp_lands = fopen(lands_model_path.c_str(), "rb");
  7.     if(fp_lands == NULL) {
  8.         LOGE("fopen %s fail!\n", lands_model_path.c_str());
  9.         return;
  10.     }
  11.     fseek(fp_lands, 0, SEEK_END);
  12.     int lands_model_len = ftell(fp_lands);
  13.     void *lands_model = malloc(lands_model_len);
  14.     fseek(fp_lands, 0, SEEK_SET);
  15.     if(lands_model_len != fread(lands_model, 1, lands_model_len, fp_lands)) {
  16.         LOGE("fread %s fail!\n", lands_model_path.c_str());
  17.         free(lands_model);
  18.         fclose(fp_lands);
  19.         return;
  20.     }

  21.     fclose(fp_lands);

  22.     // RKNN_FLAG_ASYNC_MASK: enable async mode to use NPU efficiently.
  23.     rknn_context lands_ctx = 0;
  24.     int lands_ret = rknn_init(&lands_ctx, lands_model, lands_model_len, RKNN_FLAG_PRIOR_HIGH);
  25.     free(lands_model);
  26.     if(lands_ret < 0) {
  27.         LOGE("rknn_init shuffle_stage landmarks fail! ret=%d\n", ret);
  28.         return;
  29.     }
  30.     // 查询sdk版本信息
  31.     rknn_sdk_version version;
  32.     lands_ret = rknn_query(lands_ctx, RKNN_QUERY_SDK_VERSION, &version,
  33.                      sizeof(rknn_sdk_version));
  34.     LOGE("api version: %s\n", version.api_version);
  35.     LOGE("driver version: %s\n", version.drv_version);

  36.     // 查找设备
  37.     rknn_devices_id devids;
  38.     ret = rknn_find_devices (&devids);
  39.     LOGE("查找设备: n_devices = %d\n", devids.n_devices);
  40.     for(int i=0; i<devids.n_devices; i++) {
  41.         LOGE("查找的设备[%d]: type=%s, id=%s\n", i, devids.types[i], devids.ids[i]);
  42.     }

  43.     // 查询输入Tensor的属性
  44.     rknn_input_output_num io_num;
  45.     ret = rknn_query(lands_ctx, RKNN_QUERY_IN_OUT_NUM, &io_num, sizeof(io_num));
  46.     if(ret < 0) {
  47.         LOGE("rknn_query fail! ret=%d\n", ret);
  48.     }
  49.     LOGE("model input num: %d, output num: %d\n", io_num.n_input, io_num.n_output);

  50.     // 查询Input的Tensor属性
  51.     rknn_tensor_attr input_attrs[io_num.n_input];
  52.     memset(input_attrs, 0, sizeof(input_attrs));
  53.     for (int i = 0; i < io_num.n_input; i++) {
  54.         input_attrs[i].index = i;
  55.         ret = rknn_query(lands_ctx, RKNN_QUERY_INPUT_ATTR, &(input_attrs[i]),
  56.                          sizeof(rknn_tensor_attr));
  57.         LOGE("model input[%d] : %s, dim: %d, fmt: %d, type: %d, qnt_type: %d \n", i, \
  58.         input_attrs[i].name, input_attrs[i].n_dims, input_attrs[i].fmt, input_attrs[i].type,\
  59.         input_attrs[i].qnt_type);
  60.         // 打印各维度值就是shape
  61.     }

  62.     // 查询Ouput的Tensor属性
  63.     rknn_tensor_attr output_attrs[io_num.n_output];
  64.     memset(output_attrs, 0, sizeof(output_attrs));
  65.     for (int i = 0; i < io_num.n_output; i++) {
  66.         output_attrs[i].index = i;
  67.         ret = rknn_query(lands_ctx, RKNN_QUERY_OUTPUT_ATTR, &(output_attrs[i]),
  68.                          sizeof(rknn_tensor_attr));
  69.         LOGE("model output[%d] : %s, dim: %d, fmt: %d, type: %d, qnt_type: %d \n", i, \
  70.         output_attrs[i].name, output_attrs[i].n_dims, output_attrs[i].fmt, output_attrs[i].type,\
  71.         output_attrs[i].qnt_type);
  72.     }

  73.     // 设置输入
  74.     /// 1. 读取图像作为BGR输入 112x112x3 NHWC格式
  75.     std::string lands_img_path = "/data/user/0/com.rockchip.gpadc.ssddemo/cache/npu_test_lands.png";
  76.     cv::Mat img = cv::imread(lands_img_path.c_str());
  77.     /// 2. 将图像传入RKNN_INPUT_TENSOR
  78.     rknn_input inputs[io_num.n_input];
  79.     memset(inputs, 0, sizeof(inputs));
  80.     for (uint32_t i = 0; i < io_num.n_input; i++){
  81.         inputs[i].index = i;
  82.         inputs[i].type = RKNN_TENSOR_UINT8;
  83.         inputs[i].size = (uint32_t)img.cols*img.rows*img.channels();
  84.         inputs[i].pass_through = (uint8_t)false;     // 非直通模式,将当前数据类型传递到模型中,并在模型内部转换;
  85.         inputs[i].fmt = RKNN_TENSOR_NHWC;
  86.         inputs[i].buf = img.data;
  87.     }
  88.     ret = rknn_inputs_set(lands_ctx, io_num.n_input, inputs);

  89.     // 运行rknn模型
  90.     ret = rknn_run(lands_ctx, NULL);
  91.     if(ret != RKNN_SUCC){
  92.         LOGE("rknn_run fail! ret=%d\n", ret);
  93.     }
  94.     // 获取rknn结果信息
  95.     rknn_output outputs[io_num.n_output];
  96.     memset(outputs, 0, sizeof(outputs));
  97.     for (int i = 0; i < io_num.n_output; i++) {
  98.         outputs[i].want_float = (uint8_t)true;
  99.         outputs[i].is_prealloc = (uint8_t)false;
  100.     }
  101.     ret = rknn_outputs_get(lands_ctx, io_num.n_output, outputs, NULL);

  102.     // 绘制人脸图像并保存人脸结果
  103.     float *pf_src = (float *)outputs[0].buf;
  104.     for (int i = 0; i < output_attrs[0].dims[2]; ++i) {
  105.         float x = pf_src[2*i];
  106.         float y = pf_src[2*i + 1];
  107.         float x_w = x * img.cols;
  108.         float y_h = y * img.rows;
  109.         cv::circle(img,cv::Point(x_w, y_h),2, cv::Scalar(0,0,255),1, 8);
  110.     }
  111.     std::string lands_img_out = "/data/user/0/com.rockchip.gpadc.ssddemo/cache/npu_res_lands.png";
  112.     cv::imwrite(lands_img_out.c_str(), img);

  113.     // 释放输出结果的内存
  114.     ret = rknn_outputs_release(lands_ctx, io_num.n_output, outputs);

  115.     // 释放模型
  116.     rknn_destroy(lands_ctx);
  117. 2017-08-05 23:04:26.675 20048-20233/com.rockchip.gpadc.ssddemo E/rkssd4j: model output[0] : , dim: 4, fmt: 0, type: 3, qnt_type: 2
复制代码


其中输出全是0,能分析一下 怎么回事吗?




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