Esta base de código es la implementación de LayerSkip: Habilitación de inferencia de salida temprana y decodificación autoespeculativa.
$ git clone [email protected]:facebookresearch/LayerSkip.git
$ cd LayerSkip
$ conda create --name layer_skip python=3.10
$ conda activate layer_skip
$ pip install -r requirements.txt
Acceda a los modelos: para observar la aceleración, debe acceder a los LLM que hayan sido entrenados utilizando la receta LayerSkip. Proporcionamos 6 puntos de control en HuggingFace de diferentes modelos de Llama entrenados previamente usando la receta LayerSkip:
facebook/layerskip-llama2-7B
facebook/layerskip-llama2-13B
facebook/layerskip-codellama-7B
facebook/layerskip-codellama-34B
facebook/layerskip-llama3-8B
facebook/layerskip-llama3.2-1B
Para acceder a cada modelo:
huggingface-cli login
y se le pedirá que proporcione el token que obtuvo en el Paso 3.Una vez que ejecute esos pasos, los siguientes comandos para ejecutar los puntos de control de LayerSkip deberían funcionar.
Para ejecutar uno de nuestros modelos en modo interactivo utilizando decodificación autorregresiva normal:
$ torchrun generate.py --model facebook/layerskip-llama2-7B
--sample True
--max_steps 512
Para observar la aceleración, debe utilizar la decodificación autoespeculativa para generar tokens y especificar --exit_layer
, la capa por la que saldrá la etapa de borrador, y --num_speculations
, la cantidad de tokens de borrador:
$ torchrun generate.py --model facebook/layerskip-llama2-7B
--sample True
--max_steps 512
--generation_strategy self_speculative
--exit_layer 8
--num_speculations 6
Consejos:
--model
a cualquier modelo de HuggingFace, pero para observar la aceleración con la decodificación autoespeculativa, use un modelo entrenado usando la receta LayerSkip, como los que tenemos de código abierto en HuggingFace.--sample
, --temperature
, --top_p
y --top_k
.python generate.py --help
para obtener detalles sobre diferentes argumentos de la línea de comandos. Para comparar un conjunto de datos:
$ torchrun benchmark.py --model facebook/layerskip-llama2-7B
--dataset cnn_dm_summarization
--num_samples 100
--generation_strategy self_speculative
--exit_layer 8
--num_speculations 6
--output_dir ./logs
Consejos:
--dataset
:cnn_dm_summarization
: Resumen CNN/DMxsum_summarization
: Resumen XSUMcnn_dm_lm
: Modelado de lenguaje CNN/DM (dadas las primeras palabras de un artículo, genera el artículo restante)human_eval
: Codificación HumanEvaln
-shot especificado especificando el argumento --n_shot
.--sample
, --temperature
, --top_p
y --top_k
.python benchmark.py --help
para obtener detalles sobre diferentes argumentos de la línea de comandos. Hemos integrado nuestros scripts de generación con Eleuther Language Model Assessment Harness para permitir una gran cantidad de tareas y postprocesar adecuadamente el texto generado.
$ torchrun eval.py --model facebook/layerskip-llama2-7B
--tasks gsm8k
--limit 10
--generation_strategy self_speculative
--exit_layer 8
--num_speculations 6
--output_dir ./logs
Consejos:
gsm8k
o cnn_dailymail
), mientras que las tareas de clasificación, es decir, tareas de preguntas de opción múltiple (por ejemplo, piqa
, social_iqa
) o tareas de preguntas de Verdadero/Falso (por ejemplo, boolq
) no conduce a una aceleración.--tasks
. Para obtener una lista de todas las tareas posibles, consulte este enlace.generate.py
y benchmark.py
, puede especificar diferentes modelos, conjuntos de datos y parámetros de muestreo.python benchmark.py --help
para obtener detalles sobre diferentes argumentos de la línea de comandos. Nuestros hiperparámetros de inferencia, exit_layer
y num_speculations
determinan la aceleración durante la inferencia:
exit_layer
:num_speculations
: La combinación óptima de exit_layer
y num_speculations
puede cambiar con el modelo, el conjunto de datos y los parámetros de muestreo. Por lo tanto, proporcionamos un script para recorrer una cuadrícula de diferentes exit_layer
y num_speculations
:
$ torchrun sweep.py --model facebook/layerskip-llama2-7B
--dataset human_eval
--generation_strategy self_speculative
--num_samples 150
--max_steps 256
--output_dir ./logs/
--sample False
Esto creará un archivo CSV en el directorio especificado en el argumento --outpu_dir
.
Consejos:
generate.py
y benchmark.py
, puede especificar diferentes modelos, conjuntos de datos y parámetros de muestreo.python sweep.py --help
para obtener detalles sobre diferentes argumentos de la línea de comandos. Para verificar que los tokens generados por nuestro algoritmo de decodificación autoespeculativa sean correctos, hemos creado un script para comparar los resultados de la decodificación autorregresiva con la decodificación autoespeculativa. Tenga en cuenta que las salidas solo podemos garantizar la equivalencia cuando no hay muestreo (es decir, --sample False
):
$ torchrun correctness.py --model facebook/layerskip-llama2-7B
--dataset human_eval
--generation_strategy self_speculative
--num_speculations 6
--exit_layer 4
--num_samples 10
--sample False
--output_dir ./logs
Por favor revise DOCKER.md para configurar el proyecto usando Docker
También tenemos otras implementaciones de inferencia LayerSkip:
torch.compile()
, cuantificación y paralelismo tensorial.Nuestra implementación de capacitación es un trabajo en progreso. Puede consultar esta solicitud de extracción para obtener detalles y discusiones.
LayerSkip tiene una licencia CC-by-NC. Consulte el archivo LICENCIA en el directorio de nivel superior.
Agradecemos las contribuciones a LayerSkip. Si está interesado en contribuir, consulte este documento.
Si utiliza LayerSkip en su investigación, utilice la siguiente entrada BibTex:
@misc { layerskip ,
title = { LayerSkip: Enabling Early Exit Inference and Self-Speculative Decoding } ,
author = { Mostafa Elhoushi and Akshat Shrivastava and Diana Liskovich and Basil Hosmer and Bram Wasti and Liangzhen Lai and Anas Mahmoud and Bilge Acun and Saurabh Agarwal and Ahmed Roman and Ahmed A Aly and Beidi Chen and Carole-Jean Wu } ,
booktitle = " Proceedings of the 62nd Annual Meeting of the Association for Computational Linguistics (Volume 1: Long Papers) " ,
month = aug,
year = " 2024 " ,
address = " Bangkok, Thailand " ,
publisher = " Association for Computational Linguistics " ,
url = " https://aclanthology.org/2024.acl-long.681 " ,
doi = " 10.18653/v1/2024.acl-long.681 " ,
pages = " 12622--12642 " ,
}