MXNet KVStore API與python源碼

說明

最近碰到地一個問題是多機分布式訓練的時候總是起不了程序隧膘,但是每臺機器單獨起訓練程序總是沒有問題所宰,感覺這個問題經(jīng)常碰到,解決的辦法就是刪掉程序篮迎,重新再來,確保每一臺機器的程序一模一樣,這樣非常頭疼甜橱,因為不理解其中的原理逊笆,接下來準備把kv-store和ps-lite看看,把其中的原理弄弄明白岂傲,方便以后調(diào)試

下面這篇文章基于官https://mxnet.incubator.apache.org/tutorials/python/kvstore.html

分布式key value存儲

KVStore是一個數(shù)據(jù)共享的地方难裆,把它想象成一個跨設備(不同的GPU和機器)的對象就行了,每個設備可以推數(shù)據(jù)到該對象譬胎,也可以從該對象拉數(shù)據(jù)到本地

初始化

首先舉一個簡單的例子差牛,初始化一個(int, NDArray)類型的鍵值對,然后通過pull操作拿出這個值

import mxnet as mx
kv = mx.kv.create('local') # create a local kv store.
shape = (2,3)
kv.init(3, mx.nd.ones(shape)*2)
a = mx.nd.zeros(shape)
kv.pull(3, out = a)
print a

[[ 2.  2.  2.]
 [ 2.  2.  2.]]
<NDArray 2x3 @cpu(0)>

初始化一個全部為2對2x3的數(shù)據(jù)作為值堰乔,用3作為這個值的key偏化,pull出來的結(jié)果和創(chuàng)建的時候是一樣的,可以證明kv-store確實存在了這個值镐侯,這里的key可以是其他值侦讨,不一定是整數(shù),我試過string是ok的

Push, Aggregate, and Update 推苟翻,聚合韵卤,更新

對于任何已經(jīng)初始化了的key,可以用一個形狀一樣的數(shù)據(jù)更新這個key:

kv.push(3, mx.nd.ones(shape)*8)
kv.pull(3, out = a) # pull out the value
b = mx.nd.ones(shape)
kv.pull(3, out = b)
print b
print a
[[ 8.  8.  8.]
 [ 8.  8.  8.]]
<NDArray 2x3 @cpu(0)>
[[ 8.  8.  8.]
 [ 8.  8.  8.]]
<NDArray 2x3 @cpu(0)>

這里2x3的8覆蓋掉原來的2崇猫,此外沈条,這里pull操作需要傳遞一個接收值(引用)的對象給它,這里我想把pull 的值接收到另外一個地方诅炉,傳遞了一個同樣形狀的b給它蜡歹,就能得到數(shù)據(jù)

數(shù)據(jù)可以從任何設備push上來,還可以對某一個key推送多個值涕烧,KVStore會把他們求和然后push聚合后對值月而,多個值用一個list表示,一般的使用是從多個gpu推送各自計算的梯度议纯,我沒有g(shù)pu父款,用多個數(shù)據(jù)替代:

#gpus = [mx.gpu(i) for i in range(4)]
#b = [mx.nd.ones(shape, gpu) for gpu in gpus]
b = [mx.nd.ones(shape), mx.nd.ones(shape), mx.nd.ones(shape)]
kv.push(3, b)
kv.pull(3, a)
print a

[[ 3.  3.  3.]
 [ 3.  3.  3.]]
<NDArray 2x3 @cpu(0)>

每一次調(diào)用push, kvstore對像調(diào)用update方法更新參數(shù),更新的方式可以自定義瞻凤,傳入更新的方式憨攒,先看效果:

def update(key, input, stored):
    print "update on key: %d" % key
    stored += input * 2
kv._set_updater(update)
kv.pull(3, out=a)
print a.asnumpy()
kv.push(3, mx.nd.ones(shape))
kv.pull(3, out=a)
print a.asnumpy()

[[ 3.  3.  3.]
 [ 3.  3.  3.]]
update on key: 3
[[ 5.  5.  5.]
 [ 5.  5.  5.]]

上面對一個stored的2x3的,全部是3的矩陣更新阀参,傳入的值是相同形狀的1浓恶,更新函數(shù)將傳入值乘以2再更新

kvstore.py文件中,找到了_set_updata__方法结笨,本想看看默認的_updata方法了包晰,目測進入C++方法湿镀,已經(jīng)不知道怎么看下去,大牛知道在哪個文件的哪個位置實現(xiàn)了這個默認的更新梯度的方法請和戳我

pull

上面已經(jīng)展示了推送多個值到一個key(從多個設備推送各自的值到一個key)伐憾,對于pull也一樣勉痴,同樣可以從一個值拉下來到不同的設備上

b = [mx.nd.ones(shape, gpu) for gpu in gpus]
kv.pull(3, out = b)
print b[1].asnumpy()

