GPU'mda eğitim neden bu kadar uzun sürüyor?


10

Detaylar:

Grafik işlemcisi : GTX 1080

Eğitim : 10 sınıfa ait ~ 1.1 Milyon görüntü

Doğrulama : 10 sınıfa ait ~ 150 Bin resim

Dönem Başına Süre : ~ 10 saat

CUDA, cuDNN ve Tensorflow'u (Tensorflow GPU da) kurdum.

Modelimin, çağ başına 10 saat süren karmaşık olduğunu düşünmüyorum. Hatta GPU'mun sorun olup olmadığını kontrol ettim ama değildi.

Eğitim süresi Tamamen bağlı katmanlardan mı kaynaklanıyor?

Benim modelim:

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']
          )

Çok fazla veri olduğundan ImageDataGenerator kullandım.

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
Bunu taşma yığınına taşımak için oy verdim, ancak gerçekten veri bilimi yığın değişimi, IMO'ya ait
generic_user

generic_user: "veri bilimi" "makine öğrenimi" kullanabilir, ancak "makine öğrenimi" nin tamamı "veri bilimi" için değildir. (ML sadece başka bir araçtır, sadece başka bir kütüphane tensorflow; ML yakında (zaten değilse) kullanıcı tercihi özellik dosyalarını yönetme gibi sıradan görevler için bile kullanılabilir.)
michael

Ayrıca, ilgili (tl; dr: gpu üzerinde çalışan aslında doğrulamak, gpu göstergelerini göz tf sağlayabileceği) bakınız stackoverflow.com/questions/42527492/... stackoverflow.com/questions/38559755/...
michael

Bu yaklaşımı denedim ve mevcut GPU'mun kullanıldığını belirtiyor. Onaylamak için GPU kullanımını kontrol etmek için nvidia-smi kullandım ve% 85-% 99 arasında değişiyor.
Pradyumna Rahul

Yanıtlar:


7

Bu beklenen bir şey. Saniye sayısını işlediğiniz görüntü sayısına böldüğünüzde, görüntü başına 33 milisaniye alırsınız, bu da böyle küçük bir ağ için doğru gibi görünüyor. Daha büyük ağlar genellikle görüntü başına 50 ila 200 milisaniyelik ballparkta yer alır.

Evet, büyük yoğun bir katmanın performansınıza zarar vermesi muhtemeldir, çünkü bu, ağı her çalıştırdığınızda devam etmek için büyük bir matris (256 x 4096) ve büyük bir matris çarpımıdır.


Performansı artırmak için ne önerirsiniz?

4
1: parti boyutunu 32 veya 64'e yükseltin. 2: FC katmanının boyutunu belki 1024 veya 2048 birime küçültün ve yardımcı olup olmadığını görün. 3: Erken durma. İlk çağınızı bitirmeden önce ağınızın yakınsaması veya aşırı sığmaya başlaması mümkündür, bu durumda daha az eğitim almalısınız.

Dönem başına adımları azaltmalı mıyım?
Pradyumna Rahul

@shimao "daha az tren" ile ne demek istediniz? Daha az veri mi demek istiyorsun?
İstatistiklerSorceress

3

Shimao'nun dediği gibi, bu beklediğinizle ilgilidir. Çok fazla katmana sahip olmamasına rağmen, 512x512 boyutlarında bir giriş boyutu, eğri olacak büyük bir görüntüdür. Büyük hesaplama süresi, büyük olasılıkla, tamamen bağlı katmanlar yerine büyük görüntü üzerinde 64 filtrenin döndürülmesinden kaynaklanmaktadır.

Bir araya getirdiğiniz ağın içinde komik bir bilgi darboğazı var. Orijinal boyuttaki görüntüde 64 filtreyle başlarsınız, ancak görüntü boyutunuz küçüldükçe azalır. Görüntü ağınızdan geçerken, öğrendiğiniz özellikler gittikçe daha soyut ve karmaşık hale gelir. Conv2D (32, (3, 3)) katmanınız ağı, 32 özellikli 128x128'lik bir harita öğrenmeye sınırlar.

Çoğu ağ mimarisi, havuzları her oluşturduklarında özellik sayısını iki katına çıkarır ve en yeni imagenet mimarileri, gerçekte tamamen bağlı katmanları son özellik haritası üzerinde ortalama bir havuz lehine indirir ve temelde bu havuzun çıktısında lojistik regresyon gerçekleştirir.

İlk kıvrım katmanınızda 16 diyelim ki daha az filtre ile başlamayı deneyin, her adım attığınızda veya havuz yaptığınızda iki katına çıkın. Alıcı alanı artırmak ve özellik haritası boyutunu azaltmak için bunu sizden birkaç kez daha yapın. Bunu 128 veya 256 filtre olacak 64x64 veya 32x32'ye kadar yapın. Tamamen bağlı katmanları da ortadan kaldırmak için Keras'ın Global Avg veya Max havuzunu kullanabilirsiniz. Bu, ağın hızını iki katına çıkarmalı ve aynı zamanda doğrulukta bir artış bekleyebilirim.


Ağ mimarisi, yeniden üretmeye çalıştığım bir araştırma belgesine dayanıyor. lirmm.fr/%7Echaumont/publications/…
Rahul
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.