newsmode
search
Меню
arrow_back Назад

Estimating vRAM – Hamel’s Blog - Hamel Husain

auto_awesomeКраткое саммари

Хэмел Хусейн делится практическими формулами для прикидочной оценки объёма vRAM, необходимого для обучения и инференса LLM. Он отталкивается от калькулятора Зака Мюллера и дополняет его поправками на количество обучаемых параметров, точность (dtype), оптимизатор Adam и накладные расходы прямого прохода. Ключевая формула для обучения с LoRA: к базовой оценке прибавляется (число обучаемых параметров в млрд × dtype/8 × 4), а итог умножается на 1.2. На примере: при 0.5B обучаемых fp16-параметров и базовых 14 ГБ выходит около 21.6 ГБ vRAM. Для инференса калькулятор подходит как есть, но нужно учитывать batch size при continuous batching. Также упоминаются способы экономии памяти: flash attention, gradient checkpointing и компиляция модели (например, MLC).

The estimates in this post are back-of-the-napkin calculations. They are meant to give you a ballpark estimate of how much vRAM you need. The only way to know for sure is to run your model on your hardware and measure the memory usage. This is especially true for training.1

Оценки в этом посте — прикидки на салфетке. Они должны дать вам приблизительное представление о том, сколько vRAM вам нужно. Единственный способ узнать наверняка — запустить вашу модель на вашем железе и измерить использование памяти. Это особенно справедливо для обучения.1

I’ll keep updating this post as I learn more and get feedback from others.

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

Background

Предыстория

My friend Zach Mueller came out with this handy calculator, which aims to answer the question “How much GPU memory do I need for a model?”. His calculator incorporates all of the math that is stuck in many of our heads and puts it into a simple calculator.

Мой друг Zach Mueller выпустил вот такой удобный калькулятор, который призван ответить на вопрос «Сколько памяти GPU мне нужно для модели?». Его калькулятор вбирает в себя всю математику, которая засела в головах у многих из нас, и упаковывает её в простой калькулятор.

However, I’ve talked with Zach and others for a couple of weeks about the nuances of the calculator and want to share some additional information I think is helpful.

Однако я уже пару недель обсуждаю с Zach и другими нюансы этого калькулятора и хочу поделиться дополнительной информацией, которая, как мне кажется, будет полезной.

Training w/ LoRA

Обучение с LoRA

The key to estimating memory needed for training is to anchor off the # of trainable parameters. The general formula is:

Ключ к оценке памяти, необходимой для обучения, — отталкиваться от числа обучаемых параметров. Общая формула такова:

(Estimate from calculator in GB + ( # of trainable params in Billions * (dtype of trainable params / 8) * 4)) * 1.2

(Оценка из калькулятора в ГБ + ( число обучаемых параметров в миллиардах * (dtype обучаемых параметров / 8) * 4)) * 1.2

Here is the rationale for each of the terms:

Вот обоснование для каждого из членов формулы:

  • dtype of trainable params refers to the dtype of your unfrozen model parameters for LoRA, which is usually a different precision than the rest of the frozen model. It’s common to load the rest of the model with 8-bit or 4-bit quantization and keep the LorA adapters at 16 or 32-bit precision. We divide this by 8 to get the number of bytes per parameter. For example, if there are 1B trainable parameters and they are 16-bit, this would add 1 * (16 / 8) = 2GB to the estimate, which you have to further multiply by other quantities (see below example).
  • The 4x is tied to the popular Adam optimizer (if you use a different one, YMMV). You need 2x for the optimizer, 1x for the model and 1x for the gradients.
  • The 1.2x is additional overhead for the forward pass while training the model. You can read more about this heuristic in this blog post from Eleuther AI.
  • dtype обучаемых параметров — это dtype ваших размороженных параметров модели для LoRA, обычно с иной точностью, чем остальная замороженная модель. Часто остальную часть модели загружают с 8-битной или 4-битной квантизацией, а адаптеры LoRA держат в 16- или 32-битной точности. Мы делим это на 8, чтобы получить количество байт на параметр. Например, если есть 1B обучаемых параметров и они 16-битные, это добавит 1 * (16 / 8) = 2GB к оценке, которую затем нужно умножить на другие величины (см. пример ниже). Множитель 4 привязан к популярному оптимизатору Adam (если вы используете другой, YMMV). Нужно 2x для оптимизатора, 1x для модели и 1x для градиентов. Множитель 1.2 — это дополнительный оверхед на прямой проход при обучении модели. Подробнее об этой эвристике можно прочитать в этом посте от Eleuther AI.

    The 1 added to 20% is just a mathematical trick for increasing a quantity by a %. For example, if you want to increase a quantity by 20% you can multiply by 1.20. I only mention this because this term confused some people!

    1, прибавленная к 20%, — это просто математический трюк для увеличения величины на процент. Например, если вы хотите увеличить значение на 20%, можно умножить на 1.20. Я упоминаю это только потому, что этот член формулы запутал некоторых читателей!

    Example

    Пример

    For example, if you are using Lora and 0.5B of your parameters are trainable and are fp16, and the calculator says you need 14GB of vRAM, this is how you would calculate the amount of total memory you need for training:

    Например, если вы используете LoRA, 0.5B ваших параметров обучаемые и они в fp16, а калькулятор говорит, что вам нужно 14GB vRAM, то вот как вы рассчитаете общий объём памяти, необходимый для обучения:

    (14GB + ( 0.5 * (16 / 8) * 4) ) * 1.2 =

    (14GB + ( 0.5 * (16 / 8) * 4) ) * 1.2 =

    (14GB + 4) * 1.2 = 21.6

    (14GB + 4) * 1.2 = 21.6

    Answer: ~21.6 GB of vRAM

    Ответ: ~21.6 ГБ vRAM

    Inference

    Инференс

    The calculator is great as-is for estimating vRAM needed inference. Even though there are other caveats to be aware of, the calculator is a great baseline to start from. For inference, you will also have to consider your batch size for continuous batching, which is use-case specific depending on your throughput vs. latency requirements.

    Калькулятор отлично подходит «как есть» для оценки vRAM, необходимой для инференса. Несмотря на то что есть другие оговорки, о которых стоит помнить, калькулятор — отличная отправная точка. Для инференса вам также придётся учитывать batch size для continuous batching, что зависит от конкретного сценария использования и от ваших требований к пропускной способности и задержке.

    Caveats

    Оговорки

    There are other optimizations to be aware of that can reduce the amount of memory you need:

    Есть и другие оптимизации, о которых стоит знать и которые могут уменьшить объём необходимой памяти:

  • Flash attention
  • Gradient checkpointing
  • Model compilation (ex: MLC)
  • Flash attention. Gradient checkpointing. Компиляция модели (например, MLC).

    Distributed training/inference can add some additional overhead, but that is a complex topic that I won’t cover here.

    Распределённое обучение/инференс может добавлять дополнительный оверхед, но это сложная тема, которую я здесь не буду затрагивать.

    Footnotes

    Сноски

  • See this thread as an example of how YMMV.↩︎

  • См. этот тред как пример того, как YMMV.↩︎