tf 2.x 默认 eager 模式下未用 @tf.function 封装导致频繁重建图,引发高 cpu 开销与 gpu 利用率波动;需显式添加 input_signature 编译、冻结图接入 tensorrt,并用 clear_session 管理多模型内存。

@tf.function 封装推理逻辑。
为什么直接调用 model.predict() 会变慢
TF 2.x 默认启用 eager execution,model.predict() 或 model(x) 每次都是 Python 层调用 → 构建子图 → 执行 → 丢弃,没有复用。尤其在小 batch、高频调用(如在线服务每秒百次请求)时,图构建开销远超计算本身。
TF 1.x 的 static graph 是一次性构建、反复执行,天然规避这部分成本;但 TF 2.x 不是“退步”,是把控制权交还给你:你要显式编译,而不是依赖隐式图。
- 现象:nvidia-smi 显示 GPU-util 在 0% 和 95% 之间跳变,CPU 占用高,首帧延迟明显
- 本质:不是算得慢,是“准备算”太频繁
- 别关 eager——
tf.compat.v1.disable_eager_execution()会丢失 Keras 集成、调试便利性和自动求导等关键优势
@tf.function 编译推理函数必须带 input_signature
不加 input_signature,只要输入 shape 或 dtype 变动(比如 batch size 改变、序列长度不固定),TF 就会 retracing——重新生成图,相当于又做了一次“构建+丢弃”。日志里反复出现 Retracing is expensive 就是这个原因。
Python 3.14.2是Python编程语言在2025年12月5日发布的稳定版本,属于3.14系列的第二个维护更新。该版本包含了18项修复,重点解决了多进程、数据类及正则表达式等模块的回归问题,并修复了CVE-2025-12084等安全漏洞。此版本标志着自由线程模式(移除GIL)正式获得官方支持,是Python发展的重要里程碑。
- 正确写法:
@tf.function(input_signature=[tf.TensorSpec([None, 224, 224, 3], tf.float32)]),其中None表示 batch 维度可变,其它维度必须固定 - 错误写法:
@tf.function后直接传不同 shape 的张量,或用tf.data.Dataset.from_generator返回变长 batch - 注意:
input_signature一旦声明,就不能再传 int64 输入去匹配 float32 声明,否则触发 retracing
TensorRT 加速必须走 frozen graph 路径
TF 原生推理只发挥 GPU 算力的 30%~50%,真正提速要靠 TensorRT 接管计算密集子图。但它不接受 Keras Model 或 eager tensor,只认 frozen graph(.pb)。
- 必须先导出:
tf.saved_model.save(model, "saved_model_dir")→loaded = tf.saved_model.load(...)→ 获取concrete_function→ 再用tf.graph_util.convert_variables_to_constants_v2冻结 - 不能跳步:直接对
tf.keras.Model对象调trt.create_inference_graph会报NotImplementedError: Cannot convert a symbolic Tensor - 显存要预留:初始化前设
tf.GPUOptions(per_process_gpu_memory_fraction=0.67),否则 TensorRT 引擎创建静默失败
多个模型轮换推理时内存持续增长
如果你在循环里反复 tf.keras.models.load_model() 或 tf.saved_model.load(),旧模型图不会自动释放——TensorFlow 2.x 的图对象仍驻留在内存中,导致越跑越慢,最终卡顿甚至 OOM。
- 解决办法:每次加载前手动清空默认图,用
tf.keras.backend.clear_session()(比 TF 1.x 的tf.reset_default_graph()更准确) - 更优做法:提前加载所有模型到不同
tf.distribute.Strategyscope 下,或用独立进程隔离生命周期 - 验证方式:用
len(tf.get_default_graph().get_operations())查图节点数,若持续上涨,说明没清理干净
@tf.function 编译一次、执行千次,才是 TF 2.x 的高效前提;而 TensorRT 和多模型管理,都是在此基础上叠加的工程约束。Python免费学习笔记(深入):立即使用
在学习笔记中,你将探索 Python 的核心概念和高级技巧!










