2016-07-04 4 views
3

신경 네트워크 라이브러리 인 Keras를 사용하여 thecano-multiprocessing과 함께 theano를 사용하려고합니다.theano와 멀티 프로세싱 사용

나는 device=gpu 플래그를 사용하고 케라 모델을로드합니다. 그런 다음 다중 이미지 풀을 사용하여 100 만 개가 넘는 이미지를 추출합니다.

기능은 다음과 같이 보입니다 :

from keras import backend as K 

f = K.function([model.layers[0].input, K.learning_phase()], [model.layers[-3].output,]) 

def feature_gen(flz): 
    im = imread(flz) 
    cPickle.dump(f([im, 0])[0][0], open(flz, 'wb'), -1) 

pool = mp.Pool(processes=10) 
results = [pool.apply_async(feature_gen, args=(f,)) for f in filelist]] 

이 그러나 GPU 메모리에 풀을 만드는 시작을 내 코드는 메모리 오류와 함께 실패합니다. CPU 메모리에 스레드를 생성하고 GPU가 포함 된 f([im, 0])[0][0]과 같은 특정 기능 추출을 위해 멀티 프로세싱을 강제 할 수 있습니까?

그렇지 않다면, 파이썬에서 같은 일을하는 대안이 있습니까?

답변

0

다른 프로세스가 keras를 사용하지 않으면 여러 프로세스를 사용할 수 있습니다. 지식이 있으면 keras를 단일 프로세스로 제한해야합니다. 이것은 모든 keras 클래스와 메소드를 포함하는 것 같습니다. 심지어 gpu를 사용하지 않는 것조차도 그렇습니다. ImageDataGenerator.

작업 부하가 GPU 제한적인 경우 프로세스 대신 스레드를 생성하는 스레딩 라이브러리를 사용할 수도 있습니다. GPU가 이전 배치를 처리하는 동안 데이터를로드하려면 제한이 적용되지 않습니다. 전역 인터프리터 잠금으로 인해 이는 CPU 제한된 환경에서의 해결책이 아닙니다.

상황이 평행 한 것처럼 보입니다. [GPU에서 작업을 읽고 쓰십시오]. 이것은 파이프 라인으로 개조 될 수있다. 일부 프로세스 읽기, GPU 작업을 수행하는 주 프로세스 및 일부 프로세스 쓰기. 큐는 입력/출력 개체 생성

  1. (threading.Queue 또는 multiprocessing.Queue)
  2. 배경 작업자 스레드를 생성 디스크로부터 데이터를 판독 배경 작업자 스레드/프로세스를 생성하고, 입력 큐
  3. 에 공급 디스크로 상기 출력 큐로부터 데이터를 기록/프로세스
  4. 출력 큐에 입력 큐로부터 데이터를 얻어 일괄 생성 GPU에서 데이터를 처리 채운다
  5. 메인 루프
관련 문제