我已经实现了一个试图从句子中预测单词的网络。网络实际上非常复杂,但这是一个简单的版本:
这是代码:
# 40 samples with random size up to 500, vocabulary size is 10000 with 50 dimensions
def inference(inputs):
inputs = tf.constant(inputs)
word_embeddings = tf.nn.embedding_lookup(embeddings, inputs)
lengths = sequence_length(inputs)
cell = BasicLSTMCell(cell_size)
outputs, output_states = tf.nn.bidirectional_dynamic_rnn(cell, cell, word_embeddings, sequence_length=lengths, dtype=tf.float32)
lstm_out = tf.concat(outputs, 2)
words_representations = tf.reshape(lstm_out, [-1, cell_size * 2])
W = tf.Variable(tf.random_uniform([cell_size * 2, 1], -1, 1), name='W', dtype=tf.float32)
words_scores = tf.reshape(tf.matmul(words_representations, W), [-1, max_length])
return words_scores
使用Titan X,我的问题是GPU利用率低,约为40%。
一些注意事项:
我怀疑是问题,并且正如围绕论坛的类似问题的答案所指出的那样,重复CPU到GPU的内存传输。这是跟踪结果的样子:
绿条(pid 9和11)都是MEMCPYHtoD或MEMCPYDtoH。我该如何避免它们?
如果不增加批量,可以做些什么来提高速度性能呢?
可以找到样本可重现的代码here。使用Tensorflow 1.0,cudnn 5.1,cuda 8
感谢。