質問するログイン新規登録

Q&A

1回答

1713閲覧

tensorflowでバッチサイズを下げて運用する方法

takugon92

総合スコア20

Python

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

0グッド

0クリップ

投稿2021/10/19 17:05

0

0

以下のサイトから超解像のプログラムを取得してきました.
https://github.com/Saafke/EDSR_Tensorflow

そのrun.pyのupscaleFromPb関数

python

1def upscaleFromPb(self, path): 2 """ 3 Upscale single image by desired model. This loads a .pb file. 4 """ 5 # Read model 6 pbPath = "./models/EDSR_x{}.pb".format(self.scale) 7 8 # Get graph 9 graph = self.load_pb(pbPath) 10 11 fullimg = cv2.imread(path, 3) 12 floatimg = fullimg.astype(np.float32) - self.mean 13 LR_input_ = floatimg.reshape(1, floatimg.shape[0], floatimg.shape[1], 3) 14 15 LR_tensor = graph.get_tensor_by_name("IteratorGetNext:0") 16 HR_tensor = graph.get_tensor_by_name("NHWC_output:0") 17 18 with tf.compat.v1.Session(graph=graph) as sess: 19 print("Loading pb...") 20 output = sess.run(HR_tensor, feed_dict={LR_tensor: LR_input_}) 21 Y = output[0] 22 HR_image = (Y + self.mean).clip(min=0, max=255) 23 HR_image = (HR_image).astype(np.uint8) 24 25 cv2.imwrite("./finish.jpg", HR_image) 26 cv2.destroyAllWindows() 27 28 sess.close()

のoutput = sess.run(HR_tensor, feed_dict={LR_tensor: LR_input_})部分で

error

1tensorflow.python.framework.errors_impl.ResourceExhaustedError: 2 root error(s) found. 2 (0) Resource exhausted: OOM when allocating tensor with shape[1,256,2480,3508] and type float on /job:localhost/replica:0/task:0/device:GPU:0 by allocator GPU_0_bfc 3 [[node Conv2D (defined at D:\Downloads\EDSR_Tensorflow-master\EDSR_Tensorflow-master\run.py:224) ]] 4Hint: If you want to see a list of allocated tensors when OOM happens, add report_tensor_allocations_upon_oom to RunOptions for current allocation info. This isn't available when running in Eager mode. 5

が発生します.

https://qiita.com/enoughspacefor/items/1c09a27877877c56f25aの方が,同じエラーでバッチサイズを小さくするとあるのですが,どの部分がバッチサイズに当たるのかわかりません.またバッチサイズを小さくするとfor文などで,繰り返しsess.runを行わないといけないのでしょうか.

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

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

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

guest

回答1

0

解説

Extra arguments (Nr of resblocks, filters, batch, lr etc.) python main.py --help

とあります。

これは「エキストラ引数(resblockの数、フィルタ、バッチ、学習率など)はpython main.py --helpで確認できます。」の意味です。

Python3

1# main.py 2parser.add_argument('--batch', type=int, help='Batch size of the training', default=16)

とありますので、python main.py --batch 4のようにすれば標準の16よりも小さいバッチで動かせます。これでOOMは防げそうですね。

投稿2021/10/19 21:29

退会済みユーザー

退会済みユーザー

総合スコア0

takugon92

2021/10/20 01:36

ありがとうございます. こちらの説明不足でした. python main.py --batchの指定は学習をさせる際には有効なのですが,私がエラーが出ているのは,画像ファイルを学習済みデータを使って超解像を試しているときに出ています. このとき使っているのがupscaleFromPb(self, path)なんですが,ここには--batchで指定した数値が効いて来ないみたいです. 400x400の小さい画像ならできたので,3508x2480の大きい画像で試してみたらエラーが出るようになりました.
退会済みユーザー

退会済みユーザー

2021/10/20 13:30 編集

400x400,600x600,800x800,1000x1000といった具合で画像サイズとメモリの使用量を散布図にしてはいかがでしょうか?恐らく指数関数的にメモリを喰うはずなので3000x2000だとOOMが起きる、は十分あると思います。 …このモデルには詳しくないですが、普通trainの時にはbachは有効ですが、Estimateのbatchは(複数枚を同時にEstimateする場合を除き)普通1で処理されます。 参考:TITAN X (12GB)でも3000x2000クラスはOOMするらしいです。 https://github.com/clovaai/cutblur/issues/4
退会済みユーザー

退会済みユーザー

2021/10/20 13:34

やったことはないですが、ムリにNNで解像度を上げるより、画像を分割してそれぞれアップスケーリングなんてどうなんでしょうね。継ぎ目が荒れちゃうかも知れませんが…
takugon92

2021/10/20 17:36

ありがとうございます.まさに仰るとおり800x800以降でOOMが発生しました. タイタンでも発生するのですね.2080Sなので無論発生しますね. GPUを使わず,CPUで無理やり引っ張ると(CPU,メモリ使用率共に100%),ryzen9 3950xと2080Sの組み合わせで,3000x2000はギリギリ解像度を上げることができました. 3508x2480ですと,途中でエラーも発生せず止まりました↓ https://teratail.com/questions/91121 画像を分割してそれぞれアップスケーリングなんてどうなんでしょうね。 ⇒やはりこの方法しかなさそうですね.確かにつなぎ目が荒れるかもしれませんが一度やってみます. 相談に乗ってくださり,ありがとうございました.
takugon92

2021/10/22 13:43

分割し,実行してみました. つなぎ目のあれなど特になく,超解像で4倍にアップスケーリングできました. ありがとうございました
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

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

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

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

ただいまの回答率
85.29%

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

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

質問する

関連した質問