[[ 6.  6.  6.]
[ 6.  6.  6.]]

這個是官方的例子,執(zhí)行pull树肃,一個數(shù)據(jù)蒸矛,并將這個數(shù)據(jù)復制成多份,一次發(fā)送到每一個gpu上

處理鍵值對列表

以上介紹的都是針對單個key, kvstore也支持鍵值對列表的接口

針對單機:

keys = [5, 7, 9]
kv.init(keys, [mx.nd.ones(shape)]*len(keys))
kv.push(keys, [mx.nd.ones(shape)]*len(keys))
b = [mx.nd.zeros(shape)]*len(keys)
kv.pull(keys, out = b)
print b[1].asnumpy()

創(chuàng)建一個三個元素的list胸嘴,初始化到5雏掠,7,9三個key上劣像,創(chuàng)建一個相同形狀的數(shù)據(jù)list乡话,定義一個相同形狀的數(shù)據(jù)b用于得到輸出,輸出是一個list

針對多個設備:

b = [[mx.nd.ones(shape, gpu) for gpu in gpus]] * len(keys)
kv.push(keys, b)
update on key: 5
update on key: 7
update on key: 9
kv.pull(keys, out = b)
print b[1][1].asnumpy()
[[ 11.  11.  11.]
[ 11.  11.  11.]]

上面已經(jīng)介紹過聚合耳奕,如果一個ke對應的value是一個list绑青,系統(tǒng)會將他們先聚合,然后更新key所對應的value屋群,針對多個key的情況也一樣闸婴,更新的數(shù)據(jù)維度多一個

這些都是針對單機的,多機的文檔沒有介紹芍躏,我也想搞搞明白邪乍,哪位大神有知道好資料的請戳我


image.png
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市对竣,隨后出現(xiàn)的幾起案子庇楞,更是在濱河造成了極大的恐慌,老刑警劉巖柏肪,帶你破解...
    沈念sama閱讀 218,858評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異芥牌,居然都是意外死亡烦味,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,372評論 3 395
  • 文/潘曉璐 我一進店門壁拉,熙熙樓的掌柜王于貴愁眉苦臉地迎上來谬俄,“玉大人,你說我怎么就攤上這事弃理±B郏” “怎么了?”我有些...
    開封第一講書人閱讀 165,282評論 0 356
  • 文/不壞的土叔 我叫張陵痘昌,是天一觀的道長钥勋。 經(jīng)常有香客問我炬转,道長,這世上最難降的妖魔是什么算灸? 我笑而不...
    開封第一講書人閱讀 58,842評論 1 295
  • 正文 為了忘掉前任扼劈,我火速辦了婚禮,結(jié)果婚禮上菲驴,老公的妹妹穿的比我還像新娘荐吵。我一直安慰自己,他們只是感情好赊瞬,可當我...
    茶點故事閱讀 67,857評論 6 392
  • 文/花漫 我一把揭開白布先煎。 她就那樣靜靜地躺著,像睡著了一般巧涧。 火紅的嫁衣襯著肌膚如雪薯蝎。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,679評論 1 305
  • 那天褒侧,我揣著相機與錄音良风,去河邊找鬼。 笑死闷供,一個胖子當著我的面吹牛烟央,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播歪脏,決...
    沈念sama閱讀 40,406評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼疑俭,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了婿失?” 一聲冷哼從身側(cè)響起钞艇,我...
    開封第一講書人閱讀 39,311評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎豪硅,沒想到半個月后哩照,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,767評論 1 315
  • 正文 獨居荒郊野嶺守林人離奇死亡懒浮,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,945評論 3 336
  • 正文 我和宋清朗相戀三年飘弧,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片砚著。...
    茶點故事閱讀 40,090評論 1 350
  • 序言:一個原本活蹦亂跳的男人離奇死亡次伶,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出稽穆,到底是詐尸還是另有隱情冠王,我是刑警寧澤,帶...
    沈念sama閱讀 35,785評論 5 346
  • 正文 年R本政府宣布舌镶,位于F島的核電站柱彻,受9級特大地震影響豪娜,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜绒疗,卻給世界環(huán)境...
    茶點故事閱讀 41,420評論 3 331
  • 文/蒙蒙 一侵歇、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧吓蘑,春花似錦惕虑、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,988評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至琳猫,卻和暖如春伟叛,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背脐嫂。 一陣腳步聲響...
    開封第一講書人閱讀 33,101評論 1 271
  • 我被黑心中介騙來泰國打工统刮, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人账千。 一個月前我還...
    沈念sama閱讀 48,298評論 3 372
  • 正文 我出身青樓侥蒙,卻偏偏與公主長得像,于是被迫代替她去往敵國和親匀奏。 傳聞我的和親對象是個殘疾皇子鞭衩,可洞房花燭夜當晚...
    茶點故事閱讀 45,033評論 2 355

推薦閱讀更多精彩內(nèi)容