zoukankan      html  css  js  c++  java
  • 百度人脸识别离线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中有不支持的,也不妨搜一下源码试一下,毕竟牙膏厂!

  • 相关阅读:
    实现PHP Thread基类
    完美实现PHP多线程
    Centos操作记录(一)
    Centos Minimal7 安装问题
    Server Git开发流程
    APP Git协作流程
    git学习笔记
    CentOS安装Nginx
    C++学习笔记(一)
    sql进阶:分组查询、子查询、连接查询
  • 原文地址:https://www.cnblogs.com/zhunix/p/15175905.html
Copyright © 2011-2022 走看看