Kubeflow實戰系列: 利用TFJob運行分佈式TensorFlow

介紹

本系列將介紹如何在阿里雲容器服務上運行Kubeflow, 本文介紹如何使用TfJob運行分佈式模型訓練。python

TensorFlow分佈式訓練和Kubernetes

TensorFlow做爲如今最爲流行的深度學習代碼庫,在數據科學家中間很是流行,特別是能夠明顯加速訓練效率的分佈式訓練更是殺手級的特性。可是如何真正部署和運行大規模的分佈式模型訓練,卻成了新的挑戰。 實際分佈式TensorFLow的使用者須要關心3件事情。git

  1. 尋找足夠運行訓練的資源,一般一個分佈式訓練須要若干數量的worker(運算服務器)和ps(參數服務器),而這些運算成員都須要使用計算資源。
  2. 安裝和配置支撐程序運算的軟件和應用
  3. 根據分佈式TensorFlow的設計,須要配置ClusterSpec。這個json格式的ClusterSpec是用來描述整個分佈式訓練集羣的架構,好比須要使用兩個worker和ps,ClusterSpec應該長成下面的樣子,而且分佈式訓練中每一個成員都須要利用這個ClusterSpec初始化tf.train.ClusterSpec對象,創建集羣內部通訊
cluster = tf.train.ClusterSpec({"worker": ["<VM_1>:2222",
                                           "<VM_2>:2222"],
                                "ps": ["<IP_VM_1>:2223",
                                       "<IP_VM_2>:2223"]})

其中第一件事情是Kubernetes資源調度很是擅長的事情,不管CPU和GPU調度,都是直接可使用;而第二件事情是Docker擅長的,固化和可重複的操做保存到容器鏡像。而自動化的構建ClusterSpecTFJob解決的問題,讓用戶經過簡單的集中式配置,完成TensorFlow分佈式集羣拓撲的構建。github

應該說煩惱了數據科學家好久的分佈式訓練問題,經過Kubernetes+TFJob的方案能夠獲得比較好的解決。json

利用Kubernetes和TFJob部署分佈式訓練

  1. 修改TensorFlow分佈式訓練代碼

以前在阿里雲上小試TFJob一文中已經介紹了TFJob的定義,這裏就再也不贅述了。能夠知道TFJob裏有的角色類型爲MASTERWORKER 和 PSapi

舉個現實的例子,假設從事分佈式訓練的TFJob叫作distributed-mnist, 其中節點有1個MASTER, 2個WORKERS和2個PS,ClusterSpec對應的格式以下所示:服務器

{  
    "master":[  
        "distributed-mnist-master-0:2222"
    ],
    "ps":[  
        "distributed-mnist-ps-0:2222",
        "distributed-mnist-ps-1:2222"
    ],
    "worker":[  
        "distributed-mnist-worker-0:2222",
        "distributed-mnist-worker-1:2222"
    ]
}

tf_operator的工做就是建立對應的5個Pod, 而且將環境變量TF_CONFIG傳入到每一個Pod中,TF_CONFIG包含三部分的內容,當前集羣ClusterSpec, 該節點的角色類型,以及id。好比該Pod爲worker0,它所收到的環境變量TF_CONFIG爲:架構

{  
   "cluster":{  
      "master":[  
         "distributed-mnist-master-0:2222"
      ],
      "ps":[  
         "distributed-mnist-ps-0:2222"
      ],
      "worker":[  
         "distributed-mnist-worker-0:2222",
         "distributed-mnist-worker-1:2222"
      ]
   },
   "task":{  
      "type":"worker",
      "index":0
   },
   "environment":"cloud"
}

在這裏,tf_operator負責將集羣拓撲的發現和配置工做完成,免除了使用者的麻煩。對於使用者來講,他只須要在這裏代碼中使用經過獲取環境變量TF_CONFIG中的上下文。分佈式

這意味着,用戶須要根據和TFJob的規約修改分佈式訓練代碼:學習

相關文章
相關標籤/搜索