140.深度學(xué)習(xí)分布式計算框架-3

140.1 Horovod

  • Horovod是 Uber 開源的又一個深度學(xué)習(xí)工具,它的發(fā)展吸取了 Facebook「一小時訓(xùn)練 ImageNet 論文」與百度 Ring Allreduce 的優(yōu)點,可為用戶實現(xiàn)分布式訓(xùn)練提供幫助。
  • Horovod 支持通過用于高性能并行計算的低層次接口 – 消息傳遞接口 (MPI) 進行分布式模型訓(xùn)練。有了 MPI,就可以利用分布式 Kubernetes 集群來訓(xùn)練 TensorFlow 和 PyTorch 模型。
  • 分布式 TensorFlow 的參數(shù)服務(wù)器模型(parameter server paradigm)通常需要對大量樣板代碼進行認真的實現(xiàn)。但是 Horovod 僅需要幾行。下面是一個分布式 TensorFlow 項目使用 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)

在該示例中,粗體文字指進行單個 GPU 分布式項目時必須做的改變:

  • hvd.init() 初始化 Horovod。
  • config.gpu_options.visible_device_list = str(hvd.local_rank()) 向每個 TensorFlow 流程分配一個 GPU。
  • opt=hvd.DistributedOptimizer(opt) 使用 Horovod 優(yōu)化器包裹每一個常規(guī) TensorFlow 優(yōu)化器,Horovod 優(yōu)化器使用 ring-allreduce 平均梯度。
  • hvd.BroadcastGlobalVariablesHook(0) 將變量從第一個流程向其他流程傳播,以實現(xiàn)一致性初始化。如果該項目無法使用 MonitoredTrainingSession,則用戶可以運行 hvd.broadcast_global_variables(0)。
  • 之后,可以使用 mpirun 命令使該項目的多個拷貝在多個服務(wù)器中運行:
$ mpirun -np 16 -x LD_LIBRARY_PATH -H 
server1:4,server2:4,server3:4,server4:4 python train.py
  • mpirun 命令向四個節(jié)點分布 train.py,然后在每個節(jié)點的四個 GPU 上運行 train.py。

140.2 BigDL

  • BigDL是一種基于Apache Spark的分布式深度學(xué)習(xí)框架。它可以無縫的直接運行在現(xiàn)有的Apache Spark和Hadoop集群之上。BigDL的設(shè)計吸取了Torch框架許多方面的知識,為深度學(xué)習(xí)提供了全面的支持;包括數(shù)值計算和高級神經(jīng)網(wǎng)絡(luò);借助現(xiàn)有的Spark集群來運行深度學(xué)習(xí)計算,并簡化存儲在Hadoop中的大數(shù)據(jù)集的數(shù)據(jù)加載。
  • BigDL優(yōu)點:
    • 豐富的深度學(xué)習(xí)支持。模擬Torch之后,BigDL為深入學(xué)習(xí)提供全面支持,包括數(shù)字計算(通過Tensor)和高級神經(jīng)網(wǎng)絡(luò) ; 此外,用戶可以使用BigDL將預(yù)先訓(xùn)練好的Caffe或Torch模型加載到Spark程序中。
    • 極高的性能。為了實現(xiàn)高性能,BigDL在每個Spark任務(wù)中使用英特爾MKL和多線程編程。因此,在單節(jié)點Xeon(即與主流GPU 相當(dāng))上,它比開箱即用開源Caffe,Torch或TensorFlow快了數(shù)量級。
    • 有效地橫向擴展。BigDL可以通過利用Apache Spark(快速分布式數(shù)據(jù)處理框架),以及高效實施同步SGD和全面減少Spark的通信,從而有效地擴展到“大數(shù)據(jù)規(guī)模”上的數(shù)據(jù)分析
  • BigDL缺點:
    • 對機器要求高 jdk7上運行性能差 在CentOS 6和7上,要將最大用戶進程增加到更大的值(例如514585); 否則,可能會看到錯誤,如“無法創(chuàng)建新的本機線程”。
    • 訓(xùn)練和驗證的數(shù)據(jù)會加載到內(nèi)存,擠占內(nèi)存
  • BigDL滿足的應(yīng)用場景:
    • 直接在Hadoop/Spark框架下使用深度學(xué)習(xí)進行大數(shù)據(jù)分析(即將數(shù)據(jù)存儲在HDFS、HBase、Hive等數(shù)據(jù)庫上);
    • 在Spark程序中/工作流中加入深度學(xué)習(xí)功能;
    • 利用現(xiàn)有的 Hadoop/Spark 集群來運行深度學(xué)習(xí)程序,然后將代碼與其他的應(yīng)用場景進行動態(tài)共享,例如ETL(Extract、Transform、Load,即通常所說的數(shù)據(jù)抽取)、數(shù)據(jù)倉庫(data warehouse)、功能引擎、經(jīng)典機器學(xué)習(xí)、圖表分析等。

