如何计算/测量TensorFlow模型推理时间?如何获取更高精度结果
如何高精度对比两个TensorFlow模型的预测速度
evaluate方法给出的每步耗时精度确实有限——它包含了数据加载、预处理等额外环节的开销,统计粒度偏粗。要获得更高精度的测速,核心是聚焦纯推理计算环节,排除其他干扰因素,具体实现方式如下:
关键优化思路
- 预热模型:TensorFlow首次推理会执行图优化、算子编译等操作,耗时远高于稳定状态下的推理。必须先跑若干轮推理预热,让模型进入稳定运行阶段。
- 隔离推理步骤:将数据预处理与模型推理完全分离,确保测试数据已加载到内存中,只统计模型推理本身的耗时,避免IO、预处理环节的干扰。
- 使用高精度计时工具:用Python的
time.perf_counter()(纳秒级精度)或TensorFlow内置的tf.timestamp()记录时间戳,比普通time.time()的精度更高。 - 多次取平均:单次推理耗时波动大,重复推理数百甚至上千次,去掉首尾少量异常值后取平均,结果更稳定可靠。
具体代码实现
import tensorflow as tf import time # 加载两个待测试的模型 model_a = tf.keras.models.load_model('model_a.h5') model_b = tf.keras.models.load_model('model_b.h5') # 准备已预处理完成的测试数据(加载到内存) test_input = tf.random.normal([32, 224, 224, 3]) # 批量大小、输入尺寸根据你的模型调整 # 预热模型,消除首次推理的额外开销 for _ in range(10): _ = model_a(test_input) _ = model_b(test_input) # 测试Model A的耗时 num_runs = 1000 times_a = [] for _ in range(num_runs): start = time.perf_counter() _ = model_a(test_input) end = time.perf_counter() times_a.append(end - start) # 去掉首尾5%的异常值,计算平均耗时 times_a_sorted = sorted(times_a) trimmed_a = times_a_sorted[int(num_runs*0.05):int(num_runs*0.95)] avg_a = sum(trimmed_a) / len(trimmed_a) # 测试Model B的耗时 times_b = [] for _ in range(num_runs): start = time.perf_counter() _ = model_b(test_input) end = time.perf_counter() times_b.append(end - start) times_b_sorted = sorted(times_b) trimmed_b = times_b_sorted[int(num_runs*0.05):int(num_runs*0.95)] avg_b = sum(trimmed_b) / len(trimmed_b) print(f"Model A 平均推理耗时:{avg_a*1000:.4f} 毫秒") print(f"Model B 平均推理耗时:{avg_b*1000:.4f} 毫秒")
额外优化建议
如果是面向部署场景的测速,建议:
- 用
tf.function装饰推理函数,切换到静态图模式,进一步降低动态图的开销:
@tf.function def infer_a(x): return model_a(x) @tf.function def infer_b(x): return model_b(x)
后续用infer_a(test_input)和infer_b(test_input)执行推理测速即可。
- 考虑使用TensorRT、TF Lite等优化后的模型格式测试,结果更贴近实际部署的运行速度。
内容的提问来源于stack exchange,提问作者hedge
相关产品推荐
相关产品推荐

