第二次碰到這個(gè)問題了汉矿,之前解決之后忘記記錄了拜隧。憑借零星的記憶加上強(qiáng)大的Google終于“又”搞定了。避免下次又忘了献幔,果斷記下來懂傀。
環(huán)境
Items | Version |
---|---|
Operation system | Ubuntu 16.04 |
Python | 3.6.1 |
Tensorflow | 1.12.0 |
Hardware virtualization | KVM |
問題描述
在import tensorflow
時(shí)拋出如下錯(cuò)誤:
Illegal instruction (core dumped)
解決方法討論
關(guān)于問題的討論在Github上有開issue #17441。stackoverflow也有相關(guān)問題回答蜡感。
總結(jié)相關(guān)回答:新版本(version >= 1.6.0)的Tensorflow binary release是在avx
指令環(huán)境下編譯的蹬蚁。如果你的CPU不支持該類型指令,就不能使用新版本郑兴。
這樣核心問題就是avx
了犀斋。如果硬件不支持,解決辦法很顯然有以下幾種:
- 降級(jí)Tensorflow版本情连,降到1.5或更低叽粹。不過會(huì)丟掉一些新版本的功能。
- 源碼編譯却舀。老老實(shí)實(shí)從頭開始虫几。
- 換個(gè)CPU??。
而我的問題稍不同挽拔,我是KVM虛擬機(jī)不支持avx
辆脸,但是宿主機(jī)是支持的,那么事情就有轉(zhuǎn)機(jī)了??螃诅,無非是想辦法改虛擬機(jī)配置啦啡氢。
支持avx
- 首先確定宿主機(jī)是否支持
avx
的,查看宿主機(jī)CPU架構(gòu)
$ virsh capabilities
可以看到宿主機(jī)的CPU架構(gòu)為SandyBridge
术裸,并且該架構(gòu)的<feature>
是支持<feature name='avx2'/>
<capabilities>
...
<cpu>
<arch>x86_64</arch>
<model>SandyBridge</model>
<vendor>Intel</vendor>
<topology sockets='1' cores='8' threads='2'/>
<feature name='invpcid'/>
<feature name='erms'/>
<feature name='bmi2'/>
<feature name='smep'/>
<feature name='avx2'/>
...
</cpu>
...
</capabilities>
- 指定虛擬機(jī)CPU架構(gòu)
$ virsh edit $YOUR_VM_NAME
在<domain>
內(nèi)增加<cpu>
配置如下:
<domain type='kvm'>
...
<cpu mode='custom' match='exact'>
<model fallback='allow'>SandyBridge</model>
</cpu>
...
</domain>
其中倘是,<model>
填寫步驟1中查到的CPU架構(gòu)名稱,如這里是SandyBridge
袭艺。
- 重啟虛擬機(jī)&檢查是否生效搀崭。
進(jìn)入虛擬機(jī),查看虛擬機(jī)CPU支持的指令猾编。
$ cat /proc/cpuinfo | grep avx
出現(xiàn)如下結(jié)果门坷,說明CPU已經(jīng)支持avx
指令宣鄙。
現(xiàn)在可以開始愉快的使用Tensorflow了。??
2021-6-5 日補(bǔ)充:
升級(jí)2.4.0之后默蚌,又雙叒core dumped了冻晤,檢查CPU的avx
指令集是支持的。再次扒拉了一下issues #45744绸吸,2.4.0需要avx2
指令集的支持鼻弧,TF真是好棒棒嗷,這次環(huán)境的CPU不支持了锦茁,剩我留下了貧窮的淚水攘轩。
降級(jí)!降級(jí)码俩!降級(jí)度帮!tensorflow 2.3.1
是OK的。
2021-7-13 補(bǔ)充
2.4.0的問題稿存,可以升級(jí)2.4.1笨篷,因?yàn)楣俜桨l(fā)布是這么說的
Release 2.4.1 This release removes the AVX2 requirement from TF 2.4.0.
版本差別不大,趕緊升他鴨??瓣履。