设置
我有一个网络,其参数是大嵌入矩阵(3Million X 300大小),比如embed_mat。
在训练期间,对于每个小批量,我只更新embed_mat(最多15000个向量)中的小子集,这些向量是使用 embedding_lookup op 选择的。我正在使用 Adam优化器来训练我的模型。
由于我不能将这个embed_mat存储在GPU中,由于它的大小,我在CPU(比如/ cpu:0)设备下定义它,但是模型的其余参数,优化器等是在GPU(比方说,gpu:/ 0)设备。
问题
我发现我的GPU使用率非常低(200 MB),这表明我的所有训练都在CPU上进行。我所期待的是将embedding_lookup的结果复制到GPU并且我的所有训练都在那里进行。我做错了什么。
训练时间在很大程度上受嵌入矩阵的大小(num_vectors)影响,这对我来说似乎不正确。在任何小批量中,我只更新我的网络参数和我查找的向量(~15000),因此训练时间应该(如果有的话)与嵌入矩阵的大小呈线性增长。
< / LI>有没有办法自动无缝地将我的embed_mat拆分为多个GPU以加快培训速度?
我怀疑是Adam Optimizer。看起来因为embed_mat在CPU上,所有的训练都在CPU上进行。这是对的吗?
答案 0 :(得分:1)
尝试在您放置每个操作的张量板上进行可视化。在“图形”选项卡中,您可以通过“设备”进行着色。理想情况下,嵌入变量,嵌入查找和嵌入渐变更新应该在CPU中,而大多数其他内容应该在GPU中。