当前位置: 首页 > news >正文

centos7.9部署百度ocr踩坑记录与解决方法 - -鱼七

CentOS 7.9 部署 PaddleOCR GPU 踩坑全记录

环境:CentOS 7.9 / GCC 4.8.5 / Python 3.12 (Miniconda) / NVIDIA RTX 3090 x2 / CUDA 11.7 / Driver 515.43.04
目标:在标书审核工具中集成 PaddleOCR,利用 GPU 加速 OCR 识别扫描件中的身份证号和人名
最终方案:Docker 容器(Ubuntu 22.04)+ PaddlePaddle 2.6.1 + PaddleOCR 2.9.1 + GPU 直通
耗时:约2天


一、背景

我开发了一个标书交叉审核工具(Flask + Python),核心功能是检测多份标书中是否有重复的身份证号和人名。最初使用 Tesseract OCR 来识别扫描件,但 Tesseract 不支持 GPU 加速,在 16 核至强 E5-2682 v4 上逐页 OCR 非常慢,大文件(100+ 页)等待时间难以接受。

服务器上有两张 NVIDIA RTX 3090(24GB 显存),不用 GPU 太浪费了。于是决定换成百度的 PaddleOCR——开源免费、支持 GPU 加速、中文识别效果比 Tesseract 好很多。

没想到,这一换就踩了两天的坑。


二、环境信息

$ cat /etc/redhat-release
CentOS Linux release 7.9.2009 (Core)$ gcc --version
gcc (GCC) 4.8.5 20150623 (Red Hat 4.8.5-44)$ python3 --version
Python 3.12.x  # Miniconda$ nvidia-smi
NVIDIA-SMI 515.43.04    Driver Version: 515.43.04    CUDA Version: 11.7
GPU 0: NVIDIA GeForce RTX 3090 (24576 MiB)
GPU 1: NVIDIA GeForce RTX 3090 (24576 MiB)$ nvcc --version
Cuda compilation tools, release 11.7, V11.7.64

三、踩坑过程

3.1 第一坑:GCC 4.8.5 导致 pip 安装全面失败

现象:安装 PaddlePaddle GPU 版时,依赖的 numpy 2.x 编译失败。

$ pip3 install paddlepaddle-gpu==2.6.1.post117
# ...
error: NumPy requires GCC >= 9.3

numpy 2.x 使用了 C17 标准特性,需要 GCC 9.3+,而 CentOS 7 自带的 GCC 是 4.8.5。

解决:用 conda 安装预编译的 numpy(conda 的包不需要本地编译)。

conda install "numpy<2.0" -y
pip3 install paddlepaddle-gpu==2.6.1.post117 \-f https://www.paddlepaddle.org.cn/whl/linux/mkl/avx/stable.html \--no-deps

经验:在 CentOS 7 上,任何需要 C++ 编译的 Python 包(numpy、pandas、scikit-learn、rapidfuzz、contourpy 等),都优先用 conda installconda install -c conda-forge,避免触发本地编译。


3.2 第二坑:libstdc++ 版本过低

现象:安装完 PaddlePaddle 后 import paddle 报错。

