我发现官方模型样本中有一段代码让我很困惑。
with tf.device("/cpu:0"):
embedding = tf.get_variable(
"embedding", [vocab_size, size], dtype=data_type())
inputs = tf.nn.embedding_lookup(embedding, input_.input_data)
为什么在这里使用tf.device("/cpu:0")
?除了GPU内存泄漏的情况之外,是否还有其他需要明确指定CPU操作的情况?
答案 0 :(得分:3)
将嵌入矩阵放在CPU上的原因是GPU上的tf.nn.embedding_lookup
isn't supported:
因此,假设基本的word2vec示例绑定到CPU(#514),我们可以 看到
tf.nn.embedding_lookup
无法在GPU上运行。因此,ops 在内部使用embedding_lookup
也不支持GPU(for 例如,nce_loss
)。
这意味着embedding
变量的GPU放置只会导致不必要的数据从主内存传输到GPU内存,反之亦然。因此,将变量显式放在CPU上会更有效。