TensorFlow多GPU能否同时运行?附分布式机制测试代码
TensorFlow多GPU能否同时运行?
当然可以!TensorFlow完全支持多GPU并行计算,不管是数据并行(每个GPU处理不同的数据批次)还是模型并行(不同GPU负责模型的不同部分),都能实现多个GPU同时工作。不过你的当前代码并没有真正触发多GPU的并行执行,我来帮你梳理问题和改进方案:
你的代码存在的核心问题
你的代码只是在不同GPU设备下定义了计算节点,但没有完成关键的两步:
- 没有将对应的数据分配到各个GPU的计算节点中
- 没有实际触发这些GPU节点的并行计算(代码里
sess.run(init)之后就没有后续执行逻辑了) - 另外注意:
tf.initialize_all_variables()已经是废弃的API,建议替换为tf.global_variables_initializer()
正确实现多GPU并行的示例代码
下面是基于你的代码修改的可运行版本,实现5个GPU(如果GPU数量不足,会自动 fallback 到CPU)同时执行计算:
import tensorflow as tf import numpy as np def cv_data(SEED): np.random.seed(SEED) return np.random.rand(5,2,2) # 生成5组测试数据,对应5个计算单元 data = cv_data(42) # 封装单个GPU的计算逻辑 def run_on_gpu(gpu_id, input_tensor): with tf.device(f'/gpu:{gpu_id}'): with tf.name_scope(f'cv{gpu_id}'): # 直接用常量传入数据,也可以用占位符喂数据 x = tf.constant(input_tensor, dtype=tf.float32) # 定义你的计算操作(这里是矩阵乘法) y = tf.matmul(x, x) return y # 为每个GPU创建计算任务 gpu_tasks = [] for gpu_idx in range(5): task = run_on_gpu(gpu_idx, data[gpu_idx]) gpu_tasks.append(task) # 配置会话,允许自动设备 fallback,同时打印设备分配日志 session_config = tf.ConfigProto( allow_soft_placement=True, log_device_placement=True ) with tf.Session(config=session_config) as sess: writer = tf.summary.FileWriter("test_graph", sess.graph) # 一次性运行所有GPU的计算任务,触发并行执行 all_results = sess.run(gpu_tasks) # 输出每个GPU的计算结果 for idx, result in enumerate(all_results): print(f"=== GPU {idx} 计算结果 ===") print(result)
关键说明
- 当你调用
sess.run(gpu_tasks)时,TensorFlow会同时调度所有GPU上的计算任务,实现真正的并行运行 log_device_placement=True会在控制台打印每个操作分配的设备,你可以通过这个日志验证计算是否真的跑在GPU上- 如果你的机器GPU数量少于5个,
allow_soft_placement=True会自动把超出的计算任务放到CPU上执行,避免报错 - 对于大规模训练场景,更常用的是数据并行:每个GPU加载相同的模型,处理不同的数据批次,最后合并梯度更新模型,TensorFlow 1.x可以用
tf.train.replica_device_setter或者自定义梯度合并逻辑,TensorFlow 2.x则有更简洁的tf.distribute.MirroredStrategy可以直接使用
内容的提问来源于stack exchange,提问作者Yushin Liu




