GPU训练PP-OCRv3模型时出现Segmentation Fault错误求助
PP-OCRv3文本识别训练触发Segmentation Fault问题排查
问题描述
使用PaddlePaddle训练PP-OCRv3文本识别模型时,初始配置batch_size_per_card=128出现GPU内存不足错误,调整为64后,训练启动立即触发Segmentation Fault。预训练模型加载成功、数据加载器配置无误,但首次迭代刚开始就报错。
错误信息
-------------------------------------- C++ Traceback (most recent call last): -------------------------------------- No stack trace in paddle, may be caused by external reasons. ---------------------- Error Message Summary: ---------------------- FatalError: `Segmentation fault` is detected by the operating system. [TimeInfo: *** Aborted at 1726071412 (unix time) try "date -d @1726071412" if you are using GNU date ***] [SignalInfo: *** SIGSEGV (@0x0) received by PID 1421259 (TID 0x731b08f4c000) from PID 0 ***] LAUNCH INFO 2024-09-11 18:16:56,339 Exit code -11
环境配置
- PaddlePaddle 2.6.1(GPU版本)
- CUDA 11.8
- GPU计算能力8.6
- cuDNN 9.4
- 模型:en_PP-OCRv3_rec
- 操作系统:Ubuntu 22.04
已尝试操作
- 将
batch_size_per_card从128降至64,解决内存不足问题但触发新错误 - 修改其他配置参数进一步降低内存占用,无效
- 更换数据集排查数据相关问题,无效
潜在原因与解决方案
1. 版本兼容性问题
cuDNN 9.x属于较新版本,可能与PaddlePaddle 2.6.1存在兼容冲突。建议:
- 降级cuDNN到适配CUDA 11.8的稳定版本(如cuDNN 8.9.x)
- 升级PaddlePaddle到最新稳定版(如2.6.4),新版本通常修复了更多兼容性问题
2. GPU显存碎片或驱动问题
- 重启GPU服务器,清理显存碎片,避免残留内存影响新进程
- 检查NVIDIA驱动版本是否适配CUDA 11.8,建议升级到520.x及以上的对应驱动版本
3. 预训练模型加载异常
虽然提示加载成功,但可能存在权重不匹配或初始化时的内存访问错误:
- 重新下载官方预训练模型,避免文件损坏
- 加载模型时设置
strict=False,跳过不匹配的参数,排查是否是权重维度不一致导致的问题 - 尝试不加载预训练模型,从头开始训练,验证是否是预训练模型引发的错误
4. 数据预处理隐藏问题
即使更换数据集,预处理流程中可能存在越界访问(如图像尺寸处理异常、标签长度不匹配):
- 在数据加载器中添加日志,打印每个batch的图像尺寸、标签长度,检查是否有异常数据
- 用极小batch_size(如2或1)测试,逐步扩大batch_size,定位是否和数据维度相关
5. batch_size调整的间接影响
降低batch_size后,部分依赖batch维度的操作可能出现异常:
- 检查配置文件中的同步BN(
use_sync_bn)设置,尝试关闭同步BN - 调整归一化层的参数,比如修改
norm_type或禁用某些归一化操作
调试步骤
- 启用PaddlePaddle调试模式:设置环境变量
重新运行训练,获取更详细的错误栈信息export FLAGS_check_nan_inf=1 export FLAGS_enable_exception=1 - 使用GDB调试:通过
gdb --args python train.py启动训练进程,触发错误时查看栈信息,定位问题模块 - 单卡单batch测试:设置
batch_size_per_card=1,单GPU运行,观察是否仍报错,逐步排查核心问题
内容的提问来源于stack exchange,提问作者Jacomo
相关产品推荐
相关产品推荐

