Skip to content

NumPy 与 Python 版本兼容策略

Django 后端镜像固定使用 Python 3.12,并在 backend/requirements.txt 中锁定:

text
numpy==1.26.4

这个选择不是为了追新,而是为了兼容仍在使用的老旧服务器。

为什么锁定 NumPy 1.26.4

部分老旧服务器或虚拟化环境只支持 x86-64 基础指令集,不支持 x86-64-v2。NumPy 2.x 的 Linux x86-64 wheel 对 CPU 基线的要求更高,在这类机器上可能出现非法指令或无法运行的问题。

NumPy 官方 CPU 构建文档说明,在 x86-64 平台上,当前默认的 min baseline 会映射到 X86_V2,并明确提到这可能不兼容 2009 年以前的 CPU 或部分旧虚拟机。为了避免把运行风险转移到部署阶段,后端依赖继续锁定在 NumPy 1.x 系列的最后稳定版本之一:

text
numpy==1.26.4

这样可以继续使用兼容老旧 x86-64 环境的 NumPy 1.x wheel,避免升级到 NumPy 2.x 后引入 CPU 指令集基线问题。

参考:

为什么后端使用 Python 3.12

NumPy 1.26.4 官方发布说明中写明,该版本支持 Python 3.9-3.12。这意味着 Python 3.12 是 NumPy 1.26.4 官方 wheel 覆盖范围内的最高 Python 版本。

如果后端镜像升级到 Python 3.13 或 3.14,同时继续锁定 numpy==1.26.4,包管理器无法直接使用官方预编译 wheel,通常会退回到源码构建。源码构建会带来几个问题:

  • 构建时间显著变长,对 Docker 构建环境要求更高。
  • 构建结果依赖当前编译器、系统库和 CPU 特性,部署可重复性下降。
  • 即使编译成功,也可能重新引入 CPU 指令集兼容风险。
  • NumPy 1.26.4 本身没有声明支持 Python 3.13/3.14,运行时行为没有官方兼容性保证。

因此,Django 后端镜像不继续升级到更高 Python 版本,而是固定为:

dockerfile
FROM python:3.12-slim

这保证了两个目标同时成立:

  • NumPy 继续锁定在 1.x,兼容不支持 x86-64-v2 的老旧服务器。
  • Python 使用 NumPy 1.26.4 官方支持的最高版本,避免源码编译和额外兼容性风险。

维护原则

在项目仍需要兼容不支持 x86-64-v2 的服务器期间:

  • 不要把 numpy==1.26.4 放宽为 numpy>=...
  • 不要把 Django 后端 Dockerfile 升级到 Python 3.13 或更高版本。
  • 如果确实需要升级 NumPy 或 Python,必须先在目标服务器 CPU 上验证 wheel 可用性、导入测试、核心数据处理流程以及 Docker 构建可重复性。

face-service 当前也使用 Python 3.12,并通过 constraints.txt 固定 numpy==1.26.4。它依赖 OpenCV、onnxruntime 和 insightface,升级风险更高,应与后端使用同一套 NumPy 兼容策略。