Tiêu thụ bộ nhớ CNN


9

Tôi muốn có thể ước tính liệu một mô hình được đề xuất có đủ nhỏ để được đào tạo về GPU với một lượng bộ nhớ nhất định không

Nếu tôi có một kiến ​​trúc CNN đơn giản như thế này:

  • Input: 50x50x3
  • C1: 32 hạt nhân 3x3, có đệm (tôi đoán trong thực tế chúng thực sự là 3x3x3 với độ sâu đầu vào?)
  • P1: 2x2 với sải chân 2
  • C2: 64 hạt nhân 3x3, có đệm
  • P2: 2x2 với sải chân 2
  • FC: 500 tế bào thần kinh
  • Output: softmax 10 lớp
  • Cỡ lô nhỏ 64

Giả sử các giá trị dấu phẩy động 32 bit, làm thế nào để bạn tính chi phí bộ nhớ của mỗi lớp của mạng trong quá trình đào tạo? và sau đó tổng bộ nhớ cần thiết để đào tạo một mô hình như vậy?

Câu trả lời:


6

Tôi sẽ giả định bởi C1, C2, vv, bạn có nghĩa là lớp xoắn, và bằng cách P1, P2bạn có nghĩa là lớp tổng hợp, và FCphương tiện kết nối hoàn toàn lớp.

Chúng ta có thể tính toán bộ nhớ cần thiết cho một lần chuyển tiếp như thế này:

Một hình ảnh

Nếu bạn đang làm việc với các giá trị float32, thì hãy theo liên kết được cung cấp ở trên bởi @Alexandru Burlacu mà bạn có:

Input: 50x50x3 = 7.500 = 7.5K

C1: 50x50x32 = 80.000 = 80K

P1: 25x25x32 = 20.000 = 20K

C2: 25x25x64 = 40.000 = 40K

P2: 12x12x64 = 9,216 = 9,2K <- Đây là một vấn đề (và gần đúng của tôi là một phỏng đoán rất lượn sóng ở đây). Thay vì làm việc với 50, 25, '12 .5 ', sẽ hợp lý hơn khi làm việc với bội số 32. Tôi đã nghe nói làm việc với bội số 32 cũng hiệu quả hơn từ quan điểm bộ nhớ. Lý do đây là một ý tưởng tồi là nhóm 2x2 không phân chia không gian hợp lý, theo như tôi có thể nói. Hãy sửa tôi nếu tôi sai.

FC: 1x500 = 500 = 0,5K

Output: 1 x 10 = 10 = 0,01K (không có gì)

Tổng bộ nhớ: 7.5K + 80K + 20K + 40K + 0.5K = 157.2K * 4 byte = 628.8 KB

Đó là cho một hình ảnh.

Minibatch

Nếu bạn đang làm việc với kích thước nhỏ gọn là 64, thì bạn đang đọc 64 trong số này vào bộ nhớ cùng một lúc và thực hiện tất cả các thao tác cùng nhau, nhân rộng mọi thứ như thế này:

Input: 64x50x50x3 = 480.000 = 480K = 0,48M

C1: 64x50x50x32 = 5.120.000 = 5.12M

P1: 64x25x25x32 = 1.280.000 = 1.28M

C2: 64x25x25x64 = 2.560.000 = 2.56M

P2: 64x12x12x64 = 589.824 = 590K = 0,59M

FC: 64x500 = 32.000 = 32K = 0,032M

Output: 1x10x64 = 640 = 0,64K = 0,00064M (chúng tôi không quan tâm, điều này rất nhỏ)

Tổng bộ nhớ: 10M x 4 byte ~ 40MB (Tôi đang nói gần đúng vì trang web cũng cho biết giá trị gần đúng)

EDIT: Tôi đọc sai trang web, xin lỗi.

Theo trang web, một đường chuyền ngược đòi hỏi khoảng gấp ba lần này, vì nhu cầu lưu trữ:

  • các kích hoạt và độ dốc liên quan cho mỗi nơ ron - chúng có kích thước bằng nhau;

  • độ dốc của các trọng số (tham số) có cùng kích thước với các tham số;

  • giá trị của động lượng, nếu bạn đang sử dụng nó;

  • một số loại bộ nhớ linh tinh (tôi không hiểu phần này)


Chúng ta cũng cần phải xem xét bộ nhớ cần thiết cho trọng lượng / tham số? Ví dụ, đối với lớp của bạn C1ở trên bạn có 50x50x32nhưng đó sẽ chỉ là các giá trị cho các bản đồ kích hoạt lớp, còn các giá trị đã học ( 32x3x3) trong chính hạt nhân thì sao?
Simon

Có, bạn làm, theo cs.stanford.edu/~quocle/tutorial2.pdf . Thuật toán backprop sử dụng SGD cần các giá trị trước đó của các trọng số. Nhưng với nhóm tối đa (bạn có đang thực hiện gộp tối đa không?), Bạn không cần phải theo dõi độ dốc đối với từng kết nối. Bạn cần theo dõi kết nối nào có giá trị tối đa đến từ và chỉ tính toán độ dốc cho nhánh đó.
Số liệu thống kê

@StatsSorceress, cảm ơn vì câu trả lời này nhưng một câu hỏi xuất hiện trong đầu tôi, điều gì xảy ra nếu kích thước lớp chập là 11x11 thay vì 3x3? và điều gì xảy ra nếu một ReLU theo sau là một lớp chập?
saeed masoomi

2

Có thể liên kết này sẽ cung cấp cho bạn một lời giải thích về cách tính toán mức sử dụng bộ nhớ của một mạng thần kinh tùy ý. Dưới đây trong liên kết được giải thích việc sử dụng bộ nhớ của mô hình VGGNet. Nhấn vào đây và cuộn xuống một chút))


1

Trong khi đào tạo một mạng lưới, tổng số bộ nhớ cần có bao gồm:

  • Bộ nhớ cho các tham số
  • Bộ nhớ cho đầu ra của các lớp trung gian
  • Bộ nhớ cho độ dốc của từng tham số
  • Cần thêm bộ nhớ nếu bạn đang sử dụng trình tối ưu hóa như Momentum, RMSprop, Adams, v.v.
  • Bộ nhớ linh tinh để thực hiện

Một xấp xỉ thô tốt là số lượng tham số x 3 x 4 (nếu bạn đang sử dụng float 32 bit)

Chà, bây giờ đây là cách bạn tính toán số lượng tham số:

  • Lớp conv: (chiều rộng nhân x chiều cao nhân) x số lượng kênh x độ sâu + độ sâu (chỉ thêm độ sâu nếu có độ lệch)
  • Lớp FC: tê liệt đầu vào * tê đầu ra + đầu ra (đầu ra được thêm vào để bao gồm số lượng sai lệch)
  • Lớp pool tối đa: không có tham số

Bây giờ chỉ cần tổng hợp số lượng của tất cả các tham số và sử dụng công thức tôi đã đề cập.

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.