2017-05-11 13 views
0

ラップトップにGPUカードがないため、クラウド(Google Cloud ML)でCNNを実行しようとしています。クラウドMLでTensorflowのデキューが非常に遅い

Google Cloud Storageにデータをアップロードしました。次のような1500エントリの.csvファイル。

| label | img_path | 
    | label_1| /img_1.jpg | 
    | label_2| /img_2.jpg | 

と対応する1500 jpgs。

マイinput_fnはそうのようになります。ここでは

def input_fn(filename, 
     batch_size, 
     num_epochs=None, 
     skip_header_lines=1, 
     shuffle=False): 
filename_queue = tf.train.string_input_producer(filename, num_epochs=num_epochs) 
reader = tf.TextLineReader(skip_header_lines=skip_header_lines) 
_, row = reader.read(filename_queue) 
row = parse_csv(row) 
pt = row.pop(-1) 
pth = filename.rpartition('/')[0] + pt 
img = tf.image.decode_jpeg(tf.read_file(tf.squeeze(pth)), 1) 
img = tf.to_float(img)/255. 
img = tf.reshape(img, [IMG_SIZE, IMG_SIZE, 1]) 
row = tf.concat(row, 0) 
if shuffle: 
    return tf.train.shuffle_batch(
     [img, row], 
     batch_size, 
     capacity=2000, 
     min_after_dequeue=2 * batch_size + 1, 
     num_threads=multiprocessing.cpu_count(), 
    ) 
else: 
    return tf.train.batch([img, row], 
          batch_size, 
          allow_smaller_final_batch=True, 
          num_threads=multiprocessing.cpu_count()) 

は、完全なグラフが(確かに非常に簡単なCNN)次のようになります。 Full graph

はその後、ほとんどの、200のバッチサイズでトレーニングを実行しますラップトップの計算時間(私のラップトップでは、データはローカルに保存されています)は、私が期待しているグラデーションノードに費やされます。バッチ・ノードの計算時間は約12msです。

私がクラウド上で実行すると(スケール層はBASIC)、バッチノードは20秒以上かかります。そして、ボトルネックはtensorboardに応じQueueDequeueUpToV2サブノードから来ているようだ:

Inside the batch node, QueueDequeueUpToV2

誰もが、これはなぜ起こるか任意の手掛かりを持っていますか?私はここで間違っていると確信していますので、私は喜んで学ぶでしょう。

いくつかの注意点: - 異なるmin_after_dequeueを持つバッチ/シャッフルバッチ間のマージは影響しません。 - BASIC_GPUを使用している場合、バッチノードもCPU上にあります。これは、読んだことで正常ですが、およそ13秒かかります。 - キューが開始された後にstar.saveを追加すると、スタベーションがないことも保証されません。 - 計算時間は実際にはbatch_sizeでは直線的です。したがって、batch_sizeが50の場合、計算時間はbatch_sizeの200よりも4倍小さくなります。

誰もが必要な場合はお読みいただきありがとうございます。

ベスト、 アル

更新:

-Cloud MLインスタンスとバケットは、同じ領域に改善結果4倍にそれらを作る、同じ領域ではありませんでした。

- .tfrecordsファイルを作成するとバッチ処理に70msかかることがありました。私はそれを学ぶための出発点として、このblogポストを使用しました、私はそれをお勧めします。

これは、他の人が高速データ入力パイプラインを作成するのに役立つことを願っています。

+0

を使用して

あなたはより多くの並列処理やファイル間の例のシャッフルが必要な場合には、複数のリーダーのインスタンスを使用します。Tensorflowドキュメントで

最初? –

+0

クラウドストレージからクラウドmlインスタンスまでを意味しますか? –

+0

Yaroslavのコメントを拡大すると、ラップトップでコードを実行してみることができますが、GCSからファイルを読み込むことができます。それはあなたが雲の中で見るものともっとインラインでなければなりません。たくさんのデータがない場合は、Yaroの言うことを行い、スクリプトの初めにファイルをローカルにコピーしてください。 – rhaertel80

答えて

3

画像をtfrecord形式に変換し、グラフから直接読み取ってみてください。あなたがやっているやり方は、キャッシングの可能性がなく、あなたのイメージが小さい場合は、クラウドストレージからの高い持続性の読み込みを利用していません。すべてのjpgイメージをtfrecordファイルまたは少数のファイルに保存すると役立ちます。

また、バケットがgpusを持つ地域内の単一地域バケットで、その地域にcloudmlに送信していることを確認してください。

0

私は以前も同様の問題があります。私はtf.train.batch()をtf.train.batch_join()に変更して解決しました。私の実験では、64個のバッチサイズと4個のGPUを使って、tf.train.batch_join()を使って2分しかかかりませんでしたが、tf.train.batch()を使って22分かかりました。おそらく、ローカルディスクにデータをコピーtf.train.shuffle_batch_join

https://www.tensorflow.org/programmers_guide/reading_data

関連する問題