GPU를 사용하여 (꽤 큰) 신경 네트워크를 훈련하려고합니다. 네트워크는 pytorch로 작성되었습니다. 우분투 16.04에서 실행되는 파이썬 3.6.3을 사용합니다. 현재 코드는 실행 중이지만 GPU를 사용하는 교육 과정에 CPU를 사용하여 데이터를 수집하는 프로세스가 연속적으로 실행되기 때문에 코드를 실행하는 데 약 2 배의 시간이 소요됩니다. 기본적으로 미니 배치 생성기를 사용하여 파일에서 미니 배치를 가져 와서 미니 배치를 GPU로 전송 한 다음 해당 미니 배치에서 네트워크를 교육합니다. 나는 미니 배치와 그 미니 배치에 대한 훈련을 잡아서 두 프로세스를 시간 측정했고, 그들이 얼마나 오래 걸리는지 (둘 다 약 200ms 소요) 비슷하다. 나는 케라의 fit_generator 메소드와 비슷한 것을하고 싶다. 훈련과 병렬로 데이터를 잡아내는 방법이다. GPU가 미니 배치를 배우고 싶을 때 GPU에 보낼 수있는 미니 바를 생성한다. 그렇게하는 가장 좋은 방법은 무엇입니까? 구체적으로는 데이터 생성기 코드와 교육 코드가 다음과 같이 실행됩니다 (의사 코드).병렬로 CPU와 GPU를 실행하여 신경 네트워크를 더 빠르게 훈련하는 방법
#This generator opens a file, grabs and yields a mini batch
def data_gen(PATH,batch_size=32):
with h5py.File(PATH,'r') as f:
for mini-batch in mini-batches:
X = f['X'][mini-batch]
Y = f['Y'][mini-batch]
yield (X,Y)
for epoch in range(epochs):
for data in data_gen(PATH):
mini_X,mini_Y = data
mini_X = autograd.Variable(torch.Tensor(mini_X))
mini_Y = autograd.Variable(torch.Tensor(mini_Y))
out = net(mini_X)
loss = F.binary_cross_entropy(out,mini_Y)
loss.backward()
optimizer.step()
이와 비슷한 기능이 있습니다. 보시다시피, for-loop의 실제 생성자로 data_gen을 사용하므로 훈련과 함께 순차적으로 실행됩니다. 병렬로 실행하고 내 네트워크로 피드 할 수있는 미니 바이트 큐를 생성하고 싶습니다. 현재, 하나의 신기원을 실행하는 데 5 시간 이상이 소요됩니다.이 병렬화 된 버전으로 생각하면 3 시간 이하로 줄일 수 있습니다. 파이썬에서 멀티 프로세싱을 들여다 보았지만, 병렬 컴퓨팅에 대한 이전의 경험이 제한되어 있기 때문에 공식 문서에 대한 설명은 다소 조밀했습니다. 내가 볼 수있는 자원이 있다면, 저 자원으로 나를 가리켜도 매우 도움이 될 것입니다! 감사.
정말이 모든 질문은 다음과 같이 단순화됩니다. 하나의 프로세스가 CPU 집약적이고 다른 프로세스가 GPU에서 계산되는 것과는 달리, 동시 프로세스를 파이썬에서 어떻게 관리 할 수 있습니까? 고맙습니다. https://stackoverflow.com/q/2846653/4013571 –
감사합니다. 나는 torch.multiprocessing 모듈을 발견했고 어제 그것을 시험해 보았습니다.하지만 GPU (메모리 오류가 발생하지 않았습니다)에서 메모리 오류가 발생했습니다. 그래서 뭔가 잘못하고있을 것입니다. – enumaris