Анализ задержки и памяти моделей трансформаторов для обучения и вывода
LLMAnalysis Многие формулы или уравнения плавают в документах, в блогах и т. Д., О том, как вычислять обучение или задержку вывода и память для моделей крупных языков (LLM) или трансформаторов. Вместо того, чтобы делать математику на бумагах или печатать в листах Excel, let's automate the boring stuff with llm-analysis !
Учитывая указанную модель, конфигурации GPU, тип данных и параллелизма, LLM-анализ оценивает латентность и использование памяти LLMS для обучения или вывода. При анализе LLM можно легко пробовать различные настройки обучения/вывода теоретически и лучше понять производительность системы для разных сценариев.
LLM-анализ помогает ответить на такие вопросы, как:
feasible (не получения OOM) и optimal (максимизации пропускной способности с ограничением задержки) для обучения или выводаtime , которое нужно с данной настройкой для обучения или вывода и cost (часы графических процессоров)modeling change , hardware improvement , quantization , parallelism и т. Д.)Проверьте пример вариантов использования. С помощью анализа LLM вы можете сделать такой анализ за считанные минуты!
Для установки LLM-анализа из PYPI:
pip install llm-analysisЧтобы установить новейшую сборку разработки:
pip install --upgrade git+https://github.com/cli99/llm-analysis.git@main Чтобы установить из источника, клонируйте репо и запустите pip install . или poetry install (установка стихи путем pip install poetry ).
LLMAnalysis Чтобы интегрировать анализ LLM в ваш код, используйте класс LLMAnalysis . Обратитесь к Doc Llmanalysis для деталей.
LLMAnalysis построен с флопами и числами эффективности памяти и следующими классами конфигурации:
ModelConfig охватывает информацию о модели, т.е. максимальная длина последовательности, количество слоев трансформатора, количество головок внимания, скрытое измерение, размер словарного запасаGPUConfig покрывает вычисления GPU и спецификации памятиDtypeConfig охватывает количество битов, используемых для веса модели, активации и внедренияParallelismConfig охватывает тензорную параллелизм ( tp ), параллелизм трубопровода ( pp ), параллелизм последовательности ( sp ), экспертный параллелизм ( ep ) и параллелизм данных ( dp ). Затем LLMAnalysis может быть запрошен различными аргументами с помощью методов обучения и вывода.
LLM-анализ обеспечивает две функции входа, поезда и вывода для простоты использования через интерфейс командной строки. Бегать
python -m llm_analysis.analysis train --helpили
python -m llm_analysis.analysis infer --helpЧтобы проверить параметры или прочитать связанный документ. Обратитесь к примерам, чтобы увидеть, как они используются.
train и infer используйте предварительно определенные сопоставления имени в конфигурации ( model_configs , gpu_configs , dtype_configs ) и другие аргументы пользователя ввода, чтобы построить LLMAnalysis и выполнить запрос.
Предварительно определенные сопоставления заполняются во время выполнения из модели, графического процессора и конфигурации типа данных в разделе файлов json в рамках Model_configs, GPU_CONFIGS и DTYPE_CONFIGS. Чтобы добавить новую модель, графический процессор или тип данных в отображение запроса, просто добавьте файл описания json в соответствующую папку.
Анализ LLM также поддерживает получение ModelConfig из модельного конфигурационного пути файла JSON или обнимающегося лица с именем модели.
python -m llm_analysis.analysis train --model_name=local_example_model.json . Проверьте конфигурации модели в папке MODEL_CONFIGS.EleutherAI/gpt-neox-20b как model_name при вызове train или infer функций входа. python -m llm_analysis.analysis train --model_name=EleutherAI/gpt-neox-20b --total_num_gpus 32 --ds_zero 3 . С помощью этого метода LLM-анализ основан на transformers , чтобы найти соответствующую конфигурацию модели на huggingface.co/models, что означает информация о более новых моделях, существует только после определенной версии библиотеки трансформаторов. Чтобы получить доступ к последним моделям через их имена, обновите установленные пакет transformers . Список удобных команд предоставляется для запроса на предварительно определенные сопоставления, а также обнимающееся лицо или сброс конфигураций. Запустите python -m llm_analysis.config --help для деталей.
Некоторые примеры:
python -m llm_analysis.config get_model_config_by_name EleutherAI/gpt-neox-20b Получает ModelConfig из населенного сопоставления по имени, если не найдено, LLM-анализ пытается получить его от HuggingFace.
Обратите внимание, что моделям LLAMA требуется, по крайней мере, transformers-4.28.1 для извлечения, либо обновления в более позднюю библиотеку transformers , либо используйте предопределенный ModelConfig для моделей LLAMA ( / в именах моделей заменяются _ ).
python -m llm_analysis.config list_gpu_configsперечисляет имена всех предопределенных конфигураций графического процессора, затем вы можете запросить с помощью
python -m llm_analysis.config get_gpu_config_by_name a100-sxm-80gb Чтобы показать соответствующий GPUConfig .
Установка провалов и эффективность памяти до 1 (по умолчанию) дает нижнюю границу обучения или задержки вывода, поскольку он предполагает пиковую производительность оборудования (что никогда не бывает). Плопы, близкие к реальности, или эффективность памяти можно найти путем сравнения и профилирования, используя входные измерения в модели.
Если нужно делать предположения, для эффективности провалов, литература сообщает до 0.5 для крупномасштабной модели и до 0.7 для вывода; 0.9 может быть агрессивной целью для эффективности памяти.
Анализ LLM направлен на то, чтобы обеспечить lower-bound оценку использования памяти и задержки.
Анализ LLM в настоящее время охватывает тензорную параллелизм (TP), параллелизм трубопровода (PP), параллелизм последовательности (SP), экспертный параллелизм (EP) и параллелизм данных (DP).
TP, PP и SP применяют стиль параллелизации, используемый в Megatron-LM для обучения и FasterTransformer обработки
В учебном анализе DP Sharding предполагает использование DeepSpeed ZeRO или FSDP . ds_zero используется для указания стратегии шардинга DP
| ds_zero | Deepspeed Zero | FSDP | Шарь |
|---|---|---|---|
| 0 | неполноценный | No_shard | Нет шарнина |
| 1 | Этап 1 | N/a | Шард Оптимизатор состояния |
| 2 | Этап 2 | Shard_grad_op | Градиенты осколков и состояния оптимизатора |
| 3 | Этап 3 | Full_shard | Градиенты осколков, состояния оптимизатора, параметры модели |
EP -параллелизирует количество экспертов MLP на устройствах ep_size , то есть количество экспертов на графический процессор составляет total number of experts / ep_size . Таким образом, для модуля MLP количество устройств для других размеров параллелизации делится на ep_size по сравнению с другими частями модели.
Связь TP рассчитывается как использование ring allreduce . EP -связь рассчитывается как использование alltoall . Время связи DP с непрерывным весом модели При использовании FSDP или DeepSpeed Zero оценивается и сравнивается с вычислением задержки, большее значение двух используется для общей задержки. Другие коммуникации DP и PP игнорируются на данный момент, то есть, предполагая идеальные вычисления и перекрытие связи, что не соответствует действительности, когда связь не может перекрываться с вычислением из -за зависимости или когда связь слишком длинная, чтобы скрываться из -за медленного взаимосвязанного или большого объема данных.
Анализ LLM поддерживает как полную, так и селективную рецидивную рецидив.
| Activation_recomputation | Что проверяется и перекачивается |
|---|---|
| 0 | Нет активации реформирования; требует наибольшего количества памяти |
| 1 | Контрольные точки вычисления внимания (QK^T -матрица Multiply, SoftMax, SoftMax выбросит и внимание по V.) в модуле внимания слоя трансформатора; Как описано в сокращении активации рециркуляции в крупных моделях трансформатора. |
| 2 | Контрольные точки ввод в модуль внимания в слое трансформатора; Требуется дополнительный переход на внимание. |
| 3 | Контрольные точки вход в последовательность модулей (Layernom-Attention-Layernom) в слое трансформатора; Требуется дополнительный проход вперед (Layernom-Attention-Layernom). |
| 4 | Полная активация пересекает ввод в слой трансформатора; требует наименьшего количества памяти; Требуется дополнительный прямой проход всего слоя. |
Типы данных выражены с количеством битов, только 32 (FP32, TF32), 16 (FP16, BF16), 8 (Int8) и 4 (Int4) Биты типы данных моделируются на данный момент.
Точная настройка моделируется так же (контролируется total_num_tokens , передаваемым в функцию входа в train ), как предварительное обучение, что предполагает полную (все параметры модели) тонкую настройку. Параметр-эффективная точная настройка (PEFT) находится в будущей поддержке.
Вывод предполагает идеальное перекрытие операций вычислительных и памяти при расчете задержки и максимального повторного использования памяти при расчете использования памяти.
Проверьте Todos ниже, чтобы узнать, что будет дальше, и следите за обновлениями?! Любой вклад или отзывы очень приветствуются!
Если вы используете LLM-анализ в своей работе, пожалуйста, укажите:
Cheng Li. (2023). LLM-Analysis: Latency and Memory Analysis of Transformer Models for Training and Inference. GitHub repository, https://github.com/cli99/llm-analysis.
или
@misc{llm-analysis-chengli,
author = {Cheng Li},
title = {LLM-Analysis: Latency and Memory Analysis of Transformer Models for Training and Inference},
year = {2023},
publisher = {GitHub},
journal = {GitHub repository},
howpublished = {url{https://github.com/cli99/llm-analysis}},
}
Вклад и предложения приветствуются.
Анализ LLM использует предварительную компанию для обеспечения согласованного форматирования кода. Для получения запросов с вкладом кода, пожалуйста, установите предварительную коммерцию ( pip install pre-commit ), а также используемые крючки ( pip install в репо) и отформатируйте код (автоматически запускается перед каждым фиксом GIT) перед отправкой PR.