IT 人的時間都去哪兒了?html
既然如今雲計算那麼普及,企業應用環境中的計算、存儲、數據庫之類的資源均可以跑在雲中,那麼對於機器學習項目,可否想辦法把最耗費時間的模型訓練工做也丟到雲端去跑?吶,藉助 Amazon SageMaker 運行分佈式 TensorFlow 訓練,知足你所需。git
TensorFlow 是一個被普遍用於開發大型深度神經網絡(DNN)的開源機器學習(ML)庫,此類 DNN 須要分佈式訓練,並在多個主機上使用多個GPU。github
Amazon SageMaker 則是一項託管服務,可經過主動學習、超參數優化、模型分佈式訓練、監控訓練進展,部署培訓模型做爲自動擴展的 RESTful 服務,以及對併發 ML 實驗進行集中式管理,從標籤數據開始簡化 ML 工做流。算法
下文將重點討論使用 Amazon SageMaker 進行分佈式 TensorFlow 訓練。儘管文中許多分佈式訓練概念一般適用於多種類型的 TensorFlow 模型,但本文着重要介紹的是在 Common Object in Context (COCO) 2017數據集上對Mask R-CNN模型進行的分佈式 TensorFlow 訓練。docker
Mask R-CNN 模型用於對象實例分割,其中模型生成像素級掩膜(Sigmoid 二進制分類)和以對象類別(SoftMax 分類)註釋的目標框(Smooth L1 迴歸)描繪圖像中的每一個對象實例。Mask R-CNN 的一些常見用例包括:自動駕駛汽車的感知、表面缺陷檢測和地理空間圖像分析。數據庫
文中選擇 Mask R-CNN 模型的關鍵緣由有三個:網絡
下圖爲 Mask R-CNN 深層神經網絡架構的示意圖:架構
分佈式 DNN 訓練的主要挑戰在於:在應用梯度來更新跨多個節點的多個 GPU 上的模型權重以前,須要在同步步驟中對全部 GPU 的反向傳播過程當中計算出的梯度進行 Allreduce(平均化)。併發
同步 Allreduce 算法須要實現高效率,不然從分佈式數據並行訓練中得到的任何訓練速度提高,都會因同步 Allreduce 步驟的效率低下而蕩然無存。框架
要使同步 Allreduce 算法實現高效率,存在三個主要挑戰:
許多 ML 框架(包括 TensorFlow)都支持 Horovod。TensorFlow 分發策略還利用了 NCCL,並提供了使用 Horovod 進行分佈式 TensorFlow 訓練的替代方法。本文使用的是 Horovod。
訓練大型 DNN(如 Mask R-CNN)對每一個 GPU 的內存要求較高,這樣才能夠將一個或多個高分辨率圖像推送通過訓練管道。它們還須要 GPU 到 GPU 的高速互連,以及高速網絡互連機器,以便高效地對 Allreduce 梯度進行同步。Amazon SageMaker ml.p3.16xlarge 和ml.p3dn.24xlarge 實例類型能夠知足全部這些要求。如需更多信息,請參閱Amazon SageMaker ML 實例類型。它們具備八個 Nvidia Tesla V100 GPU、128–256 GB GPU 內存、25–100 Gbs 網絡互連及高速 Nvidia NVLink GPU 到 GPU 互連,很是適合 Amazon SageMaker 上的分佈式 TensorFlow 訓練。
分佈式 TensorFlow 訓練的下一個挑戰是在多個節點上合理佈置訓練算法進程,以及將每一個進程與惟一全局排名相關聯。消息傳遞接口(MPI)是普遍用於並行計算的聚合通訊協議,在管理跨多個節點的一組訓練算法工做進程中很是有用。
MPI 用於在多個節點上佈置訓練算法進程,並將每一個算法進程與惟一的全局和本地排名相關聯。Horovod 用於邏輯地將給定節點上的算法進程固定到特定的 GPU。梯度同步 Allreduce 要求將每一個算法進程邏輯固定到特定的 GPU。
在本文中,要理解的主要 MPI 概念是:MPI 在主節點上使用 mpirun,以便在多個節點上啓動併發進程。主節點使用 MPI 管理着在多個節點集中運行的分佈式訓練進程的生命週期。要經過 MPI 使用 Amazon SageMaker 來進行分佈式訓練,您必須集成 MPI 和 Amazon SageMaker 的原生分佈式訓練功能。
要了解如何集成 MPI 和 Amazon SageMaker 分佈式訓練,須要對如下概念有至關認識:
若是分佈式訓練使用 MPI,您須要一個在主節點(主機)上運行,並且控制着分佈於多個節點(從 algo-1 到 algo-n,其中n爲在您的 Amazon SageMaker 訓練做業中請求的訓練實例的數量)的所有算法進程生命週期的 mpirun 命令。不過,Amazon SageMaker 不會察覺 MPI,或任何您可能用於在多個節點分配算法進程的其餘並行處理框架。Amazon SageMaker 將在運行於每一個節點的 Docker 容器上調用入口點腳本。這就意味着,入口點腳本須要知道其節點的全局排名,並根據它在主節點或其餘非主節點上是否被調用而執行不一樣的邏輯。
具體而言,對於 MPI,在主節點上被調用的入口點腳本須要運行mpirun命令,以開始當前 Amazon SageMaker 訓練做業的主機集中所有節點的算法進程。在任何非主節點上被 Amazon SageMaker 調用時,同一個入口點腳本會按期檢查由 mpirun 從主節點遠程管理的非主節點上的算法進程是否依然在運行,並在不運行時退出。
MPI 中的主節點是一個邏輯概念,它取決於入口點腳本在當前訓練做業的所有主機中指定一個主機做爲主節點。這項指定必須採用分散式方法完成。簡單的作法之一是,將 algo-1 指定爲主節點,而其餘全部主機爲非主節點。因爲 Amazon SageMaker 在入口點環境變量中爲每一個節點提供其邏輯主機名,所以節點能夠直觀地肯定其是主節點或非主節點。
包含於隨附 GitHub 存儲庫並在 Tensorpack Mask/Faster-RCNN算法 Docker 映像中打包的 train.py 遵循本部分中概述的邏輯。
具有這樣的概念理解背景後,您就能夠繼續操做分步教程,瞭解如何使用 Amazon SageMaker 爲 Mask R-CNN 運行分佈式 TensorFlow 訓練了。
本教程有如下關鍵步驟:
如下爲必須知足的先決條件:
第一步是運行 AWS CloudFormation 自動化腳本以建立一個附加於私有 VPC 的 Amazon SageMaker 筆記本實例。要運行此腳本,您須要具備與網絡管理員職能相符的 IAM 用戶權限。若是沒有此類權限,可能須要尋求網絡管理員的幫助以運行本教程中的 AWS CloudFormation 自動化腳本。如需更多信息,請參閱工做職能的 AWS 託管策略。
使用 AWS CloudFormation 模板 cfn-sm.yaml 建立一個 AWS CloudFormation 堆棧,而該堆棧將建立一個附加於私有 VPC 的筆記本實例。您可使用 AWS CloudFormation 服務控制檯中的 [cfn-sm.yaml]以建立 AWS CloudFormation 堆棧,或也能夠自定義 stack-sm.sh 腳本中的變量,並在已安裝 AWS CLI 的任何位置運行該腳本。
要使用 AWS CLI 方法,執行如下步驟:
保存 AWS CloudFormation 腳本摘要輸出以供稍後使用。您還能夠在 AWS 管理控制檯的 AWS CloudFormation 堆棧輸出選項卡的下方查看輸出。
在 Amazon SageMaker 控制檯中打開建立的筆記本實例。在此筆記本實例中,有三個可用於訓練 Mask R-CNN 的 Jupyter 筆記本:
對於本文選用的 Mask R-CNN 模型和 COCO 2017數據集,全部三個數據源選項的訓練時間性能差很少(雖然不徹底同樣)。每一個數據源的成本結構各有差別。如下是它們在設置訓練數據管道的時間方面的差別:
若是不肯定哪一個數據源選項更適合您,能夠首先嚐試使用 S3,若是每一個訓練做業一開始時的訓練數據下載時間不可接受,接着探索並選擇 EFS 或 Amazon FSx。不要對任何數據源的訓練時間性能進行假設。訓練時間性能取決於衆多因素,最好的作法是進行試驗與測量。
在全部三種情形中,訓練期間的日誌和模型檢查點輸出會被寫入到附加於每一個訓練實例的存儲卷,而後在訓練完成時上傳到您的S3存儲桶。日誌還會在訓練過程當中被注入到 Amazon CloudWatch,您能夠在訓練期間加以檢查。系統和算法訓練指標會在訓練過程當中被注入到 Amazon CloudWatch 指標,您能夠在 Amazon SageMaker 服務控制檯中對其進行可視化。
下圖爲兩種算法對 COCO 2017 數據集進行24次訓練後的示例結果。
您能夠在下方查看 TensorPack Mask/Faster-RCNN 算法的示例結果。下圖可被拆分爲三個存儲桶:
您能夠在下方查看優化 AWS Samples Mask R-CNN 算法的示例結果。下圖顯示的聚合 mAP 指標幾乎與以前的算法相同,不過收斂進展各不相同。
Amazon SageMaker 提供基於 Docker 的簡化分佈式 TensorFlow 訓練平臺,讓您能夠專一於 ML 算法而不會被從屬的問題干擾,例如,基礎設施可用性與可擴展性機制,以及併發實驗管理等。在模型訓練完成後,您可使用 Amazon SageMaker 的集成模型部署功能爲您的模型建立一個自動可擴展的 RESTful 服務終端節點,並開始對其進行測試。
如需更多信息,請參閱在 Amazon SageMaker 託管服務上部署模型。若模型已準備就緒,您能夠將模型 RESTful 服務無縫部署到生產。