[VirtualBox]Windows上のUbuntuからAVX系命令セットにアクセスできないときの対処

# 恐怖の「Illegal instruction (core dumped)」
機械学習を行うためUbuntu上にPython環境を整え、必要なライブラリをpip3でインストール後、いざ実行！
``` python
import keras
```
数秒の沈黙後、無に等しい情報量のエラーが出た。
```
Illegal instruction (core dumped)
```
何？

## AVXが必要らしい
どうもKeras（というよりTensorFlowのv1.6以降）は、AVXというCPUの拡張機能が必要らしい。
[Illegal instruction (core dumped) after running import tensorflow #17411](https://github.com/tensorflow/tensorflow/issues/17411)

そこでUbuntu上で次のコマンドを実行し確認した。
``` shell
$ lscpu
Architecture:        x86_64
CPU op-mode(s):      32-bit, 64-bit
Byte Order:          Little Endian
CPU(s):              2
On-line CPU(s) list: 0,1
Thread(s) per core:  1
Core(s) per socket:  2
Socket(s):           1
NUMA node(s):        1
Vendor ID:           GenuineIntel
CPU family:          6
Model:               167
Model name:          11th Gen Intel(R) Core(TM) i7-11700 @ 2.50GHz
Stepping:            1
CPU MHz:             2495.998
BogoMIPS:            4991.99
Hypervisor vendor:   KVM
Virtualization type: full
L1d cache:           48K
L1i cache:           32K
L2 cache:            512K
L3 cache:            16384K
NUMA node0 CPU(s):   0,1
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 pclmulqdq ssse3 cx16 pcid sse4_1 sse4_2 movbe popcnt aes rdrand hypervisor lahf_lm abm 3dnowprefetch invpcid_single ibrs_enhanced fsgsbase bmi1 bmi2 invpcid rdseed clflushopt arat md_clear flush_l1d arch_capabilities
```
`Flags`の中にavxとavx2がない。
最近のIntelCPUは基本的にAVX、AVX2に対応しているはずなので（Celeronとか下位は除く）、どうもおかしい。

## 過去にDocker desktopをインストールしている
調べを進めると、WindowsのHyper-Vという機能が有効化されているとVirtualBoxがAVX系の命令セットにアクセスできないらしい。（[参考](https://forums.virtualbox.org/viewtopic.php?f=25&t=99390#:~:text=Normally%20Hyper%2DV%20blocks%20Virtualbox.)）
はて、そんな機能オンにした記憶はないが。

...Dockerか

DockerをインストールするとHyper-Vが有効になる（[らしい](https://x.com/ryojikamei/status/1796012906074525848)）ので、これを無効化する必要がある。

## 「Hyper-V」を無効化
- PowerShellを管理者として実行
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3911063/a79b593f-b19d-2130-4154-c3b9d2728b96.png)

以下のコマンドで現在の状態を確認できる
``` shell
$ bcdedit
```
以下の項目があればHyper-Vが有効になっているので
``` shell
hypervisorlaunchtype    Auto
```
次のコマンドで無効化後、ホストであるWindowsPCを再起動する（Ubuntuではない）
``` shell
$ bcdedit /set hypervisorlaunchtype off
```
:::note warn
場合によってはコンセントからプラグを抜く必要もあるようです。
:::


## Windowsの「コア分離」から「メモリ整合性」を無効化
それでもうまくいかない。

で、これも無効化する必要があった。これも要再起動。（[virtualbox.org](https://forums.virtualbox.org/viewtopic.php?t=62339#:~:text=check%20Settings%20%2D%3E%20Device%20Security%20%3E%20Core%20Isolation%20Details%20and%20make%20sure%20settings%20in%20this%20panel%20are%20turned%20off)）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3911063/8637ee04-d475-d647-e46e-016a99b5fcef.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3911063/4890605a-1267-4bce-bdf3-245a1870e934.png)
（脆弱な状態にある可能性があるらしい、しらん）

# 解決
avxとavx2がある、やったー！
``` shell
$ lscpu
Architecture:        x86_64
CPU op-mode(s):      32-bit, 64-bit
Byte Order:          Little Endian
CPU(s):              2
On-line CPU(s) list: 0,1
Thread(s) per core:  1
Core(s) per socket:  2
Socket(s):           1
NUMA node(s):        1
Vendor ID:           GenuineIntel
CPU family:          6
Model:               167
Model name:          11th Gen Intel(R) Core(TM) i7-11700 @ 2.50GHz
Stepping:            1
CPU MHz:             2495.998
BogoMIPS:            4991.99
Hypervisor vendor:   KVM
Virtualization type: full
L1d cache:           48K
L1i cache:           32K
L2 cache:            512K
L3 cache:            16384K
NUMA node0 CPU(s):   0,1
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 pclmulqdq ssse3 cx16 pcid sse4_1 sse4_2 x2apic movbe popcnt aes xsave avx rdrand hypervisor lahf_lm abm 3dnowprefetch invpcid_single fsgsbase bmi1 avx2 bmi2 invpcid rdseed clflushopt arat md_clear flush_l1d arch_capabilities
```
もちろんKerasも動くようになった。

# おわり
Hyper-Vを無効化したのでDockerが動かなくなるかもしれないけど、今は使ってないのでヨシ！

## 追記
しっかり起動しなくなっていた。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3911063/b3a25d4e-972b-ba15-12b9-8804ed7d2026.png)
どちらかを使うたびにHyper-V切り替えないといけないの面倒だなぁ