Apache MXNet-분산 교육
이 장은 Apache MXNet의 분산 교육에 관한 것입니다. MXNet의 계산 모드가 무엇인지 이해하는 것으로 시작하겠습니다.
계산 모드
다국어 ML 라이브러리 인 MXNet은 사용자에게 다음 두 가지 계산 모드를 제공합니다.
명령형 모드
이 계산 모드는 NumPy API와 같은 인터페이스를 노출합니다. 예를 들어 MXNet에서 다음 명령형 코드를 사용하여 CPU와 GPU 모두에서 0의 텐서를 생성합니다.
import mxnet as mx
tensor_cpu = mx.nd.zeros((100,), ctx=mx.cpu())
tensor_gpu= mx.nd.zeros((100,), ctx=mx.gpu(0))
위의 코드에서 볼 수 있듯이 MXNet은 CPU 또는 GPU 장치에서 텐서를 보관할 위치를 지정합니다. 위의 예에서는 위치 0에 있습니다. MXNet은 모든 계산이 즉시가 아니라 느리게 발생하기 때문에 장치의 놀라운 활용도를 달성합니다.
심볼릭 모드
명령형 모드는 매우 유용하지만이 모드의 단점 중 하나는 강성입니다. 즉, 모든 계산이 미리 정의 된 데이터 구조와 함께 미리 알려 져야합니다.
반면에 Symbolic 모드는 TensorFlow와 같은 계산 그래프를 노출합니다. MXNet이 고정 / 미리 정의 된 데이터 구조 대신 기호 또는 변수로 작업 할 수 있도록하여 명령형 API의 단점을 제거합니다. 그 후, 기호는 다음과 같이 일련의 연산으로 해석 될 수 있습니다.
import mxnet as mx
x = mx.sym.Variable(“X”)
y = mx.sym.Variable(“Y”)
z = (x+y)
m = z/100
병렬 처리의 종류
Apache MXNet은 분산 교육을 지원합니다. 이를 통해 더 빠르고 효과적인 교육을 위해 여러 기계를 활용할 수 있습니다.
다음은 여러 장치, CPU 또는 GPU 장치에 걸쳐 NN 훈련 워크로드를 분산 할 수있는 두 가지 방법입니다.
데이터 병렬성
이러한 종류의 병렬 처리에서 각 장치는 모델의 전체 사본을 저장하고 데이터 세트의 다른 부분과 함께 작동합니다. 또한 장치는 공유 모델을 집합 적으로 업데이트합니다. 단일 시스템 또는 여러 시스템에서 모든 장치를 찾을 수 있습니다.
모델 병렬성
모델이 너무 커서 장치 메모리에 맞지 않을 때 유용한 또 다른 종류의 병렬 처리입니다. 모델 병렬화에서는 모델의 다른 부분을 학습하는 작업이 다른 장치에 할당됩니다. 여기서 주목해야 할 중요한 점은 현재 Apache MXNet이 단일 시스템에서만 모델 병렬 처리를 지원한다는 것입니다.
분산 교육 작업
아래에 주어진 개념은 Apache MXNet의 분산 교육 작업을 이해하는 데 핵심입니다.
프로세스 유형
프로세스는 모델 학습을 수행하기 위해 서로 통신합니다. Apache MXNet에는 다음 세 가지 프로세스가 있습니다.
노동자
작업자 노드의 역할은 훈련 샘플 배치에 대한 훈련을 수행하는 것입니다. 작업자 노드는 모든 배치를 처리하기 전에 서버에서 가중치를 가져옵니다. 작업자 노드는 배치가 처리되면 서버로 그라디언트를 보냅니다.
섬기는 사람
MXNet은 모델의 매개 변수를 저장하고 작업자 노드와 통신하기위한 여러 서버를 가질 수 있습니다.
스케줄러
스케줄러의 역할은 클러스터를 설정하는 것입니다. 여기에는 각 노드가 표시되는 메시지와 노드가 수신하는 포트를 기다리는 것이 포함됩니다. 클러스터를 설정 한 후 스케줄러는 모든 프로세스가 클러스터의 다른 모든 노드에 대해 알 수 있도록합니다. 프로세스가 서로 통신 할 수 있기 때문입니다. 스케줄러는 하나뿐입니다.
KV 스토어
KV 매장은 Key-Value저장. 다중 장치 교육에 사용되는 중요한 구성 요소입니다. 단일 및 여러 시스템의 장치 간 매개 변수 통신은 매개 변수에 대한 KVStore를 사용하여 하나 이상의 서버를 통해 전송되기 때문에 중요합니다. 다음 포인트의 도움으로 KVStore의 작동을 이해합시다-
KVStore의 각 값은 key 그리고 value.
네트워크의 각 매개 변수 배열에는 key 해당 매개 변수 배열의 가중치는 value.
그 후 작업자 노드 push배치 처리 후 그라디언트. 그들 또한pull 새 배치를 처리하기 전에 가중치를 업데이트했습니다.
KVStore 서버의 개념은 분산 학습 중에 만 존재하며 분산 모드는 호출을 통해 활성화됩니다. mxnet.kvstore.create 단어를 포함하는 문자열 인수가있는 함수 dist −
kv = mxnet.kvstore.create(‘dist_sync’)
키 배포
모든 서버가 모든 매개 변수 배열 또는 키를 저장할 필요는 없지만 서로 다른 서버에 분산되어 있습니다. 서로 다른 서버에 걸친 이러한 키 분배는 KVStore에 의해 투명하게 처리되며 특정 키를 저장하는 서버의 결정은 무작위로 이루어집니다.
위에서 설명한대로 KVStore는 키를 가져올 때마다 해당 값을 가진 해당 서버로 요청이 전송되도록합니다. 일부 키의 값이 크면 어떻게됩니까? 이 경우 다른 서버에서 공유 할 수 있습니다.
훈련 데이터 분할
사용자로서 우리는 특히 데이터 병렬 모드에서 분산 훈련을 실행할 때 각 머신이 데이터 세트의 다른 부분에서 작업하기를 원합니다. 단일 작업자에 대한 데이터 병렬 학습을 위해 데이터 반복자가 제공하는 샘플 배치를 분할하려면 다음을 사용할 수 있습니다.mxnet.gluon.utils.split_and_load 그런 다음 배치의 각 부분을 추가로 처리 할 장치에로드합니다.
반면에 분산 훈련의 경우 처음에는 데이터 세트를 n모든 작업자가 다른 부분을 갖도록 일단 획득하면 각 작업자는 다음을 사용할 수 있습니다.split_and_load데이터 세트의 해당 부분을 단일 머신의 여러 장치로 다시 나눕니다. 이 모든 것은 데이터 반복기를 통해 발생합니다.mxnet.io.MNISTIterator 과 mxnet.io.ImageRecordIter 이 기능을 지원하는 MXNet의 두 반복자입니다.
가중치 업데이트
가중치를 업데이트하기 위해 KVStore는 다음 두 가지 모드를 지원합니다.
첫 번째 방법은 그라디언트를 집계하고 해당 그라디언트를 사용하여 가중치를 업데이트합니다.
두 번째 방법에서는 서버가 그라디언트 만 집계합니다.
Gluon을 사용하는 경우 위에 언급 된 방법 중에서 선택할 수있는 옵션이 있습니다. update_on_kvstore변하기 쉬운. 그것을 만들어서 이해합시다trainer 다음과 같이 개체-
trainer = gluon.Trainer(net.collect_params(), optimizer='sgd',
optimizer_params={'learning_rate': opt.lr,
'wd': opt.wd,
'momentum': opt.momentum,
'multi_precision': True},
kvstore=kv,
update_on_kvstore=True)
분산 교육 모드
KVStore 생성 문자열에 단어 dist가 포함되어 있으면 분산 교육이 활성화되었음을 의미합니다. 다음은 다양한 유형의 KVStore를 사용하여 활성화 할 수있는 분산 교육의 다양한 모드입니다.
dist_sync
이름에서 알 수 있듯이 동기식 분산 교육을 나타냅니다. 여기에서 모든 작업자는 모든 배치 시작시 동일한 동기화 된 모델 매개 변수 집합을 사용합니다.
이 모드의 단점은 각 배치 후에 서버가 모델 매개 변수를 업데이트하기 전에 각 작업자로부터 그라디언트를 수신 할 때까지 기다려야한다는 것입니다. 즉, 작업자가 충돌하면 모든 작업자의 진행이 중단됩니다.
dist_async
이름에서 알 수 있듯이 동기식 분산 교육을 나타냅니다. 여기에서 서버는 한 작업자로부터 그라디언트를 수신하고 즉시 저장소를 업데이트합니다. 서버는 업데이트 된 저장소를 사용하여 추가 가져 오기에 응답합니다.
에 비해 장점 dist_sync mode, 배치 처리를 완료 한 작업자는 서버에서 현재 매개 변수를 가져와 다음 배치를 시작할 수 있습니다. 작업자는 다른 작업자가 이전 배치 처리를 아직 완료하지 않은 경우에도 그렇게 할 수 있습니다. 또한 동기화 비용없이 수렴하는 데 더 많은 epoch가 걸릴 수 있기 때문에 dist_sync 모드보다 빠릅니다.
dist_sync_device
이 모드는 dist_sync방법. 유일한 차이점은 모든 노드에서 여러 GPU가 사용되는 경우dist_sync_device 그래디언트를 집계하고 GPU에서 가중치를 업데이트하는 반면, dist_sync 그래디언트를 집계하고 CPU 메모리의 가중치를 업데이트합니다.
GPU와 CPU 간의 값 비싼 통신을 줄입니다. 그렇기 때문에dist_sync. 단점은 GPU에서 메모리 사용량이 증가한다는 것입니다.
dist_async_device
이 모드는 다음과 동일하게 작동합니다. dist_sync_device 모드이지만 비동기 모드입니다.