ImportError: /lib64/libstdc++.so.6: version `GLIBCXX_3.4.20' not found

系统自带的 libstdc++ 来自 GCC 4.8,缺少新版本的 GLIBCXX 符号。

解决:用 conda 安装新版 libstdc++。

conda install -c conda-forge libstdcxx-ng -y
export LD_LIBRARY_PATH=/home/cw/miniconda3/lib:$LD_LIBRARY_PATH

写入 ~/.bashrc 永久生效。


3.3 第三坑:PaddleOCR 的依赖链地狱

PaddleOCR 的依赖非常多,几乎每个都在 CentOS 7 上编译失败:

包名 失败原因 解决方式
scikit-image 依赖 numpy 2.x,GCC 太旧 conda install scikit-image
scikit-learn 同上 conda install scikit-learn
rapidfuzz 需要 scikit-build-core,GCC 太旧 conda install rapidfuzz
contourpy 需要 C++17 支持 conda install matplotlib(自带)
imgaug np.sctypes 在 numpy 1.24+ 被移除 手动 sed 修改源码
albumentations 依赖 numkong,需要 AVX2 指令集编译 降级到 albumentations==1.3.1
pyclipper zlib 库冲突 LD_PRELOAD=/home/cw/miniconda3/lib/libz.so.1
lmdb conda 装的是 C 库不是 Python 绑定 pip install lmdb

imgaug 兼容性修复细节

# imgaug 使用了 numpy 已废弃的 np.sctypes,手动替换
sed -i 's/NP_FLOAT_TYPES = set(np.sctypes\["float"\])/NP_FLOAT_TYPES = {np.float16, np.float32, np.float64}/' \/home/cw/miniconda3/lib/python3.12/site-packages/imgaug/imgaug.pysed -i 's/NP_INT_TYPES = set(np.sctypes\["int"\])/NP_INT_TYPES = {np.int8, np.int16, np.int32, np.int64}/' \/home/cw/miniconda3/lib/python3.12/site-packages/imgaug/imgaug.pysed -i 's/NP_UINT_TYPES = set(np.sctypes\["uint"\])/NP_UINT_TYPES = {np.uint8, np.uint16, np.uint32, np.uint64}/' \/home/cw/miniconda3/lib/python3.12/site-packages/imgaug/imgaug.py

经验:安装 PaddleOCR 时推荐使用 --no-deps 跳过依赖自动解析,需要的依赖提前用 conda 装好。

conda install scikit-image scikit-learn matplotlib opencv pyclipper -c conda-forge -y
pip install paddleocr==2.9.1 --no-deps
pip install lmdb imgaug albumentations==1.3.1 --no-deps

3.4 第四坑:PaddleOCR 版本兼容问题

PaddleOCR 3.5 + PaddlePaddle 2.6.1 = 不兼容

先安装了最新的 PaddleOCR 3.5.0,结果 API 完全变了:

  • use_gpushow_loguse_angle_cls 参数全部废弃
  • 初始化时报 set_optimization_level 属性不存在(这个方法在 PaddlePaddle 3.x 才有)

降级到 PaddleOCR 2.9.1 后参数兼容了,但:

PaddleOCR 2.9.1 + Python 3.12 = OCR 返回 None

初始化成功、模型加载成功,但 ocr.ocr() 始终返回 [None]。通过开启 show_log=True 看到关键日志:

dt_boxes num : 0, elapsed : 2.78

文字检测模型运行了 2.78 秒但检测到 0 个文字区域。尝试了各种调参(det_limit_side_lendet_db_box_threshdet_db_thresh)都无效。CPU 模式也是 0 行。

结论:PaddlePaddle 2.6.1 + Python 3.12 的推理引擎存在 bug,检测模型完全不工作。


3.5 第五坑:无法升级 PaddlePaddle 3.x

既然 PaddlePaddle 2.6.1 有 bug,那升级到 3.x?

  • pip 源:GPU 版最高只有 2.6.2,没有 3.x
  • conda paddle 频道:有 3.0.0,但依赖 cuDNN ≥ 8.9(已装 8.4)、cuda-cupti 等
  • 升级 cuDNN 后用 conda 装:成功安装 PaddlePaddle 3.0,但运行时报 GLIBC_2.27 not found

CentOS 7 的 glibc 是 2.17,PaddlePaddle 3.0 需要 2.27+。升级 glibc 会破坏整个系统,此路不通。

新建 conda 环境也没用——glibc 是系统级的共享库,不受 conda 环境隔离。


3.6 转折点:Docker 方案

既然 CentOS 7 本身的限制绕不过去,决定用 Docker 容器(容器内是 Ubuntu 22.04,glibc 2.35,一切正常)。

拉取镜像的坑:

# Docker Hub 在国内无法直接访问
$ docker pull nvidia/cuda:11.7.1-cudnn8-runtime-ubuntu22.04
# Error: net/http: request canceled while waiting for connection# 解决:用国内镜像源
$ docker pull docker.1ms.run/nvidia/cuda:11.7.1-cudnn8-runtime-ubuntu22.04

期间还遇到 Docker 数据目录磁盘空间不足(root 分区只有 50GB),需要迁移到 /home 分区:

sudo systemctl stop docker
sudo mv /var/lib/docker /home/docker-data
sudo ln -s /home/docker-data /var/lib/docker
sudo systemctl start docker

3.7 第六坑:Docker GPU 直通不工作

容器启动后 GPU 完全不可见。

原因nvidia-container-toolkit 版本太旧(1.13.5),无法正确注入驱动到容器。

$ nvidia-container-cli info  # 主机上能看到 GPU
NVRM version:   515.43.04
Device Index:   0  Model: NVIDIA GeForce RTX 3090
Device Index:   1  Model: NVIDIA GeForce RTX 3090$ docker run --gpus all nvidia/cuda:... nvidia-smi
WARNING: The NVIDIA Driver was not detected.  # 容器里看不到

解决:需要添加 nvidia-container-toolkit 的官方源并更新。

# 添加官方源
curl -s -L https://nvidia.github.io/libnvidia-container/stable/rpm/nvidia-container-toolkit.repo \| sudo tee /etc/yum.repos.d/nvidia-container-toolkit.repo# 升级(1.19.0 的 RPM 包使用 zstd 压缩,CentOS 7 不支持,需要指定 1.17.7)
sudo yum install -y nvidia-container-toolkit-1.17.7 nvidia-container-toolkit-base-1.17.7# 重新配置运行时
sudo nvidia-ctk runtime configure --runtime=docker
sudo systemctl restart docker

关键:如果直接 yum update nvidia-container-toolkit,会拉到 1.19.0 版本,其 RPM 包使用 zstd 压缩格式(rpmlib(PayloadIsZstd)),CentOS 7 的 RPM 不支持。必须指定 1.17.7 版本。

升级后 GPU 直通成功:

$ docker run --rm --gpus all nvidia/cuda:... nvidia-smi
+-----------------------------------------------------------------------------+
| GPU 0  NVIDIA GeForce RTX 3090    24576MiB |
| GPU 1  NVIDIA GeForce RTX 3090    24576MiB |
+-----------------------------------------------------------------------------+

3.8 第七坑:容器内 CUDA 库路径问题

GPU 设备挂载成功了,但 PaddlePaddle 找不到各种 CUDA 库:

报错 原因 解决
Cannot load cudnn shared library cuDNN 库路径不在 LD_LIBRARY_PATH 添加 /usr/lib/x86_64-linux-gnu
libcublas.so: cannot open cublas 在 targets/x86_64-linux/lib/ 子目录 添加该路径 + 创建无版本号软链接

最终的 LD_LIBRARY_PATH 设置:

export LD_LIBRARY_PATH=/usr/local/cuda-11.7/targets/x86_64-linux/lib:/usr/local/cuda/lib64:/usr/lib/x86_64-linux-gnu:/lib/x86_64-linux-gnu:$LD_LIBRARY_PATH

还需要创建软链接(Paddle 动态加载时找的是不带版本号的 .so):

ln -sf /usr/local/cuda-11.7/targets/x86_64-linux/lib/libcublas.so.11 \/usr/local/cuda-11.7/targets/x86_64-linux/lib/libcublas.so
ln -sf /usr/local/cuda-11.7/targets/x86_64-linux/lib/libcublasLt.so.11 \/usr/local/cuda-11.7/targets/x86_64-linux/lib/libcublasLt.so
ldconfig

3.9 第八坑:Paddle 官方镜像 Python 环境损坏

最初尝试用 Paddle 官方的 Docker 镜像:

docker pull registry.baidubce.com/paddlepaddle/paddle:2.6.1-gpu-cuda11.7-cudnn8.4-trt8.4

进入容器后发现 Python 环境完全损坏:

Fatal Python error: init_fs_encoding: failed to get the Python codec of the filesystem encoding
ModuleNotFoundError: No module named 'encodings'

pythonpippython -m pip 全部无法使用。最终放弃官方镜像,改用 NVIDIA 的基础 CUDA 镜像自己搭建环境。


四、最终成功的完整步骤

4.1 拉取基础镜像

# 国内镜像源拉取
sudo docker pull docker.1ms.run/nvidia/cuda:11.7.1-cudnn8-runtime-ubuntu22.04
sudo docker tag docker.1ms.run/nvidia/cuda:11.7.1-cudnn8-runtime-ubuntu22.04 \nvidia/cuda:11.7.1-cudnn8-runtime-ubuntu22.04

4.2 创建并启动容器

sudo docker run --gpus all -d --name paddle-ocr \-v /home/biaoshu:/data \-p 5001:5000 \nvidia/cuda:11.7.1-cudnn8-runtime-ubuntu22.04 \sleep infinity

4.3 容器内安装依赖

sudo docker exec -it paddle-ocr bash# 系统依赖
apt update && apt install -y python3 python3-pip poppler-utils libgl1 libglib2.0-0# CUDA 库软链接
ln -sf /usr/local/cuda-11.7/targets/x86_64-linux/lib/libcublas.so.11 \/usr/local/cuda-11.7/targets/x86_64-linux/lib/libcublas.so
ln -sf /usr/local/cuda-11.7/targets/x86_64-linux/lib/libcublasLt.so.11 \/usr/local/cuda-11.7/targets/x86_64-linux/lib/libcublasLt.so
ldconfig# Python 依赖
pip3 install "numpy<2.0" paddlepaddle-gpu==2.6.1.post117 \-f https://www.paddlepaddle.org.cn/whl/linux/mkl/avx/stable.html \-i https://pypi.tuna.tsinghua.edu.cn/simplepip3 install paddleocr==2.9.1 flask pdfplumber python-docx jieba pymysql Pillow requests \-i https://pypi.tuna.tsinghua.edu.cn/simple# 环境变量(写入 bashrc 永久生效)
cat >> /root/.bashrc << 'EOF'
export LD_LIBRARY_PATH=/usr/local/cuda-11.7/targets/x86_64-linux/lib:/usr/local/cuda/lib64:/usr/lib/x86_64-linux-gnu:/lib/x86_64-linux-gnu:$LD_LIBRARY_PATH
export GLOG_minloglevel=2
EOF
source /root/.bashrc

4.4 验证

GLOG_minloglevel=2 python3 -c "
from paddleocr import PaddleOCR
ocr = PaddleOCR(use_angle_cls=True, lang='ch', use_gpu=True, show_log=False)
result = ocr.ocr('/data/image10.jpeg', cls=True)
lines = []
if result:for page in result:if page:for line in page:if line and len(line) >= 2:lines.append(line[1][0])
print(f'OCR 识别: {len(lines)} 行')
for l in lines[:5]:print(f'  {l}')
"

输出:

OCR 识别: 48 行浙江XXXX有限公司绿色发展规评价划报告浙江省杭州市拱墅区温州注册及经营地址浙江XXXXXXX公司XXX路XXX号二层201室

4.5 启动 Flask 服务

cd /data
nohup python3 bid_analysis_paddle.py >> /data/app.log 2>&1 &

访问 http://服务器IP:5001 即可使用。

4.6 启动脚本

cat > /home/biaoshu/start.sh << 'EOF'
#!/bin/bash
sudo docker start paddle-ocr
sleep 3
sudo docker exec -d paddle-ocr bash -c "source /root/.bashrc && cd /data && nohup python3 bid_analysis_paddle.py >> /data/app.log 2>&1 &"
sleep 5
echo "服务已启动,访问 http://服务器IP:5001"
EOF
chmod +x /home/biaoshu/start.sh

五、版本兼容性总结

组合 Python PaddlePaddle PaddleOCR 结果
CentOS 7 原生 3.12 2.6.1 2.9.1 ❌ OCR 返回 None(推理 bug)
CentOS 7 原生 3.12 2.6.1 3.5.0 set_optimization_level 不存在
CentOS 7 原生 3.12 3.0.0 3.5.0 ❌ glibc 2.27 缺失
Docker Ubuntu 22.04 3.10 2.6.1 2.9.1 ✅ 完美工作

关键结论:PaddlePaddle 2.6.1 在 Python 3.12 下的推理引擎有 bug,检测模型返回空结果。在 Python 3.10 下一切正常。


六、其他注意事项

6.1 Docker 数据目录迁移

如果 root 分区空间不足(Docker 默认存储在 /var/lib/docker):

sudo systemctl stop docker
sudo mv /var/lib/docker /home/docker-data
sudo ln -s /home/docker-data /var/lib/docker
sudo systemctl start docker

6.2 CentOS 7 的 yum 源问题

CentOS 7 已于 2024 年 6 月停止维护,官方源全部失效。需要切换到阿里云归档镜像:

sudo curl -o /etc/yum.repos.d/CentOS-Base.repo https://mirrors.aliyun.com/repo/Centos-7.repo

如果有 PostgreSQL 等第三方源也失效了,直接 sudo mv xxx.repo /etc/yum.repos.d/backup/ 移走。

6.3 nvidia-container-toolkit 版本选择

CentOS 7 的 RPM 不支持 zstd 压缩格式,nvidia-container-toolkit 1.18+ 的 RPM 包使用了 zstd,无法安装。必须指定 1.17.x 版本:

sudo yum install -y nvidia-container-toolkit-1.17.7 nvidia-container-toolkit-base-1.17.7

6.4 文件上传编码问题

从 Windows 上传 Python 文件到 CentOS 时,如果使用 MobaXterm 的编辑器打开再保存,文件编码可能被转换为 GBK,导致:

SyntaxError: Non-UTF-8 code starting with '\xed'

解决:

iconv -f GBK -t UTF-8 app.py -o app_utf8.py && mv app_utf8.py app.py

或者使用 rz -be(二进制模式)上传,避免编码转换。


七、核心教训

  1. CentOS 7 已经不适合做 AI/深度学习开发。GCC 4.8、glibc 2.17、RPM 不支持 zstd,导致几乎所有现代 Python 包都无法安装。如果是新项目,强烈建议使用 Ubuntu 22.04 LTS。

  2. PaddleOCR 对 Python 版本敏感。Python 3.12 + PaddlePaddle 2.6.1 存在推理 bug,Python 3.10 则完全正常。选择经过验证的版本组合很重要。

  3. Docker 是解决系统兼容性问题的最佳方案。当系统太老无法升级时,Docker 容器可以提供完全独立的运行环境,不受宿主机限制。

  4. GPU 直通需要 nvidia-container-toolkit 版本匹配。太旧的版本无法注入驱动,太新的版本 RPM 格式不兼容。1.17.x 是 CentOS 7 上的最佳选择。

  5. 遇到问题时,先看日志再调参。PaddleOCR 的 show_log=True 能看到检测了多少个文字框(dt_boxes num),这个信息直接定位了"不是参数问题,而是推理引擎 bug"。


八、参考链接

  • PaddleOCR GitHub
  • PaddlePaddle 安装指南
  • NVIDIA Container Toolkit 安装
  • CentOS 7 迁移指南
http://www.jsqmd.com/news/719325/

相关文章:

  • 如何彻底告别AutoCAD字体缺失:智能字体管理插件的终极解决方案
  • Voxtral-4B-TTS-2603真实案例:印地语电商促销语音+英语双语播报生成
  • 手把手教你用thop和PyTorch Profiler:快速计算YOLOv8/ResNet等模型的FLOPs与参数量(避坑指南)
  • 不用对接多方!昆明一站式活动舞台搭建策划公司 5 强 - 大风02
  • CSS如何简化跨组件的样式共享_通过CSS变量定义全局规范
  • 告别复杂后处理!用YOLO-Pose实现端到端多人姿态估计(附YOLOv5配置教程)
  • YooAsset:Unity商业化游戏资源管理解决方案,实现50%加载性能提升与零冗余资源部署
  • 2026斑马标签打印机代理商选型指南:授权代理对比与优质服务商推荐 - 速递信息
  • 手把手教你用lspci和setpci排查PCIe Gen4链路不稳(附AER寄存器详解)
  • STM32 DAC实战避坑指南:为什么你的波形有毛刺?从原理到滤波的完整解决方案
  • CL4SE:微服务重构中的上下文学习评估框架实践
  • 三步永久激活Beyond Compare 5:免费密钥生成器完整指南
  • 沈阳惊翼科技客服服务富通天下:上海打造数字化私域平台,赋能中国外贸品牌出海! - 速递信息
  • 别再手动算权重了!用Java实现PCA自动赋权,附完整代码和Excel数据接口
  • 2026年最佳B站资源下载工具:BiliTools跨平台工具箱全解析
  • 2026年贵阳系统门窗工厂直营与铝型材源头采购完全指南 - 优质企业观察收录
  • 2026贵阳系统门窗工厂直营完全指南:从源头工厂到家装交付的透明之路 - 优质企业观察收录
  • 避坑指南:为什么你的FastDTW跑得比原生实现还慢?Python性能优化实测
  • GBase数据库操作Tips(三)
  • 终极Windows优化指南:三分钟完成系统清理与隐私保护
  • SurfaceView vs TextureView:Android视频播放与游戏开发,到底该选哪个?
  • 2026年贵阳系统门窗工厂直营选购指南:从源头工厂到家装交付的透明之路 - 优质企业观察收录
  • 5个简单步骤:用Winhance中文版彻底掌控你的Windows系统 [特殊字符]
  • GoLang 学习(三)
  • Unity游戏实时翻译终极指南:XUnity.AutoTranslator深度解析与实战
  • 苏州鼎轩废旧电子产品:太仓正规的线路板回收公司推荐几家 - LYL仔仔
  • c++如何快速比对两个文件夹下的同名文件差异_哈希值列表算法【实战】
  • Talon:基于Tauri+React的macOS悬浮AI助手部署与架构解析
  • 2026年贵阳系统门窗工厂直营完全指南:从铝型材源头到一站式定制安装 - 优质企业观察收录
  • 杭州友杰建材:滨江正规的PE给水管出售公司怎么联系 - LYL仔仔