Tensorflow訓練中Worker如何動態伸縮

2021-09-28 13:10:34 字數 1713 閱讀 3712

tensorflow對於大部分演算法使用者來說能夠滿足使用需求 。但是在日常使用過程中也發現有一些bug導致日常生產過程中的訓練異常中斷,影響使用 。尤其是在離線集群進行大規模訓練時,集群網路負載大,機器環境惡劣,導致故障頻發,影響使用者體驗。 因此對於tensorflow的穩定性改造,在大規模生產中是一項必要工作。

worker 角色的 failover 及動態擴縮容改造

為了提公升使用者使用體驗提公升集群資源有效利用率抵消使用者超量配置訓練資源的問題。我們主要對tensorflow角色執行部分進行了如下改造:

實現方案介紹

tensorflow分布式訓練採用的是ps模式,即引數伺服器模式。訓練過程中各個worker (資料消費和梯度計算的執行者)將計算得到的梯度資訊同步到ps上正向計算時worker負責從ps上拉取引數 。ps與worker之間的資料通訊依賴於grpc 。grpc 連線在角色啟動的過程中進行建立 。在原生tensorflow中grpc通訊通道的建立依賴於每個角色啟動時配置的 cluster_spec檔案,是一種靜態構建過程,為了實現failover和動態擴縮容,我們需要打破這種靜態機制,構建動態連線關係。

1.原生sparse配置打破worker之間關聯

靜態cluster_spec配置格式如下(以3worker,2ps為例)

這種配置方式 tensorflow 會 在啟動時為ps&worker和worker&worker之間都建立通訊連線,當任意worker失敗時所有worker 都會失敗。原生tensorflow還支援一種sparse配置,可以打破worker之間的依賴,這樣任意worker失敗不會對其他worker造成 影響。如worker0啟動配置方式如下:

通過sparse的方式可以切斷worker之間的相互影響。可以解決worker縮容的問題。

2.通訊通道註冊機制打破ps,worker角色依賴

在tensorflow中通訊通道建立是在角色啟動時的find device階段 。當任務已經執行時,如果worker發生重啟,ps上的通訊通道建立過程不會重複執行 ,新啟動的角色無法被 ps發現。因此這種方式不能夠解決 failover 和 worker擴容 的問題。為了打破這種 限制,需要在tensorflow中增加通訊引數註冊機制。ps中的worker通訊資訊不依賴於引數傳入,改由grpc服務動態註冊 。實現通訊資訊註冊更新,類呼叫關係如下圖所示(依據tensorflow1.8版本原始碼結構):

註冊機制實現機制如上所示,在實現過程中也遇到一些問題。tensorflow在不同層次的通訊物件做了快取,如果在上層找到了通訊物件則不會繼續向下查詢。這樣在worker failover的時候會導致新通訊位址無法得到更新因為上層快取了舊 的通訊物件(快取 在grpcworkercache中。我們採用的策略是將上層cache全部刪除,只更新最下層的ip和port資訊 。這樣在worker failover或者新增節點的時候會有一次通訊物件rebuild 。解決了worker能夠任意重啟和任意擴縮的問題剩下需要解決的問題就是排程策略的 問題 。

TensorFlow訓練Logistic回歸

如下圖,可以清晰看到線性回歸和邏輯回歸的關係,乙個線性方程被邏輯方程歸一化後就成了邏輯回歸。對於二分類,輸出假如線性回歸模型為,則要將z轉成y,即y g z 於是最直接的方式是用單位階躍函式來表示,即 如圖,但階躍函式不連續,於是用sigmoid函式替代之,為 如圖,則有,即logistics函式,...

Tensorflow訓練迴圈

def fit loop model,inputs,targets,sample weights none,class weight none,val inputs none,val targets none,val sample weights none,batch size none,epoch...

tensorflow 資料訓練

一 資料訓練遇到問題 excle資料,如何進行訓練?excle資料,如何resize 呢?目前思路 tfrecords 採用 numpy的方法進行處理 學習方法 從檔案中讀取資料 標準化格式tfrecords記錄 二 資料預處理 numpy 不能有中文,要採用decode等方法 不能夠有百分號?目前...