GPUでトレーニングに時間がかかるのはなぜですか?


10

詳細:

GPU:GTX 1080

トレーニング:10のクラスに属する約110万の画像

検証:10クラスに属する約150の画像

エポックごとの時間:〜10時間

CUDA、cuDNN、Tensorflow(Tensorflow GPUも)をセットアップしました。

私のモデルはエポックごとに10時間かかるほど複雑ではないと思います。私のGPUに問題があるかどうかも確認しましたが、問題はありませんでした。

完全に接続されたレイヤーによるトレーニング時間ですか?

私のモデル:

model = Sequential()
model.add()
model.add(Conv2D(64, (3, 3), padding="same", strides=2))
model.add(Activation('relu'))
model.add(Dropout(0.25))
model.add(Conv2D(64, (3, 3), padding="same", strides=2))
model.add(Activation('relu'))
model.add(Dropout(0.25))
model.add(Conv2D(32, (3, 3)))
model.add(Activation('relu'))
model.add(MaxPooling2D(pool_size=(3, 3), strides=2))
model.add(Flatten())
model.add(Dense(256))
model.add(Activation('relu'))
model.add(Dense(4096))
model.add(Activation('relu'))
model.add(Dense(10))
model.add(Activation('softmax'))

model.summary()

opt = keras.optimizers.rmsprop(lr=0.0001, decay=1e-6)

model.compile(loss='categorical_crossentropy',
          optimizer=opt,
          metrics=['accuracy']
          )

大量のデータがあるため、ImageDataGeneratorを使用しました。

gen = ImageDataGenerator(
 horizontal_flip=True
)

train_gen = gen.flow_from_directory(
        'train/',
        target_size=(512, 512),
        batch_size=5,
        class_mode="categorical"
)

valid_gen = gen.flow_from_directory(
        'validation/',
        target_size=(512, 512),
        batch_size=5,
        class_mode="categorical"
)

2
IMO、私はスタックオーバーフローし、これを移動するために投票したが、実際にそれはデータ科学・スタック交換に属している
generic_user

generic_user:「データサイエンス」は「機械学習」を使用できますが、すべての「機械学習」が「データサイエンス」用であるとは限りません。(MLは単なる別のツールであり、tensorflowは別のライブラリです。MLは、ユーザーの設定プロパティファイルの管理などの日常的なタスクにも使用される可能性があります(まだではない場合)。)
michael

(TL; DR:GPU、TFが提供できることを、GPUの統計を見上で実行して実際に確認してください)関連も参照stackoverflow.com/questions/42527492/...の stackoverflow.com/questions/38559755/...
マイケル・

私はそのアプローチを試しました、そしてそれは私の現在のGPUが使用されていると述べています。確認するために、nvidia-smiを使用してGPU使用率を確認したところ、85%から99%の間で変動しています。
Pradyumna Rahul、2018年

回答:


7

予想通りです。秒数を処理した画像の数で割ると、画像ごとに33ミリ秒が得られます。これは、このような小さなネットワークにはほぼ適切と思われます。大規模なネットワークでは、通常、画像ごとに50〜200ミリ秒の時間枠がかかります。

はい、それは巨大な行列(256 x 4096)であり、ネットワークを実行するたびにそれに伴う大規模な行列の乗算であるため、大きな高密度の層はパフォーマンスを低下させる可能性があります。


パフォーマンスを改善するために何を提案しますか?

4
1:バッチサイズを32または64に増やします。2:FCレイヤーのサイズをおそらく1024または2048ユニットに縮小し、それが役立つかどうかを確認します。3:早期停止。最初のエポックが終了する前に、ネットワークが収束したりオーバーフィットしたりする可能性があります。その場合は、トレーニングを少なくする必要があります。

エポックごとのステップを減らす必要がありますか?
Pradyumna Rahul、2018年

@shimao「トレーニングレス」とはどういう意味ですか?より少ないデータを使用することを意味しますか?
StatsSorceress

3

シマオが言ったように、それはあなたが期待することについてです。レイヤー数は多くありませんが、512x512の入力サイズは、畳み込むべき大きな画像です。完全に接続されたレイヤーではなく、大きな画像に対して64のフィルターを畳み込むため、計算時間が長くなる可能性があります。

ただし、作成したネットワークには、面白い情報のボトルネックがあります。元のサイズの画像で64のフィルターから開始し、画像サイズが縮小したときにのみ減少します。画像がネットワークを通過するにつれて、学習する機能がますます抽象化され、複雑になります。Conv2D(32、(3、3))レイヤーは、本質的にネットワークを32の特徴の128x128マップの学習に制限します。

ほとんどのネットワークアーキテクチャでは、プールするたびに機能の数が2倍になり、最新のimagenetアーキテクチャでは、完全に接続されたレイヤーを破棄して、最終的な機能マップよりも平均的なプールを優先し、基本的にそのプールの出力に対してロジスティック回帰を実行します。

より少ないフィルターから始めてみてください。たとえば、最初の畳み込みレイヤーで16とし、ストライドまたはプールするたびに2倍にします。受容野を増やし、フィーチャーマップのサイズを小さくするために、これをあなたよりも数回繰り返します。これを64x64または32x32まで下げます。これは128または256フィルターになります。KerasのGlobal AvgまたはMaxプーリングを使用して、完全に接続されたレイヤーを削除することもできます。これにより、ネットワークの速度が約2倍になるはずです。同時に、精度が向上することを期待しています。


さて、ネットワークアーキテクチャは、再現しようとしていた研究論文に基づいています。lirmm.fr/%7Echaumont/publications/...
Pradyumnaラーフル
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.