1. 程式人生 > 其它 >百度人臉識別離線SDK:Illegal instruction(core dumped)問題原因及解決

百度人臉識別離線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 PREFIX=${YOUR_PATH} install

4.更新程式引用的動態庫

5.執行
成功輸出mat score……

其實最開始只發現了一個動態架構(DYNAMIC_ARCH)的巨集,但在編譯過程中發現了一篇文章,裡面提到了編譯選項。
見:http://ai.baidu.com/forum/topic/show/941201
看著看著,覺得這個文章的作者有點眼熟啊,想了想這不是剛剛在openblas-linux/lib/裡的cmake檔案中看到的路徑裡的名字嗎?
接著更新了make的選項,就是上面寫的內容。

附上一個查詢微架構的連結:https://ark.intel.com/content/www/us/en/ark.html