Linux 下 PaddleOCR 初始化崩溃:Illegal instruction (SIGILL) 问题排查与解决全过程
问题现象
最近在将 代码从 Windows 移植到 Ubuntu Linux 时,程序启动后初始化 PaddleOCR 直接崩溃。
测试代码如下:
python
from paddleocr import PaddleOCR
print("start")
ocr = PaddleOCR(
use_angle_cls=False,
lang="ch",
use_gpu=False
)
print("ok")
运行结果:
bash
start
[2026/06/09 15:52:35] ppocr DEBUG: Namespace(...)
随后程序退出:
text
--------------------------------------
C++ Traceback (most recent call last):
--------------------------------------
0 paddle_infer::Predictor::Predictor(...)
1 paddle::CreatePaddlePredictor(...)
2 paddle::AnalysisPredictor::Init(...)
3 paddle::AnalysisPredictor::PrepareProgram(...)
4 paddle::AnalysisPredictor::OptimizeInferenceProgram()
5 paddle::inference::analysis::Analyzer::RunAnalysis(...)
6 paddle::inference::analysis::IrAnalysisPass::RunImpl(...)
7 paddle::inference::analysis::IRPassManager::Apply(...)
8 paddle::framework::ir::Pass::Apply(...)
9 paddle::framework::ir::SelfAttentionFusePass::ApplyImpl(...)
10 paddle::framework::ir::GraphPatternDetector::operator()(...)
----------------------
Error Message Summary:
----------------------
FatalError: `Illegal instruction` is detected by the operating system.
Process finished with exit code 132 (interrupted by signal 4:SIGILL)
一、什么是 Illegal instruction?
Linux 中:
text
SIGILL
表示:
text
CPU 执行到了当前处理器不支持的指令。
简单来说就是:
软件编译时使用了某些 CPU 指令集,而运行机器无法执行这些指令。
例如:
AVX512
VNNI
AMX
MKLDNN 优化指令
都会导致这个问题。
二、首先确认 CPU 是否支持
执行:
bash
lscpu
我的机器:
text
型号名称:
13th Gen Intel(R) Core(TM) i5-13490F
CPU Flags:
text
avx
avx2
avx_vnni
fma
说明:
text
AVX 支持
AVX2 支持
VNNI 支持
理论上 Paddle CPU 推理应该没问题。
三、为什么 Windows 正常,Linux 崩溃?
Windows:
text
PaddleOCR 正常运行
Linux:
text
PaddleOCR 初始化即 SIGILL
原因在于:
PaddleOCR 实际依赖 Paddle Inference。
初始化过程:
PaddleOCR
↓
PaddlePaddle
↓
Paddle Inference
↓
MKLDNN/IR优化
↓
CPU指令
崩溃发生在:
text
SelfAttentionFusePass
即:
text
IR 图优化阶段
还没真正开始 OCR。
四、为什么英文模型正常,中文模型崩溃?
测试英文:
python
ocr = PaddleOCR(
lang="en",
use_gpu=False
)
结果:
text
ok
正常。
测试中文:
python
ocr = PaddleOCR(
lang="ch",
use_gpu=False
)
结果:
text
SIGILL
崩溃。
进一步测试:
中文 PP-OCRv3:
python
ocr = PaddleOCR(
lang="ch",
ocr_version="PP-OCRv3",
use_gpu=False
)
结果:
text
ok
正常。
中文 PP-OCRv4:
python
ocr = PaddleOCR(
lang="ch",
ocr_version="PP-OCRv4",
use_gpu=False
)
结果:
text
SIGILL
崩溃。
最终定位:
text
问题不是 PaddleOCR 本身。
而是 PP-OCRv4 中文模型在当前 Paddle Inference 下触发了非法 CPU 指令。
五、过程中踩过的坑
1、NumPy 版本冲突
最开始报错:
text
ImportError:
numpy.core.multiarray failed to import
原因:
text
opencv 编译时基于 numpy 1.x
环境升级成 numpy 2.x
解决:
bash
pip install numpy==1.26.4
2、OpenCV 冲突
安装:
bash
pip install opencv-python==4.10
结果:
text
paddleocr requires opencv-python<=4.6.0.66
解决:
bash
pip uninstall opencv-python -y
pip install opencv-python==4.6.0.66
3、Paddle 未安装
报错:
text
ModuleNotFoundError:
No module named 'paddle'
安装:
bash
pip install paddlepaddle==2.6.2
4、show_log 参数失效
报错:
text
ValueError:
Unknown argument: show_log
原因:
text
PaddleOCR 新版本移除了该参数。
删除即可。
六、最终解决方案
方案一(推荐)
使用 PP-OCRv3 中文模型:
python
ocr = PaddleOCR(
lang="ch",
ocr_version="PP-OCRv3",
use_angle_cls=False,
use_gpu=False
)
结果:
text
ok
稳定运行。
方案二
关闭 MKLDNN:
python
ocr = PaddleOCR(
lang="ch",
use_gpu=False,
enable_mkldnn=False
)
部分机器有效。
方案三
降低 Paddle 版本。
例如:
text
PaddleOCR 2.7.0.3
PaddlePaddle 2.6.2
匹配较稳定。
方案四
使用 ONNX 推理。
完全绕开 Paddle Inference。
适用于:
text
跨平台部署
ARM部署
CPU部署
七、最终验证结果
环境:
text
Ubuntu 24.04
Python 3.10
Intel i5-13490F
版本:
text
numpy 1.26.4
opencv-python 4.6.0.66
paddleocr 2.7.0.3
paddlepaddle 2.6.2
测试结果:
| 模型 | 结果 |
|---|---|
| 英文 PP-OCRv4 | ✅ 正常 |
| 中文 PP-OCRv4 | ❌ SIGILL |
| 中文 PP-OCRv3 | ✅ 正常 |
八、总结
这次问题看起来像:
text
PaddleOCR 崩溃
实际上是:
text
PP-OCRv4 中文模型
+
Paddle Inference
+
Linux CPU优化
三者组合触发的非法指令问题。
因此遇到:
text
FatalError: Illegal instruction
不要第一时间怀疑:
text
CPU坏了
系统坏了
模型下载错了
正确排查顺序应该是:
text
① 测 CPU 指令集
↓
② 测 Paddle 是否正常
↓
③ 测英文模型
↓
④ 测中文 PP-OCRv3
↓
⑤ 确认是否 PP-OCRv4 特有问题
如果你的场景只是:
text
字符识别
标签识别
那么:
PP-OCRv3 完全够用,而且稳定性比 PP-OCRv4 更高。
参考环境
text
Ubuntu 24.04
Python 3.10
PaddleOCR 2.7.0.3
PaddlePaddle 2.6.2
NumPy 1.26.4
OpenCV 4.6.0.66
Intel i5-13490F
如果你在 Linux 下也遇到:
text
SIGILL
Illegal instruction
SelfAttentionFusePass
大概率就是本文遇到的同类问题。