VirtualBox虚拟机Ubuntu中Docker运行Tensorflow报错错误码132求助
问题根因
- VirtualBox v6.1.x存在已知缺陷:在Windows宿主机开启Hyper-V相关特性的共存模式下,无法正常向虚拟机透传AVX、AVX2指令集;就算手动通过
VBoxManage配置指令集开关,也不会生效。 - TensorFlow 2.2及以上官方预编译版本默认要求CPU支持AVX指令集,Docker默认的seccomp安全策略会进一步屏蔽未被虚拟机识别的指令集调用,最终触发
Illegal instruction错误,退出码132。 - 本地Spyder可以正常运行TensorFlow,是因为虚拟机本地安装的TensorFlow包自动适配了当前虚拟机可见的指令集,关闭了AVX相关优化,所以可以正常执行。
解决方法
方案1:升级VirtualBox到7.0及以上版本(最推荐)
VirtualBox 7.0重构了Hyper-V共存模式下的CPU特性透传逻辑,修复了AVX/AVX2无法透传的问题,操作步骤:
- 卸载当前VirtualBox v6.1.30,安装最新的VirtualBox 7.0.x版本及对应的扩展包
- 关闭目标Ubuntu虚拟机,执行以下命令开启AVX/AVX2透传:
VBoxManage setextradata "Ubuntu 20 Tls" VBoxInternal/CPUM/IsaExts/AVX 1 VBoxManage setextradata "Ubuntu 20 Tls" VBoxInternal/CPUM/IsaExts/AVX2 1
- 启动虚拟机,执行
cat /proc/cpuinfo | grep avx确认已经可以识别到AVX、AVX2指令集 - 重启虚拟机内的Docker服务:
systemctl restart docker,再执行docker-compose up即可正常运行
方案2:修改Docker配置绕过指令集限制
如果暂时无法升级VirtualBox,可以通过修改Docker运行配置解决:
- 在你的
docker-compose.yml对应TensorFlow服务的配置段,添加如下参数放开seccomp限制:
services: 你的服务名: # 其他原有配置不变 security_opt: - seccomp:unconfined
- 重新执行
docker-compose up即可。如果还是报错,可以同时修改Dockerfile,将官方TensorFlow替换为无AVX依赖的编译版本,比如将RUN pip install tensorflow==2.7.0替换为:
RUN pip install --no-cache-dir tensorflow-cpu==2.7.0 -f https://tf.novaal.de/barcelona/
这个源的TensorFlow包是针对无AVX指令集的CPU编译的,不需要AVX支持即可运行。
方案3:完全禁用宿主机Hyper-V相关特性
如果不需要同时使用Hyper-V和VirtualBox,可以完全关闭所有Hyper-V相关特性,让VirtualBox运行在原生虚拟化模式,指令集透传就会恢复正常:
- 打开Windows「控制面板-程序-启用或关闭Windows功能」,取消勾选以下所有选项:
- Hyper-V
- 虚拟机平台
- Windows虚拟机监控程序平台
- 以管理员身份执行命令:
bcdedit /set hypervisorlaunchtype off
- 重启主机2次确保配置生效,再启动VirtualBox的Ubuntu虚拟机,即可正常识别AVX/AVX2指令集,Docker容器也能正常运行。
内容的提问来源于stack exchange,提问作者Stavros Koureas
相关产品推荐
相关产品推荐

