1. 编译example时,出现相似 fatal error: 'tengine_c_api.h' file not found 的错误?
这是编译Tengine以后没有将相关文件复制到 core/include 的缘故,只须要在Tengine根目录下执行make install
便可;若是你是在编译某一个example,还须要在cmake的时候加入参数-DTENGINE_DIR=<tengine_root>
来指定Tengine目录。html
2. 编译Tengine时,出现相似 internal compiler error: Segmentation fault 的错误?
一般是由于编译时开启太多的线程,尝试用make clean
清空编译结果,用较少的线程数(即make
命令的 j 参数)从新编译。java
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。python
4. 若是个人模型有某一部分操做只出如今Tengine的CPU或GPU支持的操做列表里怎么办?
尝试使用 异构计算。git
5. 为何树莓派3B开启 CONFIG_ARCH_ARM64=y 编译会报错?
虽然树莓派3B是64位的A53处理器,但因为官方的操做系统运行在aarch32模式下,因此没法正常编译和运行Tengine的64位汇编代码。github
6. RK3399如何查看GPU的运行频率和占用率?
在终端执行cat /sys/devices/platform/ff9a0000.gpu/devfreq/ff9a0000.gpu/load
apache
7. 开启TF_SERIALIZER以后编译报错 fatal error: graph.pb.h: No such file or directory
protobuf版本不够高,TF要求3.0.0以上的版本,安装方式参见 如何安装 protobuf 3.0.0?api
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, 性能无差异。网络
设置方法:函数
- 在命令窗口直接设置
export TENGINE_CPU_LIST=4,5 //两个A72
- 在代码中调用
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=y
和CONFIG_ARCH_BLAS=y
,二者起码须要打开一个。对于armv8,建议打开ARM64,若是须要使用只能依赖openblas的OP(如LSTM和DeConv)则须要将BLAS一并打开;对于armv七、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格式,解决方法:
- 调用caffe的工具 upgrade_net_proto_text/upgrade_net_proto_binary 对prototxt进行升级;
- 或手动修改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用户能够导出onnx或MXNet-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