先說下問題背景,在tensorflow官方支援的分布式中,即ps,worker模式中,由於模型變數的因素,導致變數在ps上初始化的時候負載不均衡,到時影響訓練效能,最近就遇到這種問題,測的是inception_v3這個模型,在分布式中,看各個ps所在機器cup利用率和網路頻寬差異很大,然後就做了ps上變數的負載均衡,負載均衡後,效能提公升大約在10%~20%左右,具體不多說,直接上**:
ps_tasks = len(cluster._cluster_spec.get('ps'))tf.train.replica_device_setter這個函式主要實現變數在ps上初始化,其中提供了乙個引數ps_strategy,即變數初始化的策略,這引數是可選的,不填的話預設迴圈去初始化。if "glbs" == flags.ps_updater:
ps_strategy =tf.contrib.training.greedyloadbalancingstrategy(ps_tasks, tf.contrib.training.byte_size_load_fn)
elif "random" == flags.ps_updater:
ps_strategy =tf.contrib.training.randomstrategy(ps_tasks)else:
ps_strategy = none
clone_device_func = tf.train.replica_device_setter(
worker_device=clone_device,
cluster=cluster,ps_strategy=ps_strategy)
我這裡提供了兩種變數初始化策略,一是每次變數放的時候隨機選乙個(random),二是每次初始化像負載最小的ps放(glbs)。
其實我覺得還有一種更優的方法,就是先把變數按大小排序後,然後每次初始化的時候向負載最小的ps上放,這種tensorflow沒有提供方法,需要自己去實現。
有興趣可以去官網自己看看這幾種方法,尤其可以去看看它**實現,像它實現random策略的時候,他那個想法很有意思,具體我不多透露,自己去看吧。
TensorFlow分布式計算
分布式tensorflow底層的通訊是grpc。grpc首先是乙個rpc,即遠端過程呼叫,通俗的解釋是 假設你在本機上執行一段 num add a,b 它呼叫了乙個過程call,然後返回了乙個值num,你感覺這段 只是在本機上執行的,但實際情況是,本機上的add方法是將引數打包傳送給伺服器,然後伺服...
TensorFlow分布式實踐
大資料時代,基於單機的建模很難滿足企業不斷增長的資料量級的需求,開發者需要使用分布式的開發方式,在集群上進行建模。而單機和分布式的開發 有一定的區別,本文就將為開發者們介紹,基於tensorflow進行分布式開發的兩種方式,幫助開發者在實踐的過程中,更好地選擇模組的開發方向。分布式開發會涉及到更新梯...
TensorFlow分布式實踐
大資料時代,基於單機的建模很難滿足企業不斷增長的資料量級的需求,開發者需要使用分布式的開發方式,在集群上進行建模。而單機和分布式的開發 有一定的區別,本文就將為開發者們介紹,基於tensorflow進行分布式開發的兩種方式,幫助開發者在實踐的過程中,更好地選擇模組的開發方向。基於tensorflow...