Apache MXNet - KVStore ve Görselleştirme
Bu bölüm python paketleri KVStore ve görselleştirme ile ilgilidir.
KVStore paketi
KV mağazaları, Anahtar-Değer deposu anlamına gelir. Çoklu cihaz eğitimi için kullanılan kritik bir bileşendir. Bu önemlidir, çünkü parametrelerin tek tek ve birden çok makinedeki cihazlar arasında iletişimi, parametreler için bir KVStore ile bir veya daha fazla sunucu üzerinden iletilir.
Aşağıdaki noktaların yardımıyla KVStore'un çalışmasını anlayalım:
KVStore'daki her bir değer, bir key ve bir value.
Ağdaki her parametre dizisine bir key ve bu parametre dizisinin ağırlıkları, value.
Bundan sonra, işçi düğümleri pushbir partiyi işledikten sonra degradeler. Onlar ayrıcapull yeni bir partiyi işlemeden önce güncellenmiş ağırlıklar.
Basit bir ifadeyle, KVStore'un her bir cihazın verileri içeri itip veri çekebildiği bir veri paylaşımı yeri diyebiliriz.
Veri İtme ve Çıkarma
KVStore, GPU'lar ve bilgisayarlar gibi farklı cihazlar arasında paylaşılan tek bir nesne olarak düşünülebilir, burada her bir cihaz veri içeri itebilir ve veri çekebilir.
Aşağıda, verileri içeri itmek ve verileri dışarı çekmek için cihazların izlemesi gereken uygulama adımları verilmiştir:
Uygulama adımları
Initialisation- İlk adım, değerleri sıfırlamaktır. Burada örneğimiz için, bir çift (int, NDArray) çiftini KVStrore'a başlatacağız ve bundan sonra değerleri dışarı çekeceğiz -
import mxnet as mx
kv = mx.kv.create('local') # create a local KVStore.
shape = (3,3)
kv.init(3, mx.nd.ones(shape)*2)
a = mx.nd.zeros(shape)
kv.pull(3, out = a)
print(a.asnumpy())
Output
Bu, aşağıdaki çıktıyı üretir -
[[2. 2. 2.]
[2. 2. 2.]
[2. 2. 2.]]
Push, Aggregate, and Update - Bir kez başlatıldığında, KVStore'a yeni bir değeri anahtara aynı şekle sokabiliriz -
kv.push(3, mx.nd.ones(shape)*8)
kv.pull(3, out = a)
print(a.asnumpy())
Output
Çıktı aşağıda verilmiştir -
[[8. 8. 8.]
[8. 8. 8.]
[8. 8. 8.]]
İtme için kullanılan veriler, GPU'lar veya bilgisayarlar gibi herhangi bir cihazda saklanabilir. Aynı anahtara birden fazla değer de itebiliriz. Bu durumda, KVStore önce tüm bu değerleri toplayacak ve ardından birleştirilmiş değeri aşağıdaki gibi aktaracaktır -
contexts = [mx.cpu(i) for i in range(4)]
b = [mx.nd.ones(shape, ctx) for ctx in contexts]
kv.push(3, b)
kv.pull(3, out = a)
print(a.asnumpy())
Output
Aşağıdaki çıktıyı göreceksiniz -
[[4. 4. 4.]
[4. 4. 4.]
[4. 4. 4.]]
Uyguladığınız her gönderim için KVStore, itilen değeri önceden depolanan değerle birleştirir. Bir güncelleyici yardımı ile yapılacaktır. Burada varsayılan güncelleyici ASSIGN'dır.
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())
Output
Yukarıdaki kodu çalıştırdığınızda, aşağıdaki çıktıyı görmelisiniz -
[[4. 4. 4.]
[4. 4. 4.]
[4. 4. 4.]]
Example
kv.push(3, mx.nd.ones(shape))
kv.pull(3, out=a)
print(a.asnumpy())
Output
Aşağıda verilen kodun çıktısıdır -
update on key: 3
[[6. 6. 6.]
[6. 6. 6.]
[6. 6. 6.]]
Pull - Push gibi, değeri tek bir aramayla birkaç cihaza aşağıdaki gibi çekebiliriz -
b = [mx.nd.ones(shape, ctx) for ctx in contexts]
kv.pull(3, out = b)
print(b[1].asnumpy())
Output
Çıktı aşağıda belirtilmiştir -
[[6. 6. 6.]
[6. 6. 6.]
[6. 6. 6.]]
Eksiksiz Uygulama Örneği
Aşağıda tam uygulama örneği verilmiştir -
import mxnet as mx
kv = mx.kv.create('local')
shape = (3,3)
kv.init(3, mx.nd.ones(shape)*2)
a = mx.nd.zeros(shape)
kv.pull(3, out = a)
print(a.asnumpy())
kv.push(3, mx.nd.ones(shape)*8)
kv.pull(3, out = a) # pull out the value
print(a.asnumpy())
contexts = [mx.cpu(i) for i in range(4)]
b = [mx.nd.ones(shape, ctx) for ctx in contexts]
kv.push(3, b)
kv.pull(3, out = a)
print(a.asnumpy())
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())
b = [mx.nd.ones(shape, ctx) for ctx in contexts]
kv.pull(3, out = b)
print(b[1].asnumpy())
Anahtar / Değer Çiftlerini İşleme
Yukarıda uyguladığımız tüm işlemler tek bir anahtar içerir, ancak KVStore ayrıca a list of key-value pairs -
Tek bir cihaz için
Aşağıda, tek bir cihaz için anahtar / değer çiftlerinin bir listesi için bir KVStore arayüzünü gösteren bir örnek verilmiştir -
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())
Output
Aşağıdaki çıktıyı alacaksınız -
update on key: 5
update on key: 7
update on key: 9
[[3. 3. 3.]
[3. 3. 3.]
[3. 3. 3.]]
Birden çok cihaz için
Aşağıda, birden çok cihaz için anahtar / değer çiftlerinin bir listesi için bir KVStore arayüzünü gösteren bir örnek verilmiştir -
b = [[mx.nd.ones(shape, ctx) for ctx in contexts]] * len(keys)
kv.push(keys, b)
kv.pull(keys, out = b)
print(b[1][1].asnumpy())
Output
Aşağıdaki çıktıyı göreceksiniz -
update on key: 5
update on key: 7
update on key: 9
[[11. 11. 11.]
[11. 11. 11.]
[11. 11. 11.]]
Görselleştirme paketi
Görselleştirme paketi, sinir ağını (NN) düğümlerden ve kenarlardan oluşan bir hesaplama grafiği olarak temsil etmek için kullanılan Apache MXNet paketidir.
Sinir ağını görselleştirin
Aşağıdaki örnekte kullanacağız mx.viz.plot_networksinir ağını görselleştirmek için. Bunun ön koşulları aşağıdakilerdir -
Prerequisites
Jupyter not defteri
Graphviz kütüphanesi
Uygulama Örneği
Aşağıdaki örnekte, doğrusal matris faktörizasyonu için örnek bir NN görselleştireceğiz -
import mxnet as mx
user = mx.symbol.Variable('user')
item = mx.symbol.Variable('item')
score = mx.symbol.Variable('score')
# Set the dummy dimensions
k = 64
max_user = 100
max_item = 50
# The user feature lookup
user = mx.symbol.Embedding(data = user, input_dim = max_user, output_dim = k)
# The item feature lookup
item = mx.symbol.Embedding(data = item, input_dim = max_item, output_dim = k)
# predict by the inner product and then do sum
N_net = user * item
N_net = mx.symbol.sum_axis(data = N_net, axis = 1)
N_net = mx.symbol.Flatten(data = N_net)
# Defining the loss layer
N_net = mx.symbol.LinearRegressionOutput(data = N_net, label = score)
# Visualize the network
mx.viz.plot_network(N_net)