2017-12-11 5 views
0

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 시간 이하로 줄일 수 있습니다. 파이썬에서 멀티 프로세싱을 들여다 보았지만, 병렬 컴퓨팅에 대한 이전의 경험이 제한되어 있기 때문에 공식 문서에 대한 설명은 다소 조밀했습니다. 내가 볼 수있는 자원이 있다면, 저 자원으로 나를 가리켜도 매우 도움이 될 것입니다! 감사.

+0

정말이 모든 질문은 다음과 같이 단순화됩니다. 하나의 프로세스가 CPU 집약적이고 다른 프로세스가 GPU에서 계산되는 것과는 달리, 동시 프로세스를 파이썬에서 어떻게 관리 할 수 ​​있습니까? 고맙습니다. https://stackoverflow.com/q/2846653/4013571 –

+0

감사합니다. 나는 torch.multiprocessing 모듈을 발견했고 어제 그것을 시험해 보았습니다.하지만 GPU (메모리 오류가 발생하지 않았습니다)에서 메모리 오류가 발생했습니다. 그래서 뭔가 잘못하고있을 것입니다. – enumaris

답변

0

데이터 생성을 위해 스레드를 사용해야합니다. GPU가 교육을하는 동안 CPU가 데이터 생성 (일반적으로 로딩)을 처리하도록하는 것입니다. 즉, CPU 속도가 느려지지는 않습니다. 그것은 파일의 지속적인 읽기 및 쓰기입니다. 데이터 세트를 사용하는 경우 파일 시스템에서 연속 된 블록으로 파일을 복사하거나 추출해야합니다. 파일이 하드 드라이브에서 조각 모음되는 경우 사용중인 멀티 스레딩 메커니즘에 관계없이 병목 현상이 병목 현상이됩니다. SSD 하드 드라이브를 사용하면 눈에 띄지 않습니다.

+0

맞아요, 그 파일은 SSD에 비해 너무 큽니다 (저는 큰 SSD ㅎ을 가질 여유가 없습니다)하지만 벤치 마크에서 미니 배치를 잡았습니다. 그리고 그 GPU가 내 미니 GPU를 사용하는 것보다 더 짧은 시간이 걸립니다. 배치 (둘 다 각각 약 200ms). 내 신경망이 훨씬 작 으면 부하 데이터 부분이 병목 현상이됩니다. 즉, 멀티 스레딩에 대한 경험이 거의 없으므로이 프로세스를 멀티 스레드하는 가장 좋은 방법은 무엇인지 궁금합니다. – enumaris

+0

지금 스레딩에 대해 걱정할 필요가 없습니다. pyrotch에서 제공하는 데이터 로더를 사용할 수 있습니다. 데이터 로더는 스레딩을 처리합니다. 내 대답을 https://stackoverflow.com/a/45118712/7387369에서 확인하십시오. –