nnScaler ist eine Parallelisierungs-Engine, die ein Deep Neural Network (DNN)-Modell, das für die Ausführung auf einer einzelnen GPU konzipiert ist, in ein Programm kompiliert, das auf mehreren GPUs parallel ausgeführt werden kann.
Benutzerfreundlichkeit: Es müssen nur wenige Codezeilen geändert werden, um eine automatisierte Parallelisierung zu ermöglichen.
Pythonic: Die Parallelisierungsausgabe erfolgt im PyTorch-Code, sodass sie für Benutzer leicht verständlich und für die weitere Entwicklung oder Anpassung geeignet ist.
Erweiterbarkeit: nnScaler stellt eine API zur Unterstützung neuer Operatoren für neue Modelle bereit.
Zuverlässigkeit: Durch verschiedene End-to-End-Schulungen wurde bestätigt, dass nnScaler ein zuverlässiges System ist.
Leistung: Durch die Erkundung eines großen Parallelisierungsraums kann nnScaler die Leistung des parallelen Trainings erheblich verbessern.
DNN-Wissenschaftler können sich auf das Modelldesign mit PyTorch auf einer einzelnen GPU konzentrieren und die Parallelisierungskomplexität nnScaler überlassen. Es führt innovative Parallelitätstechniken ein, die bestehende Methoden in der Leistung übertreffen. Darüber hinaus unterstützt nnScaler die Erweiterung von DNN-Modulen um neue Strukturen oder Ausführungsmuster, sodass Benutzer ihre benutzerdefinierten DNN-Modelle parallelisieren können.
DNN-Systemexperten können nnScaler nutzen, um neue DNN-Parallelisierungsmechanismen und -Richtlinien für neue Modelle zu erkunden. Durch die Bereitstellung benutzerdefinierter Funktionen für neue Operatoren, die von nnScaler nicht erkannt werden, wird eine nahtlose Parallelisierung neuartiger DNN-Modelle sichergestellt. Zum Beispiel, um die Unterstützung langer Sequenzen in LLMs zu erleichtern.
Installieren Sie vor der Installation von nnScaler die folgenden Pakete:
Python >= 3.8, < 3.11 (3.10 is recommanded) PyTorch >= 2.0, < 2.4 (2.2.0 is recommanded)
Führen Sie die folgenden Befehle im nnScaler-Verzeichnis aus:
pip install -r requirements.txt pip install -e .
Um einen cppimport- Fehler zu vermeiden, muss außerdem das Verzeichnis nnScaler in die Umgebungsvariable PYTHONPATH aufgenommen werden:
export NNSCALER_HOME=$(pwd) export PYTHONPATH=${NNSCALER_HOME}:$PYTHONPATH
Installieren Sie die zum Ausführen von Llama-3 erforderlichen Pakete. Außerdem ist während der Flash-Attn-Installation eine bestimmte Version der CUDA-Bibliothek erforderlich. Beispielsweise ist CUDA V11.8 erforderlich, wenn PyTorch 2.20 verwendet wird.
python -m pip install transformers==4.40.0 flash-attn==2.5.5 tensorboard
Erhalten Sie Zugriff auf das Llama-3-Modell von HuggingFace, wo Sie ein Zugriffstoken erhalten, das als Umgebungsvariable festgelegt werden sollte:
export HF_TOKEN=<HUGGINGFACE_ACCESS_TOKEN>
Den gesamten Beispielcode finden Sie unter examples/llama3_8B_128K
. Wie unten gezeigt, muss ein Benutzer:
Verpacken Sie das Modell: Beziehen Sie Verlustberechnungen und andere notwendige Komponenten ein.
Komponenten konfigurieren: Richten Sie das Modell, den Optimierer und den Datenlader ein.
Initialisieren und starten: Erstellen Sie in der Hauptfunktion einen nnScaler-Trainer mit den oben genannten Konfigurationen und starten Sie den Trainingsprozess.
# Importieren Sie den in nnScaler integrierten parallelisierungsfähigen Trainer aus nnscaler.cli.trainer import Trainer# Wrap-Modell, um Verlustberechnung usw. einzubeziehen. Klasse 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, )loss = Torch.sum(chunk_linear_cross_entropy(outputs[0], self.model.lm_head.weight, Samples['target'], ...))return Loss, Samples['ntokens'], Samples['nsentences'] def main(args):# data configdataloader_config = ... # model configmodel_config = ModelConfig(type=WrapperModel,args={'model_id': args.model_id, }, )# Optimizer Hyperparametersoptimierer_config = OptimizerConfig(type=MixedPrecisionAdamW,args={'lr': 2e-5, 'betas': (0.9, 0.95), 'weight_decay': 0.0, 'fused': True},#... )#...# Setup-Trainer mit Konfigurationen von Datenlader/Modell/Optimierer usw. Trainer = Trainer(train_args=TrainerArgs(#...model=model_config,optimizer=optimizer_config,dataloader=dataloader_config,#...))trainer.run()
Dann können wir mit dem Beispiel beginnen und alle Parallelisierungsaufgaben werden von nnScaler automatisch abgeschlossen.
cd examples/llama3_8B_128K# Trainingsdaten vorbereiten: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# Erstellen Sie das Mini-Modellpython create_mini_model.py --model_id meta-llama/Meta-Llama-3-8B-Instruct --output_id ./llama3_mini#kompilieren und ausführen mit Datenparallelität + 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
Wir stellen außerdem ein Beispiel zur Verfügung, um zu demonstrieren, wie ein Modell über eine PyTorch Lightning-kompatible Schnittstelle in nnScaler parallelisiert wird.
Finden Sie das nanoGPT-Beispiel im nnScaler-Repo:
CD-Beispiele/Nanopt
Installieren Sie die Abhängigkeiten von nanoGPT:
pip install -r Anforderungen.txt
Datensatz vorbereiten:
python nanoGPT/data/shakespeare_char/prepare.py
Testen Sie mit einer einzelnen GPU
Jetzt können Sie train_nnscaler.py
mit torchrun <https://pytorch.org/docs/stable/elastic/run.html>
ausführen:
torchrun --nproc_per_node=1 train_nnscaler.py nanoGPT/config/train_shakespeare_char.py
Dadurch wird ein kleines GPT-Modell auf einer einzelnen GPU trainiert. Es dauert mehrere Minuten und der beste Validierungsverlust liegt bei etwa 1,47.
Testen Sie mit Multi-GPU
Standardmäßig parallelisiert nnScaler ein Modell über GPUs mit Datenparallelität . Wenn Sie 4 GPUs auf einem Knoten haben:
torchrun --nproc_per_node=4 train_nnscaler.py nanoGPT/config/train_shakespeare_char.py
Oder wenn Sie mehrere Knoten haben, zum Beispiel 2 Knoten mit jeweils 4 GPUs:
# 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
HINWEIS: Die lokale Batch-Größe ist standardmäßig festgelegt, sodass die Verwendung von mehr Workern zu einer größeren globalen Batch-Größe führt.
? Für erweiterte Nutzungsmöglichkeiten bleiben Sie bitte auf dem Laufenden über unsere zukünftige Version.
nnScaler wurde von mehreren Projekten übernommen, darunter sowohl Produkt- als auch Forschungsexplorationen:
(YOCO)Sie zwischenspeichern nur einmal: Decoder-Decoder-Architekturen für Sprachmodelle
LongRoPE: Erweiterung des LLM-Kontextfensters auf über 2 Millionen Token
Nachschulung für die lange Kontextversion der Phi-3-Serie
Die Artefaktbewertung für OSDI'24 mit Anleitung finden Sie hier. Bitte zitieren Sie nnScaler in Ihren Publikationen, wenn es Ihrer Forschung hilft:
@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} }
Dieses Projekt freut sich über Beiträge und Vorschläge. Für die meisten Beiträge müssen Sie einem Contributor License Agreement (CLA) zustimmen, in dem Sie erklären, dass Sie das Recht haben, uns die Rechte zur Nutzung Ihres Beitrags zu gewähren, und dies auch tatsächlich tun. Weitere Informationen finden Sie unter https://cla.opensource.microsoft.com.
Wenn Sie eine Pull-Anfrage einreichen, ermittelt ein CLA-Bot automatisch, ob Sie eine CLA bereitstellen müssen, und schmückt die PR entsprechend (z. B. Statusprüfung, Kommentar). Folgen Sie einfach den Anweisungen des Bots. Sie müssen dies nur einmal für alle Repos tun, die unsere CLA verwenden.
Dieses Projekt hat den Microsoft Open Source Verhaltenskodex übernommen. Weitere Informationen finden Sie in den häufig gestellten Fragen zum Verhaltenskodex oder wenden Sie sich bei weiteren Fragen oder Kommentaren an [email protected].
Dieses Projekt kann Marken oder Logos für Projekte, Produkte oder Dienstleistungen enthalten. Die autorisierte Nutzung von Microsoft-Marken oder -Logos unterliegt den Marken- und Markenrichtlinien von Microsoft und muss diesen entsprechen. Die Verwendung von Microsoft-Marken oder -Logos in geänderten Versionen dieses Projekts darf keine Verwirrung stiften oder eine Sponsorschaft durch Microsoft implizieren. Jegliche Nutzung von Marken oder Logos Dritter unterliegt den Richtlinien dieser Drittanbieter.
Sie finden unser öffentliches Repo unter https://github.com/microsoft/nnscaler oder das interne Microsoft-Repo unter https://aka.ms/ms-nnscaler. Bei Fragen oder Anfragen kontaktieren Sie uns bitte unter [email protected].