你專一 ML 算法就好,模型的訓練交給它就行

專屬圖1.png

IT 人的時間都去哪兒了?html

  • 寫好的代碼,編譯中……
  • 配置開發環境,下載中……
  • 機器學習項目?模型訓練中……
  • 等待之餘玩把遊戲打發時間?哎呀不行,GPU正忙着訓練模型呢……

既然如今雲計算那麼普及,企業應用環境中的計算、存儲、數據庫之類的資源均可以跑在雲中,那麼對於機器學習項目,可否想辦法把最耗費時間的模型訓練工做也丟到雲端去跑?吶,藉助 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 模型的關鍵緣由有三個:網絡

  1. 大型數據集上的 Mask R-CNN 分佈式數據並行訓練可增長經過訓練管道的圖像吞吐量,並縮短訓練時間。
  2. Mask R-CNN 模型有許多開源 TensorFlow 實現。本文使用Tensorpack Mask/Faster-RCNN 實現做爲主要示例,但也推薦使用高度優化的 AWS 示例 Mask-RCNN
  3. Mask R-CNN 模型在 MLPerf 結果中被評估爲大型對象檢測模型。

下圖爲 Mask R-CNN 深層神經網絡架構的示意圖:架構

tensorflow-sagemaker-1.gif

分佈式訓練中的同步 Allreduce 梯度

分佈式 DNN 訓練的主要挑戰在於:在應用梯度來更新跨多個節點的多個 GPU 上的模型權重以前,須要在同步步驟中對全部 GPU 的反向傳播過程當中計算出的梯度進行 Allreduce(平均化)。併發

同步 Allreduce 算法須要實現高效率,不然從分佈式數據並行訓練中得到的任何訓練速度提高,都會因同步 Allreduce 步驟的效率低下而蕩然無存。框架

要使同步 Allreduce 算法實現高效率,存在三個主要挑戰:

  • 該算法須要隨着分佈式訓練集羣中節點和 GPU 數量的增長而擴展。
  • 該算法須要利用單個節點內的高速 GPU 到 GPU 互連的拓撲。
  • 該算法須要經過有效地批處理與其餘 GPU 的通訊,來有效地交錯 GPU 上的計算以及與其餘 GPU 的通訊。
  • Uber 的開源庫 Horovod 經過如下方式克服了這三個主要挑戰:
  • Horovod 提供了一種高效的同步 Allreduce 算法,它可隨着 GPU 和節點數量的增長而擴展。
  • Horovod 庫利用 Nvidia Collective Communications Library (NCCL)通訊原語,而這些通訊原語利用了對 Nvidia GPU 拓撲的瞭解。
  • Horovod 包含 Tensor Fusion,它經過批量處理 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 和 Amazon SageMaker 分佈式訓練,須要對如下概念有至關認識:

  • Amazon SageMaker 要求訓練算法和框架都打包在一個 Docker 映像中。
  • 必須爲 Amazon SageMaker 訓練啓用 Docker 映像。經過使用 Amazon SageMaker 容器能夠簡化啓用,而該容器做爲庫則有助於建立已啓用 Amazon SageMaker 的 Docker 映像。
  • 您須要在 Amazon SageMaker 訓練圖像中提供入口點腳本(一般是 Python 腳本),以充當 Amazon SageMaker 和您的算法代碼之間的中介。
  • 要在指定主機上開始訓練,Amazon SageMaker 會從訓練圖像運行一個 Docker 容器,而後使用提供信息(如超參數和輸入數據位置)的入口點環境變量調用入口點腳本。
  • 入口點腳本則使用在入口點環境變量中傳遞給它的信息啓動具備正確 args 的算法程序,並對運行的算法進程進行輪詢。
  • 若算法進程退出,入口點腳本將使用算法進程的退出代碼退出。Amazon SageMaker 使用此退出代碼來肯定訓練做業成功與否。
  • 入口點腳本會將算法進程的 stdout 和 stderr 重定向至它本身的 stdout。反過來,Amazon SageMaker 會捕獲來自入口點腳本的stdout,而後將其發送到 Amazon CloudWatch Logs。Amazon SageMaker 爲訓練做業中定義的算法指標解析 stdout 輸出,而後將指標發送至Amazon CloudWatch 指標
  • 當 Amazon SageMaker 啓動要請求多個訓練實例的訓練做業時,它會建立一組主機,而後邏輯地將每一個主機命名爲 algo-k,其中 k 是該主機的全局排名。例如,若訓練做業請求四個訓練實例,Amazon SageMaker會把主機分別命名爲 algo-一、algo-二、algo-3 和 algo-4。在網絡上,主機可使用這些主機名進行鏈接。

若是分佈式訓練使用 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 訓練了。

解決方案概覽

本教程有如下關鍵步驟:

  1. 使用 AWS CloudFormation自動化腳本建立一個私有 Amazon VPC,以及一個附加於此私有 VPC 的 Amazon SageMaker 筆記本實例網絡。
  2. 在附加於您的私有 VPC 的由 Amazon SageMaker 託管的 Amazon VPC 網絡中,從 Amazon SageMaker 筆記本實例啓動分佈式訓練做業。您可使用 Amazon S3Amazon EFSAmazon FSx 做爲訓練數據管道的數據源。

先決條件

如下爲必須知足的先決條件:

  1. 建立並激活一個 AWS 帳戶或使用現有的AWS帳戶。
  2. 管理 Amazon SageMaker 實例限制。您至少須要兩個ml.p3dn.24xlarge 或兩個 ml.p3.16xlarge 實例,建議每一個的服務限制爲四個。記住,每一個 AWS 區域都有特定的服務限制。本文使用的是 us-west-2。
  3. 克隆本文的 GitHub 存儲庫,並執行本文中的步驟。本文中的全部路徑都相對於 GitHub 存儲庫根目錄。
  4. 使用任何支持 Amazon SageMaker、EFS 和 Amazon FSx 的 AWS 區域。本文使用的是 us-west-2。
  5. 建立一個新的 S3 存儲桶或選擇一個現有的。

