TensorFlow训练ResUNet++时GPU卷积自动调优同步失败求助
问题描述
运行ResUNet++仓库的python3 run.py训练Kvasir-SEG数据集时,训练偶尔随机成功,但多数情况下会在model.fit(第81行)触发GPU卷积自动调优同步失败错误,核心报错包含CUDA_ERROR_ILLEGAL_ADDRESS。
环境配置
- CUDA Toolkit 12.3
- CuDNN 8.9.7
- Python 3.10.12
- TensorFlow 2.17.0
- WSL2
- NVIDIA GeForce RTX 3070 Laptop GPU
已尝试无效方案
- 重启电脑
- 清理
~/.nv/缓存 - 参考相关StackOverflow回答调整
解决方案建议
禁用TensorFlow自动调优功能
在模型训练前添加以下代码,强制关闭卷积自动调优,避免调优过程中的CUDA同步冲突:import tensorflow as tf tf.config.optimizer.set_jit(False) tf.config.optimizer.set_experimental_options({"auto_mixed_precision": False}) tf.keras.backend.set_image_data_format('channels_last')也可在模型的卷积层初始化时显式设置
use_bias=True,部分场景下无偏置卷积的自动调优兼容性较差。调整TensorFlow与CUDA/CuDNN版本匹配
TensorFlow 2.17.0与CUDA 12.3的组合可能存在边缘兼容性问题,建议降级到TensorFlow 2.15.0(官方推荐搭配CUDA 12.2+CuDNN 8.9),或升级CUDA到12.4配合TF 2.17.0,版本匹配能大幅减少底层驱动冲突。限制GPU显存分配
WSL2下GPU显存动态分配机制可能触发异常,添加显存限制代码避免显存溢出导致的非法地址错误:gpus = tf.config.list_physical_devices('GPU') if gpus: try: tf.config.set_logical_device_configuration( gpus[0], [tf.config.LogicalDeviceConfiguration(memory_limit=6144)]) # 根据GPU显存调整数值,示例为6GB logical_gpus = tf.config.list_logical_devices('GPU') except RuntimeError as e: print(e)优化数据加载管道
降低batch_size(比如从8调整为4),并在model.fit中设置workers=1、use_multiprocessing=False,避免多进程数据加载与GPU调优的资源竞争。同时检查数据加载代码,确保无内存泄漏或格式错误。更新WSL2内核与NVIDIA驱动
执行命令更新WSL2内核:wsl --update同时确保Windows端安装适配RTX 3070 Laptop的最新NVIDIA Game Ready驱动,WSL2依赖Windows端驱动提供GPU支持,旧驱动可能存在通信bug。
内容的提问来源于stack exchange,提问作者suhas9176

