我想在 tensorflow 会话中并行运行多个 train_op。这里的答案说tensorflow sess.run() 可以释放python的GIL。我尝试了那个 anwser 中的示例,但似乎我们仍然有一个 GIL。我有 8 个 GPU 可用。当 num_threads 为 4 时,需要 24 秒。当 num_threads 为 8 时,需要 54 秒。
这是代码:
from threading import Thread
import tensorflow as tf
import time
num_threads = 8
a = []
for i in range(num_threads):
with tf.device('/cpu:0'):
a.append(tf.get_variable(name='a_%d'%i, shape=[5000, 50, 5, 5, 5, 5], initializer=tf.truncated_normal_initializer()))
b = []
for i in range(num_threads):
with tf.device('/cpu:0'):
b.append(tf.get_variable(name='b_%d'%i, shape=[5000, 50, 5, 5, 5, 5], initializer=tf.truncated_normal_initializer()))
train_ops = []
for i in range(num_threads):
with tf.device('gpu:%d'%i):
loss = tf.multiply(a[i], b[i], name='loss_%d'%i)
train_ops.append(tf.train.GradientDescentOptimizer(0.01).minimize(loss))
sess = tf.Session()
sess.run(tf.initialize_all_variables())
def train_function(train_op):
for i in range(20):
sess.run(train_op)
train_threads = []
for train_op in train_ops:
train_threads.append(Thread(target=train_function, args=(train_op,)))
start = time.time()
for t in train_threads:
t.start()
for t in train_threads:
t.join()
end = time.time()
print('elapsed time is:', end-start)
我的问题是是否是因为我没有正确实施该方法。如果这种方式不能释放 GIL,那么如何释放 GIL?
我知道通过 gRPC 的分布式张量流可以释放 GIL,但与多线程(如 C 中的 pthread)相比,gRPC 的成本很高。我希望每个线程相互通信,并且我希望尽可能减少通信开销。任何答案或提示将不胜感激!
如果没有办法释放 GIL,是否可以编写一个 c++ 扩展来做多线程。如果没有,是否可以使用除 python 之外没有 GIL 的其他语言。谢谢!