質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
MPI

MPIは、並列プログラミングを利用するための標準化規格、及び実装自体のことを指します。バイト列で構成されたメッセージとして、いくつかのCPUが情報を送受信することにより協調動作を可能にします。

Keras

Kerasは、TheanoやTensorFlow/CNTK対応のラッパーライブラリです。DeepLearningの数学的部分を短いコードでネットワークとして表現することが可能。DeepLearningの最新手法を迅速に試すことができます。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

1回答

13144閲覧

Keras TensorFlow predictに時間がかかるのでスレッド処理やマルチプロセス処理でなんとかしたい

_Victorique__

総合スコア1392

MPI

MPIは、並列プログラミングを利用するための標準化規格、及び実装自体のことを指します。バイト列で構成されたメッセージとして、いくつかのCPUが情報を送受信することにより協調動作を可能にします。

Keras

Kerasは、TheanoやTensorFlow/CNTK対応のラッパーライブラリです。DeepLearningの数学的部分を短いコードでネットワークとして表現することが可能。DeepLearningの最新手法を迅速に試すことができます。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

0グッド

0クリップ

投稿2018/07/19 05:27

編集2018/07/19 05:50

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近くあるためそこで何かしらうまくマルチプロセスがされていない
ような気がしています。どこに原因があるのでしょうか?また、その他この問題を解決できるような
アイデアがあれば教えて欲しいです。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

hayataka2049

2018/07/19 05:40 編集

コア数・スレッド数がいくつのマシンなんですか?12分割ということは、6コア12スレッドという理解でいいですか
_Victorique__

2018/07/19 05:45

36コアです。スレッド数はちょっと分からないです。ファイル数を12分割しているということです。コードのmapという部分でファイル分割数の数だけpredict関数をプロセスにしているという認識です。
tachikoma

2018/07/19 05:53

修正前(マルチプロセスじゃないほう)のpredictだとCPU使用率どのくらいになってます?
_Victorique__

2018/07/19 05:58 編集

> tachikoma 使用率を調べられないような環境なのでちょっと回答が難しいです。 ちなみにCPUは2つあり、合わせて36コアです。
_Victorique__

2018/07/19 06:00

分割数が増えるにしたがってkerasのpredict関数の実行速度が遅くなっています。
tachikoma

2018/07/19 06:11 編集

KerasのバックエンドであるTensorflow等は、複数コアのCPUリソースを使い切るような実装になっているので、マルチプロセスにするとCPUリソースの競合が起きてしまい、かえって遅くなってる気がします。予想ですが。
_Victorique__

2018/07/19 06:12

> tachikoma それはマルチCPUでも同じでしょうか?
tachikoma

2018/07/19 06:18

マルチCPUのは触ったことがないので分からないです。
wakame

2018/07/19 14:44

なぜ1枚ずつmodel.predictしているのでしょうか?そちらのほうが処理が早かったのですか。あとpredict関数(自作)が呼ばれるたびにモデルロードされるみたいですけど想定した処理ですか?一回モデルロードするだけで良い気がしますが。
wakame

2018/07/19 14:49

> 1枚あたりCPUで0.25秒かかります。これは画像1枚あたりのmodel.predictのみの処理時間のことですか?load_img, img_to_array, np.expand_dims, preprocess_inputを含めた画像1枚あたりの処理時間のことを言っていますか。
_Victorique__

2018/07/19 15:12

> なぜ1枚ずつmodel.predictしているのか → 複数枚でやるやり方が分かりません。教えていただけると嬉しいです。 predict関数(自作)が呼ばれるたびにモデルロードされるみたいですけど想定した処理ですか → 想定した処理です。マルチプロセス実行のためにモデルをロードしています。 1枚あたりCPUで0.25秒かかります。これは画像1枚あたりのmodel.predictのみの処理時間のことですか → そうです。それ以外の処理はpredictに比べれば微々たる時間でした。
guest

回答1

0

修正すべきはpredict関数内でmodelをloadしているところですね。
modelのロードは一度だけで大丈夫です。modelを毎度構築するのは計算リソースの無駄ですので。
一度ロードしたmodelを別途参照すればよいです。関数の引数渡すなり、globalで定義するなり、Classのメンバ変数に定義するなり。

そうすればmulti-processにせずとも1分で終わると思いますよ。(大きいmodelだと無理かもしれない)
あとはMiniBatch推論にしても良いです。
5000枚のデータを適当なChunkSizeに分割して一気に推論しましょう。

あとTensorFlowはFork-Safeではないので、Multi-processで実行するとうまく動作しない場合があります。

投稿2018/07/27 05:07

編集2018/07/27 05:10
miumiu0917

総合スコア12

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

_Victorique__

2018/07/27 06:46

回答有難うございます。 multi-processingするにあたってTensorFlowのモデルは_thread.lock objects扱いなので参照できないはずですがどのようにして参照するのでしょうか?あと、参照ができたとしてもmultiprocessingの意味がないと思うのですがどうでしょうか?
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問