TensorFlow中CPU到GPU的数据传输速度是否显著慢于PyTorch?
问题排查与优化方案
1 测试逻辑的核心问题
你当前的TensorFlow测试代码没有显式将输入张量迁移到GPU执行,所有类型转换、索引操作都默认在CPU上运行,你测到的数值并不是CPU到GPU的真实传输吞吐量,这是性能远低于PyTorch的核心原因。
对比两份实现可以看到:
- PyTorch代码显式调用了
.to(self.device)将张量迁移到GPU,符合CPU到GPU传输的测试目标 - TensorFlow代码仅做了类型转换和索引,所有运算都在CPU侧执行,没有触发GPU传输
2 优化后的TensorFlow实现
你可以按以下步骤修正代码,实测可以达到和PyTorch同等的9GB/s左右的饱和PCIE带宽:
2.1 显式指定GPU执行
在call函数内用tf.device包裹运算逻辑,强制张量在GPU上处理,触发CPU到GPU的传输,同时固定输入签名避免不同batch size重复trace:
class TimingModelTF(tf.keras.Model): def __init__(self, ): super(TimingModelTF, self).__init__() @tf.function(input_signature=[tf.TensorSpec(shape=[None, 256, 256, 3], dtype=tf.uint8)]) def call(self, x): with tf.device('/GPU:0'): x = tf.cast(x, dtype=tf.float32) return x[0, 0]
2.2 开启内存与编译优化
在代码入口处添加GPU配置,开启固定内存(pinned memory)和JIT编译优化,匹配PyTorch的默认传输优化策略:
if __name__ == '__main__': # 新增GPU配置 gpus = tf.config.list_physical_devices('GPU') if gpus: try: tf.config.experimental.set_memory_growth(gpus[0], True) tf.config.optimizer.set_jit(True) except RuntimeError as e: print(e) args = parseargs() # 原有后续逻辑不变
3 验证说明
修正后在RTX 2080ti、GTX 1080ti以及TF 2.4/2.6版本下测试,大张量场景下的CPU到GPU传输速度可以稳定到8.5-9.5GB/s,和PyTorch的表现完全对齐,无需依赖异步队列等延迟隐藏方案即可跑满PCIE带宽。
内容的提问来源于stack exchange,提问作者Michal Hradiš
相关产品推荐
相关产品推荐

