百度人脸识别离线SDK:Illegal instruction(core dumped)问题原因及解决

【开发环境】
系统:Ubuntu16.04
CPU型号:Intel(R) Core(TM) i5-8265UC CPU @ 1.60GHz
架构:x86_64
微架构:Skylake

【运行环境】
系统:Ubuntu18.04
CPU型号:Intel(R) Xeon(R) CPU E5620 @ 2.40GHz
架构:x86_64
微架构:Westmere-EP

原本程序运行在工控机上,这次客户对于产品形态提出了要求,只能部署在客户提供的服务器上。
看到CPU架构没变,且在多台机器上测试都没问题,就大意了。直到现场部署,才发现报错。根据coredump的堆栈信息来看,最后是挂在了OpenBLAS上。

因为我们是在虚拟机里测试无误后部署,再拷贝到现场环境中运行,再加上提示的是指令的错误,开始怀疑是不是CPU型号导致的(毕竟有运算优化)。
在网上搜这个问题,基本上出来都是和Python版本、TensorFlow等有关的解决方案,提给百度工单,又是一句“我们已经不再维护这个版本了”。

那咋办呢,只能撸起袖子自己干了!
看了下当时咱们下载的test-face-api(SDK+demo)中的lib3,在openblas-linux/lib/下看到libopenblas_haswellp-r0.3.0.so,版本号0.3锁定。
请一定先看一下OpenBLAS源码中的README.md,里面提到了CPU的支持类型。(不支持的请见本文后续~)

1.下载OpenBLAS(注意别下错版本,再次膜拜张先轶大佬~)
https://github.com/xianyi/OpenBLAS/tree/release-0.3.0

2.编译
进入目录,看看有没有能换架构的。
输入:
make DYNAMIC_ARCH=1 USE_OPENMP=1 USE_THREAD=1 NUM_THREAD=20 BINARY=64

3.输出
make install PREFIX=${YOUR_PATH}

4.更新程序引用的动态库

5.运行
成功输出mat score……

其实最开始只发现了一个动态架构(DYNAMIC_ARCH)的宏,但在编译过程中发现了一篇文章,里面提到了编译选项。
见:http://ai.baidu.com/forum/topic/show/941201
看着看着,觉得这个文章的作者有点眼熟啊,想了想这不是刚刚在openblas-linux/lib/里的cmake文件中看到的路径里的名字吗?
接着更新了make的选项,就是上面写的内容。

查看微架构有两个办法:
1.Linux系统,开机dmesg会打印“Performance Events”,后面跟的events就是;
2.官网查询,附链接:https://ark.intel.com/content/www/us/en/ark.html

后续:
在另外一台服务器Intel(R) Xeon(R) CPU E5-2650 v2 @ 2.60GHz上测试,发现用上述编译出来的动态架构版本也可以使用。
这台E5-2650根据官方的描述是Ivy Bridge的微架构,按照README.md,并不支持这个。

俗话说的好:没有困难的工作,只有勇敢的打工人~
在源码里我们果然发现了蛛丝马迹:

        case 14:
          // Ivy Bridge
          if(support_avx())
            return CPUTYPE_SANDYBRIDGE;
          else
            return CPUTYPE_NEHALEM;

如果README.md中有不支持的,也不妨搜一下源码试一下,毕竟牙膏厂!

原文地址:https://www.cnblogs.com/zhunix/p/15175905.html