问题:在ubuntu上安装了依赖然后python -m bentoml serve service:ModelService --port 9000报错
File "
RuntimeError: NumPy was built with baseline optimizations:
(X86_V2) but your machine doesn't support:
(X86_V2).
,你先别帮我改,帮我分析分析怎么改
分析
这不是代码问题,是 Ubuntu 机器的 CPU 和 NumPy 安装包不兼容。
发生了什么
从 NumPy 2.0 开始,PyPI 上的预编译 wheel 默认要求 CPU 支持 x86-64-v2 指令集(SSE4.2、POPCNT 等,2008年之后的 Intel/AMD 才有)。你的 Ubuntu 机器 CPU 不满足这个要求------可能是:
- 老硬件(2008年前的 CPU)
- 虚拟机没有把宿主机 CPU 特性暴露给客户机(Hyper-V/VMware 的 CPU 兼容模式)
解决选项,从简到繁
选项1:检查 VM 设置(如果是虚拟机)
# 先看当前 CPU 暴露了哪些特性
lscpu | grep -i flags
# 看有没有 sse4_2, popcnt 这些
如果是虚拟机,进宿主机把 CPU 模式从"兼容"改成"host-passthrough"或类似选项,直接把物理 CPU 特性暴露出来。改完重启 VM,numpy 就能用了。这是最好的解法。
选项2:降级 NumPy 到 1.x
NumPy 1.26.x 是最后一个 1.x 大版本,对老旧 CPU 兼容性更好:
pip install "numpy<2"
但要确认 requirements.txt 里写的是 numpy>=1.24.0,1.26.4 在这个范围内,不会破坏其他功能。
选项3:强制从源码编译
pip uninstall numpy
pip install numpy --no-binary numpy
这会用你这台机器的 CPU 特性本地编译 NumPy,天然兼容。缺点是慢(5-15分钟),而且需要系统装了 C 编译器(apt install build-essential python3-dev)。
建议
如果这台机器就是将来产线要跑 BIS Model Server 的那台------选项2(降级 numpy)最稳妥,改一下 requirements.txt:
numpy>=1.24.0,<2
如果只是开发测试机,选项1(检查 VM CPU 设置)通常能根治。
✻ Brewed for 50s
> 我是用virtualbox部署的ubuntu22.04,怎么改设置?
在你的 Windows 宿主机上,打开 PowerShell 或 CMD,执行:
# 1. 先确认 VM 名称
& "C:\Program Files\Oracle\VirtualBox\VBoxManage.exe" list vms
# 2. 设置 CPU 直通(用上一步看到的实际 VM 名称替换)
& "C:\Program Files\Oracle\VirtualBox\VBoxManage.exe" modifyvm "你的VM名称" --cpu-profile "host"
注意:VM 必须是关机状态才能改。改完后再启动 Ubuntu,验证:
lscpu | grep -i sse4_2
# 应该能看到 sse4_2 在 flags 里
python -c "import numpy; print(numpy.__version__)"
# 不再报错
如果 VirtualBox 不在默认路径,找到安装目录下的 VBoxManage.exe,或者在 VirtualBox 图形界面里:选中 VM → 设置 → 系统 → 处理器 → 把"扩展特性"里的 PAE/NX 都勾上。不过 CPU profile 只能通过命令行改,图形界面没有直接暴露这个选项。
✻ Baked for 14s
> 如果是打包的话,打成了镜像,能直接在这台ubuntu上的docker里跑吗?还会有这个cpu问题吗
会有同样的问题。
Docker 不模拟 CPU 指令------容器直接使用宿主机的 CPU。镜像里打包的 NumPy 仍然要求 x86-64-v2,在你这台 VirtualBox VM 的 CPU 上一样跑不了。
两条路
路A:改 VM 设置(一劳永逸)
按上一条说的,关机 VM → 宿主机执行:
& "C:\Program Files\Oracle\VirtualBox\VBoxManage.exe" modifyvm "你的VM名称" --cpu-profile "host"
改完 VM 里的 Docker、裸机 Python 全部正常,不需要动任何代码。
路B:降级 NumPy(只修 Docker 镜像)
改 requirements.txt:
numpy>=1.24.0,<2
然后在 Ubuntu 上重新 pip install 并 bentoml build + bentoml containerize。因为构建发生在 Ubuntu 上,pip 会装 NumPy 1.26.x,它兼容老 CPU。打出来的镜像就能跑了。
---
建议先走路A------VirtualBox CPU profile 改 host 是标准操作,2分钟搞定,后面所有依赖都不再有这类问题。路B当备选。
✻ Crunched for 22s
※ recap: 你需要在 VirtualBox 里让 VM 直通宿主机 CPU 指令集。关机后,在 Windows 宿主机 PowerShell 执行:
```powershell
& "C:\Program Files\Oracle\VirtualBox\VBoxManage.exe" modifyvm "你的VM名称" --cpu-profile "host"
```
启动 Ubuntu,NumPy 就能正常 import 了。 (disable recaps in /config)
怎么看这个该成功了没?"C:\Program Files\Oracle\VirtualBox\VBoxManage.exe" modifyvm "你的VM名称" --cpu-profile "host"
启动 VM 后,在 Ubuntu 里执行:
# 看 SSE4.2 有没有出现
lscpu | grep sse4_2
如果改成功了,会看到类似:
Flags: ... sse4_1 sse4_2 ssse3 ...
没改成功的话输出为空。
然后用之前报错的命令验证:
python -c "import numpy; print('OK')"
输出 OK 就是彻底好了。
✻ Sautéed for 10s
> ((venv312) ) root@raypick:/home/raypick/vswork/rbcd_mae# lscpu | grep -i flags
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 cx16 pcid sse4_1 sse4_2 hypervisor lahf_lm ibrs_enhanced fsgsbase invpcid md_clear flush_l1d arch_capabilities
((venv312) ) root@raypick:/home/raypick/vswork/rbcd_mae# lscpu | grep sse4_2
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 cx16 pcid sse4_1 sse4_2 hypervisor lahf_lm ibrs_enhanced fsgsbase invpcid md_clear flush_l1d arch_capabilities
((venv312) ) root@raypick:/home/raypick/vswork/rbcd_mae# python -c "import numpy; print('OK')"
Traceback (most recent call last):
File "<string>", line 1, in <module>
File "/home/raypick/vswork/rbcd_mae/venv312/lib/python3.12/site-packages/numpy/__init__.py", line 112, in <module>
from numpy.__config__ import show_config
File "/home/raypick/vswork/rbcd_mae/venv312/lib/python3.12/site-packages/numpy/__config__.py", line 4, in <module>
from numpy._core._multiarray_umath import (
File "/home/raypick/vswork/rbcd_mae/venv312/lib/python3.12/site-packages/numpy/_core/__init__.py", line 24, in <module>
from . import multiarray
File "/home/raypick/vswork/rbcd_mae/venv312/lib/python3.12/site-packages/numpy/_core/multiarray.py", line 11, in <module>
from . import _multiarray_umath, overrides
RuntimeError: NumPy was built with baseline optimizations:
(X86_V2) but your machine doesn't support:
(X86_V2).
SSE4.2 已经出来了,但 NumPy 还是报错。差的是 POPCNT 这个指令------x86-64-v2 需要它,而你的 flags 里确实没有 popcnt。--cpu-profile "host" 没把它带过来。
两条路
路A:手动打开 POPCNT(推荐)
回到 Windows 宿主机,VM 关机状态,执行:
& "C:\Program Files\Oracle\VirtualBox\VBoxManage.exe" setextradata "你的VM名称" "VBoxInternal/CPUM/IsaExts/POPCNT" "1"
然后启动 VM 再验证:
lscpu | grep popcnt
有输出就是成了,import numpy 就能过。
路B:降级 NumPy(如果 A 不行)
pip install --no-cache-dir --force-reinstall "numpy<2"
NumPy 1.x 不强制要求 x86-64-v2。
---
建议先试 A,因为你已经改过 host profile,就差这一个 flag 了。如果 extradata 也拉不过来(某些 VirtualBox 版本的限制),再走 B。
个人解决方案
通过设置 CPU 直通方式解决
注意:VM 必须是关机状态才能改。改完后再启动 Ubuntu
1.运行VBoxManage.exe list vms
结果:
"VM_XP" {090fa980-6965-4663-9070-c6f67d19ec6f}
"VM_Win7" {ba856ffd-39ad-4276-af7f-a4a21b8708f4}
"VM_Win81" {d766b601-ecb0-4ac9-b4d0-ba2bde024187}
"VM_Win10" {66ff07b3-2368-4499-a84d-eea278576cbf}
"Ubuntu18" {119eada9-b158-4173-b303-03ba50bd413d}
"Ubuntu18Copy" {143b7383-a11f-4965-9594-85489729c7af}
"Ubuntu18Copy1" {d7d82a91-2815-48a7-9a75-cc7045fcee68}
"ubuntu2204" {8d4b5070-5c14-42b7-8faf-09a8d4db83f3}
2.设置cpu直通,运行以下命令
VBoxManage.exe modifyvm "你的VM名称" --cpu-profile "host"
3.添加POPCNT属性,运行以下命令
VBoxManage.exe setextradata "ubuntu2204" "VBoxInternal/CPUM/IsaExts/POPCNT" "1"
4.在 VirtualBox 图形界面里:选中 VM → 设置 → 系统 → 处理器 → 把"扩展特性"里的 PAE/NX 都勾上。不过 CPU profile 只能通过命令行改,图形界面没有直接暴露这个选项。
5.运行代码,可以正常跑起来了