Accelerate documentation
Оценщик памяти модели
Оценщик памяти модели
Один из самых сложных аспектов при выборе модели для работы на вашем устройстве — это понимание того, насколько большой модель поместится в память вашего текущего устройства (например, при загрузке модели на CUDA или XPU).
Чтобы облегчить эту задачу, в Accelerate есть интерфейс командной строки через accelerate estimate-memory. В этом руководстве мы покажем, как им пользоваться, чего ожидать, а в конце дадим ссылку на интерактивную демонстрацию на Hub, где можно даже опубликовать полученные результаты прямо в репозитории модели!
В настоящее время мы поддерживаем поиск моделей, которые можно использовать в timm и transformers.
Этот API загружает модель в память на устройстве
meta, поэтому мы фактически не скачиваем и не загружаем полные веса модели в память, и в этом нет необходимости. В результате можно без проблем работать с моделями на 8 миллиардов параметров (или больше), не беспокоясь о том, справится ли с этим ваша CPU!
Демо на Gradio
Ниже приведены несколько демонстраций на gradio, связанных с описанным выше. Первая — это официальное пространство Hugging Face для оценки памяти, использующее Accelerate напрямую:
Один из участников сообщества развил эту идею, добавив возможность напрямую фильтровать модели и проверять, можно ли запустить конкретную LLM с учётом ограничений GPU и конфигураций LoRA. Чтобы попробовать, см. здесь для получения подробностей.
Команда
При использовании accelerate estimate-memory необходимо указать имя модели, которую вы хотите использовать, при необходимости — фреймворк, в котором работает эта модель (если он не определяется автоматически), а также типы данных, в которых модель должна быть загружена.
Например, вот как можно рассчитать объём занимаемой памяти для bert-base-cased:
accelerate estimate-memory bert-base-cased
Это загрузит config.json для bert-based-cased, загрузит модель на устройство meta и сообщит, сколько места она займёт:
Использование памяти при загрузке bert-base-cased:
| dtype | Самый большой слой | Общий размер | Обучение с использованием Adam |
|---|---|---|---|
| float32 | 84,95 МБ | 418,18 МБ | 1,61 ГБ |
| float16 | 42,47 МБ | 206,59 МБ | 826.36 МБ |
| int8 | 21,24 МБ | 103,29 МБ | 413,18 МБ |
| int4 | 10,62 МБ | 51,65 МБ | 206,59 МБ |
По умолчанию возвращаются все поддерживаемые dtypes (от int4 до float32), но при необходимости можно отфильтровать конкретные типы.
Определённые библиотеки
Если исходную библиотеку невозможно определить автоматически (как это возможно в случае с bert-base-cased), можно передать имя библиотеки.
accelerate estimate-memory HuggingFaceM4/idefics-80b-instruct --library_name transformers
Использование памяти при загрузке HuggingFaceM4/idefics-80b-instruct:
| dtype | Самый большой слой | Общий размер | Обучение с использованием Adam |
|---|---|---|---|
| float32 | 3,02 ГБ | 297,12 ГБ | 1,16 ТБ |
| float16 | 1,51 ГБ | 148,56 ГБ | 594.24 ГБ |
| int8 | 772.52 МБ | 74,28 ГБ | 297,12 ГБ |
| int4 | 386,26 МБ | 37,14 ГБ | 148,56 ГБ |
accelerate estimate-memory timm/resnet50.a1_in1k --library_name timm
Использование памяти при загрузке timm/resnet50.a1_in1k:
| dtype | Самый большой слой | Общий размер | Обучение с использованием Adam |
|---|---|---|---|
| float32 | 9,0 МБ | 97,7 МБ | 390.78 МБ |
| float16 | 4,5 МБ | 48,85 МБ | 195,39 МБ |
| int8 | 2,25 МБ | 24,42 МБ | 97,7 МБ |
| int4 | 1,12 МБ | 12,21 МБ | 48,85 МБ |
Конкретные dtypes
Как уже упоминалось, по умолчанию мы возвращаем значения в диапазоне от int4 до float32, но можно использовать любой тип данных: float32, float16, int8 и int4.
Для этого передайте их после указания --dtypes:
accelerate estimate-memory bert-base-cased --dtypes float32 float16
Использование памяти при загрузке bert-base-cased:
| dtype | Самый большой слой | Общий размер | Обучение с использованием Adam |
|---|---|---|---|
| float32 | 84,95 МБ | 413,18 МБ | 1,61 ГБ |
| float16 | 42,47 МБ | 206,59 МБ | 826.36 МБ |
Ограничения этого калькулятора
Этот калькулятор покажет, сколько памяти требуется для простой загрузки модели, а не для выполнения инференса.
Этот расчёт точен с погрешностью в несколько процентов от фактического значения, поэтому он даёт очень хорошее представление о том, сколько памяти потребуется. Например, загрузка bert-base-cased на CUDA в полной точности фактически занимает 413.68 MB, а калькулятор оценивает 413.18 MB.
При выполнении инференсинга следует ожидать увеличение времени на 20%, как было установлено EleutherAI. Мы проводим исследование для получения более точной оценки этих значений и обновим этот калькулятор по его завершении.
Update on GitHub