Python 在GPU上运行的TensorFlow Word2Vec模型

Python 在GPU上运行的TensorFlow Word2Vec模型,python,tensorflow,word2vec,tensorflow-gpu,word-embedding,Python,Tensorflow,Word2vec,Tensorflow Gpu,Word Embedding,在一次培训中,对skip gram Word2Vec模型进行了描述。它包含以下代码片段,明确要求CPU设备进行计算,即tf.device('/CPU:0'): 尝试切换到GPU时,引发以下异常: InvalidArgumentError(回溯请参见上文):无法为操作“Variable_2/Adagrad”分配设备:无法满足显式设备规范“/device:GPU:0”,因为没有支持的GPU设备内核可用 我想知道为什么提供的图形不能在GPU上计算?是否由于tf.int32类型而发生?或者我应该切换到另

在一次培训中,对skip gram Word2Vec模型进行了描述。它包含以下代码片段,明确要求CPU设备进行计算,即
tf.device('/CPU:0')

尝试切换到GPU时,引发以下异常:

InvalidArgumentError(回溯请参见上文):无法为操作“Variable_2/Adagrad”分配设备:无法满足显式设备规范“/device:GPU:0”,因为没有支持的GPU设备内核可用

我想知道为什么提供的图形不能在GPU上计算?是否由于
tf.int32
类型而发生?或者我应该切换到另一个优化器?换句话说,是否有任何方法可以在GPU上处理Word2Vec模型?(不带类型转换)


更新

根据Akshay Agrawal的建议,以下是原始代码的更新片段,以实现所需的结果:

with graph.as_default(), tf.device('/gpu:0'):
    # Input data.
    train_dataset = tf.placeholder(tf.int32, shape=[batch_size])
    train_labels = tf.placeholder(tf.int32, shape=[batch_size, 1])
    valid_dataset = tf.constant(valid_examples, dtype=tf.int32)

    embeddings = tf.Variable(
        tf.random_uniform([vocabulary_size, embedding_size], -1.0, 1.0))
    softmax_weights = tf.Variable(
        tf.truncated_normal([vocabulary_size, embedding_size],
                            stddev=1.0 / math.sqrt(embedding_size)))
    softmax_biases = tf.Variable(tf.zeros([vocabulary_size]))    
    embed = tf.nn.embedding_lookup(embeddings, train_dataset)

    with tf.device('/cpu:0'):
        loss = tf.reduce_mean(
            tf.nn.sampled_softmax_loss(weights=softmax_weights,
                                       biases=softmax_biases,
                                       inputs=embed,
                                       labels=train_labels,
                                       num_sampled=num_sampled,
                                       num_classes=vocabulary_size))

    optimizer = tf.train.AdamOptimizer(0.001).minimize(loss)

    norm = tf.sqrt(tf.reduce_sum(tf.square(embeddings), 1, keep_dims=True))
    normalized_embeddings = embeddings / norm
    valid_embeddings = tf.nn.embedding_lookup(normalized_embeddings, valid_dataset)
    similarity = tf.matmul(valid_embeddings, tf.transpose(normalized_embeddings))

引发此错误的原因是,
AdagradOptimizer
没有用于稀疏应用操作的GPU内核;触发稀疏应用是因为通过嵌入查找进行区分会导致稀疏梯度


GradientDescentOptimizer
AdamOptimizer
都支持稀疏应用操作。如果您切换到这些优化器之一,您将不幸地看到另一个错误:tf.nn.sampled_softmax_loss似乎创建了一个没有GPU内核的op。为了解决这个问题,您可以使用tf.device('/cpu:0')将
loss=tf.reduce_-mean(…
行包装成
):
上下文,但这样做会引入cpu gpu通信开销。

引发错误的原因是
AdagradOptimizer
的稀疏应用操作没有gpu内核;触发稀疏应用是因为通过嵌入查找进行区分会导致稀疏梯度


GradientDescentOptimizer
AdamOptimizer
确实支持稀疏应用操作。如果您切换到这些优化器中的一个,您将不幸看到另一个错误:tf.nn.sampled_softmax_loss似乎创建了一个没有GPU内核的op。要解决这个问题,您可以将
loss=tf.reduce_\me包装起来带tf.device(“/cpu:0”)的(…
行:context,尽管这样做会引入cpu gpu通信开销。

Ok,明白了。所以,基本上,切换到支持稀疏操作和cpu计算损耗的优化器,对吗?Ok,明白了。所以,基本上,切换到支持稀疏操作和cpu计算损耗的优化器,对吗?
with graph.as_default(), tf.device('/gpu:0'):
    # Input data.
    train_dataset = tf.placeholder(tf.int32, shape=[batch_size])
    train_labels = tf.placeholder(tf.int32, shape=[batch_size, 1])
    valid_dataset = tf.constant(valid_examples, dtype=tf.int32)

    embeddings = tf.Variable(
        tf.random_uniform([vocabulary_size, embedding_size], -1.0, 1.0))
    softmax_weights = tf.Variable(
        tf.truncated_normal([vocabulary_size, embedding_size],
                            stddev=1.0 / math.sqrt(embedding_size)))
    softmax_biases = tf.Variable(tf.zeros([vocabulary_size]))    
    embed = tf.nn.embedding_lookup(embeddings, train_dataset)

    with tf.device('/cpu:0'):
        loss = tf.reduce_mean(
            tf.nn.sampled_softmax_loss(weights=softmax_weights,
                                       biases=softmax_biases,
                                       inputs=embed,
                                       labels=train_labels,
                                       num_sampled=num_sampled,
                                       num_classes=vocabulary_size))

    optimizer = tf.train.AdamOptimizer(0.001).minimize(loss)

    norm = tf.sqrt(tf.reduce_sum(tf.square(embeddings), 1, keep_dims=True))
    normalized_embeddings = embeddings / norm
    valid_embeddings = tf.nn.embedding_lookup(normalized_embeddings, valid_dataset)
    similarity = tf.matmul(valid_embeddings, tf.transpose(normalized_embeddings))