From 9f5895cb7a7db8248295038543d75a4334ee5c44 Mon Sep 17 00:00:00 2001 From: Quentin Anthony Date: Thu, 21 Jul 2022 15:27:04 -0700 Subject: [PATCH 01/38] fix issue in accelerate. (#2121) Co-authored-by: Ammar Ahmad Awan --- deepspeed/comm/torch.py | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/deepspeed/comm/torch.py b/deepspeed/comm/torch.py index 17802c2e03ef..f7731536b696 100644 --- a/deepspeed/comm/torch.py +++ b/deepspeed/comm/torch.py @@ -35,9 +35,10 @@ def __init__(self, backend, timeout, init_method, name='torch'): self.init_process_group(backend, timeout, init_method) def init_process_group(self, backend, timeout, init_method): - return torch.distributed.init_process_group(backend, - timeout=timeout, - init_method=init_method) + if not torch.distributed.is_initialized(): + torch.distributed.init_process_group(backend, + timeout=timeout, + init_method=init_method) def all_reduce(self, tensor, From a2506b545ab4f9af2e940eb0ab355397ac76c250 Mon Sep 17 00:00:00 2001 From: Jeff Rasley Date: Thu, 21 Jul 2022 16:56:17 -0700 Subject: [PATCH 02/38] [docs] website refresh (#2123) Co-authored-by: Ammar Ahmad Awan Co-authored-by: yaozhewei Co-authored-by: Samyam Rajbhandari --- README.md | 191 ++++++--------- docs/_config.yml | 2 + docs/_data/navigation.yml | 37 +-- docs/_pages/compression.md | 12 + docs/_pages/config-json.md | 2 + docs/_pages/inference.md | 13 + docs/_pages/{features.md => training.md} | 177 ++++++++++++++ docs/assets/images/3pillars.png | Bin 0 -> 92467 bytes docs/assets/images/accelerate-dark.png | Bin 0 -> 9208 bytes docs/assets/images/accelerate-light.png | Bin 0 -> 9020 bytes docs/assets/images/accelerate.png | Bin 0 -> 12653 bytes docs/assets/images/hf-logo.png | Bin 0 -> 164177 bytes docs/assets/images/hf-transformers.png | Bin 0 -> 7258 bytes docs/assets/images/lightning-dark.png | Bin 0 -> 11515 bytes docs/assets/images/lightning-dark.svg | 10 + docs/assets/images/lightning-light.svg | 10 + docs/assets/images/lightning.png | Bin 0 -> 28443 bytes docs/assets/images/mosaicml.svg | 38 +++ docs/assets/images/transformers-dark.png | Bin 0 -> 9037 bytes docs/assets/images/transformers-light.png | Bin 0 -> 8850 bytes docs/index.md | 278 ++++++---------------- 21 files changed, 419 insertions(+), 351 deletions(-) create mode 100644 docs/_pages/compression.md create mode 100755 docs/_pages/inference.md rename docs/_pages/{features.md => training.md} (57%) mode change 100755 => 100644 create mode 100755 docs/assets/images/3pillars.png create mode 100755 docs/assets/images/accelerate-dark.png create mode 100755 docs/assets/images/accelerate-light.png create mode 100755 docs/assets/images/accelerate.png create mode 100755 docs/assets/images/hf-logo.png create mode 100755 docs/assets/images/hf-transformers.png create mode 100755 docs/assets/images/lightning-dark.png create mode 100755 docs/assets/images/lightning-dark.svg create mode 100755 docs/assets/images/lightning-light.svg create mode 100755 docs/assets/images/lightning.png create mode 100755 docs/assets/images/mosaicml.svg create mode 100755 docs/assets/images/transformers-dark.png create mode 100755 docs/assets/images/transformers-light.png diff --git a/README.md b/README.md index cff469825df9..363bc6a2ab69 100755 --- a/README.md +++ b/README.md @@ -9,50 +9,90 @@ - ## Latest News -* [2022/07/20] [DeepSpeed Compression: A composable library for extreme compression and zero-cost quantization](https://www.microsoft.com/en-us/research/blog/deepspeed-compression-a-composable-library-for-extreme-compression-and-zero-cost-quantization/) - * [Tutorial](https://www.deepspeed.ai/tutorials/model-compression/) and [Code examples](https://github.com/microsoft/DeepSpeedExamples/tree/master/model_compression). - * 50x model size reduction via [XTC](https://arxiv.org/abs/2206.01859) and 5000x compression cost reduction via [ZeroQuant](https://arxiv.org/abs/2206.01861). -* [2022/03/21] [Supporting efficient large model training on AMD Instinct GPUs with DeepSpeed](https://cloudblogs.microsoft.com/opensource/2022/03/21/supporting-efficient-large-model-training-on-amd-instinct-gpus-with-deepspeed/) -* [2022/03/07] [Maximizing Communication Efficiency for Large-scale Training via 0/1 Adam](https://www.deepspeed.ai/tutorials/zero-one-adam/) -* [2022/01/19] [DeepSpeed: Advancing MoE inference and training to power next-generation AI scale](https://www.microsoft.com/en-us/research/blog/deepspeed-advancing-moe-inference-and-training-to-power-next-generation-ai-scale/) - * [Mixture of Experts (MoE) for NLG tutorial](https://www.deepspeed.ai/tutorials/mixture-of-experts-nlg/). - * [Mixture of Experts (MoE) Inference tutorial](https://www.deepspeed.ai/tutorials/moe-inference-tutorial). -* [2021/11/15] [Autotuning: Automatically discover the optimal DeepSpeed configuration that delivers good training speed](https://www.deepspeed.ai/news/2021/11/15/autotuning.html) -* [2021/10/11] [Using DeepSpeed and Megatron to Train Megatron-Turing NLG 530B, the World’s Largest and Most Powerful Generative Language Model](https://www.microsoft.com/en-us/research/blog/using-deepspeed-and-megatron-to-train-megatron-turing-nlg-530b-the-worlds-largest-and-most-powerful-generative-language-model/) - * Read more on how to [train large models with DeepSpeed](https://www.deepspeed.ai/tutorials/large-models-w-deepspeed/) - -### DeepSpeed is hiring, [come join us!](https://careers.microsoft.com/us/en/search-results?keywords=http:%2F%2Fdeepspeed.ai) + DeepSpeed trained the world's most powerful language models ([MT-530B](https://www.microsoft.com/en-us/research/blog/using-deepspeed-and-megatron-to-train-megatron-turing-nlg-530b-the-worlds-largest-and-most-powerful-generative-language-model/), [BLOOM](https://huggingface.co/blog/bloom-megatron-deepspeed)); [learn how](https://www.deepspeed.ai/tutorials/large-models-w-deepspeed/). + +* [2022/07] [DeepSpeed Compression: A composable library for extreme compression](https://www.microsoft.com/en-us/research/blog/deepspeed-compression-a-composable-library-for-extreme-compression-and-zero-cost-quantization/) +* [2022/03] [Supporting efficient large model training on AMD Instinct GPUs with DeepSpeed](https://cloudblogs.microsoft.com/opensource/2022/03/21/supporting-efficient-large-model-training-on-amd-instinct-gpus-with-deepspeed/) +* [2022/03] [Maximizing Communication Efficiency for Large-scale Training via 0/1 Adam](https://www.deepspeed.ai/tutorials/zero-one-adam/) +* [2022/01] [DeepSpeed: Advancing MoE inference and training to power next-generation AI scale](https://www.microsoft.com/en-us/research/blog/deepspeed-advancing-moe-inference-and-training-to-power-next-generation-ai-scale/) +* [2021/11] [Autotuning: Automatically discover the optimal DeepSpeed configuration](https://www.deepspeed.ai/news/2021/11/15/autotuning.html) + +--- + +# Extreme Speed and Scale for DL Training and Inference + +[DeepSpeed](https://www.deepspeed.ai/) is an easy-to-use deep learning optimization software suite that enables unprecedented scale and speed for Deep Learning Training and Inference. With DeepSpeed you can: + +* Train/Inference dense or sparse models with billions or trillions of parameters +* Achieve excellent system throughput and efficiently scale to thousands of GPUs +* Train/Inference on resource constrained GPU systems +* Achieve unprecedented low latency and high thoughput for inference +* Achieve extreme compression for an unparalleled inference latency and model size reduction with low costs + +--- + +# DeepSpeed's three innovation pillars + + + + +## DeepSpeed-Training + +DeepSpeed offers a confluence of system innovations, that has made large scale DL training effective, and efficient, greatly improved ease of use, and redefined the DL training landscape in terms of scale that is possible. These innovations such as ZeRO, 3D-Parallelism, DeepSpeed-MoE, ZeRO-Infinity, etc. fall under the training pillar. Learn more: [DeepSpeed-Training](/_pages/training) + +## DeepSpeed-Inference + +DeepSpeed brings together innovations in parallelism technology such as tensor, pipeline, expert and ZeRO-parallelism, and combines them with high performance custom inference kernels, communication optimizations and heterogeneous memory technologies to enable inference at an unprecedented scale, while achieving unparalleled latency, thoughput and cost reduction. This systematic composition of system technologies for inference falls under the inference pillar. Learn more: [DeepSpeed-Inference](/_pages/inference) + + +## DeepSpeed-Compression + +To further increase the inference efficiency, DeepSpeed offers easy-to-use and flexible-to-compose compression techniques for researchers and practitioners to compress their models while delivering faster speed, smaller model size, and significantly reduced compression cost. Moreover, SoTA innovations on compression like ZeroQuant and XTC are included under the compression pillar. Learn more: [DeepSpeed-Compression](/_pages/compression) + --- -[DeepSpeed](https://www.deepspeed.ai/) is a deep learning optimization -library that makes distributed training easy, efficient, and effective. +# DeepSpeed Software Suite + +## DeepSpeed Library + + The [DeepSpeed](https://github.com/microsoft/deepspeed) library (this repository) implements and packages the innovations and technologies in DeepSpeed Training, Inference and Compression Pillars into a single easy-to-use, open-sourced repository. It allows for easy composition of multitude of features within a single training, infernece or compression pipeline. The DeepSpeed Library is heavily adopted by the DL community, and has been used to enable some of the most powerful models (see [DeepSpeed Adoption](#deepspeed-adoption)). + +## Model Implementations for Inference (MII) -

10x Larger Models

-

10x Faster Training

-

Minimal Code Change

+ [Model Implementations for Inference (MII)](https://github.com/microsoft/deepspeed-mii) is an open-sourced repository for making low-latency and high-throughput inference accessible to all data scientists by alleviating the need to apply complex system optimization techniques themselves. Out-of-box, MII offers support for thousands of widely used DL models, optimized using DeepSpeed-Inference, that can be deployed with a few lines of code, while achieving significant latency reduction compared to their vanilla open-sourced versions. -DeepSpeed delivers extreme-scale model training for everyone, from data scientists training on massive supercomputers to those training on low-end clusters or even on a single GPU: -* Extreme scale: Using current generation of GPU clusters with hundreds of devices, 3D parallelism of DeepSpeed can efficiently train deep learning models with trillions of parameters. -* Extremely memory efficient: With just a single GPU, ZeRO-Offload of DeepSpeed can train models with over 10B parameters, 10x bigger than the state of arts, democratizing multi-billion-parameter model training such that many deep learning scientists can explore bigger and better models. -* Extremely long sequence length: Sparse attention of DeepSpeed powers an order-of-magnitude longer input sequence and obtains up to 6x faster execution comparing with dense transformers. -* Extremely communication efficient: 3D parallelism improves communication efficiency allows users to train multi-billion-parameter models 2–7x faster on clusters with limited network bandwidth. 1-bit Adam, 0/1 Adam and 1-bit LAMB reduce communication volume by up to 26x while achieving similar convergence efficiency to Adam/LAMB, allowing for scaling to different types of GPU clusters and networks. +## DeepSpeed on Azure -Early adopters of DeepSpeed have already produced -a language model (LM) with over 17B parameters called -[Turing-NLG](https://www.microsoft.com/en-us/research/blog/turing-nlg-a-17-billion-parameter-language-model-by-microsoft), -establishing a new SOTA in the LM category. + DeepSpeed users are diverse and have access to different environments. We recommend to try DeepSpeed on Azure as it is the simplest and easiest method. The recommended method to try DeepSpeed on Azure is through AzureML [recipes](https://github.com/Azure/azureml-examples/tree/main/python-sdk/workflows/train/deepspeed). The job submission and data preparation scripts have been made available [here](https://github.com/microsoft/Megatron-DeepSpeed/tree/main/examples/azureml). For more details on how to use DeepSpeed on Azure, please follow the [Azure tutorial](https://www.deepspeed.ai/tutorials/azure/). + +--- + +# DeepSpeed Adoption DeepSpeed is an important part of Microsoft’s new [AI at Scale](https://www.microsoft.com/en-us/research/project/ai-at-scale/) initiative to enable next-generation AI capabilities at scale, where you can find more information [here](https://innovation.microsoft.com/en-us/exploring-ai-at-scale). -**_For further documentation, tutorials, and technical deep-dives please see [deepspeed.ai](https://www.deepspeed.ai/)!_** +DeepSpeed has been used to train many different large-scale models, below is a list of several examples that we are aware of (if you'd like to include your model please submit a PR): + + * [Megatron-Turing NLG (530B)](https://www.microsoft.com/en-us/research/blog/using-deepspeed-and-megatron-to-train-megatron-turing-nlg-530b-the-worlds-largest-and-most-powerful-generative-language-model/) + * [Jurassic-1 (178B)](https://uploads-ssl.webflow.com/60fd4503684b466578c0d307/61138924626a6981ee09caf6_jurassic_tech_paper.pdf) + * [BLOOM (176B)](https://huggingface.co/blog/bloom-megatron-deepspeed) + * [YaLM (100B)](https://github.com/yandex/YaLM-100B) + * [GPT-NeoX (20B)](https://github.com/EleutherAI/gpt-neox) + +DeepSpeed has been integrated with several different popular open-source DL frameworks such as: + +| | Documentation | +| ---------------------------------------------------------------------------------------------- | -------------------------------------------- | + | [Transformers with DeepSpeed](https://huggingface.co/docs/transformers/main/main_classes/deepspeed) | +| | [Accelerate with DeepSpeed](https://huggingface.co/docs/accelerate/main/en/deepspeed) | +| | [Lightning with DeepSpeed](https://pytorch-lightning.readthedocs.io/en/stable/api/pytorch_lightning.strategies.DeepSpeedStrategy.html) | +| | [MosaicML with DeepSpeed](https://docs.mosaicml.com/en/v0.8.0/trainer/using_the_trainer.html?highlight=deepspeed#deepspeed-integration) | + +--- # Build Pipeline Status @@ -64,28 +104,6 @@ information [here](https://innovation.microsoft.com/en-us/exploring-ai-at-scale) | Integrations | [![nv-transformers-v100](https://github.com/microsoft/DeepSpeed/actions/workflows/nv-transformers-v100.yml/badge.svg)](https://github.com/microsoft/DeepSpeed/actions/workflows/nv-transformers-v100.yml) [![nv-lightning-v100](https://github.com/microsoft/DeepSpeed/actions/workflows/nv-lightning-v100.yml/badge.svg)](https://github.com/microsoft/DeepSpeed/actions/workflows/nv-lightning-v100.yml) | | Misc | [![Formatting](https://github.com/microsoft/DeepSpeed/actions/workflows/formatting.yml/badge.svg)](https://github.com/microsoft/DeepSpeed/actions/workflows/formatting.yml) [![pages-build-deployment](https://github.com/microsoft/DeepSpeed/actions/workflows/pages/pages-build-deployment/badge.svg)](https://github.com/microsoft/DeepSpeed/actions/workflows/pages/pages-build-deployment) [![Documentation Status](https://readthedocs.org/projects/deepspeed/badge/?version=latest)](https://deepspeed.readthedocs.io/en/latest/?badge=latest)| - -# Table of Contents -| Section | Description | -| --------------------------------------- | ------------------------------------------- | -| [Why DeepSpeed?](#why-deepspeed) | DeepSpeed overview | -| [Install](#installation) | Installation details | -| [Features](#features) | Feature list and overview | -| [Further Reading](#further-reading) | Documentation, tutorials, etc. | -| [Contributing](#contributing) | Instructions for contributing | -| [Publications](#publications) | Publications related to DeepSpeed | -| [Videos](#videos) | Videos related to DeepSpeed | - -# Why DeepSpeed? -Training advanced deep learning models is challenging. Beyond model design, -model scientists also need to set up the state-of-the-art training techniques -such as distributed training, mixed precision, gradient accumulation, and -checkpointing. Yet still, scientists may not achieve the desired system -performance and convergence rate. Large model sizes are even more challenging: -a large model easily runs out of memory with pure data parallelism and it is -difficult to use model parallelism. DeepSpeed addresses these challenges to -accelerate model development *and* training. - # Installation The quickest way to get started with DeepSpeed is via pip, this will install @@ -121,76 +139,21 @@ On Windows you can build wheel with following steps, currently only inference mo 4. Run `python setup.py bdist_wheel` to build wheel in `dist` folder # Features -Below we provide a brief feature list, see our detailed [feature -overview](https://www.deepspeed.ai/features/) for descriptions and usage. - -* [Distributed Training with Mixed Precision](https://www.deepspeed.ai/features/#distributed-training-with-mixed-precision) - * 16-bit mixed precision - * Single-GPU/Multi-GPU/Multi-Node -* [Model Parallelism](https://www.deepspeed.ai/features/#model-parallelism) - * Support for Custom Model Parallelism - * Integration with Megatron-LM -* [Pipeline Parallelism](https://www.deepspeed.ai/tutorials/pipeline/) - * 3D Parallelism -* [The Zero Redundancy Optimizer (ZeRO)](https://www.deepspeed.ai/tutorials/zero/) - * Optimizer State and Gradient Partitioning - * Activation Partitioning - * Constant Buffer Optimization - * Contiguous Memory Optimization -* [ZeRO-Offload](https://www.deepspeed.ai/tutorials/zero-offload/) - * Leverage both CPU/GPU memory for model training - * Support 10B model training on a single GPU -* [Ultra-fast dense transformer kernels](https://www.deepspeed.ai/2020/05/18/bert-record.html) -* [Sparse attention](https://www.deepspeed.ai/2020/09/08/sparse-attention-news.html) - * Memory- and compute-efficient sparse kernels - * Support 10x longer sequences than dense - * Flexible support to different sparse structures -* [1-bit Adam](https://www.deepspeed.ai/2020/09/08/onebit-adam-blog-post.html), [0/1 Adam](https://www.deepspeed.ai/tutorials/zero-one-adam/) and [1-bit LAMB](https://www.deepspeed.ai/tutorials/onebit-lamb/) - * Custom communication collective - * Up to 26x communication volume saving -* [Additional Memory and Bandwidth Optimizations](https://www.deepspeed.ai/features/#additional-memory-and-bandwidth-optimizations) - * Smart Gradient Accumulation - * Communication/Computation Overlap -* [Training Features](https://www.deepspeed.ai/features/#training-features) - * Simplified training API - * Gradient Clipping - * Automatic loss scaling with mixed precision -* [Training Optimizers](https://www.deepspeed.ai/features/#training-optimizers) - * Fused Adam optimizer and arbitrary `torch.optim.Optimizer` - * Memory bandwidth optimized FP16 Optimizer - * Large Batch Training with LAMB Optimizer - * Memory efficient Training with ZeRO Optimizer - * CPU-Adam -* [Training Agnostic Checkpointing](https://www.deepspeed.ai/features/#training-agnostic-checkpointing) -* [Advanced Parameter Search](https://www.deepspeed.ai/features/#advanced-parameter-search) - * Learning Rate Range Test - * 1Cycle Learning Rate Schedule -* [Simplified Data Loader](https://www.deepspeed.ai/features/#simplified-data-loader) -* [Curriculum Learning](https://www.deepspeed.ai/tutorials/curriculum-learning/) - * A curriculum learning-based data pipeline that presents easier or simpler examples earlier during training - * Stable and 3.3x faster GPT-2 pre-training with 8x/4x larger batch size/learning rate while maintaining token-wise convergence speed - * Complementary to many other DeepSpeed features -* [Performance Analysis and Debugging](https://www.deepspeed.ai/features/#performance-analysis-and-debugging) -* [Mixture of Experts (MoE)](https://www.deepspeed.ai/tutorials/mixture-of-experts/) +Please checkout [DeepSpeed-Training](https://www.deepspeed.ai/docs/training), [DeepSpeed-Inference](https://www.deepspeed.ai/docs/inference) and [DeepSpeed-Compression](https://www.deepspeed.ai/docs/compression) pages for full set of features offered along each of these three pillars. # Further Reading -All DeepSpeed documentation can be found on our website: [deepspeed.ai](https://www.deepspeed.ai/) +All DeepSpeed documentation, tutorials, and blogs can be found on our website: [deepspeed.ai](https://www.deepspeed.ai/) -| Article | Description | +| | Description | | ---------------------------------------------------------------------------------------------- | -------------------------------------------- | -| [DeepSpeed Features](https://www.deepspeed.ai/features/) | DeepSpeed features | | [Getting Started](https://www.deepspeed.ai/getting-started/) | First steps with DeepSpeed | | [DeepSpeed JSON Configuration](https://www.deepspeed.ai/docs/config-json/) | Configuring DeepSpeed | | [API Documentation](https://deepspeed.readthedocs.io/en/latest/) | Generated DeepSpeed API documentation | -| [CIFAR-10 Tutorial](https://www.deepspeed.ai/tutorials/cifar-10) | Getting started with CIFAR-10 and DeepSpeed | -| [Megatron-LM Tutorial](https://www.deepspeed.ai/tutorials/megatron/) | Train GPT2 with DeepSpeed and Megatron-LM | -| [BERT Pre-training Tutorial](https://www.deepspeed.ai/tutorials/bert-pretraining/) | Pre-train BERT with DeepSpeed | -| [Learning Rate Range Test Tutorial](https://www.deepspeed.ai/tutorials/lrrt/) | Faster training with large learning rates | -| [1Cycle Tutorial](https://www.deepspeed.ai/tutorials/one-cycle/) | SOTA learning schedule in DeepSpeed | - +| [Tutorials](https://www.deepspeed.ai/tutorials/) | Tutorials | +| [Blogs](https://www.deepspeed.ai/posts/) | Blogs | # Contributing diff --git a/docs/_config.yml b/docs/_config.yml index fff37da306d5..0b3ae77595e6 100644 --- a/docs/_config.yml +++ b/docs/_config.yml @@ -80,6 +80,8 @@ defaults: path: "_pages" values: permalink: /docs/:basename/ + toc: true + toc_label: "Contents" - scope: path: "" type: posts diff --git a/docs/_data/navigation.yml b/docs/_data/navigation.yml index 4c9dcf22e19e..dc4c8c27677a 100755 --- a/docs/_data/navigation.yml +++ b/docs/_data/navigation.yml @@ -11,20 +11,15 @@ main: url: https://github.com/microsoft/DeepSpeed lnav: - - title: 'Feature Overview' - url: /features/ + - title: 'Training' + url: /training/ + - title: 'Inference' + url: /inference/ + - title: 'Compression' + url: /compression/ - title: 'Getting Started' url: /getting-started/ - children: - - title: 'Installation' - url: /getting-started/#installation - - title: 'Writing models' - url: /getting-started/#writing-deepspeed-models - - title: 'Training' - url: /getting-started/#training - - title: 'Launching' - url: /getting-started/#launching-deepspeed-training - - title: 'Configuration' + - title: 'ds_config' url: /docs/config-json/ children: - title: 'Autotuning' @@ -33,34 +28,16 @@ lnav: url: /docs/config-json/#batch-size-related-parameters - title: 'Optimizer' url: /docs/config-json/#optimizer-parameters - - title: 'Scheduler' - url: /docs/config-json/#scheduler-parameters - - title: 'Communication' - url: /docs/config-json/#communication-options - title: 'FP16' url: /docs/config-json/#fp16-training-options - title: 'BFLOAT16' url: /docs/config-json/#bfloat16-training-options - - title: 'Gradient Clipping' - url: /docs/config-json/#gradient-clipping - title: 'ZeRO optimizations' url: /docs/config-json/#zero-optimizations-for-fp16-training - - title: 'Parameter Offloading' - url: /docs/config-json/#parameter-offloading - - title: 'Optimizer Offloading' - url: /docs/config-json/#optimizer-offloading - - title: 'Asynchronous I/O' - url: /docs/config-json/#asynchronous-io - title: 'Logging' url: /docs/config-json/#logging - title: 'Flops Profiler' url: /docs/config-json/#flops-profiler - - title: 'PyTorch Profiler' - url: /docs/config-json/#pytorch-profiler - - title: 'Activation checkpointing' - url: /docs/config-json/#activation-checkpointing - - title: 'Sparse Attention' - url: /docs/config-json/#sparse-attention - title: 'Monitoring' url: /docs/config-json/#monitoring-module-tensorboard-wandb-csv - title: 'Model Compression' diff --git a/docs/_pages/compression.md b/docs/_pages/compression.md new file mode 100644 index 000000000000..1a7b40d0cf1f --- /dev/null +++ b/docs/_pages/compression.md @@ -0,0 +1,12 @@ +--- +title: "Compression Overview and Features" +layout: single +permalink: /compression/ +toc: true +toc_label: "Contents" +--- + + +DeepSpeed Compression is a library purposely built to make it easy to compress models for researchers and practitioners while delivering faster speed, smaller model size, and significantly reduced compression cost. Please refer to our [blog](https://www.microsoft.com/en-us/research/blog/deepspeed-compression-a-composable-library-for-extreme-compression-and-zero-cost-quantization/) for more details. + +DeepSpeed Compression offers novel state-of-the-art compression techniques to achieve faster model compression with better model quality and lower compression cost. DeepSpeed Compression also takes an end-to-end approach to improve the computation efficiency of compressed models via a highly optimized inference engine. Furthermore, our library has multiple built-in state-of-the-art compression methods. It supports the synergistic composition of these methods and the system optimizations, offering the best of both worlds while allowing a seamless and easy-to-use pipeline for efficient DL model inference. We highly recommend you also to read our blog to learn more about (at a high level) why we build DeepSpeed Compression and what benefits it provides to users. To try compress your model using DeepSpeed compression library, please checkout our [tutorial](https://www.deepspeed.ai/tutorials/model-compression/). diff --git a/docs/_pages/config-json.md b/docs/_pages/config-json.md index bc0fd47663f4..642b0300f09f 100755 --- a/docs/_pages/config-json.md +++ b/docs/_pages/config-json.md @@ -1,5 +1,7 @@ --- title: "DeepSpeed Configuration JSON" +toc: true +toc_label: "Contents" --- ### Batch Size Related Parameters diff --git a/docs/_pages/inference.md b/docs/_pages/inference.md new file mode 100755 index 000000000000..d63604e1f022 --- /dev/null +++ b/docs/_pages/inference.md @@ -0,0 +1,13 @@ +--- +title: "Inference Overview and Features" +layout: single +permalink: /inference/ +toc: true +toc_label: "Contents" +--- + +DeepSpeed-Inference introduces several features to efficiently serve transformer-based PyTorch models. It supports model parallelism (MP) to fit large models that would otherwise not fit in GPU memory. Even for smaller models, MP can be used to reduce latency for inference. To further reduce latency and cost, we introduce inference-customized kernels. Finally, we propose a novel approach to quantize models, called MoQ, to both shrink the model and reduce the inference cost at production. For more details on the inference related optimizations in DeepSpeed, please refer to our [blog post](https://www.microsoft.com/en-us/research/blog/deepspeed-accelerating-large-scale-model-inference-and-training-via-system-optimizations-and-compression/). + +DeepSpeed provides a seamless inference mode for compatible transformer based models trained using DeepSpeed, Megatron, and HuggingFace, meaning that we don’t require any change on the modeling side such as exporting the model or creating a different checkpoint from your trained checkpoints. To run inference on multi-GPU for compatible models, provide the model parallelism degree and the checkpoint information or the model which is already loaded from a checkpoint, and DeepSpeed will do the rest. It will automatically partition the model as necessary, inject compatible high performance kernels into your model and manage the inter-gpu communication. For list of compatible models please see [here](https://github.com/microsoft/DeepSpeed/blob/master/deepspeed/module_inject/replace_policy.py). + +To get started with DeepSpeed-Inference, please checkout our [tutorial](https://www.deepspeed.ai/tutorials/inference-tutorial/). diff --git a/docs/_pages/features.md b/docs/_pages/training.md old mode 100755 new mode 100644 similarity index 57% rename from docs/_pages/features.md rename to docs/_pages/training.md index c2da91340bda..116bb0d2c697 --- a/docs/_pages/features.md +++ b/docs/_pages/training.md @@ -1,3 +1,180 @@ +--- +title: "Training Overview and Features" +layout: single +permalink: /training/ +toc: true +toc_label: "Contents" +--- + +# Overview +Training advanced deep learning models is challenging. Beyond model design, +model scientists also need to set up the state-of-the-art training techniques +such as distributed training, mixed precision, gradient accumulation, and +checkpointing. Yet still, scientists may not achieve the desired system +performance and convergence rate. Large model sizes are even more challenging: +a large model easily runs out of memory with pure data parallelism and it is +difficult to use model parallelism. DeepSpeed addresses these challenges to +accelerate model development *and* training. + +## Distributed, Effective, and Efficient Training with Ease +The DeepSpeed API is a lightweight wrapper on [PyTorch](https://pytorch.org/). This +means that you can use everything you love in PyTorch and without learning a new +platform. In addition, DeepSpeed manages all of the boilerplate state-of-the-art +training techniques, such as distributed training, mixed precision, gradient +accumulation, and checkpoints so that you can focus on your model development. Most +importantly, you can leverage the distinctive efficiency and effectiveness benefit of +DeepSpeed to boost speed and scale with just a few lines of code changes to your PyTorch +models. + +## Speed +DeepSpeed achieves high performance and fast convergence through a combination of +efficiency optimizations on compute/communication/memory/IO and effectiveness +optimizations on advanced hyperparameter tuning and optimizers. For example: + +* DeepSpeed trains BERT-large to parity in 44 + mins using 1024 V100 GPUs (64 DGX-2 boxes) and in 2.4 hours using 256 GPUs + (16 DGX-2 boxes). + + **BERT-large Training Times** + + | Devices | Source | Training Time | + | -------------- | --------- | ---------------------:| + | 1024 V100 GPUs | DeepSpeed | **44** min| + | 256 V100 GPUs | DeepSpeed | **2.4** hr| + | 64 V100 GPUs | DeepSpeed | **8.68** hr| + | 16 V100 GPUs | DeepSpeed | **33.22** hr| + + *BERT codes and tutorials will be available soon.* + +* DeepSpeed trains GPT2 (1.5 billion parameters) 3.75x faster than state-of-art, NVIDIA + Megatron on Azure GPUs. + + *Read more*: [GPT tutorial](/tutorials/megatron/) + + + +## Memory efficiency +DeepSpeed provides memory-efficient data parallelism and enables training models without +model parallelism. For example, DeepSpeed can train models with up to 13 billion parameters on +a single GPU. In comparison, existing frameworks (e.g., +PyTorch's Distributed Data Parallel) run out of memory with 1.4 billion parameter models. + +DeepSpeed reduces the training memory footprint through a novel solution called Zero +Redundancy Optimizer (ZeRO). Unlike basic data parallelism where memory states are +replicated across data-parallel processes, ZeRO partitions model states and gradients to save +significant memory. Furthermore, it also reduces activation memory and fragmented memory. +The current implementation (ZeRO-2) reduces memory by up to +8x relative to the state-of-art. You can read more about ZeRO in our [paper](https://arxiv.org/abs/1910.02054), and +in our blog posts related to +[ZeRO-1](https://www.microsoft.com/en-us/research/blog/zero-deepspeed-new-system-optimizations-enable-training-models-with-over-100-billion-parameters/) and [ZeRO-2](https://www.microsoft.com/en-us/research/blog/zero-2-deepspeed-shattering-barriers-of-deep-learning-speed-scale/). + +With this impressive memory reduction, early adopters of DeepSpeed have already +produced a language model (LM) with over 17B parameters called + +Turing-NLG, +establishing a new SOTA in the LM category. + +For model scientists with limited GPU resources, ZeRO-Offload leverages both CPU and GPU memory for training large models. Using a machine with **a single GPU**, our users can run **models of up to 13 billion parameters** without running out of memory, 10x bigger than the existing approaches, while obtaining competitive throughput. This feature democratizes multi-billion-parameter model training and opens the window for many deep learning practitioners to explore bigger and better models. + +## Scalability +DeepSpeed supports efficient data parallelism, model parallelism, pipeline parallelism and their +combinations, which we call 3D parallelism. +* 3D parallelism of DeepSpeed provides system support to run models with trillions of parameters, read more in our [press-release]({{ site.press_release_v3 }}) and [tutorial](/tutorials/pipeline). +* DeepSpeed can run large models more efficiently, up to 10x + faster for models with + various sizes spanning 1.5B to hundred billion. More specifically, the data parallelism powered by ZeRO + is complementary and can be combined with different types of model parallelism. It allows + DeepSpeed to fit models using lower degree of model parallelism and higher batch size, offering + significant performance gains compared to using model parallelism alone. + + *Read more*: [ZeRO paper](https://arxiv.org/abs/1910.02054), + and [GPT tutorial](/tutorials/megatron). + +![DeepSpeed Speedup](/assets/images/deepspeed-speedup.png) +

+The figure depicts system throughput improvements of DeepSpeed (combining ZeRO-powered data parallelism with model parallelism of NVIDIA Megatron-LM) over using Megatron-LM alone. +

+ +## Communication efficiency +Pipeline parallelism of DeepSpeed reduce communication volume during distributed training, which allows users to train multi-billion-parameter models 2–7x faster on clusters with limited network bandwidth. +![Low-bandwidth GPT-2 Performance](/assets/images/pp-lowbw-gpt2.png) + +1-bit Adam, 0/1 Adam and 1-bit LAMB reduce communication volume by up to 26x while achieving similar convergence efficiency to Adam, allowing for scaling to different types of GPU clusters and networks. [1-bit Adam blog post](https://www.deepspeed.ai/2020/09/08/onebit-adam-blog-post.html), [1-bit Adam tutorial](https://www.deepspeed.ai/tutorials/onebit-adam/), [0/1 Adam tutorial](https://www.deepspeed.ai/tutorials/zero-one-adam/), [1-bit LAMB tutorial](https://www.deepspeed.ai/tutorials/onebit-lamb/). + +## Supporting long sequence length +DeepSpeed offers sparse attention kernels—an instrumental technology to support long sequences of model inputs, whether for text, image, or sound. Compared with the classic dense Transformers, it powers **an order-of-magnitude longer input sequence** and obtains up to 6x faster execution with comparable accuracy. It also outperforms state-of-the-art sparse implementations with 1.5–3x faster execution. Furthermore, our sparse kernels support efficient execution of flexible sparse format and empower users to innovate on their custom sparse structures. [Read more here](https://www.deepspeed.ai/2020/09/08/sparse-attention.html). + + +## Fast convergence for effectiveness +DeepSpeed supports advanced hyperparameter tuning and large batch size +optimizers such as [LAMB](https://arxiv.org/abs/1904.00962). These improve the +effectiveness of model training and reduce the number of samples required to +convergence to desired accuracy. + +*Read more*: [Tuning tutorial](/tutorials/one-cycle). + + +## Good Usability +Only a few lines of code changes are needed to enable a PyTorch model to use DeepSpeed and ZeRO. Compared to current model parallelism libraries, DeepSpeed does not require a code redesign or model refactoring. It also does not put limitations on model dimensions (such as number of attention heads, hidden sizes, and others), batch size, or any other training parameters. For models of up to 13 billion parameters, you can use ZeRO-powered data parallelism conveniently without requiring model parallelism, while in contrast, standard data parallelism will run out of memory for models with more than 1.4 billion parameters. In addition, DeepSpeed conveniently supports flexible combination of ZeRO-powered data parallelism with custom model parallelisms, such as tensor slicing of NVIDIA's Megatron-LM. + + +## Features + +Below we provide a brief feature list, see our detailed [feature overview](https://www.deepspeed.ai/features/) for descriptions and usage. + +* [Distributed Training with Mixed Precision](https://www.deepspeed.ai/features/#distributed-training-with-mixed-precision) + * 16-bit mixed precision + * Single-GPU/Multi-GPU/Multi-Node +* [Model Parallelism](https://www.deepspeed.ai/features/#model-parallelism) + * Support for Custom Model Parallelism + * Integration with Megatron-LM +* [Pipeline Parallelism](https://www.deepspeed.ai/tutorials/pipeline/) + * 3D Parallelism +* [The Zero Redundancy Optimizer](https://www.deepspeed.ai/tutorials/zero/) + * Optimizer State and Gradient Partitioning + * Activation Partitioning + * Constant Buffer Optimization + * Contiguous Memory Optimization +* [ZeRO-Offload](https://www.deepspeed.ai/tutorials/zero-offload/) + * Leverage both CPU/GPU memory for model training + * Support 10B model training on a single GPU +* [Ultra-fast dense transformer kernels](https://www.deepspeed.ai/2020/05/18/bert-record.html) +* [Sparse attention](https://www.deepspeed.ai/2020/09/08/sparse-attention-news.html) + * Memory- and compute-efficient sparse kernels + * Support 10x long sequences than dense + * Flexible support to different sparse structures +* [1-bit Adam](https://www.deepspeed.ai/2020/09/08/onebit-adam-blog-post.html), [0/1 Adam](https://www.deepspeed.ai/tutorials/zero-one-adam/) and [1-bit LAMB](https://www.deepspeed.ai/tutorials/onebit-lamb/) + * Custom communication collective + * Up to 26x communication volume saving +* [Additional Memory and Bandwidth Optimizations](https://www.deepspeed.ai/features/#additional-memory-and-bandwidth-optimizations) + * Smart Gradient Accumulation + * Communication/Computation Overlap +* [Training Features](https://www.deepspeed.ai/features/#training-features) + * Simplified training API + * Gradient Clipping + * Automatic loss scaling with mixed precision +* [Training Optimizers](https://www.deepspeed.ai/features/#training-optimizers) + * Fused Adam optimizer and arbitrary `torch.optim.Optimizer` + * Memory bandwidth optimized FP16 Optimizer + * Large Batch Training with LAMB Optimizer + * Memory efficient Training with ZeRO Optimizer + * CPU-Adam +* [Training Agnostic Checkpointing](https://www.deepspeed.ai/features/#training-agnostic-checkpointing) +* [Advanced Parameter Search](https://www.deepspeed.ai/features/#advanced-parameter-search) + * Learning Rate Range Test + * 1Cycle Learning Rate Schedule +* [Simplified Data Loader](https://www.deepspeed.ai/features/#simplified-data-loader) +* [Curriculum Learning](https://www.deepspeed.ai/tutorials/curriculum-learning/) + * A curriculum learning-based data pipeline that presents easier or simpler examples earlier during training + * Stable and 3.3x faster GPT-2 pre-training with 8x/4x larger batch size/learning rate while maintaining token-wise convergence speed + * Complementary to many other DeepSpeed features +* [Progressive Layer Dropping](https://www.deepspeed.ai/2020/10/28/progressive-layer-dropping-news.html) + * Efficient and robust compressed training + * Up to 2.5x convergence speedup for pre-training +* [Performance Analysis and Debugging](https://www.deepspeed.ai/features/#performance-analysis-and-debugging) +* [Mixture of Experts (MoE)](https://www.deepspeed.ai/tutorials/mixture-of-experts/) + + --- title: "Feature Overview" layout: single diff --git a/docs/assets/images/3pillars.png b/docs/assets/images/3pillars.png new file mode 100755 index 0000000000000000000000000000000000000000..c2943ca912a18d202cb0d7f876349ecd7d82a872 GIT binary patch literal 92467 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 literal 0 HcmV?d00001 diff --git a/docs/assets/images/accelerate-light.png b/docs/assets/images/accelerate-light.png new file mode 100755 index 0000000000000000000000000000000000000000..d60173cf582a4f3b01bb0575d1dced41f9414a53 GIT binary patch literal 9020 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 A8~^|S literal 0 HcmV?d00001 diff --git a/docs/assets/images/accelerate.png b/docs/assets/images/accelerate.png new file mode 100755 index 0000000000000000000000000000000000000000..9e9111ac178c8a4f117c5e84063a74a01c23becd GIT binary patch literal 12653 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 F{{SlV_8kBK literal 0 HcmV?d00001 diff --git a/docs/assets/images/hf-logo.png b/docs/assets/images/hf-logo.png new file mode 100755 index 0000000000000000000000000000000000000000..7708a9f4d9413a7a80f48feb59e15ce6e673a24e GIT binary patch literal 164177 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 literal 0 HcmV?d00001 diff --git a/docs/assets/images/hf-transformers.png b/docs/assets/images/hf-transformers.png new file mode 100755 index 0000000000000000000000000000000000000000..70d7c48942cb60b2dc8ae2e3b06d92efed2f6538 GIT binary patch literal 7258 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 literal 0 HcmV?d00001 diff --git a/docs/assets/images/lightning-dark.svg b/docs/assets/images/lightning-dark.svg new file mode 100755 index 000000000000..23f34ecbd4c4 --- /dev/null +++ b/docs/assets/images/lightning-dark.svg @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/docs/assets/images/lightning-light.svg b/docs/assets/images/lightning-light.svg new file mode 100755 index 000000000000..9c89331b7917 --- /dev/null +++ b/docs/assets/images/lightning-light.svg @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/docs/assets/images/lightning.png b/docs/assets/images/lightning.png new file mode 100755 index 0000000000000000000000000000000000000000..2d789ef09bc2c80a3dad16e2764cb4635fd0c5ac GIT binary patch literal 28443 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

LFJDMhhZgR$O*JJX%-K3=v!fPjqb(cI6k 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�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 literal 0 HcmV?d00001 diff --git a/docs/assets/images/mosaicml.svg b/docs/assets/images/mosaicml.svg new file mode 100755 index 000000000000..8f6aadb9556d --- /dev/null +++ b/docs/assets/images/mosaicml.svg @@ -0,0 +1,38 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/docs/assets/images/transformers-dark.png b/docs/assets/images/transformers-dark.png new file mode 100755 index 0000000000000000000000000000000000000000..f48984e9c73581730e0b3886036d8a23bbdb8b89 GIT binary patch literal 9037 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 literal 0 HcmV?d00001 diff --git a/docs/index.md b/docs/index.md index d321a7f87802..5f0943ea68ea 100755 --- a/docs/index.md +++ b/docs/index.md @@ -5,214 +5,78 @@ toc_label: "Contents" title: "Latest News" --- + DeepSpeed trained the world's most powerful language models ([MT-530B](https://www.microsoft.com/en-us/research/blog/using-deepspeed-and-megatron-to-train-megatron-turing-nlg-530b-the-worlds-largest-and-most-powerful-generative-language-model/), [BLOOM](https://huggingface.co/blog/bloom-megatron-deepspeed)); [learn how](https://www.deepspeed.ai/tutorials/large-models-w-deepspeed/). + +* [2022/07] [DeepSpeed Compression: A composable library for extreme compression](https://www.microsoft.com/en-us/research/blog/deepspeed-compression-a-composable-library-for-extreme-compression-and-zero-cost-quantization/) +* [2022/03] [Supporting efficient large model training on AMD Instinct GPUs with DeepSpeed](https://cloudblogs.microsoft.com/opensource/2022/03/21/supporting-efficient-large-model-training-on-amd-instinct-gpus-with-deepspeed/) +* [2022/03] [Maximizing Communication Efficiency for Large-scale Training via 0/1 Adam](https://www.deepspeed.ai/tutorials/zero-one-adam/) +* [2022/01] [DeepSpeed: Advancing MoE inference and training to power next-generation AI scale](https://www.microsoft.com/en-us/research/blog/deepspeed-advancing-moe-inference-and-training-to-power-next-generation-ai-scale/) +* [2021/11] [Autotuning: Automatically discover the optimal DeepSpeed configuration](https://www.deepspeed.ai/news/2021/11/15/autotuning.html) + + + +# Extreme Speed and Scale for DL Training and Inference + + DeepSpeed is an easy-to-use deep learning optimization software suite that enables unprecedented scale and speed for Deep Learning Training and Inference. With DeepSpeed you can: +

Train/Inference dense or sparse models with billions or trillions of parameters

+

Achieve excellent system throughput and efficiently scale to thousands of GPUs

+

Train/Inference on resource constrained GPU systems

+

Achieve unprecedented low latency and high thoughput for inference

+

Achieve extreme compression for an unparalleled inference latency and model size reduction with low costs

+ + +# DeepSpeed has three innovation pillars: + +![Three innovation pillars](/assets/images/3pillars.png){: .align-center} + + +## DeepSpeed-Training + +DeepSpeed offers a confluence of system innovations, that has made large scale DL training effective, and efficient, greatly improved ease of use, and redefined the DL training landscape in terms of scale that is possible. These innovations such as ZeRO, 3D-Parallelism, DeepSpeed-MoE, ZeRO-Infinity, etc fall under the DeepSpeed-Training pillar. Learn more: [DeepSpeed-Training](/_pages/training) + +## DeepSpeed-Inference + +DeepSpeed brings together innovations in parallelism technology such as tensor, pipeline, expert and ZeRO-parallelism, and combines them with high performance custom inference kernels, communication optimizations and heterogeneous memory technologies to enable inference at an unprecedented scale, while achieving unparalleled latency, thoughput and cost reduction. This systematic composition of system technologies for inference falls under the DeepSpeed-Inference. Learn more: [DeepSpeed-Inference](/_pages/inference) + +## DeepSpeed-Compression + +To further increase the inference efficiency, DeepSpeed offers easy-to-use and flexible-to-compose compression techniques for researchers and practitioners to compress their models while delivering faster speed, smaller model size, and significantly reduced compression cost. Moreover, SoTA innovations on compression like ZeroQuant and XTC are included under the DeepSpeed-Compression pillar. Learn more: [DeepSpeed-Compression](/_pages/compression) + +# DeepSpeed Software Suite + +## DeepSpeed Library + + The [DeepSpeed](https://github.com/microsoft/deepspeed) library implements and packages the innovations and technologies in DeepSpeed Training, Inference and Compression Pillars into a single easy-to-use, open-sourced repository. It allows for easy composition of multitude of features within a single training, infernece or compression pipeline. The DeepSpeed Library is heavily adopted by the DL community, and has been used to enable some of the most powerful models (see [DeepSpeed Adoption](#deepspeed-adoption)). + +## Model Implementations for Inference (MII) + + [Model Implementations for Inference (MII)](https://github.com/microsoft/deepspeed-mii) is an open-sourced repository for making low-latency and high-throughput inference accessible to all data scientists by alleviating the need to apply complex system optimization techniques themselves. Out-of-box, MII offers support for thousands of widely used DL models, optimized using DeepSpeed-Inference, that can be deployed with a few lines of code, while achieving significant latency reduction compared to their vanilla open-sourced versions. + +## DeepSpeed on Azure + + DeepSpeed users are diverse and have access to different environments. We recommend to try DeepSpeed on Azure as it is the simplest and easiest method. The recommended method to try DeepSpeed on Azure is through AzureML [recipes](https://github.com/Azure/azureml-examples/tree/main/python-sdk/workflows/train/deepspeed). The job submission and data preparation scripts have been made available [here](https://github.com/microsoft/Megatron-DeepSpeed/tree/main/examples/azureml). For more details on how to use DeepSpeed on Azure, please follow the [Azure tutorial](https://www.deepspeed.ai/tutorials/azure/). + +# DeepSpeed Adoption + +DeepSpeed has been used to train many different large-scale models, below is a list of several examples that we are aware of (if you'd like to include your model please submit a PR): + + * [Megatron-Turing NLG (530B)](https://www.microsoft.com/en-us/research/blog/using-deepspeed-and-megatron-to-train-megatron-turing-nlg-530b-the-worlds-largest-and-most-powerful-generative-language-model/) + * [Jurassic-1 (178B)](https://uploads-ssl.webflow.com/60fd4503684b466578c0d307/61138924626a6981ee09caf6_jurassic_tech_paper.pdf) + * [BLOOM (176B)](https://huggingface.co/blog/bloom-megatron-deepspeed) + * [YaLM (100B)](https://github.com/yandex/YaLM-100B) + * [GPT-NeoX (20B)](https://github.com/EleutherAI/gpt-neox) + +DeepSpeed has been integrated with several different popular open-source DL frameworks such as: + +| | Documentation | +| ---------------------------------------------------------------------------------------------- | -------------------------------------------- | +| | [Transformers with DeepSpeed](https://huggingface.co/docs/transformers/main/main_classes/deepspeed) | +| | [Accelerate with DeepSpeed](https://huggingface.co/docs/accelerate/main/en/deepspeed) | +| | [Lightning with DeepSpeed](https://pytorch-lightning.readthedocs.io/en/stable/api/pytorch_lightning.strategies.DeepSpeedStrategy.html) | +| | [MosaicML with DeepSpeed](https://docs.mosaicml.com/en/v0.8.0/trainer/using_the_trainer.html?highlight=deepspeed#deepspeed-integration) | + +DeepSpeed is an integral part of [Microsoft’s AI at Scale initiative](https://www.microsoft.com/en-us/research/project/ai-at-scale/) to enable next-generation AI capabilities at scale. -* [2022/07/20] [DeepSpeed Compression: A composable library for extreme compression and zero-cost quantization](https://www.microsoft.com/en-us/research/blog/deepspeed-compression-a-composable-library-for-extreme-compression-and-zero-cost-quantization/) - * [Tutorial](https://www.deepspeed.ai/tutorials/model-compression/) and [Code examples](https://github.com/microsoft/DeepSpeedExamples/tree/master/model_compression). - * 50x model size reduction via [XTC](https://arxiv.org/abs/2206.01859) and 5000x compression cost reduction via [ZeroQuant](https://arxiv.org/abs/2206.01861). -* [2022/03/21] [Supporting efficient large model training on AMD Instinct GPUs with DeepSpeed](https://cloudblogs.microsoft.com/opensource/2022/03/21/supporting-efficient-large-model-training-on-amd-instinct-gpus-with-deepspeed/) -* [2022/03/07] [Maximizing Communication Efficiency for Large-scale Training via 0/1 Adam](https://www.deepspeed.ai/tutorials/zero-one-adam/) -* [2022/01/19] [DeepSpeed: Advancing MoE inference and training to power next-generation AI scale](https://www.microsoft.com/en-us/research/blog/deepspeed-advancing-moe-inference-and-training-to-power-next-generation-ai-scale/) - * [Mixture of Experts (MoE) for NLG tutorial](https://www.deepspeed.ai/tutorials/mixture-of-experts-nlg/). - * [Mixture of Experts (MoE) Inference tutorial](https://www.deepspeed.ai/tutorials/moe-inference-tutorial). -* [2021/11/15] [Autotuning: Automatically discover the optimal DeepSpeed configuration that delivers good training speed](https://www.deepspeed.ai/2021/11/16/autotuning.html) -* [2021/10/11] [Using DeepSpeed and Megatron to Train Megatron-Turing NLG 530B, the World’s Largest and Most Powerful Generative Language Model](https://www.microsoft.com/en-us/research/blog/using-deepspeed-and-megatron-to-train-megatron-turing-nlg-530b-the-worlds-largest-and-most-powerful-generative-language-model/) - * Read more on how to [train large models with DeepSpeed](https://www.deepspeed.ai/tutorials/large-models-w-deepspeed/) - - - DeepSpeed+Megatron trained the world's most powerful language model: [MT-530B](https://www.microsoft.com/en-us/research/blog/using-deepspeed-and-megatron-to-train-megatron-turing-nlg-530b-the-worlds-largest-and-most-powerful-generative-language-model/) - - DeepSpeed is hiring, [come join us!](https://careers.microsoft.com/us/en/search-results?keywords=http:%2F%2Fdeepspeed.ai) - -DeepSpeed is a deep learning optimization library that makes distributed training easy, -efficient, and effective. - -

10x Larger Models

-

10x Faster Training

-

Minimal Code Change

- -DeepSpeed delivers extreme-scale model training for everyone, from data scientists training on massive supercomputers to those training on low-end clusters or even on a single GPU: -* Extreme scale: Using current generation of GPU clusters with hundreds of devices, 3D parallelism of DeepSpeed can efficiently train deep learning models with trillions of parameters. -* Extremely memory efficient: With just a single GPU, ZeRO-Offload of DeepSpeed can train models with over 10B parameters, 10x bigger than the state of the art, democratizing multi-billion-parameter model training such that many deep learning scientists can explore bigger and better models. -* Extremely long sequence length: Sparse attention of DeepSpeed powers an order-of-magnitude longer input sequence and obtains up to 6x faster execution comparing with dense transformers. -* Extremely communication efficient: 3D parallelism improves communication efficiency allows users to train multi-billion-parameter models 2–7x faster on clusters with limited network bandwidth. 1-bit Adam, 0/1 Adam and 1-bit LAMB reduce communication volume by up to 26x while achieving similar convergence efficiency to Adam/LAMB, allowing for scaling to different types of GPU clusters and networks. - -Early adopters of DeepSpeed have already produced -a language model (LM) with over 17B parameters called -[Turing-NLG](https://www.microsoft.com/en-us/research/blog/turing-nlg-a-17-billion-parameter-language-model-by-microsoft), -establishing a new SOTA in the LM category. - -DeepSpeed is an important part of Microsoft’s new -[AI at Scale](https://www.microsoft.com/en-us/research/project/ai-at-scale/) -initiative to enable next-generation AI capabilities at scale, where you can find more -information [here](https://innovation.microsoft.com/en-us/exploring-ai-at-scale). - -# Why DeepSpeed? -Training advanced deep learning models is challenging. Beyond model design, -model scientists also need to set up the state-of-the-art training techniques -such as distributed training, mixed precision, gradient accumulation, and -checkpointing. Yet still, scientists may not achieve the desired system -performance and convergence rate. Large model sizes are even more challenging: -a large model easily runs out of memory with pure data parallelism and it is -difficult to use model parallelism. DeepSpeed addresses these challenges to -accelerate model development *and* training. - -## Distributed, Effective, and Efficient Training with Ease -The DeepSpeed API is a lightweight wrapper on [PyTorch](https://pytorch.org/). This -means that you can use everything you love in PyTorch and without learning a new -platform. In addition, DeepSpeed manages all of the boilerplate state-of-the-art -training techniques, such as distributed training, mixed precision, gradient -accumulation, and checkpoints so that you can focus on your model development. Most -importantly, you can leverage the distinctive efficiency and effectiveness benefit of -DeepSpeed to boost speed and scale with just a few lines of code changes to your PyTorch -models. - -## Speed -DeepSpeed achieves high performance and fast convergence through a combination of -efficiency optimizations on compute/communication/memory/IO and effectiveness -optimizations on advanced hyperparameter tuning and optimizers. For example: - -* DeepSpeed trains BERT-large to parity in 44 - mins using 1024 V100 GPUs (64 DGX-2 boxes) and in 2.4 hours using 256 GPUs - (16 DGX-2 boxes). - - **BERT-large Training Times** - - | Devices | Source | Training Time | - | -------------- | --------- | ---------------------:| - | 1024 V100 GPUs | DeepSpeed | **44** min| - | 256 V100 GPUs | DeepSpeed | **2.4** hr| - | 64 V100 GPUs | DeepSpeed | **8.68** hr| - | 16 V100 GPUs | DeepSpeed | **33.22** hr| - - *BERT codes and tutorials will be available soon.* - -* DeepSpeed trains GPT2 (1.5 billion parameters) 3.75x faster than state-of-art, NVIDIA - Megatron on Azure GPUs. - - *Read more*: [GPT tutorial](/tutorials/megatron/) - - - -## Memory efficiency -DeepSpeed provides memory-efficient data parallelism and enables training models without -model parallelism. For example, DeepSpeed can train models with up to 13 billion parameters on -a single GPU. In comparison, existing frameworks (e.g., -PyTorch's Distributed Data Parallel) run out of memory with 1.4 billion parameter models. - -DeepSpeed reduces the training memory footprint through a novel solution called Zero -Redundancy Optimizer (ZeRO). Unlike basic data parallelism where memory states are -replicated across data-parallel processes, ZeRO partitions model states and gradients to save -significant memory. Furthermore, it also reduces activation memory and fragmented memory. -The current implementation (ZeRO-2) reduces memory by up to -8x relative to the state-of-art. You can read more about ZeRO in our [paper](https://arxiv.org/abs/1910.02054), and -in our blog posts related to -[ZeRO-1](https://www.microsoft.com/en-us/research/blog/zero-deepspeed-new-system-optimizations-enable-training-models-with-over-100-billion-parameters/) and [ZeRO-2](https://www.microsoft.com/en-us/research/blog/zero-2-deepspeed-shattering-barriers-of-deep-learning-speed-scale/). - -With this impressive memory reduction, early adopters of DeepSpeed have already -produced a language model (LM) with over 17B parameters called -
-Turing-NLG, -establishing a new SOTA in the LM category. - -For model scientists with limited GPU resources, ZeRO-Offload leverages both CPU and GPU memory for training large models. Using a machine with **a single GPU**, our users can run **models of up to 13 billion parameters** without running out of memory, 10x bigger than the existing approaches, while obtaining competitive throughput. This feature democratizes multi-billion-parameter model training and opens the window for many deep learning practitioners to explore bigger and better models. - -## Scalability -DeepSpeed supports efficient data parallelism, model parallelism, pipeline parallelism and their -combinations, which we call 3D parallelism. -* 3D parallelism of DeepSpeed provides system support to run models with trillions of parameters, read more in our [press-release]({{ site.press_release_v3 }}) and [tutorial](/tutorials/pipeline). -* DeepSpeed can run large models more efficiently, up to 10x - faster for models with - various sizes spanning 1.5B to hundred billion. More specifically, the data parallelism powered by ZeRO - is complementary and can be combined with different types of model parallelism. It allows - DeepSpeed to fit models using lower degree of model parallelism and higher batch size, offering - significant performance gains compared to using model parallelism alone. - - *Read more*: [ZeRO paper](https://arxiv.org/abs/1910.02054), - and [GPT tutorial](/tutorials/megatron). - -![DeepSpeed Speedup](/assets/images/deepspeed-speedup.png) -

-The figure depicts system throughput improvements of DeepSpeed (combining ZeRO-powered data parallelism with model parallelism of NVIDIA Megatron-LM) over using Megatron-LM alone. -

- -## Communication efficiency -Pipeline parallelism of DeepSpeed reduce communication volume during distributed training, which allows users to train multi-billion-parameter models 2–7x faster on clusters with limited network bandwidth. -![Low-bandwidth GPT-2 Performance](/assets/images/pp-lowbw-gpt2.png) - -1-bit Adam, 0/1 Adam and 1-bit LAMB reduce communication volume by up to 26x while achieving similar convergence efficiency to Adam, allowing for scaling to different types of GPU clusters and networks. [1-bit Adam blog post](https://www.deepspeed.ai/2020/09/08/onebit-adam-blog-post.html), [1-bit Adam tutorial](https://www.deepspeed.ai/tutorials/onebit-adam/), [0/1 Adam tutorial](https://www.deepspeed.ai/tutorials/zero-one-adam/), [1-bit LAMB tutorial](https://www.deepspeed.ai/tutorials/onebit-lamb/). - -## Supporting long sequence length -DeepSpeed offers sparse attention kernels—an instrumental technology to support long sequences of model inputs, whether for text, image, or sound. Compared with the classic dense Transformers, it powers **an order-of-magnitude longer input sequence** and obtains up to 6x faster execution with comparable accuracy. It also outperforms state-of-the-art sparse implementations with 1.5–3x faster execution. Furthermore, our sparse kernels support efficient execution of flexible sparse format and empower users to innovate on their custom sparse structures. [Read more here](https://www.deepspeed.ai/2020/09/08/sparse-attention.html). - - -## Fast convergence for effectiveness -DeepSpeed supports advanced hyperparameter tuning and large batch size -optimizers such as [LAMB](https://arxiv.org/abs/1904.00962). These improve the -effectiveness of model training and reduce the number of samples required to -convergence to desired accuracy. - -*Read more*: [Tuning tutorial](/tutorials/one-cycle). - - -## Good Usability -Only a few lines of code changes are needed to enable a PyTorch model to use DeepSpeed and ZeRO. Compared to current model parallelism libraries, DeepSpeed does not require a code redesign or model refactoring. It also does not put limitations on model dimensions (such as number of attention heads, hidden sizes, and others), batch size, or any other training parameters. For models of up to 13 billion parameters, you can use ZeRO-powered data parallelism conveniently without requiring model parallelism, while in contrast, standard data parallelism will run out of memory for models with more than 1.4 billion parameters. In addition, DeepSpeed conveniently supports flexible combination of ZeRO-powered data parallelism with custom model parallelisms, such as tensor slicing of NVIDIA's Megatron-LM. - - -## Features - -Below we provide a brief feature list, see our detailed [feature overview](https://www.deepspeed.ai/features/) for descriptions and usage. - -* [Distributed Training with Mixed Precision](https://www.deepspeed.ai/features/#distributed-training-with-mixed-precision) - * 16-bit mixed precision - * Single-GPU/Multi-GPU/Multi-Node -* [Model Parallelism](https://www.deepspeed.ai/features/#model-parallelism) - * Support for Custom Model Parallelism - * Integration with Megatron-LM -* [Pipeline Parallelism](https://www.deepspeed.ai/tutorials/pipeline/) - * 3D Parallelism -* [The Zero Redundancy Optimizer](https://www.deepspeed.ai/tutorials/zero/) - * Optimizer State and Gradient Partitioning - * Activation Partitioning - * Constant Buffer Optimization - * Contiguous Memory Optimization -* [ZeRO-Offload](https://www.deepspeed.ai/tutorials/zero-offload/) - * Leverage both CPU/GPU memory for model training - * Support 10B model training on a single GPU -* [Ultra-fast dense transformer kernels](https://www.deepspeed.ai/2020/05/18/bert-record.html) -* [Sparse attention](https://www.deepspeed.ai/2020/09/08/sparse-attention-news.html) - * Memory- and compute-efficient sparse kernels - * Support 10x long sequences than dense - * Flexible support to different sparse structures -* [1-bit Adam](https://www.deepspeed.ai/2020/09/08/onebit-adam-blog-post.html), [0/1 Adam](https://www.deepspeed.ai/tutorials/zero-one-adam/) and [1-bit LAMB](https://www.deepspeed.ai/tutorials/onebit-lamb/) - * Custom communication collective - * Up to 26x communication volume saving -* [Additional Memory and Bandwidth Optimizations](https://www.deepspeed.ai/features/#additional-memory-and-bandwidth-optimizations) - * Smart Gradient Accumulation - * Communication/Computation Overlap -* [Training Features](https://www.deepspeed.ai/features/#training-features) - * Simplified training API - * Gradient Clipping - * Automatic loss scaling with mixed precision -* [Training Optimizers](https://www.deepspeed.ai/features/#training-optimizers) - * Fused Adam optimizer and arbitrary `torch.optim.Optimizer` - * Memory bandwidth optimized FP16 Optimizer - * Large Batch Training with LAMB Optimizer - * Memory efficient Training with ZeRO Optimizer - * CPU-Adam -* [Training Agnostic Checkpointing](https://www.deepspeed.ai/features/#training-agnostic-checkpointing) -* [Advanced Parameter Search](https://www.deepspeed.ai/features/#advanced-parameter-search) - * Learning Rate Range Test - * 1Cycle Learning Rate Schedule -* [Simplified Data Loader](https://www.deepspeed.ai/features/#simplified-data-loader) -* [Curriculum Learning](https://www.deepspeed.ai/tutorials/curriculum-learning/) - * A curriculum learning-based data pipeline that presents easier or simpler examples earlier during training - * Stable and 3.3x faster GPT-2 pre-training with 8x/4x larger batch size/learning rate while maintaining token-wise convergence speed - * Complementary to many other DeepSpeed features -* [Progressive Layer Dropping](https://www.deepspeed.ai/2020/10/28/progressive-layer-dropping-news.html) - * Efficient and robust compressed training - * Up to 2.5x convergence speedup for pre-training -* [Performance Analysis and Debugging](https://www.deepspeed.ai/features/#performance-analysis-and-debugging) -* [Mixture of Experts (MoE)](https://www.deepspeed.ai/tutorials/mixture-of-experts/) # Contributing DeepSpeed welcomes your contributions! Please see our From ed02d38d20ca2cbfb2f3e7f694ea87837cc50554 Mon Sep 17 00:00:00 2001 From: Jeff Rasley Date: Thu, 21 Jul 2022 17:11:14 -0700 Subject: [PATCH 03/38] [docs] link fixes (#2124) --- README.md | 6 +++--- docs/index.md | 18 +++++++++--------- 2 files changed, 12 insertions(+), 12 deletions(-) diff --git a/README.md b/README.md index 363bc6a2ab69..bd9c7ab05409 100755 --- a/README.md +++ b/README.md @@ -39,16 +39,16 @@ ## DeepSpeed-Training -DeepSpeed offers a confluence of system innovations, that has made large scale DL training effective, and efficient, greatly improved ease of use, and redefined the DL training landscape in terms of scale that is possible. These innovations such as ZeRO, 3D-Parallelism, DeepSpeed-MoE, ZeRO-Infinity, etc. fall under the training pillar. Learn more: [DeepSpeed-Training](/_pages/training) +DeepSpeed offers a confluence of system innovations, that has made large scale DL training effective, and efficient, greatly improved ease of use, and redefined the DL training landscape in terms of scale that is possible. These innovations such as ZeRO, 3D-Parallelism, DeepSpeed-MoE, ZeRO-Infinity, etc. fall under the training pillar. Learn more: [DeepSpeed-Training](https://www.deepspeed.ai/training/) ## DeepSpeed-Inference -DeepSpeed brings together innovations in parallelism technology such as tensor, pipeline, expert and ZeRO-parallelism, and combines them with high performance custom inference kernels, communication optimizations and heterogeneous memory technologies to enable inference at an unprecedented scale, while achieving unparalleled latency, thoughput and cost reduction. This systematic composition of system technologies for inference falls under the inference pillar. Learn more: [DeepSpeed-Inference](/_pages/inference) +DeepSpeed brings together innovations in parallelism technology such as tensor, pipeline, expert and ZeRO-parallelism, and combines them with high performance custom inference kernels, communication optimizations and heterogeneous memory technologies to enable inference at an unprecedented scale, while achieving unparalleled latency, thoughput and cost reduction. This systematic composition of system technologies for inference falls under the inference pillar. Learn more: [DeepSpeed-Inference](https://www.deepspeed.ai/inference) ## DeepSpeed-Compression -To further increase the inference efficiency, DeepSpeed offers easy-to-use and flexible-to-compose compression techniques for researchers and practitioners to compress their models while delivering faster speed, smaller model size, and significantly reduced compression cost. Moreover, SoTA innovations on compression like ZeroQuant and XTC are included under the compression pillar. Learn more: [DeepSpeed-Compression](/_pages/compression) +To further increase the inference efficiency, DeepSpeed offers easy-to-use and flexible-to-compose compression techniques for researchers and practitioners to compress their models while delivering faster speed, smaller model size, and significantly reduced compression cost. Moreover, SoTA innovations on compression like ZeroQuant and XTC are included under the compression pillar. Learn more: [DeepSpeed-Compression](https://www.deepspeed.ai/compression) --- diff --git a/docs/index.md b/docs/index.md index 5f0943ea68ea..b9fa547455d3 100755 --- a/docs/index.md +++ b/docs/index.md @@ -13,16 +13,16 @@ title: "Latest News" * [2022/01] [DeepSpeed: Advancing MoE inference and training to power next-generation AI scale](https://www.microsoft.com/en-us/research/blog/deepspeed-advancing-moe-inference-and-training-to-power-next-generation-ai-scale/) * [2021/11] [Autotuning: Automatically discover the optimal DeepSpeed configuration](https://www.deepspeed.ai/news/2021/11/15/autotuning.html) - # Extreme Speed and Scale for DL Training and Inference DeepSpeed is an easy-to-use deep learning optimization software suite that enables unprecedented scale and speed for Deep Learning Training and Inference. With DeepSpeed you can: -

Train/Inference dense or sparse models with billions or trillions of parameters

-

Achieve excellent system throughput and efficiently scale to thousands of GPUs

-

Train/Inference on resource constrained GPU systems

-

Achieve unprecedented low latency and high thoughput for inference

-

Achieve extreme compression for an unparalleled inference latency and model size reduction with low costs

+ +* Train/Inference dense or sparse models with billions or trillions of parameters +* Achieve excellent system throughput and efficiently scale to thousands of GPUs +* Train/Inference on resource constrained GPU systems +* Achieve unprecedented low latency and high thoughput for inference +* Achieve extreme compression for an unparalleled inference latency and model size reduction with low costs # DeepSpeed has three innovation pillars: @@ -32,15 +32,15 @@ title: "Latest News" ## DeepSpeed-Training -DeepSpeed offers a confluence of system innovations, that has made large scale DL training effective, and efficient, greatly improved ease of use, and redefined the DL training landscape in terms of scale that is possible. These innovations such as ZeRO, 3D-Parallelism, DeepSpeed-MoE, ZeRO-Infinity, etc fall under the DeepSpeed-Training pillar. Learn more: [DeepSpeed-Training](/_pages/training) +DeepSpeed offers a confluence of system innovations, that has made large scale DL training effective, and efficient, greatly improved ease of use, and redefined the DL training landscape in terms of scale that is possible. These innovations such as ZeRO, 3D-Parallelism, DeepSpeed-MoE, ZeRO-Infinity, etc fall under the DeepSpeed-Training pillar. Learn more: [DeepSpeed-Training](https://www.deepspeed.ai/training) ## DeepSpeed-Inference -DeepSpeed brings together innovations in parallelism technology such as tensor, pipeline, expert and ZeRO-parallelism, and combines them with high performance custom inference kernels, communication optimizations and heterogeneous memory technologies to enable inference at an unprecedented scale, while achieving unparalleled latency, thoughput and cost reduction. This systematic composition of system technologies for inference falls under the DeepSpeed-Inference. Learn more: [DeepSpeed-Inference](/_pages/inference) +DeepSpeed brings together innovations in parallelism technology such as tensor, pipeline, expert and ZeRO-parallelism, and combines them with high performance custom inference kernels, communication optimizations and heterogeneous memory technologies to enable inference at an unprecedented scale, while achieving unparalleled latency, thoughput and cost reduction. This systematic composition of system technologies for inference falls under the DeepSpeed-Inference. Learn more: [DeepSpeed-Inference](https://www.deepspeed.ai/inference) ## DeepSpeed-Compression -To further increase the inference efficiency, DeepSpeed offers easy-to-use and flexible-to-compose compression techniques for researchers and practitioners to compress their models while delivering faster speed, smaller model size, and significantly reduced compression cost. Moreover, SoTA innovations on compression like ZeroQuant and XTC are included under the DeepSpeed-Compression pillar. Learn more: [DeepSpeed-Compression](/_pages/compression) +To further increase the inference efficiency, DeepSpeed offers easy-to-use and flexible-to-compose compression techniques for researchers and practitioners to compress their models while delivering faster speed, smaller model size, and significantly reduced compression cost. Moreover, SoTA innovations on compression like ZeroQuant and XTC are included under the DeepSpeed-Compression pillar. Learn more: [DeepSpeed-Compression](https://www.deepspeed.ai/compression) # DeepSpeed Software Suite From fb72ccdc0a11aa0516d498741eeea2ed074a1fae Mon Sep 17 00:00:00 2001 From: Ammar Ahmad Awan Date: Fri, 22 Jul 2022 15:43:22 -0700 Subject: [PATCH 04/38] update info and links. (#2122) --- azure/README.md | 2 +- azure/attach.sh | 4 -- azure/azure_config.json | 7 -- azure/azure_ssh.sh | 29 -------- azure/build_docker_image.sh | 3 - azure/create_vms.sh | 55 ---------------- azure/setup_docker.sh | 50 -------------- azure/setup_vms.sh | 54 --------------- azure/shutdown_vms.sh | 37 ----------- azure/start_container.sh | 11 ---- docs/_tutorials/azure.md | 128 ++---------------------------------- 11 files changed, 8 insertions(+), 372 deletions(-) delete mode 100755 azure/attach.sh delete mode 100644 azure/azure_config.json delete mode 100755 azure/azure_ssh.sh delete mode 100755 azure/build_docker_image.sh delete mode 100755 azure/create_vms.sh delete mode 100755 azure/setup_docker.sh delete mode 100755 azure/setup_vms.sh delete mode 100755 azure/shutdown_vms.sh delete mode 100755 azure/start_container.sh diff --git a/azure/README.md b/azure/README.md index 1cca695bfa7e..df222b9a2759 100644 --- a/azure/README.md +++ b/azure/README.md @@ -1,3 +1,3 @@ # Getting Started with DeepSpeed on Azure -Please see our [Azure tutorial](https://www.deepspeed.ai/tutorials/azure/) to get started with DeepSpeed on Azure! +The recommended and simplest method to try DeepSpeed on Azure is through [AzureML](https://azure.microsoft.com/en-us/services/machine-learning/). For more details, please see our [Azure tutorial](https://www.deepspeed.ai/tutorials/azure/). diff --git a/azure/attach.sh b/azure/attach.sh deleted file mode 100755 index c23127b0fb61..000000000000 --- a/azure/attach.sh +++ /dev/null @@ -1,4 +0,0 @@ -#!/bin/bash - -name=${1-deepspeed} -docker exec -i -w /home/deepspeed -t $name /bin/bash diff --git a/azure/azure_config.json b/azure/azure_config.json deleted file mode 100644 index 9c61e4d3705c..000000000000 --- a/azure/azure_config.json +++ /dev/null @@ -1,7 +0,0 @@ -{ - "num_vms": 2, - "location": "southcentralus", - "azure_sku": "Standard_NV6_Promo", - "ssh_private_key": "id_rsa", - "docker_ssh_port": 2222 -} diff --git a/azure/azure_ssh.sh b/azure/azure_ssh.sh deleted file mode 100755 index 3259a3c88341..000000000000 --- a/azure/azure_ssh.sh +++ /dev/null @@ -1,29 +0,0 @@ -#!/bin/bash - -config_file=azure_config.json -if [ ! -f ${config_file} ]; then - echo "Cannot find $config_file" - exit 1 -fi - -location=`cat ${config_file} | jq .location | sed 's/"//g'` -rg=deepspeed_rg_$location - -while getopts 'c:' flag; do - case "${flag}" in - c) config_file="${OPTARG}" ;; - *) error "Unexpected option ${flag}" ;; - esac -done -shift $(expr $OPTIND - 1) -echo "Using $config_file" - -nodeid=$1 -cmds=${@:2} -echo $nodeid $cmds -ip_addr=`az vm list-ip-addresses -g $rg | jq .[${nodeid}].virtualMachine.network.publicIpAddresses[0].ipAddress | sed 's/"//g'` - -ssh_private_key=`cat ${config_file} | jq .ssh_private_key | sed 's/"//g'` -if [ $ssh_private_key == "null" ]; then echo 'missing ssh_private_key in config'; exit 1; fi - -ssh -i ${ssh_private_key} -o StrictHostKeyChecking=no -o UserKnownHostsFile=/dev/null deepspeed@${ip_addr} ${cmds} diff --git a/azure/build_docker_image.sh b/azure/build_docker_image.sh deleted file mode 100755 index e8617f0844f5..000000000000 --- a/azure/build_docker_image.sh +++ /dev/null @@ -1,3 +0,0 @@ -#!/bin/bash - -docker build -t deepspeed:0.1 -f ../Dockerfile . diff --git a/azure/create_vms.sh b/azure/create_vms.sh deleted file mode 100755 index 257a011f035c..000000000000 --- a/azure/create_vms.sh +++ /dev/null @@ -1,55 +0,0 @@ -#!/bin/bash - -azure_config=azure_config.json - -# Make sure jq is installed -command -v jq -if [ $? != 0 ]; then - echo "Missing dependency of jq, please 'apt-get install jq'" - exit 1 -fi - -if [ ! -f ${azure_config} ]; then - echo "Cannot find $azure_config" - exit 1 -fi -cat $azure_config - -num_vms=`cat ${azure_config} | jq .num_vms` -if [ $num_vms == "null" ]; then echo 'missing num_vms in config'; exit 1; fi -location=`cat ${azure_config} | jq .location | sed 's/"//g'` -if [ $location == "null" ]; then echo 'missing location in config'; exit 1; fi -azure_sku=`cat ${azure_config} | jq .azure_sku | sed 's/"//g'` -if [ $azure_sku == "null" ]; then echo 'missing azure_sku in config'; exit 1; fi -ssh_private_key=`cat ${azure_config} | jq .ssh_private_key | sed 's/"//g'` -if [ $ssh_private_key == "null" ]; then echo 'missing ssh_private_key in config'; exit 1; fi -ssh_key=${ssh_private_key}.pub - -if [ ! -f ${ssh_private_key} ]; then - echo "Cannot find $ssh_private_key" - exit 1 -fi -if [ ! -f ${ssh_key} ]; then - echo "Cannot find $ssh_key" - exit 1 -fi - -resource_group=deepspeed_rg_$location -az group create --name ${resource_group} --location $location - -base_vm_name=deepspeed -vm_image="nvidia:ngc_azure_17_11:ngc_gpu_cloud_19_11_3:19.11.3" - -az vm image terms accept --urn ${vm_image} - -for i in `seq 0 $(( num_vms - 1))`; do - vm_name=${base_vm_name}_$i - echo "creating $vm_name" - az vm create \ - --resource-group ${resource_group} \ - --name ${vm_name} \ - --image ${vm_image} \ - --admin-username deepspeed \ - --size ${azure_sku} \ - --ssh-key-values ${ssh_key} -done diff --git a/azure/setup_docker.sh b/azure/setup_docker.sh deleted file mode 100755 index 7b8d5cfcdd51..000000000000 --- a/azure/setup_docker.sh +++ /dev/null @@ -1,50 +0,0 @@ -#!/bin/bash - -azure_config=azure_config.json -if [ ! -f ${azure_config} ]; then - echo "Cannot find $azure_config" - exit 1 -fi -location=`cat ${azure_config} | jq .location | sed 's/"//g'` -rg=deepspeed_rg_$location - -parallel=true -command -v pdsh -if [ $? != 0 ]; then - echo "Installing pdsh will allow for the docker pull to be done in parallel across the cluster. See: 'apt-get install pdsh'" - parallel=false -fi - -ssh_key=`cat ${azure_config} | jq .ssh_private_key | sed 's/"//g'` -if [ $ssh_key == "null" ]; then echo 'missing ssh_private_key in config'; exit 1; fi -num_vms=`cat ${azure_config} | jq .num_vms` -if [ $num_vms == "null" ]; then echo 'missing num_vms in config'; exit 1; fi - -args="-i ${ssh_key} -o StrictHostKeyChecking=no -o UserKnownHostsFile=/dev/null" -username=deepspeed - -update_script=" -docker pull deepspeed/deepspeed:latest; -ln -s workdir/DeepSpeed/azure/attach.sh attach.sh; -cd workdir/DeepSpeed; -git pull; -git submodule update --init --recursive; -bash azure/start_container.sh; -" - -if [ $parallel == true ]; then - echo "parallel docker pull" - hosts="" - for node_id in {0..1}; do - addr=`az vm list-ip-addresses -g $rg | jq .[${node_id}].virtualMachine.network.publicIpAddresses[0].ipAddress | sed 's/"//g'` - hosts="${addr},${hosts}" - done - PDSH_RCMD_TYPE=ssh PDSH_SSH_ARGS_APPEND=${args} pdsh -w $hosts -l ${username} $update_script -else - echo "sequential docker pull" - for node_id in `seq 0 $((num_vms - 1))`; do - ip_addr=`az vm list-ip-addresses -g $rg | jq .[${node_id}].virtualMachine.network.publicIpAddresses[0].ipAddress | sed 's/"//g'` - addr=${username}@${ip_addr} - ssh ${args} $addr $update_script - done -fi diff --git a/azure/setup_vms.sh b/azure/setup_vms.sh deleted file mode 100755 index 118bed2ce727..000000000000 --- a/azure/setup_vms.sh +++ /dev/null @@ -1,54 +0,0 @@ -#!/bin/bash - -azure_config=azure_config.json -if [ ! -f ${azure_config} ]; then - echo "Cannot find $azure_config" - exit 1 -fi -location=`cat ${azure_config} | jq .location | sed 's/"//g'` -rg=deepspeed_rg_$location - -ssh_key=`cat ${azure_config} | jq .ssh_private_key | sed 's/"//g'` -if [ $ssh_key == "null" ]; then echo 'missing ssh_private_key in config'; exit 1; fi -docker_ssh_port=`cat ${azure_config} | jq .docker_ssh_port` -if [ $docker_ssh_port == "null" ]; then echo 'missing docker_ssh_port in config'; exit 1; fi - -username=deepspeed -args="-i ${ssh_key} -o StrictHostKeyChecking=no -o UserKnownHostsFile=/dev/null" - -num_vms=`az vm list -g $rg | jq '. | length'` -first_ip_addr=`az vm list-ip-addresses -g $rg | jq .[0].virtualMachine.network.publicIpAddresses[0].ipAddress | sed 's/"//g'` -num_slots=`ssh $args ${username}@${first_ip_addr} 'nvidia-smi -L | wc -l'` -echo "number of slots per vm: $num_slots" - -hostfile=hostfile -ssh_config=config -echo -n "" > $hostfile -echo -n "" > $ssh_config -for node_id in `seq 0 $((num_vms - 1))`; do - private_ip_addr=`az vm list-ip-addresses -g $rg | jq .[${node_id}].virtualMachine.network.privateIpAddresses[0] | sed 's/"//g'` - echo "worker-${node_id} slots=${num_slots}" >> hostfile - echo "Host worker-${node_id} - HostName ${private_ip_addr} - Port ${docker_ssh_port} - StrictHostKeyChecking no - " >> ${ssh_config} -done - -update_script=" -sudo mkdir -p /job; -sudo chmod -R 777 /job; -mkdir -p workdir; -git clone https://github.com/microsoft/DeepSpeed.git workdir/DeepSpeed; -" - -for node_id in `seq 0 $((num_vms - 1))`; do - ip_addr=`az vm list-ip-addresses -g $rg | jq .[${node_id}].virtualMachine.network.publicIpAddresses[0].ipAddress | sed 's/"//g'` - addr=${username}@${ip_addr} - echo "copying ssh keys, ssh config, hostfile to worker-${node_id}" - ssh $args ${addr} $update_script - scp $args ${ssh_key}* ${addr}:.ssh/ - scp $args ${ssh_config} ${addr}:.ssh/ - scp $args ${hostfile} ${addr}:/job/ -done -rm $hostfile $ssh_config diff --git a/azure/shutdown_vms.sh b/azure/shutdown_vms.sh deleted file mode 100755 index 75317118be43..000000000000 --- a/azure/shutdown_vms.sh +++ /dev/null @@ -1,37 +0,0 @@ -#!/bin/bash - -azure_config=azure_config.json -if [ ! -f ${azure_config} ]; then - echo "Cannot find $azure_config" - exit 1 -fi - -delete=0 -while getopts 'd' flag; do - case "${flag}" in - d) delete=1 ;; - *) - echo "Unexpected option ${flag}" - exit 1 - ;; - esac -done - -num_vms=`cat ${azure_config} | jq .num_vms` -if [ $num_vms == "null" ]; then echo 'missing num_vms in config'; exit 1; fi -location=`cat ${azure_config} | jq .location | sed 's/"//g'` -if [ $location == "null" ]; then echo 'missing location in config'; exit 1; fi - -base_vm_name=deepspeed -resource_group=deepspeed_rg_$location - -for i in `seq 0 $(( num_vms - 1))`; do - vm_name=${base_vm_name}_$i - if [ $delete == 0 ]; then - echo "deallocating $vm_name" - az vm deallocate --resource-group $resource_group --name $vm_name --no-wait - else - echo "deleting $vm_name" - az vm delete -y --resource-group $resource_group --name $vm_name --no-wait - fi -done diff --git a/azure/start_container.sh b/azure/start_container.sh deleted file mode 100755 index 7e6aae5406b6..000000000000 --- a/azure/start_container.sh +++ /dev/null @@ -1,11 +0,0 @@ -#!/bin/bash - -name=${1-deepspeed} -image=deepspeed/deepspeed:latest -echo "starting docker image named $name" -docker run -d -t --name $name \ - --network host \ - -v ${HOME}/workdir:/home/deepspeed/workdir \ - -v ${HOME}/.ssh:/home/deepspeed/.ssh \ - -v /job/hostfile:/job/hostfile \ - --gpus all $image bash -c 'sudo service ssh start && sleep infinity' diff --git a/docs/_tutorials/azure.md b/docs/_tutorials/azure.md index 1016aeafd007..a2c558444844 100644 --- a/docs/_tutorials/azure.md +++ b/docs/_tutorials/azure.md @@ -3,132 +3,18 @@ title: "Getting Started with DeepSpeed on Azure" tags: getting-started --- -This tutorial will help you get started running DeepSpeed on [Azure virtual -machines](https://azure.microsoft.com/en-us/services/virtual-machines/). -Looking forward, we will be integrating these techniques and additional enhancements -into the [Azure ML](https://azure.microsoft.com/en-us/services/machine-learning/) platform to -benefit all your large model training jobs. +This tutorial will help you get started with DeepSpeed on Azure. If you don't already have an Azure account please see more details here: [https://azure.microsoft.com/](https://azure.microsoft.com/). -To use DeepSpeed on [Azure ML](https://azure.microsoft.com/en-us/services/machine-learning/), please take a look at easy-to-use examples for Transformers and CIFAR training from [AzureML Examples GitHub](https://github.com/Azure/azureml-examples/tree/main/python-sdk/workflows/train/deepspeed). +# DeepSpeed on Azure via AzureML -To help with launching Azure instances we suggest using the [Azure -CLI](https://docs.microsoft.com/en-us/cli/azure/?view=azure-cli-latest). We have created -several helper scripts to get you quickly started using DeepSpeed with Azure. - * Install Azure CLI on your local box: [https://docs.microsoft.com/en-us/cli/azure/install-azure-cli](https://docs.microsoft.com/en-us/cli/azure/install-azure-cli). - * Alternatively, you can use the Azure in-browser shell: [https://shell.azure.com/](https://shell.azure.com/). +The recommended and simplest method to try DeepSpeed on Azure is through [AzureML](https://azure.microsoft.com/en-us/services/machine-learning/). Please take a look at easy-to-use examples for Megatron-DeepSpeed, Transformers and CIFAR training [here](https://github.com/Azure/azureml-examples/tree/main/python-sdk/workflows/train/deepspeed). -## Create an SSH key -Generate an SSH key that will be used across this tutorial to SSH into your VMs and -between Docker containers. `ssh-keygen` is the recommended way of doing this. Our scripts -assume your key is located inside the same directory as the Azure scripts. +> Our [Megatron-DeepSpeed](https://github.com/microsoft/megatron-deepspeed) contains the most up to date [recipe](https://github.com/microsoft/Megatron-DeepSpeed/tree/main/examples/azureml) for end-to-end training on AzureML. -## Azure Config JSON -Our helper scripts depend on the following a configuration JSON for deployment -and setup. We have provided a simple example JSON in `azure_config.json` that -sets up a basic environment with two VMs. This config uses the NV6_Promo -instance type which has one NVIDIA Tesla M60 GPU per VM. You can read more -details about the VM on the [Linux Virtual Machines -Pricing](https://azure.microsoft.com/en-us/pricing/details/virtual-machines/linux/) -page. +# DeepSpeed on Azure VMs -See the example below: - ```json -{ - "num_vms": 2, - "location": "southcentralus", - "azure_sku": "Standard_NV6_Promo", - "ssh_private_key": "id_rsa", - "docker_ssh_port": 2222 -} -``` +If you don't have access to AzureML or if want to build a custom environments using [Azure virtual machines](https://azure.microsoft.com/en-us/services/virtual-machines/) or Azure VM Scale-Sets ([VMSS](https://docs.microsoft.com/en-us/azure/virtual-machine-scale-sets/overview)), we are working on easy-to-use cluster setup scripts that will be published in the next few weeks. -## Dependencies -The scripts in this tutorial require [jq](https://stedolan.github.io/jq/) to help with -parsing JSON from the command line. Also it is recommended to install -[pdsh](https://linux.die.net/man/1/pdsh) to help launch ssh connections in parallel. - -## Create Azure VMs -We first need to allocate the VMs. We provide a script -```bash -./create_vms.sh -``` -to create VMs with the Azure SKU in the region specified in `azure_config.json`. Feel -free to customize your JSON to your desired region/SKU. This step will take a few minutes -to complete while it sets up all of your VMs on Azure. - -## Setup VM environment to use DeepSpeed -Next, we need to configure the VM environment for DeepSpeed. We provide a script -```bash -./setup_vms.sh -``` -to generate a [hostfile](/getting-started/#resource-configuration-multi-node) and SSH -configuration on all of the VMs. This configuration will be used by the DeepSpeed -Docker containers in the next step. - -## Start the DeepSpeed docker container -We now setup the DeepSpeed Docker containers on the VMs. We provide a script -```bash -./setup_docker.sh -``` -to pull the DeepSpeed image onto all VMs and start a container instance in the -background. This will take several minutes since it needs to pull the entire Docker -image. - -## Access VMs -The tool `azure_ssh.sh` will let you SSH into any of the VMs with this -syntax: -```bash -./azure_ssh.sh [command] -``` -where the `node-id` is a number between `0` and `num_vms-1`. This script will find the -public IP address of your VM and use the SSH key provided in the Azure configuration -JSON. - -## Access DeepSpeed container -Everything should be up and running at this point. Let's access the running DeepSpeed -container on the first VM and make sure we can talk to the other containers in our deployment. - - * SSH into the first VM via: `./azure_ssh.sh 0` - * Change directories into the azure folder of this repo via: `cd ~/workdir/DeepSpeed/azure` - * Attach the running docker container via: `./attach.sh` - * You should now be able to `ssh` into any other docker container, the containers can be - accessed via their SSH alias of `worker-N`, where `N` is the VM number between `0` - and `num_vms-1`. In this example we should be able to successfully run `ssh worker-1 - hostname` which will return the hostname of worker-1. - -## Parallel SSH across containers - DeepSpeed comes installed with a helper script `ds_ssh` which is a wrapper around - the [pdsh](https://linux.die.net/man/1/pdsh) command that lets you issue commands - to groups of hosts (via SSH) in parallel. This wrapper simply connects with the - hostfile that defines all the containers in your deployment. For example if you run - `ds_ssh hostname` you should see a list of all the hostnames in your deployment. - -## Run CIFAR-10 example model -We will now run the DeepSpeed CIFAR-10 model example to test the VM setup. From inside -the first DeepSpeed container: - - 1) Install the python dependencies necessary to run the CIFAR-10 example model. You can - do this across your cluster via: - ```bash - ds_ssh pip install -r ~/workdir/DeepSpeed/DeepSpeedExamples/cifar/requirements.txt - ``` - - 2) Now change directories to the CIFAR example: - ```bash - cd ~/workdir/DeepSpeed/DeepSpeedExamples/cifar - ``` - - 3) Finally, launch training across all VMs: - ```bash - deepspeed cifar10_deepspeed.py --deepspeed --deepspeed_config ds_config.json - ``` - -## Megatron-LM GPT2 -DeepSpeed includes an example model using Megatron-LM's GPT2. Please refer to the full -[Megatron tutorial](/tutorials/megatron/) for more details. - * In order to fully train GPT2 with DeepSpeed and ZeRO we recommend using 8 instances of - Azure's Standard_ND40rs_v2 SKU for a total of 64 NVIDIA V100 GPUs. With this setup and - a batch size of 1536 you should be able to complete 100k training steps (153.6 million - samples) in less than 2 weeks of training. +If you already have a cluster setup, you can use the [azure recipes](https://github.com/microsoft/Megatron-DeepSpeed/tree/main/examples/azure) that can easily be modified to train various model configurations. From 86e13b8a685ed3cf65c8d457bc0af8713a5c6887 Mon Sep 17 00:00:00 2001 From: Ammar Ahmad Awan Date: Fri, 22 Jul 2022 15:44:17 -0700 Subject: [PATCH 05/38] Update moe doc (#2098) Co-authored-by: Olatunji Ruwase Co-authored-by: Jeff Rasley --- docs/_tutorials/mixture-of-experts-inference.md | 2 +- docs/_tutorials/mixture-of-experts-nlg.md | 8 ++++---- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/docs/_tutorials/mixture-of-experts-inference.md b/docs/_tutorials/mixture-of-experts-inference.md index 42df78dd0cfc..2f680c0f8103 100644 --- a/docs/_tutorials/mixture-of-experts-inference.md +++ b/docs/_tutorials/mixture-of-experts-inference.md @@ -55,7 +55,7 @@ output = model('Input String') Here, we show a text-generation example using an MoE model for which we can specify the model-parallel size and number of experts. DeepSpeed inference-engine takes care of creating the different parallelism groups using the tensor-slicing degree, number of experts, and the total number of GPUs used for running the MoE model. Regarding the expert parameters, we first use the expert-parallelism to assign each group of experts to one GPU. If number of GPUs is higher than number of experts, we use expert-slicing to partition each expert vertically/horizontally across the GPUs. -Let's take a look at some of the parameters passed to run our example. Please refer to [DeepSpeed-Example](https://github.com/microsoft/Megatron-DeepSpeed/blob/moe/examples/generate_text.sh) for a complete generate-text inference example. +Let's take a look at some of the parameters passed to run our example. Please refer to [DeepSpeed-Example](https://github.com/microsoft/Megatron-DeepSpeed/blob/main/examples/generate_text.sh) for a complete generate-text inference example. ```bash diff --git a/docs/_tutorials/mixture-of-experts-nlg.md b/docs/_tutorials/mixture-of-experts-nlg.md index e43cb83d0ed9..c88df2df75e0 100755 --- a/docs/_tutorials/mixture-of-experts-nlg.md +++ b/docs/_tutorials/mixture-of-experts-nlg.md @@ -7,7 +7,7 @@ In this tutorial, we introduce how to apply DeepSpeed Mixture of Experts (MoE) t ## 1. Installation -You would need to install DeepSpeed v0.6.0 or higher to use the MoE feature. The MoE for NLG model examples are in the [Megatron-DeepSpeed](https://github.com/microsoft/Megatron-DeepSpeed) repo (currently under [the moe branch](https://github.com/microsoft/Megatron-DeepSpeed/tree/moe) but later could be merged to main branch). +You would need to install DeepSpeed v0.6.0 or higher to use the MoE feature. The MoE for NLG model examples are in the [Megatron-DeepSpeed](https://github.com/microsoft/Megatron-DeepSpeed) repo under the MoE folder. ## 2. Training NLG+MoE models @@ -15,7 +15,7 @@ You would need to install DeepSpeed v0.6.0 or higher to use the MoE feature. The To apply MoE to the GPT-style model, we made several changes in Megatron framework, mostly in `megatron/model/` where we add the MoE layers into the model. ### 2.2. Pre-training the Standard MoE model -We provide example training scripts under [examples/MoE](https://github.com/microsoft/Megatron-DeepSpeed/tree/moe/examples/MoE) which we used to perform the experiments in our [Blog]({{ site.press_release_v6 }}). There are a few new hyperparameters for standard MoE model: +We provide example training scripts under [examples/MoE](https://github.com/microsoft/Megatron-DeepSpeed/tree/main/examples/MoE) which we used to perform the experiments in our [Blog]({{ site.press_release_v6 }}). There are a few new hyperparameters for standard MoE model: `--num-experts`: the number of experts per MoE layer. In our experiments we set it to 128. Larger number of experts tend to provide better convergence, but it's a diminishing return. @@ -30,7 +30,7 @@ We provide example training scripts under [examples/MoE](https://github.com/micr ### 2.3. Pre-training the PR-MoE model -PR-MoE is a new designed MoE models, standing for Pyramid-Residual-MoE, which improves the parameter efficiency up to 3x as compared to standard MoE. Please see our [Blog]({{ site.press_release_v6 }}) for more details. We provide example training scripts under [examples/MoE](https://github.com/microsoft/Megatron-DeepSpeed/tree/moe/examples/MoE). There are a few different hyperparameters for PR-MoE model compared to standard MoE: +PR-MoE is a new designed MoE models, standing for Pyramid-Residual-MoE, which improves the parameter efficiency up to 3x as compared to standard MoE. Please see our [Blog]({{ site.press_release_v6 }}) for more details. We provide example training scripts under [examples/MoE](https://github.com/microsoft/Megatron-DeepSpeed/tree/main/examples/MoE). There are a few different hyperparameters for PR-MoE model compared to standard MoE: `--num-experts`: Instead of providing a single number, to enable Pyramid-MoE, you need to provide a list, whose length is the same as the number of MoE layers. We suggest to use more experts in the latter stage (close to output) of the model. @@ -67,4 +67,4 @@ MoS, standing for Mixture-of-Students, is a staged distillation-based technique In addition to the new parameters above, we observe that using the teacher PR-MoE during the entire training process may adversely impact the final student model accuracy. In our experiments, we use a staged distillation method by stopping distillation early in the training process (e.g., after 400K steps) and perform optimization only against the standard language modeling loss for the rest of the training. -We provide example training scripts under [examples/MoE](https://github.com/microsoft/Megatron-DeepSpeed/tree/moe/examples/MoE). Details of our parameter settings can be found in the example training scripts. The performance results of MoS can be seen from our [blog post](https://www.microsoft.com/en-us/research/blog/deepspeed-powers-8x-larger-moe-model-training-with-high-performance/) and our [paper](https://arxiv.org/abs/2201.05596). +We provide example training scripts under [examples/MoE](https://github.com/microsoft/Megatron-DeepSpeed/tree/main/examples/MoE). Details of our parameter settings can be found in the example training scripts. The performance results of MoS can be seen from our [blog post](https://www.microsoft.com/en-us/research/blog/deepspeed-powers-8x-larger-moe-model-training-with-high-performance/) and our [paper](https://arxiv.org/abs/2201.05596). From 6392f83d9b64bebf15f8c50aa0b0da156d25aaf4 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 22 Jul 2022 15:46:53 -0700 Subject: [PATCH 06/38] Bump tzinfo from 1.2.9 to 1.2.10 in /docs (#2126) Bumps [tzinfo](https://github.com/tzinfo/tzinfo) from 1.2.9 to 1.2.10. - [Release notes](https://github.com/tzinfo/tzinfo/releases) - [Changelog](https://github.com/tzinfo/tzinfo/blob/master/CHANGES.md) - [Commits](https://github.com/tzinfo/tzinfo/compare/v1.2.9...v1.2.10) --- updated-dependencies: - dependency-name: tzinfo dependency-type: direct:production ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: Jeff Rasley --- docs/Gemfile.lock | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/Gemfile.lock b/docs/Gemfile.lock index 96e131c7013f..d518a542e41f 100644 --- a/docs/Gemfile.lock +++ b/docs/Gemfile.lock @@ -14,7 +14,7 @@ GEM execjs coffee-script-source (1.11.1) colorator (1.1.0) - commonmarker (0.23.4) + commonmarker (0.17.13) ruby-enum (~> 0.5) concurrent-ruby (1.1.10) dnsruby (1.61.9) @@ -275,7 +275,7 @@ GEM thread_safe (0.3.6) typhoeus (1.4.0) ethon (>= 0.9.0) - tzinfo (1.2.9) + tzinfo (1.2.10) thread_safe (~> 0.1) tzinfo-data (1.2021.5) tzinfo (>= 1.0.0) From 8413b7f83d311a0928b2f240f19f234de293478f Mon Sep 17 00:00:00 2001 From: Quentin Anthony Date: Fri, 22 Jul 2022 15:47:56 -0700 Subject: [PATCH 07/38] DS Benchmarks QoL Improvements (#2120) Co-authored-by: Jeff Rasley --- MANIFEST.in | 1 + benchmarks/__init__.py | 0 benchmarks/communication/README.md | 40 +++++---- benchmarks/communication/all_gather.py | 28 ++++--- benchmarks/communication/all_reduce.py | 26 +++--- benchmarks/communication/all_to_all.py | 26 +++--- benchmarks/communication/broadcast.py | 111 +++++++++++++++++++++++++ benchmarks/communication/pt2pt.py | 10 ++- benchmarks/communication/run_all.py | 38 ++++++--- benchmarks/communication/utils.py | 60 +++++++++---- 10 files changed, 260 insertions(+), 80 deletions(-) create mode 100644 benchmarks/__init__.py create mode 100644 benchmarks/communication/broadcast.py diff --git a/MANIFEST.in b/MANIFEST.in index d7db3154e9e1..a013ac40be35 100644 --- a/MANIFEST.in +++ b/MANIFEST.in @@ -3,3 +3,4 @@ recursive-include requirements *.txt recursive-include deepspeed *.cpp *.h *.cu *.hip *.tr *.cuh *.cc *.json recursive-include csrc *.cpp *.h *.cu *.tr *.cuh *.cc recursive-include op_builder *.py +recursive-include benchmarks *.py diff --git a/benchmarks/__init__.py b/benchmarks/__init__.py new file mode 100644 index 000000000000..e69de29bb2d1 diff --git a/benchmarks/communication/README.md b/benchmarks/communication/README.md index 6793fdfd333b..f760465b5c97 100644 --- a/benchmarks/communication/README.md +++ b/benchmarks/communication/README.md @@ -15,16 +15,23 @@ Scan across message sizes: deepspeed all_reduce.py --scan -Each individual communication operation's benchmarks have separate benchmarking options. For `all_reduce.py`, for example: +2. Run all available communication benchmarks: + +
+deepspeed run_all.py
+
+ +Like the individual benchmarks, `run_all.py` supports scanning arguments for the max message size, bw-unit, etc. Simply pass the desired arguments to `run_all.py` and they'll be propagated to each comm op.
-usage: ds_bench [-h] [--local_rank LOCAL_RANK] [--trials TRIALS] [--warmup WARMUP] [--maxsize MAXSIZE] [--async-op] [--bw-unit {Gbps,GBps}] [--backend {nccl}] [--dist {deepspeed,torch}] [--scan] [--dtype DTYPE] [--mem-factor MEM_FACTOR] [--debug]
+usage: ds_bench [-h] [--local_rank LOCAL_RANK] [--trials TRIALS] [--warmups WARMUPS] [--maxsize MAXSIZE] [--async-op] [--bw-unit {Gbps,GBps}] [--backend {nccl}] [--dist {deepspeed,torch}] [--scan] [--raw] [--all-reduce] [--all-gather] [--all-to-all]
+                [--pt2pt] [--broadcast] [--dtype DTYPE] [--mem-factor MEM_FACTOR] [--debug]
 
 optional arguments:
   -h, --help            show this help message and exit
   --local_rank LOCAL_RANK
   --trials TRIALS       Number of timed iterations
-  --warmup WARMUP       Number of warmup (non-timed) iterations
+  --warmups WARMUPS     Number of warmup (non-timed) iterations
   --maxsize MAXSIZE     Max message size as a power of 2
   --async-op            Enables non-blocking communication
   --bw-unit {Gbps,GBps}
@@ -32,24 +39,28 @@ optional arguments:
   --dist {deepspeed,torch}
                         Distributed DL framework to use
   --scan                Enables scanning all message sizes
+  --raw                 Print the message size and latency without units
+  --all-reduce          Run all_reduce
+  --all-gather          Run all_gather
+  --all-to-all          Run all_to_all
+  --pt2pt               Run pt2pt
+  --broadcast           Run broadcast
   --dtype DTYPE         PyTorch tensor dtype
   --mem-factor MEM_FACTOR
                         Proportion of max available GPU memory to use for single-size evals
-  --debug               Enables alltoall debug prints
+  --debug               Enables all_to_all debug prints
 
-2. Run all available communication benchmarks: +Note that `ds_bench` is a pre-packaged wrapper around `run_all.py`. Users can pass the same arguments as well:
-deepspeed run_all.py
+/bin/ds_bench --scan --trials=10
 
-Like the individual benchmarks, `run_all.py` supports scanning arguments for the max message size, bw-unit, etc. Simply pass the desired arguments to `run_all.py` and they'll be propagated to each comm op. - -Note that `ds_bench` is a pre-packaged wrapper around `run_all.py`. Users can pass the same arguments as well: +Finally, users can choose specific communication operations to run in `run_all.py` or `ds_bench` by passing them as arguments (all operations are run by default). For example:
-/bin/ds_bench --scan --trials=10
+deepspeed run_all.py --scan --all-reduce --all-to-all --broadcast
 
@@ -58,8 +69,7 @@ Note that `ds_bench` is a pre-packaged wrapper around `run_all.py`. Users can pa To add new communication benchmarks, follow this general procedure: 1. Copy a similar benchmark file (e.g. to add `reduce_scatter`, copy `all_reduce.py` as a template) -2. Add a new bw formula in `utils.get_bw` -3. Add a new maximum tensor element formula in `utils.max_numel` -4. Replace comm op calls in new file with find-replace -5. Find a good default `mem_factor` for use in `run__single()` function -6. Add new comm op to `run_all.py` +2. Add a new bw formula in `utils.get_bw`, a new maximum tensor element formula in `utils.max_numel`, and a new arg in `utils.benchmark_parser` +3. Replace comm op calls in new file with find-replace +4. Find a good default `mem_factor` for use in `run__single()` function +5. Add new comm op to `run_all.py` diff --git a/benchmarks/communication/all_gather.py b/benchmarks/communication/all_gather.py index 3aaa911cd3d7..993e605b855a 100644 --- a/benchmarks/communication/all_gather.py +++ b/benchmarks/communication/all_gather.py @@ -9,16 +9,16 @@ import math -# Run allgather and print metrics -def timed_allgather(input, output, args): +# Run all_gather and print metrics +def timed_all_gather(input, output, args): if args.dist == 'torch': import torch.distributed as dist elif args.dist == 'deepspeed': import deepspeed.comm as dist sync_all() - # Warmup, establish connections, etc. - for i in range(args.warmup): + # Warmups, establish connections, etc. + for i in range(args.warmups): # use all_gather_base if available if args.dist == 'torch': if hasattr(torch.distributed, "_all_gather_base"): @@ -53,23 +53,25 @@ def timed_allgather(input, output, args): avg_duration = duration / args.trials size = input.element_size() * input.nelement() n = dist.get_world_size() - tput, busbw = get_bw('allgather', size, avg_duration, args) + tput, busbw = get_bw('all_gather', size, avg_duration, args) tput_str, busbw_str, duration_str = get_metric_strings(args, tput, busbw, avg_duration) desc = f'{input.nelement()}x{input.element_size()}' + if not args.raw: + size = convert_size(size) + print_rank_0( - f"{convert_size(size):<20} {desc:25s} {duration_str:20s} {tput_str:20s} {busbw_str:20s}" - ) + f"{size:<20} {desc:25s} {duration_str:20s} {tput_str:20s} {busbw_str:20s}") -def run_allgather(local_rank, args): +def run_all_gather(local_rank, args): if args.dist == 'torch': import torch.distributed as dist elif args.dist == 'deepspeed': import deepspeed.comm as dist # Prepare benchmark header - print_header(args, 'allgather') + print_header(args, 'all_gather') global_rank = dist.get_rank() world_size = dist.get_world_size() @@ -103,7 +105,7 @@ def run_allgather(local_rank, args): sync_all() break sync_all() - timed_allgather(input, output, args) + timed_all_gather(input, output, args) else: # all_gather_base saves memory if (args.dist == 'torch' @@ -115,7 +117,7 @@ def run_allgather(local_rank, args): mem_factor = args.mem_factor # Send the biggest message size our GPUs can fit. If you're facing OOM errors, reduce the mem_factor sync_all() - elements_per_gpu = max_numel(comm_op='allgather', + elements_per_gpu = max_numel(comm_op='all_gather', dtype=getattr(torch, args.dtype), mem_factor=mem_factor, @@ -143,11 +145,11 @@ def run_allgather(local_rank, args): return sync_all() - timed_allgather(input, output, args) + timed_all_gather(input, output, args) if __name__ == "__main__": args = benchmark_parser().parse_args() rank = args.local_rank init_processes(local_rank=rank, args=args) - run_allgather(local_rank=rank, args=args) + run_all_gather(local_rank=rank, args=args) diff --git a/benchmarks/communication/all_reduce.py b/benchmarks/communication/all_reduce.py index 4a646b7bdd42..a2902e53c162 100644 --- a/benchmarks/communication/all_reduce.py +++ b/benchmarks/communication/all_reduce.py @@ -8,15 +8,15 @@ import math -def timed_allreduce(input, args): +def timed_all_reduce(input, args): if args.dist == 'torch': import torch.distributed as dist elif args.dist == 'deepspeed': import deepspeed.comm as dist sync_all() - # Warmup, establish connections, etc. - for i in range(args.warmup): + # Warmups, establish connections, etc. + for i in range(args.warmups): dist.all_reduce(input, async_op=args.async_op) sync_all() @@ -31,23 +31,25 @@ def timed_allreduce(input, args): avg_duration = duration / args.trials size = input.element_size() * input.nelement() n = dist.get_world_size() - tput, busbw = get_bw('allreduce', size, avg_duration, args) + tput, busbw = get_bw('all_reduce', size, avg_duration, args) tput_str, busbw_str, duration_str = get_metric_strings(args, tput, busbw, avg_duration) desc = f'{input.nelement()}x{input.element_size()}' + if not args.raw: + size = convert_size(size) + print_rank_0( - f"{convert_size(size):<20} {desc:25s} {duration_str:20s} {tput_str:20s} {busbw_str:20s}" - ) + f"{size:<20} {desc:25s} {duration_str:20s} {tput_str:20s} {busbw_str:20s}") -def run_allreduce(local_rank, args): +def run_all_reduce(local_rank, args): if args.dist == 'torch': import torch.distributed as dist elif args.dist == 'deepspeed': import deepspeed.comm as dist # Prepare benchmark header - print_header(args, 'allreduce') + print_header(args, 'all_reduce') world_size = dist.get_world_size() global_rank = dist.get_rank() @@ -75,11 +77,11 @@ def run_allreduce(local_rank, args): sync_all() break sync_all() - timed_allreduce(input, args) + timed_all_reduce(input, args) else: # Send the biggest message size our GPUs can fit. If you're facing OOM errors, reduce the mem_factor # Don't need output tensor, so we double mem_factor - elements_per_gpu = max_numel(comm_op='allreduce', + elements_per_gpu = max_numel(comm_op='all_reduce', dtype=getattr(torch, args.dtype), mem_factor=args.mem_factor * 2, @@ -99,11 +101,11 @@ def run_allreduce(local_rank, args): sync_all() return sync_all() - timed_allreduce(input, args) + timed_all_reduce(input, args) if __name__ == "__main__": args = benchmark_parser().parse_args() rank = args.local_rank init_processes(local_rank=rank, args=args) - run_allreduce(local_rank=rank, args=args) + run_all_reduce(local_rank=rank, args=args) diff --git a/benchmarks/communication/all_to_all.py b/benchmarks/communication/all_to_all.py index a025804791de..e0f1c5925e27 100644 --- a/benchmarks/communication/all_to_all.py +++ b/benchmarks/communication/all_to_all.py @@ -8,15 +8,15 @@ import math -def timed_alltoall(input, output, args): +def timed_all_to_all(input, output, args): if args.dist == 'torch': import torch.distributed as dist elif args.dist == 'deepspeed': import deepspeed.comm as dist sync_all() - # Warmup, establish connections, etc. - for i in range(args.warmup): + # Warmups, establish connections, etc. + for i in range(args.warmups): dist.all_to_all_single(output, input, async_op=args.async_op) sync_all() @@ -31,16 +31,18 @@ def timed_alltoall(input, output, args): avg_duration = duration / args.trials size = input.element_size() * input.nelement() n = dist.get_world_size() - tput, busbw = get_bw('alltoall', size, avg_duration, args) + tput, busbw = get_bw('all_to_all', size, avg_duration, args) tput_str, busbw_str, duration_str = get_metric_strings(args, tput, busbw, avg_duration) desc = f'{input.nelement()}x{input.element_size()}' + if not args.raw: + size = convert_size(size) + print_rank_0( - f"{convert_size(size):<20} {desc:25s} {duration_str:20s} {tput_str:20s} {busbw_str:20s}" - ) + f"{size:<20} {desc:25s} {duration_str:20s} {tput_str:20s} {busbw_str:20s}") -def run_alltoall(local_rank, args): +def run_all_to_all(local_rank, args): if args.dist == 'torch': import torch.distributed as dist elif args.dist == 'deepspeed': @@ -49,7 +51,7 @@ def run_alltoall(local_rank, args): world_size = dist.get_world_size() global_rank = dist.get_rank() # Prepare benchmark header - print_header(args, 'alltoall') + print_header(args, 'all_to_all') if args.scan: M_LIST = [] @@ -76,10 +78,10 @@ def run_alltoall(local_rank, args): sync_all() break sync_all() - timed_alltoall(input, output, args) + timed_all_to_all(input, output, args) else: # Send the biggest message size our GPUs can fit. If you're facing OOM errors, reduce the mem_factor - elements_per_gpu = max_numel(comm_op='alltoall', + elements_per_gpu = max_numel(comm_op='all_to_all', dtype=getattr(torch, args.dtype), mem_factor=args.mem_factor, @@ -113,7 +115,7 @@ def run_alltoall(local_rank, args): print(f"Before AllToAll Input List at rank {global_rank}: {input}") dist.barrier() - timed_alltoall(input, output, args) + timed_all_to_all(input, output, args) if args.debug: for i in range(world_size): @@ -126,4 +128,4 @@ def run_alltoall(local_rank, args): args = benchmark_parser().parse_args() rank = args.local_rank init_processes(local_rank=rank, args=args) - run_alltoall(local_rank=rank, args=args) + run_all_to_all(local_rank=rank, args=args) diff --git a/benchmarks/communication/broadcast.py b/benchmarks/communication/broadcast.py new file mode 100644 index 000000000000..80aef15faf97 --- /dev/null +++ b/benchmarks/communication/broadcast.py @@ -0,0 +1,111 @@ +import torch +from benchmarks.communication.utils import * +from benchmarks.communication.constants import * + +import time +import argparse +import os +import math + + +def timed_broadcast(input, args): + if args.dist == 'torch': + import torch.distributed as dist + elif args.dist == 'deepspeed': + import deepspeed.comm as dist + + sync_all() + # Warmups, establish connections, etc. + for i in range(args.warmups): + dist.broadcast(input, 0, async_op=args.async_op) + sync_all() + + # time the actual comm op trials times and average it + pre = time.perf_counter() + for i in range(args.trials): + dist.broadcast(input, 0, async_op=args.async_op) + sync_all() + duration = time.perf_counter() - pre + + # maintain and clean performance data + avg_duration = duration / args.trials + size = input.element_size() * input.nelement() + n = dist.get_world_size() + tput, busbw = get_bw('broadcast', size, avg_duration, args) + tput_str, busbw_str, duration_str = get_metric_strings(args, tput, busbw, avg_duration) + desc = f'{input.nelement()}x{input.element_size()}' + + if not args.raw: + size = convert_size(size) + + print_rank_0( + f"{size:<20} {desc:25s} {duration_str:20s} {tput_str:20s} {busbw_str:20s}") + + +def run_broadcast(local_rank, args): + if args.dist == 'torch': + import torch.distributed as dist + elif args.dist == 'deepspeed': + import deepspeed.comm as dist + + # Prepare benchmark header + print_header(args, 'broadcast') + + world_size = dist.get_world_size() + global_rank = dist.get_rank() + + if args.scan: + M_LIST = [] + for x in (2**p for p in range(1, args.maxsize)): + M_LIST.append(x) + + sync_all() + # loop over various tensor sizes + for M in M_LIST: + global_rank = dist.get_rank() + try: + mat = torch.ones(world_size, + M, + dtype=getattr(torch, + args.dtype)).cuda(local_rank) + sync_all() + input = ((mat.mul_(float(global_rank))).view(-1)) + except RuntimeError as e: + if 'out of memory' in str(e): + if dist.get_rank() == 0: + print('WARNING: Ran out of GPU memory. Exiting comm op.') + sync_all() + break + sync_all() + timed_broadcast(input, args) + else: + # Send the biggest message size our GPUs can fit. If you're facing OOM errors, reduce the mem_factor + # Don't need output tensor, so we double mem_factor + elements_per_gpu = max_numel(comm_op='broadcast', + dtype=getattr(torch, + args.dtype), + mem_factor=args.mem_factor * 2, + local_rank=local_rank, + args=args) + try: + mat = torch.ones(elements_per_gpu, + dtype=getattr(torch, + args.dtype)).cuda(local_rank) + input = ((mat.mul_(float(global_rank))).view(-1)) + except RuntimeError as e: + if 'out of memory' in str(e): + if dist.get_rank() == 0: + print( + 'WARNING: Ran out of GPU memory. Try to reduce the --mem-factor argument!' + ) + sync_all() + return + sync_all() + timed_broadcast(input, args) + + +if __name__ == "__main__": + args = benchmark_parser().parse_args() + rank = args.local_rank + init_processes(local_rank=rank, args=args) + run_broadcast(local_rank=rank, args=args) diff --git a/benchmarks/communication/pt2pt.py b/benchmarks/communication/pt2pt.py index 59970bb37428..e23ab1bb3e83 100644 --- a/benchmarks/communication/pt2pt.py +++ b/benchmarks/communication/pt2pt.py @@ -15,8 +15,8 @@ def timed_pt2pt(input, args): import deepspeed.comm as dist sync_all() - # Warmup, establish connections, etc. - for i in range(args.warmup): + # Warmups, establish connections, etc. + for i in range(args.warmups): if dist.get_rank() == 0: if args.async_op: dist.isend(input, 1) @@ -54,9 +54,11 @@ def timed_pt2pt(input, args): tput_str, busbw_str, duration_str = get_metric_strings(args, tput, busbw, avg_duration) desc = f'{input.nelement()}x{input.element_size()}' + if not args.raw: + size = convert_size(size) + print_rank_0( - f"{convert_size(size):<20} {desc:25s} {duration_str:20s} {tput_str:20s} {busbw_str:20s}" - ) + f"{size:<20} {desc:25s} {duration_str:20s} {tput_str:20s} {busbw_str:20s}") def run_pt2pt(local_rank, args): diff --git a/benchmarks/communication/run_all.py b/benchmarks/communication/run_all.py index 37ba090db2e6..246280767a63 100644 --- a/benchmarks/communication/run_all.py +++ b/benchmarks/communication/run_all.py @@ -1,9 +1,10 @@ import torch from benchmarks.communication.utils import * -from benchmarks.communication.all_reduce import run_allreduce -from benchmarks.communication.all_gather import run_allgather -from benchmarks.communication.all_to_all import run_alltoall +from benchmarks.communication.all_reduce import run_all_reduce +from benchmarks.communication.all_gather import run_all_gather +from benchmarks.communication.all_to_all import run_all_to_all from benchmarks.communication.pt2pt import run_pt2pt +from benchmarks.communication.broadcast import run_broadcast from benchmarks.communication.constants import * import time @@ -16,15 +17,32 @@ def main(args, rank): init_processes(local_rank=rank, args=args) - for comm_op in ['allreduce', 'alltoall', 'allgather', 'pt2pt']: - if comm_op == 'allreduce': - run_allreduce(local_rank=rank, args=args) - if comm_op == 'allgather': - run_allgather(local_rank=rank, args=args) - if comm_op == 'alltoall': - run_alltoall(local_rank=rank, args=args) + ops_to_run = [] + if args.all_reduce: + ops_to_run.append('all_reduce') + if args.all_gather: + ops_to_run.append('all_gather') + if args.broadcast: + ops_to_run.append('broadcast') + if args.pt2pt: + ops_to_run.append('pt2pt') + if args.all_to_all: + ops_to_run.append('all_to_all') + + if len(ops_to_run) == 0: + ops_to_run = ['all_reduce', 'all_gather', 'all_to_all', 'broadcast', 'pt2pt'] + + for comm_op in ops_to_run: + if comm_op == 'all_reduce': + run_all_reduce(local_rank=rank, args=args) + if comm_op == 'all_gather': + run_all_gather(local_rank=rank, args=args) + if comm_op == 'all_to_all': + run_all_to_all(local_rank=rank, args=args) if comm_op == 'pt2pt': run_pt2pt(local_rank=rank, args=args) + if comm_op == 'broadcast': + run_broadcast(local_rank=rank, args=args) # For directly calling benchmark diff --git a/benchmarks/communication/utils.py b/benchmarks/communication/utils.py index 8e50d03c76f7..305f2f3dad37 100644 --- a/benchmarks/communication/utils.py +++ b/benchmarks/communication/utils.py @@ -47,7 +47,10 @@ def print_header(args, comm_op): tput = f'Throughput ({args.bw_unit})' busbw = f'BusBW ({args.bw_unit})' header = f"\n---- Performance of {comm_op} on {world_size} devices ---------------------------------------------------------\n" - header += f"{'Size (Bytes)':20s} {'Description':25s} {'Duration':20s} {tput:20s} {busbw:20s}\n" + duration_str = 'Duration' + if args.raw: + duration_str += ' (us)' + header += f"{'Size (Bytes)':20s} {'Description':25s} {duration_str:20s} {tput:20s} {busbw:20s}\n" header += "----------------------------------------------------------------------------------------------------" print_rank_0(header) @@ -56,17 +59,17 @@ def get_bw(comm_op, size, duration, args): n = dist.get_world_size() tput = 0 busbw = 0 - if comm_op == "alltoall": + if comm_op == "all_to_all": tput = (size / duration) busbw = (size / duration) * ((n - 1) / n) - elif comm_op == "allgather": + elif comm_op == "all_gather": size *= n tput = (size / duration) busbw = (size / duration) * ((n - 1) / n) - elif comm_op == "allreduce": + elif comm_op == "all_reduce": tput = (size * 2 / duration) busbw = (size / duration) * (2 * (n - 1) / n) - elif comm_op == "pt2pt": + elif comm_op == "pt2pt" or comm_op == "broadcast": tput = (size / duration) busbw = tput else: @@ -86,8 +89,10 @@ def get_metric_strings(args, tput, busbw, duration): tput = f'{tput / 1e9:.3f}' busbw = f'{busbw /1e9:.3f}' - if duration_us < 1e3: - duration = f'{duration_us:.3f} us' + if duration_us < 1e3 or args.raw: + duration = f'{duration_us:.3f}' + if not args.raw: + duration += ' us' else: duration = f'{duration_ms:.3f} ms' return tput, busbw, duration @@ -99,19 +104,19 @@ def sync_all(): def max_numel(comm_op, dtype, mem_factor, local_rank, args): - dtype_size = torch._utils._element_size(dtype) + dtype_size = _element_size(dtype) max_memory_per_gpu = torch.cuda.get_device_properties( local_rank).total_memory * mem_factor - if comm_op == 'allreduce' or comm_op == 'pt2pt': + if comm_op == 'all_reduce' or comm_op == 'pt2pt' or comm_op == 'broadcast': elements_per_gpu = int(max_memory_per_gpu // dtype_size) - elif comm_op == 'allgather': + elif comm_op == 'all_gather': # all_gather performance is lower for non-powers of two, and the output buffer size scales with world size # Therefore, divide by world size and round down to nearest power of 2 elements_per_gpu = int(max_memory_per_gpu // dtype_size // dist.get_world_size()) elements_per_gpu = int(pow(2, int(math.log(elements_per_gpu, 2)))) - elif comm_op == 'alltoall': + elif comm_op == 'all_to_all': # Number of elements must be divisible by world_size - # all_to_all performance is lower for non-powers of two. Round down like allgather. + # all_to_all performance is lower for non-powers of two. Round down like all_gather. elements_per_gpu = int(max_memory_per_gpu // dtype_size) elements_per_gpu = int(dist.get_world_size() * round(elements_per_gpu / dist.get_world_size())) @@ -133,6 +138,25 @@ def convert_size(size_bytes): return "%s %s" % (s, size_name[i]) +# Copied from torch. Need to add the func here for old torch compatibility. +def _element_size(dtype): + """ + Returns the element size for a dtype, in bytes + """ + if not isinstance(dtype, torch.dtype): + raise RuntimeError(f'expected torch.dtype, but got {type(dtype)}') + + if dtype.is_complex: + return torch.finfo(dtype).bits >> 2 + elif dtype.is_floating_point: + return torch.finfo(dtype).bits >> 3 + elif dtype == torch.bool: + # NOTE: torch.bool is not supported in torch.iinfo() + return 1 + else: + return torch.iinfo(dtype).bits >> 3 + + def benchmark_parser(): parser = argparse.ArgumentParser() parser.add_argument("--local_rank", type=int) @@ -140,7 +164,7 @@ def benchmark_parser(): type=int, default=DEFAULT_TRIALS, help='Number of timed iterations') - parser.add_argument("--warmup", + parser.add_argument("--warmups", type=int, default=DEFAULT_WARMUPS, help='Number of warmup (non-timed) iterations') @@ -170,6 +194,14 @@ def benchmark_parser(): parser.add_argument("--scan", action="store_true", help='Enables scanning all message sizes') + parser.add_argument("--raw", + action="store_true", + help='Print the message size and latency without units') + parser.add_argument("--all-reduce", action="store_true", help='Run all_reduce') + parser.add_argument("--all-gather", action="store_true", help='Run all_gather') + parser.add_argument("--all-to-all", action="store_true", help='Run all_to_all') + parser.add_argument("--pt2pt", action="store_true", help='Run pt2pt') + parser.add_argument("--broadcast", action="store_true", help='Run broadcast') parser.add_argument("--dtype", type=str, default=DEFAULT_TYPE, @@ -181,5 +213,5 @@ def benchmark_parser(): help='Proportion of max available GPU memory to use for single-size evals') parser.add_argument("--debug", action="store_true", - help='Enables alltoall debug prints') + help='Enables all_to_all debug prints') return parser From b6305d0e32eb6df0f937cefb6fc5fe061dcf33e6 Mon Sep 17 00:00:00 2001 From: Juan Villamizar <100237675+jpvillam-amd@users.noreply.github.com> Date: Mon, 25 Jul 2022 12:56:05 -0500 Subject: [PATCH 08/38] [ROCm] Wrong command broke ROCm build. (#2118) Co-authored-by: Michael Wyatt --- op_builder/builder.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/op_builder/builder.py b/op_builder/builder.py index dd169b83f948..5850f4dd8425 100644 --- a/op_builder/builder.py +++ b/op_builder/builder.py @@ -190,7 +190,7 @@ def installed_rocm_version(): if OpBuilder.is_rocm_pytorch(): from torch.utils.cpp_extension import ROCM_HOME rocm_ver_file = Path(ROCM_HOME).joinpath(".info/version-dev") - if rocm_ver_file.isfile(): + if rocm_ver_file.is_file(): with open(rocm_ver_file, 'r') as file: ROCM_VERSION_DEV_RAW = file.read() elif "rocm" in roch.__version__: From 5349347bb648ce9eb84b1d78d77e50968f299b62 Mon Sep 17 00:00:00 2001 From: Quentin Anthony Date: Mon, 25 Jul 2022 13:35:16 -0700 Subject: [PATCH 09/38] DeepSpeed Communication Profiling and Logging (#2012) Co-authored-by: Ammar Ahmad Awan Co-authored-by: Jeff Rasley --- deepspeed/comm/__init__.py | 14 +- deepspeed/comm/comm.py | 315 +++++++++++++++--- deepspeed/comm/config.py | 33 ++ deepspeed/comm/constants.py | 37 ++ deepspeed/comm/torch.py | 10 +- deepspeed/comm/utils.py | 82 +++++ .../runtime/comm/coalesced_collectives.py | 13 +- deepspeed/runtime/config.py | 2 + deepspeed/runtime/engine.py | 2 + deepspeed/runtime/pipe/engine.py | 2 +- .../runtime/zero/partition_parameters.py | 5 +- deepspeed/runtime/zero/stage3.py | 2 +- deepspeed/utils/__init__.py | 1 + deepspeed/utils/comms_logging.py | 142 ++++++++ deepspeed/utils/logging.py | 4 +- deepspeed/utils/timer.py | 9 +- docs/_config.yml | 1 + docs/_data/navigation.yml | 4 + docs/_pages/config-json.md | 44 +++ docs/_pages/training.md | 18 + docs/_tutorials/comms-logging.md | 116 +++++++ 21 files changed, 784 insertions(+), 72 deletions(-) create mode 100644 deepspeed/comm/config.py create mode 100644 deepspeed/utils/comms_logging.py create mode 100644 docs/_tutorials/comms-logging.md diff --git a/deepspeed/comm/__init__.py b/deepspeed/comm/__init__.py index 1975aab8582b..3433084324d4 100644 --- a/deepspeed/comm/__init__.py +++ b/deepspeed/comm/__init__.py @@ -22,18 +22,26 @@ def get_global_rank(group, group_rank): from torch.distributed.distributed_c10d import _get_global_rank return _get_global_rank(group, group_rank) - def allgather_fn(output_tensor, input_tensor, group, async_op): + def allgather_fn(output_tensor, input_tensor, group=None, async_op=False): from torch.distributed import all_gather, get_world_size from torch import chunk output_tensors = list(chunk(output_tensor, get_world_size(group))) - return all_gather(output_tensors, input_tensor, group=group, async_op=True) + return all_gather(output_tensors, input_tensor, group=group, async_op=async_op) - def reduce_scatter_fn(output_tensor, input_tensor, group): + def reduce_scatter_fn(output_tensor, input_tensor, group=None, async_op=False): from torch.distributed import reduce_scatter, get_world_size from torch import chunk input_tensor_lst = list(chunk(input_tensor, get_world_size(group))) return reduce_scatter(output_tensor, input_tensor_lst, group=group) + def configure(deepspeed_config=None, + enabled=None, + prof_all=None, + prof_ops=None, + verbose=None): + utils.logger.warn( + "Communication logging is not supported in torch versions older than 1.8") + else: supported_torch_version = True from .comm import * diff --git a/deepspeed/comm/comm.py b/deepspeed/comm/comm.py index eaa286a6fd26..bb88e6addcb8 100644 --- a/deepspeed/comm/comm.py +++ b/deepspeed/comm/comm.py @@ -28,7 +28,7 @@ from enum import Enum import torch import os -import torch +import time from ..constants import TORCH_DISTRIBUTED_DEFAULT_PORT, default_pg_timeout from .constants import * @@ -46,6 +46,8 @@ class ReduceOp(Enum): UNUSED = 8 +from deepspeed.utils.comms_logging import CommsLogger +from deepspeed.utils import timer, get_caller_func from deepspeed.comm.backend import Backend from deepspeed.comm.torch import TorchBackend @@ -56,6 +58,12 @@ class ReduceOp(Enum): use_ds_backend = False cdb = None +# Create global timer for ops +timers = timer.SynchronizedWallClockTimer() +timer_summary = {} + +comms_logger = CommsLogger() + # Ensure we don't warn about base collectives more than once has_warned_all_gather = False has_warned_reduce_scatter = False @@ -67,6 +75,77 @@ class ReduceOp(Enum): # This should be set here so all rank/size information from the launcher can be propagated from deepspeed.comm.utils import * + +def _configure_using_config_file(config): + if config.comms_logger_enabled: + comms_logger.configure(config) + + +def configure( + deepspeed_config=None, + enabled=None, + prof_all=None, + prof_ops=None, + verbose=None, + debug=None, +): + + if deepspeed_config is not None: + _configure_using_config_file(deepspeed_config.comms_config) + + if enabled is not None: + comms_logger.enabled = enabled + + if prof_all is not None: + comms_logger.prof_all = prof_all + + if prof_ops is not None: + comms_logger.prof_ops = prof_ops + + if verbose is not None: + comms_logger.verbose = verbose + + if debug is not None: + comms_logger.debug = debug + + +# Logging wrapper for timing ops +def timed_op(func): + def log_wrapper(*args, **kwargs): + # Add enabled flag so that overhead to each comm op is two if conditions at most + if comms_logger.enabled: + if ('prof' in kwargs and kwargs['prof']) or comms_logger.prof_all or ( + 'log_name' in kwargs + and kwargs['log_name'] in comms_logger.prof_ops): + # Need func args for their defaults + func_args = get_default_args(func) + func_args.update(kwargs) + msg_size = get_msg_size_from_args(func, *args, **kwargs) + log_name = get_debug_log_name(func_args, comms_logger.debug) + timers(log_name).start() + # Return the op, then stop the op's timer + try: + return func(*args, **kwargs) + finally: + if comms_logger.enabled: + # Need to make op blocking for accurate logging + torch.cuda.synchronize() + # If we're using MPI, we can't simply sync the stream + if cdb.using_mpi: + cdb.barrier() + if ('prof' in kwargs and kwargs['prof']) or comms_logger.prof_all or ( + 'log_name' in kwargs + and kwargs['log_name'] in comms_logger.prof_ops): + log_name = get_debug_log_name(func_args, comms_logger.debug) + raw_name = func.__name__ + timers(log_name).stop() + # need temp var since 'elapsed' resets events + time_elapsed = timers(log_name).elapsed(reset=False) + comms_logger.append(raw_name, log_name, time_elapsed, msg_size) + + return log_wrapper + + # For compatibility with torch distributed's init_process_group, we shall retain the signature from PyTorch code. # DeepSpeed NCCL/MPI backend may not need all these params as we will have our own implementation. # Please read full torch.distributed API docs from https://pytorch.org/docs/stable/distributed.html @@ -142,12 +221,26 @@ def set_backend(backend): print(inst) -def broadcast(tensor, src, group=None, async_op=False): +@timed_op +def broadcast(tensor, + src, + group=None, + async_op=False, + prof=False, + log_name='broadcast', + debug=get_caller_func()): global cdb return cdb.broadcast(tensor=tensor, src=src, group=group, async_op=async_op) -def all_gather(tensor_list, tensor, group=None, async_op=False): +@timed_op +def all_gather(tensor_list, + tensor, + group=None, + async_op=False, + prof=False, + log_name='all_gather', + debug=get_caller_func()): global cdb return cdb.all_gather(tensor_list=tensor_list, tensor=tensor, @@ -162,12 +255,22 @@ def has_reduce_scatter_base(): return cdb.has_reduce_scatter_base -def reduce_scatter_fn(output_tensor: torch.Tensor, input_tensor: torch.Tensor, group): +def reduce_scatter_fn(output_tensor, + tensor, + group=None, + async_op=False, + prof=False, + debug=get_caller_func()): global cdb global has_warned_reduce_scatter assert cdb is not None and cdb.is_initialized(), 'DeepSpeed backend not set, please initialize it using init_process_group()' if cdb.has_reduce_scatter_base: - return cdb.reduce_scatter_base(output_tensor, input_tensor, group=group) + return reduce_scatter_base(output_tensor, + tensor, + group=group, + async_op=async_op, + prof=prof, + debug=debug) else: if not has_warned_reduce_scatter: utils.logger.warning( @@ -175,15 +278,43 @@ def reduce_scatter_fn(output_tensor: torch.Tensor, input_tensor: torch.Tensor, g "torch.distributed.all_gather which will result in suboptimal performance. " "please consider upgrading your pytorch installation.") has_warned_reduce_scatter = True - input_tensor_lst = list(torch.chunk(input_tensor, cdb.get_world_size(group))) - return cdb.reduce_scatter(output_tensor, input_tensor_lst, group=group) + input_tensor_lst = list(torch.chunk(tensor, cdb.get_world_size(group))) + return reduce_scatter(output_tensor, + input_tensor_lst, + group=group, + async_op=async_op, + prof=prof, + debug=debug) + + +@timed_op +def reduce_scatter_base(output_tensor, + tensor, + group=None, + async_op=False, + prof=False, + log_name='reduce_scatter_base', + debug=get_caller_func()): + global cdb + return cdb.reduce_scatter_base(output_tensor=output_tensor, + input_tensor=tensor, + group=group, + async_op=async_op) -def reduce_scatter_base(output_tensor, input_tensor, group=None): +@timed_op +def all_gather_base(output_tensor, + tensor, + group=None, + async_op=False, + prof=False, + log_name='all_gather_base', + debug=get_caller_func()): global cdb - return cdb.reduce_scatter_base(output_tensor=output_tensor, - input_tensor=input_tensor, - group=group) + return cdb.all_gather_base(output_tensor=output_tensor, + input_tensor=tensor, + group=group, + async_op=async_op) def has_allgather_base(): @@ -193,18 +324,20 @@ def has_allgather_base(): return cdb.has_allgather_base -def allgather_fn(output_tensor: torch.Tensor, - input_tensor: torch.Tensor, - group, - async_op): +def allgather_fn(output_tensor, + input_tensor, + group=None, + async_op=False, + debug=get_caller_func()): global cdb global has_warned_all_gather assert cdb is not None and cdb.is_initialized(), 'DeepSpeed backend not set, please initialize it using init_process_group()' if cdb.has_allgather_base: - return cdb.all_gather_base(output_tensor, - input_tensor, - group=group, - async_op=True) + return all_gather_base(output_tensor, + input_tensor, + group=group, + async_op=async_op, + debug=debug) else: if not has_warned_all_gather and get_rank() == 0: utils.logger.warning( @@ -213,55 +346,89 @@ def allgather_fn(output_tensor: torch.Tensor, "please consider upgrading your pytorch installation.") has_warned_all_gather = True output_tensors = list(torch.chunk(output_tensor, cdb.get_world_size(group))) - return cdb.all_gather(output_tensors, input_tensor, group=group, async_op=True) - - -def all_gather_base(output_tensor, input_tensor, group=None, async_op=False): - global cdb - return cdb.all_gather_base(output_tensor=output_tensor, - input_tensor=input_tensor, - group=group, - async_op=async_op) - - -def all_to_all_single( - output, - input, - output_split_sizes=None, - input_split_sizes=None, - group=None, - async_op=False, -): + return all_gather(output_tensors, + input_tensor, + group=group, + async_op=async_op, + debug=debug) + + +@timed_op +def all_to_all_single(output, + tensor, + output_split_sizes=None, + input_split_sizes=None, + group=None, + async_op=False, + prof=False, + log_name='all_to_all_single', + debug=get_caller_func()): global cdb return cdb.all_to_all_single(output=output, - input=input, + input=tensor, output_split_sizes=output_split_sizes, input_split_sizes=input_split_sizes, group=group, async_op=async_op) -def send(tensor, dst, group=None, tag=0): +@timed_op +def send(tensor, + dst, + group=None, + tag=0, + prof=False, + log_name='send', + debug=get_caller_func()): global cdb return cdb.send(tensor=tensor, dst=dst, group=group, tag=tag) -def recv(tensor, src=None, group=None, tag=0): +@timed_op +def recv(tensor, + src=None, + group=None, + tag=0, + prof=False, + log_name='recv', + debug=get_caller_func()): global cdb return cdb.recv(tensor=tensor, src=src, group=group, tag=tag) -def isend(tensor, dst, group=None, tag=0): +@timed_op +def isend(tensor, + dst, + group=None, + tag=0, + prof=False, + log_name='isend', + debug=get_caller_func()): global cdb return cdb.send(tensor=tensor, dst=dst, group=group, tag=tag) -def irecv(tensor, src=None, group=None, tag=0): +@timed_op +def irecv(tensor, + src=None, + group=None, + tag=0, + prof=False, + log_name='irecv', + debug=get_caller_func()): global cdb return cdb.recv(tensor=tensor, src=src, group=group, tag=tag) -def gather(tensor, gather_list=None, dst=0, group=None, async_op=False): +@timed_op +def gather(tensor, + gather_list=None, + dst=0, + group=None, + async_op=False, + prof=False, + log_name='gather', + debug=get_caller_func()): global cdb return cdb.gather(tensor=tensor, gather_list=gather_list, @@ -270,7 +437,15 @@ def gather(tensor, gather_list=None, dst=0, group=None, async_op=False): async_op=async_op) -def scatter(tensor, scatter_list=None, src=0, group=None, async_op=False): +@timed_op +def scatter(tensor, + scatter_list=None, + src=0, + group=None, + async_op=False, + prof=False, + log_name='scatter', + debug=get_caller_func()): global cdb return cdb.scatter(tensor=tensor, scatter_list=scatter_list, @@ -279,21 +454,42 @@ def scatter(tensor, scatter_list=None, src=0, group=None, async_op=False): async_op=async_op) -def barrier(group=None): +@timed_op +def barrier(group=None, prof=False, log_name='barrier', debug=get_caller_func()): global cdb return cdb.barrier() -# Local enum for Reduction operators -#from .utils import ReduceOp - - -def reduce(tensor, dst, op=ReduceOp.SUM, group=None, async_op=False): +def log_summary(): + global cdb + barrier(log_name='log_summary_barrier') + if cdb.get_rank() == 0: + comms_logger.log_all() + barrier(log_name='log_summary_barrier') + + +@timed_op +def reduce(tensor, + dst, + op=ReduceOp.SUM, + group=None, + async_op=False, + prof=False, + log_name='reduce', + debug=get_caller_func()): global cdb return cdb.reduce(tensor=tensor, dst=dst, op=op, group=group, async_op=async_op) -def reduce_scatter(output, input_list, op=ReduceOp.SUM, group=None, async_op=False): +@timed_op +def reduce_scatter(output, + input_list, + op=ReduceOp.SUM, + group=None, + async_op=False, + prof=False, + log_name='reduce_scatter', + debug=get_caller_func()): global cdb return cdb.reduce_scatter(output=output, input_list=input_list, @@ -302,7 +498,14 @@ def reduce_scatter(output, input_list, op=ReduceOp.SUM, group=None, async_op=Fal async_op=async_op) -def all_reduce(tensor, op=ReduceOp.SUM, group=None, async_op=False): +@timed_op +def all_reduce(tensor, + op=ReduceOp.SUM, + group=None, + async_op=False, + prof=False, + log_name='all_reduce', + debug=get_caller_func()): #if profile_comm: # context of the timers? # timers.start() @@ -379,7 +582,8 @@ def init_distributed(dist_backend="nccl", verbose=True, timeout=default_pg_timeout, init_method=None, - dist_init_required=None): + dist_init_required=None, + config=None): ''' Initialize dist backend, potentially performing MPI discovery if needed Arguments: @@ -389,9 +593,12 @@ def init_distributed(dist_backend="nccl", verbose: Optional (bool). verbose logging timeout: Optional (timedelta). Timeout for operations executed against the process group. Default value equals 30 minutes. init_method: Optional (string). Torch distributed, URL specifying how to initialize the process group. Default is “env://” if no init_method or store is specified. + config: Optional (dict). DeepSpeed configuration for setting up comms options (e.g. Comms profiling) ''' global cdb + configure(deepspeed_config=config) + if dist_init_required is None: dist_init_required = cdb is None or not cdb.is_initialized() diff --git a/deepspeed/comm/config.py b/deepspeed/comm/config.py new file mode 100644 index 000000000000..2c8ceaed2df9 --- /dev/null +++ b/deepspeed/comm/config.py @@ -0,0 +1,33 @@ +""" +Copyright (c) Microsoft Corporation +Licensed under the MIT license. +""" + +from typing import Optional +from deepspeed.runtime.config_utils import get_scalar_param +from pydantic import BaseModel, validator, ValidationError, create_model +from .constants import * + + +class CommsConfig(BaseModel): + class Config: + validate_all = True + validate_assignment = True + use_enum_values = True + extra = 'forbid' + + +class CommsLoggerConfig(CommsConfig): + enabled: bool = COMMS_LOGGER_ENABLED_DEFAULT + prof_all: bool = COMMS_LOGGER_PROF_ALL_DEFAULT + prof_ops: list = COMMS_LOGGER_PROF_OPS_DEFAULT + verbose: bool = COMMS_LOGGER_VERBOSE_DEFAULT + debug: bool = COMMS_LOGGER_DEBUG_DEFAULT + + +class DeepSpeedCommsConfig: + def __init__(self, ds_config): + self.comms_logger_enabled = 'comms_logger' in ds_config + + if self.comms_logger_enabled: + self.comms_logger = CommsLoggerConfig(**ds_config['comms_logger']) diff --git a/deepspeed/comm/constants.py b/deepspeed/comm/constants.py index d85f72e8cbaa..b3a526a5afbc 100644 --- a/deepspeed/comm/constants.py +++ b/deepspeed/comm/constants.py @@ -5,3 +5,40 @@ DEFAULT_AML_MASTER_PORT = "54965" DEFAULT_AML_NCCL_SOCKET_IFNAME = "^docker0,lo" + +######################################### +# Comms Logger +######################################### +# Comms Logger. By default, this feature is not enabled. +# Users can configure in ds_config.json as below example: +COMMS_LOGGER_FORMAT = ''' +The Comms Logger can be specified as: +"comms_logger": { + "enabled": true, + "verbose": false, + "prof_all": true, + "debug": false, + "prof_ops": ["all_reduce", "custom_all_reduce_name"] +} +''' +COMMS_LOGGER = "comms_logger" + +# Comms logger enable signal +COMMS_LOGGER_ENABLED = "enabled" +COMMS_LOGGER_ENABLED_DEFAULT = False + +# Comms logger verbose signal +COMMS_LOGGER_VERBOSE = "verbose" +COMMS_LOGGER_VERBOSE_DEFAULT = False + +# comms logger profile all ops signal +COMMS_LOGGER_PROF_ALL = "prof_all" +COMMS_LOGGER_PROF_ALL_DEFAULT = True + +# comms logger show all ops signal +COMMS_LOGGER_DEBUG = "debug" +COMMS_LOGGER_DEBUG_DEFAULT = False + +# comms logger profile specific ops in list +COMMS_LOGGER_PROF_OPS = "prof_ops" +COMMS_LOGGER_PROF_OPS_DEFAULT = [] diff --git a/deepspeed/comm/torch.py b/deepspeed/comm/torch.py index f7731536b696..6b4af25abd88 100644 --- a/deepspeed/comm/torch.py +++ b/deepspeed/comm/torch.py @@ -39,6 +39,7 @@ def init_process_group(self, backend, timeout, init_method): torch.distributed.init_process_group(backend, timeout=timeout, init_method=init_method) + self.using_mpi = torch.distributed.get_backend() == 'mpi' def all_reduce(self, tensor, @@ -96,11 +97,16 @@ def all_gather_base(self, output_tensor, input_tensor, group=None, async_op=Fals "please consider upgrading your pytorch installation.") pass - def reduce_scatter_base(self, output_tensor, input_tensor, group=None): + def reduce_scatter_base(self, + output_tensor, + input_tensor, + group=None, + async_op=False): if self.has_reduce_scatter_base: return torch.distributed._reduce_scatter_base(output_tensor, input_tensor, - group=group) + group=group, + async_op=async_op) else: utils.logger.warning( "unable to find torch.distributed._reduce_scatter_base. will fall back to " diff --git a/deepspeed/comm/utils.py b/deepspeed/comm/utils.py index 7ca5581a2029..1af067e91750 100644 --- a/deepspeed/comm/utils.py +++ b/deepspeed/comm/utils.py @@ -1,6 +1,8 @@ import os import enum import torch +import inspect +from deepspeed.utils import get_caller_func def older_torch(): @@ -64,6 +66,7 @@ def get_world_rank_from_launcher(): def get_world_size_from_launcher(): # DeepSpeed launcher will set it so get from there size = os.environ.get('WORLD_SIZE') + rank = os.environ.get('RANK') if size is None: size = os.environ.get('OMPI_COMM_WORLD_SIZE') @@ -72,4 +75,83 @@ def get_world_size_from_launcher(): if size is None: size = 1 + if rank == 0: + print(f"set world size to {size}") + return int(size) + + +def get_default_args(func): + signature = inspect.signature(func) + return { + k: v.default + for k, + v in signature.parameters.items() if v.default is not inspect.Parameter.empty + } + + +# We need this hacky function since torch doesn't consistently name or place the input tensor args +def get_tensor_position(func): + sig_params = inspect.signature(func).parameters + arg = None + # most colls + if 'tensor' in sig_params: + arg = 'tensor' + # reduce scatter coll + elif 'input_list' in sig_params: + arg = 'input_list' + # all_to_all and torch multiGPU colls + elif 'input_tensor_list' in sig_params: + arg = 'input_tensor_list' + if arg is None: + return -1 + else: + return list(sig_params).index(arg) + + +def get_tensor_kwarg(func, kwargs): + func_args = get_default_args(func) + func_args.update(kwargs) + arg = None + + if 'tensor' in func_args: + arg = func_args['tensor'] + elif 'input_list' in func_args: + arg = func_args['input_list'] + elif 'input_tensor_list' in func_args: + arg = func_args['input_tensor_list'] + return arg + + +def get_msg_size_from_args(func, *args, **kwargs): + # 3 cases: + # - tensor arg is in args + # - tensor arg is in kwargs + # - tensor arg is not present (e.g. barrier) + tensor_arg_position = -1 + tensor_arg = None + # check if tensor arg is in args + if len(args) > 0: + tensor_arg_position = get_tensor_position(func) + if tensor_arg_position > -1: + tensor_arg = args[get_tensor_position(func)] + # check if tensor arg is in kwargs + if tensor_arg is None and len(kwargs) > 0: + tensor_arg = get_tensor_kwarg(func, kwargs) + # if tensor arg is not present, no data is being transmitted + if tensor_arg is None: + return 0 + else: + # Sum of tensor sizes for list colls such as torch's all_to_all + # NOTE: msg_size for list colls will not be the actual size transmitted by a given MPI/NCCL call within the coll op. Instead, it's the total amount of data transmitted. + if type(tensor_arg) is list: + return sum(x.element_size() * x.nelement() for x in func_args['tensor_list']) + else: + return tensor_arg.element_size() * tensor_arg.nelement() + + +def get_debug_log_name(func_args, debug): + if debug: + return func_args['log_name'] + ' | [Caller Func: ' + get_caller_func() + ']' + else: + return func_args['log_name'] diff --git a/deepspeed/runtime/comm/coalesced_collectives.py b/deepspeed/runtime/comm/coalesced_collectives.py index e92af044f53e..6a2b8e31516d 100644 --- a/deepspeed/runtime/comm/coalesced_collectives.py +++ b/deepspeed/runtime/comm/coalesced_collectives.py @@ -12,13 +12,18 @@ import torch.nn.functional from deepspeed.utils import instrument_w_nvtx -from deepspeed.utils.logging import logger +from deepspeed.utils import logger -def _torch_reduce_scatter_fn(input_tensor: Tensor, output_tensor: Tensor, group): +def _torch_reduce_scatter_fn(input_tensor: Tensor, + output_tensor: Tensor, + group=None, + async_op=False, + prof=False): return instrument_w_nvtx(dist.reduce_scatter_fn)(output_tensor, input_tensor, - group=group) + group=group, + async_op=async_op) @instrument_w_nvtx @@ -82,7 +87,7 @@ def reduce_scatter_coalesced( # batched reduce-scatter call _torch_reduce_scatter_fn(tensor_partition_flat_buffer, tensor_partition_buffer_for_each_rank[this_rank], - group) + group=group) # reverse procedure of the interleaving done previously, done on the # result of the batched reduce-scatter diff --git a/deepspeed/runtime/config.py b/deepspeed/runtime/config.py index 9e68ac60ec02..f4e627cf58d2 100755 --- a/deepspeed/runtime/config.py +++ b/deepspeed/runtime/config.py @@ -24,6 +24,7 @@ from .zero.config import DeepSpeedZeroConfig from .zero.constants import * from .activation_checkpointing.config import DeepSpeedActivationCheckpointingConfig +from ..comm.config import DeepSpeedCommsConfig from ..monitor.config import DeepSpeedMonitorConfig from deepspeed import comm as dist @@ -806,6 +807,7 @@ def _initialize_params(self, param_dict): self.activation_checkpointing_config = DeepSpeedActivationCheckpointingConfig( param_dict) + self.comms_config = DeepSpeedCommsConfig(param_dict) self.monitor_config = DeepSpeedMonitorConfig(param_dict) self.gradient_clipping = get_gradient_clipping(param_dict) diff --git a/deepspeed/runtime/engine.py b/deepspeed/runtime/engine.py index 07638b33033f..bf37ab71adc3 100644 --- a/deepspeed/runtime/engine.py +++ b/deepspeed/runtime/engine.py @@ -286,6 +286,8 @@ def __init__( self._set_distributed_vars(args) + dist.configure(self._config) + self.monitor = MonitorMaster(self._config.monitor_config) see_memory_usage( diff --git a/deepspeed/runtime/pipe/engine.py b/deepspeed/runtime/pipe/engine.py index 94add6f9c8e4..43c65b15b525 100644 --- a/deepspeed/runtime/pipe/engine.py +++ b/deepspeed/runtime/pipe/engine.py @@ -14,7 +14,7 @@ import torch.optim as optim from deepspeed import comm as dist -from deepspeed.utils.logging import logger +from deepspeed.utils import logger from deepspeed.utils.timer import SynchronizedWallClockTimer, ThroughputTimer from deepspeed.inference.engine import InferenceEngine diff --git a/deepspeed/runtime/zero/partition_parameters.py b/deepspeed/runtime/zero/partition_parameters.py index 62cd21b3710f..de1c819fae58 100755 --- a/deepspeed/runtime/zero/partition_parameters.py +++ b/deepspeed/runtime/zero/partition_parameters.py @@ -43,7 +43,7 @@ partitioned_param_data_shape = [0] -def _dist_allgather_fn(input_tensor: Tensor, output_tensor: Tensor, group): +def _dist_allgather_fn(input_tensor: Tensor, output_tensor: Tensor, group=None): return instrument_w_nvtx(dist.allgather_fn)(output_tensor, input_tensor, group=group, @@ -834,8 +834,7 @@ def all_gather_coalesced(params: Iterable[Parameter], handle = _dist_allgather_fn( param.ds_tensor.to(torch.cuda.current_device()), param_buffer, - self.ds_process_group, - ) + self.ds_process_group) param.data = param_buffer.narrow(0, 0, param.ds_numel).view(param.ds_shape).to( diff --git a/deepspeed/runtime/zero/stage3.py b/deepspeed/runtime/zero/stage3.py index 6f7185413d88..fb284d120011 100755 --- a/deepspeed/runtime/zero/stage3.py +++ b/deepspeed/runtime/zero/stage3.py @@ -21,7 +21,7 @@ from torch.nn.parameter import Parameter from deepspeed.runtime import ZeROOptimizer -from deepspeed.utils.logging import logger +from deepspeed.utils import logger from deepspeed.runtime.fp16.loss_scaler import LossScaler, DynamicLossScaler from deepspeed.runtime.comm.coalesced_collectives import reduce_scatter_coalesced from deepspeed.runtime.utils import get_global_norm, see_memory_usage, is_model_parallel_parameter diff --git a/deepspeed/utils/__init__.py b/deepspeed/utils/__init__.py index fe7461002932..5e05bf46e9b6 100644 --- a/deepspeed/utils/__init__.py +++ b/deepspeed/utils/__init__.py @@ -1,4 +1,5 @@ from .logging import logger, log_dist +from .comms_logging import get_caller_func #from .distributed import init_distributed from .init_on_device import OnDevice from .groups import * diff --git a/deepspeed/utils/comms_logging.py b/deepspeed/utils/comms_logging.py new file mode 100644 index 000000000000..1c17868e09b1 --- /dev/null +++ b/deepspeed/utils/comms_logging.py @@ -0,0 +1,142 @@ +import logging +import sys +import os +import math +from deepspeed.utils import log_dist + + +def get_caller_func(frame=3): + import inspect, sys + return sys._getframe(frame).f_code.co_name + + +# Helper function to pretty-print message sizes +def convert_size(size_bytes): + if size_bytes == 0: + return "0B" + size_name = ("B", "KB", "MB", "GB", "TB", "PB", "EB", "ZB", "YB") + i = int(math.floor(math.log(size_bytes, 1024))) + p = math.pow(1024, i) + s = round(size_bytes / p, 2) + return "%s %s" % (s, size_name[i]) + + +# Helper function to calculate algbw and busbw. +# See https://gist.github.com/jeffra/b5e80466b4c86be00ea3b6f130fb7a36 and https://github.com/NVIDIA/nccl-tests/blob/master/doc/PERFORMANCE.md +def calc_bw_log(comm_op, size, duration): + import deepspeed.comm as dist + + n = dist.get_world_size() + tput = 0 + busbw = 0 + if comm_op == "all_to_all_single": + tput = (size / duration) + busbw = (size / duration) * ((n - 1) / n) + elif comm_op == "all_gather" or comm_op == "all_gather_base" or comm_op == "reduce_scatter" or comm_op == "reduce_scatter_base": + size *= n + tput = (size / duration) + busbw = (size / duration) * ((n - 1) / n) + elif comm_op == "all_reduce": + tput = (size * 2 / duration) + busbw = (size / duration) * (2 * (n - 1) / n) + elif comm_op == "send" or comm_op == "recv" or comm_op == "isend" or comm_op == "irecv" or comm_op == "broadcast" or comm_op == "reduce" or comm_op == "gather" or comm_op == "scatter" or comm_op == "barrier": + tput = (size / duration) + busbw = tput + else: + print_rank_0("wrong comm_op specified") + exit(0) + + # convert to Gbps + tput *= 8 + busbw *= 8 + + tput /= 1e6 + busbw /= 1e6 + + return tput, busbw + + +class CommsLogger: + def __init__(self): + from deepspeed.comm.constants import COMMS_LOGGER_VERBOSE_DEFAULT, COMMS_LOGGER_DEBUG_DEFAULT, COMMS_LOGGER_PROF_OPS_DEFAULT, COMMS_LOGGER_PROF_ALL_DEFAULT, COMMS_LOGGER_ENABLED_DEFAULT + self.comms_dict = {} + self.verbose = COMMS_LOGGER_VERBOSE_DEFAULT + self.debug = COMMS_LOGGER_DEBUG_DEFAULT + self.prof_ops = COMMS_LOGGER_PROF_OPS_DEFAULT + self.prof_all = COMMS_LOGGER_PROF_ALL_DEFAULT + self.enabled = COMMS_LOGGER_ENABLED_DEFAULT + + def configure(self, comms_config): + self.enabled = comms_config.comms_logger_enabled + if self.enabled: + self.verbose = comms_config.comms_logger.verbose + self.debug = comms_config.comms_logger.debug + self.prof_ops = comms_config.comms_logger.prof_ops + self.prof_all = comms_config.comms_logger.prof_all + + # There are three settings for the op profiler: + # - Global profiling (profile all comms) + # - Op-type profiling (e.g. profile all all_reduce comms) + # - Op profiling (e.g. profile a specific all_reduce op) + def start_profiling_comms(): + self.prof_all = True + + def stop_profiling_comms(): + self.prof_all = True + + # E.g. start_profiling_op('all_reduce') + def start_profiling_op(op_name_list): + self.prof_ops = list(set(comms_logger.prof_ops) | set(op_name_list)) + + def stop_profiling_op(op_name_list): + self.prof_ops = [op for op in comms_logger.prof_ops if op not in op_name_list] + + # Add log entry + def append(self, raw_name, record_name, latency, msg_size): + import deepspeed.comm as dist + algbw, busbw = calc_bw_log(raw_name, msg_size, latency) + if record_name in self.comms_dict.keys(): + # If this comm_op has already been logged with this message size, just add to existing record + if msg_size in self.comms_dict[record_name].keys(): + self.comms_dict[record_name][msg_size][0] += 1 + self.comms_dict[record_name][msg_size][1].append(latency) + self.comms_dict[record_name][msg_size][2].append(algbw) + self.comms_dict[record_name][msg_size][3].append(busbw) + # If this is a new message size for this comm_op, add new record under existing comm_op + else: + self.comms_dict[record_name][msg_size] = [1, [latency], [algbw], [busbw]] + else: + # Create entirely new record + self.comms_dict[record_name] = {msg_size: [1, [latency], [algbw], [busbw]]} + # If verbose, print every comm op + # TODO: Add to tensorboard + if self.verbose: + n = dist.get_world_size() + log_str = f"rank={dist.get_rank()} | comm op: " + record_name + " | time (ms): {:.2f}".format( + latency) + log_str += " | msg size: " + convert_size(msg_size) + log_str += " | algbw (Gbps): {:.2f} ".format(algbw) + log_str += " | busbw (Gbps): {:.2f} ".format(busbw) + log_dist(log_str, [0]) + + # Print summary at end of iteration, epoch, or training + def log_all(self): + from deepspeed.utils.timer import trim_mean + print( + f"{'Comm. Op': <20}{'Message Size': <20}{'Count': <20}{'Total Latency(ms)': <20}{'Avg Latency(ms)': <20}{'tput_avg (Gbps)': <20}{'busbw_avg (Gbps)': <20}" + ) + for record_name in self.comms_dict.keys(): + print(record_name) + for msg_size, vals in sorted(self.comms_dict[record_name].items()): + # vals[0] is the count for each msg size + count = vals[0] + # vals[1] is a list of latency records for each msg size + total_lat = sum(vals[1]) + # vals[2] and vals[3] are the lists of algbw and busbw, respectively + # Get rid of outliers when we print + avg_lat = trim_mean(vals[1], 0.1) + avg_algbw = trim_mean(vals[2], 0.1) + avg_busbw = trim_mean(vals[3], 0.1) + print( + f"{' ': <20}{convert_size(msg_size): <20}{count: <20}{total_lat: <20.2f}{avg_lat: <20.2f}{avg_algbw: <20.2f}{avg_busbw: <20.2f}" + ) diff --git a/deepspeed/utils/logging.py b/deepspeed/utils/logging.py index 55636173b0a4..b8217dc2bb94 100644 --- a/deepspeed/utils/logging.py +++ b/deepspeed/utils/logging.py @@ -2,8 +2,6 @@ import sys import os -from deepspeed import comm as dist - log_levels = { "debug": logging.DEBUG, "info": logging.INFO, @@ -47,6 +45,7 @@ def create_logger(name=None, level=logging.INFO): def log_dist(message, ranks=None, level=logging.INFO): + from deepspeed import comm as dist """Log message when one of following condition meets + not dist.is_initialized() @@ -70,6 +69,7 @@ def log_dist(message, ranks=None, level=logging.INFO): def print_json_dist(message, ranks=None, path=None): + from deepspeed import comm as dist """Print message when one of following condition meets + not dist.is_initialized() diff --git a/deepspeed/utils/timer.py b/deepspeed/utils/timer.py index 9c98dc930d9e..8685f144bbb2 100755 --- a/deepspeed/utils/timer.py +++ b/deepspeed/utils/timer.py @@ -10,8 +10,6 @@ from deepspeed.utils.logging import log_dist from deepspeed import comm as dist -from deepspeed.utils import logger - try: import psutil @@ -94,6 +92,9 @@ def mean(self): def __init__(self): self.timers = {} + def get_timers(self): + return self.timers + def __call__(self, name): if name not in self.timers: self.timers[name] = self.Timer(name) @@ -143,6 +144,7 @@ def __init__( monitor_memory=False, logging_fn=None, ): + from deepspeed.utils import logger self.start_time = 0 self.end_time = 0 self.started = False @@ -233,6 +235,9 @@ def trim_mean(data, trim_percent): """ assert trim_percent >= 0.0 and trim_percent <= 1.0 n = len(data) + # Account for edge case of empty list + if len(data) == 0: + return 0 data.sort() k = int(round(n * (trim_percent))) return mean(data[k:n - k]) diff --git a/docs/_config.yml b/docs/_config.yml index 0b3ae77595e6..e09827d6b31e 100644 --- a/docs/_config.yml +++ b/docs/_config.yml @@ -50,6 +50,7 @@ collections: - mixture-of-experts-inference.md - model-compression.md - monitor.md + - comms-logging.md - one-cycle.md - onebit-adam.md - zero-one-adam.md diff --git a/docs/_data/navigation.yml b/docs/_data/navigation.yml index dc4c8c27677a..aae93d4d75b7 100755 --- a/docs/_data/navigation.yml +++ b/docs/_data/navigation.yml @@ -40,6 +40,8 @@ lnav: url: /docs/config-json/#flops-profiler - title: 'Monitoring' url: /docs/config-json/#monitoring-module-tensorboard-wandb-csv + - title: 'Communication Logging' + url: /docs/config-json/#communication-logging - title: 'Model Compression' url: /docs/config-json/#compression - title: 'Tutorials' @@ -83,6 +85,8 @@ lnav: url: /tutorials/MoQ-tutorial/ - title: 'Monitoring' url: /tutorials/monitor + - title: 'Communication Logging' + url: /tutorials/comms-logging - title: 'One-Cycle Schedule' url: /tutorials/one-cycle/ - title: 'One-Bit Adam' diff --git a/docs/_pages/config-json.md b/docs/_pages/config-json.md index 642b0300f09f..11541aee9761 100755 --- a/docs/_pages/config-json.md +++ b/docs/_pages/config-json.md @@ -1047,6 +1047,50 @@ Example of **csv_monitor** configuration: "job_name": "train_bert" } ``` + +### Communication Logging + + +DeepSpeed provides a flexible communication logging tool which can automatically detect and record communication operations launched via `deepspeed.comm`. NOTE: All logging communication calls are synchronized in order to provide accurate timing information. This may hamper performance if your model heavily uses asynchronous communication operations. + +Once the logs are populated, they can be summarized with `deepspeed.comm.log_summary()`. For more detail and example usage, see the [tutorial](/tutorials/comms-logging/) + + + + +**comms_logger**: [dictionary] + +| Fields | Value |Default | +| ------ | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | ----- | +| enabled | Whether communication logging is enabled. | `false` | +| verbose | Whether to immediately print every communication operation | `false` | +| prof_all | Whether to profile all operations. | `true` | +| debug | Appends the caller function to each communication operation's `log_name`. | `false` | +| prof_ops | A list of communication operations to log (only the specified ops will be profiled). | `[]` | + + +Example of recommended **comms_logger** configuration: + +```json +"comms_logger": { + "enabled": true, + "verbose": false, + "prof_all": true, + "debug": false +} +``` + +Example of **comms_logger** configuration for logging specific operations only: + +```json +"comms_logger": { + "enabled": true, + "verbose": false, + "prof_all": false, + "debug": false, + "prof_ops": ["all_reduce", "all_gather"] +} +``` ### Compression **Note:** **Compression** has seven different components, including layer reduction, weight quantization, activation quantization, sparse pruning, row pruning, head pruning, and channel pruning. We explain them one by one with simple json examples. Read more about how to use the DeepSpeed Compression library in our [tutorial](/tutorials/model-compression/). diff --git a/docs/_pages/training.md b/docs/_pages/training.md index 116bb0d2c697..41178d54ea43 100644 --- a/docs/_pages/training.md +++ b/docs/_pages/training.md @@ -527,6 +527,24 @@ The DeepSpeed Monitor logs live training metrics to one or more monitoring backe The Monitor can also be added to log custom metrics and client codes. Please refer to the [Monitor](/tutorials/monitor) tutorial for more details. +### Communication Logging + +DeepSpeed provides logging of all communication operations launched within `deepspeed.comm`. The communication logger can be configured in the `deepspeed_config` file as follows: + +```json +{ + "comms_logger": { + "enabled": true, + "verbose": false, + "prof_all": true, + "debug": false + } +} + +``` + +Client codes can then print a summary with a call to `deepspeed.comm.log_summary()`. For more details and example usage, see the [Communication Logging](/tutorials/comms-logging) tutorial. + ## Sparse Attention DeepSpeed offers sparse attention to support long sequences. Please refer to the [Sparse Attention](/tutorials/sparse-attention/) tutorial. diff --git a/docs/_tutorials/comms-logging.md b/docs/_tutorials/comms-logging.md new file mode 100644 index 000000000000..52d93eda05bc --- /dev/null +++ b/docs/_tutorials/comms-logging.md @@ -0,0 +1,116 @@ +--- +title: "Communication Logging" +excerpt: "Log all DeepSpeed communication calls" +tags: profiling performance-tuning +--- + +In this tutorial, we introduce DeepSpeed communication logging and provide examples of its usage. + + - [Overview](#overview) + - [Usage](#usage) + +## Overview + +NOTE: All logging communication calls are synchronized in order to provide accurate timing information. This may hamper performance if your model heavily uses asynchronous communication operations. + +Logging communication calls is vital to ensure networking resources are fully utilized. The DeepSpeed communication logger enables the detection and logging of all communication operations launched under `deepspeed.comm`. Each communication operation can all be directly printed to the console immediately after completion (via the `verbose` config option), or a summary may be printed with a call to `deepspeed.comm.log_summary()` in the client code at the completion of training, an epoch, after N training iterations, etc. + +## Usage + +Communication logging in DeepSpeed is configured within the deepspeed [configuration file](/docs/config-json/#communication-logging). DeepSpeed will automatically log communication either all operations (`prof_all`), or user-specified operations (`prof_ops`). + + - [Configuration Setup](#configuration-setup) + - [Verbose Logging](#verbose-logging) + - [Log Summaries](#log-summaries) + +### Configuration Setup + +Communication logging can be configured in the DeepSpeed [configuration file](/docs/config-json/#communication-logging). Communication logging can be enabled by adding the following field to DeepSpeed's configuration json file. Refer to [Communication Logging](/docs/config-json/#communication-logging) for details. + +```json +"comms_logger": { + "enabled": true, + "verbose": false, + "prof_all": true, + "debug": false +} +``` + +There are currently two ways to view communication log records: + +1. Print all communication operations with `verbose` config option. See [Verbose Logging](#verbose-logging) +2. (Recommended) Print log summary with `deepspeed.comm.log_summary()` function call. See [Log Summaries](#log-summaries) + +### Verbose Logging + +If the `enabled` configuration option is selected, all communication operations will be immediately printed to the console. This mode is intended for detailed debugging, and is not recommended for most users. The following is an example snippet of `verbose` output: + +``` +[2022-06-26 01:39:55,722] [INFO] [logging.py:69:log_dist] [Rank 0] rank=0 | comm op: reduce_scatter_base | time (ms): 9.46 | msg size: 678.86 MB | algbw (Gbps): 1204.52 | busbw (Gbps): 1129.23 +[2022-06-26 01:39:56,470] [INFO] [logging.py:69:log_dist] [Rank 0] rank=0 | comm op: all_gather_base | time (ms): 0.11 | msg size: 6.0 MB | algbw (Gbps): 954.41 | busbw (Gbps): 894.76 +[2022-06-26 01:39:56,471] [INFO] [logging.py:69:log_dist] [Rank 0] rank=0 | comm op: all_gather_base | time (ms): 0.08 | msg size: 6.0 MB | algbw (Gbps): 1293.47 | busbw (Gbps): 1212.63 +``` + +For advanced users, the `debug` option will append the calling function of each communication operation to that operation's `log_name`. See [Log Summaries](#log-summaries) for an example of a `deepspeed.comm.log_summary()` call with `debug` enabled. + + +### Log Summaries + +It's recommended that users add a call to `deepspeed.comm.log_summary()` at training milestones (e.g. every epoch or N iterations). This enables high-level communication logging without having to sift through logs from `verbose`. + +The steps to add DeepSpeed communication log summaries are as follows: + +1. Modify configuration file with desired settings +2. (Optional) If your application contains `torch.distributed` calls that you wish to log, import `deepspeed.comm` package and modify `torch.distributed` calls to use `deepspeed.comm` (Note: The `deepspeed.comm` collective and pt2pt APIs exactly match `torch.distributed`) +3. Call `deepspeed.comm.log_summary` + +For example usage, see the following modified [DeepSpeedExamples/cifar](https://github.com/microsoft/DeepSpeedExamples/tree/master/cifar) example: + +```python +# Step 2: (Optional) Import deepspeed.comm +import deepspeed.comm as dist + +# Note that any communication operations using `import torch.distributed as dist` calls can remain unchanged, and will be automatically logged under deepspeed.comm! +dist.all_reduce(tensor) + +for epoch in range(2): + + running_loss = 0.0 + for i, data in enumerate(trainloader): + pre = time.time() + inputs, labels = data[0].to(model_engine.local_rank), data[1].to( + model_engine.local_rank) + if fp16: + inputs = inputs.half() + outputs = model_engine(inputs) + loss = criterion(outputs, labels) + + model_engine.backward(loss) + model_engine.step() + post = time.time() + # Step 3: Call `deepspeed.comm.log_summary()` + dist.log_summary() +``` + +The following is a truncated example output of `deepspeed.comm.log_summary()` at the end of 10 iterations of Megatron-DeepSpeed with ZeRO-3: + +``` +Comm. Op Message Size Count Total Latency(ms) Avg Latency(ms) tput_avg (Gbps) busbw_avg (Gbps) +broadcast + 2.0 KB 146 11.12 0.08 0.43 0.41 + 98.25 MB 1 8317.12 8317.12 0.20 0.19 +reduce_scatter_base + 678.86 MB 40 602.29 9.69 1468.06 1376.31 +``` + + +And the following is a call to `deepspeed.comm.log_summary` under the same configuration with `debug` enabled: + +``` +Comm. Op Message Size Count Total Latency(ms) Avg Latency(ms) tput_avg (Gbps) busbw_avg (Gbps) +broadcast | [Caller Func: _broadcast_model] + 2.0 KB 146 9.39 0.06 0.52 0.48 + 98.25 MB 1 8540.60 8540.60 0.19 0.18 +reduce_scatter_base | [Caller Func: reduce_scatter_fn] + 678.86 MB 80 1527.17 13.94 1211.75 1136.01 +``` From 9c6cdecc1f76d4be8437ab01774a64db9e80ec30 Mon Sep 17 00:00:00 2001 From: Jeff Rasley Date: Mon, 25 Jul 2022 14:22:38 -0700 Subject: [PATCH 10/38] Delete Gemfile.lock (#2130) --- docs/Gemfile.lock | 304 ---------------------------------------------- 1 file changed, 304 deletions(-) delete mode 100644 docs/Gemfile.lock diff --git a/docs/Gemfile.lock b/docs/Gemfile.lock deleted file mode 100644 index d518a542e41f..000000000000 --- a/docs/Gemfile.lock +++ /dev/null @@ -1,304 +0,0 @@ -GEM - remote: https://rubygems.org/ - specs: - activesupport (6.0.4.6) - concurrent-ruby (~> 1.0, >= 1.0.2) - i18n (>= 0.7, < 2) - minitest (~> 5.1) - tzinfo (~> 1.1) - zeitwerk (~> 2.2, >= 2.2.2) - addressable (2.8.0) - public_suffix (>= 2.0.2, < 5.0) - coffee-script (2.4.1) - coffee-script-source - execjs - coffee-script-source (1.11.1) - colorator (1.1.0) - commonmarker (0.17.13) - ruby-enum (~> 0.5) - concurrent-ruby (1.1.10) - dnsruby (1.61.9) - simpleidn (~> 0.1) - em-websocket (0.5.3) - eventmachine (>= 0.12.9) - http_parser.rb (~> 0) - ethon (0.15.0) - ffi (>= 1.15.0) - eventmachine (1.2.7) - execjs (2.8.1) - faraday (1.10.0) - faraday-em_http (~> 1.0) - faraday-em_synchrony (~> 1.0) - faraday-excon (~> 1.1) - faraday-httpclient (~> 1.0) - faraday-multipart (~> 1.0) - faraday-net_http (~> 1.0) - faraday-net_http_persistent (~> 1.0) - faraday-patron (~> 1.0) - faraday-rack (~> 1.0) - faraday-retry (~> 1.0) - ruby2_keywords (>= 0.0.4) - faraday-em_http (1.0.0) - faraday-em_synchrony (1.0.0) - faraday-excon (1.1.0) - faraday-httpclient (1.0.1) - faraday-multipart (1.0.3) - multipart-post (>= 1.2, < 3) - faraday-net_http (1.0.1) - faraday-net_http_persistent (1.2.0) - faraday-patron (1.0.0) - faraday-rack (1.0.0) - faraday-retry (1.0.3) - ffi (1.15.5) - forwardable-extended (2.6.0) - gemoji (3.0.1) - github-pages (223) - github-pages-health-check (= 1.17.9) - jekyll (= 3.9.0) - jekyll-avatar (= 0.7.0) - jekyll-coffeescript (= 1.1.1) - jekyll-commonmark-ghpages (= 0.1.6) - jekyll-default-layout (= 0.1.4) - jekyll-feed (= 0.15.1) - jekyll-gist (= 1.5.0) - jekyll-github-metadata (= 2.13.0) - jekyll-include-cache (= 0.2.1) - jekyll-mentions (= 1.6.0) - jekyll-optional-front-matter (= 0.3.2) - jekyll-paginate (= 1.1.0) - jekyll-readme-index (= 0.3.0) - jekyll-redirect-from (= 0.16.0) - jekyll-relative-links (= 0.6.1) - jekyll-remote-theme (= 0.4.3) - jekyll-sass-converter (= 1.5.2) - jekyll-seo-tag (= 2.7.1) - jekyll-sitemap (= 1.4.0) - jekyll-swiss (= 1.0.0) - jekyll-theme-architect (= 0.2.0) - jekyll-theme-cayman (= 0.2.0) - jekyll-theme-dinky (= 0.2.0) - jekyll-theme-hacker (= 0.2.0) - jekyll-theme-leap-day (= 0.2.0) - jekyll-theme-merlot (= 0.2.0) - jekyll-theme-midnight (= 0.2.0) - jekyll-theme-minimal (= 0.2.0) - jekyll-theme-modernist (= 0.2.0) - jekyll-theme-primer (= 0.6.0) - jekyll-theme-slate (= 0.2.0) - jekyll-theme-tactile (= 0.2.0) - jekyll-theme-time-machine (= 0.2.0) - jekyll-titles-from-headings (= 0.5.3) - jemoji (= 0.12.0) - kramdown (= 2.3.1) - kramdown-parser-gfm (= 1.1.0) - liquid (= 4.0.3) - mercenary (~> 0.3) - minima (= 2.5.1) - nokogiri (>= 1.12.5, < 2.0) - rouge (= 3.26.0) - terminal-table (~> 1.4) - github-pages-health-check (1.17.9) - addressable (~> 2.3) - dnsruby (~> 1.60) - octokit (~> 4.0) - public_suffix (>= 3.0, < 5.0) - typhoeus (~> 1.3) - html-pipeline (2.14.0) - activesupport (>= 2) - nokogiri (>= 1.4) - http_parser.rb (0.8.0) - i18n (0.9.5) - concurrent-ruby (~> 1.0) - jekyll (3.9.0) - addressable (~> 2.4) - colorator (~> 1.0) - em-websocket (~> 0.5) - i18n (~> 0.7) - jekyll-sass-converter (~> 1.0) - jekyll-watch (~> 2.0) - kramdown (>= 1.17, < 3) - liquid (~> 4.0) - mercenary (~> 0.3.3) - pathutil (~> 0.9) - rouge (>= 1.7, < 4) - safe_yaml (~> 1.0) - jekyll-avatar (0.7.0) - jekyll (>= 3.0, < 5.0) - jekyll-coffeescript (1.1.1) - coffee-script (~> 2.2) - coffee-script-source (~> 1.11.1) - jekyll-commonmark (1.3.1) - commonmarker (~> 0.14) - jekyll (>= 3.7, < 5.0) - jekyll-commonmark-ghpages (0.1.6) - commonmarker (~> 0.17.6) - jekyll-commonmark (~> 1.2) - rouge (>= 2.0, < 4.0) - jekyll-default-layout (0.1.4) - jekyll (~> 3.0) - jekyll-feed (0.15.1) - jekyll (>= 3.7, < 5.0) - jekyll-gist (1.5.0) - octokit (~> 4.2) - jekyll-github-metadata (2.13.0) - jekyll (>= 3.4, < 5.0) - octokit (~> 4.0, != 4.4.0) - jekyll-include-cache (0.2.1) - jekyll (>= 3.7, < 5.0) - jekyll-mentions (1.6.0) - html-pipeline (~> 2.3) - jekyll (>= 3.7, < 5.0) - jekyll-optional-front-matter (0.3.2) - jekyll (>= 3.0, < 5.0) - jekyll-paginate (1.1.0) - jekyll-readme-index (0.3.0) - jekyll (>= 3.0, < 5.0) - jekyll-redirect-from (0.16.0) - jekyll (>= 3.3, < 5.0) - jekyll-relative-links (0.6.1) - jekyll (>= 3.3, < 5.0) - jekyll-remote-theme (0.4.3) - addressable (~> 2.0) - jekyll (>= 3.5, < 5.0) - jekyll-sass-converter (>= 1.0, <= 3.0.0, != 2.0.0) - rubyzip (>= 1.3.0, < 3.0) - jekyll-sass-converter (1.5.2) - sass (~> 3.4) - jekyll-seo-tag (2.7.1) - jekyll (>= 3.8, < 5.0) - jekyll-sitemap (1.4.0) - jekyll (>= 3.7, < 5.0) - jekyll-swiss (1.0.0) - jekyll-theme-architect (0.2.0) - jekyll (> 3.5, < 5.0) - jekyll-seo-tag (~> 2.0) - jekyll-theme-cayman (0.2.0) - jekyll (> 3.5, < 5.0) - jekyll-seo-tag (~> 2.0) - jekyll-theme-dinky (0.2.0) - jekyll (> 3.5, < 5.0) - jekyll-seo-tag (~> 2.0) - jekyll-theme-hacker (0.2.0) - jekyll (> 3.5, < 5.0) - jekyll-seo-tag (~> 2.0) - jekyll-theme-leap-day (0.2.0) - jekyll (> 3.5, < 5.0) - jekyll-seo-tag (~> 2.0) - jekyll-theme-merlot (0.2.0) - jekyll (> 3.5, < 5.0) - jekyll-seo-tag (~> 2.0) - jekyll-theme-midnight (0.2.0) - jekyll (> 3.5, < 5.0) - jekyll-seo-tag (~> 2.0) - jekyll-theme-minimal (0.2.0) - jekyll (> 3.5, < 5.0) - jekyll-seo-tag (~> 2.0) - jekyll-theme-modernist (0.2.0) - jekyll (> 3.5, < 5.0) - jekyll-seo-tag (~> 2.0) - jekyll-theme-primer (0.6.0) - jekyll (> 3.5, < 5.0) - jekyll-github-metadata (~> 2.9) - jekyll-seo-tag (~> 2.0) - jekyll-theme-slate (0.2.0) - jekyll (> 3.5, < 5.0) - jekyll-seo-tag (~> 2.0) - jekyll-theme-tactile (0.2.0) - jekyll (> 3.5, < 5.0) - jekyll-seo-tag (~> 2.0) - jekyll-theme-time-machine (0.2.0) - jekyll (> 3.5, < 5.0) - jekyll-seo-tag (~> 2.0) - jekyll-titles-from-headings (0.5.3) - jekyll (>= 3.3, < 5.0) - jekyll-watch (2.2.1) - listen (~> 3.0) - jemoji (0.12.0) - gemoji (~> 3.0) - html-pipeline (~> 2.2) - jekyll (>= 3.0, < 5.0) - kramdown (2.3.1) - rexml - kramdown-parser-gfm (1.1.0) - kramdown (~> 2.0) - liquid (4.0.3) - listen (3.7.1) - rb-fsevent (~> 0.10, >= 0.10.3) - rb-inotify (~> 0.9, >= 0.9.10) - mercenary (0.3.6) - mini_portile2 (2.8.0) - minima (2.5.1) - jekyll (>= 3.5, < 5.0) - jekyll-feed (~> 0.9) - jekyll-seo-tag (~> 2.1) - minimal-mistakes-jekyll (4.24.0) - jekyll (>= 3.7, < 5.0) - jekyll-feed (~> 0.1) - jekyll-gist (~> 1.5) - jekyll-include-cache (~> 0.1) - jekyll-paginate (~> 1.1) - jekyll-sitemap (~> 1.3) - minitest (5.15.0) - multipart-post (2.1.1) - nokogiri (1.13.6) - mini_portile2 (~> 2.8.0) - racc (~> 1.4) - octokit (4.22.0) - faraday (>= 0.9) - sawyer (~> 0.8.0, >= 0.5.3) - pathutil (0.16.2) - forwardable-extended (~> 2.6) - public_suffix (4.0.7) - racc (1.6.0) - rb-fsevent (0.11.1) - rb-inotify (0.10.1) - ffi (~> 1.0) - rexml (3.2.5) - rouge (3.26.0) - ruby-enum (0.9.0) - i18n - ruby2_keywords (0.0.5) - rubyzip (2.3.2) - safe_yaml (1.0.5) - sass (3.7.4) - sass-listen (~> 4.0.0) - sass-listen (4.0.0) - rb-fsevent (~> 0.9, >= 0.9.4) - rb-inotify (~> 0.9, >= 0.9.7) - sawyer (0.8.2) - addressable (>= 2.3.5) - faraday (> 0.8, < 2.0) - simpleidn (0.2.1) - unf (~> 0.1.4) - terminal-table (1.8.0) - unicode-display_width (~> 1.1, >= 1.1.1) - thread_safe (0.3.6) - typhoeus (1.4.0) - ethon (>= 0.9.0) - tzinfo (1.2.10) - thread_safe (~> 0.1) - tzinfo-data (1.2021.5) - tzinfo (>= 1.0.0) - unf (0.1.4) - unf_ext - unf_ext (0.0.8) - unicode-display_width (1.8.0) - wdm (0.1.1) - zeitwerk (2.5.4) - -PLATFORMS - ruby - -DEPENDENCIES - github-pages - jekyll-feed - jekyll-include-cache - jekyll-paginate - jekyll-remote-theme - minimal-mistakes-jekyll - tzinfo (~> 1.2) - tzinfo-data - wdm (~> 0.1.1) - -BUNDLED WITH - 2.3.8 From 316c4a43e0802a979951ee17f735daf77ea9780f Mon Sep 17 00:00:00 2001 From: Alex Hedges Date: Mon, 25 Jul 2022 19:48:08 -0400 Subject: [PATCH 11/38] Add flake8 to pre-commit checks (#2051) --- .pre-commit-config.yaml | 6 ++++ benchmarks/communication/all_gather.py | 5 --- benchmarks/communication/all_reduce.py | 4 --- benchmarks/communication/all_to_all.py | 4 --- benchmarks/communication/broadcast.py | 3 -- benchmarks/communication/constants.py | 2 -- benchmarks/communication/pt2pt.py | 4 --- benchmarks/communication/run_all.py | 5 --- bin/ds_bench | 1 - csrc/aio/py_test/aio_bench_perf_sweep.py | 1 - csrc/aio/py_test/parse_aio_stats.py | 1 - csrc/aio/py_test/test_ds_aio.py | 4 --- csrc/aio/py_test/test_ds_aio_utils.py | 2 -- csrc/aio/py_test/validate_async_io.py | 1 - deepspeed/autotuning/autotuner.py | 8 +---- deepspeed/autotuning/scheduler.py | 8 ----- deepspeed/autotuning/tuner/base_tuner.py | 3 -- deepspeed/autotuning/tuner/cost_model.py | 2 -- .../autotuning/tuner/index_based_tuner.py | 2 -- .../autotuning/tuner/model_based_tuner.py | 4 +-- deepspeed/autotuning/utils.py | 16 +--------- deepspeed/comm/comm.py | 2 -- deepspeed/comm/config.py | 4 +-- deepspeed/comm/torch.py | 5 --- deepspeed/comm/utils.py | 3 +- deepspeed/compression/basic_layer.py | 1 - deepspeed/compression/compress.py | 3 -- deepspeed/elasticity/elasticity.py | 4 +-- deepspeed/env_report.py | 3 +- deepspeed/git_version_info.py | 2 +- deepspeed/inference/engine.py | 2 -- deepspeed/launcher/multinode_runner.py | 2 +- deepspeed/module_inject/layers.py | 2 -- deepspeed/module_inject/load_checkpoint.py | 5 +-- deepspeed/module_inject/module_quantize.py | 2 -- deepspeed/module_inject/replace_module.py | 25 +++++++-------- deepspeed/module_inject/replace_policy.py | 2 -- deepspeed/moe/layer.py | 5 +-- deepspeed/moe/sharded_moe.py | 11 +++---- deepspeed/moe/utils.py | 1 - deepspeed/monitor/config.py | 4 +-- deepspeed/monitor/csv_monitor.py | 1 - deepspeed/monitor/utils.py | 4 +-- deepspeed/ops/adagrad/cpu_adagrad.py | 3 -- deepspeed/ops/adam/cpu_adam.py | 3 -- deepspeed/ops/adam/fused_adam.py | 1 - deepspeed/ops/adam/multi_tensor_apply.py | 1 - deepspeed/ops/quantizer/quantizer.py | 5 --- deepspeed/ops/sparse_attention/matmul.py | 4 +-- deepspeed/ops/sparse_attention/softmax.py | 4 --- .../sparse_attention_utils.py | 8 ++--- .../sparse_attention/sparse_self_attention.py | 2 -- .../transformer/inference/moe_inference.py | 5 --- .../inference/transformer_inference.py | 13 +++----- deepspeed/ops/transformer/transformer.py | 1 - .../profiling/flops_profiler/profiler.py | 3 +- deepspeed/runtime/bf16_optimizer.py | 1 - .../runtime/comm/coalesced_collectives.py | 1 - deepspeed/runtime/comm/nccl.py | 1 - deepspeed/runtime/engine.py | 25 +++------------ deepspeed/runtime/fp16/fused_optimizer.py | 2 +- deepspeed/runtime/fp16/onebit/adam.py | 6 +--- deepspeed/runtime/fp16/onebit/lamb.py | 4 +-- deepspeed/runtime/fp16/onebit/zoadam.py | 6 +--- deepspeed/runtime/lr_schedules.py | 2 -- deepspeed/runtime/pipe/engine.py | 29 +++++------------ deepspeed/runtime/pipe/module.py | 2 -- deepspeed/runtime/pipe/topology.py | 5 +-- deepspeed/runtime/quantize.py | 2 -- .../runtime/swap_tensor/optimizer_utils.py | 2 +- .../partitioned_optimizer_swapper.py | 3 +- .../swap_tensor/partitioned_param_swapper.py | 1 - .../pipelined_optimizer_swapper.py | 9 ++---- deepspeed/runtime/swap_tensor/utils.py | 4 --- deepspeed/runtime/utils.py | 6 ++-- deepspeed/runtime/weight_quantizer.py | 2 +- deepspeed/runtime/zero/offload_config.py | 1 - .../runtime/zero/partition_parameters.py | 10 ++---- .../zero/partitioned_param_coordinator.py | 9 ++---- deepspeed/runtime/zero/stage3.py | 22 ++----------- deepspeed/utils/comms_logging.py | 19 +++++------ deepspeed/utils/groups.py | 3 +- deepspeed/utils/timer.py | 2 -- deepspeed/utils/zero_to_fp32.py | 2 -- docs/code-docs/source/conf.py | 3 -- op_builder/builder.py | 7 ++-- op_builder/sparse_attn.py | 1 - scripts/check-torchdist.py | 3 +- setup.py | 2 -- tests/benchmarks/flatten_bench.py | 8 ++--- tests/benchmarks/unflatten_bench.py | 6 ++-- .../BingBertSquad_run_func_test.py | 4 +-- .../BingBertSquad_test_common.py | 1 - tests/model/BingBertSquad/test_e2e_squad.py | 2 -- .../Megatron_GPT2/run_checkpoint_test.py | 3 +- tests/model/Megatron_GPT2/run_func_test.py | 4 +-- .../model/Megatron_GPT2/run_perf_baseline.py | 5 +-- tests/model/Megatron_GPT2/run_perf_test.py | 5 +-- tests/model/Megatron_GPT2/test_common.py | 1 - tests/model/run_sanity_check.py | 2 -- tests/onebit/test_mpi_backend.py | 1 - tests/onebit/test_mpi_perf.py | 3 -- tests/onebit/test_nccl_backend.py | 1 - tests/onebit/test_nccl_perf.py | 1 - tests/small_model_debugging/test.py | 2 -- tests/unit/common.py | 3 -- tests/unit/megatron_model.py | 1 - tests/unit/modeling.py | 32 +++++++------------ tests/unit/modelingpreln.py | 32 +++++++------------ tests/unit/multi_output_model.py | 3 -- tests/unit/test_autocast.py | 3 +- tests/unit/test_autotuning.py | 1 - tests/unit/test_bf16.py | 1 - tests/unit/test_checkpointing.py | 9 ------ tests/unit/test_coalesced_collectives.py | 2 -- tests/unit/test_compression.py | 1 - tests/unit/test_configurable_parallel.py | 3 -- tests/unit/test_cpu_adam.py | 3 -- tests/unit/test_cuda_backward.py | 4 +-- tests/unit/test_cuda_forward.py | 10 ++---- tests/unit/test_curriculum_learning.py | 8 ----- tests/unit/test_dynamic_loss_scale.py | 4 --- tests/unit/test_elastic.py | 2 +- tests/unit/test_flops_profiler.py | 5 ++- tests/unit/test_fp16.py | 7 +--- tests/unit/test_get_optim_files.py | 1 - tests/unit/test_ignore_unused_parameters.py | 4 --- tests/unit/test_inference.py | 2 -- tests/unit/test_lr_schedulers.py | 5 +-- tests/unit/test_moe.py | 12 ++----- tests/unit/test_monitor.py | 6 ++-- tests/unit/test_multi_output_model.py | 4 --- tests/unit/test_onebit.py | 10 ++---- tests/unit/test_pipe.py | 4 +-- tests/unit/test_pipe_module.py | 4 +-- tests/unit/test_pld.py | 2 +- tests/unit/test_reshape_checkpoint.py | 3 -- tests/unit/test_runtime_utils.py | 2 -- tests/unit/test_sparse_attention.py | 26 +++++++-------- tests/unit/test_sparse_grads.py | 2 -- tests/unit/test_zero.py | 2 +- tests/unit/test_zero_tiled.py | 1 - 142 files changed, 164 insertions(+), 538 deletions(-) diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index b68175b8272a..df68ddcf5192 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -54,3 +54,9 @@ repos: --check-filenames, --check-hidden ] + +- repo: https://github.com/pycqa/flake8 + rev: 4.0.1 + hooks: + - id: flake8 + args: ['--ignore=E,F403,F405,F541,F841,W', '--select=E9,F,W6', '--per-file-ignores=__init__.py:F401'] diff --git a/benchmarks/communication/all_gather.py b/benchmarks/communication/all_gather.py index 993e605b855a..d99d2aa0e4c9 100644 --- a/benchmarks/communication/all_gather.py +++ b/benchmarks/communication/all_gather.py @@ -1,12 +1,7 @@ -import torch from benchmarks.communication.utils import * from benchmarks.communication.constants import * import time -import argparse -import os - -import math # Run all_gather and print metrics diff --git a/benchmarks/communication/all_reduce.py b/benchmarks/communication/all_reduce.py index a2902e53c162..e31f51733609 100644 --- a/benchmarks/communication/all_reduce.py +++ b/benchmarks/communication/all_reduce.py @@ -1,11 +1,7 @@ -import torch from benchmarks.communication.utils import * from benchmarks.communication.constants import * import time -import argparse -import os -import math def timed_all_reduce(input, args): diff --git a/benchmarks/communication/all_to_all.py b/benchmarks/communication/all_to_all.py index e0f1c5925e27..6ee99a48ee62 100644 --- a/benchmarks/communication/all_to_all.py +++ b/benchmarks/communication/all_to_all.py @@ -1,11 +1,7 @@ -import torch from benchmarks.communication.utils import * from benchmarks.communication.constants import * import time -import argparse -import os -import math def timed_all_to_all(input, output, args): diff --git a/benchmarks/communication/broadcast.py b/benchmarks/communication/broadcast.py index 80aef15faf97..e9d89779ec66 100644 --- a/benchmarks/communication/broadcast.py +++ b/benchmarks/communication/broadcast.py @@ -3,9 +3,6 @@ from benchmarks.communication.constants import * import time -import argparse -import os -import math def timed_broadcast(input, args): diff --git a/benchmarks/communication/constants.py b/benchmarks/communication/constants.py index 3276594b777c..4b3356894b5f 100644 --- a/benchmarks/communication/constants.py +++ b/benchmarks/communication/constants.py @@ -1,5 +1,3 @@ -import torch - DEFAULT_WARMUPS = 5 DEFAULT_TRIALS = 50 DEFAULT_TYPE = 'float' diff --git a/benchmarks/communication/pt2pt.py b/benchmarks/communication/pt2pt.py index e23ab1bb3e83..cb99b20b9097 100644 --- a/benchmarks/communication/pt2pt.py +++ b/benchmarks/communication/pt2pt.py @@ -1,11 +1,7 @@ -import torch from benchmarks.communication.utils import * from benchmarks.communication.constants import * import time -import argparse -import os -import math def timed_pt2pt(input, args): diff --git a/benchmarks/communication/run_all.py b/benchmarks/communication/run_all.py index 246280767a63..9d0f0f5f191f 100644 --- a/benchmarks/communication/run_all.py +++ b/benchmarks/communication/run_all.py @@ -1,4 +1,3 @@ -import torch from benchmarks.communication.utils import * from benchmarks.communication.all_reduce import run_all_reduce from benchmarks.communication.all_gather import run_all_gather @@ -7,10 +6,6 @@ from benchmarks.communication.broadcast import run_broadcast from benchmarks.communication.constants import * -import time -import argparse -import os - # For importing def main(args, rank): diff --git a/bin/ds_bench b/bin/ds_bench index 5364d57d6953..bfacbc8e25c8 100755 --- a/bin/ds_bench +++ b/bin/ds_bench @@ -3,7 +3,6 @@ from benchmarks.communication.run_all import main from benchmarks.communication.constants import * from benchmarks.communication.utils import * -import argparse import os import sys diff --git a/csrc/aio/py_test/aio_bench_perf_sweep.py b/csrc/aio/py_test/aio_bench_perf_sweep.py index be6cd74f7ac6..f16e962b1648 100644 --- a/csrc/aio/py_test/aio_bench_perf_sweep.py +++ b/csrc/aio/py_test/aio_bench_perf_sweep.py @@ -277,7 +277,6 @@ def script_path(): def async_io_setup(): - import deepspeed from deepspeed.ops.aio import AsyncIOBuilder return AsyncIOBuilder().is_compatible() diff --git a/csrc/aio/py_test/parse_aio_stats.py b/csrc/aio/py_test/parse_aio_stats.py index 1921973e4f73..2a3e64944bef 100755 --- a/csrc/aio/py_test/parse_aio_stats.py +++ b/csrc/aio/py_test/parse_aio_stats.py @@ -7,7 +7,6 @@ import os import argparse -import re READ_SPEED = 'read_speed' WRITE_SPEED = 'write_speed' diff --git a/csrc/aio/py_test/test_ds_aio.py b/csrc/aio/py_test/test_ds_aio.py index f97d3e676c03..f83f8e78fb65 100755 --- a/csrc/aio/py_test/test_ds_aio.py +++ b/csrc/aio/py_test/test_ds_aio.py @@ -6,11 +6,7 @@ """ import os -import torch import argparse -import time -import sys -from multiprocessing import Pool import multiprocessing as mp from ds_aio_basic import aio_basic_multiprocessing from ds_aio_handle import aio_handle_multiprocessing diff --git a/csrc/aio/py_test/test_ds_aio_utils.py b/csrc/aio/py_test/test_ds_aio_utils.py index c68dfdddc233..a330e4cd1980 100755 --- a/csrc/aio/py_test/test_ds_aio_utils.py +++ b/csrc/aio/py_test/test_ds_aio_utils.py @@ -5,8 +5,6 @@ Functionality of swapping optimizer tensors to/from (NVMe) storage devices. """ -import os - BYTES_PER_GB = 1024**3 LOG_TIDS = [0] diff --git a/csrc/aio/py_test/validate_async_io.py b/csrc/aio/py_test/validate_async_io.py index ceae84c840da..4db25fe1bc33 100644 --- a/csrc/aio/py_test/validate_async_io.py +++ b/csrc/aio/py_test/validate_async_io.py @@ -4,6 +4,5 @@ Functionality of swapping optimizer tensors to/from (NVMe) storage devices. """ -import deepspeed from deepspeed.ops.aio import AsyncIOBuilder assert AsyncIOBuilder().is_compatible() diff --git a/deepspeed/autotuning/autotuner.py b/deepspeed/autotuning/autotuner.py index 4ff85e6d9717..99de3fdcab5f 100755 --- a/deepspeed/autotuning/autotuner.py +++ b/deepspeed/autotuning/autotuner.py @@ -1,10 +1,5 @@ -import copy -import json -import os -from random import sample import shutil import subprocess -import hjson import torch import time import datetime @@ -13,10 +8,9 @@ from ..runtime.config_utils import dict_raise_error_on_duplicate_keys from ..runtime.constants import * from ..runtime.zero.constants import * -from ..utils import logger from .config import DeepSpeedAutotuningConfig from .constants import * -from .scheduler import ResourceManager, run_experiment +from .scheduler import ResourceManager from .tuner import GridSearchTuner, RandomTuner, ModelBasedTuner from .utils import * diff --git a/deepspeed/autotuning/scheduler.py b/deepspeed/autotuning/scheduler.py index e3c4fbe7708b..4f91f3cc98df 100755 --- a/deepspeed/autotuning/scheduler.py +++ b/deepspeed/autotuning/scheduler.py @@ -1,17 +1,11 @@ import copy -from re import I from numpy import BUFSIZE -from deepspeed.env_report import SUCCESS -from enum import Flag import json -import os import subprocess import sys import threading import time -from pathlib import Path -from typing import List import hjson from tqdm import tqdm @@ -27,8 +21,6 @@ from deepspeed import comm as dist -from datetime import datetime - TIMEOUT = 5 diff --git a/deepspeed/autotuning/tuner/base_tuner.py b/deepspeed/autotuning/tuner/base_tuner.py index fbdb16dacb53..fe00e27457e7 100755 --- a/deepspeed/autotuning/tuner/base_tuner.py +++ b/deepspeed/autotuning/tuner/base_tuner.py @@ -1,12 +1,9 @@ -import atexit import sys from deepspeed.autotuning.constants import * from deepspeed.autotuning.utils import write_experiments from deepspeed.utils import logger -import json - class BaseTuner: def __init__(self, exps, resource_manager, metric): diff --git a/deepspeed/autotuning/tuner/cost_model.py b/deepspeed/autotuning/tuner/cost_model.py index c311659426bf..0cdcef6483b4 100755 --- a/deepspeed/autotuning/tuner/cost_model.py +++ b/deepspeed/autotuning/tuner/cost_model.py @@ -1,5 +1,3 @@ -import numpy as np - from .utils import * try: diff --git a/deepspeed/autotuning/tuner/index_based_tuner.py b/deepspeed/autotuning/tuner/index_based_tuner.py index f7233f2e8d75..1685d799d44b 100755 --- a/deepspeed/autotuning/tuner/index_based_tuner.py +++ b/deepspeed/autotuning/tuner/index_based_tuner.py @@ -1,7 +1,5 @@ import random -from deepspeed.utils import logger - from .base_tuner import BaseTuner diff --git a/deepspeed/autotuning/tuner/model_based_tuner.py b/deepspeed/autotuning/tuner/model_based_tuner.py index d8bc2b499f3d..c3e0b1ac3fd1 100755 --- a/deepspeed/autotuning/tuner/model_based_tuner.py +++ b/deepspeed/autotuning/tuner/model_based_tuner.py @@ -1,8 +1,6 @@ import hjson -import numpy as np -from deepspeed.utils import logger -from ..constants import AUTOTUNING, AUTOTUNING_METRIC_PATH, AUTOTUNING_METRIC_DEFAULT +from ..constants import AUTOTUNING, AUTOTUNING_METRIC_PATH from .base_tuner import BaseTuner from .cost_model import XGBoostCostModel from .utils import * diff --git a/deepspeed/autotuning/utils.py b/deepspeed/autotuning/utils.py index 5cfa92cd9911..41184b4dacd6 100644 --- a/deepspeed/autotuning/utils.py +++ b/deepspeed/autotuning/utils.py @@ -3,8 +3,6 @@ import os import json from deepspeed.runtime.constants import GRADIENT_ACCUMULATION_STEPS, TRAIN_MICRO_BATCH_SIZE_PER_GPU -import hjson -import sys import itertools import copy @@ -35,23 +33,11 @@ def was_interruptted(filename): return False -def was_interruptted(filename): - if not os.path.exists(filename): - return "stderr.log does not exist" - with open(filename) as f: - for line in f: - s = "KeyboardInterrupt" - idx = line.find(s) - if idx != -1: - return True - return False - - def find_replace_str(value, replace_dict): if not isinstance(value, str): return str(value) - matches = re.findall("\$[A-Za-z0-9_]+", value) + matches = re.findall(r"\$[A-Za-z0-9_]+", value) for var in matches: var_key = var.replace("$", "").lower() if var_key == "nvme_path": diff --git a/deepspeed/comm/comm.py b/deepspeed/comm/comm.py index bb88e6addcb8..ac7ea8f55c90 100644 --- a/deepspeed/comm/comm.py +++ b/deepspeed/comm/comm.py @@ -28,7 +28,6 @@ from enum import Enum import torch import os -import time from ..constants import TORCH_DISTRIBUTED_DEFAULT_PORT, default_pg_timeout from .constants import * @@ -48,7 +47,6 @@ class ReduceOp(Enum): from deepspeed.utils.comms_logging import CommsLogger from deepspeed.utils import timer, get_caller_func -from deepspeed.comm.backend import Backend from deepspeed.comm.torch import TorchBackend from deepspeed import utils diff --git a/deepspeed/comm/config.py b/deepspeed/comm/config.py index 2c8ceaed2df9..d0238331de9e 100644 --- a/deepspeed/comm/config.py +++ b/deepspeed/comm/config.py @@ -3,9 +3,7 @@ Licensed under the MIT license. """ -from typing import Optional -from deepspeed.runtime.config_utils import get_scalar_param -from pydantic import BaseModel, validator, ValidationError, create_model +from pydantic import BaseModel from .constants import * diff --git a/deepspeed/comm/torch.py b/deepspeed/comm/torch.py index 6b4af25abd88..5aec37dfd7e7 100644 --- a/deepspeed/comm/torch.py +++ b/deepspeed/comm/torch.py @@ -1,12 +1,7 @@ ''' Copyright 2021 The Microsoft DeepSpeed Team ''' -import os -import torch - from deepspeed import utils -from ..constants import TORCH_DISTRIBUTED_DEFAULT_PORT, default_pg_timeout -from datetime import timedelta from .utils import * from .backend import * diff --git a/deepspeed/comm/utils.py b/deepspeed/comm/utils.py index 1af067e91750..0b903b0b9b3f 100644 --- a/deepspeed/comm/utils.py +++ b/deepspeed/comm/utils.py @@ -1,5 +1,4 @@ import os -import enum import torch import inspect from deepspeed.utils import get_caller_func @@ -145,7 +144,7 @@ def get_msg_size_from_args(func, *args, **kwargs): # Sum of tensor sizes for list colls such as torch's all_to_all # NOTE: msg_size for list colls will not be the actual size transmitted by a given MPI/NCCL call within the coll op. Instead, it's the total amount of data transmitted. if type(tensor_arg) is list: - return sum(x.element_size() * x.nelement() for x in func_args['tensor_list']) + return sum(x.element_size() * x.nelement() for x in tensor_arg) else: return tensor_arg.element_size() * tensor_arg.nelement() diff --git a/deepspeed/compression/basic_layer.py b/deepspeed/compression/basic_layer.py index 5a5209ad7691..7dffc8a94790 100644 --- a/deepspeed/compression/basic_layer.py +++ b/deepspeed/compression/basic_layer.py @@ -1,4 +1,3 @@ -import copy import torch import math from torch import nn diff --git a/deepspeed/compression/compress.py b/deepspeed/compression/compress.py index 459b17075526..84ee53aab921 100644 --- a/deepspeed/compression/compress.py +++ b/deepspeed/compression/compress.py @@ -1,4 +1,3 @@ -import torch import re from .helper import compression_preparation, fix_compression, recursive_getattr, is_module_compressible from .config import get_compression_config @@ -7,8 +6,6 @@ import os import json -from deepspeed.utils import logger - def check_deepspeed_config(config): if isinstance(config, dict): diff --git a/deepspeed/elasticity/elasticity.py b/deepspeed/elasticity/elasticity.py index e678d5ed836e..c17dab0319d9 100644 --- a/deepspeed/elasticity/elasticity.py +++ b/deepspeed/elasticity/elasticity.py @@ -2,7 +2,6 @@ Copyright 2020 The Microsoft DeepSpeed Team """ import os -import re import json import numpy as np @@ -11,8 +10,7 @@ from .config import ElasticityConfig, ElasticityConfigError, ElasticityError, \ ElasticityIncompatibleWorldSize from .constants import ELASTICITY, ENABLED, ENABLED_DEFAULT, LATEST_ELASTICITY_VERSION, \ - MINIMUM_DEEPSPEED_VERSION, IGNORE_NON_ELASTIC_BATCH_INFO, \ - IGNORE_NON_ELASTIC_BATCH_INFO_DEFAULT, DEEPSPEED_ELASTICITY_CONFIG + MINIMUM_DEEPSPEED_VERSION, DEEPSPEED_ELASTICITY_CONFIG from ..git_version_info import version as __version__ from ..utils import logger diff --git a/deepspeed/env_report.py b/deepspeed/env_report.py index aad183665870..c5949a8c4d31 100644 --- a/deepspeed/env_report.py +++ b/deepspeed/env_report.py @@ -4,7 +4,6 @@ import argparse from .ops.op_builder import ALL_OPS from .git_version_info import installed_ops, torch_info -from .ops import __compatible_ops__ as compatible_ops GREEN = '\033[92m' RED = '\033[91m' @@ -54,7 +53,7 @@ def op_report(verbose=True): def ninja_installed(): try: - import ninja + import ninja # noqa: F401 except ImportError: return False return True diff --git a/deepspeed/git_version_info.py b/deepspeed/git_version_info.py index a806475c397b..5cd6d9f2f940 100644 --- a/deepspeed/git_version_info.py +++ b/deepspeed/git_version_info.py @@ -1,6 +1,6 @@ try: # This is populated by setup.py - from .git_version_info_installed import * + from .git_version_info_installed import * # noqa: F401 except ModuleNotFoundError: import os if os.path.isfile('version.txt'): diff --git a/deepspeed/inference/engine.py b/deepspeed/inference/engine.py index 9bfe954aa528..173f2587de70 100755 --- a/deepspeed/inference/engine.py +++ b/deepspeed/inference/engine.py @@ -5,7 +5,6 @@ import os from deepspeed import comm as dist -from deepspeed.utils import groups from deepspeed.utils.logging import log_dist from torch.nn.modules import Module @@ -18,7 +17,6 @@ from ..comm.comm import init_distributed from ..pipe import PipelineModule from ..moe.utils import has_moe_layers -from ..moe.layer import MoE from ..runtime.zero import GatheredParameters from ..module_inject import LinearAllreduce, LinearLayer, Normalize, ReplaceWithTensorSlicing diff --git a/deepspeed/launcher/multinode_runner.py b/deepspeed/launcher/multinode_runner.py index 27f32af30a2e..6fb187cfde23 100644 --- a/deepspeed/launcher/multinode_runner.py +++ b/deepspeed/launcher/multinode_runner.py @@ -3,7 +3,7 @@ import shutil import subprocess import warnings -from shlex import quote, split +from shlex import split from abc import ABC, abstractmethod from ..utils import logger diff --git a/deepspeed/module_inject/layers.py b/deepspeed/module_inject/layers.py index fa71c8d7d4d0..1ae5bd5ccf9f 100644 --- a/deepspeed/module_inject/layers.py +++ b/deepspeed/module_inject/layers.py @@ -1,6 +1,4 @@ import torch -import deepspeed -import deepspeed.ops.transformer as transformer_inference from deepspeed import comm as dist from torch import nn from torch.nn import functional as F diff --git a/deepspeed/module_inject/load_checkpoint.py b/deepspeed/module_inject/load_checkpoint.py index f6722deb582b..1d05b6e853f6 100644 --- a/deepspeed/module_inject/load_checkpoint.py +++ b/deepspeed/module_inject/load_checkpoint.py @@ -1,10 +1,7 @@ -import deepspeed -import torch from torch import nn -from torch.nn import functional as F import deepspeed.ops.transformer as transformer_inference from ..runtime.zero import GatheredParameters -from .layers import LinearAllreduce, LinearLayer, Normalize, EmbeddingLayer +from .layers import LinearLayer, Normalize, EmbeddingLayer def load_model_with_checkpoint(r_module, sd, mp_replace): diff --git a/deepspeed/module_inject/module_quantize.py b/deepspeed/module_inject/module_quantize.py index fde6990eba28..8485c0451214 100755 --- a/deepspeed/module_inject/module_quantize.py +++ b/deepspeed/module_inject/module_quantize.py @@ -1,6 +1,4 @@ -import copy import torch -import deepspeed def quantize_transformer_layer(orig_layer_impl, model, megatron=False, preln=False): diff --git a/deepspeed/module_inject/replace_module.py b/deepspeed/module_inject/replace_module.py index fe83b7b3b4cf..151abfacf004 100755 --- a/deepspeed/module_inject/replace_module.py +++ b/deepspeed/module_inject/replace_module.py @@ -1,19 +1,15 @@ -import copy import torch import tqdm import deepspeed import deepspeed.ops.transformer as transformer_inference -from .replace_policy import HFBertLayerPolicy, HFGPT2LayerPolicy, HFGPTJLayerPolicy, BLOOMLayerPolicy +from .replace_policy import HFBertLayerPolicy, HFGPT2LayerPolicy, BLOOMLayerPolicy from .replace_policy import replace_policies -from ..constants import INFERENCE_GENERIC_MODE, INFERENCE_SPECIALIZED_MODE from ..runtime.weight_quantizer import WeightQuantization -from torch import nn from deepspeed import comm as dist from torch import nn -from torch.nn import functional as F from ..runtime.zero import GatheredParameters -from .layers import LinearAllreduce, LinearLayer, Normalize, EmbeddingLayer +from .layers import LinearAllreduce, LinearLayer from .load_checkpoint import load_model_with_checkpoint @@ -452,10 +448,12 @@ def _transpose(x): if qkvw.is_meta or qkvw.ds_tensor.numel() < attn_block.attn_qkvw.numel(): pass else: - with GatheredParameters([attn_qkvw, - attn_qkvb, - attn_ow, - attn_ob], + with GatheredParameters([ + attn_block.attn_qkvw, + attn_block.attn_qkvb, + attn_block.attn_ow, + attn_block.attn_ob + ], modifier_rank=0): attn_block.attn_qkvw = mp_replace.copy( attn_block.attn_qkvw, @@ -680,12 +678,13 @@ def _replace(child, name, conv_linear_layer): def _slice_embedding(child, name, conv_linear_layer): mp_replace = ReplaceWithTensorSlicing(mp_group=mp_group) - new_weight = torch.empty((weight_shape[0], - weight_shape[1] // mp_size), + new_weight = torch.empty((child.weight.shape[0], + child.weight.shape[1] // mp_size), device=child.weight.device, dtype=child.weight.dtype) data = mp_replace.copy(new_weight, child.weight.ds_tensor.data) - new_embedding = nn.Embedding(weight_shape[0], weight_shape[1] // mp_size) + new_embedding = nn.Embedding(child.weight.shape[0], + child.weight.shape[1] // mp_size) new_embedding.weight.data.copy_(data) return new_embedding diff --git a/deepspeed/module_inject/replace_policy.py b/deepspeed/module_inject/replace_policy.py index e4b1195d9737..eeb6d613969b 100755 --- a/deepspeed/module_inject/replace_policy.py +++ b/deepspeed/module_inject/replace_policy.py @@ -215,7 +215,6 @@ def __init__(self, client_module, inference=True): MegatronLayerPolicy._orig_layer_class = None else: try: - import megatron from megatron.model.transformer import ParallelTransformerLayer MegatronLayerPolicy._orig_layer_class = ParallelTransformerLayer except ImportError: @@ -372,7 +371,6 @@ def __init__(self, client_module, inference=True, megatron_v2=True): GPTNEOXLayerPolicy._orig_layer_class = None else: try: - import transformers from transformers import GPTNeoXLayer GPTNEOXLayerPolicy._orig_layer_class = GPTNeoXLayer except ImportError: diff --git a/deepspeed/moe/layer.py b/deepspeed/moe/layer.py index 399f512bfead..fd847308b21e 100644 --- a/deepspeed/moe/layer.py +++ b/deepspeed/moe/layer.py @@ -2,16 +2,13 @@ Copyright 2020 The Microsoft DeepSpeed Team ''' -import torch.nn.init as init import torch -from deepspeed import comm as dist -from deepspeed.utils import logger, log_dist +from deepspeed.utils import log_dist from deepspeed.utils import groups from .sharded_moe import MOELayer, TopKGate from .experts import Experts -import copy import typing diff --git a/deepspeed/moe/sharded_moe.py b/deepspeed/moe/sharded_moe.py index d87d22dc7ff7..f9da6eb9d350 100644 --- a/deepspeed/moe/sharded_moe.py +++ b/deepspeed/moe/sharded_moe.py @@ -12,16 +12,13 @@ # This source code is licensed under the BSD license found in the # LICENSE file in the root directory of this source tree. -from deepspeed.utils.timer import ThroughputTimer, SynchronizedWallClockTimer -from deepspeed.utils import logger, log_dist -from typing import Callable, Dict, TYPE_CHECKING, Any, Optional, Tuple, Union, cast +from deepspeed.utils.timer import SynchronizedWallClockTimer +from deepspeed.utils import logger +from typing import Callable, Dict, TYPE_CHECKING, Any, Optional, Tuple -import time -from time import perf_counter import torch from torch import Tensor -from deepspeed import comm as dist -from torch.nn import Module, ModuleList +from torch.nn import Module import torch.nn.functional as F if TYPE_CHECKING: diff --git a/deepspeed/moe/utils.py b/deepspeed/moe/utils.py index 717947226165..043d2626d43c 100644 --- a/deepspeed/moe/utils.py +++ b/deepspeed/moe/utils.py @@ -1,6 +1,5 @@ from typing import List, Tuple, Dict import torch -from deepspeed.utils import groups from .layer import MoE diff --git a/deepspeed/monitor/config.py b/deepspeed/monitor/config.py index b854b8580023..709830f27e98 100644 --- a/deepspeed/monitor/config.py +++ b/deepspeed/monitor/config.py @@ -3,9 +3,7 @@ Licensed under the MIT license. """ -from typing import Optional -from deepspeed.runtime.config_utils import get_scalar_param -from pydantic import BaseModel, validator, ValidationError, create_model +from pydantic import BaseModel from .constants import * diff --git a/deepspeed/monitor/csv_monitor.py b/deepspeed/monitor/csv_monitor.py index b2b05260e445..1425f1d56f66 100644 --- a/deepspeed/monitor/csv_monitor.py +++ b/deepspeed/monitor/csv_monitor.py @@ -7,7 +7,6 @@ class csvMonitor(Monitor): def __init__(self, monitor_config): super().__init__(monitor_config) - import csv self.filenames = [] self.enabled = monitor_config.csv_monitor_config.enabled self.output_path = monitor_config.csv_monitor_config.output_path diff --git a/deepspeed/monitor/utils.py b/deepspeed/monitor/utils.py index f519a71823a9..0733268f3873 100644 --- a/deepspeed/monitor/utils.py +++ b/deepspeed/monitor/utils.py @@ -2,7 +2,7 @@ def check_tb_availability(): try: # torch.utils.tensorboard will fail if `tensorboard` is not available, # see their docs for more details: https://pytorch.org/docs/1.8.0/tensorboard.html - import tensorboard + import tensorboard # noqa: F401 except ImportError: print('If you want to use tensorboard logging, please `pip install tensorboard`') raise @@ -10,7 +10,7 @@ def check_tb_availability(): def check_wandb_availability(): try: - import wandb + import wandb # noqa: F401 except ImportError: print( 'If you want to use wandb logging, please `pip install wandb` and follow the instructions at https://docs.wandb.ai/quickstart' diff --git a/deepspeed/ops/adagrad/cpu_adagrad.py b/deepspeed/ops/adagrad/cpu_adagrad.py index e3f70a61539f..2527259b1382 100755 --- a/deepspeed/ops/adagrad/cpu_adagrad.py +++ b/deepspeed/ops/adagrad/cpu_adagrad.py @@ -2,10 +2,7 @@ Copyright 2020 The Microsoft DeepSpeed Team ''' -import math import torch -import time -from pathlib import Path from ..op_builder import CPUAdagradBuilder from deepspeed.utils.logging import should_log_le diff --git a/deepspeed/ops/adam/cpu_adam.py b/deepspeed/ops/adam/cpu_adam.py index e5f7aa70c364..911e4924dfbc 100755 --- a/deepspeed/ops/adam/cpu_adam.py +++ b/deepspeed/ops/adam/cpu_adam.py @@ -2,11 +2,8 @@ Copyright 2020 The Microsoft DeepSpeed Team ''' -import math import torch -import time from cpuinfo import get_cpu_info -from pathlib import Path from ..op_builder import CPUAdamBuilder from deepspeed.utils import logger from deepspeed.utils.logging import should_log_le diff --git a/deepspeed/ops/adam/fused_adam.py b/deepspeed/ops/adam/fused_adam.py index 3f3e5919feaf..5a1a1ddcaed3 100644 --- a/deepspeed/ops/adam/fused_adam.py +++ b/deepspeed/ops/adam/fused_adam.py @@ -6,7 +6,6 @@ ''' import torch -import importlib from .multi_tensor_apply import MultiTensorApply multi_tensor_applier = MultiTensorApply(2048 * 32) diff --git a/deepspeed/ops/adam/multi_tensor_apply.py b/deepspeed/ops/adam/multi_tensor_apply.py index 173288ee76ab..e837309be629 100644 --- a/deepspeed/ops/adam/multi_tensor_apply.py +++ b/deepspeed/ops/adam/multi_tensor_apply.py @@ -4,7 +4,6 @@ Copyright NVIDIA/apex This file is adapted from NVIDIA/apex, commit a109f85 ''' -import torch class MultiTensorApply(object): diff --git a/deepspeed/ops/quantizer/quantizer.py b/deepspeed/ops/quantizer/quantizer.py index cea9434049d9..6b25d02d87e7 100755 --- a/deepspeed/ops/quantizer/quantizer.py +++ b/deepspeed/ops/quantizer/quantizer.py @@ -1,12 +1,7 @@ ''' Copyright 2020 The Microsoft DeepSpeed Team ''' -import json -import math -import importlib import torch -from torch import nn -from torch.autograd import Function from ..op_builder import QuantizerBuilder diff --git a/deepspeed/ops/sparse_attention/matmul.py b/deepspeed/ops/sparse_attention/matmul.py index ea83f093c748..ca933b989036 100755 --- a/deepspeed/ops/sparse_attention/matmul.py +++ b/deepspeed/ops/sparse_attention/matmul.py @@ -1,9 +1,7 @@ # DeepSpeed note, code taken & adapted from commit 9aa94789f13ada713af36cfd8cca2fc9a7f6b79a # https://github.com/ptillet/torch-blocksparse/blob/master/torch_blocksparse/matmul.py import importlib -import warnings import torch -import math import triton import triton.language as tl @@ -339,7 +337,7 @@ def _sdd_matmul(a, a_inner, b_inner = a.shape[a_dim], b.shape[b_dim] if a_inner != b_inner: raise ValueError( - f"Size of tensor A along the {_dim_to_name(a_dim)} dim ({a_inner}) must match size " + f"Size of tensor A along the {_dim_to_name(a_dim)} dim ({a_inner}) must match size " # noqa: F821 f"of tensor B along the {_dim_to_name(b_dim)} dim ({b_inner})") if a_inner % 16 != 0: raise ValueError('Reduction size for SDD must be a multiple of 16') diff --git a/deepspeed/ops/sparse_attention/softmax.py b/deepspeed/ops/sparse_attention/softmax.py index 11d4583fd619..ce155105988f 100755 --- a/deepspeed/ops/sparse_attention/softmax.py +++ b/deepspeed/ops/sparse_attention/softmax.py @@ -1,14 +1,10 @@ # DeepSpeed note, code taken & adapted from commit 9aa94789f13ada713af36cfd8cca2fc9a7f6b79a # https://github.com/ptillet/torch-blocksparse/blob/master/torch_blocksparse/matmul.py -import warnings -import importlib import torch -import math import triton import triton.language as tl -import triton._C.libtriton as libtriton def next_power_of_2(n): diff --git a/deepspeed/ops/sparse_attention/sparse_attention_utils.py b/deepspeed/ops/sparse_attention/sparse_attention_utils.py index 700363b204af..90edb10fd84a 100644 --- a/deepspeed/ops/sparse_attention/sparse_attention_utils.py +++ b/deepspeed/ops/sparse_attention/sparse_attention_utils.py @@ -2,7 +2,7 @@ Copyright 2020 The Microsoft DeepSpeed Team """ -from torch import nn +import torch from torch.nn import functional as F from deepspeed.ops.sparse_attention import BertSparseSelfAttention, SparsityConfig ''' @@ -102,13 +102,13 @@ def replace_model_self_attention_with_sparse_self_attention( if hasattr(model, 'bert'): model.config.max_position_embeddings = max_position - replace_self_attention_layer_with_sparse_self_attention_layer( + model.replace_self_attention_layer_with_sparse_self_attention_layer( model.config, model.bert.encoder.layer, sparsity_config) elif hasattr(model, 'roberta'): model.config.max_position_embeddings = max_position + 2 - replace_self_attention_layer_with_sparse_self_attention_layer( + model.replace_self_attention_layer_with_sparse_self_attention_layer( model.config, model.roberta.encoder.layer, sparsity_config) @@ -155,7 +155,7 @@ def pad_to_block_size(block_size, position_ids, inputs_embeds, pad_token_id, - model_mbeddings): + model_embeddings): """This function pads input tokens and attention mask on sequence length dimension to be multiple of block size. This is a requirement for Sparse Transformer in which the self attention layer works on sequences of length multiple of block size. It needs to be called in your model, such as BertModel, right before you calculate the embedding outputs. diff --git a/deepspeed/ops/sparse_attention/sparse_self_attention.py b/deepspeed/ops/sparse_attention/sparse_self_attention.py index 5ccfa13198fd..46dedd0779f9 100644 --- a/deepspeed/ops/sparse_attention/sparse_self_attention.py +++ b/deepspeed/ops/sparse_attention/sparse_self_attention.py @@ -3,10 +3,8 @@ """ import torch.nn as nn -from torch.nn.functional import * import torch from torch import distributed as dist -from collections import namedtuple from deepspeed.ops.sparse_attention import SparsityConfig diff --git a/deepspeed/ops/transformer/inference/moe_inference.py b/deepspeed/ops/transformer/inference/moe_inference.py index 830110cc5f05..ca4b5b7a9702 100644 --- a/deepspeed/ops/transformer/inference/moe_inference.py +++ b/deepspeed/ops/transformer/inference/moe_inference.py @@ -3,11 +3,8 @@ ''' import json import math -import importlib import torch -from torch import nn from torch.autograd import Function -import time from ... import op_builder #from ...inference.engine import inference_cuda_module, specialized_mode # Cuda modules will be imported if needed @@ -18,8 +15,6 @@ from ....moe.sharded_moe import TopKGate from deepspeed import comm as dist -import torch.nn.functional as F - class DeepSpeedMoEInferenceConfig(DeepSpeedInferenceConfig): """Initialize the DeepSpeed Transformer Config. diff --git a/deepspeed/ops/transformer/inference/transformer_inference.py b/deepspeed/ops/transformer/inference/transformer_inference.py index 85857e0e8a4d..81762c10b014 100755 --- a/deepspeed/ops/transformer/inference/transformer_inference.py +++ b/deepspeed/ops/transformer/inference/transformer_inference.py @@ -3,11 +3,8 @@ ''' import json import math -import importlib import torch -from torch import nn from torch.autograd import Function -import time from ... import op_builder import torch.nn as nn from deepspeed import comm as dist @@ -338,7 +335,7 @@ def compute_attention(qkv_out, input_mask): torch.empty(1), num_attention_heads_per_partition, (1 / norm_factor if config.scale_attention else 1.0), - (not unfused_mode), + (not unfused_mode), # noqa: F821 config.triangular_masking, config.local_attention, config.window_size, @@ -346,21 +343,21 @@ def compute_attention(qkv_out, input_mask): else: attn_key_value = score_context_func( mixed_query, - (key_layer if unfused_mode else past_key.type_as(key_layer)), + (key_layer if unfused_mode else past_key.type_as(key_layer)), # noqa: F821 key_layer, ((1 - input_mask).half() * minus_inf) if input_mask.dtype == torch.int64 else input_mask, (value_layer - if unfused_mode else past_value.type_as(value_layer)), + if unfused_mode else past_value.type_as(value_layer)), # noqa: F821 value_layer, num_attention_heads_per_partition, (1 / norm_factor if config.scale_attention else 1.0), - (not unfused_mode), + (not unfused_mode), # noqa: F821 config.triangular_masking, config.local_attention, config.window_size, no_masking) - if unfused_mode: + if unfused_mode: # noqa: F821 context_layer, _, _ = attn_key_value else: context_layer, key_layer, value_layer = attn_key_value diff --git a/deepspeed/ops/transformer/transformer.py b/deepspeed/ops/transformer/transformer.py index 084587ba2a3b..7963d11774e3 100755 --- a/deepspeed/ops/transformer/transformer.py +++ b/deepspeed/ops/transformer/transformer.py @@ -3,7 +3,6 @@ ''' import json import math -import importlib import torch from torch import nn from torch.autograd import Function diff --git a/deepspeed/profiling/flops_profiler/profiler.py b/deepspeed/profiling/flops_profiler/profiler.py index 7fbfb19c777f..4dd73c189481 100644 --- a/deepspeed/profiling/flops_profiler/profiler.py +++ b/deepspeed/profiling/flops_profiler/profiler.py @@ -3,7 +3,7 @@ import torch.nn as nn import torch.nn.functional as F from functools import partial -from typing import Callable, List, Optional, Tuple +from typing import List, Optional from collections import OrderedDict import numpy as np @@ -251,7 +251,6 @@ def print_model_profile(self, return import sys import os.path - from os import path original_stdout = None f = None if output_file and output_file != "": diff --git a/deepspeed/runtime/bf16_optimizer.py b/deepspeed/runtime/bf16_optimizer.py index d5ffbac9d1d3..35f8bbd3473a 100644 --- a/deepspeed/runtime/bf16_optimizer.py +++ b/deepspeed/runtime/bf16_optimizer.py @@ -12,7 +12,6 @@ from packaging import version as pkg_version from deepspeed.git_version_info import version -from deepspeed.runtime.swap_tensor.partitioned_param_swapper import print_rank_0 from deepspeed.runtime.utils import (get_global_norm_of_tensors, clip_tensors_by_global_norm, DummyOptim, diff --git a/deepspeed/runtime/comm/coalesced_collectives.py b/deepspeed/runtime/comm/coalesced_collectives.py index 6a2b8e31516d..a18c3a55ad2d 100644 --- a/deepspeed/runtime/comm/coalesced_collectives.py +++ b/deepspeed/runtime/comm/coalesced_collectives.py @@ -12,7 +12,6 @@ import torch.nn.functional from deepspeed.utils import instrument_w_nvtx -from deepspeed.utils import logger def _torch_reduce_scatter_fn(input_tensor: Tensor, diff --git a/deepspeed/runtime/comm/nccl.py b/deepspeed/runtime/comm/nccl.py index ed80059a9067..c892316a3dc5 100644 --- a/deepspeed/runtime/comm/nccl.py +++ b/deepspeed/runtime/comm/nccl.py @@ -4,7 +4,6 @@ import torch from deepspeed import comm as dist -import time import cupy import numpy as np diff --git a/deepspeed/runtime/engine.py b/deepspeed/runtime/engine.py index bf37ab71adc3..39c214c791d9 100644 --- a/deepspeed/runtime/engine.py +++ b/deepspeed/runtime/engine.py @@ -5,9 +5,7 @@ import os import re import stat -import math import torch -import warnings import hashlib from collections import defaultdict, OrderedDict from shutil import copyfile @@ -17,21 +15,16 @@ from torch.optim import Optimizer from torch.optim.lr_scheduler import _LRScheduler -from typing import Callable, Dict, Optional, Union, Iterable -from deepspeed.checkpoint.utils import get_zero_ckpt_name_for_rank +from typing import Callable, Dict, Union, Iterable import deepspeed -from deepspeed.runtime.utils import see_memory_usage, get_ma_status, DummyOptim +from deepspeed.runtime.utils import see_memory_usage, DummyOptim from deepspeed.runtime.zero.stage_1_and_2 import DeepSpeedZeroOptimizer from deepspeed.runtime.zero.partition_parameters import ZeroParamStatus from deepspeed.runtime.zero.utils import is_zero_supported_optimizer, ZeRORuntimeException from deepspeed.runtime.zero.parameter_offload import DeepSpeedZeRoOffload -from deepspeed.runtime.activation_checkpointing import ( - checkpointing as activation_checkpointing, -) - from deepspeed.runtime.fp16.fused_optimizer import FP16_Optimizer from deepspeed.runtime.fp16.unfused_optimizer import FP16_UnfusedOptimizer from deepspeed.runtime.bf16_optimizer import BF16_Optimizer @@ -47,23 +40,16 @@ from deepspeed.compression import compression_scheduler from deepspeed.compression.constants import \ - SHARED_PARAMETERS, \ WEIGHT_QUANTIZE_IN_FORWARD_ENABLED, \ - WEIGHT_QUANTIZATION, SHARED_PARAMETERS, WEIGHT_QUANTIZE_ENABLED, \ + WEIGHT_QUANTIZATION, SHARED_PARAMETERS, \ WEIGHT_QUANTIZE_ENABLED, \ - WEIGHT_QUANTIZE_SCHEDULE_OFFSET, \ WEIGHT_QUANTIZE_GROUPS, \ WEIGHT_QUANTIZE_FP16_MIXED_QUANTIZE, \ WEIGHT_QUANTIZE_CHANGE_RATIO, \ WEIGHT_QUANTIZE_TYPE, \ WEIGHT_QUANTIZE_ROUNDING, \ WEIGHT_QUANTIZE_VERBOSE, \ - WEIGHT_QUANTIZE_KERNEL, \ - ACTIVATION_QUANTIZATION, \ - SPARSE_PRUNING, \ - ROW_PRUNING, \ - HEAD_PRUNING, \ - CHANNEL_PRUNING + WEIGHT_QUANTIZE_KERNEL from deepspeed.runtime.zero.constants import \ ZERO_OPTIMIZATION_OPTIMIZER_STATES, ZERO_OPTIMIZATION_GRADIENTS, ZERO_OPTIMIZATION_WEIGHTS @@ -72,9 +58,7 @@ from deepspeed.runtime import lr_schedules from deepspeed.utils import groups -from deepspeed.runtime.utils import get_grad_norm from deepspeed.utils import logger, log_dist, instrument_w_nvtx -from deepspeed.comm.comm import init_distributed from deepspeed.utils.timer import ThroughputTimer, SynchronizedWallClockTimer from deepspeed.utils.debug import debug_extract_module_and_param_names from deepspeed.monitor.monitor import MonitorMaster @@ -86,7 +70,6 @@ from .pipe.module import PipelineModule from .utils import ensure_directory_exists, get_ma_status from ..ops.op_builder import UtilsBuilder -from ..ops.adam import DeepSpeedCPUAdam from ..ops.adam import FusedAdam from ..moe.sharded_moe import TopKGate, MOELayer from ..moe.layer import MoE diff --git a/deepspeed/runtime/fp16/fused_optimizer.py b/deepspeed/runtime/fp16/fused_optimizer.py index 479a0f7a2839..aeed2f4b18e1 100755 --- a/deepspeed/runtime/fp16/fused_optimizer.py +++ b/deepspeed/runtime/fp16/fused_optimizer.py @@ -181,7 +181,7 @@ def step_fused_adam(self, closure=None): apply_scale=False) # Stash unscaled gradient norm - self._global_grad_norm = scaled_global_grad_norm / self.cur_scale + self._global_grad_norm = scaled_grad_norm / self.cur_scale # norm is in fact norm*cur_scale self.optimizer.step(grads=[[g] for g in grads_groups_flat], diff --git a/deepspeed/runtime/fp16/onebit/adam.py b/deepspeed/runtime/fp16/onebit/adam.py index 71805176ae41..706d2a3dac1f 100644 --- a/deepspeed/runtime/fp16/onebit/adam.py +++ b/deepspeed/runtime/fp16/onebit/adam.py @@ -3,13 +3,9 @@ ''' import types import torch -import importlib import numpy as np -import time from deepspeed import comm as dist -from deepspeed.utils.logging import logger - class OnebitAdam(torch.optim.Optimizer): """Implements the 1-bit Adam algorithm. Currently GPU-only. @@ -37,7 +33,7 @@ class OnebitAdam(torch.optim.Optimizer): cuda_aware (boolean, required): Set True if the underlying MPI implementation supports CUDA-Aware communication. (default: False) comm_backend_name (string, optional): Set to 'mpi' if needed. (default: 'nccl') - .. _Adam\: A Method for Stochastic Optimization: + .. _Adam\\: A Method for Stochastic Optimization: https://arxiv.org/abs/1412.6980 .. _On the Convergence of Adam and Beyond: https://openreview.net/forum?id=ryQu7f-RZ diff --git a/deepspeed/runtime/fp16/onebit/lamb.py b/deepspeed/runtime/fp16/onebit/lamb.py index aeff08b9861b..696550ca41ba 100644 --- a/deepspeed/runtime/fp16/onebit/lamb.py +++ b/deepspeed/runtime/fp16/onebit/lamb.py @@ -46,9 +46,9 @@ class OnebitLamb(torch.optim.Optimizer): coefficient during compression stage (default: 0.5) factor_threshold (float, optional): threshold of how much the scaling factor can fluctuate between steps (default: 0.1) - .. _Large Batch Optimization for Deep Learning\: Training BERT in 76 minutes: + .. _Large Batch Optimization for Deep Learning\\: Training BERT in 76 minutes: https://arxiv.org/abs/1904.00962 - .. _Adam\: A Method for Stochastic Optimization: + .. _Adam\\: A Method for Stochastic Optimization: https://arxiv.org/abs/1412.6980 .. _On the Convergence of Adam and Beyond: https://openreview.net/forum?id=ryQu7f-RZ diff --git a/deepspeed/runtime/fp16/onebit/zoadam.py b/deepspeed/runtime/fp16/onebit/zoadam.py index 11ccb404a9ff..53dfde99ae38 100644 --- a/deepspeed/runtime/fp16/onebit/zoadam.py +++ b/deepspeed/runtime/fp16/onebit/zoadam.py @@ -3,13 +3,9 @@ ''' import types import torch -import importlib import numpy as np -import time from deepspeed import comm as dist -from deepspeed.utils.logging import logger - class ZeroOneAdam(torch.optim.Optimizer): """Implements the 0/1 Adam algorithm. Currently GPU-only. @@ -47,7 +43,7 @@ class ZeroOneAdam(torch.optim.Optimizer): cuda_aware (boolean, required): Set True if the underlying MPI implementation supports CUDA-Aware communication. (default: False) comm_backend_name (string, optional): Set to 'mpi' if needed. (default: 'nccl') - .. _Adam\: A Method for Stochastic Optimization: + .. _Adam\\: A Method for Stochastic Optimization: https://arxiv.org/abs/1412.6980 .. _On the Convergence of Adam and Beyond: https://openreview.net/forum?id=ryQu7f-RZ diff --git a/deepspeed/runtime/lr_schedules.py b/deepspeed/runtime/lr_schedules.py index b4dc749ae193..faf5e6fee910 100755 --- a/deepspeed/runtime/lr_schedules.py +++ b/deepspeed/runtime/lr_schedules.py @@ -10,9 +10,7 @@ import argparse from torch.optim import Optimizer -from typing import Union, List import math -from deepspeed.runtime.constants import * from deepspeed.utils import logger LR_SCHEDULE = 'lr_schedule' diff --git a/deepspeed/runtime/pipe/engine.py b/deepspeed/runtime/pipe/engine.py index 43c65b15b525..a47f1e45b241 100644 --- a/deepspeed/runtime/pipe/engine.py +++ b/deepspeed/runtime/pipe/engine.py @@ -1,28 +1,18 @@ # Copyright 2019 The Microsoft DeepSpeed Team -import time -import logging -import copy -import os - from types import MethodType -from numpy import prod - import torch -import torch.nn as nn -import torch.optim as optim from deepspeed import comm as dist from deepspeed.utils import logger -from deepspeed.utils.timer import SynchronizedWallClockTimer, ThroughputTimer +from deepspeed.utils.timer import ThroughputTimer -from deepspeed.inference.engine import InferenceEngine from ..engine import DeepSpeedEngine, MEMORY_OPT_ALLREDUCE_SIZE -from ..utils import PartitionedTensor, ensure_directory_exists +from ..utils import PartitionedTensor from ..dataloader import RepeatingLoader -from .module import PipelineModule, PipelineError, TiedLayerSpec +from .module import PipelineModule, PipelineError from . import p2p from . import schedule @@ -587,6 +577,11 @@ def set_dataiterator(self, iterator): self.data_iterator = iterator def set_batch_fn(self, fn): + """Execute a post-processing function on input data. + + Args: + fn (function): The function to run. + """ self.batch_fn = fn def is_gradient_accumulation_boundary(self): @@ -1373,11 +1368,3 @@ def _exec_schedule(self, pipe_schedule): # Equivalent to: self._exec_forward_pass(buffer_id=0) self._exec_instr = MethodType(self._INSTRUCTION_MAP[type(cmd)], self) self._exec_instr(**cmd.kwargs) - - def set_batch_fn(self, fn): - """Execute a post-processing function on input data. - - Args: - fn (function): The function to run. - """ - self.batch_fn = fn diff --git a/deepspeed/runtime/pipe/module.py b/deepspeed/runtime/pipe/module.py index f47806ee8673..ac35a9fa2cf8 100644 --- a/deepspeed/runtime/pipe/module.py +++ b/deepspeed/runtime/pipe/module.py @@ -1,10 +1,8 @@ import os import glob -import enum import re as regex -from collections import defaultdict from functools import partial import torch diff --git a/deepspeed/runtime/pipe/topology.py b/deepspeed/runtime/pipe/topology.py index 954e73592943..6c0cd96440fb 100644 --- a/deepspeed/runtime/pipe/topology.py +++ b/deepspeed/runtime/pipe/topology.py @@ -1,9 +1,6 @@ # Copyright 2019 The Microsoft DeepSpeed Team -from deepspeed.utils import logger - from deepspeed import comm as dist -import sys from collections import namedtuple from itertools import product as cartesian_product @@ -58,7 +55,7 @@ def get_rank(self, **coord_kwargs): raise ValueError('get_rank() does not support slices. Use filter_match())') key = self.ProcessCoord(**coord_kwargs) - assert key in self.mapping, f'key {kwargs} invalid' + assert key in self.mapping, f'key {coord_kwargs} invalid' return self.mapping[key] def get_axis_names(self): diff --git a/deepspeed/runtime/quantize.py b/deepspeed/runtime/quantize.py index d264ddf2a459..7d27fd210f34 100755 --- a/deepspeed/runtime/quantize.py +++ b/deepspeed/runtime/quantize.py @@ -1,7 +1,5 @@ -import pdb import torch import math -from deepspeed.utils import log_dist from deepspeed.utils import logger from deepspeed.ops.quantizer import ds_quantizer diff --git a/deepspeed/runtime/swap_tensor/optimizer_utils.py b/deepspeed/runtime/swap_tensor/optimizer_utils.py index f34ff3a457a8..1323dcb926e5 100644 --- a/deepspeed/runtime/swap_tensor/optimizer_utils.py +++ b/deepspeed/runtime/swap_tensor/optimizer_utils.py @@ -13,7 +13,7 @@ from deepspeed.runtime.zero.offload_constants import * from deepspeed.runtime.swap_tensor.constants import * from deepspeed.runtime.swap_tensor.utils import swap_in_tensors, swap_out_tensors, \ - MIN_AIO_BYTES, AIO_ALIGNED_BYTES, get_sized_buffers, get_sized_buffer + MIN_AIO_BYTES, AIO_ALIGNED_BYTES, get_sized_buffers from deepspeed.runtime.swap_tensor.utils import SwapBufferManager, SwapBufferPool diff --git a/deepspeed/runtime/swap_tensor/partitioned_optimizer_swapper.py b/deepspeed/runtime/swap_tensor/partitioned_optimizer_swapper.py index 124500de888b..c83a69544d56 100644 --- a/deepspeed/runtime/swap_tensor/partitioned_optimizer_swapper.py +++ b/deepspeed/runtime/swap_tensor/partitioned_optimizer_swapper.py @@ -5,7 +5,6 @@ Functionality of swapping optimizer tensors to/from (NVMe) storage devices. """ -import os import torch from deepspeed.utils.logging import logger @@ -14,7 +13,7 @@ from deepspeed.runtime.swap_tensor.constants import * from deepspeed.runtime.swap_tensor.utils import swap_in_tensors, swap_out_tensors, print_object, \ - MIN_AIO_BYTES, AIO_ALIGNED_BYTES, get_sized_buffers, get_sized_buffer + get_sized_buffers from deepspeed.runtime.swap_tensor.async_swapper import AsyncTensorSwapper from deepspeed.runtime.swap_tensor.optimizer_utils import OptimizerSwapper diff --git a/deepspeed/runtime/swap_tensor/partitioned_param_swapper.py b/deepspeed/runtime/swap_tensor/partitioned_param_swapper.py index c488b84692cd..efce4f96922c 100644 --- a/deepspeed/runtime/swap_tensor/partitioned_param_swapper.py +++ b/deepspeed/runtime/swap_tensor/partitioned_param_swapper.py @@ -11,7 +11,6 @@ import torch from deepspeed import comm as dist -from deepspeed.utils.logging import logger from deepspeed.ops.aio import AsyncIOBuilder from .constants import * from .utils import swap_in_tensors, swap_out_tensors, MIN_AIO_BYTES, AIO_ALIGNED_BYTES, print_object, SwapBufferPool diff --git a/deepspeed/runtime/swap_tensor/pipelined_optimizer_swapper.py b/deepspeed/runtime/swap_tensor/pipelined_optimizer_swapper.py index 598585078632..cbcfa15ca598 100644 --- a/deepspeed/runtime/swap_tensor/pipelined_optimizer_swapper.py +++ b/deepspeed/runtime/swap_tensor/pipelined_optimizer_swapper.py @@ -5,19 +5,14 @@ Functionality of swapping optimizer tensors to/from (NVMe) storage devices. """ -import os -import torch - -from deepspeed.utils.logging import logger from deepspeed.ops.aio import AsyncIOBuilder from deepspeed import comm as dist from deepspeed.runtime.zero.offload_constants import * from deepspeed.runtime.swap_tensor.constants import * -from deepspeed.runtime.swap_tensor.utils import swap_in_tensors, swap_out_tensors, print_object, \ - MIN_AIO_BYTES, AIO_ALIGNED_BYTES +from deepspeed.runtime.swap_tensor.utils import swap_in_tensors, swap_out_tensors, print_object from deepspeed.runtime.swap_tensor.async_swapper import AsyncTensorSwapper -from deepspeed.runtime.swap_tensor.optimizer_utils import SwapBufferManager, get_sized_buffer +from deepspeed.runtime.swap_tensor.utils import get_sized_buffer from deepspeed.runtime.swap_tensor.optimizer_utils import OptimizerSwapper diff --git a/deepspeed/runtime/swap_tensor/utils.py b/deepspeed/runtime/swap_tensor/utils.py index 9d544e3d9b11..3059e0d15798 100644 --- a/deepspeed/runtime/swap_tensor/utils.py +++ b/deepspeed/runtime/swap_tensor/utils.py @@ -5,15 +5,11 @@ Functionality of swapping tensors to/from (NVMe) storage devices. """ -import os import torch from deepspeed.utils.logging import logger from deepspeed import comm as dist -from deepspeed.runtime.swap_tensor.constants import AIO_BLOCK_SIZE, AIO_QUEUE_DEPTH, \ - AIO_THREAD_COUNT, AIO_SINGLE_SUBMIT, AIO_OVERLAP_EVENTS - MIN_AIO_BYTES = 1024**2 AIO_ALIGNED_BYTES = 1024 diff --git a/deepspeed/runtime/utils.py b/deepspeed/runtime/utils.py index 69660ac3c272..fa90486cf8d5 100755 --- a/deepspeed/runtime/utils.py +++ b/deepspeed/runtime/utils.py @@ -7,13 +7,13 @@ ''' from collections.abc import Iterable -from deepspeed.moe.utils import is_moe_param, split_params_into_shared_and_expert_params +from deepspeed.moe.utils import is_moe_param import os import psutil import gc -from math import ceil, sqrt +from math import sqrt from math import floor -from bisect import bisect_left, bisect_right +from bisect import bisect_left import torch from torch._six import inf diff --git a/deepspeed/runtime/weight_quantizer.py b/deepspeed/runtime/weight_quantizer.py index a6c241d19f58..8b7b1eb9d8ea 100644 --- a/deepspeed/runtime/weight_quantizer.py +++ b/deepspeed/runtime/weight_quantizer.py @@ -127,7 +127,7 @@ def quantize_fn(layer, policy_cls): layer_scales = [] for key in range(len(keys)): - if self.mlp_extra_grouping and is_mlp(keys[key]): + if self.mlp_extra_grouping and self.is_mlp(keys[key]): data_quantized, data_scale = self.quantize_data(keys[key], quantize_bits, groups * 2) elif policy_cls is HFBertLayerPolicy and self.is_qkv(keys[key]): data_quantized, data_scale = self.quantize_data(keys[key], quantize_bits, groups * 3) diff --git a/deepspeed/runtime/zero/offload_config.py b/deepspeed/runtime/zero/offload_config.py index c438a7638a76..9c8afda673ef 100644 --- a/deepspeed/runtime/zero/offload_config.py +++ b/deepspeed/runtime/zero/offload_config.py @@ -5,7 +5,6 @@ from deepspeed.runtime.config_utils import get_scalar_param from .offload_constants import * -from .utils import logger OFFLOAD_PARAM_KEY_DEFAULT_DICT = { OFFLOAD_PARAM_DEVICE: OFFLOAD_PARAM_DEVICE_DEFAULT, diff --git a/deepspeed/runtime/zero/partition_parameters.py b/deepspeed/runtime/zero/partition_parameters.py index de1c819fae58..c08423a64452 100755 --- a/deepspeed/runtime/zero/partition_parameters.py +++ b/deepspeed/runtime/zero/partition_parameters.py @@ -5,7 +5,6 @@ import math import os -import time import types from typing import Callable, Iterable from enum import Enum @@ -19,22 +18,19 @@ from torch.nn import Module from torch.nn import Parameter -from .linear import LinearModuleForZeroStage3, zero3_linear_wrap +from .linear import zero3_linear_wrap from .offload_constants import * import deepspeed from ..utils import get_only_unique_item, see_memory_usage from deepspeed.runtime.zero.utils import assert_ints_same_as_other_ranks -from deepspeed.utils import instrument_w_nvtx, logger +from deepspeed.utils import instrument_w_nvtx from deepspeed.comm.comm import init_distributed from deepspeed.utils.debug import (debug_param2name_id_shape, debug_param2name_id_shape_device, debug_module2name, - debug_param2name, debug_param2name_id, - debug_param2name_id_shape_status, - printflock, - log_rank_file) + debug_param2name_id_shape_status) from deepspeed.utils.logging import logger from ..swap_tensor.partitioned_param_swapper import AsyncPartitionedParameterSwapper, PartitionedParamStatus diff --git a/deepspeed/runtime/zero/partitioned_param_coordinator.py b/deepspeed/runtime/zero/partitioned_param_coordinator.py index 7baf12f9f4b7..323b0f8e2e69 100644 --- a/deepspeed/runtime/zero/partitioned_param_coordinator.py +++ b/deepspeed/runtime/zero/partitioned_param_coordinator.py @@ -4,16 +4,11 @@ """ from dataclasses import dataclass -import functools import collections -from collections import OrderedDict, UserDict -from typing import Deque, Dict, Iterable, Set, Tuple -import torch +from collections import UserDict +from typing import Deque, Set from torch.cuda import Event, Stream -from torch.nn import Module, Parameter -from deepspeed import comm as dist -from deepspeed.utils.logging import logger from deepspeed.runtime.zero.partition_parameters import * from deepspeed.runtime.zero.offload_constants import * from deepspeed.runtime.swap_tensor.partitioned_param_swapper import PartitionedParamStatus diff --git a/deepspeed/runtime/zero/stage3.py b/deepspeed/runtime/zero/stage3.py index fb284d120011..b3daefa3768d 100755 --- a/deepspeed/runtime/zero/stage3.py +++ b/deepspeed/runtime/zero/stage3.py @@ -4,35 +4,22 @@ """ import gc -from dataclasses import dataclass -import functools -import os import collections -from collections import OrderedDict, UserDict -import itertools -from typing import Deque, Dict, Iterable, Set, Tuple -import torch +from typing import Deque, Dict, Tuple from torch.cuda import Event, Stream -from torch.nn import Module, Parameter -from deepspeed import comm as dist -import math from torch._six import inf -from torch.nn import Module -from torch.nn.parameter import Parameter from deepspeed.runtime import ZeROOptimizer from deepspeed.utils import logger from deepspeed.runtime.fp16.loss_scaler import LossScaler, DynamicLossScaler from deepspeed.runtime.comm.coalesced_collectives import reduce_scatter_coalesced -from deepspeed.runtime.utils import get_global_norm, see_memory_usage, is_model_parallel_parameter +from deepspeed.runtime.utils import get_global_norm, is_model_parallel_parameter from deepspeed.runtime.zero.partition_parameters import * -from deepspeed.runtime.zero.partition_parameters import _init_external_params from deepspeed.runtime.zero.parameter_offload import DeepSpeedZeRoOffload from deepspeed.runtime.zero.constants import ZERO_OPTIMIZATION_WEIGHTS from deepspeed.ops.adam import DeepSpeedCPUAdam from deepspeed.ops.op_builder import UtilsBuilder from deepspeed.runtime.zero.offload_constants import * -from deepspeed.runtime.zero.partitioned_param_coordinator import PartitionedParameterCoordinator, iter_params from deepspeed.runtime.swap_tensor.partitioned_param_swapper import PartitionedParamStatus from deepspeed.runtime.swap_tensor.partitioned_optimizer_swapper import PartitionedOptimizerSwapper from deepspeed.runtime.swap_tensor.pipelined_optimizer_swapper import PipelinedOptimizerSwapper @@ -42,8 +29,6 @@ # with gradient partitioning and without pg_correctness_test = False -from deepspeed.utils.debug import debug_module2name_id, debug_param2name_id, debug_param2name_id_numel, debug_param2name_id_shape_device, debug_module2name_class, printflock, log_rank_file - def print_rank_0(message, debug=False, force=False): rank = dist.get_rank() @@ -2480,9 +2465,6 @@ def model_to_params(model): return total_params, largest_layer_params -import math - - def estimate_zero3_model_states_mem_needs_all_live(model, num_gpus_per_node=1, num_nodes=1, diff --git a/deepspeed/utils/comms_logging.py b/deepspeed/utils/comms_logging.py index 1c17868e09b1..34f8e2e2e1dc 100644 --- a/deepspeed/utils/comms_logging.py +++ b/deepspeed/utils/comms_logging.py @@ -1,12 +1,9 @@ -import logging -import sys -import os import math from deepspeed.utils import log_dist def get_caller_func(frame=3): - import inspect, sys + import sys return sys._getframe(frame).f_code.co_name @@ -43,7 +40,7 @@ def calc_bw_log(comm_op, size, duration): tput = (size / duration) busbw = tput else: - print_rank_0("wrong comm_op specified") + print_rank_0("wrong comm_op specified") # noqa: F821 exit(0) # convert to Gbps @@ -78,18 +75,18 @@ def configure(self, comms_config): # - Global profiling (profile all comms) # - Op-type profiling (e.g. profile all all_reduce comms) # - Op profiling (e.g. profile a specific all_reduce op) - def start_profiling_comms(): + def start_profiling_comms(self): self.prof_all = True - def stop_profiling_comms(): + def stop_profiling_comms(self): self.prof_all = True # E.g. start_profiling_op('all_reduce') - def start_profiling_op(op_name_list): - self.prof_ops = list(set(comms_logger.prof_ops) | set(op_name_list)) + def start_profiling_op(self, op_name_list): + self.prof_ops = list(set(self.prof_ops) | set(op_name_list)) - def stop_profiling_op(op_name_list): - self.prof_ops = [op for op in comms_logger.prof_ops if op not in op_name_list] + def stop_profiling_op(self, op_name_list): + self.prof_ops = [op for op in self.prof_ops if op not in op_name_list] # Add log entry def append(self, raw_name, record_name, latency, msg_size): diff --git a/deepspeed/utils/groups.py b/deepspeed/utils/groups.py index f45b6681c77b..c4d4d4d7cfe5 100644 --- a/deepspeed/utils/groups.py +++ b/deepspeed/utils/groups.py @@ -24,10 +24,9 @@ For inference and other new scenarios, the code will be either reused or added to this file. """ -import torch from deepspeed import comm as dist -from deepspeed.utils import logger, log_dist +from deepspeed.utils import log_dist from deepspeed.utils.exceptions import DeprecatedException # Expert parallel group that the current rank belongs to. diff --git a/deepspeed/utils/timer.py b/deepspeed/utils/timer.py index 8685f144bbb2..9ba150dd0d80 100755 --- a/deepspeed/utils/timer.py +++ b/deepspeed/utils/timer.py @@ -2,8 +2,6 @@ Copyright 2019 The Microsoft DeepSpeed Team """ -from numpy.core.numeric import count_nonzero -from deepspeed.elasticity.elasticity import compute_elastic_config import time import torch from numpy import mean diff --git a/deepspeed/utils/zero_to_fp32.py b/deepspeed/utils/zero_to_fp32.py index 8e8b0fd17dd1..e5249853c891 100755 --- a/deepspeed/utils/zero_to_fp32.py +++ b/deepspeed/utils/zero_to_fp32.py @@ -17,11 +17,9 @@ # while this script doesn't use deepspeed to recover data, since the checkpoints are pickled with # DeepSpeed data structures it has to be available in the current python environment. -import deepspeed from deepspeed.utils import logger from deepspeed.checkpoint.constants import (DS_VERSION, OPTIMIZER_STATE_DICT, - PARAM_SHAPES, SINGLE_PARTITION_OF_FP32_GROUPS, FP32_FLAT_GROUPS, ZERO_STAGE, diff --git a/docs/code-docs/source/conf.py b/docs/code-docs/source/conf.py index fab292764f9f..c43bd0dc554c 100644 --- a/docs/code-docs/source/conf.py +++ b/docs/code-docs/source/conf.py @@ -70,9 +70,6 @@ "conf_py_path": "/docs/code-docs/source/", } -# Mock imports so we don't have to install torch to build the docs. -from unittest.mock import MagicMock - sys.path.insert(0, os.path.abspath('../../../')) # Prepend module names to class descriptions? diff --git a/op_builder/builder.py b/op_builder/builder.py index 5850f4dd8425..384129a9a941 100644 --- a/op_builder/builder.py +++ b/op_builder/builder.py @@ -4,7 +4,6 @@ import os import sys import time -import json import importlib from pathlib import Path import subprocess @@ -193,11 +192,11 @@ def installed_rocm_version(): if rocm_ver_file.is_file(): with open(rocm_ver_file, 'r') as file: ROCM_VERSION_DEV_RAW = file.read() - elif "rocm" in roch.__version__: + elif "rocm" in torch.__version__: ROCM_VERSION_DEV_RAW = torch.__version__.split("rocm")[1] else: assert False, "Could not detect ROCm version" - assert ROCM_VERSION_DEV_RAW is not "", "Could not detect ROCm version" + assert ROCM_VERSION_DEV_RAW != "", "Could not detect ROCm version" ROCM_MAJOR = ROCM_VERSION_DEV_RAW.split('.')[0] ROCM_MINOR = ROCM_VERSION_DEV_RAW.split('.')[1] OpBuilder._rocm_version = (int(ROCM_MAJOR), int(ROCM_MINOR)) @@ -475,7 +474,7 @@ def jit_load(self, verbose=True): f"Unable to JIT load the {self.name} op due to it not being compatible due to hardware/software issue." ) try: - import ninja + import ninja # noqa: F401 except ImportError: raise RuntimeError( f"Unable to JIT load the {self.name} op due to ninja not being installed." diff --git a/op_builder/sparse_attn.py b/op_builder/sparse_attn.py index 00fc890eb983..414bc212e8bc 100644 --- a/op_builder/sparse_attn.py +++ b/op_builder/sparse_attn.py @@ -1,7 +1,6 @@ """ Copyright 2020 The Microsoft DeepSpeed Team """ -import warnings from .builder import OpBuilder try: diff --git a/scripts/check-torchdist.py b/scripts/check-torchdist.py index 695bee58fd48..dbbdc2cfa8ad 100755 --- a/scripts/check-torchdist.py +++ b/scripts/check-torchdist.py @@ -5,7 +5,6 @@ """ from __future__ import annotations -import os import subprocess import sys @@ -25,7 +24,7 @@ def err(s: str) -> None: "grep", "-Hn", "--no-index", - "torch\.distributed", + r"torch\.distributed", *sys.argv[1:]], capture_output=True, ) diff --git a/setup.py b/setup.py index 2e92a847a75d..24e5ec62b7dd 100755 --- a/setup.py +++ b/setup.py @@ -16,9 +16,7 @@ import os import sys -import shutil import subprocess -import warnings from setuptools import setup, find_packages from setuptools.command import egg_info import time diff --git a/tests/benchmarks/flatten_bench.py b/tests/benchmarks/flatten_bench.py index a337a1b525f3..d87971dc1a78 100755 --- a/tests/benchmarks/flatten_bench.py +++ b/tests/benchmarks/flatten_bench.py @@ -11,7 +11,7 @@ import gc import torch -from torch._utils import _flatten_dense_tensors, _unflatten_dense_tensors +from torch._utils import _flatten_dense_tensors from deepspeed.ops.op_builder import UtilsBuilder from apex_C import flatten as flatten_apex @@ -107,15 +107,15 @@ def timeme(): def line_profileme(): print("--------------- line_profiler -----------------") print("py") - profile(py)() + profile(py)() # noqa: F821 gc.collect() torch.cuda.empty_cache() print("cpp") - profile(cpp)() + profile(cpp)() # noqa: F821 gc.collect() torch.cuda.empty_cache() print("apex") - profile(apex)() + profile(apex)() # noqa: F821 gc.collect() torch.cuda.empty_cache() diff --git a/tests/benchmarks/unflatten_bench.py b/tests/benchmarks/unflatten_bench.py index 85baf751ad9c..23fb3f87566d 100755 --- a/tests/benchmarks/unflatten_bench.py +++ b/tests/benchmarks/unflatten_bench.py @@ -116,15 +116,15 @@ def timeme(): def line_profileme(): print("--------------- line_profier -----------------") print("py") - profile(py)() + profile(py)() # noqa: F821 gc.collect() torch.cuda.empty_cache() print("cpp") - profile(cpp)() + profile(cpp)() # noqa: F821 gc.collect() torch.cuda.empty_cache() print("apex") - profile(apex)() + profile(apex)() # noqa: F821 gc.collect() torch.cuda.empty_cache() diff --git a/tests/model/BingBertSquad/BingBertSquad_run_func_test.py b/tests/model/BingBertSquad/BingBertSquad_run_func_test.py index 90e6858e8bcb..828771cd324b 100755 --- a/tests/model/BingBertSquad/BingBertSquad_run_func_test.py +++ b/tests/model/BingBertSquad/BingBertSquad_run_func_test.py @@ -3,9 +3,7 @@ # Note: please copy webtext data to "Megatron-LM" folder, before running this script. import unittest -import subprocess import os -import time import re from .BingBertSquad_test_common import BaseTestCase @@ -16,7 +14,7 @@ def grep_loss_from_file(file_name): with open(file_name, 'r') as f: lines = f.readlines() line_filter = "bert_squad_progress: step=" - match_number = re.compile('loss=([-+]?[0-9]+\.?[0-9]*(?:[Ee][-+]?[0-9]+)?)') + match_number = re.compile(r'loss=([-+]?[0-9]+\.?[0-9]*(?:[Ee][-+]?[0-9]+)?)') for line in lines: if line_filter in line: diff --git a/tests/model/BingBertSquad/BingBertSquad_test_common.py b/tests/model/BingBertSquad/BingBertSquad_test_common.py index a9678bb6923f..b6069d76e69a 100755 --- a/tests/model/BingBertSquad/BingBertSquad_test_common.py +++ b/tests/model/BingBertSquad/BingBertSquad_test_common.py @@ -5,7 +5,6 @@ import subprocess import os import time -import re class BaseTestCase(unittest.TestCase): diff --git a/tests/model/BingBertSquad/test_e2e_squad.py b/tests/model/BingBertSquad/test_e2e_squad.py index 0140ebd87770..0854a8339e1b 100644 --- a/tests/model/BingBertSquad/test_e2e_squad.py +++ b/tests/model/BingBertSquad/test_e2e_squad.py @@ -1,11 +1,9 @@ import subprocess as sp -import datetime import os from math import isclose import sys import pytest import json -import argparse sys.path.append("../../../DeepSpeedExamples/BingBertSquad") import evaluate as eval diff --git a/tests/model/Megatron_GPT2/run_checkpoint_test.py b/tests/model/Megatron_GPT2/run_checkpoint_test.py index fe564d4fdb8a..628547ef2f14 100755 --- a/tests/model/Megatron_GPT2/run_checkpoint_test.py +++ b/tests/model/Megatron_GPT2/run_checkpoint_test.py @@ -5,7 +5,6 @@ import unittest import subprocess import os -import time import re from .test_common import BaseTestCase @@ -26,7 +25,7 @@ def grep_loss_from_file(file_name): with open(file_name, 'r') as f: lines = f.readlines() line_filter = "validation loss at the end of training for test data | LM loss:" - match_number = re.compile('LM loss: ([-+]?[0-9]+\.?[0-9]*(?:[Ee][-+]?[0-9]+)?)') + match_number = re.compile(r'LM loss: ([-+]?[0-9]+\.?[0-9]*(?:[Ee][-+]?[0-9]+)?)') for line in lines: if line_filter in line: diff --git a/tests/model/Megatron_GPT2/run_func_test.py b/tests/model/Megatron_GPT2/run_func_test.py index 463aa1f94f15..78a685e0f0e2 100755 --- a/tests/model/Megatron_GPT2/run_func_test.py +++ b/tests/model/Megatron_GPT2/run_func_test.py @@ -3,9 +3,7 @@ # Note: please copy webtext data to "Megatron-LM" folder, before running this script. import unittest -import subprocess import os -import time import re from .test_common import BaseTestCase @@ -22,7 +20,7 @@ def grep_loss_from_file(file_name): with open(file_name, 'r') as f: lines = f.readlines() line_filter = "validation loss at the end of training for test data | LM loss:" - match_number = re.compile('LM loss: ([-+]?[0-9]+\.?[0-9]*(?:[Ee][-+]?[0-9]+)?)') + match_number = re.compile(r'LM loss: ([-+]?[0-9]+\.?[0-9]*(?:[Ee][-+]?[0-9]+)?)') for line in lines: if line_filter in line: diff --git a/tests/model/Megatron_GPT2/run_perf_baseline.py b/tests/model/Megatron_GPT2/run_perf_baseline.py index f30e9cfe9bc1..0c7233d5dc8f 100755 --- a/tests/model/Megatron_GPT2/run_perf_baseline.py +++ b/tests/model/Megatron_GPT2/run_perf_baseline.py @@ -3,9 +3,6 @@ # Note: please copy webtext data to "Megatron-LM" folder, before running this script. import unittest -import subprocess -import os -import time import re from test_common import BaseTestCase @@ -103,7 +100,7 @@ def grep_latency_from_file(self, file_name): lines = f.readlines() line_filter = "elapsed time per iteration" match_number = re.compile( - 'elapsed time per iteration \(ms\): ([-+]?[0-9]+\.?[0-9]*(?:[Ee][-+]?[0-9]+)?)' + r'elapsed time per iteration \(ms\): ([-+]?[0-9]+\.?[0-9]*(?:[Ee][-+]?[0-9]+)?)' ) for line in lines: diff --git a/tests/model/Megatron_GPT2/run_perf_test.py b/tests/model/Megatron_GPT2/run_perf_test.py index 64b20f4866a4..623f945a4425 100755 --- a/tests/model/Megatron_GPT2/run_perf_test.py +++ b/tests/model/Megatron_GPT2/run_perf_test.py @@ -3,9 +3,6 @@ # Note: please copy webtext data to "Megatron-LM" folder, before running this script. import unittest -import subprocess -import os -import time import re from test_common import BaseTestCase @@ -107,7 +104,7 @@ def grep_latency_from_file(self, file_name): lines = f.readlines() line_filter = "elapsed time per iteration" match_number = re.compile( - 'elapsed time per iteration \(ms\): ([-+]?[0-9]+\.?[0-9]*(?:[Ee][-+]?[0-9]+)?)' + r'elapsed time per iteration \(ms\): ([-+]?[0-9]+\.?[0-9]*(?:[Ee][-+]?[0-9]+)?)' ) for line in lines: diff --git a/tests/model/Megatron_GPT2/test_common.py b/tests/model/Megatron_GPT2/test_common.py index 04b3e4a23a6c..6f9bec89eeb5 100755 --- a/tests/model/Megatron_GPT2/test_common.py +++ b/tests/model/Megatron_GPT2/test_common.py @@ -5,7 +5,6 @@ import subprocess import os import time -import re class BaseTestCase(unittest.TestCase): diff --git a/tests/model/run_sanity_check.py b/tests/model/run_sanity_check.py index 2f020b52db16..a226ccb8ca06 100755 --- a/tests/model/run_sanity_check.py +++ b/tests/model/run_sanity_check.py @@ -8,8 +8,6 @@ sys.path.append('../DeepSpeedExamples/Megatron_GPT2') sys.path.append('../DeepSpeedExamples/BingBertSquad') -import os - # Import the test cases here. import Megatron_GPT2 import BingBertSquad diff --git a/tests/onebit/test_mpi_backend.py b/tests/onebit/test_mpi_backend.py index 57dc7371c4f9..65cfb3ed96c5 100644 --- a/tests/onebit/test_mpi_backend.py +++ b/tests/onebit/test_mpi_backend.py @@ -1,5 +1,4 @@ from mpi4py import MPI -import time import torch import deepspeed.comm as dist import numpy as np diff --git a/tests/onebit/test_mpi_perf.py b/tests/onebit/test_mpi_perf.py index b782cbc5dc3e..1652e946985c 100644 --- a/tests/onebit/test_mpi_perf.py +++ b/tests/onebit/test_mpi_perf.py @@ -1,8 +1,5 @@ from mpi4py import MPI -import time import torch -import deepspeed.comm as dist -import numpy as np import deepspeed from deepspeed.runtime.comm.mpi import MpiBackend diff --git a/tests/onebit/test_nccl_backend.py b/tests/onebit/test_nccl_backend.py index 6a99c9fe2a9c..395b1053f917 100644 --- a/tests/onebit/test_nccl_backend.py +++ b/tests/onebit/test_nccl_backend.py @@ -1,4 +1,3 @@ -import time import torch import deepspeed.comm as dist import numpy as np diff --git a/tests/onebit/test_nccl_perf.py b/tests/onebit/test_nccl_perf.py index d4cfbccfd7da..86923ef90b82 100644 --- a/tests/onebit/test_nccl_perf.py +++ b/tests/onebit/test_nccl_perf.py @@ -1,4 +1,3 @@ -import time import torch import deepspeed.comm as dist import numpy as np diff --git a/tests/small_model_debugging/test.py b/tests/small_model_debugging/test.py index 25418f3c0f93..331a8ef35ca6 100644 --- a/tests/small_model_debugging/test.py +++ b/tests/small_model_debugging/test.py @@ -1,8 +1,6 @@ import torch from deepspeed.pt.deepspeed_linear import LinearModuleForZeroStage3 -from deepspeed.pt.deepspeed_utils import see_memory_usage from deepspeed.pt.log_utils import logger -import deepspeed def see_memory_usage(message): diff --git a/tests/unit/common.py b/tests/unit/common.py index 10037008aa90..7a60cbe8c81a 100644 --- a/tests/unit/common.py +++ b/tests/unit/common.py @@ -8,9 +8,6 @@ import deepspeed import pytest -from functools import wraps -import unittest -from pathlib import Path from pathlib import Path diff --git a/tests/unit/megatron_model.py b/tests/unit/megatron_model.py index fd2ef69b7259..6fc55393295f 100644 --- a/tests/unit/megatron_model.py +++ b/tests/unit/megatron_model.py @@ -1,4 +1,3 @@ -from pathlib import Path import torch import os import sys diff --git a/tests/unit/modeling.py b/tests/unit/modeling.py index e3b6b4d836f0..e8a38afc9538 100755 --- a/tests/unit/modeling.py +++ b/tests/unit/modeling.py @@ -28,7 +28,6 @@ import shutil import tarfile import tempfile -import sys from io import open import torch @@ -38,10 +37,8 @@ import deepspeed.comm as dist from torch.nn import Module -from torch.nn.parameter import Parameter import torch.nn.functional as F import torch.nn.init as init -import time #from numba import cuda @@ -187,8 +184,8 @@ def swish(x): class GPUTimer: def __init__(self): super().__init__() - self.start = cuda.event() - self.stop = cuda.event() + self.start = cuda.event() # noqa: F821 + self.stop = cuda.event() # noqa: F821 def record(self): self.start.record() @@ -216,9 +213,7 @@ def __init__(self, self.out_features = out_features self.fused_gelu = False self.fused_tanh = False - if isinstance(act, - str) or (sys.version_info[0] == 2 and isinstance(act, - unicode)): + if isinstance(act, str): if bias and act == 'gelu': self.fused_gelu = True elif bias and act == 'tanh': @@ -307,10 +302,7 @@ def __init__(self, initializer_range: The sttdev of the truncated_normal_initializer for initializing all weight matrices. """ - if isinstance(vocab_size_or_config_json_file, - str) or (sys.version_info[0] == 2 - and isinstance(vocab_size_or_config_json_file, - unicode)): + if isinstance(vocab_size_or_config_json_file, str): with open(vocab_size_or_config_json_file, "r", encoding='utf-8') as reader: json_config = json.loads(reader.read()) for key, value in json_config.items(): @@ -644,8 +636,8 @@ def get_grads(self): def get_modules(self, big_node, input): for mdl in big_node.named_children(): - graph.append(mdl) - get_modules(self, mdl, input) + self.graph.append(mdl) + self.get_modules(self, mdl, input) def forward(self, hidden_states, @@ -864,22 +856,22 @@ def from_pretrained(cls, archive_file = PRETRAINED_MODEL_ARCHIVE_MAP[pretrained_model_name_or_path] else: archive_file = pretrained_model_name_or_path - if resolved_archive_file == archive_file: + if resolved_archive_file == archive_file: # noqa: F821 logger.info("loading archive file {}".format(archive_file)) else: logger.info("loading archive file {} from cache at {}".format( archive_file, - resolved_archive_file)) + resolved_archive_file)) # noqa: F821 tempdir = None - if os.path.isdir(resolved_archive_file) or from_tf: - serialization_dir = resolved_archive_file + if os.path.isdir(resolved_archive_file) or from_tf: # noqa: F821 + serialization_dir = resolved_archive_file # noqa: F821 else: # Extract archive to temp dir tempdir = tempfile.mkdtemp() logger.info("extracting archive file {} to temp dir {}".format( - resolved_archive_file, + resolved_archive_file, # noqa: F821 tempdir)) - with tarfile.open(resolved_archive_file, 'r:gz') as archive: + with tarfile.open(resolved_archive_file, 'r:gz') as archive: # noqa: F821 archive.extractall(tempdir) serialization_dir = tempdir # Load config diff --git a/tests/unit/modelingpreln.py b/tests/unit/modelingpreln.py index 34a933bc6b29..673a73ac91f4 100755 --- a/tests/unit/modelingpreln.py +++ b/tests/unit/modelingpreln.py @@ -28,7 +28,6 @@ import shutil import tarfile import tempfile -import sys from io import open import torch @@ -38,10 +37,8 @@ import deepspeed.comm as dist from torch.nn import Module -from torch.nn.parameter import Parameter import torch.nn.functional as F import torch.nn.init as init -import time #from numba import cuda @@ -187,8 +184,8 @@ def swish(x): class GPUTimer: def __init__(self): super().__init__() - self.start = cuda.event() - self.stop = cuda.event() + self.start = cuda.event() # noqa: F821 + self.stop = cuda.event() # noqa: F821 def record(self): self.start.record() @@ -216,9 +213,7 @@ def __init__(self, self.out_features = out_features self.fused_gelu = False self.fused_tanh = False - if isinstance(act, - str) or (sys.version_info[0] == 2 and isinstance(act, - unicode)): + if isinstance(act, str): if bias and act == 'gelu': self.fused_gelu = True elif bias and act == 'tanh': @@ -307,10 +302,7 @@ def __init__(self, initializer_range: The sttdev of the truncated_normal_initializer for initializing all weight matrices. """ - if isinstance(vocab_size_or_config_json_file, - str) or (sys.version_info[0] == 2 - and isinstance(vocab_size_or_config_json_file, - unicode)): + if isinstance(vocab_size_or_config_json_file, str): with open(vocab_size_or_config_json_file, "r", encoding='utf-8') as reader: json_config = json.loads(reader.read()) for key, value in json_config.items(): @@ -738,8 +730,8 @@ def get_grads(self): def get_modules(self, big_node, input): for mdl in big_node.named_children(): - graph.append(mdl) - get_modules(self, mdl, input) + self.graph.append(mdl) + self.get_modules(self, mdl, input) def forward(self, hidden_states, @@ -959,22 +951,22 @@ def from_pretrained(cls, archive_file = PRETRAINED_MODEL_ARCHIVE_MAP[pretrained_model_name_or_path] else: archive_file = pretrained_model_name_or_path - if resolved_archive_file == archive_file: + if resolved_archive_file == archive_file: # noqa: F821 logger.info("loading archive file {}".format(archive_file)) else: logger.info("loading archive file {} from cache at {}".format( archive_file, - resolved_archive_file)) + resolved_archive_file)) # noqa: F821 tempdir = None - if os.path.isdir(resolved_archive_file) or from_tf: - serialization_dir = resolved_archive_file + if os.path.isdir(resolved_archive_file) or from_tf: # noqa: F821 + serialization_dir = resolved_archive_file # noqa: F821 else: # Extract archive to temp dir tempdir = tempfile.mkdtemp() logger.info("extracting archive file {} to temp dir {}".format( - resolved_archive_file, + resolved_archive_file, # noqa: F821 tempdir)) - with tarfile.open(resolved_archive_file, 'r:gz') as archive: + with tarfile.open(resolved_archive_file, 'r:gz') as archive: # noqa: F821 archive.extractall(tempdir) serialization_dir = tempdir # Load config diff --git a/tests/unit/multi_output_model.py b/tests/unit/multi_output_model.py index 7caf6f7de75f..240c1a4b7aa6 100755 --- a/tests/unit/multi_output_model.py +++ b/tests/unit/multi_output_model.py @@ -1,6 +1,3 @@ -import os -import json -import argparse import torch diff --git a/tests/unit/test_autocast.py b/tests/unit/test_autocast.py index 004cd8533869..7bffad14530d 100644 --- a/tests/unit/test_autocast.py +++ b/tests/unit/test_autocast.py @@ -1,12 +1,11 @@ import pytest import torch -import deepspeed from deepspeed.runtime.zero.linear import LinearModuleForZeroStage3 def _skip_autocast_test(): try: - from torch.cuda.amp import custom_fwd, custom_bwd + from torch.cuda.amp import custom_fwd, custom_bwd # noqa: F401 except (ImportError, AttributeError) as exp: return True diff --git a/tests/unit/test_autotuning.py b/tests/unit/test_autotuning.py index 2a7898b8af0a..681c3108b15b 100644 --- a/tests/unit/test_autotuning.py +++ b/tests/unit/test_autotuning.py @@ -1,6 +1,5 @@ import os import pytest -import torch from .simple_model import create_config_from_dict from deepspeed.launcher import runner as dsrun from deepspeed.autotuning.autotuner import Autotuner diff --git a/tests/unit/test_bf16.py b/tests/unit/test_bf16.py index aa2ab132394c..4930a74640de 100644 --- a/tests/unit/test_bf16.py +++ b/tests/unit/test_bf16.py @@ -1,4 +1,3 @@ -import math import torch import deepspeed import pytest diff --git a/tests/unit/test_checkpointing.py b/tests/unit/test_checkpointing.py index dd93e006081f..e55fc30fa56c 100755 --- a/tests/unit/test_checkpointing.py +++ b/tests/unit/test_checkpointing.py @@ -1,10 +1,5 @@ -import torch - -import deepspeed.comm as dist - import deepspeed from deepspeed.runtime.zero.stage_1_and_2 import DeepSpeedZeroOptimizer -from deepspeed.utils import groups from deepspeed.runtime.fp16.fused_optimizer import FP16_Optimizer from deepspeed.runtime.fp16.unfused_optimizer import FP16_UnfusedOptimizer from deepspeed.moe.utils import split_params_into_different_moe_groups_for_optimizer @@ -19,10 +14,7 @@ from .util import required_minimum_torch_version, required_torch_version import itertools -import argparse import pytest -import json -import os import numbers from .common import distributed_test from .simple_model import * @@ -1383,7 +1375,6 @@ def _test_load_immediate_save(args, model, tmpdir): @pytest.mark.parametrize('zero_stage', [0, 1, 2, 3]) def test_save_before_accum_grad_is_done(tmpdir, zero_stage): config_dict = { - "train_batch_size": 4, "optimizer": { "type": 'Adam' }, diff --git a/tests/unit/test_coalesced_collectives.py b/tests/unit/test_coalesced_collectives.py index a7e0ec35751b..9597a1e8536a 100644 --- a/tests/unit/test_coalesced_collectives.py +++ b/tests/unit/test_coalesced_collectives.py @@ -1,7 +1,5 @@ """unit tests for coalesced collectives""" -import pytest - import torch import deepspeed.comm as dist from deepspeed.runtime.comm.coalesced_collectives import reduce_scatter_coalesced diff --git a/tests/unit/test_compression.py b/tests/unit/test_compression.py index f00aafaca1ba..d8d21bb630c0 100755 --- a/tests/unit/test_compression.py +++ b/tests/unit/test_compression.py @@ -1,4 +1,3 @@ -from zlib import compressobj import torch import pytest import random diff --git a/tests/unit/test_configurable_parallel.py b/tests/unit/test_configurable_parallel.py index daa2cd1791b0..f9ff67f578e0 100755 --- a/tests/unit/test_configurable_parallel.py +++ b/tests/unit/test_configurable_parallel.py @@ -1,14 +1,11 @@ import torch import deepspeed import pytest -import os -import time import random import numpy as np import torch.multiprocessing as mp import deepspeed.comm as dist from .common import distributed_test -from .simple_model import args_from_dict, create_deepspeed_args from .megatron_model import get_gpt2_model, get_megatron_version from .megatron_model import MockGPT2ModelPipe as GPT2ModelPipe from deepspeed.utils import RepeatingLoader diff --git a/tests/unit/test_cpu_adam.py b/tests/unit/test_cpu_adam.py index 74356dffd8cf..7357c086d08d 100755 --- a/tests/unit/test_cpu_adam.py +++ b/tests/unit/test_cpu_adam.py @@ -1,9 +1,6 @@ -import argparse import torch -import time import numpy as np import pytest -import copy from cpuinfo import get_cpu_info import deepspeed diff --git a/tests/unit/test_cuda_backward.py b/tests/unit/test_cuda_backward.py index d7faee7c0502..42bf50c6ad4e 100755 --- a/tests/unit/test_cuda_backward.py +++ b/tests/unit/test_cuda_backward.py @@ -1,6 +1,6 @@ +import math import numpy as np import torch -import torch.nn.functional as F import pytest import random import copy @@ -121,7 +121,7 @@ def custom_forward(*inputs): num_layers = len(self.layer) chunk_length = math.ceil(math.sqrt(num_layers)) while l < num_layers: - hidden_states = checkpoint.checkpoint(custom(l, + hidden_states = checkpoint.checkpoint(custom(l, # noqa: F821 l + chunk_length), hidden_states, attention_mask * 1) diff --git a/tests/unit/test_cuda_forward.py b/tests/unit/test_cuda_forward.py index 2a5d2d13858e..9c2b7f7afaa2 100755 --- a/tests/unit/test_cuda_forward.py +++ b/tests/unit/test_cuda_forward.py @@ -1,19 +1,13 @@ -import argparse +import math import numpy as np import torch -import torch.nn.functional as F import pytest -import json import random -import time import copy from torch import nn from .modelingpreln import BertEncoder as BertEncoderPreln from .modeling import BertLayerNorm, BertConfig, BertEncoder as BertEncoderPostln from deepspeed import DeepSpeedTransformerLayer, DeepSpeedTransformerConfig -import deepspeed - -import sys def check_equal(first, second, atol=1e-2, verbose=False): @@ -74,7 +68,7 @@ def custom_forward(*inputs): num_layers = len(self.layer) chunk_length = math.ceil(math.sqrt(num_layers)) while l < num_layers: - hidden_states = checkpoint.checkpoint(custom(l, + hidden_states = checkpoint.checkpoint(custom(l, # noqa: F821 l + chunk_length), hidden_states, attention_mask * 1) diff --git a/tests/unit/test_curriculum_learning.py b/tests/unit/test_curriculum_learning.py index 22dde25fcd35..cb7af95b1edb 100644 --- a/tests/unit/test_curriculum_learning.py +++ b/tests/unit/test_curriculum_learning.py @@ -1,12 +1,4 @@ -import torch -import deepspeed.comm as dist import deepspeed -import argparse -import pytest -import json -import os -import numpy as np -import time from .common import distributed_test from .simple_model import Curriculum_SimpleModel, random_dataloader, args_from_dict diff --git a/tests/unit/test_dynamic_loss_scale.py b/tests/unit/test_dynamic_loss_scale.py index 65a679d94de7..3d9209fcc76a 100755 --- a/tests/unit/test_dynamic_loss_scale.py +++ b/tests/unit/test_dynamic_loss_scale.py @@ -1,9 +1,5 @@ import torch import deepspeed -import argparse -import pytest -import json -import os import numpy as np from .common import distributed_test from .simple_model import SimpleModel, args_from_dict diff --git a/tests/unit/test_elastic.py b/tests/unit/test_elastic.py index 353d6def37ba..9f5d1f0d06bd 100644 --- a/tests/unit/test_elastic.py +++ b/tests/unit/test_elastic.py @@ -2,7 +2,7 @@ import deepspeed from .common import distributed_test from deepspeed.git_version_info import version as ds_version -from .simple_model import SimpleModel, SimpleOptimizer, random_dataloader, args_from_dict +from .simple_model import SimpleModel, args_from_dict base_ds_config = { "elasticity": { diff --git a/tests/unit/test_flops_profiler.py b/tests/unit/test_flops_profiler.py index 173fa7eed09c..9a01f5c6a322 100644 --- a/tests/unit/test_flops_profiler.py +++ b/tests/unit/test_flops_profiler.py @@ -1,9 +1,8 @@ import torch import pytest import deepspeed -import deepspeed.runtime.utils as ds_utils -from deepspeed.profiling.flops_profiler import FlopsProfiler, get_model_profile -from .simple_model import SimpleModel, SimpleOptimizer, random_dataloader, args_from_dict +from deepspeed.profiling.flops_profiler import get_model_profile +from .simple_model import SimpleModel, random_dataloader, args_from_dict from .common import distributed_test TORCH_MAJOR = int(torch.__version__.split('.')[0]) diff --git a/tests/unit/test_fp16.py b/tests/unit/test_fp16.py index d8826e59e8e7..43d76994b38d 100755 --- a/tests/unit/test_fp16.py +++ b/tests/unit/test_fp16.py @@ -1,12 +1,7 @@ -import math -from deepspeed.utils import groups import torch import deepspeed.comm as dist import deepspeed -import argparse import pytest -import json -import os from deepspeed.ops.adam import FusedAdam from .common import distributed_test from deepspeed.ops.op_builder import CPUAdamBuilder @@ -14,7 +9,7 @@ from .util import required_torch_version try: - from apex import amp + from apex import amp # noqa: F401 _amp_available = True except ImportError: _amp_available = False diff --git a/tests/unit/test_get_optim_files.py b/tests/unit/test_get_optim_files.py index 68d046bfe99e..b0b5b242c200 100644 --- a/tests/unit/test_get_optim_files.py +++ b/tests/unit/test_get_optim_files.py @@ -1,6 +1,5 @@ import os import pytest -import deepspeed from deepspeed.utils.zero_to_fp32 import get_optim_files diff --git a/tests/unit/test_ignore_unused_parameters.py b/tests/unit/test_ignore_unused_parameters.py index eb26f46ca209..fd1f427d1220 100644 --- a/tests/unit/test_ignore_unused_parameters.py +++ b/tests/unit/test_ignore_unused_parameters.py @@ -1,8 +1,4 @@ -import torch import pytest -import json -import argparse -import os from .common import distributed_test from .simple_model import UnusedParametersModel, random_dataloader, args_from_dict from deepspeed.ops.op_builder import CPUAdamBuilder diff --git a/tests/unit/test_inference.py b/tests/unit/test_inference.py index 006fe6cc884f..c53c817abdf5 100644 --- a/tests/unit/test_inference.py +++ b/tests/unit/test_inference.py @@ -1,12 +1,10 @@ import os -import sys import time import torch import pytest import itertools import deepspeed from deepspeed.git_version_info import torch_info -from collections import defaultdict from .common import distributed_test from packaging import version as pkg_version from deepspeed.ops.op_builder import OpBuilder diff --git a/tests/unit/test_lr_schedulers.py b/tests/unit/test_lr_schedulers.py index 47bcfb1ef329..49da0111d985 100755 --- a/tests/unit/test_lr_schedulers.py +++ b/tests/unit/test_lr_schedulers.py @@ -1,11 +1,8 @@ import torch import deepspeed -import argparse import pytest -import json -import os from .common import distributed_test -from .simple_model import SimpleModel, SimpleOptimizer, random_dataloader, args_from_dict +from .simple_model import SimpleModel, random_dataloader, args_from_dict from deepspeed.runtime.lr_schedules import LR_RANGE_TEST, LR_RANGE_TEST_MIN_LR, LR_RANGE_TEST_STEP_RATE, LR_RANGE_TEST_STEP_SIZE, LR_RANGE_TEST_STAIRCASE from deepspeed.runtime.lr_schedules import WARMUP_LR, WARMUP_MIN_LR, WARMUP_MAX_LR, WARMUP_NUM_STEPS, WARMUP_TYPE, WARMUP_LOG_RATE, WARMUP_LINEAR_RATE from deepspeed.runtime.lr_schedules import ONE_CYCLE, CYCLE_MIN_LR, CYCLE_MAX_LR, CYCLE_FIRST_STEP_SIZE, DECAY_LR_RATE, DECAY_STEP_SIZE diff --git a/tests/unit/test_moe.py b/tests/unit/test_moe.py index 779bafbb758f..cb1a89b9a1eb 100644 --- a/tests/unit/test_moe.py +++ b/tests/unit/test_moe.py @@ -1,20 +1,12 @@ -import math -from deepspeed.utils import groups import torch -import deepspeed.comm as dist import deepspeed -import argparse import pytest -import json -import os -from deepspeed.ops.adam import FusedAdam from .common import distributed_test -from deepspeed.ops.op_builder import CPUAdamBuilder -from .simple_model import SimpleModel, SimplePRMoEModel, SimpleOptimizer, random_dataloader, args_from_dict, create_deepspeed_args, SimpleMoEModel, sequence_dataloader +from .simple_model import SimplePRMoEModel, args_from_dict, SimpleMoEModel, sequence_dataloader from .util import required_torch_version try: - from apex import amp + from apex import amp # noqa: F401 _amp_available = True except ImportError: _amp_available = False diff --git a/tests/unit/test_monitor.py b/tests/unit/test_monitor.py index 95f045d54dea..a417fb9f7d8c 100644 --- a/tests/unit/test_monitor.py +++ b/tests/unit/test_monitor.py @@ -2,7 +2,6 @@ from deepspeed.monitor.constants import * -from deepspeed.monitor.monitor import MonitorMaster from deepspeed.monitor.tensorboard import TensorBoardMonitor from deepspeed.monitor.wandb import WandbMonitor from deepspeed.monitor.csv_monitor import csvMonitor @@ -10,10 +9,9 @@ from .simple_model import * from .common import distributed_test from deepspeed.runtime.config import DeepSpeedConfig -from deepspeed.monitor.config import DeepSpeedMonitorConfig try: - import tensorboard + import tensorboard # noqa: F401 _tb_available = True except ImportError: _tb_available = False @@ -21,7 +19,7 @@ reason="tensorboard is not installed") try: - import wandb + import wandb # noqa: F401 _wandb_available = True except ImportError: _wandb_available = False diff --git a/tests/unit/test_multi_output_model.py b/tests/unit/test_multi_output_model.py index 478bdc8d383d..deef776c0815 100755 --- a/tests/unit/test_multi_output_model.py +++ b/tests/unit/test_multi_output_model.py @@ -1,10 +1,6 @@ import torch import deepspeed -import argparse -import pytest from pytest import approx -import json -import os from .common import distributed_test from .simple_model import args_from_dict from .multi_output_model import MultiOutputModel, multi_output_dataloader diff --git a/tests/unit/test_onebit.py b/tests/unit/test_onebit.py index b7806b0831c7..b6f1f8bd4e15 100644 --- a/tests/unit/test_onebit.py +++ b/tests/unit/test_onebit.py @@ -1,23 +1,19 @@ import torch import torch.nn as nn -import torch.nn.functional as F import deepspeed.comm as dist import deepspeed -import argparse import pytest import copy -import json import os import numpy as np -import time -from deepspeed.runtime.pipe.topology import PipeDataParallelTopology, PipeModelDataParallelTopology +from deepspeed.runtime.pipe.topology import PipeDataParallelTopology from deepspeed.ops.op_builder import OpBuilder PipeTopo = PipeDataParallelTopology -from deepspeed.runtime.pipe.module import PipelineModule, LayerSpec +from deepspeed.runtime.pipe.module import PipelineModule from .common import distributed_test -from .simple_model import SimpleModel, SimpleOptimizer, random_dataloader, args_from_dict, create_deepspeed_args +from .simple_model import SimpleModel, random_dataloader, args_from_dict from .test_pipe import AlexNetPipe, train_cifar TORCH_MAJOR = int(torch.__version__.split('.')[0]) diff --git a/tests/unit/test_pipe.py b/tests/unit/test_pipe.py index 832d06f9d3ce..de1bd3ff279c 100755 --- a/tests/unit/test_pipe.py +++ b/tests/unit/test_pipe.py @@ -1,4 +1,3 @@ -import os import copy import torch @@ -11,8 +10,7 @@ import deepspeed import deepspeed.runtime.utils as ds_utils - -from deepspeed.runtime.pipe.topology import PipeDataParallelTopology, PipeModelDataParallelTopology +from deepspeed.runtime.pipe.topology import PipeDataParallelTopology PipeTopo = PipeDataParallelTopology from deepspeed.runtime.pipe.module import PipelineModule, LayerSpec diff --git a/tests/unit/test_pipe_module.py b/tests/unit/test_pipe_module.py index e50c7d6231a5..1cba989b54e8 100644 --- a/tests/unit/test_pipe_module.py +++ b/tests/unit/test_pipe_module.py @@ -8,11 +8,11 @@ import deepspeed -from deepspeed.runtime.pipe.topology import PipeDataParallelTopology, PipeModelDataParallelTopology +from deepspeed.runtime.pipe.topology import PipeDataParallelTopology PipeTopo = PipeDataParallelTopology -from deepspeed.pipe import PipelineModule, LayerSpec +from deepspeed.pipe import PipelineModule from deepspeed.utils import RepeatingLoader from .common import distributed_test diff --git a/tests/unit/test_pld.py b/tests/unit/test_pld.py index 5d275d16379c..0953b648dce4 100755 --- a/tests/unit/test_pld.py +++ b/tests/unit/test_pld.py @@ -4,7 +4,7 @@ from deepspeed.runtime.progressive_layer_drop import ProgressiveLayerDrop from .common import distributed_test -from .simple_model import SimpleModel, PLD_SimpleModel, SimpleOptimizer, random_dataloader, args_from_dict +from .simple_model import SimpleModel, PLD_SimpleModel, random_dataloader, args_from_dict @pytest.mark.parametrize('theta', [0, 0.1, 0.9, 1.0]) diff --git a/tests/unit/test_reshape_checkpoint.py b/tests/unit/test_reshape_checkpoint.py index 317f3bb1661f..ed83baf43178 100644 --- a/tests/unit/test_reshape_checkpoint.py +++ b/tests/unit/test_reshape_checkpoint.py @@ -1,6 +1,3 @@ -import pytest -import deepspeed - from deepspeed.checkpoint import model_3d_desc diff --git a/tests/unit/test_runtime_utils.py b/tests/unit/test_runtime_utils.py index 2012233cdf63..8e1697105000 100644 --- a/tests/unit/test_runtime_utils.py +++ b/tests/unit/test_runtime_utils.py @@ -1,11 +1,9 @@ -from deepspeed.moe.utils import is_moe_param, split_params_grads_into_shared_and_expert_params, split_params_into_shared_and_expert_params import torch from torch._utils import _flatten_dense_tensors import deepspeed.comm as dist import pytest import deepspeed.runtime.utils as ds_utils -from deepspeed.utils.logging import log_dist import deepspeed.utils.groups as groups from .common import distributed_test diff --git a/tests/unit/test_sparse_attention.py b/tests/unit/test_sparse_attention.py index 531524e45421..f3079982c964 100755 --- a/tests/unit/test_sparse_attention.py +++ b/tests/unit/test_sparse_attention.py @@ -16,7 +16,7 @@ def test_sparse_attention_module_availability(): return True try: - from deepspeed.ops import sparse_attention + from deepspeed.ops import sparse_attention # noqa: F401 except ImportError: print("Sparse Attention Module is not installed!") return False @@ -26,7 +26,7 @@ def test_sparse_attention_module_availability(): def test_matmul_module_availability(): return True try: - from deepspeed.ops.sparse_attention.matmul import MatMul + from deepspeed.ops.sparse_attention.matmul import MatMul # noqa: F401 except ImportError: print("Sparse MatMul Module is not installed!") return False @@ -36,7 +36,7 @@ def test_matmul_module_availability(): def test_softmax_module_availability(): return True try: - from deepspeed.ops.sparse_attention.softmax import Softmax + from deepspeed.ops.sparse_attention.softmax import Softmax # noqa: F401 except ImportError: print("Sparse Softmax Module is not installed!") return False @@ -46,7 +46,7 @@ def test_softmax_module_availability(): def test_sparsityconfig_module_availability(): return True try: - from deepspeed.ops.sparse_attention import SparsityConfig + from deepspeed.ops.sparse_attention import SparsityConfig # noqa: F401 except ImportError: print("SparsityConfig Module is not installed!") return False @@ -56,7 +56,7 @@ def test_sparsityconfig_module_availability(): def test_densesparsityconfig_module_availability(): return True try: - from deepspeed.ops.sparse_attention import DenseSparsityConfig + from deepspeed.ops.sparse_attention import DenseSparsityConfig # noqa: F401 except ImportError: print("DenseSparsityConfig Module is not installed!") return False @@ -66,7 +66,7 @@ def test_densesparsityconfig_module_availability(): def test_fixedsparsityconfig_module_availability(): return True try: - from deepspeed.ops.sparse_attention import FixedSparsityConfig + from deepspeed.ops.sparse_attention import FixedSparsityConfig # noqa: F401 except ImportError: print("FixedSparsityConfig Module is not installed!") return False @@ -76,7 +76,7 @@ def test_fixedsparsityconfig_module_availability(): def test_variablesparsityconfig_module_availability(): return True try: - from deepspeed.ops.sparse_attention import VariableSparsityConfig + from deepspeed.ops.sparse_attention import VariableSparsityConfig # noqa: F401 except ImportError: print("VariableSparsityConfig Module is not installed!") return False @@ -86,7 +86,7 @@ def test_variablesparsityconfig_module_availability(): def test_bigbirdsparsityconfig_module_availability(): return True try: - from deepspeed.ops.sparse_attention import BigBirdSparsityConfig + from deepspeed.ops.sparse_attention import BigBirdSparsityConfig # noqa: F401 except ImportError: print("BigBirdSparsityConfig Module is not installed!") return False @@ -96,7 +96,7 @@ def test_bigbirdsparsityconfig_module_availability(): def test_bslongformersparsityconfig_module_availability(): return True try: - from deepspeed.ops.sparse_attention import BSLongformerSparsityConfig + from deepspeed.ops.sparse_attention import BSLongformerSparsityConfig # noqa: F401 except ImportError: print("BSLongformerSparsityConfig Module is not installed!") return False @@ -106,7 +106,7 @@ def test_bslongformersparsityconfig_module_availability(): def test_sparseselfattention_module_availability(): return True try: - from deepspeed.ops.sparse_attention import SparseSelfAttention + from deepspeed.ops.sparse_attention import SparseSelfAttention # noqa: F401 except ImportError: print("SparseSelfAttention Module is not installed!") return False @@ -116,7 +116,7 @@ def test_sparseselfattention_module_availability(): def test_bertsparseselfattention_module_availability(): return True try: - from deepspeed.ops.sparse_attention import BertSparseSelfAttention + from deepspeed.ops.sparse_attention import BertSparseSelfAttention # noqa: F401 except ImportError: print("BertSparseSelfAttention Module is not installed!") return False @@ -126,7 +126,7 @@ def test_bertsparseselfattention_module_availability(): def test_sparseattentionutils_availability(): return True try: - from deepspeed.ops.sparse_attention import SparseAttentionUtils + from deepspeed.ops.sparse_attention import SparseAttentionUtils # noqa: F401 except ImportError: print("SparseAttentionUtils Module is not installed!") return False @@ -136,7 +136,7 @@ def test_sparseattentionutils_availability(): def test_cpp_utils_availability(): return True try: - from deepspeed.ops.sparse_attention import cpp_utils + from deepspeed.ops.sparse_attention import cpp_utils # noqa: F401 except ImportError: print("Sparse Attention cpp_utils Module is not installed!") return False diff --git a/tests/unit/test_sparse_grads.py b/tests/unit/test_sparse_grads.py index b146946f30a8..5be8ec3968fb 100644 --- a/tests/unit/test_sparse_grads.py +++ b/tests/unit/test_sparse_grads.py @@ -1,7 +1,5 @@ import torch -import deepspeed.comm as dist import deepspeed -import pytest from .common import distributed_test import deepspeed.utils.groups as groups diff --git a/tests/unit/test_zero.py b/tests/unit/test_zero.py index 453eaaadb0f7..b580fc4eaaa5 100755 --- a/tests/unit/test_zero.py +++ b/tests/unit/test_zero.py @@ -10,7 +10,7 @@ from torch.nn.parameter import Parameter from .common import distributed_test -from .simple_model import SimpleModel, random_dataloader, args_from_dict +from .simple_model import SimpleModel, random_dataloader import deepspeed from deepspeed.runtime.engine import DeepSpeedEngine diff --git a/tests/unit/test_zero_tiled.py b/tests/unit/test_zero_tiled.py index 474ad02e7c27..e76734308ac9 100644 --- a/tests/unit/test_zero_tiled.py +++ b/tests/unit/test_zero_tiled.py @@ -1,7 +1,6 @@ import copy import torch -import deepspeed from deepspeed.runtime.zero.tiling import TiledLinear, TiledLinearReturnBias import pytest From cf587b821139771ff66bdb7af6087c88edfb10ae Mon Sep 17 00:00:00 2001 From: Ammar Ahmad Awan Date: Mon, 25 Jul 2022 22:15:01 -0700 Subject: [PATCH 12/38] DS on Azure blog (#2133) Co-authored-by: Jeff Rasley --- deepspeed/ops/sparse_attention/matmul.py | 4 +- docs/_posts/2022-07-26-deepspeed-azure.md | 135 ++++++++++++++++++++++ docs/assets/images/175b-trend.png | Bin 0 -> 90652 bytes docs/assets/images/1t-trend.png | Bin 0 -> 39821 bytes docs/assets/images/530b-trend.png | Bin 0 -> 49726 bytes docs/assets/images/large-model-graph.png | Bin 0 -> 142599 bytes docs/assets/images/old-vs-new-azure.png | Bin 0 -> 507296 bytes docs/assets/images/perf-overview.png | Bin 0 -> 158509 bytes docs/assets/images/vmss-setup.png | Bin 0 -> 18951 bytes 9 files changed, 137 insertions(+), 2 deletions(-) create mode 100644 docs/_posts/2022-07-26-deepspeed-azure.md create mode 100755 docs/assets/images/175b-trend.png create mode 100755 docs/assets/images/1t-trend.png create mode 100755 docs/assets/images/530b-trend.png create mode 100755 docs/assets/images/large-model-graph.png create mode 100755 docs/assets/images/old-vs-new-azure.png create mode 100755 docs/assets/images/perf-overview.png create mode 100755 docs/assets/images/vmss-setup.png diff --git a/deepspeed/ops/sparse_attention/matmul.py b/deepspeed/ops/sparse_attention/matmul.py index ca933b989036..986666bde57f 100755 --- a/deepspeed/ops/sparse_attention/matmul.py +++ b/deepspeed/ops/sparse_attention/matmul.py @@ -337,8 +337,8 @@ def _sdd_matmul(a, a_inner, b_inner = a.shape[a_dim], b.shape[b_dim] if a_inner != b_inner: raise ValueError( - f"Size of tensor A along the {_dim_to_name(a_dim)} dim ({a_inner}) must match size " # noqa: F821 - f"of tensor B along the {_dim_to_name(b_dim)} dim ({b_inner})") + f"Size of tensor A along the {a_dim} dim ({a_inner}) must match size " + f"of tensor B along the {b_dim} dim ({b_inner})") if a_inner % 16 != 0: raise ValueError('Reduction size for SDD must be a multiple of 16') diff --git a/docs/_posts/2022-07-26-deepspeed-azure.md b/docs/_posts/2022-07-26-deepspeed-azure.md new file mode 100644 index 000000000000..209bb4a1c9ed --- /dev/null +++ b/docs/_posts/2022-07-26-deepspeed-azure.md @@ -0,0 +1,135 @@ +--- +title: "Azure empowers easy-to-use, high-performance, and hyperscale model training using DeepSpeed" +excerpt: "" +date: 2022-07-26 00:09:00 +tags: training, azure +--- + +## Introduction + +Large-scale transformer-based deep learning models trained on large amounts of data have shown great results in recent years in several cognitive tasks and are behind new products and features that augment human capabilities. These models have grown several orders of magnitude in size during the last five years. Starting from a few million parameters of the original transformer model all the way to the latest 530 billion-parameter Megatron-Turing model as shown in *Figure 1*. There is a growing need for customers to train and fine tune large models at an unprecedented scale. + +![Large Models](/assets/images/large-model-graph.png){: .align-center} + +*Figure 1: Landscape of large models and hardware capabilities* + +To train these models, users needed to set up and maintain a complex distributed training infrastructure that usually required several manual and error-prone steps. These lead to a subpar experience both in terms of usability and performance. We recently [announced](https://azure.microsoft.com/en-us/blog/azure-empowers-easytouse-highperformance-and-hyperscale-model-training-using-deepspeed/) (update link to Azure blog) how we are making great strides to simplify this and enable easy-to-use and high-performance training at 1K+ GPU scale on Azure. + +In this extended post, we share the details of how DeepSpeed users can train trillion-parameter models with a new easy-to-use, streamlined, scalable, and high-performance distributed training experience on Azure. We also share details of the experimental setup, model configurations, additional performance trends, and guide our users on how to run these experiments in their own environments. + +## Making distributed training faster and easier on Azure using DeepSpeed + +We compare the existing manual and error-prone workflow with our proposed easy-to-use workflow for DeepSpeed on Azure in *Figure 2*. Customers can now use easy-to-use [training pipelines](https://github.com/microsoft/Megatron-DeepSpeed/tree/main/examples) to launch training jobs at scale. The new workflow reduces the number of steps from 11 to just 1 if users rely on the recommended [AzureML](https://azure.microsoft.com/en-us/services/machine-learning/) [recipes](https://github.com/microsoft/Megatron-DeepSpeed/tree/main/examples/azureml). + + +![Workflow](/assets/images/old-vs-new-azure.png){: .align-center} + +*Figure 2: An easy-to-use and streamlined distributed training experience with DeepSpeed on Azure* + +For users who have custom environments built using Azure VMs or [Azure VMSS](https://docs.microsoft.com/en-us/azure/virtual-machine-scale-sets/overview), only two steps are needed: + +- 1) Run the cluster setup script (to be released in the next few weeks) +- 2) Use the Azure VMSS [recipes](https://github.com/microsoft/Megatron-DeepSpeed/tree/main/examples/azure) to launch training. + +## Key Performance Benefits +We already shared a summary of our key performance results in the Azure [announcement](https://azure.microsoft.com/en-us/blog/azure-empowers-easytouse-highperformance-and-hyperscale-model-training-using-deepspeed/). We enable the capability to train 2x larger model sizes (2 trillion vs. 1 trillion parameters), scale to 2x more GPUs (1024 vs. 512), and offer up to 1.8x higher compute throughput/GPU (150 TFLOPs vs. 81 TFLOPs) compared to other [cloud providers](https://medium.com/pytorch/training-a-1-trillion-parameter-model-with-pytorch-fully-sharded-data-parallel-on-aws-3ac13aa96cff). + +DeepSpeed on Azure offers near-linear scalability both in terms of **increase in model size** as well as **increase in number of GPUs**. As shown in *Figure 3a*, together with the DeepSpeed [ZeRO-3](https://www.microsoft.com/en-us/research/blog/zero-infinity-and-deepspeed-unlocking-unprecedented-model-scale-for-deep-learning-training/), its novel CPU offloading capabilities, and a high-performance Azure stack powered by InfiniBand interconnects and A100 GPUs, we were able to maintain an efficient throughput/GPU (>157 TFLOPs) in a near-linear fashion as the model size increases from 175 billion parameters to 2 trillion parameters. On the other hand, for a given model size, e.g., 175B, we achieve near-linear scaling as we increase the number of GPUs from 128 all the way to 1024 as shown in *Figure 3b*. The key takeaway is that Azure and DeepSpeed together are breaking the GPU memory wall and enabling our customers to easily and efficiently train trillion-parameter models at scale. + +![Perf-overview](/assets/images/perf-overview.png){: .align-center} + +*Figure 3: (a) Near-perfect throughput/GPU as we increase the model size from 175 billion to 2 trillion parameters (BS/GPU=8). (b) Near-perfect performance scaling with the increase in number of GPU devices for the 175B model (BS/GPU=16). The sequence length is 1024 for both cases.* + +## Experimental Setup +We share the details of our experimental setup and some of the best practices we followed. The users can either directly use them to reproduce our results or modify them to fit their own setup in terms of model scale as well as the scale of Azure hardware being provisioned. + +### Hardware (Azure instances) + +We used [NDm A100 v4-series](https://docs.microsoft.com/en-us/azure/virtual-machines/ndm-a100-v4-series) instances in our experiments. Each instance includes two socket AMD EPYC 7V12 64-Core CPUs, 1.7TB main memory and eight A100 80GB GPUs. The system has a balanced PCIe topology connecting 4 GPU devices to each CPU socket. Each GPU within the VM is provided with its own dedicated, topology-agnostic 200 Gb/s NVIDIA Mellanox HDR InfiniBand connection providing an accelerated 200 Gbps high speed fabric. The DeepSpeed library exploits offload capabilities where the activation and optimizer states are allocated in the main memory. Hence, 1.7TB memory capacity per node helps us to scale to large model sizes. + +### Training setup using AzureML +Users can directly use the AzureML studio and use our published [recipes](https://github.com/microsoft/Megatron-DeepSpeed/tree/main/examples/azureml) to run experiments without any additional setup. This is the easiest and recommended way of running experiments on Azure. + +### Training setup using Azure VMSS + +Existing VMSS customers and others who have custom Azure VM based environments can follow the setup as follows. The scripts to make these steps easy will be released in the coming weeks. +A cluster is created using Azure Virtual Machine Scale Sets (VMSS) to provision the desired number of compute nodes running the new Azure HPAI VM image specialized for extreme-scale deep learning applications using the software stack listed in *Table 1*. + +| Name | Description (Version) | +| ------------------------------: | :----------------: | +| PyTorch | 1.10.2 (installed from source) | +| DeepSpeed | 0.6.2 (installed from source) | +| Megatron-LM | [https://github.com/microsoft/Megatron-DeepSpeed](https://github.com/microsoft/Megatron-DeepSpeed) | +| Apex | 0.1 | +| NCCL | 2.12.10 | +| CUDNN | 8.2.4.15 | +| CUDA | 11.4 | +| CUDA Driver | R470.82 | +| VM Image | Ubuntu-HPC 20.04 Image | + +*Table 1: Detailed version information of the software packages in the Azure HPC VM image* + +Users can create a VMSS with up to 600 VM instances enabling up to 4,800 A100 GPUs. In addition to the VMSS for the compute nodes, we provision a distinct login node using an inexpensive D4s v4 (or similar) instance with 4-core Intel VCPU, running the same image, for compiling, launching, and monitoring jobs. The login node, compute nodes, and a shared storage filesystem are grouped within an Azure Virtual Network (vnet) allowing VMs to connect to each other over SSH and to shared NFS volume shown in *Figure 4*. + +![VMSS-overview](/assets/images/vmss-setup.png){: .align-center} + +*Figure 4: Organization of our VMSS-based experimental setup* + +## Performance Evaluation on Various Model Configurations + +We ran our experiments with four different model sizes – 175B, 530B, 1T, and 2T – using the configurations shown in *Table 2*. + +| Model Size | 175B | 530B | 1T | 2T | +| :---------: | ---: | ---: | ---: | ---: | +| Number of layers | 96 | 105 | 128 | 160 | +| Hidden Dimension | 12,288 | 20,480 | 25,600 | 32,768 | +| Attention Heads | 96 | 128 | 160 | 128 | + +*Table 2: Model configuration* + +For each of these configurations, we report peak throughput of the system using TFLOPs/GPU as the main performance metric. To calculate TFLOPs, we use the formula used by the Megatron paper as shown below. + +```FLOPs/GPU = 96 * B * s * l * h2 * (1 + s/6h + V/(16*l*h))``` + +B is batch size, s is sequence length, l is the number of layers, h is hidden size, and V is vocabulary size. + +### Scaling the 175B and 530B models +*Figures 5a* and *5b* show the results of 175B model with sequence length 512 and 1024, respectively. We only scale to 512 GPUs for seq-length 512 as adding more GPUs shows similar performance. On the other hand, with sequence length 1024, we saw linear performance increase to 1024 GPUs. Overall, the peak throughput of **204.49 TFLOPs/GPU** was achieved on 256 GPUs with a micro batch size of 32 and sequence length of 512. + +![175b-overview](/assets/images/175b-trend.png){: .align-center} + +*Figure 5: Performance characteristics of 175B model on 512 and 1K GPUs respectively. The colored columns signify different micro batch sizes.* + +Next, we report the 530B model scaling. Previous results on the 530B MT-NLG model using DeepSpeed and Megatron-LM on 280 DGX A100 servers on the Selene supercomputer showed the peak throughput of 126 TFLOPS/GPU. However, we were able to surpass that throughput and achieved up to **171.37 TFLOPs/GPU** on 128 NDm A100 v4-series A100 systems (i.e., 1024 GPUs) as shown in *Figure 6*. + +The benefit of this 530B model is its simpler parallelization configuration as there is no tensor/pipeline parallelism. With ZeRO powered data parallelism, there are fewer heuristics required to optimally configure the distributed model. In addition, the consistent steady state performance of more than 140 TFLOPs/GPU for micro batch sizes >1 demonstrates a robust software and hardware platform. + +![530b-overview](/assets/images/530b-trend.png){: .align-center} + +*Figure 6: Throughput achieved with a 530B parameter model on 512 and 1024 GPUs for micro-batch sizes per GPU of 1, 2, 4, and 8, with sequence length 1,024.* + +### Scaling the 1T and 2T models + +The 1T parameter model contains 128 layers with 160 attention heads. Training such an extreme-scale model is not an easy task. *Figure 7* shows the throughput achieved for each of the model configurations we explored on 512 and 1024 GPUs. Peak throughput achieved was **165.36 TFLOPs/GPU** for micro batch size of 8 across 1024 GPUs and the model reached steady state performance within the first 3-4 iterations. + +![1t-overview](/assets/images/1t-trend.png){: .align-center} + +*Figure 7: Performance characteristics of 1T parameter model on 512 and 1024 GPUs with 1, 2, 4, and 8 micro batch sizes, with sequence length 1,024.*{: .align-center} + +The 2T parameter model consists of 160 layers, 32k hidden dimension, and 128 attention heads. Given the large size of the model and the significant time required on 1024 GPUs, we limited our benchmark runs for the 2T model to a batch size of 8 per GPU with a sequence length of 1024. We were able to achieve 157 TFLOPs/GPU on 1,024 GPUs. + +## How to run training experiments on Azure? + +We recognize that DeepSpeed users are diverse and have different environments. In this tutorial, our focus is on making things simpler for users who plan to run large model training experiments on Azure. + +> The easiest way to do model training on Azure is via the Azure ML recipes. The job submission and data preparation scripts have been made available [here](https://github.com/microsoft/Megatron-DeepSpeed/tree/main/examples/azureml). Users simply need to setup their Azure ML workspace following the [guide](https://github.com/Azure/azureml-examples/tree/main/python-sdk#set-up) and submit experiment using the aml_submit.py file. + +Some users have customized environments built on top of Azure VMs and VMSS based clusters. To simplify training on such setups, we are working on an easy-to-use cluster setup script that will be published in the next few weeks. If you already have a cluster setup running, you can use the [azure recipes](https://github.com/microsoft/Megatron-DeepSpeed/tree/main/examples/azure) for the 175B and the 1T model. The recipes can easily be modified to train other model configurations. + +## Acknowledgement + +This blog post was written by the DeepSpeed team in collaboration with the AzureML and the AzureHPC team. We would like to acknowledge several individuals who made this work possible: +- AzureHPC team: Russell Hewett, Kushal Datta, Prabhat Ram, Jithin Jose, and Nidhi Chappell +- AzureML team: Vijay Aski, Razvan Tanase, Miseon Park, Savita Mittal, Ravi Shankar Kolli, Prasanth Pulavarthi, and Daniel Moth +- DeepSpeed team: Ammar Ahmad Awan, Jeff Rasley, Samyam Rajbhandari, Martin Cai, and Yuxiong He +- CTO office: Gopi Kumar and Luis Vargas diff --git a/docs/assets/images/175b-trend.png b/docs/assets/images/175b-trend.png new file mode 100755 index 0000000000000000000000000000000000000000..6a500d53fb61d0e2b384e14294bbd2575aace848 GIT binary patch literal 90652 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⪙qqSsZ)#XpnfX1`CIyPGh!ayL((r_ESL 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 literal 0 HcmV?d00001 diff --git a/docs/assets/images/1t-trend.png b/docs/assets/images/1t-trend.png new file mode 100755 index 0000000000000000000000000000000000000000..7164eb0819ad2dfec2090af00ec1f0a6def9bb78 GIT binary patch literal 39821 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 literal 0 HcmV?d00001 diff --git a/docs/assets/images/large-model-graph.png b/docs/assets/images/large-model-graph.png new file mode 100755 index 0000000000000000000000000000000000000000..1e82c2d2d455c5a2ecf5569fe2f7d96b9c9b77d6 GIT binary patch literal 142599 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 literal 0 HcmV?d00001 diff --git a/docs/assets/images/old-vs-new-azure.png b/docs/assets/images/old-vs-new-azure.png new file mode 100755 index 0000000000000000000000000000000000000000..2fc710c042e9d333b4fe1f907e63eada00a0386b GIT binary patch literal 507296 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�ZemWkZ? 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%0A`%k?NDFgNe^FdCga@|&DOnA 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

CU^X_qTd#+0oi7XLk@sG2e}|DO+9e{%osKr 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 z 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 literal 0 HcmV?d00001 diff --git a/docs/assets/images/perf-overview.png b/docs/assets/images/perf-overview.png new file mode 100755 index 0000000000000000000000000000000000000000..7c4e08fbc1876114c97fd0c30f97c5d1abe7efb5 GIT binary patch literal 158509 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ÅzCP&qc7 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 z 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 kK}B7Q&)nN7kx!~7HHJD2?&S_K}?s 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 Date: Tue, 26 Jul 2022 09:24:44 -0700 Subject: [PATCH 13/38] Azure blog news item (#2135) --- README.md | 2 +- docs/index.md | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index bd9c7ab05409..0d1f689ee996 100755 --- a/README.md +++ b/README.md @@ -12,11 +12,11 @@ ## Latest News DeepSpeed trained the world's most powerful language models ([MT-530B](https://www.microsoft.com/en-us/research/blog/using-deepspeed-and-megatron-to-train-megatron-turing-nlg-530b-the-worlds-largest-and-most-powerful-generative-language-model/), [BLOOM](https://huggingface.co/blog/bloom-megatron-deepspeed)); [learn how](https://www.deepspeed.ai/tutorials/large-models-w-deepspeed/). +* [2022/07] [Azure and DeepSpeed empower easy-to-use and high-performance model training](https://azure.microsoft.com/en-us/blog/azure-empowers-easytouse-highperformance-and-hyperscale-model-training-using-deepspeed/) * [2022/07] [DeepSpeed Compression: A composable library for extreme compression](https://www.microsoft.com/en-us/research/blog/deepspeed-compression-a-composable-library-for-extreme-compression-and-zero-cost-quantization/) * [2022/03] [Supporting efficient large model training on AMD Instinct GPUs with DeepSpeed](https://cloudblogs.microsoft.com/opensource/2022/03/21/supporting-efficient-large-model-training-on-amd-instinct-gpus-with-deepspeed/) * [2022/03] [Maximizing Communication Efficiency for Large-scale Training via 0/1 Adam](https://www.deepspeed.ai/tutorials/zero-one-adam/) * [2022/01] [DeepSpeed: Advancing MoE inference and training to power next-generation AI scale](https://www.microsoft.com/en-us/research/blog/deepspeed-advancing-moe-inference-and-training-to-power-next-generation-ai-scale/) -* [2021/11] [Autotuning: Automatically discover the optimal DeepSpeed configuration](https://www.deepspeed.ai/news/2021/11/15/autotuning.html) --- diff --git a/docs/index.md b/docs/index.md index b9fa547455d3..e5a512d414c3 100755 --- a/docs/index.md +++ b/docs/index.md @@ -7,11 +7,11 @@ title: "Latest News" --- DeepSpeed trained the world's most powerful language models ([MT-530B](https://www.microsoft.com/en-us/research/blog/using-deepspeed-and-megatron-to-train-megatron-turing-nlg-530b-the-worlds-largest-and-most-powerful-generative-language-model/), [BLOOM](https://huggingface.co/blog/bloom-megatron-deepspeed)); [learn how](https://www.deepspeed.ai/tutorials/large-models-w-deepspeed/). +* [2022/07] [Azure and DeepSpeed empower easy-to-use and high-performance model training](https://azure.microsoft.com/en-us/blog/azure-empowers-easytouse-highperformance-and-hyperscale-model-training-using-deepspeed/) * [2022/07] [DeepSpeed Compression: A composable library for extreme compression](https://www.microsoft.com/en-us/research/blog/deepspeed-compression-a-composable-library-for-extreme-compression-and-zero-cost-quantization/) * [2022/03] [Supporting efficient large model training on AMD Instinct GPUs with DeepSpeed](https://cloudblogs.microsoft.com/opensource/2022/03/21/supporting-efficient-large-model-training-on-amd-instinct-gpus-with-deepspeed/) * [2022/03] [Maximizing Communication Efficiency for Large-scale Training via 0/1 Adam](https://www.deepspeed.ai/tutorials/zero-one-adam/) * [2022/01] [DeepSpeed: Advancing MoE inference and training to power next-generation AI scale](https://www.microsoft.com/en-us/research/blog/deepspeed-advancing-moe-inference-and-training-to-power-next-generation-ai-scale/) -* [2021/11] [Autotuning: Automatically discover the optimal DeepSpeed configuration](https://www.deepspeed.ai/news/2021/11/15/autotuning.html) # Extreme Speed and Scale for DL Training and Inference From 0e49b197ad42987a20858260f0f5b6a5726d0b18 Mon Sep 17 00:00:00 2001 From: Ammar Ahmad Awan Date: Tue, 26 Jul 2022 09:25:28 -0700 Subject: [PATCH 14/38] Update 2022-07-26-deepspeed-azure.md (#2136) Co-authored-by: Jeff Rasley --- docs/_posts/2022-07-26-deepspeed-azure.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/_posts/2022-07-26-deepspeed-azure.md b/docs/_posts/2022-07-26-deepspeed-azure.md index 209bb4a1c9ed..7dee445bcf5a 100644 --- a/docs/_posts/2022-07-26-deepspeed-azure.md +++ b/docs/_posts/2022-07-26-deepspeed-azure.md @@ -13,7 +13,7 @@ Large-scale transformer-based deep learning models trained on large amounts of d *Figure 1: Landscape of large models and hardware capabilities* -To train these models, users needed to set up and maintain a complex distributed training infrastructure that usually required several manual and error-prone steps. These lead to a subpar experience both in terms of usability and performance. We recently [announced](https://azure.microsoft.com/en-us/blog/azure-empowers-easytouse-highperformance-and-hyperscale-model-training-using-deepspeed/) (update link to Azure blog) how we are making great strides to simplify this and enable easy-to-use and high-performance training at 1K+ GPU scale on Azure. +To train these models, users needed to set up and maintain a complex distributed training infrastructure that usually required several manual and error-prone steps. These lead to a subpar experience both in terms of usability and performance. We recently [announced](https://azure.microsoft.com/en-us/blog/azure-empowers-easytouse-highperformance-and-hyperscale-model-training-using-deepspeed/) how we are making great strides to simplify this and enable easy-to-use and high-performance training at 1K+ GPU scale on Azure. In this extended post, we share the details of how DeepSpeed users can train trillion-parameter models with a new easy-to-use, streamlined, scalable, and high-performance distributed training experience on Azure. We also share details of the experimental setup, model configurations, additional performance trends, and guide our users on how to run these experiments in their own environments. From 31582d77287db43b0e08702baf84e9f696096e65 Mon Sep 17 00:00:00 2001 From: TIAN Ye Date: Wed, 27 Jul 2022 02:57:43 +0800 Subject: [PATCH 15/38] Fix conflict between Tutel and top-2 gate in MoE layer (#2053) * fix conflit between tutel and top-2 gate Co-authored-by: Ammar Ahmad Awan Co-authored-by: Jeff Rasley --- deepspeed/moe/sharded_moe.py | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/deepspeed/moe/sharded_moe.py b/deepspeed/moe/sharded_moe.py index f9da6eb9d350..091ca2b54a24 100644 --- a/deepspeed/moe/sharded_moe.py +++ b/deepspeed/moe/sharded_moe.py @@ -471,13 +471,17 @@ def __init__(self, self.timers = SynchronizedWallClockTimer() self.wall_clock_breakdown = False - self.use_tutel = use_tutel and TUTEL_INSTALLED + self.use_tutel = use_tutel and TUTEL_INSTALLED and gate.k == 1 if self.use_tutel: logger.info('Using Tutel optimizations.') elif use_tutel and not TUTEL_INSTALLED: logger.warning("Tutel optimization requested but not installed. " "Proceeding without Tutel.") + elif use_tutel and TUTEL_INSTALLED and gate.k != 1: + logger.warning( + "To enable Tutel optimization, use top-1 instead of top-2 gate. " + "Proceeding without Tutel.") def _set_ep_group(self, ep_group): self.ep_group = ep_group From 9f3a540d0305dbcdca353067f0f10ccc459978ba Mon Sep 17 00:00:00 2001 From: Sourab Mangrulkar <13534540+pacman100@users.noreply.github.com> Date: Wed, 27 Jul 2022 01:25:21 +0530 Subject: [PATCH 16/38] adding HF Accelerate+DS tests workflow (#2134) Co-authored-by: Jeff Rasley --- .github/workflows/nv-accelerate-v100.yml | 58 ++++++++++++++++++++++++ 1 file changed, 58 insertions(+) create mode 100644 .github/workflows/nv-accelerate-v100.yml diff --git a/.github/workflows/nv-accelerate-v100.yml b/.github/workflows/nv-accelerate-v100.yml new file mode 100644 index 000000000000..20743dc6d858 --- /dev/null +++ b/.github/workflows/nv-accelerate-v100.yml @@ -0,0 +1,58 @@ +name: nv-accelerate-v100 + +on: + push: + branches: + - 'master' + - 'staging**' + paths-ignore: + - 'docs/**' + pull_request: + paths-ignore: + - 'docs/**' + +concurrency: + group: ${{ github.workflow }}-${{ github.ref }} + cancel-in-progress: true + +jobs: + unit-tests: + runs-on: [self-hosted, nvidia, cu111, v100] + + steps: + - uses: actions/checkout@v2 + + - name: environment + run: | + nvidia-smi + which python + python --version + which nvcc + nvcc --version + pip install --upgrade pip + pip uninstall --yes torch torchvision + pip install torch==1.8.2+cu111 torchvision==0.9.2+cu111 -f https://download.pytorch.org/whl/lts/1.8/torch_lts.html + python -c "import torch; print('torch:', torch.__version__, torch)" + python -c "import torch; print('CUDA available:', torch.cuda.is_available())" + + - name: Python environment + run: | + pip list + + - name: Install deepspeed + run: | + pip uninstall --yes deepspeed + pip install .[dev,autotuning] + ds_report + + - name: HF Accelerate tests + run: | + if [[ -d ./torch-extensions ]]; then rm -rf ./torch-extensions; fi + git clone https://github.com/huggingface/accelerate + cd accelerate + # installing dependencies + pip install .[testing] + # force protobuf version due to issues + pip install "protobuf<4.21.0" + pip list + TORCH_EXTENSIONS_DIR=./torch-extensions pytest --color=yes --durations=0 --verbose tests/deepspeed From d9ec8ef49ad62db0a95bfe88839b0abf8d9ce5a9 Mon Sep 17 00:00:00 2001 From: Ammar Ahmad Awan Date: Tue, 26 Jul 2022 12:55:53 -0700 Subject: [PATCH 17/38] Update 2022-07-26-deepspeed-azure.md (#2138) Co-authored-by: Jeff Rasley --- docs/_posts/2022-07-26-deepspeed-azure.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/_posts/2022-07-26-deepspeed-azure.md b/docs/_posts/2022-07-26-deepspeed-azure.md index 7dee445bcf5a..c95203904dd3 100644 --- a/docs/_posts/2022-07-26-deepspeed-azure.md +++ b/docs/_posts/2022-07-26-deepspeed-azure.md @@ -129,7 +129,7 @@ Some users have customized environments built on top of Azure VMs and VMSS based ## Acknowledgement This blog post was written by the DeepSpeed team in collaboration with the AzureML and the AzureHPC team. We would like to acknowledge several individuals who made this work possible: -- AzureHPC team: Russell Hewett, Kushal Datta, Prabhat Ram, Jithin Jose, and Nidhi Chappell +- AzureHPC team: Russell J. Hewett, Kushal Datta, Prabhat Ram, Jithin Jose, and Nidhi Chappell - AzureML team: Vijay Aski, Razvan Tanase, Miseon Park, Savita Mittal, Ravi Shankar Kolli, Prasanth Pulavarthi, and Daniel Moth - DeepSpeed team: Ammar Ahmad Awan, Jeff Rasley, Samyam Rajbhandari, Martin Cai, and Yuxiong He - CTO office: Gopi Kumar and Luis Vargas From ddd2113d213d554648c4a5a1c779b9236c9c4ff0 Mon Sep 17 00:00:00 2001 From: Jeff Rasley Date: Tue, 26 Jul 2022 13:26:00 -0700 Subject: [PATCH 18/38] turn off time check for now (#2142) --- tests/unit/test_inference.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/tests/unit/test_inference.py b/tests/unit/test_inference.py index c53c817abdf5..90586dee16ac 100644 --- a/tests/unit/test_inference.py +++ b/tests/unit/test_inference.py @@ -255,7 +255,7 @@ def _go(): # These performance tests are only measuring the time for a single # inference request, we just want to check that performance isn't terrible - assert ds_time <= (bs_time * 1.1) + #assert ds_time <= (bs_time * 1.1) assert assert_fn(bs_output, ds_output) _go() @@ -318,7 +318,7 @@ def _go(): ppl_diff = abs(bs_output["results"][task]["ppl"] - ds_output["results"][task]["ppl"]) - assert ds_time <= bs_time + #assert ds_time <= bs_time assert ppl_diff < 0.01 _go() From 5bd09a8f83fd2ed58d8410476c51c3e5cad3434b Mon Sep 17 00:00:00 2001 From: Jeff Rasley Date: Tue, 26 Jul 2022 13:31:48 -0700 Subject: [PATCH 19/38] Allow turning off loss scaling wrt GAS + update tput calculator (#2140) --- deepspeed/runtime/engine.py | 12 ++++++++++-- deepspeed/utils/timer.py | 6 +++++- 2 files changed, 15 insertions(+), 3 deletions(-) diff --git a/deepspeed/runtime/engine.py b/deepspeed/runtime/engine.py index 39c214c791d9..559587dd6ce3 100644 --- a/deepspeed/runtime/engine.py +++ b/deepspeed/runtime/engine.py @@ -229,6 +229,7 @@ def __init__( global dist from deepspeed import comm as dist self._is_gradient_accumulation_boundary = None + self.scale_wrt_gas = None # for debug purposes - can then debug print: debug_get_module_name(module) debug_extract_module_and_param_names(model) @@ -1693,7 +1694,11 @@ def allreduce_gradients(self, bucket_size=MEMORY_OPT_ALLREDUCE_SIZE): self.buffered_allreduce_fallback(elements_per_buffer=bucket_size) @instrument_w_nvtx - def backward(self, loss, allreduce_gradients=True, release_loss=False): + def backward(self, + loss, + allreduce_gradients=True, + release_loss=False, + scale_wrt_gas=True): r"""Execute backward pass on the loss Arguments: loss: Torch tensor on which to execute backward propagation @@ -1702,13 +1707,16 @@ def backward(self, loss, allreduce_gradients=True, release_loss=False): see_memory_usage("Engine before backward", force=self.memory_breakdown()) + if self.scale_wrt_gas is not None: + scale_wrt_gas = self.scale_wrt_gas + if not allreduce_gradients: logger.warning( f"Argument `allreduce_gradients` is deprecated, ignored, and will soon be removed" ) # scale loss w.r.t. gradient accumulation if needed - if self.gradient_accumulation_steps() > 1: + if self.gradient_accumulation_steps() > 1 and scale_wrt_gas: loss = self._scale_loss_by_gas(loss.float()) # Log training Loss diff --git a/deepspeed/utils/timer.py b/deepspeed/utils/timer.py index 9ba150dd0d80..ae5174508457 100755 --- a/deepspeed/utils/timer.py +++ b/deepspeed/utils/timer.py @@ -190,13 +190,17 @@ def stop(self, report_speed=True): self.end_time = time.time() duration = self.end_time - self.start_time self.total_elapsed_time += duration + + curr_samples_sec = (self.batch_size * self.num_workers) / duration + if self.local_step_count % self.steps_per_output == 0: if report_speed: self.logging( - "{}/{}, SamplesPerSec={}, MemAllocated={}GB, MaxMemAllocated={}GB" + "{}/{}, RunningAvgSamplesPerSec={}, CurrSamplesPerSec={}, MemAllocated={}GB, MaxMemAllocated={}GB" .format(self.epoch_count, self.local_step_count, self.avg_samples_per_sec(), + curr_samples_sec, round(torch.cuda.memory_allocated() / 1024**3, 2), round(torch.cuda.max_memory_allocated() / 1024**3, From 84dbe7c693f007c54f14405a6c90b165827cf71a Mon Sep 17 00:00:00 2001 From: Jeff Rasley Date: Tue, 26 Jul 2022 14:43:53 -0700 Subject: [PATCH 20/38] [docs] add details about install reqs (#2143) --- README.md | 14 +++++++++++--- 1 file changed, 11 insertions(+), 3 deletions(-) diff --git a/README.md b/README.md index 0d1f689ee996..b49e4573046e 100755 --- a/README.md +++ b/README.md @@ -114,8 +114,15 @@ just-in-time (JIT) using [torch's JIT C++ extension loader that relies on ninja](https://pytorch.org/docs/stable/cpp_extension.html) to build and dynamically link them at runtime. -**Note:** [PyTorch](https://pytorch.org/) must be installed _before_ installing -DeepSpeed. +## Requirements +* [PyTorch](https://pytorch.org/) must be installed _before_ installing DeepSpeed. +* For full feature support we recommend a version of PyTorch that is >= 1.8 and ideally the latest PyTorch stable release. +* Specific GPUs we develop and test against are listed below, this doesn't mean your GPU will not work if it doesn't fall into this category it's just DeepSpeed is most well tested on the following: + * NVIDIA: Pascal, Volta, and Ampere architectures + * AMD: MI100 and MI200 + +## PyPI +We regularly push releases to [PyPI](https://pypi.org/project/deepspeed/) and encourage users to install from there in most cases. ```bash pip install deepspeed @@ -132,7 +139,8 @@ If you would like to pre-install any of the DeepSpeed extensions/ops (instead of JIT compiling) or install pre-compiled ops via PyPI please see our [advanced installation instructions](https://www.deepspeed.ai/tutorials/advanced-install/). -On Windows you can build wheel with following steps, currently only inference mode is supported. +## Windows +Windows support is partially supported with DeepSpeed. On Windows you can build wheel with following steps, currently only inference mode is supported. 1. Install pytorch, such as pytorch 1.8 + cuda 11.1 2. Install visual cpp build tools, such as VS2019 C++ x64/x86 build tools 3. Launch cmd console with Administrator privilege for creating required symlink folders From 56a0d186bbe5bab769c8cddebf1cb95869644a62 Mon Sep 17 00:00:00 2001 From: Jeff Rasley Date: Tue, 26 Jul 2022 16:31:10 -0700 Subject: [PATCH 21/38] [docs] update build pipeline badges --- README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index b49e4573046e..c6acfdea550c 100755 --- a/README.md +++ b/README.md @@ -98,10 +98,10 @@ DeepSpeed has been integrated with several different popular open-source DL fram | Description | Status | | ----------- | ------ | -| NVIDIA | [![nv-torch12-p40](https://github.com/microsoft/DeepSpeed/actions/workflows/nv-torch12-p40.yml/badge.svg)](https://github.com/microsoft/DeepSpeed/actions/workflows/nv-torch12-p40.yml) [![nv-torch18-v100](https://github.com/microsoft/DeepSpeed/actions/workflows/nv-torch18-v100.yml/badge.svg)](https://github.com/microsoft/DeepSpeed/actions/workflows/nv-torch18-v100.yml) [![nv-torch-latest-v100](https://github.com/microsoft/DeepSpeed/actions/workflows/nv-torch-latest-v100.yml/badge.svg)](https://github.com/microsoft/DeepSpeed/actions/workflows/nv-torch-latest-v100.yml) | +| NVIDIA | [![nv-torch12-p40](https://github.com/microsoft/DeepSpeed/actions/workflows/nv-torch12-p40.yml/badge.svg)](https://github.com/microsoft/DeepSpeed/actions/workflows/nv-torch12-p40.yml) [![nv-torch18-v100](https://github.com/microsoft/DeepSpeed/actions/workflows/nv-torch18-v100.yml/badge.svg)](https://github.com/microsoft/DeepSpeed/actions/workflows/nv-torch18-v100.yml) [![nv-torch-latest-v100](https://github.com/microsoft/DeepSpeed/actions/workflows/nv-torch-latest-v100.yml/badge.svg)](https://github.com/microsoft/DeepSpeed/actions/workflows/nv-torch-latest-v100.yml) [![nv-inference](https://github.com/microsoft/DeepSpeed/actions/workflows/nv-inference.yml/badge.svg)](https://github.com/microsoft/DeepSpeed/actions/workflows/nv-inference.yml) | | AMD | [![amd](https://github.com/microsoft/DeepSpeed/actions/workflows/amd.yml/badge.svg)](https://github.com/microsoft/DeepSpeed/actions/workflows/amd.yml) | | PyTorch Nightly | [![nv-torch-nightly-v100](https://github.com/microsoft/DeepSpeed/actions/workflows/nv-torch-nightly-v100.yml/badge.svg)](https://github.com/microsoft/DeepSpeed/actions/workflows/nv-torch-nightly-v100.yml) | -| Integrations | [![nv-transformers-v100](https://github.com/microsoft/DeepSpeed/actions/workflows/nv-transformers-v100.yml/badge.svg)](https://github.com/microsoft/DeepSpeed/actions/workflows/nv-transformers-v100.yml) [![nv-lightning-v100](https://github.com/microsoft/DeepSpeed/actions/workflows/nv-lightning-v100.yml/badge.svg)](https://github.com/microsoft/DeepSpeed/actions/workflows/nv-lightning-v100.yml) | +| Integrations | [![nv-transformers-v100](https://github.com/microsoft/DeepSpeed/actions/workflows/nv-transformers-v100.yml/badge.svg)](https://github.com/microsoft/DeepSpeed/actions/workflows/nv-transformers-v100.yml) [![nv-lightning-v100](https://github.com/microsoft/DeepSpeed/actions/workflows/nv-lightning-v100.yml/badge.svg)](https://github.com/microsoft/DeepSpeed/actions/workflows/nv-lightning-v100.yml) [![nv-accelerate-v100](https://github.com/microsoft/DeepSpeed/actions/workflows/nv-accelerate-v100.yml/badge.svg)](https://github.com/microsoft/DeepSpeed/actions/workflows/nv-accelerate-v100.yml) | | Misc | [![Formatting](https://github.com/microsoft/DeepSpeed/actions/workflows/formatting.yml/badge.svg)](https://github.com/microsoft/DeepSpeed/actions/workflows/formatting.yml) [![pages-build-deployment](https://github.com/microsoft/DeepSpeed/actions/workflows/pages/pages-build-deployment/badge.svg)](https://github.com/microsoft/DeepSpeed/actions/workflows/pages/pages-build-deployment) [![Documentation Status](https://readthedocs.org/projects/deepspeed/badge/?version=latest)](https://deepspeed.readthedocs.io/en/latest/?badge=latest)| # Installation From 76a01d5d0b06cda022ffd4bead9e172a1cf3f5ca Mon Sep 17 00:00:00 2001 From: Jeff Rasley Date: Tue, 26 Jul 2022 16:34:59 -0700 Subject: [PATCH 22/38] [docs] README formatting fix --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index c6acfdea550c..73e83653e248 100755 --- a/README.md +++ b/README.md @@ -101,7 +101,7 @@ DeepSpeed has been integrated with several different popular open-source DL fram | NVIDIA | [![nv-torch12-p40](https://github.com/microsoft/DeepSpeed/actions/workflows/nv-torch12-p40.yml/badge.svg)](https://github.com/microsoft/DeepSpeed/actions/workflows/nv-torch12-p40.yml) [![nv-torch18-v100](https://github.com/microsoft/DeepSpeed/actions/workflows/nv-torch18-v100.yml/badge.svg)](https://github.com/microsoft/DeepSpeed/actions/workflows/nv-torch18-v100.yml) [![nv-torch-latest-v100](https://github.com/microsoft/DeepSpeed/actions/workflows/nv-torch-latest-v100.yml/badge.svg)](https://github.com/microsoft/DeepSpeed/actions/workflows/nv-torch-latest-v100.yml) [![nv-inference](https://github.com/microsoft/DeepSpeed/actions/workflows/nv-inference.yml/badge.svg)](https://github.com/microsoft/DeepSpeed/actions/workflows/nv-inference.yml) | | AMD | [![amd](https://github.com/microsoft/DeepSpeed/actions/workflows/amd.yml/badge.svg)](https://github.com/microsoft/DeepSpeed/actions/workflows/amd.yml) | | PyTorch Nightly | [![nv-torch-nightly-v100](https://github.com/microsoft/DeepSpeed/actions/workflows/nv-torch-nightly-v100.yml/badge.svg)](https://github.com/microsoft/DeepSpeed/actions/workflows/nv-torch-nightly-v100.yml) | -| Integrations | [![nv-transformers-v100](https://github.com/microsoft/DeepSpeed/actions/workflows/nv-transformers-v100.yml/badge.svg)](https://github.com/microsoft/DeepSpeed/actions/workflows/nv-transformers-v100.yml) [![nv-lightning-v100](https://github.com/microsoft/DeepSpeed/actions/workflows/nv-lightning-v100.yml/badge.svg)](https://github.com/microsoft/DeepSpeed/actions/workflows/nv-lightning-v100.yml) [![nv-accelerate-v100](https://github.com/microsoft/DeepSpeed/actions/workflows/nv-accelerate-v100.yml/badge.svg)](https://github.com/microsoft/DeepSpeed/actions/workflows/nv-accelerate-v100.yml) | +| Integrations | [![nv-transformers-v100](https://github.com/microsoft/DeepSpeed/actions/workflows/nv-transformers-v100.yml/badge.svg)](https://github.com/microsoft/DeepSpeed/actions/workflows/nv-transformers-v100.yml) [![nv-lightning-v100](https://github.com/microsoft/DeepSpeed/actions/workflows/nv-lightning-v100.yml/badge.svg)](https://github.com/microsoft/DeepSpeed/actions/workflows/nv-lightning-v100.yml) [![nv-accelerate-v100](https://github.com/microsoft/DeepSpeed/actions/workflows/nv-accelerate-v100.yml/badge.svg)](https://github.com/microsoft/DeepSpeed/actions/workflows/nv-accelerate-v100.yml) | | Misc | [![Formatting](https://github.com/microsoft/DeepSpeed/actions/workflows/formatting.yml/badge.svg)](https://github.com/microsoft/DeepSpeed/actions/workflows/formatting.yml) [![pages-build-deployment](https://github.com/microsoft/DeepSpeed/actions/workflows/pages/pages-build-deployment/badge.svg)](https://github.com/microsoft/DeepSpeed/actions/workflows/pages/pages-build-deployment) [![Documentation Status](https://readthedocs.org/projects/deepspeed/badge/?version=latest)](https://deepspeed.readthedocs.io/en/latest/?badge=latest)| # Installation From 6f7137cb2390ca6de0a0bf2430fbb84e4070af12 Mon Sep 17 00:00:00 2001 From: Jim Wu Date: Tue, 26 Jul 2022 17:39:01 -0700 Subject: [PATCH 23/38] fix broken links (#2144) --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 73e83653e248..7e762ce96954 100755 --- a/README.md +++ b/README.md @@ -148,7 +148,7 @@ Windows support is partially supported with DeepSpeed. On Windows you can build # Features -Please checkout [DeepSpeed-Training](https://www.deepspeed.ai/docs/training), [DeepSpeed-Inference](https://www.deepspeed.ai/docs/inference) and [DeepSpeed-Compression](https://www.deepspeed.ai/docs/compression) pages for full set of features offered along each of these three pillars. +Please checkout [DeepSpeed-Training](https://www.deepspeed.ai/training), [DeepSpeed-Inference](https://www.deepspeed.ai/inference) and [DeepSpeed-Compression](https://www.deepspeed.ai/compression) pages for full set of features offered along each of these three pillars. # Further Reading From 59975896830e8e51c296d072e857a35a71683185 Mon Sep 17 00:00:00 2001 From: Michael Wyatt Date: Wed, 27 Jul 2022 06:41:29 -0700 Subject: [PATCH 24/38] Refactor ZeRO configs to use Pydantic (#2004) * first pass at pydanticifying Zero Configs * added pydantic to reqs * fixed bug with deprecated values not being type-checked * fixing zero config bugs from unit tests * fixed access of Config values * removing zero constants * formatting/fix broken import * fixed bad merge * fixed issue with missing aliased field * fix for failing tests * fix how deprecated fields are processed * only process dep params when they are set * fix mistyped field name * fixes, docs, removed more constants * fix merge * more fixes after merge w master * added unit tests * formatting * added fix for transformers unit tests * separated offload config from zero config * fixed bad import * formatting and flake fixes * implement suggestion from review Co-authored-by: Olatunji Ruwase Co-authored-by: Jeff Rasley --- deepspeed/autotuning/autotuner.py | 65 ++-- deepspeed/runtime/config.py | 23 +- deepspeed/runtime/config_utils.py | 82 ++++- deepspeed/runtime/engine.py | 19 +- .../runtime/swap_tensor/optimizer_utils.py | 8 +- .../swap_tensor/partitioned_param_swapper.py | 7 +- .../pipelined_optimizer_swapper.py | 7 +- deepspeed/runtime/zero/config.py | 321 +++++++----------- deepspeed/runtime/zero/constants.py | 173 ---------- deepspeed/runtime/zero/offload_config.py | 111 +++--- deepspeed/runtime/zero/offload_constants.py | 69 ---- deepspeed/runtime/zero/parameter_offload.py | 9 +- .../runtime/zero/partition_parameters.py | 47 ++- .../zero/partitioned_param_coordinator.py | 6 +- deepspeed/runtime/zero/stage3.py | 39 +-- deepspeed/runtime/zero/stage_1_and_2.py | 10 +- tests/unit/test_config.py | 6 +- tests/unit/test_ds_config.py | 51 +++ tests/unit/test_zero_config.py | 72 ++++ 19 files changed, 480 insertions(+), 645 deletions(-) mode change 100755 => 100644 deepspeed/runtime/zero/config.py delete mode 100755 deepspeed/runtime/zero/constants.py delete mode 100644 deepspeed/runtime/zero/offload_constants.py create mode 100755 tests/unit/test_zero_config.py diff --git a/deepspeed/autotuning/autotuner.py b/deepspeed/autotuning/autotuner.py index 99de3fdcab5f..64a849e69114 100755 --- a/deepspeed/autotuning/autotuner.py +++ b/deepspeed/autotuning/autotuner.py @@ -7,7 +7,9 @@ from ..runtime.config_utils import dict_raise_error_on_duplicate_keys from ..runtime.constants import * -from ..runtime.zero.constants import * + +from ..runtime.zero.config import DeepSpeedZeroConfig, ZERO_OPTIMIZATION, ZeroStageEnum +from ..utils import logger from .config import DeepSpeedAutotuningConfig from .constants import * from .scheduler import ResourceManager @@ -260,18 +262,18 @@ def get_instantiation_memory_required_per_gpu(self, zero_stage): if not num_params: return 0 # assume the model uses Adam optimizer - # ZERO_OPTIMIZATION_DISABLED: + # ZeroStageEnum.disabled: params_mem = num_params * (2 if fp16_enabled else 4) gradients_mem = num_params * (2 if fp16_enabled else 4) optimizer_mem = num_params * (16 if fp16_enabled else 8) - if zero_stage >= ZERO_OPTIMIZATION_OPTIMIZER_STATES: + if zero_stage >= ZeroStageEnum.optimizer_states: optimizer_mem = optimizer_mem / total_gpus - if zero_stage >= ZERO_OPTIMIZATION_GRADIENTS: + if zero_stage >= ZeroStageEnum.gradients: gradients_mem = gradients_mem / total_gpus - if zero_stage >= ZERO_OPTIMIZATION_WEIGHTS: + if zero_stage >= ZeroStageEnum.weights: params_mem = params_mem / total_gpus mem_per_gpu = (params_mem + gradients_mem + optimizer_mem) / self.mp_size() @@ -301,8 +303,8 @@ def _generate_experiments(self, tuning_space, max_train_batch_size_per_gpu): exps = [] # each zero stage uses a different template configuration file - config_zero = tuning_space.get(ZERO_OPTIMIZATION, {}) - stage = config_zero.get(ZERO_OPTIMIZATION_STAGE, None) + config_zero = tuning_space.zero_optimization + stage = config_zero.stage template_config = {} if stage == 0: template_path = DEFAULT_TEMPLATE_PATH_ZERO_0 @@ -325,12 +327,11 @@ def _generate_experiments(self, tuning_space, max_train_batch_size_per_gpu): model_info = self.model_info if model_info and "hidden_size" in model_info: hs = model_info["hidden_size"] + template_config[ZERO_OPTIMIZATION]['reduce_bucket_size'] = hs * hs template_config[ZERO_OPTIMIZATION][ - ZERO_OPTIMIZATION_REDUCE_BUCKET_SIZE] = hs * hs - template_config[ZERO_OPTIMIZATION][ - ZERO_OPTIMIZATION_PREFETCH_BUCKET_SIZE] = 0.9 * hs * hs + 'stage3_prefetch_bucket_size'] = 0.9 * hs * hs template_config[ZERO_OPTIMIZATION][ - ZERO_OPTIMIZATION_PARAM_PERSISTENCE_THRESHOLD] = 10 * hs + 'stage3_param_persistence_threshold'] = 10 * hs prefix = "z3_" else: return exps @@ -363,12 +364,12 @@ def _generate_experiments(self, tuning_space, max_train_batch_size_per_gpu): # if the config does not use offloading, remove the offloading section config_zero = config.get(ZERO_OPTIMIZATION, None) if config_zero: - if OFFLOAD_OPTIMIZER not in config_zero and OFFLOAD_OPTIMIZER in exp_config[ + if not config_zero.offload_optimizer and 'offload_optimizer' in exp_config[ ZERO_OPTIMIZATION]: - del exp_config[ZERO_OPTIMIZATION][OFFLOAD_OPTIMIZER] - if OFFLOAD_PARAM not in config_zero and OFFLOAD_PARAM in exp_config[ + del exp_config[ZERO_OPTIMIZATION]['offload_optimizer'] + if not config_zero.offload_param and 'offload_param' in exp_config[ ZERO_OPTIMIZATION]: - del exp_config[ZERO_OPTIMIZATION][OFFLOAD_PARAM] + del exp_config[ZERO_OPTIMIZATION]['offload_param'] # set gradient accumulation steps according to max_train_batch_size_per_gpu mbs = exp_config[TRAIN_MICRO_BATCH_SIZE_PER_GPU] @@ -414,9 +415,7 @@ def tune(self): f"The model requires at least {memory_to_string(self.activation_mem, postfix='B')} activation memory for micro batch size 1." ) - stage = self.user_config.get(ZERO_OPTIMIZATION, - {}).get(ZERO_OPTIMIZATION_STAGE, - "all") + stage = self.user_config.zero_optimization.stage if 'stage' in self.user_config.zero_optimization.__fields_set__ else "all" user_zero_stages = [stage] if not isinstance(stage, list) else stage logger.info(f"User-defined zero stages are {stage}.") @@ -425,9 +424,9 @@ def tune(self): metric_val = 0 required_gpu_mem = self.get_instantiation_memory_required_per_gpu( - ZERO_OPTIMIZATION_DISABLED) + self.activation_mem + ZeroStageEnum.disabled) + self.activation_mem if self.gpu_mem > required_gpu_mem: - if "all" in user_zero_stages or ZERO_OPTIMIZATION_DISABLED in user_zero_stages: + if "all" in user_zero_stages or ZeroStageEnum.disabled in user_zero_stages: logger.info( f"The model might be runable with ZERO 0 (which requires at least {memory_to_string(required_gpu_mem, postfix='B')} memory with mbs = 1), adding DEFAULT_TUNING_SPACE_ZERO_0 to the global tuning space" ) @@ -439,13 +438,13 @@ def tune(self): metric_val = next_metric_val else: logger.info( - f"The model is not runable with ZERO stage {ZERO_OPTIMIZATION_DISABLED} (which requires at least {memory_to_string(required_gpu_mem, postfix='B')} memory with mbs = 1)" + f"The model is not runable with ZERO stage {ZeroStageEnum.disabled} (which requires at least {memory_to_string(required_gpu_mem, postfix='B')} memory with mbs = 1)" ) required_gpu_mem = self.get_instantiation_memory_required_per_gpu( - ZERO_OPTIMIZATION_OPTIMIZER_STATES) + self.activation_mem + ZeroStageEnum.optimizer_states) + self.activation_mem if self.gpu_mem > required_gpu_mem: - if "all" in user_zero_stages or ZERO_OPTIMIZATION_OPTIMIZER_STATES in user_zero_stages: + if "all" in user_zero_stages or ZeroStageEnum.optimizer_states in user_zero_stages: logger.info( f"The model might be runable with ZERO 1 (which requires at least {memory_to_string(required_gpu_mem, postfix='B')} memory), adding DEFAULT_TUNING_SPACE_ZERO_1 to the global tuning space" ) @@ -457,13 +456,13 @@ def tune(self): metric_val = next_metric_val else: logger.info( - f"The model is not runable with ZERO stage {ZERO_OPTIMIZATION_OPTIMIZER_STATES} (which requires at least {memory_to_string(required_gpu_mem, postfix='B')} memory with mbs = 1)" + f"The model is not runable with ZERO stage {ZeroStageEnum.optimizer_states} (which requires at least {memory_to_string(required_gpu_mem, postfix='B')} memory with mbs = 1)" ) required_gpu_mem = self.get_instantiation_memory_required_per_gpu( - ZERO_OPTIMIZATION_GRADIENTS) + self.activation_mem + ZeroStageEnum.gradients) + self.activation_mem if self.gpu_mem > required_gpu_mem: - if "all" in user_zero_stages or ZERO_OPTIMIZATION_GRADIENTS in user_zero_stages: + if "all" in user_zero_stages or ZeroStageEnum.gradients in user_zero_stages: logger.info( f"The model might be runable with ZERO 2 (which requires at least {memory_to_string(required_gpu_mem, postfix='B')} memory), adding DEFAULT_TUNING_SPACE_ZERO_2 to the global tuning space" ) @@ -475,13 +474,13 @@ def tune(self): metric_val = next_metric_val else: logger.info( - f"The model is not runable with ZERO stage {ZERO_OPTIMIZATION_GRADIENTS} (which requires at least {memory_to_string(required_gpu_mem, postfix='B')} memory with mbs = 1)" + f"The model is not runable with ZERO stage {ZeroStageEnum.gradients} (which requires at least {memory_to_string(required_gpu_mem, postfix='B')} memory with mbs = 1)" ) required_gpu_mem = self.get_instantiation_memory_required_per_gpu( - ZERO_OPTIMIZATION_WEIGHTS) + self.activation_mem + ZeroStageEnum.weights) + self.activation_mem if self.gpu_mem > required_gpu_mem: - if "all" in user_zero_stages or ZERO_OPTIMIZATION_WEIGHTS in user_zero_stages: + if "all" in user_zero_stages or ZeroStageEnum.weights in user_zero_stages: logger.info( f"The model might be runable with ZERO 3 (which requires at least {memory_to_string(required_gpu_mem, postfix='B')} memory), adding DEFAULT_TUNING_SPACE_ZERO_3 to the global tuning space" ) @@ -489,7 +488,7 @@ def tune(self): DEFAULT_TUNING_SPACE_ZERO_3, prev_max_mbs = max_mbs, prev_best_mbs=mbs, prev_best_metric_val=metric_val) else: logger.info( - f"The model has {self.get_model_num_params()} parameters and requires at least {memory_to_string(required_gpu_mem, postfix='B')} memory per GPU with DeepSpeed Zero stage {ZERO_OPTIMIZATION_WEIGHTS} optimization. Memory per GPU in system is {memory_to_string(self.gpu_mem)}. No tuning is performed." + f"The model has {self.get_model_num_params()} parameters and requires at least {memory_to_string(required_gpu_mem, postfix='B')} memory per GPU with DeepSpeed Zero stage {ZeroStageEnum.weights} optimization. Memory per GPU in system is {memory_to_string(self.gpu_mem)}. No tuning is performed." ) return @@ -499,7 +498,7 @@ def tune_space(self, prev_best_mbs=0, prev_best_metric_val=0): config_zero = tuning_space.get(ZERO_OPTIMIZATION, {}) - stage = config_zero.get(ZERO_OPTIMIZATION_STAGE, ZERO_OPTIMIZATION_STAGE_DEFAULT) + stage = config_zero.stage tuning_space_name = TUNING_MICRO_BATCH_SIZE_PREFIX + str(stage) tuning_micro_batch_sizes = [] max_train_batch_size_per_gpu = 0 @@ -753,7 +752,7 @@ def run_tuning_micro_batch_sizes(self, max_micro_batch_size_metric_val = 0 ds_config = get_first_config(self.user_config) - ds_config[ZERO_OPTIMIZATION] = {ZERO_OPTIMIZATION_STAGE: stage} + ds_config[ZERO_OPTIMIZATION] = DeepSpeedZeroConfig(stage=stage) tuning_space_name = TUNING_MICRO_BATCH_SIZE_PREFIX + str(stage) exp_paths = [] @@ -852,7 +851,7 @@ def get_min_max_micro_batch_size(self, tuning_space_name = TUNING_MICRO_BATCH_SIZE_PREFIX + str(stage) ds_config = get_first_config(self.user_config) - ds_config[ZERO_OPTIMIZATION] = {ZERO_OPTIMIZATION_STAGE: stage} + ds_config[ZERO_OPTIMIZATION] = DeepSpeedZeroConfig(stage=stage) gas = self.get_gas_from_user_config() ds_config[GRADIENT_ACCUMULATION_STEPS] = gas diff --git a/deepspeed/runtime/config.py b/deepspeed/runtime/config.py index f4e627cf58d2..24ea5a01efbd 100755 --- a/deepspeed/runtime/config.py +++ b/deepspeed/runtime/config.py @@ -21,8 +21,7 @@ dict_raise_error_on_duplicate_keys, ScientificNotationEncoder, ) -from .zero.config import DeepSpeedZeroConfig -from .zero.constants import * +from .zero.config import get_zero_config, ZeroStageEnum from .activation_checkpointing.config import DeepSpeedActivationCheckpointingConfig from ..comm.config import DeepSpeedCommsConfig from ..monitor.config import DeepSpeedMonitorConfig @@ -225,18 +224,6 @@ def get_sparse_gradients_enabled(param_dict): return get_scalar_param(param_dict, SPARSE_GRADIENTS, SPARSE_GRADIENTS_DEFAULT) -def get_zero_optimization(param_dict): - return get_scalar_param(param_dict, ZERO_OPTIMIZATION, ZERO_OPTIMIZATION_DEFAULT) - - -def get_zero_reduce_scatter(param_dict): - return get_scalar_param( - param_dict, - ZERO_OPTIMIZATION_REDUCE_SCATTER, - ZERO_OPTIMIZATION_REDUCE_SCATTER_DEFAULT, - ) - - def get_communication_data_type(param_dict): val = get_scalar_param(param_dict, COMMUNICATION_DATA_TYPE, @@ -800,7 +787,7 @@ def _initialize_params(self, param_dict): self.gradient_predivide_factor = get_gradient_predivide_factor(param_dict) self.sparse_gradients_enabled = get_sparse_gradients_enabled(param_dict) - self.zero_config = DeepSpeedZeroConfig(param_dict) + self.zero_config = get_zero_config(param_dict) self.zero_optimization_stage = self.zero_config.stage self.zero_enabled = self.zero_optimization_stage > 0 @@ -983,13 +970,13 @@ def _do_error_check(self): if self.zero_enabled: assert ( - self.zero_optimization_stage <= MAX_STAGE_ZERO_OPTIMIZATION + self.zero_optimization_stage <= ZeroStageEnum.max_stage ), "DeepSpeedConfig: Maximum supported ZeRO stage is {}".format( - MAX_STAGE_ZERO_OPTIMIZATION + ZeroStageEnum.max_stage ) if self.fp16_master_weights_and_gradients: - assert self.zero_enabled and self.zero_optimization_stage == ZERO_OPTIMIZATION_GRADIENTS, "Fp16_master_weights_and_grads is only supported with ZeRO Stage 2 for now." + assert self.zero_enabled and self.zero_optimization_stage == ZeroStageEnum.gradients, "Fp16_master_weights_and_grads is only supported with ZeRO Stage 2 for now." def _do_warning_check(self): fp16_enabled = self.fp16_enabled diff --git a/deepspeed/runtime/config_utils.py b/deepspeed/runtime/config_utils.py index 83c48bbee5cb..c8fb34e05d71 100755 --- a/deepspeed/runtime/config_utils.py +++ b/deepspeed/runtime/config_utils.py @@ -8,6 +8,86 @@ import json import collections import collections.abc +from pydantic import BaseModel +from deepspeed.utils import logger + + +class DeepSpeedConfigModel(BaseModel): + """ + This class should be used as a base for all DeepSpeed configs. It extends + pydantic.BaseModel to allow for deprecated fields. To enable this feature, + add deprecated=True to pydantic.Field: + + my_dep_field: int = Field(0, deprecated=True) + + Deprecated Field kwargs: + - deprecated: [True|False], default False + Enables / Disables deprecated fields + - new_param: str, default "" + Name of the field replacing the deprecated field + - set_new_param: [True|False], default True + If new_param is provided, enables setting the value of that param with + deprecated field value + - new_param_fn: callable, default (lambda x: x) + If new_param is provided and set_new_param is True, this function will + modify the value of the deprecated field before placing that value in + the new_param field + + Example: + my_new_field is replacing a deprecated my_old_field. The expected type + for my_new_field is int while the expected type for my_old_field is + str. We want to maintain backward compatibility with our configs, so we + define the fields with: + + class MyExampleConfig(DeepSpeedConfigModel): + my_new_field: int = 0 + my_old_field: str = Field('0', + deprecated=True, + new_param='my_new_field', + new_param_fn=(lambda x: int(x))) + """ + def __init__(self, strict=False, **data): + if ( + not strict + ): # This is temporary until we refactor all DS configs, allows HF to load models + data = {k: v for k, v in data.items() if v != "auto"} + super().__init__(**data) + self._deprecated_fields_check(self) + + def _process_deprecated_field(self, pydantic_config, field): + fields_set = pydantic_config.__fields_set__ + dep_param = field.name + if dep_param in fields_set: + kwargs = field.field_info.extra + new_param = kwargs.get("new_param", "") + logger.warning(f"Config parameter {dep_param} is deprecated" + + (f" use {new_param} instead" if new_param else "")) + if new_param and kwargs.get("set_new_param", True): + assert ( + new_param not in fields_set + ), f"Cannot provide deprecated parameter '{dep_param}' and replacing parameter '{new_param}' together" + new_param_fn = kwargs.get("new_param_fn", lambda x: x) + param_value = new_param_fn(getattr(pydantic_config, dep_param)) + try: + setattr(pydantic_config, new_param, param_value) + except Exception as e: + logger.error( + f"Tried setting value for '{new_param}' with value from deprecated '{dep_param}'" + ) + raise e + + def _deprecated_fields_check(self, pydantic_config): + fields = pydantic_config.__fields__ + for field in fields.values(): + if field.field_info.extra.get("deprecated", False): + self._process_deprecated_field(pydantic_config, field) + + class Config: + validate_all = True + validate_assignment = True + use_enum_values = True + allow_population_by_field_name = True + extra = "forbid" # adapted from https://stackoverflow.com/a/50701137/9201239 @@ -37,7 +117,7 @@ def iterencode(self, o, _one_shot=False, level=0): f'\n{prefix}"{k}": {self.iterencode(v, level=level)}' for k, v in o.items() ] - return "{" + ', '.join(x) + f"\n{prefix_close}" + "}" + return "{" + ", ".join(x) + f"\n{prefix_close}" + "}" elif isinstance(o, collections.abc.Sequence) and not isinstance(o, str): return f"[{ f', '.join(map(self.iterencode, o)) }]" return "\n, ".join(super().iterencode(o, _one_shot)) diff --git a/deepspeed/runtime/engine.py b/deepspeed/runtime/engine.py index 559587dd6ce3..f6e5da1aed73 100644 --- a/deepspeed/runtime/engine.py +++ b/deepspeed/runtime/engine.py @@ -37,7 +37,7 @@ from deepspeed.runtime.constants import \ ROUTE_TRAIN, ROUTE_PREDICT, ROUTE_EVAL, \ PLD_THETA, PLD_GAMMA, BFLOAT16, FP16 - +from deepspeed.runtime.zero.config import ZeroStageEnum from deepspeed.compression import compression_scheduler from deepspeed.compression.constants import \ WEIGHT_QUANTIZE_IN_FORWARD_ENABLED, \ @@ -50,9 +50,6 @@ WEIGHT_QUANTIZE_ROUNDING, \ WEIGHT_QUANTIZE_VERBOSE, \ WEIGHT_QUANTIZE_KERNEL - -from deepspeed.runtime.zero.constants import \ - ZERO_OPTIMIZATION_OPTIMIZER_STATES, ZERO_OPTIMIZATION_GRADIENTS, ZERO_OPTIMIZATION_WEIGHTS from deepspeed.checkpoint.constants import OPTIMIZER_STATE_DICT from deepspeed.runtime.sparse_tensor import SparseTensor @@ -652,10 +649,10 @@ def zero_allgather_bucket_size(self): return self._config.zero_config.allgather_bucket_size def zero_optimization_partition_gradients(self): - return self.zero_optimization_stage() >= ZERO_OPTIMIZATION_GRADIENTS + return self.zero_optimization_stage() >= ZeroStageEnum.gradients def zero_optimization_partition_weights(self): - return self.zero_optimization_stage() >= ZERO_OPTIMIZATION_WEIGHTS + return self.zero_optimization_stage() >= ZeroStageEnum.weights def zero_contiguous_gradients(self): return self._config.zero_config.contiguous_gradients @@ -1342,14 +1339,14 @@ def _configure_zero_optimizer(self, optimizer): "The deprecated version of ZeRO Stage 1 is not supported in deepspeed >= 0.5.9. Please downgrade to a version less than 0.5.9 if you need to use this deprecated version of ZeRO." ) - if zero_stage <= ZERO_OPTIMIZATION_GRADIENTS: + if zero_stage <= ZeroStageEnum.gradients: overlap_comm = self.zero_overlap_comm() contiguous_gradients = self.zero_contiguous_gradients() round_robin_gradients = self.zero_round_robin_gradients() assert not isinstance(optimizer, DummyOptim), "zero stage 2 requires an optimizer" # Overlap and contiguous grads are meaningless in stage 1 and are ignored - if zero_stage == ZERO_OPTIMIZATION_OPTIMIZER_STATES: + if zero_stage == ZeroStageEnum.optimizer_states: overlap_comm = False contiguous_gradients = False round_robin_gradients = False @@ -1383,7 +1380,7 @@ def _configure_zero_optimizer(self, optimizer): gradient_predivide_factor=self.gradient_predivide_factor(), gradient_accumulation_steps=self.gradient_accumulation_steps(), ignore_unused_parameters=self.zero_ignore_unused_parameters(), - partition_grads=zero_stage == ZERO_OPTIMIZATION_GRADIENTS, + partition_grads=zero_stage == ZeroStageEnum.gradients, round_robin_gradients=round_robin_gradients, has_moe_layers=self.has_moe_layers, fp16_master_weights_and_gradients=self.fp16_master_weights_and_gradients( @@ -1391,7 +1388,7 @@ def _configure_zero_optimizer(self, optimizer): communication_data_type=self.communication_data_type, elastic_checkpoint=self.zero_elastic_checkpoint()) - elif zero_stage == ZERO_OPTIMIZATION_WEIGHTS: + elif zero_stage == ZeroStageEnum.weights: assert not self.has_moe_layers, "MoE not supported with Stage 3" logger.info("Initializing ZeRO Stage 3") if dist.get_rank() == 0 else None from deepspeed.runtime.zero.stage3 import DeepSpeedZeroOptimizer_Stage3 @@ -1687,7 +1684,7 @@ def allreduce_gradients(self, bucket_size=MEMORY_OPT_ALLREDUCE_SIZE): # Communicate only at gradient accumulation boundaries elif self.is_gradient_accumulation_boundary(): - if self.zero_optimization_stage() == ZERO_OPTIMIZATION_OPTIMIZER_STATES: + if self.zero_optimization_stage() == ZeroStageEnum.optimizer_states: self.optimizer.reduce_gradients( pipeline_parallel=self.pipeline_parallelism) else: diff --git a/deepspeed/runtime/swap_tensor/optimizer_utils.py b/deepspeed/runtime/swap_tensor/optimizer_utils.py index 1323dcb926e5..70b806c3a15f 100644 --- a/deepspeed/runtime/swap_tensor/optimizer_utils.py +++ b/deepspeed/runtime/swap_tensor/optimizer_utils.py @@ -10,7 +10,6 @@ from deepspeed import comm as dist from deepspeed.utils.logging import logger -from deepspeed.runtime.zero.offload_constants import * from deepspeed.runtime.swap_tensor.constants import * from deepspeed.runtime.swap_tensor.utils import swap_in_tensors, swap_out_tensors, \ MIN_AIO_BYTES, AIO_ALIGNED_BYTES, get_sized_buffers @@ -147,10 +146,9 @@ def __init__(self, # Swap buffer management self.largest_numel = self._io_aligned_numel(largest_numel) self.dtype = dtype - self.swap_buffer_manager = SwapBufferManager( - num_elems=self.largest_numel, - count=swap_config[OFFLOAD_OPTIMIZER_BUFFER_COUNT], - dtype=dtype) + self.swap_buffer_manager = SwapBufferManager(num_elems=self.largest_numel, + count=swap_config.buffer_count, + dtype=dtype) # Timers self.timers = timers diff --git a/deepspeed/runtime/swap_tensor/partitioned_param_swapper.py b/deepspeed/runtime/swap_tensor/partitioned_param_swapper.py index efce4f96922c..22e11b01f0f4 100644 --- a/deepspeed/runtime/swap_tensor/partitioned_param_swapper.py +++ b/deepspeed/runtime/swap_tensor/partitioned_param_swapper.py @@ -14,7 +14,6 @@ from deepspeed.ops.aio import AsyncIOBuilder from .constants import * from .utils import swap_in_tensors, swap_out_tensors, MIN_AIO_BYTES, AIO_ALIGNED_BYTES, print_object, SwapBufferPool -from ..zero.offload_constants import * def print_rank_0(message, debug=False, force=False): @@ -85,7 +84,7 @@ def available_swap_in_buffers(self): def _configure_aio(self, ds_config): self.swap_config = ds_config.zero_config.offload_param torch_dtype_string = str(self.dtype).split(".")[1] - self.swap_folder = os.path.join(self.swap_config[OFFLOAD_PARAM_NVME_PATH], + self.swap_folder = os.path.join(self.swap_config.nvme_path, 'zero_stage_3', f'{torch_dtype_string}params', f'rank{dist.get_rank()}') @@ -101,10 +100,10 @@ def _configure_aio(self, ds_config): self.aligned_bytes = AIO_ALIGNED_BYTES * self.aio_config[AIO_THREAD_COUNT] self.numel_alignment = self.aligned_bytes // self.swap_element_size - self.elements_per_buffer = self.swap_config[OFFLOAD_PARAM_BUFFER_SIZE] + self.elements_per_buffer = self.swap_config.buffer_size self.aligned_elements_per_buffer = self._io_aligned_numel( self.elements_per_buffer) - self.param_buffer_count = self.swap_config[OFFLOAD_PARAM_BUFFER_COUNT] + self.param_buffer_count = self.swap_config.buffer_count self.available_buffer_ids = [i for i in range(self.param_buffer_count)] self.reserved_buffer_ids = [] diff --git a/deepspeed/runtime/swap_tensor/pipelined_optimizer_swapper.py b/deepspeed/runtime/swap_tensor/pipelined_optimizer_swapper.py index cbcfa15ca598..c74a40ca7891 100644 --- a/deepspeed/runtime/swap_tensor/pipelined_optimizer_swapper.py +++ b/deepspeed/runtime/swap_tensor/pipelined_optimizer_swapper.py @@ -8,7 +8,6 @@ from deepspeed.ops.aio import AsyncIOBuilder from deepspeed import comm as dist -from deepspeed.runtime.zero.offload_constants import * from deepspeed.runtime.swap_tensor.constants import * from deepspeed.runtime.swap_tensor.utils import swap_in_tensors, swap_out_tensors, print_object from deepspeed.runtime.swap_tensor.async_swapper import AsyncTensorSwapper @@ -91,8 +90,8 @@ def __init__(self, numel_alignment=self.numel_alignment, timers=self.timers) - self.async_swap_in = swap_config[OFFLOAD_OPTIMIZER_PIPELINE_READ] - self.async_swap_out = swap_config[OFFLOAD_OPTIMIZER_PIPELINE_WRITE] + self.async_swap_in = swap_config.pipeline_read + self.async_swap_out = swap_config.pipeline_write self.swap_ops = { SYNC_SWAP_IN: None, @@ -250,7 +249,7 @@ def _swap_in_optimizer_state(self, aio_handle, parameter): count=required_buffer_count, dtype=parameter.dtype) assert allocated_buffers is not None, \ - f"PipelinedOptimizerSwapper ran out of swap buffers, try increasing {OFFLOAD_OPTIMIZER_BUFFER_COUNT}" + f"PipelinedOptimizerSwapper ran out of swap buffers, try increasing 'buffer_count'" state_buffers = allocated_buffers[:len(param_info.tensors)] param_info.set_swap_buffers(state_buffers) diff --git a/deepspeed/runtime/zero/config.py b/deepspeed/runtime/zero/config.py old mode 100755 new mode 100644 index 3804fb50a371..aaca3cbda887 --- a/deepspeed/runtime/zero/config.py +++ b/deepspeed/runtime/zero/config.py @@ -3,195 +3,136 @@ Licensed under the MIT license. """ -from deepspeed.runtime.config_utils import get_scalar_param, DeepSpeedConfigObject +from pydantic import Field, validator +from typing import Optional +from enum import Enum +from deepspeed.runtime.config_utils import get_scalar_param, DeepSpeedConfigModel from deepspeed.utils import logger -from .constants import * -from .offload_constants import * -from .offload_config import get_offload_param_config, get_default_offload_param_config, \ - get_offload_optimizer_config, get_default_offload_optimizer_config - - -class DeepSpeedZeroConfig(DeepSpeedConfigObject): - def __init__(self, param_dict): - super(DeepSpeedZeroConfig, self).__init__() - - self.stage = None - self.contiguous_gradients = None - self.reduce_scatter = None - self.reduce_bucket_size = None - self.allgather_partitions = None - self.allgather_bucket_size = None - self.overlap_comm = None - self.load_from_fp32_weights = None - - self.elastic_checkpoint = None - - #Offload Specific Parameters - self.offload_param = None - self.offload_optimizer = None - self.sub_group_size = None - - #Stage3 Specific Parameters - self.prefetch_bucket_size = None - self.param_persistence_threshold = None - self.max_live_parameters = None - self.max_reuse_distance = None - self.gather_16bit_weights_on_model_save = None - - self.ignore_unused_parameters = None - self.round_robin_gradients = None - - if ZERO_OPTIMIZATION in param_dict.keys(): - zero_config_dict = param_dict[ZERO_OPTIMIZATION] - if type(zero_config_dict) is bool: - zero_config_dict = self.read_zero_config_deprecated(param_dict) - else: - zero_config_dict = ZERO_OPTIMIZATION_DEFAULT - - self._initialize(zero_config_dict) - - def read_zero_config_deprecated(self, param_dict): +from .offload_config import DeepSpeedZeroOffloadParamConfig, DeepSpeedZeroOffloadOptimizerConfig + +# ZeRO optimization. By default, this optimization is not enabled. +# Users have to configure the desired optimization (0 means disabled) in params.json as below example: +ZERO_FORMAT = """ +ZeRO optimization should be enabled as: +"session_params": { + "zero_optimization": { + "stage": [0|1|2], + "stage3_max_live_parameters" : 1000000000, + "stage3_max_reuse_distance" : 1000000000, + "allgather_partitions": [true|false], + "allgather_bucket_size": 500000000, + "reduce_scatter": [true|false], + "contiguous_gradients" : [true|false] + "overlap_comm": [true|false], + "reduce_bucket_size": 500000000, + "load_from_fp32_weights": [true|false], + "cpu_offload": [true|false] (deprecated), + "cpu_offload_params" : [true|false] (deprecated), + "cpu_offload_use_pin_memory": [true|false] (deprecated), + "sub_group_size" : 1000000000000, + "offload_param": {...}, + "offload_optimizer": {...}, + "ignore_unused_parameters": [true|false], + "round_robin_gradients": [true|false] + } +} +""" + +ZERO_OPTIMIZATION = "zero_optimization" + + +def read_zero_config_deprecated(param_dict): + zero_config_dict = {} + zero_config_dict["stage"] = 1 if param_dict[ZERO_OPTIMIZATION] else 0 + if zero_config_dict["stage"] > 0: + zero_config_dict["allgather_bucket_size"] = get_scalar_param( + param_dict, + "allgather_size", + 5e8) + logger.warning( + "DeepSpeedConfig: this format of ZeRO optimization setup is deprecated. Please use the following format: {}" + .format(ZERO_FORMAT)) + return zero_config_dict + + +def get_zero_config(param_dict): + if ZERO_OPTIMIZATION in param_dict: + zero_config_dict = param_dict[ZERO_OPTIMIZATION] + if isinstance(zero_config_dict, bool): + zero_config_dict = read_zero_config_deprecated(param_dict) + else: zero_config_dict = {} - zero_config_dict[ - ZERO_OPTIMIZATION_STAGE] = 1 if param_dict[ZERO_OPTIMIZATION] else 0 - if zero_config_dict[ZERO_OPTIMIZATION_STAGE] > 0: - zero_config_dict[ZERO_OPTIMIZATION_ALLGATHER_BUCKET_SIZE] = get_scalar_param( - param_dict, - ZERO_OPTIMIZATION_ALLGATHER_BUCKET_SIZE_DEPRECATED, - ZERO_OPTIMIZATION_ALLGATHER_BUCKET_SIZE_DEFAULT) - - logger.warning( - 'DeepSpeedConfig: this format of ZeRO optimization setup is deprecated. Please use the following format: {}' - .format(ZERO_FORMAT)) - return zero_config_dict - - def _sanity_check(self, zero_config_dict): - deprecated_dict = dict( - ZERO_OPTIMIZATION_CPU_OFFLOAD=ZERO_OPTIMIZATION_OFFLOAD_OPTIMIZER, - ZERO_OPTIMIZATION_CPU_OFFLOAD_PARAMS=ZERO_OPTIMIZATION_OFFLOAD_PARAM, - ZERO_OPTIMIZATION_CPU_OFFLOAD_USE_PIN_MEMORY= - f'{ZERO_OPTIMIZATION_OFFLOAD_PARAM} or {ZERO_OPTIMIZATION_OFFLOAD_OPTIMIZER}' - ) - - for old_key, new_key in deprecated_dict.items(): - if old_key in zero_config_dict: - logger.warning( - f'DeepSpeedConfig: {old_key} is deprecated. Please use {new_key}.') - - def _initialize(self, zero_config_dict): - self._sanity_check(zero_config_dict) - - self.stage = get_scalar_param(zero_config_dict, - ZERO_OPTIMIZATION_STAGE, - ZERO_OPTIMIZATION_STAGE_DEFAULT) - - self.contiguous_gradients = get_scalar_param( - zero_config_dict, - ZERO_OPTIMIZATION_CONTIGUOUS_GRADIENTS, - ZERO3_OPTIMIZATION_CONTIGUOUS_GRADIENTS_DEFAULT - if self.stage == ZERO_OPTIMIZATION_WEIGHTS else - ZERO_OPTIMIZATION_CONTIGUOUS_GRADIENTS_DEFAULT) - - self.reduce_bucket_size = get_scalar_param( - zero_config_dict, - ZERO_OPTIMIZATION_REDUCE_BUCKET_SIZE, - ZERO_OPTIMIZATION_REDUCE_BUCKET_SIZE_DEFAULT) - - self.reduce_scatter = get_scalar_param(zero_config_dict, - ZERO_OPTIMIZATION_REDUCE_SCATTER, - ZERO_OPTIMIZATION_REDUCE_SCATTER_DEFAULT) - - self.overlap_comm = get_scalar_param( - zero_config_dict, - ZERO_OPTIMIZATION_OVERLAP_COMM, - ZERO3_OPTIMIZATION_OVERLAP_COMM_DEFAULT if self.stage - == ZERO_OPTIMIZATION_WEIGHTS else ZERO_OPTIMIZATION_OVERLAP_COMM_DEFAULT) - - self.allgather_partitions = get_scalar_param( - zero_config_dict, - ZERO_OPTIMIZATION_ALLGATHER_PARTITIONS, - ZERO_OPTIMIZATION_ALLGATHER_PARTITIONS_DEFAULT) - - self.allgather_bucket_size = get_scalar_param( - zero_config_dict, - ZERO_OPTIMIZATION_ALLGATHER_BUCKET_SIZE, - ZERO_OPTIMIZATION_ALLGATHER_BUCKET_SIZE_DEFAULT) - - self.load_from_fp32_weights = get_scalar_param( - zero_config_dict, - ZERO_OPTIMIZATION_LOAD_FROM_FP32_WEIGHTS, - ZERO_OPTIMIZATION_LOAD_FROM_FP32_WEIGHTS_DEFAULT) - - self.elastic_checkpoint = get_scalar_param( - zero_config_dict, - ZERO_OPTIMIZATION_ELASTIC_CHECKPOINT, - ZERO_OPTIMIZATION_ELASTIC_CHECKPOINT_DEFAULT) - - if ZERO_OPTIMIZATION_CPU_OFFLOAD in zero_config_dict: - cpu_offload_optimizer = get_scalar_param( - zero_config_dict, - ZERO_OPTIMIZATION_CPU_OFFLOAD, - ZERO_OPTIMIZATION_CPU_OFFLOAD_DEFAULT) - if cpu_offload_optimizer: - self.offload_optimizer = get_default_offload_optimizer_config() - else: - self.offload_optimizer = get_offload_optimizer_config(zero_config_dict) - - if ZERO_OPTIMIZATION_CPU_OFFLOAD_PARAMS in zero_config_dict: - cpu_offload_params = get_scalar_param( - zero_config_dict, - ZERO_OPTIMIZATION_CPU_OFFLOAD_PARAMS, - ZERO_OPTIMIZATION_CPU_OFFLOAD_PARAMS_DEFAULT) - if cpu_offload_params: - self.offload_param = get_default_offload_param_config() - else: - self.offload_param = get_offload_param_config(zero_config_dict) - - self.sub_group_size = get_scalar_param(zero_config_dict, - ZERO_OPTIMIZATION_SUB_GROUP_SIZE, - ZERO_OPTIMIZATION_SUB_GROUP_SIZE_DEFAULT) - - self.max_live_parameters = get_scalar_param( - zero_config_dict, - ZERO_OPTIMIZATION_MAX_LIVE_PARAMETERS, - ZERO_OPTIMIZATION_MAX_LIVE_PARAMETERS_DEFAULT) - - self.max_reuse_distance = get_scalar_param( - zero_config_dict, - ZERO_OPTIMIZATION_MAX_REUSE_DISTANCE, - ZERO_OPTIMIZATION_MAX_REUSE_DISTANCE_DEFAULT) - - self.prefetch_bucket_size = get_scalar_param( - zero_config_dict, - ZERO_OPTIMIZATION_PREFETCH_BUCKET_SIZE, - ZERO_OPTIMIZATION_PREFETCH_BUCKET_SIZE_DEFAULT) - - self.param_persistence_threshold = get_scalar_param( - zero_config_dict, - ZERO_OPTIMIZATION_PARAM_PERSISTENCE_THRESHOLD, - ZERO_OPTIMIZATION_PARAM_PERSISTENCE_THRESHOLD_DEFAULT) - - # config key has been renamed to use "16bit" instead of "fp16." falling back - # to old config name in order to preserve backwards compatibility - self.gather_16bit_weights_on_model_save = ZERO_OPTIMIZATION_GATHER_16BIT_WEIGHTS_ON_MODEL_SAVE_DEFAULT - for key in [ - ZERO_OPTIMIZATION_GATHER_16BIT_WEIGHTS_ON_MODEL_SAVE, - ZERO_OPTIMIZATION_GATHER_FP16_WEIGHTS_ON_MODEL_SAVE - ]: - if key in zero_config_dict: - self.gather_16bit_weights_on_model_save = zero_config_dict[key] - break - - self.ignore_unused_parameters = get_scalar_param( - zero_config_dict, - ZERO_OPTIMIZATION_IGNORE_UNUSED_PARAMETERS, - ZERO_OPTIMIZATION_IGNORE_UNUSED_PARAMETERS_DEFAULT) - - self.legacy_stage1 = get_scalar_param(zero_config_dict, - ZERO_OPTIMIZATION_LEGACY_STAGE1, - ZERO_OPTIMIZATION_LEGACY_STAGE1_DEFAULT) - - self.round_robin_gradients = get_scalar_param( - zero_config_dict, - ZERO_OPTIMIZATION_ROUND_ROBIN_GRADIENTS, - ZERO_OPTIMIZATION_ROUND_ROBIN_GRADIENTS_DEFAULT) + return DeepSpeedZeroConfig(**zero_config_dict) + + +class ZeroStageEnum(int, Enum): + disabled = 0 + optimizer_states = 1 + gradients = 2 + weights = 3 + max_stage = 3 + + +class DeepSpeedZeroConfig(DeepSpeedConfigModel): + stage: ZeroStageEnum = ZeroStageEnum.disabled + contiguous_gradients: bool = True + reduce_scatter: bool = True + reduce_bucket_size: int = Field(5e8, ge=0) + allgather_partitions: bool = True + allgather_bucket_size: int = Field(5e8, ge=0) + overlap_comm: bool = None # None for dynamic default value + load_from_fp32_weights: bool = True + + elastic_checkpoint: bool = False + + # Offload Specific Parameters + offload_param: Optional[DeepSpeedZeroOffloadParamConfig] = None + offload_optimizer: Optional[DeepSpeedZeroOffloadOptimizerConfig] = None + sub_group_size: int = Field(1e9, ge=0) + cpu_offload_param: bool = Field( + None, + deprecated=True, + new_param="offload_param", + new_param_fn=(lambda val: DeepSpeedZeroOffloadParamConfig() if val else None), + ) + cpu_offload_use_pin_memory: bool = Field( + None, + deprecated=True, + new_param="offload_param or offload_optimizer", + set_new_param=False, + ) + cpu_offload: bool = Field( + None, + deprecated=True, + new_param="offload_optimizer", + new_param_fn=(lambda val: DeepSpeedZeroOffloadOptimizerConfig() + if val else None), + ) + + # Stage3 Specific Parameters + prefetch_bucket_size: int = Field(5e7, ge=0, alias="stage3_prefetch_bucket_size") + param_persistence_threshold: int = Field(1e5, + ge=0, + alias="stage3_param_persistence_threshold") + max_live_parameters: int = Field(1e9, ge=0, alias="stage3_max_live_parameters") + max_reuse_distance: int = Field(1e9, ge=0, alias="stage3_max_reuse_distance") + gather_16bit_weights_on_model_save: bool = Field( + False, + alias="stage3_gather_16bit_weights_on_model_save") + stage3_gather_fp16_weights_on_model_save: bool = Field( + False, + deprecated=True, + new_param="gather_16bit_weights_on_model_save") + + ignore_unused_parameters: bool = True + legacy_stage1: bool = False + round_robin_gradients: bool = False + + @validator("overlap_comm") + def overlap_comm_valid(cls, field_value, values): + if field_value is None: + assert ( + "stage" in values + ), "DeepSpeedZeroConfig: 'stage' must be defined before 'overlap_comm'" + field_value = values["stage"] == ZeroStageEnum.weights + return field_value diff --git a/deepspeed/runtime/zero/constants.py b/deepspeed/runtime/zero/constants.py deleted file mode 100755 index af5c5f195398..000000000000 --- a/deepspeed/runtime/zero/constants.py +++ /dev/null @@ -1,173 +0,0 @@ -""" -Copyright (c) Microsoft Corporation -Licensed under the MIT license. -""" - -from .offload_constants import * - -######################################### -# ZeRO optimization -######################################### -# ZeRO optimization. By default, this optimization is not enabled. -# Users have to configure the desired optimization (0 means disabled) in params.json as below example: -ZERO_FORMAT = ''' -ZeRO optimization should be enabled as: -"session_params": { - "zero_optimization": { - "stage": [0|1|2], - "stage3_max_live_parameters" : 1000000000, - "stage3_max_reuse_distance" : 1000000000, - "allgather_partitions": [true|false], - "allgather_bucket_size": 500000000, - "reduce_scatter": [true|false], - "contiguous_gradients" : [true|false] - "overlap_comm": [true|false], - "reduce_bucket_size": 500000000, - "load_from_fp32_weights": [true|false], - "cpu_offload": [true|false] (deprecated), - "cpu_offload_params" : [true|false] (deprecated), - "cpu_offload_use_pin_memory": [true|false] (deprecated), - "sub_group_size" : 1000000000000, - "offload_param": {...}, - "offload_optimizer": {...}, - "ignore_unused_parameters": [true|false], - "round_robin_gradients": [true|false] - } -} -''' - -ZERO_OPTIMIZATION = 'zero_optimization' -ZERO_OPTIMIZATION_DISABLED = 0 -ZERO_OPTIMIZATION_OPTIMIZER_STATES = 1 -ZERO_OPTIMIZATION_GRADIENTS = 2 -ZERO_OPTIMIZATION_WEIGHTS = 3 -MAX_STAGE_ZERO_OPTIMIZATION = ZERO_OPTIMIZATION_WEIGHTS - -ZERO_OPTIMIZATION_STAGE = 'stage' -ZERO_OPTIMIZATION_STAGE_1 = 'stage_1' -ZERO_OPTIMIZATION_STAGE_2 = 'stage_2' -ZERO_OPTIMIZATION_STAGE_3 = 'stage_3' - -ZERO_OPTIMIZATION_STAGE_DEFAULT = ZERO_OPTIMIZATION_DISABLED - -ZERO_OPTIMIZATION_ALLGATHER_PARTITIONS = 'allgather_partitions' -ZERO_OPTIMIZATION_ALLGATHER_PARTITIONS_DEFAULT = True - -ZERO_OPTIMIZATION_REDUCE_SCATTER = 'reduce_scatter' -ZERO_OPTIMIZATION_REDUCE_SCATTER_DEFAULT = True - -ZERO_OPTIMIZATION_OVERLAP_COMM = 'overlap_comm' -ZERO_OPTIMIZATION_OVERLAP_COMM_DEFAULT = False -ZERO3_OPTIMIZATION_OVERLAP_COMM_DEFAULT = True - -ZERO_OPTIMIZATION_CONTIGUOUS_GRADIENTS = 'contiguous_gradients' -ZERO_OPTIMIZATION_CONTIGUOUS_GRADIENTS_DEFAULT = True -ZERO3_OPTIMIZATION_CONTIGUOUS_GRADIENTS_DEFAULT = True - -ZERO_OPTIMIZATION_REDUCE_BUCKET_SIZE = 'reduce_bucket_size' -ZERO_OPTIMIZATION_REDUCE_BUCKET_SIZE_DEFAULT = 500000000 - -ZERO_OPTIMIZATION_ALLGATHER_BUCKET_SIZE = 'allgather_bucket_size' -ZERO_OPTIMIZATION_ALLGATHER_BUCKET_SIZE_DEFAULT = 500000000 -ZERO_OPTIMIZATION_ALLGATHER_BUCKET_SIZE_DEPRECATED = 'allgather_size' -ZERO_OPTIMIZATION_LOAD_FROM_FP32_WEIGHTS = 'load_from_fp32_weights' -ZERO_OPTIMIZATION_LOAD_FROM_FP32_WEIGHTS_DEFAULT = True - -ZERO_OPTIMIZATION_ELASTIC_CHECKPOINT = 'elastic_checkpoint' -ZERO_OPTIMIZATION_ELASTIC_CHECKPOINT_DEFAULT = False - -ZERO_OPTIMIZATION_CPU_OFFLOAD = 'cpu_offload' -ZERO_OPTIMIZATION_CPU_OFFLOAD_DEFAULT = False - -ZERO_OPTIMIZATION_CPU_OFFLOAD_PARAMS = 'cpu_offload_params' -ZERO_OPTIMIZATION_CPU_OFFLOAD_PARAMS_DEFAULT = False - -ZERO_OPTIMIZATION_CPU_OFFLOAD_USE_PIN_MEMORY = 'cpu_offload_use_pin_memory' -ZERO_OPTIMIZATION_CPU_OFFLOAD_USE_PIN_MEMORY_DEFAULT = False - -ZERO_OPTIMIZATION_OFFLOAD_PARAM = OFFLOAD_PARAM -ZERO_OPTIMIZATION_OFFLOAD_PARAM_DEFAULT = None - -ZERO_OPTIMIZATION_OFFLOAD_OPTIMIZER = OFFLOAD_OPTIMIZER -ZERO_OPTIMIZATION_OFFLOAD_OPTIMIZER_DEFAULT = None - -ZERO_OPTIMIZATION_SUB_GROUP_SIZE = 'sub_group_size' -ZERO_OPTIMIZATION_SUB_GROUP_SIZE_DEFAULT = 1000000000 - -#maximum number of parameters per GPU before releasing them -ZERO_OPTIMIZATION_MAX_LIVE_PARAMETERS = 'stage3_max_live_parameters' -ZERO_OPTIMIZATION_MAX_LIVE_PARAMETERS_DEFAULT = 1000000000 - -#release a parameter only if the reuse distance is larger than specified -ZERO_OPTIMIZATION_MAX_REUSE_DISTANCE = 'stage3_max_reuse_distance' -ZERO_OPTIMIZATION_MAX_REUSE_DISTANCE_DEFAULT = 1000000000 - -ZERO_OPTIMIZATION_PREFETCH_BUCKET_SIZE = 'stage3_prefetch_bucket_size' -ZERO_OPTIMIZATION_PREFETCH_BUCKET_SIZE_DEFAULT = 50000000 - -#parameters smaller than the threshold are only communicated once after the -#parameters are updated and are persisted throughout the training -#avoid tons of latency bound communication -ZERO_OPTIMIZATION_PARAM_PERSISTENCE_THRESHOLD = 'stage3_param_persistence_threshold' -ZERO_OPTIMIZATION_PARAM_PERSISTENCE_THRESHOLD_DEFAULT = 100000 - -# gathers params for saving a model - inefficient but is required in certain situations -ZERO_OPTIMIZATION_GATHER_FP16_WEIGHTS_ON_MODEL_SAVE = 'stage3_gather_fp16_weights_on_model_save' -ZERO_OPTIMIZATION_GATHER_16BIT_WEIGHTS_ON_MODEL_SAVE = 'stage3_gather_16bit_weights_on_model_save' -ZERO_OPTIMIZATION_GATHER_16BIT_WEIGHTS_ON_MODEL_SAVE_DEFAULT = False - -# Now just used in stage2 complete_grad_norm_calculation_for_cpu_offload -# Enable this option to avoid: -# https://github.com/microsoft/DeepSpeed/issues/707 -ZERO_OPTIMIZATION_IGNORE_UNUSED_PARAMETERS = 'ignore_unused_parameters' -ZERO_OPTIMIZATION_IGNORE_UNUSED_PARAMETERS_DEFAULT = True - -# Use deepspeed < v0.3.17 zero stage 1, kept for backwards compatibility reasons -ZERO_OPTIMIZATION_LEGACY_STAGE1 = "legacy_stage1" -ZERO_OPTIMIZATION_LEGACY_STAGE1_DEFAULT = False - -# Stage 2 - partition gradients in a round robin fashion to load-balance reduction and offload copying -ZERO_OPTIMIZATION_ROUND_ROBIN_GRADIENTS = 'round_robin_gradients' -ZERO_OPTIMIZATION_ROUND_ROBIN_GRADIENTS_DEFAULT = False - -#yapf: disable -ZERO_OPTIMIZATION_DEFAULT = { - ZERO_OPTIMIZATION_STAGE: - ZERO_OPTIMIZATION_STAGE_DEFAULT, - ZERO_OPTIMIZATION_CONTIGUOUS_GRADIENTS: - ZERO_OPTIMIZATION_CONTIGUOUS_GRADIENTS_DEFAULT, - ZERO_OPTIMIZATION_REDUCE_SCATTER: - ZERO_OPTIMIZATION_REDUCE_SCATTER_DEFAULT, - ZERO_OPTIMIZATION_REDUCE_BUCKET_SIZE: - ZERO_OPTIMIZATION_REDUCE_BUCKET_SIZE_DEFAULT, - ZERO_OPTIMIZATION_ALLGATHER_PARTITIONS: - ZERO_OPTIMIZATION_ALLGATHER_PARTITIONS_DEFAULT, - ZERO_OPTIMIZATION_ALLGATHER_BUCKET_SIZE: - ZERO_OPTIMIZATION_ALLGATHER_BUCKET_SIZE_DEFAULT, - ZERO_OPTIMIZATION_LOAD_FROM_FP32_WEIGHTS: - ZERO_OPTIMIZATION_LOAD_FROM_FP32_WEIGHTS_DEFAULT, - ZERO_OPTIMIZATION_ELASTIC_CHECKPOINT: - ZERO_OPTIMIZATION_ELASTIC_CHECKPOINT_DEFAULT, - ZERO_OPTIMIZATION_OFFLOAD_PARAM: - ZERO_OPTIMIZATION_OFFLOAD_PARAM_DEFAULT, - ZERO_OPTIMIZATION_OFFLOAD_OPTIMIZER: - ZERO_OPTIMIZATION_OFFLOAD_OPTIMIZER_DEFAULT, - ZERO_OPTIMIZATION_SUB_GROUP_SIZE: - ZERO_OPTIMIZATION_SUB_GROUP_SIZE_DEFAULT, - ZERO_OPTIMIZATION_MAX_LIVE_PARAMETERS: - ZERO_OPTIMIZATION_MAX_LIVE_PARAMETERS_DEFAULT, - ZERO_OPTIMIZATION_MAX_REUSE_DISTANCE: - ZERO_OPTIMIZATION_MAX_REUSE_DISTANCE_DEFAULT, - ZERO_OPTIMIZATION_PREFETCH_BUCKET_SIZE: - ZERO_OPTIMIZATION_PREFETCH_BUCKET_SIZE_DEFAULT, - ZERO_OPTIMIZATION_PARAM_PERSISTENCE_THRESHOLD: - ZERO_OPTIMIZATION_PARAM_PERSISTENCE_THRESHOLD_DEFAULT, - ZERO_OPTIMIZATION_GATHER_16BIT_WEIGHTS_ON_MODEL_SAVE: - ZERO_OPTIMIZATION_GATHER_16BIT_WEIGHTS_ON_MODEL_SAVE_DEFAULT, - ZERO_OPTIMIZATION_IGNORE_UNUSED_PARAMETERS: - ZERO_OPTIMIZATION_IGNORE_UNUSED_PARAMETERS_DEFAULT, - ZERO_OPTIMIZATION_LEGACY_STAGE1: - ZERO_OPTIMIZATION_LEGACY_STAGE1_DEFAULT, - ZERO_OPTIMIZATION_ROUND_ROBIN_GRADIENTS: - ZERO_OPTIMIZATION_ROUND_ROBIN_GRADIENTS_DEFAULT -} diff --git a/deepspeed/runtime/zero/offload_config.py b/deepspeed/runtime/zero/offload_config.py index 9c8afda673ef..e8bc23e9581e 100644 --- a/deepspeed/runtime/zero/offload_config.py +++ b/deepspeed/runtime/zero/offload_config.py @@ -1,74 +1,39 @@ -''' -Copyright 2020 The Microsoft DeepSpeed Team. +""" +Copyright (c) Microsoft Corporation Licensed under the MIT license. -''' - -from deepspeed.runtime.config_utils import get_scalar_param -from .offload_constants import * - -OFFLOAD_PARAM_KEY_DEFAULT_DICT = { - OFFLOAD_PARAM_DEVICE: OFFLOAD_PARAM_DEVICE_DEFAULT, - OFFLOAD_PARAM_NVME_PATH: OFFLOAD_PARAM_NVME_PATH_DEFAULT, - OFFLOAD_PARAM_BUFFER_COUNT: OFFLOAD_PARAM_BUFFER_COUNT_DEFAULT, - OFFLOAD_PARAM_BUFFER_SIZE: OFFLOAD_PARAM_BUFFER_SIZE_DEFAULT, - OFFLOAD_PARAM_MAX_IN_CPU: OFFLOAD_PARAM_MAX_IN_CPU_DEFAULT, - OFFLOAD_PARAM_PIN_MEMORY: OFFLOAD_PARAM_PIN_MEMORY_DEFAULT -} - -OFFLOAD_OPTIMIZER_KEY_DEFAULT_DICT = { - OFFLOAD_OPTIMIZER_DEVICE: OFFLOAD_OPTIMIZER_DEVICE_DEFAULT, - OFFLOAD_OPTIMIZER_NVME_PATH: OFFLOAD_OPTIMIZER_NVME_PATH_DEFAULT, - OFFLOAD_OPTIMIZER_BUFFER_COUNT: OFFLOAD_OPTIMIZER_BUFFER_COUNT_DEFAULT, - OFFLOAD_OPTIMIZER_PIN_MEMORY: OFFLOAD_OPTIMIZER_PIN_MEMORY_DEFAULT, - OFFLOAD_OPTIMIZER_PIPELINE_READ: OFFLOAD_OPTIMIZER_PIPELINE_READ_DEFAULT, - OFFLOAD_OPTIMIZER_PIPELINE_WRITE: OFFLOAD_OPTIMIZER_PIPELINE_WRITE_DEFAULT, - OFFLOAD_OPTIMIZER_FAST_INIT: OFFLOAD_OPTIMIZER_FAST_INIT_DEFAULT -} - - -def _get_offload_config(param_dict, key_default_dict): - offload_config = {} - for key, default_value in key_default_dict.items(): - offload_config[key] = get_scalar_param(param_dict, key, default_value) - - return offload_config - - -def get_offload_param_config(param_dict): - if OFFLOAD_PARAM in param_dict and param_dict[OFFLOAD_PARAM] is not None: - offload_config = _get_offload_config( - param_dict=param_dict[OFFLOAD_PARAM], - key_default_dict=OFFLOAD_PARAM_KEY_DEFAULT_DICT) - device = offload_config.get("device", OFFLOAD_PARAM_DEVICE_DEFAULT) - assert device in VALID_OFFLOAD_DEVICES, f'Invalid parameter offloading device specified: {device}.' - if device == OFFLOAD_NONE_DEVICE: - return None - return offload_config - return None - - -def get_default_offload_param_config(): - return OFFLOAD_PARAM_KEY_DEFAULT_DICT - - -def get_offload_optimizer_config(param_dict): - if OFFLOAD_OPTIMIZER in param_dict and param_dict[OFFLOAD_OPTIMIZER] is not None: - offload_config = _get_offload_config( - param_dict=param_dict[OFFLOAD_OPTIMIZER], - key_default_dict=OFFLOAD_OPTIMIZER_KEY_DEFAULT_DICT) - - device = offload_config.get("device", OFFLOAD_OPTIMIZER_DEVICE_DEFAULT) - assert device in VALID_OFFLOAD_DEVICES, f'Invalid optimizer offloading device specified: {device}.' - if device == OFFLOAD_NONE_DEVICE: - return None - - offload_config[OFFLOAD_OPTIMIZER_PIPELINE] = offload_config[ - OFFLOAD_OPTIMIZER_PIPELINE_READ] or offload_config[ - OFFLOAD_OPTIMIZER_PIPELINE_WRITE] - return offload_config - - return None - - -def get_default_offload_optimizer_config(): - return OFFLOAD_OPTIMIZER_KEY_DEFAULT_DICT +""" + +from pydantic import Field, validator +from enum import Enum +from pathlib import Path +from deepspeed.runtime.config_utils import DeepSpeedConfigModel + + +class OffloadDeviceEnum(str, Enum): + none = "none" + cpu = "cpu" + nvme = "nvme" + + +class DeepSpeedZeroOffloadParamConfig(DeepSpeedConfigModel): + device: OffloadDeviceEnum = OffloadDeviceEnum.none + nvme_path: Path = None + buffer_count: int = Field(5, ge=0) + buffer_size: int = Field(1e8, ge=0) + max_in_cpu: int = Field(1e9, ge=0) + pin_memory: bool = False + + +class DeepSpeedZeroOffloadOptimizerConfig(DeepSpeedConfigModel): + device: OffloadDeviceEnum = OffloadDeviceEnum.none + nvme_path: Path = None + buffer_count: int = Field(4, ge=0) + pin_memory: bool = False + pipeline_read: bool = False + pipeline_write: bool = False + fast_init: bool = False + + @validator("pipeline_read", "pipeline_write", always=True) + def set_pipeline(cls, field_value, values): + values["pipeline"] = field_value or values.get("pipeline", False) + return field_value diff --git a/deepspeed/runtime/zero/offload_constants.py b/deepspeed/runtime/zero/offload_constants.py deleted file mode 100644 index 436e8bb8a4de..000000000000 --- a/deepspeed/runtime/zero/offload_constants.py +++ /dev/null @@ -1,69 +0,0 @@ -""" -"Copyright 2020 The Microsoft DeepSpeed Team. -Licensed under the MIT license. -""" -######################################### -# TENSOR OFFLOADING -######################################### -OFFLOAD_NONE_DEVICE = "none" -OFFLOAD_CPU_DEVICE = "cpu" -OFFLOAD_NVME_DEVICE = "nvme" -VALID_OFFLOAD_DEVICES = [OFFLOAD_NONE_DEVICE, OFFLOAD_CPU_DEVICE, OFFLOAD_NVME_DEVICE] - -######################################### -# PARAM TENSOR OFFLOADING -######################################### -OFFLOAD_PARAM_FORMAT = ''' -"offload_param": { - "device": [none|cpu|nvme], - "nvme_path": "/local_nvme", - "buffer_count": 5, - "buffer_size": 1e8, - "max_in_cpu": 1e9, - "pin_memory": [true|false] -} -''' -OFFLOAD_PARAM = "offload_param" -OFFLOAD_PARAM_DEVICE = "device" -OFFLOAD_PARAM_DEVICE_DEFAULT = None -OFFLOAD_PARAM_NVME_PATH = "nvme_path" -OFFLOAD_PARAM_NVME_PATH_DEFAULT = None -OFFLOAD_PARAM_BUFFER_COUNT = "buffer_count" -OFFLOAD_PARAM_BUFFER_COUNT_DEFAULT = 5 -OFFLOAD_PARAM_BUFFER_SIZE = "buffer_size" -OFFLOAD_PARAM_BUFFER_SIZE_DEFAULT = 1e8 -OFFLOAD_PARAM_MAX_IN_CPU = "max_in_cpu" -OFFLOAD_PARAM_MAX_IN_CPU_DEFAULT = 1e9 -OFFLOAD_PARAM_PIN_MEMORY = "pin_memory" -OFFLOAD_PARAM_PIN_MEMORY_DEFAULT = False - -######################################### -# OPTIMIZER TENSOR OFFLOADING -######################################### -OFFLOAD_OPTIMIZER_FORMAT = ''' -"offload_optimizer": { - "device": [none|cpu|nvme], - "nvme_path": "/local_nvme", - "buffer_count": 4, - "pin_memory": [true|false], - "pipeline_read": false, - "pipeline_write": false, - "fast_init": false -} -''' -OFFLOAD_OPTIMIZER = "offload_optimizer" -OFFLOAD_OPTIMIZER_DEVICE = "device" -OFFLOAD_OPTIMIZER_DEVICE_DEFAULT = None -OFFLOAD_OPTIMIZER_NVME_PATH = "nvme_path" -OFFLOAD_OPTIMIZER_NVME_PATH_DEFAULT = None -OFFLOAD_OPTIMIZER_BUFFER_COUNT = "buffer_count" -OFFLOAD_OPTIMIZER_BUFFER_COUNT_DEFAULT = 4 -OFFLOAD_OPTIMIZER_PIN_MEMORY = "pin_memory" -OFFLOAD_OPTIMIZER_PIN_MEMORY_DEFAULT = False -OFFLOAD_OPTIMIZER_PIPELINE_READ = "pipeline_read" -OFFLOAD_OPTIMIZER_PIPELINE_READ_DEFAULT = False -OFFLOAD_OPTIMIZER_PIPELINE_WRITE = "pipeline_write" -OFFLOAD_OPTIMIZER_PIPELINE_WRITE_DEFAULT = False -OFFLOAD_OPTIMIZER_PIPELINE = "pipeline" -OFFLOAD_OPTIMIZER_FAST_INIT = "fast_init" -OFFLOAD_OPTIMIZER_FAST_INIT_DEFAULT = False diff --git a/deepspeed/runtime/zero/parameter_offload.py b/deepspeed/runtime/zero/parameter_offload.py index 688b81900e36..e56043b01167 100644 --- a/deepspeed/runtime/zero/parameter_offload.py +++ b/deepspeed/runtime/zero/parameter_offload.py @@ -7,9 +7,9 @@ from torch.cuda import Stream from collections import OrderedDict from deepspeed.runtime.utils import see_memory_usage +from deepspeed.runtime.zero.offload_config import OffloadDeviceEnum from deepspeed.runtime.zero.partition_parameters import _init_external_params from deepspeed.runtime.zero.partition_parameters import * -from deepspeed.runtime.zero.offload_constants import * from deepspeed.runtime.zero.partitioned_param_coordinator import PartitionedParameterCoordinator, iter_params FWD_MODULE_STACK = list() @@ -186,9 +186,8 @@ def __init__(self, self.offload_device = None self.offload_param_pin_memory = False if offload_param_config is not None: - self.offload_device = offload_param_config[OFFLOAD_PARAM_DEVICE] - self.offload_param_pin_memory = offload_param_config[ - OFFLOAD_PARAM_PIN_MEMORY] + self.offload_device = offload_param_config.device + self.offload_param_pin_memory = offload_param_config.pin_memory self._convert_to_zero_parameters(ds_config, module, mpu) @@ -233,7 +232,7 @@ def get_param_coordinator(self, training): max_available_parameters_in_numel=self. _max_available_parameters_in_numel, allgather_stream=self.__allgather_stream, - prefetch_nvme=self.offload_device == OFFLOAD_NVME_DEVICE, + prefetch_nvme=self.offload_device == OffloadDeviceEnum.nvme, ) return self.param_coordinators[training] diff --git a/deepspeed/runtime/zero/partition_parameters.py b/deepspeed/runtime/zero/partition_parameters.py index c08423a64452..bab0e95400d8 100755 --- a/deepspeed/runtime/zero/partition_parameters.py +++ b/deepspeed/runtime/zero/partition_parameters.py @@ -19,20 +19,18 @@ from torch.nn import Parameter from .linear import zero3_linear_wrap -from .offload_constants import * import deepspeed from ..utils import get_only_unique_item, see_memory_usage from deepspeed.runtime.zero.utils import assert_ints_same_as_other_ranks -from deepspeed.utils import instrument_w_nvtx +from deepspeed.runtime.zero.offload_config import OffloadDeviceEnum +from deepspeed.utils import instrument_w_nvtx, logger from deepspeed.comm.comm import init_distributed from deepspeed.utils.debug import (debug_param2name_id_shape, debug_param2name_id_shape_device, debug_module2name, debug_param2name_id, debug_param2name_id_shape_status) -from deepspeed.utils.logging import logger - from ..swap_tensor.partitioned_param_swapper import AsyncPartitionedParameterSwapper, PartitionedParamStatus param_count = 0 @@ -664,8 +662,8 @@ def get_model(): torch.cuda.set_device(self.local_device) if _ds_config is not None and _ds_config.zero_config.offload_param is not None: - remote_device = _ds_config.zero_config.offload_param[OFFLOAD_PARAM_DEVICE] - pin_memory = _ds_config.zero_config.offload_param[OFFLOAD_PARAM_PIN_MEMORY] + remote_device = _ds_config.zero_config.offload_param.device + pin_memory = _ds_config.zero_config.offload_param.pin_memory self._validate_remote_device(remote_device, _ds_config) @@ -673,10 +671,10 @@ def get_model(): # It can be same as local_device or it could be CPU or NVMe. self.remote_device = self.local_device if remote_device is None else remote_device self.pin_memory = pin_memory if (self.remote_device - == OFFLOAD_CPU_DEVICE) else False + == OffloadDeviceEnum.cpu) else False # Enable fp16 param swapping to NVMe - if self.remote_device == OFFLOAD_NVME_DEVICE: + if self.remote_device == OffloadDeviceEnum.nvme: self.param_swapper = AsyncPartitionedParameterSwapper(_ds_config, self.dtype) else: self.param_swapper = None @@ -702,19 +700,18 @@ def _convert_to_zero_parameters(self, param_list): def _validate_remote_device(self, remote_device, ds_config): if ds_config is not None: - if remote_device in [None, OFFLOAD_CPU_DEVICE]: + if remote_device in [None, OffloadDeviceEnum.cpu]: if ds_config.zero_config.offload_param is not None: - offload_param_device = ds_config.zero_config.offload_param[ - OFFLOAD_PARAM_DEVICE] - assert offload_param_device != OFFLOAD_NVME_DEVICE, \ - f"{OFFLOAD_PARAM_DEVICE} in DeepSpeed Config cannot be {offload_param_device} if remote device is {remote_device}." + offload_param_device = ds_config.zero_config.offload_param.device + assert offload_param_device != OffloadDeviceEnum.nvme, \ + f"'device' in DeepSpeed Config cannot be {offload_param_device} if remote device is {remote_device}." - if remote_device == OFFLOAD_NVME_DEVICE: + if remote_device == OffloadDeviceEnum.nvme: assert ds_config.zero_config.offload_param is not None, \ - f'{OFFLOAD_PARAM} must be defined in DeepSpeed Config if remote device is {OFFLOAD_NVME_DEVICE}.' + f'"offload_param" must be defined in DeepSpeed Config if remote device is {OffloadDeviceEnum.nvme}.' - assert ds_config.zero_config.offload_param[OFFLOAD_PARAM_NVME_PATH] is not None, \ - f'{OFFLOAD_PARAM_NVME_PATH} in DeepSpeed Config cannot be None if remote device is {OFFLOAD_NVME_DEVICE}' + assert ds_config.zero_config.offload_param.nvme_path is not None, \ + f'"nvme_path" in DeepSpeed Config cannot be None if remote device is {OffloadDeviceEnum.nvme}' def _post_init_method(self, module): #see_memory_usage(f"Before converting parmas in {module.__class__.__name__}", force=False) @@ -970,10 +967,10 @@ def _ensure_availability_of_partitioned_params(self, params): swap_in_flight = [] for param in params: if param.ds_tensor.status == PartitionedParamStatus.NOT_AVAILABLE: - assert param.ds_tensor.final_location == OFFLOAD_NVME_DEVICE and param.ds_status == ZeroParamStatus.NOT_AVAILABLE + assert param.ds_tensor.final_location == OffloadDeviceEnum.nvme and param.ds_status == ZeroParamStatus.NOT_AVAILABLE swap_in_list.append(param) if param.ds_tensor.status == PartitionedParamStatus.INFLIGHT: - assert param.ds_tensor.final_location == OFFLOAD_NVME_DEVICE and param.ds_status == ZeroParamStatus.NOT_AVAILABLE + assert param.ds_tensor.final_location == OffloadDeviceEnum.nvme and param.ds_status == ZeroParamStatus.NOT_AVAILABLE swap_in_flight.append(param) if len(swap_in_list) > 0: swap_in_list[0].nvme_swapper.swap_in(swap_in_list, async_op=False) @@ -1056,7 +1053,7 @@ def _partition_param(self, param, buffer=None, has_been_updated=False): see_memory_usage(f'After partitioning param {param.ds_id} {param.shape}', force=False) - if param.ds_tensor.final_location == OFFLOAD_NVME_DEVICE: + if param.ds_tensor.final_location == OffloadDeviceEnum.nvme: print_rank_0( f"Param {param.ds_id} partition released since it exists in nvme", force=False) @@ -1069,9 +1066,9 @@ def _partition_param(self, param, buffer=None, has_been_updated=False): if param.ds_tensor is None: final_location = None - if self.remote_device == OFFLOAD_NVME_DEVICE and self.param_swapper.swappable_tensor( + if self.remote_device == OffloadDeviceEnum.nvme and self.param_swapper.swappable_tensor( numel=partition_size): - final_location = OFFLOAD_NVME_DEVICE + final_location = OffloadDeviceEnum.nvme buffer = self.param_swapper.get_buffer(param, partition_size) partitioned_tensor = torch.empty(0, dtype=param.dtype, @@ -1085,8 +1082,8 @@ def _partition_param(self, param, buffer=None, has_been_updated=False): partitioned_tensor = torch.empty( partition_size, dtype=param.dtype, - device=OFFLOAD_CPU_DEVICE if self.remote_device - == OFFLOAD_NVME_DEVICE else self.remote_device) + device=OffloadDeviceEnum.cpu if self.remote_device + == OffloadDeviceEnum.nvme else self.remote_device) if self.pin_memory: partitioned_tensor = partitioned_tensor.pin_memory() @@ -1136,7 +1133,7 @@ def _partition_param(self, param, buffer=None, has_been_updated=False): see_memory_usage(f'After partitioning param {param.ds_id} {param.shape}', force=False) - if param.ds_tensor.final_location == OFFLOAD_NVME_DEVICE: + if param.ds_tensor.final_location == OffloadDeviceEnum.nvme: self.param_swapper.swap_out_and_release([param]) print_rank_0( f"ID {param.ds_id} Offloaded to nvme offload and buffers released.") diff --git a/deepspeed/runtime/zero/partitioned_param_coordinator.py b/deepspeed/runtime/zero/partitioned_param_coordinator.py index 323b0f8e2e69..6a923805eb90 100644 --- a/deepspeed/runtime/zero/partitioned_param_coordinator.py +++ b/deepspeed/runtime/zero/partitioned_param_coordinator.py @@ -9,8 +9,10 @@ from typing import Deque, Set from torch.cuda import Event, Stream +from deepspeed import comm as dist +from deepspeed.utils.logging import logger +from deepspeed.runtime.zero.offload_config import OffloadDeviceEnum from deepspeed.runtime.zero.partition_parameters import * -from deepspeed.runtime.zero.offload_constants import * from deepspeed.runtime.swap_tensor.partitioned_param_swapper import PartitionedParamStatus from deepspeed.utils.debug import debug_module2name_id, debug_param2name_id @@ -308,7 +310,7 @@ def _is_currently_on_nvme(param): if param.nvme_swapper is None: return False - return param.ds_tensor.final_location == OFFLOAD_NVME_DEVICE \ + return param.ds_tensor.final_location == OffloadDeviceEnum.nvme \ and param.ds_tensor.status == PartitionedParamStatus.NOT_AVAILABLE # kick off all gather for params in the next few submodules (prefetch) diff --git a/deepspeed/runtime/zero/stage3.py b/deepspeed/runtime/zero/stage3.py index b3daefa3768d..fd1322ad2f77 100755 --- a/deepspeed/runtime/zero/stage3.py +++ b/deepspeed/runtime/zero/stage3.py @@ -15,11 +15,11 @@ from deepspeed.runtime.comm.coalesced_collectives import reduce_scatter_coalesced from deepspeed.runtime.utils import get_global_norm, is_model_parallel_parameter from deepspeed.runtime.zero.partition_parameters import * +from deepspeed.runtime.zero.config import ZeroStageEnum +from deepspeed.runtime.zero.offload_config import OffloadDeviceEnum from deepspeed.runtime.zero.parameter_offload import DeepSpeedZeRoOffload -from deepspeed.runtime.zero.constants import ZERO_OPTIMIZATION_WEIGHTS from deepspeed.ops.adam import DeepSpeedCPUAdam from deepspeed.ops.op_builder import UtilsBuilder -from deepspeed.runtime.zero.offload_constants import * from deepspeed.runtime.swap_tensor.partitioned_param_swapper import PartitionedParamStatus from deepspeed.runtime.swap_tensor.partitioned_optimizer_swapper import PartitionedOptimizerSwapper from deepspeed.runtime.swap_tensor.pipelined_optimizer_swapper import PipelinedOptimizerSwapper @@ -171,7 +171,7 @@ def __init__(self, and type(init_optimizer) == DeepSpeedCPUAdam) self.device = torch.cuda.current_device( - ) if not self.offload_optimizer else OFFLOAD_CPU_DEVICE + ) if not self.offload_optimizer else OffloadDeviceEnum.cpu ### streams used for overlapping computation with communication self.__reduce_and_partition_stream = Stream( ) if overlap_comm else torch.cuda.default_stream() @@ -443,35 +443,28 @@ def _configure_offloading(self, offload_optimizer_config, offload_param_config): ###################### offload optimizer setup ################################## if offload_optimizer_config is not None: self.offload_optimizer = True - self.offload_optimizer_pin_memory = offload_optimizer_config[ - OFFLOAD_OPTIMIZER_PIN_MEMORY] - self.swap_optimizer = offload_optimizer_config[ - OFFLOAD_OPTIMIZER_DEVICE] == OFFLOAD_NVME_DEVICE - self.offload_optimizer_fast_init = offload_optimizer_config[ - OFFLOAD_OPTIMIZER_FAST_INIT] + self.offload_optimizer_pin_memory = offload_optimizer_config.pin_memory + self.swap_optimizer = offload_optimizer_config.device == OffloadDeviceEnum.nvme + self.offload_optimizer_fast_init = offload_optimizer_config.fast_init ###################### offload param setup ################################## if offload_param_config is not None: self.offload_param = True - self.offload_param_pin_memory = offload_param_config[ - OFFLOAD_PARAM_PIN_MEMORY] - self.params_in_nvme_and_cpu = offload_param_config[ - OFFLOAD_PARAM_DEVICE] == OFFLOAD_NVME_DEVICE - self.max_params_in_cpu = offload_param_config[OFFLOAD_PARAM_MAX_IN_CPU] + self.offload_param_pin_memory = offload_param_config.pin_memory + self.params_in_nvme_and_cpu = offload_param_config.device == OffloadDeviceEnum.nvme + self.max_params_in_cpu = offload_param_config.max_in_cpu print_rank_0( f"FP16 params swapping is {self.params_in_nvme_and_cpu}, Max params in CPU is {self.max_params_in_cpu}", force=False) def _configure_tensor_swapping(self, offload_optimizer_config, aio_config): - nvme_swap_folder = os.path.join( - offload_optimizer_config[OFFLOAD_OPTIMIZER_NVME_PATH], - 'zero_stage_3') + nvme_swap_folder = os.path.join(offload_optimizer_config.nvme_path, + 'zero_stage_3') os.makedirs(nvme_swap_folder, exist_ok=True) if dist.get_rank() == 0: logger.info(f'Tensor Swapping: Adding optimizer tensors') - swapper_type = PipelinedOptimizerSwapper if offload_optimizer_config[ - OFFLOAD_OPTIMIZER_PIPELINE] else PartitionedOptimizerSwapper + swapper_type = PipelinedOptimizerSwapper if offload_optimizer_config.pipeline else PartitionedOptimizerSwapper self.optimizer_swapper = swapper_type( swap_config=offload_optimizer_config, @@ -2196,7 +2189,7 @@ def _clear_fp32_optimizer_param_groups(self): def _rigid_state_dict(self): state_dict = {} - state_dict[ZERO_STAGE] = ZERO_OPTIMIZATION_WEIGHTS + state_dict[ZERO_STAGE] = ZeroStageEnum.weights state_dict['loss_scaler'] = self.loss_scaler state_dict['dynamic_loss_scale'] = self.dynamic_loss_scale state_dict['overflow'] = self.overflow @@ -2522,11 +2515,11 @@ def estimate_zero3_model_states_mem_needs_all_cold(total_params, """ def format_options(cpu_offload, cpu_offload_params, zero_init): enabled = [] - padded_cpu_str = f'{OFFLOAD_CPU_DEVICE:4}' + padded_cpu_str = f'{OffloadDeviceEnum.cpu:4}' param_device = padded_cpu_str if cpu_offload_params else "none" - enabled.append(f"{OFFLOAD_PARAM}={param_device}") + enabled.append(f"offload_param={param_device}") optimizer_device = padded_cpu_str if cpu_offload else "none" - enabled.append(f"{OFFLOAD_OPTIMIZER}={optimizer_device}") + enabled.append(f"offload_optimizer={optimizer_device}") enabled.append(f"zero_init={1 if zero_init else 0}") return ", ".join(enabled) diff --git a/deepspeed/runtime/zero/stage_1_and_2.py b/deepspeed/runtime/zero/stage_1_and_2.py index c36c17dc02e4..25be812b5d1e 100755 --- a/deepspeed/runtime/zero/stage_1_and_2.py +++ b/deepspeed/runtime/zero/stage_1_and_2.py @@ -16,8 +16,8 @@ align_dense_tensors, all_gather_dp_groups) -from deepspeed.runtime.zero.constants import ZERO_OPTIMIZATION_GRADIENTS, ZERO_OPTIMIZATION_OPTIMIZER_STATES -from deepspeed.runtime.zero.offload_constants import OFFLOAD_CPU_DEVICE, OFFLOAD_OPTIMIZER +from deepspeed.runtime.zero.config import ZeroStageEnum +from deepspeed.runtime.zero.offload_config import OffloadDeviceEnum from deepspeed.ops.adam import DeepSpeedCPUAdam from deepspeed.ops.op_builder import UtilsBuilder from deepspeed.utils import logger @@ -2048,7 +2048,7 @@ def state_dict(self): state_dict[SINGLE_PARTITION_OF_FP32_GROUPS] = fp32_groups_without_padding state_dict[ - ZERO_STAGE] = ZERO_OPTIMIZATION_GRADIENTS if self.partition_gradients else ZERO_OPTIMIZATION_OPTIMIZER_STATES + ZERO_STAGE] = ZeroStageEnum.gradients if self.partition_gradients else ZeroStageEnum.optimizer_states state_dict[GROUP_PADDINGS] = self.groups_padding state_dict[PARTITION_COUNT] = self.partition_count @@ -2359,8 +2359,8 @@ def estimate_zero2_model_states_mem_needs_all_cold(total_params, """ def format_options(cpu_offload): enabled = [] - device = f'{OFFLOAD_CPU_DEVICE:4}' if cpu_offload else "none" - enabled.append(f"{OFFLOAD_OPTIMIZER}={device}") + device = f'{OffloadDeviceEnum.cpu:4}' if cpu_offload else "none" + enabled.append(f"offload_optimizer={device}") return ", ".join(enabled) nodes_str = "nodes" if num_nodes > 1 else "node" diff --git a/tests/unit/test_config.py b/tests/unit/test_config.py index a493fd9ca505..feae74eef9c0 100755 --- a/tests/unit/test_config.py +++ b/tests/unit/test_config.py @@ -124,11 +124,9 @@ def test_temp_config_json(tmpdir): ]) def test_gather_16bit_params_on_model_save(gather_weights_key): config_dict = { - "zero_optimization": { - gather_weights_key: True, - }, + gather_weights_key: True, } - config = DeepSpeedZeroConfig(config_dict) + config = DeepSpeedZeroConfig(**config_dict) assert config.gather_16bit_weights_on_model_save == True diff --git a/tests/unit/test_ds_config.py b/tests/unit/test_ds_config.py index 728a46bbbb1b..f0144a0df6b5 100755 --- a/tests/unit/test_ds_config.py +++ b/tests/unit/test_ds_config.py @@ -1,7 +1,20 @@ import pytest import os import json +from pydantic import Field, ValidationError +from typing import List from deepspeed.runtime import config as ds_config +from deepspeed.runtime.config_utils import DeepSpeedConfigModel + + +class SimpleConf(DeepSpeedConfigModel): + param_1: int = 0 + param_2_old: str = Field(None, + deprecated=True, + new_param="param_2", + new_param_fn=(lambda x: [x])) + param_2: List[str] = None + param_3: int = Field(0, alias="param_3_alias") def test_only_required_fields(tmpdir): @@ -33,3 +46,41 @@ def test_config_duplicate_key(tmpdir): with pytest.raises(ValueError): run_cfg = ds_config.DeepSpeedConfig(config_path) + + +def test_config_base(): + config = SimpleConf(**{"param_1": 42}) + assert config.param_1 == 42 + + +def test_config_base_deprecatedfield(): + config = SimpleConf(**{"param_2_old": "DS"}) + assert config.param_2 == ["DS"] + + +def test_config_base_aliasfield(): + config = SimpleConf(**{"param_3": 10}) + assert config.param_3 == 10 + + config = SimpleConf(**{"param_3_alias": 10}) + assert config.param_3 == 10 + + +@pytest.mark.parametrize("config_dict", + [{ + "param_1": "DS" + }, + { + "param_2": "DS" + }, + { + "param_1_typo": 0 + }]) +def test_config_base_literalfail(config_dict): + with pytest.raises(ValidationError): + config = SimpleConf(**config_dict) + + +def test_config_base_deprecatedfail(): + with pytest.raises(AssertionError): + config = SimpleConf(**{"param_2": ["DS"], "param_2_old": "DS"}) diff --git a/tests/unit/test_zero_config.py b/tests/unit/test_zero_config.py new file mode 100755 index 000000000000..252098fd5a27 --- /dev/null +++ b/tests/unit/test_zero_config.py @@ -0,0 +1,72 @@ +from deepspeed.runtime.zero.config import DeepSpeedZeroConfig, DeepSpeedZeroOffloadParamConfig, DeepSpeedZeroOffloadOptimizerConfig + + +def test_zero_config_deprecatedfields(): + config = DeepSpeedZeroConfig(**{"cpu_offload_param": True}) + assert isinstance(config.offload_param, DeepSpeedZeroOffloadParamConfig) + + config = DeepSpeedZeroConfig(**{"cpu_offload": True}) + assert isinstance(config.offload_optimizer, DeepSpeedZeroOffloadOptimizerConfig) + + config = DeepSpeedZeroConfig(**{"stage3_gather_fp16_weights_on_model_save": True}) + assert config.gather_16bit_weights_on_model_save == True + + +def test_zero_config_aliasfields(): + config = DeepSpeedZeroConfig(**{"stage3_prefetch_bucket_size": 12345}) + assert config.prefetch_bucket_size == 12345 + + config = DeepSpeedZeroConfig(**{"stage3_param_persistence_threshold": 12345}) + assert config.param_persistence_threshold == 12345 + + config = DeepSpeedZeroConfig(**{"stage3_max_reuse_distance": 12345}) + assert config.max_reuse_distance == 12345 + + config = DeepSpeedZeroConfig(**{"stage3_gather_16bit_weights_on_model_save": True}) + assert config.gather_16bit_weights_on_model_save == True + + +def test_zero_config_overlapcomm(): + for stage in [0, 1, 2]: + config = DeepSpeedZeroConfig(**{"stage": stage}) + assert config.overlap_comm == False + + config = DeepSpeedZeroConfig(**{"stage": 3}) + assert config.overlap_comm == True + + +def test_zero_config_offload_configs(): + config = DeepSpeedZeroConfig() + assert config.offload_param == None + assert config.offload_optimizer == None + + config = DeepSpeedZeroConfig(**{"offload_param": None, "offload_optimizer": None}) + assert config.offload_param == None + assert config.offload_optimizer == None + + config = DeepSpeedZeroConfig(**{"offload_param": {}, "offload_optimizer": {}}) + assert isinstance(config.offload_param, DeepSpeedZeroOffloadParamConfig) + assert isinstance(config.offload_optimizer, DeepSpeedZeroOffloadOptimizerConfig) + + +def test_zero_offload_optimizer_config_pipeline(): + config = DeepSpeedZeroOffloadOptimizerConfig() + assert config.pipeline == False + + config = DeepSpeedZeroOffloadOptimizerConfig(**{ + "pipeline_read": True, + "pipeline_write": False + }) + assert config.pipeline == True + + config = DeepSpeedZeroOffloadOptimizerConfig(**{ + "pipeline_read": False, + "pipeline_write": True + }) + assert config.pipeline == True + + config = DeepSpeedZeroOffloadOptimizerConfig(**{ + "pipeline_read": True, + "pipeline_write": True + }) + assert config.pipeline == True From be46ff6db207ab0d66baaed6a938a48838102d77 Mon Sep 17 00:00:00 2001 From: Quentin Anthony Date: Wed, 27 Jul 2022 10:12:47 -0700 Subject: [PATCH 25/38] Add purely-local sliding window sparse attention config (#1962) Co-authored-by: Olatunji Ruwase Co-authored-by: Jeff Rasley --- deepspeed/ops/sparse_attention/__init__.py | 2 +- .../ops/sparse_attention/sparsity_config.py | 60 +++++++++++++++++++ tests/unit/test_sparse_attention.py | 10 ++++ 3 files changed, 71 insertions(+), 1 deletion(-) diff --git a/deepspeed/ops/sparse_attention/__init__.py b/deepspeed/ops/sparse_attention/__init__.py index b7e1db35845e..c36b48b85ea8 100644 --- a/deepspeed/ops/sparse_attention/__init__.py +++ b/deepspeed/ops/sparse_attention/__init__.py @@ -1,4 +1,4 @@ -from .sparsity_config import SparsityConfig, DenseSparsityConfig, FixedSparsityConfig, VariableSparsityConfig, BigBirdSparsityConfig, BSLongformerSparsityConfig +from .sparsity_config import SparsityConfig, DenseSparsityConfig, FixedSparsityConfig, VariableSparsityConfig, BigBirdSparsityConfig, BSLongformerSparsityConfig, LocalSlidingWindowSparsityConfig from .sparse_self_attention import SparseSelfAttention from .bert_sparse_self_attention import BertSparseSelfAttention from .sparse_attention_utils import SparseAttentionUtils diff --git a/deepspeed/ops/sparse_attention/sparsity_config.py b/deepspeed/ops/sparse_attention/sparsity_config.py index 1f0dce4f0b31..efdad2e4d7e5 100644 --- a/deepspeed/ops/sparse_attention/sparsity_config.py +++ b/deepspeed/ops/sparse_attention/sparsity_config.py @@ -681,3 +681,63 @@ def make_layout(self, seq_len): layout = self.check_and_propagate_first_head_layout(layout) return layout + + +class LocalSlidingWindowSparsityConfig(SparsityConfig): + """Configuration class to store `Local Sliding Window` sparsity configuration - a purely-local sliding window attention. + This class extends parent class of `SparsityConfig` and customizes it for `Local` sparsity. + """ + def __init__(self, + num_heads, + block=16, + num_sliding_window_blocks=3, + attention='unidirectional'): + """Initialize the Local Sliding Window Sparsity Pattern Config. + For usage example please see, TODO DeepSpeed Sparse Transformer Tutorial + Arguments: + num_heads: required: an integer determining number of attention heads of the layer. + block: optional: an integer determining the block size. Current implementation of sparse self-attention is based on blocked sparse matrices. In which this parameter defines size of such blocks, `Block X Block`. + num_sliding_window_blocks: optional: an integer determining the number of blocks in sliding local attention window. + attention: optional: a string determining attention type. Attention can be `unidirectional`, such as autoregressive models, in which tokens attend only to tokens appear before them in the context. Considering that, the upper triangular of attention matrix is empty as above figure. Or it can be `bidirectional`, such as BERT, in which tokens can attend to any other tokens before or after them. Then, the upper triangular part of the attention matrix is mirror of the lower triangular in the above figure. + """ + + super().__init__(num_heads, block) + self.num_sliding_window_blocks = num_sliding_window_blocks + self.attention = attention + + def set_sliding_window_layout(self, h, layout): + """Sets sliding local attention layout used by the given head in the sparse attention. + Arguments: + h: required: an integer determining head index + layout: required: a tensor of dimension (num_heads, num_blocks, num_blocks) containing sparsity layout of all head; may not be completely set at this step + Return: + layout: a tensor of dimension (num_heads, num_blocks, num_blocks) containing sparsity layout of all head in which local sliding window layout is set + """ + + num_blocks = layout.shape[1] + if (num_blocks < self.num_sliding_window_blocks): + raise ValueError( + f'Number of sliding window blocks, {self.num_sliding_window_blocks}, must be smaller than overal number of blocks in a row, {num_blocks}!' + ) + + w = self.num_sliding_window_blocks // 2 + for row in range(0, num_blocks): + start = max(0, row - w) + end = min(row + w + 1, + num_blocks) if self.attention == "bidirectional" else row + 1 + layout[h, row, start:end] = 1 + return layout + + def make_layout(self, seq_len): + """Generates `Local Sliding Window` sparsity layout used by each head in the sparse attention. + Arguments: + seq_len: required: an integer determining number of attention heads of the layer. + Return: + layout: a tensor of dimension (num_heads, num_blocks, num_blocks) containing `BigBird` sparsity layout of all head + """ + + layout = self.setup_layout(seq_len) + for h in range(0, self.num_layout_heads): + layout = self.set_sliding_window_layout(h, layout) + layout = self.check_and_propagate_first_head_layout(layout) + return layout diff --git a/tests/unit/test_sparse_attention.py b/tests/unit/test_sparse_attention.py index f3079982c964..4c35251fa816 100755 --- a/tests/unit/test_sparse_attention.py +++ b/tests/unit/test_sparse_attention.py @@ -103,6 +103,16 @@ def test_bslongformersparsityconfig_module_availability(): return True +def test_localwindowsparsityconfig_module_availability(): + return True + try: + from deepspeed.ops.sparse_attention import LocalSlidingWindowSparsityConfig + except ImportError: + print("LocalSlidingWindowSparsityConfig Module is not installed!") + return False + return True + + def test_sparseselfattention_module_availability(): return True try: From b442264dc935afc1b768e9c3abcc448695de2e77 Mon Sep 17 00:00:00 2001 From: Jeff Rasley Date: Wed, 27 Jul 2022 10:54:38 -0700 Subject: [PATCH 26/38] formatting fix for #1962 --- tests/unit/test_sparse_attention.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/unit/test_sparse_attention.py b/tests/unit/test_sparse_attention.py index 4c35251fa816..8ff843c93169 100755 --- a/tests/unit/test_sparse_attention.py +++ b/tests/unit/test_sparse_attention.py @@ -106,7 +106,7 @@ def test_bslongformersparsityconfig_module_availability(): def test_localwindowsparsityconfig_module_availability(): return True try: - from deepspeed.ops.sparse_attention import LocalSlidingWindowSparsityConfig + from deepspeed.ops.sparse_attention import LocalSlidingWindowSparsityConfig # noqa: F401 except ImportError: print("LocalSlidingWindowSparsityConfig Module is not installed!") return False From a54661a06f71e85bc9320066ca8e2be0cda4f779 Mon Sep 17 00:00:00 2001 From: Jeff Rasley Date: Wed, 27 Jul 2022 13:45:15 -0700 Subject: [PATCH 27/38] force newer datasets version (#2147) --- .github/workflows/nv-accelerate-v100.yml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/.github/workflows/nv-accelerate-v100.yml b/.github/workflows/nv-accelerate-v100.yml index 20743dc6d858..5b0cc6283468 100644 --- a/.github/workflows/nv-accelerate-v100.yml +++ b/.github/workflows/nv-accelerate-v100.yml @@ -54,5 +54,7 @@ jobs: pip install .[testing] # force protobuf version due to issues pip install "protobuf<4.21.0" + # tmp fix: force newer datasets version + pip install "datasets>=2.0.0" pip list TORCH_EXTENSIONS_DIR=./torch-extensions pytest --color=yes --durations=0 --verbose tests/deepspeed From e669aaf55b166a5adc3e33aa92c6d81662fdf908 Mon Sep 17 00:00:00 2001 From: trajep <2277278452@qq.com> Date: Thu, 28 Jul 2022 19:34:38 +0800 Subject: [PATCH 28/38] Trajepl/nebula ckpt engine (#2085) * enable checkpoint engine * seprated nebula config * add __init__.py for nebula importing * linter fix * fix: ds_config is None * fix: ds config * fix: get sd loader fix * align the API with torch raw code * linter fix * remove duplicate tag params * make checkpoint_engine as required args * fix args * extract parameters out to config * fix: load state dict * separate load engine * linter fix * extract checkpoint engine to abstract calss * linter fix * construct function args fix * add docs for dev/customers * linter fix * remove load engine * print->log_dist * linter fix * add tag flag to distinguish the loading order Co-authored-by: Olatunji Ruwase Co-authored-by: Michael Wyatt Co-authored-by: Jeff Rasley --- deepspeed/inference/engine.py | 11 ++- deepspeed/launcher/launch.py | 12 +++ deepspeed/launcher/runner.py | 4 +- deepspeed/nebula/__init__.py | 0 deepspeed/nebula/config.py | 53 +++++++++++ deepspeed/nebula/constants.py | 86 ++++++++++++++++++ deepspeed/runtime/checkpoint_engine/README.md | 37 ++++++++ .../runtime/checkpoint_engine/__init__.py | 0 .../checkpoint_engine/checkpoint_engine.py | 19 ++++ .../nebula_checkpoint_engine.py | 88 +++++++++++++++++++ .../torch_checkpoint_engine.py | 28 ++++++ deepspeed/runtime/config.py | 4 + deepspeed/runtime/engine.py | 66 +++++++++----- deepspeed/runtime/pipe/engine.py | 7 +- deepspeed/runtime/pipe/module.py | 11 ++- deepspeed/runtime/state_dict_factory.py | 47 ++++++---- tests/unit/test_checkpointing.py | 6 +- 17 files changed, 429 insertions(+), 50 deletions(-) create mode 100644 deepspeed/nebula/__init__.py create mode 100644 deepspeed/nebula/config.py create mode 100644 deepspeed/nebula/constants.py create mode 100644 deepspeed/runtime/checkpoint_engine/README.md create mode 100644 deepspeed/runtime/checkpoint_engine/__init__.py create mode 100644 deepspeed/runtime/checkpoint_engine/checkpoint_engine.py create mode 100644 deepspeed/runtime/checkpoint_engine/nebula_checkpoint_engine.py create mode 100644 deepspeed/runtime/checkpoint_engine/torch_checkpoint_engine.py diff --git a/deepspeed/inference/engine.py b/deepspeed/inference/engine.py index 173f2587de70..8af9a12c2809 100755 --- a/deepspeed/inference/engine.py +++ b/deepspeed/inference/engine.py @@ -9,6 +9,7 @@ from torch.nn.modules import Module from packaging import version as pkg_version +from deepspeed.runtime.checkpoint_engine.torch_checkpoint_engine import TorchCheckpointEngine from ..runtime.state_dict_factory import SDLoaderFactory from ..runtime.weight_quantizer import WeightQuantization @@ -92,6 +93,7 @@ def __init__(self, self.expert_mp_group = expert_mp_group self.enable_cuda_graph = enable_cuda_graph self.cuda_graph_created = False + self.checkpoint_engine = TorchCheckpointEngine() self._init_quantization_setting(quantization_setting) if enable_cuda_graph: @@ -376,9 +378,10 @@ def _load_checkpoint(self, load_dir, load_module_strict=True, tag=None): tag = fd.read().strip() ckpt_list = self._get_all_ckpt_names(load_dir, tag) - sd_loader = SDLoaderFactory.get_sd_loader(ckpt_list) + sd_loader = SDLoaderFactory.get_sd_loader(ckpt_list, self.checkpoint_engine) else: - sd_loader = SDLoaderFactory.get_sd_loader_json(load_dir) + sd_loader = SDLoaderFactory.get_sd_loader_json(load_dir, + self.checkpoint_engine) if type(sd_loader) is list: self.sd = torch.load(sd_loader[0], map_location='cpu') @@ -416,10 +419,12 @@ def _load_checkpoint(self, load_dir, load_module_strict=True, tag=None): state_dict=checkpoint[self._choose_module_key(checkpoint)], old_moe_load=old_moe_load, model=self.module, - mpu=self.mpu) + mpu=self.mpu, + checkpoint_engine=self.checkpoint_engine) self.module.load_state_dict( state_dict=checkpoint[self._choose_module_key(checkpoint)], + checkpoint_engine=self.checkpoint_engine, strict=load_module_strict) def _choose_module_key(self, sd): diff --git a/deepspeed/launcher/launch.py b/deepspeed/launcher/launch.py index 06321cbf90b3..c7113c13f53d 100755 --- a/deepspeed/launcher/launch.py +++ b/deepspeed/launcher/launch.py @@ -19,6 +19,7 @@ from argparse import ArgumentParser, REMAINDER from ..constants import TORCH_DISTRIBUTED_DEFAULT_PORT +from ..nebula.constants import DLTS_POD_ENV_PATH from ..utils import logger PID_FILE_BASEPATH = "/tmp" @@ -143,6 +144,17 @@ def main(): with open(pid_file, 'w') as fd: fd.write(f"{launcher_pid}") + if os.path.exists(DLTS_POD_ENV_PATH): + with open(DLTS_POD_ENV_PATH) as file: + lines = file.readlines() + lines = [line.rstrip() for line in lines] + for line in lines: + if line.startswith('export FC_TASKROLE_NAME') or line.startswith( + 'export FC_TASK_INDEX'): + key_val = line.split()[1] + key, val = key_val.split('=') + current_env[key] = val + processes = [] cmd = [] for local_rank in range(0, num_local_procs): diff --git a/deepspeed/launcher/runner.py b/deepspeed/launcher/runner.py index be25715660db..cf3e98dc25bb 100755 --- a/deepspeed/launcher/runner.py +++ b/deepspeed/launcher/runner.py @@ -20,12 +20,14 @@ from .multinode_runner import PDSHRunner, OpenMPIRunner, MVAPICHRunner from .constants import PDSH_LAUNCHER, OPENMPI_LAUNCHER, MVAPICH_LAUNCHER from ..constants import TORCH_DISTRIBUTED_DEFAULT_PORT +from ..nebula.constants import NEBULA_EXPORT_ENVS from ..utils import logger from ..autotuning import Autotuner DLTS_HOSTFILE = "/job/hostfile" -EXPORT_ENVS = ["NCCL", "PYTHON", "MV2", "UCX"] +EXPORT_ENVS = ['NCCL', 'PYTHON', 'MV2', 'UCX'] +EXPORT_ENVS += NEBULA_EXPORT_ENVS DEEPSPEED_ENVIRONMENT_NAME = ".deepspeed_env" DEEPSPEED_ENVIRONMENT_PATHS = [os.path.expanduser("~"), '.'] PDSH_MAX_FAN_OUT = 1024 diff --git a/deepspeed/nebula/__init__.py b/deepspeed/nebula/__init__.py new file mode 100644 index 000000000000..e69de29bb2d1 diff --git a/deepspeed/nebula/config.py b/deepspeed/nebula/config.py new file mode 100644 index 000000000000..f9928d66147c --- /dev/null +++ b/deepspeed/nebula/config.py @@ -0,0 +1,53 @@ +""" +Copyright (c) Microsoft Corporation +Licensed under the MIT license. +""" + +from deepspeed.runtime.config_utils import get_scalar_param, DeepSpeedConfigObject +from deepspeed.nebula.constants import * + + +class DeepSpeedNebulaConfig(DeepSpeedConfigObject): + def __init__(self, param_dict): + super(DeepSpeedNebulaConfig, self).__init__() + + self.enabled = None + self.persistent_storage_path = None + self.persistent_time_interval = None + self.num_of_version_in_retention = None + self.enable_nebula_load = None + + if NEBULA in param_dict.keys(): + nebula_dict = param_dict[NEBULA] + else: + nebula_dict = {} + + self._initialize(nebula_dict) + + def _initialize(self, nebula_dict): + self.enabled = get_scalar_param(nebula_dict, + NEBULA_ENABLED, + NEBULA_ENABLED_DEFAULT) + + self.load_path = get_scalar_param(nebula_dict, + NEBULA_LOAD_PATH, + NEBULA_LOAD_PATH_DEFAULT) + + self.enable_nebula_load = get_scalar_param(nebula_dict, + NEBULA_ENABLE_NEBULA_LOAD, + NEBULA_ENABLE_NEBULA_LOAD_DEFAULT) + + self.persistent_storage_path = get_scalar_param( + nebula_dict, + NEBULA_PERSISTENT_STORAGE_PATH, + NEBULA_PERSISTENT_STORAGE_PATH_DEFAULT) + + self.persistent_time_interval = get_scalar_param( + nebula_dict, + NEBULA_PERSISTENT_TIME_INTERVAL, + NEBULA_PERSISTENT_TIME_INTERVAL_DEFAULT) + + self.num_of_version_in_retention = get_scalar_param( + nebula_dict, + NEBULA_NUM_OF_VERSION_IN_RETENTION, + NEBULA_NUM_OF_VERSION_IN_RETENTION_DEFAULT) diff --git a/deepspeed/nebula/constants.py b/deepspeed/nebula/constants.py new file mode 100644 index 000000000000..0e66fa8d1536 --- /dev/null +++ b/deepspeed/nebula/constants.py @@ -0,0 +1,86 @@ +""" +Copyright (c) Microsoft Corporation +Licensed under the MIT license. +""" + +######################################### +# nebula +######################################### +# Nebula. By default, this feature is not enabled. +# Users can configure in ds_config.json as below example: +NEBULA_FORMAT = ''' +nebula should be enabled as: +"session_params": { + "nebula": { + "enabled": true, + "persistent_storage_path": "/foo/bar", + "persistent_time_interval": 100, + "num_of_version_in_retention": 2, + "enable_nebula_load": true + } +} +''' + +NEBULA = "nebula" + +NEBULA_ENABLED = "enabled" +NEBULA_ENABLED_DEFAULT = False + +# There is a case where customer want to load the checkpoint saved +# by raw torch. Because nebula cannot load torch checkpoint directly +# as they have different folder structures to bring the gap for +# loading(the data are totaly same in bytes for torch and enbula s +# aving). +# In this case, we must disable nebula load to use raw torch load. +# Customer can just set NEBULA_ENABLE_NEBULA_LOAD to False. Then use +# original way of deepspeed to load, i.e. set the value of "--load". +NEBULA_ENABLE_NEBULA_LOAD = "enable_nebula_load" +NEBULA_ENABLE_NEBULA_LOAD_DEFAULT = True + +# When you want to resume the previous checkpoint saved by nebula, +# you can set NEBULA_LOAD_PATH as the parent folder of checkpoint. +# If NEBULA_LOAD_PATH is None, the NEBULA_PERSISTENT_STORAGE_PATH +# will be the default path to load. +NEBULA_LOAD_PATH = "nebula_load_path" +NEBULA_LOAD_PATH_DEFAULT = None + +# Nebula will save the checkpoint under NEBULA_LOAD_PATH in the +# asynchronous way. +NEBULA_PERSISTENT_STORAGE_PATH = "persistent_storage_path" +NEBULA_PERSISTENT_STORAGE_PATH_DEFAULT = None + +# Time interval to trigger the nebula persistence. +NEBULA_PERSISTENT_TIME_INTERVAL = "persistent_time_interval" +NEBULA_PERSISTENT_TIME_INTERVAL_DEFAULT = 100 + +# Checkpoint number which will be kept in memory. Let us say, +# if the value is 2. Then we have checkpoints 1 and 2 are ready +# now. When it comes to checkpoint 3, the 1 will be removed if +# 1 has been persisted to disk. +NEBULA_NUM_OF_VERSION_IN_RETENTION = "num_of_version_in_retention" +NEBULA_NUM_OF_VERSION_IN_RETENTION_DEFAULT = 2 + +# Neubla envs +NEBULA_EXPORT_ENVS = [ + 'DLTS_JOB_ID', + 'DLTS_NUM_WORKER', + 'NEBULA_PERSISTENT_STORAGE_PATH', + 'NEBULA_PERSISTENT_TIME_INTERVAL', + 'AML_RUN_ID', + 'AZUREML_RUN_TOKEN', + 'AZUREML_WORKSPACE_SCOPE', + 'AZUREML_EXPERIMENT_SCOPE', + 'AZUREML_RUN_HISTORY_SERVICE_ENDPOINT', + 'AZUREML_RUN_ID', + 'NEBULA_MEMORY_BUFFER_SIZE', + 'AZUREML_PARAMETER_ITPJOB_NAME', + 'FC_TASKROLE_NAME', + 'FC_TASK_INDEX', + 'MASTER_HOST', + 'LOCAL_HOST', + 'AZUREML_BLOB_ACCOUNT_NAME', + 'AZUREML_BLOB_ACCOUNT_KEY' +] + +# ITP env files +DLTS_POD_ENV_PATH = '/dlts-runtime/env/pod.env' diff --git a/deepspeed/runtime/checkpoint_engine/README.md b/deepspeed/runtime/checkpoint_engine/README.md new file mode 100644 index 000000000000..a19f54889802 --- /dev/null +++ b/deepspeed/runtime/checkpoint_engine/README.md @@ -0,0 +1,37 @@ +# Checkpoint Engine + + +The `CheckpointEngine` was designed to modularized the checkpoint serialization. In this way, we can simply replace/refine the checkpoint serialization methods. + +### Interface for `CheckpointEngine` + +Basically, for checkpoint management(save/load by deepspeed with the given tag), the `CheckpointEngine` will: + + 1. To make preliminaries ready by call `create(tag)`. For `torch`, we can just log some extra info as `torch` can directly call `save/load` without other preparation. + + 2. After the `create(tag)`, deepspeed can call `save/load` to persist files into disk/memory/etc. + + 3. When all the files for a tag are ready, deepspeed engine will call `commit()` to tell the checkpoint engine current checkpoint is complete. For original torch, it also plays the role of logger. + + +```python +class CheckpointEngine(object): + # init checkpoint engine for save/load + def __init__(self, config_params=None): + pass + + def create(self, tag): + # create checkpoint on give tag for save/load. + pass + + def save(self, state_dict, path: str): + pass + + def load(self, path: str, map_location=None): + pass + + def commit(self, tag): + # to tell checkpoint services if all files are readys. + pass + +``` diff --git a/deepspeed/runtime/checkpoint_engine/__init__.py b/deepspeed/runtime/checkpoint_engine/__init__.py new file mode 100644 index 000000000000..e69de29bb2d1 diff --git a/deepspeed/runtime/checkpoint_engine/checkpoint_engine.py b/deepspeed/runtime/checkpoint_engine/checkpoint_engine.py new file mode 100644 index 000000000000..67c888815242 --- /dev/null +++ b/deepspeed/runtime/checkpoint_engine/checkpoint_engine.py @@ -0,0 +1,19 @@ +class CheckpointEngine(object): + + # init checkpoint engine for save/load + def __init__(self, config_params=None): + pass + + def create(self, tag): + # create checkpoint on give tag for save/load. + pass + + def save(self, state_dict, path: str): + pass + + def load(self, path: str, map_location=None): + pass + + def commit(self, tag): + # to tell checkpoint services if all files are readys. + pass diff --git a/deepspeed/runtime/checkpoint_engine/nebula_checkpoint_engine.py b/deepspeed/runtime/checkpoint_engine/nebula_checkpoint_engine.py new file mode 100644 index 000000000000..b7ff5cdf9829 --- /dev/null +++ b/deepspeed/runtime/checkpoint_engine/nebula_checkpoint_engine.py @@ -0,0 +1,88 @@ +import os +import torch +import torch_nebula + +from deepspeed.runtime.checkpoint_engine.checkpoint_engine import \ + CheckpointEngine +from deepspeed.utils import logger, log_dist +from deepspeed.nebula.constants import * + + +def _get_tag_from_path(path): + return os.path.basename(os.path.dirname(path)) + + +class NebulaCheckpointEngine(CheckpointEngine): + def __init__(self, config_params=None): + super().__init__(config_params) + self.checkpoint = None + self.tag_flag = None + self.enable_nebula_load = config_params.enable_nebula_load + self.nebula_load_path = config_params.load_path + if self.nebula_load_path is None: + self.nebula_load_path = config_params.persistent_storage_path + + nebula_config_params = { + NEBULA_PERSISTENT_STORAGE_PATH: config_params.persistent_storage_path, + NEBULA_PERSISTENT_TIME_INTERVAL: config_params.persistent_time_interval, + NEBULA_NUM_OF_VERSION_IN_RETENTION: + config_params.num_of_version_in_retention, + } + torch_nebula.init(**nebula_config_params) + + def create(self, tag): + log_dist(f"[Nebula] Start Checkpoint for tag:{tag}", ranks=[0]) + # -2 means: customer needs to explicitly tell nebula + # current checkpoint is complete by commit methond. + self.checkpoint = torch_nebula.Checkpoint(tag, -2) + + def save(self, state_dict, path: str): + tag = _get_tag_from_path(path) + partititon_name = os.path.basename(path) + logger.info(f"[Nebula] Saving {partititon_name} under tag{tag}...") + self.checkpoint.save(partititon_name, state_dict) + logger.info(f"[Nebula] Saved {partititon_name} under tag{tag}.") + return None + + def load(self, path: str, map_location=None): + tag = _get_tag_from_path(path) + first_load_flag = self.tag_flag is None or self.tag_flag == tag + if not self.enable_nebula_load and first_load_flag: + self.tag_flag = tag + logger.info( + f"[Nebula] Disable nebula load. Loading checkpoint from {path}...") + partition = torch.load(path, map_location=map_location) + logger.info( + f"[Nebula] Disable nebula load. Loaded checkpoint from {path}...") + return partition + + partititon_name = os.path.basename(path) + logger.info( + f"[Nebula] Loading {path} under tag{tag} from {self.nebula_load_path}...") + + checkpoint = None + if tag is None: + checkpoint = torch_nebula.get_latest_checkpoint( + persist_path=self.nebula_load_path) + if checkpoint is None or (checkpoint is not None and checkpoint.tag == ''): + logger.warning(f"Unable to find latest valid checkpoint from Nebula!") + return None + else: + checkpoint = torch_nebula.get_checkpoint(tag=tag, + persist_path=self.nebula_load_path) + partition = checkpoint.load(partititon_name, map_location=map_location) + logger.info( + f"[Nebula] Loaded {path} under tag{tag} from {self.nebula_load_path}.") + return partition + + def commit(self, tag): + # nebula commit will be call when all files under give tag are ready to be persisted in the async way. + logger.info( + f"[Nebula] all files for {tag} are saved in tier1. It is ready to start persisting" + ) + commit_rls = self.checkpoint.commit() + if not commit_rls: + logger.error( + f"[Nebula] failed to commit the checkpoint, please check the log.") + return False + return commit_rls diff --git a/deepspeed/runtime/checkpoint_engine/torch_checkpoint_engine.py b/deepspeed/runtime/checkpoint_engine/torch_checkpoint_engine.py new file mode 100644 index 000000000000..9b4942f0a01f --- /dev/null +++ b/deepspeed/runtime/checkpoint_engine/torch_checkpoint_engine.py @@ -0,0 +1,28 @@ +import torch +from deepspeed.utils import logger, log_dist +from deepspeed.runtime.checkpoint_engine.checkpoint_engine import \ + CheckpointEngine + + +class TorchCheckpointEngine(CheckpointEngine): + def __init__(self, config_params=None): + super().__init__(config_params) + + def create(self, tag): + log_dist(f"[Torch] Checkpoint {tag} is begin to save!", ranks=[0]) + + def save(self, state_dict, path: str): + logger.info(f"[Torch] Saving {path}...") + torch.save(state_dict, path) + logger.info(f"[Torch] Saved {path}.") + return None + + def load(self, path: str, map_location=None): + logger.info(f"[Torch] Loading checkpoint from {path}...") + partition = torch.load(path, map_location=map_location) + logger.info(f"[Torch] Loaded checkpoint from {path}.") + return partition + + def commit(self, tag): + logger.info(f"[Torch] Checkpoint {tag} is ready now!") + return True diff --git a/deepspeed/runtime/config.py b/deepspeed/runtime/config.py index 24ea5a01efbd..0794e4525343 100755 --- a/deepspeed/runtime/config.py +++ b/deepspeed/runtime/config.py @@ -45,6 +45,8 @@ from ..profiling.config import DeepSpeedFlopsProfilerConfig from ..autotuning.config import DeepSpeedAutotuningConfig +from ..nebula.config import DeepSpeedNebulaConfig + from ..compression.config import get_compression_config, get_quantize_enabled from ..compression.constants import * from .swap_tensor.aio_config import get_aio_config @@ -864,6 +866,8 @@ def _initialize_params(self, param_dict): self.dataloader_drop_last = get_dataloader_drop_last(param_dict) + self.nebula_config = DeepSpeedNebulaConfig(param_dict) + def _batch_assertion(self): train_batch = self.train_batch_size diff --git a/deepspeed/runtime/engine.py b/deepspeed/runtime/engine.py index f6e5da1aed73..9d1b8b6aac74 100644 --- a/deepspeed/runtime/engine.py +++ b/deepspeed/runtime/engine.py @@ -63,6 +63,7 @@ from deepspeed.runtime.utils import clip_grad_norm_ from deepspeed.runtime.eigenvalue import Eigenvalue from deepspeed.runtime.data_pipeline.curriculum_scheduler import CurriculumScheduler +from deepspeed.runtime.checkpoint_engine.torch_checkpoint_engine import TorchCheckpointEngine from .pipe.module import PipelineModule from .utils import ensure_directory_exists, get_ma_status @@ -223,6 +224,8 @@ def __init__( self._global_grad_norm = None self.use_ds_comm = False # False --> Use torch.dist, True --> Use ds.comm backend. + self.checkpoint_engine = None + global dist from deepspeed import comm as dist self._is_gradient_accumulation_boundary = None @@ -780,6 +783,19 @@ def _configure_lr_scheduler(self, client_lr_scheduler): log_dist(f'DeepSpeed LR Scheduler = {self.lr_scheduler}', ranks=[0]) def _configure_checkpointing(self, dist_init_required): + self.checkpoint_engine = TorchCheckpointEngine() + + if self._config is not None and self._config.nebula_config.enabled: + try: + from deepspeed.runtime.checkpoint_engine.nebula_checkpoint_engine import \ + NebulaCheckpointEngine + self.checkpoint_engine = NebulaCheckpointEngine( + config_params=self._config.nebula_config) + except ImportError as err: + logger.error( + f"No torch_nebula was found! Will fall back to torch.save. Details: {err}" + ) + self.checkpoint_engine = TorchCheckpointEngine() dp_rank = self.global_rank if self.mpu: @@ -2318,7 +2334,8 @@ def load_moe_state_dict(checkpoint_path, old_moe_load, model=None, mpu=None, - num_experts=1): + num_experts=1, + checkpoint_engine=TorchCheckpointEngine()): if old_moe_load: expp_rank = groups._get_expert_data_parallel_rank( groups._get_max_expert_size_name()) @@ -2328,7 +2345,7 @@ def load_moe_state_dict(checkpoint_path, groups._get_max_expert_size_name()) for local_expert_id in range(num_local_experts): global_expert_id = expp_rank * num_local_experts + local_expert_id - expert_state_dict = torch.load(DeepSpeedEngine._get_expert_ckpt_name( + expert_state_dict = checkpoint_engine.load(DeepSpeedEngine._get_expert_ckpt_name( checkpoint_path, -1, # -1 means ignore layer_id global_expert_id, @@ -2354,7 +2371,7 @@ def load_moe_state_dict(checkpoint_path, # loop all local_experts for local_expert_id in range(num_local_experts): global_expert_id = expp_rank * num_local_experts + local_expert_id - expert_state_dict = torch.load( + expert_state_dict = checkpoint_engine.load( DeepSpeedEngine._get_expert_ckpt_name( checkpoint_path, moe_layer_id, @@ -2377,7 +2394,8 @@ def load_module_state_dict(self, state_dict, strict=True, custom_load_fn=None): if custom_load_fn: custom_load_fn(src=state_dict, dst=self.module) else: - self.module.load_state_dict(state_dict, strict=strict) + self.module.load_state_dict(state_dict, # TODO + strict=strict) def _get_zero_ckpt_prefix(self, dp_rank, bf16_mode): return f'{"bf16_" if bf16_mode else ""}zero_pp_rank_{dp_rank}' @@ -2550,7 +2568,9 @@ def _load_checkpoint(self, from deepspeed.runtime.state_dict_factory import SDLoaderFactory ckpt_list = self._get_all_ckpt_names(load_dir, tag) - sd_loader = SDLoaderFactory.get_sd_loader(ckpt_list) + sd_loader = SDLoaderFactory.get_sd_loader( + ckpt_list, + checkpoint_engine=self.checkpoint_engine) is_pipe_parallel = isinstance(self.module, PipelineModule) @@ -2577,7 +2597,8 @@ def _load_checkpoint(self, old_moe_load=old_moe_load, model=self.module, mpu=self.mpu, - num_experts=self.num_experts) + num_experts=self.num_experts, + checkpoint_engine=self.checkpoint_engine) if not self.load_universal_checkpoint(): self.load_module_state_dict(state_dict=checkpoint['module'], strict=load_module_strict, @@ -2594,8 +2615,9 @@ def _load_checkpoint(self, largest_group_name = groups._get_max_expert_size_name() expp_rank = groups._get_expert_parallel_rank(largest_group_name) optim_load_path = self._get_optimizer_ckpt_name(load_dir, tag, expp_rank) - optim_checkpoint = torch.load(optim_load_path, - map_location=torch.device('cpu')) + optim_checkpoint = self.checkpoint_engine.load( + optim_load_path, + map_location=torch.device('cpu')) else: optim_checkpoint = checkpoint @@ -2762,7 +2784,10 @@ def _get_all_zero_checkpoint_state_dicts(self, zero_ckpt_names): # Fully load state for current rank if self.zero_elastic_checkpoint() or dist.get_rank( group=self.optimizer.dp_process_group) == i: - _state = torch.load(ckpt_name, map_location='cpu') + _state = self.checkpoint_engine.load( + ckpt_name, + map_location='cpu', + ) else: _state = {OPTIMIZER_STATE_DICT: None} zero_sd_list.append(_state) @@ -2838,6 +2863,7 @@ def save_checkpoint(self, save_dir, tag=None, client_state={}, save_latest=True) # Ensure tag is a string tag = str(tag) + self.checkpoint_engine.create(tag) # Ensure checkpoint tag is consistent across ranks self._checkpoint_tag_validation(tag) @@ -2860,6 +2886,7 @@ def save_checkpoint(self, save_dir, tag=None, client_state={}, save_latest=True) # Save latest checkpoint tag dist.barrier() + self.checkpoint_engine.commit(tag) if save_latest and self.global_rank == 0: with open(os.path.join(save_dir, 'latest'), 'w') as fd: fd.write(tag) @@ -2929,7 +2956,7 @@ def _save_moe_checkpoint(self, save_dir, tag, client_state={}): global_expert_id, tag, self.mpu) - torch.save(expert_state_dict, moe_save_path) + self.checkpoint_engine.save(expert_state_dict, moe_save_path) moe_layer_id += 1 self._curr_ckpt_path = os.path.join(save_dir, tag) @@ -2950,9 +2977,9 @@ def _save_moe_checkpoint(self, save_dir, tag, client_state={}): self.optimizer.state_dict() if self.optimizer and not self.zero_optimization() else None } - with open(self._get_optimizer_ckpt_name(save_dir, tag, expp_rank), 'wb') as fd: - torch.save(optimizer_state, fd) - fd.flush() + # TODO: why use BufferedWriter not the path + file_path = self._get_optimizer_ckpt_name(save_dir, tag, expp_rank) + self.checkpoint_engine.save(optimizer_state, file_path) # get non-moe parameters model_state_dict = self._get_non_moe_state_dict(self.module_state_dict()) @@ -2982,9 +3009,7 @@ def _save_moe_checkpoint(self, save_dir, tag, client_state={}): } state.update(client_state) logger.info(f'Saving model checkpoint: {save_path}') - with open(save_path, 'wb') as fd: - torch.save(state, fd) - fd.flush() + self.checkpoint_engine.save(state, save_path) self._curr_save_path = None def _create_checkpoint_file(self, save_dir, tag, zero_checkpoint): @@ -3037,7 +3062,7 @@ def _save_checkpoint(self, save_dir, tag, client_state={}): state.update(client_state) log_dist(message=f'Saving model checkpoint: {save_path}', ranks=[0, 1]) - torch.save(state, save_path) + self.checkpoint_engine.save(state, save_path) self._curr_save_path = None def _get_buffer_names(self): @@ -3118,9 +3143,8 @@ def _save_zero_checkpoint(self, save_path, tag): zero_sd = dict(optimizer_state_dict=self.optimizer.state_dict(), ds_config=self.config, ds_version=version) - with open(zero_checkpoint_name, 'wb') as fd: - torch.save(zero_sd, fd) - fd.flush() + self.checkpoint_engine.save(zero_sd, zero_checkpoint_name) + if self.global_rank == 0: self._copy_recovery_script(save_path) ckpt_type = 'zero' if self.zero_optimization() else 'bf16_zero' @@ -3228,6 +3252,6 @@ def save_16bit_model(self, save_dir, save_filename="pytorch_model.bin"): if dist.get_rank() == 0: os.makedirs(save_dir, exist_ok=True) logger.info(f"Saving model weights to {path}") - torch.save(state_dict, path) + self.checkpoint_engine.save(state_dict, path) return True diff --git a/deepspeed/runtime/pipe/engine.py b/deepspeed/runtime/pipe/engine.py index a47f1e45b241..0f3443d980f8 100644 --- a/deepspeed/runtime/pipe/engine.py +++ b/deepspeed/runtime/pipe/engine.py @@ -1315,7 +1315,8 @@ def module_state_dict(self): assert self._curr_ckpt_path is not None, \ "PipelineEngine expects module_state_dict() to be called from save_checkpoint()" - self.module.save_state_dict(self._curr_ckpt_path) + self.module.save_state_dict(self._curr_ckpt_path, + checkpoint_engine=self.checkpoint_engine) return None def load_module_state_dict(self, state_dict, strict=True, custom_load_fn=None): @@ -1334,7 +1335,9 @@ def load_module_state_dict(self, state_dict, strict=True, custom_load_fn=None): super().load_module_state_dict(state_dict, strict) return - self.module.load_state_dir(load_dir=self._curr_ckpt_path, strict=strict) + self.module.load_state_dir(load_dir=self._curr_ckpt_path, + strict=strict, + checkpoint_engine=self.checkpoint_engine) # A map of PipeInstruction types to methods. Each method will be executed with the # kwargs provided to the PipeInstruction from the scheduler. diff --git a/deepspeed/runtime/pipe/module.py b/deepspeed/runtime/pipe/module.py index ac35a9fa2cf8..03e1c413c950 100644 --- a/deepspeed/runtime/pipe/module.py +++ b/deepspeed/runtime/pipe/module.py @@ -561,7 +561,7 @@ def ckpt_layer_path_list(self, ckpt_dir, local_layer_idx): ckpt_files.sort() return ckpt_files - def save_state_dict(self, save_dir): + def save_state_dict(self, save_dir, checkpoint_engine): if self._grid.data_parallel_id != 0: return @@ -582,9 +582,9 @@ def save_state_dict(self, save_dir): {k: v.clone() for k, v in orig_state_dict.items()}) - torch.save(final_state_dict, model_ckpt_path) + checkpoint_engine.save(final_state_dict, model_ckpt_path) - def load_state_dir(self, load_dir, strict=True): + def load_state_dir(self, load_dir, checkpoint_engine, strict=True): for idx, layer in enumerate(self.forward_funcs): # Functions, etc. will not have state_dicts if not hasattr(layer, 'load_state_dict'): @@ -595,7 +595,10 @@ def load_state_dir(self, load_dir, strict=True): mp_rank = self._grid.get_slice_parallel_rank() mp_world_size = self._grid.get_slice_parallel_world_size() - sd_loader = SDLoaderFactory.get_sd_loader(model_ckpt_list, version=2.0) + sd_loader = SDLoaderFactory.get_sd_loader( + model_ckpt_list, + version=2.0, + checkpoint_engine=checkpoint_engine) load_path, checkpoint, _ = sd_loader.load(mp_world_size, mp_rank, module_key=None, is_pipe_parallel=True) layer.load_state_dict(checkpoint) diff --git a/deepspeed/runtime/state_dict_factory.py b/deepspeed/runtime/state_dict_factory.py index 35ccb8d5fd02..6097e8baa004 100755 --- a/deepspeed/runtime/state_dict_factory.py +++ b/deepspeed/runtime/state_dict_factory.py @@ -8,7 +8,10 @@ import collections import json from abc import ABC, abstractmethod + from deepspeed.utils import logger +from deepspeed.runtime.checkpoint_engine.torch_checkpoint_engine import TorchCheckpointEngine + from .weight_quantizer import WeightQuantization AUTO_MODULE_KEY = 'auto' @@ -16,7 +19,7 @@ class SDLoaderFactory: @staticmethod - def get_sd_loader_json(json_file): + def get_sd_loader_json(json_file, checkpoint_engine): with open(json_file) as f: data = json.load(f) sd_type = data['type'] @@ -24,22 +27,27 @@ def get_sd_loader_json(json_file): version = data['version'] if 'BLOOM' in sd_type or 'Bloom' in sd_type: return ckpt_list - return SDLoaderFactory.get_sd_loader(ckpt_list, sd_type, version) + return SDLoaderFactory.get_sd_loader(ckpt_list, + checkpoint_engine, + sd_type, + version) @staticmethod - def get_sd_loader(ckpt_list, sd_type='Megatron', version=None): + def get_sd_loader(ckpt_list, checkpoint_engine, sd_type='Megatron', version=None): if sd_type == 'Megatron': - return MegatronSDLoader(ckpt_list, version) + return MegatronSDLoader(ckpt_list, version, checkpoint_engine) else: assert False, '{} checkpoint type is not supported'.format(sd_type) class SDLoaderBase(ABC): - def __init__(self, ckpt_list, version): + def __init__(self, ckpt_list, version, checkpoint_engine): self.module_key = None self.ckpt_list = ckpt_list - self.check_ckpt_list() self.version = version + self.checkpoint_engine = TorchCheckpointEngine( + ) if checkpoint_engine is None else checkpoint_engine + self.check_ckpt_list() def load(self, mp_world_size, @@ -81,7 +89,8 @@ def load(self, if num_ckpt == mp_world_size: assert os.path.exists(load_path) #logger.info(f'rank: {mp_rank} loading checkpoint: {load_path}') - sd = torch.load(load_path, map_location=lambda storage, loc: storage) + sd = self.checkpoint_engine.load(load_path, map_location=lambda storage, \ + loc: storage) if quantize: quantizer = WeightQuantization(mlp_extra_grouping=mlp_extra_grouping, @@ -110,9 +119,9 @@ def get_merge_state_dicts(self, mp_world_size, mp_rank): logger.info(f"mp_rank: {mp_rank}, ckpt_list: {ckpt_list}") sd_list = [ - torch.load(ckpt, - map_location=lambda storage, - loc: storage) for ckpt in ckpt_list + self.checkpoint_engine.load(ckpt, + map_location=lambda storage, + loc: storage) for ckpt in ckpt_list ] return sd_list @@ -128,9 +137,9 @@ def get_split_state_dict(self, mp_world_size, mp_rank): f"mp_rank: {mp_rank}, ckpt_list: {self.ckpt_list[ckpt_index]}, offset: {ckpt_offset}" ) - sd = torch.load(self.ckpt_list[ckpt_index], - map_location=lambda storage, - loc: storage) + sd = self.checkpoint_engine.load(self.ckpt_list[ckpt_index], + map_location=lambda storage, + loc: storage) return sd, num_to_split, ckpt_offset @@ -163,7 +172,9 @@ def check_ckpt_list(self): #logger.info(f'checkpoint file list: {self.ckpt_list}') assert len(self.ckpt_list) > 0 - sd = torch.load(self.ckpt_list[0], map_location=lambda storage, loc: storage) + sd = self.checkpoint_engine.load(self.ckpt_list[0], + map_location=lambda storage, + loc: storage) # check checkpoint count is same with saved mp_world_size if 'mp_world_size' in sd.keys(): @@ -195,8 +206,8 @@ def sanity_check(self, ckpt_file_name): class MegatronSDLoader(SDLoaderBase): - def __init__(self, ckpt_list, version): - super().__init__(ckpt_list, version) + def __init__(self, ckpt_list, version, checkpoint_engine): + super().__init__(ckpt_list, version, checkpoint_engine) """ ## Q/K/V data need special processing key: transformer.layers.0.attention.query_key_value.weight, shape: torch.Size([3192, 4256]) @@ -433,7 +444,9 @@ def sanity_check(self, ckpt_file_name): "mlp.dense_h_to_4h.bias" ] - sd = torch.load(ckpt_file_name, map_location=lambda storage, loc: storage) + sd = self.checkpoint_engine.load(ckpt_file_name, + map_location=lambda storage, + loc: storage) # partial_key is a sub-string of one key in the sd def check_key_exist(partial_key, sd): diff --git a/tests/unit/test_checkpointing.py b/tests/unit/test_checkpointing.py index e55fc30fa56c..7174ae0a0a63 100755 --- a/tests/unit/test_checkpointing.py +++ b/tests/unit/test_checkpointing.py @@ -2,6 +2,7 @@ from deepspeed.runtime.zero.stage_1_and_2 import DeepSpeedZeroOptimizer from deepspeed.runtime.fp16.fused_optimizer import FP16_Optimizer from deepspeed.runtime.fp16.unfused_optimizer import FP16_UnfusedOptimizer +from deepspeed.runtime.checkpoint_engine.torch_checkpoint_engine import TorchCheckpointEngine from deepspeed.moe.utils import split_params_into_different_moe_groups_for_optimizer from deepspeed.runtime.pipe.topology import * @@ -727,13 +728,14 @@ def _test(save_folder, num_stages): def test_checkpoint_pipe_module(base_topo, test_topo, tmpdir): @distributed_test(world_size=4) def _test(base_topo, test_topo, save_folder): + checkpoint_engine = TorchCheckpointEngine() base_model = LinearStackPipe(topology=base_topo) - base_model.save_state_dict(save_folder) + base_model.save_state_dict(save_folder, checkpoint_engine=checkpoint_engine) dist.barrier() test_model = LinearStackPipe(topology=test_topo) - test_model.load_state_dir(save_folder) + test_model.load_state_dir(save_folder, checkpoint_engine=checkpoint_engine) # Base and test can have different lengths, so make sure we map from the # smaller to larger model From 66d29b0a6c896e8764ff90ba074604e776c9e589 Mon Sep 17 00:00:00 2001 From: Jerry Mannil Date: Thu, 28 Jul 2022 07:42:35 -0700 Subject: [PATCH 29/38] Graceful exit on failures for multi-node runs (#2008) * Use Popen.terminate() to stop the child processes gracefully; Kill them if terminate doesn't work * The Popen.kill() command cause the training processes to end abruptly. This may cause the child processes to become zombies without communicating properly to the parent process about the kill signal. So the ssh session continue to wait for signals from the child processes, causing it to not return back to the pdsh command Fixes microsoft#1995 Co-authored-by: Olatunji Ruwase --- deepspeed/launcher/launch.py | 18 +++++++++++++++++- 1 file changed, 17 insertions(+), 1 deletion(-) diff --git a/deepspeed/launcher/launch.py b/deepspeed/launcher/launch.py index c7113c13f53d..d37a970c5e3a 100755 --- a/deepspeed/launcher/launch.py +++ b/deepspeed/launcher/launch.py @@ -15,6 +15,7 @@ import base64 import time import signal +import psutil from collections import defaultdict from argparse import ArgumentParser, REMAINDER @@ -88,6 +89,21 @@ def parse_args(): return parser.parse_args() +# Adapted from https://psutil.readthedocs.io/en/latest/#kill-process-tree +def terminate_process_tree(pid): + process = psutil.Process(pid) + children = process.children(recursive=True) + children.append(process) + for child in children: + try: + child.terminate() + except psutil.NoSuchProcess: + pass + gone, alive = psutil.wait_procs(children, timeout=30) + for p in alive: + p.kill() + + def main(): args = parse_args() current_env = os.environ.copy() @@ -189,7 +205,7 @@ def sigkill_handler(signum, frame): for process in processes: logger.info(f"Killing subprocess {process.pid}") try: - process.kill() + terminate_process_tree(process.pid) except Exception: pass if last_return_code is not None: From 57140e8e951e8e149e998505d6b7ba6adeeaaede Mon Sep 17 00:00:00 2001 From: shjwudp Date: Fri, 29 Jul 2022 04:21:28 +0800 Subject: [PATCH 30/38] fix: fix BF16_Optimizer compatibility issue with optimizer state 0-dim tensor (#2152) Co-authored-by: Olatunji Ruwase --- deepspeed/runtime/bf16_optimizer.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/deepspeed/runtime/bf16_optimizer.py b/deepspeed/runtime/bf16_optimizer.py index 35f8bbd3473a..303267f0494d 100644 --- a/deepspeed/runtime/bf16_optimizer.py +++ b/deepspeed/runtime/bf16_optimizer.py @@ -417,7 +417,7 @@ def _link_hp_params(self, hp_frag_address.numel) for key, value in self.optimizer.state[flat_hp_partition].items() - if torch.is_tensor(value) + if torch.is_tensor(value) and value.dim() > 0 } lp_frag_address = fragment_address(start=fragment_start - lp_start, From 556f0051521ec539026977e91c0e4b42445340ea Mon Sep 17 00:00:00 2001 From: Reza Yazdani <44502768+RezaYazdaniAminabadi@users.noreply.github.com> Date: Thu, 28 Jul 2022 17:24:07 -0700 Subject: [PATCH 31/38] Fix random token-generation issue + MP-checkpoint loading/saving (#2132) Co-authored-by: Jeff Rasley Co-authored-by: Olatunji Ruwase --- deepspeed/__init__.py | 6 +- deepspeed/inference/engine.py | 78 +++++++------ deepspeed/module_inject/load_checkpoint.py | 110 +++++++++++++----- deepspeed/module_inject/replace_module.py | 108 +++++++++++++++-- deepspeed/module_inject/replace_policy.py | 5 + .../inference/transformer_inference.py | 1 + deepspeed/runtime/state_dict_factory.py | 28 +++-- 7 files changed, 249 insertions(+), 87 deletions(-) diff --git a/deepspeed/__init__.py b/deepspeed/__init__.py index 7a18f98a49e8..50049a2a1996 100755 --- a/deepspeed/__init__.py +++ b/deepspeed/__init__.py @@ -238,7 +238,8 @@ def init_inference(model, moe_experts=1, moe_type='standard', args=None, - enable_cuda_graph=False): + enable_cuda_graph=False, + save_mp_checkpoint_path=None): """Initialize the DeepSpeed InferenceEngine. Arguments: @@ -304,6 +305,7 @@ def init_inference(model, moe_experts, moe_type, args, - enable_cuda_graph) + enable_cuda_graph, + save_mp_checkpoint_path) return engine diff --git a/deepspeed/inference/engine.py b/deepspeed/inference/engine.py index 8af9a12c2809..db9efb19dcb1 100755 --- a/deepspeed/inference/engine.py +++ b/deepspeed/inference/engine.py @@ -14,7 +14,6 @@ from ..runtime.state_dict_factory import SDLoaderFactory from ..runtime.weight_quantizer import WeightQuantization from ..module_inject.replace_module import replace_transformer_layer -from ..utils import logger from ..comm.comm import init_distributed from ..pipe import PipelineModule from ..moe.utils import has_moe_layers @@ -50,7 +49,8 @@ def __init__(self, moe_experts=1, moe_type='standard', config=None, - enable_cuda_graph=False): + enable_cuda_graph=False, + save_mp_checkpoint_path=None): """ Args: model: torch.nn.Module @@ -130,7 +130,8 @@ def __init__(self, moe_experts, moe_type, training_mp_size, - self.checkpoint if replace_with_kernel_inject else None) + self.checkpoint if replace_with_kernel_inject else None, + save_mp_checkpoint_path=save_mp_checkpoint_path) elif replace_method == 'auto': self._apply_injection_policy( return_tuple=return_tuple, @@ -139,12 +140,17 @@ def __init__(self, moe_experts=moe_experts, moe_type=moe_type, training_mp_size=training_mp_size, - checkpoint_dir=self.checkpoint if replace_with_kernel_inject else None) + checkpoint_dir=self.checkpoint if replace_with_kernel_inject else None, + save_mp_checkpoint_path=save_mp_checkpoint_path) device = torch.cuda.current_device() - logger.info(f"Place model to device: {device}") self.module.to(device) + if self.mp_world_size > 1: + _rng_state = torch.cuda.get_rng_state().to(torch.cuda.current_device()) + dist.broadcast(_rng_state, 0) + torch.cuda.set_rng_state(_rng_state.cpu()) + if self.mp_world_size > 1: self.model_orig_fwd = self.module.forward self.module.forward = self.forward @@ -226,9 +232,9 @@ def _validate_args(self, mpu): for method in methods: if not hasattr(mpu, method): raise ValueError(f"mpu is missing {method}") - if self.checkpoint is not None and not isinstance(self.checkpoint, str): + if self.checkpoint is not None and not isinstance(self.checkpoint, (str, dict)): raise ValueError( - f"checkpoint must be None or a str, got {type(self.checkpoint)}") + f"checkpoint must be None, str or dict, got {type(self.checkpoint)}") supported_dtypes = [None, torch.half, torch.int8, torch.float] if self.dtype not in supported_dtypes: @@ -315,32 +321,37 @@ def _apply_injection_policy(self, moe_experts=1, moe_type='standard', training_mp_size=1, - checkpoint_dir=None): + checkpoint_dir=None, + save_mp_checkpoint_path=False): checkpoint = SDLoaderFactory.get_sd_loader_json( - checkpoint_dir) if checkpoint_dir is not None else None - replace_transformer_layer(client_module, - self.module, - triangular_masking=self.triangular_masking, - policy=injection_policy, - mp_size=self.mp_world_size, - mp_group=self.mp_group, - ep_group=self.ep_group, - expert_mp_group=self.expert_mp_group, - config=self.config, - fp16=(self.dtype == torch.half), - training=False, - return_tuple=return_tuple, - quantize=(self.dtype == torch.int8), - quantize_settings=(self.quantization_scales, - self.quantize_merge_count, - self.mlp_extra_grouping, - self.quantize_groups), - replace_with_kernel_inject=replace_with_kernel_inject, - moe=moe, - moe_experts=moe_experts, - moe_type=moe_type, - training_mp_size=training_mp_size, - checkpoint=checkpoint) + checkpoint_dir, + self.checkpoint_engine) if checkpoint_dir is not None else None + replace_transformer_layer( + client_module, + self.module, + triangular_masking=self.triangular_masking, + policy=injection_policy, + mp_size=self.mp_world_size, + mp_group=self.mp_group, + ep_group=self.ep_group, + expert_mp_group=self.expert_mp_group, + config=self.config, + fp16=(self.dtype == torch.half), + training=False, + return_tuple=return_tuple, + quantize=(self.dtype == torch.int8), + quantize_settings=(self.quantization_scales, + self.quantize_merge_count, + self.mlp_extra_grouping, + self.quantize_groups), + replace_with_kernel_inject=replace_with_kernel_inject, + moe=moe, + moe_experts=moe_experts, + moe_type=moe_type, + training_mp_size=training_mp_size, + checkpoint_dict=checkpoint, + save_mp_checkpoint_path=save_mp_checkpoint_path, + ) def _get_all_ckpt_names(self, checkpoints_path, tag): ckpt_file_pattern = self._get_ckpt_name(checkpoints_path, @@ -380,8 +391,7 @@ def _load_checkpoint(self, load_dir, load_module_strict=True, tag=None): ckpt_list = self._get_all_ckpt_names(load_dir, tag) sd_loader = SDLoaderFactory.get_sd_loader(ckpt_list, self.checkpoint_engine) else: - sd_loader = SDLoaderFactory.get_sd_loader_json(load_dir, - self.checkpoint_engine) + sd_loader = SDLoaderFactory.get_sd_loader_json(load_dir) if type(sd_loader) is list: self.sd = torch.load(sd_loader[0], map_location='cpu') diff --git a/deepspeed/module_inject/load_checkpoint.py b/deepspeed/module_inject/load_checkpoint.py index 1d05b6e853f6..e0f44675dfd7 100644 --- a/deepspeed/module_inject/load_checkpoint.py +++ b/deepspeed/module_inject/load_checkpoint.py @@ -2,9 +2,10 @@ import deepspeed.ops.transformer as transformer_inference from ..runtime.zero import GatheredParameters from .layers import LinearLayer, Normalize, EmbeddingLayer +import torch -def load_model_with_checkpoint(r_module, sd, mp_replace): +def load_model_with_checkpoint(r_module, sd, mp_replace, ckpt_type, rank=0): error_msgs = [] def transpose(data): @@ -29,33 +30,76 @@ def load(module, prefix): module.bias = mp_replace.copy(module.bias.data, sd[prefix + 'bias']) def load_transformer_layer(module, prefix): - module.norm_w.data.copy_(sd[prefix + 'input_layernorm.' + 'weight']) - module.norm_b.data.copy_(sd[prefix + 'input_layernorm.' + 'bias']) - module.attention.attn_qkvw = mp_replace.copy( - module.attention.attn_qkvw.data, - transpose(sd[prefix + 'self_attention.query_key_value.' + 'weight'])) - module.attention.attn_qkvb = mp_replace.copy( - module.attention.attn_qkvb.data, - sd[prefix + 'self_attention.query_key_value.' + 'bias']) - module.attention.attn_ow = mp_replace.copy( - module.attention.attn_ow.data, - transpose(sd[prefix + 'self_attention.dense.' + 'weight'])) - module.attention.attn_ob = mp_replace.copy( - module.attention.attn_ob.data, - sd[prefix + 'self_attention.dense.' + 'bias']) - module.mlp.attn_nw.data.copy_(sd[prefix + 'post_attention_layernorm.' + - 'weight']) - module.mlp.attn_nb.data.copy_(sd[prefix + 'post_attention_layernorm.' + 'bias']) - module.mlp.inter_w = mp_replace.copy( - module.mlp.inter_w.data, - transpose(sd[prefix + 'mlp.dense_h_to_4h.' + 'weight'])) - module.mlp.inter_b = mp_replace.copy(module.mlp.inter_b.data, - sd[prefix + 'mlp.dense_h_to_4h.' + 'bias']) - module.mlp.output_w = mp_replace.copy( - module.mlp.output_w.data, - transpose(sd[prefix + 'mlp.dense_4h_to_h.' + 'weight'])) - module.mlp.output_b = mp_replace.copy(module.mlp.output_b.data, - sd[prefix + 'mlp.dense_4h_to_h.' + 'bias']) + if ckpt_type == "tp": + + def load_parameters(module, prefix): + for n, p in module.named_parameters(): + if len(n.split('.')) == 1: + src_shape = sd[prefix + n].shape + dst_shape = p.shape + + if (len(src_shape) == 2 and len(dst_shape) == 2): + if src_shape[0] == dst_shape[0] and src_shape[ + 1] == dst_shape[1]: + p.data.copy_(sd[prefix + n]) + else: + if src_shape[0] != dst_shape[0]: + weight_split = torch.split( + sd[prefix + n], + dst_shape[0], + dim=0)[rank].to( + torch.cuda.current_device()).contiguous() + else: + weight_split = torch.split( + sd[prefix + n], + dst_shape[1], + dim=1)[rank].to( + torch.cuda.current_device()).contiguous() + p.data.copy_(weight_split.contiguous()) + else: + if src_shape[0] == dst_shape[0]: + p.data.copy_(sd[prefix + n]) + else: + bias_split = torch.split( + sd[prefix + n], + dst_shape[-1])[rank].to( + torch.cuda.current_device()).contiguous() + p.data.copy_(bias_split) + + load_parameters(module, prefix) + for n, child in module.named_children(): + load_parameters(child, prefix + n + '.') + else: + module.norm_w.data.copy_(sd[prefix + 'input_layernorm.' + 'weight']) + module.norm_b.data.copy_(sd[prefix + 'input_layernorm.' + 'bias']) + module.attention.attn_qkvw = mp_replace.copy( + module.attention.attn_qkvw.data, + transpose(sd[prefix + 'self_attention.query_key_value.' + 'weight'])) + module.attention.attn_qkvb = mp_replace.copy( + module.attention.attn_qkvb.data, + sd[prefix + 'self_attention.query_key_value.' + 'bias']) + module.attention.attn_ow = mp_replace.copy( + module.attention.attn_ow.data, + transpose(sd[prefix + 'self_attention.dense.' + 'weight'])) + module.attention.attn_ob = mp_replace.copy( + module.attention.attn_ob.data, + sd[prefix + 'self_attention.dense.' + 'bias']) + module.mlp.attn_nw.data.copy_(sd[prefix + 'post_attention_layernorm.' + + 'weight']) + module.mlp.attn_nb.data.copy_(sd[prefix + 'post_attention_layernorm.' + + 'bias']) + module.mlp.inter_w = mp_replace.copy( + module.mlp.inter_w.data, + transpose(sd[prefix + 'mlp.dense_h_to_4h.' + 'weight'])) + module.mlp.inter_b = mp_replace.copy( + module.mlp.inter_b.data, + sd[prefix + 'mlp.dense_h_to_4h.' + 'bias']) + module.mlp.output_w = mp_replace.copy( + module.mlp.output_w.data, + transpose(sd[prefix + 'mlp.dense_4h_to_h.' + 'weight'])) + module.mlp.output_b = mp_replace.copy( + module.mlp.output_b.data, + sd[prefix + 'mlp.dense_4h_to_h.' + 'bias']) layer_policies = { nn.Linear: load, @@ -95,6 +139,9 @@ def load_module_recursive(module, prefix='', level=0): dtype=child.weight.dtype, eps=child.eps) setattr(module, name, child) + elif child.__class__ is nn.Linear: + child = LinearLayer(weight=child.weight, bias=child.bias) + setattr(module, name, child) else: ds_id = None if hasattr(child.weight, 'ds_id'): @@ -107,9 +154,10 @@ def load_module_recursive(module, prefix='', level=0): layer_policies[child.__class__](child, prefix + name + '.') else: - load_module_recursive(child, - prefix if level == 0 else prefix + name + '.', - level + 1) + load_module_recursive( + child, + prefix if level == 0 and ckpt_type == 'pp' else prefix + name + '.', + level + 1) load_module_recursive(r_module) diff --git a/deepspeed/module_inject/replace_module.py b/deepspeed/module_inject/replace_module.py index 151abfacf004..b9e9d90c1778 100755 --- a/deepspeed/module_inject/replace_module.py +++ b/deepspeed/module_inject/replace_module.py @@ -1,3 +1,4 @@ +import os import torch import tqdm import deepspeed @@ -11,6 +12,7 @@ from ..runtime.zero import GatheredParameters from .layers import LinearAllreduce, LinearLayer from .load_checkpoint import load_model_with_checkpoint +import time class ReplaceWithTensorSlicing: @@ -117,6 +119,21 @@ def copy(self, dst, src): return torch.nn.parameter.Parameter(dst, requires_grad=False) +def get_transformer_name(replaced_module): + from .replace_policy import supported_models + from torch.nn import ModuleList + transformer_name = '' + for n, c in replaced_module.named_children(): + if c.__class__ in supported_models: + transformer_name += n + '.' + for name, child in c.named_children(): + if child.__class__ is ModuleList: + transformer_name += name + break + break + return transformer_name + + def replace_transformer_layer(orig_layer_impl, model, policy=None, @@ -144,7 +161,8 @@ def replace_transformer_layer(orig_layer_impl, moe=False, moe_experts=1, moe_type='standard', - checkpoint=None): + checkpoint_dict=None, + save_mp_checkpoint_path=None): """ Replace bert-style transformer layers with DeepSpeed's transformer layer Arguments: orig_layer_impl (torch.nn.Module): the original transformer layer implementation to look for, @@ -764,14 +782,86 @@ def replace_fn(child, _policy, layer_id=0): replace_fn=replace_fn, _replace_policy=policy) - if checkpoint is not None: - pbar = tqdm.tqdm(total=len(checkpoint), - desc=f"Loading {len(checkpoint)} checkpoint shards") - for i in range(len(checkpoint)): - if not deepspeed.comm.is_initialized() or deepspeed.comm.get_rank() == 0: - pbar.update(1) - sd = torch.load(checkpoint[i], map_location='cpu') - load_model_with_checkpoint(replaced_module, sd, mp_replace) + if checkpoint_dict is not None: + start_time = time.time() + rank = dist.get_rank() if dist.is_initialized() else 0 + world_size = dist.get_world_size() if dist.is_initialized() else 1 + checkpoint = checkpoint_dict['checkpoints'] + ckpt_type = checkpoint_dict.get('parallelization', 'pp') + ckpt_mp_size = checkpoint_dict.get('mp_size', mp_size) + base_dir = checkpoint_dict.get('base_dir', '') + + if ckpt_type == 'pp': + pbar = tqdm.tqdm(total=len(checkpoint), + desc=f"Loading {len(checkpoint)} checkpoint shards") + for i in range(len(checkpoint)): + if not deepspeed.comm.is_initialized() or deepspeed.comm.get_rank() == 0: + pbar.update(1) + sd = torch.load(checkpoint[i], map_location='cpu') + load_model_with_checkpoint(replaced_module, sd, mp_replace, ckpt_type) + else: + num_checkpoints = len(checkpoint) // ckpt_mp_size + assert world_size >= ckpt_mp_size,\ + "Currently, merging checkpoints is not supported (when world_size is smaller than #checkpoints)!" + checkpoint_stride = world_size // ckpt_mp_size + pbar = tqdm.tqdm(total=num_checkpoints, + desc=f"Loading {num_checkpoints} checkpoint shards") + for i in range(num_checkpoints): + if not deepspeed.comm.is_initialized() or deepspeed.comm.get_rank() == 0: + pbar.update(1) + + ckpt_index = i * ckpt_mp_size + (rank // checkpoint_stride) + ckpt_file = os.path.join( + base_dir, + checkpoint[ckpt_index]) if base_dir else checkpoint[ckpt_index] + sd = torch.load(ckpt_file, map_location='cpu') + load_model_with_checkpoint(replaced_module, + sd, + mp_replace, + ckpt_type, + rank % (world_size // ckpt_mp_size)) + print(f"checkpoint loading time at rank {rank}: {time.time()-start_time} sec") + + if save_mp_checkpoint_path is not None: + from collections import OrderedDict + import json + + ckpt_name = checkpoint_dict['type'] + if dist.is_initialized(): + dist.barrier() + transformer_name = get_transformer_name(replaced_module) + non_tp_ckpt_name = f'{ckpt_name}-non-tp.pt' + ckpt_files = [non_tp_ckpt_name] * world_size + if not dist.is_initialized() or dist.get_rank() == 0: + print("Saving tp-sharded checkpoints") + torch.save( + OrderedDict({ + k: v + for k, + v in dict(replaced_module.state_dict()).items() + if transformer_name not in k + }), + f'{save_mp_checkpoint_path}/{non_tp_ckpt_name}') + ckpt_files += [f'{ckpt_name}-tp_{r:0>2d}.pt' for r in range(world_size)] + config = json.dumps({ + 'type': ckpt_name, + 'base_dir': f'{save_mp_checkpoint_path}', + 'checkpoints': ckpt_files, + 'version': 1.0, + 'parallelization': 'tp', + 'mp_size': world_size + }) + with open(f"{save_mp_checkpoint_path}/{ckpt_name}_ds-inference_config.json", + "w") as cfg: + cfg.write(config) + torch.save( + OrderedDict({ + k: v + for k, + v in dict(replaced_module.state_dict()).items() if transformer_name in k + }), + f'{save_mp_checkpoint_path}/{ckpt_name}-tp_{rank:0>2d}.pt') + return replaced_module diff --git a/deepspeed/module_inject/replace_policy.py b/deepspeed/module_inject/replace_policy.py index eeb6d613969b..3d5c53275e33 100755 --- a/deepspeed/module_inject/replace_policy.py +++ b/deepspeed/module_inject/replace_policy.py @@ -4,6 +4,8 @@ from torch.nn.parameter import Parameter from packaging import version as pkg_version +supported_models = {None} + class DSPolicy(ABC): def __init__(self, @@ -329,6 +331,9 @@ def __init__(self, client_module, inference=True): try: import transformers BLOOMLayerPolicy._orig_layer_class = transformers.models.bloom.modeling_bloom.BloomBlock + global supported_models + supported_models.update( + {transformers.models.bloom.modeling_bloom.BloomModel}) except: BLOOMLayerPolicy._orig_layer_class = None diff --git a/deepspeed/ops/transformer/inference/transformer_inference.py b/deepspeed/ops/transformer/inference/transformer_inference.py index 81762c10b014..df65fb317e9b 100755 --- a/deepspeed/ops/transformer/inference/transformer_inference.py +++ b/deepspeed/ops/transformer/inference/transformer_inference.py @@ -191,6 +191,7 @@ def split_tensor_along_last_dim(tensor, return tensor_list def backup_attention(mixed_x_layer, layer_past, alibi, input_mask, norm_factor): + alibi = alibi.to(torch.cuda.current_device()) head_dim = hidden_size_per_partition // num_attention_heads_per_partition new_tensor_shape = mixed_x_layer.size()[:-1] + ( num_attention_heads_per_partition, diff --git a/deepspeed/runtime/state_dict_factory.py b/deepspeed/runtime/state_dict_factory.py index 6097e8baa004..0b720ff471f3 100755 --- a/deepspeed/runtime/state_dict_factory.py +++ b/deepspeed/runtime/state_dict_factory.py @@ -20,17 +20,23 @@ class SDLoaderFactory: @staticmethod def get_sd_loader_json(json_file, checkpoint_engine): - with open(json_file) as f: - data = json.load(f) - sd_type = data['type'] - ckpt_list = data['checkpoints'] - version = data['version'] - if 'BLOOM' in sd_type or 'Bloom' in sd_type: - return ckpt_list - return SDLoaderFactory.get_sd_loader(ckpt_list, - checkpoint_engine, - sd_type, - version) + if isinstance(json_file, str): + with open(json_file) as f: + data = json.load(f) + else: + assert isinstance(json_file, dict) + data = json_file + sd_type = data['type'] + ckpt_list = data['checkpoints'] + version = data['version'] + ckpt_type = data.get('parallelization', 'pp') + mp_size = data.get('mp_size', 0) + if 'bloom' in sd_type.lower(): + return data + return SDLoaderFactory.get_sd_loader(ckpt_list, + checkpoint_engine, + sd_type, + version) @staticmethod def get_sd_loader(ckpt_list, checkpoint_engine, sd_type='Megatron', version=None): From ba67bd9a141f0277d451b876b63862c34e30bfea Mon Sep 17 00:00:00 2001 From: Nicholas Cilfone <23509131+ncilfone@users.noreply.github.com> Date: Fri, 29 Jul 2022 10:24:25 -0400 Subject: [PATCH 32/38] Added retain_graph as a kwarg to the main engine backward function (#1149) Co-authored-by: Jeff Rasley --- deepspeed/runtime/engine.py | 15 +++++++++------ 1 file changed, 9 insertions(+), 6 deletions(-) diff --git a/deepspeed/runtime/engine.py b/deepspeed/runtime/engine.py index 9d1b8b6aac74..5ab14a716674 100644 --- a/deepspeed/runtime/engine.py +++ b/deepspeed/runtime/engine.py @@ -1711,11 +1711,14 @@ def backward(self, loss, allreduce_gradients=True, release_loss=False, + retain_graph=False, scale_wrt_gas=True): r"""Execute backward pass on the loss Arguments: loss: Torch tensor on which to execute backward propagation allreduce_gradients: is deprecated, ignored, and will soon be removed' + retain_graph: bool, default: false + forward on user defined choice of retain_graph """ see_memory_usage("Engine before backward", force=self.memory_breakdown()) @@ -1751,9 +1754,9 @@ def backward(self, self._start_timers(self.engine_timers.backward_inner_timers) if self.zero_optimization(): - self.optimizer.is_gradient_accumulation_boundary = ( - self.is_gradient_accumulation_boundary()) - self.optimizer.backward(loss) + self.optimizer.is_gradient_accumulation_boundary = self.is_gradient_accumulation_boundary( + ) + self.optimizer.backward(loss, retain_graph=retain_graph) elif self.amp_enabled(): # AMP requires delaying unscale when inside gradient accumulation boundaries # https://nvidia.github.io/apex/advanced.html#gradient-accumulation-across-iterations @@ -1761,19 +1764,19 @@ def backward(self, with amp.scale_loss(loss, self.optimizer, delay_unscale=delay_unscale) as scaled_loss: - scaled_loss.backward() + scaled_loss.backward(retain_graph=retain_graph) elif self.fp16_enabled(): if self.eigenvalue_enabled(): self.optimizer.backward(loss, create_graph=True, retain_graph=True) else: - self.optimizer.backward(loss) + self.optimizer.backward(loss, retain_graph=retain_graph) elif self.bfloat16_enabled(): self.optimizer.backward(loss) else: if self.eigenvalue_enabled(): loss.backward(create_graph=True, retain_graph=True) else: - loss.backward() + loss.backward(retain_graph=retain_graph) self._stop_timers(self.engine_timers.backward_inner_timers) From 1ed5aa96a8fc41a68f7be3741fc846b861e11a52 Mon Sep 17 00:00:00 2001 From: Arpan Jain Date: Fri, 29 Jul 2022 14:59:12 -0700 Subject: [PATCH 33/38] Elastic Training support in DeepSpeed (#2153) (#2156) Co-authored-by: Arpan Jain Co-authored-by: Jeff Rasley --- .pre-commit-config.yaml | 2 +- deepspeed/constants.py | 1 - deepspeed/elasticity/__init__.py | 4 + deepspeed/elasticity/config.py | 15 ++ deepspeed/elasticity/constants.py | 8 +- deepspeed/elasticity/elastic_agent.py | 187 +++++++++++++++++++++++++ deepspeed/elasticity/elasticity.py | 126 ++++++++++++++++- deepspeed/elasticity/utils.py | 14 ++ deepspeed/launcher/constants.py | 2 + deepspeed/launcher/launch.py | 106 ++++++++++++-- deepspeed/launcher/multinode_runner.py | 10 +- deepspeed/launcher/runner.py | 61 +++++++- deepspeed/runtime/config.py | 19 +++ deepspeed/runtime/engine.py | 16 ++- deepspeed/runtime/pipe/engine.py | 6 +- docs/_pages/config-json.md | 32 +++++ tests/unit/test_elastic.py | 39 +++++- 17 files changed, 619 insertions(+), 29 deletions(-) create mode 100644 deepspeed/elasticity/elastic_agent.py create mode 100644 deepspeed/elasticity/utils.py diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index df68ddcf5192..590353f3bad3 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -39,7 +39,7 @@ repos: name: check-torchdist entry: ./scripts/check-torchdist.py language: script - exclude: ^(deepspeed/comm/|docs/|benchmarks/|scripts/check-torchdist.py|deepspeed/moe/sharded_moe.py|deepspeed/runtime/comm/coalesced_collectives.py) + exclude: ^(deepspeed/comm/|docs/|benchmarks/|scripts/check-torchdist.py|deepspeed/moe/sharded_moe.py|deepspeed/runtime/comm/coalesced_collectives.py|deepspeed/elasticity/elastic_agent.py|deepspeed/launcher/launch.py) # Specific deepspeed/ files are excluded for now until we wrap ProcessGroup in deepspeed.comm - repo: https://github.com/codespell-project/codespell diff --git a/deepspeed/constants.py b/deepspeed/constants.py index 9576c9c078d5..9e7f511e443f 100644 --- a/deepspeed/constants.py +++ b/deepspeed/constants.py @@ -14,6 +14,5 @@ # To make an attempt at backwards compatibility with THD, we use an # extraordinarily high default timeout, given that THD did not have timeouts. default_pg_timeout = timedelta(minutes=30) - INFERENCE_GENERIC_MODE = 'generic' INFERENCE_SPECIALIZED_MODE = 'specialized' diff --git a/deepspeed/elasticity/__init__.py b/deepspeed/elasticity/__init__.py index be517de7df93..6ad9f20cf936 100644 --- a/deepspeed/elasticity/__init__.py +++ b/deepspeed/elasticity/__init__.py @@ -1 +1,5 @@ from .elasticity import compute_elastic_config, elasticity_enabled, ensure_immutable_elastic_config +from .utils import is_torch_elastic_compatible +from .constants import ENABLED, ENABLED_DEFAULT, ELASTICITY +if is_torch_elastic_compatible(): + from .elastic_agent import DSElasticAgent diff --git a/deepspeed/elasticity/config.py b/deepspeed/elasticity/config.py index 67db58c70e71..ffbce7028e03 100644 --- a/deepspeed/elasticity/config.py +++ b/deepspeed/elasticity/config.py @@ -79,6 +79,7 @@ def __init__(self, param_dict): self.min_gpus = param_dict.get(MIN_GPUS, MIN_GPUS_DEFAULT) self.max_gpus = param_dict.get(MAX_GPUS, MAX_GPUS_DEFAULT) + if self.min_gpus < 1 or self.max_gpus < 1: raise ElasticityConfigError( "Elasticity min/max gpus must be > 0, " @@ -88,6 +89,20 @@ def __init__(self, param_dict): "Elasticity min_gpus cannot be greater than max_gpus, " f"given min_gpus: {self.min_gpus}, max_gpus: {self.max_gpus}") + self.model_parallel_size = param_dict.get(MODEL_PARLLEL_SIZE, + MODEL_PARLLEL_SIZE_DEFAULT) + if self.model_parallel_size < 1: + raise ElasticityConfigError( + "Model-Parallel size cannot be less than 1, " + f"given model-parallel size: {self.model_parallel_size}") + + self.num_gpus_per_node = param_dict.get(NUM_GPUS_PER_NODE, + NUM_GPUS_PER_NODE_DEFAULT) + if self.num_gpus_per_node < 1: + raise ElasticityConfigError( + "Number of GPUs per node cannot be less than 1, " + f"given number of GPUs per node: {self.num_gpus_per_node}") + self.min_time = param_dict.get(MIN_TIME, MIN_TIME_DEFAULT) if self.min_time < 0: raise ElasticityConfigError( diff --git a/deepspeed/elasticity/constants.py b/deepspeed/elasticity/constants.py index cf428b70a0f4..eb40edc84711 100644 --- a/deepspeed/elasticity/constants.py +++ b/deepspeed/elasticity/constants.py @@ -27,7 +27,7 @@ ELASTICITY = 'elasticity' # Current elasticity version -LATEST_ELASTICITY_VERSION = 0.1 +LATEST_ELASTICITY_VERSION = 0.2 ENABLED = 'enabled' ENABLED_DEFAULT = False @@ -46,6 +46,12 @@ MAX_GPUS = 'max_gpus' MAX_GPUS_DEFAULT = 10000 +NUM_GPUS_PER_NODE = 'num_gpus_per_node' +NUM_GPUS_PER_NODE_DEFAULT = 1 + +MODEL_PARLLEL_SIZE = "model_parallel_size" +MODEL_PARLLEL_SIZE_DEFAULT = 1 + # Minimum running time (minutes) before the scheduler will scale us, 0 implies it's unknown MIN_TIME = "min_time" MIN_TIME_DEFAULT = 0 diff --git a/deepspeed/elasticity/elastic_agent.py b/deepspeed/elasticity/elastic_agent.py new file mode 100644 index 000000000000..8d0981612725 --- /dev/null +++ b/deepspeed/elasticity/elastic_agent.py @@ -0,0 +1,187 @@ +from torch.distributed.elastic.agent.server.local_elastic_agent import LocalElasticAgent +from typing import Any, Dict, Optional, Tuple +from datetime import datetime +from torch.distributed.elastic.agent.server.api import log, _get_socket_with_port +from torch.distributed.elastic.metrics import put_metric +from torch.distributed.elastic.agent.server.api import ( + RunResult, + WorkerGroup, + WorkerSpec, + WorkerState, +) +from torch.distributed import Store +import time +import os +from torch.distributed.elastic.multiprocessing import start_processes +from torch.distributed.elastic.utils import macros +import shutil +import copy +from contextlib import closing +import subprocess + + +class DSElasticAgent(LocalElasticAgent): + def __init__( + self, + spec: WorkerSpec, + env: Dict, + start_method="spawn", + exit_barrier_timeout: float = 300, + log_dir: Optional[str] = None, + ): + super().__init__(spec, start_method, exit_barrier_timeout, log_dir) + self.ds_env = env + + @staticmethod + def _set_master_addr_port(store: Store, + master_addr: Optional[str], + master_port: Optional[int]): + if master_port is None: + sock = _get_socket_with_port() + with closing(sock): + master_port = sock.getsockname()[1] + + if master_addr is None: + # master_addr = _get_fq_hostname() + result = subprocess.check_output("hostname -I", shell=True) + master_addr = result.decode('utf-8').split()[0] + + store.set("MASTER_ADDR", master_addr.encode(encoding="UTF-8")) + store.set("MASTER_PORT", str(master_port).encode(encoding="UTF-8")) + + def _start_workers(self, worker_group: WorkerGroup) -> Dict[int, Any]: + spec = worker_group.spec + store = worker_group.store + assert store is not None + master_addr, master_port = super()._get_master_addr_port(store) + restart_count = spec.max_restarts - self._remaining_restarts + + use_agent_store = spec.rdzv_handler.get_backend() == "static" + + args: Dict[int, Tuple] = {} + envs: Dict[int, Dict[str, str]] = {} + for worker in worker_group.workers: + local_rank = worker.local_rank + + worker_env_ds = copy.deepcopy(self.ds_env) + worker_env_elastic = { + "LOCAL_RANK": str(local_rank), + "RANK": str(worker.global_rank), + "GROUP_RANK": str(worker_group.group_rank), + "ROLE_RANK": str(worker.role_rank), + "ROLE_NAME": spec.role, + "LOCAL_WORLD_SIZE": str(spec.local_world_size), + "WORLD_SIZE": str(worker.world_size), + "GROUP_WORLD_SIZE": str(worker_group.group_world_size), + "ROLE_WORLD_SIZE": str(worker.role_world_size), + "MASTER_ADDR": master_addr, + "MASTER_PORT": str(master_port), + "TORCHELASTIC_RESTART_COUNT": str(restart_count), + "TORCHELASTIC_MAX_RESTARTS": str(spec.max_restarts), + "TORCHELASTIC_RUN_ID": spec.rdzv_handler.get_run_id(), + "TORCHELASTIC_USE_AGENT_STORE": str(use_agent_store), + "NCCL_ASYNC_ERROR_HANDLING": os.getenv("NCCL_ASYNC_ERROR_HANDLING", + str(1)), + } + worker_env_ds.update(worker_env_elastic) + if "OMP_NUM_THREADS" in os.environ: + worker_env_ds["OMP_NUM_THREADS"] = os.environ["OMP_NUM_THREADS"] + + envs[local_rank] = worker_env_ds + worker_args = list(spec.args) + worker_args = macros.substitute(worker_args, str(local_rank)) + args[local_rank] = tuple(worker_args) + + # scaling events do not count towards restarts (gets same attempt #) + # remove existing log dir if this restart is due to a scaling event + attempt_log_dir = os.path.join(self._log_dir, f"attempt_{restart_count}") + shutil.rmtree(attempt_log_dir, ignore_errors=True) + os.makedirs(attempt_log_dir) + + assert spec.entrypoint is not None + self._pcontext = start_processes( + name=spec.role, + entrypoint=spec.entrypoint, + args=args, + envs=envs, + log_dir=attempt_log_dir, + start_method=self._start_method, + redirects=spec.redirects, + tee=spec.tee, + ) + + return self._pcontext.pids() + + def _invoke_run(self, role: str = "default") -> RunResult: + # NOTE: currently only works for a single role + + spec = self._worker_group.spec + role = spec.role + + log.info( + f"[{role}] starting workers for entrypoint: {spec.get_entrypoint_name()}") + + self._initialize_workers(self._worker_group) + monitor_interval = spec.monitor_interval + rdzv_handler = spec.rdzv_handler + + participants = rdzv_handler._state_holder.state.participants + + while True: + assert self._worker_group.state != WorkerState.INIT + time.sleep(monitor_interval) + run_result = self._monitor_workers(self._worker_group) + state = run_result.state + self._worker_group.state = state + + expire_time = datetime.utcnow() - ( + rdzv_handler._settings.keep_alive_interval * + rdzv_handler._settings.keep_alive_max_attempt) + _dead_nodes = [ + node for node, + last_heartbeat in + rdzv_handler._state_holder.state.last_heartbeats.items() + if last_heartbeat < expire_time + ] + + put_metric(f"workers.{role}.remaining_restarts", self._remaining_restarts) + put_metric(f"workers.{role}.{state.name.lower()}", 1) + + if state == WorkerState.SUCCEEDED: + log.info( + f"[{role}] worker group successfully finished." + f" Waiting {self._exit_barrier_timeout} seconds for other agents to finish." + ) + self._exit_barrier() + return run_result + elif state in { + WorkerState.UNHEALTHY, + WorkerState.FAILED + } or len(participants) > len(rdzv_handler._state_holder.state.participants): + if self._remaining_restarts > 0: + log.info( + f"[{role}] Worker group {state.name}. " + f"{self._remaining_restarts}/{spec.max_restarts} attempts left;" + f" will restart worker group") + self._remaining_restarts -= 1 + # rdzv_handler._state_holder.state.restart = False + self._restart_workers(self._worker_group) + participants = rdzv_handler._state_holder.state.participants + + else: + self._stop_workers(self._worker_group) + self._worker_group.state = WorkerState.FAILED + self._exit_barrier() + return run_result + elif state == WorkerState.HEALTHY: + # membership changes do not count as retries + num_nodes_waiting = rdzv_handler.num_nodes_waiting() + group_rank = self._worker_group.group_rank + if num_nodes_waiting > 0: + log.info(f"[{role}] Detected {num_nodes_waiting} " + f"new nodes from group_rank={group_rank}; " + f"will restart worker group") + self._restart_workers(self._worker_group) + participants = rdzv_handler._state_holder.state.participants + else: + raise Exception(f"[{role}] Worker group in {state.name} state") diff --git a/deepspeed/elasticity/elasticity.py b/deepspeed/elasticity/elasticity.py index c17dab0319d9..17a8b6ecf394 100644 --- a/deepspeed/elasticity/elasticity.py +++ b/deepspeed/elasticity/elasticity.py @@ -4,7 +4,7 @@ import os import json import numpy as np - +import math from packaging import version as pkg_version from .config import ElasticityConfig, ElasticityConfigError, ElasticityError, \ @@ -91,7 +91,6 @@ def get_valid_gpus(batch_size, micro_batches, min_valid_gpus, max_valid_gpus): valid_gpus.append(i) valid_gpus = set(valid_gpus) valid_gpus = sorted(list(valid_gpus)) - logger.info(f"Valid GPUs: {valid_gpus}") return valid_gpus @@ -171,6 +170,70 @@ def _get_compatible_gpus_v01(micro_batches, return final_batch_size, valid_gpus +def _get_compatible_gpus_v02(micro_batches, + max_acceptable_batch_size, + current_num_gpus, + min_gpus=None, + max_gpus=None, + prefer_larger=True, + num_gpus_per_node=1, + model_parallel_size=1): + ''' + Returns: + final_batch_size + valid_gpus + micro-batch size + ''' + if num_gpus_per_node % model_parallel_size != 0: + raise ElasticityError( + f"In Elasticity v0.2, number of GPUs per node:" \ + f"{num_gpus_per_node} should be divisible by " \ + f"model parallel size {model_parallel_size}") + + def get_microbatch(final_batch_size): + candidate_microbatch = None + + for micro_batch in micro_batches: + if final_batch_size // current_num_gpus % micro_batch == 0: + if candidate_microbatch == None: + candidate_microbatch = micro_batch + if prefer_larger and candidate_microbatch < micro_batch: + candidate_microbatch = micro_batch + return candidate_microbatch + + dp_size_per_node = num_gpus_per_node // model_parallel_size + + final_batch_size, valid_world_size = _get_compatible_gpus_v01(micro_batches, + int(max_acceptable_batch_size/dp_size_per_node), + int(min_gpus/num_gpus_per_node), + int(max_gpus/num_gpus_per_node), # Passing number of max nodes as Elasticity v2 works at node level + prefer_larger=prefer_larger) + + final_batch_size = int(final_batch_size) * dp_size_per_node + valid_dp_world_size = [i * dp_size_per_node for i in valid_world_size] + if current_num_gpus // model_parallel_size in valid_dp_world_size: + candidate_microbatch = get_microbatch(final_batch_size) + return final_batch_size, valid_dp_world_size, candidate_microbatch + + current_dp_size = (current_num_gpus / num_gpus_per_node) * dp_size_per_node + candidate_batch_sizes = [] + for micro_batch in micro_batches: + min_batch_size = micro_batch * current_dp_size + + factor = math.floor(max_acceptable_batch_size / float(min_batch_size)) + candidate_batch_sizes.append(factor * min_batch_size) + + used_microbatch = None + if prefer_larger: + candidate_batch_size = max(candidate_batch_sizes) + else: + candidate_batch_size = min(candidate_batch_sizes) + + candidate_microbatch = get_microbatch(candidate_batch_size) + + return candidate_batch_size, [int(current_dp_size)], candidate_microbatch + + def _compatible_ds_version_check(target_deepspeed_version: str): min_version = pkg_version.parse(MINIMUM_DEEPSPEED_VERSION) target_version = pkg_version.parse(target_deepspeed_version) @@ -221,7 +284,10 @@ def ensure_immutable_elastic_config(runtime_elastic_config_dict: dict): "guarantee resource scheduler will scale this job using compatible GPU counts.") -def compute_elastic_config(ds_config: dict, target_deepspeed_version: str, world_size=0): +def compute_elastic_config(ds_config: dict, + target_deepspeed_version: str, + world_size=0, + return_microbatch=False): """Core deepspeed elasticity API. Given an elastic config (similar to the example below) DeepSpeed will compute a total train batch size corresponding valid GPU count list that provides a high level of elasticity. Elasticity in this case means we are safe to scale @@ -248,8 +314,9 @@ def compute_elastic_config(ds_config: dict, target_deepspeed_version: str, world target_deepspeed_version (str): When called from scheduling infrastructure we want to ensure that the target deepspeed version is compatible with the elasticity version used in the backend. - world_size (int, optional): Intended/current world size, will do some sanity + world_size (int, optional): Intended/current DP world size, will do some sanity checks to ensure world size is actually valid with the config. + return_microbatch (bool, optional): whether to return micro batch size or not. Raises: ElasticityConfigError: Missing required elasticity config or elasticity disabled @@ -275,6 +342,13 @@ def compute_elastic_config(ds_config: dict, target_deepspeed_version: str, world "('enabled':true) if running an elastic training job.") elastic_config = ElasticityConfig(elastic_config_dict) + model_parallel_size = elastic_config.model_parallel_size + num_gpus_per_node = elastic_config.num_gpus_per_node + + if model_parallel_size > 1 and float(elastic_config.version) != 0.2: + raise ElasticityConfigError(f"Elasticity V{elastic_config.version} " \ + f"does not support model-parallel training. Given model-parallel size: " \ + f"{model_parallel_size}") if float(elastic_config.version) > LATEST_ELASTICITY_VERSION: raise ElasticityConfigError("Attempting to run elasticity version " \ @@ -295,10 +369,39 @@ def compute_elastic_config(ds_config: dict, target_deepspeed_version: str, world prefer_larger=elastic_config.prefer_larger_batch_size) # ensure batch size is int dtype final_batch_size = int(final_batch_size) + elif float(elastic_config.version) == 0.2: + if world_size != 0: + current_num_gpus = world_size + else: + if "WORLD_SIZE" in os.environ and \ + os.getenv('WORLD_SIZE').isnumeric(): + current_num_gpus = int(os.getenv('WORLD_SIZE')) + else: + WORLD_SIZE = os.getenv('WORLD_SIZE') + raise ElasticityConfigError( + 'Elasticity V 0.2 needs WORLD_SIZE '\ + 'to compute valid batch size. '\ + 'Either give it as argument to function compute_elastic_config '\ + 'or set it as an environment variable. '\ + f'Value of WORLD_SIZE as environment variable is {WORLD_SIZE}') + + final_batch_size, valid_gpus, candidate_microbatch_size = _get_compatible_gpus_v02( + micro_batches=elastic_config.micro_batches, + max_acceptable_batch_size=elastic_config.max_acceptable_batch_size, + current_num_gpus=current_num_gpus, + min_gpus=elastic_config.min_gpus, + max_gpus=elastic_config.max_gpus, + prefer_larger=elastic_config.prefer_larger_batch_size, + num_gpus_per_node=num_gpus_per_node, + model_parallel_size=model_parallel_size) + # ensure batch size is int dtype + final_batch_size = int(final_batch_size) else: raise NotImplementedError( f"Unable to find elastic logic for version: {elastic_config.version}") + logger.info(f"Valid World Size (GPUs / Model Parallel Size): {valid_gpus}") + if world_size > 0: if world_size not in valid_gpus: raise ElasticityIncompatibleWorldSize(f"World size ({world_size}) is not valid " \ @@ -315,4 +418,19 @@ def compute_elastic_config(ds_config: dict, target_deepspeed_version: str, world f" micro_batches={elastic_config.micro_batches}." return final_batch_size, valid_gpus, micro_batch_size + if return_microbatch: + # Pick a valid micro batch size + if float(elastic_config.version) == 0.2: + return final_batch_size, valid_gpus, candidate_microbatch_size + else: + micro_batch_size = None + for mbsz in sorted(list(set(elastic_config.micro_batches)), reverse=True): + if final_batch_size // world_size % mbsz == 0: + micro_batch_size = mbsz + break + assert micro_batch_size is not None, "Unable to find divisible micro batch size" \ + f" world_size={world_size}, final_batch_size={final_batch_size}, and " \ + f" micro_batches={elastic_config.micro_batches}." + return final_batch_size, valid_gpus, micro_batch_size + return final_batch_size, valid_gpus diff --git a/deepspeed/elasticity/utils.py b/deepspeed/elasticity/utils.py new file mode 100644 index 000000000000..a1001c6b3806 --- /dev/null +++ b/deepspeed/elasticity/utils.py @@ -0,0 +1,14 @@ +import torch + + +def is_torch_elastic_compatible(): + ''' + Helper to lookup torch version. Elastic training is + introduced in 1.11.x + ''' + TORCH_MAJOR = int(torch.__version__.split('.')[0]) + TORCH_MINOR = int(torch.__version__.split('.')[1]) + if TORCH_MAJOR == 1 and TORCH_MINOR >= 11: + return True + else: + return False diff --git a/deepspeed/launcher/constants.py b/deepspeed/launcher/constants.py index 15b262342d47..2ae22ea6c7da 100644 --- a/deepspeed/launcher/constants.py +++ b/deepspeed/launcher/constants.py @@ -7,3 +7,5 @@ MVAPICH_LAUNCHER = 'mvapich' MVAPICH_TMP_HOSTFILE = '/tmp/deepspeed_mvapich_hostfile' + +ELASTIC_TRAINING_ID_DEFAULT = "123456789" diff --git a/deepspeed/launcher/launch.py b/deepspeed/launcher/launch.py index d37a970c5e3a..f39530552055 100755 --- a/deepspeed/launcher/launch.py +++ b/deepspeed/launcher/launch.py @@ -17,11 +17,13 @@ import signal import psutil from collections import defaultdict +from typing import Dict from argparse import ArgumentParser, REMAINDER - from ..constants import TORCH_DISTRIBUTED_DEFAULT_PORT from ..nebula.constants import DLTS_POD_ENV_PATH from ..utils import logger +from ..elasticity import is_torch_elastic_compatible +from .constants import ELASTIC_TRAINING_ID_DEFAULT PID_FILE_BASEPATH = "/tmp" @@ -66,6 +68,20 @@ def parse_args(): help="Skip prepending the training script with " "'python' - just execute it directly.") + parser.add_argument("--enable_elastic_training", + action="store_true", + help="Enable elastic training support.") + + parser.add_argument("--min_elastic_nodes", + type=int, + default=-1, + help="Min number of nodes in elastic training.") + + parser.add_argument("--max_elastic_nodes", + type=int, + default=-1, + help="Max number of nodes in elastic training.") + parser.add_argument("--no_local_rank", action="store_true", help="Do not pass local_rank as an argument when calling " @@ -160,6 +176,12 @@ def main(): with open(pid_file, 'w') as fd: fd.write(f"{launcher_pid}") + if not is_torch_elastic_compatible(): + if args.enable_elastic_training: + logger.info(f"Disabling elastic training support as \ + PyTorch version should be greater than 1.11.x") + args.enable_elastic_training = False + if os.path.exists(DLTS_POD_ENV_PATH): with open(DLTS_POD_ENV_PATH) as file: lines = file.readlines() @@ -173,13 +195,48 @@ def main(): processes = [] cmd = [] - for local_rank in range(0, num_local_procs): - # each process's rank - dist_rank = global_rank_mapping[local_node][local_rank] - current_env["RANK"] = str(dist_rank) - current_env["LOCAL_RANK"] = str(local_rank) - # spawn the processes + if not args.enable_elastic_training: + for local_rank in range(0, num_local_procs): + # each process's rank + dist_rank = global_rank_mapping[local_node][local_rank] + current_env["RANK"] = str(dist_rank) + current_env["LOCAL_RANK"] = str(local_rank) + + # spawn the processes + cmd = [] + if not args.no_python: + cmd = [sys.executable, "-u"] + if args.module: + cmd.append("-m") + else: + if args.module: + raise ValueError("Don't use both the '--no_python' flag" + " and the '--module' flag at the same time.") + cmd.append(args.training_script) + # A user may not want to pass local_rank as a keyword arg so we make this optional. + if not args.no_local_rank: + cmd.append(f"--local_rank={local_rank}") + cmd += args.training_script_args + + process = subprocess.Popen(cmd, env=current_env) + processes.append(process) + else: + from ..elasticity import DSElasticAgent + from torch.distributed.elastic.rendezvous import RendezvousParameters + from torch.distributed.elastic.agent.server.api import WorkerSpec + import torch.distributed.elastic.rendezvous.registry as rdzv_registry + from torch.distributed.elastic.multiprocessing import Std + + if args.min_elastic_nodes == -1: + args.min_elastic_nodes = 1 + if args.max_elastic_nodes == -1: + args.max_elastic_nodes = args.nnodes + assert args.max_elastic_nodes > 0 and args.min_elastic_nodes > 0 , "Max and Min nodes should be positive" + + current_env["NCCL_ASYNC_ERROR_HANDLING"] = str(1) + + # Get config and arguments cmd = [] if not args.no_python: cmd = [sys.executable, "-u"] @@ -190,13 +247,36 @@ def main(): raise ValueError("Don't use both the '--no_python' flag" " and the '--module' flag at the same time.") cmd.append(args.training_script) - # A user may not want to pass local_rank as a keyword arg so we make this optional. - if not args.no_local_rank: - cmd.append(f"--local_rank={local_rank}") cmd += args.training_script_args - - process = subprocess.Popen(cmd, env=current_env) - processes.append(process) + cmd_args = cmd[1:] + + rdzv_configs: Dict[str, str] = {'timeout': 100} + run_id = os.environ.get("ELASTIC_RUN_ID", ELASTIC_TRAINING_ID_DEFAULT) + + # Creating config for rendezvous class + rdzv_parameters = RendezvousParameters(backend='c10d', + endpoint=args.master_addr + ":" + + str(args.master_port), + run_id=run_id, + min_nodes=args.min_elastic_nodes, + max_nodes=args.max_elastic_nodes, + **rdzv_configs) + + spec = WorkerSpec( + role='trainer', + local_world_size=num_local_procs, + entrypoint=cmd[0], + args=cmd[1:], + rdzv_handler=rdzv_registry.get_rendezvous_handler(rdzv_parameters), + max_restarts=100, + monitor_interval=5, + redirects=Std.from_str("0"), + tee=Std.from_str("0"), + master_addr=None, + master_port=None, + ) + agent = DSElasticAgent(spec, current_env) + agent.run() sig_names = {2: "SIGINT", 15: "SIGTERM"} last_return_code = None diff --git a/deepspeed/launcher/multinode_runner.py b/deepspeed/launcher/multinode_runner.py index 6fb187cfde23..7c2828e75fc7 100644 --- a/deepspeed/launcher/multinode_runner.py +++ b/deepspeed/launcher/multinode_runner.py @@ -94,8 +94,16 @@ def get_cmd(self, environment, active_resources): deepspeed_launch.append("--no_local_rank") if self.args.save_pid: deepspeed_launch += ["--save_pid", f"{os.getpid()}"] + if self.args.elastic_training: + deepspeed_launch.append("--enable_elastic_training") + deepspeed_launch.append(f"--max_elastic_nodes={self.args.max_elastic_nodes}") + deepspeed_launch.append(f"--min_elastic_nodes={self.args.min_elastic_nodes}") + + cmd_to_search = [i + "\\" for i in deepspeed_launch[2:6]] + + kill_command = pdsh_cmd_args + ["pkill -f ", " ".join(cmd_to_search)[:-2]] return pdsh_cmd_args + deepspeed_launch + [self.user_script - ] + self.user_arguments + ] + self.user_arguments, kill_command class OpenMPIRunner(MultiNodeRunner): diff --git a/deepspeed/launcher/runner.py b/deepspeed/launcher/runner.py index cf3e98dc25bb..f35fb3994ac4 100755 --- a/deepspeed/launcher/runner.py +++ b/deepspeed/launcher/runner.py @@ -14,7 +14,8 @@ import subprocess import collections from copy import deepcopy - +import signal +import time import torch.cuda from .multinode_runner import PDSHRunner, OpenMPIRunner, MVAPICHRunner @@ -77,6 +78,18 @@ def parse_args(args=None): help="Total number of worker nodes to run on, this will use " "the top N hosts from the given hostfile.") + parser.add_argument("--min_elastic_nodes", + type=int, + default=-1, + help="Minimum number of nodes to run elastic training on. " + "Default is 1 when elastic training is enabled") + + parser.add_argument("--max_elastic_nodes", + type=int, + default=-1, + help="Maximum number of nodes to run elastic training on. " + "Default is num_nodes when elastic training is enabled") + parser.add_argument("--num_gpus", type=int, default=-1, @@ -148,6 +161,10 @@ def parse_args(args=None): help="Run DeepSpeed autotuner to discover optimal configuration parameters " "before running job.") + parser.add_argument("--elastic_training", + action="store_true", + help="Enable elastic training support in DeepSpeed.") + parser.add_argument("user_script", type=str, help="User script to launch, followed by any required " @@ -316,9 +333,27 @@ def run_autotuning(args, active_resources): tuner.run_after_tuning() +def parse_num_nodes(str_num_nodes: str, elastic_training: bool): + node_list = str_num_nodes.split(":") + + if len(node_list) == 1: + min_nodes, max_nodes = int(node_list[0]), -1 + elif len(node_list) == 2 and elastic_training: + min_nodes, max_nodes = int(node_list[0]), int(node_list[1]) + elif len(node_list) == 2 and not elastic_training: + raise RuntimeError("MIN:MAX format is only supported in elastic training") + else: + raise RuntimeError("num_nodes {} is not in MIN:MAX format".format(str_num_nodes)) + + return min_nodes, max_nodes + + def main(args=None): args = parse_args(args) + if args.elastic_training: + assert args.master_addr != "", "Master Addr is required when elastic training is enabled" + resource_pool = fetch_hostfile(args.hostfile) # respect CUDA_VISIBLE_DEVICES for a single node and no explicit resource filters @@ -397,6 +432,9 @@ def main(args=None): updated_active_resources[hostname] = list(range(args.num_gpus)) active_resources = updated_active_resources + if args.elastic_training: + assert not args.no_local_rank, "--no_local_rank argument is not supported in Elastic training" + # encode world info as base64 to make it easier to pass via command line world_info_base64 = encode_world_info(active_resources) @@ -420,6 +458,10 @@ def main(args=None): deepspeed_launch.append("--no_local_rank") if args.save_pid: deepspeed_launch += ["--save_pid", f"{os.getpid()}"] + if args.elastic_training: + deepspeed_launch.append("--enable_elastic_training") + deepspeed_launch.append(f"--max_elastic_nodes={args.max_elastic_nodes}") + deepspeed_launch.append(f"--min_elastic_nodes={args.min_elastic_nodes}") cmd = deepspeed_launch + [args.user_script] + args.user_args else: args.launcher = args.launcher.lower() @@ -454,11 +496,26 @@ def main(args=None): key, val = var.split('=', maxsplit=1) runner.add_export(key, val) - cmd = runner.get_cmd(env, active_resources) + if args.launcher == PDSH_LAUNCHER: + cmd, kill_cmd = runner.get_cmd(env, active_resources) + else: + cmd = runner.get_cmd(env, active_resources) logger.info(f"cmd = {' '.join(cmd)}") result = subprocess.Popen(cmd, env=env) + def sigkill_handler(signum, frame): + result.send_signal(signal.SIGINT) + time.sleep(0.1) + result.send_signal(signal.SIGTERM) + result_kill = subprocess.Popen(kill_cmd, env=env) + result_kill.wait() + time.sleep(1) + sys.exit(1) + + if args.launcher == PDSH_LAUNCHER: + signal.signal(signal.SIGINT, sigkill_handler) + result.wait() # In case of failure must propagate the error-condition back to the caller (usually shell). The diff --git a/deepspeed/runtime/config.py b/deepspeed/runtime/config.py index 0794e4525343..e0aa105be8f3 100755 --- a/deepspeed/runtime/config.py +++ b/deepspeed/runtime/config.py @@ -41,6 +41,10 @@ ELASTICITY, IGNORE_NON_ELASTIC_BATCH_INFO, IGNORE_NON_ELASTIC_BATCH_INFO_DEFAULT, + MODEL_PARLLEL_SIZE, + MODEL_PARLLEL_SIZE_DEFAULT, + NUM_GPUS_PER_NODE, + NUM_GPUS_PER_NODE_DEFAULT, ) from ..profiling.config import DeepSpeedFlopsProfilerConfig @@ -726,6 +730,21 @@ def __init__(self, config: Union[str, dict], mpu=None): # Ensure the resource scheduler saw the same elastic config we are using at runtime ensure_immutable_elastic_config(runtime_elastic_config_dict=elastic_dict) + self.elastic_model_parallel_size = elastic_dict.get( + MODEL_PARLLEL_SIZE, + MODEL_PARLLEL_SIZE_DEFAULT) + if self.elastic_model_parallel_size < 1: + raise ElasticityConfigError( + "Model-Parallel size cannot be less than 1, " + f"given model-parallel size: {self.elastic_model_parallel_size}") + + self.num_gpus_per_node = elastic_dict.get(NUM_GPUS_PER_NODE, + NUM_GPUS_PER_NODE_DEFAULT) + if self.num_gpus_per_node < 1: + raise ElasticityConfigError( + "NUmber of GPUs per node cannot be less than 1, " + f"given number of GPUs per node: {self.num_gpus_per_node}") + ignore_non_elastic_batch_info = elastic_dict.get( IGNORE_NON_ELASTIC_BATCH_INFO, IGNORE_NON_ELASTIC_BATCH_INFO_DEFAULT) diff --git a/deepspeed/runtime/engine.py b/deepspeed/runtime/engine.py index 5ab14a716674..a67ed6fd7fb7 100644 --- a/deepspeed/runtime/engine.py +++ b/deepspeed/runtime/engine.py @@ -264,9 +264,11 @@ def __init__( see_memory_usage(f"DeepSpeed Engine: After args sanity test", force=self.memory_breakdown()) if mpu is not None: - assert not self.elasticity_enabled(), ( - "Elasticity is not currently supported" " with model parallelism." - ) + if self.elasticity_enabled(): + if not self.is_elastic_model_parallel_supported(): + assert not self.elasticity_enabled(), ( + "Elasticity is not currently supported" " with model parallelism." + ) self._set_distributed_vars(args) @@ -470,6 +472,14 @@ def checkpoint_tag_validation_fail(self): def elasticity_enabled(self): return self._config.elasticity_enabled + def is_elastic_model_parallel_supported(self): + if self.elasticity_enabled(): + # Add code for finding number of GPUs per node automatically + if self._config.num_gpus_per_node % self._config.elastic_model_parallel_size == 0: + return True + else: + return False + def pld_enabled(self): return self._config.pld_enabled diff --git a/deepspeed/runtime/pipe/engine.py b/deepspeed/runtime/pipe/engine.py index 0f3443d980f8..33edc2db1a6a 100644 --- a/deepspeed/runtime/pipe/engine.py +++ b/deepspeed/runtime/pipe/engine.py @@ -70,8 +70,10 @@ def __init__(self, has_bool_tensors=False, *super_args, **super_kwargs): # used to disable the pipeline all-reduce when used with 1-bit Adam/1-bit LAMB self.pipeline_enable_backward_allreduce = True - assert not self.elasticity_enabled(), "Elasticity is not currently supported" \ - " with pipeline parallelism." + if self.elasticity_enabled(): + if not self.is_elastic_model_parallel_supported(): + assert not self.elasticity_enabled(), "Elasticity is not currently supported" \ + " with pipeline parallelism." # pipeline step for logging self.log_batch_step_id = -1 diff --git a/docs/_pages/config-json.md b/docs/_pages/config-json.md index 11541aee9761..6118bece5272 100755 --- a/docs/_pages/config-json.md +++ b/docs/_pages/config-json.md @@ -1048,6 +1048,38 @@ Example of **csv_monitor** configuration: } ``` +### Elastic Training Config (V0.1 and V0.2) + +```json + "elasticity": { + "enabled": true, + "max_train_batch_size": "seqlen", + "micro_batch_sizes": 8, + "min_gpus": 1024, + "max_gpus": "fixed_linear", + "min_time": "seqlen", + "version": 8, + "ignore_non_elastic_batch_info": 1024, + "num_gpus_per_node": "fixed_linear", + "model_parallel_size": MODEL_PARALLEL_SIZE + } +``` + +| Field | Description |Default| +| ------ | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | ----- | +| `enabled` | Enables computation of global batch size in elastic training. | false | +| `max_train_batch_size` | Max acceptable batch size can be used in training. | 2000 | +| `micro_batch_sizes` | Acceptable micro batch sizes, same as train_micro_batch_size_per_gpu | [2,4,6] | +| `min_gpus` | Min number of GPUs to search over when computing highly composite batch size in v0.1 and v0.2. | 1 | +| `max_gpus` | Max number of GPUs to search over when computing highly composite batch size in v0.1 and v0.2. | 10000 | +| `min_time` |Minimum running time (minutes) before the scheduler will scale again (only used in v0.1). 0 implies it's unknown | 0 | +| `prefer_large_batch` | When finding a suitable batch size, attempt to find one that is closest to the max train batch size given. | true | +| `version` | Version of elastic logic to use. | 0.2 | +| `ignore_non_elastic_batch_info` | Ignore all batch info provided outside the elastic config. To reduce confusion, we require all batch related info to be given in elastic config only. | false | +| `num_gpus_per_node` | Number of GPUs per node. This information is used by v0.2 to support model-parallel training (only used by v0.2) | 1 | +| `model_parallel_size` | Tensor or model parallel size (only used by v0.2) | 1 | + + ### Communication Logging diff --git a/tests/unit/test_elastic.py b/tests/unit/test_elastic.py index 9f5d1f0d06bd..4ed2c0dd0c95 100644 --- a/tests/unit/test_elastic.py +++ b/tests/unit/test_elastic.py @@ -2,6 +2,7 @@ import deepspeed from .common import distributed_test from deepspeed.git_version_info import version as ds_version +import os from .simple_model import SimpleModel, args_from_dict base_ds_config = { @@ -78,7 +79,7 @@ def test_invalid_world_size(): def test_future_elastic_version(): ds_config = base_ds_config.copy() - ds_config['elasticity']['version'] = '0.2' + ds_config['elasticity']['version'] = '0.3' with pytest.raises(deepspeed.elasticity.config.ElasticityError): deepspeed.elasticity.compute_elastic_config(ds_config=ds_config, target_deepspeed_version=ds_version) @@ -107,6 +108,42 @@ def test_empty_config(): target_deepspeed_version=ds_version) +def test_model_parallel_v1_invalid(): + ds_config = base_ds_config.copy() + ds_config["elasticity"]["model_parallel_size"] = 4 + ds_config["elasticity"]["num_gpus_per_node"] = 8 + ds_config["elasticity"]["version"] = 0.1 + + with pytest.raises(deepspeed.elasticity.config.ElasticityError): + deepspeed.elasticity.compute_elastic_config(ds_config=ds_config, + target_deepspeed_version=ds_version) + + +def test_model_parallel_v2_invalid(): + ds_config = base_ds_config.copy() + ds_config["elasticity"]["model_parallel_size"] = 16 + ds_config["elasticity"]["num_gpus_per_node"] = 8 + ds_config["elasticity"]["version"] = 0.2 + + with pytest.raises(deepspeed.elasticity.config.ElasticityError): + deepspeed.elasticity.compute_elastic_config(ds_config=ds_config, + target_deepspeed_version=ds_version, + world_size=16) + + +def test_model_parallel_v2_valid(): + + ds_config = base_ds_config.copy() + ds_config["elasticity"]["model_parallel_size"] = 4 + ds_config["elasticity"]["num_gpus_per_node"] = 8 + ds_config["elasticity"]["version"] = 0.2 + + os.environ["WORLD_SIZE"] = str(16) + deepspeed.elasticity.compute_elastic_config(ds_config=ds_config, + target_deepspeed_version=ds_version) + os.environ.pop("WORLD_SIZE") + + @pytest.mark.parametrize('key, value', [('micro_batch_sizes', [1, From 63f470eeb61cf7a5b3cd0b20056ff5f83393e33a Mon Sep 17 00:00:00 2001 From: Jeff Rasley Date: Fri, 29 Jul 2022 15:00:12 -0700 Subject: [PATCH 34/38] prevent cuda 10 builds of inference kernels on ampere (#2157) --- op_builder/builder.py | 4 +++- op_builder/transformer_inference.py | 17 ++++++++++++++++- 2 files changed, 19 insertions(+), 2 deletions(-) diff --git a/op_builder/builder.py b/op_builder/builder.py index 384129a9a941..acdc721a3022 100644 --- a/op_builder/builder.py +++ b/op_builder/builder.py @@ -110,6 +110,7 @@ class OpBuilder(ABC): def __init__(self, name): self.name = name self.jit_mode = False + self.error_log = None @abstractmethod def absolute_name(self): @@ -439,6 +440,7 @@ def command_exists(self, cmd): return valid def warning(self, msg): + self.error_log = f"{msg}" print(f"{WARNING} {msg}") def deepspeed_src_path(self, code_path): @@ -471,7 +473,7 @@ def load(self, verbose=True): def jit_load(self, verbose=True): if not self.is_compatible(verbose): raise RuntimeError( - f"Unable to JIT load the {self.name} op due to it not being compatible due to hardware/software issue." + f"Unable to JIT load the {self.name} op due to it not being compatible due to hardware/software issue. {self.error_log}" ) try: import ninja # noqa: F401 diff --git a/op_builder/transformer_inference.py b/op_builder/transformer_inference.py index 2f05230dbada..e9df633174f3 100755 --- a/op_builder/transformer_inference.py +++ b/op_builder/transformer_inference.py @@ -1,4 +1,6 @@ -from .builder import CUDAOpBuilder +import torch +from packaging import version +from .builder import CUDAOpBuilder, installed_cuda_version class InferenceBuilder(CUDAOpBuilder): @@ -12,6 +14,19 @@ def __init__(self, name=None): def absolute_name(self): return f'deepspeed.ops.transformer.inference.{self.NAME}_op' + def is_compatible(self, verbose=True): + cuda_okay = True + if not self.is_rocm_pytorch() and torch.cuda.is_available(): + sys_cuda_major, _ = installed_cuda_version() + torch_cuda_major = version.parse(torch.version.cuda).major + cuda_capability = torch.cuda.get_device_properties(0).major + if cuda_capability >= 8: + if torch_cuda_major < 11 or sys_cuda_major < 11: + self.warning( + "On Ampere and higher architectures please use CUDA 11+") + cuda_okay = False + return super().is_compatible(verbose) and cuda_okay + def sources(self): return [ 'csrc/transformer/inference/csrc/pt_binding.cpp', From 46401b3884d0a745a10db2a0de7ab7665cf906c7 Mon Sep 17 00:00:00 2001 From: Jeff Rasley Date: Fri, 29 Jul 2022 17:24:46 -0700 Subject: [PATCH 35/38] [zero-3] shutdown zero.Init from within ds.init (#2150) --- deepspeed/__init__.py | 3 + .../runtime/zero/partition_parameters.py | 58 ++++++++++++------- op_builder/transformer_inference.py | 3 +- tests/unit/test_zero_context.py | 27 +++++++++ 4 files changed, 67 insertions(+), 24 deletions(-) diff --git a/deepspeed/__init__.py b/deepspeed/__init__.py index 50049a2a1996..1a5ee744d9bd 100755 --- a/deepspeed/__init__.py +++ b/deepspeed/__init__.py @@ -115,6 +115,9 @@ def initialize(args=None, __git_branch__), ranks=[0]) + # Disable zero.Init context if it's currently enabled + zero.partition_parameters.shutdown_init_context() + assert model is not None, "deepspeed.initialize requires a model" if not isinstance(model, PipelineModule): diff --git a/deepspeed/runtime/zero/partition_parameters.py b/deepspeed/runtime/zero/partition_parameters.py index bab0e95400d8..db135e0cf182 100755 --- a/deepspeed/runtime/zero/partition_parameters.py +++ b/deepspeed/runtime/zero/partition_parameters.py @@ -35,6 +35,7 @@ param_count = 0 partitioned_param_data_shape = [0] +zero_init_enabled = False def _dist_allgather_fn(input_tensor: Tensor, output_tensor: Tensor, group=None): @@ -258,8 +259,10 @@ def __init__(self, assert self.dtype in [torch.half, torch.bfloat16, torch.float], f"Invalid data type {self.dtype}, allowed values are [torch.half, torch.bfloat16, torch.float]" def __enter__(self): + global zero_init_enabled if not self.enabled: return + zero_init_enabled = True def apply_with_gather(orig_module_apply_fn: Callable) -> Callable: """many models make use of child modules like Linear or Embedding which @@ -404,28 +407,7 @@ def __exit__(self, exc_type, exc_value, traceback): if not self.enabled: return - def _disable_class(cls): - cls.__init__ = cls._old_init - - # Replace .__init__() for all existing subclasses of torch.nn.Module - for subclass in get_all_subclasses(torch.nn.modules.module.Module): - _disable_class(subclass) - - # putting methods back the way we found them - torch.nn.modules.module.Module.__init_subclass__ = torch.nn.modules.module.Module._old_init_subclass - torch.nn.modules.module.Module.apply = torch.nn.modules.module.Module._old_apply - - torch.Tensor.__new__ = torch.Tensor.__old_new__ - torch.empty = _orig_torch_empty - torch.zeros = _orig_torch_zeros - torch.ones = _orig_torch_ones - torch.full = _orig_torch_full - - # un doing it here will undo it during training - # if self.mem_efficient_linear: - # torch.nn.functional.linear = self.linear_bk - # if self.mem_efficient_linear: - # torch.nn.functional.linear = self.linear_bk + shutdown_init_context() if dist.get_rank() == 0: logger.info("finished initializing model with %.2fB parameters", @@ -454,6 +436,38 @@ def _set_dtype(self, ds_config, dtype): self.dtype = dtype or torch.half +def shutdown_init_context(): + global zero_init_enabled + + if not zero_init_enabled: + return + + def _disable_class(cls): + cls.__init__ = cls._old_init + + # Replace .__init__() for all existing subclasses of torch.nn.Module + for subclass in get_all_subclasses(torch.nn.modules.module.Module): + _disable_class(subclass) + + # putting methods back the way we found them + torch.nn.modules.module.Module.__init_subclass__ = torch.nn.modules.module.Module._old_init_subclass + torch.nn.modules.module.Module.apply = torch.nn.modules.module.Module._old_apply + + torch.Tensor.__new__ = torch.Tensor.__old_new__ + torch.empty = _orig_torch_empty + torch.zeros = _orig_torch_zeros + torch.ones = _orig_torch_ones + torch.full = _orig_torch_full + + # un doing it here will undo it during training + # if self.mem_efficient_linear: + # torch.nn.functional.linear = self.linear_bk + # if self.mem_efficient_linear: + # torch.nn.functional.linear = self.linear_bk + + zero_init_enabled = False + + class AllGatherHandle: def __init__(self, handle, param: Parameter) -> None: if param.ds_status != ZeroParamStatus.INFLIGHT: diff --git a/op_builder/transformer_inference.py b/op_builder/transformer_inference.py index e9df633174f3..42e909aeb6a0 100755 --- a/op_builder/transformer_inference.py +++ b/op_builder/transformer_inference.py @@ -1,5 +1,4 @@ import torch -from packaging import version from .builder import CUDAOpBuilder, installed_cuda_version @@ -18,7 +17,7 @@ def is_compatible(self, verbose=True): cuda_okay = True if not self.is_rocm_pytorch() and torch.cuda.is_available(): sys_cuda_major, _ = installed_cuda_version() - torch_cuda_major = version.parse(torch.version.cuda).major + torch_cuda_major = int(torch.version.cuda.split('.')[0]) cuda_capability = torch.cuda.get_device_properties(0).major if cuda_capability >= 8: if torch_cuda_major < 11 or sys_cuda_major < 11: diff --git a/tests/unit/test_zero_context.py b/tests/unit/test_zero_context.py index e689005709d9..a8fb31a8c8e5 100644 --- a/tests/unit/test_zero_context.py +++ b/tests/unit/test_zero_context.py @@ -360,3 +360,30 @@ def test_subclass_param_init(): assert torch.equal(model.param, ones + 1) assert torch.equal(model.param_pa, ones + 2) assert torch.equal(model.param_grandpa, ones + 3) + + +@distributed_test(world_size=2) +def test_ds_init_w_zinit(): + ds_config = { + "train_batch_size": 2, + "steps_per_print": 1, + "optimizer": { + "type": "Adam", + "params": { + "lr": 0.00015 + } + } + } + + class Model(torch.nn.Module): + def __init__(self): + super(Model, self).__init__() + self.linear = torch.nn.Linear(4, 4) + + def magic(self): + return 42 + + with deepspeed.zero.Init(): + model = Model() + engine, *_ = deepspeed.initialize(model=model, config=ds_config, model_parameters=model.parameters()) + assert engine.magic() == 42 From a039e2261a462ce0d8c34c57c3a0927c8ff8ff5e Mon Sep 17 00:00:00 2001 From: Jeff Rasley Date: Sat, 30 Jul 2022 10:33:19 -0700 Subject: [PATCH 36/38] enable fp16 input autocasting (#2158) --- deepspeed/runtime/config.py | 6 ++++++ deepspeed/runtime/constants.py | 4 ++++ deepspeed/runtime/engine.py | 22 ++++++++++++++++++++++ docs/_pages/config-json.md | 7 +++++++ 4 files changed, 39 insertions(+) diff --git a/deepspeed/runtime/config.py b/deepspeed/runtime/config.py index e0aa105be8f3..8e2dcd301e5e 100755 --- a/deepspeed/runtime/config.py +++ b/deepspeed/runtime/config.py @@ -163,6 +163,11 @@ def get_fp16_master_weights_and_grads_enabled(param_dict): return False +def get_fp16_auto_cast(param_dict): + if get_fp16_enabled(param_dict): + return get_scalar_param(param_dict[FP16], FP16_AUTO_CAST, FP16_AUTO_CAST_DEFAULT) + + def get_loss_scale(param_dict): if get_fp16_enabled(param_dict): return get_scalar_param(param_dict[FP16], @@ -820,6 +825,7 @@ def _initialize_params(self, param_dict): self.gradient_clipping = get_gradient_clipping(param_dict) self.fp16_enabled = get_fp16_enabled(param_dict) + self.fp16_auto_cast = get_fp16_auto_cast(param_dict) self.bfloat16_enabled = get_bfloat16_enabled(param_dict) assert not (self.fp16_enabled and self.bfloat16_enabled), 'bfloat16 and fp16 modes cannot be simultaneously enabled' self.fp16_master_weights_and_gradients = get_fp16_master_weights_and_grads_enabled( diff --git a/deepspeed/runtime/constants.py b/deepspeed/runtime/constants.py index 2ef10161f042..da36a7199470 100755 --- a/deepspeed/runtime/constants.py +++ b/deepspeed/runtime/constants.py @@ -133,6 +133,7 @@ FP16 parameters should be of the format: "fp16": { "enabled": true, + "auto_cast": false, "loss_scale": 0, "initial_scale_power": 32, "loss_scale_window": 1000, @@ -149,6 +150,9 @@ FP16_LOSS_SCALE = "loss_scale" FP16_LOSS_SCALE_DEFAULT = 0 +FP16_AUTO_CAST = "auto_cast" +FP16_AUTO_CAST_DEFAULT = False + # FP16 initial dynamic scale loss power FP16_INITIAL_SCALE_POWER = "initial_scale_power" FP16_INITIAL_SCALE_POWER_DEFAULT = 32 diff --git a/deepspeed/runtime/engine.py b/deepspeed/runtime/engine.py index a67ed6fd7fb7..9f3554fbb78c 100644 --- a/deepspeed/runtime/engine.py +++ b/deepspeed/runtime/engine.py @@ -715,6 +715,9 @@ def amp_enabled(self): def amp_params(self): return self._config.amp_params + def fp16_auto_cast(self): + return self._config.fp16_auto_cast + def loss_scale(self): return self._config.loss_scale @@ -1649,6 +1652,9 @@ def forward(self, *inputs, **kwargs): if self.training_dataloader is None: self.tput_timer.start() + if self.fp16_auto_cast(): + inputs = self._cast_inputs_half(inputs) + loss = self.module(*inputs, **kwargs) if self.zero_optimization_partition_weights(): @@ -1672,6 +1678,22 @@ def forward(self, *inputs, **kwargs): see_memory_usage("Engine after forward", force=self.memory_breakdown()) return loss + def _cast_inputs_half(self, inputs): + if isinstance(inputs, (list, tuple)): + new_inputs = [] + for v in inputs: + new_inputs.append(self._cast_inputs_half(v)) + return inputs.__class__(new_inputs) + elif isinstance(inputs, dict): + new_inputs = {} + for k, v in inputs: + new_inputs[k] = self._cast_inputs_half(v) + return new_inputs + elif hasattr(inputs, 'half'): + return inputs.half() + else: + return inputs + def print_forward_breakdown(self, fwd_time): gate_time = 0.0 moe_time = 0.0 diff --git a/docs/_pages/config-json.md b/docs/_pages/config-json.md index 6118bece5272..8498b4613c8e 100755 --- a/docs/_pages/config-json.md +++ b/docs/_pages/config-json.md @@ -219,6 +219,7 @@ Example of **scheduler** ```json "fp16": { "enabled": true, + "auto_cast": false, "loss_scale": 0, "initial_scale_power": 32, "loss_scale_window": 1000, @@ -233,6 +234,12 @@ Example of **scheduler** | ------------------------------------------------------------------------------------------- | ------- | | **enabled** is a **fp16** parameter indicating whether or not FP16 training enabled. | `false` | +**fp16:auto_cast**: [boolean] + +| Description | Default | +| -------------------------------------------------------------| ------- | +| **auto_cast** automatically casts inputs to **fp16** | `false` | + **fp16:loss_scale**: [float] | Description | Default | From 2210ebe70f68135b6b43e91323a7d96a403a2299 Mon Sep 17 00:00:00 2001 From: Olatunji Ruwase Date: Sun, 31 Jul 2022 15:39:48 -0700 Subject: [PATCH 37/38] Release swap buffers for persisted params (#2089) * Split parameter offload from z3 * Format fixes * Bug fixes * Cleanup * Remove dead code * Release swap buffers for persisted params * Format fixes * Format fixes * Pass args correctly * Use pinned memory for nvme offload * Merge with masster * Fix missing import * model pesistence params * Fix merge issues * Handle none device * Usse log_dist --- deepspeed/runtime/engine.py | 66 +++++++++---------- deepspeed/runtime/zero/config.py | 4 ++ deepspeed/runtime/zero/parameter_offload.py | 22 +++++-- .../runtime/zero/partition_parameters.py | 10 ++- .../zero/partitioned_param_coordinator.py | 10 +++ deepspeed/runtime/zero/stage3.py | 23 ++++--- 6 files changed, 83 insertions(+), 52 deletions(-) diff --git a/deepspeed/runtime/engine.py b/deepspeed/runtime/engine.py index 9f3554fbb78c..476f71de2120 100644 --- a/deepspeed/runtime/engine.py +++ b/deepspeed/runtime/engine.py @@ -300,9 +300,8 @@ def __init__( monitor_memory=False, ) - if dist.get_rank() == 0: - logger.info( - f"DeepSpeed Flops Profiler Enabled: {self.flops_profiler_enabled()}") + log_dist(f"DeepSpeed Flops Profiler Enabled: {self.flops_profiler_enabled()}", + ranks=[0]) if self.flops_profiler_enabled(): self.flops_profiler = FlopsProfiler(self.module, self) @@ -688,6 +687,9 @@ def zero_prefetch_bucket_size(self): def zero_param_persistence_threshold(self): return self._config.zero_config.param_persistence_threshold + def zero_model_persistence_threshold(self): + return self._config.zero_config.model_persistence_threshold + def zero_gather_16bit_weights_on_model_save(self): return self._config.zero_config.gather_16bit_weights_on_model_save @@ -779,18 +781,17 @@ def _configure_lr_scheduler(self, client_lr_scheduler): # First check for scheduler in json configuration lr_scheduler = self._scheduler_from_config(self.optimizer) if lr_scheduler: - if self.global_rank == 0: - logger.info( - f"DeepSpeed using configured LR scheduler = {self.scheduler_name()}") + log_dist( + f"DeepSpeed using configured LR scheduler = {self.scheduler_name()}", + ranks=[0]) self.lr_scheduler = lr_scheduler else: if isinstance(client_lr_scheduler, Callable): - if self.global_rank == 0: - logger.info('DeepSpeed using client callable to create LR scheduler') + log_dist('DeepSpeed using client callable to create LR scheduler', + ranks=[0]) self.lr_scheduler = client_lr_scheduler(self.basic_optimizer) else: - if self.global_rank == 0: - logger.info('DeepSpeed using client LR scheduler') + log_dist('DeepSpeed using client LR scheduler', ranks=[0]) self.lr_scheduler = client_lr_scheduler log_dist(f'DeepSpeed LR Scheduler = {self.lr_scheduler}', ranks=[0]) @@ -1093,31 +1094,26 @@ def _configure_optimizer(self, client_optimizer, model_parameters): client_optimizer.param_groups[:] = [ pg for pg in client_optimizer.param_groups if len(pg["params"]) != 0 ] - if self.global_rank == 0: - logger.info( - "Removing param_group that has no 'params' in the client Optimizer" - ) + log_dist( + "Removing param_group that has no 'params' in the client Optimizer", + ranks=[0]) basic_optimizer = client_optimizer - if self.global_rank == 0: - logger.info('Using client Optimizer as basic optimizer') + log_dist('Using client Optimizer as basic optimizer', ranks=[0]) else: basic_optimizer = client_optimizer(model_parameters) - if self.global_rank == 0: - logger.info('Using client callable to create basic optimizer') + log_dist('Using client callable to create basic optimizer', ranks=[0]) else: basic_optimizer = self._configure_basic_optimizer(model_parameters) - if self.global_rank == 0: - logger.info( - "Using DeepSpeed Optimizer param name {} as basic optimizer".format( - self.optimizer_name())) + log_dist( + f"Using DeepSpeed Optimizer param name {self.optimizer_name()} as basic optimizer", + ranks=[0]) self._check_for_duplicates(basic_optimizer) self.basic_optimizer = basic_optimizer - if self.global_rank == 0: - logger.info("DeepSpeed Basic Optimizer = {}".format( - basic_optimizer.__class__.__name__)) + log_dist("DeepSpeed Basic Optimizer = {basic_optimizer.__class__.__name__}", + ranks=[0]) if self.zero_optimization(): assert ( @@ -1138,8 +1134,7 @@ def _configure_optimizer(self, client_optimizer, model_parameters): elif self.amp_enabled(): assert not (self.fp16_enabled() or self.bfloat16_enabled()), "Cannot enable both amp with (legacy) fp16 or bfloat16 mode" amp_params = self.amp_params() - if self.global_rank == 0: - logger.info(f"Initializing AMP with these params: {amp_params}") + log_dist(f"Initializing AMP with these params: {amp_params}", ranks=[0]) try: logger.info("Initializing Apex amp from: {}".format(amp.__path__)) except NameError: @@ -1340,8 +1335,8 @@ def _configure_bf16_optimizer(self, optimizer): if optimizer is None: optimizer = DummyOptim(list(self.module.parameters())) - if self.global_rank == 0: - logger.info('Creating unfused BF16 optimizer') + log_dist('Creating BF16 optimizer', ranks=[0]) + timers = self.timers if self.wall_clock_breakdown() else None optimizer = BF16_Optimizer( optimizer, @@ -1356,7 +1351,6 @@ def _configure_bf16_optimizer(self, optimizer): def _configure_zero_optimizer(self, optimizer): zero_stage = self.zero_optimization_stage() - log_dist('Creating fp16 ZeRO stage {} optimizer'.format(zero_stage), ranks=[0]) assert self.communication_data_type in (torch.float16, torch.bfloat16), "ZeRO supports only 'communication_data_type': ['fp16', 'bfp16']" timers = self.timers if self.wall_clock_breakdown() else None @@ -1374,6 +1368,8 @@ def _configure_zero_optimizer(self, optimizer): round_robin_gradients = self.zero_round_robin_gradients() assert not isinstance(optimizer, DummyOptim), "zero stage 2 requires an optimizer" + log_dist('Creating fp16 ZeRO stage {} optimizer'.format(zero_stage), + ranks=[0]) # Overlap and contiguous grads are meaningless in stage 1 and are ignored if zero_stage == ZeroStageEnum.optimizer_states: overlap_comm = False @@ -1419,10 +1415,8 @@ def _configure_zero_optimizer(self, optimizer): elif zero_stage == ZeroStageEnum.weights: assert not self.has_moe_layers, "MoE not supported with Stage 3" - logger.info("Initializing ZeRO Stage 3") if dist.get_rank() == 0 else None - from deepspeed.runtime.zero.stage3 import DeepSpeedZeroOptimizer_Stage3 - if isinstance(optimizer, DummyOptim): + log_dist("Creating ZeRO Offload", ranks=[0]) optimizer = DeepSpeedZeRoOffload( self.module, timers=timers, @@ -1432,10 +1426,13 @@ def _configure_zero_optimizer(self, optimizer): max_reuse_distance=self.zero_max_reuse_distance(), max_live_parameters=self.zero_max_live_parameters(), param_persistence_threshold=self.zero_param_persistence_threshold(), + model_persistence_threshold=self.zero_model_persistence_threshold(), offload_param_config=self.zero_offload_param(), mpu=self.mpu) else: - + log_dist('Creating fp16 ZeRO stage {} optimizer'.format(zero_stage), + ranks=[0]) + from deepspeed.runtime.zero.stage3 import DeepSpeedZeroOptimizer_Stage3 optimizer = DeepSpeedZeroOptimizer_Stage3( self.module, optimizer, @@ -1451,6 +1448,7 @@ def _configure_zero_optimizer(self, optimizer): max_reuse_distance=self.zero_max_reuse_distance(), max_live_parameters=self.zero_max_live_parameters(), param_persistence_threshold=self.zero_param_persistence_threshold(), + model_persistence_threshold=self.zero_model_persistence_threshold(), dp_process_group=self.data_parallel_group, reduce_scatter=self.zero_reduce_scatter(), overlap_comm=self.zero_overlap_comm(), diff --git a/deepspeed/runtime/zero/config.py b/deepspeed/runtime/zero/config.py index aaca3cbda887..7da8824ed3a6 100644 --- a/deepspeed/runtime/zero/config.py +++ b/deepspeed/runtime/zero/config.py @@ -4,6 +4,7 @@ """ from pydantic import Field, validator +import sys from typing import Optional from enum import Enum from deepspeed.runtime.config_utils import get_scalar_param, DeepSpeedConfigModel @@ -114,6 +115,9 @@ class DeepSpeedZeroConfig(DeepSpeedConfigModel): param_persistence_threshold: int = Field(1e5, ge=0, alias="stage3_param_persistence_threshold") + model_persistence_threshold: int = Field(sys.maxsize, + ge=0, + alias="stage3_model_persistence_threshold") max_live_parameters: int = Field(1e9, ge=0, alias="stage3_max_live_parameters") max_reuse_distance: int = Field(1e9, ge=0, alias="stage3_max_reuse_distance") gather_16bit_weights_on_model_save: bool = Field( diff --git a/deepspeed/runtime/zero/parameter_offload.py b/deepspeed/runtime/zero/parameter_offload.py index e56043b01167..cd62015cf5a6 100644 --- a/deepspeed/runtime/zero/parameter_offload.py +++ b/deepspeed/runtime/zero/parameter_offload.py @@ -3,6 +3,7 @@ Licensed under the MIT license. """ +import sys import torch from torch.cuda import Stream from collections import OrderedDict @@ -173,10 +174,11 @@ def __init__(self, max_reuse_distance=1000000000, max_live_parameters=1000000000, param_persistence_threshold=100000, + model_persistence_threshold=sys.maxsize, offload_param_config=None, mpu=None): - see_memory_usage("TensorOffload initialize beginning", force=True) + see_memory_usage("DeepSpeedZeRoOffload initialize [begin]", force=True) print_rank_0(f"initialized {__class__.__name__} with args: {locals()}", force=False) @@ -196,8 +198,11 @@ def __init__(self, _inject_parameters(module, ZeROOrderedDict) - self.persistence_threshold = int(param_persistence_threshold) - self.persistent_parameters = self.mark_persistent_parameters() + self.param_numel_persistence_threshold = int(param_persistence_threshold) + self.model_persistence_threshold = int(model_persistence_threshold) + self.persistent_parameters = self.mark_persistent_parameters( + self.param_numel_persistence_threshold, + self.model_persistence_threshold) self.param_coordinators = {} self._prefetch_bucket_sz = int(prefetch_bucket_size) @@ -213,6 +218,8 @@ def __init__(self, f'Created module hooks: forward = {len(self.forward_hooks)}, backward = {len(self.backward_hooks)}', force=False) + see_memory_usage("DeepSpeedZeRoOffload initialize [end]", force=True) + @instrument_w_nvtx def partition_all_parameters(self): """Partitioning Parameters that were not partitioned usually if parameters @@ -291,12 +298,15 @@ def _end_of_forward_hook(module, *args): global FWD_MODULE_STACK FWD_MODULE_STACK.append(self.module) - def mark_persistent_parameters(self): + def mark_persistent_parameters(self, param_threshold, model_threshold): persistent_params = [] total_persistent_parameters = 0 params_count = 0 for _, param in self.module.named_parameters(recurse=True): - if param.ds_numel < self.persistence_threshold: + if param.ds_numel + total_persistent_parameters > model_threshold: + continue + + if param.ds_numel < param_threshold: params_count += 1 param.ds_persist = True persistent_params.append(param) @@ -304,7 +314,7 @@ def mark_persistent_parameters(self): print_rank_0( f"Parameter Offload: Total persistent parameters: {total_persistent_parameters} in {params_count} params", - force=False) + force=True) return persistent_params diff --git a/deepspeed/runtime/zero/partition_parameters.py b/deepspeed/runtime/zero/partition_parameters.py index db135e0cf182..b6bd5ed645f9 100755 --- a/deepspeed/runtime/zero/partition_parameters.py +++ b/deepspeed/runtime/zero/partition_parameters.py @@ -683,9 +683,13 @@ def get_model(): # Remote device is the device where parameter partitions are stored # It can be same as local_device or it could be CPU or NVMe. - self.remote_device = self.local_device if remote_device is None else remote_device - self.pin_memory = pin_memory if (self.remote_device - == OffloadDeviceEnum.cpu) else False + self.remote_device = self.local_device if remote_device in [ + None, + OffloadDeviceEnum.none + ] else remote_device + self.pin_memory = pin_memory if ( + self.remote_device in [OffloadDeviceEnum.cpu, + OffloadDeviceEnum.nvme]) else False # Enable fp16 param swapping to NVMe if self.remote_device == OffloadDeviceEnum.nvme: diff --git a/deepspeed/runtime/zero/partitioned_param_coordinator.py b/deepspeed/runtime/zero/partitioned_param_coordinator.py index 6a923805eb90..1dcff3f1c12f 100644 --- a/deepspeed/runtime/zero/partitioned_param_coordinator.py +++ b/deepspeed/runtime/zero/partitioned_param_coordinator.py @@ -400,6 +400,16 @@ def __all_gather_params(self, params: Set[Parameter]) -> None: assert param.ds_status == ZeroParamStatus.INFLIGHT, param.ds_summary() self.__inflight_param_registry[param] = handle + # Release swap buffers for persisted params on nvme since they will never be partitioned or evicted from GPU + swap_persisted_params = [ + p for p in partitioned_params + if p.ds_persist and p.ds_tensor.final_location == OffloadDeviceEnum.nvme + ] + if swap_persisted_params: + swap_persisted_params[ + 0].nvme_swapper.remove_partition_and_release_buffers( + swap_persisted_params) + @instrument_w_nvtx def __release_param(self, param: Parameter) -> None: if param.ds_status == ZeroParamStatus.AVAILABLE and not param.ds_active_sub_modules: diff --git a/deepspeed/runtime/zero/stage3.py b/deepspeed/runtime/zero/stage3.py index fd1322ad2f77..9c603be0d2d2 100755 --- a/deepspeed/runtime/zero/stage3.py +++ b/deepspeed/runtime/zero/stage3.py @@ -3,6 +3,7 @@ Licensed under the MIT license. """ +import sys import gc import collections from typing import Deque, Dict, Tuple @@ -88,6 +89,7 @@ def __init__(self, max_reuse_distance=1000000000, max_live_parameters=1000000000, param_persistence_threshold=100000, + model_persistence_threshold=sys.maxsize, dp_process_group=None, reduce_scatter=True, overlap_comm=False, @@ -146,15 +148,18 @@ def __init__(self, self.params_in_nvme_and_cpu = False self.max_params_in_cpu = 0 - self.parameter_offload = DeepSpeedZeRoOffload(module, - timers, - ds_config, - overlap_comm, - prefetch_bucket_size, - max_reuse_distance, - max_live_parameters, - param_persistence_threshold, - offload_param_config) + self.parameter_offload = DeepSpeedZeRoOffload( + module=module, + timers=timers, + ds_config=ds_config, + overlap_comm=overlap_comm, + prefetch_bucket_size=prefetch_bucket_size, + max_reuse_distance=max_reuse_distance, + max_live_parameters=max_live_parameters, + param_persistence_threshold=param_persistence_threshold, + model_persistence_threshold=model_persistence_threshold, + offload_param_config=offload_optimizer_config) + self.persistent_parameters = self.parameter_offload.persistent_parameters self._configure_offloading(offload_optimizer_config, offload_param_config) From 5fe9d61065b00473ad08e155f4ad7e1a4dc7e482 Mon Sep 17 00:00:00 2001 From: Siddharth Singh Date: Sun, 31 Jul 2022 20:33:05 -0400 Subject: [PATCH 38/38] Tensor parallelism for Mixture of Experts (#2074) * tensor parallelism for mixture of experts Co-authored-by: Olatunji Ruwase Co-authored-by: Ammar Ahmad Awan --- deepspeed/moe/layer.py | 19 +++-- deepspeed/moe/mappings.py | 108 +++++++++++++++++++++++++ deepspeed/moe/sharded_moe.py | 17 ++++ deepspeed/utils/groups.py | 23 ++++-- tests/unit/test_moe_tp.py | 153 +++++++++++++++++++++++++++++++++++ 5 files changed, 307 insertions(+), 13 deletions(-) create mode 100644 deepspeed/moe/mappings.py create mode 100644 tests/unit/test_moe_tp.py diff --git a/deepspeed/moe/layer.py b/deepspeed/moe/layer.py index fd847308b21e..fe1010d2e1a8 100644 --- a/deepspeed/moe/layer.py +++ b/deepspeed/moe/layer.py @@ -26,7 +26,8 @@ def __init__(self, noisy_gate_policy: typing.Optional[str] = None, drop_tokens: bool = True, use_rts=True, - use_tutel: bool = False): + use_tutel: bool = False, + enable_expert_tensor_parallelism: bool = False): """Initialize an MoE layer. Arguments: @@ -43,20 +44,21 @@ def __init__(self, drop_tokens (bool, optional): default=True, whether to drop tokens - (setting to False is equivalent to infinite capacity). use_rts (bool, optional): default=True, whether to use Random Token Selection. use_tutel (bool, optional): default=False, whether to use Tutel optimizations (if installed). + enable_expert_tensor_parallelism (bool, optional): default=False, whether to use tensor parallelism for experts """ super(MoE, self).__init__() self.use_residual = use_residual - self.ep_size = min( - ep_size, - num_experts) # the ep size should be less than the number of experts + self.enable_expert_tensor_parallelism = enable_expert_tensor_parallelism + assert num_experts % ep_size == 0, f"Number of experts ({num_experts}) should be divisible by expert parallel size ({ep_size})" + self.ep_size = ep_size self.expert_group_name = f"ep_size_{self.ep_size}" self.num_experts = num_experts - self.num_local_experts = 1 if num_experts < ep_size else num_experts // ep_size + self.num_local_experts = num_experts // self.ep_size log_dist( - f'Creating MoE layer with num_experts: {num_experts} | num_local_experts: {self.num_local_experts} | expert_parallel_size: {ep_size}', + f'Creating MoE layer with num_experts: {num_experts} | num_local_experts: {self.num_local_experts} | expert_parallel_size: {self.ep_size}', [0]) assert noisy_gate_policy is None or noisy_gate_policy in ['None', 'Jitter', 'RSample'], \ @@ -91,9 +93,12 @@ def _create_process_groups(self): print( f"No existing process group found, creating a new group named: {self.expert_group_name}" ) - if groups.mpu is None: + if (groups.mpu is None) or (not self.enable_expert_tensor_parallelism): + # Condition 1 - no groups.mpu means no tensor parallelism + # Condition 2 - disabling expert tensor parallelism on purpose groups._create_expert_and_data_parallel(self.ep_size) else: + # expert tensor parallelism is enabled groups._create_expert_data_and_model_parallel(self.ep_size, mpu=groups.mpu) # Set the group handle for the MOELayer (deepspeed_moe) object diff --git a/deepspeed/moe/mappings.py b/deepspeed/moe/mappings.py new file mode 100644 index 000000000000..38f1630a6703 --- /dev/null +++ b/deepspeed/moe/mappings.py @@ -0,0 +1,108 @@ +''' +Copyright 2022 The Microsoft DeepSpeed Team +''' + +# The file has been adapted from the following Megatron-LM file: +# https://github.com/NVIDIA/Megatron-LM/blob/main/megatron/mpu/mappings.py +# Git commit hash: 9dc3c42a84aa656f583703cf8b6b4f79f712b796 +# We retain the following copyright from the original files: + +# Copyright (c) 2020, NVIDIA CORPORATION. All rights reserved. +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +import torch +import deepspeed + + +def _gather_tokens(input_, dim=0): + """Gather tensors and concatenate them along a dimension""" + mpu = deepspeed.utils.groups.mpu + + input_ = input_.contiguous() + # Size and dimension. + rank = mpu.get_tensor_model_parallel_rank() + + tensor_list = [ + torch.empty_like(input_) + for _ in range(mpu.get_tensor_model_parallel_world_size()) + ] + tensor_list[rank] = input_ + deepspeed.comm.all_gather(tensor_list, + input_, + group=mpu.get_tensor_model_parallel_group()) + + # Note: torch.cat already creates a contiguous tensor. + output = torch.cat(tensor_list, dim=dim).contiguous() + + return output + + +def _drop_tokens(input_, dim=0): + """Divide a tensor among the tensor parallel ranks""" + mpu = deepspeed.utils.groups.mpu + + total_chunks = mpu.get_tensor_model_parallel_world_size() + this_chunk = mpu.get_tensor_model_parallel_rank() + assert input_.shape[dim] % total_chunks == 0, f"input dimension {dim} ({input_.shape[dim]}) is not divisible by tensor parallel world size ({total_chunks})" + chunk_size = input_.shape[dim] // total_chunks + + return torch.narrow(input_, dim, this_chunk * chunk_size, chunk_size) + + +class _GatherTokens(torch.autograd.Function): + """All gather tokens among the tensor parallel ranks""" + @staticmethod + def symbolic(graph, input_, dim): + return _gather_tokens(input_, dim) + + @staticmethod + def forward(ctx, input_, dim): + ctx.dim = dim + return _gather_tokens(input_, dim) + + @staticmethod + def backward(ctx, grad_output): + return _drop_tokens(grad_output, ctx.dim), None + + +class _DropTokens(torch.autograd.Function): + "Divide tokens equally among the tensor parallel ranks" + + @staticmethod + def symbolic(graph, input_, dim): + return _drop_tokens(input_, dim) + + @staticmethod + def forward(ctx, input_, dim): + ctx.dim = dim + return _drop_tokens(input_, dim) + + @staticmethod + def backward(ctx, input_): + return _gather_tokens(input_, ctx.dim), None + + +def gather_tokens(input_, dim=0): + mpu = deepspeed.utils.groups.mpu + if mpu is None or mpu.get_tensor_model_parallel_world_size() == 1: + # no tensor parallelism for non-experts + return input_ + return _GatherTokens.apply(input_, dim) + + +def drop_tokens(input_, dim=0): + mpu = deepspeed.utils.groups.mpu + if mpu is None or mpu.get_tensor_model_parallel_world_size() == 1: + # no tensor parallelism for non-experts + return input_ + return _DropTokens.apply(input_, dim) diff --git a/deepspeed/moe/sharded_moe.py b/deepspeed/moe/sharded_moe.py index 091ca2b54a24..727b2baec0a6 100644 --- a/deepspeed/moe/sharded_moe.py +++ b/deepspeed/moe/sharded_moe.py @@ -20,6 +20,8 @@ from torch import Tensor from torch.nn import Module import torch.nn.functional as F +from deepspeed.utils import groups +from .mappings import drop_tokens, gather_tokens if TYPE_CHECKING: Base = Module[Tensor] @@ -520,6 +522,15 @@ def forward(self, *input: Tensor, **kwargs: Any) -> Tensor: if self.wall_clock_breakdown: self.timers('falltoall').start() + if groups._get_expert_model_parallel_world_size() == 1: + # If the non-expert is tensor-parallel, it will create + # duplicate tokens on the tensor-parallel ranks. + # Since our experts are not tensor-parallel, these duplicates + # need to be dropped to ensure correctness. + # this also doubles up as a communication optimization as we are + # reducing the all-to-all communication volume. + dispatched_input = drop_tokens(dispatched_input, dim=1) + dispatched_input = _AllToAll.apply(self.ep_group, dispatched_input) if self.wall_clock_breakdown: @@ -548,6 +559,12 @@ def forward(self, *input: Tensor, **kwargs: Any) -> Tensor: -1, d_model) + if groups._get_expert_model_parallel_world_size() == 1: + # the dropped duplicate tokens need to be gathered on each + # tensor parallel rank again for the tensor-parallel + # non-expert of the next layer. + expert_output = gather_tokens(expert_output, dim=1) + if self.use_tutel: combined_output = self._tutel_dispatcher.decode(expert_output.view(E * C, M)) else: diff --git a/deepspeed/utils/groups.py b/deepspeed/utils/groups.py index c4d4d4d7cfe5..a4d403a7dd0a 100644 --- a/deepspeed/utils/groups.py +++ b/deepspeed/utils/groups.py @@ -37,6 +37,8 @@ _WORLD_GROUP = None # global object to maintain mpu object if passed by a Megatron client mpu = None +# global object that stores tensor parallel world size for experts +expert_tensor_parallel_world_size = 1 # Deprecated groups initialize function. @@ -104,7 +106,7 @@ def _create_model_parallel(model_parallel_size_): return _DATA_PARALLEL_GROUP, _MODEL_PARALLEL_GROUP -def _create_expert_and_data_parallel(ep_size): +def _create_expert_and_data_parallel(expert_parallel_size_): """ Create expert and data parallel groups. @@ -119,11 +121,12 @@ def _create_expert_and_data_parallel(ep_size): """ assert dist.is_initialized() - log_dist(f'Creating expert and data parallel groups with size {ep_size}', ranks=[0]) + log_dist( + f'Creating expert and data parallel groups with size {expert_parallel_size_}', + ranks=[0]) world_size = dist.get_world_size() rank = dist.get_rank() - expert_parallel_size_ = min(ep_size, world_size) _ensure_divisibility(world_size, expert_parallel_size_) group_name = f"ep_size_{expert_parallel_size_}" @@ -221,11 +224,17 @@ def _create_expert_data_and_model_parallel(expert_parallel_size_, mpu): assert dist.is_initialized(), "dist is not initialized" model_parallel_size_ = mpu.get_model_parallel_world_size() + global expert_tensor_parallel_world_size + expert_tensor_parallel_world_size = model_parallel_size_ + world_size = dist.get_world_size() rank = dist.get_rank() dp_world_size = mpu.get_data_parallel_world_size() dp_rank = mpu.get_data_parallel_rank() + _ensure_divisibility(world_size, model_parallel_size_) + _ensure_divisibility(dp_world_size, expert_parallel_size_) + log_dist( f"Creating deepspeed groups with model parallel size {model_parallel_size_}, expert parallel size {expert_parallel_size_}, world size {world_size}, dp world size {dp_world_size}", [0]) @@ -236,9 +245,6 @@ def _create_expert_data_and_model_parallel(expert_parallel_size_, mpu): _DATA_PARALLEL_GROUP = mpu.get_data_parallel_group() _MODEL_PARALLEL_GROUP = mpu.get_model_parallel_group() - expert_parallel_size_ = min(expert_parallel_size_, dp_world_size) - _ensure_divisibility(world_size, expert_parallel_size_) - group_name = f"ep_size_{expert_parallel_size_}" # Only create groups if they don't already exist @@ -386,3 +392,8 @@ def _get_data_parallel_rank(): if mpu is not None: return mpu.get_data_parallel_rank() return dist.get_rank(group=_get_data_parallel_group()) + + +def _get_expert_model_parallel_world_size(): + global expert_tensor_parallel_world_size + return expert_tensor_parallel_world_size diff --git a/tests/unit/test_moe_tp.py b/tests/unit/test_moe_tp.py new file mode 100644 index 000000000000..60fbe9697da9 --- /dev/null +++ b/tests/unit/test_moe_tp.py @@ -0,0 +1,153 @@ +import torch +import deepspeed +import pytest +from .common import distributed_test +from .simple_model import args_from_dict +from .util import required_torch_version +from deepspeed.moe.layer import MoE + + +@pytest.mark.parametrize("ep_size, tp_size, enable_expert_tp, use_residual", + [ + (1, + 2, + False, + False), + (1, + 2, + True, + False), + (1, + 2, + False, + True), + (1, + 2, + True, + True), + (1, + 4, + False, + False), + (1, + 4, + True, + False), + (1, + 4, + False, + True), + (1, + 4, + True, + True), + (2, + 2, + False, + False), + (2, + 2, + True, + False), + (2, + 2, + False, + True), + (2, + 2, + True, + True), + ]) +def test_moe_tensor_parallel(tmpdir, ep_size, tp_size, enable_expert_tp, use_residual): + if not required_torch_version(): + pytest.skip("DeepSpeed MoE tests need torch 1.8 or higher to run correctly") + + config_dict = { + "train_batch_size": 8, + "steps_per_print": 1, + "fp16": { + "enabled": True + } + } + args = args_from_dict(tmpdir, config_dict) + hidden_dim = 16 + + class MPU(): + def __init__(self, tp_world_size): + self.rank = deepspeed.comm.get_rank() + self.world_size = deepspeed.comm.get_world_size() + self.tp_world_size = tp_world_size + + for i in range(0, self.world_size, tp_world_size): + ranks = range(i, i + tp_world_size) + group = deepspeed.comm.new_group(ranks) + if self.rank in ranks: + self.tp_group = group + + for i in range(0, tp_world_size): + ranks = range(i, self.world_size, tp_world_size) + group = deepspeed.comm.new_group(ranks) + if self.rank in ranks: + self.dp_group = group + + def get_model_parallel_rank(self): + return self.rank % self.tp_world_size + + def get_model_parallel_world_size(self): + return self.tp_world_size + + def get_data_parallel_rank(self): + return self.rank // self.tp_world_size + + def get_data_parallel_world_size(self): + return self.world_size // self.tp_world_size + + def get_data_parallel_group(self): + return self.dp_group + + def get_model_parallel_group(self): + return self.tp_group + + @distributed_test(world_size=[4]) + def _test_moe(args, hidden_dim, ep_size, tp_size, enable_expert_tp, use_residual): + + # TODO: replace this with a true parallel mlp in the future + # and run convergence tests + + tensor_parallel_expert = torch.nn.Sequential( + torch.nn.Linear(hidden_dim, + 4 * hidden_dim // tp_size), + torch.nn.ReLU(), + torch.nn.Linear(4 * hidden_dim // tp_size, + hidden_dim)) + + # set num experts to world size + world_size = deepspeed.comm.get_world_size() + model = MoE( + hidden_size=hidden_dim, + expert=tensor_parallel_expert, + num_experts=world_size, + ep_size=ep_size, + use_residual=use_residual, + enable_expert_tensor_parallelism=enable_expert_tp, + ) + optimizer = torch.optim.AdamW(params=model.parameters()) + model, _, _, _ = deepspeed.initialize(args=args, + model=model, + optimizer=optimizer, + dist_init_required=False, + mpu=MPU(tp_size)) + + assert model.num_local_experts == world_size // ep_size + if enable_expert_tp: + assert deepspeed.utils.groups._get_expert_model_parallel_world_size( + ) == tp_size + else: + assert deepspeed.utils.groups._get_expert_model_parallel_world_size() == 1 + + _test_moe(args=args, + hidden_dim=hidden_dim, + ep_size=ep_size, + tp_size=tp_size, + enable_expert_tp=enable_expert_tp, + use_residual=use_residual)