Tại sao đào tạo mất quá nhiều thời gian trên GPU của tôi?


10

Chi tiết:

GPU : GTX 1080

Đào tạo : ~ 1,1 triệu hình ảnh thuộc 10 lớp

Xác thực : ~ 150 nghìn hình ảnh thuộc 10 lớp

Thời gian mỗi Epoch : ~ 10 giờ

Tôi đã thiết lập CUDA, cuDNN và Tensorflow (GPU Tensorflow).

Tôi không nghĩ rằng mô hình của tôi phức tạp đến mức mất 10 giờ mỗi epoch. Tôi thậm chí đã kiểm tra xem GPU của tôi có phải là vấn đề không nhưng nó đã không xảy ra.

Là thời gian đào tạo do các lớp kết nối đầy đủ?

Mô hình của tôi:

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

Bởi vì có rất nhiều dữ liệu tôi đã sử dụng 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
Tôi đã bỏ phiếu để di chuyển cái này để ngăn xếp tràn, nhưng thực sự nó thuộc về trao đổi ngăn xếp khoa học dữ liệu, IMO
generic_user

generic_user: "khoa học dữ liệu" có thể sử dụng "machine learning", nhưng không phải tất cả "machine learning" đều dành cho "khoa học dữ liệu". (ML chỉ là một công cụ khác, tenorflow chỉ là một thư viện khác; ML có thể sớm được sử dụng (nếu chưa có) ngay cả đối với các tác vụ trần tục như quản lý các tệp thuộc tính ưu tiên người dùng.)
michael

xem thêm có liên quan (tl; dr: xác minh thực sự đang chạy trên gpu, hãy xem các số liệu thống kê về gpu mà tf có thể cung cấp) stackoverflow.com/questions/42527492/ Thẻ stackoverflow.com/questions/38559755/
Khăn

Tôi đã thử cách tiếp cận đó và nói rằng GPU hiện tại của tôi đang được sử dụng. Để xác nhận, tôi cũng đã sử dụng nvidia-smi để kiểm tra mức độ sử dụng GPU và nó dao động trong khoảng 85% -99%.
Pradyumna Rahul

Câu trả lời:


7

Đó là về dự kiến. Nếu bạn chia số giây cho số lượng hình ảnh bạn đã xử lý, bạn sẽ nhận được 33 mili giây trên mỗi hình ảnh, điều này có vẻ phù hợp với một mạng nhỏ như vậy. Các mạng lớn hơn thường chiếm sân bóng từ 50 đến 200 mili giây trên mỗi hình ảnh.

Có, một lớp dày đặc có khả năng làm tổn hại đến hiệu suất của bạn, vì đó là một ma trận khổng lồ (256 x 4096) và một phép nhân ma trận lớn đi cùng với nó mỗi khi bạn chạy mạng.


Bạn muốn đề xuất gì để cải thiện hiệu suất?

4
1: tăng kích thước lô lên 32 hoặc 64. 2: thu nhỏ kích thước của lớp FC thành có thể 1024 hoặc 2048 đơn vị và xem nếu nó giúp. 3: Dừng sớm. Có thể là mạng của bạn đã hội tụ hoặc bắt đầu quá mức trước khi bạn hoàn thành kỷ nguyên đầu tiên của mình, trong trường hợp đó bạn nên đào tạo ít hơn.

Tôi có nên giảm các bước trên mỗi epoch?
Pradyumna Rahul

@shimao Ý của bạn là "đào tạo ít" là gì? Bạn có nghĩa là sử dụng ít dữ liệu?
Số liệu thống kê

3

Như shimao đã nói, đó là về những gì bạn mong đợi. Mặc dù không có nhiều lớp, kích thước đầu vào 512x512 là một hình ảnh lớn sẽ được tích hợp. Thời gian tính toán lớn có thể nhiều hơn do kết hợp 64 bộ lọc trên hình ảnh lớn, thay vì các lớp được kết nối đầy đủ.

Mạng bạn đã đặt cùng nhau có một nút cổ chai thông tin hài hước trong đó. Bạn bắt đầu với 64 bộ lọc trên hình ảnh có kích thước ban đầu, chỉ giảm khi kích thước hình ảnh của bạn giảm. Khi hình ảnh đi qua mạng của bạn, các tính năng bạn đang học ngày càng trở nên trừu tượng và phức tạp hơn. Lớp Conv2D (32, (3, 3)) của bạn về cơ bản giới hạn mạng để học bản đồ 128x128 gồm 32 tính năng.

Hầu hết các kiến ​​trúc mạng tăng gấp đôi số lượng tính năng mỗi lần chúng kết hợp và hầu hết các kiến ​​trúc tưởng tượng gần đây thực sự bỏ qua các lớp được kết nối đầy đủ có lợi cho một nhóm trung bình trên bản đồ tính năng cuối cùng và về cơ bản thực hiện hồi quy logistic trên đầu ra của nhóm đó.

Hãy thử bắt đầu với ít bộ lọc hơn, giả sử 16 trong lớp tích chập đầu tiên của bạn, nhân đôi mỗi khi bạn sải bước hoặc nhóm. Làm điều này nhiều lần hơn bạn, để tăng trường tiếp nhận và giảm kích thước bản đồ tính năng. Làm điều này xuống 64x64 hoặc 32x32, đó sẽ là 128 hoặc 256 bộ lọc. Bạn cũng có thể sử dụng nhóm Global Average hoặc Max của Keras để loại bỏ các lớp được kết nối đầy đủ. Điều đó sẽ tăng gấp đôi tốc độ của mạng và tôi sẽ mong đợi sự gia tăng độ chính xác cùng một lúc.


Vâng, kiến ​​trúc mạng dựa trên một bài nghiên cứu mà tôi đang cố gắng tái tạo. lirmm.fr/%7Echaumont/publications/ Từ
Pradyumna Rahul
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.