背景私はインセプション-Resnet_v2とkerasを使用して病理像を予測したいマルチプロセッシングは、シングルGPU
と予測します。私はすでにモデルを訓練し、.hdf5ファイルを持っています。病理画像は非常に大きいので(例:20,000 x 20,000ピクセル)、画像をスキャンして予測用の小さなパッチを取得する必要があります。
私はpython2.7でマルチプロセッシングlibを使って予測手順を高速化したいと思います。主な考え方は、異なるサブプロセスを使用して異なる行をスキャンし、次にモデルにパッチを送信することです。
誰かがサブプロセスでケラスを読み込んでモデルを読み込むことをお勧めしました。しかし、私はそれが私の仕事に適しているとは思わない。 keras.models.load_model()
を使用したモデルのロードは約47秒かかるため、非常に時間がかかります。だから、私は新しいサブプロセスを開始するたびにモデルをリロードすることはできません。
質問
私の質問は、私は私のメインプロセスでモデルをロードし、サブプロセスにパラメータとして渡すことができますか?
私は2つの方法を試しましたが、どちらも機能しませんでした。
方法1。 multiprocessing.Pool
にコードを使用することです:
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()
出力は
cPickle.PicklingError: Can't pickle <type 'module'>: attribute lookup __builtin__.module failed
である私は、エラーを検索し、プールはunpickelableパラメータをマッピングすることはできません見つかったので、私は方法2
を試してみてください方法2。コードは、方法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()
あるmultiprocessing.Process
を使用すると、Iはdir(model)
を印刷することができます。モデルがサブプロセスに正常に渡されたことを意味すると思います。
- のUbuntu 16.04、パイソン2.7
- keras 2.0.8(tensorflowバックエンド)
- 1タイタン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
お待ちください!ありがとう!