Apache MXNet-KVStore 및 시각화

이 장에서는 파이썬 패키지 KVStore 및 시각화를 다룹니다.

KVStore 패키지

KV 스토어는 키-값 스토어를 의미합니다. 다중 장치 교육에 사용되는 중요한 구성 요소입니다. 단일 및 여러 시스템에있는 장치 간의 매개 변수 통신은 매개 변수에 대한 KVStore가있는 하나 이상의 서버를 통해 전송되기 때문에 중요합니다.

다음 사항을 통해 KVStore의 작동을 이해합시다.

  • KVStore의 각 값은 key 그리고 value.

  • 네트워크의 각 매개 변수 배열에는 key 해당 매개 변수 배열의 가중치는 value.

  • 그 후 작업자 노드 push배치 처리 후 그라디언트. 그들 또한pull 새 배치를 처리하기 전에 가중치를 업데이트했습니다.

간단히 말해서, KVStore는 각 장치가 데이터를 밀어 넣고 꺼낼 수있는 데이터 공유 공간이라고 말할 수 있습니다.

데이터 푸시 인 및 풀 아웃

KVStore는 GPU 및 컴퓨터와 같은 여러 장치에서 공유되는 단일 객체로 생각할 수 있으며, 여기서 각 장치는 데이터를 입력 및 추출 할 수 있습니다.

다음은 데이터를 밀어 넣고 꺼내기 위해 장치에서 따라야하는 구현 단계입니다.

구현 단계

Initialisation− 첫 번째 단계는 값을 초기화하는 것입니다. 여기 예제에서는 쌍 (int, NDArray) 쌍을 KVStrore로 초기화하고 그 후에 값을 가져옵니다.

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

이것은 다음과 같은 출력을 생성합니다-

[[2. 2. 2.]
[2. 2. 2.]
[2. 2. 2.]]

Push, Aggregate, and Update − 일단 초기화되면 키와 동일한 모양으로 KVStore에 새 값을 푸시 할 수 있습니다. −

kv.push(3, mx.nd.ones(shape)*8)
kv.pull(3, out = a)
print(a.asnumpy())

Output

출력은 다음과 같습니다.

[[8. 8. 8.]
 [8. 8. 8.]
 [8. 8. 8.]]

푸시에 사용되는 데이터는 GPU 또는 컴퓨터와 같은 모든 장치에 저장할 수 있습니다. 동일한 키에 여러 값을 넣을 수도 있습니다. 이 경우 KVStore는 먼저 이러한 값을 모두 합한 다음 집계 된 값을 다음과 같이 푸시합니다.

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

다음 출력이 표시됩니다.

[[4. 4. 4.]
 [4. 4. 4.]
 [4. 4. 4.]]

적용한 각 푸시에 대해 KVStore는 푸시 된 값을 이미 저장된 값과 결합합니다. 업데이트 프로그램의 도움으로 수행됩니다. 여기에서 기본 업데이트 프로그램은 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

위의 코드를 실행하면 다음 출력이 표시됩니다.

[[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

다음은 코드의 출력입니다.

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

Pull − Push와 마찬가지로 다음과 같이 단일 호출로 여러 장치에 값을 가져올 수도 있습니다.

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

Output

출력은 다음과 같습니다.

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

완전한 구현 예

다음은 완전한 구현 예입니다.

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())

키-값 쌍 처리

위에서 구현 한 모든 작업에는 단일 키가 포함되지만 KVStore는 a list of key-value pairs

단일 장치의 경우

다음은 단일 장치에 대한 키-값 쌍 목록에 대한 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())

Output

다음과 같은 출력을 받게됩니다.

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

여러 장치의 경우

다음은 여러 장치에 대한 키-값 쌍 목록에 대한 KVStore 인터페이스를 보여주는 예입니다.

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

다음 출력이 표시됩니다.

update on key: 5
update on key: 7
update on key: 9
[[11. 11. 11.]
 [11. 11. 11.]
 [11. 11. 11.]]

시각화 패키지

시각화 패키지는 노드와 에지로 구성된 계산 그래프로 신경망 (NN)을 나타내는 데 사용되는 Apache MXNet 패키지입니다.

신경망 시각화

아래 예에서 우리는 mx.viz.plot_network신경망을 시각화합니다. 다음은 이에 대한 전제 조건입니다-

Prerequisites

  • Jupyter 노트북

  • Graphviz 라이브러리

구현 예

아래 예에서는 선형 행렬 분해를위한 샘플 NN을 시각화합니다.

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)