Tengine FAQ中文版

Easter79
• 阅读 980

1. 编译example时,出现类似 fatal error: 'tengine_c_api.h' file not found 的错误?

这是编译Tengine之后没有将相关文件复制到 core/include 的缘故,只需要在Tengine根目录下执行make install即可;如果你是在编译某一个example,还需要在cmake的时候加入参数-DTENGINE_DIR=<tengine_root>来指定Tengine目录。

2. 编译Tengine时,出现类似 internal compiler error: Segmentation fault 的错误?

通常是因为编译时开启太多的线程,尝试用make clean清空编译结果,用较少的线程数(即make命令的 j 参数)重新编译。

3. 编译Android版本的Tengine时,出现 This file was generated by a newer(older) version of protoc which is incompatible with your Protocol Buffer headers. Please update your headers. 的错误?

protobuf版本不匹配。如果你使用了百度云盘上预编译好的 protobuf_lib ,请将你本地的protobuf版本升级(降级)到3.0.0版本,安装方式参见 如何安装 protobuf 3.0.0?;或者使用ndk重新编译 protobuf_lib

4. 如果我的模型有某一部分操作只出现在Tengine的CPU或GPU支持的操作列表里怎么办?

尝试使用 异构计算

5. 为什么树莓派3B开启 CONFIG_ARCH_ARM64=y 编译会报错?

虽然树莓派3B是64位的A53处理器,但由于官方的操作系统运行在aarch32模式下,所以无法正常编译和运行Tengine的64位汇编代码。

6. RK3399如何查看GPU的运行频率和占用率?

在终端执行cat /sys/devices/platform/ff9a0000.gpu/devfreq/ff9a0000.gpu/load

7. 开启TF_SERIALIZER之后编译报错 fatal error: graph.pb.h: No such file or directory

protobuf版本不够高,TF要求3.0.0以上的版本,安装方式参见 如何安装 protobuf 3.0.0?

8. tengine如何指定cpu核心?为什么设置 TENGINE_CPU_LIST=0 或者2 性能没差别?

tengine通过环境变量TENGINE_CPU_LIST 来设置cpu核心。
如果用的是RK3399, cpu的编号是: 0,1,2,3 为A53, 4,5 为A72, 这个信息可以通过命令cat /proc/cpuinfo查看。
因此,设置TENGINE_CPU_LIST, 无论设置0,2 都是单A53, 性能无差别。

设置方法:

  1. 在命令窗口直接设置
    export TENGINE_CPU_LIST=4,5 //两个A72
  2. 在代码中调用setenv设置
    int setenv(const char *envname, const char *envval, int overwrite);
    setenv最后一个参数overwrite 设置为0,表示如果环境变量已有设置,则不更新; 最后一个参数非0, 参数更新
    如:setenv("TENGINE_CPU_LIST", "4,5", 1);

在代码中调用set_cpu_list函数设置
void set_cpu_list(const char* cpu_list_str);
函数接收cpu序号的列表,用逗号作为分隔符,注意:set_cpu_list函数必须在init_tengine之前调用才能生效。
如:set_cpu_list("4,5");

9. 执行程序时出现类似_Failed to execute on: xxx Op: xxx_报错?

检查一下makefile.config里是不是同时注释掉了CONFIG_ARCH_ARM64=yCONFIG_ARCH_BLAS=y,两者起码需要打开一个。对于armv8,建议打开ARM64,如果需要使用只能依赖openblas的OP(如LSTM和DeConv)则需要将BLAS一并打开;对于armv7、x86则只能打开BLAS。

10. 为什么相同的网络和相同的输入,CPU和GPU计算输出的特征向量不完全相同?

对于浮点运算,CPU只支持FP32,而GPU往往同时支持FP16和FP32。如果为GPU设置了FP16运算精度(export ACL_FP16=1),那么由于计算精度的不同,CPU和GPU的运算结果就有了一些差异。

11. 执行程序时报错 _The input file specified is using deprecated params: xxx. Please upgrade the input file by using caffe tools(upgrade_net_proto_text/upgrade_net_proto_binary)._?