建立附加於 VPC 的 Amazon SageMaker 筆記本實例

第一步是運行 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 方法,執行如下步驟:

  1. 安裝 AWS CLI對其進行配置
  2. 在 stack-sm.sh 中,將 AWS_REGION 和 S3_BUCKET 分別設爲您的 AWS 區域和您的S3存儲桶。您將要用到這兩項變量。
  3. 或者若是想要使用現有的 EFS 文件系統,您須要設置 EFS_ID 變量。若是 EFS_ID 留空,將建立一個新的 EFS 文件系統。若選擇使用現有 EFS 文件系統,請確保現有的文件系統沒有任何現有的掛載目標。如需更多信息,請參閱管理 Amazon EFS 文件系統
  4. 您還能夠指定 GIT_URL 以添加 GitHub 存儲庫至 Amazon SageMaker 筆記本實例。對於 GitHub 存儲庫,您能夠指定 GIT_USER 和 GIT_TOKEN 變量。
  5. 運行自定義 stack-sm.sh 腳本以建立一個使用 AWS CLI 的 AWS CloudFormation 堆棧。

保存 AWS CloudFormation 腳本摘要輸出以供稍後使用。您還能夠在 AWS 管理控制檯的 AWS CloudFormation 堆棧輸出選項卡的下方查看輸出。

啓動 Amazon SageMaker 訓練做業

在 Amazon SageMaker 控制檯中打開建立的筆記本實例。在此筆記本實例中,有三個可用於訓練 Mask R-CNN 的 Jupyter 筆記本:

  1. Mask R-CNN 筆記本,它使用 S3 存儲桶做爲數據源:[mask-rcnn-s3.ipynb]
  2. Mask R-CNN 筆記本,它使用 EFS 文件系統做爲數據源:mask-rcnn-efs.ipynb
  3. Mask R-CNN 筆記本,它使用 Amazon FSx Lustre 文件系統做爲數據源:mask-rcnn-fsx.ipynb

對於本文選用的 Mask R-CNN 模型和 COCO 2017數據集,全部三個數據源選項的訓練時間性能差很少(雖然不徹底同樣)。每一個數據源的成本結構各有差別。如下是它們在設置訓練數據管道的時間方面的差別:

  • 對於 S3 數據源,在每次啓動訓練做業時,它將使用大約20分鐘時間從 S3 存儲桶複製COCO 2017數據集到附加於每一個訓練實例的存儲卷。
  • 對於EFS數據源,它將使用大約46分鐘從 S3 存儲桶複製 COCO 2017數據集到 EFS 文件系統。您只須要複製此數據一次。在訓練期間,將經過網絡接口從掛載於全部訓練實例的共享 EFS 文件系統輸入數據。
  • 對於 Amazon FSx,它將使用大約10分鐘建立一個新的 Amazon FSx Lustre,並從您的 S3 存儲桶將 COCO 2017 數據集導入到新的 Amazon FSx Lustre 文件系統。您僅須要執行此操做一次。在訓練期間,將經過網絡接口從掛載於全部訓練實例的共享 Amazon FSx Lustre 文件系統輸入數據。

若是不肯定哪一個數據源選項更適合您,能夠首先嚐試使用 S3,若是每一個訓練做業一開始時的訓練數據下載時間不可接受,接着探索並選擇 EFS 或 Amazon FSx。不要對任何數據源的訓練時間性能進行假設。訓練時間性能取決於衆多因素,最好的作法是進行試驗與測量。

在全部三種情形中,訓練期間的日誌和模型檢查點輸出會被寫入到附加於每一個訓練實例的存儲卷,而後在訓練完成時上傳到您的S3存儲桶。日誌還會在訓練過程當中被注入到 Amazon CloudWatch,您能夠在訓練期間加以檢查。系統和算法訓練指標會在訓練過程當中被注入到 Amazon CloudWatch 指標,您能夠在 Amazon SageMaker 服務控制檯中對其進行可視化。

訓練結果

下圖爲兩種算法對 COCO 2017 數據集進行24次訓練後的示例結果。
您能夠在下方查看 TensorPack Mask/Faster-RCNN 算法的示例結果。下圖可被拆分爲三個存儲桶:

  1. 不一樣並交比(IoU),以及小型、中型和大型對象大小值的目標框預測平均準確率(mAP)圖示
  2. 不一樣並交比(IoU),以及小型、中型和大型對象大小值的對象實例分割(segm)預測平均準確率(mAP)圖示
  3. 與訓練損失或標籤準確率有關的其餘指標

tensorflow-sagemaker-2-final.gif

您能夠在下方查看優化 AWS Samples Mask R-CNN 算法的示例結果。下圖顯示的聚合 mAP 指標幾乎與以前的算法相同,不過收斂進展各不相同。

tensorflow-sagemaker-2-final1.gif

結論

Amazon SageMaker 提供基於 Docker 的簡化分佈式 TensorFlow 訓練平臺,讓您能夠專一於 ML 算法而不會被從屬的問題干擾,例如,基礎設施可用性與可擴展性機制,以及併發實驗管理等。在模型訓練完成後,您可使用 Amazon SageMaker 的集成模型部署功能爲您的模型建立一個自動可擴展的 RESTful 服務終端節點,並開始對其進行測試。

如需更多信息,請參閱在 Amazon SageMaker 託管服務上部署模型。若模型已準備就緒,您能夠將模型 RESTful 服務無縫部署到生產。

底圖2.png

相關文章
相關標籤/搜索