Apache MXNet - KVStore dan Visualisasi
Bab ini membahas paket python KVStore dan visualisasi.
Paket KVStore
Toko KV adalah singkatan dari Key-Value store. Ini adalah komponen penting yang digunakan untuk pelatihan multi-perangkat. Ini penting karena, komunikasi parameter di seluruh perangkat pada satu atau beberapa mesin ditransmisikan melalui satu atau lebih server dengan KVStore untuk parameter.
Mari kita pahami cara kerja KVStore dengan bantuan poin-poin berikut:
Setiap nilai di KVStore diwakili oleh a key dan a value.
Setiap larik parameter dalam jaringan diberikan a key dan bobot dari parameter array tersebut dirujuk oleh value.
Setelah itu, pekerja akan menjadi node pushgradien setelah memproses batch. Mereka jugapull memperbarui bobot sebelum memproses kelompok baru.
Dengan kata sederhana, kita dapat mengatakan bahwa KVStore adalah tempat untuk berbagi data di mana, setiap perangkat dapat memasukkan dan menarik data keluar.
Data Push-In dan Pull-Out
KVStore dapat dianggap sebagai objek tunggal yang dibagikan di berbagai perangkat seperti GPU & komputer, di mana setiap perangkat dapat memasukkan dan menarik data keluar.
Berikut adalah langkah-langkah implementasi yang perlu diikuti oleh perangkat untuk mendorong dan menarik data keluar:
Langkah-langkah implementasi
Initialisation- Langkah pertama adalah menginisialisasi nilai. Di sini untuk contoh kita, kita akan menginisialisasi pasangan (int, NDArray) pasangan ke KVStrore dan setelah itu menarik nilainya -
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
Ini menghasilkan keluaran berikut -
[[2. 2. 2.]
[2. 2. 2.]
[2. 2. 2.]]
Push, Aggregate, and Update - Setelah diinisialisasi, kita dapat memasukkan nilai baru ke dalam KVStore dengan bentuk yang sama ke kunci -
kv.push(3, mx.nd.ones(shape)*8)
kv.pull(3, out = a)
print(a.asnumpy())
Output
Outputnya diberikan di bawah ini -
[[8. 8. 8.]
[8. 8. 8.]
[8. 8. 8.]]
Data yang digunakan untuk mendorong dapat disimpan di perangkat apa pun seperti GPU atau komputer. Kami juga dapat memasukkan beberapa nilai ke dalam kunci yang sama. Dalam hal ini, KVStore pertama-tama akan menjumlahkan semua nilai ini dan kemudian mendorong nilai gabungan sebagai berikut -
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
Anda akan melihat output berikut -
[[4. 4. 4.]
[4. 4. 4.]
[4. 4. 4.]]
Untuk setiap dorongan yang Anda terapkan, KVStore akan menggabungkan nilai yang didorong dengan nilai yang sudah disimpan. Ini akan dilakukan dengan bantuan pembaru. Di sini, pembaru default adalah 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())
Output
Ketika Anda menjalankan kode di atas, Anda akan melihat output berikut -
[[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
Diberikan di bawah ini adalah output dari kode -
update on key: 3
[[6. 6. 6.]
[6. 6. 6.]
[6. 6. 6.]]
Pull - Seperti halnya Push, kami juga dapat menarik nilai ke beberapa perangkat dengan satu panggilan sebagai berikut -
b = [mx.nd.ones(shape, ctx) for ctx in contexts]
kv.pull(3, out = b)
print(b[1].asnumpy())
Output
Outputnya dinyatakan di bawah ini -
[[6. 6. 6.]
[6. 6. 6.]
[6. 6. 6.]]
Contoh Implementasi Lengkap
Diberikan di bawah ini adalah contoh implementasi lengkap -
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())
Menangani Pasangan Nilai-Kunci
Semua operasi yang telah kami terapkan di atas melibatkan satu kunci, tetapi KVStore juga menyediakan antarmuka untuk a list of key-value pairs -
Untuk satu perangkat
Berikut adalah contoh untuk menampilkan antarmuka KVStore untuk daftar pasangan nilai kunci untuk satu perangkat -
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
Anda akan menerima output berikut -
update on key: 5
update on key: 7
update on key: 9
[[3. 3. 3.]
[3. 3. 3.]
[3. 3. 3.]]
Untuk banyak perangkat
Berikut adalah contoh untuk menampilkan antarmuka KVStore untuk daftar pasangan nilai kunci untuk beberapa perangkat -
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
Anda akan melihat output berikut -
update on key: 5
update on key: 7
update on key: 9
[[11. 11. 11.]
[11. 11. 11.]
[11. 11. 11.]]
Paket visualisasi
Paket visualisasi adalah paket Apache MXNet yang digunakan untuk merepresentasikan neural network (NN) sebagai grafik komputasi yang terdiri dari node dan edge.
Visualisasikan jaringan saraf
Pada contoh di bawah ini kami akan menggunakan mx.viz.plot_networkuntuk memvisualisasikan jaringan saraf. Berikut adalah prasyarat untuk ini -
Prerequisites
Notebook Jupyter
Perpustakaan Graphviz
Contoh Implementasi
Dalam contoh di bawah ini, kita akan memvisualisasikan sampel NN untuk faktorisasi matriks linier -
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)