140.3 Petastorm

  • Petastorm是一個由 Uber ATG 開發(fā)的開源數(shù)據(jù)訪問庫。這個庫可以直接基于數(shù) TB Parquet 格式的數(shù)據(jù)集進行單機或分布式訓(xùn)練和深度學(xué)習(xí)模型評估。Petastorm 支持基于 Python 的機器學(xué)習(xí)框架,如 Tensorflow、Pytorch 和 PySpark,也可以直接用在 Python 代碼中。


  • 即使是在現(xiàn)代硬件上訓(xùn)練深度模型也很耗時,而且在很多情況下,很有必要在多臺機器上分配訓(xùn)練負載。典型的深度學(xué)習(xí)集群需要執(zhí)行以下幾個步驟:
    • 一臺或多臺機器讀取集中式或本地數(shù)據(jù)集。
    • 每臺機器計算損失函數(shù)的值,并根據(jù)模型參數(shù)計算梯度。在這一步通常會使用 GPU。
    • 通過組合估計的梯度(通常由多臺機器以分布式的方式計算得出)來更新模型系數(shù)。
  • 通常,一個數(shù)據(jù)集是通過連接多個數(shù)據(jù)源的記錄而生成的。這個由 Apache Spark 的 Python 接口 PySpark 生成的數(shù)據(jù)集稍后將被用在機器學(xué)習(xí)訓(xùn)練中。Petastorm 提供了一個簡單的功能,使用 Petastorm 特定的元數(shù)據(jù)對標準的 Parquet 進行了擴展,從而讓它可以與 Petastorm 兼容。
  • 有了 Petastorm,消費數(shù)據(jù)就像在 HDFS 或文件系統(tǒng)中創(chuàng)建和迭代讀取對象一樣簡單。Petastorm 使用 PyArrow 來讀取 Parquet 文件。
  • 將多個數(shù)據(jù)源組合到單個表格結(jié)構(gòu)中,從而生成數(shù)據(jù)集??梢远啻问褂孟嗤臄?shù)據(jù)集進行模型訓(xùn)練和評估。


  • 為分布式訓(xùn)練進行分片
    • 在分布式訓(xùn)練環(huán)境中,每個進程通常負責(zé)訓(xùn)練數(shù)據(jù)的一個子集。一個進程的數(shù)據(jù)子集與其他進程的數(shù)據(jù)子集正交。Petastorm 支持將數(shù)據(jù)集的讀時分片轉(zhuǎn)換為正交的樣本集。


  • 本地緩存
    • Petastorm 支持在本地存儲中緩存數(shù)據(jù)。當(dāng)網(wǎng)絡(luò)連接速度較慢或帶寬很昂貴時,這會派上用場。


140.4 TensorFlowOnSpark

  • TensorFlowOnSpark為 Apache Hadoop 和 Apache Spark 集群帶來可擴展的深度學(xué)習(xí)。 通過結(jié)合深入學(xué)習(xí)框架 TensorFlow 和大數(shù)據(jù)框架 Apache Spark 、Apache Hadoop 的顯著特征,TensorFlowOnSpark 能夠在 GPU 和 CPU 服務(wù)器集群上實現(xiàn)分布式深度學(xué)習(xí)。
  • 滿足的應(yīng)用場景:
    • 為了利用TensorFlow在現(xiàn)有的Spark和Hadoop集群上進行深度學(xué)習(xí)。而不需要為深度學(xué)習(xí)設(shè)置單獨的集群。



  • 優(yōu)點:
    • 輕松遷移所有現(xiàn)有的TensorFlow程序,<10行代碼更改;
    • 支持所有TensorFlow功能:同步/異步訓(xùn)練,模型/數(shù)據(jù)并行,推理和TensorBoard;
    • 服務(wù)器到服務(wù)器的直接通信在可用時實現(xiàn)更快的學(xué)習(xí);
    • 允許數(shù)據(jù)集在HDFS和由Spark推動的其他來源或由TensorFlow拖動;
    • 輕松集成您現(xiàn)有的數(shù)據(jù)處理流水線和機器學(xué)習(xí)算法(例如,MLlib,CaffeOnSpark);
    • 輕松部署在云或內(nèi)部部署:CPU和GPU,以太網(wǎng)和Infiniband。
    • TensorFlowOnSpark是基于google的TensorFlow的實現(xiàn),而TensorFlow有著一套完善的教程,內(nèi)容豐富。
  • 劣勢:
    • 開源時間不長,未得到充分的驗證。

大數(shù)據(jù)視頻推薦:
網(wǎng)易云課堂
CSDN
人工智能算法競賽實戰(zhàn)
AIops智能運維機器學(xué)習(xí)算法實戰(zhàn)
ELK7 stack開發(fā)運維實戰(zhàn)
PySpark機器學(xué)習(xí)從入門到精通
AIOps智能運維實戰(zhàn)
騰訊課堂
大數(shù)據(jù)語音推薦:
ELK7 stack開發(fā)運維
企業(yè)級大數(shù)據(jù)技術(shù)應(yīng)用
大數(shù)據(jù)機器學(xué)習(xí)案例之推薦系統(tǒng)
自然語言處理
大數(shù)據(jù)基礎(chǔ)
人工智能:深度學(xué)習(xí)入門到精通

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容