天天看點

利用Docker和阿裡雲容器服務輕松搭建分布式TensorFlow訓練叢集(上)

本系列将利用docker技術在阿裡雲hpc和容器服務上,幫助您上手tensorflow的機器學習方案

第五篇:輕松搭建分布式tensorflow訓練叢集(上)

本文是該系列中的第五篇文章, 将為您介紹如何在本機以及hpc和阿裡雲容器服務上快速部署和使用分布式tensorflow訓練叢集。

由于在現實世界裡,單機訓練大型神經網絡的速度非常緩慢,這就需要運作分布式tensorflow叢集并行化的訓練模型。

分布式tensorflow叢集由兩種類型的伺服器組成,一種是參數伺服器,一種是計算伺服器,它們通過高性能的grpc庫作為底層技術互相通信。參數伺服器負責管理并儲存神經網絡參數的取值;計算伺服器負責計算參數的梯度。并行訓練中的更新模式有兩種:同步更新和異步更新, 在同步更新模式下,所有伺服器都會統一讀取參數的取值,計算參數梯度,最後統一更新。而在異步更新模式下,不同伺服器會自己讀取參數,計算梯度并更新參數,而不需要與其他伺服器同步。啟動分布式深度學習模型訓練任務也有兩種模式:圖内拷貝模式(in-graph replication)和圖間拷貝模式模式(between-graph replication)。

利用Docker和阿裡雲容器服務輕松搭建分布式TensorFlow訓練叢集(上)

但是tensorflow本身隻是計算架構,要将其應用在生産環境,還是需要叢集管理工具的資源排程,監控以及生命周期管理等能力。

由于分布式tensorflow比較複雜,我們會分為3個例子向您介紹:

圖内拷貝模式(in-graph replication)

圖間拷貝模式模式(between-graph replication)

基于host網絡的圖間拷貝(between-graph replication)

本文首先介紹的是圖内拷貝模式,另外兩種将在後面介紹

在in-graph replication模式中,指整個叢集由一個用戶端來建構圖,并且由這個用戶端來送出圖到叢集中,worker隻負責處理梯度計算的任務。in-graph的好處在于解耦了tensorflow叢集和訓練應用之間的關系,這樣就可以提前建立參數伺服器和計算伺服器,而這些角色本身無需額外的訓練邏輯,隻要通過join()方法等待。真正的訓練邏輯隻需要置于用戶端應用裡,有足夠的靈活性。

但是對于機器學習的多數場景來說,海量資料是非常普遍的;而這個時候,隻有一個用戶端應用能送出資料和任務的弊端就展現出來了,用戶端程式會變成整個訓練過程的瓶頸。下篇文章會介紹的圖間拷貝(between-graph replication)就顯得尤為重要了,它是tensorflow分布式學習更為常用的模式。

當然也可以直接使用<code>registry.cn-beijing.aliyuncs.com/tensorflow-samples/tf_grpc_server:0.12.0</code>

2. 建立如下的docker compose模闆

3. 利用<code>docker-compose</code>指令啟動并檢視容器狀态

4. 啟動用戶端

通過docker exec進入tf-ps0容器,在tf-ps0容器通路tf-worker0容器内的grpc server

可以看到我們能夠成功的調用<code>grpc://tf-worker0:2222</code>, 并且輸出了結果。

2. 當安裝完成後,确認容器服務上支援了gpu,可以看到每台阿裡雲hpc上有兩個gpu,其中還有每個gpu的配置

利用Docker和阿裡雲容器服務輕松搭建分布式TensorFlow訓練叢集(上)

3. 為了簡化部署,我們提供了一個預先建構基于gpu的tensorflow grpc server的鏡像

registry-internal.cn-beijing.aliyuncs.com/tensorflow-samples/tf_grpc_server:0.12.0-devel-gpu

4. 用如下的docker-compose模闆部署到hpc和阿裡雲容器服務上, 就建立了兩個worker和一個ps(參數伺服器)

注:

