本系列將介紹如何在阿里雲容器服務上運行Kubeflow, 本文介紹如何使用TfJob
運行分佈式模型訓練。python
TensorFlow
做爲如今最爲流行的深度學習代碼庫,在數據科學家中間很是流行,特別是能夠明顯加速訓練效率的分佈式訓練更是殺手級的特性。可是如何真正部署和運行大規模的分佈式模型訓練,卻成了新的挑戰。 實際分佈式TensorFLow的使用者須要關心3件事情。git
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擅長的,固化和可重複的操做保存到容器鏡像。而自動化的構建ClusterSpec
是TFJob
解決的問題,讓用戶經過簡單的集中式配置,完成TensorFlow分佈式集羣拓撲的構建。github
應該說煩惱了數據科學家好久的分佈式訓練問題,經過Kubernetes+TFJob的方案能夠獲得比較好的解決。json
以前在阿里雲上小試TFJob一文中已經介紹了TFJob
的定義,這裏就再也不贅述了。能夠知道TFJob
裏有的角色類型爲MASTER
, WORKER
和 PS
。api
舉個現實的例子,假設從事分佈式訓練的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
的規約修改分佈式訓練代碼:學習