深度学习模型推理时GPU显存占用高但GPU-Util为0的问题求助
解决方案
第一步:验证TensorFlow GPU识别状态
首先执行以下代码,确认TensorFlow是否能正常识别到GPU设备:
import tensorflow as tf print(tf.config.list_physical_devices('GPU'))
- 如果输出为空,说明TensorFlow未识别到GPU,核心原因为版本不兼容:
TensorFlow 2.5官方要求的配套环境为CUDA 11.2 + cuDNN 8.1,你当前使用的CUDA 11.4、cuDNN 8.2.4与TensorFlow 2.5版本不匹配,可选择以下任意一种方案修复:- 降级CUDA和cuDNN到匹配的11.2、8.1版本
- 升级TensorFlow到2.7及以上版本,适配CUDA 11.4环境
第二步:GPU识别正常时的运行问题排查
如果第一步输出包含GPU 1的设备信息,说明GPU可被识别,可按以下步骤排查:
- 确保全流程操作都在GPU上下文内
with tf.device('/gpu:1')需要包裹模型加载、输入张量转换、推理执行的全链路逻辑,不能仅包裹单句代码,正确示例如下:
with tf.device('/gpu:1'): # 加载已训练好的DNN模型 model = tf.keras.models.load_model('your_model_path.h5') # 将输入批量图像转换为GPU张量 batch_input = tf.convert_to_tensor(your_image_batch, dtype=tf.float32) # 执行推理 pred_scores = model.predict(batch_input)
- 关闭软设备放置定位问题
在代码开头加入以下配置,当存在无法放置到GPU的操作时会直接抛出异常,避免操作被静默调度到CPU运行:
tf.config.set_soft_device_placement(False)
- 排查数据预处理瓶颈
如果CPU端的图像预处理、数据加载速度过慢,会导致GPU长期等待输入,出现显存占用但利用率为0的情况,可通过以下方式优化:
- 将预处理逻辑替换为TensorFlow原生算子,放到GPU端执行
- 使用
tf.data.Dataset接口加载数据,开启prefetch(tf.data.AUTOTUNE)、map(..., num_parallel_calls=tf.data.AUTOTUNE)实现并行预处理和数据预取
第三步:推理性能优化
确认推理正常跑在GPU上后,可通过以下配置进一步提升速度:
- 固定推理批量大小,避免动态批量导致的GPU性能损耗
- 开启XLA加速:
tf.config.optimizer.set_jit(True)
- 可将模型转换为TensorRT优化格式,进一步提升GPU推理效率
内容的提问来源于stack exchange,提问作者SupernoobBran
相关产品推荐
相关产品推荐

