배경 내가 셉션 - Resnet_v2와 keras를 사용하여 병리 이미지를 예측 할멀티 단일 GPU
으로 예측하고있다. 나는 이미 모델을 훈련했고 .hdf5 파일을 가지고있다. 병리학 이미지가 매우 크기 때문에 (예 : 20,000 x 20,000 픽셀) 이미지를 스캔하여 예측을위한 작은 패치를 얻어야합니다.
python2.7과 함께 다중 처리 lib를 사용하여 예측 절차를 빠르게하고 싶습니다. 주요 아이디어는 서로 다른 서브 프로세스를 사용하여 다른 라인을 스캔 한 다음 모델에 패치를 보내는 것입니다.
나는 누군가가 케라를 가져오고 서브 프로세스에서 모델을로드하는 것을 제안했다. 그러나 나는 그것이 내 일에 적합하다고 생각하지 않는다. keras.models.load_model()
을 사용하여 모델을 한 번로드하는 데 약 47 초가 걸리므로 시간이 많이 걸립니다. 따라서 새 하위 프로세스를 시작할 때마다 모델을 다시로드 할 수 없습니다.
질문
내 질문은 내가 내 주요 프로세스 모델을로드하고 하위 프로세스 매개 변수로 전달할 수있다?
두 가지 방법을 시도했지만 둘 다 작동하지 않았습니다.
방법 1.
이import keras
from keras.models import load_model
import multiprocessing
def predict(num,model):
print dir(model)
print num
model.predict("image data, type:list")
if __name__ == '__main__':
model = load_model("path of hdf5 file")
list = [(1,model),(2,model),(3,model),(4,model),(5,model),(6,model)]
pool = multiprocessing.Pool(4)
pool.map(predict,list)
pool.close()
pool.join()
출력은 내가 오류를 검색하고 풀 unpickelable 매개 변수를 매핑 할 수 없습니다 발견
cPickle.PicklingError: Can't pickle <type 'module'>: attribute lookup __builtin__.module failed
, 그래서 방법 2.
시도 : multiprocessing.Pool코드를 사용하다
방법 2. multiprocessing.Process
를 사용코드는 내가 dir(model)
을 인쇄 할 수 있습니다, 방법 2에서
import keras
from keras.models import load_model
import multiprocessing
def predict(num,model):
print num
print dir(model)
model.predict("image data, type:list")
if __name__ == '__main__':
model = load_model("path of hdf5 file")
list = [(1,model),(2,model),(3,model),(4,model),(5,model),(6,model)]
proc = []
for i in range(4):
proc.append(multiprocessing.Process(predict, list[i]))
proc[i].start()
for i in range(4):
proc[i].join()
입니다. 모델이 서브 프로세스에 성공적으로 전달되었음을 의미한다고 생각합니다.
- 우분투 16.04, 파이썬 2.7
- keras 2.0.8 (tensorflow 백엔드)
- 한 타이탄 X, 드라이버 버전 384.98 :하지만
E tensorflow/stream_executor/cuda/cuda_driver.cc:1296] failed to enqueue async memcpy from host to device: CUDA_ERROR_NOT_INITIALIZED; GPU dst: 0x13350b2200; host src: 0x2049e2400; size: 4=0x4
내가 사용하는 환경이 오류가 발생했습니다 , CUDA 8.0
회신을 고대하고 있습니다! 감사!