nnScaler — это механизм распараллеливания, который компилирует модель глубокой нейронной сети (DNN), предназначенную для выполнения на одном графическом процессоре, в программу, способную работать параллельно на нескольких графических процессорах.
Простота использования. Чтобы включить автоматическое распараллеливание, нужно изменить всего несколько строк кода.
Pythonic: выходные данные распараллеливания представлены в коде PyTorch, что упрощает понимание пользователями и делает их удобными для дальнейшей разработки или настройки.
Расширяемость: nnScaler предоставляет API для поддержки новых операторов для новых моделей.
Надежность: nnScaler является надежной системой, проверенной в ходе различных комплексных обучающих курсов.
Производительность. Исследуя большое пространство распараллеливания, nnScaler может значительно повысить производительность параллельного обучения.
Ученые DNN могут сконцентрироваться на разработке моделей с помощью PyTorch на одном графическом процессоре, оставив nnScaler сложности распараллеливания. Он представляет инновационные методы параллелизма, которые превосходят существующие методы по производительности. Кроме того, nnScaler поддерживает расширение модулей DNN новыми структурами или шаблонами выполнения, что позволяет пользователям распараллеливать свои собственные модели DNN.
Эксперты по системам DNN могут использовать nnScaler для изучения новых механизмов и политик распараллеливания DNN для новых моделей. Предоставляя определяемые пользователем функции для новых операторов, не распознаваемых nnScaler, он обеспечивает плавное распараллеливание новых моделей DNN. Например, для облегчения поддержки длинных последовательностей в LLM.
Перед установкой nnScaler установите следующие пакеты:
Python >= 3.8, < 3.11 (3.10 is recommanded) PyTorch >= 2.0, < 2.4 (2.2.0 is recommanded)
Выполните следующие команды в каталоге nnScaler:
pip install -r requirements.txt pip install -e .
Кроме того, чтобы избежать ошибки cppimport , необходимо также включить каталог nnScaler в переменную среды PYTHONPATH :
export NNSCALER_HOME=$(pwd) export PYTHONPATH=${NNSCALER_HOME}:$PYTHONPATH
Установите пакеты, необходимые для запуска Llama-3. Кроме того, при установке flash-attn необходима определенная версия библиотеки CUDA. Например, при использовании PyTorch 2.20 необходим CUDA V11.8.
python -m pip install transformers==4.40.0 flash-attn==2.5.5 tensorboard
Получите доступ к модели Llama-3 от HuggingFace, где вы получите токен доступа, который должен быть установлен как переменная среды:
export HF_TOKEN=<HUGGINGFACE_ACCESS_TOKEN>
Вы можете найти весь пример кода по адресу examples/llama3_8B_128K
. Как показано ниже, пользователю необходимо:
Оформление модели: включите расчет потерь и другие необходимые компоненты.
Настройка компонентов: настройка модели, оптимизатора и загрузчика данных.
Инициализация и запуск: в основной функции создайте трейнер nnScaler с указанными выше конфигурациями и запустите процесс обучения.
# импортируйте встроенный в nnScaler тренажер с возможностью распараллеливания из nnscaler.cli.trainer import Trainer# оберточную модель, включающую вычисления с потерями и т. д.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 вперед(self, sample):outputs = self.model.model(input_ids=samples['net_input']['src_tokens'],use_cache=False,return_dict=False, )loss = torch.sum(chunk_linear_cross_entropy(outputs[0], self.model.lm_head.weight, sample['target'], ...))возвратные потери, sample['ntokens'], sample['nsentences'] def main(args):# data configdataloader_config = ... # model configmodel_config = ModelConfig(type=WrapperModel,args={'model_id': args.model_id, }, )# гиперпараметры оптимизатораOptimizer_config = OptimizerConfig(type=MixedPrecisionAdamW,args={'lr': 2e-5, 'betas': (0.9, 0.95), 'weight_decay': 0.0, 'fused': True},#... )#...# настройка трейнера с конфигами загрузчика/модели/оптимизатора и т.д. трейнер = Trainer(train_args=TrainerArgs(#...model=model_config,optimizer=optimizer_config,dataloader=dataloader_config,#...))trainer.run()
Затем мы можем запустить пример, и все задачи распараллеливания будут выполнены nnScaler автоматически.
cd example/llama3_8B_128K# подготовить данные обучения:python bookcorpus.py --data_path_or_name bookcorpus/bookcorpus --tokenizer_path_or_name мета-llama/Meta-Llama-3-8B-Instruct --save_path ./bookcorpus_llama3_4K --sequence_length 4096# построить мини-модельpython create_mini_model.py --model_id мета-llama/Meta-Llama-3-8B-Instruct --output_id ./llama3_mini#скомпилировать и запустить, используя параллелизм данных + ноль1torchrun --nproc_per_node=2 train.py --plan_ngpus 1 --runtime_ngpus 2 --name llama3_debug --model_id ./llama3_mini --dataset_path ./bookcorpus_llama3_4K
Мы также предоставляем пример, демонстрирующий, как распараллелить модель через PyTorch Lightning-совместимый интерфейс в nnScaler.
Найдите пример nanoGPT в репозитории nnScaler:
примеры компакт-дисков/nanogpt
Установите зависимости nanoGPT:
pip install -r требования.txt
Подготовьте набор данных:
python nanoGPT/data/shakespeare_char/prepare.py
Тест с одним графическим процессором
Теперь вы можете запустить train_nnscaler.py
с помощью torchrun <https://pytorch.org/docs/stable/elastic/run.html>
:
torchrun --nproc_per_node=1 train_nnscaler.py nanoGPT/config/train_shakespeare_char.py
Это позволит обучить дочернюю модель GPT на одном графическом процессоре. Это займет несколько минут, и лучшая потеря при проверке составит около 1,47.
Тест с несколькими графическими процессорами
По умолчанию nnScaler распараллеливает модель на графических процессорах с помощью параллелизма данных . Если у вас 4 графических процессора на одном узле:
torchrun --nproc_per_node=4 train_nnscaler.py nanoGPT/config/train_shakespeare_char.py
Или, если у вас несколько узлов, например 2 узла по 4 графических процессора каждый:
# 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
ПРИМЕЧАНИЕ. Размер локального пакета фиксирован по умолчанию, поэтому использование большего количества рабочих приведет к увеличению глобального размера пакета.
? Для более продвинутого использования, пожалуйста, следите за обновлениями в нашем будущем выпуске.
nnScaler использовался в нескольких проектах, включая как продуктовые, так и исследовательские исследования:
(YOCO)Кэшируется только один раз: архитектуры декодера-декодера для языковых моделей
LongRoPE: расширение контекстного окна LLM за пределы 2 миллионов токенов
Пост-тренинг для длинной контекстной версии серии Phi-3.
Вы можете найти оценку артефактов для OSDI'24 с руководством здесь. Пожалуйста, цитируйте nnScaler в своих публикациях, если это поможет вашему исследованию:
@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} }
Этот проект приветствует вклад и предложения. Большинство вкладов требует от вас согласия с Лицензионным соглашением для авторов (CLA), в котором говорится, что вы имеете право и действительно предоставляете нам права на использование вашего вклада. Подробную информацию можно найти на странице https://cla.opensource.microsoft.com.
Когда вы отправляете запрос на включение, бот CLA автоматически определяет, нужно ли вам предоставить CLA, и соответствующим образом оформляет PR (например, проверку статуса, комментарий). Просто следуйте инструкциям бота. Вам нужно будет сделать это только один раз во всех репозиториях, используя наш CLA.
В этом проекте принят Кодекс поведения Microsoft с открытым исходным кодом. Для получения дополнительной информации ознакомьтесь с часто задаваемыми вопросами по Кодексу поведения или свяжитесь с нами по адресу [email protected], если у вас возникнут дополнительные вопросы или комментарии.
Этот проект может содержать товарные знаки или логотипы проектов, продуктов или услуг. Разрешенное использование товарных знаков и логотипов Microsoft регулируется и должно соответствовать Руководству Microsoft по товарным знакам и брендам. Использование товарных знаков или логотипов Microsoft в измененных версиях этого проекта не должно вызывать путаницу или подразумевать спонсорство Microsoft. Любое использование товарных знаков или логотипов третьих лиц регулируется политикой этих третьих сторон.
Вы можете найти наш общедоступный репозиторий по адресу https://github.com/microsoft/nnscaler или внутренний репозиторий Microsoft https://aka.ms/ms-nnscaler. По любым вопросам или запросам обращайтесь к нам по адресу [email protected].