TensorFlow 2.x 不支持直接按比例设置 GPU 显存占用,只能通过 set_memory_growth(True) 实现按需分配,或用 set_memory_limit() 设置字节级硬上限,二者互斥且须在 import 后、模型创建前调用。

TensorFlow 2.x 中无法直接设置 GPU 使用比例
TensorFlow 本身不提供类似 gpu_memory_limit=0.5 这样的“按比例分配”接口。所谓“使用比例”,实际是指显存占用上限,而 TensorFlow 的内存分配机制是**预分配 + 按需增长**(默认行为),不是按比例切片。你看到的“50% GPU”通常只是监控工具(如 nvidia-smi)显示的已用显存占总显存的比例,而非 TF 主动划分的配额。
用 tf.config.set_memory_growth 控制显存增长方式
这是最常用、也最推荐的做法:让 TensorFlow 按需申请显存,避免一启动就占满 GPU。适用于多模型共跑或显存紧张场景。
- 必须在导入
tensorflow后、创建任何模型或会话前调用 - 对每个可见 GPU 都要单独设置
- 启用后,
nvidia-smi显示的显存占用会更贴近真实需求,而不是固定高位
import tensorflow as tf
<p>gpus = tf.config.list_physical_devices('GPU')
for gpu in gpus:
tf.config.experimental.set_memory_growth(gpu, True)用 tf.config.set_memory_limit 硬性限制显存上限
如果你确实需要“最多只用 4GB”,这才是真正意义上的“比例控制”的落地方式——先算出目标显存值(比如 24GB 卡的 50% 是 12288 MB),再设为硬上限。
- 单位是字节(bytes),但通常用 MB 计算后乘以
1024 * 1024 - 该限制不可动态调整,且低于实际需求会导致
ResourceExhaustedError: OOM when allocating tensor - 与
set_memory_growth=True互斥:二者不能同时启用
gpus = tf.config.list_physical_devices('GPU')
if gpus:
tf.config.set_logical_device_configuration(
gpus[0],
[tf.config.LogicalDeviceConfiguration(memory_limit=12288)] # 12GB
)为什么 allow_growth=False + memory_limit 不等于“比例分配”
有人尝试先禁用增长、再设 limit,以为能精确控比,但实际效果常不如预期:
立即学习“Python免费学习笔记(深入)”;
- TF 内部预留开销(如 cuDNN workspace、临时 buffer)不计入 limit,可能仍超限报错
- 不同模型/层/数据形状的显存碎片化程度差异大,“设了 12GB”不代表一定能跑通所有 batch_size=32 的训练
- 多卡环境下,
memory_limit是 per-GPU 设置,不是全局比例调度器
真正需要隔离资源时,应优先考虑 Docker + --gpus devices=0 --shm-size=1g -e NVIDIA_VISIBLE_DEVICES=0 配合 memory_limit,而不是仅靠 TF API。


















