TensorFlow是否占用GPU全部资源导致其他CUDA代码运行缓慢?
解决TensorFlow运行后调用CUDA库变慢的问题
你猜的没错,这个问题大概率是TensorFlow默认的显存占用策略导致的!TensorFlow 1.x默认会在初始化时占用全部可用的GPU显存,等你跑完模型预测后,显存并没有被释放,你的CUDA后处理库再去申请GPU资源时就会受限——要么需要等待显存调度,要么只能用剩余的少量显存,自然就变慢了。
下面给你几个实用的解决办法:
方法1:让TensorFlow动态分配显存(推荐)
在TensorFlow初始化会话前,设置显存允许动态增长,这样它只会根据实际需要申请显存,不会一开始就占满整个GPU:
import tensorflow as tf # 配置TensorFlow的GPU显存策略 config = tf.ConfigProto() config.gpu_options.allow_growth = True # 用这个配置创建会话 sess = tf.Session(config=config) # 之后正常跑你的TensorFlow模型预测...
方法2:限制TensorFlow的显存占用比例
如果你不想用动态分配,也可以直接指定TensorFlow最多能使用的显存比例,比如限制它只用70%的显存,剩下的留给你的后处理库:
import tensorflow as tf config = tf.ConfigProto() # 设置显存占用比例为0.7(即70%) config.gpu_options.per_process_gpu_memory_fraction = 0.7 sess = tf.Session(config=config)
方法3:显式释放TensorFlow的显存
如果你的场景是跑完一次TensorFlow预测后就不需要再用它了,可以在调用后处理库前主动关闭会话、释放显存:
# 跑完TensorFlow预测后 sess.close() # 清理TensorFlow的后台资源(如果用了Keras封装的话) tf.keras.backend.clear_session() # 再调用你的CUDA后处理库 lib = ctypes.cdll.LoadLibrary(my.so) result = lib.post_process(tensorflow_result)
不过这个方法需要注意:如果你之后还要再跑TensorFlow,得重新初始化会话,更适合单次预测+后处理的场景。
额外测试建议
你可以用nvidia-smi命令在终端查看显存占用情况,来验证问题根源:
- 先单独跑你的CUDA后处理库,记录此时的显存占用和运行速度
- 再跑TensorFlow模型后,立刻用
nvidia-smi看显存是不是被占满了 - 调用后处理库时再看显存变化,这样就能明确是不是显存不足导致的速度变慢
内容的提问来源于stack exchange,提问作者Chi-Fang Hsieh
相关产品推荐
相关产品推荐

