nnScaler é um mecanismo de paralelização que compila um modelo de rede neural profunda (DNN) projetado para execução de GPU única em um programa capaz de ser executado em paralelo em várias GPUs.
Facilidade de uso: apenas algumas linhas de código precisam ser alteradas para permitir a paralelização automatizada.
Pythonic: A saída da paralelização está no código PyTorch, tornando-o fácil de entender para os usuários e conveniente para desenvolvimento ou personalização adicional.
Extensibilidade: nnScaler expõe uma API para oferecer suporte a novos operadores para modelos emergentes.
Confiabilidade: Verificado por meio de várias sessões de treinamento completas, o nnScaler é um sistema confiável.
Desempenho: Ao explorar um grande espaço de paralelização, o nnScaler pode melhorar significativamente o desempenho do treinamento paralelo.
Para os cientistas da DNN , eles podem se concentrar no design do modelo com PyTorch em uma única GPU, deixando as complexidades de paralelização para o nnScaler. Ele introduz técnicas inovadoras de paralelismo que superam os métodos existentes em desempenho. Além disso, o nnScaler suporta a extensão de módulos DNN com novas estruturas ou padrões de execução, permitindo aos usuários paralelizar seus modelos DNN personalizados.
Para especialistas em sistemas DNN , eles podem aproveitar o nnScaler para explorar novos mecanismos e políticas de paralelização de DNN para modelos emergentes. Ao fornecer funções definidas pelo usuário para novos operadores não reconhecidos pelo nnScaler, garante uma paralelização perfeita de novos modelos DNN. Por exemplo, para facilitar o suporte a sequências longas em LLMs.
Instale os seguintes pacotes antes da instalação do nnScaler:
Python >= 3.8, < 3.11 (3.10 is recommanded) PyTorch >= 2.0, < 2.4 (2.2.0 is recommanded)
Execute os comandos abaixo no diretório nnScaler:
pip install -r requirements.txt pip install -e .
Além disso, para evitar erros de cppimport , também é necessário incluir o diretório nnScaler na variável de ambiente PYTHONPATH :
export NNSCALER_HOME=$(pwd) export PYTHONPATH=${NNSCALER_HOME}:$PYTHONPATH
Instale os pacotes necessários para executar o Llama-3. Além disso, uma determinada versão da biblioteca CUDA é necessária durante a instalação do flash-attn. Por exemplo, CUDA V11.8 é necessário se estiver usando PyTorch 2.20.
python -m pip install transformers==4.40.0 flash-attn==2.5.5 tensorboard
Obtenha acesso ao modelo Llama-3 do HuggingFace, onde você receberá um token de acesso que deverá ser definido como uma variável de ambiente:
export HF_TOKEN=<HUGGINGFACE_ACCESS_TOKEN>
Você pode encontrar todo o código de exemplo em examples/llama3_8B_128K
. Conforme mostrado abaixo, um usuário precisa:
Envolva o modelo: inclua cálculo de perdas e outros componentes necessários.
Configurar componentes: configure o modelo, o otimizador e o carregador de dados.
Inicializar e iniciar: Na função principal, crie um treinador nnScaler com as configurações acima e inicie o processo de treinamento.
# importe o treinador com capacidade de paralelização integrado do nnScaler de nnscaler.cli.trainer import Trainer# modelo de wrap para incluir computação de perda, 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, )perda = torch.sum(chunk_linear_cross_entropy(outputs[0], self.model.lm_head.weight, samples['target'], ...))perda de retorno, amostras['ntokens'], amostras['nsentences'] def main(args):# data configdataloader_config = ... # model configmodel_config = ModelConfig(type=WrapperModel,args={'model_id': args.model_id, }, )# hiperparâmetros do otimizador otimizador_config = OptimizerConfig(type=MixedPrecisionAdamW,args={'lr': 2e-5, 'betas': (0,9, 0,95), 'weight_decay': 0,0, 'fused': True},#... )#...# treinador de configuração com configurações de dataloader/model/optimizer, etc. trainer = Trainer(train_args=TrainerArgs(#...model=model_config,optimizer=optimizer_config,dataloader=dataloader_config,#...))trainer.run()
Então podemos iniciar o exemplo, e todas as tarefas de paralelização serão finalizadas pelo nnScaler automaticamente.
exemplos de cd/llama3_8B_128K# preparar dados de treinamento: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# construir o mini modelopython create_mini_model.py --model_id meta-llama/Meta-Llama-3-8B-Instruct --output_id ./llama3_mini#compile e execute usando paralelismo de dados + 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
Também fornecemos um exemplo para demonstrar como paralelizar um modelo por meio de uma interface compatível com PyTorch Lightning no nnScaler.
Encontre o exemplo nanoGPT no repositório nnScaler:
exemplos de cd/nanogpt
Instale as dependências do nanoGPT:
pip instalar -r requisitos.txt
Preparar conjunto de dados:
python nanoGPT/data/shakespeare_char/prepare.py
Teste com GPU única
Agora você pode executar train_nnscaler.py
com torchrun <https://pytorch.org/docs/stable/elastic/run.html>
:
torchrun --nproc_per_node=1 train_nnscaler.py nanoGPT/config/train_shakespeare_char.py
Isso treinará um modelo GPT bebê em uma única GPU. Isso levará vários minutos e a melhor perda de validação será em torno de 1,47.
Teste com Multi-GPU
Por padrão, o nnScaler paraleliza um modelo em GPUs com paralelismo de dados . Se você tiver 4 GPUs em um nó:
torchrun --nproc_per_node=4 train_nnscaler.py nanoGPT/config/train_shakespeare_char.py
Ou se você tiver vários nós, por exemplo, 2 nós com 4 GPUs cada:
# 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: O tamanho do lote local é fixo por padrão, portanto, usar mais trabalhadores resultará em um tamanho de lote global maior.
? Para usos avançados, fique atento ao nosso lançamento futuro.
O nnScaler foi adotado por vários projetos, incluindo explorações de produtos e pesquisas:
(YOCO)Você armazena em cache apenas uma vez: arquiteturas decodificador-decodificador para modelos de linguagem
LongRoPE: Estendendo a janela de contexto LLM além de 2 milhões de tokens
Pós-treinamento para a versão de contexto longo da série Phi-3
Você pode encontrar a Avaliação de Artefato para OSDI'24 com orientação aqui. Por favor, cite nnScaler em suas publicações se isso ajudar em sua pesquisa:
@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 projeto aceita contribuições e sugestões. A maioria das contribuições exige que você concorde com um Contrato de Licença de Colaborador (CLA), declarando que você tem o direito de nos conceder, e realmente nos concede, os direitos de uso de sua contribuição. Para obter detalhes, visite https://cla.opensource.microsoft.com.
Quando você envia uma solicitação pull, um bot CLA determinará automaticamente se você precisa fornecer um CLA e decorará o PR adequadamente (por exemplo, verificação de status, comentário). Basta seguir as instruções fornecidas pelo bot. Você só precisará fazer isso uma vez em todos os repositórios que usam nosso CLA.
Este projeto adotou o Código de Conduta de Código Aberto da Microsoft. Para obter mais informações, consulte as Perguntas frequentes sobre o Código de Conduta ou entre em contato com [email protected] com perguntas ou comentários adicionais.
Este projeto pode conter marcas registradas ou logotipos de projetos, produtos ou serviços. O uso autorizado de marcas registradas ou logotipos da Microsoft está sujeito e deve seguir as Diretrizes de Marcas Registradas e Marcas da Microsoft. O uso de marcas registradas ou logotipos da Microsoft em versões modificadas deste projeto não deve causar confusão nem implicar patrocínio da Microsoft. Qualquer uso de marcas registradas ou logotipos de terceiros está sujeito às políticas desses terceiros.
Você pode encontrar nosso repositório público em https://github.com/microsoft/nnscaler ou no repositório interno da Microsoft https://aka.ms/ms-nnscaler. Para quaisquer dúvidas ou perguntas, entre em contato conosco em [email protected].