前言
在大型數(shù)據(jù)集上進行訓練的現(xiàn)代神經(jīng)網(wǎng)絡架構,可以跨廣泛的多種領域獲取可觀的結果,涵蓋從圖像識別、自然語言處理,到欺詐檢測和推薦系統(tǒng)等各個方面。但訓練這些神經(jīng)網(wǎng)絡模型需要大量浮點計算能力。雖然,近年來 GPU 硬件算力和訓練方法上均取得了重大進步,但在單一機器上,網(wǎng)絡訓練所需要的時間仍然長得不切實際,因此需要借助分布式GPU環(huán)境來提升神經(jīng)網(wǎng)絡訓練系統(tǒng)的浮點計算能力。
TensorFlow分布式訓練

TensorFlow 采用了數(shù)據(jù)流范式, 使用節(jié)點和邊的有向圖來表示計算。TensorFlow 需要用戶靜態(tài)聲明這種符號計算圖,并對該圖使用復寫和分區(qū)(rewrite & partitioning)將其分配到機器上進行分布式執(zhí)行。

TensorFlow 中的分布式機器學習訓練使用了如圖所示的參數(shù)服務器方法 。
Cluster、Job、Task
關于TensorFlow的分布式訓練,主要概念包括Cluster、Job、Task,其關聯(lián)關系如下:
TensorFlow分布式Cluster由多個Task組成,每個Task對應一個tf.train.Server實例,作為Cluster的一個單獨節(jié)點;
多個相同作用的Task可以被劃分為一個Job,在分布式深度學習框架中,我們一般把Job劃分為Parameter Server和Worker,Parameter Job是管理參數(shù)的存儲和更新工作,而Worker Job運行OPs,作為計算節(jié)點只執(zhí)行計算密集型的Graph計算;
Cluster中的Task會相對進行通信,以便進行狀態(tài)同步、參數(shù)更新等操作,如果參數(shù)的數(shù)量過大,一臺機器處理不了,這就要需要多個Task。
TensorFlow分布式計算模式
In-graph 模式
In-graph模式,將模型計算圖的不同部分放在不同的機器上執(zhí)行。把計算從單機多GPU擴展到了多機多GPU, 不過數(shù)據(jù)分發(fā)還是在一個節(jié)點。這樣配置簡單, 多機多GPU的計算節(jié)點只需進行join操作, 對外提供一個網(wǎng)絡接口來接受任務。訓練數(shù)據(jù)的分發(fā)依然在一個節(jié)點上, 把訓練數(shù)據(jù)分發(fā)到不同的機器上, 將會影響并發(fā)訓練速度。在大數(shù)據(jù)訓練的情況下, 不推薦使用這種模式。
Between-graph 模式
Between-graph模式下,數(shù)據(jù)并行,每臺機器使用完全相同的計算圖。訓練的參數(shù)保存在參數(shù)服務器,數(shù)據(jù)不用分發(fā),而是分布在各個計算節(jié)點自行計算, 把要更新的參數(shù)通知參數(shù)服務器進行更新。這種模式不需要再練數(shù)據(jù)的分發(fā), 數(shù)據(jù)量在TB級時可以節(jié)省大量時間,目前主流的分布式訓練模式以 Between-graph為主。
參數(shù)更新方式
同步更新
各個用于并行計算的節(jié)點,計算完各自的batch 后,求取梯度值,把梯度值統(tǒng)一送到PS參數(shù)服務機器中,并等待PS更新模型參數(shù)。PS參數(shù)服務器在收集到一定數(shù)量計算節(jié)點的梯度后,求取梯度平均值,更新PS參數(shù)服務器上的參數(shù),同時將參數(shù)推送到各個worker節(jié)點。
異步更新
PS參數(shù)服務器只要收到一臺機器的梯度值,就直接進行參數(shù)更新,無需等待其它機器。這種迭代方法比較不穩(wěn)定,因為當A機器計算完更新了PS參數(shù)服務器中的參數(shù),可能B機器還是在用上一次迭代的舊版參數(shù)值。
分布式訓練步驟
命令行參數(shù)解析,獲取集群的信息ps_hosts和worker_hosts,以及當前節(jié)點的角色信息job_name和task_index
創(chuàng)建當前Task結點的Server
cluster = tf.train.ClusterSpec({"ps": ps_hosts, "worker": worker_hosts})server = tf.train.Server(cluster, job_name=FLAGS.job_name, task_index=FLAGS.task_index)
如果當前節(jié)點是Parameter Server,則調(diào)用server.join()無休止等待;如果是Worker,則執(zhí)行下一步
if FLAGS.job_name == "ps": server.join()
構建要訓練的模型
# build tensorflow graph model
創(chuàng)建tf.train.Supervisor來管理模型的訓練過程
# Create a "supervisor", which oversees the training process.sv = tf.train.Supervisor(is_chief=(FLAGS.task_index == 0), logdir="/tmp/train_logs")# The supervisor takes care of session initialization and restoring from a checkpoint.sess = sv.prepare_or_wait_for_session(server.target)# Loop until the supervisor shuts downwhile not sv.should_stop() # train model
UAITrain分布式訓練部署
UCloud AI 訓練服務(UCloud AI Train)是面向AI訓練任務的大規(guī)模分布式計算平臺,基于高性能GPU計算節(jié)點提供一站式托管AI訓練任務服務。用戶在提交AI訓練任務后,無需擔心計算節(jié)點調(diào)度、訓練環(huán)境準備、數(shù)據(jù)上傳下載以及容災等問題。
目前,UAI--Train平臺支持TensorFlow 和 MXNet 框架的分布式訓練。需要將PS代碼和Worker代碼實現(xiàn)在同一個代碼入口中,執(zhí)行過程中,PS 和 Worker 將使用相同的Docker容器鏡像和相同的python代碼入口進行執(zhí)行,系統(tǒng)將自動生成PS和Worker的env環(huán)境參數(shù)。TensorFlow 分布式訓練采用PS-Worker的分布式格式,并提供python的接口運行分布式訓練。

