mxnet深度学习(KVS)
生活随笔
收集整理的這篇文章主要介紹了
mxnet深度学习(KVS)
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
mxnet深度學習(KVS)
分布式的鍵值對的存儲(Ditstributed Key-value Store)
KVStore是一個數據共享的地方。我們可以把它認為他是一個簡單的類橫跨不同的設備(GPUS和不同的機器),在這里設備將會壓入和提取數據。初始化
讓我們考慮一個簡單的例子:初始化一個(int,NDAarray)對用來存儲,然后把它的值再提取出來。 >>> 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.asnumpy() [[ 2. 2. 2.] [ 2. 2. 2.]] 我們把一個2x3的矩陣存在序號為3的地方,并把它從kv里面取出來。
壓入,聚合,更新
對于被初始化的鍵,我們可以壓入一個新值用相同的模型。
>>> kv.push(3, mx.nd.ones(shape)*8)
>>> kv.pull(3, out = a) # pull out the value
>>> print a.asnumpy()
[[ 8. 8. 8.]
[ 8. 8. 8.]] 用來壓入的數據可以來自于任何設備上。另外,我們可以壓入幾個值在同一個鍵上,在這里KVStore將首先把這些值加起來然后把這些聚合的值給壓入。
>>> gpus = [mx.gpu(i) for i in range(4)]
>>> b = [mx.nd.ones(shape, gpu) for gpu in gpus]
>>> kv.push(3, b)
>>> kv.pull(3, out = a)
>>> print a.asnumpy()
[[ 4. 4. 4.]
[ 4. 4. 4.]] 這里,我們生成了4個全為1的矩陣從4個gpu里面,然后把他們壓入到同一個鍵里面,因為被壓入4次,相當于被求和了4次,所以顯示的結果是每個元素都為4.
對于每次壓入,KVStore通過存儲在updater里面的值,把壓入值進行結合。默認的updater是ASSIGN,我們能取代默認的(ASSIGN)來控制控制數據的融合方式。
>>> 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()
[[ 4. 4. 4.]
[ 4. 4. 4.]]
>>> kv.push(3, mx.nd.ones(shape))
update on key: 3
>>> kv.pull(3, out=a)
>>> print a.asnumpy()
[[ 6. 6. 6.]
[ 6. 6. 6.]] 提取
我們早已看到怎么提取一個簡單的鍵值對了。為了簡化提取的過程,我們可以在一次調用中提取值到幾個設備里面 >>> 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.]] 處理一列的鍵值對 所有到目前為止的操作都是涉及了一個單一的鍵值對。KVStore也提供了一個接口對于一列的鍵值對。對于一個單一的設備:>>> keys = [5, 7, 9] >>> kv.init(keys, [mx.nd.ones(shape)]*len(keys)) >>> kv.push(keys, [mx.nd.ones(shape)]*len(keys)) update on key: 5 update on key: 7 update on key: 9 >>> b = [mx.nd.zeros(shape)]*len(keys) >>> kv.pull(keys, out = b) >>> print b[1].asnumpy() [[ 3. 3. 3.] [ 3. 3. 3.]] 對于多重設備來說 >>> 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.]]
總結
以上是生活随笔為你收集整理的mxnet深度学习(KVS)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 用HTML编写教学评估系统,在线教学质量
- 下一篇: C++对象数组与对象指针