【開發環境】
系統: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中有不支持的,也不妨搜一下源碼試一下,畢竟牙膏廠!