Mask-RCNN GPU训练无特定报错即崩溃退出问题求助
Mask RCNN TensorFlow2.x版本CPU/GPU训练故障排查方案
问题场景
使用适配高版本TensorFlow的修改版matterport Mask RCNN训练自定义目标检测模型,代码参考Paperspace平台《Mask RCNN in TensorFlow 2.0》教程调整,先后出现CPU训练异常、GPU训练启动即崩溃的问题。
故障明细
CPU训练异常表现
- 训练速度极慢:仅跑完部分数据集批次耗时就达到1.5小时
- 流程卡死:遍历完当前加载的批次后程序无响应,既没有跑完整个数据集,也没有保存生成的权重文件
GPU训练(NVIDIA GeForce GTX 860M)崩溃表现
- 训练启动后短时间内无明确业务层报错直接退出,进程退出码为
-1073740791 (0xC0000409) - 终端最后输出为TensorFlow Grappler优化器相关警告,提示
CropAndResize算子的PredictCost()执行出错 - 未匹配CUDA/cuDNN版本阶段的附加现象:
- 崩溃时主磁盘存储空间快速减少,每次运行程序会生成约656MB的崩溃转储文件
- 用WinDbg分析转储文件可定位故障为栈缓冲区溢出(Stack buffer overflow),报错指向
cudnn64_8.dll的cudnnBackendFinalize接口 - 崩溃瞬间任务管理器中GPU的Copy模块占用率达到100%
- 将CUDA、cuDNN调整为TensorFlow要求匹配的11.2、8.1版本后,崩溃问题仍存在,仅不再生成大体积转储文件,只会短暂生成0字节的
.dmp文件,约1分钟后随进程退出自动删除,无法通过转储定位根因
可行解决步骤
- 优先关闭Grappler优化器的自动优化逻辑,避免
CropAndResize算子成本预估阶段触发崩溃,在代码最开头(导入tensorflow之前)加入如下配置:
import os import tensorflow as tf tf.config.optimizer.set_jit(False) tf.config.optimizer.set_experimental_options({ "layout_optimizer": False, "constant_folding": False, "shape_optimization": False, "arithmetic_optimization": False, "dependency_optimization": False, "loop_optimization": False, "function_optimization": False })
- 针对GTX 860M为麦克斯韦架构老显卡的特性,限制cuDNN调用的工作空间大小,关闭不兼容的持久化batchnorm加速,在上述环境变量配置段补充:
os.environ["TF_USE_CUDNN_BATCHNORM_SPATIAL_PERSISTENT"] = "0" os.environ["TF_CUDNN_WORKSPACE_LIMIT_IN_MB"] = "128"
- 调整Mask RCNN的配置参数,降低显存和带宽占用:
- 将
IMAGES_PER_GPU设置为1 - 将
IMAGE_MIN_DIM下调至不超过512,IMAGE_MAX_DIM下调至不超过800 - 关闭数据集预取和缓存逻辑,避免CPU-GPU数据拷贝队列阻塞
- 修复CPU训练无响应、不保存权重的问题:新增逐批次训练回调,每跑完10个批次手动触发一次权重保存,关闭多进程数据加载逻辑,避免进程死锁。
- 若以上操作后GPU仍崩溃,可换用TensorFlow 2.10.0版本(最后一个支持原生Windows GPU加速的正式版本)验证,该版本对老架构NVIDIA显卡的cuDNN调用兼容性优于后续版本。
内容的提问来源于stack exchange,提问作者Brutaler
相关产品推荐
相关产品推荐