UAI--Train分布式訓練采用Parameter Server和Worker Server混合部署的方法,所有計算節(jié)點均由GPU物理云主機組成。PS 僅使用CPU進行計算,Worker Server則同時使用GPU和CPU進行計算,PS 和 Worker的比例為1:1。

數(shù)據(jù)存儲
分布式訓練所使用的輸入數(shù)據(jù)可以來自不同的數(shù)據(jù)源,目前UAI--Train僅支持UFS作為數(shù)據(jù)的存儲。
Input 數(shù)據(jù)存儲
指定一個UFS網(wǎng)盤作為Input數(shù)據(jù)源,UAI--Train平臺在訓練執(zhí)行過程中會將對應的UFS數(shù)據(jù)映射到訓練執(zhí)行的Worker容器的 /data/data 目錄下,系統(tǒng)會自動將數(shù)據(jù)映射到執(zhí)行的容器中,如 ip:/xxx/data/imagenet/tf → /data/data/。
Output 數(shù)據(jù)存儲
指定一個UFS網(wǎng)盤作為output數(shù)據(jù)源,UAI--Train平臺在訓練執(zhí)行過程中會將對應的UFS數(shù)據(jù)映射到訓練執(zhí)行的每一個PS容器和Worker容器的 /data/output 目錄下,并以共享的方式訪問同一份數(shù)據(jù)。同時,在訓練過程可以通過其云主機實時訪問訓練保存的模型checkpoint。
案例:通過CIFAR-10進行圖像識別
CIFAR-10是機器學習中常見的圖像識別數(shù)據(jù)集,該數(shù)據(jù)集共有60000張彩色圖像。這些圖像,分為10個類,每類6000張圖,有50000張用于訓練,另外10000用于測試。
http://groups.csail.mit.edu/vision/TinyImages/
調(diào)整訓練代碼
為了在UAI平臺上進行訓練,首先下載源代碼,并對cifar10_main.py做如下修改:
添加相關參數(shù):--data_dir, --output_dir, --work_dir, --log_dir, --num_gpus,UAITrain平臺將會自動生成這些參數(shù);
在代碼中增加UAI參數(shù):使用data_dir配置輸入文件夾、使用output_dir配置輸出文件夾。
具體案例代碼可以在https://github.com/ucloud/uai-sdk/tree/master/examples/tensorflow/train/cifar獲取
在UAI--Train平臺執(zhí)行訓練
據(jù)https://github.com/tensorflow/models/tree/master/tutorials/image/cifar10_estimator 的說明生成CIFAR-10的tfrecords;
使用UAI-SDK提供的tf_tools.py 生成CIFAR-10樣例的Docker鏡像;
確保Docker鏡像已經(jīng)上傳至UHub,在UAI--Train平臺上執(zhí)行。
/data/cifar10_main.py --train-batch-size=16
在UAI平臺上的分布式訓練
CIFAR-10樣例代碼使用tf.estimator.Estimator API,只需一個分布式環(huán)境和分布式環(huán)境配置便可直接進行分布式訓練,該配置需要適用于tf.estimator.Estimator API的標準,即定義一個TF_CONFIG 配置。
TF_CONFIG = {
"cluster":{
"master":["ip0:2222"],
"ps":["ip0:2223","ip1:2223"],
"worker":["ip1:2222"]},
"task":{"type":"worker","index":0},
"environment":"cloud"
}
UAITrain平臺的分布式訓練功能可以自動生成TensorFlow分布式訓練的GPU集群環(huán)境,同時為每個訓練節(jié)點自動生成TF_CONFIG。因此,在UAITrain平臺上執(zhí)行CIFAR-10的分布式訓練和單機訓練一樣,僅需要指定input/output的UFS地址并執(zhí)行如下指令即可:
/data/cifar10_main.py --train-batch-size=16
總結
UAI--Train TensorFlow的分布式訓練環(huán)境實現(xiàn)基于TensorFlow 的分布式訓練系統(tǒng)實現(xiàn),采用默認的grpc協(xié)議進行數(shù)據(jù)交換。PS和Worker采用混合部署的方式部署,PS使用純CPU計算,Worker使用GPU+CPU計算。
在UAI--Train平臺中可以非常方便的開展分布式計算,提高效率、壓縮訓練時間。最后通過CIFAR-10 案例解析在UAITrain平臺上訓練所需做出的修改,并在UAITrain平臺上進行分布式UAI--Train平臺訓練。
-
神經(jīng)網(wǎng)絡
+關注
關注
42文章
4840瀏覽量
108091 -
網(wǎng)絡訓練
+關注
關注
0文章
3瀏覽量
1636
原文標題:基于UAI-Train平臺的分布式訓練
文章出處:【微信號:AI_shequ,微信公眾號:人工智能愛好者社區(qū)】歡迎添加關注!文章轉(zhuǎn)載請注明出處。
發(fā)布評論請先 登錄
人工神經(jīng)網(wǎng)絡原理及下載
神經(jīng)網(wǎng)絡解決方案讓自動駕駛成為現(xiàn)實
從AlexNet到MobileNet,帶你入門深度神經(jīng)網(wǎng)絡
ETPU-Z2全可編程神經(jīng)網(wǎng)絡開發(fā)平臺
嵌入式神經(jīng)網(wǎng)絡有哪些挑戰(zhàn)
如何構建神經(jīng)網(wǎng)絡?
用S3C2440訓練神經(jīng)網(wǎng)絡算法
基于BP神經(jīng)網(wǎng)絡的PID控制
如何進行高效的時序圖神經(jīng)網(wǎng)絡的訓練
Gaudi Training系統(tǒng)介紹
基于BP神經(jīng)網(wǎng)絡的分布式傳感器網(wǎng)絡的可靠性分析
基于神經(jīng)網(wǎng)絡的分布式電源在PSASP中應用
基于虛擬化的多GPU深度神經(jīng)網(wǎng)絡訓練框架
如何借助分布式GPU環(huán)境來提升神經(jīng)網(wǎng)絡訓練系統(tǒng)的浮點計算能力
評論