摘要: 從上篇文章中,咱們能夠看到如何經過Kubeflow Pipeline運行單節點任務機器學習工做流,在本文中,咱們會介紹如何使用Pipeline運行分佈式MPI任務,該MPI任務運行模型ResNet101的測試。python
本系列將利用阿里雲容器服務,幫助您上手Kubeflow Pipelines.git
第一篇:在阿里雲上搭建Kubeflow Pipelines
第二篇:開發你的機器學習工做流
第三篇:利用MPIJob運行ResNet101
從上篇文章中,咱們能夠看到如何經過Kubeflow Pipeline運行單節點任務機器學習工做流,在本文中,咱們會介紹如何使用Pipeline運行分佈式MPI任務,該MPI任務運行模型ResNet101的測試。github
開發MPIRun Pipeline
因爲Kubeflow Pipelines提供的例子多數都是單機任務,那麼如何利用Pipelines運行分佈式訓練?阿里雲容器服務團隊提供了利用MPIJob訓練ResNet101模型的例子,方便您在阿里雲上使用和學習Kubeflow Pipelines,而且訓練支持分佈式的allreduce模型訓練。web
在Kubeflow Pipelines中能夠用Python代碼描述了這樣一個流程, 完整代碼能夠查看mpi_run.py。咱們在這個例子中使用了arena_op這是對於Kubeflow默認的container_op封裝,可以實現對於分佈式訓練MPI和PS模式的無縫銜接,另外也支持使用GPU和RDMA等異構設備和分佈式存儲的無縫接入,同時也方便從git源同步代碼。是一個比較實用的工具API。而arena_op是基於開源項目Arena。docker
env = ['NCCL_DEBUG=INFO','GIT_SYNC_BRANCH={0}'.format(git_sync_branch)]數組
train=arena.mpi_job_op(bash
name="all-reduce", image=image, env=env, data=[data], workers=workers, sync_source=sync_source, gpus=gpus, cpu_limit=cpu_limit, memory_limit=memory_limit, metrics=[metric], command=""" mpirun python code/benchmarks/scripts/tf_cnn_benchmarks/tf_cnn_benchmarks.py --model resnet101 \ --batch_size {0} --variable_update horovod --optimizer {1}\ --summary_verbosity=3 --save_summaries_steps=10 """.format(batch_size, optimizer)
)
arena.mpi_job_op函數的參數以下:curl
name,image, data和command以外,在模型訓練步驟中,還須要指定:機器學習
name: 步驟名稱
image: 須要使用的容器鏡像
workers: 參與運算的worker數量
data: 要使用的數據以及其對應到容器內部的掛載目錄, 這裏的data是一個數組類型, 能夠設置爲data=["user-susan:/training"],表示能夠掛載到多個數據。
env: 系統環境變量,這裏的env也是數組類型,能夠支持多個env; 若是不須要指定環境變量能夠把env設置爲[]
gpu: 默認爲0,就是不使用GPU;若是爲大於0的整數值,就表明該步驟須要這個數量的GPU數。
cpu_limit: cpu的資源上限
memory_limit: 內存的資源上限
metrics: 一樣是從可重現和可比較的實驗目的出發,用戶能夠將須要的一系列指標導出,而且經過Pipelines UI上直觀的顯示和比較。具體使用方法分爲兩步,1.在調用API時以數組的形式指定要收集指標的metrics name和指標的展現格式PERCENTAGE或者是RAW,好比metrics=["Train-accuracy:PERCENTAGE"]。2.因爲Pipelines默認會從stdout日誌中收集指標,你須要在真正運行的模型代碼中輸出{metrics name}={value}或者{metrics name}:{value}, 能夠參考具體樣例代碼
command: 就是要提交的mpirun命令
arena中mpi_run方法的調用, 還比較直觀,下面就能夠定義一個Python方法。分佈式
@dsl.pipeline(
name='pipeline to run mpi job',
description='shows how to run mpi job.'
)
def mpirun_pipeline(image="uber/horovod:0.13.11-tf1.10.0-torch0.4.0-py3.5",
batch_size="64", optimizer='momentum', sync_source='https://github.com/tensorflow/benchmarks.git', git_sync_branch='cnn_tf_v1.9_compatible', data='user-susan:/training', gpus=1, workers=1, cpu_limit='2', metric='images/sec', memory_limit='10Gi'):
@dsl.pipeline是表示工做流的裝飾器,這個裝飾器中須要定義兩個屬性,分別是name和description
入口方法mpirun_pipeline中定義了一系列參數,因爲數量較多就不在這裏一一列舉了。這裏的參數的值其實是 dsl.PipelineParam類型,定義成dsl.PipelineParam的目的在於能夠經過Kubeflow Pipelines的原生UI能夠將其轉換成輸入表單,表單的關鍵字是參數名稱,而默認值爲參數的值. 值得注意的是,這裏的dsl.PipelineParam對應值的實際上只能是字符串和數字型;而數組和map,以及自定義類型都是沒法經過轉型進行變換的。
而實際上,這些參數均可以在用戶提交工做流時進行覆蓋,如下就是提交工做流對應的UI:
提交Pipeline
整個過程包括:
1.將Python代碼編譯成Pipelines執行引擎(Argo)識別的DAG文件的壓縮包
準備一個python3的環境,而且安裝Kubeflow Pipelines SDK
在Python3的環境下執行以下命令
mpi_run.py.tar.gz
將該文件從容器中拷貝出來
2.將該壓縮包上傳到Kubeflow Pipeline的web控制檯,而且將名字改成mpi_run
運行試驗
1.在pipeline頁面,點擊mpi_run連接
2.點擊右上角按鈕Create run
3.在Start a new run的界面上填寫Run name,同時選擇已有或者建立相關的實驗。同時按照實際狀況設置運行參數,也就是Run parameters。注意,若是您沒有配置數據相關的配置,請將data中的參數清空便可。點擊啓動便可。
查看運行結果
登陸到Kubeflow Pipelines的UI: [https://{pipeline地址}/pipeline/#/experiments],查看實驗結果:
點擊具體Run,選擇all-reduce, 並點擊logs查看日誌
總結
本文介紹瞭如何利用Pipeline運行MPIJob,實際上這個例子並不必定嚴絲合縫的知足使用者的需求:
arena.mpi_job_op是使用MPIJob的API,您能夠根據須要自定義調用方式。def mpirun_pipeline的靈活性更是掌握在用戶的手裏,如何定義具體Pipeline的輸入參數,也是有足夠的靈活性。