Прогнозування вимог до пам'яті CPU та GPU для навчання DNN


10

Скажімо, у мене є деяка архітектура моделі глибокого вивчення, а також вибраний розмір міні-партії. Як я випливаю з цих очікуваних вимог пам'яті для навчання цій моделі?

Як приклад, розглянемо (не повторювана) модель із введенням розмірності 1000, 4 повністю пов'язаних прихованих шарів розміром 100 та додатковим вихідним шаром розмірності 10. Розмір міні-партії становить 256 прикладів. Як можна визначити приблизну пам'ять (ОЗП) слід навчального процесу на процесорі та на графічному процесорі? Якщо це має якусь різницю, припустимо, що модель тренується на графічному процесорі з TensorFlow (таким чином, використовуючи cuDNN).

Відповіді:


3

Відповідь @ik_vision описує, як оцінити простір пам’яті, необхідний для зберігання ваг, але також потрібно зберігати проміжні активації, і особливо для згорткових мереж, що працюють з 3D-даними, це основна частина необхідної пам’яті.

Щоб проаналізувати ваш приклад:

  1. Для введення потрібно 1000 елементів
  2. Після шарів 1-4 шару у вас є 100 елементів, загалом 400
    1. Після завершального шару у вас є 10 елементів

Всього на 1 зразок потрібно 1410 елементів для переходу вперед. Крім введення, вам також потрібна градієнтна інформація про кожен з них для зворотного проходу, тобто на 410 більше, що становить 1820 елементів на зразок . Помножте на розмір партії, щоб отримати 465 920.

Я сказав "елементи", оскільки необхідний розмір для кожного елемента залежить від використовуваного типу даних. Для однієї точності float32це 4B, а загальна пам'ять, необхідна для зберігання даних, буде приблизно 1,8 Мб.


1

Я бачу два варіанти:

  1. Мережа завантажується з диска
  2. Мережа створюється на ходу

В обох випадках розмір пам’яті в GPU потрібно помножити на розмір Batch, оскільки більша частина мережі копіюється для кожного зразка.

Правило великого пальця, якщо завантажується з диска: Якщо DNN приймає X MB на диск, мережа буде в два рази в пам'яті GPU для пакетного розміру 1.

Мережа створена на ходу для розміру партії 1: порахуйте параметр і помножте на 4 байти (float32 біт): Підрахунок числа параметра вручну: fc1: 1000x100 (ваги) + 100 (зміщення) fc2: 100x100 (ваги) + 100 (ухили) fc3: 100x100 (ваги) + 100 (ухили) fc4: 100x100 (ваги) + 100 (ухили) вихід: 100x10 (ваги) + 10 (зміщення)

Підрахунок кількості параметра за допомогою Keras: model.count_params ()


3
Наскільки я можу сказати, це дає вимоги до пам’яті для зберігання самих ваг , але ігнорує будь-яку пам’ять, призначену для зберігання всього необхідного для тренувань , наприклад градієнтів. Зберігання градієнтів потрібно, скажімо, для імпульсу імплементації. я пропав?
Whaa

1
@Якщо це правильно, для нормальних тренувань вам потрібна пам'ять для зберігання ваг, активацій у прямому проході та градієнтів у проході назад (3x пам'ять навіть без імпульсу).
mjul

@mjul мої експерименти показують 4,5x оцінку ik_vision. Я розумію обґрунтування 3x, але я не впевнений, чому на практиці він використовує 4.5x. Повинні бути інші накладні Keras / TF ??
Уес
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.