Análisis de latencia y memoria de modelos de transformadores para entrenamiento e inferencia
LLMAnalysis Muchas fórmulas o ecuaciones están flotando en documentos, blogs, etc., sobre cómo calcular la capacitación o la latencia de inferencia y la memoria para modelos de idiomas grandes (LLM) o transformadores. En lugar de hacer matemáticas en documentos o escribir en sábanas de Excel, let's automate the boring stuff with llm-analysis !
Dado el modelo especificado, la GPU, el tipo de datos y las configuraciones de paralelismo, el análisis LLM estima el uso de latencia y memoria de LLM para capacitación o inferencia. Con el análisis LLM, se puede probar fácilmente diferentes configuraciones de entrenamiento/inferencia teóricamente y comprender mejor el rendimiento del sistema para diferentes escenarios.
El análisis de LLM ayuda a responder preguntas como:
feasible (no OOM) y optimal (maximización del rendimiento con una restricción de latencia) para capacitación o inferenciatime que lleva con la configuración dada hacer capacitación o inferencia y el cost (hora GPU)modeling change , hardware improvement , quantization , parallelism , etc.)Verifique los casos de uso de ejemplo. Con el análisis LLM, ¡puede hacer ese análisis en minutos!
Para instalar el análisis LLM de PYPI:
pip install llm-analysisPara instalar la última compilación de desarrollo:
pip install --upgrade git+https://github.com/cli99/llm-analysis.git@main Para instalar desde la fuente, clone el repositorio y ejecute pip install . o poetry install (instalar poesía por pip install poetry ).
LLMAnalysis Para integrar el análisis de LLM en su código, use la clase LLMAnalysis . Consulte Doc Llmanálisis para más detalles.
LLMAnalysis se construye con flops y números de eficiencia de memoria y las siguientes clases de configuración:
ModelConfig cubre la información del modelo, es decir, la longitud de secuencia máxima, número de capas de transformadores, número de cabezas de atención, dimensión oculta, tamaño de vocabularioGPUConfig cubre el cálculo de la GPU y las especificaciones de memoriaDtypeConfig cubre el número de bits utilizados para el peso del modelo, activación e incrustaciónParallelismConfig cubre el paralelismo del tensor ( tp ), el paralelismo de la tubería ( pp ), el paralelismo de secuencia ( sp ), el paralelismo experto ( ep ) y el paralelismo de datos ( dp ). Luego se puede consultar LLMAnalysis con diferentes argumentos a través de los métodos de capacitación e inferencia.
El análisis de LLM proporciona dos funciones de entrada, trenes e infiere, para facilitar el uso a través de la interfaz de línea de comandos. Correr
python -m llm_analysis.analysis train --helpo
python -m llm_analysis.analysis infer --helpPara verificar las opciones o leer el documento vinculado. Consulte los ejemplos para ver cómo se usan.
train e infer use las asignaciones predefinidas de nombre a configuración ( model_configs , gpu_configs , dtype_configs ) y otros argumentos de entrada de usuario para construir la LLMAnalysis y hacer la consulta.
Las asignaciones predefinidas se poblan en el tiempo de ejecución desde el modelo, la GPU y los archivos json de configuración de tipo de datos en model_configs, GPU_Configs y Dtype_Configs. Para agregar un nuevo modelo, GPU o tipo de datos a la asignación de consulta, simplemente agregue un archivo de descripción json a la carpeta correspondiente.
El análisis de LLM también admite recuperar ModelConfig de una ruta de archivo JSON de configuración modelo o una cara de abrazo con el nombre del modelo.
python -m llm_analysis.analysis train --model_name=local_example_model.json . Verifique las configuraciones del modelo en la carpeta model_configs.EleutherAI/gpt-neox-20b como model_name al llamar al train o infer funciones de entrada. python -m llm_analysis.analysis train --model_name=EleutherAI/gpt-neox-20b --total_num_gpus 32 --ds_zero 3 . Con este método, el análisis LLM se basa en transformers para encontrar la configuración del modelo correspondiente en huggingface.co/models, lo que significa que la información de los modelos más nuevos solo existe después de cierta versión de la biblioteca Transformers. Para acceder a los últimos modelos a través de sus nombres, actualice el paquete transformers instalado. Se proporciona una lista de comandos útiles para consultar con las asignaciones predefinidas, así como abrazar la cara o volcar configuraciones. Ejecute python -m llm_analysis.config --help para más detalles.
Algunos ejemplos:
python -m llm_analysis.config get_model_config_by_name EleutherAI/gpt-neox-20b Obtiene el ModelConfig del mapeo poblado por su nombre, si no se encuentra, el análisis de LLM intenta obtener de Huggingface.
Tenga en cuenta que los modelos de LLAMA necesitan al menos transformers-4.28.1 para recuperar, ya sea actualizar a una biblioteca transformers posteriores, o usar el ModelConfig predefinido para los modelos de LLAMA ( / en los nombres de modelos se reemplazan con _ ).
python -m llm_analysis.config list_gpu_configsEnumera los nombres de todas las configuraciones de GPU predefinidas, luego puede consultar con
python -m llm_analysis.config get_gpu_config_by_name a100-sxm-80gb Para mostrar el GPUConfig correspondiente.
La configuración de los fracasos y la eficiencia de la memoria en 1 (predeterminado) proporciona el límite inferior de la latencia de entrenamiento o inferencia, ya que supone el rendimiento máximo del hardware (que nunca es el caso). Se puede encontrar un flujo cercano a la realidad o una eficiencia de memoria mediante la evaluación comparativa y el perfil utilizando las dimensiones de entrada en el modelo.
Si uno tiene que hacer suposiciones, para la eficiencia de los flops, la literatura informa hasta 0.5 para el entrenamiento de modelos a gran escala y hasta 0.7 para inferencia; 0.9 puede ser un objetivo agresivo para la eficiencia de la memoria.
El análisis de LLM tiene como objetivo proporcionar una estimación lower-bound del uso y la latencia de la memoria.
El análisis de LLM actualmente cubre el paralelismo tensor (TP), el paralelismo de la tubería (PP), el paralelismo de secuencia (SP), el paralelismo experto (EP) y el paralelismo de datos (DP).
TP, PP y SP adoptan el estilo de paralelización utilizado en Megatron-LM para el entrenamiento y FasterTransformer para la inferencia
En el análisis de entrenamiento, el fragmento de DP asume el uso de DeepSpeed ZeRO o FSDP . ds_zero se usa para especificar la estrategia de fragmento de DP
| ds_zero | Deepeed cero | FSDP | Fragmento |
|---|---|---|---|
| 0 | desactivado | No_shard | Sin fragmentos |
| 1 | Etapa 1 | N / A | Estados optimizadores de fragmentos |
| 2 | Etapa 2 | Shard_grad_op | Gradientes de fragmentos y estados optimizadores |
| 3 | Etapa 3 | Full_shard | Gradientes de fragmentos, estados optimizadores, parámetros del modelo |
EP paraleliza el número de expertos en MLP en los dispositivos ep_size , es decir, el número de expertos por GPU es total number of experts / ep_size . Por lo tanto, para el módulo MLP, el número de dispositivos para otras dimensiones de paralelización se divide por ep_size en comparación con otras partes del modelo.
La comunicación de TP se calcula como utilizando ring allreduce . La comunicación EP se calcula como utilizando alltoall . El tiempo de comunicación de DP para deshacer el peso del modelo Cuando se usa FSDP o Deepspeed Zero se estima y se compara con la latencia de cálculo, el mayor valor de los dos se usa para la latencia general. Otras comunicaciones de DP y PP se ignoran por ahora, es decir, suponiendo que el cálculo perfecto y la superposición de comunicación se superpongan, lo que no es cierto cuando la comunicación no puede superponerse con el cálculo debido a la dependencia, o cuando la comunicación es demasiado larga para esconderse debido a una interconexión lenta o un gran volumen de datos.
El análisis LLM admite la recomputación de activación completa y selectiva.
| activación_recomputación | ¿Qué es el control de control y recomputado? |
|---|---|
| 0 | Sin recomputación de activación; requiere la mayor cantidad de memoria |
| 1 | Los puntos de control del cálculo de atención (QK^t matriz Multiply, Softmax, Softmax desacelerando y atención sobre V.) en el módulo de atención de una capa del transformador; Como se describe en la reducción de la recomputación de la activación en modelos de transformadores grandes. |
| 2 | Puntos de control La entrada al módulo de atención en una capa de transformador; requiere un pase adicional adicional sobre la atención. |
| 3 | Puntos de control La entrada a la secuencia de módulos (Layernom-Atention-Layernom) en una capa de transformador; requiere un pase adicional hacia adelante (Layernom-Atention-Layernom). |
| 4 | La recomputación de activación completa almacena la entrada a la capa del transformador; requiere la menor cantidad de memoria; Requiere un pase adicional adicional de toda la capa. |
Los tipos de datos se expresan con el número de bits, solo 32 (FP32, TF32), 16 (FP16, BF16), 8 (INT8) e 4 (INT4) Los tipos de datos de bits se modelan por ahora.
El ajuste fino se modela de la misma manera (controlado por total_num_tokens pasada a la función de entrada train ) como el entrenamiento previo, asumiendo así el ajuste completo (todos los parámetros del modelo). El ajuste fino de los parámetros (PEFT) es de apoyo futuro.
La inferencia asume la superposición perfecta de las operaciones de cálculo y memoria al calcular la latencia, y la reutilización de memoria máxima al calcular el uso de la memoria.
¡Revise los TODOS a continuación, ¿qué sigue y estad atentos? ¡Cualquier contribución o retroalimentación es muy bienvenido!
Si usa el análisis LLM en su trabajo, cite:
Cheng Li. (2023). LLM-Analysis: Latency and Memory Analysis of Transformer Models for Training and Inference. GitHub repository, https://github.com/cli99/llm-analysis.
o
@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}},
}
Las contribuciones y sugerencias son bienvenidas.
El análisis de LLM utiliza un pre-compromiso para garantizar que el formato del código sea consistente. Para las solicitudes de extracción con la contribución del código, instale el pre-Commit ( pip install pre-commit ), así como los ganchos usados ( pip install en el repositorio) y formaten el código (se ejecute automáticamente antes de cada confirmación de GIT) antes de enviar el PR.