Kerasで学習して保存したモデルを用いて予測を行なっています。
約5000枚の画像を予測させます。
1枚あたりCPUで0.25秒かかります。ですので全部で20分かかる計算になります。
これをどうにかして1分にしたいです。
考えられるアイディアとしてスレッド処理やマルチプロセス処理だと思います。
以下のコードはマルチプロセス処理を記述したコードになります。
Python
1 2def splitf(f_lst,n): 3 n = int((len(f_lst)-1)/n)+1 4 return [f_lst[x:x + n] for x in range(0, len(f_lst), n)] 5 6 7def predict(f_lst): 8 model = load_model('model path') 9 for i,f in enumerate(f_lst): 10 img = load_img('file path, target_size=(224,224)) 11 array = img_to_array(img) 12 x = np.expand_dims(array, axis=0) 13 x = preprocess_input(x) 14 ret = model.predict(x) 15 return 1 16 17def usemulti(job, fsplit): 18 p = Pool(multi.cpu_count() if job < 0 else job) 19 result = p.map(predict, fsplit) 20 p.close() 21 return result 22 23def main(): 24 files = sorted(os.listdir('filepath')) 25 fsplit = splitf(files,12) 26 start = time.time() 27 res = usemulti(144, fsplit) 28 elapsed_time = time.time() - start 29 print(res) 30 print(elapsed_time) 31 32if __name__ == '__main__': 33 main()
これは予測させる画像のリストを12分割してマルチプロセス処理を行なっています。
これを実行した結果少ししか早くなりませんでした。ある地点から分割数が増えるほど
時間がかかってしまっている状況です。どこがネックになっているのかが分からない状況です。
モデルのファイルサイズが300MB近くあるためそこで何かしらうまくマルチプロセスがされていない
ような気がしています。どこに原因があるのでしょうか?また、その他この問題を解決できるような
アイデアがあれば教えて欲しいです。