TensorFlow V1能否并行运行两个优化器?下述代码写法是否正确?
TensorFlow V1 并行运行两个优化器的问题解答
能否并行运行两个优化任务?
TensorFlow V1支持并行执行多个优化任务。TensorFlow的会话(tf.Session)会自动调度计算图中可并行的操作,在CPU/GPU设备上同时运行,只需将多个优化操作合并到同一次会话调用中即可实现并行。
你提供的代码写法是否正确?
你给出的代码并非并行运行,而是串行执行逻辑:先调用sess.run(optimizer_i1)完成第一个优化器的参数更新,再调用sess.run(optimizer_i2)执行第二个优化器的更新,两次调用是先后顺序执行的,没有利用TensorFlow的并行能力。
正确的并行写法
将两个优化器操作放入同一个sess.run()的参数列表中,TensorFlow会自动处理可并行的操作调度:
import tensorflow.compat.v1 as tf tf.disable_v2_behavior() import sys # ... 省略变量定义、模型构建等代码 ... loss_i1 = - tf.reduce_mean(s1+s2+s3) optimizer_i1 = tf.train.AdamOptimizer(learning_rate).minimize(loss_i1) loss_i2 = - tf.reduce_mean(s1*s2*s3) optimizer_i2 = tf.train.AdamOptimizer(learning_rate).minimize(loss_i2) with tf.Session() as sess: sess.run(tf.global_variables_initializer()) for epoch in range(epochs): for batch_index in range(n_batches): sys.stdout.flush() _y, _s1, _s2, _s3 = fetch_batch(epoch, batch_index, batch_size, y_, s1_, s2_, s3_) # 合并两个优化器操作,一次会话调用实现并行 sess.run([optimizer_i1, optimizer_i2], feed_dict={y: _y, s1: _s1, s2: _s2, s3: _s3}) # 合并损失计算,减少会话调用次数 loss_train_i1, loss_train_i2 = sess.run([loss_i1, loss_i2], feed_dict={y: _y, s1: _s1, s2: _s2, s3: _s3})
额外说明
- 如果两个优化器更新的是完全独立的变量集合,并行执行的效率提升会非常明显;
- 如果存在变量重叠更新的情况,TensorFlow会自动处理变量依赖关系,保证参数更新的正确性,但此时并行程度会因依赖限制有所降低。
内容的提问来源于stack exchange,提问作者Dione Goh
相关产品推荐
相关产品推荐

