per_process_gpu_memory_fraction在tf 2.x中已被移除,应改用tf.config.experimental.set_memory_growth或set_memory_limit,且必须在import tensorflow之后、模型创建之前调用。

per_process_gpu_memory_fraction 参数根本不能用了
TensorFlow 2.x 默认启用 eager execution 且废弃了 per_process_gpu_memory_fraction,它只在 TensorFlow 1.x 的 tf.ConfigProto 中有效。如果你正在用 TF 2.1+ 却还在查这个参数,大概率会发现设置后完全没效果——不是代码写错了,是它已经被移除了。
TF 2.x 正确做法:用 memory_growth 或 set_memory_limit
TensorFlow 2.x 提供两种显存控制方式,核心逻辑是「按需分配」或「硬性上限」,必须在 import tensorflow as tf 之后、任何模型/计算图创建之前调用:
-
tf.config.experimental.set_memory_growth:设为True后,GPU 显存随 tensor 分配逐步增长,不会预占全部显存;适合训练中显存需求波动大的场景 -
tf.config.experimental.set_memory_limit:指定某张 GPU 的显存上限(单位字节),例如限制为 4GB:tf.config.experimental.set_memory_limit(gpus[0], 4 * 1024**3)
注意:必须先获取 GPU 列表并逐个设置:
gpus = tf.config.experimental.list_physical_devices('GPU')
if gpus:
try:
for gpu in gpus:
tf.config.experimental.set_memory_growth(gpu, True)
# 或者用 set_memory_limit 替代上面这行
except RuntimeError as e:
print(e) # 初始化后无法再修改
常见错误:顺序错、重复初始化、多进程干扰
这些操作不是“设置一次就全局生效”的配置项,而是对当前 Python 进程的 CUDA 上下文做一次性干预:
- 放在
import tensorflow之前?报ModuleNotFoundError或静默失败 - 模型已经 build/fit 过,再调用
set_memory_growth?抛RuntimeError: Physical devices cannot be modified after being initialized - 用 multiprocessing 启动子进程跑 TF?每个子进程都得单独执行一遍 GPU 配置,父进程的设置不继承
- 使用 Jupyter Notebook 时 kernel 重启不彻底?旧的 GPU context 可能残留,建议重启 kernel + 清空所有变量后再试
为什么不用 allow_growth 就容易 OOM
TensorFlow 默认行为是启动时申请几乎全部可见 GPU 显存(哪怕你只建一个 tf.constant([1])),这是为了规避 CUDA 上下文反复创建的开销。但后果很直接:同一张卡上跑两个脚本,第二个直接被 ResourceExhaustedError: OOM when allocating tensor 干掉。这不是代码有 bug,是显存被第一个进程锁死了。所以哪怕只是调试,也建议默认加上 set_memory_growth(True) —— 它不降低性能,只改变分配时机。
Python免费学习笔记(深入):立即使用
在学习笔记中,你将探索 Python 的核心概念和高级技巧!











