1. 程式人生 > >訓練過程--GPU訓練

訓練過程--GPU訓練

實際訓練中,GPU的訓練速度問題

  為什麼Y2B的8M,8張普通TT為啥要跑幾個月?
  因為GPU其實有60%的時間都是在等待資料填充完成,簡直蠢。

解決方案

  1)換個固態硬碟試試?
  沒用。問題出在系統總線上,一幀的資料量入視訊記憶體後有1.58G

  2)cpu的io能力跟不上gpu,這問題常見.你是怎麼解決的?
  用GPUDirect RDMA,讓光纖網絡卡直通顯示卡視訊記憶體。不經過CPU,直接資料交換,但是這時候,TT系列卡的劣勢凸顯得很厲害。
  TT卡的DMA是單工的,同時要麼只能發,要麼只能收。只有TESLA和quadro是雙工的,可以同時收發。所以多路TT直接跑,跑幾個月,一點都不冤枉,估計換DGX,也就是三四天的時間就完事。畢竟,DGX有NVLINK,卡間通訊能到300G。


分散式訓練

  當前最優的分散式訓練方式是通過引數伺服器(Parameter Server)執行的同步隨機梯度下降演算法(SGD)。
  這是一種簡單的分散式演算法,其中存在一組節點,每個節點都擁有經過訓練的神經網路的一個版本。這些節點通過一個伺服器共享梯度和權重等資訊。當試圖擴充套件節點數量時,問題出現了。考慮到如今的問題涉及的巨大維度,當擴充套件節點數量(到什麼級別)時,節點將不得不交流大量的資訊。


多GPU訓練

  目前的GPU特別適合跨GPU並行化,因為它們能夠直接從另一個GPU的記憶體中讀出和寫入,不需要通過主機記憶體。

  一般有兩種方法,一種是常用的資料並行,另一種是模型並行。
  1)模型並行指的是將一個完整的網路切分成不同塊放在不同gpu上執行,每個gpu可能只處理某一張圖的四分之一。
  採用模型並行很大程度上是因為視訊記憶體不夠放不下整個網路的資料,而現在gpu的功能效能提高,一個gpu已經能夠很好的解決視訊記憶體不夠的問題,再加上模型並行會有額外的通訊開銷,因此開源框架採用了資料並行,用來提高並行度。
  我們採用的並行方案基本上是在每個GPU中放置一半核(或神經元),

  一個額外的技巧:GPU間的通訊只在某些層進行。
  這就是說,例如,第3層的核需要從第2層中所有核對映輸入。然而,第4層的核只需要從第3層中位於同一GPU的那些核對映輸入。選擇連線模式是一個交叉驗證的問題,但是這讓我們可以精確地調整通訊量,直到它的計算量在可接受的部分。