如何在VirtualBox 6.1.16中启用AVX / AVX2,且使用的是64位的Ubuntu 20.04?

12

TL;DR:

  • 导入Tensorflow 1.15时,Python虚拟机会崩溃(错误信息为Illegal instruction (core dumped)),很可能是因为虚拟机禁用了AVX和AVX2。
  • 我的主机(Windows 10 64位)已经启用AVX和AVX2(使用Cygwin验证,更多细节见下文)[CPU型号为Intel(R) Core(TM) i7-7700 CPU @ 3.60GHz]
  • 在客户机上(使用VirtualBox 6.1.16的Ubuntu 20.04 64位系统,18.04同样存在该问题),AVX和AVX2无法使用。
  • 按照其他线程的建议,在主机上运行了VBoxManage setextradata "Ubuntu20" VBoxInternal/CPUM/IsaExts/AVX 1VBoxManage setextradata "Ubuntu20" VBoxInternal/CPUM/IsaExts/AVX2 1命令,并重启了客户机——但没有任何改变(客户机名称为Ubuntu20)。

有什么建议吗?

更多细节:

使用Cygwin在主机上运行cat /proc/cpuinfo的输出结果——其中包含avx和avx2:

.....
processor       : 7
vendor_id       : GenuineIntel
cpu family      : 6
model           : 158
model name      : Intel(R) Core(TM) i7-7700 CPU @ 3.60GHz
stepping        : 9
cpu MHz         : 3600.000
cache size      : 256 KB
fpu             : yes
fpu_exception   : yes
cpuid level     : 22
wp              : yes
flags           : fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush dts
 acpi mmx fxsr sse sse2 ss ht tm pbe pni dtes64 est tm2 ssse3 fma cx16 xtpr pdcm sse4_1 sse4_2 movbe 
popcnt aes xsave osxsave avx f16c rdrand hypervisor lahf_lm ida xsaveopt pln pts dtherm fsgsbase 
tsc_adjust bmi1 hle avx2 smep bmi2 erms invpcid rtm mpx rdseed adx smap clflushopt
TLB size        : 0 4K pages
clflush size    : 64
cache_alignment : 64
address sizes   : 39 bits physical, 48 bits virtual
power management:

在客户机上运行cat /proc/cpuinfo的输出 - 缺少avx和avx2:

processor   : 0
vendor_id   : GenuineIntel
cpu family  : 6
model       : 158
model name  : Intel(R) Core(TM) i7-7700 CPU @ 3.60GHz
stepping    : 9
microcode   : 0xffffffff
cpu MHz     : 3599.996
cache size  : 8192 KB
physical id : 0
siblings    : 1
core id     : 0
cpu cores   : 1
apicid      : 0
initial apicid  : 0
fpu     : yes
fpu_exception   : yes
cpuid level : 22
wp      : yes
flags       : fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush mmx 
fxsr sse sse2 ht syscall nx rdtscp lm constant_tsc rep_good nopl xtopology nonstop_tsc cpuid 
tsc_known_freq pni ssse3 pcid sse4_1 sse4_2 hypervisor lahf_lm invpcid_single pti fsgsbase invpcid 
md_clear flush_l1d arch_capabilities
bugs        : cpu_meltdown spectre_v1 spectre_v2 spec_store_bypass l1tf mds swapgs itlb_multihit
bogomips    : 7199.99
clflush size    : 64
cache_alignment : 64
address sizes   : 39 bits physical, 48 bits virtual
power management:

1
检查你的VirtualBox配置设置,以便通过CPU特性(如AVX)进行传递。一些虚拟机不幸地默认情况下不这样做,可能是为了在没有AVX的主机上启用暂停->恢复。 - Peter Cordes
哦,我明白了。也许命令行已经改变了,我不知道。尝试使用管理GUI:如果你能在其中找到AVX的guest-CPU选项,它应该可以工作。 - Peter Cordes
3
如果你正在使用Windows,特别是WSL2,请注意Hyper-V和AXV是互斥的。https://forums.virtualbox.org/viewtopic.php?f=25&t=99390 - George Zheng
“avx”需要“xsave”,嵌套分页和嵌套虚拟化(请参见“VBox/VMM/VMMR3/CPUMR3CpuId.cpp”)。然而,在vbox v6.1.22中,当Hyper-V开启时,似乎无法使用嵌套虚拟化。 - Aaron
1
对于上述问题的另一个解决方法是使用Windows的Linux子系统而不是VirtualBox。您可以按照类似的步骤操作Linux机器。使用pip编译安装TensorFlow库即可。 - undefined
显示剩余3条评论
3个回答

14
正如@George-Zheng所提到的,如果你看到一个乌龟图标,那么你已经启用了Hyper-V。遵循他提供的链接中的建议可以解决这个问题,你会注意到乌龟现在变成了带有V的芯片。
简要说明如下:
  1. 作为管理员在Windows主机中打开命令提示符。

    • 找到命令提示符图标并右键单击。选择以管理员身份运行。
  2. 禁用虚拟机监视器启动

    bcdedit /set hypervisorlaunchtype off

  3. 禁用Microsoft Hyper-V

    DISM /Online /Disable-Feature:Microsoft-Hyper-V

  4. 快速关机 shutdown -s -t 2

  5. 等待几秒钟再重新启动。

如果问题仍然存在,请尝试一两次。第二次对我起作用了。

2
谢谢,问题已解决,现在运行更加流畅,也不再出现SIGILL错误。一般建议可能是:1. 重新启动电脑并不打开任何虚拟机应用程序,2. 按照禁用Hyper-V的步骤进行操作。 - Lilian A. Moraru
谢谢您解决我的问题,而且在我完全禁用 Hyper-V 后,我的虚拟机比以前运行得更快了。我简直不敢相信它在 Windows 功能中没有被选中,但仍然在后台活动并试图减慢一切。 - Charlie

2

我遇到了类似的问题。我的Windows CPU启用了正确的标志,但在我的Ubuntu20.04虚拟机上导入TensorFlow时失败并显示非法指令。如上所述,我确认hypervisorlaunchtype已设置为关闭。问题是,在VirtualBox Manager安装期间出现了一些问题。因此,我卸载了它,然后重新安装了它。第一次安装时,它向我显示了一些错误,因此我再次重复安装,这次我得到了一个干净的安装,没有任何错误。我确认我的Ubuntu20.04虚拟机现在显示了我预期的正确CPU标志。我仍然需要卸载/重新安装TensorFlow和NumPy才能使其正常工作。如果其他人发现有用,我在此添加。


1
作为Pato Sandaña's solution的补充,你之所以首先打开了Windows Hyper-V,可能是因为激活了Windows安全功能。我记得有一段时间,Windows建议我打开一个安全功能-“核心隔离”/“内存完整性”。你可以在以下位置找到它: Windows安全=>设备安全=>核心隔离详细信息=>内存完整性。 当我关闭此功能并重新启动电脑让Windows应用更改时,海龟图标消失了,“非法指令”错误也消失了。
坏处是,已禁用的“内存完整性”功能被说明为“防止攻击将恶意代码插入高安全性进程”。这是一种“基于虚拟化安全”的安全功能。虽然禁用Microsoft Hyper-V功能应该具有相同的效果,并且是更通用的解决方案,因为在您的PC上,可能会有其他当前使用Hyper-V的Windows功能: https://learn.microsoft.com/en-us/troubleshoot/windows-client/application-management/virtualization-apps-not-work-with-hyper-v

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接