virtualbox安装的ubuntu系统跑numpy报错

问题:在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.运行代码,可以正常跑起来了

相关推荐
Dlrb12111 小时前
Linux系统编程-信号量(线程同步机制)
linux·条件变量·互斥锁·信号量·线程同步
无限进步_1 小时前
Linux进程等待——wait、waitpid与僵尸进程
linux·运维·服务器·开发语言
2401_834636991 小时前
Linux集群技术-高可用与负载均衡实战解析
linux·运维·负载均衡
吠品1 小时前
处理 Python 类继承中那些变来变去的初始化参数
linux·前端·python
帅大大的架构之路2 小时前
linux上面的一些小知识点
linux·运维·服务器
光电笑映2 小时前
进程间通信:深入 System V IPC:共享内存、消息队列与信号量
linux·运维·服务器·c++
RisunJan2 小时前
Linux命令-patch (为开放源代码软件安装补丁程序)
linux·服务器·算法
皆圥忈2 小时前
_Linux文件系统与磁盘结构深度解析
linux
向日葵.2 小时前
linux & qnx & git 命令 2
linux·运维·git