2016-11-15 361 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) –