2016-11-15 298 views
1

设置GPU + CPU Tensorflow训练


我有一个网络中,一个其参数为大嵌入矩阵(300万×300大小),说embed_mat。

在训练期间,对于每个小批量,我只从embed_mat更新矢量的小子集(最大15000个载体),其使用的是embedding_lookup运算选择。我正在使用Adam优化器来训练我的模型。

因为我不能在GPU中存储这个embed_mat,由于它的大小,我将它定义在CPU(比如/ cpu:0)设备下,但是模型的其余参数,优化器等都在一个GPU(比如gpu:/ 0)设备。

问题


  1. 我看到我的GPU使用量是很小的(200 MB),这表明我所有的训练是在CPU上发生的事情。我期望的是,embedding_lookup的结果被复制到GPU,并且我所有的训练都发生在那里。难道我做错了什么。

  2. 训练时间在很大程度上受嵌入矩阵的大小(num_vectors)的影响,这对我来说似乎不正确。在任何小批量中,我只更新我的网络参数和我查找的矢量(〜15000),因此训练时间应该随着嵌入矩阵的大小而线性增长。

  3. 有没有办法自动无缝地将我的embed_mat分割为多个GPU来加速训练?

  4. 我怀疑是Adam Optimizer。看起来像是因为embed_mat位于CPU上,所有培训都发生在CPU上。它是否正确?

回答

0

尝试在张量板上显示每个操作员的位置。在“图形”选项卡中,您可以通过“设备”进行着色。理想情况下,嵌入变量,嵌入查找和嵌入渐变更新应该位于CPU中,而其他大部分应该位于GPU中。

+0

我已经检查过了。这是你的建议。尽管GPU使用率非常低,但我可以认为训练是在GPU上运行的。 关于问题2和问题3的任何想法。 –

+0

[时间轴](https://github.com/tensorflow/tensorflow/blob/master/tensorflow/python/client/timeline.py)通常是最好的找出GPU未被利用的原因,因为它显示了哪些设备在哪个设备上运行,哪些设备在哪里阻塞。它看起来好像你提到的时间尺度是有趣的。 –

+0

有关分区,请参阅[partitioned_variables.py]中的代码(https://github.com/tensorflow/tensorflow/blob/master/tensorflow/python/ops/partitioned_variables.py) –