nnScaler es un motor de paralelización que compila un modelo de red neuronal profunda (DNN) diseñado para la ejecución con una sola GPU en un programa capaz de ejecutarse en paralelo en varias GPU.
Facilidad de uso: solo es necesario cambiar unas pocas líneas de código para permitir la paralelización automatizada.
Pythonic: la salida de paralelización está en código PyTorch, lo que hace que sea fácil de entender para los usuarios y conveniente para un mayor desarrollo o personalización.
Extensibilidad: nnScaler expone una API para admitir nuevos operadores para modelos emergentes.
Confiabilidad: verificado a través de varias sesiones de capacitación de un extremo a otro, nnScaler es un sistema confiable.
Rendimiento: al explorar un gran espacio de paralelización, nnScaler puede mejorar significativamente el rendimiento del entrenamiento en paralelo.
Los científicos de DNN pueden concentrarse en el diseño de modelos con PyTorch en una sola GPU, dejando las complejidades de paralelización a nnScaler. Introduce técnicas innovadoras de paralelismo que superan los métodos existentes en rendimiento. Además, nnScaler admite la extensión de módulos DNN con nuevas estructuras o patrones de ejecución, lo que permite a los usuarios paralelizar sus modelos DNN personalizados.
Los expertos en sistemas DNN pueden aprovechar nnScaler para explorar nuevos mecanismos y políticas de paralelización de DNN para modelos emergentes. Al proporcionar funciones definidas por el usuario para nuevos operadores no reconocidos por nnScaler, garantiza una paralelización perfecta de nuevos modelos DNN. Por ejemplo, para facilitar el soporte de secuencias largas en LLM.
Instale los siguientes paquetes antes de instalar nnScaler:
Python >= 3.8, < 3.11 (3.10 is recommanded) PyTorch >= 2.0, < 2.4 (2.2.0 is recommanded)
Ejecute los siguientes comandos en el directorio nnScaler:
pip install -r requirements.txt pip install -e .
Además, para evitar el error de cppimport , también es necesario incluir el directorio nnScaler en la variable de entorno PYTHONPATH :
export NNSCALER_HOME=$(pwd) export PYTHONPATH=${NNSCALER_HOME}:$PYTHONPATH
Instale los paquetes necesarios para ejecutar Llama-3. Además, se necesita una determinada versión de la biblioteca CUDA durante la instalación de flash-attn. Por ejemplo, se necesita CUDA V11.8 si se utiliza PyTorch 2.20.
python -m pip install transformers==4.40.0 flash-attn==2.5.5 tensorboard
Obtenga acceso al modelo Llama-3 de HuggingFace, donde recibirá un token de acceso que debe configurarse como una variable de entorno:
export HF_TOKEN=<HUGGINGFACE_ACCESS_TOKEN>
Puede encontrar todo el código de ejemplo en examples/llama3_8B_128K
. Como se muestra a continuación, un usuario necesita:
Envuelva el modelo: incluya cálculo de pérdidas y otros componentes necesarios.
Configurar componentes: configure el modelo, el optimizador y el cargador de datos.
Inicializar e iniciar: en la función principal, cree un entrenador nnScaler con las configuraciones anteriores e inicie el proceso de capacitación.
# importar el entrenador con capacidad de paralelización incorporado de nnScaler desde nnscaler.cli.trainer importar el modelo de envoltura de Trainer# para incluir la computación de pérdidas, etc.class WrapperModel(torch.nn.Module):def __init__(self, model_id):super(). __init__()self.model = AutoModelForCausalLM.from_pretrained(model_id, attn_implementation='flash_attention_2')def forward(self, samples):outputs = self.model.model(input_ids=samples['net_input']['src_tokens'],use_cache=False,return_dict=False, )pérdida = torch.sum(chunk_linear_cross_entropy(salidas[0], self.model.lm_head.weight, muestras['target'], ...))pérdida de retorno, muestras['ntokens'], muestras['nsentences'] def main(args):# datos configdataloader_config = ... # modelo configmodel_config = ModelConfig(tipo=WrapperModel,args={'model_id': args.model_id, }, )# hiperparámetros del optimizador optimizador_config = OptimizerConfig(type=MixedPrecisionAdamW,args={'lr': 2e-5, 'betas': (0.9, 0.95), 'weight_decay': 0.0, 'fused': True},#... )#...# configurar el entrenador con configuraciones de cargador de datos/modelo/optimizador, etc. entrenador = Entrenador(train_args=TrainerArgs(#...model=model_config,optimizer=optimizer_config,dataloader=dataloader_config,#...))trainer.run()
Luego podemos comenzar el ejemplo y nnScaler finalizará todas las tareas de paralelización automáticamente.
ejemplos de cd/llama3_8B_128K# preparar datos de entrenamiento:python bookcorpus.py --data_path_or_name bookcorpus/bookcorpus --tokenizer_path_or_name meta-llama/Meta-Llama-3-8B-Instruct --save_path ./bookcorpus_llama3_4K --sequence_length 4096# construye el mini modelopython crear_mini_modelo.py --model_id meta-llama/Meta-Llama-3-8B-Instruct --output_id ./llama3_mini#compila y ejecuta usando paralelismo de datos + zero1torchrun --nproc_per_node=2 train.py --plan_ngpus 1 --runtime_ngpus 2 --name llama3_debug --model_id ./llama3_mini --dataset_path ./bookcorpus_llama3_4K
También proporcionamos un ejemplo para demostrar cómo paralelizar un modelo a través de una interfaz compatible con PyTorch Lightning en nnScaler.
Encuentre el ejemplo de nanoGPT en el repositorio de nnScaler:
ejemplos de cd/nanopt
Instale las dependencias de nanoGPT:
instalación de pip -r requisitos.txt
Preparar conjunto de datos:
Python nanoGPT/data/shakespeare_char/prepare.py
Prueba con una sola GPU
Ahora puedes ejecutar train_nnscaler.py
con torchrun <https://pytorch.org/docs/stable/elastic/run.html>
:
torchrun --nproc_per_node=1 train_nnscaler.py nanoGPT/config/train_shakespeare_char.py
Esto entrenará un modelo GPT bebé en una sola GPU. Tardará varios minutos y la mejor pérdida de validación será de alrededor de 1,47.
Prueba con GPU múltiple
De forma predeterminada, nnScaler paraleliza un modelo sobre GPU con paralelismo de datos . Si tiene 4 GPU en un nodo:
torchrun --nproc_per_node=4 train_nnscaler.py nanoGPT/config/train_shakespeare_char.py
O si tiene varios nodos, por ejemplo 2 nodos con 4 GPU cada uno:
# on each node torchrun --nnodes=2 --nproc_per_node=4 --rdzv-id=NNSCALER_NANOGPT --rdzv-backend=c10d --rdzv-endpoint=<IP> train_nnscaler.py nanoGPT/config/train_shakespeare_char.py
NOTA: El tamaño del lote local está fijo de forma predeterminada, por lo que el uso de más trabajadores dará como resultado un tamaño de lote global mayor.
? Para usos avanzados, permanezca atento a nuestra versión futura.
nnScaler ha sido adoptado por múltiples proyectos, incluidas exploraciones de investigación y productos:
(YOCO) Solo se almacena en caché una vez: arquitecturas decodificador-decodificador para modelos de lenguaje
LongRoPE: Ampliación de la ventana de contexto de LLM más allá de 2 millones de tokens
Post capacitación para la versión de contexto largo de la serie Phi-3
Puede encontrar la Evaluación de artefactos para OSDI'24 con la guía aquí. Cite nnScaler en sus publicaciones si le ayuda en su investigación:
@inproceedings{lin2024nnscaler, title = {nnScaler: Constraint-Guided Parallelization Plan Generation for Deep Learning Training}, author={Lin, Zhiqi and Miao, Youshan and Zhang, Quanlu and Yang, Fan and Zhu, Yi and Li, Cheng and Maleki, Saeed and Cao, Xu and Shang, Ning and Yang, Yilei and Xu, Weijiang and Yang, Mao and Zhang, Lintao and Zhou, Lidong}, booktitle={18th USENIX Symposium on Operating Systems Design and Implementation (OSDI 24)}, pages={347--363}, year={2024} }
Este proyecto agradece contribuciones y sugerencias. La mayoría de las contribuciones requieren que usted acepte un Acuerdo de licencia de colaborador (CLA) que declara que tiene derecho a otorgarnos, y de hecho lo hace, los derechos para usar su contribución. Para obtener más detalles, visite https://cla.opensource.microsoft.com.
Cuando envía una solicitud de extracción, un bot CLA determinará automáticamente si necesita proporcionar un CLA y decorar el PR de manera adecuada (por ejemplo, verificación de estado, comentario). Simplemente siga las instrucciones proporcionadas por el bot. Solo necesitarás hacer esto una vez en todos los repositorios que utilicen nuestro CLA.
Este proyecto ha adoptado el Código de conducta de código abierto de Microsoft. Para obtener más información, consulte las preguntas frecuentes sobre el Código de conducta o comuníquese con [email protected] si tiene alguna pregunta o comentario adicional.
Este proyecto puede contener marcas comerciales o logotipos de proyectos, productos o servicios. El uso autorizado de las marcas comerciales o logotipos de Microsoft está sujeto y debe seguir las Pautas de marcas y marcas comerciales de Microsoft. El uso de marcas comerciales o logotipos de Microsoft en versiones modificadas de este proyecto no debe causar confusión ni implicar patrocinio de Microsoft. Cualquier uso de marcas comerciales o logotipos de terceros está sujeto a las políticas de dichos terceros.
Puede encontrar nuestro repositorio público en https://github.com/microsoft/nnscaler o el repositorio interno de Microsoft https://aka.ms/ms-nnscaler. Si tiene alguna pregunta o consulta, comuníquese con nosotros en [email protected].