Учитывая количество параметров, как оценить VRAM, необходимый для модели pytorch?

#memory #pytorch #vram #nvidia-smi

Вопрос:

Я пытаюсь оценить VRAM, необходимый для полностью подключенной модели, без необходимости создавать/обучать модель в pytorch.

Я довольно близко подошел к этой формуле:

 # params = number of parameters # 1 MiB = 1048576 bytes estimate = params * 24 / 1048576  

Эта модель примера имеет 384048000 параметров, но я протестировал это на разных моделях с разными размерами параметров.

Результаты довольно точны. Однако при оценке учитывается только VRAM сеанса pytorch, а не объем VRAM буфера драйвера/cuda. Вот оценочные (с формулой) и эмпирические результаты (с использованием nvidia-smi после построения/обучения модели)

 ESTIMATE BEFORE EMPIRICAL TEST:  VRAM estimate = 8790.1611328125MiB  EMPIRICAL RESULT AFTER BUILDING MODEL:  GPU RAM for pytorch session only (cutorch.max_memory_reserved(0)/1048576): 8466.0MiB GPU RAM including extra driver buffer from nvidia-smi: 9719MiB  

Есть какие-нибудь идеи о том, как оценить эту дополнительную VRAM, показанную в выводе nvidia-smi?

Комментарии:

1. Неуместный вопрос, учитываете ли вы объем памяти, необходимый для хранения графика градиентов (иногда может не применяться), и историю градиентов, особенно когда вы используете оптимизатор на основе импульса. Я имею в виду, как вы добрались до 384048000

2. модель.сводка() показывает количество параметров, которое включает все элементы модели во всех слоях (веса, смещения, входы, выходы и т. Д.).

3. Я подумал, что вы могли бы сделать что-то подобное… то, что вы оцениваете, — это переменные вашего прямого прохода, и вы не принимаете во внимание переменные, которые могли бы ввести оптимизаторы. ваши расчеты могут быть применимы только к умозаключению, а не к обучению.

4. Имеет смысл. Я только что заметил, что оптимизатор использует примерно в 3 раза больше VRAM, чем VRAM, для которого я рассчитал необходимые параметры модели в одиночку. Он начинается с того, что занимает одно время в эпоху 1, два раза в эпоху 2 и еще 3 раза в эпоху 3. Тогда он не увеличивает VRAM, используемый после эпохи 3. Я пытался понять, почему это происходит…

5. если вы используете оптимизатор Adam, он будет хранить один набор параметров для adagrad и один набор для rmsprop части Adam для каждого параметра/тензора/переменной, для которой требуется градация. Другие оптимизаторы могут использовать меньше или больше в зависимости от того, как они настроены.