像Google同樣構建機器學習系統 - 利用MPIJob運行ResNet101

本系列將利用阿里雲容器服務,幫助您上手Kubeflow Pipelines.python

上篇文章中,咱們能夠看到如何經過Kubeflow Pipeline運行單節點任務機器學習工做流,在本文中,咱們會介紹如何使用Pipeline運行分佈式MPI任務,該MPI任務運行模型ResNet101的測試。git

開發MPIRun Pipeline

因爲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是基於開源項目Arenaweb

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以外,在模型訓練步驟中,還須要指定:數組

  • 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方法。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是表示工做流的裝飾器,這個裝飾器中須要定義兩個屬性,分別是 namedescription
入口方法 mpirun_pipeline中定義了一系列參數,因爲數量較多就不在這裏一一列舉了。這裏的參數的值其實是  dsl.PipelineParam類型,定義成dsl.PipelineParam的目的在於能夠經過Kubeflow Pipelines的原生UI能夠將其轉換成輸入表單,表單的關鍵字是參數名稱,而默認值爲參數的值. 值得注意的是,這裏的dsl.PipelineParam對應值的實際上只能是字符串和數字型;而數組和map,以及自定義類型都是沒法經過轉型進行變換的。

而實際上,這些參數均可以在用戶提交工做流時進行覆蓋,如下就是提交工做流對應的UI:curl

 

提交Pipeline

整個過程包括:機器學習

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,實際上這個例子並不必定嚴絲合縫的知足使用者的需求:

  1. arena.mpi_job_op是使用MPIJob的API,您能夠根據須要自定義調用方式。
  2. def mpirun_pipeline的靈活性更是掌握在用戶的手裏,如何定義具體Pipeline的輸入參數,也是有足夠的靈活性。

 

原文連接

本文爲雲棲社區原創內容,未經容許不得轉載。

相關文章
相關標籤/搜索