Dự đoán các yêu cầu bộ nhớ CPU và GPU của đào tạo DNN


9

Nói rằng tôi có một số kiến ​​trúc mô hình học tập sâu, cũng như một kích thước lô nhỏ được chọn. Làm thế nào để tôi xuất phát từ những yêu cầu bộ nhớ dự kiến ​​để đào tạo mô hình đó?

Ví dụ: xem xét một mô hình (không lặp lại) với đầu vào của kích thước 1000, 4 lớp ẩn được kết nối đầy đủ của kích thước 100 và một lớp đầu ra bổ sung của kích thước 10. Kích thước lô nhỏ là 256 ví dụ. Làm thế nào để xác định dấu chân bộ nhớ (RAM) gần đúng của quá trình đào tạo trên CPU và trên GPU? Nếu nó có bất kỳ sự khác biệt nào, giả sử mô hình được đào tạo trên GPU với TensorFlow (do đó sử dụng cuDNN).

Câu trả lời:


2

Câu trả lời của @ik_vision mô tả cách ước tính dung lượng bộ nhớ cần thiết để lưu trữ trọng số, nhưng bạn cũng cần lưu trữ các kích hoạt trung gian và đặc biệt đối với các mạng chập làm việc với dữ liệu 3D, đây là phần chính của bộ nhớ cần thiết.

Để phân tích ví dụ của bạn:

  1. Đầu vào cần 1000 phần tử
  2. Sau lớp 1-4, bạn có 100 phần tử, tổng cộng 400
    1. Sau lớp cuối cùng, bạn có 10 phần tử

Tổng cộng cho 1 mẫu bạn cần 1410 phần tử cho lượt chuyển tiếp. Ngoại trừ đầu vào, bạn cũng cần một thông tin độ dốc về từng thông tin để chuyển ngược lại, tức là hơn 410, tổng cộng 1820 phần tử cho mỗi mẫu . Nhân với kích thước lô để có được 465 920.

Tôi đã nói "các phần tử", bởi vì kích thước yêu cầu cho mỗi phần tử phụ thuộc vào loại dữ liệu được sử dụng. Đối với độ chính xác duy nhất, float32nó là 4B và tổng bộ nhớ cần thiết để lưu trữ các đốm dữ liệu sẽ vào khoảng 1,8 MB.


1

Tôi thấy hai lựa chọn:

  1. Mạng được tải từ đĩa
  2. Mạng được tạo nhanh chóng

Trong cả hai trường hợp, kích thước của bộ nhớ trong GPU cần được nhân với kích thước Batch vì hầu hết mạng được sao chép cho mỗi mẫu.

Nguyên tắc chung nếu được tải từ Đĩa: Nếu DNN lấy X MB trên Đĩa, mạng sẽ có kích thước gấp 2 lần trong bộ nhớ GPU cho kích thước lô 1.

Mạng được tạo nhanh khi kích thước lô 1: đếm tham số và nhân với 4 byte (float32 bit): Đếm số lượng Thông số theo cách thủ công: fc1: 1000x100 (trọng số) + 100 (độ lệch) fc2: 100x100 (trọng số) + 100 (độ lệch) fc3: 100x100 (trọng lượng) + 100 (độ lệch) fc4: 100x100 (trọng lượng) + 100 (độ lệch) đầu ra: 100x10 (trọng lượng) + 10 (độ lệch)

Đếm số lượng Thông số bằng Keras: model.count_params ()


3
Theo như tôi có thể nói, điều này đưa ra các yêu cầu về bộ nhớ để tự lưu trữ trọng lượng , nhưng bỏ qua mọi bộ nhớ dành riêng cho việc lưu trữ bất cứ thứ gì được yêu cầu nghiêm ngặt cho việc đào tạo , chẳng hạn như độ dốc. Lưu trữ độ dốc là cần thiết, nói để thực hiện động lượng. tôi bị mất tích à
Whaa

1
@Whaa điều này là chính xác, để đào tạo bình thường, bạn cần bộ nhớ để lưu trữ trọng số, kích hoạt trong chuyển tiếp và độ dốc trong vượt qua truyền ngược (bộ nhớ gấp 3 lần ngay cả khi không có động lượng).
mjul

@mjul thí nghiệm của tôi cho thấy ước tính 4,5 lần của ik_vision. Tôi hiểu lý do căn bản đằng sau 3x nhưng tôi không chắc tại sao trong thực tế, nó sử dụng 4,5 lần. Phải có chi phí khác của Keras / TF ??
Wes
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.