第二次碰到这个问题了,之前解决之后忘记记录了。凭借零星的记忆加上强大的Google终于“又”搞定了。避免下次又忘了,果断记下来。
环境
Items | Version |
---|---|
Operation system | Ubuntu 16.04 |
Python | 3.6.1 |
Tensorflow | 1.12.0 |
Hardware virtualization | KVM |
问题描述
在import tensorflow
时抛出如下错误:
Illegal instruction (core dumped)
解决方法讨论
关于问题的讨论在Github上有开issue #17441。stackoverflow也有相关问题回答。
总结相关回答:新版本(version >= 1.6.0)的Tensorflow binary release是在avx
指令环境下编译的。如果你的CPU不支持该类型指令,就不能使用新版本。
这样核心问题就是avx
了。如果硬件不支持,解决办法很显然有以下几种:
- 降级Tensorflow版本,降到1.5或更低。不过会丢掉一些新版本的功能。
- 源码编译。老老实实从头开始。
- 换个CPU😂。
而我的问题稍不同,我是KVM虚拟机不支持avx
,但是宿主机是支持的,那么事情就有转机了😀,无非是想办法改虚拟机配置啦。
支持avx
- 首先确定宿主机是否支持
avx
的,查看宿主机CPU架构
$ virsh capabilities
可以看到宿主机的CPU架构为SandyBridge
,并且该架构的<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>
- 指定虚拟机CPU架构
$ virsh edit $YOUR_VM_NAME
在<domain>
内增加<cpu>
配置如下:
<domain type='kvm'>
...
<cpu mode='custom' match='exact'>
<model fallback='allow'>SandyBridge</model>
</cpu>
...
</domain>
其中,<model>
填写步骤1中查到的CPU架构名称,如这里是SandyBridge
。
- 重启虚拟机&检查是否生效。
进入虚拟机,查看虚拟机CPU支持的指令。
$ cat /proc/cpuinfo | grep avx
出现如下结果,说明CPU已经支持avx
指令。
现在可以开始愉快的使用Tensorflow了。🤗
2021-6-5 日补充:
升级2.4.0之后,又双叒core dumped了,检查CPU的avx
指令集是支持的。再次扒拉了一下issues #45744,2.4.0需要avx2
指令集的支持,TF真是好棒棒嗷,这次环境的CPU不支持了,剩我留下了贫穷的泪水。
降级!降级!降级!tensorflow 2.3.1
是OK的。
2021-7-13 补充
2.4.0的问题,可以升级2.4.1,因为官方发布是这么说的
Release 2.4.1 This release removes the AVX2 requirement from TF 2.4.0.
版本差别不大,赶紧升他鸭🦆。