根本原因是tf.data流水线未优化:map()未设num_parallel_calls=tf.data.autotune,cache()位置错误(应在map后、shuffle前),prefetch()顺序不当,且避免在map中调用python图像库函数。

fit() 执行慢,90% 的情况不是模型本身拖后腿,而是数据没喂到位、图没编译好、GPU 在干等。
tf.data流水线卡在IteratorGetNext上
现象是:GPU-Util长期低于30%,CPU满载,训练几轮后越来越慢,fit() 日志里反复卡在 IteratorGetNext。
根本原因在于 map() 默认串行执行——比如用 tf.io.read_file + tf.image.decode_jpeg 读图时,不加并行参数就等于让 CPU 一个一个解码。
- 必须显式设置
num_parallel_calls=tf.data.AUTOTUNE,别写死数字(不同机器核数不同) -
cache()要放在map()之后、shuffle()之前;小数据集用内存缓存,大数据集改用cache('/path/to/disk') - 顺序不能错:
map() → cache() → shuffle() → batch() → prefetch();写成prefetch().batch()会让 GPU 等 CPU 拼 batch - 避免在
map()里调用PIL.Image.open()或cv2.imread(),这些 Python 函数无法被num_parallel_calls并行化
@tf.function 没真正生效
TensorFlow 2.x 默认 eager mode,每步都重建计算图。哪怕只是 model(x) + loss_fn(y, pred) + opt.apply_gradients() 这三行,也会反复走 Python 解释器,GPU 算力全耗在调度上。
- Keras
fit()内部已自动包裹@tf.function,但前提是你的数据管道和模型层都兼容图模式 - 如果用了
tf.py_function,它默认退出图模式;必须确保其输出shape和dtype稳定,否则会触发频繁 retracing - 训练中动态改
batch_size(如 warmup 阶段),会导致输入 signature 变化,强制重新编译图 - 检查日志里有没有
Retracing is expensive,有就说明图在反复重建
GPU 显存占满但算力闲置
nvidia-smi 显示 Memory-Usage 95%、GPU-Util 却只有 10%?这不是显卡不行,是数据格式或调度策略把硬件锁死了。
- 开启混合精度:
policy = tf.keras.mixed_precision.Policy('mixed_float16'),再调用mixed_precision.set_global_policy(policy) - 确认没误启
tf.config.experimental.set_memory_growth却没设allow_growth=True,否则显存分配失败会 fallback 到 CPU - 禁用
tf.debugging.assert_*和tf.print(),它们插入同步点,打断流水线 -
batch_size太小会导致 kernel launch 开销占比过高;对小模型,建议从 64 或 128 起调,别用 8 或 16
XLA 编译没跑起来
@tf.function(jit_compile=True) 看似开了 XLA,但实际可能根本没编译——TensorFlow 静默回退到普通执行,连 warning 都不报。
- 验证是否真启用 XLA:设环境变量
TF_XLA_FLAGS="--xla_hlo_dump_to=/tmp/xla_dump",运行后看/tmp/xla_dump下有没有生成.pbtxt文件 - 输入 shape 必须稳定;若含
None维度(如变长序列),得用@tf.function(input_signature=[tf.TensorSpec([None, 224, 224, 3], tf.float32)])显式声明 - 不要对只调用一次的函数加
jit_compile=True,首次编译开销可能比收益还大 -
tf.xla.experimental.compile()更灵活,可只编译 loss 计算部分,但要求所有输入是tf.Tensor,不支持 NumPy 或 Python 值
最常被忽略的一点:你改了十处模型代码,却漏掉了 num_parallel_calls 和 prefetch() 的位置——这两处不动,其他优化全白搭。
Python免费学习笔记(深入):立即使用
在学习笔记中,你将探索 Python 的核心概念和高级技巧!











