because cuDNN failed to initialize Tensorflow 显存分配。

本文介绍了解决TensorFlow在GPU上运行时遇到的显存溢出问题,通过调整配置参数,实现GPU显存的按需动态分配,避免了占用全部显存导致的错误。
部署运行你感兴趣的模型镜像

在运行tensorflow的时候碰到这种问题,本以为是显存不足,然而跑简单的模型也遇到这种问题,最后才发现tensorflow默认是占用GPU所有的显存。有时候就会出现这样的问题。可以通过设置GPU显存分配来解决这个问题。

tensorflow.python.framework.errors_impl.UnknownError: 2 root error(s) found.
(0) Unknown: Failed to get convolution algorithm. This is probably because cuDNN failed to initialize, so try looking to see if a warning log message was printed above.
[[{{node Conv2D}}]]
[[Mean/_9]]
(1) Unknown: Failed to get convolution algorithm. This is probably because cuDNN failed to initialize, so try looking to see if a warning log message was printed above.
[[{{node Conv2D}}]]

解决方式:

config = tf.ConfigProto()
config.gpu_options.allow_growth = True
sess = tf.Session(config=config)
# 通过config 选项来控制gpu显存的使用,这个设置只有GPU需要的时候按需动态分配,而不是占用所有显存。

您可能感兴趣的与本文相关的镜像

TensorFlow-v2.15

TensorFlow-v2.15

TensorFlow

TensorFlow 是由Google Brain 团队开发的开源机器学习框架,广泛应用于深度学习研究和生产环境。 它提供了一个灵活的平台,用于构建和训练各种机器学习模型

### TensorFlow 中 Conv2D 操作引发 UnknownError 的解决方案 在 TensorFlow 中,`Conv2D` 操作引发的 `UnknownError: Failed to get convolution algorithm` 通常与 cuDNN 初始化失败相关。以下是解决此问题的具体方法: #### 验证 GPUcuDNN 的兼容性 确保所使用的 CUDA 和 cuDNN 版本与 TensorFlow 的要求一致。例如,TensorFlow 2.x 版本通常需要 CUDA 11.x 和 cuDNN 8.x 的组合[^1]。可以通过以下命令检查安装的版本: ```bash nvcc --version cat /usr/include/cudnn_version.h | grep CUDNN_MAJOR -A 2 ``` 如果版本不匹配,可能需要重新安装兼容的 CUDA 和 cuDNN 版本。 #### 调整 GPU 内存分配策略 GPU 内存不足可能导致 `Conv2D` 初始化失败。可以限制 TensorFlow 使用的 GPU 内存量,启用按需增长模式: ```python import tensorflow as tf gpus = tf.config.experimental.list_physical_devices('GPU') if gpus: try: for gpu in gpus: tf.config.experimental.set_memory_growth(gpu, True) except RuntimeError as e: print(e) ``` 通过设置 `set_memory_growth`,可以避免一次性分配所有可用内存[^3]。 #### 强制使用 TensorFlow 原生实现 如果 cuDNN 初始化失败,可以禁用 cuDNN 并强制 TensorFlow 使用其原生实现。通过设置环境变量来实现: ```bash export TF_FORCE_GPU_ALLOW_GROWTH=true export TF_CUDNN_USE_AUTOTUNE=0 ``` 这些设置会告诉 TensorFlow 不依赖 cuDNN 进行卷积操作[^4]。 #### 检查数据格式 确保输入数据的格式正确。TensorFlow 默认使用 `channels_last` 格式(即 NHWC),而某些情况下可能需要切换为 `channels_first`(即 NCHW): ```python tf.keras.backend.set_image_data_format('channels_first') ``` 错误的数据格式可能导致卷积操作失败[^5]。 #### 启用详细日志记录 启用 TensorFlow 的详细日志记录以获取更多关于错误的信息: ```python tf.debugging.set_log_device_placement(True) ``` 这可以帮助定位问题的根源。 #### 示例代码:完整解决方案 以下是一个完整的代码示例,结合了上述方法以解决 `Conv2D` 的 `UnknownError`: ```python import tensorflow as tf # 设置 GPU 内存增长 gpus = tf.config.experimental.list_physical_devices('GPU') if gpus: try: for gpu in gpus: tf.config.experimental.set_memory_growth(gpu, True) except RuntimeError as e: print(e) # 禁用 cuDNN tf.config.set_soft_device_placement(True) tf.config.optimizer.set_jit(False) # 构建模型 model = tf.keras.Sequential([ tf.keras.layers.Conv2D(filters=16, kernel_size=(3, 3), activation='relu', input_shape=(28, 28, 1)), tf.keras.layers.MaxPooling2D(pool_size=(2, 2)) ]) # 编译模型 model.compile(optimizer='adam', loss='sparse_categorical_crossentropy', metrics=['accuracy']) # 训练模型 model.fit(tf.random.normal((10, 28, 28, 1)), tf.random.normal((10,)), epochs=1) ``` --- ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值