<code>aliyun.gpu</code>指定申請的gpu個數。阿裡雲容器服務負責配置設定gpu給容器,并且将主機上的gpu卡映射到容器内,這裡同時會做到對使用者透明。舉例來說,如果使用者申請一個gpu,而主機上隻有/dev/nvidia1可用,将主機上的/dev/nvidia1映射為容器裡的/dev/nvidia0,這樣就會讓使用者程式與具體裝置号解耦。 由于ps-0是參數伺服器,并不消耗大量的計算資源無需使用gpu <code>container_name</code> 用于指定容器的主機名, 例如worker-0的主機名為tf-worker0, ps-0的主機名為tf-ps0, 指定其的目的是用于服務發現 可以通過reschedule-policies可以滿足當主控端節點失敗時自動重新排程容器到新的節點

5. 幾分鐘之後編排模闆部署完畢,可以看到worker-0,worker-1和ps對應的容器啟動了。注意:worker-0和worker-1運作在同一個hpc主控端上。

利用Docker和阿裡雲容器服務輕松搭建分布式TensorFlow訓練叢集(上)

6. 登入到hpc機器可以發現兩個容器分别綁定了兩塊gpu卡

7. 但是在tf-worker0的容器中以為自己綁定了第一塊gpu卡

利用Docker和阿裡雲容器服務輕松搭建分布式TensorFlow訓練叢集(上)

8. 同時在tf-worker1的容器中也以為自己綁定了第一塊gpu卡

利用Docker和阿裡雲容器服務輕松搭建分布式TensorFlow訓練叢集(上)

9. 這樣我們就獲得了一個好處:底層基礎架構對于應用是透明的,讓使用者程式與具體裝置号解耦。

1. 以下為client的代碼,要做的就是構造寫線性資料,其中斜率是2、截距是10,如果梯度下降算法正确的話最終w和b的輸出應該也接近2和10。同時我們這裡可看到我們将可變參數<code>tf.variable</code> w和b綁定到<code>ps-0</code>,并且把不同的operation配置設定給了不同worker,最後将session指向其中一個worker的grpc的終端。

btw: 這個程式隻是為了示範可以顯示的把不同的operation配置設定到不同的worker上,

2. 我們建立了一個包含上面python腳本的容器鏡像

registry-internal.cn-beijing.aliyuncs.com/tensorflow-samples/distribute_linear_regression:0.12.0

3. 用如下的docker-compose模闆部署到阿裡雲hpc容器服務上,就可以觸發tensorflow并行訓練

<code>aliyun.remove_containers</code> 代表容器運作完後是否删除,這裡<code>remove-none</code>表示運作完之後不删除

6. 可以到容器服務的應用狀态頁面檢視進度,當發現應用完成後,就可以檢視日志

利用Docker和阿裡雲容器服務輕松搭建分布式TensorFlow訓練叢集(上)

7. 從日志中可以看到拟合出的結果與真實值w=2,b=10非常接近

利用Docker和阿裡雲容器服務輕松搭建分布式TensorFlow訓練叢集(上)

可以看到,在阿裡雲容器服務上部署和使用tensorflow分布式叢集非常友善,比如tensorflow叢集的成員是在建立時刻通過cluster_spec指定,容器服務完全相容docker網絡模型,可以友善地利用容器名進行服務發現。可以說,利用容器服務和kubernetes在支援分布式tensorflow訓練叢集上有異曲同工之妙,也為讀者提供了在機器學習的實踐中更多的選擇。

利用阿裡雲hpc和容器服務,您除了可以獲得高性能計算的洪荒之力,還可以簡單的掌控這種能力,實作快速測試、部署機器學習應用,進而加速機器學習産品化的速度。容器服務了提供gpu資源的排程和管理,再加上對象存儲,日志、監控等基礎設施能力,幫助使用者專注于利用機器學習創造商業價值。

最後的最後,要提示您的是:

在阿裡雲北京hpc上,使用容器服務是完全免費的

繼續閱讀