本系列將利用阿里雲容器服務,幫助您上手Kubeflow Pipelines.python
從上篇文章中,咱們能夠看到如何經過Kubeflow Pipeline運行單節點任務機器學習工做流,在本文中,咱們會介紹如何使用Pipeline運行分佈式MPI任務,該MPI任務運行模型ResNet101的測試。git
因爲Kubeflow Pipelines提供的例子多數都是單機任務,那麼如何利用Pipelines運行分佈式訓練?阿里雲容器服務團隊提供了利用MPIJob訓練ResNet101模型的例子,方便您在阿里雲上使用和學習Kubeflow Pipelines,而且訓練支持分佈式的allreduce模型訓練。github
在Kubeflow Pipelines中能夠用Python代碼描述了這樣一個流程, 完整代碼能夠查看mpi_run.py。咱們在這個例子中使用了arena_op
這是對於Kubeflow默認的container_op
封裝,可以實現對於分佈式訓練MPI和PS模式的無縫銜接,另外也支持使用GPU和RDMA等異構設備和分佈式存儲的無縫接入,同時也方便從git源同步代碼。是一個比較實用的工具API。而arena_op
是基於開源項目Arena。web
env = ['NCCL_DEBUG=INFO','GIT_SYNC_BRANCH={0}'.format(git_sync_branch)] train=arena.mpi_job_op( 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
函數的參數以下:docker
name,image, data和command以外,在模型訓練步驟中,還須要指定:數組
[]
metrics=["Train-accuracy:PERCENTAGE"]
。2.因爲Pipelines默認會從stdout日誌中收集指標,你須要在真正運行的模型代碼中輸出{metrics name}={value}或者{metrics name}:{value}, 能夠參考具體樣例代碼arena中mpi_run方法的調用, 還比較直觀,下面就能夠定義一個Python方法。bash
@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:curl
整個過程包括:機器學習
1.將Python代碼編譯成Pipelines執行引擎(Argo)識別的DAG文件的壓縮包分佈式
準備一個python3的環境,而且安裝Kubeflow Pipelines SDK
# docker run -itd --name py3 python:3 sleep infinity # docker exec -it py3 bash
在Python3的環境下執行以下命令
# pip3 install http://kubeflow.oss-cn-beijing.aliyuncs.com/kfp/0.1.16/kfp.tar.gz --upgrade # pip3 install http://kubeflow.oss-cn-beijing.aliyuncs.com/kfp-arena/kfp-arena-0.6.tar.gz --upgrade # curl -O https://raw.githubusercontent.com/cheyang/pipelines/add_mpijob/samples/arena-samples/mpi/mpi_run.py # dsl-compile --py mpi_run.py --output mpi_run.py.tar.gz # ls -ltr | grep mpi_run mpi_run.py.tar.gz # exit
將該文件從容器中拷貝出來
# docker cp py3:/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的輸入參數,也是有足夠的靈活性。
本文爲雲棲社區原創內容,未經容許不得轉載。