140.1 Horovod
- Horovod是 Uber 開源的又一個(gè)深度學(xué)習(xí)工具,它的發(fā)展吸取了 Facebook「一小時(shí)訓(xùn)練 ImageNet 論文」與百度 Ring Allreduce 的優(yōu)點(diǎn)悲龟,可為用戶實(shí)現(xiàn)分布式訓(xùn)練提供幫助同波。
- Horovod 支持通過用于高性能并行計(jì)算的低層次接口 – 消息傳遞接口 (MPI) 進(jìn)行分布式模型訓(xùn)練奢驯。有了 MPI,就可以利用分布式 Kubernetes 集群來訓(xùn)練 TensorFlow 和 PyTorch 模型。
- 分布式 TensorFlow 的參數(shù)服務(wù)器模型(parameter server paradigm)通常需要對(duì)大量樣板代碼進(jìn)行認(rèn)真的實(shí)現(xiàn)锄蹂。但是 Horovod 僅需要幾行畴蹭。下面是一個(gè)分布式 TensorFlow 項(xiàng)目使用 Horovod 的示例:
import tensorflow as tf
import horovod.tensorflow as hvd
# Initialize Horovod
hvd.init()
# Pin GPU to be used to process local rank (one GPU per process)
config = tf.ConfigProto()
config.gpu_options.visible_device_list = str(hvd.local_rank())
# Build model…
loss = …
opt = tf.train.AdagradOptimizer(0.01)
# Add Horovod Distributed Optimizer
opt = hvd.DistributedOptimizer(opt)
# Add hook to broadcast variables from rank 0 to all other processes during
# initialization.
hooks = [hvd.BroadcastGlobalVariablesHook(0)]
# Make training operation
train_op = opt.minimize(loss)
# The MonitoredTrainingSession takes care of session initialization,
# restoring from a checkpoint, saving to a checkpoint, and closing when done
# or an error occurs.
with tf.train.MonitoredTrainingSession(checkpoint_dir=“/tmp/train_logs”,
config=config,
hooks=hooks) as mon_sess:
while not mon_sess.should_stop():
# Perform synchronous training.
mon_sess.run(train_op)
在該示例中坦仍,粗體文字指進(jìn)行單個(gè) GPU 分布式項(xiàng)目時(shí)必須做的改變:
- hvd.init() 初始化 Horovod。
- config.gpu_options.visible_device_list = str(hvd.local_rank()) 向每個(gè) TensorFlow 流程分配一個(gè) GPU叨襟。
- opt=hvd.DistributedOptimizer(opt) 使用 Horovod 優(yōu)化器包裹每一個(gè)常規(guī) TensorFlow 優(yōu)化器繁扎,Horovod 優(yōu)化器使用 ring-allreduce 平均梯度。
- hvd.BroadcastGlobalVariablesHook(0) 將變量從第一個(gè)流程向其他流程傳播糊闽,以實(shí)現(xiàn)一致性初始化梳玫。如果該項(xiàng)目無法使用 MonitoredTrainingSession,則用戶可以運(yùn)行 hvd.broadcast_global_variables(0)右犹。
- 之后提澎,可以使用 mpirun 命令使該項(xiàng)目的多個(gè)拷貝在多個(gè)服務(wù)器中運(yùn)行:
$ mpirun -np 16 -x LD_LIBRARY_PATH -H
server1:4,server2:4,server3:4,server4:4 python train.py
- mpirun 命令向四個(gè)節(jié)點(diǎn)分布 train.py,然后在每個(gè)節(jié)點(diǎn)的四個(gè) GPU 上運(yùn)行 train.py念链。
140.2 BigDL
- BigDL是一種基于Apache Spark的分布式深度學(xué)習(xí)框架虱朵。它可以無縫的直接運(yùn)行在現(xiàn)有的Apache Spark和Hadoop集群之上。BigDL的設(shè)計(jì)吸取了Torch框架許多方面的知識(shí)钓账,為深度學(xué)習(xí)提供了全面的支持碴犬;包括數(shù)值計(jì)算和高級(jí)神經(jīng)網(wǎng)絡(luò);借助現(xiàn)有的Spark集群來運(yùn)行深度學(xué)習(xí)計(jì)算梆暮,并簡(jiǎn)化存儲(chǔ)在Hadoop中的大數(shù)據(jù)集的數(shù)據(jù)加載服协。
- BigDL優(yōu)點(diǎn):
- 豐富的深度學(xué)習(xí)支持。模擬Torch之后啦粹,BigDL為深入學(xué)習(xí)提供全面支持偿荷,包括數(shù)字計(jì)算(通過Tensor)和高級(jí)神經(jīng)網(wǎng)絡(luò) ; 此外窘游,用戶可以使用BigDL將預(yù)先訓(xùn)練好的Caffe或Torch模型加載到Spark程序中。
- 極高的性能跳纳。為了實(shí)現(xiàn)高性能忍饰,BigDL在每個(gè)Spark任務(wù)中使用英特爾MKL和多線程編程。因此寺庄,在單節(jié)點(diǎn)Xeon(即與主流GPU 相當(dāng))上艾蓝,它比開箱即用開源Caffe,Torch或TensorFlow快了數(shù)量級(jí)斗塘。
- 有效地橫向擴(kuò)展赢织。BigDL可以通過利用Apache Spark(快速分布式數(shù)據(jù)處理框架),以及高效實(shí)施同步SGD和全面減少Spark的通信馍盟,從而有效地?cái)U(kuò)展到“大數(shù)據(jù)規(guī)挠谥茫”上的數(shù)據(jù)分析
- BigDL缺點(diǎn):
- 對(duì)機(jī)器要求高 jdk7上運(yùn)行性能差 在CentOS 6和7上,要將最大用戶進(jìn)程增加到更大的值(例如514585); 否則贞岭,可能會(huì)看到錯(cuò)誤八毯,如“無法創(chuàng)建新的本機(jī)線程”。
- 訓(xùn)練和驗(yàn)證的數(shù)據(jù)會(huì)加載到內(nèi)存瞄桨,擠占內(nèi)存
- BigDL滿足的應(yīng)用場(chǎng)景:
- 直接在Hadoop/Spark框架下使用深度學(xué)習(xí)進(jìn)行大數(shù)據(jù)分析(即將數(shù)據(jù)存儲(chǔ)在HDFS话速、HBase、Hive等數(shù)據(jù)庫上)讲婚;
- 在Spark程序中/工作流中加入深度學(xué)習(xí)功能尿孔;
- 利用現(xiàn)有的 Hadoop/Spark 集群來運(yùn)行深度學(xué)習(xí)程序俊柔,然后將代碼與其他的應(yīng)用場(chǎng)景進(jìn)行動(dòng)態(tài)共享筹麸,例如ETL(Extract、Transform雏婶、Load物赶,即通常所說的數(shù)據(jù)抽取)留晚、數(shù)據(jù)倉庫(data warehouse)酵紫、功能引擎、經(jīng)典機(jī)器學(xué)習(xí)错维、圖表分析等奖地。
140.3 Petastorm
-
Petastorm是一個(gè)由 Uber ATG 開發(fā)的開源數(shù)據(jù)訪問庫。這個(gè)庫可以直接基于數(shù) TB Parquet 格式的數(shù)據(jù)集進(jìn)行單機(jī)或分布式訓(xùn)練和深度學(xué)習(xí)模型評(píng)估赋焕。Petastorm 支持基于 Python 的機(jī)器學(xué)習(xí)框架参歹,如 Tensorflow、Pytorch 和 PySpark隆判,也可以直接用在 Python 代碼中犬庇。
- 即使是在現(xiàn)代硬件上訓(xùn)練深度模型也很耗時(shí)僧界,而且在很多情況下,很有必要在多臺(tái)機(jī)器上分配訓(xùn)練負(fù)載臭挽。典型的深度學(xué)習(xí)集群需要執(zhí)行以下幾個(gè)步驟:
- 一臺(tái)或多臺(tái)機(jī)器讀取集中式或本地?cái)?shù)據(jù)集捂襟。
- 每臺(tái)機(jī)器計(jì)算損失函數(shù)的值,并根據(jù)模型參數(shù)計(jì)算梯度欢峰。在這一步通常會(huì)使用 GPU葬荷。
- 通過組合估計(jì)的梯度(通常由多臺(tái)機(jī)器以分布式的方式計(jì)算得出)來更新模型系數(shù)。
- 通常赤赊,一個(gè)數(shù)據(jù)集是通過連接多個(gè)數(shù)據(jù)源的記錄而生成的闯狱。這個(gè)由 Apache Spark 的 Python 接口 PySpark 生成的數(shù)據(jù)集稍后將被用在機(jī)器學(xué)習(xí)訓(xùn)練中。Petastorm 提供了一個(gè)簡(jiǎn)單的功能抛计,使用 Petastorm 特定的元數(shù)據(jù)對(duì)標(biāo)準(zhǔn)的 Parquet 進(jìn)行了擴(kuò)展哄孤,從而讓它可以與 Petastorm 兼容。
- 有了 Petastorm吹截,消費(fèi)數(shù)據(jù)就像在 HDFS 或文件系統(tǒng)中創(chuàng)建和迭代讀取對(duì)象一樣簡(jiǎn)單瘦陈。Petastorm 使用 PyArrow 來讀取 Parquet 文件。
-
將多個(gè)數(shù)據(jù)源組合到單個(gè)表格結(jié)構(gòu)中波俄,從而生成數(shù)據(jù)集晨逝。可以多次使用相同的數(shù)據(jù)集進(jìn)行模型訓(xùn)練和評(píng)估懦铺。
- 為分布式訓(xùn)練進(jìn)行分片
-
在分布式訓(xùn)練環(huán)境中捉貌,每個(gè)進(jìn)程通常負(fù)責(zé)訓(xùn)練數(shù)據(jù)的一個(gè)子集。一個(gè)進(jìn)程的數(shù)據(jù)子集與其他進(jìn)程的數(shù)據(jù)子集正交冬念。Petastorm 支持將數(shù)據(jù)集的讀時(shí)分片轉(zhuǎn)換為正交的樣本集趁窃。
-
- 本地緩存
-
Petastorm 支持在本地存儲(chǔ)中緩存數(shù)據(jù)。當(dāng)網(wǎng)絡(luò)連接速度較慢或帶寬很昂貴時(shí)急前,這會(huì)派上用場(chǎng)醒陆。
-
140.4 TensorFlowOnSpark
- TensorFlowOnSpark為 Apache Hadoop 和 Apache Spark 集群帶來可擴(kuò)展的深度學(xué)習(xí)。 通過結(jié)合深入學(xué)習(xí)框架 TensorFlow 和大數(shù)據(jù)框架 Apache Spark 裆针、Apache Hadoop 的顯著特征刨摩,TensorFlowOnSpark 能夠在 GPU 和 CPU 服務(wù)器集群上實(shí)現(xiàn)分布式深度學(xué)習(xí)。
- 滿足的應(yīng)用場(chǎng)景:
-
為了利用TensorFlow在現(xiàn)有的Spark和Hadoop集群上進(jìn)行深度學(xué)習(xí)世吨。而不需要為深度學(xué)習(xí)設(shè)置單獨(dú)的集群澡刹。
-
- 優(yōu)點(diǎn):
- 輕松遷移所有現(xiàn)有的TensorFlow程序,<10行代碼更改;
- 支持所有TensorFlow功能:同步/異步訓(xùn)練耘婚,模型/數(shù)據(jù)并行罢浇,推理和TensorBoard;
- 服務(wù)器到服務(wù)器的直接通信在可用時(shí)實(shí)現(xiàn)更快的學(xué)習(xí);
- 允許數(shù)據(jù)集在HDFS和由Spark推動(dòng)的其他來源或由TensorFlow拖動(dòng);
- 輕松集成您現(xiàn)有的數(shù)據(jù)處理流水線和機(jī)器學(xué)習(xí)算法(例如,MLlib边篮,CaffeOnSpark);
- 輕松部署在云或內(nèi)部部署:CPU和GPU己莺,以太網(wǎng)和Infiniband奏甫。
- TensorFlowOnSpark是基于google的TensorFlow的實(shí)現(xiàn),而TensorFlow有著一套完善的教程凌受,內(nèi)容豐富阵子。
- 劣勢(shì):
- 開源時(shí)間不長(zhǎng),未得到充分的驗(yàn)證胜蛉。
大數(shù)據(jù)視頻推薦:
網(wǎng)易云課堂
CSDN
人工智能算法競(jìng)賽實(shí)戰(zhàn)
AIops智能運(yùn)維機(jī)器學(xué)習(xí)算法實(shí)戰(zhàn)
ELK7 stack開發(fā)運(yùn)維實(shí)戰(zhàn)
PySpark機(jī)器學(xué)習(xí)從入門到精通
AIOps智能運(yùn)維實(shí)戰(zhàn)
騰訊課堂
大數(shù)據(jù)語音推薦:
ELK7 stack開發(fā)運(yùn)維
企業(yè)級(jí)大數(shù)據(jù)技術(shù)應(yīng)用
大數(shù)據(jù)機(jī)器學(xué)習(xí)案例之推薦系統(tǒng)
自然語言處理
大數(shù)據(jù)基礎(chǔ)
人工智能:深度學(xué)習(xí)入門到精通