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)