我目前正在尝试使用来自基于this tutorial的tensorflow 2.0中的keras训练带有负采样的Word2Vec跳过语法模型(没有辅助输出)。我的模型如下:
# vocab_size = about 1 million
# embedding_dim = 300
# Target word and context word as integers
input_target = keras.Input((1,))
input_context = keras.Input((1,))
# Retrieve word embeddings of target and context word
embeddings = keras.layers.Embedding(vocab_size + 1, embedding_dim, input_length=1, name="embeddings")
embedding_target = embeddings(input_target)
embedding_context = embeddings(input_context)
# Reshape embeddings
reshape = keras.layers.Reshape((embedding_dim, 1))
embedding_target = reshape(embedding_target)
embedding_context = reshape(embedding_context)
# Compute dot product of embedding vectors
dot = keras.layers.Dot(1)([embedding_target, embedding_context])
dot = keras.layers.Reshape((1,))(dot)
# Compute output
output = keras.layers.Dense(1, activation="sigmoid")(dot)
# Create mode
model = keras.Model(inputs=[input_target, input_context], outputs=output)
model.compile(loss="binary_crossentropy", optimizer="rmsprop")
我正在使用的数据集是tensorflow提供的english wikipedia data set。但是,我不会训练完整的数据集(5,824,596篇文章),而不会训练3,000,000篇文章。可以想象,唯一单词的数量(约100万个)和单词总数(约12亿个)仍然很大。然而original Word2Vec paper的作者抽象地指出,学习16亿个单词的语料库的高质量单词向量需要不到一天的时间。
我的实现平均每篇文章需要3秒钟的时间进行训练。在我看来,这确实太慢了,因为一次要训练所有300万篇文章将花费100多天的时间。
我有Nvidia GTX 1080 TI,nvidia-smi
显示,大多数情况下,GPU利用率通常为0%,而“峰值”较短,约为5%。
我首先想到的是预处理步骤太慢。所以我用numpy生成的伪数据测试了训练:
target = np.random.randint(0, vocab_size, 2048 * 1000, np.int32)
context = np.random.randint(0, vocab_size, 2048 * 1000, np.int32)
label = np.random.randint(0, 2, 2048 * 1000, np.int32)
model.fit([target, context], label, 4096)
我测试了不相同的batch_size值(32、1024、2048、4096),但是大多数时候GPU利用率仍然为0%。整个target
,context
和label
数组都可以放入内存。
当我将fit
方法更改为train_on_batch
(但不进行批处理-将整个数组放入函数中)时,GPU利用率至少在0%到40%之间变化。
除了安装了tensorflow-gpu
之外,张量流还可以识别GPU:2020-03-13 15:44:52.424589: I tensorflow/core/common_runtime/gpu/gpu_device.cc:1304] Created TensorFlow device (/job:localhost/replica:0/task:0/device:GPU:0 with 10349 MB memory) -> physical GPU (device: 0, name: GeForce GTX 1080 Ti, pci bus id: 0000:b1:00.0, compute capability: 6.1)
我缺少明显的东西吗?可能是因为我是keras / tensorflow和机器学习的新手。