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)