真实训练吞吐量需用同一模型(如ResNet-18)、同一GPU、同一数据跑10个epoch,测samples/sec和峰值显存;须跳过前2–3步计时以规避CUDA编译开销,PyTorch用torch.compile()、TensorFlow用@tf.function(jit_compile=True)均需预热5次;多卡扩展性取决于DDP与MirroredStrategy的通信效率,量化部署阶段TFLite INT8在移动端比TorchScript快1.7×。

直接测训练吞吐量,别信合成 benchmark
框架性能不能只看 torch.benchmark 或 tf.test.Benchmark 跑出来的数字。真实差异藏在你模型的结构、数据加载方式和硬件调度里。最有效的办法是:用同一套数据、同一模型结构(比如 ResNet-18)、同一 GPU 型号,分别跑 10 个 epoch,记录每秒处理的样本数(samples/sec)和显存峰值。
- PyTorch 默认使用
torch.utils.data.DataLoader的多进程加载,但num_workers > 0在 Windows 上可能卡死,Linux/macOS 才稳定 - TensorFlow 的
tf.data.Dataset默认启用自动调优(autotune),但实际效果依赖prefetch和cache配置是否合理 - 两者都需关闭梯度计算(
torch.no_grad()/@tf.function+training=False)才能公平比 inference 吞吐
注意 CUDA 内核编译开销对首次迭代的影响
PyTorch 的 torch.compile()(Inductor 后端)和 TensorFlow 的 @tf.function(jit_compile=True) 都会在第一次调用时触发 CUDA kernel 编译,耗时可能高达数秒——这会严重拉低首 epoch 平均速度。实测中必须跳过前 2–3 个 step 再开始计时,否则数据失真。
- PyTorch:启用
torch.compile(model, dynamic=True)后,前向/反向各编译一次,后续 iteration 才稳定 - TensorFlow:
@tf.function默认只编译前向,反向需额外包装tf.GradientTape,否则jit_compile=True不生效 - 两者都建议 warm up 至少 5 次完整 batch,再用
time.perf_counter()测第 6 次起的耗时
多卡训练时通信瓶颈比计算更关键
单卡性能接近不代表多卡扩展性好。真正拉开差距的是分布式通信效率:PyTorch 的 DDP(基于 NCCL)和 TensorFlow 的 MirroredStrategy 在 4 卡以上场景表现分化明显。
- PyTorch
DDP对小模型(如 LSTM)通信开销占比高,torch.nn.parallel.DistributedDataParallel必须配合find_unused_parameters=False(默认为True)避免冗余同步 - TensorFlow
MirroredStrategy在大 batch 场景下更容易出现梯度同步阻塞,需手动设置cross_device_ops=tf.distribute.NcclAllReduce() - 统一用
all_reduce时间占比衡量:若通信时间 > 计算时间 20%,说明模型或 batch size 不适配当前卡数
量化部署阶段的性能差异常被忽略
训练快不等于部署快。TensorFlow 的 TFLite 量化 pipeline 支持 INT8 推理且无需修改模型代码;PyTorch 的 torch.ao.quantization 需手动插入 QuantStub/DeQuantStub,稍有遗漏就会 fallback 到 FP32。
立即学习“Python免费学习笔记(深入)”;
- 移动端实测:相同 MobileNetV3,在 Android 上
TFLiteINT8 推理比TorchScriptINT8 快 1.7×,主因是 TFLite 的 operator fusion 更激进 - 服务器端:PyTorch 的
torch.compile(..., backend="inductor")对 CUDA 推理优化更强,但仅限 NVIDIA GPU;TensorFlow 的 XLA 可跨 AMD/NVIDIA/TPU - 关键陷阱:PyTorch 量化后模型仍依赖
libtorch运行时,而 TFLite 可静态链接,最终二进制体积小 40%
DDP 初始化或 MirroredStrategy 变量作用域里的模型,再高的理论吞吐也毫无意义。测性能之前,先确保它能跑起来——而且不出 NaN。



















