Wide Deep的OneFlow网络训练
Wide & Deep的OneFlow網絡訓練
HugeCTR是英偉達提供的一種高效的GPU框架,專為點擊率(CTR)估計訓練而設計。
OneFlow對標HugeCTR搭建了Wide & Deep 學習網絡(WDL)。OneFlow-WDL網絡實現了模型并行與稀疏更新,在8卡12G TitanV的服務器上實現支持超過4億的詞表大小,而且性能沒有損失與小詞表性能相當。
本文介紹如何使用OneFlow-WDL網絡進行訓練,以及一些訓練結果及分析。
環境和準備
運行OneFlow-WDL需要有安裝好OneFlow的python環境,并安裝了scikit-learn。
軟件要求
? python 3.x(推薦)
? OneFlow 0.x
? scikit-learn
數據準備
準備了一個小的樣本數據集,可以下載進行簡單測試。
或者參考《使用Spark創建WDL數據集》中的步驟,從CriteoLabs官網下載原始數據集并制作成OneFlow所需要的OFRecord格式的數據集。
OneFlow-WDL腳本
OneFlow-WDL腳本只有一個文件wdl_train_eval.py,請從這里下載。
運行OneFlow-WDL腳本
EMBD_SIZE=1603616
DATA_ROOT=/path/to/wdl/ofrecord
python3 wdl_train_eval.py
–train_data_dir $DATA_ROOT/train
–train_data_part_num 256
–train_part_name_suffix_length=5
–eval_data_dir KaTeX parse error: Undefined control sequence: \ at position 15: DATA_ROOT/val \? ? --eval_data_p…EMBD_SIZE
–deep_vocab_size=$EMBD_SIZE
–gpu_num 1
通常配置好數據集的位置DATA_ROOT后,上面的shell腳本就可以被執行了,如果屏幕上能夠輸出下面類似的結果,就表示已經正確運行。
1000 time 2020-07-08 00:28:08.066281 loss 0.503295350909233
1000 eval_loss 0.4846755236387253 eval_auc 0.7616240146992771
2000 time 2020-07-08 00:28:11.613961 loss 0.48661992555856703
2000 eval_loss 0.4816856697201729 eval_auc 0.765256583562705
3000 time 2020-07-08 00:28:15.149135 loss 0.48245503094792364
3000 eval_loss 0.47835959643125536 eval_auc 0.7715609382514008
4000 time 2020-07-08 00:28:18.686327 loss 0.47975033831596375
4000 eval_loss 0.47925308644771575 eval_auc 0.7781267916810946
測試結果及說明
在一臺有8塊12G顯存的TitanV的服務器上對OneFlow-WDL進行了一組測試,并使用HugeCTR提供的docker容器做了同樣參數的測試。
多GPU性能測試
主要測試目的是在batch size = 16384的情況下,測量不同GPU數量處理每個批次的平均時延(latency)。 測試配置了7個1024神經單元的隱藏層。
結果如下圖:
同時記錄了,測試時實際最大占用顯存的大小,結果如下圖:
綜合上面結果表明,1卡到8卡,OneFlow-WDL在占用較少的顯存的情況下,速度要比HugeCTR快。
batch size=16384每卡,多卡性能測試
主要測試目的是在保證每GPU卡處理16384batch size情況下,使用1至8GPU卡進行訓練每個批次的平均時延(latency)。 測試配置了7個1024神經單元的隱藏層。
結果如下圖:
同時記錄了,測試時實際最大占用顯存的大小,結果如下圖:
綜合上面結果表明,隨著卡數的增加,時延增加,OneFlow-WDL在占用較少的顯存的情況下,速度要比HugeCTR快;因為每卡保證16384 batch size,OneFlow每卡占用的內存并無顯著變化。
單GPU卡不同batch size性能測試
主要測試目的是在一個GPU卡情況下,測量不同batch size每個批次的平均時延(latency)。 測試配置了2個1024神經單元的隱藏層。
結果如下圖:
超大詞表測試
OneFlow-WDL中配置了兩個Embedding Table: - wide_embedding 大小是vocab_size x 1 - deep_embedding 大小是vocab_size x 16
HugeCTR中詞表大小(vocab_size)是1603616。從3200000開始測起,一直到支持4億的詞表大小,結果如下圖:
上面的圖中,藍色柱子是批次訓練的平均時延(latency),紅色曲線代表GPU顯存的占用。
結論:隨著詞表大小的增大,內存隨之增大,但latency沒有明顯的變化。
收斂性測試1
選取了batch size=512進行了收斂性能的測試。
下面這張圖是,前500步的結果,每一步訓練都在驗證集中選取20條記錄進行驗證,圖中的曲線分別是loss和AUC:
結論:AUC迅速就增長到超過了0.75。
收斂性測試2
和收斂性測試1同樣的情況,這一次是每訓練1000步打印訓練loss的平均值,然后選取20條驗證集數據進行驗證,一共訓練30萬步,結果如下:
結論與分析: 1. 藍色的train loss曲線有明顯向下的臺階,因為整個訓練集有36674623條數據,batch_size=512的情況下,大概71630步就過了整個數據集(一個epoch),30萬步就把訓練數據集用了4次多,藍色曲線的臺階印證了這些。OneFlow在訓練過程中支持數據的打亂,每當數據集被完整的用完一遍之后,數據會被重新打亂,減少過擬合。 2. 橙色的曲線是驗證集loss,在前兩個epoch的時候基本保持下降的趨勢,從第三個epoch開始,loss開始有上升的趨勢,表明已經過擬合了。 3. 灰色是驗證集的AUC,AUC也是在第二個epoch的時候達到了峰值,超過了0.8,后面幾個epoch就開始下降。
總結
以上是生活随笔為你收集整理的Wide Deep的OneFlow网络训练的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: BERT模型的OneFlow实现
- 下一篇: deeplearning模型量化实战