Tengine对caffe只支持新的input格式,解决方法:

  1. 调用caffe的工具 upgrade_net_proto_text/upgrade_net_proto_binary 对prototxt进行升级;

  2. 或手动修改prototxt文件,将

    input: "data"
    input_shape {
        dim: 1
        dim: 3
        dim: 300
        dim: 300
    }
    

    的格式改为(_注意:输入维度要对应修改,不能照抄_)

    layer {
        name: "input"
        type: "Input"
        top: "data"
        input_param {
            shape {
                dim: 1
                dim: 3
                dim: 300
                dim: 300
            }
        }
    }
    

    12. 自定义OP后报错 cannot find load function for operator: xxx

    这是因为没有在serializer上注册该OP,使得模型解析过程中找不到OP,以caffe为例可参考 issue#89

    13. 如何使用PyTorch/Gluon模型?

  • PyTorch用户可以将导出onnx模型,或使用转换工具(如PytorchToCaffe转换成caffe模型)来使用Tengine。
  • MXNet-Gluon用户可以导出onnxMXNet-Module模型,或使用转换工具(如GluonConverter转换成caffe模型)来使用Tengine。
  • 有可能是opencv版本问题,opencv3把一些名为CV_xxx的常量挪到了cv命名空间下并且去掉了前缀CV_,可以尝试将代码报错的CV_xxx常量改为cv::xxx后重新编译,如CV_FILLED改为cv::FILLED

14. 编译Tengine过程中报错 te_caffe.pb.h: No such file or directory

te_caffe.pb.h文件是在编译过程中产生的,也就是说在该错误之前应该还会有其他报错——而且这往往是protobuf带来的问题,如 _protoc: error while loading shared libraries: libprotoc.so.xx: cannot open shared object file: No such file or directory_,编译工具未找到protobuf或系统包含多个版本的protobuf导致编译工具产生混乱。

15. 编译example的时候报错 CV_xxx was not declared in this scope

有可能是opencv版本问题,opencv3把一些名为CV_xxx的常量挪到了cv命名空间下并且去掉了前缀CV_,可以尝试将代码报错的CV_xxx常量改为cv::xxx后重新编译,如CV_FILLED改为cv::FILLED

点赞
收藏
评论区
推荐文章
blmius blmius
3年前
MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1
文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s
皕杰报表之UUID
​在我们用皕杰报表工具设计填报报表时,如何在新增行里自动增加id呢?能新增整数排序id吗?目前可以在新增行里自动增加id,但只能用uuid函数增加UUID编码,不能新增整数排序id。uuid函数说明:获取一个UUID,可以在填报表中用来创建数据ID语法:uuid()或uuid(sep)参数说明:sep布尔值,生成的uuid中是否包含分隔符'',缺省为
待兔 待兔
5个月前
手写Java HashMap源码
HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程22
Jacquelyn38 Jacquelyn38
3年前
2020年前端实用代码段,为你的工作保驾护航
有空的时候,自己总结了几个代码段,在开发中也经常使用,谢谢。1、使用解构获取json数据let jsonData  id: 1,status: "OK",data: 'a', 'b';let  id, status, data: number   jsonData;console.log(id, status, number )
Stella981 Stella981
3年前
KVM调整cpu和内存
一.修改kvm虚拟机的配置1、virsheditcentos7找到“memory”和“vcpu”标签,将<namecentos7</name<uuid2220a6d1a36a4fbb8523e078b3dfe795</uuid
Wesley13 Wesley13
3年前
mysql设置时区
mysql设置时区mysql\_query("SETtime\_zone'8:00'")ordie('时区设置失败,请联系管理员!');中国在东8区所以加8方法二:selectcount(user\_id)asdevice,CONVERT\_TZ(FROM\_UNIXTIME(reg\_time),'08:00','0
Wesley13 Wesley13
3年前
00:Java简单了解
浅谈Java之概述Java是SUN(StanfordUniversityNetwork),斯坦福大学网络公司)1995年推出的一门高级编程语言。Java是一种面向Internet的编程语言。随着Java技术在web方面的不断成熟,已经成为Web应用程序的首选开发语言。Java是简单易学,完全面向对象,安全可靠,与平台无关的编程语言。
Stella981 Stella981
3年前
Django中Admin中的一些参数配置
设置在列表中显示的字段,id为django模型默认的主键list_display('id','name','sex','profession','email','qq','phone','status','create_time')设置在列表可编辑字段list_editable
Wesley13 Wesley13
3年前
MySQL部分从库上面因为大量的临时表tmp_table造成慢查询
背景描述Time:20190124T00:08:14.70572408:00User@Host:@Id:Schema:sentrymetaLast_errno:0Killed:0Query_time:0.315758Lock_
Python进阶者 Python进阶者
11个月前
Excel中这日期老是出来00:00:00,怎么用Pandas把这个去除
大家好,我是皮皮。一、前言前几天在Python白银交流群【上海新年人】问了一个Pandas数据筛选的问题。问题如下:这日期老是出来00:00:00,怎么把这个去除。二、实现过程后来【论草莓如何成为冻干莓】给了一个思路和代码如下:pd.toexcel之前把这
Easter79
Easter79
Lv1
今生可爱与温柔,每一样都不能少。
文章
2.8k
粉丝
5
获赞
1.2k