From 6b8103b46e165d44f01f8e119589319f7eaf4d2e Mon Sep 17 00:00:00 2001 From: Jeff Rasley Date: Tue, 28 Nov 2023 08:27:54 -0800 Subject: [PATCH 001/754] [docs] Intel inference blog (#4734) --- README.md | 1 + blogs/intel-inference/README.md | 143 ++++++++++++++++++ .../intel-inference/assets/intel-results.png | Bin 0 -> 65371 bytes .../intel-inference/assets/software-arch.png | Bin 0 -> 13952 bytes docs/index.md | 1 + 5 files changed, 145 insertions(+) create mode 100644 blogs/intel-inference/README.md create mode 100755 blogs/intel-inference/assets/intel-results.png create mode 100755 blogs/intel-inference/assets/software-arch.png diff --git a/README.md b/README.md index 783687f96f85..46d23a970562 100755 --- a/README.md +++ b/README.md @@ -15,6 +15,7 @@ ## Latest News DeepSpeed empowers ChatGPT-like model training with a single click, offering 15x speedup over SOTA RLHF systems with unprecedented cost reduction at all scales; [learn how](https://github.com/microsoft/DeepSpeed/tree/master/blogs/deepspeed-chat). +* [2023/11] [Llama 2 Inference on 4th Gen Intel® Xeon® Scalable Processor with DeepSpeed](https://github.com/microsoft/DeepSpeed/tree/master/blogs/intel-inference) [[Intel version]](https://www.intel.com/content/www/us/en/developer/articles/technical/xllama-2-on-xeon-scalable-processor-with-deepspeed.html) * [2023/11] [DeepSpeed ZeRO-Offload++: 6x Higher Training Throughput via Collaborative CPU/GPU Twin-Flow](https://github.com/microsoft/DeepSpeed/tree/master/blogs/deepspeed-offloadpp) * [2023/11] [DeepSpeed-FastGen: High-throughput Text Generation for LLMs via MII and DeepSpeed-Inference](https://github.com/microsoft/DeepSpeed/tree/master/blogs/deepspeed-fastgen) [[English](https://github.com/microsoft/DeepSpeed/tree/master/blogs/deepspeed-fastgen)] [[中文](https://github.com/microsoft/DeepSpeed/tree/master/blogs/deepspeed-fastgen/chinese/README.md)] [[日本語](https://github.com/microsoft/DeepSpeed/tree/master/blogs/deepspeed-fastgen/japanese/README.md)] * [2023/10] [DeepSpeed-VisualChat: Improve Your Chat Experience with Multi-Round Multi-Image Inputs](https://github.com/microsoft/DeepSpeed/tree/master/blogs/deepspeed-visualchat/10-03-2023/README.md) [[English](https://github.com/microsoft/DeepSpeed/tree/master/blogs/deepspeed-visualchat/10-03-2023/README.md)] [[中文](https://github.com/microsoft/DeepSpeed/blob/master/blogs/deepspeed-visualchat/10-03-2023/README-Chinese.md)] [[日本語](https://github.com/microsoft/DeepSpeed/blob/master/blogs/deepspeed-visualchat/10-03-2023/README-Japanese.md)] diff --git a/blogs/intel-inference/README.md b/blogs/intel-inference/README.md new file mode 100644 index 000000000000..107e46808d2e --- /dev/null +++ b/blogs/intel-inference/README.md @@ -0,0 +1,143 @@ + +# Llama 2 Inference on 4th Gen Intel® Xeon® Scalable Processor with DeepSpeed + +> This blog is co-published with Intel and can also be viewed on [Intel's website](https://www.intel.com/content/www/us/en/developer/articles/technical/xllama-2-on-xeon-scalable-processor-with-deepspeed.html). + +## Introduction + +Transformer models have revolutionized natural language processing with their ability to capture complex semantic and syntactic relationships. However, these models also pose significant challenges for efficient inference, especially for large language models (LLMs) that have billions of parameters. For example, running half-precision inference of Megatron-Turing 530B would require 40 A100-40GB GPUs [1]. To address challenges associated with the inference of large-scale transformer models, the DeepSpeed team at Microsoft* developed DeepSpeed Inference [2]. It provides high-performance multi-GPU inferencing capabilities and introduces several features to efficiently serve transformer-based PyTorch models using GPU. Today, we are very excited to share that DeepSpeed Inference has been implemented for the 4th Gen Intel® Xeon® scalable processor. + +## 4th Gen Intel Xeon Processor + +Intel launched the 4th gen Intel Xeon processor in January 2023. This CPU has built-in accelerators for AI, data analytics, networking, storage and HPC. Tile Matrix Multiplication (TMUL) is the built-in AI accelerator. It executes the Intel® Advanced Matrix Extensions (Intel®AMX). Intel AMX can significantly speed up deep learning (DL) applications, both in inference and training. Other notable new features in 4th gen Intel Xeon processors that can speed up DL applications include PCI Express Gen5 (PCIe 5.0) and DDR5. PCIe 5.0 doubles the I/O bandwidth from PCIe 4.0, increasing the bandwidth between CPU and connected devices. DDR5 offers up to 1.5x bandwidth increase over DDR4 [3]. + +4th gen Intel Xeon with Intel AMX sped up training of BERT-large by 4x compared to 3rd gen Intel Xeon [4]. TMUL executes Intel AMX instructions on data loaded in 2D registers, hence the name tiles. These instructions operate on 8-bit integer (INT8) or 16-bit bfloat (BF16) datatype. 4th gen Intel Xeon with Intel AMX can attain 2048 INT8 operations per cycle compared to 256 INT8 operations per cycle in 3rd gen Intel Xeon with Intel Advanced Vector Extensions 512 Neural Network Instructions (Intel AVX-512 VNNI). Its BF16 performance is 1024 operations per cycle compared to its FP32 performance of 64 operations per cycle. Therefore, Intel AMX can significantly speed up DL applications when INT8 or BF16 datatype is used for matrix multiplication or convolution computations, the common operations in transformer or convolution-based models. + +## DeepSpeed enabled for 4th Gen Intel Xeon + +DeepSpeed is a DL optimization software for scaling and speeding up DL training and inference. DeepSpeed Inference refers to the feature set in DeepSpeed implemented to speed up inference of transformer models [2]. It initially supported only CUDA GPU. We recently added support for CPU, specifically 4th gen Intel Xeon. Features currently implemented for 4th gen Intel Xeon include automatic tensor parallelism (AutoTP), BF16 and INT8 datatype support, and binding cores to rank. + +DeepSpeed builds on top of PyTorch, which has been highly optimized for CPU inference and training. Intel® Extension for PyTorch* adds state-of-the-art optimizations for popular LLMs architectures, including highly efficient matrix multiplication kernels to speed-up linear layers and customized operators to reduce the memory footprint [5]. The runtime software components for DeepSpeed Inference on CPU are shown below in Figure 1. Intel® oneAPI Deep Neural Network Library (oneDNN) uses Intel AVX-512 VNNI and Intel AMX optimizations [6]. Intel® oneAPI Collective Communications Library (oneCCL) is a library that implements the communication patterns in DL [7]. Intel® Neural Compressor (INC) was used to convert the LLMs from FP32 datatype to BF16 or INT8 datatype [8]. + + +
+
+Figure 1. Software components for DeepSpeed Inference on CPU +
+ +## Technologies Introduced + +To accelerate running LLMs with DeepSpeed on 4th-generation Intel Xeon, we introduced technologies into both DeepSpeed and Intel Extension for PyTorch. + +1. Extend DeepSpeed Accelerator Abstraction Interface to provide CPU support [9]. We implemented CPU as a DeepSpeed Accelerator which allows CPU support to be plugged into DeepSpeed in a device-agnostic manner. Device-agnostic DeepSpeed model scripts which use DeepSpeed Accelerator Abstraction Interface can run on CPU devices without modification. +2. Fine-grain core binding. We introduced two new DeepSpeed command line arguments: `--bind_cores_to_rank` and `--bind_core_list` to allow core binding with DeepSpeed AutoTP [10] on a node with multiple sockets or on a single socket with multiple sub-NUMA nodes (SNC). Using `numactl`` for each tensor parallel worker, we can bind workers to cores and NUMA memory. This reduces interference between workers and uses memory bandwidth and core more effectively. +3. Optimized shared memory (SHM) based on AllReduce communication primitives for a single CPU node. We implemented a low latency SHM based AllReduce primitive which utilizes the shared memory of a single-node CPU system. +4. Optimizations in Intel Extension for PyTorch + + a. oneDNN, Tensor Processing Primitives (TPP) and customized linear kernels for weight only quantization. + + b. Indirect Access KV Cache reduces memory reorder overhead when using KV cache. + + c. Subgraph fusion to reduce memory footprint. + + d. Fusion of AllReduce between multi-head attention and multilayer perceptron in transformer layer when there is no dependency between them. + +## How to run DeepSpeed on CPU + +Software required for DeepSpeed Inference on CPU (Specific details can be found in the configuration.) +* PyTorch +* Intel Extension for PyTorch [6] +* oneCCL binding for PyTorch [11] +* oneCCL [7] +* DeepSpeed [12] + +After installing the required software, we can run inference for a model on CPU. Device agnostic interfaces are used to load and run the model. These device agnostic interfaces are accessed through deepspeed.accelerator.get_accelerator() as shown below in Listing 1. Refer to the DeepSpeed tutorial on DeepSpeed accelerator interfaces [13] for further details. + +```python +# Listing 1. An example of using device agnostic interface to get the accelerator device and load and run a model. +import deepspeed +from deepspeed.accelerator import get_accelerator +... +# load model checkpoint into model +model = model.eval().to(get_accelerator().device_name()) + +ds_world_size = int(os.getenv('WORLD_SIZE', '0')) + +engine = deepspeed.init_inference(model=model, mp_size=ds_world_size, \ + dtype=torch.bfloat16, replace_method="auto", \ + replace_with_kernel_inject=False) + +model = engine.module +... +# evaluate model +``` + +Execute the inference code with DeepSpeed using the following command: + +```bash +deepspeed --bind_cores_to_rank +``` + +This command detects the number of sockets on host and launches as many inference workers as the number of sockets. The LLM workload runs in parallel on the inference workers with DeepSpeed AutoTP [10]. AutoTP distributes inference computation among workers and reduces inference latency. For example, if the host has two sockets, this command will launch two inference workers to inference the input sample in parallel. The argument --bind_cores_to_rank instructs DeepSpeed to split the CPU cores and distribute them to each rank evenly. This ensures that each inference worker uses an exclusive set of CPU cores to avoid interfering with one another. If this argument is not specified, it will defer to the operating system to schedule the workers to the CPU cores, which may not be optimal. + +Intel Extension for PyTorch is compatible with DeepSpeed AutoTP and can therefore be used to further optimize AutoTP models generated by DeepSpeed. + +```python +# Use Intel Extension for PyTorch to optimize model +... +model = engine.module +import intel_extension_for_pytorch as ipex +model = ipex.optimize_transformers(model.eval(), dtype=torch.bfloat16, inplace=True) +... +``` +Examples of LLM optimizations for DeepSpeed AutoTP models with Intel Extension for PyTorch are available at [14]. + +## Results + +DeepSpeed enables optimal distribution of LLM inference on two 4th gen Intel Xeon sockets. Intel AMX on 4th gen Intel Xeon can be used to accelerate BF16 matrix multiplication operations. Support for Intel AMX is available through Intel Extension for PyTorch. Performance speedups in GPT-J-6B and LLaMA2-13B from DeepSpeed AutoTP on 2 sockets are shown in Figure 2 below. GPT-J-6B has 6 billion parameters, requiring 12 GB of memory for its weights. Llama-2-13B has 13 billion parameters, requiring 26 GB of memory for the weights. Latency improvement is the metric used. Prompt latency and per token latency improved as shown by the speedups in the plot. + +
+
+Figure 2. Performance speedups from 1-socket to 2-socket 4th gen Intel Xeon with DeepSpeed AutoTP. Higher speedup represents higher performance. Per token latency is per token latency for 2nd and subsequent tokens. in/out refers to the input token size and output token size. Beam search size was 4. See backup for configurations, results may vary. +
+ +## Summary +DeepSpeed Inference has been enabled for 4th gen Intel Xeon with Intel AMX to accelerate matrix multiplications common in DL workloads. DeepSpeed Inference leverages 4th Gen Intel Xeon to speed up the inferences of GPT-J-6B and Llama-2-13B. We will continue to improve it for new devices and new LLMs. Intel Data Center GPU Max is a new GPU designed for AI for which DeepSpeed will also be enabled [15]. + +## Contributors +This work was made possible through deep collaboration between software engineers and researchers at Intel and Microsoft. The contributors of this work include Guokai Ma, Kiefer Kuah, Yejing Lai, Liangang Zhang, Xiaofei Feng, Xu Deng, Mengfei Li, Jianan Gu, Haihao Shen, and Fan Zhao from Intel; Olatunji Ruwase, Martin Cai, and Yuxiong He from Microsoft. + +## Configuration +1-node, 2x Intel® Xeon® Platinum 8480+, 56 cores, HT On, Turbo On, 1024 GB (16x64GB DDR5 4800 MT/s [4800 MT/s]) , BIOS version Intel Corporation SE5C7411.86B.9525.D13.2302071333, 02/07/2023, ucode version 0x2b000190, Red Hat Enterprise Linux 8.6, kernel version 4.18.0-372.9.1.el8.x86_64, gcc 11.2.1, PyTorch 2.1.0.dev20230618+cpu, DeepSpeed 0.9.5+3f5e4931, ipex 2.1.0+git31b7cd6, GPT-J-6B, LLaMA-2-13B. + +## References + +[1] Microsoft, "ZeRO-Inference: Democratizing massive model inference," 9 September 2022. [Online]. Available: https://www.deepspeed.ai/2022/09/09/zero-inference.html. [Accessed 12 April 2023]. + +[2] R. Y. Aminabadi, S. Rajbhandari, M. Zhang, A. A. Awan, C. Li, D. Li, E. Zheng, J. Rasley, S. Smith, O. Ruwase, Y. H. Y. Aminabadi, S. Rajbhandari, M. Zhang, A. A. Awan, C. Li, D. Li and El, "DeepSpeed Inference: Enabling Efficient Inference of Transformer Models at Unprecedented Scale," 30 6 2022. [Online]. Available: https://arxiv.org/abs/2207.00032. + +[3] Intel, "4th Gen Intel(r) Xeon(r) Scalable Processors," [Online]. Available: https://www.intel.com/content/www/us/en/products/docs/processors/xeon-accelerated/4th-gen-xeon-scalable-processors-product-brief.html. [Accessed 12 4 2023]. + +[4] Intel, "Accelerate AI Workloads with Intel® AMX," [Online]. Available: https://www.intel.com/content/www/us/en/products/docs/accelerator-engines/advanced-matrix-extensions/ai-solution-brief.html. [Accessed 12 4 2023]. + +[5] Intel, "Large Language Models (LLM) Optimizations Overview," [Online]. Available: https://intel.github.io/intel-extension-for-pytorch/cpu/2.1.0+cpu/tutorials/llm.html. + +[6] Intel, "Intel® Extension for PyTorch," [Online]. Available: https://github.com/intel/intel-extension-for-pytorch. + +[7] Intel, "oneAPI Collective Communications Library (oneCCL)," [Online]. Available: https://github.com/oneapi-src/oneCCL. + +[8] Intel, "Intel® Neural Compressor," [Online]. Available: https://github.com/intel/neural-compressor. + +[9] Microsoft, "DeepSpeed Accelerator Abstraction Interface," [Online]. Available: https://github.com/microsoft/DeepSpeed/blob/master/docs/_tutorials/accelerator-abstraction-interface.md. + +[10] Microsoft, "Automatic Tensor Parallelism for HuggingFace Models," [Online]. Available: https://www.deepspeed.ai/tutorials/automatic-tensor-parallelism. + +[11] Intel, "Intel® oneCCL Bindings for PyTorch," [Online]. Available: https://github.com/intel/torch-ccl. + +[12] Microsoft, "deepspeed," [Online]. Available: https://github.com/microsoft/deepspeed. + +[13] Intel, "DeepSpeed Accelerator Abstraction Interface," [Online]. Available: https://github.com/microsoft/DeepSpeed/pull/3184. + +[14] Intel, "Intel® Extension for PyTorch large language model example," [Online]. Available: https://github.com/intel/intel-extension-for-pytorch/tree/llm_feature_branch/examples/cpu/inference/python/llm. + +[15] Intel, "Intel® Data Center GPU Max Series," [Online]. Available: https://www.intel.com/content/www/us/en/products/details/discrete-gpus/data-center-gpu/max-series.html. diff --git a/blogs/intel-inference/assets/intel-results.png b/blogs/intel-inference/assets/intel-results.png new file mode 100755 index 0000000000000000000000000000000000000000..e65aae3d4a8cf9a1b689e2310c75f3b5a7c8eae2 GIT binary patch literal 65371 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%0D1`qq{nKhOHlX&Kb^sxA`U48n`AGlf0aa#kR; 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 EFYm`~e*gdg literal 0 HcmV?d00001 diff --git a/blogs/intel-inference/assets/software-arch.png b/blogs/intel-inference/assets/software-arch.png new file mode 100755 index 0000000000000000000000000000000000000000..da147f4b9672eadec7fc63e93ae9648cab054a13 GIT binary patch literal 13952 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 literal 0 HcmV?d00001 diff --git a/docs/index.md b/docs/index.md index 2c18c80c6dae..d5b3c76ac8fa 100755 --- a/docs/index.md +++ b/docs/index.md @@ -7,6 +7,7 @@ title: "Latest News" --- DeepSpeed empowers ChatGPT-like model training with a single click, offering 15x speedup over SOTA RLHF systems with unprecedented cost reduction at all scales; [learn how](https://github.com/microsoft/DeepSpeed/tree/master/blogs/deepspeed-chat). +* [2023/11] [Llama 2 Inference on 4th Gen Intel® Xeon® Scalable Processor with DeepSpeed](https://github.com/microsoft/DeepSpeed/tree/master/blogs/intel-inference) [[Intel version]](https://www.intel.com/content/www/us/en/developer/articles/technical/xllama-2-on-xeon-scalable-processor-with-deepspeed.html) * [2023/11] [DeepSpeed ZeRO-Offload++: 6x Higher Training Throughput via Collaborative CPU/GPU Twin-Flow](https://github.com/microsoft/DeepSpeed/tree/master/blogs/deepspeed-offloadpp) * [2023/11] [DeepSpeed-FastGen: High-throughput Text Generation for LLMs via MII and DeepSpeed-Inference](https://github.com/microsoft/DeepSpeed/tree/master/blogs/deepspeed-fastgen) [[English](https://github.com/microsoft/DeepSpeed/tree/master/blogs/deepspeed-fastgen)] [[中文](https://github.com/microsoft/DeepSpeed/tree/master/blogs/deepspeed-fastgen/chinese/README.md)] [[日本語](https://github.com/microsoft/DeepSpeed/tree/master/blogs/deepspeed-fastgen/japanese/README.md)] * [2023/10] [DeepSpeed-VisualChat: Improve Your Chat Experience with Multi-Round Multi-Image Inputs](https://github.com/microsoft/DeepSpeed/tree/master/blogs/deepspeed-visualchat/10-03-2023/README.md) [[English](https://github.com/microsoft/DeepSpeed/tree/master/blogs/deepspeed-visualchat/10-03-2023/README.md)] [[中文](https://github.com/microsoft/DeepSpeed/blob/master/blogs/deepspeed-visualchat/10-03-2023/README-Chinese.md)] [[日本語](https://github.com/microsoft/DeepSpeed/blob/master/blogs/deepspeed-visualchat/10-03-2023/README-Japanese.md)] From fd0a52c1acc8851a5ace7c3c757475f2e665de0e Mon Sep 17 00:00:00 2001 From: taozhiwei Date: Wed, 29 Nov 2023 01:41:46 +0800 Subject: [PATCH 002/754] use all_gather_into_tensor instead of all_gather (#4705) when using allgather, the output is a list, and in the implementation of torch, the list will be flattened and unflattened, which will result in additional allocation of GPU memory and D2D operations. But these all gather operations already have a flat GPU memory, using all_gather_into_tensor replaces all_gather will save GPU memory allocation and additional D2D operations. additionally, batching all gatherers does not reduce the peak usage of GPU memory, so allgather_bucket_size has no effect. Signed-off-by: --local Co-authored-by: --local --- .../transformer/inference/moe_inference.py | 12 ++--- .../activation_checkpointing/checkpointing.py | 10 ++-- deepspeed/runtime/bf16_optimizer.py | 3 +- deepspeed/runtime/utils.py | 47 +++++++++---------- .../runtime/zero/partition_parameters.py | 8 ++-- deepspeed/runtime/zero/stage3.py | 14 ++---- deepspeed/runtime/zero/stage_1_and_2.py | 33 +++++-------- tests/unit/runtime/utils/test_partition.py | 23 ++++++++- 8 files changed, 74 insertions(+), 76 deletions(-) diff --git a/deepspeed/ops/transformer/inference/moe_inference.py b/deepspeed/ops/transformer/inference/moe_inference.py index f985a9a4ab6b..90bfcae81bf2 100644 --- a/deepspeed/ops/transformer/inference/moe_inference.py +++ b/deepspeed/ops/transformer/inference/moe_inference.py @@ -326,12 +326,12 @@ def forward(self, res_coef_out = self.res_coef_func(attention_output, async_op=True) if self.expert_mp_group is not None: - tensor_list = [ - torch.empty_like(attention_output) for _ in range(dist.get_world_size(group=self.expert_mp_group)) - ] - tensor_list[dist.get_rank(group=self.expert_mp_group)] = attention_output - dist.all_gather(tensor_list, attention_output, group=self.expert_mp_group) - attention_output = torch.cat(tensor_list).contiguous() + world_size = dist.get_world_size(group=self.expert_mp_group) + gather_buffer = torch.zeros(world_size * attention_output.numel(), + dtype=attention_output.dtype, + device=attention_output.device) + dist.all_gather_into_tensor(gather_buffer, attention_output, group=self.expert_mp_group) + attention_output = gather_buffer.view(-1, *attention_output.size()[1:]) ############## MoE Gating + Experts ############### dispatched_attention, combined_weights = self.moe_gate_einsum(attention_output) diff --git a/deepspeed/runtime/activation_checkpointing/checkpointing.py b/deepspeed/runtime/activation_checkpointing/checkpointing.py index 72a7bc0516ba..772d23f2d0ac 100644 --- a/deepspeed/runtime/activation_checkpointing/checkpointing.py +++ b/deepspeed/runtime/activation_checkpointing/checkpointing.py @@ -289,13 +289,9 @@ def gather_partitioned_activations(tensors, device=None): flat_tensor = torch.zeros([tensor_size], dtype=item.dtype, device=device) else: flat_tensor = torch.zeros([tensor_size], dtype=item.dtype, device=item.device) - partitions = [] - for i in range(mp_size): - part_i = flat_tensor.narrow(0, partition_size * i, partition_size) - if i == mp_rank: - part_i.copy_(item) - partitions.append(part_i) - dist.all_gather(partitions, partitions[mp_rank], group=mp_group) + part = flat_tensor.narrow(0, partition_size * mp_rank, partition_size) + part.copy_(item) + dist.all_gather_into_tensor(flat_tensor, part, group=mp_group) input_tensor = flat_tensor.view(list(size.numpy())) item.data = input_tensor.data diff --git a/deepspeed/runtime/bf16_optimizer.py b/deepspeed/runtime/bf16_optimizer.py index 494816e6a846..a02ddbe86403 100644 --- a/deepspeed/runtime/bf16_optimizer.py +++ b/deepspeed/runtime/bf16_optimizer.py @@ -320,7 +320,8 @@ def update_lp_params(self): # if i == 0: # print_rank_0(f'{fp32_partition[:10]=}', force=True) - all_gather_dp_groups(partitioned_param_groups=self.bf16_partitioned_groups, + all_gather_dp_groups(groups_flat=self.bf16_groups_flat, + partitioned_param_groups=self.bf16_partitioned_groups, dp_process_group=self.real_dp_process_group, start_alignment_factor=self.nccl_start_alignment_factor, allgather_bucket_size=self.allgather_bucket_size) diff --git a/deepspeed/runtime/utils.py b/deepspeed/runtime/utils.py index 108c7775530b..48ccdbc29bf6 100755 --- a/deepspeed/runtime/utils.py +++ b/deepspeed/runtime/utils.py @@ -643,10 +643,10 @@ def __init__(self, tensor, group, partition_meta=None): self.group = group self.num_parts = dist.get_world_size(group=self.group) self.rank = dist.get_rank(group=self.group) - self.orig_size = list(tensor.size()) self.orig_device = tensor.device self.local_data, self.partition = self._partition_tensor(tensor) + self.even_split = tensor.numel() % self.num_parts == 0 @classmethod def from_meta(cls, meta, local_part, group, device=get_accelerator().device_name()): @@ -689,23 +689,16 @@ def full(self, device=None): # Allocate the full tensor as a flat buffer. full_numel = prod(self.full_size()) flat_tensor = torch.zeros([full_numel], dtype=self.local_data.dtype, device=device) - - # Prepare all-gather buffer - partition_tensors = [] - for part_id in range(self.num_parts): - part_size = self.partition[part_id + 1] - self.partition[part_id] - buf = flat_tensor.narrow(0, start=self.partition[part_id], length=part_size) - if part_id == self.rank: - buf.copy_(self.local_data) - partition_tensors.append(buf) - - # Collect the full tensor - dist.all_gather(partition_tensors, partition_tensors[self.rank], group=self.group) - - for i in range(len(partition_tensors)): - partition_tensors[i].data = torch.zeros(1) - partition_tensors[i] = None - + if self.even_split: + # Collect the full tensor + dist.all_gather_into_tensor(flat_tensor, self.local_data, group=self.group) + else: + for part_id in range(self.num_parts): + part_size = self.partition[part_id + 1] - self.partition[part_id] + buf = flat_tensor.narrow(0, start=self.partition[part_id], length=part_size) + if part_id == self.rank: + buf.copy_(self.local_data) + dist.broadcast(buf, part_id, self.group) return flat_tensor.view(self.full_size()).clone().detach() def to_meta(self): @@ -937,16 +930,22 @@ def align_dense_tensors(tensor_list, alignment): return padded_tensor_list -def all_gather_all_partitions(global_flatten_group, partitioned_param_groups, dp_process_group): - for group_id, partitioned_params in enumerate(partitioned_param_groups): - # Sequential AllGather Best of both worlds +def all_gather_into_tensor_dp_groups(groups_flat, partitioned_param_groups, dp_process_group): + for group_id, (group_flat, partitioned_params) in enumerate(zip(groups_flat, partitioned_param_groups)): partition_id = dist.get_rank(group=dp_process_group[group_id]) dp_world_size = dist.get_world_size(group=dp_process_group[group_id]) - dist.all_gather_into_tensor(global_flatten_group[group_id], partitioned_params[partition_id], - dp_process_group[group_id]) + if dp_world_size == 1: + # no groups share optimizer states + # pipeline parallel with bf16 will default call this even if dp size = 1. + continue + dist.all_gather_into_tensor(group_flat, partitioned_params[partition_id], dp_process_group[group_id]) + +def all_gather_dp_groups(groups_flat, partitioned_param_groups, dp_process_group, start_alignment_factor, + allgather_bucket_size): + if dist.has_all_gather_into_tensor(): + return all_gather_into_tensor_dp_groups(groups_flat, partitioned_param_groups, dp_process_group) -def all_gather_dp_groups(partitioned_param_groups, dp_process_group, start_alignment_factor, allgather_bucket_size): for group_id, partitioned_params in enumerate(partitioned_param_groups): # Sequential AllGather Best of both worlds partition_id = dist.get_rank(group=dp_process_group[group_id]) diff --git a/deepspeed/runtime/zero/partition_parameters.py b/deepspeed/runtime/zero/partition_parameters.py index c0fcb8d34b80..cdf7de512b9b 100755 --- a/deepspeed/runtime/zero/partition_parameters.py +++ b/deepspeed/runtime/zero/partition_parameters.py @@ -1815,10 +1815,10 @@ def _allgather_params(self, param_list, hierarchy=0): offset += param_scale_numel - dist.all_gather(partitions, - partitions[self.get_partition_rank()], - group=self.get_partition_dp_group(param), - async_op=False) + dist.all_gather_into_tensor(flat_tensor, + partitions[self.get_partition_rank()], + group=self.get_partition_dp_group(param), + async_op=False) if hasattr(param_list[0], 'ds_quant_scale'): dist.all_gather(flat_scale_tensor, param_list[0].ds_quant_scale, diff --git a/deepspeed/runtime/zero/stage3.py b/deepspeed/runtime/zero/stage3.py index c0fd9d6625c7..63aa4ca4c48e 100644 --- a/deepspeed/runtime/zero/stage3.py +++ b/deepspeed/runtime/zero/stage3.py @@ -2162,17 +2162,11 @@ def get_fp32_grad_partitions(self) -> Dict[int, Dict[int, Tensor]]: def _fp32_state_allgather(self, param, fp32_state_partition): reduce_buffer = torch.zeros(self.partition_count * fp32_state_partition.numel(), dtype=torch.float32, - device=param.device).flatten() + device=param.device) my_rank = dist.get_rank(group=self.dp_process_group) - partitions = [ - reduce_buffer.narrow(0, - fp32_state_partition.numel() * i, fp32_state_partition.numel()) - for i in range(self.partition_count) - ] - partitions[my_rank].data.copy_(fp32_state_partition.data, non_blocking=False) - - dist.all_gather(partitions, partitions[my_rank], group=self.dp_process_group) - + partition = reduce_buffer.narrow(0, fp32_state_partition.numel() * my_rank, fp32_state_partition.numel()) + partition.data.copy_(fp32_state_partition.data, non_blocking=False) + dist.all_gather_into_tensor(reduce_buffer, partition, group=self.dp_process_group) return reduce_buffer.narrow(0, 0, param.ds_numel).view(param.ds_shape) def get_fp32_grad_for_param(self, param) -> Tensor: diff --git a/deepspeed/runtime/zero/stage_1_and_2.py b/deepspeed/runtime/zero/stage_1_and_2.py index 4b92fe319bfa..1d2d561dbd39 100755 --- a/deepspeed/runtime/zero/stage_1_and_2.py +++ b/deepspeed/runtime/zero/stage_1_and_2.py @@ -13,8 +13,7 @@ from deepspeed.runtime import ZeROOptimizer from deepspeed.runtime.fp16.loss_scaler import CreateLossScaler from deepspeed.runtime.utils import (bwc_tensor_model_parallel_rank, get_global_norm, empty_cache, see_memory_usage, - inf, is_model_parallel_parameter, align_dense_tensors, all_gather_dp_groups, - all_gather_all_partitions) + inf, is_model_parallel_parameter, align_dense_tensors, all_gather_dp_groups) from deepspeed.runtime.zero.config import ZeroStageEnum from deepspeed.runtime.zero.offload_config import OffloadDeviceEnum @@ -1866,16 +1865,11 @@ def step(self, closure=None): self.timers(OPTIMIZER_ALLGATHER_TIMER).start() # Gather the updated weights from everyone. # Then all partitions of the model parameters are updated and ready for next round forward. - if dist.has_all_gather_into_tensor(): - all_gather_all_partitions(global_flatten_group=self.bit16_groups_flat, - partitioned_param_groups=self.parallel_partitioned_bit16_groups, - dp_process_group=self.real_dp_process_group) - else: - all_gather_dp_groups(partitioned_param_groups=self.parallel_partitioned_bit16_groups, - dp_process_group=self.real_dp_process_group, - start_alignment_factor=self.nccl_start_alignment_factor, - allgather_bucket_size=self.allgather_bucket_size) - + all_gather_dp_groups(groups_flat=self.bit16_groups_flat, + partitioned_param_groups=self.parallel_partitioned_bit16_groups, + dp_process_group=self.real_dp_process_group, + start_alignment_factor=self.nccl_start_alignment_factor, + allgather_bucket_size=self.allgather_bucket_size) self.timers(OPTIMIZER_ALLGATHER_TIMER).stop() # TODO: we probably don't need this? just to be safe @@ -1896,16 +1890,11 @@ def update_lp_params(self): # print_rank_0(f'update_lp_params {i=} {partition_id=}', force=True) # if i == 0: # print_rank_0(f'{fp32_partition[:10]=}', force=True) - - if dist.has_all_gather_into_tensor(): - all_gather_all_partitions(global_flatten_group=self.bit16_groups_flat, - partitioned_param_groups=self.parallel_partitioned_bit16_groups, - dp_process_group=self.real_dp_process_group) - else: - all_gather_dp_groups(partitioned_param_groups=self.parallel_partitioned_bit16_groups, - dp_process_group=self.real_dp_process_group, - start_alignment_factor=self.nccl_start_alignment_factor, - allgather_bucket_size=self.allgather_bucket_size) + all_gather_dp_groups(groups_flat=self.bit16_groups_flat, + partitioned_param_groups=self.parallel_partitioned_bit16_groups, + dp_process_group=self.real_dp_process_group, + start_alignment_factor=self.nccl_start_alignment_factor, + allgather_bucket_size=self.allgather_bucket_size) def _average_expert_grad_norms(self, norm_groups): for i, norm in enumerate(norm_groups): diff --git a/tests/unit/runtime/utils/test_partition.py b/tests/unit/runtime/utils/test_partition.py index e7085ee2c4bd..8f7768d0d730 100644 --- a/tests/unit/runtime/utils/test_partition.py +++ b/tests/unit/runtime/utils/test_partition.py @@ -22,7 +22,6 @@ class TestPartitionedTensor(DistributedTest): def test(self): world = dist.get_world_size() - rank = dist.get_rank() group = dist.new_group(ranks=list(range(world))) @@ -40,12 +39,32 @@ def test(self): assert torch.equal(full, reconstructed) +class TestPartitionedTensorUnEven(DistributedTest): + world_size = 4 + + def test(self): + world = dist.get_world_size() + + group = dist.new_group(ranks=list(range(world))) + + rows = world * 4 - 1 + cols = world + 1 + + full = torch.rand(rows, cols).to(get_accelerator().device_name()) + dist.broadcast(full, src=0, group=group) + part = PartitionedTensor(full, group=group) + + assert len(part.local_size()) == 1 + + reconstructed = part.full() + assert torch.equal(full, reconstructed) + + class TestPartitionedTensorMeta(DistributedTest): world_size = 4 def test(self): world = dist.get_world_size() - rank = dist.get_rank() group = dist.new_group(ranks=list(range(world))) From 969b8cf5466f5a2caa6b1376e00836bebfe75bf4 Mon Sep 17 00:00:00 2001 From: Alex Hedges Date: Tue, 28 Nov 2023 15:10:06 -0500 Subject: [PATCH 003/754] Install `deepspeed-kernels` only on Linux (#4739) The package[^1] does not have sdists, and the only wheels it has are for Linux. The package therefore fails to install on any other platform. The solution to install the dev requirements on macOS is to skip the installation on incompatible OS's. [^1]: https://pypi.org/project/deepspeed-kernels/0.0.1.dev1698255861/#files Co-authored-by: Logan Adams <114770087+loadams@users.noreply.github.com> --- requirements/requirements-dev.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/requirements/requirements-dev.txt b/requirements/requirements-dev.txt index 105dd094f995..078386c457bd 100644 --- a/requirements/requirements-dev.txt +++ b/requirements/requirements-dev.txt @@ -1,7 +1,7 @@ accelerate clang-format==16.0.2 coverage -deepspeed-kernels +deepspeed-kernels ; sys_platform == 'linux' docutils<0.18 future importlib-metadata>=4 From 8db9379f1bb5198cb5b34a1617f112ddefd34474 Mon Sep 17 00:00:00 2001 From: Logan Adams <114770087+loadams@users.noreply.github.com> Date: Tue, 28 Nov 2023 13:00:47 -0800 Subject: [PATCH 004/754] Add nv-sd badge to README (#4747) --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 46d23a970562..a04a59ef84e2 100755 --- a/README.md +++ b/README.md @@ -129,7 +129,7 @@ DeepSpeed has been integrated with several different popular open-source DL fram | AMD | [![amd-mi100](https://github.com/microsoft/DeepSpeed/actions/workflows/amd-mi100.yml/badge.svg?branch=master)](https://github.com/microsoft/DeepSpeed/actions/workflows/amd-mi100.yml) [![amd-mi200](https://github.com/microsoft/DeepSpeed/actions/workflows/amd-mi200.yml/badge.svg?branch=master)](https://github.com/microsoft/DeepSpeed/actions/workflows/amd-mi200.yml) | | CPU | [![nv-torch-latest-cpu](https://github.com/microsoft/DeepSpeed/actions/workflows/nv-torch-latest-cpu.yml/badge.svg?branch=master)](https://github.com/microsoft/DeepSpeed/actions/workflows/nv-torch-latest-cpu.yml) | | PyTorch Nightly | [![nv-torch-nightly-v100](https://github.com/microsoft/DeepSpeed/actions/workflows/nv-torch-nightly-v100.yml/badge.svg?branch=master)](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?branch=master)](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?branch=master)](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?branch=master)](https://github.com/microsoft/DeepSpeed/actions/workflows/nv-accelerate-v100.yml) [![nv-megatron](https://github.com/microsoft/DeepSpeed/actions/workflows/nv-megatron.yml/badge.svg?branch=master)](https://github.com/microsoft/DeepSpeed/actions/workflows/nv-megatron.yml) [![nv-mii](https://github.com/microsoft/DeepSpeed/actions/workflows/nv-mii.yml/badge.svg?branch=master)](https://github.com/microsoft/DeepSpeed/actions/workflows/nv-mii.yml) [![nv-ds-chat](https://github.com/microsoft/DeepSpeed/actions/workflows/nv-ds-chat.yml/badge.svg?branch=master)](https://github.com/microsoft/DeepSpeed/actions/workflows/nv-ds-chat.yml) | +| Integrations | [![nv-transformers-v100](https://github.com/microsoft/DeepSpeed/actions/workflows/nv-transformers-v100.yml/badge.svg?branch=master)](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?branch=master)](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?branch=master)](https://github.com/microsoft/DeepSpeed/actions/workflows/nv-accelerate-v100.yml) [![nv-megatron](https://github.com/microsoft/DeepSpeed/actions/workflows/nv-megatron.yml/badge.svg?branch=master)](https://github.com/microsoft/DeepSpeed/actions/workflows/nv-megatron.yml) [![nv-mii](https://github.com/microsoft/DeepSpeed/actions/workflows/nv-mii.yml/badge.svg?branch=master)](https://github.com/microsoft/DeepSpeed/actions/workflows/nv-mii.yml) [![nv-ds-chat](https://github.com/microsoft/DeepSpeed/actions/workflows/nv-ds-chat.yml/badge.svg?branch=master)](https://github.com/microsoft/DeepSpeed/actions/workflows/nv-ds-chat.yml) [![nv-sd](https://github.com/microsoft/DeepSpeed/actions/workflows/nv-sd.yml/badge.svg)](https://github.com/microsoft/DeepSpeed/actions/workflows/nv-sd.yml) | | Misc | [![Formatting](https://github.com/microsoft/DeepSpeed/actions/workflows/formatting.yml/badge.svg?branch=master)](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)[![python](https://github.com/microsoft/DeepSpeed/actions/workflows/python.yml/badge.svg?branch=master)](https://github.com/microsoft/DeepSpeed/actions/workflows/python.yml) | # Installation From 3418b869f0ec784b90a35c1253320780b03645a9 Mon Sep 17 00:00:00 2001 From: Alex Hedges Date: Tue, 28 Nov 2023 16:05:30 -0500 Subject: [PATCH 005/754] Re-organize `.gitignore` file to be parsed properly (#4740) The file was re-organized in da652d0[^1] with better documentation, but that unfortunately made the syntax invalid. According to the gitignore documentation:[^2] > A line starting with # serves as a comment. Put a backslash ("`\`") in > front of the first hash for patterns that begin with a hash. I needed to move the comments for Git to parse the file properly. To maintain readability, I added an extra `#` to the comments at the top of each section. [^1]: https://github.com/microsoft/DeepSpeed/commit/da652d0e0b4ff0b7c870e74730b9d3d8f51bf8aa [^2]: https://git-scm.com/docs/gitignore/2.43.0#_pattern_format Co-authored-by: Logan Adams <114770087+loadams@users.noreply.github.com> --- .gitignore | 69 +++++++++++++++++++++++++++++++++--------------------- 1 file changed, 42 insertions(+), 27 deletions(-) diff --git a/.gitignore b/.gitignore index 5b9cc7ac3156..e284c4fd35a1 100644 --- a/.gitignore +++ b/.gitignore @@ -1,40 +1,55 @@ -# Ignore Python compiled files +## Ignore Python compiled files *.pyc -# Ignore IDE-specific files and directories -.idea/ # JetBrains IDE settings -.vscode/ # Visual Studio Code settings -.theia/ # Theia IDE settings - -# Ignore temporary and backup files -*~ # General backup files -*.swp # Vim swap files - -# Ignore log files +## Ignore IDE-specific files and directories +# JetBrains IDE settings +.idea/ +# Visual Studio Code settings +.vscode/ +# Theia IDE settings +.theia/ + +## Ignore temporary and backup files +# General backup files +*~ +# Vim swap files +*.swp + +## Ignore log files *.log -# Ignore a specific generated file +## Ignore a specific generated file deepspeed/git_version_info_installed.py -# Ignore Python bytecode cache +## Ignore Python bytecode cache __pycache__ -# Build + installation data -build/ # Build artifacts -dist/ # Distribution files -*.so # Compiled shared objects -deepspeed.egg-info/ # Deepspeed package info -build.txt # Build information - -# Website generated files -docs/_site/ # Jekyll generated site -docs/build # Generated documentation +## Build + installation data +# Build artifacts +build/ +# Distribution files +dist/ +# Compiled shared objects +*.so +# Deepspeed package info +deepspeed.egg-info/ +# Build information +build.txt + +## Website generated files +# Jekyll generated site +docs/_site/ +# Generated documentation +docs/build docs/code-docs/source/_build docs/code-docs/_build docs/code-docs/build -.sass-cache/ # SASS cache -.jekyll-cache/ # Jekyll cache +# SASS cache +.sass-cache/ +# Jekyll cache +.jekyll-cache/ .jekyll-metadata -# Testing data -tests/unit/saved_checkpoint/ # Saved checkpoints for testing +## Testing data +# Saved checkpoints for testing +tests/unit/saved_checkpoint/ From ba6bfd0b76ad93e2de0d719316ab1f14fa308393 Mon Sep 17 00:00:00 2001 From: Guanhua Wang Date: Wed, 29 Nov 2023 07:28:41 -0800 Subject: [PATCH 006/754] fix mics run with offload++ (#4749) fix mics run error by making it compatible with zero-offload++ Co-authored-by: Olatunji Ruwase --- deepspeed/runtime/zero/mics.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/deepspeed/runtime/zero/mics.py b/deepspeed/runtime/zero/mics.py index 95e48053abe4..9899a070e003 100755 --- a/deepspeed/runtime/zero/mics.py +++ b/deepspeed/runtime/zero/mics.py @@ -359,6 +359,7 @@ def __init__(self, offload_optimizer_config=None, offload_param_config=None, sub_group_size=1000000000000, + offload_ratio=0.0, mpu=None, clip_grad=0, gradient_accumulation_dtype=torch.float16, @@ -374,7 +375,7 @@ def __init__(self, dynamic_loss_args, verbose, contiguous_gradients, reduce_bucket_size, prefetch_bucket_size, max_reuse_distance, max_live_parameters, param_persistence_threshold, model_persistence_threshold, dp_process_group, reduce_scatter, overlap_comm, - offload_optimizer_config, offload_param_config, sub_group_size, mpu, clip_grad, + offload_optimizer_config, offload_param_config, sub_group_size, offload_ratio, mpu, clip_grad, gradient_accumulation_dtype, communication_data_type, postscale_gradients, gradient_predivide_factor, gradient_accumulation_steps, elastic_checkpoint, aio_config) first_param = next(module.parameters()) From 8640b8e52a93ba4e6b0da0e953c5761fc6977aa9 Mon Sep 17 00:00:00 2001 From: Osama Afzal <41275405+OAfzal@users.noreply.github.com> Date: Wed, 29 Nov 2023 21:04:57 +0400 Subject: [PATCH 007/754] Fix logger formatting for partitioning flags (#4728) Logger takes only the first argument as a message. Co-authored-by: Logan Adams <114770087+loadams@users.noreply.github.com> --- deepspeed/runtime/pipe/engine.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/deepspeed/runtime/pipe/engine.py b/deepspeed/runtime/pipe/engine.py index b0fc3c920ea4..f08657b793d7 100644 --- a/deepspeed/runtime/pipe/engine.py +++ b/deepspeed/runtime/pipe/engine.py @@ -136,7 +136,7 @@ def __init__(self, has_bool_tensors=False, *super_args, **super_kwargs): assert isinstance(self._config.pipeline['grad_partitioned'], bool) self.is_pipe_partitioned = self.is_model_parallel and self._config.pipeline['pipe_partitioned'] self.is_grad_partitioned = self.is_model_parallel and self._config.pipeline['grad_partitioned'] - logger.info(f'is_pipe_partitioned= {self.is_pipe_partitioned}', + logger.info(f'is_pipe_partitioned= {self.is_pipe_partitioned} ' f'is_grad_partitioned= {self.is_grad_partitioned}') model_parameters = filter(lambda p: p.requires_grad, self.module.parameters()) From 02288bc1fdd4dd0b48f3933db8948f5a0d5c9545 Mon Sep 17 00:00:00 2001 From: RyanInnerpeace Date: Thu, 30 Nov 2023 10:12:52 +0800 Subject: [PATCH 008/754] fix: to solve #4726 (#4727) To solve #4726 , I change the dtype of loss tensor into float32 in the last stage of pipeline. **test result** before dist.broadcast ``` [2023-11-24 14:06:04,709] [INFO] [engine.py:590:_aggregate_total_loss] [Rank 2] before dist.broadcast(is_last_stage) (tensor([2.3203, 2.3203], device='cuda:2'), torch.float32, device(type='cuda', index=2)), src_rank=2 (1, 2) [2023-11-24 14:06:04,710] [INFO] [engine.py:590:_aggregate_total_loss] [Rank 3] before dist.broadcast(is_last_stage) (tensor([2.3203, 2.3203], device='cuda:3'), torch.float32, device(type='cuda', index=3)), src_rank=3 (1, 2) ``` After dist.broadcast, you can see the broadcast result is correct between rank 2 and rank 0 as well as rank 3 and rank 1. ``` [2023-11-24 14:06:05,016] [INFO] [engine.py:608:_aggregate_total_loss] [Rank 1] after dist.broadcast(other stage) (tensor([2.3203, 2.3203], device='cuda:1'), torch.float32) [2023-11-24 14:06:05,043] [INFO] [engine.py:608:_aggregate_total_loss] [Rank 0] after dist.broadcast(other stage) (tensor([2.3203, 2.3203], device='cuda:0'), torch.float32) ``` For more information. please refer #4726. Co-authored-by: ryan Co-authored-by: Olatunji Ruwase --- deepspeed/runtime/pipe/engine.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/deepspeed/runtime/pipe/engine.py b/deepspeed/runtime/pipe/engine.py index f08657b793d7..c8d6a0bff444 100644 --- a/deepspeed/runtime/pipe/engine.py +++ b/deepspeed/runtime/pipe/engine.py @@ -556,7 +556,7 @@ def _aggregate_total_loss(self): agg_loss /= self.dp_world_size assert self.global_rank in self.grid.pp_group - losses = torch.stack([self.dp_group_loss, agg_loss]) + losses = torch.stack([self.dp_group_loss, agg_loss]).float() if self.is_pipe_parallel: dist.broadcast(tensor=losses, src=self.global_rank, group=self.mpu.get_pipe_parallel_group()) else: From 7122362fb025f42dcc1bab40a4211ee626116ce4 Mon Sep 17 00:00:00 2001 From: Jih-neng Lin Date: Fri, 1 Dec 2023 08:10:17 +0800 Subject: [PATCH 009/754] Add safetensors support (#4659) Co-authored-by: Logan Adams <114770087+loadams@users.noreply.github.com> Co-authored-by: Jeff Rasley Co-authored-by: Michael Wyatt --- .../v2/checkpoint/huggingface_engine.py | 44 +++++++++++++++---- 1 file changed, 35 insertions(+), 9 deletions(-) diff --git a/deepspeed/inference/v2/checkpoint/huggingface_engine.py b/deepspeed/inference/v2/checkpoint/huggingface_engine.py index 029e3f7774c0..6b64ed3185a2 100644 --- a/deepspeed/inference/v2/checkpoint/huggingface_engine.py +++ b/deepspeed/inference/v2/checkpoint/huggingface_engine.py @@ -8,6 +8,7 @@ import torch from .base_engine import CheckpointEngineBase from typing import Iterable, Tuple +from functools import partial from ..logging import inference_logger @@ -28,6 +29,7 @@ def __init__(self, model_name_or_path: str, auth_token: str = None) -> None: else: self.model_config.max_seq_length = self.generation_config.max_length + self._local_checkpoint_dir = None self._all_ckpt_paths = self._fetch_checkpoint_files() def _fetch_checkpoint_files(self): @@ -41,17 +43,30 @@ def _fetch_checkpoint_files(self): # NOTE(jeff): allow_patterns here are explicitly not using safetensors or other # checkpoint files that may be present. Example of all files in the llama-2-7b # repo here: https://huggingface.co/meta-llama/Llama-2-7b-hf/tree/main - from huggingface_hub import snapshot_download + from huggingface_hub import snapshot_download, list_files_info + + def model_has_safetensors(model_name_or_path: str) -> bool: + if os.path.isdir(model_name_or_path): + file_list = os.listdir(model_name_or_path) + else: + file_list = [rf.rfilename for rf in list_files_info(model_name_or_path)] + for f in file_list: + if f.endswith(".safetensors"): + return True + return False if os.path.isdir(self.model_name_or_path): self._local_checkpoint_dir = self.model_name_or_path else: + # We need to download the checkpoint files from HF + if model_has_safetensors(self.model_name_or_path): + # Prioritize downloading safetensors if they are available + allow_patterns = ["*.safetensors", "*.json", "*.pt"] + else: + # Fallback to bin files when safetensors are not present + allow_patterns = ["*.bin", "*.json", "*.pt"] self._local_checkpoint_dir = snapshot_download(self.model_name_or_path, - allow_patterns=[ - "*.bin", - "*.json", - "*.pt", - ], + allow_patterns=allow_patterns, revision=None, token=self.auth_token) @@ -59,11 +74,22 @@ def _fetch_checkpoint_files(self): self._local_checkpoint_dir ), f"Checkpoint dir {self._local_checkpoint_dir} is not a directory, cannot load checkpoint." - model_param_json = os.path.join(self._local_checkpoint_dir, "pytorch_model.bin.index.json") + # Set the appropriate file names based on whether we have safetensors or not + if model_has_safetensors(self._local_checkpoint_dir): + from safetensors.torch import load_file + model_param_json_fname = "model.safetensors.index.json" + model_file_fname = "model.safetensors" + self._checkpoint_load_fn = load_file + else: + model_param_json_fname = "pytorch_model.bin.index.json" + model_file_fname = "pytorch_model.bin" + self._checkpoint_load_fn = partial(torch.load, map_location="cpu") + + model_param_json = os.path.join(self._local_checkpoint_dir, model_param_json_fname) if not os.path.isfile(model_param_json): # We don't need any json as all such HF models will have pytorch_model.bin - all_checkpoint_files = [os.path.join(self._local_checkpoint_dir, 'pytorch_model.bin')] + all_checkpoint_files = [os.path.join(self._local_checkpoint_dir, model_file_fname)] else: param_map = json.load(open(model_param_json, "r")) @@ -84,7 +110,7 @@ def parameters(self) -> Iterable[Tuple[str, torch.Tensor]]: """ for checkpoint in self._all_ckpt_paths: inference_logger().info(f"Loading checkpoint: {checkpoint}") - checkpoint_sd = torch.load(checkpoint, map_location='cpu') + checkpoint_sd = self._checkpoint_load_fn(checkpoint) param_keys = list(checkpoint_sd.keys()) for param_name in param_keys: param = checkpoint_sd[param_name] From 4997b0fd22a0bdd81abb1266b877cf74e29f565b Mon Sep 17 00:00:00 2001 From: Michael Wyatt Date: Fri, 1 Dec 2023 11:35:39 -0800 Subject: [PATCH 010/754] bump version to 0.12.5 --- version.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/version.txt b/version.txt index e01e0ddd8e8b..43c2417ca0c6 100644 --- a/version.txt +++ b/version.txt @@ -1 +1 @@ -0.12.4 +0.12.5 From f57fc4c95a6a5194757b57704f60f009dde25680 Mon Sep 17 00:00:00 2001 From: Lev Kurilenko <113481193+lekurile@users.noreply.github.com> Date: Mon, 4 Dec 2023 14:09:04 -0800 Subject: [PATCH 011/754] Fix DS Stable Diffusion for latest diffusers version (#4770) This PR fixes the DeepSpeed `UNet` forward function to work with the latest `diffusers` version. Manual `nv-sd` workflow run: https://github.com/microsoft/DeepSpeed/actions/runs/7092016979 Fixes #4760 --- deepspeed/model_implementations/diffusers/unet.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/deepspeed/model_implementations/diffusers/unet.py b/deepspeed/model_implementations/diffusers/unet.py index 27627914cfcb..7da571975958 100644 --- a/deepspeed/model_implementations/diffusers/unet.py +++ b/deepspeed/model_implementations/diffusers/unet.py @@ -68,7 +68,8 @@ def _forward(self, encoder_hidden_states, return_dict=True, cross_attention_kwargs=None, - timestep_cond=None): + timestep_cond=None, + added_cond_kwargs=None): if cross_attention_kwargs: return self.unet(sample, timestamp, From 9dfb06de36bb29293b1e94dc1e48d6f2adf54d2c Mon Sep 17 00:00:00 2001 From: Ramya Ramineni <62723901+rraminen@users.noreply.github.com> Date: Tue, 5 Dec 2023 12:42:34 -0600 Subject: [PATCH 012/754] Resolve any '..' in the file paths using os.path.abspath() (#4709) This PR is to resolve any '..' in the file paths like below using os.path.abspath() ``` sources: ['/opt/conda/envs/py_3.9/lib/python3.9/site-packages/deepspeed/ops/../inference/v2/kernels/core_ops/core_ops.cpp', '/opt/conda/envs/py_3.9/lib/python3.9/site-packages/deepspeed/ops/../inference/v2/kernels/core_ops/bias_activations/bias_activation.cpp', '/opt/conda/envs/py_3.9/lib/python3.9/site-packages/deepspeed/ops/../inference/v2/kernels/core_ops/bias_activations/bias_activation.cu', '/opt/conda/envs/py_3.9/lib/python3.9/site-packages/deepspeed/ops/../inference/v2/kernels/core_ops/cuda_layer_norm/layer_norm.cpp', '/opt/conda/envs/py_3.9/lib/python3.9/site-packages/deepspeed/ops/../inference/v2/kernels/core_ops/cuda_layer_norm/layer_norm.cu', '/opt/conda/envs/py_3.9/lib/python3.9/site-packages/deepspeed/ops/../inference/v2/kernels/core_ops/cuda_rms_norm/rms_norm.cpp', '/opt/conda/envs/py_3.9/lib/python3.9/site-packages/deepspeed/ops/../inference/v2/kernels/core_ops/cuda_rms_norm/rms_norm.cu', '/opt/conda/envs/py_3.9/lib/python3.9/site-packages/deepspeed/ops/../inference/v2/kernels/core_ops/gated_activations/gated_activation_kernels.cpp', '/opt/conda/envs/py_3.9/lib/python3.9/site-packages/deepspeed/ops/../inference/v2/kernels/core_ops/gated_activations/gated_activation_kernels.cu'] extra_include_paths: ['/opt/conda/envs/py_3.9/lib/python3.9/site-packages/deepspeed/ops/../inference/v2/kernels/includes', '/opt/conda/envs/py_3.9/lib/python3.9/site-packages/deepspeed/ops/../inference/v2/kernels/core_ops/bias_activations', '/opt/conda/envs/py_3.9/lib/python3.9/site-packages/deepspeed/ops/../inference/v2/kernels/core_ops/blas_kernels', '/opt/conda/envs/py_3.9/lib/python3.9/site-packages/deepspeed/ops/../inference/v2/kernels/core_ops/cuda_layer_norm', '/opt/conda/envs/py_3.9/lib/python3.9/site-packages/deepspeed/ops/../inference/v2/kernels/core_ops/cuda_rms_norm', '/opt/conda/envs/py_3.9/lib/python3.9/site-packages/deepspeed/ops/../inference/v2/kernels/core_ops/gated_activations'] ``` It fixes the hipify errors that occur during JIT build of 'inference_core_ops' extension due to ".." prefix in the paths, https://github.com/microsoft/DeepSpeed/blob/0ec2d3e4bfa2d0a5237e9747da1ef9d5e4a4453b/op_builder/inference_core_ops.py#L73 https://github.com/microsoft/DeepSpeed/blob/0ec2d3e4bfa2d0a5237e9747da1ef9d5e4a4453b/op_builder/inference_core_ops.py#L90 cc @jithunnair-amd Co-authored-by: Logan Adams <114770087+loadams@users.noreply.github.com> Co-authored-by: Olatunji Ruwase --- op_builder/builder.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/op_builder/builder.py b/op_builder/builder.py index 3613791c938d..1bc99c1fd727 100644 --- a/op_builder/builder.py +++ b/op_builder/builder.py @@ -474,8 +474,8 @@ def jit_load(self, verbose=True): from torch.utils.cpp_extension import load start_build = time.time() - sources = [self.deepspeed_src_path(path) for path in self.sources()] - extra_include_paths = [self.deepspeed_src_path(path) for path in self.include_paths()] + sources = [os.path.abspath(self.deepspeed_src_path(path)) for path in self.sources()] + extra_include_paths = [os.path.abspath(self.deepspeed_src_path(path)) for path in self.include_paths()] # Torch will try and apply whatever CCs are in the arch list at compile time, # we have already set the intended targets ourselves we know that will be From 15ed83a9a69e4c558e0a5fac940d683993a025ca Mon Sep 17 00:00:00 2001 From: Logan Adams <114770087+loadams@users.noreply.github.com> Date: Thu, 7 Dec 2023 11:25:57 -0800 Subject: [PATCH 013/754] Update dockerfile with updated versions (#4780) Fixes #4763 --- docker/Dockerfile | 36 ++++++++++++------------------------ 1 file changed, 12 insertions(+), 24 deletions(-) diff --git a/docker/Dockerfile b/docker/Dockerfile index c5f0124b3908..035a094d0051 100755 --- a/docker/Dockerfile +++ b/docker/Dockerfile @@ -1,4 +1,4 @@ -FROM nvidia/cuda:11.7.1-devel-ubuntu18.04 +FROM nvidia/cuda:12.2.2-devel-ubuntu20.04 ENV DEBIAN_FRONTEND noninteractive @@ -19,7 +19,7 @@ RUN apt-get update && \ curl wget vim tmux emacs less unzip \ htop iftop iotop ca-certificates openssh-client openssh-server \ rsync iputils-ping net-tools sudo \ - llvm-9-dev + llvm-dev ############################################################################## # Installation Latest Git @@ -40,20 +40,20 @@ RUN cp /etc/ssh/sshd_config ${STAGE_DIR}/sshd_config && \ ############################################################################## # Mellanox OFED ############################################################################## -ENV MLNX_OFED_VERSION=4.6-1.0.1.1 +ENV MLNX_OFED_VERSION=4.9-7.1.0.0 RUN apt-get install -y libnuma-dev RUN cd ${STAGE_DIR} && \ - wget -q -O - http://www.mellanox.com/downloads/ofed/MLNX_OFED-${MLNX_OFED_VERSION}/MLNX_OFED_LINUX-${MLNX_OFED_VERSION}-ubuntu18.04-x86_64.tgz | tar xzf - && \ - cd MLNX_OFED_LINUX-${MLNX_OFED_VERSION}-ubuntu18.04-x86_64 && \ + wget -q -O - http://www.mellanox.com/downloads/ofed/MLNX_OFED-${MLNX_OFED_VERSION}/MLNX_OFED_LINUX-${MLNX_OFED_VERSION}-ubuntu20.04-x86_64.tgz | tar xzf - && \ + cd MLNX_OFED_LINUX-${MLNX_OFED_VERSION}-ubuntu20.04-x86_64 && \ ./mlnxofedinstall --user-space-only --without-fw-update --all -q && \ cd ${STAGE_DIR} && \ - rm -rf ${STAGE_DIR}/MLNX_OFED_LINUX-${MLNX_OFED_VERSION}-ubuntu18.04-x86_64* + rm -rf ${STAGE_DIR}/MLNX_OFED_LINUX-${MLNX_OFED_VERSION}-ubuntu20.04-x86_64* ############################################################################## # nv_peer_mem ############################################################################## -ENV NV_PEER_MEM_VERSION=1.1 -ENV NV_PEER_MEM_TAG=1.1-0 +ENV NV_PEER_MEM_VERSION=1.2 +ENV NV_PEER_MEM_TAG=${NV_PEER_MEM_VERSION}-0 RUN mkdir -p ${STAGE_DIR} && \ git clone https://github.com/Mellanox/nv_peer_memory.git --branch ${NV_PEER_MEM_TAG} ${STAGE_DIR}/nv_peer_memory && \ cd ${STAGE_DIR}/nv_peer_memory && \ @@ -69,8 +69,8 @@ RUN mkdir -p ${STAGE_DIR} && \ ############################################################################## # OPENMPI ############################################################################## -ENV OPENMPI_BASEVERSION=4.0 -ENV OPENMPI_VERSION=${OPENMPI_BASEVERSION}.1 +ENV OPENMPI_BASEVERSION=4.1 +ENV OPENMPI_VERSION=${OPENMPI_BASEVERSION}.6 RUN cd ${STAGE_DIR} && \ wget -q -O - https://download.open-mpi.org/release/open-mpi/v${OPENMPI_BASEVERSION}/openmpi-${OPENMPI_VERSION}.tar.gz | tar xzf - && \ cd openmpi-${OPENMPI_VERSION} && \ @@ -106,12 +106,6 @@ RUN apt-get install -y python3 python3-dev && \ RUN pip install pyyaml RUN pip install ipython -############################################################################## -# TensorFlow -############################################################################## -ENV TENSORFLOW_VERSION=1.15.2 -RUN pip install tensorflow-gpu==${TENSORFLOW_VERSION} - ############################################################################## # Some Packages ############################################################################## @@ -143,11 +137,9 @@ RUN pip install psutil \ sphinx_rtd_theme \ scipy \ numpy \ - sklearn \ scikit-learn \ nvidia-ml-py3 \ - mpi4py \ - cupy-cuda100 + mpi4py ############################################################################## ## SSH daemon port inside container cannot conflict with host OS port @@ -159,12 +151,8 @@ RUN cat /etc/ssh/sshd_config > ${STAGE_DIR}/sshd_config && \ ############################################################################## # PyTorch ############################################################################## -ENV PYTORCH_VERSION=1.9.0 -ENV TORCHVISION_VERSION=0.10.0 -ENV TENSORBOARDX_VERSION=1.8 +ENV PYTORCH_VERSION=1.13.0 RUN pip install torch==${PYTORCH_VERSION} -RUN pip install torchvision==${TORCHVISION_VERSION} -RUN pip install tensorboardX==${TENSORBOARDX_VERSION} ############################################################################## # PyYAML build issue From 93a81b5362a83bacd7b40c838295909f347e37af Mon Sep 17 00:00:00 2001 From: Logan Adams <114770087+loadams@users.noreply.github.com> Date: Thu, 7 Dec 2023 14:18:30 -0800 Subject: [PATCH 014/754] Run workflows when they are edited (#4779) --- .github/workflows/nv-a6000.yml | 1 + .github/workflows/nv-sd.yml | 1 + 2 files changed, 2 insertions(+) diff --git a/.github/workflows/nv-a6000.yml b/.github/workflows/nv-a6000.yml index a2b99de488d5..a5b6cd5c28e5 100644 --- a/.github/workflows/nv-a6000.yml +++ b/.github/workflows/nv-a6000.yml @@ -5,6 +5,7 @@ on: paths: - "deepspeed/inference/v2/**" - "tests/unit/inference/v2/**" + - ".github/workflows/nv-a6000.yml" workflow_dispatch: concurrency: diff --git a/.github/workflows/nv-sd.yml b/.github/workflows/nv-sd.yml index 5ca159074a4d..2f4e3f173d37 100644 --- a/.github/workflows/nv-sd.yml +++ b/.github/workflows/nv-sd.yml @@ -10,6 +10,7 @@ on: - "tests/unit/inference/test_stable_diffusion.py" - "deepspeed/model_implementations/diffusers/unet.py" - "deepspeed/model_implementations/diffusers/vae.py" + - ".github/workflows/nv-sd.yml" concurrency: group: ${{ github.workflow }}-${{ github.ref }} From 5f41bd06dd317f00e552ce8a7104c09021e4a86c Mon Sep 17 00:00:00 2001 From: Lev Kurilenko <113481193+lekurile@users.noreply.github.com> Date: Fri, 8 Dec 2023 10:56:09 -0800 Subject: [PATCH 015/754] Fix Hybrid Engine metrics printing (#4789) The metrics print statement in the Hybrid Engine had a bug where `self._total_batch_size` was assumed to exist even when this variable was not initialized due to no corresponding inference policy. This PR fixes this by performing a check when constructing the metrics print. Addresses: https://github.com/microsoft/DeepSpeedExamples/issues/593 --- deepspeed/runtime/hybrid_engine.py | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/deepspeed/runtime/hybrid_engine.py b/deepspeed/runtime/hybrid_engine.py index da6f7a9be54e..a991c4304563 100644 --- a/deepspeed/runtime/hybrid_engine.py +++ b/deepspeed/runtime/hybrid_engine.py @@ -385,14 +385,20 @@ def eval(self): self._total_latency = self._total_latency + latency self._iters = self._iters + 1 if not dist.is_initialized() or dist.get_rank() == 0: + if self._total_batch_size is not None: + cur_samples_p_sec = f'|CurSamplesPerSec={(1 / latency * self._total_batch_size):.2f} ' + avg_samples_p_sec = f'|AvgSamplesPerSec={(1 / (self._total_latency / self._iters) * self._total_batch_size):.2f}' + else: + cur_samples_p_sec = '' + avg_samples_p_sec = '' others = latency - (self._generate_latency + self._training_latency) print(f'|E2E latency={(latency):.2f}s ' + \ f'|Gather latency={self._gather_latency:.2f}s ({(self._gather_latency / latency * 100):.2f}%) ' f'|Generate time={(self._generate_latency):.2f}s ({(self._generate_latency / latency * 100):.2f}%) ' + \ f'|Training time={(self._training_latency):.2f}s ({(self._training_latency / latency * 100):.2f}%) ' + \ - f'|Others={others:.2f} ({(others / latency * 100):.2f}%)' - f'|CurSamplesPerSec={(1 / latency * self._total_batch_size):.2f} ' + \ - f'|AvgSamplesPerSec={(1 / (self._total_latency / self._iters) * self._total_batch_size):.2f}') + f'|Others={others:.2f} ({(others / latency * 100):.2f}%)' + \ + cur_samples_p_sec + \ + avg_samples_p_sec) self._t_start = time.time() self._training_latency = 0 super().eval() From 29f840fd1ad6cda556fcec1cd34c17153a5c6450 Mon Sep 17 00:00:00 2001 From: "Wang, Yi" Date: Sat, 9 Dec 2023 02:56:27 +0800 Subject: [PATCH 016/754] fix autoTP issue for mpt (trust_remote_code=True) (#4787) to fix https://github.com/microsoft/DeepSpeed/issues/4774 Signed-off-by: Wang, Yi A --- deepspeed/module_inject/auto_tp.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/deepspeed/module_inject/auto_tp.py b/deepspeed/module_inject/auto_tp.py index c235cc766209..3ff84ff7d612 100644 --- a/deepspeed/module_inject/auto_tp.py +++ b/deepspeed/module_inject/auto_tp.py @@ -385,7 +385,8 @@ def update_mp_params(self, child): return for param in [ "n_heads", "inner_dim", "num_heads", "num_kv", "num_attention_heads", "num_attn_heads", - "all_head_size", "embed_dim", "hidden_size", "num_key_value_heads", "num_kv_heads" + "all_head_size", "embed_dim", "hidden_size", "num_key_value_heads", "num_kv_heads", "kv_n_heads", + "d_model" ]: if hasattr(child, param): param_val = getattr(child, param) From ce6070800a698fafe36a4752e8643847bc2bc8aa Mon Sep 17 00:00:00 2001 From: Nadav Elyahu <88962733+nelyahu@users.noreply.github.com> Date: Fri, 8 Dec 2023 20:56:44 +0200 Subject: [PATCH 017/754] BF16_Optimizer: add support for bf16 grad acc (#4713) the default accumulation data type is fp32 by adding the below to deepspeed json file: "data_types" : {"grad_accum_dtype": "bf16"} gradient accumulation will be performed in bf16. Co-authored-by: Olatunji Ruwase --- deepspeed/runtime/bf16_optimizer.py | 18 +++++++++++++++--- deepspeed/runtime/engine.py | 15 +++++++++++---- 2 files changed, 26 insertions(+), 7 deletions(-) diff --git a/deepspeed/runtime/bf16_optimizer.py b/deepspeed/runtime/bf16_optimizer.py index a02ddbe86403..888505279290 100644 --- a/deepspeed/runtime/bf16_optimizer.py +++ b/deepspeed/runtime/bf16_optimizer.py @@ -37,7 +37,8 @@ def __init__(self, norm_type=2, allgather_bucket_size=5000000000, dp_process_group=None, - timers=None): + timers=None, + grad_acc_dtype=None): super().__init__() see_memory_usage('begin bf16_optimizer', force=True) self.timers = timers @@ -45,6 +46,10 @@ def __init__(self, self.param_names = param_names self.using_real_optimizer = not isinstance(self.optimizer, DummyOptim) + assert grad_acc_dtype in [torch.float32, torch.bfloat16 + ], f"BF16Optimizer: Unsupported gradient accumulation data type: {grad_acc_dtype}" + self.grad_acc_dtype = grad_acc_dtype + self.clip_grad = clip_grad self.norm_type = norm_type self.mpu = mpu @@ -119,7 +124,8 @@ def _setup_for_real_optimizer(self): num_elem_list = [t.numel() for t in self.bf16_groups[i]] # create fp32 gradients - self.fp32_groups_gradients_flat.append(torch.zeros_like(self.bf16_groups_flat[i], dtype=torch.float32)) + self.fp32_groups_gradients_flat.append( + torch.zeros_like(self.bf16_groups_flat[i], dtype=self.grad_acc_dtype)) # track individual fp32 gradients for entire model fp32_gradients = self._split_flat_tensor(flat_tensor=self.fp32_groups_gradients_flat[i], @@ -204,10 +210,16 @@ def initialize_optimizer_states(self): """ for param_partition, grad_partition in zip(self.fp32_groups_flat_partition, self.fp32_groups_gradient_flat_partition): - param_partition.grad = grad_partition + # In case of grad acc dtype different than FP32, need to cast to high precision. + param_partition.grad = grad_partition.to( + param_partition.dtype) if grad_partition.dtype != param_partition.dtype else grad_partition self.optimizer.step() + if self.grad_acc_dtype is not torch.float32: + for param_partition in self.fp32_groups_flat_partition: + param_partition.grad = None + self.clear_hp_grads() def _split_flat_tensor(self, flat_tensor, num_elem_list): diff --git a/deepspeed/runtime/engine.py b/deepspeed/runtime/engine.py index 8f62f36f328e..44b44c79ba55 100644 --- a/deepspeed/runtime/engine.py +++ b/deepspeed/runtime/engine.py @@ -1180,9 +1180,15 @@ def _do_optimizer_sanity_check(self, basic_optimizer): # data type checks elif model_dtype == grad_accum_dtype: if model_dtype == torch.bfloat16: - raise NotImplementedError( - "Bfloat16 wrapper must use a gradient accumulation type of fp32, enable ZeRO to use Bfloat16 gradient accumulation" - ) + if self.pipeline_parallelism: + logger.warning( + "**** BF16 gradient accumulation is not safe numerically with large number of accumulation steps, proceed with caution *****" + ) + return BFLOAT16 + else: + raise NotImplementedError( + "Bfloat16 wrapper must use a gradient accumulation type of fp32, enable ZeRO to use Bfloat16 gradient accumulation" + ) if model_dtype == torch.float16: return FP16 # else optimizer_wrapper = None @@ -1444,7 +1450,8 @@ def _configure_bf16_optimizer(self, optimizer): clip_grad=clip_grad, allgather_bucket_size=self.zero_allgather_bucket_size(), dp_process_group=self.seq_data_parallel_group, - timers=timers) + timers=timers, + grad_acc_dtype=self.get_data_types()[1]) return optimizer From 2bdf061f4dc8be70878f032d2e48d2130514f991 Mon Sep 17 00:00:00 2001 From: Hang <13913992+zjjMaiMai@users.noreply.github.com> Date: Sat, 9 Dec 2023 02:57:27 +0800 Subject: [PATCH 018/754] [BUG] partition_balanced return wrong result. (#4312) # Background In pipeline parallelism, deepspeed uses `ds_utils.partition_balanced` to balance the partitioning of the model according to the number of parameters or class names. https://github.com/microsoft/DeepSpeed/blob/581e44dd1ab3c409a5905335867c761d5cb4db5b/deepspeed/runtime/pipe/module.py#L380-L395 # What wrong? ``` >>> import deepspeed >>> deepspeed.__version__ '0.10.3+542dc0d5' >>> from deepspeed.runtime import utils as ds_utils >>> ds_utils.partition_balanced([1, 1, 1, 1, 1], 4) [0, 2, 4, 5, 5] >>> ``` the result [0, 2, 4, 5, 5] means [2, 2, 1, 0] layers for each part, which is not balanced at all. the last part will throw an exception because there are no parameters to training. i add some unit test for this function, and i will fix it later if anyone need it. --------- Co-authored-by: Olatunji Ruwase --- deepspeed/runtime/utils.py | 99 ++++++++------------- tests/unit/utils/test_partition_balanced.py | 25 ++++++ 2 files changed, 62 insertions(+), 62 deletions(-) create mode 100644 tests/unit/utils/test_partition_balanced.py diff --git a/deepspeed/runtime/utils.py b/deepspeed/runtime/utils.py index 48ccdbc29bf6..bc7a782e590c 100755 --- a/deepspeed/runtime/utils.py +++ b/deepspeed/runtime/utils.py @@ -14,7 +14,6 @@ import psutil import gc from math import sqrt -from bisect import bisect_left from packaging import version as pkg_version import torch @@ -570,67 +569,43 @@ def partition_uniform(num_items, num_parts): return parts -def _lprobe(weights, num_parts, bottleneck): - num_items = len(weights) - total_weight = weights[-1] - - # initialize partitioning - parts = [0] * (num_parts + 1) - for p in range(1, num_parts + 1): - parts[p] = num_items - - bsum = bottleneck # running sum of target weight for pth partition - chunksize = num_items // num_parts - step = chunksize - for p in range(1, num_parts): - # Jump to the next bucket - while (step < num_items) and (weights[step] < bsum): - step += chunksize - - # Find the end index of partition p - parts[p] = bisect_left(weights, bsum, lo=step - chunksize, hi=min(step, num_items)) - # Nothing more to partition, return early - if parts[p] == num_items: - # See if the current partition is overweight. - part_size = weights[-1] - weights[parts[p - 1]] - return parts, part_size < bottleneck - - # Next partition target - bsum = weights[parts[p] - 1] + bottleneck - - return parts, bsum >= total_weight - - -def _rb_partition_balanced(weights, num_parts, eps): - total_weight = weights[-1] - lower = total_weight / num_parts # best case heaviest partition - upper = total_weight # worst case heaviest partition - - # Do a binary search for the best partitioning - while upper > lower + eps: - mid = lower + ((upper - lower) / 2) - parts, success = _lprobe(weights, num_parts, mid) - if success: - upper = mid - else: - lower = mid + eps - return upper - - -def partition_balanced(weights, num_parts, eps=1e-3): - num_items = len(weights) - # First check for the trivial edge case - if num_items <= num_parts: - return partition_uniform(num_items, num_parts) - - weights_ = prefix_sum_inc(weights) - - # Find the smallest bottleneck (weight of heaviest partition) - bottleneck = _rb_partition_balanced(weights_, num_parts, eps=eps) - - # Now compute that partitioning - parts, success = _lprobe(weights_, num_parts, bottleneck) - assert success +def partition_balanced(weights, num_parts): + """ + use dynamic programming solve `The Linear Partition Problem`. + see https://www8.cs.umu.se/kurser/TDBAfl/VT06/algorithms/BOOK/BOOK2/NODE45.HTM + """ + import numpy as np + n = len(weights) + m = num_parts + + if n <= m: + return partition_uniform(n, m) + + dp_max = np.full((n + 1, m + 1), np.inf) + dp_min = np.full((n + 1, m + 1), np.inf) + dp_cost = np.full((n + 1, m + 1), np.inf) + position = np.zeros((n + 1, m + 1), dtype=int) + prefix_sum = np.zeros((n + 1)) + prefix_sum[1:] = np.cumsum(weights) + + dp_max[0, 0] = 0 + dp_cost[0, 0] = 0 + for i in range(1, n + 1): + for j in range(1, min(i, m) + 1): + for k in range(i): + max_sum = max(dp_max[k, j - 1], prefix_sum[i] - prefix_sum[k]) + min_sum = min(dp_min[k, j - 1], prefix_sum[i] - prefix_sum[k]) + cost = max_sum - min_sum + if dp_cost[i, j] >= cost: + dp_cost[i, j] = cost + dp_max[i, j] = max_sum + dp_min[i, j] = min_sum + position[i, j] = k + + parts = [n] + for i in reversed(range(1, m + 1)): + parts.append(position[parts[-1], i]) + parts.reverse() return parts diff --git a/tests/unit/utils/test_partition_balanced.py b/tests/unit/utils/test_partition_balanced.py new file mode 100644 index 000000000000..e7285e478c53 --- /dev/null +++ b/tests/unit/utils/test_partition_balanced.py @@ -0,0 +1,25 @@ +# Copyright (c) Microsoft Corporation. +# SPDX-License-Identifier: Apache-2.0 + +# DeepSpeed Team + +from deepspeed.runtime import utils as ds_utils + + +def check_partition(weights, num_parts, target_diff): + result = ds_utils.partition_balanced(weights=weights, num_parts=num_parts) + + parts_sum = [] + for b, e in zip(result[:-1], result[1:]): + parts_sum.append(sum(weights[b:e])) + + assert max(parts_sum) - min( + parts_sum + ) == target_diff, f"ds_utils.partition_balanced(weights={weights}, num_parts={num_parts}) return {result}" + + +def test_partition_balanced(): + check_partition([1, 2, 1], 4, target_diff=2) + check_partition([1, 1, 1, 1], 4, target_diff=0) + check_partition([1, 1, 1, 1, 1], 4, target_diff=1) + check_partition([1, 1, 1, 1, 0, 1], 4, target_diff=1) From 7b818ee96177771c4ce25db0900509c69cea95a0 Mon Sep 17 00:00:00 2001 From: RyanInnerpeace Date: Sat, 9 Dec 2023 04:28:48 +0800 Subject: [PATCH 019/754] improve the way to determine whether a variable is None (#4782) refactor: improve the way to decide whether a variable is None fix: type mismatch for judging if current accelerator is in SUPPORTED_ACCELERATOR_LIST --------- Co-authored-by: ryan Co-authored-by: Olatunji Ruwase --- accelerator/cpu_accelerator.py | 4 ++-- accelerator/cuda_accelerator.py | 4 ++-- accelerator/mps_accelerator.py | 4 ++-- accelerator/npu_accelerator.py | 2 +- accelerator/real_accelerator.py | 2 +- deepspeed/inference/quantization/layers.py | 2 +- .../modules/implementations/embedding/ragged_embedding.py | 2 +- deepspeed/module_inject/auto_tp.py | 2 +- deepspeed/module_inject/fusedqkv_utils.py | 2 +- deepspeed/module_inject/replace_module.py | 2 +- deepspeed/module_inject/tp_shard.py | 4 ++-- deepspeed/runtime/zero/stage3.py | 4 ++-- op_builder/cpu/comm.py | 2 +- tests/unit/launcher/test_ds_arguments.py | 4 ++-- tests/unit/runtime/zero/test_zero_config.py | 8 ++++---- 15 files changed, 24 insertions(+), 24 deletions(-) diff --git a/accelerator/cpu_accelerator.py b/accelerator/cpu_accelerator.py index fdbbd33c07a2..843e55ac3d20 100644 --- a/accelerator/cpu_accelerator.py +++ b/accelerator/cpu_accelerator.py @@ -63,7 +63,7 @@ def random(self): return torch.random def set_rng_state(self, new_state, device_index=None): - if device_index == None: + if device_index is None: return torch.set_rng_state(new_state) return torch.set_rng_state(new_state, device_index) @@ -253,7 +253,7 @@ def on_accelerator(self, tensor): # create an instance of op builder and return, name specified by class_name def create_op_builder(self, op_name): builder_class = self.get_op_builder(op_name) - if builder_class != None: + if builder_class is not None: return builder_class() return None diff --git a/accelerator/cuda_accelerator.py b/accelerator/cuda_accelerator.py index 2786b425ca7f..521cba6a5fdf 100644 --- a/accelerator/cuda_accelerator.py +++ b/accelerator/cuda_accelerator.py @@ -44,7 +44,7 @@ def is_synchronized_device(self): # Device APIs def device_name(self, device_index=None): - if device_index == None: + if device_index is None: return 'cuda' return 'cuda:{}'.format(device_index) @@ -280,7 +280,7 @@ def op_builder_dir(self): class_dict = None def _lazy_init_class_dict(self): - if self.class_dict != None: + if self.class_dict is not None: return else: self.class_dict = {} diff --git a/accelerator/mps_accelerator.py b/accelerator/mps_accelerator.py index 77595f6b636c..300b224a7af8 100644 --- a/accelerator/mps_accelerator.py +++ b/accelerator/mps_accelerator.py @@ -26,7 +26,7 @@ def is_synchronized_device(self): # Device APIs def device_name(self, device_index=None): - if device_index == None: + if device_index is None: return "mps" return "mps:{}".format(device_index) @@ -221,7 +221,7 @@ def op_builder_dir(self): # create an instance of op builder, specified by class_name def create_op_builder(self, op_name): builder_class = self.get_op_builder(op_name) - if builder_class != None: + if builder_class is not None: return builder_class() return None diff --git a/accelerator/npu_accelerator.py b/accelerator/npu_accelerator.py index 7ebbd320bb15..951bc26c197c 100644 --- a/accelerator/npu_accelerator.py +++ b/accelerator/npu_accelerator.py @@ -30,7 +30,7 @@ def is_synchronized_device(self): # Device APIs def device_name(self, device_index=None): - if device_index == None: + if device_index is None: return 'npu' return 'npu:{}'.format(device_index) diff --git a/accelerator/real_accelerator.py b/accelerator/real_accelerator.py index 49133489b051..0389252e8894 100644 --- a/accelerator/real_accelerator.py +++ b/accelerator/real_accelerator.py @@ -45,7 +45,7 @@ def _validate_accelerator(accel_obj): def is_current_accelerator_supported(): - return get_accelerator() in SUPPORTED_ACCELERATOR_LIST + return get_accelerator().device_name() in SUPPORTED_ACCELERATOR_LIST def get_accelerator(): diff --git a/deepspeed/inference/quantization/layers.py b/deepspeed/inference/quantization/layers.py index c90354aca90f..e9a7e5629f1b 100644 --- a/deepspeed/inference/quantization/layers.py +++ b/deepspeed/inference/quantization/layers.py @@ -86,7 +86,7 @@ def __init__(self, config: Dict, pre_quant_layer: nn.Embedding) -> None: device=pre_quant_layer.weight.device, dtype=pre_quant_layer.weight.dtype) - assert pre_quant_layer.max_norm == None, 'Not supported' + assert pre_quant_layer.max_norm is None, 'Not supported' assert pre_quant_layer.norm_type == 2, 'Not supported' assert pre_quant_layer.scale_grad_by_freq == False, 'Not supported' assert pre_quant_layer.sparse == False, 'Not supported' diff --git a/deepspeed/inference/v2/modules/implementations/embedding/ragged_embedding.py b/deepspeed/inference/v2/modules/implementations/embedding/ragged_embedding.py index 6782bcae81c8..90cdd39d1be7 100644 --- a/deepspeed/inference/v2/modules/implementations/embedding/ragged_embedding.py +++ b/deepspeed/inference/v2/modules/implementations/embedding/ragged_embedding.py @@ -32,7 +32,7 @@ def supports_config(config: DSEmbeddingsConfig) -> bool: if config.use_token_type: return False - if config.output_normalization != None: + if config.output_normalization is not None: return False try: diff --git a/deepspeed/module_inject/auto_tp.py b/deepspeed/module_inject/auto_tp.py index 3ff84ff7d612..6f545d4cb13b 100644 --- a/deepspeed/module_inject/auto_tp.py +++ b/deepspeed/module_inject/auto_tp.py @@ -451,7 +451,7 @@ def get_model_num_kv_heads(self, config): for name in kv_head_names: if hasattr(config, name): num_kv_heads = getattr(config, name) - if num_kv_heads != None: + if num_kv_heads is not None: break return num_kv_heads diff --git a/deepspeed/module_inject/fusedqkv_utils.py b/deepspeed/module_inject/fusedqkv_utils.py index 2e8f6b5917ed..8616b3505488 100644 --- a/deepspeed/module_inject/fusedqkv_utils.py +++ b/deepspeed/module_inject/fusedqkv_utils.py @@ -28,7 +28,7 @@ def require_tp_fused_qkvw(name, mp_size): def prepare_tp_fused_qkvw(module_str, src, mp_size, gpu_index): - if src == None: + if src is None: return fused_type_dict = { 'CodeGenBlock': 'codegentype', diff --git a/deepspeed/module_inject/replace_module.py b/deepspeed/module_inject/replace_module.py index fe32378613c9..e3cc64c4f37e 100644 --- a/deepspeed/module_inject/replace_module.py +++ b/deepspeed/module_inject/replace_module.py @@ -597,7 +597,7 @@ def skip_level_0_prefix(model, state_dict): if key is None: key = re.match(r"(.*?)Model", model) # if keys start with 'model.', don't skip level 0 prefix - if state_dict != None: + if state_dict is not None: for item in state_dict.keys(): if re.match("^model[.]", item): return False diff --git a/deepspeed/module_inject/tp_shard.py b/deepspeed/module_inject/tp_shard.py index 8e2fa78d883f..302b3c33c953 100644 --- a/deepspeed/module_inject/tp_shard.py +++ b/deepspeed/module_inject/tp_shard.py @@ -20,8 +20,8 @@ def get_num_kv_heads(): def get_shard_size(total_size, mp_size, rank=None): global num_kv_heads # When we have num_kv_heads defined, uneven division is possible, otherwise enforce even division - if num_kv_heads != None: - if (rank == None): + if num_kv_heads is not None: + if rank is None: rank = dist.get_rank() my_slices = (num_kv_heads // mp_size) + (1 if rank < (num_kv_heads % mp_size) else 0) return total_size * my_slices // num_kv_heads diff --git a/deepspeed/runtime/zero/stage3.py b/deepspeed/runtime/zero/stage3.py index 63aa4ca4c48e..684e6d06f5cf 100644 --- a/deepspeed/runtime/zero/stage3.py +++ b/deepspeed/runtime/zero/stage3.py @@ -1984,7 +1984,7 @@ def step(self, closure=None): # warn user about caching allocator flushes memory_stats = get_accelerator().memory_stats() alloc_retries = memory_stats.get("num_alloc_retries") - if alloc_retries == None: + if alloc_retries is None: alloc_retries = 0 if alloc_retries > self.n_caching_allocator_flushes: if dist.get_rank() == 0: @@ -2541,7 +2541,7 @@ def load_state_dict(self, # when use loading checkpoint serial, after finish loading, we need to # delete the temp state_dict_list variable to save memory, then trigger # the next rank's loading - if load_serial != None: + if load_serial is not None: load_serial += 1 rank = dist.get_rank(group=self.dp_process_group) local_rank = dist.get_local_rank() diff --git a/op_builder/cpu/comm.py b/op_builder/cpu/comm.py index ec908eb0622b..b26328341081 100644 --- a/op_builder/cpu/comm.py +++ b/op_builder/cpu/comm.py @@ -35,7 +35,7 @@ def is_compatible(self, verbose=True): def extra_ldflags(self): ccl_root_path = os.environ.get("CCL_ROOT") - if ccl_root_path == None: + if ccl_root_path is None: raise ValueError( "Didn't find CCL_ROOT, install oneCCL from https://github.com/oneapi-src/oneCCL and source its environment variable" ) diff --git a/tests/unit/launcher/test_ds_arguments.py b/tests/unit/launcher/test_ds_arguments.py index a2d06e7601ab..ee6d4ce6b7be 100644 --- a/tests/unit/launcher/test_ds_arguments.py +++ b/tests/unit/launcher/test_ds_arguments.py @@ -40,7 +40,7 @@ def test_no_ds_arguments(): assert args.deepspeed == False assert hasattr(args, 'deepspeed_config') - assert args.deepspeed_config == None + assert args.deepspeed_config is None def test_no_ds_enable_argument(): @@ -74,7 +74,7 @@ def test_no_ds_config_argument(): assert args.deepspeed == True assert hasattr(args, 'deepspeed_config') - assert args.deepspeed_config == None + assert args.deepspeed_config is None def test_no_ds_parser(): diff --git a/tests/unit/runtime/zero/test_zero_config.py b/tests/unit/runtime/zero/test_zero_config.py index db9fd6516034..8b20eca8c7d2 100644 --- a/tests/unit/runtime/zero/test_zero_config.py +++ b/tests/unit/runtime/zero/test_zero_config.py @@ -48,12 +48,12 @@ def test_zero_config_overlapcomm(): def test_zero_config_offload_configs(): config = DeepSpeedZeroConfig() - assert config.offload_param == None - assert config.offload_optimizer == None + assert config.offload_param is None + assert config.offload_optimizer is None config = DeepSpeedZeroConfig(**{"offload_param": None, "offload_optimizer": None}) - assert config.offload_param == None - assert config.offload_optimizer == None + assert config.offload_param is None + assert config.offload_optimizer is None config = DeepSpeedZeroConfig(**{"offload_param": {}, "offload_optimizer": {}}) assert isinstance(config.offload_param, DeepSpeedZeroOffloadParamConfig) From 2ce6bf8ce019bf445a5148ffc55dfd8178dd280e Mon Sep 17 00:00:00 2001 From: RyanInnerpeace Date: Sat, 9 Dec 2023 07:01:52 +0800 Subject: [PATCH 020/754] [NPU] Add HcclBackend for 1-bit adam, 1-bit lamb, 0/1 adam (#4733) To support NPU devices fulfilling feature requirements like 1-bit Adam, 1-bit Lamb, 0/1 Adam, I add HcclBackend and its corresponding import logics. See what we have already done in #4567 . --------- Co-authored-by: ryan Co-authored-by: Conglong Li --- deepspeed/runtime/comm/hccl.py | 124 ++++++++++++++++++++++++ deepspeed/runtime/fp16/onebit/adam.py | 11 +-- deepspeed/runtime/fp16/onebit/lamb.py | 12 +-- deepspeed/runtime/fp16/onebit/zoadam.py | 11 +-- 4 files changed, 140 insertions(+), 18 deletions(-) create mode 100644 deepspeed/runtime/comm/hccl.py diff --git a/deepspeed/runtime/comm/hccl.py b/deepspeed/runtime/comm/hccl.py new file mode 100644 index 000000000000..09fb11a731b8 --- /dev/null +++ b/deepspeed/runtime/comm/hccl.py @@ -0,0 +1,124 @@ +# Copyright (c) Microsoft Corporation. +# SPDX-License-Identifier: Apache-2.0 + +# DeepSpeed Team + +import numpy as np +import torch +import torch_npu +import deepspeed.comm as dist + + +class HcclBackend(object): + + def __init__(self, mpu=None): + if mpu is None: + self.world_group = dist.new_group(ranks=range(dist.get_world_size())) + else: + self.mpu = mpu + self.world_group = self.mpu.get_data_parallel_group() + self.size = dist.get_world_size(group=self.world_group) + self.rank = dist.get_rank(group=self.world_group) + + def my_igather(self, rank, size, group, sendbuf, recvbuf, root): + req = [] + if rank == root: + for idx in range(size): + if idx != rank: + req.append(dist.irecv(recvbuf[idx], src=idx, group=group)) + else: + recvbuf[rank] = sendbuf + else: + req.append(dist.isend(sendbuf, group=group, dst=root)) + return req + + def my_gather(self, rank, size, group, sendbuf, recvbuf, root): + if rank == root: + for idx in range(size): + if idx != rank: + dist.recv(recvbuf[idx], src=idx, group=group) + else: + recvbuf[rank] = sendbuf + else: + dist.send(sendbuf, group=group, dst=root) + + def compressed_allreduce(self, buffer_m: torch.tensor, worker_error, server_error, local_rank): + original_shape = buffer_m.size() + if len(original_shape) > 1: + buffer_m = torch.flatten(buffer_m) + + # align size of original_buffer and error + original_size = buffer_m.numel() + worker_error_size = worker_error.numel() + if original_size != worker_error_size: + empty_tensor = torch.zeros(worker_error_size - original_size, device=buffer_m.device) + buffer_m = torch.cat([buffer_m, empty_tensor]) + + buffer_m.add_(worker_error) + worker_scale = torch.linalg.norm(buffer_m) / np.sqrt(torch.numel(buffer_m)) + + worker_error.set_(buffer_m - worker_scale * buffer_m.sign().add_(1).bool().float().add_(-0.5).mul_(2.0)) + + sign_list_packed_tmp = torch_npu.npu_sign_bits_pack(buffer_m, self.size).type(torch.int8) + + recvbuf_sign = torch.zeros([self.size, len(sign_list_packed_tmp[self.rank])], + dtype=sign_list_packed_tmp[0].dtype, + device=sign_list_packed_tmp.device) + + sign_list_packed = [sign_list_packed_tmp[idx] for idx in range(self.size)] + + recvbuf_scale = [ + torch.zeros(1, dtype=worker_scale.dtype, device=torch.device(local_rank)) for _ in range(self.size) + ] + + # communication phase 1 + # all to all for sign + dist.all_to_all_single(recvbuf_sign, torch.stack(sign_list_packed), group=self.world_group) + # all gather for scale + dist.all_gather(recvbuf_scale, worker_scale, group=self.world_group) + + flattened_recvbuf_sign = recvbuf_sign.type(torch.uint8).flatten() + compensated_server_m = torch_npu.npu_sign_bits_unpack(flattened_recvbuf_sign, self.size, torch.float32) \ + .mul_(torch.stack(recvbuf_scale).mul_(1 / self.size)).sum(0) + + compensated_server_m.add_(server_error) + + server_scale = torch.norm(compensated_server_m) / np.sqrt(compensated_server_m.numel()) + + server_error.set_(compensated_server_m - + server_scale * compensated_server_m.sign().add_(1).bool().float().add_(-0.5).mul_(2.0)) + + server_sign_packed = torch_npu.npu_sign_bits_pack(compensated_server_m, 1).type(torch.int8) + + # recvbuf_sign_server + recvbuf_sign_server_tmp = torch.zeros([self.size, len(server_sign_packed[0])], + dtype=recvbuf_sign.dtype, + device=server_sign_packed.device) + + recvbuf_sign_server = [recvbuf_sign_server_tmp[idx] for idx in range(self.size)] + + # recvbuf_scale_server + recvbuf_scale_server_tmp = torch.zeros([self.size, 1], + dtype=worker_scale.dtype, + device=server_sign_packed.device) + + recvbuf_scale_server = [recvbuf_scale_server_tmp[idx] for idx in range(self.size)] + + # communication Phase 2 + dist.all_gather(recvbuf_sign_server, server_sign_packed[0], group=self.world_group) + dist.all_gather(recvbuf_scale_server, server_scale, group=self.world_group) + + recvbuf_sign_server = torch.stack(recvbuf_sign_server) + + flattened_recvbuf_sign_server = recvbuf_sign_server.type(torch.uint8).flatten() + + buffer_m.data.copy_( + torch_npu.npu_sign_bits_unpack(flattened_recvbuf_sign_server, self.size, + torch.float32).mul_(recvbuf_scale_server_tmp).flatten().data) + + if original_size != worker_error_size: + buffer_m = buffer_m[0:original_size] + if len(original_shape) > 1: + buffer_m = buffer_m.reshape(original_shape) + + return buffer_m diff --git a/deepspeed/runtime/fp16/onebit/adam.py b/deepspeed/runtime/fp16/onebit/adam.py index 236eea8cadc5..ae3e5f573850 100644 --- a/deepspeed/runtime/fp16/onebit/adam.py +++ b/deepspeed/runtime/fp16/onebit/adam.py @@ -70,8 +70,6 @@ def __init__(self, super(OnebitAdam, self).__init__(params, defaults) self.eps_mode = 0 if eps_inside_sqrt else 1 - assert (dist.is_initialized()) - self.comm_time = 0.0 self.step_time = 0.0 self.ave_step = 1 @@ -86,22 +84,23 @@ def __init__(self, self.comm_backend_name = comm_backend_name + assert dist.is_initialized(), "Please initialize the torch distributed backend." # Empty initializer. Set handle based on the comm backend as follows. self.comm_backend_handle = None - if self.comm_backend_name == 'nccl': assert ( required_torch_version(min_version=1.8) ), "Please use torch 1.8 or greater to enable NCCL backend in 1-bit Adam. Alternatively, please specify 'mpi' as the 'comm_backend_name' in config file to proceed with the MPI backend" - assert dist.is_initialized() == True, "Please initialize the torch distributed backend." from deepspeed.runtime.comm.nccl import NcclBackend self.using_pipeline = hasattr(self.deepspeed, 'pipeline_enable_backward_allreduce') self.comm_backend_handle = NcclBackend(self.deepspeed.mpu) - elif self.comm_backend_name == 'mpi': from deepspeed.runtime.comm.mpi import MpiBackend self.comm_backend_handle = MpiBackend(cuda_aware) - + elif self.comm_backend_name == 'hccl': + from deepspeed.runtime.comm.hccl import HcclBackend + self.using_pipeline = hasattr(self.deepspeed, 'pipeline_enable_backward_allreduce') + self.comm_backend_handle = HcclBackend(self.deepspeed.mpu) self.size = self.comm_backend_handle.size self.divider = int(self.size * 8 / np.gcd(self.size, 8)) diff --git a/deepspeed/runtime/fp16/onebit/lamb.py b/deepspeed/runtime/fp16/onebit/lamb.py index 0662fabeeee1..9cd2e0f25648 100644 --- a/deepspeed/runtime/fp16/onebit/lamb.py +++ b/deepspeed/runtime/fp16/onebit/lamb.py @@ -93,8 +93,6 @@ def __init__(self, super(OnebitLamb, self).__init__(params, defaults) self.eps_mode = 0 if eps_inside_sqrt else 1 - assert (dist.is_initialized()) - self.deepspeed = deepspeed self.lamb_freeze_key = False self.initialize = False @@ -108,21 +106,23 @@ def __init__(self, self.comm_backend_name = comm_backend_name + assert dist.is_initialized(), "Please initialize the torch distributed backend." # Empty initializer. Set handle based on the comm backend as follows. self.comm_backend_handle = None - if self.comm_backend_name == 'nccl': assert ( required_torch_version(min_version=1.8) ), "Please use torch 1.8 or greater to enable NCCL backend in 1-bit Adam. Alternatively, please specify 'mpi' as the 'comm_backend_name' in config file to proceed with the MPI backend" - assert dist.is_initialized() == True, "Please initialize the torch distributed backend." from deepspeed.runtime.comm.nccl import NcclBackend self.using_pipeline = hasattr(self.deepspeed, 'pipeline_enable_backward_allreduce') self.comm_backend_handle = NcclBackend(self.deepspeed.mpu) - elif self.comm_backend_name == 'mpi': from deepspeed.runtime.comm.mpi import MpiBackend self.comm_backend_handle = MpiBackend(cuda_aware) + elif self.comm_backend_name == 'hccl': + from deepspeed.runtime.comm.hccl import HcclBackend + self.using_pipeline = hasattr(self.deepspeed, 'pipeline_enable_backward_allreduce') + self.comm_backend_handle = HcclBackend(self.deepspeed.mpu) self.size = self.comm_backend_handle.size @@ -161,7 +161,7 @@ def step(self, closure=None, grads=None): else: grads_group = grads - #remove the previous stats + # remove the previous stats del self.lamb_coeffs[:] if self.lamb_freeze_key: diff --git a/deepspeed/runtime/fp16/onebit/zoadam.py b/deepspeed/runtime/fp16/onebit/zoadam.py index 922263ad6a76..9ef671e7e3b7 100644 --- a/deepspeed/runtime/fp16/onebit/zoadam.py +++ b/deepspeed/runtime/fp16/onebit/zoadam.py @@ -83,8 +83,6 @@ def __init__(self, super(ZeroOneAdam, self).__init__(params, defaults) self.eps_mode = 0 if eps_inside_sqrt else 1 - assert (dist.is_initialized()) - self.deepspeed = deepspeed self.initialize = False self.cuda_aware = cuda_aware @@ -99,22 +97,23 @@ def __init__(self, self.comm_backend_name = comm_backend_name + assert dist.is_initialized(), "Please initialize the torch distributed backend." # Empty initializer. Set handle based on the comm backend as follows. self.comm_backend_handle = None - if self.comm_backend_name == 'nccl': assert ( required_torch_version(min_version=1.8) ), "Please use torch 1.8 or greater to enable NCCL backend in 0/1 Adam. Alternatively, please specify 'mpi' as the 'comm_backend_name' in config file to proceed with the MPI backend" - assert dist.is_initialized() == True, "Please initialize the torch distributed backend." from deepspeed.runtime.comm.nccl import NcclBackend self.using_pipeline = hasattr(self.deepspeed, 'pipeline_enable_backward_allreduce') self.comm_backend_handle = NcclBackend(self.deepspeed.mpu) - elif self.comm_backend_name == 'mpi': from deepspeed.runtime.comm.mpi import MpiBackend self.comm_backend_handle = MpiBackend(cuda_aware) - + elif self.comm_backend_name == 'hccl': + from deepspeed.runtime.comm.hccl import HcclBackend + self.using_pipeline = hasattr(self.deepspeed, 'pipeline_enable_backward_allreduce') + self.comm_backend_handle = HcclBackend(self.deepspeed.mpu) self.size = self.comm_backend_handle.size self.divider = int(self.size * 8 / np.gcd(self.size, 8)) From b18681692c06c5448f97c3784011379606420cee Mon Sep 17 00:00:00 2001 From: BacharL Date: Mon, 11 Dec 2023 17:54:50 +0200 Subject: [PATCH 021/754] Fix for stage3 when setting different communication data type (#4540) Co-authored-by: Olatunji Ruwase --- deepspeed/runtime/zero/stage3.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/deepspeed/runtime/zero/stage3.py b/deepspeed/runtime/zero/stage3.py index 684e6d06f5cf..30a168dcd396 100644 --- a/deepspeed/runtime/zero/stage3.py +++ b/deepspeed/runtime/zero/stage3.py @@ -1215,7 +1215,7 @@ def __reduce_and_partition_ipg_grads(self, safe_mode: bool = False) -> None: @instrument_w_nvtx def __avg_scatter_contiguous_grads(self, buffer_to_reduce: Tensor) -> List[Tensor]: dtype = buffer_to_reduce.dtype - if self.communication_data_type == self.dtype: + if self.communication_data_type != dtype: buffer_to_reduce = buffer_to_reduce.to(self.communication_data_type) if self.postscale_gradients and self.gradient_predivide_factor != 1.0: buffer_to_reduce = buffer_to_reduce.div_(self.gradient_predivide_factor) From a7900bcc3d2f7789cc734aa28a11d2f3b3d8b04f Mon Sep 17 00:00:00 2001 From: Arash Bakhtiari Date: Tue, 12 Dec 2023 13:31:44 -0800 Subject: [PATCH 022/754] Add support of Falcon models (7b, 40b, 180b) to DeepSpeed-FastGen (#4790) --- blogs/deepspeed-fastgen/README.md | 1 + deepspeed/inference/v2/engine_factory.py | 3 + .../blocked_kv_rotary.cu | 10 + .../blocked_kv_rotary.py | 2 +- .../v2/model_implementations/__init__.py | 1 + .../model_implementations/falcon/__init__.py | 6 + .../falcon/falcon_containers.py | 129 +++++++++++ .../falcon/falcon_model.py | 206 ++++++++++++++++++ .../falcon/falcon_policy.py | 33 +++ 9 files changed, 390 insertions(+), 1 deletion(-) create mode 100644 deepspeed/inference/v2/model_implementations/falcon/__init__.py create mode 100644 deepspeed/inference/v2/model_implementations/falcon/falcon_containers.py create mode 100644 deepspeed/inference/v2/model_implementations/falcon/falcon_model.py create mode 100644 deepspeed/inference/v2/model_implementations/falcon/falcon_policy.py diff --git a/blogs/deepspeed-fastgen/README.md b/blogs/deepspeed-fastgen/README.md index c309a9def53f..4081c780e09a 100644 --- a/blogs/deepspeed-fastgen/README.md +++ b/blogs/deepspeed-fastgen/README.md @@ -228,6 +228,7 @@ We currently support the following model architectures in this alpha release of * [LLaMA](https://huggingface.co/models?other=llama) and [LLaMA-2](https://huggingface.co/models?other=llama-2) * [Mistral](https://huggingface.co/models?other=mistral) * [OPT](https://huggingface.co/models?other=opt) +* [Falcon](https://huggingface.co/models?other=falcon) All current models leverage [HuggingFace](https://github.com/huggingface) APIs in our backend to provide both the model weights and the model's corresponding tokenizer. diff --git a/deepspeed/inference/v2/engine_factory.py b/deepspeed/inference/v2/engine_factory.py index ecca9f3c1b34..9558125ff934 100644 --- a/deepspeed/inference/v2/engine_factory.py +++ b/deepspeed/inference/v2/engine_factory.py @@ -17,6 +17,7 @@ OPTPolicy, Llama2Policy, MistralPolicy, + FalconPolicy, ) from .model_implementations.inference_policy_base import POLICIES, InferenceV2Policy from .model_implementations.flat_model_helpers import make_metadata_filename, ModelMetadata @@ -104,6 +105,8 @@ def build_hf_engine(path: str, assert version.parse(transformers.__version__) >= version.parse("4.34.0"), \ f"Mistral requires transformers >= 4.34.0, you have version {transformers.__version__}" policy = MistralPolicy(model_config, checkpoint_engine=checkpoint_engine) + elif model_config.model_type == "falcon": + policy = FalconPolicy(model_config, checkpoint_engine=checkpoint_engine) else: raise ValueError(f"Unsupported model type {model_config.model_type}") diff --git a/deepspeed/inference/v2/kernels/ragged_ops/linear_blocked_kv_rotary/blocked_kv_rotary.cu b/deepspeed/inference/v2/kernels/ragged_ops/linear_blocked_kv_rotary/blocked_kv_rotary.cu index 63ea5bc88bab..980334f02b0b 100644 --- a/deepspeed/inference/v2/kernels/ragged_ops/linear_blocked_kv_rotary/blocked_kv_rotary.cu +++ b/deepspeed/inference/v2/kernels/ragged_ops/linear_blocked_kv_rotary/blocked_kv_rotary.cu @@ -227,6 +227,16 @@ void launch_kv_rotary_kernel(T* kv_cache, DISPATCH_KV_ROTARY_IMPL(5, 128) DISPATCH_KV_ROTARY_IMPL(8, 64) DISPATCH_KV_ROTARY_IMPL(8, 128) + DISPATCH_KV_ROTARY_IMPL(16, 64) + DISPATCH_KV_ROTARY_IMPL(16, 128) + DISPATCH_KV_ROTARY_IMPL(29, 64) + DISPATCH_KV_ROTARY_IMPL(29, 128) + DISPATCH_KV_ROTARY_IMPL(35, 64) + DISPATCH_KV_ROTARY_IMPL(35, 128) + DISPATCH_KV_ROTARY_IMPL(36, 64) + DISPATCH_KV_ROTARY_IMPL(36, 128) + DISPATCH_KV_ROTARY_IMPL(71, 64) + DISPATCH_KV_ROTARY_IMPL(71, 128) } #define INSTANTIATE_KV_ROTARY_KERNEL(TYPE) \ diff --git a/deepspeed/inference/v2/kernels/ragged_ops/linear_blocked_kv_rotary/blocked_kv_rotary.py b/deepspeed/inference/v2/kernels/ragged_ops/linear_blocked_kv_rotary/blocked_kv_rotary.py index 630d58d90a23..50d9aca061f3 100644 --- a/deepspeed/inference/v2/kernels/ragged_ops/linear_blocked_kv_rotary/blocked_kv_rotary.py +++ b/deepspeed/inference/v2/kernels/ragged_ops/linear_blocked_kv_rotary/blocked_kv_rotary.py @@ -19,7 +19,7 @@ class BlockedRotaryEmbeddings(DSKernelBase): supported_dtypes = [DtypeEnum.fp16, DtypeEnum.bf16] supported_head_sizes = [64, 128] - supported_q_ratios = [1, 2, 4, 5, 8] + supported_q_ratios = [1, 2, 4, 5, 8, 16, 29, 35, 36, 71] def __init__(self, head_size: int, n_q_heads: int, n_kv_heads: int, dtype: torch.dtype) -> None: """ diff --git a/deepspeed/inference/v2/model_implementations/__init__.py b/deepspeed/inference/v2/model_implementations/__init__.py index dae406271245..481be2e5940e 100644 --- a/deepspeed/inference/v2/model_implementations/__init__.py +++ b/deepspeed/inference/v2/model_implementations/__init__.py @@ -12,3 +12,4 @@ from .llama_v2 import * from .opt import * from .mistral import * +from .falcon import * diff --git a/deepspeed/inference/v2/model_implementations/falcon/__init__.py b/deepspeed/inference/v2/model_implementations/falcon/__init__.py new file mode 100644 index 000000000000..ff66879b44be --- /dev/null +++ b/deepspeed/inference/v2/model_implementations/falcon/__init__.py @@ -0,0 +1,6 @@ +# Copyright (c) Microsoft Corporation. +# SPDX-License-Identifier: Apache-2.0 + +# DeepSpeed Team + +from .falcon_policy import FalconPolicy diff --git a/deepspeed/inference/v2/model_implementations/falcon/falcon_containers.py b/deepspeed/inference/v2/model_implementations/falcon/falcon_containers.py new file mode 100644 index 000000000000..f3cbe6609cdd --- /dev/null +++ b/deepspeed/inference/v2/model_implementations/falcon/falcon_containers.py @@ -0,0 +1,129 @@ +# Copyright (c) Microsoft Corporation. +# SPDX-License-Identifier: Apache-2.0 + +# DeepSpeed Team + +# Create a container object to save model-specific tensors using the policy file above. + +from ...model_implementations.common_parameters import * +from ...model_implementations.layer_container_base import LayerContainer +''' + # HF Falcon 7b model looks like this: + +FalconForCausalLM( + (transformer): FalconModel( + (word_embeddings): Embedding(65024, 4544) + (h): ModuleList( + (0-31): 32 x FalconDecoderLayer( + (self_attention): FalconAttention( + (maybe_rotary): FalconRotaryEmbedding() + (query_key_value): FalconLinear(in_features=4544, out_features=4672, bias=False) + (dense): FalconLinear(in_features=4544, out_features=4544, bias=False) + (attention_dropout): Dropout(p=0.0, inplace=False) + ) + (mlp): FalconMLP( + (dense_h_to_4h): FalconLinear(in_features=4544, out_features=18176, bias=False) + (act): GELU(approximate='none') + (dense_4h_to_h): FalconLinear(in_features=18176, out_features=4544, bias=False) + ) + (input_layernorm): LayerNorm((4544,), eps=1e-05, elementwise_affine=True) + ) + ) + (ln_f): LayerNorm((4544,), eps=1e-05, elementwise_affine=True) + ) + (lm_head): Linear(in_features=4544, out_features=65024, bias=False) +) +''' + + +class FalconTransformerContainer(LayerContainer): + """ + Transformer layer container for the Falcon model. + """ + qkv_w: FusedQKVParameter + attn_out_w: AttentionOutputParameter + mlp_1_w: MLP1Parameter + mlp_2_w: MLP2Parameter + ln_attn_gamma: NormParameter + ln_attn_beta: NormParameter + + PARAM_MAPPING = { + "self_attention.query_key_value.weight": "qkv_w.params", + "self_attention.dense.weight": "attn_out_w.params", + "mlp.dense_h_to_4h.weight": "mlp_1_w.params", + "mlp.dense_4h_to_h.weight": "mlp_2_w.params", + "input_layernorm.weight": "ln_attn_gamma.params", + "input_layernorm.bias": "ln_attn_beta.params", + } + + +class FalconNonTransformerContainer(LayerContainer): + """ + Non-Transformer layer container for the Falcon model. + """ + word_emb: EmbeddingParameter + word_unembed: UnembedParameter + final_norm_gamma: NormParameter + final_norm_beta: NormParameter + + PARAM_MAPPING = { + "transformer.word_embeddings.weight": "word_emb.params", + "transformer.ln_f.weight": "final_norm_gamma.params", + "transformer.ln_f.bias": "final_norm_beta.params", + "lm_head.weight": "word_unembed.params", + } + + +''' + # HF Falcon 40b model looks like this: + + FalconForCausalLM( + (transformer): FalconModel( + (word_embeddings): Embedding(65024, 8192) + (h): ModuleList( + (0-59): 60 x FalconDecoderLayer( + (self_attention): FalconAttention( + (maybe_rotary): FalconRotaryEmbedding() + (query_key_value): FalconLinear(in_features=8192, out_features=9216, bias=False) + (dense): FalconLinear(in_features=8192, out_features=8192, bias=False) + (attention_dropout): Dropout(p=0.0, inplace=False) + ) + (mlp): FalconMLP( + (dense_h_to_4h): FalconLinear(in_features=8192, out_features=32768, bias=False) + (act): GELU(approximate='none') + (dense_4h_to_h): FalconLinear(in_features=32768, out_features=8192, bias=False) + ) + (ln_attn): LayerNorm((8192,), eps=1e-05, elementwise_affine=True) + (ln_mlp): LayerNorm((8192,), eps=1e-05, elementwise_affine=True) + ) + ) + (ln_f): LayerNorm((8192,), eps=1e-05, elementwise_affine=True) + ) + (lm_head): Linear(in_features=8192, out_features=65024, bias=False) +) +''' + + +class FalconNewArchTransformerContainer(LayerContainer): + """ + Transformer layer container for the Falcon model. + """ + qkv_w: GQAMegatronQKVParameter + attn_out_w: AttentionOutputParameter + mlp_1_w: MLP1Parameter + mlp_2_w: MLP2Parameter + ln_attn_gamma: NormParameter + ln_attn_beta: NormParameter + ln_mlp_gamma: NormParameter + ln_mlp_beta: NormParameter + + PARAM_MAPPING = { + "self_attention.query_key_value.weight": "qkv_w.params", + "self_attention.dense.weight": "attn_out_w.params", + "mlp.dense_h_to_4h.weight": "mlp_1_w.params", + "mlp.dense_4h_to_h.weight": "mlp_2_w.params", + "ln_attn.weight": "ln_attn_gamma.params", + "ln_attn.bias": "ln_attn_beta.params", + "ln_mlp.weight": "ln_mlp_gamma.params", + "ln_mlp.bias": "ln_mlp_beta.params", + } diff --git a/deepspeed/inference/v2/model_implementations/falcon/falcon_model.py b/deepspeed/inference/v2/model_implementations/falcon/falcon_model.py new file mode 100644 index 000000000000..a00f754744a4 --- /dev/null +++ b/deepspeed/inference/v2/model_implementations/falcon/falcon_model.py @@ -0,0 +1,206 @@ +# Copyright (c) Microsoft Corporation. +# SPDX-License-Identifier: Apache-2.0 + +# DeepSpeed Team + +from typing import Iterable, Optional, Tuple + +import torch + +import deepspeed.comm as dist + +from ...allocator import empty_from +from ...inference_utils import ActivationType, DtypeEnum +from ...model_implementations import * +from ...modules.configs import * +from ...modules.interfaces import * +from ...ragged import RaggedBatchWrapper + +from .falcon_containers import FalconNonTransformerContainer, FalconTransformerContainer + + +class FalconInferenceModel(DSTransformerModelBase): + """ + Inference model implementation for ragged batching for Llama-2 models. + """ + + _non_transformer: Optional[FalconNonTransformerContainer] + """ + Embed + unembed container. Specializing the type annotation. + """ + + _transformer: Optional[Iterable[FalconTransformerContainer]] + """ + Per-layer transformer container. Specializing the type annotation. + """ + """ + Properties inherited from `DSInferenceModelBase` + """ + + @property + def max_sequence_length(self) -> int: + return self._config.max_seq_length + + """ + Properties inherited from `DSTransformerModelBase` + """ + + @property + def num_layers(self) -> int: + return self._config.num_hidden_layers + + @property + def model_dim(self) -> int: + return self._config.hidden_size + + @property + def vocab_size(self) -> int: + return self._config.vocab_size + + @property + def head_size(self) -> int: + return self.model_dim // self.n_heads + + @property + def n_heads(self) -> int: + return self._config.num_attention_heads + + @property + def intermediate_dim(self) -> int: + return 4 * self._config.hidden_size + + @property + def n_heads_kv(self) -> int: + return self._config.num_kv_heads if (self._config.new_decoder_architecture + or not self._config.multi_query) else 1 + + @property + def activation_dtype(self) -> DtypeEnum: + if self._config.torch_dtype == torch.float16: + return DtypeEnum.fp16 + elif self._config.torch_dtype == torch.bfloat16: + return DtypeEnum.bf16 + else: + raise NotImplementedError("Only fp16 and bf16 are supported") + + @property + def mlp_activation_fn(self) -> ActivationType: + return ActivationType.GELU + + @property + def norm_type(self) -> NormTypeEnum: + return NormTypeEnum.LayerNorm + + @property + def positional_embedding_type(self) -> PositionalEmbeddingType: + return PositionalEmbeddingType.rotate_half + + """ + Forward implementations + """ + + def _forward_embed(self, ragged_batch: RaggedBatchWrapper) -> torch.Tensor: + """ + Performs the embedding lookup prior to running the transformer of the model. + + Arguments: + ragged_batch (RaggedBatchWrapper): The batch to embed. + + Returns: + torch.Tensor: The embedded batch. + """ + embed = self.embed(ragged_batch, self._non_transformer.word_emb) + + if embed.shape[-1] != self.model_dim: + raise ValueError(f"Embedding output shape {embed.shape} does not match model_dim {self.model_dim}") + + return embed + + def _forward_transformer_layer(self, layer_idx: int, residual: torch.Tensor, hidden_states: torch.Tensor, + ragged_batch_info: RaggedBatchWrapper) -> Tuple[torch.Tensor, torch.Tensor]: + """ + Executes one (slightly offset) layer of the transformer. This implementation does a peak-ahead + optimization to fuse the layer norm of the next layer into the current layer. + + Arguments: + layer_idx (int): The index of the layer to execute. + residual (torch.Tensor): The residual tensor from the previous layer. + hidden_states (torch.Tensor): The hidden states from the previous layer. This is the + hidden states after pre normalization. + ragged_batch_info (RaggedBatchWrapper): The batch metadata. + """ + assert self.config.parallel_attn, "Only parallel attention implementation is supported" + + cur_params = self._transformer[layer_idx] + kv_cache = self.state_manager.get_cache(layer_idx) + + attn_ln_out = hidden_states + attn_hidden_state = self.qkv(attn_ln_out, cur_params.qkv_w, b=None) + attn_hidden_state = self.attn(attn_hidden_state, kv_cache, ragged_batch_info) + attention_output = self.attn_out(attn_hidden_state, cur_params.attn_out_w, b=None) + + if self.config.new_decoder_architecture: + residual, mlp_ln_out = self.norm(residual, + None, + gamma=cur_params.ln_mlp_gamma, + beta=cur_params.ln_mlp_beta) + else: + mlp_ln_out = hidden_states + + mlp_hidden_state = self.mlp_1(mlp_ln_out, cur_params.mlp_1_w, b=None) + mlp_output = self.mlp_2(mlp_hidden_state, cur_params.mlp_2_w, b=None) + + mlp_output.add_(attention_output) + + if self.tp_size > 1: + dist.all_reduce(mlp_output, group=self._base_mp_group) + + if layer_idx != self.num_layers - 1: + next_params = self._transformer[layer_idx + 1] + residual, mlp_output = self.norm(residual, + mlp_output, + next_params.ln_attn_gamma, + beta=next_params.ln_attn_beta) + else: + # On last layer, we just need to perform the residual add. Adding into the residual + # here is safe. + residual.add_(mlp_output) + + return residual, mlp_output + + def _forward_unembed(self, hidden_states: torch.Tensor, ragged_batch_info: RaggedBatchWrapper) -> torch.Tensor: + """ + Performs unembedding of the hidden states to logits. This will only sample the final + token of each sequence. + """ + logits = self.unembed(hidden_states, + self._non_transformer.word_unembed, + ragged_batch_info, + gamma=self._non_transformer.final_norm_gamma, + beta=self._non_transformer.final_norm_beta) + + if self.tp_size > 1: + comm_buffer = empty_from(self._comm_logits, (self.tp_size, logits.shape[0], logits.shape[1])) + full_logits = empty_from(self._return_logits, (logits.shape[0], self.vocab_size)) + + dist.all_gather_into_tensor(comm_buffer, logits, group=self._base_mp_group) + + full_logits.copy_(comm_buffer.permute(1, 0, 2).reshape(logits.shape[0], self.vocab_size)) + + return full_logits + else: + return logits + + def forward(self, wrapped_batch: RaggedBatchWrapper) -> torch.Tensor: + residual = self._forward_embed(wrapped_batch) + + residual, hidden_states = self.norm(residual, + None, + gamma=self._transformer[0].ln_attn_gamma, + beta=self._transformer[0].ln_attn_beta) + + for layer_idx in range(self.num_layers): + residual, hidden_states = self._forward_transformer_layer(layer_idx, residual, hidden_states, + wrapped_batch) + + return self._forward_unembed(residual, wrapped_batch) diff --git a/deepspeed/inference/v2/model_implementations/falcon/falcon_policy.py b/deepspeed/inference/v2/model_implementations/falcon/falcon_policy.py new file mode 100644 index 000000000000..5672d45a8d13 --- /dev/null +++ b/deepspeed/inference/v2/model_implementations/falcon/falcon_policy.py @@ -0,0 +1,33 @@ +# Copyright (c) Microsoft Corporation. +# SPDX-License-Identifier: Apache-2.0 + +# DeepSpeed Team + +from typing import Any + +from ...config_v2 import RaggedInferenceEngineConfig +from ...model_implementations.inference_policy_base import ContainerMap, InferenceV2Policy +from ...model_implementations.falcon.falcon_containers import FalconNonTransformerContainer, FalconTransformerContainer +from ...model_implementations.falcon.falcon_containers import FalconNewArchTransformerContainer +from ...model_implementations.falcon.falcon_model import FalconInferenceModel + + +class FalconPolicy(InferenceV2Policy): + + def instantiate_model(self, engine_config: RaggedInferenceEngineConfig, mp_group: Any) -> FalconInferenceModel: + return FalconInferenceModel(config=self._model_config, engine_config=engine_config, base_mp_group=mp_group) + + def build_container_map(self) -> ContainerMap: + map = ContainerMap() + + trans_container_cls = FalconNewArchTransformerContainer if self._model_config.new_decoder_architecture else FalconTransformerContainer + transformer_containers = [trans_container_cls(self.model) for _ in range(self.model.num_layers)] + + map.set_transformer_params(['transformer.h'], transformer_containers) + + map.set_non_transformer_params(FalconNonTransformerContainer(self.model)) + + map.set_unmapped_params( + [f'model.layers.{i}.self_attn.rotary_emb.inv_freq' for i in range(self.model.num_layers)]) + + return map From 3324efd9306bc19b3cd7a669b339f84983d3ebf8 Mon Sep 17 00:00:00 2001 From: Logan Adams <114770087+loadams@users.noreply.github.com> Date: Wed, 13 Dec 2023 09:36:15 -0800 Subject: [PATCH 023/754] Switch paths-ignore to single quotes, update paths-ignore on nv-pre-compile-ops (#4805) --- .github/workflows/nv-a6000.yml | 6 +++--- .github/workflows/nv-accelerate-v100.yml | 2 +- .github/workflows/nv-inference.yml | 2 +- .github/workflows/nv-lightning-v100.yml | 2 +- .github/workflows/nv-megatron.yml | 2 +- .github/workflows/nv-pre-compile-ops.yml | 4 ++-- .github/workflows/nv-torch-latest-cpu.yml | 2 +- .github/workflows/nv-torch-latest-v100.yml | 2 +- .github/workflows/nv-transformers-v100.yml | 2 +- 9 files changed, 12 insertions(+), 12 deletions(-) diff --git a/.github/workflows/nv-a6000.yml b/.github/workflows/nv-a6000.yml index a5b6cd5c28e5..de325cb20826 100644 --- a/.github/workflows/nv-a6000.yml +++ b/.github/workflows/nv-a6000.yml @@ -3,9 +3,9 @@ name: nv-a6000 on: pull_request: paths: - - "deepspeed/inference/v2/**" - - "tests/unit/inference/v2/**" - - ".github/workflows/nv-a6000.yml" + - 'deepspeed/inference/v2/**' + - 'tests/unit/inference/v2/**' + - '.github/workflows/nv-a6000.yml' workflow_dispatch: concurrency: diff --git a/.github/workflows/nv-accelerate-v100.yml b/.github/workflows/nv-accelerate-v100.yml index 0f6491e08336..d8a03ff34f78 100644 --- a/.github/workflows/nv-accelerate-v100.yml +++ b/.github/workflows/nv-accelerate-v100.yml @@ -6,7 +6,7 @@ on: - 'docs/**' - 'blogs/**' - 'deepspeed/inference/v2/**' - - "tests/unit/inference/v2/**" + - 'tests/unit/inference/v2/**' merge_group: branches: [ master ] schedule: diff --git a/.github/workflows/nv-inference.yml b/.github/workflows/nv-inference.yml index f20b4496b6df..156fa0228d0b 100644 --- a/.github/workflows/nv-inference.yml +++ b/.github/workflows/nv-inference.yml @@ -6,7 +6,7 @@ on: - 'docs/**' - 'blogs/**' - 'deepspeed/inference/v2/**' - - "tests/unit/inference/v2/**" + - 'tests/unit/inference/v2/**' merge_group: branches: [ master ] schedule: diff --git a/.github/workflows/nv-lightning-v100.yml b/.github/workflows/nv-lightning-v100.yml index d25d40aef967..ffcecb1e0d36 100644 --- a/.github/workflows/nv-lightning-v100.yml +++ b/.github/workflows/nv-lightning-v100.yml @@ -6,7 +6,7 @@ on: - 'docs/**' - 'blogs/**' - 'deepspeed/inference/v2/**' - - "tests/unit/inference/v2/**" + - 'tests/unit/inference/v2/**' merge_group: branches: [ master ] schedule: diff --git a/.github/workflows/nv-megatron.yml b/.github/workflows/nv-megatron.yml index 3a3b70dcd17d..0c3fc4c5ef5e 100644 --- a/.github/workflows/nv-megatron.yml +++ b/.github/workflows/nv-megatron.yml @@ -6,7 +6,7 @@ on: - 'docs/**' - 'blogs/**' - 'deepspeed/inference/v2/**' - - "tests/unit/inference/v2/**" + - 'tests/unit/inference/v2/**' merge_group: branches: [ master ] schedule: diff --git a/.github/workflows/nv-pre-compile-ops.yml b/.github/workflows/nv-pre-compile-ops.yml index 839312190d22..505e73fee156 100644 --- a/.github/workflows/nv-pre-compile-ops.yml +++ b/.github/workflows/nv-pre-compile-ops.yml @@ -8,7 +8,7 @@ on: - 'docs/**' - 'blogs/**' - 'deepspeed/inference/v2/**' - - "tests/unit/inference/v2/**" + - 'tests/unit/inference/v2/**' merge_group: branches: [ master ] schedule: @@ -19,7 +19,7 @@ concurrency: cancel-in-progress: true jobs: - build-ops: + unit-tests: runs-on: ubuntu-20.04 container: image: deepspeed/gh-builder:ubuntu1804-py38-torch1131-cu116 diff --git a/.github/workflows/nv-torch-latest-cpu.yml b/.github/workflows/nv-torch-latest-cpu.yml index 9ca1529d9018..375b984134cb 100644 --- a/.github/workflows/nv-torch-latest-cpu.yml +++ b/.github/workflows/nv-torch-latest-cpu.yml @@ -6,7 +6,7 @@ on: - 'docs/**' - 'blogs/**' - 'deepspeed/inference/v2/**' - - "tests/unit/inference/v2/**" + - 'tests/unit/inference/v2/**' merge_group: branches: [ master ] schedule: diff --git a/.github/workflows/nv-torch-latest-v100.yml b/.github/workflows/nv-torch-latest-v100.yml index 8813a4bb2c4f..e4e61acd8143 100644 --- a/.github/workflows/nv-torch-latest-v100.yml +++ b/.github/workflows/nv-torch-latest-v100.yml @@ -6,7 +6,7 @@ on: - 'docs/**' - 'blogs/**' - 'deepspeed/inference/v2/**' - - "tests/unit/inference/v2/**" + - 'tests/unit/inference/v2/**' merge_group: branches: [ master ] schedule: diff --git a/.github/workflows/nv-transformers-v100.yml b/.github/workflows/nv-transformers-v100.yml index 7753133f2886..4fbc42abec5f 100644 --- a/.github/workflows/nv-transformers-v100.yml +++ b/.github/workflows/nv-transformers-v100.yml @@ -6,7 +6,7 @@ on: - 'docs/**' - 'blogs/**' - 'deepspeed/inference/v2/**' - - "tests/unit/inference/v2/**" + - 'tests/unit/inference/v2/**' merge_group: branches: [ master ] schedule: From 7914b195c0a41ed01823ceac469b58407d9de021 Mon Sep 17 00:00:00 2001 From: Michael Wyatt Date: Thu, 14 Dec 2023 16:12:46 -0800 Subject: [PATCH 024/754] fix for tests using torch<2.1 (#4818) Our torch 1.10 tests have been failling since the merge of #4569. This added a `device_type` kwarg to the `torch.random.fork_rng` call. But this is not compatible with older versions of torch. Added in https://github.com/pytorch/pytorch/pull/98069 Fixes #4644, #4503 --- tests/unit/alexnet_model.py | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/tests/unit/alexnet_model.py b/tests/unit/alexnet_model.py index e3be2be4894d..cf533063d6ec 100644 --- a/tests/unit/alexnet_model.py +++ b/tests/unit/alexnet_model.py @@ -11,6 +11,7 @@ import deepspeed import deepspeed.comm as dist import deepspeed.runtime.utils as ds_utils +from deepspeed.runtime.utils import required_torch_version from deepspeed.accelerator import get_accelerator from deepspeed.runtime.pipe.module import PipelineModule, LayerSpec @@ -111,8 +112,11 @@ def cifar_trainset(fp16=False): def train_cifar(model, config, num_steps=400, average_dp_losses=True, fp16=True, seed=123): - with get_accelerator().random().fork_rng(devices=[get_accelerator().current_device_name()], - device_type=get_accelerator().device_name()): + if required_torch_version(min_version=2.1): + fork_kwargs = {"device_type": get_accelerator().device_name()} + else: + fork_kwargs = {} + with get_accelerator().random().fork_rng(devices=[get_accelerator().current_device_name()], **fork_kwargs): ds_utils.set_random_seed(seed) # disable dropout From 8998707a2fc8584712a4cb3dc465d02e7d9f50da Mon Sep 17 00:00:00 2001 From: Sam Ade Jacobs Date: Fri, 15 Dec 2023 13:22:39 -0500 Subject: [PATCH 025/754] Universal Checkpoint for Sequence Parallelism (#4752) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit This PR extends the [universal checkpoint](https://github.com/microsoft/Megatron-DeepSpeed/tree/main/examples_deepspeed/universal_checkpointing) to support DS sequence parallelism and training scenarios where pipeline parallelism is not enabled. The attached Tensorboard chart show a training scenario (validation curve) where a GPT model is pre-trained with data parallelism (4 GPUs), and checkpoints are saved at the 100th and 200th iterations. The checkpoint at the 100th iteration is later loaded for continual pre-training with different configurations (more GPU resources, data parallelism = 4 GPUs, sequence parallelism = 2 GPUs). Screenshot 2023-11-28 at 9 11 55 AM --------- Co-authored-by: Michael Wyatt --- deepspeed/checkpoint/deepspeed_checkpoint.py | 36 +++++++++++++------- deepspeed/checkpoint/ds_to_universal.py | 8 ++--- deepspeed/checkpoint/reshape_3d_utils.py | 2 +- deepspeed/checkpoint/universal_checkpoint.py | 2 +- deepspeed/runtime/zero/stage_1_and_2.py | 4 ++- 5 files changed, 33 insertions(+), 19 deletions(-) diff --git a/deepspeed/checkpoint/deepspeed_checkpoint.py b/deepspeed/checkpoint/deepspeed_checkpoint.py index 77634222d292..8312dddd2fa6 100644 --- a/deepspeed/checkpoint/deepspeed_checkpoint.py +++ b/deepspeed/checkpoint/deepspeed_checkpoint.py @@ -34,7 +34,10 @@ class DeepSpeedCheckpoint(object): def __init__(self, dir, tp_degree=None, pp_degree=None, dp_degree=None): self.dir = dir - self._validate_folder(dir) + + pipeline_parallel = len(get_files_with_prefix(get_files(dir), LAYER_FILE_PREFIX)) > 0 + + self._validate_folder(dir, pipeline_parallel) self.zero_checkpoint = ZeROCheckpoint(dir) @@ -193,7 +196,10 @@ def get_final_norm_files(self, tp_index: int) -> list: return self.tp_to_final_norm_map[tp_index] def _build_tp_other_layer_map(self, layer_index: int): - assert layer_index < len(self.layer_files) + data_map = {} + if len(self.layer_files) < 1: + return data_map + assert layer_index <= len(self.layer_files) layer_files = get_files_with_prefix(self.layer_files, self.layer_keys[layer_index]) layer_file_partitions = partition_data(layer_files, self.tp_degree) data_map = {i: flist for i, flist in enumerate(layer_file_partitions)} @@ -207,9 +213,13 @@ def get_2d_parallel_files(self, tp_index: int, pp_index: int) -> list: def _build_pp_transformer_map(self): data_map = {} - transformer_layers = self.layer_keys[1:-1] - layers_per_pp = len(transformer_layers) // self.pp_degree - data_map = {i: transformer_layers[i * layers_per_pp:(i + 1) * layers_per_pp] for i in range(0, self.pp_degree)} + if self.pp_degree > 0: + transformer_layers = self.layer_keys[1:-1] + layers_per_pp = len(transformer_layers) // self.pp_degree + data_map = { + i: transformer_layers[i * layers_per_pp:(i + 1) * layers_per_pp] + for i in range(0, self.pp_degree) + } return data_map def _dump_mapping(self, data_map, map_tag=None): @@ -222,9 +232,9 @@ def _build_transformer_file_map(self): transformer_layer_keys = self.layer_keys[1:-1] file_map = {} # XXX: this is not guaranteed - layers_per_pp = len(transformer_layer_keys) // self.pp_degree - if layers_per_pp == 0: - layers_per_pp = 1 + layers_per_pp = 1 + if self.pp_degree > 0: + layers_per_pp = len(transformer_layer_keys) // self.pp_degree #print(f"{transformer_layer_keys} {layers_per_pp}") for key_index, layer_key in enumerate(transformer_layer_keys): pp_index = key_index // layers_per_pp @@ -240,8 +250,8 @@ def _build_transformer_file_map(self): def _sanity_check(self): assert len(self.mp_rank_files) % self.tp_degree == 0 - assert len(self.layer_keys) > 2 assert self.zero_checkpoint.num_files % (self.pp_degree * self.tp_degree) == 0 + assert self.zero_checkpoint.num_files % (self.tp_degree) == 0 # XXX: fix me - isn't always the case # only true with --pp-partition-method 'type:transformer|embedding' \ # assert (len(self.layer_keys) - 2) % self.pp_degree == 0 @@ -270,12 +280,14 @@ def _merge_state_dicts(self, sd_list): return merged_sd - def _validate_folder(self, dir): + def _validate_folder(self, dir, pipeline_parallel): basic_folder_validation(dir) file_list = get_files(dir) - - for file_prefix in [MODEL_FILE_PREFIX, LAYER_FILE_PREFIX, f'{LAYER_FILE_PREFIX}01']: + file_prefix_list = [MODEL_FILE_PREFIX] + if pipeline_parallel: + file_prefix_list.extend([LAYER_FILE_PREFIX, f'{LAYER_FILE_PREFIX}01']) + for file_prefix in file_prefix_list: ckpt_files = get_files_with_prefix(file_list, file_prefix) assert len( ckpt_files diff --git a/deepspeed/checkpoint/ds_to_universal.py b/deepspeed/checkpoint/ds_to_universal.py index 8be187aa89c2..f40c5630899d 100755 --- a/deepspeed/checkpoint/ds_to_universal.py +++ b/deepspeed/checkpoint/ds_to_universal.py @@ -15,7 +15,7 @@ import shutil import torch import tqdm -# from pprint import pprint +#from pprint import pprint from deepspeed.checkpoint import DeepSpeedCheckpoint from deepspeed.checkpoint import ( @@ -241,9 +241,9 @@ def _extract_zero_shard_files(args, ds_checkpoint, temp_dir): _3d_range_list = list( itertools.product(range(ds_checkpoint.pp_degree), range(ds_checkpoint.tp_degree), range(ds_checkpoint.dp_degree))) - # pprint(f'{_3d_range_list=}') + #pprint(f'{_3d_range_list=}') work_chunks = list(_get_chunks(_3d_range_list, args.num_extract_workers)) - # pprint(f'{work_chunks=}') + #pprint(f'{work_chunks=}') # extract_zero_shards(temp_dir, ds_checkpoint, _3d_range_list[0]) do_work = partial(extract_zero_shards, temp_dir, ds_checkpoint) @@ -309,7 +309,7 @@ def main(): print('*** 1. Extracting ZeRO fragments') _extract_zero_shard_files(args, ds_checkpoint, temp_dir) - print('*** 2. Merging slices') + print('*** 2. Merging slices .....') _merge_tp_slice_files(args, ds_checkpoint, slice_shapes, temp_dir) print('*** 3. Saving common optimizer states') diff --git a/deepspeed/checkpoint/reshape_3d_utils.py b/deepspeed/checkpoint/reshape_3d_utils.py index b5bf41e2d160..02b3947624a1 100644 --- a/deepspeed/checkpoint/reshape_3d_utils.py +++ b/deepspeed/checkpoint/reshape_3d_utils.py @@ -81,7 +81,7 @@ def get_model_3d_descriptor(dir): else: tp_degree = len(get_files_with_prefix(file_list, MODEL_FILE_PREFIX)) dp_degree = max(1, len(zero_file_list) // tp_degree) - pp_degree = 0 + pp_degree = 1 return model_3d_desc(pp_degree, tp_degree, dp_degree) diff --git a/deepspeed/checkpoint/universal_checkpoint.py b/deepspeed/checkpoint/universal_checkpoint.py index 5849a834cdd3..542d1125c566 100644 --- a/deepspeed/checkpoint/universal_checkpoint.py +++ b/deepspeed/checkpoint/universal_checkpoint.py @@ -13,8 +13,8 @@ def load_hp_checkpoint_state(self, folder, tp_rank, tp_world_size): hp_mapping = self._hp_mapping optim_state_keys = hp_mapping.get_optim_state_keys() hp_keys = [FP32_WEIGHT_KEY] + optim_state_keys + #print(f'{hp_keys=}') checkpoint_files = {key: os.path.join(folder, f"{key}.pt") for key in hp_keys} - for file in checkpoint_files.values(): assert os.path.isfile(file), f'{file} is not a valid file' diff --git a/deepspeed/runtime/zero/stage_1_and_2.py b/deepspeed/runtime/zero/stage_1_and_2.py index 1d2d561dbd39..aeb533698af3 100755 --- a/deepspeed/runtime/zero/stage_1_and_2.py +++ b/deepspeed/runtime/zero/stage_1_and_2.py @@ -2258,7 +2258,9 @@ def _load_hp_checkpoint_state(self, checkpoint_dir): self._load_global_state(optim_sd) tp_rank = bwc_tensor_model_parallel_rank(mpu=self.mpu) - tp_world_size = self.mpu.get_slice_parallel_world_size() + tp_world_size = self.mpu.get_slice_parallel_world_size() if hasattr(self.mpu, "get_slice_parallel_world_size") \ + else self.mpu.get_tensor_model_parallel_world_size() + for i, _ in enumerate(self.optimizer.param_groups): for lp in self.bit16_groups[i]: if lp._hp_mapping is not None: From 84eaf5ac843234737f0b49e36a818d1aabd1776f Mon Sep 17 00:00:00 2001 From: Michael Wyatt Date: Fri, 15 Dec 2023 10:23:22 -0800 Subject: [PATCH 026/754] Accelerate CI fix (#4819) --- .github/workflows/nv-accelerate-v100.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/nv-accelerate-v100.yml b/.github/workflows/nv-accelerate-v100.yml index d8a03ff34f78..31e413124aed 100644 --- a/.github/workflows/nv-accelerate-v100.yml +++ b/.github/workflows/nv-accelerate-v100.yml @@ -18,7 +18,7 @@ concurrency: jobs: unit-tests: - runs-on: [self-hosted, nvidia, cu111, v100] + runs-on: [self-hosted, nvidia, cu116, v100] steps: - uses: actions/checkout@v3 @@ -28,7 +28,7 @@ jobs: - name: Install pytorch run: | - pip install -U --cache-dir $TORCH_CACHE torch torchvision --extra-index-url https://download.pytorch.org/whl/cu111 + pip install -U --cache-dir $TORCH_CACHE torch --index-url https://download.pytorch.org/whl/cu118 python -c "import torch; print('torch:', torch.__version__, torch)" python -c "import torch; print('CUDA available:', torch.cuda.is_available())" From 4a6e0c06240b45185709ac4a2902ec42518049d2 Mon Sep 17 00:00:00 2001 From: jxysoft Date: Sat, 16 Dec 2023 05:01:12 +0800 Subject: [PATCH 027/754] =?UTF-8?q?fix=20[BUG]=20'DeepSpeedGPTInference'?= =?UTF-8?q?=20object=20has=20no=20attribute=20'dtype'=20for=E2=80=A6=20(#4?= =?UTF-8?q?814)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- deepspeed/model_implementations/transformers/ds_transformer.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/deepspeed/model_implementations/transformers/ds_transformer.py b/deepspeed/model_implementations/transformers/ds_transformer.py index a41df58ad059..d87d0de997b5 100644 --- a/deepspeed/model_implementations/transformers/ds_transformer.py +++ b/deepspeed/model_implementations/transformers/ds_transformer.py @@ -163,7 +163,7 @@ def forward( if (self.config.dtype in [torch.float16, torch.bfloat16, torch.int8]) \ and input.dtype == torch.float: - target_dtype = torch.half if self.dtype == torch.int8 else self.dtype + target_dtype = torch.half if self.config.dtype == torch.int8 else self.config.dtype input = input.to(target_dtype) with torch.no_grad(): From d1f1d45f4b4eb86bf5b82ed617f09f528bb00d11 Mon Sep 17 00:00:00 2001 From: Michael Wyatt Date: Fri, 15 Dec 2023 13:02:17 -0800 Subject: [PATCH 028/754] Update broken link in docs (#4822) resolves #4821 --- docs/_tutorials/getting-started.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/_tutorials/getting-started.md b/docs/_tutorials/getting-started.md index 8d2bbf2d9964..f9a4cfdc68b4 100644 --- a/docs/_tutorials/getting-started.md +++ b/docs/_tutorials/getting-started.md @@ -8,7 +8,7 @@ tags: getting-started ## Installation * Installing is as simple as `pip install deepspeed`, [see more details](/tutorials/advanced-install/). -* To get started with DeepSpeed on AzureML, please see the [AzureML Examples GitHub](https://github.com/Azure/azureml-examples/tree/main/python-sdk/workflows/train/deepspeed) +* To get started with DeepSpeed on AzureML, please see the [AzureML Examples GitHub](https://github.com/Azure/azureml-examples/tree/main/cli/jobs/deepspeed) * DeepSpeed has direct integrations with [HuggingFace Transformers](https://github.com/huggingface/transformers) and [PyTorch Lightning](https://github.com/PyTorchLightning/pytorch-lightning). HuggingFace Transformers users can now easily accelerate their models with DeepSpeed through a simple ``--deepspeed`` flag + config file [See more details](https://huggingface.co/docs/transformers/main_classes/deepspeed). PyTorch Lightning provides easy access to DeepSpeed through the Lightning Trainer [See more details](https://pytorch-lightning.readthedocs.io/en/stable/advanced/multi_gpu.html?highlight=deepspeed#deepspeed). * DeepSpeed on AMD can be used via our [ROCm images](https://hub.docker.com/r/deepspeed/rocm501/tags), e.g., `docker pull deepspeed/rocm501:ds060_pytorch110`. From b83b1c2e1c4dc4c91c4ad78773dc2232ca9f7070 Mon Sep 17 00:00:00 2001 From: Logan Adams <114770087+loadams@users.noreply.github.com> Date: Fri, 15 Dec 2023 14:12:50 -0800 Subject: [PATCH 029/754] Update imports from Transformers (#4817) --- requirements/requirements-dev.txt | 2 +- requirements/requirements-inf.txt | 2 +- tests/unit/inference/quantization/test_intX_quantization.py | 4 ++-- tests/unit/runtime/zero/test_zero_nesting_init.py | 2 +- 4 files changed, 5 insertions(+), 5 deletions(-) diff --git a/requirements/requirements-dev.txt b/requirements/requirements-dev.txt index 078386c457bd..7204eead5864 100644 --- a/requirements/requirements-dev.txt +++ b/requirements/requirements-dev.txt @@ -16,5 +16,5 @@ sphinx sphinx-rtd-theme tensorboard torchvision -transformers +transformers>=4.32.1 wandb diff --git a/requirements/requirements-inf.txt b/requirements/requirements-inf.txt index 848a7f7a485d..27371e623f26 100644 --- a/requirements/requirements-inf.txt +++ b/requirements/requirements-inf.txt @@ -1,5 +1,5 @@ google lm-eval==0.3.0 protobuf -transformers +transformers>=4.32.1 transformers[sentencepiece] diff --git a/tests/unit/inference/quantization/test_intX_quantization.py b/tests/unit/inference/quantization/test_intX_quantization.py index 56df2b232d15..fd6a8e5ad2e1 100644 --- a/tests/unit/inference/quantization/test_intX_quantization.py +++ b/tests/unit/inference/quantization/test_intX_quantization.py @@ -55,7 +55,7 @@ def quantization_test_helper(pre_quant_type: torch.dtype, num_bits: int): def zero3_post_init_quantization_test_helper(cpu_offload: bool, nvme_offload: bool, bits: int): import deepspeed - from transformers.deepspeed import HfDeepSpeedConfig + from transformers.integrations.deepspeed import HfDeepSpeedConfig def get_zero3_ds_config(hf_config: OPTConfig, cpu_offload: bool, nvme_offload: bool, bits: int) -> Dict: GB = 1 << 30 @@ -172,7 +172,7 @@ def get_zero3_ds_config(hf_config: OPTConfig, cpu_offload: bool, nvme_offload: b def zero3_quantized_initialization_test_helper(cpu_offload: bool, nvme_offload: bool, bits: int): import deepspeed - from transformers.deepspeed import HfDeepSpeedConfig + from transformers.integrations.deepspeed import HfDeepSpeedConfig def get_zero3_ds_config(hf_config: OPTConfig, cpu_offload: bool, nvme_offload: bool, bits: int) -> Dict: GB = 1 << 30 diff --git a/tests/unit/runtime/zero/test_zero_nesting_init.py b/tests/unit/runtime/zero/test_zero_nesting_init.py index 143e7e997b13..15d82fd8be00 100644 --- a/tests/unit/runtime/zero/test_zero_nesting_init.py +++ b/tests/unit/runtime/zero/test_zero_nesting_init.py @@ -8,7 +8,7 @@ from unit.common import DistributedTest from transformers import VisionEncoderDecoderModel -from transformers.deepspeed import HfDeepSpeedConfig +from transformers.integrations.deepspeed import HfDeepSpeedConfig import deepspeed From bc1b5a6c06049f39d1e5c18bbe0f29a09e11f4a3 Mon Sep 17 00:00:00 2001 From: Michael Wyatt Date: Fri, 15 Dec 2023 14:39:25 -0800 Subject: [PATCH 030/754] Minor updates to CI workflows (#4823) --- .github/workflows/amd-mi100.yml | 56 ------------------------------ .github/workflows/auto-sync.yml | 59 -------------------------------- .github/workflows/formatting.yml | 2 +- .github/workflows/python.yml | 2 +- 4 files changed, 2 insertions(+), 117 deletions(-) delete mode 100644 .github/workflows/amd-mi100.yml delete mode 100644 .github/workflows/auto-sync.yml diff --git a/.github/workflows/amd-mi100.yml b/.github/workflows/amd-mi100.yml deleted file mode 100644 index 7ad0f4178db4..000000000000 --- a/.github/workflows/amd-mi100.yml +++ /dev/null @@ -1,56 +0,0 @@ -name: amd-mi100 - -on: - schedule: - - cron: "0 0 * * *" - -concurrency: - group: ${{ github.workflow }}-${{ github.ref }} - cancel-in-progress: true - -jobs: - amd-tests: - # The type of runner that the job will run on - runs-on: [self-hosted, amd, mi100] - - # Steps represent a sequence of tasks that will be executed as part of the job - steps: - # Checks-out your repository under $GITHUB_WORKSPACE, so your job can access it - - uses: actions/checkout@v3 - - - id: setup-venv - uses: ./.github/workflows/setup-venv - - - name: Install pytorch - run: | - pip install --cache-dir $TORCH_CACHE torch==1.13.1 torchvision --extra-index-url https://download.pytorch.org/whl/rocm5.1.1 - python -c "import torch; print('torch:', torch.__version__, torch)" - python -c "import torch; print('CUDA available:', torch.cuda.is_available())" - - - name: Install transformers - run: | - git clone https://github.com/huggingface/transformers - cd transformers - # if needed switch to the last known good SHA until transformers@master is fixed - # git checkout 1cc453d33 - git rev-parse --short HEAD - pip install . - - # Runs a set of commands using the runners shell - - name: Install deepspeed - run: | - pip install .[dev,1bit,autotuning] - #python -c "from deepspeed.env_report import cli_main; cli_main()" - ds_report - - - name: Python environment - run: | - pip list - - # Runs a set of commands using the runners shell - - name: Unit tests - run: | - unset TORCH_CUDA_ARCH_LIST # only jit compile for current arch - cd tests - pytest $PYTEST_OPTS -n 4 --verbose unit/ - pytest $PYTEST_OPTS -m 'sequential' unit/ diff --git a/.github/workflows/auto-sync.yml b/.github/workflows/auto-sync.yml deleted file mode 100644 index bfbf5a2ae37a..000000000000 --- a/.github/workflows/auto-sync.yml +++ /dev/null @@ -1,59 +0,0 @@ -name: AutoSync - -on: - push: - branches: - - 'master' - -jobs: - - Create-PR: - runs-on: ubuntu-20.04 - - steps: - - uses: actions/checkout@v3 - with: - token: ${{ secrets.GHP_TOKEN }} - repository: ${{ secrets.DST_REPO }} - ref: ${{ secrets.DST_REPO_BRANCH }} - path: dst-repo - - - name: Get PR data - run: | - echo "REPO=${{ github.repository }}" >> $GITHUB_ENV - echo "COMMIT_SHA=${{ github.event.after }}" >> $GITHUB_ENV - echo "SHORT_SHA=$(echo ${{ github.event.after }} | cut -c1-8)" >> $GITHUB_ENV - echo "USERNAME=${{ github.event.head_commit.author.username }}" >> $GITHUB_ENV - echo "USER_EMAIL=${{ github.event.head_commit.author.username }}@users.noreply.github.com" >> $GITHUB_ENV - echo "PR_NAME=$(echo '${{ github.event.head_commit.message }}' | head -1 | sed 's|#|${{ github.repository }}#|g')" >> $GITHUB_ENV - - - name: Cherry pick commit - continue-on-error: true - run: | - cd dst-repo - git config --global user.name ${{ env.USERNAME }} - git config --global user.email ${{ env.USER_EMAIL }} - git fetch https://github.com/${{ env.REPO }}.git master - git cherry-pick FETCH_HEAD --strategy-option octopus - - - name: Add modified files - run: | - cd dst-repo - git add . - - - name: Create Pull Request - uses: peter-evans/create-pull-request@v4 - with: - path: dst-repo - token: ${{ secrets.GHP_TOKEN }} - body: | - **Auto-generated PR** - Repo - [${{ env.REPO }}](https://github.com/${{ env.REPO }}) - PR name - ${{ env.PR_NAME }} - Commit - ${{ env.REPO }}@${{ env.COMMIT_SHA }} - Author - @${{ env.USERNAME }} - branch: AutoPR/${{ env.SHORT_SHA }} - assignees: ${{ env.USERNAME }} - title: ${{ env.PR_NAME }} - labels: AutoPR - author: ${{ env.USERNAME }} <${{ env.USER_EMAIL }}> diff --git a/.github/workflows/formatting.yml b/.github/workflows/formatting.yml index a168af277fb8..26f3819dd2bf 100644 --- a/.github/workflows/formatting.yml +++ b/.github/workflows/formatting.yml @@ -16,7 +16,7 @@ concurrency: jobs: # formatting and basic install on cpu-only machine - formatting: + unit-tests: runs-on: ubuntu-20.04 steps: diff --git a/.github/workflows/python.yml b/.github/workflows/python.yml index 279bad471c01..59770a5e23b3 100644 --- a/.github/workflows/python.yml +++ b/.github/workflows/python.yml @@ -17,7 +17,7 @@ concurrency: cancel-in-progress: true jobs: - version-check: + unit-tests: strategy: matrix: pyVersion: ["3.6", "3.7", "3.8", "3.9", "3.10"] From faa00b1373e2e5628c660d0f40cab485cd960c33 Mon Sep 17 00:00:00 2001 From: baodi Date: Sat, 16 Dec 2023 07:16:33 +0800 Subject: [PATCH 031/754] fix falcon model load from_config meta_data error (#4783) --- deepspeed/module_inject/auto_tp.py | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/deepspeed/module_inject/auto_tp.py b/deepspeed/module_inject/auto_tp.py index 6f545d4cb13b..b9a726bec67f 100644 --- a/deepspeed/module_inject/auto_tp.py +++ b/deepspeed/module_inject/auto_tp.py @@ -121,7 +121,9 @@ class Loading(): def is_load_module(module): load_layers = [nn.Linear, nn.Embedding, nn.LayerNorm] - load_layer_names = ["LPLayerNorm", "SharedEmbedding", "OPTLearnedPositionalEmbedding", "LlamaRMSNorm"] + load_layer_names = [ + "LPLayerNorm", "SharedEmbedding", "OPTLearnedPositionalEmbedding", "LlamaRMSNorm", "FalconLinear" + ] return module.__class__ in load_layers or module._get_name() in load_layer_names def load_buffer(module, state_dict, prefix): From 449e454f83bb6a14b0de359660d4b206d5c3feed Mon Sep 17 00:00:00 2001 From: Nadav Elyahu <88962733+nelyahu@users.noreply.github.com> Date: Sat, 16 Dec 2023 01:17:38 +0200 Subject: [PATCH 032/754] mv DeepSpeedEngine param_names dict init post _configure_distributed_model (#4803) In some backends, when params are being moved from host to device, they might changed their python object id(), which uses a the key in the param_names dictionary. in such case this dict might become invalid. Co-authored-by: Michael Wyatt --- deepspeed/runtime/engine.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/deepspeed/runtime/engine.py b/deepspeed/runtime/engine.py index 44b44c79ba55..c5f4d3e6530d 100644 --- a/deepspeed/runtime/engine.py +++ b/deepspeed/runtime/engine.py @@ -232,9 +232,6 @@ def __init__( # for debug purposes - can then debug print: debug_get_module_name(module) debug_extract_module_and_param_names(model) - # needed for zero_to_fp32 weights reconstruction to remap nameless data to state_dict - self.param_names = {param: name for name, param in model.named_parameters()} - self._do_args_sanity_check(args) self._configure_with_arguments(args, mpu) self._do_sanity_check() @@ -261,6 +258,9 @@ def __init__( # Configure distributed model self._configure_distributed_model(model) + # needed for zero_to_fp32 weights reconstruction to remap nameless data to state_dict + self.param_names = {param: name for name, param in model.named_parameters()} + self._get_model_parameters() see_memory_usage(f"DeepSpeed Engine: After configure distributed model") From d37fc25d568bbcfb36772d9eae4539d8deac1bd2 Mon Sep 17 00:00:00 2001 From: Michael Wyatt Date: Fri, 15 Dec 2023 15:31:46 -0800 Subject: [PATCH 033/754] Refactor launcher user arg parsing (#4824) Splitting work from #4769 because we are still debugging transformers integration issues. Parsing was broken for user arguments (see #4795). Additionally, parsing of user arguments is tricky and there are lots of edge cases. For example: #4660, #4716, #3967. I've attempted to accommodate all of the possible types of string inputs and added unit tests. --- deepspeed/launcher/multinode_runner.py | 14 ++++-- deepspeed/launcher/runner.py | 4 -- tests/unit/launcher/test_user_args.py | 64 ++++++++++++++++++++++++++ 3 files changed, 75 insertions(+), 7 deletions(-) create mode 100644 tests/unit/launcher/test_user_args.py diff --git a/deepspeed/launcher/multinode_runner.py b/deepspeed/launcher/multinode_runner.py index 730146f5bcd2..07c70f3cc6c5 100644 --- a/deepspeed/launcher/multinode_runner.py +++ b/deepspeed/launcher/multinode_runner.py @@ -56,13 +56,21 @@ def __init__(self, args, world_info_base64): def backend_exists(self): return shutil.which('pdsh') + def parse_user_args(self): + processed_args = [] + for arg in self.args.user_args: + # With pdsh, if we are passing a string as an argument, it will get + # split on whitespace. To avoid this and support strings that + # contain '"', we do this extra processing step: + if " " in arg: + arg = '"{}"'.format(arg.replace('"', '\\"')) + processed_args.append(arg) + return processed_args + @property def name(self): return "pdsh" - def parse_user_args(self): - return list(map(lambda x: x if x.startswith("-") else f"'{x}'", self.args.user_args)) - def get_cmd(self, environment, active_resources): environment['PDSH_RCMD_TYPE'] = 'ssh' if self.args.ssh_port is not None: # only specify ssh port if it is specified diff --git a/deepspeed/launcher/runner.py b/deepspeed/launcher/runner.py index a7fa2b5053e5..99ebc9771e41 100755 --- a/deepspeed/launcher/runner.py +++ b/deepspeed/launcher/runner.py @@ -12,7 +12,6 @@ import os import re import sys -import shlex import json import base64 import argparse @@ -389,9 +388,6 @@ def parse_num_nodes(str_num_nodes: str, elastic_training: bool): def main(args=None): args = parse_args(args) - # For when argparse interprets remaining args as a single string - args.user_args = shlex.split(" ".join(list(map(lambda x: x if x.startswith("-") else f'"{x}"', args.user_args)))) - if args.elastic_training: assert args.master_addr != "", "Master Addr is required when elastic training is enabled" diff --git a/tests/unit/launcher/test_user_args.py b/tests/unit/launcher/test_user_args.py new file mode 100644 index 000000000000..99afd0f2cfa7 --- /dev/null +++ b/tests/unit/launcher/test_user_args.py @@ -0,0 +1,64 @@ +# Copyright (c) Microsoft Corporation. +# SPDX-License-Identifier: Apache-2.0 + +# DeepSpeed Team + +import pytest +import subprocess + +from deepspeed.accelerator import get_accelerator + +if not get_accelerator().is_available(): + pytest.skip("only supported in accelerator environments.", allow_module_level=True) + +user_arg_test_script = """import argparse +parser = argparse.ArgumentParser() +parser.add_argument("--prompt", type=str) +parser.add_argument("--local_rank", type=int, default=0) +parser.add_argument("--world_size", type=int, default=1) +args = parser.parse_args() +print("ARG PARSE SUCCESS") +""" + + +@pytest.fixture(scope="function") +def user_script_fp(tmpdir): + script_fp = tmpdir.join("user_arg_test.py") + with open(script_fp, "w") as f: + f.write(user_arg_test_script) + return script_fp + + +@pytest.fixture(scope="function") +def cmd(user_script_fp, prompt, multi_node): + if multi_node: + cmd = ("deepspeed", "--force_multi", "--num_nodes", "1", "--num_gpus", "1", user_script_fp, "--prompt", prompt) + else: + cmd = ("deepspeed", "--num_nodes", "1", "--num_gpus", "1", user_script_fp, "--prompt", prompt) + return cmd + + +@pytest.mark.parametrize("prompt", [ + '''"I am 6' tall"''', """'I am 72" tall'""", """'"translate English to Romanian: "'""", + '''I'm going to tell them "DeepSpeed is the best"''' +]) +@pytest.mark.parametrize("multi_node", [True, False]) +def test_user_args(cmd): + p = subprocess.Popen(cmd, stdout=subprocess.PIPE, stderr=subprocess.PIPE) + out, err = p.communicate() + assert "ARG PARSE SUCCESS" in out.decode("utf-8"), f"User args not parsed correctly: {err.decode('utf-8')}" + + +def test_bash_string_args(tmpdir, user_script_fp): + bash_script = f""" + ARGS="--prompt 'DeepSpeed is the best'" + echo ${{ARGS}}|xargs deepspeed --num_nodes 1 --num_gpus 1 {user_script_fp} + """ + + bash_fp = tmpdir.join("bash_script.sh") + with open(bash_fp, "w") as f: + f.write(bash_script) + + p = subprocess.Popen(["bash", bash_fp], stdout=subprocess.PIPE, stderr=subprocess.PIPE) + out, err = p.communicate() + assert "ARG PARSE SUCCESS" in out.decode("utf-8"), f"User args not parsed correctly: {err.decode('utf-8')}" From 65b7727758a4c0ee08597a88ab4f051abcfc2a8a Mon Sep 17 00:00:00 2001 From: Alienfeel Date: Sat, 16 Dec 2023 07:35:00 +0800 Subject: [PATCH 034/754] Fix 4649 (#4650) Co-authored-by: Michael Wyatt --- deepspeed/launcher/runner.py | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/deepspeed/launcher/runner.py b/deepspeed/launcher/runner.py index 99ebc9771e41..4f45e1831b48 100755 --- a/deepspeed/launcher/runner.py +++ b/deepspeed/launcher/runner.py @@ -443,7 +443,11 @@ def main(args=None): if not args.master_addr: assert multi_node_exec first_host = list(active_resources.keys())[0] - hostname_cmd = [f"ssh {first_host} hostname -I"] + ssh_check_cmd = "ssh " + if args.ssh_port is not None: + ssh_check_cmd += f" -p {args.ssh_port}" + ssh_check_cmd += f" {first_host} hostname -I" + hostname_cmd = [ssh_check_cmd] try: result = subprocess.check_output(hostname_cmd, shell=True) except subprocess.CalledProcessError as err: From 4d866bd55a6b2b924987603b599c1f8f35911c4b Mon Sep 17 00:00:00 2001 From: Michael Wyatt Date: Fri, 15 Dec 2023 17:02:38 -0800 Subject: [PATCH 035/754] Update version.txt after 0.12.5 release (#4826) **Auto-generated PR to update version.txt after a DeepSpeed release** Released version - 0.12.5 Author - @mrwyattii Co-authored-by: mrwyattii --- version.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/version.txt b/version.txt index 43c2417ca0c6..dabff2f13810 100644 --- a/version.txt +++ b/version.txt @@ -1 +1 @@ -0.12.5 +0.12.6 From 4559dadd367453befd6c8f7d0049f8e900c897c3 Mon Sep 17 00:00:00 2001 From: BacharL Date: Mon, 18 Dec 2023 20:10:55 +0200 Subject: [PATCH 036/754] Cache metadata for TP activations and grads (#4360) PartitionedTensor.from_meta will cause device to host synchronization when reading the meta tensor in meta = meta.tolist() Added cpu cache for the meta tensor to avoid this synchronization in every activation and grad communication between the ranks. The meta tensor is assumed to be static since activation shape must be static. The user must call reset_activation_shape if any of the dimentions change. Co-authored-by: Olatunji Ruwase --- deepspeed/runtime/pipe/engine.py | 25 +++++++++++++++++++++---- 1 file changed, 21 insertions(+), 4 deletions(-) diff --git a/deepspeed/runtime/pipe/engine.py b/deepspeed/runtime/pipe/engine.py index c8d6a0bff444..27fa5b69d35d 100644 --- a/deepspeed/runtime/pipe/engine.py +++ b/deepspeed/runtime/pipe/engine.py @@ -182,6 +182,10 @@ def __init__(self, has_bool_tensors=False, *super_args, **super_kwargs): self.first_output_send = True self.first_gradient_send = True + self.pipe_partition_input_meta_cache = None + self.pipe_partition_output_meta_cache = None + self.pipe_partition_grad_meta_cache = None + self.grad_partition_grad_layer_meta_cache = None #stores the loss for the current micro batch being processed self.loss = torch.tensor(0.0).to(self.device) @@ -309,6 +313,11 @@ def reset_activation_shape(self): self.grad_layer = None self.meta_buffer = None + self.pipe_partition_input_meta_cache = None + self.pipe_partition_output_meta_cache = None + self.pipe_partition_grad_meta_cache = None + self.grad_partition_grad_layer_meta_cache = None + def train_batch(self, data_iter=None): """Progress the pipeline to train the next batch of data. The engine will ingest ``self.train_batch_size()`` total samples collectively across all workers. @@ -641,7 +650,9 @@ def _exec_forward_pass(self, buffer_id): # collect the partitioned input from the previous stage if self.is_pipe_partitioned and not self.is_first_stage(): - part_input = PartitionedTensor.from_meta(meta=inputs[0], + if self.pipe_partition_input_meta_cache is None: + self.pipe_partition_input_meta_cache = inputs[0].to('cpu') + part_input = PartitionedTensor.from_meta(meta=self.pipe_partition_input_meta_cache, local_part=inputs[1], group=self.grid.get_slice_parallel_group()) @@ -732,7 +743,9 @@ def _exec_backward_pass(self, buffer_id): # careful to also restore the computational graph of the tensors we partitioned. if self.is_pipe_partitioned: if self.is_grad_partitioned: - part_output = PartitionedTensor.from_meta(meta=outputs[0], + if self.pipe_partition_output_meta_cache is None: + self.pipe_partition_output_meta_cache = outputs[0].to('cpu') + part_output = PartitionedTensor.from_meta(meta=self.pipe_partition_output_meta_cache, local_part=outputs[1], group=self.grid.get_slice_parallel_group()) self.pipe_buffers['output_tensors'][buffer_id].data = part_output.full() @@ -745,7 +758,9 @@ def _exec_backward_pass(self, buffer_id): grad_tensors = self.grad_layer if self.is_grad_partitioned: #print(f'RANK={self.global_rank} BEFORE-BWD restoring grad={self.grad_layer[0].size()} {self.grad_layer[1].size()}') - part_grad = PartitionedTensor.from_meta(meta=self.grad_layer[0], + if self.grad_partition_grad_layer_meta_cache is None: + self.grad_partition_grad_layer_meta_cache = self.grad_layer[0].to('cpu') + part_grad = PartitionedTensor.from_meta(meta=self.grad_partition_grad_layer_meta_cache, local_part=self.grad_layer[1], group=self.grid.get_slice_parallel_group()) grad_tensors = (part_grad.full(), *grad_tensors[2:]) @@ -1088,7 +1103,9 @@ def _exec_recv_grads(self, buffer_id): # XXX these shapes are hardcoded for Megatron # Restore partitioned output if it was partitioned and we are sending full gradients if self.is_pipe_partitioned and not self.is_grad_partitioned: - part_output = PartitionedTensor.from_meta(meta=outputs[0], + if self.pipe_partition_grad_meta_cache is None: + self.pipe_partition_grad_meta_cache = outputs[0].to('cpu') + part_output = PartitionedTensor.from_meta(meta=self.pipe_partition_grad_meta_cache, local_part=outputs[1], group=self.grid.get_slice_parallel_group()) outputs[0].data = part_output.full() From 4c2cac03402b64901dc4569d85190c54e0c89a28 Mon Sep 17 00:00:00 2001 From: Omar Elayan <142979319+oelayan7@users.noreply.github.com> Date: Mon, 18 Dec 2023 20:29:04 +0200 Subject: [PATCH 037/754] Inference changes for incorporating meta loading checkpoint (#4692) 1. In both files, the same logic was done that if when it is meta no need to move the tensors to the device. 2. Deletion of an unused member of the class --------- Co-authored-by: Olatunji Ruwase --- deepspeed/inference/engine.py | 12 +++++------ deepspeed/module_inject/auto_tp.py | 34 ++++++++++++++++++++---------- 2 files changed, 29 insertions(+), 17 deletions(-) diff --git a/deepspeed/inference/engine.py b/deepspeed/inference/engine.py index 149d20cd9305..71330b982ee0 100755 --- a/deepspeed/inference/engine.py +++ b/deepspeed/inference/engine.py @@ -109,11 +109,6 @@ def __init__(self, model, config): assert pkg_version.parse(torch.__version__) >= pkg_version.parse("1.10"), \ "If you want to use cuda graph, please upgrade torch to at least v1.10" - # Check if model passed to engine is loaded w/ meta tensors, in which case - # kernel injection must be enabled. - # NOTE: This check assumes a Hugging Face hierarchy for the device type i.e. module.device.type - self.model_meta_device = self.module.device.type == 'meta' if hasattr(self.module, "device") else False - # convert model to intended dtype if config.dtype: self._convert_to_dtype(config) @@ -170,7 +165,12 @@ def __init__(self, model, config): self._apply_injection_policy(config, client_module) device = get_accelerator().current_device_name() - self.module.to(device) + # NOTE: This check assumes a Hugging Face hierarchy for the device type i.e. module.device.type + is_meta_device = hasattr(self.module, "device") and self.module.device.type == 'meta' + if is_meta_device: + self.module.to_empty(device=device) + else: + self.module.to(device) if config.tensor_parallel.tp_size > 1: _rng_state = get_accelerator().get_rng_state().to(get_accelerator().current_device_name()) diff --git a/deepspeed/module_inject/auto_tp.py b/deepspeed/module_inject/auto_tp.py index b9a726bec67f..af0566cbb3cb 100644 --- a/deepspeed/module_inject/auto_tp.py +++ b/deepspeed/module_inject/auto_tp.py @@ -17,6 +17,16 @@ from deepspeed.module_inject.tp_shard import get_shard_size, get_shard_size_list +def move(tensor, device): + if tensor.is_meta: + return torch.empty_like(tensor, device=device) + else: + # Using new tensors help in freeing memory (after split for example) was done before by calling clone(). + # Using copy=True instead of clone() will help in case of cpu --> cpu. + # Otherwise to() will not create a new copy for the view of the full tensor, and it will not be de-referenced. + return tensor.to(device, copy=True) + + class ReplaceWithTensorSlicing: def __init__(self, mp_group=None, mp_size=1, out_dim=1, in_dim=0): @@ -318,7 +328,7 @@ def _replace(self, child, name, conv_linear_layer): data = child.weight.data.split(get_shard_size_list( weight_shape[0] if self.conv_linear_layer else weight_shape[1], self.mp_size), dim=1) - data_dc = data[mp_replace.gpu_index].to(get_accelerator().current_device_name()).clone().detach() + data_dc = move(data[mp_replace.gpu_index], get_accelerator().current_device_name()).detach() del data setattr(child, "replaced", True) @@ -326,9 +336,10 @@ def _replace(self, child, name, conv_linear_layer): return LmHeadLinearAllreduce( torch.nn.parameter.Parameter(data_dc, requires_grad=False), dist.get_rank(), dist.get_world_size(), child.bias if child.bias is None else torch.nn.parameter.Parameter( - child.bias.to(get_accelerator().current_device_name())), self.mp_group) + move(child.bias, + get_accelerator().current_device_name())), self.mp_group) return LinearAllreduce(torch.nn.parameter.Parameter(data_dc, requires_grad=False), child.bias if child.bias is None else \ - torch.nn.parameter.Parameter(child.bias.to(get_accelerator().current_device_name())), self.mp_group) + torch.nn.parameter.Parameter(move(child.bias, get_accelerator().current_device_name())), self.mp_group) else: # if conv_linear_layer [weight_shape[1], weight_shape[0] // mp_size] @@ -340,30 +351,31 @@ def _replace(self, child, name, conv_linear_layer): #for detecting fused type module_str = str(self.module).strip() #The copy is a regular copy, The shape of dst and src is the same - data_dc = prepare_tp_fused_qkvw(module_str, child.weight.data, self.mp_size, mp_replace.gpu_index) + data_dc = move( + prepare_tp_fused_qkvw(module_str, child.weight.data, self.mp_size, mp_replace.gpu_index), + get_accelerator().current_device_name()) - bias_data_dc = None if child.bias is None else prepare_tp_fused_qkvw( - module_str, child.bias.data, self.mp_size, mp_replace.gpu_index).to( - get_accelerator().current_device_name()) + bias_data_dc = None if child.bias is None else move( + prepare_tp_fused_qkvw(module_str, child.bias.data, self.mp_size, mp_replace.gpu_index), + get_accelerator().current_device_name()) else: data = child.weight.data.split(get_shard_size_list(weight_shape[0], self.mp_size), dim=1 if self.conv_linear_layer else 0) - data_dc = data[mp_replace.gpu_index].to(get_accelerator().current_device_name()).clone().detach() + data_dc = move(data[mp_replace.gpu_index], get_accelerator().current_device_name()).detach() del data if child.bias is not None: bias_data = child.bias.data.split(get_shard_size_list( weight_shape[1] if self.conv_linear_layer else weight_shape[0], self.mp_size), dim=0) - bias_data = bias_data[mp_replace.gpu_index].to(get_accelerator().current_device_name()) + bias_data = move(bias_data[mp_replace.gpu_index], get_accelerator().current_device_name()) bias_data_dc = torch.nn.parameter.Parameter(bias_data, requires_grad=False) del bias_data else: bias_data_dc = None setattr(child, "replaced", True) - return LinearLayer(weight=torch.nn.parameter.Parameter(data_dc.to(get_accelerator().current_device_name()), requires_grad=False), \ - bias=bias_data_dc) + return LinearLayer(weight=torch.nn.parameter.Parameter(data_dc, requires_grad=False), bias=bias_data_dc) def _slice_embedding(self, child, name, conv_linear_layer): if getattr(child, "replaced", False) == True: From 83fa673aaec23879248861a61028b775498a67a5 Mon Sep 17 00:00:00 2001 From: Michael Wyatt Date: Mon, 18 Dec 2023 10:32:19 -0800 Subject: [PATCH 038/754] Update CODEOWNERS (#4838) --- CODEOWNERS | 62 +++++++++++++++++++++++++++--------------------------- 1 file changed, 31 insertions(+), 31 deletions(-) diff --git a/CODEOWNERS b/CODEOWNERS index 2410b3ebc09b..2c16aef39a1b 100644 --- a/CODEOWNERS +++ b/CODEOWNERS @@ -7,50 +7,50 @@ # top-level repo folders -/.github/ @jeffra @mrwyattii @loadams -/azure/ @jeffra @awan-10 -/benchmarks/ @jeffra @awan-10 @mrwyattii @molly-smith -/bin/ @jeffra -/csrc/ @RezaYazdaniAminabadi @awan-10 @jeffra @cmikeh2 @arashb -/deepspeed/ @jeffra -/docker/ @jeffra @awan-10 -/docs/ @jeffra @mrwyattii -/examples/ @jeffra @awan-10 @mrwyattii -/op_builder/ @jeffra @RezaYazdaniAminabadi @cmikeh2 -/release/ @jeffra @mrwyattii -/requirements/ @jeffra @mrwyattii -/scripts/ @jeffra @awan-10 -/tests/ @jeffra @mrwyattii @tjruwase +/.github/ @mrwyattii @loadams +/azure/ @mrwyattii @awan-10 +/benchmarks/ @awan-10 @mrwyattii +/bin/ @mrwyattii +/csrc/ @awan-10 @mrwyattii @cmikeh2 @arashb +/deepspeed/ @mrwyattii +/docker/ @mrwyattii @awan-10 +/docs/ @mrwyattii +/examples/ @awan-10 @mrwyattii +/op_builder/ @mrwyattii @cmikeh2 +/release/ @loadams @mrwyattii +/requirements/ @loadams @mrwyattii +/scripts/ @mrwyattii @awan-10 +/tests/ @mrwyattii @tjruwase @loadams # deepspeed -/deepspeed/autotuning/ @cli99 +/deepspeed/autotuning/ @mrwyattii /deepspeed/checkpoint/ @tjruwase /deepspeed/comm/ @awan-10 -/deepspeed/compression/ @yaozhewei @minjiaz @xiaoxiawu-microsoft @conglongli -/deepspeed/elasticity/ @jeffra @awan-10 -/deepspeed/launcher/ @jeffra @awan-10 -/deepspeed/module_inject/ @RezaYazdaniAminabadi @jeffra @mrwyattii @awan-10 @cmikeh2 @arashb +/deepspeed/compression/ @minjiaz @xiaoxiawu-microsoft @conglongli +/deepspeed/elasticity/ @mrwyattii @awan-10 +/deepspeed/launcher/ @mrwyattii @awan-10 +/deepspeed/module_inject/ @mrwyattii @awan-10 @cmikeh2 @arashb /deepspeed/moe/ @awan-10 -/deepspeed/monitor/ @awan-10 @jeffra -/deepspeed/nebula/ @tjruwase @jeffra -/deepspeed/ops/ @RezaYazdaniAminabadi @jeffra @mrwyattii @awan-10 @cmikeh2 @arashb +/deepspeed/monitor/ @awan-10 @mrwyattii +/deepspeed/nebula/ @tjruwase @mrwyattii +/deepspeed/ops/ @mrwyattii @awan-10 @cmikeh2 @arashb /deepspeed/pipe/ @ShadenSmith @duli2012 -/deepspeed/profiling/ @cli99 -/deepspeed/utils/ @jeffra @tjruwase @awan-10 +/deepspeed/profiling/ @ShijieZZZZ +/deepspeed/utils/ @mrwyattii @tjruwase @awan-10 # inference -/deepspeed/inference/ @RezaYazdaniAminabadi @jeffra @mrwyattii @awan-10 @cmikeh2 @arashb -/deepspeed/model_implementations/ @RezaYazdaniAminabadi @jeffra @mrwyattii @awan-10 @cmikeh2 @arashb +/deepspeed/inference/ @mrwyattii @awan-10 @cmikeh2 @arashb +/deepspeed/model_implementations/ @mrwyattii @awan-10 @cmikeh2 @arashb # training -/deepspeed/runtime/ @jeffra @tjruwase -/deepspeed/runtime/activation_checkpointing/ @jeffra @tjruwase -/deepspeed/runtime/checkpoint_engine/ @tjruwase @jeffra +/deepspeed/runtime/ @mrwyattii @tjruwase +/deepspeed/runtime/activation_checkpointing/ @mrwyattii @tjruwase +/deepspeed/runtime/checkpoint_engine/ @tjruwase @mrwyattii /deepspeed/runtime/comm/ @awan-10 /deepspeed/runtime/compression/ @awan-10 @conglongli /deepspeed/runtime/data_pipeline/ @conglongli -/deepspeed/runtime/fp16/ @jeffra @tjruwase +/deepspeed/runtime/fp16/ @mrwyattii @tjruwase /deepspeed/runtime/fp16/onebit/ @conglongli @awan-10 /deepspeed/runtime/pipe/ @ShadenSmith @duli2012 /deepspeed/runtime/swap_tensor/ @tjruwase @mrwyattii -/deepspeed/runtime/zero/ @jeffra @tjruwase @samyam @mrwyattii +/deepspeed/runtime/zero/ @tjruwase @mrwyattii From c20f6fa4e0a7772400fc6b52999a2a9c3263cec0 Mon Sep 17 00:00:00 2001 From: baodi Date: Tue, 19 Dec 2023 02:45:01 +0800 Subject: [PATCH 039/754] support baichuan model: (#4721) * fix Baichuan meta data error * add BaichuanLayer and DecoderLayer to glmtype when prepare tp fused qkvw * add get_alibi_mask function for Baichuan to enable TP --------- Co-authored-by: Lai, Yejing Co-authored-by: Reza Yazdani <44502768+RezaYazdaniAminabadi@users.noreply.github.com> Co-authored-by: Logan Adams <114770087+loadams@users.noreply.github.com> Co-authored-by: Olatunji Ruwase Co-authored-by: Michael Wyatt --- deepspeed/inference/engine.py | 6 +++++- deepspeed/module_inject/auto_tp_model_utils.py | 10 ++++++++++ deepspeed/module_inject/fusedqkv_utils.py | 4 +++- deepspeed/module_inject/replace_module.py | 7 +++++-- 4 files changed, 23 insertions(+), 4 deletions(-) diff --git a/deepspeed/inference/engine.py b/deepspeed/inference/engine.py index 71330b982ee0..5fb5540dafa7 100755 --- a/deepspeed/inference/engine.py +++ b/deepspeed/inference/engine.py @@ -26,7 +26,7 @@ from ..module_inject.auto_tp import AutoTP from ..module_inject.replace_policy import generic_policies -from ..module_inject.auto_tp_model_utils import build_bloom_alibi_tensor, build_mpt_atten_bias_tensor, build_mpt_alibi_tensor +from ..module_inject.auto_tp_model_utils import build_bloom_alibi_tensor, build_mpt_atten_bias_tensor, build_mpt_alibi_tensor, get_alibi_mask from ..ops.transformer.inference.ds_attention import DeepSpeedSelfAttention from ..model_implementations.transformers.ds_transformer import DeepSpeedTransformerInference @@ -220,6 +220,10 @@ def build_alibi_tensor(self): if hasattr(self.module.transformer, 'build_mpt_alibi_tensor'): self.module.transformer.build_mpt_alibi_tensor_orig = self.module.transformer.build_mpt_alibi_tensor self.module.transformer.__class__.build_mpt_alibi_tensor = build_mpt_alibi_tensor + if hasattr(self.module, 'model'): + if hasattr(self.module.model, 'get_alibi_mask'): + self.module.model.get_alibi_mask_orig = self.module.model.get_alibi_mask + self.module.model.__class__.get_alibi_mask = get_alibi_mask def build_attn_bias(self): if hasattr(self.module, 'transformer'): diff --git a/deepspeed/module_inject/auto_tp_model_utils.py b/deepspeed/module_inject/auto_tp_model_utils.py index 51e52e3258dd..a71b1a54d6f6 100644 --- a/deepspeed/module_inject/auto_tp_model_utils.py +++ b/deepspeed/module_inject/auto_tp_model_utils.py @@ -61,6 +61,16 @@ def build_bloom_alibi_tensor(attention_mask: torch.Tensor, num_heads: int, dtype return alibi.reshape(batch_size * num_heads, 1, seq_length).to(dtype) +def get_alibi_mask(self, tensor, seq_length_with_past): + mask = self.get_alibi_mask_orig(tensor, seq_length_with_past) + if not self.training and dist.is_initialized(): + num_heads_per_rank = get_shard_size(self.n_head, dist.get_world_size()) + offset = sum(get_shard_size_list(self.n_head, dist.get_world_size())[0:dist.get_rank()]) + mask = mask[offset:num_heads_per_rank + offset, :seq_length_with_past, :seq_length_with_past] + + return mask + + def build_mpt_atten_bias_tensor(self, device, dtype, diff --git a/deepspeed/module_inject/fusedqkv_utils.py b/deepspeed/module_inject/fusedqkv_utils.py index 8616b3505488..d61e78ab8d0e 100644 --- a/deepspeed/module_inject/fusedqkv_utils.py +++ b/deepspeed/module_inject/fusedqkv_utils.py @@ -17,7 +17,7 @@ def split_by_qkvlist_and_refuse(qkv_list, split_size, split_dim=0, cat_dim=0): def require_tp_fused_qkvw(name, mp_size): - fused_qkvw_name_list = ['qkv_proj', 'query_key_value', 'attn.Wqkv'] + fused_qkvw_name_list = ['qkv_proj', 'query_key_value', 'attn.Wqkv', 'self_attn.W_pack'] if mp_size == 1: return False @@ -36,6 +36,8 @@ def prepare_tp_fused_qkvw(module_str, src, mp_size, gpu_index): 'GLMBlock': 'glmtype', "MPTBlock": 'glmtype', "MptBlock": 'glmtype', + "BaichuanLayer": 'glmtype', + "DecoderLayer": 'glmtype', } def _codegen_type_transpose(input, mp_size, codegen_mp_num=4): diff --git a/deepspeed/module_inject/replace_module.py b/deepspeed/module_inject/replace_module.py index e3cc64c4f37e..5b7d2209d89e 100644 --- a/deepspeed/module_inject/replace_module.py +++ b/deepspeed/module_inject/replace_module.py @@ -314,10 +314,13 @@ def set_lm_head(module): module.lm_head, "weight") and module.lm_head.weight.is_meta: module.lm_head.weight = embedding_weight # enable tensor parallel for the last linear - if hasattr(module, "lm_head") and hasattr(module.lm_head, "weight") and not module.lm_head.weight.is_meta: + if hasattr(module, "lm_head") and hasattr(module.lm_head, + "weight") and not module.lm_head.weight.is_meta and isinstance( + module.lm_head, torch.nn.Linear): module = replace_wo_policy(module, ("lm_head", ), 0, "lm_head") elif hasattr(module, "embed_out") and hasattr(module.embed_out, - "weight") and not module.embed_out.weight.is_meta: + "weight") and not module.embed_out.weight.is_meta and isinstance( + module.embed_out, torch.nn.Linear): module = replace_wo_policy(module, ("embed_out", ), 0, "embed_out") return module From 3f1c3c2ad3fe89651327aec8703b696331bdef47 Mon Sep 17 00:00:00 2001 From: Nadav Elyahu <88962733+nelyahu@users.noreply.github.com> Date: Mon, 18 Dec 2023 22:57:30 +0200 Subject: [PATCH 040/754] inference engine: check if accelerator supports FP16 (#4832) Co-authored-by: Michael Wyatt --- deepspeed/inference/engine.py | 3 +++ 1 file changed, 3 insertions(+) diff --git a/deepspeed/inference/engine.py b/deepspeed/inference/engine.py index 5fb5540dafa7..ccecc8376ad6 100755 --- a/deepspeed/inference/engine.py +++ b/deepspeed/inference/engine.py @@ -71,6 +71,9 @@ def __init__(self, model, config): if hasattr(self.module, "config"): TransformerPolicy.hf_model_config = self.module.config + if config.dtype == torch.half and not get_accelerator().is_fp16_supported(): + raise ValueError("Type fp16 is not supported.") + # todo: keep this self.injection_dict because we don't use to change config.injection_policy API # todo: this will get changed when Molly's PR on auto injection dict is merged self.injection_dict = config.injection_policy From a00bdde86a99e39f12699ecb25657724973a9cda Mon Sep 17 00:00:00 2001 From: Gavin Goodship Date: Mon, 18 Dec 2023 21:17:50 +0000 Subject: [PATCH 041/754] Update zeropp.md (#4835) Doc corrections --------- Co-authored-by: Michael Wyatt Co-authored-by: Michael Wyatt --- docs/_tutorials/zeropp.md | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/docs/_tutorials/zeropp.md b/docs/_tutorials/zeropp.md index 866bb9389e22..32080d1a16ad 100644 --- a/docs/_tutorials/zeropp.md +++ b/docs/_tutorials/zeropp.md @@ -10,8 +10,8 @@ We recommend that you read the tutorials on [Getting Started](/getting-started/) ## Three Components of ZeRO++ ZeRO++ consists of three key designs, namely quantized weights (*qwZ*), hiearchical partitioning ZeRO (*hpZ*), and quantized gradients (*qgZ*): - - *qwZ* applies block-based quantization to reduce ZeRO parameter all-gather communication volume by half from FP16 to INT8) - - *hpZ* eliminates inter-node backward parameter all-gather communication through data remapping and recomputation + - *qwZ* applies block-based quantization to reduce ZeRO parameter all-gather communication volume by half from FP16 to INT8. + - *hpZ* eliminates inter-node backward parameter all-gather communication through data remapping and recomputation. - *qgZ* replaces gradients allreduce collective with a new communication efficient all-to-all based quantized gradient averaging. Collectively, the three optimization reduces communication volume by 4x compared to ZeRO baseline. Each of the three components can be enabled independent of each other and collectively as a group as described in the next section. @@ -24,9 +24,9 @@ For this tutorial, we will configure a 18 billion parameter GPT-2 model using th ## Training a 18B parameter GPT-2 with ZeRO++ There are no change needed to the user code. However, since ZeRO++ extends ZeRO Stage 3 (ZeRO-3), appropriate flags need to be added to activate each or all of the three ZeRO++ communication collective optimizations. The three flags and their meanings and defaults and preferred values: - - zero_quantized_weights: Boolean indicating whether to use quantized zero weights (*qwZ*), default is false - - zero_hpz_partition_size: number of ranks in *hpZ* (secondary partition) group, default is 1 meaning no hpZ, ideal is number of ranks (gpus) per node - - zero_quantized_gradients: Boolean indicating whether to use quantized zero gradients (*qgZ*), default is false + - zero_quantized_weights: Boolean indicating whether to use quantized zero weights (*qwZ*), default is false. + - zero_hpz_partition_size: number of ranks in *hpZ* (secondary partition) group, default is 1 meaning no hpZ, ideal is number of ranks (gpus) per node. + - zero_quantized_gradients: Boolean indicating whether to use quantized zero gradients (*qgZ*), default is false. ### DeepSpeed Configuration Changes From 6d7b44a838548d2e1878439613e1fbc17ddcfaf0 Mon Sep 17 00:00:00 2001 From: minchao Date: Tue, 19 Dec 2023 11:09:10 +0800 Subject: [PATCH 042/754] [NPU] load EXPORT_ENV based on different accelerators to support multi-node training on other devices (#4830) Different hardwares may require different environment variables. To support multi-node training feature for NPU and other devices that rely on different env vars, I add a method `export_envs()` to each accelerator and load them in runner.py For works about NPU, see #4567 Co-authored-by: Olatunji Ruwase --- accelerator/abstract_accelerator.py | 4 ++++ accelerator/cpu_accelerator.py | 3 +++ accelerator/cuda_accelerator.py | 3 +++ accelerator/mps_accelerator.py | 3 +++ accelerator/npu_accelerator.py | 3 +++ deepspeed/launcher/runner.py | 7 ++++--- 6 files changed, 20 insertions(+), 3 deletions(-) diff --git a/accelerator/abstract_accelerator.py b/accelerator/abstract_accelerator.py index 0c7ee3212fad..7c1f463009b2 100644 --- a/accelerator/abstract_accelerator.py +++ b/accelerator/abstract_accelerator.py @@ -258,3 +258,7 @@ def get_op_builder(self, class_name): @abc.abstractmethod def build_extension(self): ... + + @abc.abstractmethod + def export_envs(self): + ... diff --git a/accelerator/cpu_accelerator.py b/accelerator/cpu_accelerator.py index 843e55ac3d20..05c4f6c650f0 100644 --- a/accelerator/cpu_accelerator.py +++ b/accelerator/cpu_accelerator.py @@ -280,3 +280,6 @@ def get_op_builder(self, class_name): def build_extension(self): from torch.utils.cpp_extension import BuildExtension return BuildExtension + + def export_envs(self): + return [] diff --git a/accelerator/cuda_accelerator.py b/accelerator/cuda_accelerator.py index 521cba6a5fdf..4b94ddb6865c 100644 --- a/accelerator/cuda_accelerator.py +++ b/accelerator/cuda_accelerator.py @@ -322,3 +322,6 @@ def get_op_builder(self, class_name): def build_extension(self): from torch.utils.cpp_extension import BuildExtension return BuildExtension + + def export_envs(self): + return ['NCCL'] diff --git a/accelerator/mps_accelerator.py b/accelerator/mps_accelerator.py index 300b224a7af8..f0d4cac721b5 100644 --- a/accelerator/mps_accelerator.py +++ b/accelerator/mps_accelerator.py @@ -235,3 +235,6 @@ def build_extension(self): from torch.utils.cpp_extension import BuildExtension return BuildExtension + + def export_envs(self): + return [] diff --git a/accelerator/npu_accelerator.py b/accelerator/npu_accelerator.py index 951bc26c197c..8bfd59cd2ad6 100644 --- a/accelerator/npu_accelerator.py +++ b/accelerator/npu_accelerator.py @@ -255,3 +255,6 @@ def get_op_builder(self, class_name): def build_extension(self): from torch.utils.cpp_extension import BuildExtension return BuildExtension + + def export_envs(self): + return ['ASCEND', 'HCCL', 'LD_LIBRARY', 'PATH'] diff --git a/deepspeed/launcher/runner.py b/deepspeed/launcher/runner.py index 4f45e1831b48..4aa25f4160a6 100755 --- a/deepspeed/launcher/runner.py +++ b/deepspeed/launcher/runner.py @@ -31,7 +31,7 @@ from deepspeed.accelerator import get_accelerator DLTS_HOSTFILE = "/job/hostfile" -EXPORT_ENVS = ['MLFLOW', 'NCCL', 'PYTHON', 'MV2', 'UCX'] +EXPORT_ENVS = ['MLFLOW', 'PYTHON', 'MV2', 'UCX'] EXPORT_ENVS += NEBULA_EXPORT_ENVS DEEPSPEED_ENVIRONMENT_NAME = os.getenv("DS_ENV_FILE", ".deepspeed_env") DEEPSPEED_ENVIRONMENT_PATHS = [os.path.expanduser("~"), '.'] @@ -544,9 +544,10 @@ def main(args=None): # key exists in launcher env -> var list should be used excluded_vars += var_list - exports = "" + # load envs from accelerator + exports = EXPORT_ENVS + get_accelerator().export_envs() for var in env.keys(): - if any([var.startswith(name) for name in EXPORT_ENVS]): + if any([var.startswith(name) for name in exports]): if not any([var == name for name in excluded_vars]): runner.add_export(var, env[var]) From 060a8e185a33bdd45cacc826f5e309a7e3675f8a Mon Sep 17 00:00:00 2001 From: Michael Wyatt Date: Wed, 20 Dec 2023 10:37:01 -0800 Subject: [PATCH 043/754] Add cuda_accelerator.py to triggers for A6000 test (#4848) --- .github/workflows/nv-a6000.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.github/workflows/nv-a6000.yml b/.github/workflows/nv-a6000.yml index de325cb20826..14bee75df334 100644 --- a/.github/workflows/nv-a6000.yml +++ b/.github/workflows/nv-a6000.yml @@ -3,6 +3,7 @@ name: nv-a6000 on: pull_request: paths: + - 'accelerator/cuda_accelerator.py' - 'deepspeed/inference/v2/**' - 'tests/unit/inference/v2/**' - '.github/workflows/nv-a6000.yml' From d5a7c1e0b494fbd0958bf8274bde0bacb2c16854 Mon Sep 17 00:00:00 2001 From: inkcherry Date: Thu, 21 Dec 2023 04:51:36 +0800 Subject: [PATCH 044/754] Capture short kernel sequences to graph (#4318) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit **Motivation:** 1. This is a series of cases where short kernel sequences are launched and executed serially(no dynamic shape), with the launch overhead being much higher than the execution overhead. We can use a graph to solve this problem. Compared to ```multi-tensor-apply```, using graph is more concise and only requires PyTorch as a dependency. 2. Some device software stacks also support lazy-mode PyTorch, enabling full utilization of the compiler to perform graph optimization. However, in lazy mode, operation accumulation time (host time) could become significantly higher compared to device time in such scenario, and devices are usually not well utilized. By using the same API(after adding to accelerator cc @delock ) with cuda graph, this issue could also be resolved. **Change:** We modified three functions, ```update_hp_grads```. Here, we executed the operations for the CPU and GPU separately because the graph is unable to record the execution of CPU operations. Additionally, the data input required by the graph must not have its address modified, or the address modification must be captured by the capture operation(In this case, set ```replay_first_step``` to ```True```). Therefore, we changed ```grad=None``` to ```grad.zero_()```. Similarly, we have also placed some inputs that require fixed addresses in the ```graph_cache``` For ```clip_tensors_by_global_norm```, ```clip_coef``` is a scalar with a non-fixed value, so it needs to be moved to the GPU when using a graph. For ```total_norm = sum ([t. data. float (). norm (norm_type). item () * * norm_type for t in input_tensors])```, ```item () ```, synchronous operation is also not supported by graph. We directly put the ```sum``` and ```* * norm_type``` on the GPU to execute the computation. Other similar scenarios can also use this ```graph_process()```, or a slightly modified version of ```graph_process()``` you can checkout [4abab21](https://github.com/microsoft/DeepSpeed/pull/4318/commits/4abab212c8f5aef1eec4f8abe10b4262bb5a5c8a) and set it to True here to do some benchmarking. https://github.com/microsoft/DeepSpeed/pull/4318/commits/4abab212c8f5aef1eec4f8abe10b4262bb5a5c8a#diff-f8f0b3feb55b0374615405e542c1c3e0f017982b177c46c562bf688532ac935cR42 --------- Co-authored-by: Olatunji Ruwase --- accelerator/abstract_accelerator.py | 13 ++++ accelerator/cpu_accelerator.py | 12 +++- accelerator/cuda_accelerator.py | 11 +++ accelerator/mps_accelerator.py | 11 +++ accelerator/npu_accelerator.py | 11 +++ deepspeed/inference/engine.py | 6 +- .../model_implementations/diffusers/unet.py | 7 +- .../model_implementations/diffusers/vae.py | 19 +++--- .../transformers/clip_encoder.py | 6 +- deepspeed/runtime/bf16_optimizer.py | 49 ++++++++----- deepspeed/runtime/config.py | 5 ++ deepspeed/runtime/constants.py | 12 ++++ deepspeed/runtime/engine.py | 6 +- deepspeed/runtime/utils.py | 68 ++++++++++++++++--- 14 files changed, 189 insertions(+), 47 deletions(-) diff --git a/accelerator/abstract_accelerator.py b/accelerator/abstract_accelerator.py index 7c1f463009b2..8ba652a8de92 100644 --- a/accelerator/abstract_accelerator.py +++ b/accelerator/abstract_accelerator.py @@ -193,6 +193,19 @@ def communication_backend_name(self): def is_triton_supported(self): ... + # Graph operations + @abc.abstractmethod + def create_graph(self): + ... + + @abc.abstractmethod + def capture_to_graph(self, graph, pool=None, stream=None): + ... + + @abc.abstractmethod + def replay_graph(self, graph): + ... + # Tensor operations @property @abc.abstractmethod diff --git a/accelerator/cpu_accelerator.py b/accelerator/cpu_accelerator.py index 05c4f6c650f0..a02777f5223b 100644 --- a/accelerator/cpu_accelerator.py +++ b/accelerator/cpu_accelerator.py @@ -198,8 +198,18 @@ def is_fp16_supported(self): def supported_dtypes(self): return [torch.float, torch.bfloat16] - # Tensor operations + # Graph operations + def create_graph(self): + return None + + def capture_to_graph(self, graph, pool=None, stream=None): + from deepspeed.runtime.utils import noop_context + return noop_context() + + def replay_graph(self, graph): + return + # Tensor operations @property def BFloat16Tensor(self): return torch.BFloat16Tensor diff --git a/accelerator/cuda_accelerator.py b/accelerator/cuda_accelerator.py index 4b94ddb6865c..2d74daecf3df 100644 --- a/accelerator/cuda_accelerator.py +++ b/accelerator/cuda_accelerator.py @@ -222,6 +222,17 @@ def is_triton_supported(self): else: return False + # Graph operations + def create_graph(self): + return torch.cuda.CUDAGraph() + + def capture_to_graph(self, graph, pool=None, stream=None): + return torch.cuda.graph(graph, pool, stream) + + def replay_graph(self, graph): + graph.replay() + return + # Tensor operations @property diff --git a/accelerator/mps_accelerator.py b/accelerator/mps_accelerator.py index f0d4cac721b5..f6303cf9890f 100644 --- a/accelerator/mps_accelerator.py +++ b/accelerator/mps_accelerator.py @@ -166,6 +166,17 @@ def communication_backend_name(self): def is_triton_supported(self): return False + # Graph operations + def create_graph(self): + return None + + def capture_to_graph(self, graph, pool=None, stream=None): + from deepspeed.runtime.utils import noop_context + return noop_context() + + def replay_graph(self, graph): + return + # Tensor operations @property def BFloat16Tensor(self): diff --git a/accelerator/npu_accelerator.py b/accelerator/npu_accelerator.py index 8bfd59cd2ad6..4e20445d9d32 100644 --- a/accelerator/npu_accelerator.py +++ b/accelerator/npu_accelerator.py @@ -176,6 +176,17 @@ def communication_backend_name(self): def is_triton_supported(self): return False + # Graph operations + def create_graph(self): + return None + + def capture_to_graph(self, graph, pool=None, stream=None): + from deepspeed.runtime.utils import noop_context + return noop_context() + + def replay_graph(self, graph): + return + # Tensor operations @property diff --git a/deepspeed/inference/engine.py b/deepspeed/inference/engine.py index ccecc8376ad6..5cdd99ff0b90 100755 --- a/deepspeed/inference/engine.py +++ b/deepspeed/inference/engine.py @@ -531,11 +531,11 @@ def _create_cuda_graph(self, *inputs, **kwargs): get_accelerator().current_stream().wait_stream(cuda_stream) # create cuda_graph and assign static_inputs and static_outputs - self._cuda_graphs = torch.cuda.CUDAGraph() + self._cuda_graphs = get_accelerator().create_graph() self.static_inputs = inputs self.static_kwargs = kwargs - with torch.cuda.graph(self._cuda_graphs): + with get_accelerator().capture_to_graph(self._cuda_graphs): self.static_output = self.module(*self.static_inputs, **self.static_kwargs) self.cuda_graph_created = True @@ -547,7 +547,7 @@ def _graph_replay(self, *inputs, **kwargs): for k in kwargs: if torch.is_tensor(kwargs[k]): self.static_kwargs[k].copy_(kwargs[k]) - self._cuda_graphs.replay() + get_accelerator().replay_graph(self._cuda_graphs) return self.static_output def model_times(self): diff --git a/deepspeed/model_implementations/diffusers/unet.py b/deepspeed/model_implementations/diffusers/unet.py index 7da571975958..8d5ddd95437a 100644 --- a/deepspeed/model_implementations/diffusers/unet.py +++ b/deepspeed/model_implementations/diffusers/unet.py @@ -4,6 +4,7 @@ # DeepSpeed Team import torch +from deepspeed.accelerator import get_accelerator from ..features.cuda_graph import CUDAGraph @@ -29,7 +30,7 @@ def _graph_replay(self, *inputs, **kwargs): for k in kwargs: if torch.is_tensor(kwargs[k]): self.static_kwargs[k].copy_(kwargs[k]) - self._cuda_graphs.replay() + get_accelerator().replay_graph(self._cuda_graphs) return self.static_output def forward(self, *inputs, **kwargs): @@ -53,11 +54,11 @@ def _create_cuda_graph(self, *inputs, **kwargs): torch.cuda.current_stream().wait_stream(cuda_stream) # create cuda_graph and assign static_inputs and static_outputs - self._cuda_graphs = torch.cuda.CUDAGraph() + self._cuda_graphs = get_accelerator().create_graph() self.static_inputs = inputs self.static_kwargs = kwargs - with torch.cuda.graph(self._cuda_graphs): + with get_accelerator().capture_to_graph(self._cuda_graphs): self.static_output = self._forward(*self.static_inputs, **self.static_kwargs) self.cuda_graph_created = True diff --git a/deepspeed/model_implementations/diffusers/vae.py b/deepspeed/model_implementations/diffusers/vae.py index 05084f1b985a..ce50ade647a8 100644 --- a/deepspeed/model_implementations/diffusers/vae.py +++ b/deepspeed/model_implementations/diffusers/vae.py @@ -4,6 +4,7 @@ # DeepSpeed Team import torch +from deepspeed.accelerator import get_accelerator from ..features.cuda_graph import CUDAGraph @@ -27,7 +28,7 @@ def _graph_replay_decoder(self, *inputs, **kwargs): for k in kwargs: if torch.is_tensor(kwargs[k]): self.static_decoder_kwargs[k].copy_(kwargs[k]) - self._decoder_cuda_graph.replay() + get_accelerator().replay_graph(self._decoder_cuda_graph) return self.static_decoder_output def _decode(self, x, return_dict=True, generator=None): @@ -43,11 +44,11 @@ def _create_cuda_graph_decoder(self, *inputs, **kwargs): torch.cuda.current_stream().wait_stream(cuda_stream) # create cuda_graph and assign static_inputs and static_outputs - self._decoder_cuda_graph = torch.cuda.CUDAGraph() + self._decoder_cuda_graph = get_accelerator().create_graph() self.static_decoder_inputs = inputs self.static_decoder_kwargs = kwargs - with torch.cuda.graph(self._decoder_cuda_graph): + with get_accelerator().capture_to_graph(self._decoder_cuda_graph): self.static_decoder_output = self._decode(*self.static_decoder_inputs, **self.static_decoder_kwargs) self.decoder_cuda_graph_created = True @@ -70,7 +71,7 @@ def _graph_replay_encoder(self, *inputs, **kwargs): for k in kwargs: if torch.is_tensor(kwargs[k]): self.static_encoder_kwargs[k].copy_(kwargs[k]) - self._encoder_cuda_graph.replay() + get_accelerator().replay_graph(self._encoder_cuda_graph) return self.static_encoder_output def _encode(self, x, return_dict=True): @@ -86,11 +87,11 @@ def _create_cuda_graph_encoder(self, *inputs, **kwargs): torch.cuda.current_stream().wait_stream(cuda_stream) # create cuda_graph and assign static_inputs and static_outputs - self._encoder_cuda_graph = torch.cuda.CUDAGraph() + self._encoder_cuda_graph = get_accelerator().create_graph() self.static_encoder_inputs = inputs self.static_encoder_kwargs = kwargs - with torch.cuda.graph(self._encoder_cuda_graph): + with get_accelerator().capture_to_graph(self._encoder_cuda_graph): self.static_encoder_output = self._encode(*self.static_encoder_inputs, **self.static_encoder_kwargs) self.encoder_cuda_graph_created = True @@ -113,7 +114,7 @@ def _graph_replay(self, *inputs, **kwargs): for k in kwargs: if torch.is_tensor(kwargs[k]): self.static_kwargs[k].copy_(kwargs[k]) - self._all_cuda_graph.replay() + get_accelerator().replay_graph(self._all_cuda_graph) return self.static_output def forward(self, *inputs, **kwargs): @@ -137,11 +138,11 @@ def _create_cuda_graph(self, *inputs, **kwargs): torch.cuda.current_stream().wait_stream(cuda_stream) # create cuda_graph and assign static_inputs and static_outputs - self._all_cuda_graph = torch.cuda.CUDAGraph() + self._all_cuda_graph = get_accelerator().create_graph() self.static_inputs = inputs self.static_kwargs = kwargs - with torch.cuda.graph(self._all_cuda_graph): + with get_accelerator().capture_to_graph(self._all_cuda_graph): self.static_output = self._forward(*self.static_inputs, **self.static_kwargs) self.all_cuda_graph_created = True diff --git a/deepspeed/model_implementations/transformers/clip_encoder.py b/deepspeed/model_implementations/transformers/clip_encoder.py index 8d9291896986..848a5b48dcf1 100644 --- a/deepspeed/model_implementations/transformers/clip_encoder.py +++ b/deepspeed/model_implementations/transformers/clip_encoder.py @@ -38,7 +38,7 @@ def _graph_replay(self, *inputs, **kwargs): for k in kwargs: if torch.is_tensor(kwargs[k]): self.static_kwargs[self.iter][k].copy_(kwargs[k]) - self._cuda_graphs[self.iter].replay() + get_accelerator().replay_graph(self._cuda_graphs[self.iter]) return self.static_output[self.iter] def forward(self, *inputs, **kwargs): @@ -63,11 +63,11 @@ def _create_cuda_graph(self, *inputs, **kwargs): torch.cuda.current_stream().wait_stream(cuda_stream) # create cuda_graph and assign static_inputs and static_outputs - self._cuda_graphs[self.iter] = torch.cuda.CUDAGraph() + self._cuda_graphs[self.iter] = get_accelerator().create_graph() self.static_inputs[self.iter] = inputs self.static_kwargs[self.iter] = kwargs - with torch.cuda.graph(self._cuda_graphs[self.iter]): + with get_accelerator().capture_to_graph(self._cuda_graphs[self.iter]): self.static_output[self.iter] = self._forward(*self.static_inputs[self.iter], **self.static_kwargs[self.iter]) diff --git a/deepspeed/runtime/bf16_optimizer.py b/deepspeed/runtime/bf16_optimizer.py index 888505279290..0aefd1946c36 100644 --- a/deepspeed/runtime/bf16_optimizer.py +++ b/deepspeed/runtime/bf16_optimizer.py @@ -16,7 +16,7 @@ from deepspeed.git_version_info import version from deepspeed.runtime.utils import (get_global_norm_of_tensors, clip_tensors_by_global_norm, DummyOptim, align_dense_tensors, all_gather_dp_groups, bwc_tensor_model_parallel_rank, - is_model_parallel_parameter, see_memory_usage) + is_model_parallel_parameter, see_memory_usage, graph_process) from deepspeed.utils import link_hp_params, fragment_address from deepspeed.checkpoint import enable_universal_checkpoint @@ -38,7 +38,8 @@ def __init__(self, allgather_bucket_size=5000000000, dp_process_group=None, timers=None, - grad_acc_dtype=None): + grad_acc_dtype=None, + graph_harvesting=False): super().__init__() see_memory_usage('begin bf16_optimizer', force=True) self.timers = timers @@ -81,7 +82,7 @@ def __init__(self, self.fp32_groups_has_gradients = [] self.group_paddings = [] - + self.graph_harvesting = graph_harvesting if self.using_real_optimizer: self._setup_for_real_optimizer() @@ -248,7 +249,8 @@ def step(self, closure=None): all_groups_norm = get_global_norm_of_tensors(input_tensors=self.get_grads_for_norm(), mpu=self.mpu, - norm_type=self.norm_type) + norm_type=self.norm_type, + use_graph=self.graph_harvesting) self._global_grad_norm = all_groups_norm assert all_groups_norm > 0. @@ -256,7 +258,8 @@ def step(self, closure=None): clip_tensors_by_global_norm(input_tensors=self.get_grads_for_norm(for_clipping=True), max_norm=self.clip_grad, global_norm=all_groups_norm, - mpu=self.mpu) + mpu=self.mpu, + use_graph=self.graph_harvesting) self.optimizer.step() @@ -281,23 +284,33 @@ def backward(self, loss, update_hp_grads=True, clear_lp_grads=False, **bwd_kwarg @torch.no_grad() def update_hp_grads(self, clear_lp_grads=False): + + def _update_hp_grads_func(clear_lp_grads=False): + for i, group in enumerate(self.bf16_groups): + for j, lp in enumerate(group): + if lp.grad is None: + continue + hp_grad = self.fp32_groups_gradients[i][j] + assert hp_grad is not None, \ + f'high precision param has no gradient, lp param_id = {id(lp)} group_info = [{i}][{j}]' + hp_grad.data.add_(lp.grad.data.to(hp_grad.dtype).view(hp_grad.shape)) + lp._hp_grad = hp_grad + self.fp32_groups_has_gradients[i][j] = True + # clear gradients + if clear_lp_grads: + lp.grad._zero() + + if self.graph_harvesting: + graph_process(False, _update_hp_grads_func, clear_lp_grads) + else: + _update_hp_grads_func(clear_lp_grads) + #cpu op for i, group in enumerate(self.bf16_groups): for j, lp in enumerate(group): if lp.grad is None: continue - - hp_grad = self.fp32_groups_gradients[i][j] - assert hp_grad is not None, \ - f'high precision param has no gradient, lp param_id = {id(lp)} group_info = [{i}][{j}]' - - hp_grad.data.add_(lp.grad.data.to(hp_grad.dtype).view(hp_grad.shape)) - lp._hp_grad = hp_grad self.fp32_groups_has_gradients[i][j] = True - # clear gradients - if clear_lp_grads: - lp.grad = None - @torch.no_grad() def get_grads_for_reduction(self): return self.fp32_groups_gradients_flat @@ -348,7 +361,9 @@ def clear_hp_grads(self): def clear_lp_grads(self): for group in self.bf16_groups: for param in group: - param.grad = None + if param.grad is not None: + # Using zero_() fixed memory address for graph replay + param.grad.zero_() def state_dict(self): state_dict = {} diff --git a/deepspeed/runtime/config.py b/deepspeed/runtime/config.py index b49469b94f11..80754df50c20 100755 --- a/deepspeed/runtime/config.py +++ b/deepspeed/runtime/config.py @@ -279,6 +279,10 @@ def get_gradient_clipping(param_dict): return get_scalar_param(param_dict, GRADIENT_CLIPPING, GRADIENT_CLIPPING_DEFAULT) +def get_graph_harvesting(param_dict): + return get_scalar_param(param_dict, GRAPH_HARVESTING, GRAPH_HARVESTING_DEFAULT) + + def get_sparse_attention(param_dict): if SPARSE_ATTENTION in param_dict.keys(): sparsity = param_dict[SPARSE_ATTENTION] @@ -823,6 +827,7 @@ def _initialize_params(self, param_dict): self.dynamic_loss_scale_args = get_dynamic_loss_scale_args(param_dict) self.compression_config = get_compression_config(param_dict) + self.graph_harvesting = get_graph_harvesting(param_dict) self.optimizer_name = get_optimizer_name(param_dict) if (self.optimizer_name is not None and self.optimizer_name.lower() in DEEPSPEED_OPTIMIZERS): diff --git a/deepspeed/runtime/constants.py b/deepspeed/runtime/constants.py index 96f2a38bd05c..82d8a0557a41 100755 --- a/deepspeed/runtime/constants.py +++ b/deepspeed/runtime/constants.py @@ -210,6 +210,18 @@ GRADIENT_CLIPPING = 'gradient_clipping' GRADIENT_CLIPPING_DEFAULT = 0. +######################################### +# Capture graph for short kernels sequences +######################################### +# Graph harvesting. By default, this feature is not enabled. +# Users can configure in ds_config.json as below example: +GRAPH_HARVESTING_FORMAT = ''' +Graph harvesting should be enabled as: +"graph_harvesting": true +''' +GRAPH_HARVESTING = 'graph_harvesting' +GRAPH_HARVESTING_DEFAULT = False + ######################################### # Communication data type ######################################### diff --git a/deepspeed/runtime/engine.py b/deepspeed/runtime/engine.py index c5f4d3e6530d..a8cd4fffcce9 100644 --- a/deepspeed/runtime/engine.py +++ b/deepspeed/runtime/engine.py @@ -770,6 +770,9 @@ def zero_legacy_stage1(self): def zero_ignore_unused_parameters(self): return self._config.zero_config.ignore_unused_parameters + def graph_harvesting(self): + return self._config.graph_harvesting + def fp16_enabled(self): return self._config.fp16_enabled @@ -1451,7 +1454,8 @@ def _configure_bf16_optimizer(self, optimizer): allgather_bucket_size=self.zero_allgather_bucket_size(), dp_process_group=self.seq_data_parallel_group, timers=timers, - grad_acc_dtype=self.get_data_types()[1]) + grad_acc_dtype=self.get_data_types()[1], + graph_harvesting=self.graph_harvesting()) return optimizer diff --git a/deepspeed/runtime/utils.py b/deepspeed/runtime/utils.py index bc7a782e590c..82f200fccf9f 100755 --- a/deepspeed/runtime/utils.py +++ b/deepspeed/runtime/utils.py @@ -47,6 +47,27 @@ def __init__(self, params): self.param_groups.append({'params': params}) +graph_cache = {} + + +def graph_process(replay_first_step, func, *args, **kwargs): + # `func` should only contain operations on the GPU + # Please ensure that the memory address of the data required by 'func' remains constant + if func.__name__ not in graph_cache: + cuda_stream = get_accelerator().Stream() + cuda_stream.wait_stream(get_accelerator().current_stream()) + with get_accelerator().stream(cuda_stream): + func(*args, **kwargs) + get_accelerator().current_stream().wait_stream(cuda_stream) + graph_cache[func.__name__] = get_accelerator().create_graph() + with get_accelerator().capture_to_graph(graph_cache[func.__name__]): + func(*args, **kwargs) + if replay_first_step: + get_accelerator().replay_graph(graph_cache[func.__name__]) + else: + get_accelerator().replay_graph(graph_cache[func.__name__]) + + def noop_decorator(func): return func @@ -831,7 +852,7 @@ def clip_gradients(parameters, max_norm=1.0, global_grad_norm=None, mpu=None, ep return global_grad_norm -def get_global_norm_of_tensors(input_tensors, norm_type=2, mpu=None): +def get_global_norm_of_tensors(input_tensors, norm_type=2, mpu=None, use_graph=False): """Get norm of an iterable of tensors. This is adapted from torch.nn.utils.clip_grad.clip_grad_norm_ and @@ -845,7 +866,6 @@ def get_global_norm_of_tensors(input_tensors, norm_type=2, mpu=None): Returns: Total norm of the tensors (viewed as a single vector). """ - assert isinstance(input_tensors, Iterable), f'expected Iterable type not {type(input_tensors)}' assert all([torch.is_tensor(t) for t in input_tensors]), f'expected list of only tensors' @@ -857,8 +877,24 @@ def get_global_norm_of_tensors(input_tensors, norm_type=2, mpu=None): dist.all_reduce(total_norm_cuda, op=dist.ReduceOp.MAX, group=mpu.get_model_parallel_group()) total_norm = total_norm_cuda[0].item() else: - total_norm = sum([t.data.float().norm(norm_type).item()**norm_type for t in input_tensors]) - total_norm_cuda = get_accelerator().FloatTensor([float(total_norm)]) + if use_graph: + if 'norm_tensors_compute_buffer' not in graph_cache: + graph_cache['norm_tensors_compute_buffer'] = [t.data.float().norm(norm_type) for t in input_tensors] + compute_buffer = graph_cache['norm_tensors_compute_buffer'] + + def _norm_tensors(tensor_list, _compute_buffer, _norm_type): + for i, t in enumerate(tensor_list): + _compute_buffer[i].data.copy_(t.data.float().norm(_norm_type)**_norm_type) + if i != 0: + _compute_buffer[0].data.add_(_compute_buffer[i].data) + + graph_process(False, _norm_tensors, input_tensors, compute_buffer, norm_type) + + total_norm = compute_buffer[0] + else: + total_norm = sum([t.data.float().norm(norm_type).item()**norm_type for t in input_tensors]) + + total_norm_cuda = get_accelerator().FloatTensor([float(total_norm)]).detach() if mpu is not None: dist.all_reduce(total_norm_cuda, op=dist.ReduceOp.SUM, group=mpu.get_model_parallel_group()) total_norm = total_norm_cuda[0].item()**(1. / norm_type) @@ -869,7 +905,7 @@ def get_global_norm_of_tensors(input_tensors, norm_type=2, mpu=None): return total_norm -def clip_tensors_by_global_norm(input_tensors, max_norm=1.0, global_norm=None, mpu=None, eps=1e-6): +def clip_tensors_by_global_norm(input_tensors, max_norm=1.0, global_norm=None, mpu=None, eps=1e-6, use_graph=False): """Clip list of tensors by global norm. Args: input_tensors: List of tensors to be clipped @@ -880,14 +916,26 @@ def clip_tensors_by_global_norm(input_tensors, max_norm=1.0, global_norm=None, m float: the global norm """ if global_norm is None: - global_norm = get_global_norm_of_tensors(input_tensors, mpu=mpu) - + global_norm = get_global_norm_of_tensors(input_tensors, mpu=mpu, use_graph=use_graph) clip_coef = max_norm / (global_norm + eps) - if clip_coef < 1: - for t in input_tensors: - t.detach().mul_(clip_coef) + if use_graph: + def clip_tensors(_tensor_list, _clip_coef_tensor): + for t in _tensor_list: + t.detach().mul_(_clip_coef_tensor) + + if 'clip_coef_tensor' not in graph_cache: + # Alloc memory + graph_cache['clip_coef_tensor'] = torch.tensor(clip_coef, + dtype=torch.float32).to(get_accelerator().device_name()) + clip_coef_tensor = graph_cache['clip_coef_tensor'] + clip_coef_tensor.copy_(torch.tensor(clip_coef, dtype=torch.float32)) + graph_process(False, clip_tensors, input_tensors, clip_coef_tensor) + + else: + for t in input_tensors: + t.detach().mul_(clip_coef) return global_norm From 9e455d76516e785cbaf058d351b6a78d02c42ed8 Mon Sep 17 00:00:00 2001 From: Max Kovalenko <75629718+deepcharm@users.noreply.github.com> Date: Wed, 20 Dec 2023 23:52:31 +0200 Subject: [PATCH 045/754] Checkpointing: Avoid assigning tensor storage with different device (#4836) On some back-ends, assigning tensor.data to a storage being on a different device than the tensor is not supported. The fix is to save the storage in a temp data member and restore tensor.data when needed. Co-authored-by: Olatunji Ruwase --- .../activation_checkpointing/checkpointing.py | 13 +++++++++++-- 1 file changed, 11 insertions(+), 2 deletions(-) diff --git a/deepspeed/runtime/activation_checkpointing/checkpointing.py b/deepspeed/runtime/activation_checkpointing/checkpointing.py index 772d23f2d0ac..02e0b197e927 100644 --- a/deepspeed/runtime/activation_checkpointing/checkpointing.py +++ b/deepspeed/runtime/activation_checkpointing/checkpointing.py @@ -439,7 +439,9 @@ def get_partitioned_activations_for_backward(args, inputs, contiguous_checkpoint num_non_fp_tensors += 1 continue - arg.data = inp.data + arg.data = torch.empty([], device=arg.device).data + arg.saved_data = inp.data + new_args.append(arg) i = arg_index - num_non_fp_tensors @@ -472,7 +474,8 @@ def get_cpu_activations_for_backward(args, inputs): new_args.append(arg) continue - arg.data = inp.data + arg.data = torch.empty([], device=arg.device).data + arg.saved_data = inp.data new_args.append(arg) return new_args @@ -628,6 +631,12 @@ def backward(ctx, *grads): global cuda_device, transport_stream, PARTITION_ACTIVATIONS + # Rebuild deepspeed_saved_tensors + for t in ctx.deepspeed_saved_tensors: + if t is not None and hasattr(t, 'saved_data') and t.saved_data is not None: + t.data = t.saved_data.to(t.device) + t.saved_data = None + if PARTITION_ACTIVATIONS: # with get_accelerator().stream(transport_stream): inputs = gather_partitioned_activations(ctx.deepspeed_saved_tensors, From 18643914bb5b4be9150711fa26abddc2de4641e7 Mon Sep 17 00:00:00 2001 From: Nadav Elyahu <88962733+nelyahu@users.noreply.github.com> Date: Thu, 21 Dec 2023 01:39:50 +0200 Subject: [PATCH 046/754] engine.py: remove unused _curr_save_path (#4844) Co-authored-by: Michael Wyatt --- deepspeed/runtime/engine.py | 1 - 1 file changed, 1 deletion(-) diff --git a/deepspeed/runtime/engine.py b/deepspeed/runtime/engine.py index a8cd4fffcce9..9c9641a1c4cf 100644 --- a/deepspeed/runtime/engine.py +++ b/deepspeed/runtime/engine.py @@ -3212,7 +3212,6 @@ def _save_moe_checkpoint(self, save_dir, tag, client_state={}, exclude_frozen_pa state.update(client_state) logger.info(f'Saving model checkpoint: {save_path}') self.checkpoint_engine.save(state, save_path) - self._curr_save_path = None def _create_checkpoint_file(self, save_dir, tag, zero_checkpoint): name_function = (self._get_zero_ckpt_name if zero_checkpoint else self._get_ckpt_name) From c00388a2ef933f243b28d89bafb1b329d72557ad Mon Sep 17 00:00:00 2001 From: Connor Holmes Date: Wed, 20 Dec 2023 16:05:26 -0800 Subject: [PATCH 047/754] Mixtral FastGen Support (#4828) Adds support for Mixtral with FastGen. Key features implemented: 1. Top-2 MoE support 2. Better support for RoPE thetas 3. The mistral model implementation --------- Co-authored-by: Michael Wyatt --- .../v2/checkpoint/huggingface_engine.py | 2 +- deepspeed/inference/v2/engine_factory.py | 7 + .../v2/kernels/ragged_ops/__init__.py | 2 +- .../kernels/ragged_ops/includes/top_k_utils.h | 15 + .../blocked_kv_rotary.cpp | 4 + .../blocked_kv_rotary.cu | 26 +- .../blocked_kv_rotary.cuh | 1 + .../blocked_kv_rotary.h | 1 + .../blocked_kv_rotary.py | 12 +- .../ragged_ops/moe_gather/moe_gather.cpp | 10 +- .../ragged_ops/moe_gather/moe_gather.cu | 107 +++++-- .../ragged_ops/moe_gather/moe_gather.cuh | 2 + .../ragged_ops/moe_gather/moe_gather.h | 3 +- .../ragged_ops/moe_gather/moe_gather.py | 9 +- .../ragged_ops/moe_scatter/moe_scatter.cpp | 7 +- .../ragged_ops/moe_scatter/moe_scatter.cu | 188 ++++++------ .../ragged_ops/moe_scatter/moe_scatter.cuh | 1 + .../ragged_ops/moe_scatter/moe_scatter.py | 8 +- .../v2/kernels/ragged_ops/ragged_ops.cpp | 6 +- .../__init__.py | 2 +- .../top_k_gating.cpp} | 26 +- .../top_k_gating.cu} | 69 +++-- .../top_k_gating.cuh} | 3 +- .../top_k_gating.h} | 4 +- .../top_k_gating.py} | 14 +- .../v2/model_implementations/__init__.py | 1 + .../common_parameters/moe_parameters.py | 23 +- .../model_implementations/falcon/__init__.py | 2 +- .../{falcon_containers.py => container.py} | 4 +- .../falcon/{falcon_model.py => model.py} | 4 +- .../falcon/{falcon_policy.py => policy.py} | 8 +- .../inference_transformer_base.py | 20 +- .../llama_v2/__init__.py | 2 +- .../{llama_v2_containers.py => container.py} | 4 +- .../llama_v2/{llama_v2_model.py => model.py} | 29 +- .../{llama_v2_policy.py => policy.py} | 6 +- .../v2/model_implementations/mistral/model.py | 25 +- .../model_implementations/mistral/policy.py | 8 +- .../model_implementations/mixtral/__init__.py | 6 + .../mixtral/container.py | 46 +++ .../v2/model_implementations/mixtral/model.py | 274 ++++++++++++++++++ .../model_implementations/mixtral/policy.py | 31 ++ .../v2/model_implementations/opt/container.py | 4 +- .../v2/model_implementations/opt/model.py | 3 +- .../v2/model_implementations/opt/policy.py | 6 +- .../inference/v2/modules/configs/__init__.py | 7 +- .../v2/modules/configs/attention_configs.py | 24 +- .../v2/modules/configs/moe_config.py | 6 + .../attention/dense_blocked_attention.py | 20 +- .../implementations/moe/cutlass_multi_gemm.py | 88 ++++-- op_builder/ragged_ops.py | 7 +- .../v2/kernels/ragged_ops/test_moe_gather.py | 67 ++++- .../v2/kernels/ragged_ops/test_moe_scatter.py | 69 +++-- ...t_top_1_gating.py => test_top_k_gating.py} | 83 +++++- .../parameters/test_parameter_list.py | 2 +- .../inference/v2/modules/test_blocked_attn.py | 11 +- .../inference/v2/modules/test_cutlass_moe.py | 114 ++++++++ 57 files changed, 1193 insertions(+), 340 deletions(-) create mode 100644 deepspeed/inference/v2/kernels/ragged_ops/includes/top_k_utils.h rename deepspeed/inference/v2/kernels/ragged_ops/{top_1_gating => top_k_gating}/__init__.py (69%) rename deepspeed/inference/v2/kernels/ragged_ops/{top_1_gating/top_1_gating.cpp => top_k_gating/top_k_gating.cpp} (67%) rename deepspeed/inference/v2/kernels/ragged_ops/{top_1_gating/top_1_gating.cu => top_k_gating/top_k_gating.cu} (59%) rename deepspeed/inference/v2/kernels/ragged_ops/{top_1_gating/top_1_gating.cuh => top_k_gating/top_k_gating.cuh} (87%) rename deepspeed/inference/v2/kernels/ragged_ops/{top_1_gating/top_1_gating.h => top_k_gating/top_k_gating.h} (86%) rename deepspeed/inference/v2/kernels/ragged_ops/{top_1_gating/top_1_gating.py => top_k_gating/top_k_gating.py} (87%) rename deepspeed/inference/v2/model_implementations/falcon/{falcon_containers.py => container.py} (97%) rename deepspeed/inference/v2/model_implementations/falcon/{falcon_model.py => model.py} (98%) rename deepspeed/inference/v2/model_implementations/falcon/{falcon_policy.py => policy.py} (74%) rename deepspeed/inference/v2/model_implementations/llama_v2/{llama_v2_containers.py => container.py} (95%) rename deepspeed/inference/v2/model_implementations/llama_v2/{llama_v2_model.py => model.py} (83%) rename deepspeed/inference/v2/model_implementations/llama_v2/{llama_v2_policy.py => policy.py} (76%) create mode 100644 deepspeed/inference/v2/model_implementations/mixtral/__init__.py create mode 100644 deepspeed/inference/v2/model_implementations/mixtral/container.py create mode 100644 deepspeed/inference/v2/model_implementations/mixtral/model.py create mode 100644 deepspeed/inference/v2/model_implementations/mixtral/policy.py rename tests/unit/inference/v2/kernels/ragged_ops/{test_top_1_gating.py => test_top_k_gating.py} (51%) diff --git a/deepspeed/inference/v2/checkpoint/huggingface_engine.py b/deepspeed/inference/v2/checkpoint/huggingface_engine.py index 6b64ed3185a2..ca9fb113b15a 100644 --- a/deepspeed/inference/v2/checkpoint/huggingface_engine.py +++ b/deepspeed/inference/v2/checkpoint/huggingface_engine.py @@ -61,7 +61,7 @@ def model_has_safetensors(model_name_or_path: str) -> bool: # We need to download the checkpoint files from HF if model_has_safetensors(self.model_name_or_path): # Prioritize downloading safetensors if they are available - allow_patterns = ["*.safetensors", "*.json", "*.pt"] + allow_patterns = ["*.safetensors", "*.json"] else: # Fallback to bin files when safetensors are not present allow_patterns = ["*.bin", "*.json", "*.pt"] diff --git a/deepspeed/inference/v2/engine_factory.py b/deepspeed/inference/v2/engine_factory.py index 9558125ff934..a0dc050bbbf9 100644 --- a/deepspeed/inference/v2/engine_factory.py +++ b/deepspeed/inference/v2/engine_factory.py @@ -17,6 +17,7 @@ OPTPolicy, Llama2Policy, MistralPolicy, + MixtralPolicy, FalconPolicy, ) from .model_implementations.inference_policy_base import POLICIES, InferenceV2Policy @@ -105,6 +106,12 @@ def build_hf_engine(path: str, assert version.parse(transformers.__version__) >= version.parse("4.34.0"), \ f"Mistral requires transformers >= 4.34.0, you have version {transformers.__version__}" policy = MistralPolicy(model_config, checkpoint_engine=checkpoint_engine) + elif model_config.model_type == "mixtral": + # Ensure we're using the correct version of transformers for mistral + import transformers + assert version.parse(transformers.__version__) >= version.parse("4.36.1"), \ + f"Mistral requires transformers >= 4.36.1, you have version {transformers.__version__}" + policy = MixtralPolicy(model_config, checkpoint_engine=checkpoint_engine) elif model_config.model_type == "falcon": policy = FalconPolicy(model_config, checkpoint_engine=checkpoint_engine) else: diff --git a/deepspeed/inference/v2/kernels/ragged_ops/__init__.py b/deepspeed/inference/v2/kernels/ragged_ops/__init__.py index 988152b2e7c0..38a4ebd6fba3 100644 --- a/deepspeed/inference/v2/kernels/ragged_ops/__init__.py +++ b/deepspeed/inference/v2/kernels/ragged_ops/__init__.py @@ -10,4 +10,4 @@ from .logits_gather import * from .moe_gather import * from .moe_scatter import * -from .top_1_gating import * +from .top_k_gating import * diff --git a/deepspeed/inference/v2/kernels/ragged_ops/includes/top_k_utils.h b/deepspeed/inference/v2/kernels/ragged_ops/includes/top_k_utils.h new file mode 100644 index 000000000000..abb9e15f8f6f --- /dev/null +++ b/deepspeed/inference/v2/kernels/ragged_ops/includes/top_k_utils.h @@ -0,0 +1,15 @@ +// Copyright (c) Microsoft Corporation. +// SPDX-License-Identifier: Apache-2.0 + +// DeepSpeed Team + +#define TOP_K_SWITCH(N_TOP_K, ...) \ + [&] { \ + if (1 == N_TOP_K) { \ + constexpr int CONST_TOP_K = 1; \ + __VA_ARGS__(); \ + } else if (2 == N_TOP_K) { \ + constexpr int CONST_TOP_K = 2; \ + __VA_ARGS__(); \ + } \ + }() diff --git a/deepspeed/inference/v2/kernels/ragged_ops/linear_blocked_kv_rotary/blocked_kv_rotary.cpp b/deepspeed/inference/v2/kernels/ragged_ops/linear_blocked_kv_rotary/blocked_kv_rotary.cpp index 8493bbf4b9af..a640c2b30164 100644 --- a/deepspeed/inference/v2/kernels/ragged_ops/linear_blocked_kv_rotary/blocked_kv_rotary.cpp +++ b/deepspeed/inference/v2/kernels/ragged_ops/linear_blocked_kv_rotary/blocked_kv_rotary.cpp @@ -13,6 +13,7 @@ (C_TYPE*)k.data_ptr(), \ (C_TYPE*)v.data_ptr(), \ (C_TYPE*)inv_freq_ptr, \ + theta_base, \ batch_wrapper, \ qkv_stride, \ kv_cache_stride, \ @@ -51,6 +52,8 @@ void kv_trained_rotary_embeddings(torch::Tensor& kv_cache, TORCH_CHECK(n_tokens == k.size(0)); TORCH_CHECK(n_tokens == v.size(0)); + const float theta_base = 0.f; + // Dimensions const int32_t block_size = kv_cache.size(1); const int32_t n_kv_heads = kv_cache.size(3); @@ -91,6 +94,7 @@ void kv_rotary_embeddings(torch::Tensor& kv_cache, torch::Tensor& q, torch::Tensor& k, torch::Tensor& v, + const float theta_base, torch::Tensor& batch_metadata, torch::Tensor& seq_metadata, torch::Tensor& tokens_to_seq, diff --git a/deepspeed/inference/v2/kernels/ragged_ops/linear_blocked_kv_rotary/blocked_kv_rotary.cu b/deepspeed/inference/v2/kernels/ragged_ops/linear_blocked_kv_rotary/blocked_kv_rotary.cu index 980334f02b0b..5dd79f0c636a 100644 --- a/deepspeed/inference/v2/kernels/ragged_ops/linear_blocked_kv_rotary/blocked_kv_rotary.cu +++ b/deepspeed/inference/v2/kernels/ragged_ops/linear_blocked_kv_rotary/blocked_kv_rotary.cu @@ -27,6 +27,7 @@ __global__ void kv_rotary_pos_kernel(T* kv_cache, T* k, T* v, const T* inv_freq, + const float theta_base, const BatchWrapperCPP batch_desc, const int qkv_stride, const int kv_cache_stride, @@ -114,7 +115,7 @@ __global__ void kv_rotary_pos_kernel(T* kv_cache, // Conversion to T and back means that both branches of this if statement // will produce the same results if using the same algo for producing the // freqs. - T trunc_freq = conversion::to(1.0 / powf(10000.0, inv_freq_flt)); + T trunc_freq = conversion::to(1.0 / powf(theta_base, inv_freq_flt)); inv_freq_flt = conversion::to(trunc_freq) * (float)global_token_idx; } @@ -158,7 +159,7 @@ __global__ void kv_rotary_pos_kernel(T* kv_cache, } else { inv_freq_flt = (float)((head_neuron_idx % half_head_size) * 2) / (float)headSize; - inv_freq_flt = 1.0 / powf(10000.0, inv_freq_flt) * (float)global_token_idx; + inv_freq_flt = 1.0 / powf(theta_base, inv_freq_flt) * (float)global_token_idx; } float rotary_sign = (head_neuron_idx >= half_head_size) ? -1.0f : 1.0f; @@ -186,6 +187,7 @@ __global__ void kv_rotary_pos_kernel(T* kv_cache, k, \ v, \ inv_freq, \ + theta_base, \ batch_desc, \ qkv_stride, \ kv_cache_stride, \ @@ -198,6 +200,7 @@ void launch_kv_rotary_kernel(T* kv_cache, T* k, T* v, T* inv_freq, + const float theta_base, const BatchWrapperCPP batch_desc, const int qkv_stride, const int kv_cache_stride, @@ -245,6 +248,7 @@ void launch_kv_rotary_kernel(T* kv_cache, TYPE * k, \ TYPE * v, \ TYPE * inv_freq, \ + const float theta_base, \ const BatchWrapperCPP batch_desc, \ const int qkv_stride, \ const int kv_cache_stride, \ @@ -262,10 +266,20 @@ INSTANTIATE_KV_ROTARY_KERNEL(__half) INSTANTIATE_KV_ROTARY_KERNEL(__nv_bfloat16) #endif -#define DISPATCH_KV_COPY_IMPL(Q_RATIO, HEAD_SIZE) \ - if (q_ratio == Q_RATIO && head_size == HEAD_SIZE) \ - kv_rotary_pos_kernel<<>>( \ - kv_cache, q, k, v, nullptr, batch_desc, qkv_stride, kv_cache_stride, v_offset, 0); +#define DISPATCH_KV_COPY_IMPL(Q_RATIO, HEAD_SIZE) \ + if (q_ratio == Q_RATIO && head_size == HEAD_SIZE) \ + kv_rotary_pos_kernel \ + <<>>(kv_cache, \ + q, \ + k, \ + v, \ + nullptr, \ + 0.f, \ + batch_desc, \ + qkv_stride, \ + kv_cache_stride, \ + v_offset, \ + 0); template void launch_kv_copy_kernel(T* kv_cache, diff --git a/deepspeed/inference/v2/kernels/ragged_ops/linear_blocked_kv_rotary/blocked_kv_rotary.cuh b/deepspeed/inference/v2/kernels/ragged_ops/linear_blocked_kv_rotary/blocked_kv_rotary.cuh index be38ff30c46c..41a69d3b397b 100644 --- a/deepspeed/inference/v2/kernels/ragged_ops/linear_blocked_kv_rotary/blocked_kv_rotary.cuh +++ b/deepspeed/inference/v2/kernels/ragged_ops/linear_blocked_kv_rotary/blocked_kv_rotary.cuh @@ -18,6 +18,7 @@ void launch_kv_rotary_kernel(T* kv_cache, T* k, T* v, T* inv_freq, + const float theta_base, const BatchWrapperCPP batch_desc, const int qkv_stride, const int kv_cache_stride, diff --git a/deepspeed/inference/v2/kernels/ragged_ops/linear_blocked_kv_rotary/blocked_kv_rotary.h b/deepspeed/inference/v2/kernels/ragged_ops/linear_blocked_kv_rotary/blocked_kv_rotary.h index 0615825c0a21..e56ce644dbbc 100644 --- a/deepspeed/inference/v2/kernels/ragged_ops/linear_blocked_kv_rotary/blocked_kv_rotary.h +++ b/deepspeed/inference/v2/kernels/ragged_ops/linear_blocked_kv_rotary/blocked_kv_rotary.h @@ -45,6 +45,7 @@ void kv_rotary_embeddings(torch::Tensor& kv_cache, torch::Tensor& q, torch::Tensor& k, torch::Tensor& v, + const float theta_base, torch::Tensor& batch_metadata, torch::Tensor& seq_metadata, torch::Tensor& tokens_to_seq, diff --git a/deepspeed/inference/v2/kernels/ragged_ops/linear_blocked_kv_rotary/blocked_kv_rotary.py b/deepspeed/inference/v2/kernels/ragged_ops/linear_blocked_kv_rotary/blocked_kv_rotary.py index 50d9aca061f3..f206a4f5d28c 100644 --- a/deepspeed/inference/v2/kernels/ragged_ops/linear_blocked_kv_rotary/blocked_kv_rotary.py +++ b/deepspeed/inference/v2/kernels/ragged_ops/linear_blocked_kv_rotary/blocked_kv_rotary.py @@ -21,7 +21,12 @@ class BlockedRotaryEmbeddings(DSKernelBase): supported_head_sizes = [64, 128] supported_q_ratios = [1, 2, 4, 5, 8, 16, 29, 35, 36, 71] - def __init__(self, head_size: int, n_q_heads: int, n_kv_heads: int, dtype: torch.dtype) -> None: + def __init__(self, + head_size: int, + n_q_heads: int, + n_kv_heads: int, + dtype: torch.dtype, + theta_base: float = 10000.0) -> None: """ Args: head_size: The size of the attention head. @@ -51,6 +56,7 @@ def __init__(self, head_size: int, n_q_heads: int, n_kv_heads: int, dtype: torch self.head_size = head_size self.n_q_heads = n_q_heads self.n_kv_heads = n_kv_heads + self.theta_base = theta_base def __call__(self, kv_cache: torch.Tensor, qkv: torch.Tensor, ragged_batch: RaggedBatchWrapper) -> None: """ @@ -66,5 +72,5 @@ def __call__(self, kv_cache: torch.Tensor, qkv: torch.Tensor, ragged_batch: Ragg k = qkv[:, self.head_size * self.n_q_heads:self.head_size * (self.n_q_heads + self.n_kv_heads)] v = qkv[:, self.head_size * (self.n_q_heads + self.n_kv_heads):] - self.kernel(kv_cache, q, k, v, ragged_batch.batch_metadata_buffer(), ragged_batch.inflight_seq_descriptors(), - ragged_batch.tokens_to_seq(), ragged_batch.kv_ptrs()) + self.kernel(kv_cache, q, k, v, self.theta_base, ragged_batch.batch_metadata_buffer(), + ragged_batch.inflight_seq_descriptors(), ragged_batch.tokens_to_seq(), ragged_batch.kv_ptrs()) diff --git a/deepspeed/inference/v2/kernels/ragged_ops/moe_gather/moe_gather.cpp b/deepspeed/inference/v2/kernels/ragged_ops/moe_gather/moe_gather.cpp index e55e1f48c125..506629406f0d 100644 --- a/deepspeed/inference/v2/kernels/ragged_ops/moe_gather/moe_gather.cpp +++ b/deepspeed/inference/v2/kernels/ragged_ops/moe_gather/moe_gather.cpp @@ -16,6 +16,8 @@ n_channels, \ n_experts, \ n_tokens, \ + n_top_k, \ + normalize_scales, \ at::cuda::getCurrentCUDAStream()); \ return; \ } @@ -27,17 +29,21 @@ void moe_gather(torch::Tensor& layer_output, const torch::Tensor& moe_output, const torch::Tensor& scores, const torch::Tensor& mapped_slots, - const torch::Tensor& expert_count) + const torch::Tensor& expert_count, + const bool normalize_scales) { const int32_t n_channels = layer_output.size(1); const int32_t n_experts = expert_count.size(0); const int32_t n_tokens = layer_output.size(0); + const int32_t n_top_k = mapped_slots.size(1); - TORCH_CHECK(moe_output.size(0) == n_tokens); + TORCH_CHECK(moe_output.size(0) == n_tokens * n_top_k); TORCH_CHECK(moe_output.size(1) == n_channels); TORCH_CHECK(scores.size(0) == n_tokens); TORCH_CHECK(mapped_slots.size(0) == n_tokens); + TORCH_CHECK(scores.size(1) == n_top_k); + TORCH_CHECK(layer_output.scalar_type() == moe_output.scalar_type()); TORCH_CHECK(scores.scalar_type() == torch::kFloat32); TORCH_CHECK(mapped_slots.scalar_type() == torch::kInt32); diff --git a/deepspeed/inference/v2/kernels/ragged_ops/moe_gather/moe_gather.cu b/deepspeed/inference/v2/kernels/ragged_ops/moe_gather/moe_gather.cu index c2fae24f5080..4153a2a3636f 100644 --- a/deepspeed/inference/v2/kernels/ragged_ops/moe_gather/moe_gather.cu +++ b/deepspeed/inference/v2/kernels/ragged_ops/moe_gather/moe_gather.cu @@ -7,7 +7,8 @@ #include "ds_kernel_utils.h" #include "moe_gather.cuh" #include "reduction_utils.h" -#include "top_1_gating.cuh" +#include "top_k_gating.cuh" +#include "top_k_utils.h" namespace gather { @@ -16,65 +17,105 @@ constexpr int threads = 256; } // namespace gather -template +template __global__ void moe_gather_kernel(T* layer_output, const T* moe_output, const float* scores, const int32_t* mapped_slots, int32_t* expert_counts, const int32_t n_channels, - const int32_t n_experts) + const int32_t n_experts, + const bool normalize_scales) { constexpr int32_t vector_size = gather::access_granularity / sizeof(T); constexpr int32_t stride = vector_size * gather::threads; const int32_t token_idx = blockIdx.x; - const int32_t mapped_slot = mapped_slots[token_idx]; + int32_t token_mapped_slots[N_TOP_K]; + + bool all_slots_invalid = true; + for (int i = 0; i < N_TOP_K; i++) { + token_mapped_slots[i] = mapped_slots[token_idx * N_TOP_K + i]; + all_slots_invalid &= (token_mapped_slots[i] == gating::unassigned); + } if (token_idx == 0) { // Reset expert counts for its next use. if (threadIdx.x < n_experts) { expert_counts[threadIdx.x] = 0; } } - if (mapped_slot == gating::unassigned) { - // This token was not assigned. + if (all_slots_invalid) { + // This token was not assigned to anything. // TODO(cmikeh2): It's possible we want different behavior here moving forward. return; } - const float score = scores[token_idx]; + float token_scores[N_TOP_K]; + for (int i = 0; i < N_TOP_K; i++) { token_scores[i] = scores[token_idx * N_TOP_K + i]; } + + if (normalize_scales) { + // Normalize the scores so that they sum to 1. + float sum = 0.0f; + for (int i = 0; i < N_TOP_K; i++) { sum += token_scores[i]; } + + if (sum > 0.0f) { + for (int i = 0; i < N_TOP_K; i++) { token_scores[i] /= sum; } + } + } + const int32_t channel_offset = threadIdx.x * vector_size; - const T* moe_output_base = moe_output + mapped_slot * n_channels + channel_offset; + const T* moe_output_bases[N_TOP_K]; +#pragma unroll + for (int i = 0; i < N_TOP_K; i++) { + moe_output_bases[i] = moe_output + token_mapped_slots[i] * n_channels + channel_offset; + } + T* layer_output_base = layer_output + token_idx * n_channels + channel_offset; #pragma unroll for (int i = 0; i < copyUnroll; i++) { - T reg_buffer[vector_size]; - if (i * stride + channel_offset < n_channels) { - mem_access::load_global(reg_buffer, - moe_output_base + i * stride); + float accum_buffer[vector_size]; + for (int j = 0; j < vector_size; j++) { + accum_buffer[j] = reduce::init(); + } + +#pragma unroll + for (int j = 0; j < N_TOP_K; j++) { + T reg_buffer[vector_size]; + mem_access::load_global( + reg_buffer, moe_output_bases[j] + i * stride); +#pragma unroll + for (int k = 0; k < vector_size; k++) { + float up_cast = conversion::to(reg_buffer[k]); + accum_buffer[k] += up_cast * token_scores[j]; + } + } + + T store_buffer[vector_size]; #pragma unroll for (int j = 0; j < vector_size; j++) { - // There are accuracy implications of downcasting the score to a 16-bit - // data type, so we up-convert the input to 32-bit, multiply, and then - // down-convert back to 16-bit. - float up_cast = conversion::to(reg_buffer[j]); - reg_buffer[j] = conversion::to(up_cast * score); + store_buffer[j] = conversion::to(accum_buffer[j]); } mem_access::store_global(layer_output_base + i * stride, - reg_buffer); + store_buffer); } } } -#define LAUNCH_FOR_UNROLL(COUNT) \ - case COUNT: \ - moe_gather_kernel<<>>( \ - layer_output, moe_output, scores, mapped_slots, expert_counts, n_channels, n_experts); \ +#define LAUNCH_FOR_UNROLL(COUNT) \ + case COUNT: \ + moe_gather_kernel<<>>(layer_output, \ + moe_output, \ + scores, \ + mapped_slots, \ + expert_counts, \ + n_channels, \ + n_experts, \ + normalize_scales); \ break; template @@ -86,6 +127,8 @@ void launch_moe_gather(T* layer_output, const int32_t n_channels, const int32_t n_experts, const int32_t n_tokens, + const int32_t n_top_k, + const bool normalize_scales, cudaStream_t stream) { constexpr int vals_per_unroll = gather::threads * gather::access_granularity / sizeof(T); @@ -94,14 +137,16 @@ void launch_moe_gather(T* layer_output, const dim3 block(gather::threads); const dim3 grid(n_tokens); - switch (copy_unroll) { - LAUNCH_FOR_UNROLL(1) - LAUNCH_FOR_UNROLL(2) - LAUNCH_FOR_UNROLL(3) - LAUNCH_FOR_UNROLL(4) - LAUNCH_FOR_UNROLL(5) - LAUNCH_FOR_UNROLL(6) - } + TOP_K_SWITCH(n_top_k, [&] { + switch (copy_unroll) { + LAUNCH_FOR_UNROLL(1) + LAUNCH_FOR_UNROLL(2) + LAUNCH_FOR_UNROLL(3) + LAUNCH_FOR_UNROLL(4) + LAUNCH_FOR_UNROLL(5) + LAUNCH_FOR_UNROLL(6) + } + }); } #define INSTANTIATE_GATHER_FOR_TYPE(TYPE) \ @@ -113,6 +158,8 @@ void launch_moe_gather(T* layer_output, const int32_t n_channels, \ const int32_t n_experts, \ const int32_t n_tokens, \ + const int32_t n_top_k, \ + const bool normalize_scales, \ cudaStream_t stream); INSTANTIATE_GATHER_FOR_TYPE(__half) diff --git a/deepspeed/inference/v2/kernels/ragged_ops/moe_gather/moe_gather.cuh b/deepspeed/inference/v2/kernels/ragged_ops/moe_gather/moe_gather.cuh index f98a727ead58..b348d0cfb330 100644 --- a/deepspeed/inference/v2/kernels/ragged_ops/moe_gather/moe_gather.cuh +++ b/deepspeed/inference/v2/kernels/ragged_ops/moe_gather/moe_gather.cuh @@ -17,4 +17,6 @@ void launch_moe_gather(T* layer_output, const int32_t n_channels, const int32_t n_experts, const int32_t n_tokens, + const int32_t n_top_k, + const bool normalize_scales, cudaStream_t stream); diff --git a/deepspeed/inference/v2/kernels/ragged_ops/moe_gather/moe_gather.h b/deepspeed/inference/v2/kernels/ragged_ops/moe_gather/moe_gather.h index 7ffe9f8b4dc6..ec9e03057eb8 100644 --- a/deepspeed/inference/v2/kernels/ragged_ops/moe_gather/moe_gather.h +++ b/deepspeed/inference/v2/kernels/ragged_ops/moe_gather/moe_gather.h @@ -16,4 +16,5 @@ void moe_gather(torch::Tensor& layer_output, const torch::Tensor& moe_output, const torch::Tensor& scores, const torch::Tensor& mapped_slots, - const torch::Tensor& expert_counts); + const torch::Tensor& expert_counts, + const bool normalize_scales); diff --git a/deepspeed/inference/v2/kernels/ragged_ops/moe_gather/moe_gather.py b/deepspeed/inference/v2/kernels/ragged_ops/moe_gather/moe_gather.py index c37683d03fbe..f03938171ba4 100644 --- a/deepspeed/inference/v2/kernels/ragged_ops/moe_gather/moe_gather.py +++ b/deepspeed/inference/v2/kernels/ragged_ops/moe_gather/moe_gather.py @@ -18,7 +18,7 @@ class MoEGather(DSKernelBase): supported_dtypes = [DtypeEnum.fp16, DtypeEnum.bf16] - def __init__(self, dtype: DtypeEnum, channels: int) -> None: + def __init__(self, dtype: DtypeEnum, channels: int, normalize_scores: bool = False) -> None: if not isinstance(dtype, DtypeEnum): dtype = DtypeEnum(dtype) @@ -31,6 +31,7 @@ def __init__(self, dtype: DtypeEnum, channels: int) -> None: inf_module = RaggedOpsBuilder().load() self.kernel = inf_module.moe_gather + self.normalize_scores = normalize_scores def __call__(self, layer_output: torch.Tensor, moe_output: torch.Tensor, scores: torch.Tensor, mapped_slots: torch.Tensor, expert_counts: torch.Tensor) -> torch.Tensor: @@ -40,13 +41,13 @@ def __call__(self, layer_output: torch.Tensor, moe_output: torch.Tensor, scores: Arguments: layer_output (torch.Tensor): The output of the layer of shape [n_tokens, hidden_size]. This has been scaled appropriately. - moe_output (torch.Tensor): The output of the MoE of shape [n_tokens, hidden_size]. + moe_output (torch.Tensor): The output of the MoE of shape [n_tokens * n_top_k, hidden_size]. scores (torch.Tensor): The gating scores of shape [n_tokens]. - mapped_slots (torch.Tensor): The index of the token in the expert's input of shape [n_tokens]. The index of token ``i`` in layer_output is ``mapped_slots[i]``. + mapped_slots (torch.Tensor): The index of the token in the expert's input of shape [n_tokens, n_top_k]. The indices of token ``i`` in layer_output is ``mapped_slots[i]``. expert_counts (torch.Tensor): The number of tokens assigned to each expert of shape [n_experts]. This is passed to fuse the clearing of this data structure into the gather. Returns: layer_output """ - self.kernel(layer_output, moe_output, scores, mapped_slots, expert_counts) + self.kernel(layer_output, moe_output, scores, mapped_slots, expert_counts, self.normalize_scores) return layer_output diff --git a/deepspeed/inference/v2/kernels/ragged_ops/moe_scatter/moe_scatter.cpp b/deepspeed/inference/v2/kernels/ragged_ops/moe_scatter/moe_scatter.cpp index 902f1cc0ea15..8f7ecbd1a287 100644 --- a/deepspeed/inference/v2/kernels/ragged_ops/moe_scatter/moe_scatter.cpp +++ b/deepspeed/inference/v2/kernels/ragged_ops/moe_scatter/moe_scatter.cpp @@ -18,6 +18,7 @@ n_channels, \ n_tokens, \ n_experts, \ + n_top_k, \ at::cuda::getCurrentCUDAStream()); \ return; \ } @@ -36,13 +37,17 @@ void moe_scatter(torch::Tensor& moe_input, { const int32_t n_tokens = activations.size(0); const int32_t n_channels = activations.size(1); + const int32_t n_top_k = assignments.size(1); // Should have a lot of matching buffer sizes here. - TORCH_CHECK(n_tokens == moe_input.size(0)); TORCH_CHECK(n_tokens == assignments.size(0)); TORCH_CHECK(n_tokens == offsets.size(0)); TORCH_CHECK(n_channels == moe_input.size(1)); + TORCH_CHECK(n_top_k == offsets.size(1)); + TORCH_CHECK(n_top_k * n_tokens == moe_input.size(0)); + TORCH_CHECK(n_top_k == mapped_slots.size(1)); + const int32_t n_experts = expert_count_cumsums.size(0); TORCH_CHECK(moe_input.scalar_type() == activations.scalar_type()); diff --git a/deepspeed/inference/v2/kernels/ragged_ops/moe_scatter/moe_scatter.cu b/deepspeed/inference/v2/kernels/ragged_ops/moe_scatter/moe_scatter.cu index 0746cd7be645..d3eb4f649e79 100644 --- a/deepspeed/inference/v2/kernels/ragged_ops/moe_scatter/moe_scatter.cu +++ b/deepspeed/inference/v2/kernels/ragged_ops/moe_scatter/moe_scatter.cu @@ -4,9 +4,9 @@ // DeepSpeed Team #include "ds_kernel_utils.h" -#include "moe_scatter.cuh" #include "reduction_utils.h" -#include "top_1_gating.cuh" +#include "top_k_gating.cuh" +#include "top_k_utils.h" using ROp = reduce::ROpType; @@ -15,10 +15,11 @@ namespace scatter { constexpr int access_granularity = 16; constexpr int threads = 256; constexpr int warps = threads / hw_warp_size; +constexpr int max_experts = 1024; } // namespace scatter -template +template __global__ void moe_scatter_kernel(T* moe_input, int64_t* expert_count_cumsums, int32_t* mapped_slots, @@ -38,88 +39,78 @@ __global__ void moe_scatter_kernel(T* moe_input, // Bank aligned and sufficient __shared__ int32_t red_buffer[32]; - __shared__ int32_t token_0_row; + __shared__ int32_t expert_offsets[scatter::max_experts]; // CG helpers cg::thread_block tb = cg::this_thread_block(); cg::thread_block_tile warp = cg::tiled_partition(tb); - const int assigned_expert = assignments[token_idx]; - - // For the different codepaths, we'll converge on this variable for doing - // the token copy. - int32_t token_base_row; + // Fetch the assigned experts for this token. + int assigned_experts[N_TOP_K]; + for (int i = 0; i < N_TOP_K; i++) { + assigned_experts[i] = assignments[token_idx * N_TOP_K + i]; + } - if (token_idx == 0) { - // Token 0 will perform a cumsum on the data - int32_t expert_vals; - if (tidx < n_experts) { - expert_vals = expert_counts[tidx]; + bool all_unassigned = true; + for (int i = 0; i < N_TOP_K; i++) { + if (assigned_experts[i] != gating::unassigned) { + all_unassigned = false; } else { - expert_vals = 0; + mapped_slots[token_idx * N_TOP_K + i] = gating::unassigned; } + } + if (all_unassigned && token_idx != 0) return; + + // Do a prefix scan on the expert counts to get the base offsets. Here we use the + // single up-sweep variant. + int32_t expert_vals; + if (tidx < n_experts) { + expert_vals = expert_counts[tidx]; + } else { + expert_vals = 0; + } #pragma unroll - for (int i = 1; i < hw_warp_size; i *= 2) { - int32_t maybe_add = warp.shfl_up(expert_vals, i); - expert_vals = (warp.thread_rank() < i) ? expert_vals : expert_vals + maybe_add; - } + for (int i = 1; i < hw_warp_size; i *= 2) { + int32_t maybe_add = warp.shfl_up(expert_vals, i); + expert_vals = (warp.thread_rank() < i) ? expert_vals : expert_vals + maybe_add; + } - if (warp.thread_rank() == hw_warp_size - 1) { - mem_access::store_shared<4>(red_buffer + warp_rank, &expert_vals); - } + if (warp.thread_rank() == hw_warp_size - 1) { + mem_access::store_shared<4>(red_buffer + warp_rank, &expert_vals); + } - tb.sync(); + tb.sync(); - int32_t phase_2_val = 0; - if (warp.thread_rank() < scatter::warps) { - mem_access::load_shared<4>(&phase_2_val, red_buffer + warp.thread_rank()); - } + int32_t phase_2_val = 0; + if (warp.thread_rank() < scatter::warps) { + mem_access::load_shared<4>(&phase_2_val, red_buffer + warp.thread_rank()); + } #pragma unroll - for (int i = 1; i < hw_warp_size; i *= 2) { - int32_t maybe_add = warp.shfl_up(phase_2_val, i); - phase_2_val = (warp.thread_rank() < i) ? phase_2_val : phase_2_val + maybe_add; - } - - int warp_offset = 0; - if (warp_rank > 0) { warp_offset = warp.shfl(phase_2_val, warp_rank - 1); } - const int32_t expert_cumsum = warp_offset + expert_vals; - - if (tidx < n_experts) { - int64_t expert_cumsum_64 = (int64_t)expert_cumsum; - expert_count_cumsums[tidx] = expert_cumsum_64; - } - - if (assigned_expert == gating::unassigned) return; - if (assigned_expert - 1 == tidx) token_0_row = expert_cumsum; + for (int i = 1; i < hw_warp_size; i *= 2) { + int32_t maybe_add = warp.shfl_up(phase_2_val, i); + phase_2_val = (warp.thread_rank() < i) ? phase_2_val : phase_2_val + maybe_add; + } - tb.sync(); + int warp_offset = 0; + if (warp_rank > 0) { warp_offset = warp.shfl(phase_2_val, warp_rank - 1); } + const int32_t expert_cumsum = warp_offset + expert_vals; - if (assigned_expert != 0) { - token_base_row = token_0_row; - } else { - token_base_row = 0; - } + // Token 0 will write the + if (token_idx == 0 && tidx < n_experts) { + int64_t expert_cumsum_64 = (int64_t)expert_cumsum; + expert_count_cumsums[tidx] = expert_cumsum_64; + } - } else if (assigned_expert == gating::unassigned) { - // For whatever reason, don't need to perform the copy, so we'll early return - // and signal this wasn't mapped with a negative 1. - if (tidx == 0) mapped_slots[token_idx] = gating::unassigned; - return; - } else { - // For all other valid tokens, we can just do a block-scoped sum. - if (tidx < assigned_expert) { - token_base_row = expert_counts[tidx]; - } else { - token_base_row = 0; - } + // Since token 0 has now written the expert cumsum to global memory, + // if it has no valid experts, we can early return. + if (token_idx == 0 && all_unassigned) return; - warp.sync(); + if (tidx < n_experts) { expert_offsets[tidx] = expert_cumsum; } - // TODO(cmikeh2): Shouldn't use the internal api. - reduce::_block(tb, warp, &token_base_row); - } + // Ensure all the expert offsets are written in shared memory. + tb.sync(); // Data copy to appropriate location const int32_t thread_offset = tidx * vector_size; @@ -127,9 +118,16 @@ __global__ void moe_scatter_kernel(T* moe_input, const int32_t base_load_offset = token_idx * n_channels + thread_offset; const T* load_base_ptr = activations + base_load_offset; - const int32_t store_row = token_base_row + offsets[token_idx]; - const int32_t base_store_offset = store_row * n_channels + thread_offset; - T* store_base_ptr = moe_input + base_store_offset; + int32_t store_rows[N_TOP_K]; + T* store_base_ptrs[N_TOP_K]; +#pragma unroll + for (int i = 0; i < N_TOP_K; i++) { + const int32_t cur_expert_offset = + (assigned_experts[i] > 0) ? expert_offsets[assigned_experts[i] - 1] : 0; + store_rows[i] = cur_expert_offset + offsets[token_idx * N_TOP_K + i]; + const int32_t base_store_offset = store_rows[i] * n_channels + thread_offset; + store_base_ptrs[i] = moe_input + base_store_offset; + } #pragma unroll for (int i = 0; i < copyUnroll; i++) { @@ -138,25 +136,31 @@ __global__ void moe_scatter_kernel(T* moe_input, if (i * load_stride + thread_offset < n_channels) { mem_access::load_global(tmp_buf, load_base_ptr + i * load_stride); - mem_access::store_global(store_base_ptr + i * load_stride, - tmp_buf); +#pragma unroll + for (int j = 0; j < N_TOP_K; j++) { + mem_access::store_global( + store_base_ptrs[j] + i * load_stride, tmp_buf); + } } } - if (threadIdx.x == 0) { mapped_slots[token_idx] = store_row; } + if (threadIdx.x == 0) { + for (int i = 0; i < N_TOP_K; i++) { mapped_slots[token_idx * N_TOP_K + i] = store_rows[i]; } + } } -#define LAUNCH_FOR_UNROLL(COUNT) \ - case COUNT: \ - moe_scatter_kernel<<>>(moe_input, \ - expert_count_cumsums, \ - mapped_slots, \ - activations, \ - assignments, \ - expert_counts, \ - offsets, \ - n_channels, \ - n_experts); \ +#define LAUNCH_FOR_UNROLL(COUNT) \ + case COUNT: \ + moe_scatter_kernel \ + <<>>(moe_input, \ + expert_count_cumsums, \ + mapped_slots, \ + activations, \ + assignments, \ + expert_counts, \ + offsets, \ + n_channels, \ + n_experts); \ break; template @@ -170,6 +174,7 @@ void launch_moe_scatter(T* moe_input, const int32_t n_channels, const int32_t n_tokens, const int32_t n_experts, + const int32_t n_top_k, cudaStream_t stream) { constexpr int vals_per_unroll = scatter::threads * scatter::access_granularity / sizeof(T); @@ -178,14 +183,16 @@ void launch_moe_scatter(T* moe_input, const dim3 block(scatter::threads); const dim3 grid(n_tokens); - switch (copy_unroll) { - LAUNCH_FOR_UNROLL(1); - LAUNCH_FOR_UNROLL(2); - LAUNCH_FOR_UNROLL(3); - LAUNCH_FOR_UNROLL(4); - LAUNCH_FOR_UNROLL(5); - LAUNCH_FOR_UNROLL(6); - } + TOP_K_SWITCH(n_top_k, [&] { + switch (copy_unroll) { + LAUNCH_FOR_UNROLL(1); + LAUNCH_FOR_UNROLL(2); + LAUNCH_FOR_UNROLL(3); + LAUNCH_FOR_UNROLL(4); + LAUNCH_FOR_UNROLL(5); + LAUNCH_FOR_UNROLL(6); + } + }); } #define INSTANTIATE_SCATTER_FOR_TYPE(TYPE) \ @@ -199,6 +206,7 @@ void launch_moe_scatter(T* moe_input, const int32_t, \ const int32_t, \ const int32_t, \ + const int32_t, \ cudaStream_t); INSTANTIATE_SCATTER_FOR_TYPE(__half); diff --git a/deepspeed/inference/v2/kernels/ragged_ops/moe_scatter/moe_scatter.cuh b/deepspeed/inference/v2/kernels/ragged_ops/moe_scatter/moe_scatter.cuh index 5c94cb0ef734..d9756c80f05a 100644 --- a/deepspeed/inference/v2/kernels/ragged_ops/moe_scatter/moe_scatter.cuh +++ b/deepspeed/inference/v2/kernels/ragged_ops/moe_scatter/moe_scatter.cuh @@ -19,4 +19,5 @@ void launch_moe_scatter(T* moe_input, const int32_t n_channels, const int32_t n_tokens, const int32_t n_experts, + const int32_t n_top_k, cudaStream_t stream); diff --git a/deepspeed/inference/v2/kernels/ragged_ops/moe_scatter/moe_scatter.py b/deepspeed/inference/v2/kernels/ragged_ops/moe_scatter/moe_scatter.py index 5cd6ae5f0fe2..7efcedb4e880 100644 --- a/deepspeed/inference/v2/kernels/ragged_ops/moe_scatter/moe_scatter.py +++ b/deepspeed/inference/v2/kernels/ragged_ops/moe_scatter/moe_scatter.py @@ -40,13 +40,13 @@ def __call__(self, moe_input: torch.Tensor, expert_cumsum: torch.Tensor, mapped_ Scatters the hidden states such that the token stride for each expert's input is contiguous. Arguments: - moe_input (torch.Tensor): The direct input for the MoE GEMM of shape [n_tokens, hidden_size]. + moe_input (torch.Tensor): The direct input for the MoE GEMM of shape [n_tokens * n_top_k, hidden_size]. expert_cumsum (torch.Tensor): The cumulative sum of the expert counts of shape [n_experts]. - mapped_slots (torch.Tensor): The index of the token in the expert's input of shape [n_tokens]. + mapped_slots (torch.Tensor): The index of the token in the expert's input of shape [n_tokens, n_top_k]. hidden_states (torch.Tensor): The hidden states of shape [n_tokens, hidden_size]. expert_counts (torch.Tensor): The number of tokens assigned to each expert of shape [n_experts]. - assignments (torch.Tensor): The expert assignments of shape [n_tokens]. - offsets (torch.Tensor): The offsets into the expert for a given token of shape [n_tokens]. + assignments (torch.Tensor): The expert assignments of shape [n_tokens, n_top_k]. + offsets (torch.Tensor): The offsets into the expert for a given token of shape [n_tokens, n_top_K]. Returns: Tuple[torch.Tensor, torch.Tensor, torch.Tensor]: The MoE input (with scattered values), the cumsum of the offsets (for the MoE kernels themselves), and the assignments Tensor modified in place to show which row that token was mapped to in the input. diff --git a/deepspeed/inference/v2/kernels/ragged_ops/ragged_ops.cpp b/deepspeed/inference/v2/kernels/ragged_ops/ragged_ops.cpp index 1c09fc52bbb1..f320f46e2620 100644 --- a/deepspeed/inference/v2/kernels/ragged_ops/ragged_ops.cpp +++ b/deepspeed/inference/v2/kernels/ragged_ops/ragged_ops.cpp @@ -12,7 +12,7 @@ #include "logits_gather.h" #include "moe_gather.h" #include "moe_scatter.h" -#include "top_1_gating.h" +#include "top_k_gating.h" PYBIND11_MODULE(TORCH_EXTENSION_NAME, m) { @@ -43,6 +43,6 @@ PYBIND11_MODULE(TORCH_EXTENSION_NAME, m) // moe_scatter.h m.def("moe_scatter", &moe_scatter, "MoE scatter for top-1-gating."); - // top_1_gating.h - m.def("top_1_gating", &top_1_gating, "Top-1 gating for MoE with ragged batch awareness."); + // top_k_gating.h + m.def("top_k_gating", &top_k_gating, "Top-1 gating for MoE with ragged batch awareness."); } diff --git a/deepspeed/inference/v2/kernels/ragged_ops/top_1_gating/__init__.py b/deepspeed/inference/v2/kernels/ragged_ops/top_k_gating/__init__.py similarity index 69% rename from deepspeed/inference/v2/kernels/ragged_ops/top_1_gating/__init__.py rename to deepspeed/inference/v2/kernels/ragged_ops/top_k_gating/__init__.py index b50a0838d9f8..487735b015b0 100644 --- a/deepspeed/inference/v2/kernels/ragged_ops/top_1_gating/__init__.py +++ b/deepspeed/inference/v2/kernels/ragged_ops/top_k_gating/__init__.py @@ -3,4 +3,4 @@ # DeepSpeed Team -from .top_1_gating import RaggedTop1Gating +from .top_k_gating import RaggedTopKGating diff --git a/deepspeed/inference/v2/kernels/ragged_ops/top_1_gating/top_1_gating.cpp b/deepspeed/inference/v2/kernels/ragged_ops/top_k_gating/top_k_gating.cpp similarity index 67% rename from deepspeed/inference/v2/kernels/ragged_ops/top_1_gating/top_1_gating.cpp rename to deepspeed/inference/v2/kernels/ragged_ops/top_k_gating/top_k_gating.cpp index 55c68454b228..5eec7e2b955f 100644 --- a/deepspeed/inference/v2/kernels/ragged_ops/top_1_gating/top_1_gating.cpp +++ b/deepspeed/inference/v2/kernels/ragged_ops/top_k_gating/top_k_gating.cpp @@ -3,12 +3,12 @@ // DeepSpeed Team -#include "top_1_gating.h" +#include "top_k_gating.h" #include -#define DISPATCH_TOP_1_GATING(T_TYPE, C_TYPE) \ +#define DISPATCH_TOP_K_GATING(T_TYPE, C_TYPE) \ if (logits.options().dtype() == torch::T_TYPE) { \ - launch_top_1_gating((int32_t*)expert_counts.data_ptr(), \ + launch_top_k_gating((int32_t*)expert_counts.data_ptr(), \ (float*)scores.data_ptr(), \ (int32_t*)assignments.data_ptr(), \ (int32_t*)offsets.data_ptr(), \ @@ -16,14 +16,15 @@ batch_metadata_ptr, \ n_tokens, \ n_experts, \ + n_top_k, \ at::cuda::getCurrentCUDAStream()); \ return; \ } /* -Perform softmax plus atomics in order to do first pass of top_1_gating. +Perform softmax plus atomics in order to do first pass of top_k_gating. */ -void top_1_gating(torch::Tensor& expert_counts, +void top_k_gating(torch::Tensor& expert_counts, torch::Tensor& scores, torch::Tensor& assignments, torch::Tensor& offsets, @@ -31,10 +32,15 @@ void top_1_gating(torch::Tensor& expert_counts, torch::Tensor& batch_metadata) { const int32_t n_tokens = scores.size(0); + const int32_t n_top_k = scores.size(1); - // Should have the same buffer size for scores and offsets + // Should have the same buffer size for scores, offsets, and assignments TORCH_CHECK(n_tokens == offsets.size(0)); TORCH_CHECK(n_tokens == logits.size(0)); + TORCH_CHECK(n_tokens == assignments.size(0)); + + TORCH_CHECK(n_top_k == offsets.size(1)); + TORCH_CHECK(n_top_k == assignments.size(1)); TORCH_CHECK(expert_counts.scalar_type() == torch::kInt32); TORCH_CHECK(scores.scalar_type() == torch::kFloat); @@ -45,11 +51,11 @@ void top_1_gating(torch::Tensor& expert_counts, const RaggedBatchDescriptor* batch_metadata_ptr = reinterpret_cast(batch_metadata.data_ptr()); - DISPATCH_TOP_1_GATING(kFloat, float) - DISPATCH_TOP_1_GATING(kHalf, __half) + DISPATCH_TOP_K_GATING(kFloat, float) + DISPATCH_TOP_K_GATING(kHalf, __half) #ifdef BF16_AVAILABLE - DISPATCH_TOP_1_GATING(kBFloat16, __nv_bfloat16) + DISPATCH_TOP_K_GATING(kBFloat16, __nv_bfloat16) #endif - TORCH_CHECK(false, "Unsupported dtype for logits in top_1_gating"); + TORCH_CHECK(false, "Unsupported dtype for logits in top_k_gating"); } diff --git a/deepspeed/inference/v2/kernels/ragged_ops/top_1_gating/top_1_gating.cu b/deepspeed/inference/v2/kernels/ragged_ops/top_k_gating/top_k_gating.cu similarity index 59% rename from deepspeed/inference/v2/kernels/ragged_ops/top_1_gating/top_1_gating.cu rename to deepspeed/inference/v2/kernels/ragged_ops/top_k_gating/top_k_gating.cu index 02daee9f692e..58f95c045593 100644 --- a/deepspeed/inference/v2/kernels/ragged_ops/top_1_gating/top_1_gating.cu +++ b/deepspeed/inference/v2/kernels/ragged_ops/top_k_gating/top_k_gating.cu @@ -6,12 +6,13 @@ #include "conversion_utils.h" #include "memory_access_utils.h" #include "reduction_utils.h" -#include "top_1_gating.cuh" +#include "top_k_gating.cuh" +#include "top_k_utils.h" using ROp = reduce::ROpType; -template -__global__ void top_1_gating_kernel(int32_t* expert_counts, +template +__global__ void top_k_gating_kernel(int32_t* expert_counts, float* scores, int32_t* assignments, int32_t* offsets, @@ -30,8 +31,11 @@ __global__ void top_1_gating_kernel(int32_t* expert_counts, // Padding tokens do not require if (token_idx >= batch_metadata->n_tokens) { if (threadIdx.x == 0) { - offsets[token_idx] = gating::unassigned; - assignments[token_idx] = gating::unassigned; +#pragma unroll + for (int i = 0; i < TOP_K; i++) { + assignments[token_idx * TOP_K + i] = gating::unassigned; + offsets[token_idx * TOP_K + i] = gating::unassigned; + } } return; } @@ -44,34 +48,46 @@ __global__ void top_1_gating_kernel(int32_t* expert_counts, } else { reduce::init(&logit_val); } + float reduce_val = logit_val; + + int32_t local_assigned_experts[TOP_K]; + float local_assigned_logits[TOP_K]; // Training code tends to use ``torch.argmax`` to select the expert, which // which has ties broken by the lower index. Since our fused comparison algorithm // breaks ties by the higher index (since it's the lower 32-bits of the 64-bit // comparison), we invert the expert index to break ties by the lower index. int32_t inverted_expert = n_experts - expert_idx - 1; - // Perform softmax - const reduce::IdxReduceResult res = - reduce::idx_reduce(tb, warp, logit_val, inverted_expert); - // Recover the original expert index - const int32_t assigned_expert = n_experts - res.idx - 1; - const float max_logit = res.val; + // Find the top k logits + for (int i = 0; i < TOP_K; ++i) { + const reduce::IdxReduceResult res = + reduce::idx_reduce(tb, warp, reduce_val, inverted_expert); + local_assigned_experts[i] = n_experts - res.idx - 1; + local_assigned_logits[i] = res.val; + + // Set the max logit to -inf so that it is not selected again + if (threadIdx.x == n_experts - res.idx - 1) { reduce::init(&reduce_val); } + } + + const float max_logit = local_assigned_logits[0]; float softmax_sum = __expf(logit_val - max_logit); reduce::block(tb, warp, softmax_sum); - // Compute the score - const float score = __expf(max_logit - max_logit) / softmax_sum; + for (int i = 0; i < TOP_K; ++i) { + const float softmax = __expf(local_assigned_logits[i] - max_logit) / softmax_sum; - if (threadIdx.x == 0) { - scores[token_idx] = score; - assignments[token_idx] = assigned_expert; - offsets[token_idx] = atomicAdd(expert_counts + assigned_expert, 1); + if (threadIdx.x == 0) { + scores[token_idx * TOP_K + i] = softmax; + assignments[token_idx * TOP_K + i] = local_assigned_experts[i]; + offsets[token_idx * TOP_K + i] = + atomicAdd(expert_counts + local_assigned_experts[i], 1); + } } } template -void launch_top_1_gating(int32_t* expert_counts, +void launch_top_k_gating(int32_t* expert_counts, float* scores, int32_t* assignments, int32_t* offsets, @@ -79,17 +95,20 @@ void launch_top_1_gating(int32_t* expert_counts, const RaggedBatchDescriptor* batch_metadata, const int32_t n_tokens, const int32_t n_experts, + const int32_t n_top_k, cudaStream_t stream) { const dim3 grid(n_tokens); const dim3 block(((n_experts + hw_warp_size - 1) / hw_warp_size) * hw_warp_size); - top_1_gating_kernel<<>>( - expert_counts, scores, assignments, offsets, logits, batch_metadata, n_experts); + TOP_K_SWITCH(n_top_k, [&] { + top_k_gating_kernel<<>>( + expert_counts, scores, assignments, offsets, logits, batch_metadata, n_experts); + }); } -#define INSTANTIATE_TOP_1_KERNEL(T) \ - template void launch_top_1_gating(int32_t * expert_counts, \ +#define INSTANTIATE_top_k_KERNEL(T) \ + template void launch_top_k_gating(int32_t * expert_counts, \ float* scores, \ int32_t* assignments, \ int32_t* offsets, \ @@ -97,10 +116,10 @@ void launch_top_1_gating(int32_t* expert_counts, const RaggedBatchDescriptor* batch_metadata, \ const int32_t n_tokens, \ const int32_t n_experts, \ + const int32_t n_top_k, \ cudaStream_t stream); -INSTANTIATE_TOP_1_KERNEL(float) -INSTANTIATE_TOP_1_KERNEL(__half) +INSTANTIATE_top_k_KERNEL(float) INSTANTIATE_top_k_KERNEL(__half) #ifdef BF16_AVAILABLE -INSTANTIATE_TOP_1_KERNEL(__nv_bfloat16) + INSTANTIATE_top_k_KERNEL(__nv_bfloat16) #endif diff --git a/deepspeed/inference/v2/kernels/ragged_ops/top_1_gating/top_1_gating.cuh b/deepspeed/inference/v2/kernels/ragged_ops/top_k_gating/top_k_gating.cuh similarity index 87% rename from deepspeed/inference/v2/kernels/ragged_ops/top_1_gating/top_1_gating.cuh rename to deepspeed/inference/v2/kernels/ragged_ops/top_k_gating/top_k_gating.cuh index c83ad56ff2f1..c525cc5f524e 100644 --- a/deepspeed/inference/v2/kernels/ragged_ops/top_1_gating/top_1_gating.cuh +++ b/deepspeed/inference/v2/kernels/ragged_ops/top_k_gating/top_k_gating.cuh @@ -13,7 +13,7 @@ constexpr int unassigned = -1; } // namespace gating template -void launch_top_1_gating(int32_t* expert_counts, +void launch_top_k_gating(int32_t* expert_counts, float* scores, int32_t* assignments, int32_t* offsets, @@ -21,4 +21,5 @@ void launch_top_1_gating(int32_t* expert_counts, const RaggedBatchDescriptor* batch_metadata, const int32_t n_tokens, const int32_t n_experts, + const int32_t n_top_k, cudaStream_t stream); diff --git a/deepspeed/inference/v2/kernels/ragged_ops/top_1_gating/top_1_gating.h b/deepspeed/inference/v2/kernels/ragged_ops/top_k_gating/top_k_gating.h similarity index 86% rename from deepspeed/inference/v2/kernels/ragged_ops/top_1_gating/top_1_gating.h rename to deepspeed/inference/v2/kernels/ragged_ops/top_k_gating/top_k_gating.h index b431f4cad30c..00840c3c93b5 100644 --- a/deepspeed/inference/v2/kernels/ragged_ops/top_1_gating/top_1_gating.h +++ b/deepspeed/inference/v2/kernels/ragged_ops/top_k_gating/top_k_gating.h @@ -8,12 +8,12 @@ #include #include #include "ragged_dtypes.h" -#include "top_1_gating.cuh" +#include "top_k_gating.cuh" /* Perform softmax plus atomics to get token mapping. */ -void top_1_gating(torch::Tensor& expert_counts, +void top_k_gating(torch::Tensor& expert_counts, torch::Tensor& scores, torch::Tensor& assignments, torch::Tensor& offsets, diff --git a/deepspeed/inference/v2/kernels/ragged_ops/top_1_gating/top_1_gating.py b/deepspeed/inference/v2/kernels/ragged_ops/top_k_gating/top_k_gating.py similarity index 87% rename from deepspeed/inference/v2/kernels/ragged_ops/top_1_gating/top_1_gating.py rename to deepspeed/inference/v2/kernels/ragged_ops/top_k_gating/top_k_gating.py index 1df97c2e9f8d..72ba2b6019bb 100644 --- a/deepspeed/inference/v2/kernels/ragged_ops/top_1_gating/top_1_gating.py +++ b/deepspeed/inference/v2/kernels/ragged_ops/top_k_gating/top_k_gating.py @@ -13,7 +13,7 @@ from deepspeed.ops.op_builder import RaggedOpsBuilder -class RaggedTop1Gating(DSKernelBase): +class RaggedTopKGating(DSKernelBase): """ CUDA implementation of top-1 gating. This will perform a softmax on the logits, and return the scale as well as its idx within that expert's allocation. @@ -26,28 +26,28 @@ def __init__(self, logit_dtype: DtypeEnum) -> None: if not isinstance(logit_dtype, DtypeEnum): logit_dtype = DtypeEnum(logit_dtype) - if logit_dtype not in RaggedTop1Gating.supported_logit_dtypes: + if logit_dtype not in RaggedTopKGating.supported_logit_dtypes: raise RuntimeError(f"Unsupported logit dtype {logit_dtype}") inf_module = RaggedOpsBuilder().load() - self.kernel = inf_module.top_1_gating + self.kernel = inf_module.top_k_gating def __call__(self, expert_counts: torch.Tensor, scores: torch.Tensor, assignments: torch.Tensor, offsets: torch.Tensor, logits: torch.Tensor, batch: RaggedBatchWrapper) -> Tuple[torch.Tensor, torch.Tensor, torch.Tensor, torch.Tensor]: """ - Perform the ragged top_1_gating. + Perform the ragged top_k_gating. Arguments: expert_counts (torch.Tensor): Tensor of 0s of shape [n_experts] to be filled with number of tokens assigned to each expert. This must be filled with 0s else the copy kernel will buffer overflow. In order to minimize the zero-fill cost, it is recommended to write to 0 during the MoE output remapping. - scores (torch.Tensor): Preallocated output of shape [n_tokens] to place expert scaling + scores (torch.Tensor): Preallocated output of shape [n_tokens, n_top_k] to place expert scaling value. - expert_assignment (torch.Tensor): Preallocated output of shape [n_tokens] to place + expert_assignment (torch.Tensor): Preallocated output of shape [n_tokens, n_top_k] to place which expert a token has been assigned to. - expert_offset (torch.Tensor): Preallocated output of shape [n_tokens] to place which + expert_offset (torch.Tensor): Preallocated output of shape [n_tokens, n_top_k] to place which offset within an experts group a token is. logits (torch.Tensor): Raw logits of gating function. batch (RaggedBatchWrapper): Batch information for ragged tensor. diff --git a/deepspeed/inference/v2/model_implementations/__init__.py b/deepspeed/inference/v2/model_implementations/__init__.py index 481be2e5940e..ab1f984fba7e 100644 --- a/deepspeed/inference/v2/model_implementations/__init__.py +++ b/deepspeed/inference/v2/model_implementations/__init__.py @@ -12,4 +12,5 @@ from .llama_v2 import * from .opt import * from .mistral import * +from .mixtral import * from .falcon import * diff --git a/deepspeed/inference/v2/model_implementations/common_parameters/moe_parameters.py b/deepspeed/inference/v2/model_implementations/common_parameters/moe_parameters.py index df5f1427a5cf..8ababf567ba9 100644 --- a/deepspeed/inference/v2/model_implementations/common_parameters/moe_parameters.py +++ b/deepspeed/inference/v2/model_implementations/common_parameters/moe_parameters.py @@ -33,7 +33,7 @@ class UnfusedMoEMLP1Parameter(ParameterBase): and need to be joined into a single group. """ - experts: ParamList("num_experts") # noqa: F821 + experts: ParamList("n_experts") # noqa: F821 def finalize(self) -> torch.Tensor: stacked_experts = torch.stack([p for p in self.experts], dim=0) @@ -46,7 +46,7 @@ class UnfusedMoEMLP2Parameter(ParameterBase): and need to be joined into a single group. """ - experts: ParamList("num_experts") # noqa: F821 + experts: ParamList("n_experts") # noqa: F821 def finalize(self) -> torch.Tensor: stacked_experts = torch.stack([p for p in self.experts], dim=0) @@ -57,13 +57,22 @@ class UnfusedMoEGatedMLPParameter(ParameterBase): """ MoE Parameter for a gated activation function in which the gating matrix is not fused in the same parameter as the non-gating matrix. + + This is a stacked version of the ``GatedMLPParameter``. Please see that class for more + documentation on the layout of the parameters. """ - gating_experts: ParamList("num_experts") # noqa: F821 + gating_experts: ParamList("n_experts") # noqa: F821 - up_experts: ParamList("num_experts") # noqa: F821 + up_experts: ParamList("n_experts") # noqa: F821 def finalize(self) -> torch.Tensor: - fused_params = [torch.cat([gate, weight], dim=0) for gate, weight in zip(self.gating_experts, self.up_experts)] - stacked_params = torch.stack(fused_params, dim=0) - return self.inference_model.transform_moe_mlp_2_param(stacked_params) + transposed_experts = [] + for gate, up in zip(self.gating_experts, self.up_experts): + assert gate.shape[0] == up.shape[0], "Gated MLP parameters must have the same number of neurons." + total_neurons = gate.shape[0] + up.shape[0] + fused_expert = torch.cat([gate, up], dim=-1).reshape(total_neurons, -1) + transposed_experts.append(fused_expert) + + stacked_experts = torch.stack(transposed_experts, dim=0) + return self.inference_model.transform_moe_mlp_1_param(stacked_experts) diff --git a/deepspeed/inference/v2/model_implementations/falcon/__init__.py b/deepspeed/inference/v2/model_implementations/falcon/__init__.py index ff66879b44be..20f37538274c 100644 --- a/deepspeed/inference/v2/model_implementations/falcon/__init__.py +++ b/deepspeed/inference/v2/model_implementations/falcon/__init__.py @@ -3,4 +3,4 @@ # DeepSpeed Team -from .falcon_policy import FalconPolicy +from .policy import FalconPolicy diff --git a/deepspeed/inference/v2/model_implementations/falcon/falcon_containers.py b/deepspeed/inference/v2/model_implementations/falcon/container.py similarity index 97% rename from deepspeed/inference/v2/model_implementations/falcon/falcon_containers.py rename to deepspeed/inference/v2/model_implementations/falcon/container.py index f3cbe6609cdd..caccfe1ecb00 100644 --- a/deepspeed/inference/v2/model_implementations/falcon/falcon_containers.py +++ b/deepspeed/inference/v2/model_implementations/falcon/container.py @@ -5,8 +5,8 @@ # Create a container object to save model-specific tensors using the policy file above. -from ...model_implementations.common_parameters import * -from ...model_implementations.layer_container_base import LayerContainer +from ..common_parameters import * +from ..layer_container_base import LayerContainer ''' # HF Falcon 7b model looks like this: diff --git a/deepspeed/inference/v2/model_implementations/falcon/falcon_model.py b/deepspeed/inference/v2/model_implementations/falcon/model.py similarity index 98% rename from deepspeed/inference/v2/model_implementations/falcon/falcon_model.py rename to deepspeed/inference/v2/model_implementations/falcon/model.py index a00f754744a4..d1ccc38280a0 100644 --- a/deepspeed/inference/v2/model_implementations/falcon/falcon_model.py +++ b/deepspeed/inference/v2/model_implementations/falcon/model.py @@ -11,12 +11,12 @@ from ...allocator import empty_from from ...inference_utils import ActivationType, DtypeEnum -from ...model_implementations import * +from .. import * from ...modules.configs import * from ...modules.interfaces import * from ...ragged import RaggedBatchWrapper -from .falcon_containers import FalconNonTransformerContainer, FalconTransformerContainer +from .container import FalconNonTransformerContainer, FalconTransformerContainer class FalconInferenceModel(DSTransformerModelBase): diff --git a/deepspeed/inference/v2/model_implementations/falcon/falcon_policy.py b/deepspeed/inference/v2/model_implementations/falcon/policy.py similarity index 74% rename from deepspeed/inference/v2/model_implementations/falcon/falcon_policy.py rename to deepspeed/inference/v2/model_implementations/falcon/policy.py index 5672d45a8d13..c6612090a0df 100644 --- a/deepspeed/inference/v2/model_implementations/falcon/falcon_policy.py +++ b/deepspeed/inference/v2/model_implementations/falcon/policy.py @@ -6,10 +6,10 @@ from typing import Any from ...config_v2 import RaggedInferenceEngineConfig -from ...model_implementations.inference_policy_base import ContainerMap, InferenceV2Policy -from ...model_implementations.falcon.falcon_containers import FalconNonTransformerContainer, FalconTransformerContainer -from ...model_implementations.falcon.falcon_containers import FalconNewArchTransformerContainer -from ...model_implementations.falcon.falcon_model import FalconInferenceModel +from ..inference_policy_base import ContainerMap, InferenceV2Policy +from .container import FalconNonTransformerContainer, FalconTransformerContainer +from .container import FalconNewArchTransformerContainer +from .model import FalconInferenceModel class FalconPolicy(InferenceV2Policy): diff --git a/deepspeed/inference/v2/model_implementations/inference_transformer_base.py b/deepspeed/inference/v2/model_implementations/inference_transformer_base.py index 8f6a0b7fa688..e78a161b4cd0 100644 --- a/deepspeed/inference/v2/model_implementations/inference_transformer_base.py +++ b/deepspeed/inference/v2/model_implementations/inference_transformer_base.py @@ -521,12 +521,26 @@ def transform_norm_param(self, param: torch.Tensor) -> InferenceParameter: class DSMoETransformerModelBase(DSTransformerModelBase): @property - def num_experts(self) -> int: + def n_experts(self) -> int: """ Return the number of experts in the model. """ raise NotImplementedError("Attempted to access an unimplemented number of experts") + @property + def n_top_k(self) -> int: + """ + Number of experts per token. + """ + raise NotImplementedError("Attempted to access an unimplemented number of experts per token") + + @property + def normalize_expert_scores(self) -> bool: + """ + Whether to normalize expert scores. If true, sum(expert_scores) = 1. + """ + raise NotImplementedError("Attempted to access an unimplemented normalization flag") + def make_moe_layer(self) -> None: """ Instantiates the MoE layer for the model. This sets the `self.moe` attribute. @@ -538,9 +552,11 @@ def make_moe_layer(self) -> None: model_dim=self.model_dim, intermediate_features=sharded_dim, activation=self.mlp_activation_fn, - n_experts=self.num_experts, + n_experts=self.n_experts, + top_k=self.n_top_k, input_dtype=self.activation_dtype, output_dtype=self.activation_dtype, + normalize_scores=self.normalize_expert_scores, ) self.moe = heuristics.instantiate_moe(moe_config, self._engine_config) diff --git a/deepspeed/inference/v2/model_implementations/llama_v2/__init__.py b/deepspeed/inference/v2/model_implementations/llama_v2/__init__.py index 5d2b5ae562ee..79605a76a4c2 100644 --- a/deepspeed/inference/v2/model_implementations/llama_v2/__init__.py +++ b/deepspeed/inference/v2/model_implementations/llama_v2/__init__.py @@ -3,4 +3,4 @@ # DeepSpeed Team -from .llama_v2_policy import Llama2Policy +from .policy import Llama2Policy diff --git a/deepspeed/inference/v2/model_implementations/llama_v2/llama_v2_containers.py b/deepspeed/inference/v2/model_implementations/llama_v2/container.py similarity index 95% rename from deepspeed/inference/v2/model_implementations/llama_v2/llama_v2_containers.py rename to deepspeed/inference/v2/model_implementations/llama_v2/container.py index e9c473ce512b..9de9bdb34574 100644 --- a/deepspeed/inference/v2/model_implementations/llama_v2/llama_v2_containers.py +++ b/deepspeed/inference/v2/model_implementations/llama_v2/container.py @@ -5,8 +5,8 @@ # Create a container object to save model-specific tensors using the policy file above. -from ...model_implementations.common_parameters import * -from ...model_implementations.layer_container_base import LayerContainer +from ..common_parameters import * +from ..layer_container_base import LayerContainer ''' # HF Llama model looks like this: diff --git a/deepspeed/inference/v2/model_implementations/llama_v2/llama_v2_model.py b/deepspeed/inference/v2/model_implementations/llama_v2/model.py similarity index 83% rename from deepspeed/inference/v2/model_implementations/llama_v2/llama_v2_model.py rename to deepspeed/inference/v2/model_implementations/llama_v2/model.py index 9b628f77de01..b91e3258caa0 100644 --- a/deepspeed/inference/v2/model_implementations/llama_v2/llama_v2_model.py +++ b/deepspeed/inference/v2/model_implementations/llama_v2/model.py @@ -11,12 +11,13 @@ from ...allocator import empty_from from ...inference_utils import ActivationType, DtypeEnum -from ...model_implementations import * +from .. import * from ...modules.configs import * from ...modules.interfaces import * +from ...modules import heuristics from ...ragged import RaggedBatchWrapper -from .llama_v2_containers import Llama2NonTransformerContainer, Llama2TransformerContainer +from .container import Llama2NonTransformerContainer, Llama2TransformerContainer class Llama2InferenceModel(DSTransformerModelBase): @@ -105,6 +106,27 @@ def norm_type(self) -> NormTypeEnum: def positional_embedding_type(self) -> PositionalEmbeddingType: return PositionalEmbeddingType.rotate_half + def make_attn_layer(self) -> None: + """ + Builds the attention layer for the model. This sets the `self.attn` attribute. + """ + softmax_scale = 1.0 / (self.head_size**0.5) + + rotary_config = RotateHalfConfig(theta_base=self._config.rope_theta) + + attn_config = DSSelfAttentionConfig(max_tokens=self._engine_config.state_manager.max_ragged_batch_size, + n_heads_q=self.n_heads_q_local, + n_heads_kv=self.n_heads_kv_local, + head_size=self.head_size, + max_sequences=self._engine_config.state_manager.max_ragged_sequence_count, + scale_factor=softmax_scale, + input_dtype=self.activation_dtype, + output_dtype=self.activation_dtype, + positional_embedding_type=self.positional_embedding_type, + positional_embedding_config=rotary_config) + + self.attn = heuristics.instantiate_attention(attn_config, self._engine_config) + """ Forward implementations """ @@ -145,8 +167,7 @@ def _forward_transformer_layer(self, layer_idx: int, residual: torch.Tensor, hid kv_cache = self.state_manager.get_cache(layer_idx) hidden_states = self.qkv(hidden_states, cur_params.qkv_w, b=None) - hidden_states = self.attn(hidden_states, kv_cache, - ragged_batch_info) #, inv_freqs=None) #cur_params.rotary_emb) + hidden_states = self.attn(hidden_states, kv_cache, ragged_batch_info) hidden_states = self.attn_out(hidden_states, cur_params.attn_out_w, b=None) if self.tp_size > 1: diff --git a/deepspeed/inference/v2/model_implementations/llama_v2/llama_v2_policy.py b/deepspeed/inference/v2/model_implementations/llama_v2/policy.py similarity index 76% rename from deepspeed/inference/v2/model_implementations/llama_v2/llama_v2_policy.py rename to deepspeed/inference/v2/model_implementations/llama_v2/policy.py index c8253be79fad..bb13ab6d5bf4 100644 --- a/deepspeed/inference/v2/model_implementations/llama_v2/llama_v2_policy.py +++ b/deepspeed/inference/v2/model_implementations/llama_v2/policy.py @@ -6,9 +6,9 @@ from typing import Any from ...config_v2 import RaggedInferenceEngineConfig -from ...model_implementations.inference_policy_base import ContainerMap, InferenceV2Policy -from ...model_implementations.llama_v2.llama_v2_containers import Llama2NonTransformerContainer, Llama2TransformerContainer -from ...model_implementations.llama_v2.llama_v2_model import Llama2InferenceModel +from ..inference_policy_base import ContainerMap, InferenceV2Policy +from .container import Llama2NonTransformerContainer, Llama2TransformerContainer +from .model import Llama2InferenceModel class Llama2Policy(InferenceV2Policy): diff --git a/deepspeed/inference/v2/model_implementations/mistral/model.py b/deepspeed/inference/v2/model_implementations/mistral/model.py index d9b06b91e308..08a9dae78e43 100644 --- a/deepspeed/inference/v2/model_implementations/mistral/model.py +++ b/deepspeed/inference/v2/model_implementations/mistral/model.py @@ -14,6 +14,7 @@ from ...model_implementations import * from ...modules.configs import * from ...modules.interfaces import * +from ...modules import heuristics from ...ragged import RaggedBatchWrapper from .container import MistralNonTransformerContainer, MistralTransformerContainer @@ -104,6 +105,27 @@ def norm_type(self) -> NormTypeEnum: def positional_embedding_type(self) -> PositionalEmbeddingType: return PositionalEmbeddingType.rotate_half + def make_attn_layer(self) -> None: + """ + Builds the attention layer for the model. This sets the `self.attn` attribute. + """ + softmax_scale = 1.0 / (self.head_size**0.5) + + rotary_config = RotateHalfConfig(theta_base=self._config.rope_theta) + + attn_config = DSSelfAttentionConfig(max_tokens=self._engine_config.state_manager.max_ragged_batch_size, + n_heads_q=self.n_heads_q_local, + n_heads_kv=self.n_heads_kv_local, + head_size=self.head_size, + max_sequences=self._engine_config.state_manager.max_ragged_sequence_count, + scale_factor=softmax_scale, + input_dtype=self.activation_dtype, + output_dtype=self.activation_dtype, + positional_embedding_type=self.positional_embedding_type, + positional_embedding_config=rotary_config) + + self.attn = heuristics.instantiate_attention(attn_config, self._engine_config) + """ Forward implementations """ @@ -144,8 +166,7 @@ def _forward_transformer(self, layer_idx: int, residual: torch.Tensor, hidden_st kv_cache = self.state_manager.get_cache(layer_idx) hidden_states = self.qkv(hidden_states, cur_params.qkv_w, b=None) - hidden_states = self.attn(hidden_states, kv_cache, - ragged_batch_info) #, inv_freqs=None) #cur_params.rotary_emb) + hidden_states = self.attn(hidden_states, kv_cache, ragged_batch_info) hidden_states = self.attn_out(hidden_states, cur_params.attn_out_w, b=None) if self.tp_size > 1: diff --git a/deepspeed/inference/v2/model_implementations/mistral/policy.py b/deepspeed/inference/v2/model_implementations/mistral/policy.py index f6d0a0fe5987..b67ec311c952 100644 --- a/deepspeed/inference/v2/model_implementations/mistral/policy.py +++ b/deepspeed/inference/v2/model_implementations/mistral/policy.py @@ -5,10 +5,10 @@ from typing import Any -from deepspeed.inference.v2.config_v2 import RaggedInferenceEngineConfig -from deepspeed.inference.v2.model_implementations.inference_policy_base import ContainerMap, InferenceV2Policy -from deepspeed.inference.v2.model_implementations.mistral.container import MistralNonTransformerContainer, MistralTransformerContainer -from deepspeed.inference.v2.model_implementations.mistral.model import MistralInferenceModel +from ...config_v2 import RaggedInferenceEngineConfig +from ..inference_policy_base import ContainerMap, InferenceV2Policy +from .container import MistralNonTransformerContainer, MistralTransformerContainer +from .model import MistralInferenceModel class MistralPolicy(InferenceV2Policy): diff --git a/deepspeed/inference/v2/model_implementations/mixtral/__init__.py b/deepspeed/inference/v2/model_implementations/mixtral/__init__.py new file mode 100644 index 000000000000..2cb1aa889291 --- /dev/null +++ b/deepspeed/inference/v2/model_implementations/mixtral/__init__.py @@ -0,0 +1,6 @@ +# Copyright (c) Microsoft Corporation. +# SPDX-License-Identifier: Apache-2.0 + +# DeepSpeed Team + +from .policy import MixtralPolicy diff --git a/deepspeed/inference/v2/model_implementations/mixtral/container.py b/deepspeed/inference/v2/model_implementations/mixtral/container.py new file mode 100644 index 000000000000..6ec4a0552b8f --- /dev/null +++ b/deepspeed/inference/v2/model_implementations/mixtral/container.py @@ -0,0 +1,46 @@ +# Copyright (c) Microsoft Corporation. +# SPDX-License-Identifier: Apache-2.0 + +# DeepSpeed Team + +# Create a container object to save model-specific tensors using the policy file above. + +from deepspeed.inference.v2.model_implementations.common_parameters import * +from deepspeed.inference.v2.model_implementations.layer_container_base import LayerContainer + + +class MixtralTransformerContainer(LayerContainer): + + qkv_w: UnfusedQKVParameter + attn_out_w: AttentionOutputParameter + moe_gate: MoEGatingWeightParameter + moe_mlp_1: UnfusedMoEGatedMLPParameter + moe_mlp_2: UnfusedMoEMLP2Parameter + attn_norm_gamma: NormParameter + mlp_norm_gamma: NormParameter + + PARAM_MAPPING = { + "input_layernorm.weight": "attn_norm_gamma.params", + "post_attention_layernorm.weight": "mlp_norm_gamma.params", + "self_attn.q_proj.weight": "qkv_w.q_params", + "self_attn.k_proj.weight": "qkv_w.k_params", + "self_attn.v_proj.weight": "qkv_w.v_params", + "self_attn.o_proj.weight": "attn_out_w.params", + "block_sparse_moe.gate.weight": "moe_gate.params", + "block_sparse_moe.experts.*.w1.weight": "moe_mlp_1.gating_experts", + "block_sparse_moe.experts.*.w3.weight": "moe_mlp_1.up_experts", + "block_sparse_moe.experts.*.w2.weight": "moe_mlp_2.experts", + } + + +class MixtralNonTransformerContainer(LayerContainer): + + word_emb: EmbeddingParameter + word_unembed: UnembedParameter + final_norm: NormParameter + + PARAM_MAPPING = { + "model.embed_tokens.weight": "word_emb.params", + "lm_head.weight": "word_unembed.params", + "model.norm.weight": "final_norm.params", + } diff --git a/deepspeed/inference/v2/model_implementations/mixtral/model.py b/deepspeed/inference/v2/model_implementations/mixtral/model.py new file mode 100644 index 000000000000..731a907716f4 --- /dev/null +++ b/deepspeed/inference/v2/model_implementations/mixtral/model.py @@ -0,0 +1,274 @@ +# Copyright (c) Microsoft Corporation. +# SPDX-License-Identifier: Apache-2.0 + +# DeepSpeed Team + +from typing import Iterable, Optional, Tuple + +import torch + +import deepspeed.comm as dist + +from ...allocator import empty_from +from ...config_v2 import RaggedInferenceEngineConfig +from ...inference_utils import ActivationType, DtypeEnum +from ...model_implementations import * +from ...modules.configs import * +from ...modules.interfaces import * +from ...modules import heuristics +from ...ragged import RaggedBatchWrapper +from ..inference_model_base import ( + DSModelImplementationConfig, + MPType, +) + +from .container import MixtralNonTransformerContainer, MixtralTransformerContainer + + +class MixtralInferenceModel(DSMoETransformerModelBase): + """ + Inference model implementation for Mixtral models. + """ + + _non_transformer: Optional[MixtralNonTransformerContainer] + """ + Embed + unembed container. Specializing the type annotation. + """ + + _transformer: Optional[Iterable[MixtralTransformerContainer]] + """ + Per-layer transformer container. Specializing the type annotation. + """ + """ + Properties ineherited from `DSInferenceModelBase` + """ + + @property + def max_sequence_length(self) -> int: + return self._config.max_position_embeddings + + """ + Properties ineherited from `DSTransformerModelBase` + """ + + @property + def num_layers(self) -> int: + return self._config.num_hidden_layers + + @property + def model_dim(self) -> int: + return self._config.hidden_size + + @property + def vocab_size(self) -> int: + return self._config.vocab_size + + @property + def head_size(self) -> int: + return self.model_dim // self.n_heads + + @property + def n_heads(self) -> int: + return self._config.num_attention_heads + + @property + def intermediate_dim(self) -> int: + return self._config.intermediate_size + + @property + def n_heads_kv(self) -> int: + return self._config.num_key_value_heads + + @property + def activation_dtype(self) -> DtypeEnum: + if self._config.torch_dtype == torch.float16: + return DtypeEnum.fp16 + elif self._config.torch_dtype == torch.bfloat16: + return DtypeEnum.bf16 + else: + raise NotImplementedError("Only fp16 and bf16 are supported") + + @property + def mlp_activation_fn(self) -> ActivationType: + activation = self._config.hidden_act.lower() + if activation == "gelu": + return ActivationType.GEGLU + elif activation == "relu": + return ActivationType.ReGLU + elif activation == "gegelu": + return ActivationType.GEGLU + elif activation == "silu": + return ActivationType.SiGLU + else: + raise NotImplementedError(f"Activation {activation} not supported") + + @property + def norm_type(self) -> NormTypeEnum: + return NormTypeEnum.RMSNorm + + @property + def positional_embedding_type(self) -> PositionalEmbeddingType: + return PositionalEmbeddingType.rotate_half + + """ + Inherited from `DSMoETransformerModelBase` + """ + + @property + def n_experts(self) -> int: + return self._config.num_local_experts + + @property + def n_top_k(self) -> int: + return self._config.num_experts_per_tok + + @property + def normalize_expert_scores(self) -> bool: + return True + + """ + Model implementation + """ + + def __init__(self, config: DSModelImplementationConfig, engine_config: RaggedInferenceEngineConfig, + base_mp_group: MPType) -> None: + """ + Base implementation for initialization. By default, this will initialize + the traditional components of a transformer model: + - Embedding + - QKV projection + - Self attention + - Attention output projection + - Feed forward network + - Normalization + - Unembedding + + Arguments: + config (DSModelImplementationConfig): Model-specific configuration. No assumptions + should be made about this config that are not closely tied to the specific + model implementation. + engine_config (RaggedInferenceEngineConfig): Engine configuration. + base_mp_group (MPType): Base communication group for Tensor-parallel inference. + """ + super().__init__(config, engine_config, base_mp_group) + + self.make_norm_layer() + self.make_qkv_layer() + self.make_attn_layer() + self.make_attn_out_layer() + self.make_moe_layer() + self.make_embedding_layer() + self.make_unembedding_layer() + self._kv_cache_config = None + + def make_attn_layer(self) -> None: + """ + Builds the attention layer for the model. This sets the `self.attn` attribute. + """ + softmax_scale = 1.0 / (self.head_size**0.5) + + rotary_config = RotateHalfConfig(theta_base=self._config.rope_theta) + + attn_config = DSSelfAttentionConfig(max_tokens=self._engine_config.state_manager.max_ragged_batch_size, + n_heads_q=self.n_heads_q_local, + n_heads_kv=self.n_heads_kv_local, + head_size=self.head_size, + max_sequences=self._engine_config.state_manager.max_ragged_sequence_count, + scale_factor=softmax_scale, + input_dtype=self.activation_dtype, + output_dtype=self.activation_dtype, + positional_embedding_type=self.positional_embedding_type, + positional_embedding_config=rotary_config) + + self.attn = heuristics.instantiate_attention(attn_config, self._engine_config) + + def _forward_embed(self, ragged_batch: RaggedBatchWrapper) -> torch.Tensor: + """ + Performs the embedding lookup prior to running the transformer of the model. + + Arguments: + ragged_batch (RaggedBatchWrapper): The batch to embed. + + Returns: + torch.Tensor: The embedded batch. + """ + embed = self.embed(ragged_batch, self._non_transformer.word_emb) + + if embed.shape[-1] != self.model_dim: + raise ValueError(f"Embedding output shape {embed.shape} does not match model_dim {self.model_dim}") + + return embed + + def _forward_transformer(self, layer_idx: int, residual: torch.Tensor, hidden_states: torch.Tensor, + ragged_batch_info: RaggedBatchWrapper) -> Tuple[torch.Tensor, torch.Tensor]: + """ + Executes one (slightly offset) layer of the transformer. This implementation does a peak-ahead + optimization to fuse the layer norm of the next layer into the current layer. + + Arguments: + layer_idx (int): The index of the layer to execute. + residual (torch.Tensor): The residual tensor from the previous layer. + hidden_states (torch.Tensor): The hidden states from the previous layer. This is the + hidden states after pre normalization. + ragged_batch_info (RaggedBatchWrapper): The batch metadata. + """ + # TODO(cmikeh2): Distribute ragged_batch_info to all modules + + cur_params = self._transformer[layer_idx] + kv_cache = self.state_manager.get_cache(layer_idx) + + hidden_states = self.qkv(hidden_states, cur_params.qkv_w) + hidden_states = self.attn(hidden_states, kv_cache, ragged_batch_info) + hidden_states = self.attn_out(hidden_states, cur_params.attn_out_w) + + if self.tp_size > 1: + dist.all_reduce(hidden_states, group=self._base_mp_group) + + residual, hidden_states = self.norm(residual, hidden_states, cur_params.mlp_norm_gamma) + + hidden_states = self.moe(hidden_states, ragged_batch_info, cur_params.moe_gate, cur_params.moe_mlp_1, + cur_params.moe_mlp_2) + + if self.tp_size > 1: + dist.all_reduce(hidden_states, group=self._base_mp_group) + + if layer_idx != self.num_layers - 1: + next_params = self._transformer[layer_idx + 1] + residual, hidden_states = self.norm(residual, hidden_states, next_params.attn_norm_gamma) + else: + # On last layer, we just need to perform the residual add. Adding into the residual + # here is safe. + residual.add_(hidden_states) + + return residual, hidden_states + + def _forward_unembed(self, hidden_states: torch.Tensor, ragged_batch_info: RaggedBatchWrapper) -> torch.Tensor: + """ + Performs unembedding of the hidden states to logits. This will only sample the final + token of each sequence. + """ + logits = self.unembed(hidden_states, self._non_transformer.word_unembed, ragged_batch_info, + self._non_transformer.final_norm) + + if self.tp_size > 1: + comm_buffer = empty_from(self._comm_logits, (self.tp_size, logits.shape[0], logits.shape[1])) + full_logits = empty_from(self._return_logits, (logits.shape[0], self.vocab_size)) + + dist.all_gather_into_tensor(comm_buffer, logits, group=self._base_mp_group) + + full_logits.copy_(comm_buffer.permute(1, 0, 2).reshape(logits.shape[0], self.vocab_size)) + + return full_logits + else: + return logits + + def forward(self, wrapped_batch: RaggedBatchWrapper) -> torch.Tensor: + + residual = self._forward_embed(wrapped_batch) + + residual, hidden_states = self.norm(residual, None, self._transformer[0].attn_norm_gamma, beta=None) + + for layer_idx in range(self.num_layers): + residual, hidden_states = self._forward_transformer(layer_idx, residual, hidden_states, wrapped_batch) + + return self._forward_unembed(residual, wrapped_batch) diff --git a/deepspeed/inference/v2/model_implementations/mixtral/policy.py b/deepspeed/inference/v2/model_implementations/mixtral/policy.py new file mode 100644 index 000000000000..2f0087919720 --- /dev/null +++ b/deepspeed/inference/v2/model_implementations/mixtral/policy.py @@ -0,0 +1,31 @@ +# Copyright (c) Microsoft Corporation. +# SPDX-License-Identifier: Apache-2.0 + +# DeepSpeed Team + +from typing import Any + +from ...config_v2 import RaggedInferenceEngineConfig +from ..inference_policy_base import ContainerMap, InferenceV2Policy +from .container import MixtralTransformerContainer, MixtralNonTransformerContainer +from .model import MixtralInferenceModel + + +class MixtralPolicy(InferenceV2Policy): + + def instantiate_model(self, engine_config: RaggedInferenceEngineConfig, mp_group: Any) -> MixtralInferenceModel: + return MixtralInferenceModel(config=self._model_config, engine_config=engine_config, base_mp_group=mp_group) + + def build_container_map(self) -> ContainerMap: + + map = ContainerMap() + + transformer_containers = [MixtralTransformerContainer(self.model) for _ in range(self.model.num_layers)] + + map.set_transformer_params(['model.layers'], transformer_containers) + + map.set_non_transformer_params(MixtralNonTransformerContainer(self.model)) + + map.set_unmapped_params([]) + + return map diff --git a/deepspeed/inference/v2/model_implementations/opt/container.py b/deepspeed/inference/v2/model_implementations/opt/container.py index 5ddbbde3f141..e97599ef8e50 100644 --- a/deepspeed/inference/v2/model_implementations/opt/container.py +++ b/deepspeed/inference/v2/model_implementations/opt/container.py @@ -5,8 +5,8 @@ # Create a container object to save model-specific tensors using the policy file above. -from ...model_implementations.common_parameters import * -from ...model_implementations.layer_container_base import LayerContainer +from ..common_parameters import * +from ..layer_container_base import LayerContainer ''' # HF OPT model looks like this: diff --git a/deepspeed/inference/v2/model_implementations/opt/model.py b/deepspeed/inference/v2/model_implementations/opt/model.py index fa221e15a0b7..8bd26ba044e5 100644 --- a/deepspeed/inference/v2/model_implementations/opt/model.py +++ b/deepspeed/inference/v2/model_implementations/opt/model.py @@ -131,8 +131,7 @@ def _forward_transformer_layer(self, layer_idx: int, residual: torch.Tensor, hid kv_cache = self.state_manager.get_cache(layer_idx) hidden_states = self.qkv(hidden_states, cur_params.qkv_w, b=cur_params.qkv_b) - hidden_states = self.attn(hidden_states, kv_cache, - ragged_batch_info) #, inv_freqs=None) #cur_params.rotary_emb) + hidden_states = self.attn(hidden_states, kv_cache, ragged_batch_info) hidden_states = self.attn_out(hidden_states, cur_params.attn_out_w, b=cur_params.attn_out_b) if self.tp_size > 1: diff --git a/deepspeed/inference/v2/model_implementations/opt/policy.py b/deepspeed/inference/v2/model_implementations/opt/policy.py index af5750260ead..d57d5beb48d5 100644 --- a/deepspeed/inference/v2/model_implementations/opt/policy.py +++ b/deepspeed/inference/v2/model_implementations/opt/policy.py @@ -6,9 +6,9 @@ from typing import Any from ...config_v2 import RaggedInferenceEngineConfig -from ...model_implementations.inference_policy_base import ContainerMap, InferenceV2Policy -from ...model_implementations.opt.container import OPTNonTransformerContainer, OPTTransformerContainer -from ...model_implementations.opt.model import OPTInferenceModel +from ..inference_policy_base import ContainerMap, InferenceV2Policy +from .container import OPTNonTransformerContainer, OPTTransformerContainer +from .model import OPTInferenceModel class OPTPolicy(InferenceV2Policy): diff --git a/deepspeed/inference/v2/modules/configs/__init__.py b/deepspeed/inference/v2/modules/configs/__init__.py index 19b9fb99ddea..3429e69b47de 100644 --- a/deepspeed/inference/v2/modules/configs/__init__.py +++ b/deepspeed/inference/v2/modules/configs/__init__.py @@ -3,7 +3,12 @@ # DeepSpeed Team -from .attention_configs import (DSSelfAttentionConfig, PositionalEmbeddingType, MaskingType) +from .attention_configs import ( + DSSelfAttentionConfig, + PositionalEmbeddingType, + MaskingType, + RotateHalfConfig, +) from .embedding_config import DSEmbeddingsConfig from .linear_config import DSLinearConfig from .moe_config import DSMoEConfig diff --git a/deepspeed/inference/v2/modules/configs/attention_configs.py b/deepspeed/inference/v2/modules/configs/attention_configs.py index bcdc3d2613d5..823104b13fc2 100644 --- a/deepspeed/inference/v2/modules/configs/attention_configs.py +++ b/deepspeed/inference/v2/modules/configs/attention_configs.py @@ -4,10 +4,11 @@ # DeepSpeed Team from enum import Enum -from typing import Dict +from typing import Dict, Optional from ...inference_utils import DtypeEnum from ...modules.ds_module import DSModuleConfig +from deepspeed.runtime.config_utils import DeepSpeedConfigModel class PositionalEmbeddingType(Enum): @@ -25,6 +26,20 @@ class PositionalEmbeddingType(Enum): alibi = "alibi" +class RotateHalfConfig(DeepSpeedConfigModel): + + use_trained_freqs: bool = False + """ + Whether to use a passed `trained_freqs` tensor for the attention implementation + or to use default synthesized frequencies. + """ + + theta_base: float = 10_000.0 + """ + Base for theta. This will only be used if `use_trained_freqs` is False. + """ + + class MaskingType(Enum): # No masking @@ -79,4 +94,9 @@ class DSSelfAttentionConfig(DSModuleConfig): positional_embedding_type: PositionalEmbeddingType = PositionalEmbeddingType.none # Positional embedding args - positional_embedding_args: Dict = {} + positional_embedding_config: Optional[RotateHalfConfig] = None + """ + To extend this for the other positional embedding types, we would need to add + new configs for each type (as necessary) and annotate this with the + Union[RotateHalfConfig, OtherConfig, ...] type. + """ diff --git a/deepspeed/inference/v2/modules/configs/moe_config.py b/deepspeed/inference/v2/modules/configs/moe_config.py index 1a88d54af19f..7bc944f55e17 100644 --- a/deepspeed/inference/v2/modules/configs/moe_config.py +++ b/deepspeed/inference/v2/modules/configs/moe_config.py @@ -48,3 +48,9 @@ class DSMoEConfig(DSModuleConfig): """ Activation function of the first MLP1 """ + + normalize_scores: bool = False + """ + Whether normalization is applied to the selected scores. If true, the module + should rescale the scores such that their sum is 1.0. + """ diff --git a/deepspeed/inference/v2/modules/implementations/attention/dense_blocked_attention.py b/deepspeed/inference/v2/modules/implementations/attention/dense_blocked_attention.py index bb482f0c58d6..b2727ffca620 100644 --- a/deepspeed/inference/v2/modules/implementations/attention/dense_blocked_attention.py +++ b/deepspeed/inference/v2/modules/implementations/attention/dense_blocked_attention.py @@ -68,9 +68,16 @@ def __init__(self, config: DSSelfAttentionConfig, implementation_config: Dict[st Args: config (DSSelfAttentionConfig): The self attention config for all attention DSModules. - implementation_config (Dict[str, Any]): The implementation config for this DSModule may - contain a `trained_freqs` key. If passed, the implementation will expect a `trained_freqs` - tensor in the `forward` method and will not synthesize the frequencies internally. + implementation_config (Dict[str, Any]): + There are two (dependent) potential components in the implementtion config. + + 1. `trained_freqs` - If the embedding weights for RoPE are trained, the implementation + config should contain {'trained_freqs': True}. This will mean the implementation will + expect a `trained_freqs` tensor in the `forward` method and will not synthesize the + values internally. + + 2. `theta_base` - The base value for synthesized frequencies in the rotary embeddings. + This will only be used if `trained_freqs` is False or not present in the `implementation_config`. If this is not included, the default value of 10000.0 will be used. """ super().__init__(config, implementation_config) @@ -79,14 +86,13 @@ def __init__(self, config: DSSelfAttentionConfig, implementation_config: Dict[st self._kv_copy = LinearBlockedKVCopy(self._config.head_size, self._config.n_heads_q, self._config.n_heads_kv, self._config.input_dtype) elif embed_type == PositionalEmbeddingType.rotate_half: - use_trained_freqs = "trained_freqs" in self._config.positional_embedding_args and self._config.positional_embedding_args[ - "trained_freqs"] - if use_trained_freqs: + if config.positional_embedding_config.use_trained_freqs: self._kv_copy = BlockedTrainedRotaryEmbeddings(self._config.head_size, self._config.n_heads_q, self._config.n_heads_kv, self._config.input_dtype) else: + theta_base = config.positional_embedding_config.theta_base self._kv_copy = BlockedRotaryEmbeddings(self._config.head_size, self._config.n_heads_q, - self._config.n_heads_kv, self._config.input_dtype) + self._config.n_heads_kv, self._config.input_dtype, theta_base) self._softmax_scale = self._config.scale_factor diff --git a/deepspeed/inference/v2/modules/implementations/moe/cutlass_multi_gemm.py b/deepspeed/inference/v2/modules/implementations/moe/cutlass_multi_gemm.py index e43a737515ed..38c0000d7f78 100644 --- a/deepspeed/inference/v2/modules/implementations/moe/cutlass_multi_gemm.py +++ b/deepspeed/inference/v2/modules/implementations/moe/cutlass_multi_gemm.py @@ -9,12 +9,12 @@ from deepspeed.accelerator import get_accelerator from ....allocator import empty_from -from ....inference_utils import ActivationType -from ....kernels.core_ops import BlasLibLinear +from ....inference_utils import ActivationType, is_gated +from ....kernels.core_ops import BlasLibLinear, CUDAGatedActivation from ....kernels.ragged_ops import ( MoEGather, MoEScatter, - RaggedTop1Gating, + RaggedTopKGating, ) from ....ragged import RaggedBatchWrapper @@ -42,11 +42,7 @@ def supports_config(config: DSMoEConfig) -> bool: if config.input_dtype != torch.float16 and config.input_dtype != torch.bfloat16: return False - if config.top_k != 1: - return False - - if config.activation in [ActivationType.GEGLU, ActivationType.ReGLU, ActivationType.SiGLU]: - # Currently not supporting gated activations in MoE + if config.top_k != 1 and config.top_k != 2: return False return True @@ -57,15 +53,24 @@ def __init__(self, config: DSMoEConfig, implementation_config: Dict[str, Any]) - # Convenience variables for frequently accessed items. self.max_tokens = self._config.max_tokens self.n_experts = self._config.n_experts + self.n_top_k = self._config.top_k self.intermediate_dim = self._config.intermediate_features - self._mlp_1 = MoEGEMM(fp_dtype=implementation_config['weight_dtype'], act_fn=config.activation) + moe_op_act_fn = ActivationType.IDENTITY if is_gated(self._config.activation) else self._config.activation + + self._mlp_1 = MoEGEMM(fp_dtype=implementation_config['weight_dtype'], act_fn=moe_op_act_fn) self._mlp_2 = MoEGEMM(fp_dtype=implementation_config['weight_dtype'], act_fn=ActivationType.IDENTITY) + if is_gated(self._config.activation): + self._activation = CUDAGatedActivation(self._config.model_dim, self._config.input_dtype, + self._config.activation) + else: + self._activation = None + self._gate_proj = BlasLibLinear(self._config.input_dtype) - self._top_1_gate = RaggedTop1Gating(config.input_dtype) + self._top_1_gate = RaggedTopKGating(config.input_dtype) self._moe_scatter = MoEScatter(config.input_dtype, config.model_dim) - self._moe_gather = MoEGather(config.input_dtype, config.model_dim) + self._moe_gather = MoEGather(config.input_dtype, config.model_dim, config.normalize_scores) self._create_buffers() @@ -78,32 +83,38 @@ def _create_buffers(self): self._expert_counts = torch.empty((self.n_experts, ), dtype=torch.int32, device=get_accelerator().current_device()) - self._scores = torch.empty((self._config.max_tokens, ), + self._scores = torch.empty((self._config.max_tokens, self.n_top_k), dtype=torch.float32, device=get_accelerator().current_device()) - self._assignments = torch.empty((self._config.max_tokens, ), + self._assignments = torch.empty((self._config.max_tokens, self.n_top_k), dtype=torch.int32, device=get_accelerator().current_device()) - self._offsets = torch.empty((self._config.max_tokens, ), + self._offsets = torch.empty((self._config.max_tokens, self.n_top_k), dtype=torch.int32, device=get_accelerator().current_device()) # Scatter buffers - self._moe_input = torch.empty((self._config.max_tokens, self._config.model_dim), + self._moe_input = torch.empty((self._config.max_tokens * self.n_top_k, self._config.model_dim), dtype=self._config.input_dtype, device=get_accelerator().current_device()) self._expert_cumsum = torch.empty((self._config.n_experts, ), dtype=torch.int64, device=get_accelerator().current_device()) - self._mapped_slots = torch.empty((self._config.max_tokens, ), + self._mapped_slots = torch.empty((self._config.max_tokens, self.n_top_k), dtype=torch.int32, device=get_accelerator().current_device()) # GEMM Buffers - self._intermediate = torch.empty((self._config.max_tokens, self._config.intermediate_features), + self._intermediate = torch.empty((self._config.max_tokens * self.n_top_k, self._config.intermediate_features), dtype=self._config.output_dtype, device=get_accelerator().current_device()) - self._output_unordered = torch.empty((self._config.max_tokens, self._config.model_dim), + if self._activation is not None: + self._gated_intermediate = torch.empty( + (self._config.max_tokens * self.n_top_k, self._config.intermediate_features * 2), + dtype=self._config.output_dtype, + device=get_accelerator().current_device()) + + self._output_unordered = torch.empty((self._config.max_tokens * self.n_top_k, self._config.model_dim), dtype=self._config.output_dtype, device=get_accelerator().current_device()) @@ -167,11 +178,11 @@ def _gate(self, hidden_states: torch.Tensor, batch_metadata: RaggedBatchWrapper, # Get views on the buffers for gating logits = empty_from(self._logits, (hidden_states.shape[0], self._logits.shape[-1])) - scores = empty_from(self._scores, (hidden_states.shape[0], )) - assignments = empty_from(self._assignments, (hidden_states.shape[0], )) - offsets = empty_from(self._offsets, (hidden_states.shape[0], )) - mapped_slots = empty_from(self._mapped_slots, (hidden_states.shape[0], )) - moe_input = empty_from(self._moe_input, (hidden_states.shape[0], self._moe_input.shape[-1])) + scores = empty_from(self._scores, (hidden_states.shape[0], self.n_top_k)) + assignments = empty_from(self._assignments, (hidden_states.shape[0], self.n_top_k)) + offsets = empty_from(self._offsets, (hidden_states.shape[0], self.n_top_k)) + mapped_slots = empty_from(self._mapped_slots, (hidden_states.shape[0], self.n_top_k)) + moe_input = empty_from(self._moe_input, (hidden_states.shape[0] * self.n_top_k, self._moe_input.shape[-1])) self._gate_proj(logits, hidden_states, gate_w) self._expert_counts.zero_() @@ -200,18 +211,31 @@ def forward(self, moe_input, expert_cumsum, scores, mapped_slots = self._gate(hidden_states, batch_metadata, gate_w) # Get views on the buffers for GEMM - intermediate = empty_from(self._intermediate, (hidden_states.shape[0], self._intermediate.shape[-1])) + intermediate = empty_from(self._intermediate, + (hidden_states.shape[0] * self.n_top_k, self._intermediate.shape[-1])) output_unordered = empty_from(self._output_unordered, - (hidden_states.shape[0], self._output_unordered.shape[-1])) + (hidden_states.shape[0] * self.n_top_k, self._output_unordered.shape[-1])) output = empty_from(self._output, (hidden_states.shape[0], self._output.shape[-1])) - self._mlp_1( - intermediate, - moe_input, - mlp_1_w, - expert_cumsum, - mlp_1_b, - ) + if self._activation is not None: + gated_intermediate = empty_from( + self._gated_intermediate, (hidden_states.shape[0] * self.n_top_k, self._gated_intermediate.shape[-1])) + self._mlp_1( + gated_intermediate, + moe_input, + mlp_1_w, + expert_cumsum, + mlp_1_b, + ) + self._activation(intermediate, gated_intermediate) + else: + self._mlp_1( + intermediate, + moe_input, + mlp_1_w, + expert_cumsum, + mlp_1_b, + ) self._mlp_2( output_unordered, diff --git a/op_builder/ragged_ops.py b/op_builder/ragged_ops.py index 13d71b476b5a..8cb372e96c37 100644 --- a/op_builder/ragged_ops.py +++ b/op_builder/ragged_ops.py @@ -73,8 +73,8 @@ def sources(self): "inference/v2/kernels/ragged_ops/moe_gather/moe_gather.cpp", "inference/v2/kernels/ragged_ops/moe_gather/moe_gather.cu", "inference/v2/kernels/ragged_ops/ragged_helpers/ragged_kernel_helpers.cpp", - "inference/v2/kernels/ragged_ops/top_1_gating/top_1_gating.cpp", - "inference/v2/kernels/ragged_ops/top_1_gating/top_1_gating.cu", + "inference/v2/kernels/ragged_ops/top_k_gating/top_k_gating.cpp", + "inference/v2/kernels/ragged_ops/top_k_gating/top_k_gating.cu", ] prefix = self.get_prefix() @@ -101,12 +101,13 @@ def include_paths(self): 'inference/v2/kernels/ragged_ops/atom_builder', 'inference/v2/kernels/ragged_ops/blocked_flash', 'inference/v2/kernels/ragged_ops/embed', + 'inference/v2/kernels/ragged_ops/includes', 'inference/v2/kernels/ragged_ops/linear_blocked_kv_rotary', 'inference/v2/kernels/ragged_ops/logits_gather', 'inference/v2/kernels/ragged_ops/moe_gather', 'inference/v2/kernels/ragged_ops/moe_scatter', 'inference/v2/kernels/ragged_ops/ragged_helpers', - 'inference/v2/kernels/ragged_ops/top_1_gating', + 'inference/v2/kernels/ragged_ops/top_k_gating', ] prefix = self.get_prefix() diff --git a/tests/unit/inference/v2/kernels/ragged_ops/test_moe_gather.py b/tests/unit/inference/v2/kernels/ragged_ops/test_moe_gather.py index 5fa375b49c19..3907fc3e3a4b 100644 --- a/tests/unit/inference/v2/kernels/ragged_ops/test_moe_gather.py +++ b/tests/unit/inference/v2/kernels/ragged_ops/test_moe_gather.py @@ -11,18 +11,28 @@ from deepspeed.inference.v2.kernels.ragged_ops import ( MoEGather, MoEScatter, - RaggedTop1Gating, + RaggedTopKGating, ) from .ragged_testing_utils import build_simple_batch """ -For simplicity's sake, these tests do rely on ``RaggedTop1Gating`` and +For simplicity's sake, these tests do rely on ``RaggedTopKGating`` and ``MoEScatter`` to produce correct inputs. If either of these kernels is broken these tests will fail, so double check the unit test results there before debugging here. """ +TEST_CASES = [ + # (n_tokens, n_experts, n_top_k) + (13, 64, 1), + (278, 64, 1), + (1977, 64, 1), + (13, 8, 2), + (278, 8, 2), + (1977, 8, 2), +] -def build_inputs(n_tokens, n_experts, do_padding): + +def build_inputs(n_tokens: int, n_experts: int, n_top_k: int, do_padding: bool): assert n_tokens <= 2048, "This test will break if n_tokens > 2048" @@ -39,22 +49,28 @@ def build_inputs(n_tokens, n_experts, do_padding): device=get_accelerator().current_device()).repeat_interleave(4096, dim=0).reshape( batch.tensor_toks, 4096).contiguous() - gate = RaggedTop1Gating(DtypeEnum.fp16) + gate = RaggedTopKGating(DtypeEnum.fp16) # Gating outputs expert_counts = torch.zeros((n_experts, ), dtype=torch.int32, device=get_accelerator().current_device()) - scores = torch.empty((batch.tensor_toks, ), dtype=torch.float32, device=get_accelerator().current_device()) - expert_assignment = torch.empty((batch.tensor_toks, ), + scores = torch.empty((batch.tensor_toks, n_top_k), dtype=torch.float32, device=get_accelerator().current_device()) + expert_assignment = torch.empty((batch.tensor_toks, n_top_k), dtype=torch.int32, device=get_accelerator().current_device()) - expert_offset = torch.empty((batch.tensor_toks, ), dtype=torch.int32, device=get_accelerator().current_device()) + expert_offset = torch.empty((batch.tensor_toks, n_top_k), + dtype=torch.int32, + device=get_accelerator().current_device()) gate(expert_counts, scores, expert_assignment, expert_offset, logits, batch) # Scatter outputs - moe_input = torch.empty((batch.tensor_toks, 4096), dtype=torch.float16, device=get_accelerator().current_device()) + moe_input = torch.empty((batch.tensor_toks * n_top_k, 4096), + dtype=torch.float16, + device=get_accelerator().current_device()) expert_cumsum = torch.empty((n_experts, ), dtype=torch.int64, device=get_accelerator().current_device()) - mapped_slots = torch.empty((batch.tensor_toks, ), dtype=torch.int32, device=get_accelerator().current_device()) + mapped_slots = torch.empty((batch.tensor_toks, n_top_k), + dtype=torch.int32, + device=get_accelerator().current_device()) scatter = MoEScatter(DtypeEnum.fp16, 4096) scatter(moe_input, expert_cumsum, mapped_slots, hidden_states, expert_counts, expert_assignment, expert_offset) @@ -63,11 +79,12 @@ def build_inputs(n_tokens, n_experts, do_padding): @pytest.mark.inference_v2_ops -@pytest.mark.parametrize("n_tokens, n_experts", [(13, 64), (278, 64), (1977, 64)]) -@pytest.mark.parametrize("do_padding", [True, False]) -def test_moe_gather(n_tokens, n_experts, do_padding): +@pytest.mark.parametrize("n_tokens, n_experts, n_top_k", TEST_CASES) +@pytest.mark.parametrize("do_padding", [False]) +def test_moe_gather(n_tokens: int, n_experts: int, n_top_k: int, do_padding: bool): + get_accelerator().manual_seed(0xC0FFEE) - batch, moe_input, scores, mapped_slots, expert_counts = build_inputs(n_tokens, n_experts, do_padding) + batch, moe_input, scores, mapped_slots, expert_counts = build_inputs(n_tokens, n_experts, n_top_k, do_padding) output = torch.randn((batch.tensor_toks, 4096), dtype=torch.float16, device=get_accelerator().current_device()) @@ -75,9 +92,31 @@ def test_moe_gather(n_tokens, n_experts, do_padding): gather(output, moe_input, scores, mapped_slots, expert_counts) for token_idx in range(n_tokens): + effective_score = scores[token_idx].sum().item() assert torch.equal( output[token_idx], torch.full((4096, ), - token_idx * scores[token_idx], + token_idx * effective_score, dtype=torch.float16, device=get_accelerator().current_device())) + + +@pytest.mark.inference_v2_ops +def test_moe_gather_normalize_scales(): + get_accelerator().manual_seed(0xC0FFEE) + + n_tokens = 72 + n_experts = 8 + n_top_k = 2 + do_padding = False + + batch, moe_input, scores, mapped_slots, expert_counts = build_inputs(n_tokens, n_experts, n_top_k, do_padding) + output = torch.randn((batch.tensor_toks, 4096), dtype=torch.float16, device=get_accelerator().current_device()) + + gather = MoEGather(DtypeEnum.fp16, 4096, normalize_scores=True) + gather(output, moe_input, scores, mapped_slots, expert_counts) + + for token_idx in range(n_tokens): + assert torch.equal( + output[token_idx], + torch.full((4096, ), token_idx, dtype=torch.float16, device=get_accelerator().current_device())) diff --git a/tests/unit/inference/v2/kernels/ragged_ops/test_moe_scatter.py b/tests/unit/inference/v2/kernels/ragged_ops/test_moe_scatter.py index 4ca051410c1c..aae459f06a6f 100644 --- a/tests/unit/inference/v2/kernels/ragged_ops/test_moe_scatter.py +++ b/tests/unit/inference/v2/kernels/ragged_ops/test_moe_scatter.py @@ -8,19 +8,28 @@ from deepspeed.accelerator import get_accelerator from deepspeed.inference.v2.inference_utils import DtypeEnum -from deepspeed.inference.v2.kernels.ragged_ops import MoEScatter, RaggedTop1Gating +from deepspeed.inference.v2.kernels.ragged_ops import MoEScatter, RaggedTopKGating from .ragged_testing_utils import build_simple_batch """ -For simplicity's sake, these tests do rely on ``RaggedTop1Gating`` to produce correct -inputs. If ``RaggedTop1Gating`` is broken, these tests will fail, so double check +For simplicity's sake, these tests do rely on ``RaggedTopKGating`` to produce correct +inputs. If ``RaggedTopKGating`` is broken, these tests will fail, so double check the unit test results there before debugging here. """ +TEST_CONFIGS = [ + (13, 64, 1), + (278, 64, 1), + (1977, 64, 1), + (13, 8, 2), + (278, 8, 2), + (1977, 8, 2), +] + @pytest.mark.inference_v2_ops -@pytest.mark.parametrize("n_tokens, n_experts", [(13, 64), (278, 64), (1977, 64)]) -@pytest.mark.parametrize("do_padding", [True, False]) -def test_moe_scatter(n_tokens, n_experts, do_padding): +@pytest.mark.parametrize("n_tokens, n_experts, n_top_k", TEST_CONFIGS) +@pytest.mark.parametrize("do_padding", [False, True]) +def test_moe_scatter(n_tokens, n_experts, n_top_k, do_padding): # Sequence composition shouldn't matter here batch = build_simple_batch([n_tokens], padding=do_padding) @@ -35,40 +44,52 @@ def test_moe_scatter(n_tokens, n_experts, do_padding): device=get_accelerator().current_device()).repeat_interleave(4096, dim=0).reshape( batch.tensor_toks, 4096).contiguous() - gate = RaggedTop1Gating(DtypeEnum.fp16) + gate = RaggedTopKGating(DtypeEnum.fp16) # Gating outputs expert_counts = torch.zeros((n_experts, ), dtype=torch.int32, device=get_accelerator().current_device()) - scores = torch.empty((batch.tensor_toks, ), dtype=torch.float32, device=get_accelerator().current_device()) - expert_assignment = torch.empty((batch.tensor_toks, ), + scores = torch.empty((batch.tensor_toks, n_top_k), dtype=torch.float32, device=get_accelerator().current_device()) + expert_assignment = torch.empty((batch.tensor_toks, n_top_k), dtype=torch.int32, device=get_accelerator().current_device()) - expert_offset = torch.empty((batch.tensor_toks, ), dtype=torch.int32, device=get_accelerator().current_device()) + expert_offset = torch.empty((batch.tensor_toks, n_top_k), + dtype=torch.int32, + device=get_accelerator().current_device()) gate(expert_counts, scores, expert_assignment, expert_offset, logits, batch) # Scatter outputs - moe_input = torch.empty((batch.tensor_toks, 4096), dtype=torch.float16, device=get_accelerator().current_device()) + moe_input = torch.empty((batch.tensor_toks * n_top_k, 4096), + dtype=torch.float16, + device=get_accelerator().current_device()) expert_cumsum = torch.empty((n_experts, ), dtype=torch.int64, device=get_accelerator().current_device()) - mapped_slots = torch.empty((batch.tensor_toks, ), dtype=torch.int32, device=get_accelerator().current_device()) + mapped_slots = torch.empty((batch.tensor_toks, n_top_k), + dtype=torch.int32, + device=get_accelerator().current_device()) scatter = MoEScatter(DtypeEnum.fp16, 4096) scatter(moe_input, expert_cumsum, mapped_slots, hidden_states, expert_counts, expert_assignment, expert_offset) + get_accelerator().synchronize() assert torch.equal(expert_cumsum, torch.cumsum(expert_counts, dim=0).to(torch.int64)) + if not do_padding: + assert torch.unique(mapped_slots).size(0) == n_top_k * n_tokens + for token_idx in range(batch.tensor_toks): if token_idx < n_tokens: - expert_idx = expert_assignment[token_idx].item() - if expert_idx == 0: - expert_cumsum_val = 0 - else: - expert_cumsum_val = expert_cumsum[expert_idx - 1] - offset = expert_offset[token_idx] - total_offset = offset + expert_cumsum_val - - assert total_offset == mapped_slots[token_idx].item() - assert torch.equal(moe_input[total_offset], hidden_states[token_idx]) + for k in range(n_top_k): + expert_idx = expert_assignment[token_idx][k].item() + if expert_idx == 0: + expert_cumsum_val = 0 + else: + expert_cumsum_val = expert_cumsum[expert_idx - 1] + offset = expert_offset[token_idx][k] + total_offset = offset + expert_cumsum_val + + assert total_offset == mapped_slots[token_idx][k].item() + assert torch.equal(moe_input[total_offset], hidden_states[token_idx]) else: - assert mapped_slots[token_idx].item() == -1 + for k in range(n_top_k): + assert mapped_slots[token_idx][k].item() == -1 - assert expert_cumsum[-1] == n_tokens + assert expert_cumsum[-1] == n_tokens * n_top_k diff --git a/tests/unit/inference/v2/kernels/ragged_ops/test_top_1_gating.py b/tests/unit/inference/v2/kernels/ragged_ops/test_top_k_gating.py similarity index 51% rename from tests/unit/inference/v2/kernels/ragged_ops/test_top_1_gating.py rename to tests/unit/inference/v2/kernels/ragged_ops/test_top_k_gating.py index 6ff2508bf320..5fa0c8a079f0 100644 --- a/tests/unit/inference/v2/kernels/ragged_ops/test_top_1_gating.py +++ b/tests/unit/inference/v2/kernels/ragged_ops/test_top_k_gating.py @@ -9,9 +9,52 @@ from deepspeed.accelerator import get_accelerator from deepspeed.inference.v2.inference_utils import DtypeEnum -from deepspeed.inference.v2.kernels.ragged_ops import RaggedTop1Gating +from deepspeed.inference.v2.kernels.ragged_ops import RaggedTopKGating from .ragged_testing_utils import build_simple_batch -from ....v2.inference_test_utils import allclose +from ...inference_test_utils import allclose + + +def _top_k_gating_testing_helper(n_tokens: int, n_experts: int, n_top_k: int, seed: int = 0xC0FFEE) -> None: + + torch.manual_seed(seed) + logits = torch.randn((n_tokens, n_experts), dtype=torch.float16, device=get_accelerator().current_device()) + batch = build_simple_batch([n_tokens], padding=False) + gate = RaggedTopKGating(DtypeEnum.fp16) + + expert_counts = torch.zeros((n_experts, ), dtype=torch.int32, device=get_accelerator().current_device()) + scores = torch.empty((n_tokens, n_top_k), dtype=torch.float32, device=get_accelerator().current_device()) + expert_assignment = torch.empty((n_tokens, n_top_k), dtype=torch.int32, device=get_accelerator().current_device()) + expert_offset = torch.empty((n_tokens, n_top_k), dtype=torch.int32, device=get_accelerator().current_device()) + + gate(expert_counts, scores, expert_assignment, expert_offset, logits, batch) + + ref_weights = F.softmax(logits, dim=-1, dtype=torch.float32) + ref_scores, ref_indices = torch.topk(ref_weights, n_top_k, dim=-1) + + assert allclose(scores, ref_scores), f"expected {ref_scores}, got {scores}" + assert torch.equal(expert_assignment, + ref_indices.to(torch.int32)), f"expected {ref_indices}, got {expert_assignment}" + assert expert_counts.sum( + ) == n_tokens * n_top_k, f"expected {n_tokens * n_top_k} tokens, got {expert_counts.sum()}" + + # Ensure that the expert offsets are unique + for i in range(n_experts): + expert_idxs = torch.where(expert_assignment == i, expert_offset, 0) + if expert_counts[i] > 0: + assert expert_idxs.unique().shape[0] == expert_counts[ + i], f"expected {expert_counts[i]} unique offsets, got {expert_idxs.unique().shape[0]}" + assert expert_idxs.max( + ) == expert_counts[i] - 1, f"expected max offset {expert_counts[i] - 1}, got {expert_idxs.max()}" + else: + # Should have all 0's so one unique value + assert expert_idxs.unique().shape[0] == 1 + assert expert_idxs.max() == 0 + + +@pytest.mark.inference_v2_ops +@pytest.mark.parametrize('n_tokens', [1, 17, 32, 89, 433]) +def test_top_2_e_8_gating(n_tokens: int) -> None: + _top_k_gating_testing_helper(n_tokens=n_tokens, n_experts=8, n_top_k=2) def _test_single_mapping_helper(n_tokens: int, @@ -19,6 +62,8 @@ def _test_single_mapping_helper(n_tokens: int, assigned_expert: int, logit_fill: float = 0.0, match_fill: float = 1.0) -> None: + + n_top_k = 1 logits = torch.full((n_tokens, n_experts), logit_fill, dtype=torch.float16, @@ -26,12 +71,12 @@ def _test_single_mapping_helper(n_tokens: int, logits[:, assigned_expert] = match_fill - gate = RaggedTop1Gating(DtypeEnum.fp16) + gate = RaggedTopKGating(DtypeEnum.fp16) expert_counts = torch.zeros((n_experts, ), dtype=torch.int32, device=get_accelerator().current_device()) - scores = torch.empty((n_tokens, ), dtype=torch.float32, device=get_accelerator().current_device()) - expert_assignment = torch.empty((n_tokens, ), dtype=torch.int32, device=get_accelerator().current_device()) - expert_offset = torch.empty((n_tokens, ), dtype=torch.int32, device=get_accelerator().current_device()) + scores = torch.empty((n_tokens, n_top_k), dtype=torch.float32, device=get_accelerator().current_device()) + expert_assignment = torch.empty((n_tokens, n_top_k), dtype=torch.int32, device=get_accelerator().current_device()) + expert_offset = torch.empty((n_tokens, n_top_k), dtype=torch.int32, device=get_accelerator().current_device()) batch = build_simple_batch([n_tokens], padding=False) gate(expert_counts, scores, expert_assignment, expert_offset, logits, batch) @@ -39,7 +84,7 @@ def _test_single_mapping_helper(n_tokens: int, assert expert_counts[assigned_expert] == n_tokens assert torch.all(expert_assignment == assigned_expert) assert torch.unique(expert_offset).shape[0] == n_tokens - assert allclose(scores, F.softmax(logits.float(), dim=1)[:, assigned_expert]) + assert allclose(scores, F.softmax(logits.float(), dim=1)[:, assigned_expert].reshape(-1, n_top_k)) @pytest.mark.inference_v2_ops @@ -72,6 +117,7 @@ def test_determinism(): n_tokens = 512 n_experts = 64 + n_top_k = 1 logits = torch.zeros((n_tokens, n_experts), dtype=torch.float16, device=get_accelerator().current_device()) batch = build_simple_batch([n_tokens], padding=False) @@ -79,13 +125,15 @@ def test_determinism(): logits[:, 19] = 1.0 logits[:, 26] = 1.0 - gate = RaggedTop1Gating(DtypeEnum.fp16) + gate = RaggedTopKGating(DtypeEnum.fp16) for _ in range(1024): expert_counts = torch.zeros((n_experts, ), dtype=torch.int32, device=get_accelerator().current_device()) - scores = torch.empty((n_tokens, ), dtype=torch.float32, device=get_accelerator().current_device()) - expert_assignment = torch.empty((n_tokens, ), dtype=torch.int32, device=get_accelerator().current_device()) - expert_offset = torch.empty((n_tokens, ), dtype=torch.int32, device=get_accelerator().current_device()) + scores = torch.empty((n_tokens, n_top_k), dtype=torch.float32, device=get_accelerator().current_device()) + expert_assignment = torch.empty((n_tokens, n_top_k), + dtype=torch.int32, + device=get_accelerator().current_device()) + expert_offset = torch.empty((n_tokens, n_top_k), dtype=torch.int32, device=get_accelerator().current_device()) batch = build_simple_batch([n_tokens], padding=False) gate(expert_counts, scores, expert_assignment, expert_offset, logits, batch) @@ -94,7 +142,7 @@ def test_determinism(): assert expert_counts[26] == 0 assert torch.all(expert_assignment == 19) assert torch.unique(expert_offset).shape[0] == n_tokens - assert allclose(scores, F.softmax(logits.float(), dim=1)[:, 19]) + assert allclose(scores, F.softmax(logits.float(), dim=1)[:, 19].reshape(-1, 1)) @pytest.mark.inference_v2_ops @@ -105,16 +153,19 @@ def test_score_accuracy(n_tokens: int, n_experts: int) -> None: """ logits = torch.randn((n_tokens, n_experts), dtype=torch.float16, device=get_accelerator().current_device()) batch = build_simple_batch([n_tokens], padding=False) + n_top_k = 1 - gate = RaggedTop1Gating(DtypeEnum.fp16) + gate = RaggedTopKGating(DtypeEnum.fp16) expert_counts = torch.zeros((n_experts, ), dtype=torch.int32, device=get_accelerator().current_device()) - scores = torch.empty((n_tokens, ), dtype=torch.float32, device=get_accelerator().current_device()) - expert_assignment = torch.empty((n_tokens, ), dtype=torch.int32, device=get_accelerator().current_device()) - expert_offset = torch.empty((n_tokens, ), dtype=torch.int32, device=get_accelerator().current_device()) + scores = torch.empty((n_tokens, n_top_k), dtype=torch.float32, device=get_accelerator().current_device()) + expert_assignment = torch.empty((n_tokens, n_top_k), dtype=torch.int32, device=get_accelerator().current_device()) + expert_offset = torch.empty((n_tokens, n_top_k), dtype=torch.int32, device=get_accelerator().current_device()) ref_scores = F.softmax(logits.float(), dim=1).max(dim=1).values + ref_scores = ref_scores.reshape(-1, 1) gate(expert_counts, scores, expert_assignment, expert_offset, logits, batch) + assert allclose(scores, ref_scores) assert expert_counts.sum() == n_tokens diff --git a/tests/unit/inference/v2/model_implementations/parameters/test_parameter_list.py b/tests/unit/inference/v2/model_implementations/parameters/test_parameter_list.py index 260236562ee9..06ff9047d648 100644 --- a/tests/unit/inference/v2/model_implementations/parameters/test_parameter_list.py +++ b/tests/unit/inference/v2/model_implementations/parameters/test_parameter_list.py @@ -26,7 +26,7 @@ def __init__(self, experts_per_rank: int) -> None: self._num_experts = experts_per_rank @property - def num_experts(self) -> int: + def n_experts(self) -> int: return self._num_experts @on_device diff --git a/tests/unit/inference/v2/modules/test_blocked_attn.py b/tests/unit/inference/v2/modules/test_blocked_attn.py index 215ad64636b1..6556aa460a44 100644 --- a/tests/unit/inference/v2/modules/test_blocked_attn.py +++ b/tests/unit/inference/v2/modules/test_blocked_attn.py @@ -12,7 +12,7 @@ from deepspeed.accelerator import get_accelerator from deepspeed.inference.v2.modules import ConfigBundle -from deepspeed.inference.v2.modules.configs import DSSelfAttentionConfig, PositionalEmbeddingType +from deepspeed.inference.v2.modules.configs import DSSelfAttentionConfig, PositionalEmbeddingType, RotateHalfConfig from deepspeed.inference.v2.modules.interfaces import DSSelfAttentionRegistry, DSSelfAttentionBase from ..kernels.ragged_ops.ragged_testing_utils import build_batch_and_manager @@ -37,13 +37,10 @@ def _blocked_flash_testing_helper(head_size: int, """ if trained_freqs is None: embed_type = PositionalEmbeddingType.none - embed_args = {} + embed_args = None else: embed_type = PositionalEmbeddingType.rotate_half - if trained_freqs: - embed_args = {'trained_freqs': True} - else: - embed_args = {'trained_freqs': False} + embed_args = RotateHalfConfig(use_trained_freqs=trained_freqs) attn_config = DSSelfAttentionConfig(max_tokens=2048, n_heads_q=n_heads_q, @@ -51,7 +48,7 @@ def _blocked_flash_testing_helper(head_size: int, head_size=head_size, max_sequences=32, positional_embedding_type=embed_type, - positional_embedding_args=embed_args) + positional_embedding_config=embed_args) config = ConfigBundle(name='dense_blocked_attention', config=attn_config) attn_module: DSSelfAttentionBase = DSSelfAttentionRegistry.instantiate_config(config) diff --git a/tests/unit/inference/v2/modules/test_cutlass_moe.py b/tests/unit/inference/v2/modules/test_cutlass_moe.py index e21170c9ed8f..b14ba127c6be 100644 --- a/tests/unit/inference/v2/modules/test_cutlass_moe.py +++ b/tests/unit/inference/v2/modules/test_cutlass_moe.py @@ -212,3 +212,117 @@ def test_in_out_channels(in_channels: int, out_channels: int) -> None: dtype=DtypeEnum.fp16, activation_type=ActivationType.IDENTITY, use_bias=True) + + +def _mixtral_moe_baseline(hidden_states: torch.Tensor, + gate_weight: torch.Tensor, + mlp_w1: torch.Tensor, + mlp_w2: torch.Tensor, + mlp_w3: torch.Tensor, + force_float: bool = False) -> torch.Tensor: + """ + Baseline implementation for mixtral MoE module. + + Based on transformers implementation: https://github.com/huggingface/transformers/blob/main/src/transformers/models/mixtral/modeling_mixtral.py + """ + output_dtype = hidden_states.dtype + if force_float: + hidden_states = hidden_states.float() + gate_weight = gate_weight.float() + mlp_w1 = mlp_w1.float() + mlp_w2 = mlp_w2.float() + mlp_w3 = mlp_w3.float() + + router_logits = torch.nn.functional.linear(hidden_states, gate_weight) + routing_weights = torch.nn.functional.softmax(router_logits, dim=-1, dtype=torch.float) + routing_weights, selected_experts = routing_weights.topk(k=2, dim=-1) + routing_weights /= routing_weights.sum(dim=-1, keepdim=True) + + # NOTE(cmikeh2): This is a difference implementation, ours will preserve the original scale + # as float32 and perform in-kernel fused FP16->FP32->FP16 conversion. + routing_weights = routing_weights.to(hidden_states.dtype) + + final_hidden_states = torch.zeros_like(hidden_states) + + expert_mask = torch.nn.functional.one_hot(selected_experts, num_classes=gate_weight.shape[0]).permute(2, 1, 0) + get_accelerator().synchronize() + + for expert_idx in range(gate_weight.shape[0]): + exp_mlp_w1 = mlp_w1[expert_idx] + exp_mlp_w2 = mlp_w2[expert_idx] + exp_mlp_w3 = mlp_w3[expert_idx] + + idx, top_x = torch.where(expert_mask[expert_idx]) + + if top_x.shape[0] == 0: + continue + + top_x_list = top_x.tolist() + idx_list = idx.tolist() + + current_state = hidden_states[top_x_list] + + linear = torch.nn.functional.linear + intermediate = torch.nn.functional.silu(linear(current_state, exp_mlp_w1)) * linear(current_state, exp_mlp_w3) + output = linear(intermediate, exp_mlp_w2) * routing_weights[top_x_list, idx_list].unsqueeze(-1) + final_hidden_states.index_add_(0, top_x, output.to(final_hidden_states.dtype)) + + return final_hidden_states.to(output_dtype) + + +@pytest.mark.inference_v2_ops +def test_mixtral_moe_config(): + + experts = 8 + n_top_k = 2 + in_channels = 4096 + intermediate_dim = 2048 + dtype = DtypeEnum.bf16 + + # Parameters + gate_weight = torch.randn( + (experts, in_channels), dtype=dtype.value, device=get_accelerator().current_device()) * .1 + + mlp_w1 = torch.randn( + (experts, intermediate_dim, in_channels), dtype=dtype.value, device=get_accelerator().current_device()) * .1 + mlp_w3 = torch.randn( + (experts, intermediate_dim, in_channels), dtype=dtype.value, device=get_accelerator().current_device()) * .1 + mlp_w2 = torch.randn( + (experts, in_channels, intermediate_dim), dtype=dtype.value, device=get_accelerator().current_device()) * .1 + + n_tokens = 256 + hidden_states = torch.randn( + (n_tokens, in_channels), dtype=dtype.value, device=get_accelerator().current_device()) * .1 + + baseline = _mixtral_moe_baseline(hidden_states, gate_weight, mlp_w1, mlp_w2, mlp_w3) + + mlp_w13_fused = torch.cat([mlp_w1, mlp_w3], dim=-1).reshape(experts, 2 * intermediate_dim, in_channels) + + config = DSMoEConfig(max_tokens=4096, + model_dim=in_channels, + intermediate_features=intermediate_dim, + n_experts=experts, + activation=ActivationType.SiGLU, + input_dtype=dtype, + output_dtype=dtype, + top_k=n_top_k, + normalize_scores=True) + + implementation_config = {"weight_dtype": DtypeEnum(dtype)} + + bundle = ConfigBundle(name='cutlass_multi_gemm_moe', config=config, implementation_config=implementation_config) + moe_module = DSMoERegistry.instantiate_config(bundle) + + batch = build_simple_batch([n_tokens]) + + gate_ds = moe_module.transform_gate_param(gate_weight) + mlp_w1_ds = moe_module.transform_moe_mlp_1_param(mlp_w13_fused) + mlp_w2_ds = moe_module.transform_moe_mlp_2_param(mlp_w2) + + output = moe_module(hidden_states, batch, gate_ds, mlp_w1_ds, mlp_w2_ds) + + # NOTE(cmikeh2): These are higher than the other tests for reasons that aren't quite + # clear to me. My best guess is that the SiGLU activation is causing larger numerical + # divergence. The thresholds chosen here is based on the observed error between the + # float and bfloat16 reference implementations. + assert allclose(output, baseline.to(dtype.value), tolerances=(5e-2, 5e-2)) From 827e1ca8aa76926d0765743efc59d8c2d1cb9db5 Mon Sep 17 00:00:00 2001 From: Michael Wyatt Date: Wed, 20 Dec 2023 16:48:47 -0800 Subject: [PATCH 048/754] Update version.txt after 0.12.6 release (#4850) **Auto-generated PR to update version.txt after a DeepSpeed release** Released version - 0.12.6 Author - @mrwyattii Co-authored-by: mrwyattii --- version.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/version.txt b/version.txt index dabff2f13810..e2e3067ddc5f 100644 --- a/version.txt +++ b/version.txt @@ -1 +1 @@ -0.12.6 +0.12.7 From 75c772021484fa0f9d9a3872a90c0876f7cf59d8 Mon Sep 17 00:00:00 2001 From: Gavin Goodship Date: Thu, 21 Dec 2023 19:13:24 +0000 Subject: [PATCH 049/754] doc corrections (#4861) --- docs/_tutorials/advanced-install.md | 50 ++++++++++++++--------------- 1 file changed, 25 insertions(+), 25 deletions(-) diff --git a/docs/_tutorials/advanced-install.md b/docs/_tutorials/advanced-install.md index 10197e62f681..d27ecf021421 100755 --- a/docs/_tutorials/advanced-install.md +++ b/docs/_tutorials/advanced-install.md @@ -27,7 +27,7 @@ ds_report ## Pre-install DeepSpeed Ops -**Note:** [PyTorch](https://pytorch.org/) must be installed _before_ pre-compiling any DeepSpeed c++/cuda ops. However, this is not required if using the default mode of JIT compilation of ops. +**Note:** [PyTorch](https://pytorch.org/) must be installed _before_ pre-compiling any DeepSpeed C++/CUDA ops. However, this is not required if using the default mode of JIT compilation of ops. {: .notice--info} Sometimes we have found it useful to pre-install either some or all DeepSpeed @@ -56,22 +56,22 @@ DS_BUILD_FUSED_LAMB=1 pip install deepspeed ``` Available `DS_BUILD` options include: -* `DS_BUILD_OPS` toggles all ops -* `DS_BUILD_AIO` builds asynchronous (NVMe) I/O op -* `DS_BUILD_CCL_COMM` builds the communication collective libs -* `DS_BUILD_CPU_ADAM` builds the CPUAdam op -* `DS_BUILD_CPU_LION` builds the CPULion op -* `DS_BUILD_EVOFORMER_ATTN` builds the EvoformerAttn op (from [Alphafold](https://www.deepspeed.ai/tutorials/ds4sci_evoformerattention/)) -* `DS_BUILD_FUSED_ADAM` builds the FusedAdam op (from [apex](https://github.com/NVIDIA/apex)) -* `DS_BUILD_FUSED_LION` builds the FusedLion op -* `DS_BUILD_CPU_ADAGRAD` builds the CPUAdagrad op -* `DS_BUILD_FUSED_LAMB` builds the FusedLamb op -* `DS_BUILD_QUANTIZER` builds the quantizer op -* `DS_BUILD_RANDOM_LTD` builds the random ltd op -* `DS_BUILD_SPARSE_ATTN` builds the sparse attention op -* `DS_BUILD_TRANSFORMER` builds the transformer op -* `DS_BUILD_TRANSFORMER_INFERENCE` builds the transformer-inference op -* `DS_BUILD_STOCHASTIC_TRANSFORMER` builds the stochastic transformer op +* `DS_BUILD_OPS` toggles all ops. +* `DS_BUILD_AIO` builds asynchronous (NVMe) I/O op. +* `DS_BUILD_CCL_COMM` builds the communication collective libs. +* `DS_BUILD_CPU_ADAM` builds the CPUAdam op. +* `DS_BUILD_CPU_LION` builds the CPULion op. +* `DS_BUILD_EVOFORMER_ATTN` builds the EvoformerAttn op (from [Alphafold](https://www.deepspeed.ai/tutorials/ds4sci_evoformerattention/)). +* `DS_BUILD_FUSED_ADAM` builds the FusedAdam op (from [apex](https://github.com/NVIDIA/apex)). +* `DS_BUILD_FUSED_LION` builds the FusedLion op. +* `DS_BUILD_CPU_ADAGRAD` builds the CPUAdagrad op. +* `DS_BUILD_FUSED_LAMB` builds the FusedLamb op. +* `DS_BUILD_QUANTIZER` builds the quantizer op. +* `DS_BUILD_RANDOM_LTD` builds the random ltd op. +* `DS_BUILD_SPARSE_ATTN` builds the sparse attention op. +* `DS_BUILD_TRANSFORMER` builds the transformer op. +* `DS_BUILD_TRANSFORMER_INFERENCE` builds the transformer-inference op. +* `DS_BUILD_STOCHASTIC_TRANSFORMER` builds the stochastic transformer op. To speed up the build-all process, you can parallelize the compilation process with: @@ -81,7 +81,7 @@ DS_BUILD_OPS=1 pip install deepspeed --global-option="build_ext" --global-option This should complete the full build 2-3 times faster. You can adjust `-j` to specify how many cpu-cores are to be used during the build. In the example it is set to 8 cores. -You can also build a binary wheel and install it on multiple machines that have the same type of GPUs and the same software environment (CUDA toolkit, pytorch, python, etc.) +You can also build a binary wheel and install it on multiple machines that have the same type of GPUs and the same software environment (CUDA toolkit, PyTorch, Python, etc.) ```bash DS_BUILD_OPS=1 python setup.py build_ext -j8 bdist_wheel @@ -107,7 +107,7 @@ pip install . For installs spanning multiple nodes we find it useful to install DeepSpeed using the [install.sh](https://github.com/microsoft/DeepSpeed/blob/master/install.sh) -script in the repo. This will build a python wheel locally and copy it to all +script in the repo. This will build a Python wheel locally and copy it to all the nodes listed in your hostfile (either given via `--hostfile`, or defaults to `/job/hostfile`). @@ -118,7 +118,7 @@ extensions will be loaded form that directory. If you use multiple virtual environments this could be a problem, since by default there is only one `torch_extensions` directory, but different virtual environments may use different setups (e.g., different -python or cuda versions) and then the loading of a CUDA extension built by another environment will +Python or CUDA versions) and then the loading of a CUDA extension built by another environment will fail. Therefore, if you need to you can override the default location with the help of the `TORCH_EXTENSIONS_DIR` environment variable. So in each virtual environment you can point it to a unique directory and DeepSpeed will use it to save and load CUDA extensions. @@ -146,9 +146,9 @@ If you're getting the following error: ``` RuntimeError: CUDA error: no kernel image is available for execution on the device ``` -when running deepspeed, that means that the cuda extensions weren't built for the card you're trying to use it for. +when running deepspeed, that means that the CUDA extensions weren't built for the card you're trying to use it for. -When building from source deepspeed will try to support a wide range of architectures, but under jit-mode it'll only +When building from source DeepSpeed will try to support a wide range of architectures, but under jit-mode it'll only support the architectures visible at the time of building. You can build specifically for a desired range of architectures by setting a `TORCH_CUDA_ARCH_LIST` env variable: @@ -159,9 +159,9 @@ TORCH_CUDA_ARCH_LIST="6.1;7.5;8.6" pip install ... It will also make the build faster when you only build for a few architectures. -This is also recommended to ensure your exact architecture is used. Due to a variety of technical reasons, a distributed pytorch binary isn't built to fully support all architectures, skipping binary compatible ones, at a potential cost of underutilizing your full card's compute capabilities. To see which architectures get included during the deepspeed build from source - save the log and grep for `-gencode` arguments. +This is also recommended to ensure your exact architecture is used. Due to a variety of technical reasons, a distributed PyTorch binary isn't built to fully support all architectures, skipping binary compatible ones, at a potential cost of underutilizing your full card's compute capabilities. To see which architectures get included during the DeepSpeed build from source - save the log and grep for `-gencode` arguments. -The full list of nvidia GPUs and their compute capabilities can be found [here](https://developer.nvidia.com/cuda-gpus). +The full list of Nvidia GPUs and their compute capabilities can be found [here](https://developer.nvidia.com/cuda-gpus). ## CUDA version mismatch @@ -171,7 +171,7 @@ If you're getting the following error: Exception: >- DeepSpeed Op Builder: Installed CUDA version {VERSION} does not match the version torch was compiled with {VERSION}, unable to compile cuda/cpp extensions without a matching cuda version. ``` You have a misaligned version of CUDA installed compared to the version of CUDA -used to compile torch. A mismatch in the major version is likely to result in +used to compile Torch. A mismatch in the major version is likely to result in errors or unexpected behavior. The easiest fix for this error is changing the CUDA version installed (check From c37fe9cbfb8bc10c8dd6ccd8cac9b34ded218990 Mon Sep 17 00:00:00 2001 From: Heyang Qin Date: Fri, 22 Dec 2023 11:48:48 -0800 Subject: [PATCH 050/754] Fix exception handling in get_all_ranks_from_group() function (#4862) In the latest Pytorch nightly, the exception thrown from `torch.distributed.distributed_c10d.get_global_rank()` is changed from `RuntimeError` to `ValueError` so we need to update our try-catch in `deepspeed.comm` Tested with torch version 2.3.0.dev20231221+cu121 Fixes: https://github.com/microsoft/DeepSpeed/issues/4853 --- deepspeed/comm/comm.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/deepspeed/comm/comm.py b/deepspeed/comm/comm.py index 568211645f40..fb92c1e98421 100644 --- a/deepspeed/comm/comm.py +++ b/deepspeed/comm/comm.py @@ -595,7 +595,7 @@ def get_all_ranks_from_group(group=None): while True: group_ranks.append(cdb.get_global_rank(group, rank)) rank += 1 - except RuntimeError: + except (RuntimeError, ValueError): pass return group_ranks From 3e94f8c75116377d4b1c32b8c674368a27fb2a77 Mon Sep 17 00:00:00 2001 From: Nadav Elyahu <88962733+nelyahu@users.noreply.github.com> Date: Tue, 26 Dec 2023 18:00:11 +0200 Subject: [PATCH 051/754] deepspeed engine: fp16 support validation on init (#4843) --- deepspeed/runtime/engine.py | 3 +++ 1 file changed, 3 insertions(+) diff --git a/deepspeed/runtime/engine.py b/deepspeed/runtime/engine.py index 9c9641a1c4cf..4f672f0ba5e2 100644 --- a/deepspeed/runtime/engine.py +++ b/deepspeed/runtime/engine.py @@ -1017,6 +1017,9 @@ def _supported_optims(self): # Validate configuration based on command line arguments def _do_sanity_check(self): + if self.fp16_enabled() and not get_accelerator().is_fp16_supported(): + raise ValueError("Type fp16 is not supported.") + expected_optim_types = self._supported_optims() expected_optim_types += [type(None), Callable] assert isinstance(self.client_optimizer, tuple(expected_optim_types)), \ From 40342055cefda4c453e803759861b00ca5cfb879 Mon Sep 17 00:00:00 2001 From: Chirag Jain Date: Sat, 30 Dec 2023 08:18:49 +0530 Subject: [PATCH 052/754] Remove hooks on gradient accumulation on engine/optimizer destroy (#4858) Fixes: #4856 See: https://github.com/pytorch/pytorch/issues/46386 --- deepspeed/runtime/engine.py | 3 ++- deepspeed/runtime/zero/stage3.py | 6 +++++- deepspeed/runtime/zero/stage_1_and_2.py | 8 +++++++- deepspeed/utils/debug.py | 7 +++++++ 4 files changed, 21 insertions(+), 3 deletions(-) diff --git a/deepspeed/runtime/engine.py b/deepspeed/runtime/engine.py index 4f672f0ba5e2..79bdba90e6d4 100644 --- a/deepspeed/runtime/engine.py +++ b/deepspeed/runtime/engine.py @@ -69,7 +69,7 @@ STEP_MICRO_TIMER, \ FORWARD_GLOBAL_TIMER, BACKWARD_GLOBAL_TIMER, BACKWARD_INNER_GLOBAL_TIMER, BACKWARD_REDUCE_GLOBAL_TIMER, \ STEP_GLOBAL_TIMER -from deepspeed.utils.debug import debug_extract_module_and_param_names +from deepspeed.utils.debug import debug_extract_module_and_param_names, debug_clear_module_and_param_names from deepspeed.monitor.monitor import MonitorMaster from deepspeed.runtime.progressive_layer_drop import ProgressiveLayerDrop from deepspeed.runtime.utils import clip_grad_norm_ @@ -362,6 +362,7 @@ def __init__( def destroy(self): if self.optimizer is not None and hasattr(self.optimizer, 'destroy'): self.optimizer.destroy() + debug_clear_module_and_param_names() def _get_model_parameters(self): if self.autotuning_profile_model_info(): diff --git a/deepspeed/runtime/zero/stage3.py b/deepspeed/runtime/zero/stage3.py index 30a168dcd396..fa4e64faf5a5 100644 --- a/deepspeed/runtime/zero/stage3.py +++ b/deepspeed/runtime/zero/stage3.py @@ -377,6 +377,7 @@ def __init__( #creates backward hooks for gradient partitioning ###Calls all gather param + self._grad_acc_hooks = [] self.create_reduce_and_remove_grad_hooks() #exit(0) @@ -397,6 +398,9 @@ def __init__( def destroy(self): self.parameter_offload.destroy() + for hook in self._grad_acc_hooks: + hook.remove() + print_rank_0("Removed grad acc hooks", force=False) del self.__ipg_bucket_flat_buffer def initialize_ds_offload( @@ -1118,7 +1122,7 @@ def wrapper(param): def reduce_partition_and_remove_grads(*notneeded): self.reduce_ready_partitions_and_remove_grads(param) - grad_acc.register_hook(reduce_partition_and_remove_grads) + self._grad_acc_hooks.append(grad_acc.register_hook(reduce_partition_and_remove_grads)) self.grad_accs.append(grad_acc) #print(f"param grad fn {param.expand_as(param).grad_fn}") diff --git a/deepspeed/runtime/zero/stage_1_and_2.py b/deepspeed/runtime/zero/stage_1_and_2.py index aeb533698af3..e17bcbe6ade8 100755 --- a/deepspeed/runtime/zero/stage_1_and_2.py +++ b/deepspeed/runtime/zero/stage_1_and_2.py @@ -490,6 +490,7 @@ def __init__(self, self.reset_partition_gradient_structures() # creates backward hooks for gradient partitioning + self._grad_acc_hooks = [] if self.partition_gradients or self.overlap_comm: self.create_reduce_and_remove_grad_hooks() @@ -522,6 +523,11 @@ def __init__(self, self._enable_universal_checkpoint() self._param_slice_mappings = self._create_param_mapping() + def destroy(self): + for hook in self._grad_acc_hooks: + hook.remove() + self.print_rank_0("Removed grad acc hooks") + def _enable_universal_checkpoint(self): for lp_param_group in self.bit16_groups: enable_universal_checkpoint(param_list=lp_param_group) @@ -864,7 +870,7 @@ def wrapper(param, i): def reduce_partition_and_remove_grads(*notneeded): self.reduce_ready_partitions_and_remove_grads(param, i) - grad_acc.register_hook(reduce_partition_and_remove_grads) + self._grad_acc_hooks.append(grad_acc.register_hook(reduce_partition_and_remove_grads)) self.grad_accs.append(grad_acc) wrapper(param, i) diff --git a/deepspeed/utils/debug.py b/deepspeed/utils/debug.py index 02295fa98011..cebea56255d9 100644 --- a/deepspeed/utils/debug.py +++ b/deepspeed/utils/debug.py @@ -11,6 +11,13 @@ param_names = {} +def debug_clear_module_and_param_names(): + global module_names + global param_names + module_names = {} + param_names = {} + + def debug_extract_module_and_param_names(model): # extract the fully qualified names as soon as the model is acquired global module_names From ea0d81143c6ba0801828919ea53888843d0fb19f Mon Sep 17 00:00:00 2001 From: mmhab <132277730+mmhab@users.noreply.github.com> Date: Tue, 2 Jan 2024 15:19:08 +0200 Subject: [PATCH 053/754] optimize grad_norm calculation in stage3.py (#4436) reduce the synchronization between the device and the host by removing .item() from the loops that calculate the total norm. --------- Co-authored-by: Olatunji Ruwase Co-authored-by: Michael Wyatt Co-authored-by: Michael Wyatt Co-authored-by: Shaden Smith --- deepspeed/runtime/zero/stage3.py | 24 ++++++++++++++++-------- 1 file changed, 16 insertions(+), 8 deletions(-) diff --git a/deepspeed/runtime/zero/stage3.py b/deepspeed/runtime/zero/stage3.py index fa4e64faf5a5..ce4137028195 100644 --- a/deepspeed/runtime/zero/stage3.py +++ b/deepspeed/runtime/zero/stage3.py @@ -1328,7 +1328,7 @@ def complete_grad_norm_calculation_for_cpu_offload(self, params): param_id = self.get_param_id(p) if param_id in self.norm_for_param_grads.keys(): param_norm = self.norm_for_param_grads[param_id] - total_norm += param_norm.item()**2 + total_norm += param_norm**2 # Sum across all model parallel GPUs. total_norm_cuda = get_accelerator().FloatTensor([float(total_norm)]) @@ -1337,10 +1337,14 @@ def complete_grad_norm_calculation_for_cpu_offload(self, params): self._model_parallel_all_reduce(tensor=total_norm_cuda, op=dist.ReduceOp.SUM) - total_norm = total_norm_cuda[0].item()**(1. / norm_type) + total_norm = total_norm_cuda[0]**(1. / norm_type) - if total_norm == float('inf') or total_norm == -float('inf') or total_norm != total_norm: - total_norm = -1 + norm_is_inf = total_norm.isinf() + norm_is_nan = total_norm.isnan() + inf_or_nan = norm_is_nan.logical_or(norm_is_inf) + + err = torch.tensor(-1.0, device=self.device, dtype=torch.float) + total_norm = inf_or_nan * err + inf_or_nan.logical_not() * total_norm return total_norm @@ -1669,7 +1673,7 @@ def get_grad_norm_direct(self, gradients, params, norm_type=2): # Take max across all GPUs. self._model_parallel_all_reduce(tensor=total_norm_cuda, op=dist.ReduceOp.MAX) - total_norm = total_norm_cuda[0].item() + total_norm = total_norm_cuda[0] else: # if dist.get_rank() == 0: # logger.info(f"Total Norm beginning {total_norm}") @@ -1690,10 +1694,14 @@ def get_grad_norm_direct(self, gradients, params, norm_type=2): self._model_parallel_all_reduce(tensor=total_norm_cuda, op=dist.ReduceOp.SUM) - total_norm = total_norm_cuda.item()**(1. / norm_type) + total_norm = total_norm_cuda**(1. / norm_type) + + norm_is_inf = total_norm.isinf() + norm_is_nan = total_norm.isnan() + inf_or_nan = norm_is_nan.logical_or(norm_is_inf) - if total_norm == float('inf') or total_norm == -float('inf') or total_norm != total_norm: - total_norm = -1 + err = torch.tensor(-1.0, device=self.device, dtype=torch.float) + total_norm = inf_or_nan * err + inf_or_nan.logical_not() * total_norm return total_norm From 9ec55bd99bf39866facc8d0925b3780e37270296 Mon Sep 17 00:00:00 2001 From: Jiahao Li Date: Wed, 3 Jan 2024 02:17:50 +0800 Subject: [PATCH 054/754] Fix f-string messages (#4865) Fix error messages that missed the f prefix. Co-authored-by: Logan Adams <114770087+loadams@users.noreply.github.com> --- deepspeed/runtime/zero/contiguous_memory_allocator.py | 2 +- deepspeed/runtime/zero/stage_1_and_2.py | 4 ++-- tests/unit/runtime/test_ds_config_dict.py | 2 +- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/deepspeed/runtime/zero/contiguous_memory_allocator.py b/deepspeed/runtime/zero/contiguous_memory_allocator.py index 632f68ca1718..35b3d5c7dd5d 100644 --- a/deepspeed/runtime/zero/contiguous_memory_allocator.py +++ b/deepspeed/runtime/zero/contiguous_memory_allocator.py @@ -193,7 +193,7 @@ def _defragment_memory(self): tensor = self.tensor_map[self.tensor_ids[tensor_addr]] assert tensor_size == tensor.numel(), \ - "Size mismatch. {tensor_size} is allocated at addr {tensor_addr} but tensor size is {tensor.numel()} " + f"Size mismatch. {tensor_size} is allocated at addr {tensor_addr} but tensor size is {tensor.numel()} " assert empty_addr != tensor_addr, \ f"Cannot have same empty address {empty_addr} and tensor address {tensor_addr}" diff --git a/deepspeed/runtime/zero/stage_1_and_2.py b/deepspeed/runtime/zero/stage_1_and_2.py index e17bcbe6ade8..2eec7cbc96a1 100755 --- a/deepspeed/runtime/zero/stage_1_and_2.py +++ b/deepspeed/runtime/zero/stage_1_and_2.py @@ -240,8 +240,8 @@ def __init__(self, if self.reduce_scatter: valid_reduce_scatter_dtypes = (torch.float16, torch.bfloat16, torch.float32) assert self.communication_data_type in valid_reduce_scatter_dtypes, f"{self.zero_stage_string} supports {valid_reduce_scatter_dtypes} communication_data_type with reduce scatter enabled. Got: '{self.communication_data_type}'" - assert self.gradient_predivide_factor == 1.0, "gradient_predivide_factor != 1.0 is not yet supported with {self.zero_stage_string} with reduce scatter enabled" - assert self.postscale_gradients, "pre-scale gradients is not yet supported with {self.zero_stage_string} with reduce scatter enabled" + assert self.gradient_predivide_factor == 1.0, f"gradient_predivide_factor != 1.0 is not yet supported with {self.zero_stage_string} with reduce scatter enabled" + assert self.postscale_gradients, f"pre-scale gradients is not yet supported with {self.zero_stage_string} with reduce scatter enabled" # param flattened by groups self.bit16_groups = [] diff --git a/tests/unit/runtime/test_ds_config_dict.py b/tests/unit/runtime/test_ds_config_dict.py index 6cd01644fad5..880282bb7e57 100644 --- a/tests/unit/runtime/test_ds_config_dict.py +++ b/tests/unit/runtime/test_ds_config_dict.py @@ -90,7 +90,7 @@ class TestBatchConfig(DistributedTest): def test(self, num_ranks, batch, micro_batch, gas, success): assert dist.get_world_size() == num_ranks, \ - 'The test assumes a world size of f{num_ranks}' + f'The test assumes a world size of {num_ranks}' ds_batch_config = get_test_path('ds_batch_config.json') ds_config = DeepSpeedConfig(ds_batch_config) From d873ce61593e3d436a8684731901693dee7bd957 Mon Sep 17 00:00:00 2001 From: CurryRice233 Date: Wed, 3 Jan 2024 04:58:39 +0800 Subject: [PATCH 055/754] [NPU] Fix npu offload bug (#4883) There are some syntax errors in the NPU offload. There may be no AVX instruction set on our server due to environment variables, as a result, this problem is not verified in our tests. Sorry for the inconvenience and we will be more cautious in the next PRs. Co-authored-by: jializheng Co-authored-by: Olatunji Ruwase Co-authored-by: Logan Adams <114770087+loadams@users.noreply.github.com> --- csrc/includes/cpu_adagrad.h | 3 ++- csrc/includes/cpu_adam.h | 6 +++--- csrc/includes/cpu_lion.h | 3 ++- 3 files changed, 7 insertions(+), 5 deletions(-) diff --git a/csrc/includes/cpu_adagrad.h b/csrc/includes/cpu_adagrad.h index 59888adf17c3..e60984d64b76 100644 --- a/csrc/includes/cpu_adagrad.h +++ b/csrc/includes/cpu_adagrad.h @@ -194,7 +194,7 @@ void Adagrad_Optimizer::Step_AVX(size_t* rounded_size, #elif defined(__ENABLE_CANN__) if (dev_params) { size_t memcpy_size = copy_size * sizeof(_doubled_buffer[_buf_index][0]); - if (half_precision) memoryCopySize /= 2; + if (half_precision) memcpy_size /= 2; aclrtMemcpy(dev_params + t, memcpy_size, _doubled_buffer[_buf_index], @@ -202,6 +202,7 @@ void Adagrad_Optimizer::Step_AVX(size_t* rounded_size, aclrtMemcpyKind::ACL_MEMCPY_HOST_TO_DEVICE); _buf_index = !_buf_index; + } #endif } *rounded_size = new_rounded_size; diff --git a/csrc/includes/cpu_adam.h b/csrc/includes/cpu_adam.h index 44d3ed3cac61..b1a104b2571d 100644 --- a/csrc/includes/cpu_adam.h +++ b/csrc/includes/cpu_adam.h @@ -215,8 +215,7 @@ void Adam_Optimizer::Step_AVX(size_t* rounded_size, #if defined(__ENABLE_CUDA__) if ((t / TILE) >= 2) { cudaStreamSynchronize(_streams[_buf_index]); } #elif defined(__ENABLE_CANN__) - if ((t / TILE) >= 2) { aclrtSynchronizeStream((_streams[_buf_index].stream()); - } + if ((t / TILE) >= 2) { aclrtSynchronizeStream(_streams[_buf_index].stream()); } #endif #pragma omp parallel for for (size_t i = t; i < offset; i += SIMD_WIDTH * span) { @@ -274,7 +273,7 @@ void Adam_Optimizer::Step_AVX(size_t* rounded_size, #elif defined(__ENABLE_CANN__) if (dev_params) { size_t memcpy_size = copy_size * sizeof(_doubled_buffer[_buf_index][0]); - if (half_precision) memoryCopySize /= 2; + if (half_precision) memcpy_size /= 2; aclrtMemcpy(dev_params + t, memcpy_size, _doubled_buffer[_buf_index], @@ -282,6 +281,7 @@ void Adam_Optimizer::Step_AVX(size_t* rounded_size, aclrtMemcpyKind::ACL_MEMCPY_HOST_TO_DEVICE); _buf_index = !_buf_index; + } #endif } *rounded_size = new_rounded_size; diff --git a/csrc/includes/cpu_lion.h b/csrc/includes/cpu_lion.h index d83fe9473332..34c29eec47db 100644 --- a/csrc/includes/cpu_lion.h +++ b/csrc/includes/cpu_lion.h @@ -223,7 +223,7 @@ void Lion_Optimizer::Step_AVX(size_t* rounded_size, #elif defined(__ENABLE_CANN__) if (dev_params) { size_t memcpy_size = copy_size * sizeof(_doubled_buffer[_buf_index][0]); - if (half_precision) memoryCopySize /= 2; + if (half_precision) memcpy_size /= 2; aclrtMemcpy(dev_params + t, memcpy_size, _doubled_buffer[_buf_index], @@ -231,6 +231,7 @@ void Lion_Optimizer::Step_AVX(size_t* rounded_size, aclrtMemcpyKind::ACL_MEMCPY_HOST_TO_DEVICE); _buf_index = !_buf_index; + } #endif } *rounded_size = new_rounded_size; From 81cc32075c721c28378153ee34df11a6d4591db3 Mon Sep 17 00:00:00 2001 From: Max Kovalenko <75629718+deepcharm@users.noreply.github.com> Date: Wed, 3 Jan 2024 01:44:12 +0200 Subject: [PATCH 056/754] Partition parameters: Minor refactoring of use_secondary_tensor condition (#4868) Introduce use_secondary_tensor bool variable to shorten notation and improve readability. Co-authored-by: Logan Adams <114770087+loadams@users.noreply.github.com> --- .../runtime/zero/partition_parameters.py | 19 +++++++++---------- 1 file changed, 9 insertions(+), 10 deletions(-) diff --git a/deepspeed/runtime/zero/partition_parameters.py b/deepspeed/runtime/zero/partition_parameters.py index cdf7de512b9b..992dcd446ad6 100755 --- a/deepspeed/runtime/zero/partition_parameters.py +++ b/deepspeed/runtime/zero/partition_parameters.py @@ -1064,7 +1064,9 @@ def all_gather(param_list=None, async_op=False, hierarchy=0): def _all_gather_dtype(dtype, params, forward, world_size, rank_in_group, ds_process_group): partition_sz = sum(p.ds_tensor.ds_numel for p in params) - if params[0].ds_secondary_tensor is not None and not forward: + use_secondary_tensor = params[0].ds_secondary_tensor is not None and not forward + + if use_secondary_tensor: partition_sz = sum(p.ds_tensor.ds_numel * p.ds_secondary_tensor_num_of_groups for p in params) flat_tensor = torch.empty(partition_sz * world_size, @@ -1076,13 +1078,11 @@ def _all_gather_dtype(dtype, params, forward, world_size, rank_in_group, ds_proc for i in range(world_size): partitions.append(flat_tensor.narrow(0, partition_sz * i, partition_sz)) - if params[0].ds_secondary_tensor is not None and not forward: - use_secondary_tensor = True + if use_secondary_tensor: instrument_w_nvtx( torch.cat)([p.ds_secondary_tensor.to(get_accelerator().current_device_name()) for p in params], out=partitions[rank_in_group]) else: - use_secondary_tensor = False instrument_w_nvtx(torch.cat)([p.ds_tensor.to(get_accelerator().current_device_name()) for p in params], out=partitions[rank_in_group]) handle = _dist_allgather_fn(partitions[rank_in_group], flat_tensor, ds_process_group) @@ -1118,7 +1118,7 @@ def all_gather_coalesced(params: Iterable[Parameter], ds_process_group = self.ds_process_group rank_in_group = self.rank world_size = self.dp_world_size - use_secondary_tensor = False + use_secondary_tensor = params[0].ds_secondary_tensor is not None and not forward if self.zero_param_process_group and not forward: ds_process_group = self.zero_param_process_group #intragroup rank_in_group = self.rank_in_group @@ -1149,10 +1149,10 @@ def all_gather_coalesced(params: Iterable[Parameter], # have an opportunity to avoid some intermediate memory allocations param, = params buffer_size = math.ceil(param.ds_numel / world_size) * world_size - if not forward and param.ds_secondary_tensor is not None: + if use_secondary_tensor: buffer_size = param.ds_secondary_tensor.shape[0] * world_size #make sure out is appropriately sized - param_ds_tensor = param.ds_secondary_tensor if not forward and param.ds_secondary_tensor is not None else param.ds_tensor + param_ds_tensor = param.ds_secondary_tensor if use_secondary_tensor else param.ds_tensor param_buffer = torch.empty( buffer_size, dtype=param_ds_tensor.dtype if not quantize else torch.int8, @@ -1207,7 +1207,7 @@ def all_gather_coalesced(params: Iterable[Parameter], else: partition_sz = sum(p.ds_tensor.ds_numel for p in params) - if params[0].ds_secondary_tensor is not None and not forward: + if use_secondary_tensor: partition_sz = sum(p.ds_tensor.ds_numel * p.ds_secondary_tensor_num_of_groups for p in params) flat_tensor = torch.empty(partition_sz * world_size, @@ -1215,8 +1215,7 @@ def all_gather_coalesced(params: Iterable[Parameter], device=get_accelerator().current_device_name(), requires_grad=False) - if params[0].ds_secondary_tensor is not None and not forward: - use_secondary_tensor = True + if use_secondary_tensor: if hasattr(params[0].ds_secondary_tensor, "ds_quant_scale"): quantized_param = instrument_w_nvtx(torch.cat)([ p.ds_secondary_tensor.data.to(get_accelerator().current_device_name()) for p in params From ac84cf3ff1631532939b25793d152f3091389ceb Mon Sep 17 00:00:00 2001 From: Nadav Elyahu <88962733+nelyahu@users.noreply.github.com> Date: Wed, 3 Jan 2024 20:44:12 +0200 Subject: [PATCH 057/754] Pipeline: Add support to eval micro bs configuration (#4859) When running evaluation the general memory consumption is reduced. Mainly due to absence of gradients, and hanging FWD activations. It allows to increase the micro-bs and improve the evaluation performance. This commits add the option to pass num_micro_batches to eval_batch(), as the current assumption is that same micro-bs and global-bs is used, so same number micro batches will take place. This commit also modifies _scale_loss_by_gas in runtime/engine.py to consider number of eval micro batches for loss scaling instead of training gas. Co-authored-by: Logan Adams <114770087+loadams@users.noreply.github.com> --- deepspeed/runtime/engine.py | 9 ++++++--- deepspeed/runtime/pipe/engine.py | 17 +++++++++++++---- 2 files changed, 19 insertions(+), 7 deletions(-) diff --git a/deepspeed/runtime/engine.py b/deepspeed/runtime/engine.py index 79bdba90e6d4..c03fba2d7784 100644 --- a/deepspeed/runtime/engine.py +++ b/deepspeed/runtime/engine.py @@ -1754,14 +1754,17 @@ def eval(self): self.warn_unscaled_loss = True self.module.train(False) - def _scale_loss_by_gas(self, prescaled_loss): + def _scale_loss_by_gas(self, prescaled_loss, eval_micro_batches=None): + # In pipeline evaluation, there is an option to use different micro-bs, which creates different number of + # micro batches, thus the training gas, is not valid in this case. need to use the number of eval_micro_batches + scaling_factor = self.gradient_accumulation_steps() if eval_micro_batches is None else eval_micro_batches if isinstance(prescaled_loss, torch.Tensor): - scaled_loss = prescaled_loss / self.gradient_accumulation_steps() + scaled_loss = prescaled_loss / scaling_factor elif isinstance(prescaled_loss, tuple) or isinstance(prescaled_loss, list): scaled_loss = [] for l in prescaled_loss: if isinstance(l, torch.Tensor): - scaled_loss.append(l / self.gradient_accumulation_steps()) + scaled_loss.append(l / scaling_factor) else: scaled_loss.append(l) else: diff --git a/deepspeed/runtime/pipe/engine.py b/deepspeed/runtime/pipe/engine.py index 27fa5b69d35d..05029e44d0e8 100644 --- a/deepspeed/runtime/pipe/engine.py +++ b/deepspeed/runtime/pipe/engine.py @@ -402,7 +402,13 @@ def train_batch(self, data_iter=None): # TODO: should return precisely what loss returned and allow others to be queried? return self.agg_train_loss - def eval_batch(self, data_iter, return_logits=False, compute_loss=True, reduce_output='avg', bcast_loss=True): + def eval_batch(self, + data_iter, + return_logits=False, + compute_loss=True, + reduce_output='avg', + bcast_loss=True, + num_micro_batches=None): """Evaluate the pipeline on a batch of data from ``data_iter``. The engine will evaluate ``self.train_batch_size()`` total samples collectively across all workers. @@ -451,6 +457,9 @@ def eval_batch(self, data_iter, return_logits=False, compute_loss=True, reduce_o train_iterator = self.data_iterator self.set_dataiterator(data_iter) + # set the number micro batches in case the user chose value than training + micro_batches = self.micro_batches if num_micro_batches is None else num_micro_batches + # Do the work sched = schedule.InferenceSchedule(micro_batches=self.micro_batches, stages=self.num_stages, @@ -463,7 +472,7 @@ def eval_batch(self, data_iter, return_logits=False, compute_loss=True, reduce_o self._exec_schedule(sched) if self.is_last_stage(): - eval_output = self._reduce_outputs(self.fwd_outputs, reduce=reduce_output) + eval_output = self._reduce_outputs(self.fwd_outputs, reduce=reduce_output, micro_batches=micro_batches) if compute_loss and (bcast_loss or self.monitor.enabled): eval_output = self._bcast_pipe_scalar(eval_output) @@ -505,7 +514,7 @@ def is_last_stage(self): """True if this process is in the last stage in the pipeline.""" return self.stage_id == self.num_stages - 1 - def _reduce_outputs(self, outputs, reduce='avg', reduce_dp=True): + def _reduce_outputs(self, outputs, reduce='avg', reduce_dp=True, micro_batches=None): if reduce is None: return outputs @@ -520,7 +529,7 @@ def _reduce_outputs(self, outputs, reduce='avg', reduce_dp=True): reduced[idx] += out # Average over the microbatches - reduced = self._scale_loss_by_gas(reduced) + reduced = self._scale_loss_by_gas(reduced, eval_micro_batches=micro_batches) # Average over DP groups if reduce_dp and self.is_data_parallel: From 691458f8b6e6a58ceae7e41776e55c0410303009 Mon Sep 17 00:00:00 2001 From: Nadav Elyahu <88962733+nelyahu@users.noreply.github.com> Date: Wed, 3 Jan 2024 21:45:06 +0200 Subject: [PATCH 058/754] zero_to_fp32.py: Handle a case where shape doesn't have numel attr (#4842) Co-authored-by: Olatunji Ruwase Co-authored-by: Logan Adams <114770087+loadams@users.noreply.github.com> --- deepspeed/utils/zero_to_fp32.py | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/deepspeed/utils/zero_to_fp32.py b/deepspeed/utils/zero_to_fp32.py index c98caae31534..49b846633d6e 100755 --- a/deepspeed/utils/zero_to_fp32.py +++ b/deepspeed/utils/zero_to_fp32.py @@ -248,6 +248,11 @@ def _zero2_merge_frozen_params(state_dict, zero_model_states): print(f"Reconstructed Frozen fp32 state dict with {total_params} params {total_numel} elements") +def _has_callable(obj, fn): + attr = getattr(obj, fn, None) + return callable(attr) + + def _zero2_merge_trainable_params(state_dict, world_size, fp32_flat_groups, zero_model_states): param_shapes = zero_model_states[0].param_shapes @@ -287,7 +292,7 @@ def _zero2_merge_trainable_params(state_dict, world_size, fp32_flat_groups, zero avail_numel = full_single_fp32_vector.numel() for name, shape in shapes.items(): - unpartitioned_numel = shape.numel() + unpartitioned_numel = shape.numel() if _has_callable(shape, 'numel') else math.prod(shape) total_numel += unpartitioned_numel total_params += 1 From 834272531aa4368f793cc78418612e1e09166094 Mon Sep 17 00:00:00 2001 From: Arash Bakhtiari Date: Wed, 3 Jan 2024 13:27:06 -0800 Subject: [PATCH 059/754] Add support of Microsoft Phi-2 model to DeepSpeed-FastGen (#4812) This PR adds support for Microsoft Phi-2 model. HF output with prompt "DeepSpeed is": ``` a company that helps make videos and movies look really good. They have a special way of making videos that makes them look like they were made in a movie theater. This is called "4K Ultra HD" and it makes the videos look very clear and detailed. DeepSpeed also has a special way of making videos that makes them look like they were made in a movie theater. This is called "4K Ultra HD" and it makes the videos look very clear and detailed. DeepSpeed also has a special way of making videos that makes them look like they were made in a movie theater. This is called "4K Ultra HD" ``` DeepSpeed-FastGen output with prompt "DeepSpeed is": ``` a company that helps make videos and movies look really good. They have a special way of making videos that makes them look like they were made in a movie theater. This is called "4K Ultra HD" and it makes the videos look very clear and detailed. DeepSpeed also has a special way of making videos that makes them look like they were made in a movie theater. This is called "4K Ultra HD" and it makes the videos look very clear and detailed. DeepSpeed also has a special way of making videos that makes them look like they were made in a movie theater. This is called "4K Ultra HD" ``` --------- Co-authored-by: Connor Holmes Co-authored-by: Michael Wyatt --- blogs/deepspeed-fastgen/README.md | 2 + deepspeed/inference/v2/engine_factory.py | 3 + .../blocked_kv_rotary.cpp | 3 + .../blocked_kv_rotary.cu | 226 ++++++++++------ .../blocked_kv_rotary.cuh | 1 + .../blocked_kv_rotary.h | 1 + .../blocked_kv_rotary.py | 13 +- .../blocked_trained_kv_rotary.py | 4 +- .../linear_blocked_kv_copy.py | 2 +- .../v2/model_implementations/__init__.py | 1 + .../model_implementations/llama_v2/model.py | 6 +- .../v2/model_implementations/mistral/model.py | 6 +- .../v2/model_implementations/mixtral/model.py | 6 +- .../v2/model_implementations/opt/model.py | 7 +- .../v2/model_implementations/phi/__init__.py | 6 + .../model_implementations/phi/containers.py | 98 +++++++ .../v2/model_implementations/phi/model.py | 256 ++++++++++++++++++ .../v2/model_implementations/phi/policy.py | 32 +++ .../v2/modules/configs/attention_configs.py | 8 + .../attention/dense_blocked_attention.py | 11 +- .../implementations/unembed/ragged_unembed.py | 9 +- .../inference/v2/ragged/ragged_manager.py | 10 +- .../ragged_ops/test_blocked_kv_copy.py | 12 +- .../ragged_ops/test_blocked_rotary_emb.py | 83 +++++- 24 files changed, 666 insertions(+), 140 deletions(-) create mode 100644 deepspeed/inference/v2/model_implementations/phi/__init__.py create mode 100644 deepspeed/inference/v2/model_implementations/phi/containers.py create mode 100644 deepspeed/inference/v2/model_implementations/phi/model.py create mode 100644 deepspeed/inference/v2/model_implementations/phi/policy.py diff --git a/blogs/deepspeed-fastgen/README.md b/blogs/deepspeed-fastgen/README.md index 4081c780e09a..89fdefd22b0b 100644 --- a/blogs/deepspeed-fastgen/README.md +++ b/blogs/deepspeed-fastgen/README.md @@ -229,6 +229,8 @@ We currently support the following model architectures in this alpha release of * [Mistral](https://huggingface.co/models?other=mistral) * [OPT](https://huggingface.co/models?other=opt) * [Falcon](https://huggingface.co/models?other=falcon) +* [Mixtral](https://huggingface.co/models?other=mixtral) +* [Phi-2](https://huggingface.co/models?other=phi-msft) All current models leverage [HuggingFace](https://github.com/huggingface) APIs in our backend to provide both the model weights and the model's corresponding tokenizer. diff --git a/deepspeed/inference/v2/engine_factory.py b/deepspeed/inference/v2/engine_factory.py index a0dc050bbbf9..a17fa9fefbaa 100644 --- a/deepspeed/inference/v2/engine_factory.py +++ b/deepspeed/inference/v2/engine_factory.py @@ -19,6 +19,7 @@ MistralPolicy, MixtralPolicy, FalconPolicy, + PhiPolicy, ) from .model_implementations.inference_policy_base import POLICIES, InferenceV2Policy from .model_implementations.flat_model_helpers import make_metadata_filename, ModelMetadata @@ -114,6 +115,8 @@ def build_hf_engine(path: str, policy = MixtralPolicy(model_config, checkpoint_engine=checkpoint_engine) elif model_config.model_type == "falcon": policy = FalconPolicy(model_config, checkpoint_engine=checkpoint_engine) + elif model_config.model_type == "phi-msft": + policy = PhiPolicy(model_config, checkpoint_engine=checkpoint_engine) else: raise ValueError(f"Unsupported model type {model_config.model_type}") diff --git a/deepspeed/inference/v2/kernels/ragged_ops/linear_blocked_kv_rotary/blocked_kv_rotary.cpp b/deepspeed/inference/v2/kernels/ragged_ops/linear_blocked_kv_rotary/blocked_kv_rotary.cpp index a640c2b30164..634a63b81a31 100644 --- a/deepspeed/inference/v2/kernels/ragged_ops/linear_blocked_kv_rotary/blocked_kv_rotary.cpp +++ b/deepspeed/inference/v2/kernels/ragged_ops/linear_blocked_kv_rotary/blocked_kv_rotary.cpp @@ -13,6 +13,7 @@ (C_TYPE*)k.data_ptr(), \ (C_TYPE*)v.data_ptr(), \ (C_TYPE*)inv_freq_ptr, \ + rotary_dim, \ theta_base, \ batch_wrapper, \ qkv_stride, \ @@ -53,6 +54,7 @@ void kv_trained_rotary_embeddings(torch::Tensor& kv_cache, TORCH_CHECK(n_tokens == v.size(0)); const float theta_base = 0.f; + const int32_t rotary_dim = inv_freq.size(0) * 2; // Dimensions const int32_t block_size = kv_cache.size(1); @@ -94,6 +96,7 @@ void kv_rotary_embeddings(torch::Tensor& kv_cache, torch::Tensor& q, torch::Tensor& k, torch::Tensor& v, + const int32_t rotary_dim, const float theta_base, torch::Tensor& batch_metadata, torch::Tensor& seq_metadata, diff --git a/deepspeed/inference/v2/kernels/ragged_ops/linear_blocked_kv_rotary/blocked_kv_rotary.cu b/deepspeed/inference/v2/kernels/ragged_ops/linear_blocked_kv_rotary/blocked_kv_rotary.cu index 5dd79f0c636a..c295b85a246e 100644 --- a/deepspeed/inference/v2/kernels/ragged_ops/linear_blocked_kv_rotary/blocked_kv_rotary.cu +++ b/deepspeed/inference/v2/kernels/ragged_ops/linear_blocked_kv_rotary/blocked_kv_rotary.cu @@ -21,12 +21,13 @@ constexpr int threads = 256; Supports head size 32, 64, 128, 256 */ -template +template __global__ void kv_rotary_pos_kernel(T* kv_cache, T* q, T* k, T* v, const T* inv_freq, + const int32_t rotary_dim, const float theta_base, const BatchWrapperCPP batch_desc, const int qkv_stride, @@ -36,28 +37,31 @@ __global__ void kv_rotary_pos_kernel(T* kv_cache, { // Derived constexpr constexpr int vector_T = kv_rot::granularity / sizeof(T); - constexpr int threads_per_head = headSize / vector_T; - constexpr int half_head_size = headSize >> 1; + constexpr int real_threads_per_head = headSize / vector_T; + constexpr int threads_per_head = paddedHeadSize / vector_T; + constexpr int tokens_per_block = kv_rot::threads / threads_per_head; // CG helpers cg::thread_block tb = cg::this_thread_block(); cg::thread_block_tile warp = cg::tiled_partition(tb); - cg::thread_block_tile head_group = - cg::tiled_partition(warp); + cg::thread_block_tile head_group = cg::tiled_partition(tb); // Parallelize on the head dimension for X blocks const int head_idx = blockIdx.x; const int block_seq_idx = threadIdx.x / threads_per_head; - const int base_neuron_idx = (threadIdx.x * vector_T) % headSize; - const int half_idx = base_neuron_idx % half_head_size; - const int half_head_lanes = threads_per_head / 2; + const int base_neuron_idx = head_group.thread_rank() * vector_T; + const int half_rotary_size = rotary_dim / 2; + const int half_dim_lanes = half_rotary_size / vector_T; + const int half_idx = base_neuron_idx % half_rotary_size; // Multiple tokens processed by the same threadblock const int token_idx = blockIdx.y * tokens_per_block + block_seq_idx; const bool valid_token = token_idx < batch_desc.batch_metadata->n_tokens; - const bool load_inv_freq = (inv_freq != nullptr) && valid_token; + + const bool valid_thread = valid_token && (head_group.thread_rank() < real_threads_per_head); + const bool load_inv_freq = (inv_freq != nullptr) && valid_thread; // If we have GQA, then only one of the Q heads needs to do rotary + copy // for each of the heads in the group. @@ -68,9 +72,9 @@ __global__ void kv_rotary_pos_kernel(T* kv_cache, const int kv_head_idx = head_idx / qRatio; // Ensure we don't access invalid portions of the seq_metadata - const int32_t seq_id = (valid_token) ? batch_desc.tokens_to_seq[token_idx] : 0; + const int32_t seq_id = (valid_thread) ? batch_desc.tokens_to_seq[token_idx] : 0; const InflightSeqDescriptor seq_desc = batch_desc.seq_metadata[seq_id]; - // This will give an invalid index if valid_token is false, but should never affect memory. + // This will give an invalid index if valid_thread is false, but should never affect memory. const int32_t global_token_idx = seq_desc.seen_tokens + (token_idx - seq_desc.start_idx); T* q_row = q + token_idx * qkv_stride + head_idx * headSize; @@ -82,7 +86,7 @@ __global__ void kv_rotary_pos_kernel(T* kv_cache, const KVCacheDescriptor kv_desc = batch_desc.kv_desc; const int32_t seq_kv_block_idx = global_token_idx / kv_desc.block_size; const int32_t mapped_kv_block_idx = - (valid_token) ? kv_desc.block_lists[seq_id][seq_kv_block_idx] : 0; + (valid_thread) ? kv_desc.block_lists[seq_id][seq_kv_block_idx] : 0; const int32_t kv_block_offset = global_token_idx % kv_desc.block_size; const int32_t kv_offset = @@ -95,12 +99,11 @@ __global__ void kv_rotary_pos_kernel(T* kv_cache, T k_reg[vector_T], v_reg[vector_T], inv_freq_reg[vector_T]; - mem_access::load_global(q_reg, q_row + base_neuron_idx, valid_token); - mem_access::load_global(k_reg, k_row + base_neuron_idx, valid_token); - mem_access::load_global(v_reg, v_row + base_neuron_idx, valid_token); + mem_access::load_global(q_reg, q_row + base_neuron_idx, valid_thread); + mem_access::load_global(k_reg, k_row + base_neuron_idx, valid_thread); + mem_access::load_global(v_reg, v_row + base_neuron_idx, valid_thread); mem_access::load_global( inv_freq_reg, inv_freq + half_idx, load_inv_freq); - if constexpr (doRotary) { #pragma unroll for (int i = 0; i < vector_T; i++) { @@ -111,7 +114,7 @@ __global__ void kv_rotary_pos_kernel(T* kv_cache, inv_freq_flt = conversion::to(inv_freq_reg[i]) * (float)global_token_idx; } else { inv_freq_flt = - (float)((head_neuron_idx % half_head_size) * 2) / (float)headSize; + (float)((head_neuron_idx % half_rotary_size) * 2) / (float)rotary_dim; // Conversion to T and back means that both branches of this if statement // will produce the same results if using the same algo for producing the // freqs. @@ -119,23 +122,29 @@ __global__ void kv_rotary_pos_kernel(T* kv_cache, inv_freq_flt = conversion::to(trunc_freq) * (float)global_token_idx; } - float rotary_sign = (head_neuron_idx >= half_head_size) ? -1.0f : 1.0f; + float rotary_sign = (head_neuron_idx >= half_rotary_size) ? -1.0f : 1.0f; float q_f = conversion::to(q_reg[i]); float k_f = conversion::to(k_reg[i]); float q_rot = q_f * rotary_sign; float k_rot = k_f * rotary_sign; - const float q_rot_temp = head_group.shfl_xor(q_rot, half_head_lanes); - const float k_rot_temp = head_group.shfl_xor(k_rot, half_head_lanes); + const int target_lane = (head_neuron_idx < half_rotary_size) + ? head_group.thread_rank() + half_dim_lanes + : head_group.thread_rank() - half_dim_lanes; + + const float q_rot_temp = head_group.shfl(q_rot, target_lane); + const float k_rot_temp = head_group.shfl(k_rot, target_lane); - q_reg[i] = - conversion::to(q_f * cosf(inv_freq_flt) + q_rot_temp * sinf(inv_freq_flt)); - k_reg[i] = - conversion::to(k_f * cosf(inv_freq_flt) + k_rot_temp * sinf(inv_freq_flt)); + if (base_neuron_idx < rotary_dim) { + q_reg[i] = conversion::to(q_f * cosf(inv_freq_flt) + + q_rot_temp * sinf(inv_freq_flt)); + k_reg[i] = conversion::to(k_f * cosf(inv_freq_flt) + + k_rot_temp * sinf(inv_freq_flt)); + } } } - if (valid_token) { + if (valid_thread) { mem_access::store_global(kv_cache + kv_offset + base_neuron_idx, k_reg); mem_access::store_global( @@ -144,7 +153,7 @@ __global__ void kv_rotary_pos_kernel(T* kv_cache, } else { T inv_freq_reg[vector_T]; - mem_access::load_global(q_reg, q_row + base_neuron_idx, valid_token); + mem_access::load_global(q_reg, q_row + base_neuron_idx, valid_thread); mem_access::load_global( inv_freq_reg, inv_freq + half_idx, load_inv_freq); @@ -158,48 +167,74 @@ __global__ void kv_rotary_pos_kernel(T* kv_cache, inv_freq_flt = conversion::to(inv_freq_reg[i]) * (float)global_token_idx; } else { inv_freq_flt = - (float)((head_neuron_idx % half_head_size) * 2) / (float)headSize; + (float)((head_neuron_idx % half_rotary_size) * 2) / (float)rotary_dim; inv_freq_flt = 1.0 / powf(theta_base, inv_freq_flt) * (float)global_token_idx; } - float rotary_sign = (head_neuron_idx >= half_head_size) ? -1.0f : 1.0f; + float rotary_sign = (head_neuron_idx >= half_rotary_size) ? -1.0f : 1.0f; float q_f = conversion::to(q_reg[i]); float q_rot = q_f * rotary_sign; - const float q_rot_temp = head_group.shfl_xor(q_rot, half_head_lanes); + const int target_lane = (head_neuron_idx < half_rotary_size) + ? head_group.thread_rank() + half_dim_lanes + : head_group.thread_rank() - half_dim_lanes; - q_reg[i] = - conversion::to(q_f * cosf(inv_freq_flt) + q_rot_temp * sinf(inv_freq_flt)); + const float q_rot_temp = head_group.shfl(q_rot, target_lane); + if (base_neuron_idx < rotary_dim) + q_reg[i] = conversion::to(q_f * cosf(inv_freq_flt) + + q_rot_temp * sinf(inv_freq_flt)); } } } - if (valid_token && doRotary) { + if (valid_thread && doRotary) { mem_access::store_global(q_row + base_neuron_idx, q_reg); } } -#define DISPATCH_KV_ROTARY_IMPL(Q_RATIO, HEAD_SIZE) \ - if (q_ratio == Q_RATIO && head_size == HEAD_SIZE) \ - kv_rotary_pos_kernel \ - <<>>(kv_cache, \ - q, \ - k, \ - v, \ - inv_freq, \ - theta_base, \ - batch_desc, \ - qkv_stride, \ - kv_cache_stride, \ - v_offset, \ +#define DISPATCH_KV_ROTARY_IMPL(Q_RATIO, HEAD_SIZE, PADDED_HEAD_SIZE) \ + if (q_ratio == Q_RATIO && head_size == HEAD_SIZE) \ + kv_rotary_pos_kernel \ + <<>>(kv_cache, \ + q, \ + k, \ + v, \ + inv_freq, \ + rotary_dim, \ + theta_base, \ + batch_desc, \ + qkv_stride, \ + kv_cache_stride, \ + v_offset, \ inv_freq_stride); +#define LAUNCH_KV_ROTARY_FOR_Q_RATIO_HEAD_SIZE(Q_RATIO, HEAD_SIZE) \ + if (padded_head_size == 64) { \ + DISPATCH_KV_ROTARY_IMPL(Q_RATIO, HEAD_SIZE, 64); \ + } else if (padded_head_size == 128) { \ + DISPATCH_KV_ROTARY_IMPL(Q_RATIO, HEAD_SIZE, 128); \ + } else { \ + assert(false); \ + } + +#define LAUNCH_KV_ROTARY_FOR_Q_RATIO(Q_RATIO) \ + if (head_size == 64) { \ + LAUNCH_KV_ROTARY_FOR_Q_RATIO_HEAD_SIZE(Q_RATIO, 64); \ + } else if (head_size == 80) { \ + LAUNCH_KV_ROTARY_FOR_Q_RATIO_HEAD_SIZE(Q_RATIO, 80); \ + } else if (head_size == 128) { \ + LAUNCH_KV_ROTARY_FOR_Q_RATIO_HEAD_SIZE(Q_RATIO, 128); \ + } else { \ + assert(false); \ + } + template void launch_kv_rotary_kernel(T* kv_cache, T* q, T* k, T* v, T* inv_freq, + const int32_t rotary_dim, const float theta_base, const BatchWrapperCPP batch_desc, const int qkv_stride, @@ -213,33 +248,26 @@ void launch_kv_rotary_kernel(T* kv_cache, cudaStream_t stream) { constexpr int vector_T = kv_rot::granularity / sizeof(T); - const int threads_per_head = head_size / vector_T; + + const int padded_head_size = next_pow2(head_size); + const int threads_per_head = padded_head_size / vector_T; + const int tokens_per_block = kv_rot::threads / threads_per_head; const dim3 block(kv_rot::threads); const int token_blocks = (n_tokens + tokens_per_block - 1) / tokens_per_block; const dim3 grid(n_q_heads, token_blocks); - DISPATCH_KV_ROTARY_IMPL(1, 64) - DISPATCH_KV_ROTARY_IMPL(1, 128) - DISPATCH_KV_ROTARY_IMPL(2, 64) - DISPATCH_KV_ROTARY_IMPL(2, 128) - DISPATCH_KV_ROTARY_IMPL(4, 64) - DISPATCH_KV_ROTARY_IMPL(4, 128) - DISPATCH_KV_ROTARY_IMPL(5, 64) - DISPATCH_KV_ROTARY_IMPL(5, 128) - DISPATCH_KV_ROTARY_IMPL(8, 64) - DISPATCH_KV_ROTARY_IMPL(8, 128) - DISPATCH_KV_ROTARY_IMPL(16, 64) - DISPATCH_KV_ROTARY_IMPL(16, 128) - DISPATCH_KV_ROTARY_IMPL(29, 64) - DISPATCH_KV_ROTARY_IMPL(29, 128) - DISPATCH_KV_ROTARY_IMPL(35, 64) - DISPATCH_KV_ROTARY_IMPL(35, 128) - DISPATCH_KV_ROTARY_IMPL(36, 64) - DISPATCH_KV_ROTARY_IMPL(36, 128) - DISPATCH_KV_ROTARY_IMPL(71, 64) - DISPATCH_KV_ROTARY_IMPL(71, 128) + LAUNCH_KV_ROTARY_FOR_Q_RATIO(1) + LAUNCH_KV_ROTARY_FOR_Q_RATIO(2) + LAUNCH_KV_ROTARY_FOR_Q_RATIO(4) + LAUNCH_KV_ROTARY_FOR_Q_RATIO(5) + LAUNCH_KV_ROTARY_FOR_Q_RATIO(8) + LAUNCH_KV_ROTARY_FOR_Q_RATIO(16) + LAUNCH_KV_ROTARY_FOR_Q_RATIO(29) + LAUNCH_KV_ROTARY_FOR_Q_RATIO(35) + LAUNCH_KV_ROTARY_FOR_Q_RATIO(36) + LAUNCH_KV_ROTARY_FOR_Q_RATIO(71) } #define INSTANTIATE_KV_ROTARY_KERNEL(TYPE) \ @@ -248,6 +276,7 @@ void launch_kv_rotary_kernel(T* kv_cache, TYPE * k, \ TYPE * v, \ TYPE * inv_freq, \ + const int32_t rotary_dim, \ const float theta_base, \ const BatchWrapperCPP batch_desc, \ const int qkv_stride, \ @@ -266,21 +295,42 @@ INSTANTIATE_KV_ROTARY_KERNEL(__half) INSTANTIATE_KV_ROTARY_KERNEL(__nv_bfloat16) #endif -#define DISPATCH_KV_COPY_IMPL(Q_RATIO, HEAD_SIZE) \ - if (q_ratio == Q_RATIO && head_size == HEAD_SIZE) \ - kv_rotary_pos_kernel \ - <<>>(kv_cache, \ - q, \ - k, \ - v, \ - nullptr, \ - 0.f, \ - batch_desc, \ - qkv_stride, \ - kv_cache_stride, \ - v_offset, \ +#define DISPATCH_KV_COPY_IMPL(Q_RATIO, HEAD_SIZE, PADDED_HEAD_SIZE) \ + if (q_ratio == Q_RATIO && head_size == HEAD_SIZE) \ + kv_rotary_pos_kernel \ + <<>>(kv_cache, \ + q, \ + k, \ + v, \ + nullptr, \ + -1, \ + 0.f, \ + batch_desc, \ + qkv_stride, \ + kv_cache_stride, \ + v_offset, \ 0); +#define LAUNCH_KV_COPY_FOR_Q_RATIO_HEAD_SIZE(Q_RATIO, HEAD_SIZE) \ + if (padded_head_size == 64) { \ + DISPATCH_KV_COPY_IMPL(Q_RATIO, HEAD_SIZE, 64); \ + } else if (padded_head_size == 128) { \ + DISPATCH_KV_COPY_IMPL(Q_RATIO, HEAD_SIZE, 128); \ + } else { \ + assert(false); \ + } + +#define LAUNCH_KV_COPY_FOR_Q_RATIO(Q_RATIO) \ + if (head_size == 64) { \ + LAUNCH_KV_COPY_FOR_Q_RATIO_HEAD_SIZE(Q_RATIO, 64); \ + } else if (head_size == 80) { \ + LAUNCH_KV_COPY_FOR_Q_RATIO_HEAD_SIZE(Q_RATIO, 80); \ + } else if (head_size == 128) { \ + LAUNCH_KV_COPY_FOR_Q_RATIO_HEAD_SIZE(Q_RATIO, 128); \ + } else { \ + assert(false); \ + } + template void launch_kv_copy_kernel(T* kv_cache, T* q, @@ -297,23 +347,19 @@ void launch_kv_copy_kernel(T* kv_cache, cudaStream_t stream) { constexpr int vector_T = kv_rot::granularity / sizeof(T); - const int threads_per_head = head_size / vector_T; + const int padded_head_size = next_pow2(head_size); + const int threads_per_head = padded_head_size / vector_T; const int tokens_per_block = kv_rot::threads / threads_per_head; const dim3 block(kv_rot::threads); const int token_blocks = (n_tokens + tokens_per_block - 1) / tokens_per_block; const dim3 grid(n_q_heads, token_blocks); - DISPATCH_KV_COPY_IMPL(1, 64) - DISPATCH_KV_COPY_IMPL(1, 128) - DISPATCH_KV_COPY_IMPL(2, 64) - DISPATCH_KV_COPY_IMPL(2, 128) - DISPATCH_KV_COPY_IMPL(4, 64) - DISPATCH_KV_COPY_IMPL(4, 128) - DISPATCH_KV_COPY_IMPL(5, 64) - DISPATCH_KV_COPY_IMPL(5, 128) - DISPATCH_KV_COPY_IMPL(8, 64) - DISPATCH_KV_COPY_IMPL(8, 128) + LAUNCH_KV_COPY_FOR_Q_RATIO(1) + LAUNCH_KV_COPY_FOR_Q_RATIO(2) + LAUNCH_KV_COPY_FOR_Q_RATIO(4) + LAUNCH_KV_COPY_FOR_Q_RATIO(5) + LAUNCH_KV_COPY_FOR_Q_RATIO(8) } #define INSTANTIATE_KV_COPY_KERNEL(TYPE) \ diff --git a/deepspeed/inference/v2/kernels/ragged_ops/linear_blocked_kv_rotary/blocked_kv_rotary.cuh b/deepspeed/inference/v2/kernels/ragged_ops/linear_blocked_kv_rotary/blocked_kv_rotary.cuh index 41a69d3b397b..ff24b3f5bd80 100644 --- a/deepspeed/inference/v2/kernels/ragged_ops/linear_blocked_kv_rotary/blocked_kv_rotary.cuh +++ b/deepspeed/inference/v2/kernels/ragged_ops/linear_blocked_kv_rotary/blocked_kv_rotary.cuh @@ -18,6 +18,7 @@ void launch_kv_rotary_kernel(T* kv_cache, T* k, T* v, T* inv_freq, + const int32_t rotary_dim, const float theta_base, const BatchWrapperCPP batch_desc, const int qkv_stride, diff --git a/deepspeed/inference/v2/kernels/ragged_ops/linear_blocked_kv_rotary/blocked_kv_rotary.h b/deepspeed/inference/v2/kernels/ragged_ops/linear_blocked_kv_rotary/blocked_kv_rotary.h index e56ce644dbbc..c0700eda7147 100644 --- a/deepspeed/inference/v2/kernels/ragged_ops/linear_blocked_kv_rotary/blocked_kv_rotary.h +++ b/deepspeed/inference/v2/kernels/ragged_ops/linear_blocked_kv_rotary/blocked_kv_rotary.h @@ -45,6 +45,7 @@ void kv_rotary_embeddings(torch::Tensor& kv_cache, torch::Tensor& q, torch::Tensor& k, torch::Tensor& v, + const int32_t rotary_dim, const float theta_base, torch::Tensor& batch_metadata, torch::Tensor& seq_metadata, diff --git a/deepspeed/inference/v2/kernels/ragged_ops/linear_blocked_kv_rotary/blocked_kv_rotary.py b/deepspeed/inference/v2/kernels/ragged_ops/linear_blocked_kv_rotary/blocked_kv_rotary.py index f206a4f5d28c..7fe38d258e6c 100644 --- a/deepspeed/inference/v2/kernels/ragged_ops/linear_blocked_kv_rotary/blocked_kv_rotary.py +++ b/deepspeed/inference/v2/kernels/ragged_ops/linear_blocked_kv_rotary/blocked_kv_rotary.py @@ -18,15 +18,11 @@ class BlockedRotaryEmbeddings(DSKernelBase): """ supported_dtypes = [DtypeEnum.fp16, DtypeEnum.bf16] - supported_head_sizes = [64, 128] + supported_head_sizes = [64, 80, 128] supported_q_ratios = [1, 2, 4, 5, 8, 16, 29, 35, 36, 71] - def __init__(self, - head_size: int, - n_q_heads: int, - n_kv_heads: int, - dtype: torch.dtype, - theta_base: float = 10000.0) -> None: + def __init__(self, head_size: int, n_q_heads: int, n_kv_heads: int, dtype: torch.dtype, rotary_dim: int, + theta_base: float) -> None: """ Args: head_size: The size of the attention head. @@ -56,6 +52,7 @@ def __init__(self, self.head_size = head_size self.n_q_heads = n_q_heads self.n_kv_heads = n_kv_heads + self.rotary_dim = rotary_dim self.theta_base = theta_base def __call__(self, kv_cache: torch.Tensor, qkv: torch.Tensor, ragged_batch: RaggedBatchWrapper) -> None: @@ -72,5 +69,5 @@ def __call__(self, kv_cache: torch.Tensor, qkv: torch.Tensor, ragged_batch: Ragg k = qkv[:, self.head_size * self.n_q_heads:self.head_size * (self.n_q_heads + self.n_kv_heads)] v = qkv[:, self.head_size * (self.n_q_heads + self.n_kv_heads):] - self.kernel(kv_cache, q, k, v, self.theta_base, ragged_batch.batch_metadata_buffer(), + self.kernel(kv_cache, q, k, v, self.rotary_dim, self.theta_base, ragged_batch.batch_metadata_buffer(), ragged_batch.inflight_seq_descriptors(), ragged_batch.tokens_to_seq(), ragged_batch.kv_ptrs()) diff --git a/deepspeed/inference/v2/kernels/ragged_ops/linear_blocked_kv_rotary/blocked_trained_kv_rotary.py b/deepspeed/inference/v2/kernels/ragged_ops/linear_blocked_kv_rotary/blocked_trained_kv_rotary.py index 59da1db0f5d6..f8c5b2b13804 100644 --- a/deepspeed/inference/v2/kernels/ragged_ops/linear_blocked_kv_rotary/blocked_trained_kv_rotary.py +++ b/deepspeed/inference/v2/kernels/ragged_ops/linear_blocked_kv_rotary/blocked_trained_kv_rotary.py @@ -23,7 +23,7 @@ class BlockedTrainedRotaryEmbeddings(DSKernelBase): """ supported_dtypes = [DtypeEnum.fp16, DtypeEnum.bf16] - supported_head_sizes = [64, 128] + supported_head_sizes = [64, 80, 128] supported_q_ratios = [1, 2, 4, 5, 8] def __init__(self, head_size: int, n_q_heads: int, n_kv_heads: int, dtype: torch.dtype) -> None: @@ -65,7 +65,7 @@ def __call__(self, kv_cache: torch.Tensor, qkv: torch.Tensor, ragged_batch: Ragg kv_cache (torch.Tensor): Pre-allocated KV cache of [num_blocks, block_size, 2, n_kv_heads, head_size] qkv: Input tensor of shape [num_tokens, head_size * (n_q_heads + 2 * n_kv_heads)] ragged_batch: Wrapper for the ragged batch. - inverse_freqs: Inverse frequencies for the rotary embeddings. Shape [max_seq_len, head_size // 2] + inverse_freqs: Inverse frequencies for the rotary embeddings. Shape [max_seq_len, rotary_dim // 2] """ q = qkv[:, :self.head_size * self.n_q_heads] diff --git a/deepspeed/inference/v2/kernels/ragged_ops/linear_blocked_kv_rotary/linear_blocked_kv_copy.py b/deepspeed/inference/v2/kernels/ragged_ops/linear_blocked_kv_rotary/linear_blocked_kv_copy.py index c9f6ffd37b3e..a885eadd78a1 100644 --- a/deepspeed/inference/v2/kernels/ragged_ops/linear_blocked_kv_rotary/linear_blocked_kv_copy.py +++ b/deepspeed/inference/v2/kernels/ragged_ops/linear_blocked_kv_rotary/linear_blocked_kv_copy.py @@ -23,7 +23,7 @@ class LinearBlockedKVCopy(DSKernelBase): """ supported_dtypes = [DtypeEnum.fp16, DtypeEnum.bf16] - supported_head_sizes = [64, 128] + supported_head_sizes = [64, 80, 128] supported_q_ratios = [1, 2, 4, 5, 8] def __init__(self, head_size: int, n_q_heads: int, n_kv_heads: int, dtype: torch.dtype) -> None: diff --git a/deepspeed/inference/v2/model_implementations/__init__.py b/deepspeed/inference/v2/model_implementations/__init__.py index ab1f984fba7e..a08d966ac6d0 100644 --- a/deepspeed/inference/v2/model_implementations/__init__.py +++ b/deepspeed/inference/v2/model_implementations/__init__.py @@ -14,3 +14,4 @@ from .mistral import * from .mixtral import * from .falcon import * +from .phi import * diff --git a/deepspeed/inference/v2/model_implementations/llama_v2/model.py b/deepspeed/inference/v2/model_implementations/llama_v2/model.py index b91e3258caa0..735e8f52cca3 100644 --- a/deepspeed/inference/v2/model_implementations/llama_v2/model.py +++ b/deepspeed/inference/v2/model_implementations/llama_v2/model.py @@ -197,8 +197,10 @@ def _forward_unembed(self, hidden_states: torch.Tensor, ragged_batch_info: Ragge Performs unembedding of the hidden states to logits. This will only sample the final token of each sequence. """ - logits = self.unembed(hidden_states, self._non_transformer.word_unembed, ragged_batch_info, - self._non_transformer.final_norm) + logits = self.unembed(hidden_states, + self._non_transformer.word_unembed, + ragged_batch_info, + gamma=self._non_transformer.final_norm) if self.tp_size > 1: comm_buffer = empty_from(self._comm_logits, (self.tp_size, logits.shape[0], logits.shape[1])) diff --git a/deepspeed/inference/v2/model_implementations/mistral/model.py b/deepspeed/inference/v2/model_implementations/mistral/model.py index 08a9dae78e43..9c707026f9dd 100644 --- a/deepspeed/inference/v2/model_implementations/mistral/model.py +++ b/deepspeed/inference/v2/model_implementations/mistral/model.py @@ -196,8 +196,10 @@ def _forward_unembed(self, hidden_states: torch.Tensor, ragged_batch_info: Ragge Performs unembedding of the hidden states to logits. This will only sample the final token of each sequence. """ - logits = self.unembed(hidden_states, self._non_transformer.word_unembed, ragged_batch_info, - self._non_transformer.final_norm) + logits = self.unembed(hidden_states, + self._non_transformer.word_unembed, + ragged_batch_info, + gamma=self._non_transformer.final_norm) if self.tp_size > 1: comm_buffer = empty_from(self._comm_logits, (self.tp_size, logits.shape[0], logits.shape[1])) diff --git a/deepspeed/inference/v2/model_implementations/mixtral/model.py b/deepspeed/inference/v2/model_implementations/mixtral/model.py index 731a907716f4..d0cae0ff307b 100644 --- a/deepspeed/inference/v2/model_implementations/mixtral/model.py +++ b/deepspeed/inference/v2/model_implementations/mixtral/model.py @@ -247,8 +247,10 @@ def _forward_unembed(self, hidden_states: torch.Tensor, ragged_batch_info: Ragge Performs unembedding of the hidden states to logits. This will only sample the final token of each sequence. """ - logits = self.unembed(hidden_states, self._non_transformer.word_unembed, ragged_batch_info, - self._non_transformer.final_norm) + logits = self.unembed(hidden_states, + self._non_transformer.word_unembed, + ragged_batch_info, + gamma=self._non_transformer.final_norm) if self.tp_size > 1: comm_buffer = empty_from(self._comm_logits, (self.tp_size, logits.shape[0], logits.shape[1])) diff --git a/deepspeed/inference/v2/model_implementations/opt/model.py b/deepspeed/inference/v2/model_implementations/opt/model.py index 8bd26ba044e5..8bad12f10475 100644 --- a/deepspeed/inference/v2/model_implementations/opt/model.py +++ b/deepspeed/inference/v2/model_implementations/opt/model.py @@ -163,8 +163,11 @@ def _forward_transformer_layer(self, layer_idx: int, residual: torch.Tensor, hid return residual, hidden_states def _forward_unembed(self, hidden_states: torch.Tensor, ragged_batch_info: RaggedBatchWrapper) -> torch.Tensor: - logits = self.unembed(hidden_states, self._non_transformer.word_unembed, ragged_batch_info, - self._non_transformer.final_norm_w, self._non_transformer.final_norm_b) + logits = self.unembed(hidden_states, + self._non_transformer.word_unembed, + ragged_batch_info, + gamma=self._non_transformer.final_norm_w, + beta=self._non_transformer.final_norm_b) if self.tp_size > 1: comm_buffer = empty_from(self._comm_logits, (self.tp_size, logits.shape[0], logits.shape[1])) diff --git a/deepspeed/inference/v2/model_implementations/phi/__init__.py b/deepspeed/inference/v2/model_implementations/phi/__init__.py new file mode 100644 index 000000000000..3ab107e75a91 --- /dev/null +++ b/deepspeed/inference/v2/model_implementations/phi/__init__.py @@ -0,0 +1,6 @@ +# Copyright (c) Microsoft Corporation. +# SPDX-License-Identifier: Apache-2.0 + +# DeepSpeed Team + +from .policy import PhiPolicy diff --git a/deepspeed/inference/v2/model_implementations/phi/containers.py b/deepspeed/inference/v2/model_implementations/phi/containers.py new file mode 100644 index 000000000000..ab6d0181611c --- /dev/null +++ b/deepspeed/inference/v2/model_implementations/phi/containers.py @@ -0,0 +1,98 @@ +# Copyright (c) Microsoft Corporation. +# SPDX-License-Identifier: Apache-2.0 + +# DeepSpeed Team + +# Create a container object to save model-specific tensors using the policy file above. + +from ..common_parameters import * +from ..layer_container_base import LayerContainer +''' + # HF Phi-2 model looks like this: + +PhiForCausalLM( + (transformer): PhiModel( + (embd): Embedding( + (wte): Embedding(51200, 2560) + (drop): Dropout(p=0.0, inplace=False) + ) + (h): ModuleList( + (0-31): 32 x ParallelBlock( + (ln): LayerNorm((2560,), eps=1e-05, elementwise_affine=True) + (resid_dropout): Dropout(p=0.1, inplace=False) + (mixer): MHA( + (rotary_emb): RotaryEmbedding() + (Wqkv): Linear(in_features=2560, out_features=7680, bias=True) + (out_proj): Linear(in_features=2560, out_features=2560, bias=True) + (inner_attn): SelfAttention( + (drop): Dropout(p=0.0, inplace=False) + ) + (inner_cross_attn): CrossAttention( + (drop): Dropout(p=0.0, inplace=False) + ) + ) + (mlp): MLP( + (fc1): Linear(in_features=2560, out_features=10240, bias=True) + (fc2): Linear(in_features=10240, out_features=2560, bias=True) + (act): NewGELUActivation() + ) + ) + ) + ) + (lm_head): CausalLMHead( + (ln): LayerNorm((2560,), eps=1e-05, elementwise_affine=True) + (linear): Linear(in_features=2560, out_features=51200, bias=True) + ) + (loss): CausalLMLoss( + (loss_fct): CrossEntropyLoss() + ) +) +''' + + +class PhiTransformerContainer(LayerContainer): + """ + Transformer layer container for the Phi model. + """ + qkv_w: FusedQKVParameter + qkv_b: FusedQKVParameter + attn_out_w: AttentionOutputParameter + attn_out_b: AttentionOutputParameter + mlp_1_w: MLP1Parameter + mlp_1_b: MLP1Parameter + mlp_2_w: MLP2Parameter + mlp_2_b: MLP2Parameter + ln_gamma: NormParameter + ln_beta: NormParameter + + PARAM_MAPPING = { + "mixer.Wqkv.weight": "qkv_w.params", + "mixer.Wqkv.bias": "qkv_b.params", + "mixer.out_proj.weight": "attn_out_w.params", + "mixer.out_proj.bias": "attn_out_b.params", + "mlp.fc1.weight": "mlp_1_w.params", + "mlp.fc1.bias": "mlp_1_b.params", + "mlp.fc2.weight": "mlp_2_w.params", + "mlp.fc2.bias": "mlp_2_b.params", + "ln.weight": "ln_gamma.params", + "ln.bias": "ln_beta.params", + } + + +class PhiNonTransformerContainer(LayerContainer): + """ + Non-Transformer layer container for the Phi model. + """ + word_emb: EmbeddingParameter + word_unembed_w: UnembedParameter + word_unembed_b: UnembedParameter + final_norm_gamma: NormParameter + final_norm_beta: NormParameter + + PARAM_MAPPING = { + "transformer.embd.wte.weight": "word_emb.params", + "lm_head.ln.weight": "final_norm_gamma.params", + "lm_head.ln.bias": "final_norm_beta.params", + "lm_head.linear.weight": "word_unembed_w.params", + "lm_head.linear.bias": "word_unembed_b.params", + } diff --git a/deepspeed/inference/v2/model_implementations/phi/model.py b/deepspeed/inference/v2/model_implementations/phi/model.py new file mode 100644 index 000000000000..a95b12bb119f --- /dev/null +++ b/deepspeed/inference/v2/model_implementations/phi/model.py @@ -0,0 +1,256 @@ +# Copyright (c) Microsoft Corporation. +# SPDX-License-Identifier: Apache-2.0 + +# DeepSpeed Team + +from typing import Iterable, Optional, Tuple + +import torch + +import deepspeed.comm as dist + +from ...allocator import empty_from +from ...config_v2 import RaggedInferenceEngineConfig +from ...inference_utils import ActivationType, DtypeEnum +from .. import * +from ...modules.configs import * +from ...modules.interfaces import * +from ...modules import heuristics +from ...ragged import RaggedBatchWrapper +from ..inference_model_base import ( + DSModelImplementationConfig, + MPType, +) + +from .containers import PhiNonTransformerContainer, PhiTransformerContainer + + +class PhiInferenceModel(DSTransformerModelBase): + """ + Inference model implementation for ragged batching for Llama-2 models. + """ + + _non_transformer: Optional[PhiNonTransformerContainer] + """ + Embed + unembed container. Specializing the type annotation. + """ + + _transformer: Optional[Iterable[PhiTransformerContainer]] + """ + Per-layer transformer container. Specializing the type annotation. + """ + """ + Properties inherited from `DSInferenceModelBase` + """ + + @property + def max_sequence_length(self) -> int: + return self._config.max_seq_length + + """ + Properties inherited from `DSTransformerModelBase` + """ + + @property + def num_layers(self) -> int: + return self._config.n_layer + + @property + def model_dim(self) -> int: + return self._config.n_embd + + @property + def vocab_size(self) -> int: + return self._config.vocab_size + + @property + def head_size(self) -> int: + return self.model_dim // self.n_heads + + @property + def n_heads(self) -> int: + return self._config.n_head + + @property + def intermediate_dim(self) -> int: + n_inner = getattr(self._config, "n_inner", None) + return n_inner if n_inner is not None else 4 * self.model_dim + + @property + def n_heads_kv(self) -> int: + return getattr(self._config, "n_head_kv", None) or self.n_heads + + @property + def activation_dtype(self) -> DtypeEnum: + if self._config.torch_dtype == torch.float16: + return DtypeEnum.fp16 + elif self._config.torch_dtype == torch.bfloat16: + return DtypeEnum.bf16 + else: + raise NotImplementedError("Only fp16 and bf16 are supported") + + @property + def mlp_activation_fn(self) -> ActivationType: + return ActivationType.GELU + + @property + def norm_type(self) -> NormTypeEnum: + return NormTypeEnum.LayerNorm + + @property + def positional_embedding_type(self) -> PositionalEmbeddingType: + return PositionalEmbeddingType.rotate_half + + """ + Model implementation + """ + + def __init__(self, config: DSModelImplementationConfig, engine_config: RaggedInferenceEngineConfig, + base_mp_group: MPType) -> None: + """ + Base implementation for initialization. By default, this will initialize + the traditional components of a transformer model: + - Embedding + - QKV projection + - Self attention + - Attention output projection + - Feed forward network + - Normalization + - Unembedding + + Arguments: + config (DSModelImplementationConfig): Model-specific configuration. No assumptions + should be made about this config that are not closely tied to the specific + model implementation. + engine_config (RaggedInferenceEngineConfig): Engine configuration. + base_mp_group (MPType): Base communication group for Tensor-parallel inference. + """ + super().__init__(config, engine_config, base_mp_group) + + self.make_norm_layer() + self.make_qkv_layer() + self.make_attn_layer() + self.make_attn_out_layer() + self.make_embedding_layer() + self.make_unembedding_layer() + self._kv_cache_config = None + + def make_attn_layer(self) -> None: + """ + Builds the attention layer for the model. This sets the `self.attn` attribute. + """ + softmax_scale = 1.0 / (self.head_size**0.5) + + rotary_config = RotateHalfConfig(rotate_dim=self._config.rotary_dim) + + attn_config = DSSelfAttentionConfig(max_tokens=self._engine_config.state_manager.max_ragged_batch_size, + n_heads_q=self.n_heads_q_local, + n_heads_kv=self.n_heads_kv_local, + head_size=self.head_size, + max_sequences=self._engine_config.state_manager.max_ragged_sequence_count, + scale_factor=softmax_scale, + input_dtype=self.activation_dtype, + output_dtype=self.activation_dtype, + positional_embedding_type=self.positional_embedding_type, + positional_embedding_config=rotary_config) + + self.attn = heuristics.instantiate_attention(attn_config, self._engine_config) + + """ + Forward implementations + """ + + def _forward_embed(self, ragged_batch: RaggedBatchWrapper) -> torch.Tensor: + """ + Performs the embedding lookup prior to running the transformer of the model. + + Arguments: + ragged_batch (RaggedBatchWrapper): The batch to embed. + + Returns: + torch.Tensor: The embedded batch. + """ + embed = self.embed(ragged_batch, self._non_transformer.word_emb) + + if embed.shape[-1] != self.model_dim: + raise ValueError(f"Embedding output shape {embed.shape} does not match model_dim {self.model_dim}") + + return embed + + def _forward_transformer_layer(self, layer_idx: int, residual: torch.Tensor, hidden_states: torch.Tensor, + ragged_batch_info: RaggedBatchWrapper) -> Tuple[torch.Tensor, torch.Tensor]: + """ + Executes one (slightly offset) layer of the transformer. This implementation does a peak-ahead + optimization to fuse the layer norm of the next layer into the current layer. + + Arguments: + layer_idx (int): The index of the layer to execute. + residual (torch.Tensor): The residual tensor from the previous layer. + hidden_states (torch.Tensor): The hidden states from the previous layer. This is the + hidden states after pre normalization. + ragged_batch_info (RaggedBatchWrapper): The batch metadata. + """ + cur_params = self._transformer[layer_idx] + kv_cache = self.state_manager.get_cache(layer_idx) + + attn_ln_out = hidden_states + attn_hidden_state = self.qkv(attn_ln_out, cur_params.qkv_w, b=cur_params.qkv_b) + attn_hidden_state = self.attn(attn_hidden_state, kv_cache, ragged_batch_info) + attention_output = self.attn_out(attn_hidden_state, cur_params.attn_out_w, b=cur_params.attn_out_b) + + mlp_ln_out = hidden_states + mlp_hidden_state = self.mlp_1(mlp_ln_out, cur_params.mlp_1_w, b=cur_params.mlp_1_b) + mlp_output = self.mlp_2(mlp_hidden_state, cur_params.mlp_2_w, b=cur_params.mlp_2_b) + + mlp_output.add_(attention_output) + + if self.tp_size > 1: + dist.all_reduce(mlp_output, group=self._base_mp_group) + + if layer_idx != self.num_layers - 1: + next_params = self._transformer[layer_idx + 1] + residual, mlp_output = self.norm(residual, mlp_output, next_params.ln_gamma, beta=next_params.ln_beta) + else: + # On last layer, we just need to perform the residual add. Adding into the residual + # here is safe. + residual.add_(mlp_output) + + return residual, mlp_output + + def _forward_unembed(self, hidden_states: torch.Tensor, ragged_batch_info: RaggedBatchWrapper) -> torch.Tensor: + """ + Performs unembedding of the hidden states to logits. This will only sample the final + token of each sequence. + """ + logits = self.unembed(hidden_states, + self._non_transformer.word_unembed_w, + ragged_batch_info, + bias=self._non_transformer.word_unembed_b, + gamma=self._non_transformer.final_norm_gamma, + beta=self._non_transformer.final_norm_beta) + + if self.tp_size > 1: + comm_buffer = empty_from(self._comm_logits, (self.tp_size, logits.shape[0], logits.shape[1])) + full_logits = empty_from(self._return_logits, (logits.shape[0], self.vocab_size)) + + dist.all_gather_into_tensor(comm_buffer, logits, group=self._base_mp_group) + + full_logits.copy_(comm_buffer.permute(1, 0, 2).reshape(logits.shape[0], self.vocab_size)) + + return full_logits + else: + return logits + + def forward(self, wrapped_batch: RaggedBatchWrapper) -> torch.Tensor: + residual = self._forward_embed(wrapped_batch) + + residual, hidden_states = self.norm(residual, + None, + gamma=self._transformer[0].ln_gamma, + beta=self._transformer[0].ln_beta) + + for layer_idx in range(self.num_layers): + residual, hidden_states = self._forward_transformer_layer(layer_idx, residual, hidden_states, + wrapped_batch) + + return self._forward_unembed(residual, wrapped_batch) diff --git a/deepspeed/inference/v2/model_implementations/phi/policy.py b/deepspeed/inference/v2/model_implementations/phi/policy.py new file mode 100644 index 000000000000..1e9db24022f5 --- /dev/null +++ b/deepspeed/inference/v2/model_implementations/phi/policy.py @@ -0,0 +1,32 @@ +# Copyright (c) Microsoft Corporation. +# SPDX-License-Identifier: Apache-2.0 + +# DeepSpeed Team + +from typing import Any + +from ...config_v2 import RaggedInferenceEngineConfig +from ..inference_policy_base import ContainerMap, InferenceV2Policy +from .containers import PhiNonTransformerContainer, PhiTransformerContainer +from .model import PhiInferenceModel + + +class PhiPolicy(InferenceV2Policy): + + def instantiate_model(self, engine_config: RaggedInferenceEngineConfig, mp_group: Any) -> PhiInferenceModel: + return PhiInferenceModel(config=self._model_config, engine_config=engine_config, base_mp_group=mp_group) + + def build_container_map(self) -> ContainerMap: + map = ContainerMap() + + trans_container_cls = PhiTransformerContainer + transformer_containers = [trans_container_cls(self.model) for _ in range(self.model.num_layers)] + + map.set_transformer_params(['transformer.h'], transformer_containers) + + map.set_non_transformer_params(PhiNonTransformerContainer(self.model)) + + map.set_unmapped_params( + [f'model.layers.{i}.self_attn.rotary_emb.inv_freq' for i in range(self.model.num_layers)]) + + return map diff --git a/deepspeed/inference/v2/modules/configs/attention_configs.py b/deepspeed/inference/v2/modules/configs/attention_configs.py index 823104b13fc2..be6a3535024c 100644 --- a/deepspeed/inference/v2/modules/configs/attention_configs.py +++ b/deepspeed/inference/v2/modules/configs/attention_configs.py @@ -39,6 +39,14 @@ class RotateHalfConfig(DeepSpeedConfigModel): Base for theta. This will only be used if `use_trained_freqs` is False. """ + rotate_dim: Optional[int] = None + """ + How many neurons to rotate. If None, then all neurons will be rotated. Many external configs + will set this number to half the head dimension and then internally multiply by 2. To make it + more clear to understand what is happening (rotate_dim < head_dim -> then only partial rotation), + we do not do this multiplication internally. + """ + class MaskingType(Enum): diff --git a/deepspeed/inference/v2/modules/implementations/attention/dense_blocked_attention.py b/deepspeed/inference/v2/modules/implementations/attention/dense_blocked_attention.py index b2727ffca620..5f41b5ff6e13 100644 --- a/deepspeed/inference/v2/modules/implementations/attention/dense_blocked_attention.py +++ b/deepspeed/inference/v2/modules/implementations/attention/dense_blocked_attention.py @@ -86,13 +86,18 @@ def __init__(self, config: DSSelfAttentionConfig, implementation_config: Dict[st self._kv_copy = LinearBlockedKVCopy(self._config.head_size, self._config.n_heads_q, self._config.n_heads_kv, self._config.input_dtype) elif embed_type == PositionalEmbeddingType.rotate_half: - if config.positional_embedding_config.use_trained_freqs: + rotary_config = config.positional_embedding_config + if rotary_config.use_trained_freqs: + # Theta and rotary dim are effectively embedded into either the values (theta) or the shape (rotary_dim) + # of the trained_freqs tensor. self._kv_copy = BlockedTrainedRotaryEmbeddings(self._config.head_size, self._config.n_heads_q, self._config.n_heads_kv, self._config.input_dtype) else: - theta_base = config.positional_embedding_config.theta_base + theta_base = rotary_config.theta_base + rotary_dim = rotary_config.rotate_dim if rotary_config.rotate_dim is not None else self._config.head_size self._kv_copy = BlockedRotaryEmbeddings(self._config.head_size, self._config.n_heads_q, - self._config.n_heads_kv, self._config.input_dtype, theta_base) + self._config.n_heads_kv, self._config.input_dtype, rotary_dim, + theta_base) self._softmax_scale = self._config.scale_factor diff --git a/deepspeed/inference/v2/modules/implementations/unembed/ragged_unembed.py b/deepspeed/inference/v2/modules/implementations/unembed/ragged_unembed.py index 40d70cbd4df7..36130902c665 100644 --- a/deepspeed/inference/v2/modules/implementations/unembed/ragged_unembed.py +++ b/deepspeed/inference/v2/modules/implementations/unembed/ragged_unembed.py @@ -9,8 +9,8 @@ from deepspeed.accelerator import get_accelerator from ....allocator import empty_from -from ....inference_utils import DtypeEnum -from ....kernels.core_ops import CUDAFPLN, BlasLibLinear, CUDARMSNorm +from ....inference_utils import DtypeEnum, ActivationType +from ....kernels.core_ops import CUDAFPLN, BlasLibLinear, CUDARMSNorm, CUDABiasActivation from ....kernels.ragged_ops import RaggedLogitsGather from ....ragged import RaggedBatchWrapper from ...interfaces import DSUnembedBase, DSUnembedRegistry @@ -65,6 +65,8 @@ def __init__(self, config: DSUnembedConfig, implementation_config: Dict[str, Any self._norm = None self._linear = BlasLibLinear(self._config.dtype) + # Here the activation kernel is being used to apply bias, hence the identity activation type! + self._act_fn = CUDABiasActivation(self._config.vocab_size, self._config.dtype, ActivationType.IDENTITY) self._intermediate = torch.empty((self._config.max_sequences, self._config.model_dim), dtype=self._config.dtype, @@ -82,6 +84,7 @@ def forward(self, hidden_states: torch.Tensor, vocab_embedding: torch.Tensor, ragged_metadata: RaggedBatchWrapper, + bias: Optional[torch.Tensor] = None, gamma: Optional[torch.Tensor] = None, beta: Optional[torch.Tensor] = None) -> torch.Tensor: """ @@ -111,5 +114,7 @@ def forward(self, output = empty_from(self._output, (ragged_metadata.current_sequences, self._config.vocab_size)) self._linear(output, cut_down_hidden_states, vocab_embedding) + if bias is not None: + self._act_fn(output, bias) return output diff --git a/deepspeed/inference/v2/ragged/ragged_manager.py b/deepspeed/inference/v2/ragged/ragged_manager.py index 8eff4560b4d0..ecc3c52a5834 100644 --- a/deepspeed/inference/v2/ragged/ragged_manager.py +++ b/deepspeed/inference/v2/ragged/ragged_manager.py @@ -127,10 +127,7 @@ def get_sequence(self, uid: int) -> Optional[DSSequenceDescriptor]: Get the sequence descriptor for the given sequence id. If the sequence does not exist, then None is returned. """ - if uid not in self._seqs: - return None - - return self._seqs[uid] + return self._seqs.get(uid, None) def get_or_create_sequence(self, uid: int) -> DSSequenceDescriptor: """ @@ -139,8 +136,9 @@ def get_or_create_sequence(self, uid: int) -> DSSequenceDescriptor: if one may be allocated and should not be used from APIs that are attempting to test the schedulability of a hypothetical batch. """ - if uid in self._seqs: - return self._seqs[uid] + seq = self.get_sequence(uid) + if seq is not None: + return seq else: return self._create_sequence(uid) diff --git a/tests/unit/inference/v2/kernels/ragged_ops/test_blocked_kv_copy.py b/tests/unit/inference/v2/kernels/ragged_ops/test_blocked_kv_copy.py index 90fe26eb4490..5f1ef930952c 100644 --- a/tests/unit/inference/v2/kernels/ragged_ops/test_blocked_kv_copy.py +++ b/tests/unit/inference/v2/kernels/ragged_ops/test_blocked_kv_copy.py @@ -13,11 +13,11 @@ @pytest.mark.inference_v2_ops @pytest.mark.parametrize("n_tokens, history_size", [(1, 0), (17, 0), (33, 8), (63, 1)]) -def test_single_sequence_single_block(n_tokens: int, history_size: int): +@pytest.mark.parametrize("head_size", [64, 80, 128]) +def test_single_sequence_single_block(n_tokens: int, history_size: int, head_size: int): """ Validate that the copy works correctly """ - head_size = 64 n_heads_q = 16 n_heads_kv = 16 kv_block_size = 64 @@ -46,11 +46,11 @@ def test_single_sequence_single_block(n_tokens: int, history_size: int): @pytest.mark.inference_v2_ops @pytest.mark.parametrize("n_tokens, history_size", [(128, 0), (177, 0), (169, 8), (117, 88)]) -def test_single_sequence_multiple_blocks(n_tokens: int, history_size: int): +@pytest.mark.parametrize("head_size", [64, 80, 128]) +def test_single_sequence_multiple_blocks(n_tokens: int, history_size: int, head_size: int): """ Validate that the copy works correctly """ - head_size = 64 n_heads_q = 16 n_heads_kv = 16 kv_block_size = 64 @@ -78,8 +78,8 @@ def test_single_sequence_multiple_blocks(n_tokens: int, history_size: int): @pytest.mark.inference_v2_ops -def test_multi_sequence() -> None: - head_size = 64 +@pytest.mark.parametrize("head_size", [64, 80, 128]) +def test_multi_sequence(head_size: int) -> None: n_heads_q = 16 n_heads_kv = 16 kv_block_size = 64 diff --git a/tests/unit/inference/v2/kernels/ragged_ops/test_blocked_rotary_emb.py b/tests/unit/inference/v2/kernels/ragged_ops/test_blocked_rotary_emb.py index 618c2d3b87ec..156be9929d92 100644 --- a/tests/unit/inference/v2/kernels/ragged_ops/test_blocked_rotary_emb.py +++ b/tests/unit/inference/v2/kernels/ragged_ops/test_blocked_rotary_emb.py @@ -21,13 +21,19 @@ """ -def rotary_pos_embs(q: torch.Tensor, k: torch.Tensor, seq_descs: List[DSSequenceDescriptor], batch: RaggedBatchWrapper, - head_size: int): +def rotary_pos_embs(q: torch.Tensor, + k: torch.Tensor, + seq_descs: List[DSSequenceDescriptor], + batch: RaggedBatchWrapper, + head_size: int, + rotary_dim: int = -1) -> Tuple[torch.Tensor, torch.Tensor, torch.Tensor]: + + rotary_dim = rotary_dim if rotary_dim >= 0 else head_size def make_cos_sin_emb(seq_len: int) -> Tuple[torch.Tensor, torch.Tensor]: t = torch.arange(seq_len, dtype=torch.float32, device=get_accelerator().current_device()) inv_freq = (1.0 / (10000.0**(torch.arange( - 0, head_size, 2, dtype=torch.float32, device=get_accelerator().current_device()) / head_size))).half() + 0, rotary_dim, 2, dtype=torch.float32, device=get_accelerator().current_device()) / rotary_dim))).half() freqs = torch.einsum("i,j->ij", t, inv_freq) emb = torch.cat((freqs, freqs), dim=-1) @@ -57,11 +63,17 @@ def rotate_half(x: torch.Tensor) -> torch.Tensor: k_src = k[start_idx:start_idx + n_tokens].reshape(n_tokens, n_heads_kv, head_size).float() freq_start_offset = seq_desc.seen_tokens + q_src_rot = q_src[:, :, :rotary_dim] + k_src_rot = k_src[:, :, :rotary_dim] + cos_chunk = cos[range(freq_start_offset, freq_start_offset + n_tokens)] sin_chunk = sin[range(freq_start_offset, freq_start_offset + n_tokens)] - q_emb = q_src * cos_chunk + rotate_half(q_src) * sin_chunk - k_emb = k_src * cos_chunk + rotate_half(k_src) * sin_chunk + q_rot = q_src_rot * cos_chunk + rotate_half(q_src_rot) * sin_chunk + k_rot = k_src_rot * cos_chunk + rotate_half(k_src_rot) * sin_chunk + + q_emb = torch.cat((q_rot, q_src[:, :, rotary_dim:]), dim=-1) + k_emb = torch.cat((k_rot, k_src[:, :, rotary_dim:]), dim=-1) q_out[start_idx:start_idx + n_tokens] = q_emb.reshape(n_tokens, n_heads_q * head_size).to(q_out.dtype) k_out[start_idx:start_idx + n_tokens] = k_emb.reshape(n_tokens, n_heads_kv * head_size).to(k_out.dtype) @@ -72,11 +84,11 @@ def rotate_half(x: torch.Tensor) -> torch.Tensor: @pytest.mark.inference_v2_ops @pytest.mark.parametrize("n_tokens, history_size", [(1, 0), (17, 0), (33, 15), (1, 63)]) @pytest.mark.parametrize("trained_emb", [False, True]) -def test_single_sequence_single_block(n_tokens: int, history_size: int, trained_emb: bool): +@pytest.mark.parametrize("head_size", [64, 80]) +def test_single_sequence_single_block(n_tokens: int, history_size: int, trained_emb: bool, head_size: int): """ Validate that the copy works correctly """ - head_size = 64 n_heads_q = 16 n_heads_kv = 16 kv_block_size = 64 @@ -106,7 +118,7 @@ def test_single_sequence_single_block(n_tokens: int, history_size: int, trained_ copy_impl = BlockedTrainedRotaryEmbeddings(head_size, n_heads_q, n_heads_kv, torch.float16) copy_impl(kv_cache, qkv, batch, freqs) else: - copy_impl = BlockedRotaryEmbeddings(head_size, n_heads_q, n_heads_kv, torch.float16) + copy_impl = BlockedRotaryEmbeddings(head_size, n_heads_q, n_heads_kv, torch.float16, head_size, 10000.0) copy_impl(kv_cache, qkv, batch) assert allclose(qkv[:, :head_size * n_heads_q], q_ref) @@ -116,11 +128,11 @@ def test_single_sequence_single_block(n_tokens: int, history_size: int, trained_ @pytest.mark.inference_v2_ops @pytest.mark.parametrize("n_tokens, history_size", [(128, 0), (177, 0), (169, 8), (117, 88)]) @pytest.mark.parametrize("trained_emb", [False, True]) -def test_single_sequence_multiple_blocks(n_tokens: int, history_size: int, trained_emb: bool): +@pytest.mark.parametrize("head_size", [64, 80]) +def test_single_sequence_multiple_blocks(n_tokens: int, history_size: int, trained_emb: bool, head_size: int): """ Validate that the copy works correctly """ - head_size = 64 n_heads_q = 16 n_heads_kv = 16 kv_block_size = 64 @@ -150,7 +162,7 @@ def test_single_sequence_multiple_blocks(n_tokens: int, history_size: int, train copy_impl = BlockedTrainedRotaryEmbeddings(head_size, n_heads_q, n_heads_kv, torch.float16) copy_impl(kv_cache, qkv, batch, freqs) else: - copy_impl = BlockedRotaryEmbeddings(head_size, n_heads_q, n_heads_kv, torch.float16) + copy_impl = BlockedRotaryEmbeddings(head_size, n_heads_q, n_heads_kv, torch.float16, head_size, 10000.0) copy_impl(kv_cache, qkv, batch) assert allclose(qkv[:, :head_size * n_heads_q], q_ref) @@ -159,8 +171,8 @@ def test_single_sequence_multiple_blocks(n_tokens: int, history_size: int, train @pytest.mark.inference_v2_ops @pytest.mark.parametrize("trained_emb", [False, True]) -def test_multi_sequences(trained_emb: bool) -> None: - head_size = 64 +@pytest.mark.parametrize("head_size", [64, 80]) +def test_multi_sequences(trained_emb: bool, head_size: int) -> None: n_heads_q = 16 n_heads_kv = 16 kv_block_size = 64 @@ -196,8 +208,51 @@ def test_multi_sequences(trained_emb: bool) -> None: copy_impl = BlockedTrainedRotaryEmbeddings(head_size, n_heads_q, n_heads_kv, torch.float16) copy_impl(kv_cache, qkv, batch, freqs) else: - copy_impl = BlockedRotaryEmbeddings(head_size, n_heads_q, n_heads_kv, torch.float16) + copy_impl = BlockedRotaryEmbeddings(head_size, n_heads_q, n_heads_kv, torch.float16, head_size, 10000.0) copy_impl(kv_cache, qkv, batch) assert allclose(qkv[:, :head_size * n_heads_q], q_ref) validate_kv_cache(kv_cache, k, v, seq_descs, batch, exact=False) + + +@pytest.mark.inference_v2_ops +def test_rotary_dim() -> None: + trained_emb = False + head_size = 80 + rotary_dim = 64 + n_heads_q = 16 + n_heads_kv = 16 + kv_block_size = 64 + device = get_accelerator().current_device() + + batch_config = [ + (128, 0), + (177, 0), + (169, 8), + (117, 88), + (1, 293), + (1, 733), + (1, 33), + ] + + batch, state_manager, seq_descs = build_batch_and_manager(batch_config, head_size, n_heads_kv, kv_block_size) + + qkv = torch.randn((batch.current_tokens, (n_heads_q + 2 * n_heads_kv) * head_size), + device=device, + dtype=torch.float16) + qkv_ref = qkv.clone() + + q = qkv_ref[:, :head_size * n_heads_q] + k = qkv_ref[:, head_size * n_heads_q:head_size * (n_heads_q + n_heads_kv)] + v = qkv_ref[:, head_size * (n_heads_q + n_heads_kv):] + + q_ref, k, freqs = rotary_pos_embs(q, k, seq_descs, batch, head_size, rotary_dim=rotary_dim) + freqs = freqs.half() + + kv_cache = state_manager.get_cache(0) + + copy_impl = BlockedRotaryEmbeddings(head_size, n_heads_q, n_heads_kv, torch.float16, rotary_dim, 10000.0) + copy_impl(kv_cache, qkv, batch) + + assert allclose(qkv[:, :head_size * n_heads_q], q_ref) + validate_kv_cache(kv_cache, k, v, seq_descs, batch, exact=False) From c84c28d23b4e9ee13ea4d561f8da129f73d05571 Mon Sep 17 00:00:00 2001 From: Abhilash Majumder <30946547+abhilash1910@users.noreply.github.com> Date: Fri, 5 Jan 2024 19:06:17 +0530 Subject: [PATCH 060/754] Support cpu tensors without direct device invocation (#3842) Motivation: Fix for reproducible issue #3837 on cpu. On cpus direct invocation of torch.cpu.tensor leads to dtype mismatch. Another way would be to have something like : ["torch.DoubleTensor" if device_type == 'cpu else '"torch.{}.DoubleTensor".format(device_type)] for all elements in the supported list , but that would eliminate "torch.cpu.DoubleTensor" ,etc from the scope. @jeffra requesting review. CLA is signed --------- Co-authored-by: Olatunji Ruwase Co-authored-by: inkcherry --- deepspeed/runtime/engine.py | 69 +++++++++++++++++------------- deepspeed/runtime/sparse_tensor.py | 1 + 2 files changed, 41 insertions(+), 29 deletions(-) diff --git a/deepspeed/runtime/engine.py b/deepspeed/runtime/engine.py index c03fba2d7784..3cbc4c8414b7 100644 --- a/deepspeed/runtime/engine.py +++ b/deepspeed/runtime/engine.py @@ -120,21 +120,25 @@ def split_half_float_double_sparse(tensors): device_type = get_accelerator().device_name() - supported_types = [ - "torch.{}.HalfTensor".format(device_type), "torch.{}.FloatTensor".format(device_type), - "torch.{}.DoubleTensor".format(device_type), "torch.{}.BFloat16Tensor".format(device_type), - SparseTensor.type() - ] + supported_types = get_accelerator().supported_dtypes() for t in tensors: - assert t.type() in supported_types, f"attempting to reduce an unsupported grad type: {t.type()}" + assert t.dtype in supported_types, f"attempting to reduce an unsupported grad type: {t.dtype}" - buckets = [] + sparse_tensor_buckets, dense_tensor_buckets = [], [] for i, dtype in enumerate(supported_types): - bucket = [t for t in tensors if t.type() == dtype] - if bucket: - buckets.append((dtype, bucket)) - return buckets + sparse_bucket, dense_bucket = [], [] + for t in tensors: + if t.dtype == dtype: + if isinstance(t, SparseTensor): + sparse_bucket.append(t) + else: + dense_bucket.append(t) + if sparse_bucket: + sparse_tensor_buckets.append((dtype, sparse_bucket)) + if dense_bucket: + dense_tensor_buckets.append((dtype, dense_bucket)) + return sparse_tensor_buckets, dense_tensor_buckets class EngineTimers(object): @@ -2396,30 +2400,37 @@ def _get_gradients_for_reduction(self): return non_expert_grads, expert_grads def _reduce_non_expert_gradients(self, grads, elements_per_buffer): - split_buckets = split_half_float_double_sparse(grads) - for _, bucket_tuple in enumerate(split_buckets): - bucket_type, bucket = bucket_tuple + split_sparse_tensor_buckets, split_dense_tensor_buckets = split_half_float_double_sparse(grads) + if self.pipeline_parallelism: + dp_group = self.mpu.get_data_parallel_group() + else: + dp_group = groups._get_sequence_data_parallel_group() - if self.pipeline_parallelism: - dp_group = self.mpu.get_data_parallel_group() - else: - dp_group = groups._get_sequence_data_parallel_group() + for _, sparse_bucket_tuple in enumerate(split_sparse_tensor_buckets): + if sparse_bucket_tuple: + bucket_type, sparse_bucket = sparse_bucket_tuple + self.sparse_allreduce_no_retain(sparse_bucket, dp_group=dp_group) - if bucket_type == SparseTensor.type(): - self.sparse_allreduce_no_retain(bucket, dp_group=dp_group) - else: - self.allreduce_no_retain(bucket, dp_group=dp_group, numel_per_bucket=elements_per_buffer) + for _, dense_bucket_tuple in enumerate(split_dense_tensor_buckets): + if dense_bucket_tuple: + bucket_type, dense_bucket = dense_bucket_tuple + self.allreduce_no_retain(dense_bucket, dp_group=dp_group, numel_per_bucket=elements_per_buffer) def _reduce_expert_gradients(self, expert_grads, elements_per_buffer): for ep_name, expert_grads_group in expert_grads.items(): - expert_split_buckets = split_half_float_double_sparse(expert_grads_group) - for i, bucket_tuple in enumerate(expert_split_buckets): - bucket_type, bucket = bucket_tuple - if bucket_type == SparseTensor.type(): - self.sparse_allreduce_no_retain(bucket, groups._get_expert_data_parallel_group(ep_name)) - else: + split_sparse_tensor_buckets, split_dense_tensor_buckets = split_half_float_double_sparse( + expert_grads_group) + + for _, sparse_bucket_tuple in enumerate(split_sparse_tensor_buckets): + if sparse_bucket_tuple: + bucket_type, sparse_bucket = sparse_bucket_tuple + self.sparse_allreduce_no_retain(sparse_bucket, groups._get_expert_data_parallel_group(ep_name)) + + for _, dense_bucket_tuple in enumerate(split_dense_tensor_buckets): + if dense_bucket_tuple: + bucket_type, dense_bucket = dense_bucket_tuple # Separate between diff groups - self.allreduce_no_retain(bucket, + self.allreduce_no_retain(dense_bucket, dp_group=groups._get_expert_data_parallel_group(ep_name), numel_per_bucket=elements_per_buffer) diff --git a/deepspeed/runtime/sparse_tensor.py b/deepspeed/runtime/sparse_tensor.py index f0bb5c75530e..291ba5f0c786 100644 --- a/deepspeed/runtime/sparse_tensor.py +++ b/deepspeed/runtime/sparse_tensor.py @@ -15,6 +15,7 @@ class SparseTensor(object): def __init__(self, dense_tensor=None): self.orig_dense_tensor = dense_tensor + self.dtype = self.orig_dense_tensor.dtype self.is_sparse = dense_tensor.is_sparse if dense_tensor is not None: if dense_tensor.is_sparse: From c8c57b8c24ad761267ab43b0252fb62f0c30d289 Mon Sep 17 00:00:00 2001 From: "Wang, Yi" Date: Sat, 6 Jan 2024 04:27:52 +0800 Subject: [PATCH 061/754] add sharded loading for safetensors in AutoTP (#4854) Signed-off-by: Wang, Yi A Co-authored-by: Logan Adams <114770087+loadams@users.noreply.github.com> Co-authored-by: Michael Wyatt --- deepspeed/module_inject/replace_module.py | 7 ++++++- requirements/requirements-inf.txt | 1 + 2 files changed, 7 insertions(+), 1 deletion(-) diff --git a/deepspeed/module_inject/replace_module.py b/deepspeed/module_inject/replace_module.py index 5b7d2209d89e..eced9c6d7c81 100644 --- a/deepspeed/module_inject/replace_module.py +++ b/deepspeed/module_inject/replace_module.py @@ -566,7 +566,12 @@ def replace_module(model, orig_class, replace_fn, _replace_policy, checkpoint=No """ sd = None if checkpoint is not None: - sd = torch.load(checkpoint, map_location='cpu') + if checkpoint.endswith(".safetensors"): + from safetensors.torch import load_file + sd = load_file(checkpoint) + else: + sd = torch.load(checkpoint, map_location='cpu') + policy = {} if orig_class is not None: policy.update({orig_class: (replace_fn, _replace_policy)}) diff --git a/requirements/requirements-inf.txt b/requirements/requirements-inf.txt index 27371e623f26..380f74a2727a 100644 --- a/requirements/requirements-inf.txt +++ b/requirements/requirements-inf.txt @@ -1,5 +1,6 @@ google lm-eval==0.3.0 protobuf +safetensors transformers>=4.32.1 transformers[sentencepiece] From f4f31317ed21b23c163c44a8c7e95d6c42af8580 Mon Sep 17 00:00:00 2001 From: "Ma, Guokai" Date: Sat, 6 Jan 2024 04:29:07 +0800 Subject: [PATCH 062/754] [XPU] XPU accelerator support for Intel GPU device (#4547) This PR includes XPU support for Intel GPU. With this PR, DeepSpeed can support XPU devices without install Intel Extension for DeepSpeed. --------- Co-authored-by: Liangliang-Ma <1906710196@qq.com> Co-authored-by: baodi Co-authored-by: Logan Adams <114770087+loadams@users.noreply.github.com> Co-authored-by: Olatunji Ruwase Co-authored-by: Yizhou Wang Co-authored-by: Michael Wyatt --- accelerator/real_accelerator.py | 31 ++- accelerator/xpu_accelerator.py | 282 ++++++++++++++++++++++ csrc/adam/multi_tensor_adam.cu | 2 +- csrc/xpu/adagrad/cpu_adagrad.cpp | 196 +++++++++++++++ csrc/xpu/adam/cpu_adam.cpp | 16 ++ csrc/xpu/adam/cpu_adam_impl.cpp | 247 +++++++++++++++++++ csrc/xpu/adam/fused_adam_frontend.cpp | 25 ++ csrc/xpu/adam/multi_tensor_adam.dp.cpp | 159 ++++++++++++ csrc/xpu/adam/multi_tensor_apply.dp.hpp | 221 +++++++++++++++++ csrc/xpu/common/custom_cuda_kernel.dp.cpp | 92 +++++++ csrc/xpu/includes/compat.h | 19 ++ csrc/xpu/includes/cpu_adagrad.h | 120 +++++++++ csrc/xpu/includes/cpu_adam.h | 237 ++++++++++++++++++ csrc/xpu/includes/simd.h | 198 +++++++++++++++ csrc/xpu/includes/type_shim.h | 155 ++++++++++++ op_builder/builder.py | 20 ++ op_builder/xpu/__init__.py | 9 + op_builder/xpu/async_io.py | 99 ++++++++ op_builder/xpu/builder.py | 126 ++++++++++ op_builder/xpu/cpu_adagrad.py | 23 ++ op_builder/xpu/cpu_adam.py | 29 +++ op_builder/xpu/fused_adam.py | 26 ++ 22 files changed, 2322 insertions(+), 10 deletions(-) create mode 100644 accelerator/xpu_accelerator.py create mode 100644 csrc/xpu/adagrad/cpu_adagrad.cpp create mode 100755 csrc/xpu/adam/cpu_adam.cpp create mode 100644 csrc/xpu/adam/cpu_adam_impl.cpp create mode 100755 csrc/xpu/adam/fused_adam_frontend.cpp create mode 100644 csrc/xpu/adam/multi_tensor_adam.dp.cpp create mode 100644 csrc/xpu/adam/multi_tensor_apply.dp.hpp create mode 100644 csrc/xpu/common/custom_cuda_kernel.dp.cpp create mode 100755 csrc/xpu/includes/compat.h create mode 100644 csrc/xpu/includes/cpu_adagrad.h create mode 100644 csrc/xpu/includes/cpu_adam.h create mode 100755 csrc/xpu/includes/simd.h create mode 100644 csrc/xpu/includes/type_shim.h create mode 100755 op_builder/xpu/__init__.py create mode 100644 op_builder/xpu/async_io.py create mode 100644 op_builder/xpu/builder.py create mode 100644 op_builder/xpu/cpu_adagrad.py create mode 100644 op_builder/xpu/cpu_adam.py create mode 100644 op_builder/xpu/fused_adam.py diff --git a/accelerator/real_accelerator.py b/accelerator/real_accelerator.py index 0389252e8894..10ebad11c72f 100644 --- a/accelerator/real_accelerator.py +++ b/accelerator/real_accelerator.py @@ -20,7 +20,7 @@ except ImportError as e: dsa2 = None -SUPPORTED_ACCELERATOR_LIST = ['cuda', 'cpu', 'xpu', 'npu', 'mps'] +SUPPORTED_ACCELERATOR_LIST = ['cuda', 'cpu', 'xpu', 'xpu.external', 'npu', 'mps'] ds_accelerator = None @@ -60,10 +60,18 @@ def get_accelerator(): accelerator_name = os.environ["DS_ACCELERATOR"] if accelerator_name == "xpu": try: - from intel_extension_for_deepspeed import XPU_Accelerator # noqa: F401 # type: ignore + import intel_extension_for_pytorch as ipex + assert ipex._C._has_xpu(), "XPU_Accelerator requires an intel_extension_for_pytorch that supports XPU." except ImportError as e: raise ValueError( - f"XPU_Accelerator requires intel_extension_for_deepspeed, which is not installed on this system.") + f"XPU_Accelerator requires intel_extension_for_pytorch, which is not installed on this system.") + elif accelerator_name == "xpu.external": + try: + import intel_extension_for_deepspeed # noqa: F401 # type: ignore + except ImportError as e: + raise ValueError( + f"XPU_Accelerator external requires intel_extension_for_deepspeed, which is not installed on this system." + ) elif accelerator_name == "cpu": try: import intel_extension_for_pytorch # noqa: F401 # type: ignore @@ -104,15 +112,16 @@ def get_accelerator(): try: from intel_extension_for_deepspeed import XPU_Accelerator # noqa: F401,F811 # type: ignore - - accelerator_name = "xpu" + accelerator_name = "xpu.external" except ImportError as e: pass if accelerator_name is None: try: - import intel_extension_for_pytorch # noqa: F401,F811 # type: ignore - - accelerator_name = "cpu" + import intel_extension_for_pytorch as ipex + if ipex._C._has_xpu(): + accelerator_name = "xpu" + else: + accelerator_name = "cpu" except ImportError as e: pass if accelerator_name is None: @@ -145,8 +154,12 @@ def get_accelerator(): from .cpu_accelerator import CPU_Accelerator ds_accelerator = CPU_Accelerator() - elif accelerator_name == "xpu": + elif accelerator_name == "xpu.external": # XPU_Accelerator is already imported in detection stage + ds_accelerator = XPU_Accelerator() + elif accelerator_name == "xpu": + from .xpu_accelerator import XPU_Accelerator + ds_accelerator = XPU_Accelerator() elif accelerator_name == "npu": from .npu_accelerator import NPU_Accelerator diff --git a/accelerator/xpu_accelerator.py b/accelerator/xpu_accelerator.py new file mode 100644 index 000000000000..c3d6630cc235 --- /dev/null +++ b/accelerator/xpu_accelerator.py @@ -0,0 +1,282 @@ +# Copyright (c) Microsoft Corporation. +# SPDX-License-Identifier: Apache-2.0 + +# DeepSpeed Team + +import torch +from deepspeed.accelerator.abstract_accelerator import DeepSpeedAccelerator +import intel_extension_for_pytorch as ipex # noqa: F401 # type: ignore +import oneccl_bindings_for_pytorch # noqa: F401 # type: ignore + + +class XPU_Accelerator(DeepSpeedAccelerator): + + def __init__(self): + self._name = 'xpu' + self._communication_backend_name = 'ccl' + self.aligned_tensors = [] + + def is_synchronized_device(self): + return False + + # Device APIs + def device_name(self, device_index=None): + if device_index == None: + return 'xpu' + return 'xpu:{}'.format(device_index) + + def device(self, device_index=None): + return torch.xpu.device(device_index) + + def set_device(self, device_index): + torch.xpu.set_device(device_index) + + def current_device(self): + return torch.xpu.current_device() + + def current_device_name(self): + return 'xpu:{}'.format(torch.xpu.current_device()) + + def device_count(self): + return torch.xpu.device_count() + + def synchronize(self, device_index=None): + return torch.xpu.synchronize(device_index) + + # RNG APIs + def random(self): + return torch.xpu.random + + def set_rng_state(self, new_state, device_index=None): + if device_index == None: + return torch.xpu.set_rng_state(new_state) + return torch.xpu.set_rng_state(new_state, device_index) + + def get_rng_state(self, device_index=None): + if device_index == None: + return torch.xpu.get_rng_state() + return torch.xpu.get_rng_state(device_index) + + def manual_seed(self, seed): + return torch.xpu.manual_seed(seed) + + def manual_seed_all(self, seed): + return torch.xpu.manual_seed_all(seed) + + def initial_seed(self, seed): + return torch.xpu.initial_seed(seed) + + def default_generator(self, device_index): + return torch.xpu.default_generators[device_index] + + # Streams/Events + @property + def Stream(self): + return torch.xpu.Stream + + def stream(self, stream): + return torch.xpu.stream(stream) + + def current_stream(self, device_index=None): + return torch.xpu.current_stream(device_index) + + def default_stream(self, device_index=None): + # torch.xpu does not support the sync behavior of default stream as cuda + # use current_stream as workaround + # see https://pytorch.org/docs/stable/notes/cuda.html#cuda-streams + return torch.xpu.current_stream(device_index) + + @property + def Event(self): + return torch.xpu.Event + + # Memory management + def empty_cache(self): + return torch.xpu.empty_cache() + + def memory_allocated(self, device_index=None): + return torch.xpu.memory_allocated(device_index) + + def max_memory_allocated(self, device_index=None): + return torch.xpu.max_memory_allocated(device_index) + + def reset_max_memory_allocated(self, device_index=None): + return torch.xpu.reset_max_memory_allocated(device_index) + + def memory_cached(self, device_index=None): + return torch.xpu.memory_reserved(device_index) + + def max_memory_cached(self, device_index=None): + return torch.xpu.max_memory_reserved(device_index) + + def reset_max_memory_cached(self, device_index=None): + return torch.xpu.reset_max_memory_reserved(device_index) + + def memory_stats(self, device_index=None): + return torch.xpu.memory_stats(device_index) + + def reset_peak_memory_stats(self, device_index=None): + return torch.xpu.reset_peak_memory_stats(device_index) + + def memory_reserved(self, device_index=None): + return torch.xpu.memory_reserved(device_index) + + def max_memory_reserved(self, device_index=None): + return torch.xpu.max_memory_reserved(device_index) + + def total_memory(self, device_index=None): + return torch.xpu.get_device_properties(device_index).total_memory + + def available_memory(self, device_index=None): + return self.total_memory(device_index) - self.memory_allocated(device_index) + + # Misc + def amp(self): + return torch.xpu.amp + + def is_available(self): + return torch.xpu.is_available() + + def range_push(self, msg): + # TODO itt is currently not supported yet + # return torch.profiler.itt.range_push(msg) + return + + def range_pop(self): + # TODO itt is currently not supported yet + # return torch.profiler.itt.range_pop() + return + + def lazy_call(self, callback): + return torch.xpu.lazy_init._lazy_call(callback) + + def communication_backend_name(self): + return self._communication_backend_name + + def is_triton_supported(self): + return False + + # Graph operations + def create_graph(self): + return None + + def capture_to_graph(self, graph, pool=None, stream=None): + from deepspeed.runtime.utils import noop_context + return noop_context() + + def replay_graph(self, graph): + return + + # Data types + def is_bf16_supported(self): + return True + + def is_fp16_supported(self): + return True + + def supported_dtypes(self): + return [torch.float, torch.half, torch.bfloat16] + + # Tensor operations + + @property + def BFloat16Tensor(self): + return torch.xpu.BFloat16Tensor + + @property + def ByteTensor(self): + return torch.xpu.ByteTensor + + @property + def DoubleTensor(self): + return torch.xpu.DoubleTensor + + @property + def FloatTensor(self): + return torch.xpu.FloatTensor + + @property + def HalfTensor(self): + return torch.xpu.HalfTensor + + @property + def IntTensor(self): + return torch.xpu.IntTensor + + @property + def LongTensor(self): + return torch.xpu.LongTensor + + def pin_memory(self, tensor, align_bytes=1): + if align_bytes == 1: + return tensor.pin_memory(device=self.current_device_name()) + elif align_bytes == 0: + from intel_extension_for_deepspeed.op_builder.async_io import AsyncIOBuilder + self.aio_handle = AsyncIOBuilder().load().aio_handle(128 * 1024, 8, False, False, False) + aligned_t = self.aio_handle.new_cpu_locked_tensor(tensor.numel(), tensor) + aligned_t = aligned_t[:tensor.numel()].copy_(tensor) + self.aligned_tensors.append([aligned_t.data_ptr(), aligned_t[-1].data_ptr()]) + return aligned_t + + def is_pinned(self, tensor): + if tensor.is_pinned(device=self.current_device_name()): + return True + else: + for begin, end in self.aligned_tensors: + if begin <= tensor.data_ptr() and tensor.data_ptr() <= end: + return True + return False + + def op_builder_dir(self): + try: + # is op_builder from deepspeed or a 3p version? this should only succeed if it's deepspeed + # if successful this also means we're doing a local install and not JIT compile path + from op_builder import __deepspeed__ # noqa: F401 # type: ignore + return "op_builder.xpu" + except ImportError: + return "deepspeed.ops.op_builder.xpu" + + def on_accelerator(self, tensor): + device_str = str(tensor.device) + if device_str.startswith('xpu:'): + return True + else: + return False + + # create an instance of op builder and return, name specified by class_name + def create_op_builder(self, op_name): + builder_class = self.get_op_builder(op_name) + if builder_class != None: + return builder_class() + return None + + # return an op builder class, name specified by class_name + def get_op_builder(self, class_name): + try: + # is op_builder from deepspeed or a 3p version? this should only succeed if it's deepspeed + # if successful this also means we're doing a local install and not JIT compile path + from op_builder import __deepspeed__ # noqa: F401 # type: ignore + from op_builder.xpu import CPUAdagradBuilder, CPUAdamBuilder, FusedAdamBuilder, AsyncIOBuilder + except ImportError: + from deepspeed.ops.op_builder.xpu import CPUAdagradBuilder, CPUAdamBuilder, FusedAdamBuilder, AsyncIOBuilder + + if class_name == "AsyncIOBuilder": + return AsyncIOBuilder + elif class_name == "CPUAdagradBuilder": + return CPUAdagradBuilder + elif class_name == "CPUAdamBuilder": + return CPUAdamBuilder + elif class_name == "FusedAdamBuilder": + return FusedAdamBuilder + else: + return None + + def build_extension(self): + try: + from intel_extension_for_pytorch.xpu.cpp_extension import DpcppBuildExtension + except ImportError: + from intel_extension_for_pytorch.xpu.utils import DpcppBuildExtension + return DpcppBuildExtension + + def export_envs(self): + return [] diff --git a/csrc/adam/multi_tensor_adam.cu b/csrc/adam/multi_tensor_adam.cu index 1b697d989b1a..d6b9b2f70710 100644 --- a/csrc/adam/multi_tensor_adam.cu +++ b/csrc/adam/multi_tensor_adam.cu @@ -23,7 +23,7 @@ This file is adapted from fused adam in NVIDIA/apex, commit a109f85 #define BLOCK_SIZE 512 #define ILP 4 -typedef enum { +typedef enum : int { ADAM_MODE_0 = 0, // L2 regularization mode ADAM_MODE_1 = 1 // Decoupled weight decay mode(AdamW) } adamMode_t; diff --git a/csrc/xpu/adagrad/cpu_adagrad.cpp b/csrc/xpu/adagrad/cpu_adagrad.cpp new file mode 100644 index 000000000000..dc727f8fa216 --- /dev/null +++ b/csrc/xpu/adagrad/cpu_adagrad.cpp @@ -0,0 +1,196 @@ +// Copyright (c) Microsoft Corporation. +// SPDX-License-Identifier: Apache-2.0 + +// DeepSpeed Team + +#include "cpu_adagrad.h" +#include +#include +#include +#include +#include +#include + +static std::unordered_map> s_optimizers; + +// C++ interface + +void Adagrad_Optimizer::Step_1(float* _params, + float* grads, + float* _exp_avg_sq, + size_t _param_size, + ds_half_precision_t* dev_params, + bool half_precision) +{ + size_t rounded_size = 0; +#if defined(__AVX512__) or defined(__AVX256__) + Step_AVX<1>( + &rounded_size, _params, grads, _exp_avg_sq, _param_size, dev_params, half_precision); +#endif + if (_param_size > rounded_size) { + float step_size = -1 * _alpha; + ds_half_precision_t* grads_cast_h; + ds_half_precision_t* params_cast_h; + if (half_precision) { + grads_cast_h = reinterpret_cast(grads); + params_cast_h = reinterpret_cast(_params); + } + for (size_t t = rounded_size; t < _param_size; t += TILE) { + size_t copy_size = TILE; + if ((t + TILE) > _param_size) copy_size = _param_size - t; + size_t offset = copy_size + t; +#pragma omp parallel for + for (size_t k = t; k < offset; k++) { + float grad = half_precision ? (float)grads_cast_h[k] : grads[k]; + float param = half_precision ? (float)params_cast_h[k] : _params[k]; + float momentum = grads[k]; + float variance = _exp_avg_sq[k]; + if (_weight_decay > 0) { grad = param * _weight_decay + grad; } + + variance += grad * grad; + + grad = sqrt(variance); + grad += _eps; + grad = momentum / grad; + param = grad * step_size + param; + if (half_precision) + params_cast_h[k] = (ds_half_precision_t)param; + else + _params[k] = param; + // STORE UPDATE TERM TO GRAD'S MEMORY + grads[k] = grad * step_size; + _exp_avg_sq[k] = variance; + } + } + } +} + +void Adagrad_Optimizer::Step_4(float* _params, + float* grads, + float* _exp_avg_sq, + size_t _param_size, + ds_half_precision_t* dev_params, + bool half_precision) +{ + size_t rounded_size = 0; +#if defined(__AVX512__) or defined(__AVX256__) + Step_AVX<4>( + &rounded_size, _params, grads, _exp_avg_sq, _param_size, dev_params, half_precision); +#endif + if (_param_size > rounded_size) + Step_1((_params + rounded_size), + (grads + rounded_size), + (_exp_avg_sq + rounded_size), + (_param_size - rounded_size), + (dev_params != nullptr ? (dev_params + rounded_size) : dev_params), + half_precision); +} + +int create_adagrad_optimizer(int optimizer_id, + float alpha = 1e-2, + float eps = 1e-8, + float weight_decay = 0, + bool should_log = false) +{ + auto opt = std::make_shared(alpha, eps, weight_decay); + + s_optimizers[optimizer_id] = opt; + + if (should_log) { + std::string avx_type = ""; +#if defined(__AVX512__) + avx_type = "AVX512"; +#else +#if defined(__AVX256__) + avx_type = "AVX2"; +#else + avx_type = "scalar"; +#endif +#endif + + printf("Adagrad Optimizer #%d is created with %s arithmetic capability.\n", + optimizer_id, + avx_type.c_str()); + printf("Config: alpha=%f, weight_decay=%f\n", alpha, weight_decay); + } + + return 0; +} + +void Adagrad_Optimizer::Step_8(float* _params, + float* grads, + float* _exp_avg_sq, + size_t _param_size, + ds_half_precision_t* dev_params, + bool half_precision) +{ + size_t rounded_size = 0; +#if defined(__AVX512__) or defined(__AVX256__) + Step_AVX<8>( + &rounded_size, _params, grads, _exp_avg_sq, _param_size, dev_params, half_precision); +#endif + if (_param_size > rounded_size) + Step_4((_params + rounded_size), + (grads + rounded_size), + (_exp_avg_sq + rounded_size), + (_param_size - rounded_size), + (dev_params != nullptr ? (dev_params + rounded_size) : dev_params), + half_precision); +} + +int ds_adagrad_step(int optimizer_id, + size_t step, + float lr, + float epsilon, + float weight_decay, + torch::Tensor& params, + torch::Tensor& grads, + torch::Tensor& exp_avg_sq) +{ + auto params_c = params.contiguous(); + auto grads_c = grads.contiguous(); + auto exp_avg_sq_c = exp_avg_sq.contiguous(); + + float* params_ptr = (float*)params_c.data_ptr(); + float* grads_ptr = (float*)grads_c.data_ptr(); + float* exp_avg_sq_ptr = (float*)exp_avg_sq_c.data_ptr(); + + std::shared_ptr opt = + std::static_pointer_cast(s_optimizers[optimizer_id]); + opt->IncrementStep(step); + opt->update_state(lr, epsilon, weight_decay); + opt->Step_8(params_ptr, grads_ptr, exp_avg_sq_ptr, params_c.numel()); + + return 0; +} + +int ds_adagrad_step_plus_copy(int optimizer_id, + size_t step, + float lr, + float epsilon, + float weight_decay, + torch::Tensor& params, + torch::Tensor& grads, + torch::Tensor& exp_avg_sq, + torch::Tensor& gpu_params) +{ + assert(false); + return 0; +} + +int destroy_adagrad_optimizer(int optimizer_id) +{ + s_optimizers.erase(optimizer_id); + + return 0; +} + +PYBIND11_MODULE(TORCH_EXTENSION_NAME, m) +{ + m.def("adagrad_update", &ds_adagrad_step, "DeepSpeed CPU Adagrad update (C++)"); + m.def("adagrad_update_copy", + &ds_adagrad_step_plus_copy, + "DeepSpeed CPU Adagrad update and param copy (C++)"); + m.def("create_adagrad", &create_adagrad_optimizer, "DeepSpeed CPU Adagrad (C++)"); + m.def("destroy_adagrad", &destroy_adagrad_optimizer, "DeepSpeed CPU Adagrad destroy (C++)"); +} diff --git a/csrc/xpu/adam/cpu_adam.cpp b/csrc/xpu/adam/cpu_adam.cpp new file mode 100755 index 000000000000..96809827f3e1 --- /dev/null +++ b/csrc/xpu/adam/cpu_adam.cpp @@ -0,0 +1,16 @@ +// Copyright (c) Microsoft Corporation. +// SPDX-License-Identifier: Apache-2.0 + +// DeepSpeed Team + +#include "cpu_adam.h" + +PYBIND11_MODULE(TORCH_EXTENSION_NAME, m) +{ + m.def("adam_update", &ds_adam_step, "DeepSpeed CPU Adam update (C++)"); + m.def("adam_update_copy", + &ds_adam_step_plus_copy, + "DeepSpeed CPU Adam update and param copy (C++)"); + m.def("create_adam", &create_adam_optimizer, "DeepSpeed CPU Adam (C++)"); + m.def("destroy_adam", &destroy_adam_optimizer, "DeepSpeed CPU Adam destroy (C++)"); +} diff --git a/csrc/xpu/adam/cpu_adam_impl.cpp b/csrc/xpu/adam/cpu_adam_impl.cpp new file mode 100644 index 000000000000..c24a08fc64eb --- /dev/null +++ b/csrc/xpu/adam/cpu_adam_impl.cpp @@ -0,0 +1,247 @@ +// Copyright (c) Microsoft Corporation. +// SPDX-License-Identifier: Apache-2.0 + +// DeepSpeed Team + +#include +#include +#include +#include +#include +#include +#include +#include "cpu_adam.h" + +static std::unordered_map> s_optimizers; + +// C++ interface + +void Adam_Optimizer::Step_1(float* _params, + float* grads, + float* _exp_avg, + float* _exp_avg_sq, + size_t _param_size, + ds_half_precision_t* dev_params, + bool half_precision) +{ + size_t rounded_size = 0; +#if defined(__AVX512__) or defined(__AVX256__) + Step_AVX<1>(&rounded_size, + _params, + grads, + _exp_avg, + _exp_avg_sq, + _param_size, + dev_params, + half_precision); +#endif + if (_param_size > rounded_size) { + float betta1_minus1 = 1 - _betta1; + float betta2_minus1 = 1 - _betta2; + + float step_size = -1 * _alpha / _bias_correction1; + float w_decay = -1 * _alpha * _weight_decay; + ds_half_precision_t* grads_cast_h; + ds_half_precision_t* params_cast_h; + if (half_precision) { + grads_cast_h = reinterpret_cast(grads); + params_cast_h = reinterpret_cast(_params); + } + + for (size_t t = rounded_size; t < _param_size; t += TILE) { + size_t copy_size = TILE; + if ((t + TILE) > _param_size) copy_size = _param_size - t; + size_t offset = copy_size + t; +#pragma omp parallel for + for (size_t k = t; k < offset; k++) { + float grad = half_precision ? (float)grads_cast_h[k] : grads[k]; + float param = half_precision ? (float)params_cast_h[k] : _params[k]; + float momentum = _exp_avg[k]; + float variance = _exp_avg_sq[k]; + if (_weight_decay > 0 && !_adamw_mode) { grad = param * _weight_decay + grad; } + momentum = momentum * _betta1; + momentum = grad * betta1_minus1 + momentum; + + variance = variance * _betta2; + grad = grad * grad; + variance = grad * betta2_minus1 + variance; + + grad = sqrt(variance); + grad = grad * _bias_correction2 + _eps; + grad = momentum / grad; + if (_weight_decay > 0 && _adamw_mode) { param += w_decay * param; } + param = grad * step_size + param; + if (half_precision) + params_cast_h[k] = (ds_half_precision_t)param; + else + _params[k] = param; + _exp_avg[k] = momentum; + _exp_avg_sq[k] = variance; + } + } + } +} + +void Adam_Optimizer::Step_4(float* _params, + float* grads, + float* _exp_avg, + float* _exp_avg_sq, + size_t _param_size, + ds_half_precision_t* dev_params, + bool half_precision) +{ + size_t rounded_size = 0; +#if defined(__AVX512__) or defined(__AVX256__) + Step_AVX<4>(&rounded_size, + _params, + grads, + _exp_avg, + _exp_avg_sq, + _param_size, + dev_params, + half_precision); +#endif + if (_param_size > rounded_size) + Step_1((_params + rounded_size), + (grads + rounded_size), + (_exp_avg + rounded_size), + (_exp_avg_sq + rounded_size), + (_param_size - rounded_size), + (dev_params != nullptr ? (dev_params + rounded_size) : dev_params), + half_precision); +} + +int create_adam_optimizer(int optimizer_id, + float alpha, + float betta1, + float betta2, + float eps, + float weight_decay, + bool adamw_mode, + bool should_log) +{ + auto opt = + std::make_shared(alpha, betta1, betta2, eps, weight_decay, adamw_mode); + + s_optimizers[optimizer_id] = opt; + + if (should_log) { + std::string avx_type = ""; +#if defined(__AVX512__) + avx_type = "AVX512"; +#else +#if defined(__AVX256__) + avx_type = "AVX2"; +#else + avx_type = "scalar"; +#endif +#endif + + printf("Adam Optimizer #%d is created with %s arithmetic capability.\n", + optimizer_id, + avx_type.c_str()); + printf("Config: alpha=%f, betas=(%f, %f), weight_decay=%f, adam_w=%d\n", + alpha, + betta1, + betta2, + weight_decay, + (int)adamw_mode); + } + + return 0; +} + +void Adam_Optimizer::Step_8(float* _params, + float* grads, + float* _exp_avg, + float* _exp_avg_sq, + size_t _param_size, + ds_half_precision_t* dev_params, + bool half_precision) +{ + size_t rounded_size = 0; +#if defined(__AVX512__) or defined(__AVX256__) + Step_AVX<8>(&rounded_size, + _params, + grads, + _exp_avg, + _exp_avg_sq, + _param_size, + dev_params, + half_precision); +#endif + if (_param_size > rounded_size) + Step_4((_params + rounded_size), + (grads + rounded_size), + (_exp_avg + rounded_size), + (_exp_avg_sq + rounded_size), + (_param_size - rounded_size), + (dev_params != nullptr ? (dev_params + rounded_size) : dev_params), + half_precision); +} + +int ds_adam_step(int optimizer_id, + size_t step, + float lr, + float beta1, + float beta2, + float epsilon, + float weight_decay, + bool bias_correction, + torch::Tensor& params, + torch::Tensor& grads, + torch::Tensor& exp_avg, + torch::Tensor& exp_avg_sq) +{ + auto params_c = params.contiguous(); + auto grads_c = grads.contiguous(); + auto exp_avg_c = exp_avg.contiguous(); + auto exp_avg_sq_c = exp_avg_sq.contiguous(); + + // assert(params.options().dtype() == grads.options().dtype()); + + float* params_ptr = (float*)params_c.data_ptr(); + float* grads_ptr = (float*)grads_c.data_ptr(); + float* exp_avg_ptr = (float*)exp_avg_c.data_ptr(); + float* exp_avg_sq_ptr = (float*)exp_avg_sq_c.data_ptr(); + + std::shared_ptr opt = + std::static_pointer_cast(s_optimizers[optimizer_id]); + opt->IncrementStep(step, beta1, beta2); + opt->update_state(lr, epsilon, weight_decay, bias_correction); + + opt->Step_8(params_ptr, + grads_ptr, + exp_avg_ptr, + exp_avg_sq_ptr, + params_c.numel(), + nullptr, + (params.options().dtype() == at::kHalf)); + + return 0; +} + +int ds_adam_step_plus_copy(int optimizer_id, + size_t step, + float lr, + float beta1, + float beta2, + float epsilon, + float weight_decay, + bool bias_correction, + torch::Tensor& params, + torch::Tensor& grads, + torch::Tensor& exp_avg, + torch::Tensor& exp_avg_sq, + torch::Tensor& gpu_params) +{ + assert(false); + return 0; +} + +int destroy_adam_optimizer(int optimizer_id) +{ + s_optimizers.erase(optimizer_id); + + return 0; +} diff --git a/csrc/xpu/adam/fused_adam_frontend.cpp b/csrc/xpu/adam/fused_adam_frontend.cpp new file mode 100755 index 000000000000..13b390248608 --- /dev/null +++ b/csrc/xpu/adam/fused_adam_frontend.cpp @@ -0,0 +1,25 @@ +// Copyright (c) Microsoft Corporation. +// SPDX-License-Identifier: Apache-2.0 + +// DeepSpeed Team + +#include + +void multi_tensor_adam_cuda(int chunk_size, + at::Tensor noop_flag, + std::vector> tensor_lists, + const float lr, + const float beta1, + const float beta2, + const float epsilon, + const int step, + const int mode, + const int bias_correction, + const float weight_decay); + +PYBIND11_MODULE(TORCH_EXTENSION_NAME, m) +{ + m.def("multi_tensor_adam", + &multi_tensor_adam_cuda, + "Compute and apply gradient update to parameters for Adam optimizer"); +} diff --git a/csrc/xpu/adam/multi_tensor_adam.dp.cpp b/csrc/xpu/adam/multi_tensor_adam.dp.cpp new file mode 100644 index 000000000000..0720a020247a --- /dev/null +++ b/csrc/xpu/adam/multi_tensor_adam.dp.cpp @@ -0,0 +1,159 @@ +// Copyright (c) Microsoft Corporation. +// SPDX-License-Identifier: Apache-2.0 + +// DeepSpeed Team + +/* +Copyright NVIDIA/apex +This file is adapted from fused adam in NVIDIA/apex, commit a109f85 +*/ + +#include +#include +#include + +#include + +#include +#include "multi_tensor_apply.dp.hpp" +#include "type_shim.h" + +#define BLOCK_SIZE 512 +#define ILP 4 + +typedef enum : int { + ADAM_MODE_0 = 0, // L2 regularization mode + ADAM_MODE_1 = 1 // Decoupled weight decay mode(AdamW) +} adamMode_t; + +using MATH_T = float; + +template +struct AdamFunctor { + __inline__ __attribute__((always_inline)) void operator()(int chunk_size, + volatile int* noop_gmem, + TensorListMetadata<4>& tl, + const float beta1, + const float beta2, + const float beta1_correction, + const float beta2_correction, + const float epsilon, + const float lr, + adamMode_t mode, + const float decay) + { + auto item_ct1 = sycl::ext::oneapi::experimental::this_nd_item<3>(); + int tensor_loc = tl.block_to_tensor[item_ct1.get_group(2)]; + + int chunk_idx = tl.block_to_chunk[item_ct1.get_group(2)]; + int n = tl.sizes[tensor_loc]; + + T* g = (T*)tl.addresses[0][tensor_loc]; + g += chunk_idx * chunk_size; + + T* p = (T*)tl.addresses[1][tensor_loc]; + p += chunk_idx * chunk_size; + + T* m = (T*)tl.addresses[2][tensor_loc]; + m += chunk_idx * chunk_size; + + T* v = (T*)tl.addresses[3][tensor_loc]; + v += chunk_idx * chunk_size; + + n -= chunk_idx * chunk_size; + + // see note in multi_tensor_scale_kernel.cu + for (int i_start = 0; i_start < n && i_start < chunk_size; + i_start += item_ct1.get_local_range(2) * ILP) { + MATH_T r_g[ILP]; + MATH_T r_p[ILP]; + MATH_T r_m[ILP]; + MATH_T r_v[ILP]; +#pragma unroll + for (int ii = 0; ii < ILP; ii++) { + int i = i_start + item_ct1.get_local_id(2) + ii * item_ct1.get_local_range(2); + if (i < n && i < chunk_size) { + r_g[ii] = g[i]; + r_p[ii] = p[i]; + r_m[ii] = m[i]; + r_v[ii] = v[i]; + } else { + r_g[ii] = MATH_T(0); + r_p[ii] = MATH_T(0); + r_m[ii] = MATH_T(0); + r_v[ii] = MATH_T(0); + } + } +#pragma unroll + for (int ii = 0; ii < ILP; ii++) { + if (mode == ADAM_MODE_0) { // L2 + r_g[ii] = r_g[ii] + (decay * r_p[ii]); + r_m[ii] = beta1 * r_m[ii] + (1 - beta1) * r_g[ii]; + r_v[ii] = beta2 * r_v[ii] + (1 - beta2) * r_g[ii] * r_g[ii]; + MATH_T next_m_unbiased = r_m[ii] / beta1_correction; + MATH_T next_v_unbiased = r_v[ii] / beta2_correction; + MATH_T denom = sycl::sqrt(next_v_unbiased) + epsilon; + MATH_T update = next_m_unbiased / denom; + r_p[ii] = r_p[ii] - (lr * update); + } else { // weight decay + r_m[ii] = beta1 * r_m[ii] + (1 - beta1) * r_g[ii]; + r_v[ii] = beta2 * r_v[ii] + (1 - beta2) * r_g[ii] * r_g[ii]; + MATH_T next_m_unbiased = r_m[ii] / beta1_correction; + MATH_T next_v_unbiased = r_v[ii] / beta2_correction; + MATH_T denom = sycl::sqrt(next_v_unbiased) + epsilon; + MATH_T update = (next_m_unbiased / denom) + (decay * r_p[ii]); + r_p[ii] = r_p[ii] - (lr * update); + } + } +#pragma unroll + for (int ii = 0; ii < ILP; ii++) { + int i = i_start + item_ct1.get_local_id(2) + ii * item_ct1.get_local_range(2); + if (i < n && i < chunk_size) { + p[i] = r_p[ii]; + m[i] = r_m[ii]; + v[i] = r_v[ii]; + } + } + } + } +}; + +void multi_tensor_adam_cuda(int chunk_size, + at::Tensor noop_flag, + std::vector> tensor_lists, + const float lr, + const float beta1, + const float beta2, + const float epsilon, + const int step, + const int mode, + const int bias_correction, + const float weight_decay) +{ + using namespace at; + + // Handle bias correction mode + float bias_correction1 = 1.0f, bias_correction2 = 1.0f; + if (bias_correction == 1) { + bias_correction1 = 1 - std::pow(beta1, step); + bias_correction2 = 1 - std::pow(beta2, step); + } + + // Assume single type across p,g,m1,m2 now + DISPATCH_DOUBLE_FLOAT_AND_HALF(tensor_lists[0][0].scalar_type(), + 0, + "adam", + multi_tensor_apply<4>(BLOCK_SIZE, + chunk_size, + noop_flag, + tensor_lists, + AdamFunctor(), + beta1, + beta2, + bias_correction1, + bias_correction2, + epsilon, + lr, + (adamMode_t)mode, + weight_decay);) +} diff --git a/csrc/xpu/adam/multi_tensor_apply.dp.hpp b/csrc/xpu/adam/multi_tensor_apply.dp.hpp new file mode 100644 index 000000000000..04674020a6c5 --- /dev/null +++ b/csrc/xpu/adam/multi_tensor_apply.dp.hpp @@ -0,0 +1,221 @@ +// Copyright (c) Microsoft Corporation. +// SPDX-License-Identifier: Apache-2.0 + +// DeepSpeed Team + +/* +Copyright NVIDIA/apex +This file is adapted from fused adam in NVIDIA/apex, commit a109f85 +*/ + +#include +#include +#include +#include +#include "compat.h" + +#include +#include +#include + +namespace at { +namespace cuda { +sycl::queue* getCurrentCUDAStream() +{ + auto device_type = c10::DeviceType::XPU; + c10::impl::VirtualGuardImpl impl(device_type); + c10::Stream c10_stream = impl.getStream(c10::Device(device_type)); + auto& queue = xpu::get_queue_from_stream(c10_stream); + return &queue; +} + +sycl::queue* getStreamFromPool(bool) +{ + // not implemented + return nullptr; +} +} // namespace cuda +} // namespace at +// #include + +// This header is the one-stop shop for all your multi-tensor apply needs. + +// TODO: Kernel arg size limit may be <4KB for some other cards (ie Jetson) +constexpr int depth_to_max_tensors[5] = {110, 64, 48, 36, 30}; +constexpr int depth_to_max_blocks[5] = {320, 320, 320, 320, 320}; + +template +struct TensorListMetadata { + void* addresses[n][depth_to_max_tensors[n - 1]]; + int sizes[depth_to_max_tensors[n - 1]]; + unsigned char block_to_tensor[depth_to_max_blocks[n - 1]]; + int block_to_chunk[depth_to_max_blocks[n - 1]]; // I fear this needs to be a full int. + int start_tensor_this_launch; +}; + +template +class multi_tensor_apply_kernel { +public: + multi_tensor_apply_kernel(int chunk_size, + volatile int* noop_flag, + T tl, + U callable, + ArgTypes... args) + : chunk_size(chunk_size), noop_flag(noop_flag), tl(tl), callable(callable), args(args...) + { + } + + // This should be identical to original __global__ function + static void inline __global__function(int chunk_size, + volatile int* noop_flag, + T tl, + U callable, + ArgTypes... args) + { + callable(chunk_size, noop_flag, tl, args...); + } + + // If global function template contains parameter pack, + // we only deal with parameter pack at the end of template parameter list + template + static void inline __tuple_expand_driver(int chunk_size, + volatile int* noop_flag, + T tl, + U callable, + Tuple args, + std::index_sequence) + { + __global__function(chunk_size, noop_flag, tl, callable, std::get(args)...); + } + + // + // Because __global__ function can't really use any reference types, we can sure that args + // are all good behaviors + // + void operator()(sycl::nd_item<3>) const + { + __tuple_expand_driver(chunk_size, + noop_flag, + tl, + callable, + args, + std::make_index_sequence()); + } + +private: + int chunk_size; + volatile int* noop_flag; + T tl; + U callable; + std::tuple args; +}; + +template +void multi_tensor_apply(int block_size, + int chunk_size, + const at::Tensor& noop_flag, + const std::vector>& tensor_lists, + T callable, + ArgTypes... args) +{ + TORCH_CHECK(tensor_lists.size() == depth, "tensor_lists.size() != depth"); + int len0 = tensor_lists[0].size(); + TORCH_CHECK(len0 > 0, "tensor_lists[0].size() is not > 0"); + auto ref_device = tensor_lists[0][0].device(); + TORCH_CHECK(ref_device.type() == at::kXPU, "expected input to be on cuda"); + for (int l = 0; l < tensor_lists.size(); l++) // No range-based for because I need indices + { + TORCH_CHECK(tensor_lists[l].size() == len0, "Size mismatch among tensor lists"); + for (int t = 0; t < tensor_lists[l].size(); t++) { + // TODO: Print which tensor fails. + bool contiguous_memory = tensor_lists[l][t].is_contiguous(); +#ifdef VERSION_GE_1_5 + contiguous_memory = (contiguous_memory || + tensor_lists[l][t].is_contiguous(at::MemoryFormat::ChannelsLast)); +#endif + TORCH_CHECK(contiguous_memory, "A tensor was not contiguous."); + TORCH_CHECK(tensor_lists[l][t].device() == ref_device, + "A tensor was not on the same device as the first tensor"); + TORCH_CHECK(tensor_lists[l][t].numel() == tensor_lists[0][t].numel(), "Size mismatch"); + } + } + + int ntensors = tensor_lists[0].size(); + + TensorListMetadata tl; + + /* const at::cuda::OptionalCUDAGuard device_guard(device_of(tensor_lists[0][0])); */ + auto stream = at::cuda::getCurrentCUDAStream(); + + tl.start_tensor_this_launch = 0; + int loc_block_info = 0; + int loc_tensor_info = 0; + for (int t = 0; t < ntensors; t++) { + tl.sizes[loc_tensor_info] = tensor_lists[0][t].numel(); + for (int d = 0; d < depth; d++) + tl.addresses[d][loc_tensor_info] = tensor_lists[d][t].data_ptr(); + loc_tensor_info++; + + int chunks_this_tensor = (tensor_lists[0][t].numel() + chunk_size - 1) / chunk_size; + + for (int chunk = 0; chunk < chunks_this_tensor; chunk++) { + // std::cout << chunks_this_tensor << std::endl; + tl.block_to_tensor[loc_block_info] = loc_tensor_info - 1; + tl.block_to_chunk[loc_block_info] = chunk; + loc_block_info++; + + bool tensors_full = (loc_tensor_info == depth_to_max_tensors[depth - 1] && + chunk == chunks_this_tensor - 1); + bool blocks_full = (loc_block_info == depth_to_max_blocks[depth - 1]); + bool last_chunk = (t == ntensors - 1 && chunk == chunks_this_tensor - 1); + if (tensors_full || blocks_full || last_chunk) { + // using accscalar_t = acc_type; + /* multi_tensor_apply_kernel, T, ArgTypes...> + * fn(chunk_size, noop_flag.DATA_PTR(), tl, callable, args...); */ + if constexpr (sizeof(multi_tensor_apply_kernel( + chunk_size, noop_flag.DATA_PTR(), tl, callable, args...)) < + 2048) { + ((sycl::queue*)(stream)) + ->parallel_for( + sycl::nd_range<3>(sycl::range<3>(1, 1, loc_block_info) * + sycl::range<3>(1, 1, block_size), + sycl::range<3>(1, 1, block_size)), + multi_tensor_apply_kernel( + chunk_size, noop_flag.DATA_PTR(), tl, callable, args...)); + } else { + auto capture = multi_tensor_apply_kernel( + chunk_size, noop_flag.DATA_PTR(), tl, callable, args...); + sycl::buffer params(const_cast(&capture), + sycl::range<1>(1)); + stream->submit([&](sycl::handler& cgh) { + auto device_params = + params.template get_access(cgh); + cgh.parallel_for(sycl::nd_range<3>(sycl::range<3>(1, 1, loc_block_info) * + sycl::range<3>(1, 1, block_size), + sycl::range<3>(1, 1, block_size)), + [=](sycl::nd_item<3> item) { device_params[0](item); }); + }); + } + 0; + + // Reset. The control flow possibilities here make my brain hurt. + loc_block_info = 0; + if (chunk == chunks_this_tensor - 1) { + // std::cout << "Hit case 1 " << cond1 << " " << cond2 << " " << cond3 << + // std::endl; + loc_tensor_info = 0; + tl.start_tensor_this_launch = t + 1; + } else { + // std::cout << "Hit case 2 " << cond1 << " " << cond2 << " " << cond3 << + // std::endl; + tl.sizes[0] = tl.sizes[loc_tensor_info - 1]; + for (int d = 0; d < depth; d++) + tl.addresses[d][0] = tl.addresses[d][loc_tensor_info - 1]; + loc_tensor_info = 1; + tl.start_tensor_this_launch = t; + } + } + } + } +} diff --git a/csrc/xpu/common/custom_cuda_kernel.dp.cpp b/csrc/xpu/common/custom_cuda_kernel.dp.cpp new file mode 100644 index 000000000000..cfd004ef1357 --- /dev/null +++ b/csrc/xpu/common/custom_cuda_kernel.dp.cpp @@ -0,0 +1,92 @@ +// Copyright (c) Microsoft Corporation. +// SPDX-License-Identifier: Apache-2.0 + +// DeepSpeed Team + +#include + +inline void has_capability_or_fail(const sycl::device& dev, + const std::initializer_list& props) +{ + for (const auto& it : props) { + if (dev.has(it)) continue; + switch (it) { + case sycl::aspect::fp64: + throw std::runtime_error("'double' is not supported in '" + + dev.get_info() + "' device"); + break; + case sycl::aspect::fp16: + throw std::runtime_error("'half' is not supported in '" + + dev.get_info() + "' device"); + break; + default: +#define __SYCL_ASPECT(ASPECT, ID) \ + case sycl::aspect::ASPECT: return #ASPECT; +#define __SYCL_ASPECT_DEPRECATED(ASPECT, ID, MESSAGE) __SYCL_ASPECT(ASPECT, ID) +#define __SYCL_ASPECT_DEPRECATED_ALIAS(ASPECT, ID, MESSAGE) + auto getAspectNameStr = [](sycl::aspect AspectNum) -> std::string { + switch (AspectNum) { +#include +#include + default: return "unknown aspect"; + } + }; +#undef __SYCL_ASPECT_DEPRECATED_ALIAS +#undef __SYCL_ASPECT_DEPRECATED +#undef __SYCL_ASPECT + throw std::runtime_error("'" + getAspectNameStr(it) + "' is not supported in '" + + dev.get_info() + "' device"); + } + break; + } +} + +void param_update_kernel(const float* input, sycl::half* output, int size) +{ + auto item_ct1 = sycl::ext::oneapi::experimental::this_nd_item<3>(); + int id = item_ct1.get_group(2) * item_ct1.get_local_range(2) + item_ct1.get_local_id(2); + + if (id < size) { output[id] = (sycl::half)input[id]; } +} + +void launch_param_update(const float* input, sycl::half* output, int size, sycl::queue* stream) +{ + int threads = 1024; + + sycl::range<3> grid_dim(1, 1, (size - 1) / threads + 1); + sycl::range<3> block_dim(1, 1, threads); + + { + has_capability_or_fail(stream->get_device(), {sycl::aspect::fp16}); + stream->parallel_for( + sycl::nd_range<3>(grid_dim * block_dim, block_dim), + [=](sycl::nd_item<3> item_ct1) { param_update_kernel(input, output, size); }); + } +} + +void param_update_kernel_half(const float* input, sycl::half* output, int size) +{ + auto item_ct1 = sycl::ext::oneapi::experimental::this_nd_item<3>(); + int id = item_ct1.get_group(2) * item_ct1.get_local_range(2) + item_ct1.get_local_id(2); + sycl::half2* output_cast = reinterpret_cast(output); + if (id < size) { + float input_f = input[id]; + sycl::half2* input_h = reinterpret_cast(&input_f); + output_cast[id] = *input_h; + } +} + +void launch_param_update_half(const float* input, sycl::half* output, int size, sycl::queue* stream) +{ + int threads = 1024; + size /= 2; + sycl::range<3> grid_dim(1, 1, (size - 1) / threads + 1); + sycl::range<3> block_dim(1, 1, threads); + + { + has_capability_or_fail(stream->get_device(), {sycl::aspect::fp16}); + stream->parallel_for( + sycl::nd_range<3>(grid_dim * block_dim, block_dim), + [=](sycl::nd_item<3> item_ct1) { param_update_kernel_half(input, output, size); }); + } +} diff --git a/csrc/xpu/includes/compat.h b/csrc/xpu/includes/compat.h new file mode 100755 index 000000000000..6d54446d472e --- /dev/null +++ b/csrc/xpu/includes/compat.h @@ -0,0 +1,19 @@ +// Copyright (c) Microsoft Corporation. +// SPDX-License-Identifier: Apache-2.0 + +// DeepSpeed Team + +/* +Copyright NVIDIA/apex +This file is adapted from fused adam in NVIDIA/apex, commit a109f85 +*/ + +#ifndef TORCH_CHECK +#define TORCH_CHECK AT_CHECK +#endif + +#ifdef VERSION_GE_1_3 +#define DATA_PTR data_ptr +#else +#define DATA_PTR data +#endif diff --git a/csrc/xpu/includes/cpu_adagrad.h b/csrc/xpu/includes/cpu_adagrad.h new file mode 100644 index 000000000000..660f860917f6 --- /dev/null +++ b/csrc/xpu/includes/cpu_adagrad.h @@ -0,0 +1,120 @@ +// Copyright (c) Microsoft Corporation. +// SPDX-License-Identifier: Apache-2.0 + +// DeepSpeed Team + +#pragma once + +#define NOMINMAX // Windows idiosyncrasy + // https://stackoverflow.com/questions/4913922/possible-problems-with-nominmax-on-visual-c + +#include +#include +#include "simd.h" + +typedef unsigned short ds_half_precision_t; + +#define STEP(SPAN) \ + void Step_##SPAN(float* _params, \ + float* grads, \ + float* _exp_avg_sq, \ + size_t _param_size, \ + ds_half_precision_t* dev_param = nullptr, \ + bool half_precision = false); + +class Adagrad_Optimizer { +public: + Adagrad_Optimizer(float alpha = 1e-2, float eps = 1e-8, float weight_decay = 0) + : _alpha(alpha), _eps(eps), _weight_decay(weight_decay) + { + } + ~Adagrad_Optimizer() {} +#if defined(__AVX512__) or defined(__AVX256__) + template + void Step_AVX(size_t* rounded_size, + float* _params, + float* grads, + float* _exp_avg_sq, + size_t param_size, + ds_half_precision_t* dev_param = nullptr, + bool half_precision = false); +#endif + STEP(1) + STEP(4) + STEP(8) + inline void IncrementStep(size_t step) + { + _step++; + if (_step != step) { _step = step; } + } + inline void update_state(float lr, float epsilon, float weight_decay) + { + _alpha = lr; + _eps = epsilon; + _weight_decay = weight_decay; + } + +private: + float _alpha; + float _eps; + float _weight_decay; + + float _betta1_t; + float _betta2_t; + size_t _step; +}; + +#if defined(__AVX512__) or defined(__AVX256__) +template +void Adagrad_Optimizer::Step_AVX(size_t* rounded_size, + float* _params, + float* grads, + float* _exp_avg_sq, + size_t _param_size, + ds_half_precision_t* dev_params, + bool half_precision) +{ + size_t new_rounded_size = 0; + AVX_Data eps_4; + eps_4.data = SIMD_SET(_eps); + + float step_size = -1 * _alpha; + AVX_Data step_size_4; + step_size_4.data = SIMD_SET(step_size); + + AVX_Data weight_decay4; + if (_weight_decay > 0) weight_decay4.data = SIMD_SET(_weight_decay); + new_rounded_size = ROUND_DOWN(_param_size, SIMD_WIDTH * span); + for (size_t t = 0; t < new_rounded_size; t += TILE) { + size_t copy_size = TILE; + if ((t + TILE) > new_rounded_size) copy_size = new_rounded_size - t; + size_t offset = copy_size + t; +#pragma omp parallel for + for (size_t i = t; i < offset; i += SIMD_WIDTH * span) { + AVX_Data grad_4[span]; + simd_load(grad_4, grads + i, half_precision); + + AVX_Data momentum_4[span]; + simd_load(momentum_4, grads + i, false); + + AVX_Data variance_4[span]; + simd_load(variance_4, _exp_avg_sq + i, false); + + AVX_Data param_4[span]; + simd_load(param_4, _params + i, half_precision); + + if (_weight_decay > 0) { simd_fma(grad_4, param_4, weight_decay4, grad_4); } + + simd_fma(variance_4, grad_4, grad_4, variance_4); + simd_sqrt(grad_4, variance_4); + simd_add(grad_4, grad_4, eps_4); + simd_div(grad_4, momentum_4, grad_4); + simd_fma(param_4, grad_4, step_size_4, param_4); + + simd_store(_params + i, param_4, half_precision); + simd_store(_exp_avg_sq + i, variance_4, false); + } + } + *rounded_size = new_rounded_size; +} +#endif diff --git a/csrc/xpu/includes/cpu_adam.h b/csrc/xpu/includes/cpu_adam.h new file mode 100644 index 000000000000..7bc0364c569d --- /dev/null +++ b/csrc/xpu/includes/cpu_adam.h @@ -0,0 +1,237 @@ +// Copyright (c) Microsoft Corporation. +// SPDX-License-Identifier: Apache-2.0 + +// DeepSpeed Team + +#pragma once + +#define NOMINMAX // Windows idiosyncrasy + // https://stackoverflow.com/questions/4913922/possible-problems-with-nominmax-on-visual-c + +#include +#include +#include +#include "simd.h" + +#include +typedef unsigned short ds_half_precision_t; + +#define STEP(SPAN) \ + void Step_##SPAN(float* _params, \ + float* grads, \ + float* _exp_avg, \ + float* _exp_avg_sq, \ + size_t _param_size, \ + ds_half_precision_t* dev_param = nullptr, \ + bool half_precision = false); + +class Adam_Optimizer { +public: + Adam_Optimizer(float alpha = 1e-3, + float betta1 = 0.9, + float betta2 = 0.999, + float eps = 1e-8, + float weight_decay = 0, + bool adamw_mode = true) + : _alpha(alpha), + _betta1(betta1), + _betta2(betta2), + _eps(eps), + _weight_decay(weight_decay), + _betta1_t(1.0), + _betta2_t(1.0), + _step(0), + _adamw_mode(adamw_mode) + { + } + ~Adam_Optimizer() {} + +#if defined(__AVX512__) or defined(__AVX256__) + template + void Step_AVX(size_t* rounded_size, + float* _params, + float* grads, + float* _exp_avg, + float* _exp_avg_sq, + size_t param_size, + ds_half_precision_t* dev_param = nullptr, + bool half_precision = false); +#endif + STEP(1) + STEP(4) + STEP(8) + inline void IncrementStep(size_t step, float beta1, float beta2) + { + if (beta1 != _betta1 || beta2 != _betta2) { + _step = step; + _betta1 = beta1; + _betta2 = beta2; + _betta1_t = std::pow(_betta1, step); + _betta2_t = std::pow(_betta2, step); + } else { + _step++; + if (_step != step) { + _betta1_t = std::pow(_betta1, step); + _betta2_t = std::pow(_betta2, step); + _step = step; + } else { + _betta1_t *= _betta1; + _betta2_t *= _betta2; + } + } + } + inline void update_state(float lr, float epsilon, float weight_decay, bool bias_correction) + { + _alpha = lr; + _eps = epsilon; + _weight_decay = weight_decay; + + _bias_correction1 = 1.0f; + _bias_correction2 = 1.0f; + if (bias_correction == 1) { + _bias_correction1 = 1 - _betta1_t; + _bias_correction2 = 1 / sqrt(1 - _betta2_t); + } + } + +private: + float _alpha; + float _betta1; + float _betta2; + float _eps; + float _weight_decay; + + float _betta1_t; + float _betta2_t; + size_t _step; + + float _bias_correction1; + float _bias_correction2; + + bool _adamw_mode; +}; + +#if defined(__AVX512__) or defined(__AVX256__) +template +void Adam_Optimizer::Step_AVX(size_t* rounded_size, + float* _params, + float* grads, + float* _exp_avg, + float* _exp_avg_sq, + size_t _param_size, + ds_half_precision_t* dev_params, + bool half_precision) +{ + size_t new_rounded_size = 0; + int rshft = half_precision ? 1 : 0; + + AVX_Data betta1_4; + betta1_4.data = SIMD_SET(_betta1); + AVX_Data betta2_4; + betta2_4.data = SIMD_SET(_betta2); + + float betta1_minus1 = 1 - _betta1; + float betta2_minus1 = 1 - _betta2; + AVX_Data betta1_minus1_4; + betta1_minus1_4.data = SIMD_SET(betta1_minus1); + AVX_Data betta2_minus1_4; + betta2_minus1_4.data = SIMD_SET(betta2_minus1); + + AVX_Data bias2_sqrt; + bias2_sqrt.data = SIMD_SET(_bias_correction2); + + AVX_Data eps_4; + eps_4.data = SIMD_SET(_eps); + + float step_size = -1 * _alpha / _bias_correction1; + AVX_Data step_size_4; + step_size_4.data = SIMD_SET(step_size); + + float w_decay = -1 * _alpha * _weight_decay; + AVX_Data weight_decay4; + if (_weight_decay > 0) + weight_decay4.data = (_adamw_mode ? SIMD_SET(w_decay) : SIMD_SET(_weight_decay)); + new_rounded_size = ROUND_DOWN(_param_size, SIMD_WIDTH * span); + for (size_t t = 0; t < new_rounded_size; t += TILE) { + size_t copy_size = TILE; + if ((t + TILE) > new_rounded_size) copy_size = new_rounded_size - t; + size_t offset = copy_size + t; +#pragma omp parallel for + for (size_t i = t; i < offset; i += SIMD_WIDTH * span) { + AVX_Data grad_4[span]; + simd_load(grad_4, grads + (i >> rshft), half_precision); + + AVX_Data momentum_4[span]; + simd_load(momentum_4, _exp_avg + i, false); + + AVX_Data variance_4[span]; + simd_load(variance_4, _exp_avg_sq + i, false); + + AVX_Data param_4[span]; + simd_load(param_4, _params + (i >> rshft), half_precision); + + if (_weight_decay > 0 && !_adamw_mode) { + simd_fma(grad_4, param_4, weight_decay4, grad_4); + } + + simd_mul(momentum_4, momentum_4, betta1_4); + simd_fma(momentum_4, grad_4, betta1_minus1_4, momentum_4); + simd_mul(variance_4, variance_4, betta2_4); + simd_mul(grad_4, grad_4, grad_4); + simd_fma(variance_4, grad_4, betta2_minus1_4, variance_4); + simd_sqrt(grad_4, variance_4); + simd_fma(grad_4, grad_4, bias2_sqrt, eps_4); + simd_div(grad_4, momentum_4, grad_4); + + if (_weight_decay > 0 && _adamw_mode) { + simd_fma(param_4, param_4, weight_decay4, param_4); + } + + simd_fma(param_4, grad_4, step_size_4, param_4); + + simd_store(_params + (i >> rshft), param_4, half_precision); + simd_store(_exp_avg + i, momentum_4, false); + simd_store(_exp_avg_sq + i, variance_4, false); + } + } + *rounded_size = new_rounded_size; +} +#endif + +int create_adam_optimizer(int optimizer_id, + float alpha = 1e-3, + float betta1 = 0.9, + float betta2 = 0.999, + float eps = 1e-8, + float weight_decay = 0, + bool adamw_mode = true, + bool should_log = false); + +int ds_adam_step(int optimizer_id, + size_t step, + float lr, + float beta1, + float beta2, + float epsilon, + float weight_decay, + bool bias_correction, + torch::Tensor& params, + torch::Tensor& grads, + torch::Tensor& exp_avg, + torch::Tensor& exp_avg_sq); + +int ds_adam_step_plus_copy(int optimizer_id, + size_t step, + float lr, + float beta1, + float beta2, + float epsilon, + float weight_decay, + bool bias_correction, + torch::Tensor& params, + torch::Tensor& grads, + torch::Tensor& exp_avg, + torch::Tensor& exp_avg_sq, + torch::Tensor& gpu_params); + +int destroy_adam_optimizer(int optimizer_id); diff --git a/csrc/xpu/includes/simd.h b/csrc/xpu/includes/simd.h new file mode 100755 index 000000000000..f77568be7835 --- /dev/null +++ b/csrc/xpu/includes/simd.h @@ -0,0 +1,198 @@ +// Copyright (c) Microsoft Corporation. +// SPDX-License-Identifier: Apache-2.0 + +// DeepSpeed Team + +#pragma once + +#if (__x86_64__ || __i386__) +#include +#include +#endif + +#define TILE (128 * 1024 * 1024) +#if defined(__AVX512__) or defined(__AVX256__) + +#define ROUND_DOWN(size, step) ((size) & ~((step)-1)) + +#if defined(__AVX512__) +#define SIMD_STORE(a, d) _mm512_storeu_ps(a, d) +#define SIMD_LOAD(x) _mm512_loadu_ps(x) +#define SIMD_SET(x) _mm512_set1_ps(x) +#define SIMD_ADD(x, y) _mm512_add_ps(x, y) +#define SIMD_MUL(x, y) _mm512_mul_ps(x, y) +#define SIMD_FMA(x, y, c) _mm512_fmadd_ps(x, y, c) +#define SIMD_SQRT(x) _mm512_sqrt_ps(x) +#define SIMD_DIV(x, y) _mm512_div_ps(x, y) +#define SIMD_AND(x, y) _mm512_and_ps(x, y) +#define SIMD_ANDNOT(x, y) _mm512_andnot_ps(x, y) +#define SIMD_OR(x, y) _mm512_or_ps(x, y) +#define SIMD_XOR(x, y) _mm512_xor_ps(x, y) +#define SIMD_WIDTH 16 + +#define SIMD_LOAD2(x, h) \ + ((h) ? _mm512_cvtph_ps(_mm256_castps_si256(_mm256_loadu_ps(x))) : _mm512_loadu_ps(x)) +#define SIMD_STORE2(x, d, h) \ + ((h) ? _mm256_store_ps(x, _mm256_castsi256_ps(_mm512_cvtps_ph(d, _MM_FROUND_TO_NEAREST_INT))) \ + : _mm512_storeu_ps(x, d)) + +#define INTV __m256i +#elif defined(__AVX256__) +#define SIMD_STORE(a, d) _mm256_storeu_ps(a, d) +#define SIMD_LOAD(x) _mm256_loadu_ps(x) +#define SIMD_SET(x) _mm256_set1_ps(x) +#define SIMD_ADD(x, y) _mm256_add_ps(x, y) +#define SIMD_MUL(x, y) _mm256_mul_ps(x, y) +#define SIMD_FMA(x, y, c) _mm256_fmadd_ps(x, y, c) +#define SIMD_SQRT(x) _mm256_sqrt_ps(x) +#define SIMD_DIV(x, y) _mm256_div_ps(x, y) +#define SIMD_AND(x, y) _mm256_and_ps(x, y) +#define SIMD_ANDNOT(x, y) _mm256_andnot_ps(x, y) +#define SIMD_OR(x, y) _mm256_or_ps(x, y) +#define SIMD_XOR(x, y) _mm256_xor_ps(x, y) +#define SIMD_WIDTH 8 + +#define SIMD_LOAD2(x, h) \ + ((h) ? _mm256_cvtph_ps(_mm_loadu_si128((const __m128i*)x)) : _mm256_loadu_ps(x)) +#define SIMD_STORE2(x, d, h) \ + ((h) ? _mm_store_ps(x, _mm_castsi128_ps(_mm256_cvtps_ph(d, _MM_FROUND_TO_NEAREST_INT))) \ + : _mm256_storeu_ps(x, d)) + +#define INTV __m128i +#endif + +union AVX_Data { +#if defined(__AVX512__) + __m512 data; +#elif defined(__AVX256__) + __m256 data; +#endif + // float data_f[16]; +}; + +template +inline void simd_store(float* dst, AVX_Data* src, bool half_precision) +{ + size_t width = (half_precision ? SIMD_WIDTH / 2 : SIMD_WIDTH); +#pragma unroll + for (size_t i = 0; i < span; ++i) { SIMD_STORE2(dst + width * i, src[i].data, half_precision); } +} +template +inline void simd_load(AVX_Data* dst, float* src, bool half_precision) +{ + size_t width = (half_precision ? 1 : SIMD_WIDTH); +#pragma unroll + for (size_t i = 0; i < span; ++i) { dst[i].data = SIMD_LOAD2(src + width * i, half_precision); } +} +template +inline void simd_fma(AVX_Data* dst, AVX_Data* src_m_l, AVX_Data src_m_r, AVX_Data* src_a) +{ +#pragma unroll + for (size_t i = 0; i < span; ++i) { + dst[i].data = SIMD_FMA(src_m_l[i].data, src_m_r.data, src_a[i].data); + } +} +template +inline void simd_fma(AVX_Data* dst, AVX_Data* src_m_l, AVX_Data src_m_r, AVX_Data src_a) +{ +#pragma unroll + for (size_t i = 0; i < span; ++i) { + dst[i].data = SIMD_FMA(src_m_l[i].data, src_m_r.data, src_a.data); + } +} +template +inline void simd_fma(AVX_Data* dst, AVX_Data* src_m_l, AVX_Data* src_m_r, AVX_Data* src_a) +{ +#pragma unroll + for (size_t i = 0; i < span; ++i) { + dst[i].data = SIMD_FMA(src_m_l[i].data, src_m_r[i].data, src_a[i].data); + } +} +template +inline void simd_sqrt(AVX_Data* dst, AVX_Data* src) +{ +#pragma unroll + for (size_t i = 0; i < span; ++i) { dst[i].data = SIMD_SQRT(src[i].data); } +} +template +inline void simd_add(AVX_Data* dst, AVX_Data* src_a_l, AVX_Data src_a_r) +{ +#pragma unroll + for (size_t i = 0; i < span; ++i) { dst[i].data = SIMD_ADD(src_a_l[i].data, src_a_r.data); } +} +template +inline void simd_add(AVX_Data* dst, AVX_Data* src_a_l, AVX_Data* src_a_r) +{ +#pragma unroll + for (size_t i = 0; i < span; ++i) { dst[i].data = SIMD_ADD(src_a_l[i].data, src_a_r[i].data); } +} +template +inline void simd_mul(AVX_Data* dst, AVX_Data* src_a_l, AVX_Data src_a_r) +{ +#pragma unroll + for (size_t i = 0; i < span; ++i) { dst[i].data = SIMD_MUL(src_a_l[i].data, src_a_r.data); } +} +template +inline void simd_mul(AVX_Data* dst, AVX_Data* src_a_l, AVX_Data* src_a_r) +{ +#pragma unroll + for (size_t i = 0; i < span; ++i) { dst[i].data = SIMD_MUL(src_a_l[i].data, src_a_r[i].data); } +} +template +inline void simd_div(AVX_Data* dst, AVX_Data* src_a_l, AVX_Data* src_a_r) +{ +#pragma unroll + for (size_t i = 0; i < span; ++i) { dst[i].data = SIMD_DIV(src_a_l[i].data, src_a_r[i].data); } +} +template +inline void simd_and(AVX_Data* dst, AVX_Data* src_a_l, AVX_Data src_a_r) +{ +#pragma unroll + for (size_t i = 0; i < span; ++i) { dst[i].data = SIMD_AND(src_a_l[i].data, src_a_r.data); } +} +template +inline void simd_and(AVX_Data* dst, AVX_Data* src_a_l, AVX_Data* src_a_r) +{ +#pragma unroll + for (size_t i = 0; i < span; ++i) { dst[i].data = SIMD_AND(src_a_l[i].data, src_a_r[i].data); } +} +template +inline void simd_andnot(AVX_Data* dst, AVX_Data* src_a_l, AVX_Data src_a_r) +{ +#pragma unroll + for (size_t i = 0; i < span; ++i) { dst[i].data = SIMD_ANDNOT(src_a_l[i].data, src_a_r.data); } +} +template +inline void simd_andnot(AVX_Data* dst, AVX_Data* src_a_l, AVX_Data* src_a_r) +{ +#pragma unroll + for (size_t i = 0; i < span; ++i) { + dst[i].data = SIMD_ANDNOT(src_a_l[i].data, src_a_r[i].data); + } +} +template +inline void simd_or(AVX_Data* dst, AVX_Data* src_a_l, AVX_Data src_a_r) +{ +#pragma unroll + for (size_t i = 0; i < span; ++i) { dst[i].data = SIMD_OR(src_a_l[i].data, src_a_r.data); } +} +template +inline void simd_or(AVX_Data* dst, AVX_Data* src_a_l, AVX_Data* src_a_r) +{ +#pragma unroll + for (size_t i = 0; i < span; ++i) { dst[i].data = SIMD_OR(src_a_l[i].data, src_a_r[i].data); } +} +template +inline void simd_xor(AVX_Data* dst, AVX_Data* src_a_l, AVX_Data src_a_r) +{ +#pragma unroll + for (size_t i = 0; i < span; ++i) { dst[i].data = SIMD_XOR(src_a_l[i].data, src_a_r.data); } +} +template +inline void simd_xor(AVX_Data* dst, AVX_Data* src_a_l, AVX_Data* src_a_r) +{ +#pragma unroll + for (size_t i = 0; i < span; ++i) { dst[i].data = SIMD_XOR(src_a_l[i].data, src_a_r[i].data); } +} + +#endif diff --git a/csrc/xpu/includes/type_shim.h b/csrc/xpu/includes/type_shim.h new file mode 100644 index 000000000000..fa41757c895b --- /dev/null +++ b/csrc/xpu/includes/type_shim.h @@ -0,0 +1,155 @@ +// Copyright (c) Microsoft Corporation. +// SPDX-License-Identifier: Apache-2.0 + +// DeepSpeed Team + +/* Taken from NVIDIA/apex commit 855808f3fc268e9715d613f3c2e56469d8c986d8 */ +#include +/* #include */ +#include + +// Forward/backward compatibility hack around +// https://github.com/pytorch/pytorch/commit/3aeb78079bcd68282fe9117088e138b77318e288 +// pending more future-proof guidance from upstream. +// struct TypeShim +// { +// const at::Type& payload; +// TypeShim(const at::Type& type) : payload(type) {} +// // Enable trivial conversion to a const at::Type& for pre-3aeb78 +// operator const at::Type&(){ return payload; }; +// // Enable dispatch switch statements to take *this directly for post-3aeb78 +// //operator at::ScalarType(){ return payload.; }; +// }; + +#define DISPATCH_FLOAT_AND_HALF(TYPE, LEVEL, NAME, ...) \ + switch (TYPE) { \ + case at::ScalarType::Float: { \ + using scalar_t_##LEVEL = float; \ + __VA_ARGS__; \ + break; \ + } \ + case at::ScalarType::Half: { \ + using scalar_t_##LEVEL = at::Half; \ + __VA_ARGS__; \ + break; \ + } \ + case at::ScalarType::BFloat16: { \ + using scalar_t_##LEVEL = at::BFloat16; \ + __VA_ARGS__; \ + break; \ + } \ + default: AT_ERROR(#NAME, " not implemented for '", toString(TYPE), "'"); \ + } + +#define DISPATCH_DOUBLE_FLOAT_AND_HALF(TYPE, LEVEL, NAME, ...) \ + switch (TYPE) { \ + case at::ScalarType::Double: { \ + using scalar_t_##LEVEL = double; \ + __VA_ARGS__; \ + break; \ + } \ + case at::ScalarType::Float: { \ + using scalar_t_##LEVEL = float; \ + __VA_ARGS__; \ + break; \ + } \ + case at::ScalarType::Half: { \ + using scalar_t_##LEVEL = at::Half; \ + __VA_ARGS__; \ + break; \ + } \ + case at::ScalarType::BFloat16: { \ + using scalar_t_##LEVEL = at::BFloat16; \ + __VA_ARGS__; \ + break; \ + } \ + default: AT_ERROR(#NAME, " not implemented for '", toString(TYPE), "'"); \ + } + +#define DISPATCH_DOUBLE_AND_FLOAT(TYPE, LEVEL, NAME, ...) \ + switch (TYPE) { \ + case at::ScalarType::Double: { \ + using scalar_t_##LEVEL = double; \ + __VA_ARGS__; \ + break; \ + } \ + case at::ScalarType::Float: { \ + using scalar_t_##LEVEL = float; \ + __VA_ARGS__; \ + break; \ + } \ + default: AT_ERROR(#NAME, " not implemented for '", toString(TYPE), "'"); \ + } + +template +__inline__ __attribute__((always_inline)) T reduce_block_into_lanes( + T* x, + T val, + int lanes = 1, + bool share_result = false) // lanes is intended to be <= 32. +{ + auto item_ct1 = sycl::ext::oneapi::experimental::this_nd_item<3>(); + int tid = item_ct1.get_local_id(2) + item_ct1.get_local_id(1) * item_ct1.get_local_range(2); + int blockSize = item_ct1.get_local_range(2) * + item_ct1.get_local_range(1); // blockSize is intended to be a multiple of 32. + + if (blockSize >= 64) { + x[tid] = val; + /* + DPCT1118:1: SYCL group functions and algorithms must be encountered in converged control + flow. You may need to adjust the code. + */ + /* + DPCT1065:6: Consider replacing sycl::nd_item::barrier() with + sycl::nd_item::barrier(sycl::access::fence_space::local_space) for better performance if + there is no access to global memory. + */ + item_ct1.barrier(); + } + +#pragma unroll + for (int i = (blockSize >> 1); i >= 64; i >>= 1) { + if (tid < i) x[tid] = x[tid] + x[tid + i]; + /* + DPCT1118:2: SYCL group functions and algorithms must be encountered in converged control + flow. You may need to adjust the code. + */ + /* + DPCT1065:7: Consider replacing sycl::nd_item::barrier() with + sycl::nd_item::barrier(sycl::access::fence_space::local_space) for better performance if + there is no access to global memory. + */ + item_ct1.barrier(); + } + + T final; + + if (tid < 32) { + if (blockSize >= 64) + final = x[tid] + x[tid + 32]; + else + final = val; + // __SYNCWARP(); + +#pragma unroll + for (int i = 16; i >= lanes; i >>= 1) + final = final + __shfl_down_sync(0xffffffff, final, i); + } + + if (share_result) { + if (tid < lanes) x[tid] = final; // EpilogueOp + // Make sure the smem result is visible to all warps. + /* + DPCT1118:3: SYCL group functions and algorithms must be encountered in converged control + flow. You may need to adjust the code. + */ + /* + DPCT1065:8: Consider replacing sycl::nd_item::barrier() with + sycl::nd_item::barrier(sycl::access::fence_space::local_space) for better performance if + there is no access to global memory. + */ + item_ct1.barrier(); + } + + return final; +} diff --git a/op_builder/builder.py b/op_builder/builder.py index 1bc99c1fd727..fec39f2b4feb 100644 --- a/op_builder/builder.py +++ b/op_builder/builder.py @@ -108,6 +108,7 @@ def assert_no_cuda_mismatch(name=""): class OpBuilder(ABC): _rocm_version = None _is_rocm_pytorch = None + _is_sycl_enabled = None _loaded_ops = {} def __init__(self, name): @@ -135,6 +136,9 @@ def sources(self): def hipify_extension(self): pass + def sycl_extension(self): + pass + @staticmethod def validate_torch_version(torch_info): install_torch_version = torch_info['version'] @@ -186,6 +190,22 @@ def is_rocm_pytorch(): OpBuilder._is_rocm_pytorch = _is_rocm_pytorch return OpBuilder._is_rocm_pytorch + @staticmethod + def is_sycl_enabled(): + if OpBuilder._is_sycl_enabled is not None: + return OpBuilder._is_sycl_enabled + + _is_sycl_enabled = False + try: + result = subprocess.run(["c2s", "--version"], capture_output=True) + except: + pass + else: + _is_sycl_enabled = True + + OpBuilder._is_sycl_enabled = _is_sycl_enabled + return OpBuilder._is_sycl_enabled + @staticmethod def installed_rocm_version(): if OpBuilder._rocm_version: diff --git a/op_builder/xpu/__init__.py b/op_builder/xpu/__init__.py new file mode 100755 index 000000000000..2815f164e5f2 --- /dev/null +++ b/op_builder/xpu/__init__.py @@ -0,0 +1,9 @@ +# Copyright (c) Microsoft Corporation. +# SPDX-License-Identifier: Apache-2.0 + +# DeepSpeed Team + +from .cpu_adam import CPUAdamBuilder +from .cpu_adagrad import CPUAdagradBuilder +from .fused_adam import FusedAdamBuilder +from .async_io import AsyncIOBuilder diff --git a/op_builder/xpu/async_io.py b/op_builder/xpu/async_io.py new file mode 100644 index 000000000000..da511a0a8c9d --- /dev/null +++ b/op_builder/xpu/async_io.py @@ -0,0 +1,99 @@ +# Copyright (c) Microsoft Corporation. +# SPDX-License-Identifier: Apache-2.0 + +# DeepSpeed Team + +import distutils.spawn +import subprocess +import torch + +from .builder import OpBuilder + + +class AsyncIOBuilder(OpBuilder): + BUILD_VAR = "DS_BUILD_AIO" + NAME = "async_io" + + def __init__(self): + super().__init__(name=self.NAME) + + def absolute_name(self): + return f'deepspeed.ops.aio.{self.NAME}_op' + + def sources(self): + return [ + 'csrc/aio/py_lib/deepspeed_py_copy.cpp', 'csrc/aio/py_lib/py_ds_aio.cpp', + 'csrc/aio/py_lib/deepspeed_py_aio.cpp', 'csrc/aio/py_lib/deepspeed_py_aio_handle.cpp', + 'csrc/aio/py_lib/deepspeed_aio_thread.cpp', 'csrc/aio/common/deepspeed_aio_utils.cpp', + 'csrc/aio/common/deepspeed_aio_common.cpp', 'csrc/aio/common/deepspeed_aio_types.cpp', + 'csrc/aio/py_lib/deepspeed_pin_tensor.cpp' + ] + + def include_paths(self): + return ['csrc/aio/py_lib', 'csrc/aio/common'] + + def cxx_args(self): + # -O0 for improved debugging, since performance is bound by I/O + CPU_ARCH = self.cpu_arch() + SIMD_WIDTH = self.simd_width() + TORCH_MAJOR, TORCH_MINOR = map(int, torch.__version__.split('.')[0:2]) + if TORCH_MAJOR >= 2 and TORCH_MINOR >= 1: + CPP_STD = '-std=c++17' + else: + CPP_STD = '-std=c++14' + return [ + '-g', + '-Wall', + '-O0', + CPP_STD, + '-shared', + '-fPIC', + '-Wno-reorder', + CPU_ARCH, + '-fopenmp', + SIMD_WIDTH, + '-laio', + ] + + def extra_ldflags(self): + return ['-laio'] + + def check_for_libaio_pkg(self): + libs = dict( + dpkg=["-l", "libaio-dev", "apt"], + pacman=["-Q", "libaio", "pacman"], + rpm=["-q", "libaio-devel", "yum"], + ) + + found = False + for pkgmgr, data in libs.items(): + flag, lib, tool = data + path = distutils.spawn.find_executable(pkgmgr) + if path is not None: + cmd = f"{pkgmgr} {flag} {lib}" + result = subprocess.Popen(cmd, stdout=subprocess.PIPE, stderr=subprocess.PIPE, shell=True) + if result.wait() == 0: + found = True + else: + self.warning(f"{self.NAME}: please install the {lib} package with {tool}") + break + return found + + def is_compatible(self, verbose=True): + # Check for the existence of libaio by using distutils + # to compile and link a test program that calls io_submit, + # which is a function provided by libaio that is used in the async_io op. + # If needed, one can define -I and -L entries in CFLAGS and LDFLAGS + # respectively to specify the directories for libaio.h and libaio.so. + aio_compatible = self.has_function('io_pgetevents', ('aio', )) + if verbose and not aio_compatible: + self.warning(f"{self.NAME} requires the dev libaio .so object and headers but these were not found.") + + # Check for the libaio package via known package managers + # to print suggestions on which package to install. + self.check_for_libaio_pkg() + + self.warning( + "If libaio is already installed (perhaps from source), try setting the CFLAGS and LDFLAGS environment variables to where it can be found." + ) + return super().is_compatible(verbose) and aio_compatible diff --git a/op_builder/xpu/builder.py b/op_builder/xpu/builder.py new file mode 100644 index 000000000000..f4e7a2dc03f8 --- /dev/null +++ b/op_builder/xpu/builder.py @@ -0,0 +1,126 @@ +# Copyright (c) Microsoft Corporation. +# SPDX-License-Identifier: Apache-2.0 + +# DeepSpeed Team + +import os +import time +import importlib + +try: + # is op_builder from deepspeed or a 3p version? this should only succeed if it's deepspeed + # if successful this also means we're doing a local install and not JIT compile path + from op_builder import __deepspeed__ # noqa: F401 # type: ignore + from op_builder.builder import OpBuilder, TORCH_MAJOR, TORCH_MINOR +except ImportError: + from deepspeed.ops.op_builder.builder import OpBuilder, TORCH_MAJOR, TORCH_MINOR + + +class SYCLOpBuilder(OpBuilder): + + def builder(self): + try: + from intel_extension_for_pytorch.xpu.cpp_extension import DPCPPExtension + except ImportError: + from intel_extension_for_pytorch.xpu.utils import DPCPPExtension + + print("dpcpp sources = {}".format(self.sources())) + dpcpp_ext = DPCPPExtension(name=self.absolute_name(), + sources=self.strip_empty_entries(self.sources()), + include_dirs=self.strip_empty_entries(self.include_paths()), + extra_compile_args={ + 'cxx': self.strip_empty_entries(self.cxx_args()), + }, + extra_link_args=self.strip_empty_entries(self.fixed_aotflags())) + return dpcpp_ext + + def version_dependent_macros(self): + # Fix from apex that might be relevant for us as well, related to https://github.com/NVIDIA/apex/issues/456 + version_ge_1_1 = [] + if (TORCH_MAJOR > 1) or (TORCH_MAJOR == 1 and TORCH_MINOR > 0): + version_ge_1_1 = ['-DVERSION_GE_1_1'] + version_ge_1_3 = [] + if (TORCH_MAJOR > 1) or (TORCH_MAJOR == 1 and TORCH_MINOR > 2): + version_ge_1_3 = ['-DVERSION_GE_1_3'] + version_ge_1_5 = [] + if (TORCH_MAJOR > 1) or (TORCH_MAJOR == 1 and TORCH_MINOR > 4): + version_ge_1_5 = ['-DVERSION_GE_1_5'] + return version_ge_1_1 + version_ge_1_3 + version_ge_1_5 + + def cxx_args(self): + cxx_flags = [ + '-fsycl', '-fsycl-targets=spir64_gen', '-g', '-gdwarf-4', '-O3', '-std=c++17', '-fPIC', '-DMKL_ILP64', + '-fno-strict-aliasing' + ] + if os.environ.get('USE_MKL_GEMM'): + cxx_flags.append('-DUSE_MKL_GEMM') + return cxx_flags + + def extra_ldflags(self): + return [ + '-fPIC', '-fsycl', '-fsycl-targets=spir64_gen', '-fsycl-max-parallel-link-jobs=8', + '-Xs "-options -cl-poison-unsupported-fp64-kernels,cl-intel-enable-auto-large-GRF-mode"', + '-Xs "-device pvc"', '-Wl,-export-dynamic' + ] + + def fixed_aotflags(self): + return [ + '-fsycl', '-fsycl-targets=spir64_gen', '-fsycl-max-parallel-link-jobs=8', '-Xs', + "-options -cl-poison-unsupported-fp64-kernels,cl-intel-enable-auto-large-GRF-mode", '-Xs', "-device pvc" + ] + + def load(self, verbose=True): + from deepspeed.git_version_info import installed_ops, torch_info # noqa: F401 + if installed_ops.get(self.name, False): + return importlib.import_module(self.absolute_name()) + else: + return self.jit_load(verbose) + + 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. {self.error_log}" + ) + try: + import ninja # noqa: F401 + except ImportError: + raise RuntimeError(f"Unable to JIT load the {self.name} op due to ninja not being installed.") + + self.jit_mode = True + from intel_extension_for_pytorch.xpu.cpp_extension import load + + start_build = time.time() + # Recognize relative paths as absolute paths for jit load + + sources = [self.deepspeed_src_path(path) for path in self.sources()] + extra_include_paths = [self.deepspeed_src_path(path) for path in self.include_paths()] + + # Torch will try and apply whatever CCs are in the arch list at compile time, + # we have already set the intended targets ourselves we know that will be + # needed at runtime. This prevents CC collisions such as multiple __half + # implementations. Stash arch list to reset after build. + ''' + torch_arch_list = None + if "TORCH_CUDA_ARCH_LIST" in os.environ: + torch_arch_list = os.environ.get("TORCH_CUDA_ARCH_LIST") + os.environ["TORCH_CUDA_ARCH_LIST"] = "" + ''' + + op_module = load( + name=self.name, + sources=self.strip_empty_entries(sources), + extra_include_paths=self.strip_empty_entries(extra_include_paths), + extra_cflags=self.strip_empty_entries(self.cxx_args()), + # extra_cuda_cflags=self.strip_empty_entries(self.nvcc_args()), + extra_ldflags=self.strip_empty_entries(self.extra_ldflags()), + verbose=verbose) + + build_duration = time.time() - start_build + if verbose: + print(f"Time to load {self.name} op: {build_duration} seconds") + ''' + # Reset arch list so we are not silently removing it for other possible use cases + if torch_arch_list: + os.environ["TORCH_CUDA_ARCH_LIST"] = torch_arch_list + ''' + return op_module diff --git a/op_builder/xpu/cpu_adagrad.py b/op_builder/xpu/cpu_adagrad.py new file mode 100644 index 000000000000..18f80848e1b8 --- /dev/null +++ b/op_builder/xpu/cpu_adagrad.py @@ -0,0 +1,23 @@ +# Copyright (c) Microsoft Corporation. +# SPDX-License-Identifier: Apache-2.0 + +# DeepSpeed Team + +from .builder import SYCLOpBuilder + + +class CPUAdagradBuilder(SYCLOpBuilder): + BUILD_VAR = "DS_BUILD_CPU_ADAGRAD" + NAME = "cpu_adagrad" + + def __init__(self): + super().__init__(name=self.NAME) + + def absolute_name(self): + return f'deepspeed.ops.adagrad.{self.NAME}_op' + + def sources(self): + return ['csrc/xpu/adagrad/cpu_adagrad.cpp', 'csrc/xpu/common/custom_cuda_kernel.dp.cpp'] + + def include_paths(self): + return ['csrc/xpu/includes'] diff --git a/op_builder/xpu/cpu_adam.py b/op_builder/xpu/cpu_adam.py new file mode 100644 index 000000000000..4c7d4d119839 --- /dev/null +++ b/op_builder/xpu/cpu_adam.py @@ -0,0 +1,29 @@ +# Copyright (c) Microsoft Corporation. +# SPDX-License-Identifier: Apache-2.0 + +# DeepSpeed Team + +from .builder import SYCLOpBuilder + + +class CPUAdamBuilder(SYCLOpBuilder): + BUILD_VAR = "DS_BUILD_CPU_ADAM" + NAME = "cpu_adam" + + def __init__(self): + super().__init__(name=self.NAME) + + def absolute_name(self): + return f'deepspeed.ops.adam.{self.NAME}_op' + + def sources(self): + if self.build_for_cpu: + return ['csrc/xpu/adam/cpu_adam.cpp', 'csrc/xpu/adam/cpu_adam_impl.cpp'] + + return [ + 'csrc/xpu/adam/cpu_adam.cpp', 'csrc/xpu/adam/cpu_adam_impl.cpp', + 'csrc/xpu/common/custom_cuda_kernel.dp.cpp' + ] + + def include_paths(self): + return ['csrc/xpu/includes'] diff --git a/op_builder/xpu/fused_adam.py b/op_builder/xpu/fused_adam.py new file mode 100644 index 000000000000..0e0f1a66f8e6 --- /dev/null +++ b/op_builder/xpu/fused_adam.py @@ -0,0 +1,26 @@ +# Copyright (c) Microsoft Corporation. +# SPDX-License-Identifier: Apache-2.0 + +# DeepSpeed Team +from .builder import SYCLOpBuilder + + +class FusedAdamBuilder(SYCLOpBuilder): + BUILD_VAR = "DS_BUILD_FUSED_ADAM" + NAME = "fused_adam" + + def __init__(self): + super().__init__(name=self.NAME) + + def absolute_name(self): + return f'deepspeed.ops.adam.{self.NAME}_op' + + def sources(self): + return ['csrc/xpu/adam/fused_adam_frontend.cpp', 'csrc/xpu/adam/multi_tensor_adam.dp.cpp'] + + def include_paths(self): + return ['csrc/xpu/includes', 'csrc/xpu/adam'] + + def cxx_args(self): + args = super().cxx_args() + return args + self.version_dependent_macros() From 85132adc31956bcab78a20ac9dcd5789d654c309 Mon Sep 17 00:00:00 2001 From: Yejing-Lai <55339926+Yejing-Lai@users.noreply.github.com> Date: Sat, 6 Jan 2024 04:54:15 +0800 Subject: [PATCH 063/754] enable starcode((kv_head=1)) autotp (#4896) Hi, This PR is aim to enable starcode(kv_head=1) autotp. Please kindly review. Thanks~ Co-authored-by: Michael Wyatt --- deepspeed/module_inject/fusedqkv_utils.py | 15 +++++++++++++-- deepspeed/module_inject/replace_module.py | 14 +++++++++++++- deepspeed/module_inject/tp_shard.py | 10 ++++++++++ 3 files changed, 36 insertions(+), 3 deletions(-) diff --git a/deepspeed/module_inject/fusedqkv_utils.py b/deepspeed/module_inject/fusedqkv_utils.py index d61e78ab8d0e..bed0607dcb43 100644 --- a/deepspeed/module_inject/fusedqkv_utils.py +++ b/deepspeed/module_inject/fusedqkv_utils.py @@ -4,7 +4,7 @@ # DeepSpeed Team import torch from deepspeed.utils.logging import warning_once -from deepspeed.module_inject.tp_shard import get_shard_size, get_shard_size_list, get_num_kv_heads +from deepspeed.module_inject.tp_shard import get_shard_size, get_shard_size_list, get_num_kv_heads, get_n_embd import re @@ -17,7 +17,7 @@ def split_by_qkvlist_and_refuse(qkv_list, split_size, split_dim=0, cat_dim=0): def require_tp_fused_qkvw(name, mp_size): - fused_qkvw_name_list = ['qkv_proj', 'query_key_value', 'attn.Wqkv', 'self_attn.W_pack'] + fused_qkvw_name_list = ['qkv_proj', 'query_key_value', 'attn.Wqkv', 'self_attn.W_pack', 'c_attn'] if mp_size == 1: return False @@ -38,6 +38,7 @@ def prepare_tp_fused_qkvw(module_str, src, mp_size, gpu_index): "MptBlock": 'glmtype', "BaichuanLayer": 'glmtype', "DecoderLayer": 'glmtype', + "GPTBigCodeBlock": 'bigcodetype' } def _codegen_type_transpose(input, mp_size, codegen_mp_num=4): @@ -74,6 +75,14 @@ def _bloom_type_transpose(input, mp_size): split_fusedqkv = input.split(get_shard_size_list(shape[0], mp_size), dim=0) return split_fusedqkv[gpu_index] + def _bigcode_type_transpose(input, mp_size): + n_embd = get_n_embd() + q = input[:n_embd] + kv = input[n_embd:] + shape = q.shape + split_q = q.split(get_shard_size_list(shape[0], mp_size), dim=0) + return torch.cat((split_q[gpu_index], kv), dim=0) + def _transpose_fused_qkvw(src, mp_size, fused_qkv_type=None): # suppose num_heads=n, q(n)_w means the n-th q head linear weight, the weight format are as following @@ -87,6 +96,8 @@ def _transpose_fused_qkvw(src, mp_size, fused_qkv_type=None): return _codegen_type_transpose(src, mp_size) elif fused_qkv_type == 'glmtype': return _glm_type_transpose(src, mp_size) + elif fused_qkv_type == 'bigcodetype': + return _bigcode_type_transpose(src, mp_size) raise ValueError("unknown fused_qkv_type") diff --git a/deepspeed/module_inject/replace_module.py b/deepspeed/module_inject/replace_module.py index eced9c6d7c81..e1703562d180 100644 --- a/deepspeed/module_inject/replace_module.py +++ b/deepspeed/module_inject/replace_module.py @@ -16,7 +16,7 @@ from .auto_tp import AutoTP, ReplaceWithTensorSlicing, Loading from deepspeed import comm as dist -from deepspeed.module_inject.tp_shard import set_num_kv_heads +from deepspeed.module_inject.tp_shard import set_num_kv_heads, set_n_embd from .load_checkpoint import load_model_with_checkpoint import time @@ -278,6 +278,18 @@ def replace_wo_policy(module, all_reduce_linears, prefix="", state_dict=None): # 4. When we have num_kv_heads defined, uneven division is possible, otherwise enforce even division set_num_kv_heads(num_kv_heads) + # 4.1 Get n_embd + n_embd = None + multi_query_n_embd_names = ['n_embd'] + for name in multi_query_n_embd_names: + if hasattr(model_config, name): + n_embd = getattr(model_config, name) + if n_embd != None: + break + + # 4.2 set n_embd + set_n_embd(n_embd) + # 5. Set linear policies _autotp.update_linear_policies() diff --git a/deepspeed/module_inject/tp_shard.py b/deepspeed/module_inject/tp_shard.py index 302b3c33c953..259927f70308 100644 --- a/deepspeed/module_inject/tp_shard.py +++ b/deepspeed/module_inject/tp_shard.py @@ -12,6 +12,11 @@ def set_num_kv_heads(num): num_kv_heads = num +def set_n_embd(num): + global n_embd + n_embd = num + + def get_num_kv_heads(): global num_kv_heads return num_kv_heads @@ -32,6 +37,11 @@ def get_shard_size(total_size, mp_size, rank=None): assert False, f"Number of attention heads ({total_size}) must be divisible by mp_size ({mp_size})" +def get_n_embd(): + global n_embd + return n_embd + + def get_shard_size_list(total_size, mp_size): shard_sizes = [] for i in range(mp_size): From af033831f2aeeca203c0918e8a552915331021e3 Mon Sep 17 00:00:00 2001 From: Jiahao Li Date: Sat, 6 Jan 2024 04:54:29 +0800 Subject: [PATCH 064/754] Release overlap_comm & contiguous_gradients restrictions for ZeRO 1 (#4887) The `overlap_comm` and `contiguous_gradients` options have been ignored in ZeRO stage 1 since https://github.com/microsoft/DeepSpeed/pull/1246. Back in that time, ZeRO 1 and 2 are separately implemented (see https://github.com/microsoft/DeepSpeed/tree/6ae756c03f12674f17aef90622e7664a8af9d2af/deepspeed/runtime/zero). ZeRO 1 does not have gradient hooks registered to overlap backward and gradient all-reduce, so it's fine to ignore `overlap_comm` and `contiguous_gradients`. However, in the current implementation, ZeRO 1 and 2 share almost the same implementation (`stage_1_and_2.py`). Features like `overlap_comm` and `contiguous_gradients` can also be enabled for ZeRO 1 (Please correct me if I made a mistake). With this PR, turning on `overlap_comm` and `contiguous_gradients` for ZeRO 1 on the [SFT task](https://github.com/microsoft/DeepSpeedExamples/tree/master/applications/DeepSpeed-Chat/training/step1_supervised_finetuning) produces exactly the same training curve as the latest master. ![image](https://github.com/microsoft/DeepSpeed/assets/39846316/bda3be7b-c236-4e08-b687-b3cd01f5cc73) I also see a ~1.05x e2e speedup by overlapping backward and gradient all-reduce. I can confirm by the trace that backward and all-reduce do overlap, and the separate gradients are indeed copied to a flat buffer. These options are also effective for ZeRO 1. ![image](https://github.com/microsoft/DeepSpeed/assets/39846316/5f876296-e1b4-404b-8b33-03cee8e5e6b2) ![image](https://github.com/microsoft/DeepSpeed/assets/39846316/9654f6be-5c7a-401a-b0bc-413ecd3f4e6b) Related issue: https://github.com/microsoft/DeepSpeed/issues/2295 Co-authored-by: Olatunji Ruwase --- deepspeed/runtime/engine.py | 7 ------- 1 file changed, 7 deletions(-) diff --git a/deepspeed/runtime/engine.py b/deepspeed/runtime/engine.py index 3cbc4c8414b7..57058be5af4b 100644 --- a/deepspeed/runtime/engine.py +++ b/deepspeed/runtime/engine.py @@ -1490,13 +1490,6 @@ def _configure_zero_optimizer(self, optimizer): assert not isinstance(optimizer, DummyOptim), "zero stage {} requires an optimizer".format(zero_stage) log_dist(f'Creating {model_dtype} ZeRO stage {zero_stage} optimizer', ranks=[0]) - # Overlap and contiguous grads are meaningless in stage 1 and are ignored - if zero_stage == ZeroStageEnum.optimizer_states: - overlap_comm = False - round_robin_gradients = False - # Non-MoE requires contiguous grads to be disabled w. stage 1 - if not self.has_moe_layers: - contiguous_gradients = False if isinstance(self.module, PipelineModule): if overlap_comm: From b596963b06045055e6d3d21f7831f2fd11b4e763 Mon Sep 17 00:00:00 2001 From: Mingzhen WANG Date: Sat, 6 Jan 2024 04:56:42 +0800 Subject: [PATCH 065/754] [NPU]Add ZeRO-Infinity feature for NPU (#4809) Add ZeRO-Infinity feature for NPU devices. I add a new `async_io.py` in `op_builder/npu` and compilation preprocessing judgment in `deepspeed_aio_thread.cpp` specifically for NPU, which will be isolated from other devices such as the GPU and will not affect each other. See what we have already done in https://github.com/microsoft/DeepSpeed/issues/4567 . --------- Co-authored-by: Olatunji Ruwase --- csrc/aio/py_lib/deepspeed_aio_thread.cpp | 20 ++++- op_builder/npu/__init__.py | 1 + op_builder/npu/async_io.py | 103 +++++++++++++++++++++++ 3 files changed, 122 insertions(+), 2 deletions(-) create mode 100644 op_builder/npu/async_io.py diff --git a/csrc/aio/py_lib/deepspeed_aio_thread.cpp b/csrc/aio/py_lib/deepspeed_aio_thread.cpp index e9c6a8505858..c852711a28c0 100644 --- a/csrc/aio/py_lib/deepspeed_aio_thread.cpp +++ b/csrc/aio/py_lib/deepspeed_aio_thread.cpp @@ -9,6 +9,11 @@ Functionality for swapping optimizer tensors to/from (NVMe) storage devices. #include "deepspeed_aio_thread.h" +#if defined(__ENABLE_CANN__) +#include "torch_npu/csrc/framework/utils/OpAdapter.h" +#include "torch_npu/csrc/framework/utils/UtilForOpAdapter.h" +#endif + using namespace std; io_op_desc_t::io_op_desc_t(const bool read_op, @@ -24,8 +29,13 @@ io_op_desc_t::io_op_desc_t(const bool read_op, _num_bytes(num_bytes), _validate(validate) { - _cpu_buffer = (_buffer.is_cuda() || _buffer.is_xpu()) ? _buffer.to(torch::kCPU).pin_memory() - : _buffer; + _cpu_buffer = (_buffer.is_cuda() || _buffer.is_xpu() +#if defined(__ENABLE_CANN__) + || torch_npu::utils::is_npu(_buffer) +#endif + ) + ? _buffer.to(torch::kCPU).pin_memory() + : _buffer; _contiguous_buffer = _cpu_buffer.contiguous(); } @@ -35,6 +45,12 @@ void io_op_desc_t::fini() { if (_read_op && _buffer.is_cuda()) { _buffer.copy_(_cpu_buffer.to(torch::kCUDA)); } if (_read_op && _buffer.is_xpu()) { _buffer.copy_(_cpu_buffer.to(torch::kXPU)); } +#if defined(__ENABLE_CANN__) + if (_read_op && torch_npu::utils::is_npu(_buffer)) { + auto device = at::Device("npu:0"); + _buffer.copy_(_cpu_buffer.to(device)); + } +#endif } deepspeed_aio_thread_t::deepspeed_aio_thread_t(const int tid, deepspeed_aio_config_t& aio_config) diff --git a/op_builder/npu/__init__.py b/op_builder/npu/__init__.py index 6ad9124d36f0..4c4b33e229bf 100644 --- a/op_builder/npu/__init__.py +++ b/op_builder/npu/__init__.py @@ -5,6 +5,7 @@ '''Copyright The Microsoft DeepSpeed Team''' from .fused_adam import FusedAdamBuilder +from .async_io import AsyncIOBuilder from .no_impl import NotImplementedBuilder from .cpu_adam import CPUAdamBuilder from .cpu_adagrad import CPUAdagradBuilder diff --git a/op_builder/npu/async_io.py b/op_builder/npu/async_io.py new file mode 100644 index 000000000000..86560353b1c7 --- /dev/null +++ b/op_builder/npu/async_io.py @@ -0,0 +1,103 @@ +# Copyright (c) Microsoft Corporation. +# SPDX-License-Identifier: Apache-2.0 + +# DeepSpeed Team + +import distutils.spawn +import subprocess + +from .builder import NPUOpBuilder + + +class AsyncIOBuilder(NPUOpBuilder): + BUILD_VAR = "DS_BUILD_AIO" + NAME = "async_io" + + def __init__(self): + super().__init__(name=self.NAME) + + def absolute_name(self): + return f'deepspeed.ops.aio.{self.NAME}_op' + + def sources(self): + return [ + 'csrc/aio/py_lib/deepspeed_py_copy.cpp', 'csrc/aio/py_lib/py_ds_aio.cpp', + 'csrc/aio/py_lib/deepspeed_py_aio.cpp', 'csrc/aio/py_lib/deepspeed_py_aio_handle.cpp', + 'csrc/aio/py_lib/deepspeed_aio_thread.cpp', 'csrc/aio/common/deepspeed_aio_utils.cpp', + 'csrc/aio/common/deepspeed_aio_common.cpp', 'csrc/aio/common/deepspeed_aio_types.cpp', + 'csrc/aio/py_lib/deepspeed_pin_tensor.cpp' + ] + + def include_paths(self): + args = super().include_paths() + args += ['csrc/aio/py_lib', 'csrc/aio/common'] + return args + + def cxx_args(self): + args = super().cxx_args() + # -O0 for improved debugging, since performance is bound by I/O + CPU_ARCH = self.cpu_arch() + SIMD_WIDTH = self.simd_width() + import torch # Keep this import here to avoid errors when building DeepSpeed wheel without torch installed + TORCH_MAJOR, TORCH_MINOR = map(int, torch.__version__.split('.')[0:2]) + if TORCH_MAJOR >= 2 and TORCH_MINOR >= 1: + CPP_STD = '-std=c++17' + else: + CPP_STD = '-std=c++14' + return args + [ + '-g', + '-Wall', + '-O0', + CPP_STD, + '-shared', + '-fPIC', + '-Wno-reorder', + CPU_ARCH, + '-fopenmp', + SIMD_WIDTH, + '-laio', + ] + + def extra_ldflags(self): + args = super().extra_ldflags() + return args + ['-laio'] + + def check_for_libaio_pkg(self): + libs = dict( + dpkg=["-l", "libaio-dev", "apt"], + pacman=["-Q", "libaio", "pacman"], + rpm=["-q", "libaio-devel", "yum"], + ) + + found = False + for pkgmgr, data in libs.items(): + flag, lib, tool = data + path = distutils.spawn.find_executable(pkgmgr) + if path is not None: + cmd = f"{pkgmgr} {flag} {lib}" + result = subprocess.Popen(cmd, stdout=subprocess.PIPE, stderr=subprocess.PIPE, shell=True) + if result.wait() == 0: + found = True + else: + self.warning(f"{self.NAME}: please install the {lib} package with {tool}") + break + return found + + def is_compatible(self, verbose=True): + # Check for the existence of libaio by using distutils + # to compile and link a test program that calls io_submit, + # which is a function provided by libaio that is used in the async_io op. + # If needed, one can define -I and -L entries in CFLAGS and LDFLAGS + # respectively to specify the directories for libaio.h and libaio.so. + aio_compatible = self.has_function('io_pgetevents', ('aio', )) + if verbose and not aio_compatible: + self.warning(f"{self.NAME} requires the dev libaio .so object and headers but these were not found.") + + # Check for the libaio package via known package managers + # to print suggestions on which package to install. + self.check_for_libaio_pkg() + + self.warning( + "If libaio is already installed (perhaps from source), try setting the CFLAGS and LDFLAGS environment variables to where it can be found." + ) + return super().is_compatible(verbose) and aio_compatible From 1787673edc7e45cd79fe10b95f92a02d3eb91505 Mon Sep 17 00:00:00 2001 From: Yejing-Lai <55339926+Yejing-Lai@users.noreply.github.com> Date: Sat, 6 Jan 2024 05:29:00 +0800 Subject: [PATCH 066/754] fix num_kv_heads sharding in uneven autoTP for Falcon-40b (#4712) Falcon-40b will fail on uneven autotp. Need to add 'num_kv_heads' in the kv_head_names list. Co-authored-by: Olatunji Ruwase Co-authored-by: Michael Wyatt --- deepspeed/module_inject/auto_tp.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/deepspeed/module_inject/auto_tp.py b/deepspeed/module_inject/auto_tp.py index af0566cbb3cb..52d77f0b4a7e 100644 --- a/deepspeed/module_inject/auto_tp.py +++ b/deepspeed/module_inject/auto_tp.py @@ -461,7 +461,7 @@ def _replace_module(self, r_module, prev_name='', prev_class_name=''): def get_model_num_kv_heads(self, config): num_kv_heads = None - kv_head_names = ['num_key_value_heads', 'num_attention_heads', 'n_heads'] + kv_head_names = ['num_kv_heads', 'num_key_value_heads', 'num_attention_heads', 'n_heads'] for name in kv_head_names: if hasattr(config, name): num_kv_heads = getattr(config, name) From d058d4b39bd352f49cc50880b89d2f6109891397 Mon Sep 17 00:00:00 2001 From: Eugene Eisenstein Date: Sat, 6 Jan 2024 12:34:18 -0500 Subject: [PATCH 067/754] Nvme offload checkpoint (#4707) Previous PR #4416 had too many issues, closing that one and re-opening. This PR includes a passing test. This is a proposal for an implementation of checkpointing models when training with ZeRO-3 with NVMe offload: 1. Currently, the names of the files used in the checkpoint are based on the Python id of the parameter object, which is just the parameter's address in memory. This is not stable across runs, which has two disadvantages: - The NVMe offloading files grow with every run of the model even if the architecture did not change. This wastes disk space and, at least for me, was a surprise when I first saw it. It is not related to checkpointing. - Without a way to match the file to the offloaded tensor we can't reload the checkpoint. We propose an alternative naming scheme. The parameters are named after their ds_id instead of their Python id, and the tensors are named after their state_name and (new) parameter id. 2. A model checkpoint now has to include all the offloaded tensor files. During checkpoint save/load we copy all the tensor files to/from the "offloaded_tensors" subdirectory of the checkpoint. We provide some logging on the remaining space on the file system due to the potential size of these files, especially as they accumulate in each checkpoint. We do not copy the gradient files. 3. When loading the checkpoint, the optimizer already has prepared buffers for swapping. We need to purge them so that they are replaced with the freshly copied on-disk buffers from the checkpoint. The key differences between this PR and the previous one: - There's a test for a simple model with parameter/optimizer offload set to cpu/cpu, cpu/nvme and nvme/nvme. - Gradient files are not copied. - FP16 and FP32 parameter buffers are handled correctly during load. Fixes #2082. --------- Co-authored-by: Olatunji Ruwase Co-authored-by: Logan Adams <114770087+loadams@users.noreply.github.com> --- deepspeed/runtime/engine.py | 33 +++++ .../runtime/swap_tensor/optimizer_utils.py | 23 +-- .../partitioned_optimizer_swapper.py | 4 +- .../pipelined_optimizer_swapper.py | 2 +- deepspeed/runtime/zero/stage3.py | 67 ++++++--- .../runtime/zero/test_nvme_checkpointing.py | 140 ++++++++++++++++++ 6 files changed, 234 insertions(+), 35 deletions(-) create mode 100644 tests/unit/runtime/zero/test_nvme_checkpointing.py diff --git a/deepspeed/runtime/engine.py b/deepspeed/runtime/engine.py index 57058be5af4b..00346317ebf1 100644 --- a/deepspeed/runtime/engine.py +++ b/deepspeed/runtime/engine.py @@ -748,6 +748,11 @@ def zero_load_from_fp32_weights(self): def zero_elastic_checkpoint(self): return self._config.zero_config.elastic_checkpoint + def zero_has_nvme_offload(self): + if not hasattr(self.optimizer, "swap_optimizer"): + return False + return self.optimizer.swap_optimizer or self.optimizer.params_in_nvme_and_cpu + def zero_max_live_parameters(self): return self._config.zero_config.max_live_parameters @@ -2747,6 +2752,19 @@ def load_checkpoint(self, if not success: self.optimizer._restore_from_bit16_weights() + if self.zero_has_nvme_offload(): + from shutil import copytree, disk_usage + offload_dir = self.optimizer.optimizer_swapper.swap_folder + offload_ckpt_dir = os.path.join(load_dir, tag, "offloaded_tensors") + _, _, free = disk_usage(offload_dir) + logger.info( + f"Copying NVMe offload checkpoint from {offload_ckpt_dir} to {offload_dir}, {free / 1e9:,.2f} GB free on target filesystem..." + ) + copytree(offload_ckpt_dir, offload_dir, dirs_exist_ok=True) + _, _, free = disk_usage(offload_dir) + logger.info(f"Copying complete! {free / 1e9:,.2f} GB free on target filesystem") + self.optimizer.reset_swap_buffers() + if self._optimizer_has_ckpt_event_epilogue(): self.optimizer.checkpoint_event_epilogue() @@ -3092,6 +3110,21 @@ def save_checkpoint(self, save_dir, tag=None, client_state={}, save_latest=True, self._create_zero_checkpoint_files(save_dir, tag) self._save_zero_checkpoint(save_dir, tag) + if self.zero_has_nvme_offload(): + from shutil import copytree, disk_usage + offload_dir = self.optimizer.optimizer_swapper.swap_folder + offload_ckpt_dir = os.path.join(save_dir, tag, "offloaded_tensors") + _, _, free = disk_usage(save_dir) + logger.info( + f"Copying NVMe offload files from {offload_dir} to {offload_ckpt_dir}, {free / 1e9:,.2f} GB free on target filesystem..." + ) + copytree(offload_dir, + offload_ckpt_dir, + ignore=lambda _, dir_list: list(filter(lambda x: 'gradient' in x, dir_list)), + dirs_exist_ok=False) + _, _, free = disk_usage(save_dir) + logger.info(f"Copying complete! {free / 1e9:,.2f} GB free on target filesystem") + if self._optimizer_has_ckpt_event_epilogue(): self.optimizer.checkpoint_event_epilogue() diff --git a/deepspeed/runtime/swap_tensor/optimizer_utils.py b/deepspeed/runtime/swap_tensor/optimizer_utils.py index 86e43c98e7e5..389ad6ae1076 100644 --- a/deepspeed/runtime/swap_tensor/optimizer_utils.py +++ b/deepspeed/runtime/swap_tensor/optimizer_utils.py @@ -30,7 +30,7 @@ class OptimizerStateSwapInfo(object): def __init__(self, parameter, numel, base_folder): self.tensors = [] - self.param_id = id(parameter) + self.param_id = OptimizerSwapper.parameter_id(parameter) self.swap_folder = base_folder self.swap_paths = [] self.swapped_gradients = {} @@ -50,7 +50,7 @@ def has_gradients(self): def _add_tensors(self, tensor_list): for t in tensor_list: self.tensors.append(t) - self.swap_paths.append(os.path.join(self.swap_folder, f'{id(t)}.tensor.swp')) + self.swap_paths.append(os.path.join(self.swap_folder, f'{OptimizerSwapper.parameter_id(t)}.tensor.swp')) def add_state_tensors(self, tensor_list): self.has_state_tensors = True @@ -112,6 +112,10 @@ def release_unswapped_gradients(self): class OptimizerSwapper(object): + @staticmethod + def parameter_id(param): + return param.ds_id + def __init__(self, swap_config, aio_config, base_folder, optimizer, largest_numel, device, dtype, timers): self.swap_config = swap_config self.aio_config = aio_config @@ -178,10 +182,10 @@ def _flush_gradient_swapper(self, gradient_swapper): self.timer_names.update(gradient_swapper.get_timer_names()) def _swap_out_gradients(self, parameter, gradient_offsets, gradient_tensors, gradient_swapper): - if not id(parameter) in self.swap_params_info.keys(): + if not OptimizerSwapper.parameter_id(parameter) in self.swap_params_info.keys(): return - swap_info = self.swap_params_info[id(parameter)] + swap_info = self.swap_params_info[OptimizerSwapper.parameter_id(parameter)] swappable_tensors = [] swappable_offsets = [] @@ -241,7 +245,7 @@ def _initialize_from_swapped_fp16_params(self, aio_handle, fp16_partitions_info, for i, tensor in enumerate(fp16_pinned_tensors): true_index = curr_index + i logger.info( - f'swap_in_fp16_param: fp32_id = {id(fp32_parameters[true_index])} index = {true_index} orig_num_elem = {fp16_num_elems[true_index]}, swap_num_elem = {fp16_pinned_tensors[i].numel()}' + f'swap_in_fp16_param: fp32_id = {OptimizerSwapper.parameter_id(fp32_parameters[true_index])} index = {true_index} orig_num_elem = {fp16_num_elems[true_index]}, swap_num_elem = {fp16_pinned_tensors[i].numel()}' ) swap_out_count = self._swap_out_fp16_params(aio_handle=aio_handle, @@ -330,7 +334,7 @@ def _initialize_parameters(self, parameters, src_tensors, aio_handle): if dist.get_rank() == 0 and SWAPPER_DEBUG_MODE: for i, tensor in enumerate(src_tensors): logger.info( - f'copy_in_fp16_param: fp32_id = {id(parameters[i])} index = {i}, swap_num_elem = {src_tensors[i].numel()}' + f'copy_in_fp16_param: fp32_id = {OptimizerSwapper.parameter_id(parameters[i])} index = {i}, swap_num_elem = {src_tensors[i].numel()}' ) self.swap_buffer_manager.free(pinned_buffers) @@ -420,8 +424,9 @@ def _get_state_tensors(self, parameter): return [] tensor_list = [] - for value in self.optimizer.state[parameter].values(): + for state_name, value in self.optimizer.state[parameter].items(): if torch.is_tensor(value): + value.ds_id = state_name + '-' + parameter.ds_id tensor_list.append(value) return tensor_list @@ -433,7 +438,7 @@ def _update_param_state_info(self, swap_info, parameter): swap_info.add_state_tensors(state_tensors) def _create_param_swap_info(self, parameter, numel): - param_id = id(parameter) + param_id = OptimizerSwapper.parameter_id(parameter) assert not param_id in self.swap_params_info self.swap_params_info[param_id] = OptimizerStateSwapInfo(parameter=parameter, @@ -446,7 +451,7 @@ def _create_param_swap_info(self, parameter, numel): return swap_info def _get_param_swap_info(self, parameter): - param_id = id(parameter) + param_id = OptimizerSwapper.parameter_id(parameter) swap_info = self.swap_params_info.get(param_id, None) if swap_info is not None: diff --git a/deepspeed/runtime/swap_tensor/partitioned_optimizer_swapper.py b/deepspeed/runtime/swap_tensor/partitioned_optimizer_swapper.py index e7bf06043fd7..e53a280befe4 100644 --- a/deepspeed/runtime/swap_tensor/partitioned_optimizer_swapper.py +++ b/deepspeed/runtime/swap_tensor/partitioned_optimizer_swapper.py @@ -185,7 +185,7 @@ def _separate_pinned_tensors(self, swap_info): return pinned_tensors, pinned_paths, unpinned_tensors, unpinned_paths def _swap_in_pinned_gradients(self, aio_handle, parameter, gradient_tensor): - swap_info = self.swap_params_info[id(parameter)] + swap_info = self.swap_params_info[OptimizerSwapper.parameter_id(parameter)] param_gradients = swap_info.swapped_gradients.values() swap_buffers = [gradient_tensor.narrow(0, grad.offset, grad.length) for grad in param_gradients] swap_paths = [grad.path for grad in param_gradients] @@ -203,7 +203,7 @@ def _swap_in_pinned_gradients(self, aio_handle, parameter, gradient_tensor): self._log_timers([SWAP_READ_GRADIENTS, SWAP_WAIT_GRADIENTS]) def _swap_in_gradients(self, aio_handle, parameter, dest_buffer): - swap_info = self.swap_params_info.get(id(parameter), None) + swap_info = self.swap_params_info.get(OptimizerSwapper.parameter_id(parameter), None) if not (swap_info and swap_info.has_gradients()): return diff --git a/deepspeed/runtime/swap_tensor/pipelined_optimizer_swapper.py b/deepspeed/runtime/swap_tensor/pipelined_optimizer_swapper.py index cb00e3dc2fad..03dfe663fcb6 100644 --- a/deepspeed/runtime/swap_tensor/pipelined_optimizer_swapper.py +++ b/deepspeed/runtime/swap_tensor/pipelined_optimizer_swapper.py @@ -28,7 +28,7 @@ def __init__(self, aio_handle, read_op, param_info, allocated_buffers, state_buf self.num_ops = num_ops def is_parameter(self, parameter): - return id(parameter) == self.param_info.param_id + return OptimizerSwapper.parameter_id(parameter) == self.param_info.param_id def wait(self): assert self.wait_required diff --git a/deepspeed/runtime/zero/stage3.py b/deepspeed/runtime/zero/stage3.py index ce4137028195..56a031fb00d4 100644 --- a/deepspeed/runtime/zero/stage3.py +++ b/deepspeed/runtime/zero/stage3.py @@ -22,6 +22,7 @@ from deepspeed.runtime.zero.parameter_offload import DeepSpeedZeRoOffload from deepspeed.ops.adam import DeepSpeedCPUAdam, FusedAdam from deepspeed.runtime.swap_tensor.partitioned_param_swapper import PartitionedParamStatus +from deepspeed.runtime.swap_tensor.optimizer_utils import OptimizerSwapper from deepspeed.runtime.swap_tensor.partitioned_optimizer_swapper import PartitionedOptimizerSwapper from deepspeed.runtime.swap_tensor.pipelined_optimizer_swapper import PipelinedOptimizerSwapper from deepspeed.checkpoint.constants import OPTIMIZER_STATE_DICT, FP32_FLAT_GROUPS, PARTITION_COUNT, ZERO_STAGE, LOSS_SCALER @@ -282,6 +283,7 @@ def __init__( # Holds a fused and flattened copy of the parameters self.fp16_partitioned_groups_flat = [] self.fp16_partitioned_groups_flat_numel = [] + self.fp16_partitioned_groups_flat_id = [] #defragmented pinned memory self.param_groups_fp16_flat_cpu_memory = [] @@ -334,20 +336,17 @@ def __init__( self.grads_in_ipg_bucket = [] self.params_in_ipg_bucket = [] + self.params_already_reduced = {} self.is_gradient_accumulation_boundary = True self._release_ipg_buffers() self.previous_reduced_grads = None - # simplified param id - self.param_id = {} - - count = 0 - for i, params_group in enumerate(self.fp16_groups): + # model parameter traversal-based param id that's stable across runs + for params_group in self.fp16_groups: for param in params_group: - unique_id = id(param) - self.param_id[unique_id] = count - self.param_dict[count] = param - count = count + 1 + param_id = self.get_param_id(param) + self.param_dict[param_id] = param + self.params_already_reduced[param_id] = False #Largest partitioned param largest_partitioned_param_numel = 0 @@ -676,6 +675,9 @@ def _create_fp16_partitions_with_defragmentation(self, fp16_param_groups): # record total elements of parameter partitions in sub group self.fp16_partitioned_groups_flat_numel.append(sum(p.partition_numel() for p in sub_group)) + # record ds_ids of parameter partitions in sub group + self.fp16_partitioned_groups_flat_id.append([p.ds_id for p in sub_group]) + # record padding required to align group to world size (only applies to last rank) rank_requires_padding = dist.get_rank( self.dp_process_group) == dist.get_world_size(self.dp_process_group) - 1 @@ -858,6 +860,7 @@ def _create_fp32_partitions(self): self.device).clone().float().detach()) self.fp32_partitioned_groups_flat[i].requires_grad = True # keep this in case internal optimizer uses it + self.fp32_partitioned_groups_flat[i].ds_id = '_'.join(map(str, self.fp16_partitioned_groups_flat_id[i])) if len(swappable_fp32_tensors) > 0: self.optimizer_swapper.initialize_parameters(parameters=swappable_fp32_tensors, @@ -1082,6 +1085,9 @@ def independent_gradient_partition_epilogue(self): if not get_accelerator().is_synchronized_device(): self.reduce_and_partition_stream.synchronize() + for param_id in self.params_already_reduced.keys(): + self.params_already_reduced[param_id] = False + #in case of cpu offload, averaged gradients are already in fp32_partitioned_groups_flat.grad #TODO: use a similar code path for both cpu_offload and non-cpu offload if not self.offload_optimizer: @@ -1133,8 +1139,7 @@ def reduce_partition_and_remove_grads(*notneeded): print_rank_0(f'[End] Create gradient reduction hooks') def get_param_id(self, param): - unique_id = id(param) - return self.param_id[unique_id] + return OptimizerSwapper.parameter_id(param) def report_ipg_memory_usage(self, tag, param_elems): elem_count = self.elements_in_ipg_bucket + param_elems @@ -1810,7 +1815,7 @@ def _prepare_sub_group(self, sub_group_id, timer_names): def _optimizer_states_and_gradient_swap_in(self, sub_group_id, timer_names): param_length = self.fp16_partitioned_groups_flat_numel[sub_group_id] - fp32_param_id = id(self.fp32_partitioned_groups_flat[sub_group_id]) + fp32_param_id = self.get_param_id(self.fp32_partitioned_groups_flat[sub_group_id]) assert self._swappable_optimizer_subgroup(sub_group_id), \ f'Parameter {fp32_param_id} of numel={param_length} is not swappable' @@ -1858,7 +1863,7 @@ def flatten_dense_tensors_aligned(self, tensor_list, alignment): def _optimizer_states_and_gradient_swap_out(self, sub_group_id, timer_names): param_length = self.fp16_partitioned_groups_flat_numel[sub_group_id] - fp32_param_id = id(self.fp32_partitioned_groups_flat[sub_group_id]) + fp32_param_id = self.get_param_id(self.fp32_partitioned_groups_flat[sub_group_id]) assert self._swappable_optimizer_subgroup(sub_group_id), \ f'Parameter {fp32_param_id} of numel={param_length} is not swappable' @@ -2403,10 +2408,6 @@ def state_dict(self): if self.elastic_checkpoint: raise NotImplementedError("ZeRO-3 does not yet support elastic checkpointing, please disable for now.") - if self.swap_optimizer or self.params_in_nvme_and_cpu: - raise NotImplementedError( - "ZeRO-3 does not yet support checkpointing with NVMe offloading, please disable for now.") - return self._rigid_state_dict() @@ -2490,6 +2491,22 @@ def _rigid_load_state_dict(self, state_dict, load_optimizer_states=True): self.optimizer.load_state_dict(state_dict[OPTIMIZER_STATE_DICT]) self._clear_fp32_optimizer_param_groups() + if self.swap_optimizer or self.params_in_nvme_and_cpu: + # Purge the swapped optimizer state, it was initialized to the freshly created model and not the checkpoint + for swap_info in self.optimizer_swapper.swap_params_info.values(): + swap_info.tensors = [swap_info.tensors[0]] + swap_info.has_state_tensors = False + + if self.swap_optimizer: + # Touch all parameters to synchronize all buffers + timer_names = set() + self._partition_all_parameters() + for sub_group_id, group in enumerate(self.fp16_groups): + self._prepare_sub_group(sub_group_id, timer_names) + self._reassign_or_swap_out_partitioned_parameters(sub_group_id) + self._release_sub_group(sub_group_id, timer_names) + self._post_step(timer_names) + # restore fp32 partitions for curr_param, saved_param in zip(self.fp32_partitioned_groups_flat, state_dict[FP32_FLAT_GROUPS]): curr_param.data.copy_(saved_param.data) @@ -2497,8 +2514,9 @@ def _rigid_load_state_dict(self, state_dict, load_optimizer_states=True): # restore fp16 partitions from fp32 for sub_group_id in range(len(self.fp32_partitioned_groups_flat)): fp32_param = self.fp32_partitioned_groups_flat[sub_group_id] - fp16_param = self.fp16_partitioned_groups_flat[sub_group_id] - fp16_param.data.copy_(fp32_param.data) + if sum(fp32_param.size()) > 0: + fp16_param = self.fp16_partitioned_groups_flat[sub_group_id] + fp16_param.data.copy_(fp32_param.data) # update fp16 unflattened params for sub_group_id in range(len(self.fp16_partitioned_groups_flat)): @@ -2543,10 +2561,6 @@ def load_state_dict(self, if self.elastic_checkpoint: raise NotImplementedError("ZeRO-3 does not yet support elastic checkpointing, please disable for now.") - if self.swap_optimizer or self.params_in_nvme_and_cpu: - raise NotImplementedError( - "ZeRO-3 does not yet support checkpointing with NVMe offloading, please disable for now.") - self._rigid_load_state_dict(state_dict_list[dist.get_rank(group=self.dp_process_group)], load_optimizer_states=load_optimizer_states) @@ -2566,6 +2580,13 @@ def load_state_dict(self, self.persistent_parameters[0].partition(self.persistent_parameters) # self.persistent_parameters[0].all_gather(self.persistent_parameters) # this will be done in checkpoint_event_epilogue() so remove it to prevent double all_gather + def reset_swap_buffers(self): + timer_names = set() + for sub_group_id, group in enumerate(self.fp16_groups): + self._prepare_sub_group(sub_group_id, timer_names) + self._reassign_or_swap_out_partitioned_parameters(sub_group_id) + self._release_sub_group(sub_group_id, timer_names) + def checkpoint_event_prologue(self): self._partition_all_parameters() diff --git a/tests/unit/runtime/zero/test_nvme_checkpointing.py b/tests/unit/runtime/zero/test_nvme_checkpointing.py new file mode 100644 index 000000000000..75cba2e789c1 --- /dev/null +++ b/tests/unit/runtime/zero/test_nvme_checkpointing.py @@ -0,0 +1,140 @@ +# Copyright (c) Microsoft Corporation. +# SPDX-License-Identifier: Apache-2.0 + +# DeepSpeed Team + +import os +import pytest +import deepspeed.comm as dist +import torch + +from unit.common import DistributedTest +from unit.simple_model import random_dataloader, SimpleModel + +import deepspeed +from deepspeed.runtime.zero.offload_config import OffloadDeviceEnum +from deepspeed.runtime.zero.partition_parameters import Init +from deepspeed.ops.aio import AsyncIOBuilder + + +class TestNVMeCheckpointing(DistributedTest): + world_size = 1 + + @pytest.mark.parametrize('param_offload_device, optim_offload_device', + [(OffloadDeviceEnum.cpu, OffloadDeviceEnum.cpu), + (OffloadDeviceEnum.cpu, OffloadDeviceEnum.nvme), + (OffloadDeviceEnum.nvme, OffloadDeviceEnum.nvme)]) + def test_nvme_checkpointing(self, tmpdir, param_offload_device, optim_offload_device): + zero_dir, ckpt_dir = os.path.join(tmpdir, "zero"), os.path.join(tmpdir, "checkpoint") + + first_stage_steps, second_stage_steps = 2, 2 + + if not deepspeed.ops.__compatible_ops__[AsyncIOBuilder.NAME]: + pytest.skip('Skip tests since async-io is not compatible') + + torch.manual_seed(123) + + config_dict = { + "train_micro_batch_size_per_gpu": 1, + "steps_per_print": 1, + "optimizer": { + "type": "Adam", + "params": { + "lr": 0.00015, + } + }, + "fp16": { + "enabled": True, + "initial_scale_power": 8 + }, + "zero_optimization": { + "stage": 3, + "offload_param": { + "device": param_offload_device, + "nvme_path": str(zero_dir) + }, + "offload_optimizer": { + "device": optim_offload_device, + "nvme_path": str(zero_dir) + }, + "sub_group_size": 100, + "stage3_max_live_parameters": 100, + "stage3_param_persistence_threshold": 0, + }, + "aio": { + "block_size": 1048576 # Minimum AIO bytes, anything smaller than this will not be offloaded + } + } + + hidden_dim, nlayers = 2048, 2 + with deepspeed.zero.Init(config_dict_or_path=config_dict): + model = SimpleModel(hidden_dim, nlayers=nlayers, empty_grad=False) + + model, _, _, _ = deepspeed.initialize(model=model, model_parameters=model.parameters(), config=config_dict) + model.empty_partition_cache() + + assert first_stage_steps > 0 + + data_loader = random_dataloader(model=model, + total_samples=first_stage_steps, + hidden_dim=hidden_dim, + device=model.device, + dtype=torch.float16) + dist.barrier() + for n, batch in enumerate(data_loader): + loss = model(batch[0], batch[1]) + model.backward(loss) + model.step() + + dist.barrier() + model.save_checkpoint(ckpt_dir) + + if second_stage_steps > 0: + second_stage_batches = list( + random_dataloader(model=model, + total_samples=second_stage_steps, + hidden_dim=hidden_dim, + device=model.device, + dtype=torch.float16)) + dist.barrier() + for n, batch in enumerate(second_stage_batches): + loss = model(batch[0], batch[1]) + model.backward(loss) + model.step() + dist.barrier() + + final_batch = next( + iter( + random_dataloader(model=model, + total_samples=1, + hidden_dim=hidden_dim, + device=model.device, + dtype=torch.float16))) + dist.barrier() + loss_before = float(model(final_batch[0], final_batch[1])) + + # Needed in ZeRO 3. Not doing so can give memory leak + model.destroy() + + # TODO: This should be on the engine? There needs to be a better way. + Init.param_id = 0 + + with deepspeed.zero.Init(config_dict_or_path=config_dict): + model = SimpleModel(hidden_dim, nlayers=nlayers, empty_grad=False) + + model, _, _, _ = deepspeed.initialize(model=model, model_parameters=model.parameters(), config=config_dict) + + model.load_checkpoint(ckpt_dir) + + if second_stage_steps > 0: + dist.barrier() + for n, batch in enumerate(second_stage_batches): + loss = model(batch[0], batch[1]) + model.backward(loss) + model.step() + dist.barrier() + + dist.barrier() + loss_after = float(model(final_batch[0], final_batch[1])) + + assert loss_before == loss_after From 59c5f37e7a05a8b82f47d175928a7b05c67d8a25 Mon Sep 17 00:00:00 2001 From: Dean Wyatte <2512762+dwyatte@users.noreply.github.com> Date: Mon, 8 Jan 2024 12:54:58 -0700 Subject: [PATCH 068/754] Add WarmupCosineLR to Read the Docs (#4916) I found this scheduler via code search. It has been working well for me, so if it is meant to be released, it would be good to document it --- docs/code-docs/source/schedulers.rst | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/docs/code-docs/source/schedulers.rst b/docs/code-docs/source/schedulers.rst index 5bc23ffb0acf..4b2e2b14609b 100755 --- a/docs/code-docs/source/schedulers.rst +++ b/docs/code-docs/source/schedulers.rst @@ -1,7 +1,7 @@ Learning Rate Schedulers =================== -DeepSpeed offers implementations of ``LRRangeTest``, ``OneCycle``, ``WarmupLR``, ``WarmupDecayLR`` learning rate schedulers. When using a DeepSpeed's learning rate scheduler (specified in the `ds_config.json` file), DeepSpeed calls the `step()` method of the scheduler at every training step (when `model_engine.step()` is executed). When not using a DeepSpeed's learning rate scheduler: +DeepSpeed offers implementations of ``LRRangeTest``, ``OneCycle``, ``WarmupLR``, ``WarmupDecayLR``, ``WarmupCosineLR`` learning rate schedulers. When using a DeepSpeed's learning rate scheduler (specified in the `ds_config.json` file), DeepSpeed calls the `step()` method of the scheduler at every training step (when `model_engine.step()` is executed). When not using a DeepSpeed's learning rate scheduler: * if the schedule is supposed to execute at every training step, then the user can pass the scheduler to `deepspeed.initialize` when initializing the DeepSpeed engine and let DeepSpeed manage it for update or save/restore. * if the schedule is supposed to execute at any other interval (e.g., training epochs), then the user should NOT pass the scheduler to DeepSpeed during initialization and must manage it explicitly. @@ -23,3 +23,8 @@ WarmupLR WarmupDecayLR --------------------------- .. autoclass:: deepspeed.runtime.lr_schedules.WarmupDecayLR + + +WarmupCosineLR +--------------------------- +.. autoclass:: deepspeed.runtime.lr_schedules.WarmupCosineLR From 838c69be39b5453a79e7381f4886b9cb16a15e89 Mon Sep 17 00:00:00 2001 From: Max Kovalenko <75629718+deepcharm@users.noreply.github.com> Date: Mon, 8 Jan 2024 22:25:35 +0200 Subject: [PATCH 069/754] Add Habana Labs HPU accelerator support (#4912) --- accelerator/hpu_accelerator.py | 287 ++++++++++++++++++++++++++++++++ accelerator/real_accelerator.py | 19 ++- 2 files changed, 305 insertions(+), 1 deletion(-) create mode 100644 accelerator/hpu_accelerator.py diff --git a/accelerator/hpu_accelerator.py b/accelerator/hpu_accelerator.py new file mode 100644 index 000000000000..3e07aba0c472 --- /dev/null +++ b/accelerator/hpu_accelerator.py @@ -0,0 +1,287 @@ +# Copyright (c) Microsoft Corporation. +# SPDX-License-Identifier: Apache-2.0 + +# DeepSpeed Team + +import os +import pkgutil +import importlib +import torch + +from .abstract_accelerator import DeepSpeedAccelerator + + +class HPU_Accelerator(DeepSpeedAccelerator): + + def __init__(self): + self._name = 'hpu' + self._communication_backend_name = 'hccl' + try: + import habana_frameworks.torch.hpu as hpu + hpu.setDeterministic(True) + self.hpu = hpu + except ImportError as e: + raise ValueError( + f"HPU_Accelerator requires habana_frameworks.torch.hpu, which is not installed on this system.") + + self.fp16_supported = None + + # Device APIs + def is_synchronized_device(self): + return False + + def device_name(self, device_index=None): + if device_index is None: + return 'hpu' + return 'hpu:{}'.format(device_index) + + def device(self, device_index=None): + return torch.device(self.device_name(device_index)) + + def set_device(self, device_index): + self.hpu.set_device(device_index) + + def current_device(self): + return (self.hpu.current_device()) + + def current_device_name(self): + return 'hpu:{}'.format(self.current_device()) + + def device_count(self): + return self.hpu.device_count() + + def synchronize(self, device_index=None): + return self.hpu.synchronize() + + # RNG APIs + def random(self): + return torch.random + + def set_rng_state(self, new_state, device_index=None): + self.hpu.random.set_rng_state(new_state) + + def get_rng_state(self, device_index=None): + return self.hpu.random.get_rng_state() + + def manual_seed(self, seed): + self.hpu.random.manual_seed(seed) + + def manual_seed_all(self, seed): + self.hpu.random.manual_seed_all(seed) + + def initial_seed(self, seed): + self.hpu.random.initial_seed(seed) + + def default_generator(self, device_index): + return self.hpu.random.default_generators[device_index] + + # Streams/Events + @property + def Stream(self): + return self.hpu.Stream + + def stream(self, stream): + return self.hpu.stream(stream) + + def current_stream(self, device_index=None): + return self.hpu.current_stream() + + def default_stream(self, device_index=None): + return self.hpu.default_stream() + + @property + def Event(self): + import habana_frameworks.torch.core as htcore + return htcore.hpu.Event + + # Memory management + def empty_cache(self): + return + + def memory_allocated(self, device_index=None): + return self.hpu.memory_allocated() + + def max_memory_allocated(self, device_index=None): + return self.hpu.max_memory_allocated() + + def reset_max_memory_allocated(self, device_index=None): + return self.hpu.reset_max_memory_allocated() + + def memory_cached(self, device_index=None): + return 0 + + def max_memory_cached(self, device_index=None): + return 0 + + def reset_max_memory_cached(self, device_index=None): + return 0 + + def memory_stats(self, device_index=None): + return {} + + def reset_peak_memory_stats(self, device_index=None): + self.hpu.reset_peak_memory_stats() + + def memory_reserved(self, device_index=None): + return 0 + + def max_memory_reserved(self, device_index=None): + return 0 + + def total_memory(self, device_index=None): + return 0 + + def available_memory(self, device_index=None): + return self.total_memory(device_index) - self.memory_allocated(device_index) + + # Data types + def is_bf16_supported(self): + return True + + def is_fp16_supported(self): + if self.fp16_supported is None: + import habana_frameworks.torch.utils.experimental as htexp + self.fp16_supported = htexp._is_fp16_supported() + return self.fp16_supported + + def supported_dtypes(self): + supported_dtypes = [torch.float, torch.bfloat16] + if self.is_fp16_supported(): + supported_dtypes.append(torch.bfloat16) + return supported_dtypes + + # Misc + def amp(self): + return None + + def is_available(self): + return self.hpu.is_available() + + def range_push(self, msg): + return + + def range_pop(self): + return + + def lazy_call(self, callback): + callback() + + def communication_backend_name(self): + return self._communication_backend_name + + def is_triton_supported(self): + return False + + # Graph operations + def create_graph(self): + return None + + def capture_to_graph(self, graph, pool=None, stream=None): + from deepspeed.runtime.utils import noop_context + return noop_context() + + def replay_graph(self, graph): + return + + # Tensor operations + @property + def BFloat16Tensor(self): + return torch.hpu.BFloat16Tensor + + @property + def ByteTensor(self): + return torch.hpu.ByteTensor + + @property + def DoubleTensor(self): + return torch.hpu.DoubleTensor + + @property + def FloatTensor(self): + return torch.hpu.FloatTensor + + @property + def HalfTensor(self): + return torch.hpu.HalfTensor + + @property + def IntTensor(self): + return torch.hpu.IntTensor + + @property + def LongTensor(self): + return torch.hpu.LongTensor + + def pin_memory(self, tensor, align_bytes=1): + return tensor.pin_memory(self.device()) + + def is_pinned(self, tensor): + return tensor.is_pinned() + + def on_accelerator(self, tensor): + device_str = str(tensor.device) + if device_str.startswith('hpu:'): + return True + else: + return False + + def op_builder_dir(self): + try: + # is op_builder from deepspeed or a 3p version? this should only succeed if it's deepspeed + # if successful this also means we're doing a local install and not JIT compile path + from op_builder import __deepspeed__ # noqa: F401 # type: ignore + return "op_builder.hpu" + except ImportError: + return "deepspeed.ops.op_builder.hpu" + + # dict that holds class name <--> class type mapping i.e. + # 'AsyncIOBuilder': + # this dict will be filled at init stage + class_dict = None + + def _lazy_init_class_dict(self): + if self.class_dict is not None: + return + else: + self.class_dict = {} + # begin initialize for create_op_builder() + # put all valid class name <--> class type mapping into class_dict + op_builder_dir = self.op_builder_dir() + op_builder_module = importlib.import_module(op_builder_dir) + op_builder_absolute_path = os.path.dirname(op_builder_module.__file__) + for _, module_name, _ in pkgutil.iter_modules([op_builder_absolute_path]): + # avoid self references, + # skip sub_directories which contains ops for other backend(cpu, npu, etc.). + if module_name != 'all_ops' and module_name != 'builder' and not os.path.isdir( + os.path.join(op_builder_absolute_path, module_name)): + module = importlib.import_module("{}.{}".format(op_builder_dir, module_name)) + for member_name in module.__dir__(): + if member_name.endswith( + 'Builder' + ) and member_name != "OpBuilder" and member_name != "CPUOpBuilder" and member_name != "TorchCPUOpBuilder": # avoid abstract classes + if not member_name in self.class_dict: + self.class_dict[member_name] = getattr(module, member_name) + # end initialize for create_op_builder() + + # create an instance of op builder and return, name specified by class_name + def create_op_builder(self, class_name): + self._lazy_init_class_dict() + if class_name in self.class_dict: + return self.class_dict[class_name]() + else: + return None + + # return an op builder class, name specified by class_name + def get_op_builder(self, class_name): + self._lazy_init_class_dict() + if class_name in self.class_dict: + return self.class_dict[class_name] + else: + return self.class_dict['NotImplementedBuilder'] if 'NotImplementedBuilder' in self.class_dict else None + + def build_extension(self): + from torch.utils.cpp_extension import BuildExtension + return BuildExtension + + def export_envs(self): + return [] diff --git a/accelerator/real_accelerator.py b/accelerator/real_accelerator.py index 10ebad11c72f..ee421ed4cca7 100644 --- a/accelerator/real_accelerator.py +++ b/accelerator/real_accelerator.py @@ -20,7 +20,7 @@ except ImportError as e: dsa2 = None -SUPPORTED_ACCELERATOR_LIST = ['cuda', 'cpu', 'xpu', 'xpu.external', 'npu', 'mps'] +SUPPORTED_ACCELERATOR_LIST = ['cuda', 'cpu', 'xpu', 'xpu.external', 'npu', 'mps', 'hpu'] ds_accelerator = None @@ -92,6 +92,12 @@ def get_accelerator(): torch.mps.current_allocated_memory() except (RuntimeError, ImportError) as e: raise ValueError(f"MPS_Accelerator requires torch.mps, which is not installed on this system.") + elif accelerator_name == "hpu": + try: + import habana_frameworks.torch.hpu # noqa: F401 + except ImportError as e: + raise ValueError( + f"HPU_Accelerator requires habana_frameworks.torch.hpu, which is not installed on this system.") elif is_current_accelerator_supported(): raise ValueError(f'DS_ACCELERATOR must be one of {SUPPORTED_ACCELERATOR_LIST}. ' f'Value "{accelerator_name}" is not supported') @@ -140,6 +146,13 @@ def get_accelerator(): accelerator_name = "mps" except (RuntimeError, ImportError) as e: pass + if accelerator_name is None: + try: + import habana_frameworks.torch.hpu # noqa: F401,F811 + + accelerator_name = "hpu" + except ImportError as e: + pass if accelerator_name is None: accelerator_name = "cuda" @@ -169,6 +182,10 @@ def get_accelerator(): from .mps_accelerator import MPS_Accelerator ds_accelerator = MPS_Accelerator() + elif accelerator_name == 'hpu': + from .hpu_accelerator import HPU_Accelerator + + ds_accelerator = HPU_Accelerator() _validate_accelerator(ds_accelerator) if accel_logger is not None: accel_logger.info(f"Setting ds_accelerator to {ds_accelerator._name} ({ds_set_method})") From d7b764e3d86e499479d321ad065c3f0d9710ece1 Mon Sep 17 00:00:00 2001 From: Zhen Zhang Date: Mon, 8 Jan 2024 13:47:59 -0800 Subject: [PATCH 070/754] Unit tests for MiCS (#4792) In response to the ask from https://github.com/microsoft/DeepSpeed/pull/2964#issuecomment-1832161865, I added three more unit tests related to MiCS. There are two knowledge issues: - Testing on Torch 2.1.0 triggers `_IllegalWorker` in coalesced all gather. I made changes to ignore this condition. and Currently, I don't know the reason. - The MiCS implementation is not working with offloading, so the failure in `TestZeroPartialOffloadConfigSweep` is expected. --------- Co-authored-by: Logan Adams <114770087+loadams@users.noreply.github.com> --- deepspeed/runtime/zero/mics.py | 9 +++++++- tests/unit/runtime/zero/test_zero.py | 8 ++++++- tests/unit/runtime/zero/test_zero_context.py | 23 +++++++++++++++++++ .../unit/runtime/zero/test_zero_offloadpp.py | 1 + 4 files changed, 39 insertions(+), 2 deletions(-) diff --git a/deepspeed/runtime/zero/mics.py b/deepspeed/runtime/zero/mics.py index 9899a070e003..6c7003085685 100755 --- a/deepspeed/runtime/zero/mics.py +++ b/deepspeed/runtime/zero/mics.py @@ -41,7 +41,14 @@ def wait(self) -> None: """ """ # let the current stream to op - instrument_w_nvtx(self.allgather_handle.wait)() + try: + instrument_w_nvtx(self.allgather_handle.wait)() + except RuntimeError as e: + log_dist( + f"WARNING: Runtime Error while waiting the collective all-gather, possibly due to the _IllegalWork", + ranks=[0]) + log_dist(f"Error message: {e}", ranks=[0]) + if self.complete: return diff --git a/tests/unit/runtime/zero/test_zero.py b/tests/unit/runtime/zero/test_zero.py index db81a0578160..6d66ff704416 100644 --- a/tests/unit/runtime/zero/test_zero.py +++ b/tests/unit/runtime/zero/test_zero.py @@ -85,11 +85,16 @@ def test(self, zero_stage): # testing the fix https://github.com/microsoft/DeepSpeed/pull/1227 +@pytest.mark.parametrize("mics_enabled", [True, False]) class TestZero3RepeatForwardLoop(DistributedTest): world_size = 1 - def test(self, zero_stage=3): + def test(self, mics_enabled, zero_stage=3): # force all params to be partitioned by forcing threshold=0 + mics_shard_size = -1 + if mics_enabled: + mics_shard_size = self.world_size + config_dict = { "train_micro_batch_size_per_gpu": 2, "gradient_accumulation_steps": 2, @@ -97,6 +102,7 @@ def test(self, zero_stage=3): "zero_optimization": { "stage": zero_stage, "stage3_param_persistence_threshold": 0, + "mics_shard_size": mics_shard_size, }, "optimizer": { "type": "Adam", diff --git a/tests/unit/runtime/zero/test_zero_context.py b/tests/unit/runtime/zero/test_zero_context.py index aabe7f0b7f15..0ddf1026eaf8 100644 --- a/tests/unit/runtime/zero/test_zero_context.py +++ b/tests/unit/runtime/zero/test_zero_context.py @@ -81,6 +81,29 @@ def __init__(self, hidden_dim): assert model.l1.weight.numel() == 0, "outside of GatheredParameters the param should go back to be 0-sized" +class TestMiCSGatheredParametersFree(DistributedTest): + world_size = 1 + + def test(self): + config_dict = {"train_batch_size": 1, "zero_optimization": {"stage": 3, "mics_shard_size": 1}} + hidden_dim = 10 + + class MyModel(torch.nn.Module): + + def __init__(self, hidden_dim): + super(MyModel, self).__init__() + self.l1 = torch.nn.Linear(hidden_dim, hidden_dim) + + with deepspeed.zero.MiCS_Init(config_dict_or_path=config_dict): + model = MyModel(hidden_dim) + + with deepspeed.zero.GatheredParameters(list(model.parameters())): + assert model.l1.weight.numel() != 0, "GatheredParameters should give a non-0-sized tensor" + + # on exit from `GatheredParameters` the gathered params should be freed and not leak memory + assert model.l1.weight.numel() == 0, "outside of GatheredParameters the param should go back to be 0-sized" + + class TestSerialContext(DistributedTest): world_size = 1 init_distributed = False diff --git a/tests/unit/runtime/zero/test_zero_offloadpp.py b/tests/unit/runtime/zero/test_zero_offloadpp.py index c376686f8052..5bfec399e19f 100644 --- a/tests/unit/runtime/zero/test_zero_offloadpp.py +++ b/tests/unit/runtime/zero/test_zero_offloadpp.py @@ -39,6 +39,7 @@ class TestZeroPartialOffloadConfigSweep(DistributedTest): world_size = 4 def test(self, h_dim: int, n_layers: int) -> None: + config_dict = { "train_batch_size": 256, "steps_per_print": 1, From 75db3d7da7b92243dcea8ed03e58205736e68260 Mon Sep 17 00:00:00 2001 From: Lev Kurilenko <113481193+lekurile@users.noreply.github.com> Date: Mon, 8 Jan 2024 14:22:22 -0800 Subject: [PATCH 071/754] Fix SD workflow to work with latest diffusers version (#4918) This PR fixes the Stable Diffusion workflow to work with the latest `diffusers` version (`0.25.0`). Fixes #4911. Manual test: https://github.com/microsoft/DeepSpeed/actions/runs/7452977322 --- deepspeed/module_inject/containers/vae.py | 6 +++--- requirements/requirements-sd.txt | 2 +- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/deepspeed/module_inject/containers/vae.py b/deepspeed/module_inject/containers/vae.py index d7c9642768cc..297a796977f1 100644 --- a/deepspeed/module_inject/containers/vae.py +++ b/deepspeed/module_inject/containers/vae.py @@ -13,11 +13,11 @@ def __init__(self): super().__init__() try: import diffusers - if hasattr(diffusers.models.vae, "AutoencoderKL"): - self._orig_layer_class = diffusers.models.vae.AutoencoderKL + if hasattr(diffusers.models.autoencoders.vae, "AutoencoderKL"): + self._orig_layer_class = diffusers.models.autoencoders.vae.AutoencoderKL else: # Diffusers >= 0.12.0 changes location of AutoencoderKL - self._orig_layer_class = diffusers.models.autoencoder_kl.AutoencoderKL + self._orig_layer_class = diffusers.models.autoencoders.autoencoder_kl.AutoencoderKL except ImportError: self._orig_layer_class = None diff --git a/requirements/requirements-sd.txt b/requirements/requirements-sd.txt index cb679ae3771d..0b2ce8c2b56f 100644 --- a/requirements/requirements-sd.txt +++ b/requirements/requirements-sd.txt @@ -1,2 +1,2 @@ -diffusers +diffusers>=0.25.0 triton>=2.1.0 From d8d865f4926e66acefe2535c360568a302a6dc8f Mon Sep 17 00:00:00 2001 From: "Ma, Guokai" Date: Tue, 9 Jan 2024 07:03:44 +0800 Subject: [PATCH 072/754] [Fix] Fix cpu inference UT failure (#4430) This PR fix UT test error as described in this PR and the following test job. This PR skips `TestModelTask` if dtype is not supported by accelerator, or `InferenceBuilder` is not implemented by accelerator. https://github.com/microsoft/DeepSpeed/pull/4419 https://github.com/microsoft/DeepSpeed/actions/runs/6341645987/job/17235544538 --------- Co-authored-by: Logan Adams <114770087+loadams@users.noreply.github.com> Co-authored-by: Liangliang-Ma <1906710196@qq.com> Co-authored-by: Quentin Anthony Co-authored-by: Dashiell Stander Co-authored-by: Olatunji Ruwase Co-authored-by: Ramya Ramineni <62723901+rraminen@users.noreply.github.com> Co-authored-by: Xie Zejian Co-authored-by: Conglong Li Co-authored-by: Michael Wyatt --- .github/workflows/cpu-inference.yml | 49 ++++++++++++++++--- csrc/cpu/comm/ccl.cpp | 4 +- deepspeed/comm/ccl.py | 46 +++++++++++------ .../accelerator-abstraction-interface.md | 2 +- tests/unit/inference/test_inference.py | 18 +++++-- tests/unit/inference/test_inference_config.py | 4 +- 6 files changed, 94 insertions(+), 29 deletions(-) diff --git a/.github/workflows/cpu-inference.yml b/.github/workflows/cpu-inference.yml index 521fe2b5bea4..a2ca41f4aa3a 100644 --- a/.github/workflows/cpu-inference.yml +++ b/.github/workflows/cpu-inference.yml @@ -1,7 +1,14 @@ name: cpu-inference on: + pull_request: + paths-ignore: + - 'docs/**' + - 'blogs/**' workflow_dispatch: + merge_group: + branches: [ master ] + concurrency: group: ${{ github.workflow }}-${{ github.ref }} @@ -9,7 +16,7 @@ concurrency: jobs: unit-tests: - runs-on: ubuntu-20.04 + runs-on: [self-hosted, cpu] steps: - uses: actions/checkout@v3 @@ -17,6 +24,20 @@ jobs: - id: setup-venv uses: ./.github/workflows/setup-venv + - name: Install gcc-9 + run: | + sudo add-apt-repository -u ppa:ubuntu-toolchain-r/test + sudo apt install -y gcc-9 g++-9 + # set gcc-9 and g++9 to default + sudo update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-9 99 + sudo update-alternatives --install /usr/bin/g++ g++ /usr/bin/g++-9 99 + + - name: Check gcc version + run: | + # Get gcc version + gcc --version + g++ --version + - name: Detect instruction sets on instance run: | lscpu @@ -33,8 +54,16 @@ jobs: - name: Install oneCCL Bindings for PyTorch run: | + pip install torch python -m pip install intel_extension_for_pytorch - python -m pip install oneccl_bind_pt==2.0 -f https://developer.intel.com/ipex-whl-stable-cpu + # the curl line is for troubleshooting + curl -L https://pytorch-extension.intel.com/release-whl/stable/cpu/us/ + python -m pip install oneccl_bind_pt --extra-index-url https://pytorch-extension.intel.com/release-whl/stable/cpu/us/ + pip install py-cpuinfo + # check installed version + pip list |grep \\\ + pip list |grep intel-extension-for-pytorch + pip list |grep oneccl-bind-pt - name: Install oneCCL run: | @@ -62,14 +91,22 @@ jobs: pip install .[dev,1bit,autotuning,inf] ds_report - - name: Python environment + - name: Python environment check run: | pip list + source oneCCL/build/_install/env/setvars.sh + export LD_PRELOAD=/usr/lib/x86_64-linux-gnu/libstdc++.so.6 + # check whether the environment is properly setup + python -c "import torch;import intel_extension_for_pytorch as ipex;import oneccl_bindings_for_pytorch;print('done')" + python -c "import deepspeed;from deepspeed.accelerator import get_accelerator;print(get_accelerator().device_name());print(get_accelerator().is_available())" - name: Unit tests run: | + # prep oneCCL for CCLBackend comm ops building source oneCCL/build/_install/env/setvars.sh + export LD_PRELOAD=/usr/lib/x86_64-linux-gnu/libstdc++.so.6 unset TORCH_CUDA_ARCH_LIST # only jit compile for current arch - cd tests - TRANSFORMERS_CACHE=~/tmp/transformers_cache/ TORCH_EXTENSIONS_DIR=./torch-extensions pytest -m 'seq_inference' unit/ - TRANSFORMERS_CACHE=~/tmp/transformers_cache/ TORCH_EXTENSIONS_DIR=./torch-extensions pytest -m 'inference_ops' -m 'inference' unit/ + cd tests + # LOCAL_SIZE=2 enforce CPU to report 2 devices, this helps run the test on github default runner + LOCAL_SIZE=2 COLUMNS=240 TRANSFORMERS_CACHE=~/tmp/transformers_cache/ TORCH_EXTENSIONS_DIR=./torch-extensions pytest -m 'seq_inference' unit/ + LOCAL_SIZE=2 COLUMNS=240 TRANSFORMERS_CACHE=~/tmp/transformers_cache/ TORCH_EXTENSIONS_DIR=./torch-extensions pytest -m 'inference_ops' -m 'inference' unit/ diff --git a/csrc/cpu/comm/ccl.cpp b/csrc/cpu/comm/ccl.cpp index 9a04b6f873f2..6428ab5cbfa5 100644 --- a/csrc/cpu/comm/ccl.cpp +++ b/csrc/cpu/comm/ccl.cpp @@ -537,7 +537,7 @@ static void parallel_memcpy(void* to, void* from, size_t n_bytes) } } -void inference_all_reduce(torch::Tensor& data, py::object op, std::vector group, bool async_op) +void inference_all_reduce(torch::Tensor& data, py::object op, bool async_op) { static py::object ReduceOp = py::module_::import("deepspeed.comm").attr("ReduceOp"); static auto ReduceOpSum = (int)py::int_(ReduceOp.attr("SUM").attr("value")); @@ -562,7 +562,7 @@ void inference_all_reduce(torch::Tensor& data, py::object op, std::vector g data.numel(), get_ccl_datatype(data.scalar_type()), get_ccl_reduce_op(op, data), - _get_comm_from_group(group)) + _get_comm_from_group()) .wait()); return; } diff --git a/deepspeed/comm/ccl.py b/deepspeed/comm/ccl.py index 6e915d0ca430..a199843d5086 100644 --- a/deepspeed/comm/ccl.py +++ b/deepspeed/comm/ccl.py @@ -61,7 +61,8 @@ def is_initialized(self): def run_collective(self, name, **kwargs): if name in self.available_coll: - kwargs['group'] = self.get_all_ranks_from_group(kwargs['group']) + if 'group' in kwargs: + kwargs['group'] = self.get_all_ranks_from_group(kwargs['group']) if 'dst' in kwargs: kwargs['dst'] = kwargs['group'].index(kwargs['dst']) if 'src' in kwargs: @@ -71,23 +72,38 @@ def run_collective(self, name, **kwargs): return CCLHandler(self.ccl_comm_op) else: func = "super(CCLBackend, self)." + name - return eval(func)(*(kwargs.values())) + eval(func)(*(kwargs.values())) + return CCLHandler(self.ccl_comm_op) def all_reduce(self, tensor, op=ReduceOp.SUM, group=None, async_op=False): use_caching = False if use_caching: match_id = f"{tensor.size()}-{op}" - return self.run_collective(name="all_reduce_caching", - tensor=tensor, - op=op, - match_id=match_id, - group=group, - async_op=async_op) + name = "all_reduce_caching" + if name in self.available_coll: + group = self.get_all_ranks_from_group(group) + return self.ccl_comm_op.all_reduce_caching(tensor, op, match_id, group, async_op) + else: + return self.run_collective(name=name, + tensor=tensor, + op=op, + match_id=match_id, + group=group, + async_op=async_op) else: - return self.run_collective(name="all_reduce", tensor=tensor, op=op, group=group, async_op=async_op) + name = "all_reduce" + if name in self.available_coll: + group = self.get_all_ranks_from_group(group) + return self.ccl_comm_op.all_reduce(tensor, op, group, async_op) + else: + return self.run_collective(name=name, tensor=tensor, op=op, group=group, async_op=async_op) def inference_all_reduce(self, tensor, op=ReduceOp.SUM, group=None, async_op=False): - return self.run_collective(name="inference_all_reduce", tensor=tensor, op=op, group=group, async_op=async_op) + name = "inference_all_reduce" + if name in self.available_coll: + return self.ccl_comm_op.inference_all_reduce(tensor, op, async_op) + else: + return self.run_collective(name=name, tensor=tensor, op=op, group=None, async_op=async_op) def broadcast(self, tensor, src, group=None, async_op=False): return self.run_collective(name="broadcast", tensor=tensor, src=src, group=group, async_op=async_op) @@ -120,11 +136,11 @@ def all_to_all_single(self, output, input, output_split_sizes, input_split_sizes input_split_sizes=input_split_sizes, group=group) - def send(self, tensor, dst, group=None, async_op=False): - return self.run_collective(name="send", tensor=tensor, dst=dst, group=group, async_op=async_op) + def send(self, tensor, dst, group=None, tag=0): + return self.run_collective(name="send", tensor=tensor, dst=dst, group=group, tag=tag) - def recv(self, tensor, src, group=None, async_op=False): - return self.run_collective(name="recv", tensor=tensor, src=src, group=group, async_op=async_op) + def recv(self, tensor, src, group=None, tag=0): + return self.run_collective(name="recv", tensor=tensor, src=src, group=group, tag=tag) def gather(self, tensor, gather_list, dst, group=None, async_op=False): return self.run_collective(name="gather", tensor=tensor, gather_list=gather_list, dst=dst, group=group) @@ -170,7 +186,7 @@ def get_all_ranks_from_group(self, group): while True: results.append(super(CCLBackend, self).get_global_rank(group, rank)) rank += 1 - except ValueError: + except (ValueError, RuntimeError): pass if tuple(results) not in self.groups: self._new_group(results, group) diff --git a/docs/_tutorials/accelerator-abstraction-interface.md b/docs/_tutorials/accelerator-abstraction-interface.md index 0810c3c6b5d7..db1a6005f793 100644 --- a/docs/_tutorials/accelerator-abstraction-interface.md +++ b/docs/_tutorials/accelerator-abstraction-interface.md @@ -96,7 +96,7 @@ To run DeepSpeed model on CPU, use the following steps to prepare environment: ``` python -m pip install intel_extension_for_pytorch -python -m pip install oneccl_bind_pt==2.0 -f https://developer.intel.com/ipex-whl-stable-cpu +python -m pip install oneccl_bind_pt -f https://developer.intel.com/ipex-whl-stable-cpu git clone https://github.com/oneapi-src/oneCCL cd oneCCL mkdir build diff --git a/tests/unit/inference/test_inference.py b/tests/unit/inference/test_inference.py index 6b5588d8a1f7..767e1dba23ea 100644 --- a/tests/unit/inference/test_inference.py +++ b/tests/unit/inference/test_inference.py @@ -5,6 +5,7 @@ import os import time +import pickle import torch import pytest import itertools @@ -65,7 +66,13 @@ ] # Get a list of all models and mapping from task to supported models -_hf_models = list(HfApi().list_models()) +try: + with open("hf_models.pkl", "rb") as fp: + _hf_models = pickle.load(fp) +except FileNotFoundError: + _hf_models = list(HfApi().list_models()) + with open("hf_models.pkl", "wb") as fp: + pickle.dump(_hf_models, fp) _hf_model_names = [m.modelId for m in _hf_models] _hf_task_to_models = {task: [m.modelId for m in _hf_models if m.pipeline_tag == task] for task in _test_tasks} @@ -280,6 +287,12 @@ def test( if invalid_test_msg: pytest.skip(invalid_test_msg) + if dtype not in get_accelerator().supported_dtypes(): + pytest.skip(f"Acceleraor {get_accelerator().device_name()} does not support {dtype}.") + + if not deepspeed.ops.__compatible_ops__[InferenceBuilder.NAME]: + pytest.skip("This op had not been implemented on this system.", allow_module_level=True) + model, task = model_w_task local_rank = int(os.getenv("LOCAL_RANK", "0")) @@ -536,9 +549,8 @@ def test( if dtype not in get_accelerator().supported_dtypes(): pytest.skip(f"Acceleraor {get_accelerator().device_name()} does not support {dtype}.") - # TODO: enable this test after torch 2.1 stable release if dtype == torch.bfloat16 and model_w_task[0] == "Salesforce/codegen-350M-mono": - pytest.skip("Codegen model(bf16) need to use torch version > 2.0.") + pytest.skip("Disable Codegen model(bf16) due to slight result difference") model, task = model_w_task local_rank = int(os.getenv("LOCAL_RANK", "0")) diff --git a/tests/unit/inference/test_inference_config.py b/tests/unit/inference/test_inference_config.py index 375563abf65b..39d62d17372c 100644 --- a/tests/unit/inference/test_inference_config.py +++ b/tests/unit/inference/test_inference_config.py @@ -15,7 +15,7 @@ class TestInferenceConfig(DistributedTest): world_size = 1 def test_overlap_kwargs(self): - config = {"replace_with_kernel_inject": True} + config = {"replace_with_kernel_inject": True, "dtype": torch.float32} kwargs = {"replace_with_kernel_inject": True} engine = deepspeed.init_inference(torch.nn.Module(), config=config, **kwargs) @@ -37,7 +37,7 @@ def test_kwargs_and_config(self): assert engine._config.dtype == kwargs["dtype"] def test_json_config(self, tmpdir): - config = {"replace_with_kernel_inject": True} + config = {"replace_with_kernel_inject": True, "dtype": "torch.float32"} config_json = create_config_from_dict(tmpdir, config) engine = deepspeed.init_inference(torch.nn.Module(), config=config_json) From 5457363c9b4f7a98971f59a2a9c6698f0da9e13a Mon Sep 17 00:00:00 2001 From: Logan Adams <114770087+loadams@users.noreply.github.com> Date: Mon, 8 Jan 2024 21:33:18 -0800 Subject: [PATCH 073/754] Add paths to run SD tests (#4919) Add additional files to the paths that run the nv-sd.yml tests, if we update the requirements-sd.txt or VAE/UNET, we should run those tests. --------- Co-authored-by: Lev Kurilenko <113481193+lekurile@users.noreply.github.com> --- .github/workflows/nv-sd.yml | 3 +++ 1 file changed, 3 insertions(+) diff --git a/.github/workflows/nv-sd.yml b/.github/workflows/nv-sd.yml index 2f4e3f173d37..4ee92cbf9a1b 100644 --- a/.github/workflows/nv-sd.yml +++ b/.github/workflows/nv-sd.yml @@ -10,7 +10,10 @@ on: - "tests/unit/inference/test_stable_diffusion.py" - "deepspeed/model_implementations/diffusers/unet.py" - "deepspeed/model_implementations/diffusers/vae.py" + - "deepspeed/module_inject/containers/vae.py" + - "deepspeed/module_inject/containers/unet.py" - ".github/workflows/nv-sd.yml" + - "requirements/requirements-sd.txt" concurrency: group: ${{ github.workflow }}-${{ github.ref }} From 43eba775ee56e45782666cbe52f05c1cc5668bfe Mon Sep 17 00:00:00 2001 From: Logan Adams <114770087+loadams@users.noreply.github.com> Date: Tue, 9 Jan 2024 13:25:17 -0800 Subject: [PATCH 074/754] Change PR/schedule triggers for CPU-inference (#4924) Update triggers for cpu-inference and nv-inference. - cpu-inference changes: set CI to be weekly, added triggers to run when deepspeed/inference folders are modified. - nv-inference: updated triggers to be similar to cpu-inference. --------- Co-authored-by: Michael Wyatt --- .github/workflows/cpu-inference.yml | 14 ++++++++++---- .github/workflows/nv-inference.yml | 13 ++++++++----- 2 files changed, 18 insertions(+), 9 deletions(-) diff --git a/.github/workflows/cpu-inference.yml b/.github/workflows/cpu-inference.yml index a2ca41f4aa3a..e6edb425e407 100644 --- a/.github/workflows/cpu-inference.yml +++ b/.github/workflows/cpu-inference.yml @@ -2,13 +2,19 @@ name: cpu-inference on: pull_request: - paths-ignore: - - 'docs/**' - - 'blogs/**' + paths: + - '.github/workflows/cpu-inference.yml' + - 'requirements/**' + - 'deepspeed/__init__.py' + - 'deepspeed/inference/**' + - '!deepspeed/inference/v2/**' # exclude v2 dir + - 'tests/unit/inference/**' + - '!tests/unit/inference/v2/**' # exclude v2 tests dir workflow_dispatch: merge_group: branches: [ master ] - + schedule: + - cron: "0 0 * * 0" concurrency: group: ${{ github.workflow }}-${{ github.ref }} diff --git a/.github/workflows/nv-inference.yml b/.github/workflows/nv-inference.yml index 156fa0228d0b..37c8be32ee54 100644 --- a/.github/workflows/nv-inference.yml +++ b/.github/workflows/nv-inference.yml @@ -2,11 +2,14 @@ name: nv-inference on: pull_request: - paths-ignore: - - 'docs/**' - - 'blogs/**' - - 'deepspeed/inference/v2/**' - - 'tests/unit/inference/v2/**' + paths: + - '.github/workflows/nv-inference.yml' + - 'requirements/**' + - 'deepspeed/__init__.py' + - 'deepspeed/inference/**' + - '!deepspeed/inference/v2/**' # exclude v2 dir + - 'tests/unit/inference/**' + - '!tests/unit/inference/v2/**' # exclude v2 tests dir merge_group: branches: [ master ] schedule: From 16c265c0ce103147d027d9cae32dd7680766af21 Mon Sep 17 00:00:00 2001 From: Yejing-Lai <55339926+Yejing-Lai@users.noreply.github.com> Date: Wed, 10 Jan 2024 08:45:54 +0800 Subject: [PATCH 075/754] fix falcon-40b accuracy issue (#4895) This [PR](https://github.com/microsoft/DeepSpeed/pull/4721) added the "DecoderLayer":glmtype. It will cause the Falcon model to choose "glmtype" fused_qkv_type. Falcon model (including Falcondecoderlayer) needs to choose 'bloomtype' explicitly. Co-authored-by: Michael Wyatt --- deepspeed/module_inject/fusedqkv_utils.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/deepspeed/module_inject/fusedqkv_utils.py b/deepspeed/module_inject/fusedqkv_utils.py index bed0607dcb43..eba5af0cf262 100644 --- a/deepspeed/module_inject/fusedqkv_utils.py +++ b/deepspeed/module_inject/fusedqkv_utils.py @@ -38,7 +38,8 @@ def prepare_tp_fused_qkvw(module_str, src, mp_size, gpu_index): "MptBlock": 'glmtype', "BaichuanLayer": 'glmtype', "DecoderLayer": 'glmtype', - "GPTBigCodeBlock": 'bigcodetype' + "FalconDecoderLayer": 'bloomtype', + "GPTBigCodeBlock": 'bigcodetype', } def _codegen_type_transpose(input, mp_size, codegen_mp_num=4): From c1e02052aca93a79e08ea5a9064f4353db03a34c Mon Sep 17 00:00:00 2001 From: Arash Bakhtiari Date: Wed, 10 Jan 2024 09:33:08 -0800 Subject: [PATCH 076/754] Refactor the positional emebdding config code (#4920) The Mixtral PR https://github.com/microsoft/DeepSpeed/pull/4828 has introduced the positional embedding config class which is a required argument of `make_attn_layer()` function. This has forced the user to override and duplicate the `make_attn_layer()` call for new model implementations using RoPE (This has also broken the Falcon model implementations). This PR: - refactors the inference transformer base class to avoid code duplication by adding a new abstract `positional_embedding_config` property - Fixes the Falcon model implementation to use positional embedding config. The models `llama_v2`, `OPT`, `Mistral 7B`, `Mixtral`, `Falcon` and `Phi-2` are tested with the PR! --------- Co-authored-by: Logan Adams <114770087+loadams@users.noreply.github.com> --- .../v2/model_implementations/falcon/model.py | 7 +++ .../inference_transformer_base.py | 12 +++- .../model_implementations/llama_v2/model.py | 24 +------ .../v2/model_implementations/mistral/model.py | 24 +------ .../v2/model_implementations/mixtral/model.py | 29 +++------ .../v2/model_implementations/opt/model.py | 10 +-- .../v2/model_implementations/phi/model.py | 63 +------------------ .../attention/dense_blocked_attention.py | 2 + 8 files changed, 41 insertions(+), 130 deletions(-) diff --git a/deepspeed/inference/v2/model_implementations/falcon/model.py b/deepspeed/inference/v2/model_implementations/falcon/model.py index d1ccc38280a0..b2830c80b562 100644 --- a/deepspeed/inference/v2/model_implementations/falcon/model.py +++ b/deepspeed/inference/v2/model_implementations/falcon/model.py @@ -95,6 +95,13 @@ def norm_type(self) -> NormTypeEnum: def positional_embedding_type(self) -> PositionalEmbeddingType: return PositionalEmbeddingType.rotate_half + @property + def positional_embedding_config(self) -> RotateHalfConfig: + """ + The positional embedding configuration for the model. + """ + return RotateHalfConfig() + """ Forward implementations """ diff --git a/deepspeed/inference/v2/model_implementations/inference_transformer_base.py b/deepspeed/inference/v2/model_implementations/inference_transformer_base.py index e78a161b4cd0..0cc577451d51 100644 --- a/deepspeed/inference/v2/model_implementations/inference_transformer_base.py +++ b/deepspeed/inference/v2/model_implementations/inference_transformer_base.py @@ -22,6 +22,7 @@ DSUnembedConfig, NormTypeEnum, PositionalEmbeddingType, + RotateHalfConfig, ) from ..modules import heuristics from ..ragged import ( @@ -152,6 +153,14 @@ def norm_type(self) -> NormTypeEnum: """ ... + @property + @abstractmethod + def positional_embedding_config(self) -> Optional[RotateHalfConfig]: + """ + The positional embedding configuration for the model. + """ + ... + """ Derived helpers """ @@ -319,7 +328,8 @@ def make_attn_layer(self) -> None: scale_factor=softmax_scale, input_dtype=self.activation_dtype, output_dtype=self.activation_dtype, - positional_embedding_type=self.positional_embedding_type) + positional_embedding_type=self.positional_embedding_type, + positional_embedding_config=self.positional_embedding_config) self.attn = heuristics.instantiate_attention(attn_config, self._engine_config) diff --git a/deepspeed/inference/v2/model_implementations/llama_v2/model.py b/deepspeed/inference/v2/model_implementations/llama_v2/model.py index 735e8f52cca3..a0c81f4d749e 100644 --- a/deepspeed/inference/v2/model_implementations/llama_v2/model.py +++ b/deepspeed/inference/v2/model_implementations/llama_v2/model.py @@ -14,7 +14,6 @@ from .. import * from ...modules.configs import * from ...modules.interfaces import * -from ...modules import heuristics from ...ragged import RaggedBatchWrapper from .container import Llama2NonTransformerContainer, Llama2TransformerContainer @@ -106,26 +105,9 @@ def norm_type(self) -> NormTypeEnum: def positional_embedding_type(self) -> PositionalEmbeddingType: return PositionalEmbeddingType.rotate_half - def make_attn_layer(self) -> None: - """ - Builds the attention layer for the model. This sets the `self.attn` attribute. - """ - softmax_scale = 1.0 / (self.head_size**0.5) - - rotary_config = RotateHalfConfig(theta_base=self._config.rope_theta) - - attn_config = DSSelfAttentionConfig(max_tokens=self._engine_config.state_manager.max_ragged_batch_size, - n_heads_q=self.n_heads_q_local, - n_heads_kv=self.n_heads_kv_local, - head_size=self.head_size, - max_sequences=self._engine_config.state_manager.max_ragged_sequence_count, - scale_factor=softmax_scale, - input_dtype=self.activation_dtype, - output_dtype=self.activation_dtype, - positional_embedding_type=self.positional_embedding_type, - positional_embedding_config=rotary_config) - - self.attn = heuristics.instantiate_attention(attn_config, self._engine_config) + @property + def positional_embedding_config(self) -> Optional[RotateHalfConfig]: + return RotateHalfConfig(theta_base=self._config.rope_theta) """ Forward implementations diff --git a/deepspeed/inference/v2/model_implementations/mistral/model.py b/deepspeed/inference/v2/model_implementations/mistral/model.py index 9c707026f9dd..318d362f1a64 100644 --- a/deepspeed/inference/v2/model_implementations/mistral/model.py +++ b/deepspeed/inference/v2/model_implementations/mistral/model.py @@ -14,7 +14,6 @@ from ...model_implementations import * from ...modules.configs import * from ...modules.interfaces import * -from ...modules import heuristics from ...ragged import RaggedBatchWrapper from .container import MistralNonTransformerContainer, MistralTransformerContainer @@ -105,26 +104,9 @@ def norm_type(self) -> NormTypeEnum: def positional_embedding_type(self) -> PositionalEmbeddingType: return PositionalEmbeddingType.rotate_half - def make_attn_layer(self) -> None: - """ - Builds the attention layer for the model. This sets the `self.attn` attribute. - """ - softmax_scale = 1.0 / (self.head_size**0.5) - - rotary_config = RotateHalfConfig(theta_base=self._config.rope_theta) - - attn_config = DSSelfAttentionConfig(max_tokens=self._engine_config.state_manager.max_ragged_batch_size, - n_heads_q=self.n_heads_q_local, - n_heads_kv=self.n_heads_kv_local, - head_size=self.head_size, - max_sequences=self._engine_config.state_manager.max_ragged_sequence_count, - scale_factor=softmax_scale, - input_dtype=self.activation_dtype, - output_dtype=self.activation_dtype, - positional_embedding_type=self.positional_embedding_type, - positional_embedding_config=rotary_config) - - self.attn = heuristics.instantiate_attention(attn_config, self._engine_config) + @property + def positional_embedding_config(self) -> Optional[RotateHalfConfig]: + return RotateHalfConfig(theta_base=self._config.rope_theta) """ Forward implementations diff --git a/deepspeed/inference/v2/model_implementations/mixtral/model.py b/deepspeed/inference/v2/model_implementations/mixtral/model.py index d0cae0ff307b..878cd8e31cec 100644 --- a/deepspeed/inference/v2/model_implementations/mixtral/model.py +++ b/deepspeed/inference/v2/model_implementations/mixtral/model.py @@ -15,7 +15,6 @@ from ...model_implementations import * from ...modules.configs import * from ...modules.interfaces import * -from ...modules import heuristics from ...ragged import RaggedBatchWrapper from ..inference_model_base import ( DSModelImplementationConfig, @@ -110,6 +109,13 @@ def norm_type(self) -> NormTypeEnum: def positional_embedding_type(self) -> PositionalEmbeddingType: return PositionalEmbeddingType.rotate_half + @property + def positional_embedding_config(self) -> Optional[RotateHalfConfig]: + """ + The positional embedding configuration for the model. + """ + return RotateHalfConfig(theta_base=self._config.rope_theta) + """ Inherited from `DSMoETransformerModelBase` """ @@ -161,27 +167,6 @@ def __init__(self, config: DSModelImplementationConfig, engine_config: RaggedInf self.make_unembedding_layer() self._kv_cache_config = None - def make_attn_layer(self) -> None: - """ - Builds the attention layer for the model. This sets the `self.attn` attribute. - """ - softmax_scale = 1.0 / (self.head_size**0.5) - - rotary_config = RotateHalfConfig(theta_base=self._config.rope_theta) - - attn_config = DSSelfAttentionConfig(max_tokens=self._engine_config.state_manager.max_ragged_batch_size, - n_heads_q=self.n_heads_q_local, - n_heads_kv=self.n_heads_kv_local, - head_size=self.head_size, - max_sequences=self._engine_config.state_manager.max_ragged_sequence_count, - scale_factor=softmax_scale, - input_dtype=self.activation_dtype, - output_dtype=self.activation_dtype, - positional_embedding_type=self.positional_embedding_type, - positional_embedding_config=rotary_config) - - self.attn = heuristics.instantiate_attention(attn_config, self._engine_config) - def _forward_embed(self, ragged_batch: RaggedBatchWrapper) -> torch.Tensor: """ Performs the embedding lookup prior to running the transformer of the model. diff --git a/deepspeed/inference/v2/model_implementations/opt/model.py b/deepspeed/inference/v2/model_implementations/opt/model.py index 8bad12f10475..adf011d8f1a7 100644 --- a/deepspeed/inference/v2/model_implementations/opt/model.py +++ b/deepspeed/inference/v2/model_implementations/opt/model.py @@ -12,11 +12,7 @@ from ...allocator import empty_from from ...inference_utils import ActivationType, DtypeEnum from ...model_implementations import * -from ...modules.configs import ( - DSEmbeddingsConfig, - NormTypeEnum, - PositionalEmbeddingType, -) +from ...modules.configs import * from ...ragged import RaggedBatchWrapper from .container import OPTNonTransformerContainer, OPTTransformerContainer @@ -94,6 +90,10 @@ def norm_type(self) -> NormTypeEnum: def positional_embedding_type(self) -> PositionalEmbeddingType: return PositionalEmbeddingType.none + @property + def positional_embedding_config(self) -> Optional[RotateHalfConfig]: + return None + """ Overrides of ``DSTransformerModelBase`` methods """ diff --git a/deepspeed/inference/v2/model_implementations/phi/model.py b/deepspeed/inference/v2/model_implementations/phi/model.py index a95b12bb119f..0127c87c7bff 100644 --- a/deepspeed/inference/v2/model_implementations/phi/model.py +++ b/deepspeed/inference/v2/model_implementations/phi/model.py @@ -10,17 +10,11 @@ import deepspeed.comm as dist from ...allocator import empty_from -from ...config_v2 import RaggedInferenceEngineConfig from ...inference_utils import ActivationType, DtypeEnum from .. import * from ...modules.configs import * from ...modules.interfaces import * -from ...modules import heuristics from ...ragged import RaggedBatchWrapper -from ..inference_model_base import ( - DSModelImplementationConfig, - MPType, -) from .containers import PhiNonTransformerContainer, PhiTransformerContainer @@ -101,60 +95,9 @@ def norm_type(self) -> NormTypeEnum: def positional_embedding_type(self) -> PositionalEmbeddingType: return PositionalEmbeddingType.rotate_half - """ - Model implementation - """ - - def __init__(self, config: DSModelImplementationConfig, engine_config: RaggedInferenceEngineConfig, - base_mp_group: MPType) -> None: - """ - Base implementation for initialization. By default, this will initialize - the traditional components of a transformer model: - - Embedding - - QKV projection - - Self attention - - Attention output projection - - Feed forward network - - Normalization - - Unembedding - - Arguments: - config (DSModelImplementationConfig): Model-specific configuration. No assumptions - should be made about this config that are not closely tied to the specific - model implementation. - engine_config (RaggedInferenceEngineConfig): Engine configuration. - base_mp_group (MPType): Base communication group for Tensor-parallel inference. - """ - super().__init__(config, engine_config, base_mp_group) - - self.make_norm_layer() - self.make_qkv_layer() - self.make_attn_layer() - self.make_attn_out_layer() - self.make_embedding_layer() - self.make_unembedding_layer() - self._kv_cache_config = None - - def make_attn_layer(self) -> None: - """ - Builds the attention layer for the model. This sets the `self.attn` attribute. - """ - softmax_scale = 1.0 / (self.head_size**0.5) - - rotary_config = RotateHalfConfig(rotate_dim=self._config.rotary_dim) - - attn_config = DSSelfAttentionConfig(max_tokens=self._engine_config.state_manager.max_ragged_batch_size, - n_heads_q=self.n_heads_q_local, - n_heads_kv=self.n_heads_kv_local, - head_size=self.head_size, - max_sequences=self._engine_config.state_manager.max_ragged_sequence_count, - scale_factor=softmax_scale, - input_dtype=self.activation_dtype, - output_dtype=self.activation_dtype, - positional_embedding_type=self.positional_embedding_type, - positional_embedding_config=rotary_config) - - self.attn = heuristics.instantiate_attention(attn_config, self._engine_config) + @property + def positional_embedding_config(self) -> Optional[RotateHalfConfig]: + return RotateHalfConfig(rotate_dim=self._config.rotary_dim) """ Forward implementations diff --git a/deepspeed/inference/v2/modules/implementations/attention/dense_blocked_attention.py b/deepspeed/inference/v2/modules/implementations/attention/dense_blocked_attention.py index 5f41b5ff6e13..3515b3c2b690 100644 --- a/deepspeed/inference/v2/modules/implementations/attention/dense_blocked_attention.py +++ b/deepspeed/inference/v2/modules/implementations/attention/dense_blocked_attention.py @@ -87,6 +87,8 @@ def __init__(self, config: DSSelfAttentionConfig, implementation_config: Dict[st self._config.n_heads_kv, self._config.input_dtype) elif embed_type == PositionalEmbeddingType.rotate_half: rotary_config = config.positional_embedding_config + assert rotary_config is not None, "Rotary config must be provided if using rotate_half as Positional Embedding Type." + if rotary_config.use_trained_freqs: # Theta and rotary dim are effectively embedded into either the values (theta) or the shape (rotary_dim) # of the trained_freqs tensor. From acdf570a1bc8dbdf5cd985788ee83d3adff0acbb Mon Sep 17 00:00:00 2001 From: Logan Adams <114770087+loadams@users.noreply.github.com> Date: Wed, 10 Jan 2024 14:39:22 -0800 Subject: [PATCH 077/754] Pin to triton 2.1.0 to fix issues with nv-inference (#4929) --- requirements/requirements-triton.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/requirements/requirements-triton.txt b/requirements/requirements-triton.txt index f43a7e19e242..3b382f83f2ae 100644 --- a/requirements/requirements-triton.txt +++ b/requirements/requirements-triton.txt @@ -1 +1 @@ -triton>=2.1.0 +triton==2.1.0 From ed10cc738232efefb13cd974b6eae4cee64ac94b Mon Sep 17 00:00:00 2001 From: Peng Zou Date: Thu, 11 Jan 2024 07:05:27 +0800 Subject: [PATCH 078/754] Add support of Qwen models (7b, 14b, 72b) to DeepSpeed-FastGen (#4913) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit This PR adds support for Qwen models 7b, 14b and 72b. ### Test Code for mii pipeline: ```python from mii import pipeline pipe = pipeline("Qwen/Qwen-7B-Chat") pipe.tokenizer.tokenizer.eos_token_id = 151643 output = pipe(["DeepSpeed is"], max_new_tokens=128, do_sample=False) print(output) ``` for huggingface: ```python from transformers import AutoModelForCausalLM, AutoTokenizer from transformers.generation import GenerationConfig tokenizer = AutoTokenizer.from_pretrained("Qwen/Qwen-7B-Chat", trust_remote_code=True) model = AutoModelForCausalLM.from_pretrained("Qwen/Qwen-7B-Chat", device_map="auto", trust_remote_code=True, fp16=True).eval() inputs = tokenizer('DeepSpeed is', return_tensors='pt') inputs = inputs.to(model.device) pred = model.generate(**inputs, max_new_tokens=128, do_sample=False, repetition_penalty=1.0) test = tokenizer.decode(pred.cpu()[0], skip_special_tokens=False) print(test) ``` ### Qwen 7B Huggingface output with prompt "DeepSpeed is": ``` a high-performance, low-latency database management system designed for real-time analytics and machine learning applications. It is built on top of Apache Arrow, a columnar in-memory data format, and is optimized for processing large volumes of data in parallel.\n\nDeepSpeed offers several key features that make it well-suited for real-time analytics and machine learning applications:\n\n1. High Performance: DeepSpeed is designed to deliver high performance by leveraging parallel processing and optimized data structures. It can process large volumes of data in real-time, making it ideal for applications that require real-time analytics.\n\n2. Low Latency: DeepSpeed is designed to minimize latency by ``` DeepSpeed-FastGen output with prompt "DeepSpeed is": ``` a high-performance, low-latency database management system designed for real-time analytics and machine learning applications. It is built on top of Apache Arrow, a columnar in-memory data format, and is optimized for processing large volumes of data in parallel.\n\nDeepSpeed offers several key features that make it well-suited for real-time analytics and machine learning applications:\n\n1. High Performance: DeepSpeed is designed to deliver high performance by leveraging parallel processing and optimized data structures. It can process large volumes of data in real-time, making it ideal for applications that require real-time analytics.\n\n2. Low Latency: DeepSpeed is designed to minimize latency by ``` ### Qwen 72B Huggingface output with prompt "DeepSpeed is": ``` 是一个开源的深度学习优化库,它提供了多种优化技术,包括模型并行、数据并行、混合并行、ZeRO内存优化等。它可以帮助用户在大规模GPU集群上训练深度学习模型,提高训练速度,减少内存使用。\n在Deepspeed中,模型并行是一种将模型的不同部分分配到不同的GPU上的技术。这样可以处理模型太大,无法放在一个GPU上的问题。数据并行是将数据集分成多个部分,每个部分在不同的GPU上进行训练。混合并行则是结合了模型并行和数据并行,以更有效地利用GPU资源 ``` DeepSpeed-FastGen output with prompt "DeepSpeed is" with 8-way sharding: ``` 是一个开源的深度学习优化库,它提供了多种优化技术,包括模型并行、数据并行、混合并行、ZeRO内存优化等。它可以帮助用户在大规模GPU集群上训练深度学习模型,提高训练速度,减少内存使用。\n在Deepspeed中,模型并行是一种将模型的不同部分分配到不同的GPU上的技术。这样可以处理模型太大,无法放在一个GPU上的问题。数据并行是将数据集分成多个部分,每个部分在不同的GPU上进行训练。混合并行则是结合了模型并行和数据并行,以更有效地利用GPU资源 ``` --------- Co-authored-by: Michael Wyatt Co-authored-by: Logan Adams <114770087+loadams@users.noreply.github.com> --- blogs/deepspeed-fastgen/README.md | 1 + deepspeed/inference/v2/engine_factory.py | 3 + .../v2/model_implementations/__init__.py | 1 + .../v2/model_implementations/qwen/__init__.py | 6 + .../model_implementations/qwen/container.py | 77 ++++++ .../v2/model_implementations/qwen/model.py | 238 ++++++++++++++++++ .../v2/model_implementations/qwen/policy.py | 30 +++ 7 files changed, 356 insertions(+) create mode 100644 deepspeed/inference/v2/model_implementations/qwen/__init__.py create mode 100644 deepspeed/inference/v2/model_implementations/qwen/container.py create mode 100644 deepspeed/inference/v2/model_implementations/qwen/model.py create mode 100644 deepspeed/inference/v2/model_implementations/qwen/policy.py diff --git a/blogs/deepspeed-fastgen/README.md b/blogs/deepspeed-fastgen/README.md index 89fdefd22b0b..e25340619a21 100644 --- a/blogs/deepspeed-fastgen/README.md +++ b/blogs/deepspeed-fastgen/README.md @@ -231,6 +231,7 @@ We currently support the following model architectures in this alpha release of * [Falcon](https://huggingface.co/models?other=falcon) * [Mixtral](https://huggingface.co/models?other=mixtral) * [Phi-2](https://huggingface.co/models?other=phi-msft) +* [Qwen](https://huggingface.co/models?other=qwen) All current models leverage [HuggingFace](https://github.com/huggingface) APIs in our backend to provide both the model weights and the model's corresponding tokenizer. diff --git a/deepspeed/inference/v2/engine_factory.py b/deepspeed/inference/v2/engine_factory.py index a17fa9fefbaa..41cb47729237 100644 --- a/deepspeed/inference/v2/engine_factory.py +++ b/deepspeed/inference/v2/engine_factory.py @@ -20,6 +20,7 @@ MixtralPolicy, FalconPolicy, PhiPolicy, + QwenPolicy, ) from .model_implementations.inference_policy_base import POLICIES, InferenceV2Policy from .model_implementations.flat_model_helpers import make_metadata_filename, ModelMetadata @@ -117,6 +118,8 @@ def build_hf_engine(path: str, policy = FalconPolicy(model_config, checkpoint_engine=checkpoint_engine) elif model_config.model_type == "phi-msft": policy = PhiPolicy(model_config, checkpoint_engine=checkpoint_engine) + elif model_config.model_type == "qwen": + policy = QwenPolicy(model_config, checkpoint_engine=checkpoint_engine) else: raise ValueError(f"Unsupported model type {model_config.model_type}") diff --git a/deepspeed/inference/v2/model_implementations/__init__.py b/deepspeed/inference/v2/model_implementations/__init__.py index a08d966ac6d0..869c4316cdc7 100644 --- a/deepspeed/inference/v2/model_implementations/__init__.py +++ b/deepspeed/inference/v2/model_implementations/__init__.py @@ -15,3 +15,4 @@ from .mixtral import * from .falcon import * from .phi import * +from .qwen import * diff --git a/deepspeed/inference/v2/model_implementations/qwen/__init__.py b/deepspeed/inference/v2/model_implementations/qwen/__init__.py new file mode 100644 index 000000000000..18206048fa29 --- /dev/null +++ b/deepspeed/inference/v2/model_implementations/qwen/__init__.py @@ -0,0 +1,6 @@ +# Copyright (c) Microsoft Corporation. +# SPDX-License-Identifier: Apache-2.0 + +# DeepSpeed Team + +from .policy import QwenPolicy diff --git a/deepspeed/inference/v2/model_implementations/qwen/container.py b/deepspeed/inference/v2/model_implementations/qwen/container.py new file mode 100644 index 000000000000..313de68555b9 --- /dev/null +++ b/deepspeed/inference/v2/model_implementations/qwen/container.py @@ -0,0 +1,77 @@ +# Copyright (c) Microsoft Corporation. +# SPDX-License-Identifier: Apache-2.0 + +# DeepSpeed Team + +# Create a container object to save model-specific tensors using the policy file above. + +from ..common_parameters import * +from ..layer_container_base import LayerContainer +''' + # HF Qwen model looks like this: + +QWenLMHeadModel( + (transformer): QWenModel( + (wte): Embedding(151936, 4096) + (drop): Dropout(p=0.0, inplace=False) + (rotary_emb): RotaryEmbedding() + (h): ModuleList( + (0-31): 32 x QWenBlock( + (ln_1): RMSNorm() + (attn): QWenAttention( + (c_attn): Linear(in_features=4096, out_features=12288, bias=True) + (c_proj): Linear(in_features=4096, out_features=4096, bias=False) + (attn_dropout): Dropout(p=0.0, inplace=False) + ) + (ln_2): RMSNorm() + (mlp): QWenMLP( + (w1): Linear(in_features=4096, out_features=11008, bias=False) + (w2): Linear(in_features=4096, out_features=11008, bias=False) + (c_proj): Linear(in_features=11008, out_features=4096, bias=False) + ) + ) + ) + (ln_f): RMSNorm() + ) + (lm_head): Linear(in_features=4096, out_features=151936, bias=False) +) +''' + + +class QwenTransformerContainer(LayerContainer): + """ + Transformer layer container for the Qwen model. + """ + qkv_w: FusedQKVParameter + qkv_b: FusedQKVParameter + attn_out_w: AttentionOutputParameter + mlp_1_w: GatedMLPParameter + mlp_2_w: MLP2Parameter + attn_norm_gamma: NormParameter + mlp_norm_gamma: NormParameter + + PARAM_MAPPING = { + "attn.c_attn.weight": "qkv_w.params", + "attn.c_attn.bias": "qkv_b.params", + "attn.c_proj.weight": "attn_out_w.params", + "mlp.w1.weight": "mlp_1_w.up_params", + "mlp.w2.weight": "mlp_1_w.gate_params", + "mlp.c_proj.weight": "mlp_2_w.params", + "ln_1.weight": "attn_norm_gamma.params", + "ln_2.weight": "mlp_norm_gamma.params", + } + + +class QwenNonTransformerContainer(LayerContainer): + """ + Non-Transformer layer container for the Qwen model. + """ + word_emb: EmbeddingParameter + word_unembed: UnembedParameter + final_norm: NormParameter + + PARAM_MAPPING = { + "transformer.wte.weight": "word_emb.params", + "transformer.ln_f.weight": "final_norm.params", + "lm_head.weight": "word_unembed.params", + } diff --git a/deepspeed/inference/v2/model_implementations/qwen/model.py b/deepspeed/inference/v2/model_implementations/qwen/model.py new file mode 100644 index 000000000000..c24a4c0ec101 --- /dev/null +++ b/deepspeed/inference/v2/model_implementations/qwen/model.py @@ -0,0 +1,238 @@ +# Copyright (c) Microsoft Corporation. +# SPDX-License-Identifier: Apache-2.0 + +# DeepSpeed Team + +from typing import Iterable, Optional, Tuple + +import torch + +import deepspeed.comm as dist + +from ...allocator import empty_from +from ...inference_utils import ActivationType, DtypeEnum +from .. import * +from ...modules.configs import * +from ...modules.interfaces import * +from ...modules import heuristics +from ...ragged import RaggedBatchWrapper + +from .container import QwenNonTransformerContainer, QwenTransformerContainer + + +class QwenInferenceModel(DSTransformerModelBase): + """ + Inference model implementation for ragged batching for Llama-2 models. + """ + + _non_transformer: Optional[QwenNonTransformerContainer] + """ + Embed + unembed container. Specializing the type annotation. + """ + + _transformer: Optional[Iterable[QwenTransformerContainer]] + """ + Per-layer transformer container. Specializing the type annotation. + """ + """ + Properties ineherited from `DSInferenceModelBase` + """ + + @property + def max_sequence_length(self) -> int: + return self._config.max_seq_length + + """ + Properties ineherited from `DSTransformerModelBase` + """ + + @property + def num_layers(self) -> int: + return self._config.num_hidden_layers + + @property + def model_dim(self) -> int: + return self._config.hidden_size + + @property + def vocab_size(self) -> int: + return self._config.vocab_size + + @property + def head_size(self) -> int: + return self.model_dim // self.n_heads + + @property + def n_heads(self) -> int: + return self._config.num_attention_heads + + @property + def intermediate_dim(self) -> int: + return self._config.intermediate_size // 2 + + @property + def n_heads_kv(self) -> int: + return self._config.hidden_size // self._config.kv_channels + + @property + def activation_dtype(self) -> DtypeEnum: + autoset_precision = self._config.bf16 + self._config.fp16 == 0 + if autoset_precision: + return DtypeEnum.fp16 + if self._config.fp16: + return DtypeEnum.fp16 + elif self._config.bf16: + # TODO(ZonePG): bf16 inference results may be different from huggingface bf16, + # because in rms_norm, Qwen still use float() instead of bf16 + return DtypeEnum.bf16 + else: + raise NotImplementedError("Only fp16 and bf16 are supported") + + @property + def mlp_activation_fn(self) -> ActivationType: + return ActivationType.SiGLU + + @property + def norm_type(self) -> NormTypeEnum: + return NormTypeEnum.RMSNorm + + @property + def positional_embedding_type(self) -> PositionalEmbeddingType: + return PositionalEmbeddingType.rotate_half + + def make_norm_layer(self) -> None: + """ + Instantiates the normalization layer for the model. This sets the `self.norm` attribute. + + TODO(cmikeh2): In the future we'll distinguish between the different norm objects, + but for now we'll just use the same one for all of them. + """ + norm_config = DSNormConfig( + max_tokens=self._engine_config.state_manager.max_ragged_batch_size, + type=self.norm_type, + channels=self.model_dim, + residual_dtype=self.activation_dtype, + input_dtype=self.activation_dtype, + output_dtype=self.activation_dtype, + eps=self._config.layer_norm_epsilon, + ) + + self.norm = heuristics.instantiate_pre_norm(norm_config, self._engine_config) + + def make_attn_layer(self) -> None: + """ + Builds the attention layer for the model. This sets the `self.attn` attribute. + """ + softmax_scale = 1.0 / (self.head_size**0.5) + + rotary_config = RotateHalfConfig(theta_base=self._config.rotary_emb_base) + + attn_config = DSSelfAttentionConfig(max_tokens=self._engine_config.state_manager.max_ragged_batch_size, + n_heads_q=self.n_heads_q_local, + n_heads_kv=self.n_heads_kv_local, + head_size=self.head_size, + max_sequences=self._engine_config.state_manager.max_ragged_sequence_count, + scale_factor=softmax_scale, + input_dtype=self.activation_dtype, + output_dtype=self.activation_dtype, + positional_embedding_type=self.positional_embedding_type, + positional_embedding_config=rotary_config) + + self.attn = heuristics.instantiate_attention(attn_config, self._engine_config) + + """ + Forward implementations + """ + + def _forward_embed(self, ragged_batch: RaggedBatchWrapper) -> torch.Tensor: + """ + Performs the embedding lookup prior to running the transformer of the model. + + Arguments: + ragged_batch (RaggedBatchWrapper): The batch to embed. + + Returns: + torch.Tensor: The embedded batch. + """ + embed = self.embed(ragged_batch, self._non_transformer.word_emb) + + if embed.shape[-1] != self.model_dim: + raise ValueError(f"Embedding output shape {embed.shape} does not match model_dim {self.model_dim}") + + return embed + + def _forward_transformer_layer(self, layer_idx: int, residual: torch.Tensor, hidden_states: torch.Tensor, + ragged_batch_info: RaggedBatchWrapper) -> Tuple[torch.Tensor, torch.Tensor]: + """ + Executes one (slightly offset) layer of the transformer. This implementation does a peak-ahead + optimization to fuse the layer norm of the next layer into the current layer. + + Arguments: + layer_idx (int): The index of the layer to execute. + residual (torch.Tensor): The residual tensor from the previous layer. + hidden_states (torch.Tensor): The hidden states from the previous layer. This is the + hidden states after pre normalization. + ragged_batch_info (RaggedBatchWrapper): The batch metadata. + """ + # TODO(cmikeh2): Distribute ragged_batch_info to all modules + + cur_params = self._transformer[layer_idx] + kv_cache = self.state_manager.get_cache(layer_idx) + + hidden_states = self.qkv(hidden_states, cur_params.qkv_w, b=cur_params.qkv_b) + hidden_states = self.attn(hidden_states, kv_cache, ragged_batch_info) + hidden_states = self.attn_out(hidden_states, cur_params.attn_out_w, b=None) + + if self.tp_size > 1: + dist.all_reduce(hidden_states, group=self._base_mp_group) + + residual, hidden_states = self.norm(residual, hidden_states, cur_params.mlp_norm_gamma, beta=None) + + # Should be configurable in the future + hidden_states = self.mlp_1(hidden_states, cur_params.mlp_1_w, b=None) + hidden_states = self.mlp_2(hidden_states, cur_params.mlp_2_w, b=None) + + if self.tp_size > 1: + dist.all_reduce(hidden_states, group=self._base_mp_group) + + if layer_idx != self.num_layers - 1: + next_params = self._transformer[layer_idx + 1] + residual, hidden_states = self.norm(residual, hidden_states, next_params.attn_norm_gamma, beta=None) + else: + # On last layer, we just need to perform the residual add. Adding into the residual + # here is safe. + residual.add_(hidden_states) + + return residual, hidden_states + + def _forward_unembed(self, hidden_states: torch.Tensor, ragged_batch_info: RaggedBatchWrapper) -> torch.Tensor: + """ + Performs unembedding of the hidden states to logits. This will only sample the final + token of each sequence. + """ + logits = self.unembed(hidden_states, self._non_transformer.word_unembed, ragged_batch_info, + self._non_transformer.final_norm) + + if self.tp_size > 1: + comm_buffer = empty_from(self._comm_logits, (self.tp_size, logits.shape[0], logits.shape[1])) + full_logits = empty_from(self._return_logits, (logits.shape[0], self.vocab_size)) + + dist.all_gather_into_tensor(comm_buffer, logits, group=self._base_mp_group) + + full_logits.copy_(comm_buffer.permute(1, 0, 2).reshape(logits.shape[0], self.vocab_size)) + + return full_logits + else: + return logits + + def forward(self, wrapped_batch: RaggedBatchWrapper) -> torch.Tensor: + + residual = self._forward_embed(wrapped_batch) + + residual, hidden_states = self.norm(residual, None, self._transformer[0].attn_norm_gamma, beta=None) + + for layer_idx in range(self.num_layers): + residual, hidden_states = self._forward_transformer_layer(layer_idx, residual, hidden_states, + wrapped_batch) + + return self._forward_unembed(residual, wrapped_batch) diff --git a/deepspeed/inference/v2/model_implementations/qwen/policy.py b/deepspeed/inference/v2/model_implementations/qwen/policy.py new file mode 100644 index 000000000000..a9263f553621 --- /dev/null +++ b/deepspeed/inference/v2/model_implementations/qwen/policy.py @@ -0,0 +1,30 @@ +# Copyright (c) Microsoft Corporation. +# SPDX-License-Identifier: Apache-2.0 + +# DeepSpeed Team + +from typing import Any + +from ...config_v2 import RaggedInferenceEngineConfig +from ..inference_policy_base import ContainerMap, InferenceV2Policy +from .container import QwenNonTransformerContainer, QwenTransformerContainer +from .model import QwenInferenceModel + + +class QwenPolicy(InferenceV2Policy): + + def instantiate_model(self, engine_config: RaggedInferenceEngineConfig, mp_group: Any) -> QwenInferenceModel: + return QwenInferenceModel(config=self._model_config, engine_config=engine_config, base_mp_group=mp_group) + + def build_container_map(self) -> ContainerMap: + map = ContainerMap() + + transformer_containers = [QwenTransformerContainer(self.model) for _ in range(self.model.num_layers)] + + map.set_transformer_params(['transformer.h'], transformer_containers) + + map.set_non_transformer_params(QwenNonTransformerContainer(self.model)) + + map.set_unmapped_params(['transformer.rotary_emb.inv_freq']) + + return map From ade98365fc0f7521c3dee20dfd33637a17ceab26 Mon Sep 17 00:00:00 2001 From: Nadav Elyahu <88962733+nelyahu@users.noreply.github.com> Date: Thu, 11 Jan 2024 01:22:08 +0200 Subject: [PATCH 079/754] DeepSpeedZeroOptimizer: refactor bit16 flattening to support more accelerators (#4833) The approach till today use the practice where the torch.nn.parameter data is being replaced with a new cpu data storage, to offload device memory. All params are being flatenned on the host and moved to the device. in some accelerators torch.nn.parameter which is a device parameter cannot be assigned with a cpu storage. This PR copy the param data into a new cpu tensor, and shrinks the device storage. Later when the flat buffer is moved to the device param.data will be a view to the flat buffer. --------- Co-authored-by: Olatunji Ruwase Co-authored-by: Michael Wyatt --- deepspeed/runtime/zero/stage_1_and_2.py | 50 ++++++++++++++++--------- 1 file changed, 33 insertions(+), 17 deletions(-) diff --git a/deepspeed/runtime/zero/stage_1_and_2.py b/deepspeed/runtime/zero/stage_1_and_2.py index 2eec7cbc96a1..c24bc16cdbfe 100755 --- a/deepspeed/runtime/zero/stage_1_and_2.py +++ b/deepspeed/runtime/zero/stage_1_and_2.py @@ -75,11 +75,6 @@ def get_alignment_padding(tensor_list, alignment): return (alignment - remainder) if remainder else remainder -def move_to_cpu(tensor_list): - for tensor in tensor_list: - tensor.data = tensor.data.cpu() - - def print_rank_msg(msg): print(f"rank {dist.get_rank()} - {msg}") @@ -294,6 +289,7 @@ def __init__(self, self.round_robin_bit16_groups = [] self.round_robin_bit16_indices = [] + self.round_robin_bit16_meta = [] # Use different parallel to do all_to_all_reduce related things # padding on each partition for alignment purposes @@ -316,7 +312,14 @@ def __init__(self, see_memory_usage(f"Before moving param group {i} to CPU") # move all the parameters to cpu to free up GPU space for creating flat buffer - move_to_cpu(self.bit16_groups[i]) + + # Create temp CPU param copies, free accelerator tensors + orig_group_numel = 0 + for param in self.bit16_groups[i]: + orig_group_numel += param.numel() + param.cpu_data = param.data.cpu() + param.data = torch.empty(1).to(param.device) + empty_cache() see_memory_usage(f"After moving param group {i} to CPU", force=False) @@ -334,18 +337,31 @@ def __init__(self, self.round_robin_bit16_groups.append(round_robin_tensors) self.round_robin_bit16_indices.append(round_robin_indices) - # create flat buffer in CPU and move to GPU - self.bit16_groups_flat.append( - self.flatten_dense_tensors_aligned( - self.round_robin_bit16_groups[i], - self.nccl_start_alignment_factor * dist.get_world_size(group=self.real_dp_process_group[i])).to( - get_accelerator().current_device_name())) + # Create meta tensors list, ordered according to round_robin_tensors + meta_tensors = [] + for param in round_robin_tensors: + meta_tensors.append(torch.zeros_like(param.cpu_data, device="meta")) + self.round_robin_bit16_meta.append(meta_tensors) + + # create flat buffer in CPU + flattened_buffer = self.flatten_dense_tensors_aligned( + self.round_robin_bit16_groups[i], + self.nccl_start_alignment_factor * dist.get_world_size(group=self.real_dp_process_group[i]), + use_cpu_data=True) + + # free temp CPU params + for param in self.bit16_groups[i]: + del param.cpu_data + + # Move CPU flat tensor to the accelerator memory. + self.bit16_groups_flat.append(flattened_buffer.to(get_accelerator().current_device_name())) + del flattened_buffer + see_memory_usage(f"After flattening and moving param group {i} to GPU", force=False) # Record padding required for alignment if partition_id == dist.get_world_size(group=self.real_dp_process_group[i]) - 1: - padding = self.bit16_groups_flat[i].numel() - sum( - [t.numel() for t in self.round_robin_bit16_groups[i]]) + padding = self.bit16_groups_flat[i].numel() - orig_group_numel else: padding = 0 self.groups_padding.append(padding) @@ -596,8 +612,7 @@ def _configure_moe_settings(self): assert self.ep_process_group is not None, "Expert parallel group should be configured with MoE" def _update_model_bit16_weights(self, group_index): - updated_params = self.unflatten(self.bit16_groups_flat[group_index], - self.round_robin_bit16_groups[group_index]) + updated_params = self.unflatten(self.bit16_groups_flat[group_index], self.round_robin_bit16_meta[group_index]) for p, q in zip(self.round_robin_bit16_groups[group_index], updated_params): p.data = q.data @@ -887,7 +902,8 @@ def report_ipg_memory_usage(self, tag, param_elems): ) # create a flat tensor aligned at the alignment boundary - def flatten_dense_tensors_aligned(self, tensor_list, alignment): + def flatten_dense_tensors_aligned(self, tensor_list, alignment, use_cpu_data=False): + tensor_list = [param.cpu_data for param in tensor_list] if use_cpu_data else tensor_list return self.flatten(align_dense_tensors(tensor_list, alignment)) ############### Independent Partition Gradient ######################## From f5179031623442ae19fed8158e3781c81efe088d Mon Sep 17 00:00:00 2001 From: yzhblind <52665042+yzhblind@users.noreply.github.com> Date: Thu, 11 Jan 2024 07:38:53 +0800 Subject: [PATCH 080/754] Fix confusing width in simd_load (#4714) I found the width using in simd_load is different from simd_store. This implementation confuses me. The reason lies in the missing parentheses for the type conversion of x in the SIMD_LOAD2 macro definition, disrupting the intended semantics of width variable. I try to make a quick fix for it. Co-authored-by: Logan Adams <114770087+loadams@users.noreply.github.com> --- csrc/includes/simd.h | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/csrc/includes/simd.h b/csrc/includes/simd.h index f77568be7835..59237b0261c1 100644 --- a/csrc/includes/simd.h +++ b/csrc/includes/simd.h @@ -53,7 +53,7 @@ #define SIMD_WIDTH 8 #define SIMD_LOAD2(x, h) \ - ((h) ? _mm256_cvtph_ps(_mm_loadu_si128((const __m128i*)x)) : _mm256_loadu_ps(x)) + ((h) ? _mm256_cvtph_ps(_mm_loadu_si128((const __m128i*)(x))) : _mm256_loadu_ps(x)) #define SIMD_STORE2(x, d, h) \ ((h) ? _mm_store_ps(x, _mm_castsi128_ps(_mm256_cvtps_ph(d, _MM_FROUND_TO_NEAREST_INT))) \ : _mm256_storeu_ps(x, d)) @@ -80,7 +80,7 @@ inline void simd_store(float* dst, AVX_Data* src, bool half_precision) template inline void simd_load(AVX_Data* dst, float* src, bool half_precision) { - size_t width = (half_precision ? 1 : SIMD_WIDTH); + size_t width = (half_precision ? SIMD_WIDTH / 2 : SIMD_WIDTH); #pragma unroll for (size_t i = 0; i < span; ++i) { dst[i].data = SIMD_LOAD2(src + width * i, half_precision); } } From 6112d08ca79823a41db05c289bd27412808e5d94 Mon Sep 17 00:00:00 2001 From: Michael Wyatt Date: Wed, 10 Jan 2024 15:44:32 -0800 Subject: [PATCH 081/754] Specify permissions for secrets.GITHUB_TOKEN (#4927) Co-authored-by: Logan Adams Co-authored-by: Logan Adams <114770087+loadams@users.noreply.github.com> --- .github/workflows/nv-a6000.yml | 4 ---- .github/workflows/nv-ds-chat.yml | 4 ++++ 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/.github/workflows/nv-a6000.yml b/.github/workflows/nv-a6000.yml index 14bee75df334..c4e7d0a8fe6a 100644 --- a/.github/workflows/nv-a6000.yml +++ b/.github/workflows/nv-a6000.yml @@ -13,10 +13,6 @@ concurrency: group: ${{ github.workflow }}-${{ github.ref }} cancel-in-progress: true -permissions: - contents: read - issues: write - jobs: unit-tests: runs-on: [self-hosted, nvidia, a6000] diff --git a/.github/workflows/nv-ds-chat.yml b/.github/workflows/nv-ds-chat.yml index b53fac36315b..61011a85b92c 100644 --- a/.github/workflows/nv-ds-chat.yml +++ b/.github/workflows/nv-ds-chat.yml @@ -15,6 +15,10 @@ concurrency: group: ${{ github.workflow }}-${{ github.ref }} cancel-in-progress: true +permissions: + contents: read + issues: write + jobs: unit-tests: runs-on: [self-hosted, nvidia, cu116, v100] From f2d4845f07efa431293244cf394dab9c6999b016 Mon Sep 17 00:00:00 2001 From: Ramya Ramineni <62723901+rraminen@users.noreply.github.com> Date: Wed, 10 Jan 2024 17:48:54 -0600 Subject: [PATCH 082/754] Enable quantizer op on ROCm (#4114) This PR is to enable quantizer extension on ROCm cc: @jithunnair-amd --------- Co-authored-by: Logan Adams <114770087+loadams@users.noreply.github.com> --- op_builder/quantizer.py | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/op_builder/quantizer.py b/op_builder/quantizer.py index fd765b743de0..0b5348e5af96 100644 --- a/op_builder/quantizer.py +++ b/op_builder/quantizer.py @@ -32,4 +32,7 @@ def include_paths(self): return ['csrc/includes'] def extra_ldflags(self): - return ['-lcurand'] + if not self.is_rocm_pytorch(): + return ['-lcurand'] + else: + return [] From ee7db48373bffedba9e5f5b570b7e07202b7a875 Mon Sep 17 00:00:00 2001 From: inkcherry Date: Thu, 11 Jan 2024 13:13:22 +0800 Subject: [PATCH 083/754] autoTP for Qwen (#4902) Enabled autoTP for the Qwen model, added some module matching, and adjusted TP-related variables. Verification was conducted on Qwen-1_8B and Qwen-72B-chat. --------- Co-authored-by: Michael Wyatt Co-authored-by: Logan Adams <114770087+loadams@users.noreply.github.com> --- deepspeed/module_inject/auto_tp.py | 11 ++++++----- deepspeed/module_inject/fusedqkv_utils.py | 18 +++++++++++++++--- 2 files changed, 21 insertions(+), 8 deletions(-) diff --git a/deepspeed/module_inject/auto_tp.py b/deepspeed/module_inject/auto_tp.py index 52d77f0b4a7e..52e093de39c5 100644 --- a/deepspeed/module_inject/auto_tp.py +++ b/deepspeed/module_inject/auto_tp.py @@ -277,11 +277,13 @@ def tp_parser(model): module_list = AutoTP.get_module_list(model) assert AutoTP.supported(model), "AutoTP not supported for model. Please use kernel injection since container policy for model exists." \ if AutoTP.kernel_supported(module_list) else "AutoTP not supported for model. Please provide policy." + norm_layer_name_list = ['LayerNorm', 'layer_norm', 'ln_1', 'ln_2'] + #ln_1 , ln_2 for Qwen for module in module_list: for key, submodule in module._modules.items(): if isinstance(submodule, nn.Linear): layer_list = layer_list + ["." + key] - elif isinstance(submodule, nn.LayerNorm) or key == 'LayerNorm' or key == 'layer_norm': + elif isinstance(submodule, nn.LayerNorm) or key in norm_layer_name_list: layer_list = layer_list + ["ln"] else: layer_list = layer_list + AutoTP.get_layers(key, submodule) @@ -348,15 +350,14 @@ def _replace(self, child, name, conv_linear_layer): child.weight.data = child.weight.data.transpose(-1, -2).contiguous() if require_tp_fused_qkvw(name, self.mp_size): - #for detecting fused type - module_str = str(self.module).strip() + #Check and handle fused qkv for TP #The copy is a regular copy, The shape of dst and src is the same data_dc = move( - prepare_tp_fused_qkvw(module_str, child.weight.data, self.mp_size, mp_replace.gpu_index), + prepare_tp_fused_qkvw(self.module, child.weight.data, self.mp_size, mp_replace.gpu_index), get_accelerator().current_device_name()) bias_data_dc = None if child.bias is None else move( - prepare_tp_fused_qkvw(module_str, child.bias.data, self.mp_size, mp_replace.gpu_index), + prepare_tp_fused_qkvw(self.module, child.bias.data, self.mp_size, mp_replace.gpu_index), get_accelerator().current_device_name()) else: data = child.weight.data.split(get_shard_size_list(weight_shape[0], self.mp_size), diff --git a/deepspeed/module_inject/fusedqkv_utils.py b/deepspeed/module_inject/fusedqkv_utils.py index eba5af0cf262..e04c2d4e06ca 100644 --- a/deepspeed/module_inject/fusedqkv_utils.py +++ b/deepspeed/module_inject/fusedqkv_utils.py @@ -27,7 +27,9 @@ def require_tp_fused_qkvw(name, mp_size): return False -def prepare_tp_fused_qkvw(module_str, src, mp_size, gpu_index): +def prepare_tp_fused_qkvw(module, src, mp_size, gpu_index): + + module_str = str(module).strip() if src is None: return fused_type_dict = { @@ -38,6 +40,7 @@ def prepare_tp_fused_qkvw(module_str, src, mp_size, gpu_index): "MptBlock": 'glmtype', "BaichuanLayer": 'glmtype', "DecoderLayer": 'glmtype', + "QWenBlock": 'qwentype', "FalconDecoderLayer": 'bloomtype', "GPTBigCodeBlock": 'bigcodetype', } @@ -76,6 +79,13 @@ def _bloom_type_transpose(input, mp_size): split_fusedqkv = input.split(get_shard_size_list(shape[0], mp_size), dim=0) return split_fusedqkv[gpu_index] + def _qwen_type_transpose(input, mp_size, module): + if not hasattr(module, "_ds_fusedqkv_entered"): + # Adjust splitting absolute value variables + setattr(module, "_ds_fusedqkv_entered", True) + module.attn.split_size = get_shard_size(module.attn.split_size, mp_size) + return _glm_type_transpose(input, mp_size) + def _bigcode_type_transpose(input, mp_size): n_embd = get_n_embd() q = input[:n_embd] @@ -84,7 +94,7 @@ def _bigcode_type_transpose(input, mp_size): split_q = q.split(get_shard_size_list(shape[0], mp_size), dim=0) return torch.cat((split_q[gpu_index], kv), dim=0) - def _transpose_fused_qkvw(src, mp_size, fused_qkv_type=None): + def _transpose_fused_qkvw(src, mp_size, fused_qkv_type=None, module=None): # suppose num_heads=n, q(n)_w means the n-th q head linear weight, the weight format are as following # bloomtype: [q(1)_w,k(1)_w,v(1)_w,q(2)_w,k(2)_w,v(2)_w,...,q(n)_w,k(n)_w,v(n)_w] @@ -97,6 +107,8 @@ def _transpose_fused_qkvw(src, mp_size, fused_qkv_type=None): return _codegen_type_transpose(src, mp_size) elif fused_qkv_type == 'glmtype': return _glm_type_transpose(src, mp_size) + elif fused_qkv_type == 'qwentype': + return _qwen_type_transpose(src, mp_size, module) elif fused_qkv_type == 'bigcodetype': return _bigcode_type_transpose(src, mp_size) @@ -104,7 +116,7 @@ def _transpose_fused_qkvw(src, mp_size, fused_qkv_type=None): for module_name, fused_type in fused_type_dict.items(): if re.search(module_name, module_str): - return _transpose_fused_qkvw(src, mp_size, fused_type) + return _transpose_fused_qkvw(src, mp_size, fused_type, module) warning_once(f"Unrecognized fusedkqv weight type, default to using bloom type," f"please check in prepare_tp_fused_qkvw() to avoid potential calculation errors") return _bloom_type_transpose(src, mp_size) From 473898528c3605a7f091128de5b8f702e5cc58d2 Mon Sep 17 00:00:00 2001 From: Michael Wyatt Date: Thu, 11 Jan 2024 09:19:53 -0800 Subject: [PATCH 084/754] Allow specifying mii branch for nv-a6000 workflow (#4936) --- .github/workflows/nv-a6000.yml | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/.github/workflows/nv-a6000.yml b/.github/workflows/nv-a6000.yml index c4e7d0a8fe6a..a0f52834f959 100644 --- a/.github/workflows/nv-a6000.yml +++ b/.github/workflows/nv-a6000.yml @@ -8,6 +8,12 @@ on: - 'tests/unit/inference/v2/**' - '.github/workflows/nv-a6000.yml' workflow_dispatch: + inputs: + mii_branch: + description: 'DeepSpeed-MII Branch' + required: false + default: 'main' + type: string concurrency: group: ${{ github.workflow }}-${{ github.ref }} @@ -54,7 +60,9 @@ jobs: python -m pytest --color=yes --durations=0 --verbose -rF -m 'inference_v2_ops' unit/ --torch_ver="2.0" --cuda_ver="12" - name: MII unit tests run: | - git clone --depth=1 https://github.com/microsoft/DeepSpeed-MII.git + BRANCH="${{ github.event.inputs.mii_branch }}" + echo "Cloning DeepSpeed-MII branch: $BRANCH" + git clone -b $BRANCH --depth=1 https://github.com/microsoft/DeepSpeed-MII.git cd DeepSpeed-MII pip install .[dev] cd tests From c6b975b84465d1b770f960ba44528631bc91939b Mon Sep 17 00:00:00 2001 From: Michael Wyatt Date: Thu, 11 Jan 2024 10:49:47 -0800 Subject: [PATCH 085/754] Only run MII CI for inference changes (#4939) --- .github/workflows/nv-mii.yml | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/.github/workflows/nv-mii.yml b/.github/workflows/nv-mii.yml index 86de2a3b0bcb..d9e223dde962 100644 --- a/.github/workflows/nv-mii.yml +++ b/.github/workflows/nv-mii.yml @@ -2,9 +2,13 @@ name: nv-mii on: pull_request: - paths-ignore: - - 'docs/**' - - 'blogs/**' + paths: + - '.github/workflows/nv-mii.yml' + - 'requirements/**' + - 'setup.py' + - 'deepspeed/__init__.py' + - 'deepspeed/inference/**' + - '!deepspeed/inference/v2/**' # exclude v2 dir merge_group: branches: [ master ] schedule: From 62004e0d739b4b40c79c4977c7771ee735abe4b4 Mon Sep 17 00:00:00 2001 From: Michael Wyatt Date: Thu, 11 Jan 2024 10:51:15 -0800 Subject: [PATCH 086/754] InfV2 - remove generation config requirement (#4938) Fix for https://github.com/microsoft/DeepSpeed-MII/issues/287 Some HF models do not have a generation config. We should only try to load it if the `max_seq_length` is not present in the model config. Also fix bug introduced in #4936 --- .github/workflows/nv-a6000.yml | 5 ++++- .../inference/v2/checkpoint/huggingface_engine.py | 10 +++++----- 2 files changed, 9 insertions(+), 6 deletions(-) diff --git a/.github/workflows/nv-a6000.yml b/.github/workflows/nv-a6000.yml index a0f52834f959..d7db447f5d26 100644 --- a/.github/workflows/nv-a6000.yml +++ b/.github/workflows/nv-a6000.yml @@ -60,7 +60,10 @@ jobs: python -m pytest --color=yes --durations=0 --verbose -rF -m 'inference_v2_ops' unit/ --torch_ver="2.0" --cuda_ver="12" - name: MII unit tests run: | - BRANCH="${{ github.event.inputs.mii_branch }}" + BRANCH="main" + if [[ ! -z "${{ github.event.inputs.mii_branch }}" ]]; then + BRANCH="${{ github.event.inputs.mii_branch }}" + fi echo "Cloning DeepSpeed-MII branch: $BRANCH" git clone -b $BRANCH --depth=1 https://github.com/microsoft/DeepSpeed-MII.git cd DeepSpeed-MII diff --git a/deepspeed/inference/v2/checkpoint/huggingface_engine.py b/deepspeed/inference/v2/checkpoint/huggingface_engine.py index ca9fb113b15a..bec53a742a84 100644 --- a/deepspeed/inference/v2/checkpoint/huggingface_engine.py +++ b/deepspeed/inference/v2/checkpoint/huggingface_engine.py @@ -22,13 +22,13 @@ def __init__(self, model_name_or_path: str, auth_token: str = None) -> None: self.model_name_or_path = model_name_or_path self.auth_token = auth_token self.model_config = AutoConfig.from_pretrained(self.model_name_or_path) - self.generation_config = GenerationConfig.from_pretrained(self.model_name_or_path) # Define this property here so we can use it in the model implementation if not hasattr(self.model_config, "max_seq_length"): - self.model_config.max_seq_length = self.model_config.max_position_embeddings - else: - self.model_config.max_seq_length = self.generation_config.max_length - + if hasattr(self.model_config, "max_position_embeddings"): + self.model_config.max_seq_length = self.model_config.max_position_embeddings + else: + generation_config = GenerationConfig.from_pretrained(self.model_name_or_path) + self.model_config.max_seq_length = generation_config.max_length self._local_checkpoint_dir = None self._all_ckpt_paths = self._fetch_checkpoint_files() From 13d84b4912492d40b68f4da7bc570e47b54bce2a Mon Sep 17 00:00:00 2001 From: Michael Wyatt Date: Thu, 11 Jan 2024 12:34:16 -0800 Subject: [PATCH 087/754] Cache HF model list for inference tests (#4940) Cache the model list in blob storage so it can be shared across CI runners. Code borrowed from MII: https://github.com/microsoft/DeepSpeed-MII/blob/95d1e1c8890a016f2b5788414754abbbfd4540ae/mii/utils.py#L39 --- tests/unit/inference/test_inference.py | 74 ++++++++++++++++++++------ 1 file changed, 57 insertions(+), 17 deletions(-) diff --git a/tests/unit/inference/test_inference.py b/tests/unit/inference/test_inference.py index 767e1dba23ea..1c482c5781c0 100644 --- a/tests/unit/inference/test_inference.py +++ b/tests/unit/inference/test_inference.py @@ -3,25 +3,33 @@ # DeepSpeed Team -import os -import time -import pickle -import torch import pytest + import itertools +import pickle +import os +import time + +from dataclasses import dataclass +from typing import List + import deepspeed -from deepspeed.git_version_info import torch_info -from unit.common import DistributedTest +import torch + +from huggingface_hub import HfApi from packaging import version as pkg_version -from deepspeed.ops.op_builder import OpBuilder +from torch import nn from transformers import pipeline, AutoTokenizer from transformers.models.t5.modeling_t5 import T5Block from transformers.models.roberta.modeling_roberta import RobertaLayer -from huggingface_hub import HfApi -from deepspeed.model_implementations import DeepSpeedTransformerInference -from torch import nn + from deepspeed.accelerator import get_accelerator +from deepspeed.git_version_info import torch_info +from deepspeed.model_implementations import DeepSpeedTransformerInference from deepspeed.ops.op_builder import InferenceBuilder +from deepspeed.ops.op_builder import OpBuilder + +from unit.common import DistributedTest rocm_version = OpBuilder.installed_rocm_version() if rocm_version != (0, 0): @@ -65,14 +73,46 @@ "text2text-generation", "summarization", "translation" ] + +@dataclass +class ModelInfo: + modelId: str + pipeline_tag: str + tags: List[str] + + +def _hf_model_list() -> List[ModelInfo]: + """ Caches HF model list to avoid repeated API calls """ + + cache_dir = os.getenv("TRANSFORMERS_CACHE", "~/.cache/huggingface") + cache_file_path = os.path.join(cache_dir, "DS_model_cache.pkl") + cache_expiration_seconds = 60 * 60 * 24 # 1 day + + # Load or initialize the cache + model_data = {"cache_time": 0, "model_list": []} + if os.path.isfile(cache_file_path): + with open(cache_file_path, 'rb') as f: + model_data = pickle.load(f) + + current_time = time.time() + + # Update the cache if it has expired + if (model_data["cache_time"] + cache_expiration_seconds) < current_time: + api = HfApi() + model_data["model_list"] = [ + ModelInfo(modelId=m.modelId, pipeline_tag=m.pipeline_tag, tags=m.tags) for m in api.list_models() + ] + model_data["cache_time"] = current_time + + # Save the updated cache + with open(cache_file_path, 'wb') as f: + pickle.dump(model_data, f) + + return model_data["model_list"] + + # Get a list of all models and mapping from task to supported models -try: - with open("hf_models.pkl", "rb") as fp: - _hf_models = pickle.load(fp) -except FileNotFoundError: - _hf_models = list(HfApi().list_models()) - with open("hf_models.pkl", "wb") as fp: - pickle.dump(_hf_models, fp) +_hf_models = _hf_model_list() _hf_model_names = [m.modelId for m in _hf_models] _hf_task_to_models = {task: [m.modelId for m in _hf_models if m.pipeline_tag == task] for task in _test_tasks} From 05cc3462c948c7bc6484818830133393ff83f824 Mon Sep 17 00:00:00 2001 From: Logan Adams <114770087+loadams@users.noreply.github.com> Date: Fri, 12 Jan 2024 09:29:44 -0800 Subject: [PATCH 088/754] Fix docs inconsistency on default value for `ignore_unused_parameters` (#4949) Link to code where the default is set: https://github.com/microsoft/DeepSpeed/blob/13d84b4912492d40b68f4da7bc570e47b54bce2a/deepspeed/runtime/zero/config.py#L242C4-L242C42 --- docs/_pages/config-json.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/_pages/config-json.md b/docs/_pages/config-json.md index e9d7166b05b3..94c8da3b151b 100755 --- a/docs/_pages/config-json.md +++ b/docs/_pages/config-json.md @@ -663,7 +663,7 @@ Configuring the asynchronous I/O module for offloading parameter and optimizer s | Description | Default | | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ------- | -| Unused parameters in modules may be unexpected in static networks, but could be normal in dynamic networks. This controls whether or not training should terminate with an error message when unused parameters are detected. This is set to `False` by default, which means unused parameters are ignored and training continues. Now is just used in stage 2. | `True` | +| Unused parameters in modules may be unexpected in static networks, but could be normal in dynamic networks. This controls whether or not training should terminate with an error message when unused parameters are detected. This is set to `True` by default, which means unused parameters are ignored and training continues. Now is just used in stage 2. | `True` | ### Logging From 43daf413b27ca732255f8e838b30ead5733afc92 Mon Sep 17 00:00:00 2001 From: Michael Wyatt Date: Fri, 12 Jan 2024 13:59:50 -0800 Subject: [PATCH 089/754] Fix bug in CI model caching (#4951) --- tests/unit/inference/test_inference.py | 1 + 1 file changed, 1 insertion(+) diff --git a/tests/unit/inference/test_inference.py b/tests/unit/inference/test_inference.py index 1c482c5781c0..df8fd517b37c 100644 --- a/tests/unit/inference/test_inference.py +++ b/tests/unit/inference/test_inference.py @@ -105,6 +105,7 @@ def _hf_model_list() -> List[ModelInfo]: model_data["cache_time"] = current_time # Save the updated cache + os.makedirs(cache_dir, exist_ok=True) with open(cache_file_path, 'wb') as f: pickle.dump(model_data, f) From 29417ab55f0cc4038e459f055e3c5aeb8878a80c Mon Sep 17 00:00:00 2001 From: Yejing-Lai <55339926+Yejing-Lai@users.noreply.github.com> Date: Sat, 13 Jan 2024 06:56:07 +0800 Subject: [PATCH 090/754] fix uneven issue & add balance autotp (#4697) This PR aims to balance the shard size of each worker as even as possible. 1. We refactor the tp_shard logic that can make AutoTP work when split_shape % num_kv_heads != 0. 2. When num_kv_heads is defined, the attention module relies on it to sharding, but the mlp and lm_head modules can use near even division to get more balance shard. It will get better performance. --------- Co-authored-by: Olatunji Ruwase Co-authored-by: Lev Kurilenko <113481193+lekurile@users.noreply.github.com> --- deepspeed/module_inject/auto_tp.py | 10 +++++----- deepspeed/module_inject/layers.py | 4 ++-- deepspeed/module_inject/tp_shard.py | 23 +++++++++++++---------- 3 files changed, 20 insertions(+), 17 deletions(-) diff --git a/deepspeed/module_inject/auto_tp.py b/deepspeed/module_inject/auto_tp.py index 52e093de39c5..2d2ab0372dfd 100644 --- a/deepspeed/module_inject/auto_tp.py +++ b/deepspeed/module_inject/auto_tp.py @@ -328,7 +328,7 @@ def _replace(self, child, name, conv_linear_layer): if self.conv_linear_layer: child.weight.data = child.weight.data.transpose(-1, -2).contiguous() data = child.weight.data.split(get_shard_size_list( - weight_shape[0] if self.conv_linear_layer else weight_shape[1], self.mp_size), + weight_shape[0] if self.conv_linear_layer else weight_shape[1], self.mp_size, name), dim=1) data_dc = move(data[mp_replace.gpu_index], get_accelerator().current_device_name()).detach() del data @@ -360,14 +360,14 @@ def _replace(self, child, name, conv_linear_layer): prepare_tp_fused_qkvw(self.module, child.bias.data, self.mp_size, mp_replace.gpu_index), get_accelerator().current_device_name()) else: - data = child.weight.data.split(get_shard_size_list(weight_shape[0], self.mp_size), + data = child.weight.data.split(get_shard_size_list(weight_shape[0], self.mp_size, name), dim=1 if self.conv_linear_layer else 0) data_dc = move(data[mp_replace.gpu_index], get_accelerator().current_device_name()).detach() del data if child.bias is not None: bias_data = child.bias.data.split(get_shard_size_list( - weight_shape[1] if self.conv_linear_layer else weight_shape[0], self.mp_size), + weight_shape[1] if self.conv_linear_layer else weight_shape[0], self.mp_size, name), dim=0) bias_data = move(bias_data[mp_replace.gpu_index], get_accelerator().current_device_name()) bias_data_dc = torch.nn.parameter.Parameter(bias_data, requires_grad=False) @@ -386,11 +386,11 @@ def _slice_embedding(self, child, name, conv_linear_layer): if hasattr(child.weight, 'ds_tensor'): data = child.weight.ds_tensor.data.split(get_shard_size_list(child.weight.shape[1], self.mp_size), dim=1) else: - data = child.weight.data.split(get_shard_size_list(child.weight.shape[1], self.mp_size), dim=1) + data = child.weight.data.split(get_shard_size_list(child.weight.shape[1], self.mp_size, name), dim=1) data = data[mp_replace.gpu_index].to(get_accelerator().current_device_name()) data = torch.nn.parameter.Parameter(data, requires_grad=False) - new_embedding = nn.Embedding(child.weight.shape[0], get_shard_size(child.weight.shape[1], self.mp_size)) + new_embedding = nn.Embedding(child.weight.shape[0], get_shard_size(child.weight.shape[1], self.mp_size, name)) new_embedding.weight.data.copy_(data) setattr(child, "replaced", True) return new_embedding diff --git a/deepspeed/module_inject/layers.py b/deepspeed/module_inject/layers.py index 969826ad0289..5fb957faa80c 100644 --- a/deepspeed/module_inject/layers.py +++ b/deepspeed/module_inject/layers.py @@ -48,8 +48,8 @@ def __init__( self.world_size = world_size def forward(self, input): - input_shard_size = get_shard_size(input.shape[-1], self.world_size) - input_shard_offset = sum(get_shard_size_list(input.shape[-1], self.world_size)[0:self.rank]) + input_shard_size = get_shard_size(input.shape[-1], self.world_size, "lm_head") + input_shard_offset = sum(get_shard_size_list(input.shape[-1], self.world_size, "lm_head")[0:self.rank]) output = torch.matmul(input[:, :, input_shard_offset:input_shard_offset + input_shard_size], self.weight.transpose(-1, -2)) if self.mp_group is not None: diff --git a/deepspeed/module_inject/tp_shard.py b/deepspeed/module_inject/tp_shard.py index 259927f70308..79c19b5f1272 100644 --- a/deepspeed/module_inject/tp_shard.py +++ b/deepspeed/module_inject/tp_shard.py @@ -22,19 +22,22 @@ def get_num_kv_heads(): return num_kv_heads -def get_shard_size(total_size, mp_size, rank=None): +def get_shard_size(total_size, mp_size, name=None, rank=None): global num_kv_heads - # When we have num_kv_heads defined, uneven division is possible, otherwise enforce even division - if num_kv_heads is not None: - if rank is None: - rank = dist.get_rank() + last_linear = ["lm_head", "embed_out"] + # When we have num_kv_heads defined, uneven division is possible, otherwise enforce near even division + if rank == None: + rank = dist.get_rank() + if num_kv_heads != None and total_size % num_kv_heads == 0 and "mlp" not in str(name) and str( + name) not in last_linear: my_slices = (num_kv_heads // mp_size) + (1 if rank < (num_kv_heads % mp_size) else 0) return total_size * my_slices // num_kv_heads else: - if total_size % mp_size == 0: - return total_size // mp_size + if total_size >= 64: + grain_size = total_size // 64 + return (grain_size // mp_size + (1 if rank < (grain_size % mp_size) else 0)) * 64 else: - assert False, f"Number of attention heads ({total_size}) must be divisible by mp_size ({mp_size})" + return total_size // mp_size + (1 if rank < (total_size % mp_size) else 0) def get_n_embd(): @@ -42,8 +45,8 @@ def get_n_embd(): return n_embd -def get_shard_size_list(total_size, mp_size): +def get_shard_size_list(total_size, mp_size, name=None): shard_sizes = [] for i in range(mp_size): - shard_sizes.append(get_shard_size(total_size, mp_size, i)) + shard_sizes.append(get_shard_size(total_size, mp_size, name, i)) return shard_sizes From d0b238a3bd49ed8dba0143694e7ad4e4507c21b6 Mon Sep 17 00:00:00 2001 From: Masahiro Tanaka <81312776+tohtana@users.noreply.github.com> Date: Fri, 12 Jan 2024 17:59:16 -0800 Subject: [PATCH 091/754] Optimize preprocess for ragged batching (#4942) This PR improves efficiency of preprocessing for ragged batching. It is not efficient to iterate substituting values to tensor slices or copy/fill calls for small numbers of values. This PR records the values in python lists or primitives and copy them at once. --------- Co-authored-by: Michael Wyatt --- .../inference/v2/ragged/ragged_wrapper.py | 51 ++++++++++++++----- 1 file changed, 38 insertions(+), 13 deletions(-) diff --git a/deepspeed/inference/v2/ragged/ragged_wrapper.py b/deepspeed/inference/v2/ragged/ragged_wrapper.py index 15abd1987aa1..056ecfa2ac40 100644 --- a/deepspeed/inference/v2/ragged/ragged_wrapper.py +++ b/deepspeed/inference/v2/ragged/ragged_wrapper.py @@ -113,12 +113,23 @@ def __init__(self, config: DSStateManagerConfig) -> None: # Default behavior should be no padding self._is_padded = False + self._current_tokens = 0 + self._current_sequences = 0 + self._batch_tokens = [] + self._inflight_seq_descriptors_shadow_buf = [] + self._kv_blocks_ptr_buf = [] + self._token_to_seq_storage_shadow_buf = [] + def clear(self) -> None: """ Clear the ragged batch. This will reset the number of tokens and sequences to 0. """ - self._batch_metadata_storage_shadow[0] = 0 - self._batch_metadata_storage_shadow[1] = 0 + self._current_tokens = 0 + self._current_sequences = 0 + self._batch_tokens = [] + self._inflight_seq_descriptors_shadow_buf = [] + self._kv_blocks_ptr_buf = [] + self._token_to_seq_storage_shadow_buf = [] def insert_sequence(self, seq_descriptor: DSSequenceDescriptor, tokens: torch.Tensor, do_checks=True) -> None: """ @@ -140,18 +151,23 @@ def insert_sequence(self, seq_descriptor: DSSequenceDescriptor, tokens: torch.Te if do_checks and self.current_tokens + seq_tokens > self._config.max_ragged_batch_size: raise RuntimeError(f"Ragged batch is full due to capacity limit: {self._config.max_ragged_batch_size})") - self._input_ids_shadow[self.current_tokens:self.current_tokens + seq_tokens].copy_(tokens) - self._token_to_seq_storage_shadow[self.current_tokens:self.current_tokens + seq_tokens].fill_( - self.current_sequences) + # The values in _inflight_seq_descriptors_shadow_buf, _token_to_seq_storage_shadow_buf, _kv_blocks_ptr_buf, etc., + # are ultimately stored in PyTorch tensors: _inflight_seq_descriptors_shadow, _token_to_seq_storage_shadow, _kv_ptrs_shadow, etc. + # However, we found it inefficient to iterate over and substitute values into tensor slices or to use copy/fill calls for this purpose. + # Therefore, we initially store the values in Python lists or primitive data types and then copy them collectively in the finalize() method, + # instead of updating the tensors directly in each iteration. + self._batch_tokens.append(tokens) + self._inflight_seq_descriptors_shadow_buf.append(self.current_tokens) + self._inflight_seq_descriptors_shadow_buf.append(seq_tokens) + self._inflight_seq_descriptors_shadow_buf.append(seq_descriptor.seen_tokens) + self._inflight_seq_descriptors_shadow_buf.append(0) # alignment - self._inflight_seq_descriptors_shadow[self.current_sequences][0] = self.current_tokens - self._inflight_seq_descriptors_shadow[self.current_sequences][1] = seq_tokens - self._inflight_seq_descriptors_shadow[self.current_sequences][2] = seq_descriptor.seen_tokens + self._token_to_seq_storage_shadow_buf.extend([self.current_sequences] * seq_tokens) - self._kv_ptrs_shadow[self.current_sequences] = seq_descriptor.kv_blocks_ptr + self._kv_blocks_ptr_buf.append(seq_descriptor.kv_blocks_ptr) - self._batch_metadata_storage_shadow[0] += seq_tokens - self._batch_metadata_storage_shadow[1] += 1 + self._current_tokens += seq_tokens + self._current_sequences += 1 @property def tensor_toks(self) -> torch.Tensor: @@ -171,6 +187,15 @@ def finalize(self, padding: Optional[bool] = False) -> None: """ cur_toks = self.current_tokens + # Batch-copy the values recorded in insert_sequence() into PyTorch tensors to enhance efficiency. + self._inflight_seq_descriptors_shadow.flatten()[:len(self._inflight_seq_descriptors_shadow_buf)].copy_( + torch.tensor(self._inflight_seq_descriptors_shadow_buf)) + self._input_ids_shadow[:self.current_tokens].copy_(torch.cat(self._batch_tokens, dim=0)) + self._token_to_seq_storage_shadow[:len(self._token_to_seq_storage_shadow_buf)].copy_( + torch.tensor(self._token_to_seq_storage_shadow_buf)) + self._kv_ptrs_shadow[:len(self._kv_blocks_ptr_buf)].copy_(torch.tensor(self._kv_blocks_ptr_buf)) + self._batch_metadata_storage_shadow.copy_(torch.tensor([cur_toks, self.current_sequences])) + if padding: padded_toks = to_padded(cur_toks) self._input_ids_shadow[cur_toks:padded_toks].fill_(-1) @@ -256,7 +281,7 @@ def current_tokens(self) -> int: The number of tokens in the in-flight ragged batch. This will not trigger synchronization with the device. """ - return self._batch_metadata_storage_shadow[0].item() + return self._current_tokens @property def current_sequences(self) -> int: @@ -264,4 +289,4 @@ def current_sequences(self) -> int: The number of sequences in the in-flight ragged batch. This will not trigger synchronization with the device. """ - return self._batch_metadata_storage_shadow[1].item() + return self._current_sequences From a85b6e472534d2e0b61fe234fae4f6a2332c95bf Mon Sep 17 00:00:00 2001 From: CurryRice233 Date: Sat, 13 Jan 2024 14:16:23 +0800 Subject: [PATCH 092/754] Fix bug where ZeRO2 never uses the reduce method. (#4946) On this PR https://github.com/microsoft/DeepSpeed/pull/4695, the gradient synchronization operation is moved to the `allreduce_bucket` method, but on this method, rank is set to None, and it will never use the reduce method even if `use_multi_rank_bucket_allreduce` is set to False. Co-authored-by: jializheng --- deepspeed/runtime/zero/stage_1_and_2.py | 1 - 1 file changed, 1 deletion(-) diff --git a/deepspeed/runtime/zero/stage_1_and_2.py b/deepspeed/runtime/zero/stage_1_and_2.py index c24bc16cdbfe..703e62d13bef 100755 --- a/deepspeed/runtime/zero/stage_1_and_2.py +++ b/deepspeed/runtime/zero/stage_1_and_2.py @@ -1461,7 +1461,6 @@ def set_none_gradients_to_zero(self, i, partition_id): ######################Reduction Related Methods############################## def allreduce_bucket(self, bucket, rank=None, log=None, divide=True, process_group=None): - rank = None tensor = self.flatten(bucket) process_group = self.dp_process_group if process_group is None else process_group From 7739c0aca47fa8a20682ddb1208c137bffbba2cc Mon Sep 17 00:00:00 2001 From: "Ma, Guokai" Date: Wed, 17 Jan 2024 00:32:35 +0800 Subject: [PATCH 093/754] [docs] Add new autotp supported model in tutorial (#4960) This PR refresh the list of models supported by AutoTP. Newly added models are: - baichuan - codellama - falcon - llama2 - mistral - qwen - starcode --- docs/_tutorials/automatic-tensor-parallelism.md | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/docs/_tutorials/automatic-tensor-parallelism.md b/docs/_tutorials/automatic-tensor-parallelism.md index 5d182b2a4532..aea98ad9b22a 100644 --- a/docs/_tutorials/automatic-tensor-parallelism.md +++ b/docs/_tutorials/automatic-tensor-parallelism.md @@ -121,15 +121,18 @@ The following results were collected using V100 SXM2 32GB GPUs. The following model families have been successfully tested with automatic tensor parallelism. Other models may work but have not been tested yet. - albert +- baichuan - bert - bigbird_pegasus - bloom - camembert - codegen +- codellama - deberta_v2 - electra - ernie - esm +- falcon - glm - gpt-j - gpt-neo @@ -137,8 +140,10 @@ The following model families have been successfully tested with automatic tensor - longt5 - luke - llama +- llama2 - m2m_100 - marian +- mistral - mpt - mvp - nezha @@ -147,10 +152,12 @@ The following model families have been successfully tested with automatic tensor - pegasus - perceiver - plbart +- qwen - reformer - roberta - roformer - splinter +- starcode - t5 - xglm - xlm_roberta From e278076495078cb0450f911dd86d32fbc4f726a2 Mon Sep 17 00:00:00 2001 From: Nadav Elyahu <88962733+nelyahu@users.noreply.github.com> Date: Wed, 17 Jan 2024 20:51:12 +0200 Subject: [PATCH 094/754] Add missing op_builder.hpu component for HPU accelerator (#4963) --- op_builder/hpu/__init__.py | 10 ++++++++++ op_builder/hpu/builder.py | 35 +++++++++++++++++++++++++++++++++++ op_builder/hpu/cpu_adam.py | 33 +++++++++++++++++++++++++++++++++ op_builder/hpu/fused_adam.py | 29 +++++++++++++++++++++++++++++ op_builder/hpu/no_impl.py | 24 ++++++++++++++++++++++++ 5 files changed, 131 insertions(+) create mode 100644 op_builder/hpu/__init__.py create mode 100644 op_builder/hpu/builder.py create mode 100644 op_builder/hpu/cpu_adam.py create mode 100644 op_builder/hpu/fused_adam.py create mode 100644 op_builder/hpu/no_impl.py diff --git a/op_builder/hpu/__init__.py b/op_builder/hpu/__init__.py new file mode 100644 index 000000000000..6527ace087b5 --- /dev/null +++ b/op_builder/hpu/__init__.py @@ -0,0 +1,10 @@ +# Copyright (c) 2023 Habana Labs, Ltd. an Intel Company +# Copyright (c) Microsoft Corporation. +# SPDX-License-Identifier: Apache-2.0 + +# DeepSpeed Team +'''Copyright The Microsoft DeepSpeed Team''' + +from .cpu_adam import CPUAdamBuilder +from .fused_adam import FusedAdamBuilder +from .no_impl import NotImplementedBuilder diff --git a/op_builder/hpu/builder.py b/op_builder/hpu/builder.py new file mode 100644 index 000000000000..5a538c84040c --- /dev/null +++ b/op_builder/hpu/builder.py @@ -0,0 +1,35 @@ +# Copyright (c) 2023 Habana Labs, Ltd. an Intel Company +# Copyright (c) Microsoft Corporation. +# SPDX-License-Identifier: Apache-2.0 + +# DeepSpeed Team + +try: + # is op_builder from deepspeed or a 3p version? this should only succeed if it's deepspeed + # if successful this also means we're doing a local install and not JIT compile path + from op_builder import __deepspeed__ # noqa: F401 # type: ignore + from op_builder.builder import OpBuilder +except ImportError: + from deepspeed.ops.op_builder.builder import OpBuilder + + +class CPUOpBuilder(OpBuilder): + + def builder(self): + from torch.utils.cpp_extension import CppExtension as ExtensionBuilder + + compile_args = {'cxx': self.strip_empty_entries(self.cxx_args())} + + cpp_ext = ExtensionBuilder(name=self.absolute_name(), + sources=self.strip_empty_entries(self.sources()), + include_dirs=self.strip_empty_entries(self.include_paths()), + libraries=self.strip_empty_entries(self.libraries_args()), + extra_compile_args=compile_args) + + return cpp_ext + + def cxx_args(self): + return ['-O3', '-g', '-Wno-reorder'] + + def libraries_args(self): + return [] diff --git a/op_builder/hpu/cpu_adam.py b/op_builder/hpu/cpu_adam.py new file mode 100644 index 000000000000..2f3b7aefe705 --- /dev/null +++ b/op_builder/hpu/cpu_adam.py @@ -0,0 +1,33 @@ +# Copyright (c) 2023 Habana Labs, Ltd. an Intel Company +# Copyright (c) Microsoft Corporation. +# SPDX-License-Identifier: Apache-2.0 + +# DeepSpeed Team + +from .builder import CPUOpBuilder + + +class CPUAdamBuilder(CPUOpBuilder): + BUILD_VAR = "DS_BUILD_CPU_ADAM" + NAME = "cpu_adam" + + def __init__(self): + super().__init__(name=self.NAME) + + def absolute_name(self): + return f'deepspeed.ops.adam.{self.NAME}_op' + + def sources(self): + return ['csrc/adam/cpu_adam.cpp', 'csrc/adam/cpu_adam_impl.cpp'] + + def cxx_args(self): + args = super().cxx_args() + args += ['-DENABLE_BFLOAT16'] + return args + + def libraries_args(self): + args = super().libraries_args() + return args + + def include_paths(self): + return ['csrc/includes'] diff --git a/op_builder/hpu/fused_adam.py b/op_builder/hpu/fused_adam.py new file mode 100644 index 000000000000..d77228317ddb --- /dev/null +++ b/op_builder/hpu/fused_adam.py @@ -0,0 +1,29 @@ +# Copyright (c) 2023 Habana Labs, Ltd. an Intel Company +# Copyright (c) Microsoft Corporation. +# SPDX-License-Identifier: Apache-2.0 + +# DeepSpeed Team + +from .builder import CPUOpBuilder + + +class FusedAdamBuilder(CPUOpBuilder): + BUILD_VAR = "DS_BUILD_FUSED_ADAM" + NAME = "fused_adam" + + def __init__(self): + super().__init__(name=self.NAME) + + def absolute_name(self): + return f'deepspeed.ops.adam.{self.NAME}_op' + + def sources(self): + return ['csrc/cpu/adam/fused_adam.cpp', 'csrc/adam/cpu_adam_impl.cpp'] + + def cxx_args(self): + args = super().cxx_args() + args += ['-DENABLE_BFLOAT16'] + return args + + def include_paths(self): + return ['csrc/includes'] diff --git a/op_builder/hpu/no_impl.py b/op_builder/hpu/no_impl.py new file mode 100644 index 000000000000..140d65b48def --- /dev/null +++ b/op_builder/hpu/no_impl.py @@ -0,0 +1,24 @@ +# Copyright (c) Microsoft Corporation. +# SPDX-License-Identifier: Apache-2.0 + +# DeepSpeed Team + +from .builder import CPUOpBuilder + + +class NotImplementedBuilder(CPUOpBuilder): + BUILD_VAR = "DS_BUILD_NOT_IMPLEMENTED" + NAME = "deepspeed_not_implemented" + + def __init__(self, name=None): + name = self.NAME if name is None else name + super().__init__(name=name) + + def absolute_name(self): + return f'deepspeed.ops.comm.{self.NAME}_op' + + def load(self, verbose=True): + raise ValueError("This op had not been implemented on HPU backend.") + + def sources(self): + return [] From 69a459887f461eddb0e2e62e92edb87836e7cf1e Mon Sep 17 00:00:00 2001 From: Nadav Elyahu <88962733+nelyahu@users.noreply.github.com> Date: Thu, 18 Jan 2024 00:28:35 +0200 Subject: [PATCH 095/754] Stage_1_and_2.py: fix assert for reduce_scatter configurations combinations (#4964) today it does not allow to set reduce_scatter with: - invalid comm data type - gradient_predivide_factor != 1.0 - postscale_gradients is False but reduce scatter is relevant only for Zero2, also reduce_scatter is set to True by default. So setting prescale_gradients=True in json will end up with assert on Zero1. Co-authored-by: Olatunji Ruwase --- deepspeed/runtime/zero/stage_1_and_2.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/deepspeed/runtime/zero/stage_1_and_2.py b/deepspeed/runtime/zero/stage_1_and_2.py index 703e62d13bef..3aa7e6f5e0a2 100755 --- a/deepspeed/runtime/zero/stage_1_and_2.py +++ b/deepspeed/runtime/zero/stage_1_and_2.py @@ -232,7 +232,7 @@ def __init__(self, f"Currently only supported using ZeRO-Offload with DeepSpeedCPUAdam. But current setting is ZeRO-Offload:{self.cpu_offload} and optimizer type {type(self.optimizer)}." \ f"Either disable fp16_master_weights_and_gradients or enable {self.zero_stage_string} Offload with DeepSpeedCPUAdam." - if self.reduce_scatter: + if self.reduce_scatter and self.partition_gradients: valid_reduce_scatter_dtypes = (torch.float16, torch.bfloat16, torch.float32) assert self.communication_data_type in valid_reduce_scatter_dtypes, f"{self.zero_stage_string} supports {valid_reduce_scatter_dtypes} communication_data_type with reduce scatter enabled. Got: '{self.communication_data_type}'" assert self.gradient_predivide_factor == 1.0, f"gradient_predivide_factor != 1.0 is not yet supported with {self.zero_stage_string} with reduce scatter enabled" From 752a50acddaf122f86e9b3f6f60d7d233a76402e Mon Sep 17 00:00:00 2001 From: YiSheng5 Date: Thu, 18 Jan 2024 06:29:45 +0800 Subject: [PATCH 096/754] [MiCS]Add the path to support sequence_data_parallel on MiCS (#4926) This pr is to match the latest update on sequence_data_parallel for MiCS, sequence_data_parallel_group is added in the latest Megatron-DeepSpeed init method https://github.com/microsoft/Megatron-DeepSpeed/blob/main/pretrain_gpt.py#L39, if we want to enable zero3+MiCS on GPT training it will be unsupported, add the path to support the sequence_data_parallel can fix this issue. Co-authored-by: Olatunji Ruwase --- deepspeed/runtime/zero/mics.py | 15 ++++++++++++++- 1 file changed, 14 insertions(+), 1 deletion(-) diff --git a/deepspeed/runtime/zero/mics.py b/deepspeed/runtime/zero/mics.py index 6c7003085685..40d0ea977e43 100755 --- a/deepspeed/runtime/zero/mics.py +++ b/deepspeed/runtime/zero/mics.py @@ -64,6 +64,7 @@ class MiCS_Init(Init): def __init__(self, module=None, data_parallel_group=None, + sequence_data_parallel_group=None, mem_efficient_linear=True, remote_device=None, pin_memory=False, @@ -145,9 +146,21 @@ def __init__(self, if not dist.is_initialized(): dist.init_distributed() assert dist.is_initialized(), "Parameters cannot be scattered without initializing deepspeed.comm" + + if data_parallel_group is None and sequence_data_parallel_group is None: + ds_process_group = dist.get_world_group() + elif sequence_data_parallel_group is not None: + ds_process_group = sequence_data_parallel_group + elif data_parallel_group is not None: + ds_process_group = data_parallel_group + else: # both given + raise ValueError( + "Both 'data_parallel_group' and 'sequence_data_parallel_group' were specified. Please provide only one of these arguments." + ) + self.mics_comm_groups = create_mics_comm_groups( _ds_config.mics_shard_size, - data_parallel_group, + ds_process_group, hierarchical_allgather=_ds_config.mics_hierarchial_params_gather, mpu=mpu) From 1b34a4d3053db1d3e3fac0481aed796fa04b9c76 Mon Sep 17 00:00:00 2001 From: Arash Bakhtiari Date: Wed, 17 Jan 2024 15:20:26 -0800 Subject: [PATCH 097/754] Update the DeepSpeed Phi-2 impl. to work with the HF latest changes (#4950) The latest changes in Huggingface Phi-2 implementation (https://huggingface.co/microsoft/phi-2/commit/cb2f4533604d8b67de604e7df03bfe6f3ca22869#d2h-025836) have broken the DeepSpeed implementation. This PR address the related issues. --------- Co-authored-by: Michael Wyatt --- deepspeed/inference/v2/engine_factory.py | 2 +- .../model_implementations/phi/containers.py | 75 +++++++++---------- .../v2/model_implementations/phi/model.py | 14 ++-- .../v2/model_implementations/phi/policy.py | 2 +- 4 files changed, 43 insertions(+), 50 deletions(-) diff --git a/deepspeed/inference/v2/engine_factory.py b/deepspeed/inference/v2/engine_factory.py index 41cb47729237..9281640f844a 100644 --- a/deepspeed/inference/v2/engine_factory.py +++ b/deepspeed/inference/v2/engine_factory.py @@ -116,7 +116,7 @@ def build_hf_engine(path: str, policy = MixtralPolicy(model_config, checkpoint_engine=checkpoint_engine) elif model_config.model_type == "falcon": policy = FalconPolicy(model_config, checkpoint_engine=checkpoint_engine) - elif model_config.model_type == "phi-msft": + elif model_config.model_type == "phi": policy = PhiPolicy(model_config, checkpoint_engine=checkpoint_engine) elif model_config.model_type == "qwen": policy = QwenPolicy(model_config, checkpoint_engine=checkpoint_engine) diff --git a/deepspeed/inference/v2/model_implementations/phi/containers.py b/deepspeed/inference/v2/model_implementations/phi/containers.py index ab6d0181611c..21f07eb8c99a 100644 --- a/deepspeed/inference/v2/model_implementations/phi/containers.py +++ b/deepspeed/inference/v2/model_implementations/phi/containers.py @@ -11,41 +11,30 @@ # HF Phi-2 model looks like this: PhiForCausalLM( - (transformer): PhiModel( - (embd): Embedding( - (wte): Embedding(51200, 2560) - (drop): Dropout(p=0.0, inplace=False) - ) - (h): ModuleList( - (0-31): 32 x ParallelBlock( - (ln): LayerNorm((2560,), eps=1e-05, elementwise_affine=True) - (resid_dropout): Dropout(p=0.1, inplace=False) - (mixer): MHA( - (rotary_emb): RotaryEmbedding() - (Wqkv): Linear(in_features=2560, out_features=7680, bias=True) - (out_proj): Linear(in_features=2560, out_features=2560, bias=True) - (inner_attn): SelfAttention( - (drop): Dropout(p=0.0, inplace=False) - ) - (inner_cross_attn): CrossAttention( - (drop): Dropout(p=0.0, inplace=False) - ) + (model): PhiModel( + (embed_tokens): Embedding(51200, 2560) + (embed_dropout): Dropout(p=0.0, inplace=False) + (layers): ModuleList( + (0-31): 32 x PhiDecoderLayer( + (self_attn): PhiAttention( + (q_proj): Linear(in_features=2560, out_features=2560, bias=True) + (k_proj): Linear(in_features=2560, out_features=2560, bias=True) + (v_proj): Linear(in_features=2560, out_features=2560, bias=True) + (dense): Linear(in_features=2560, out_features=2560, bias=True) + (rotary_emb): PhiRotaryEmbedding() ) - (mlp): MLP( + (mlp): PhiMLP( + (activation_fn): NewGELUActivation() (fc1): Linear(in_features=2560, out_features=10240, bias=True) (fc2): Linear(in_features=10240, out_features=2560, bias=True) - (act): NewGELUActivation() ) + (input_layernorm): LayerNorm((2560,), eps=1e-05, elementwise_affine=True) + (resid_dropout): Dropout(p=0.1, inplace=False) ) ) + (final_layernorm): LayerNorm((2560,), eps=1e-05, elementwise_affine=True) ) - (lm_head): CausalLMHead( - (ln): LayerNorm((2560,), eps=1e-05, elementwise_affine=True) - (linear): Linear(in_features=2560, out_features=51200, bias=True) - ) - (loss): CausalLMLoss( - (loss_fct): CrossEntropyLoss() - ) + (lm_head): Linear(in_features=2560, out_features=51200, bias=True) ) ''' @@ -54,8 +43,8 @@ class PhiTransformerContainer(LayerContainer): """ Transformer layer container for the Phi model. """ - qkv_w: FusedQKVParameter - qkv_b: FusedQKVParameter + qkv_w: UnfusedQKVParameter + qkv_b: UnfusedQKVParameter attn_out_w: AttentionOutputParameter attn_out_b: AttentionOutputParameter mlp_1_w: MLP1Parameter @@ -66,16 +55,20 @@ class PhiTransformerContainer(LayerContainer): ln_beta: NormParameter PARAM_MAPPING = { - "mixer.Wqkv.weight": "qkv_w.params", - "mixer.Wqkv.bias": "qkv_b.params", - "mixer.out_proj.weight": "attn_out_w.params", - "mixer.out_proj.bias": "attn_out_b.params", + "self_attn.q_proj.weight": "qkv_w.q_params", + "self_attn.k_proj.weight": "qkv_w.k_params", + "self_attn.v_proj.weight": "qkv_w.v_params", + "self_attn.q_proj.bias": "qkv_b.q_params", + "self_attn.k_proj.bias": "qkv_b.k_params", + "self_attn.v_proj.bias": "qkv_b.v_params", + "self_attn.dense.weight": "attn_out_w.params", + "self_attn.dense.bias": "attn_out_b.params", "mlp.fc1.weight": "mlp_1_w.params", "mlp.fc1.bias": "mlp_1_b.params", "mlp.fc2.weight": "mlp_2_w.params", "mlp.fc2.bias": "mlp_2_b.params", - "ln.weight": "ln_gamma.params", - "ln.bias": "ln_beta.params", + "input_layernorm.weight": "ln_gamma.params", + "input_layernorm.bias": "ln_beta.params", } @@ -90,9 +83,9 @@ class PhiNonTransformerContainer(LayerContainer): final_norm_beta: NormParameter PARAM_MAPPING = { - "transformer.embd.wte.weight": "word_emb.params", - "lm_head.ln.weight": "final_norm_gamma.params", - "lm_head.ln.bias": "final_norm_beta.params", - "lm_head.linear.weight": "word_unembed_w.params", - "lm_head.linear.bias": "word_unembed_b.params", + "model.embed_tokens.weight": "word_emb.params", + "model.final_layernorm.weight": "final_norm_gamma.params", + "model.final_layernorm.bias": "final_norm_beta.params", + "lm_head.weight": "word_unembed_w.params", + "lm_head.bias": "word_unembed_b.params", } diff --git a/deepspeed/inference/v2/model_implementations/phi/model.py b/deepspeed/inference/v2/model_implementations/phi/model.py index 0127c87c7bff..2d5826810cb5 100644 --- a/deepspeed/inference/v2/model_implementations/phi/model.py +++ b/deepspeed/inference/v2/model_implementations/phi/model.py @@ -47,11 +47,11 @@ def max_sequence_length(self) -> int: @property def num_layers(self) -> int: - return self._config.n_layer + return self._config.num_hidden_layers @property def model_dim(self) -> int: - return self._config.n_embd + return self._config.hidden_size @property def vocab_size(self) -> int: @@ -63,16 +63,15 @@ def head_size(self) -> int: @property def n_heads(self) -> int: - return self._config.n_head + return self._config.num_attention_heads @property def intermediate_dim(self) -> int: - n_inner = getattr(self._config, "n_inner", None) - return n_inner if n_inner is not None else 4 * self.model_dim + return self._config.intermediate_size @property def n_heads_kv(self) -> int: - return getattr(self._config, "n_head_kv", None) or self.n_heads + return self._config.num_key_value_heads @property def activation_dtype(self) -> DtypeEnum: @@ -97,7 +96,8 @@ def positional_embedding_type(self) -> PositionalEmbeddingType: @property def positional_embedding_config(self) -> Optional[RotateHalfConfig]: - return RotateHalfConfig(rotate_dim=self._config.rotary_dim) + rotary_dim = int(self._config.partial_rotary_factor * self.head_size) + return RotateHalfConfig(rotate_dim=rotary_dim, theta_base=self._config.rope_theta) """ Forward implementations diff --git a/deepspeed/inference/v2/model_implementations/phi/policy.py b/deepspeed/inference/v2/model_implementations/phi/policy.py index 1e9db24022f5..4b081a8e61bd 100644 --- a/deepspeed/inference/v2/model_implementations/phi/policy.py +++ b/deepspeed/inference/v2/model_implementations/phi/policy.py @@ -22,7 +22,7 @@ def build_container_map(self) -> ContainerMap: trans_container_cls = PhiTransformerContainer transformer_containers = [trans_container_cls(self.model) for _ in range(self.model.num_layers)] - map.set_transformer_params(['transformer.h'], transformer_containers) + map.set_transformer_params(['model.layers'], transformer_containers) map.set_non_transformer_params(PhiNonTransformerContainer(self.model)) From 740080c050e700f970deb73acc70615aaadfdecd Mon Sep 17 00:00:00 2001 From: Shukant Pal Date: Wed, 17 Jan 2024 15:20:35 -0800 Subject: [PATCH 098/754] Prevent infinite recursion when DS_ACCELERATOR is set to cuda (#4962) When DS_ACCELERATOR is overriden to CUDA, `get_accelerator` attempts to check if `is_current_accelerator_supported`. But since that calls `get_accelerator` again and `ds_accelerator` has not been initialized, DeepSpeed runs into infinite recursion. ``` elif is_current_accelerator_supported(): File "/usr/local/lib/python3.8/dist-packages/deepspeed/accelerator/real_accelerator.py", line 48, in is_current_accelerator_supported return get_accelerator().device_name() in SUPPORTED_ACCELERATOR_LIST File "/usr/local/lib/python3.8/dist-packages/deepspeed/accelerator/real_accelerator.py", line 101, in get_accelerator elif is_current_accelerator_supported(): File "/usr/local/lib/python3.8/dist-packages/deepspeed/accelerator/real_accelerator.py", line 48, in is_current_accelerator_supported return get_accelerator().device_name() in SUPPORTED_ACCELERATOR_LIST File "/usr/local/lib/python3.8/dist-packages/deepspeed/accelerator/real_accelerator.py", line 101, in get_accelerator elif is_current_accelerator_supported(): File "/usr/local/lib/python3.8/dist-packages/deepspeed/accelerator/real_accelerator.py", line 48, in is_current_accelerator_supported return get_accelerator().device_name() in SUPPORTED_ACCELERATOR_LIST File "/usr/local/lib/python3.8/dist-packages/deepspeed/accelerator/real_accelerator.py", line 101, in get_accelerator elif is_current_accelerator_supported(): File "/usr/local/lib/python3.8/dist-packages/deepspeed/accelerator/real_accelerator.py", line 48, in is_current_accelerator_supported return get_accelerator().device_name() in SUPPORTED_ACCELERATOR_LIST File "/usr/local/lib/python3.8/dist-packages/deepspeed/accelerator/real_accelerator.py", line 59, in get_accelerator if "DS_ACCELERATOR" in os.environ.keys(): File "/usr/lib/python3.8/_collections_abc.py", line 717, in __contains__ return key in self._mapping File "/usr/lib/python3.8/_collections_abc.py", line 666, in __contains__ self[key] File "/usr/lib/python3.8/os.py", line 672, in __getitem__ value = self._data[self.encodekey(key)] RecursionError: maximum recursion depth exceeded ``` This change fixes that by comparing the accelerator directly with the supported list of accelerators. --- accelerator/real_accelerator.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/accelerator/real_accelerator.py b/accelerator/real_accelerator.py index ee421ed4cca7..1090a61681d9 100644 --- a/accelerator/real_accelerator.py +++ b/accelerator/real_accelerator.py @@ -98,7 +98,7 @@ def get_accelerator(): except ImportError as e: raise ValueError( f"HPU_Accelerator requires habana_frameworks.torch.hpu, which is not installed on this system.") - elif is_current_accelerator_supported(): + elif accelerator_name not in SUPPORTED_ACCELERATOR_LIST: raise ValueError(f'DS_ACCELERATOR must be one of {SUPPORTED_ACCELERATOR_LIST}. ' f'Value "{accelerator_name}" is not supported') ds_set_method = "override" From 870ae041d42190be8139afc12bef51d6ed7719f3 Mon Sep 17 00:00:00 2001 From: Hailey Schoelkopf <65563625+haileyschoelkopf@users.noreply.github.com> Date: Wed, 17 Jan 2024 19:43:59 -0500 Subject: [PATCH 099/754] Fixes for training models with bf16 + freshly initialized optimizer via `load_module_only` (#4141) This PR makes some fixes to the case where we want to resume training from a DeepSpeed ZeRO checkpoint and initialize a new optimizer, while not using the old optimizer in the checkpoint or relying on its existence at all. in this situation, despite passing `load_module_only=True` and `load_optimizer_states=False` to `load_checkpoint()`, the previous behavior was that: - `self._load_zero_checkpoint` would still be called, which attempts to load from the (in this case, nonexistent) checkpoint files. This PR stops this function from being called if using `load_module_only=True` and `load_optimizer_states=False`. Alternatively, calling this function may be alright if `"load_from_fp32_weights": true` is set in the DeepSpeed ZeRO config (reference: https://github.com/microsoft/DeepSpeed/blob/ff7d5275f2aa916cb5f320e0d817154e96f9cdb6/deepspeed/runtime/engine.py#L733) but this parameter does not seem to be documented in the docs for ZeRO config dicts. - in `_load_checkpoint`, the following codeblock: ``` if self.optimizer is not None and self.fp16_enabled(): self.optimizer.refresh_fp32_params() ``` results in `self.optimizer.refresh_fp32_params()` being called only if using FP16. As a result, the FP32 optimizer state is never initialized from the 16-bit model weights. This PR removes the fp16-specific condition. Previously reported in: https://github.com/EleutherAI/gpt-neox/issues/947 https://github.com/EleutherAI/gpt-neox/issues/843 Should also close: https://github.com/microsoft/DeepSpeed/issues/4017 Fixes: #4944 and #4017 This caused problems for a freshly-converted LLama checkpoint, which did not contain optimizer states, when trying to train with this model as initialization. I have confirmed the following fixes prevent this behavior. cc @Quentin-Anthony @zhangir-azerbayev --------- Co-authored-by: Olatunji Ruwase Co-authored-by: Logan Adams <114770087+loadams@users.noreply.github.com> --- deepspeed/runtime/engine.py | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/deepspeed/runtime/engine.py b/deepspeed/runtime/engine.py index 00346317ebf1..9c0da4c2d406 100644 --- a/deepspeed/runtime/engine.py +++ b/deepspeed/runtime/engine.py @@ -2745,10 +2745,12 @@ def load_checkpoint(self, load_module_only=load_module_only, custom_load_fn=custom_load_fn) - load_zero_checkpoint = load_optimizer_states and load_path is not None and (self.zero_optimization() - or self.bfloat16_enabled()) + load_zero_checkpoint = load_path is not None and (self.zero_optimization() or self.bfloat16_enabled()) if load_zero_checkpoint: - success = self._load_zero_checkpoint(load_dir, tag, load_optimizer_states=load_optimizer_states) + if load_optimizer_states and not load_module_only: + success = self._load_zero_checkpoint(load_dir, tag, load_optimizer_states=load_optimizer_states) + else: + success = False if not success: self.optimizer._restore_from_bit16_weights() @@ -2830,7 +2832,7 @@ def _load_checkpoint(self, optim_checkpoint = None if load_module_only: deepspeed_states = ['module'] - if self.optimizer is not None and self.fp16_enabled(): + if self.optimizer is not None: self.optimizer.refresh_fp32_params() else: has_zero_optimizer_state = self.zero_optimization() or self.bfloat16_enabled() From 3110c38852ceb8d531f9577cbf6b74db5cbe5838 Mon Sep 17 00:00:00 2001 From: inkcherry Date: Fri, 19 Jan 2024 01:42:18 +0800 Subject: [PATCH 100/754] params partition for skip_init (#4722) Some models use ```skip_init``` to initialize weights. ```skip_init``` first initializes on a meta device in ```__init__``` of a module and then uses ```to_empty()```. This conflicts with the deepspeed hook ```module.__init__``` mechanism. it's necessary to wait for ```skip_init``` to finish before executing ```_post_init_method```. However, the ```from ... import skip_init``` behavior typically occurs outside the context, there seems to be no good way to directly hook into ```skip_init```. Hence, the approach here is to delay the execution of ```_post_init_method``` to resolve this issue. Known affected models include HuggingFace models like chatglm2 and chatglm3." --------- Co-authored-by: Logan Adams <114770087+loadams@users.noreply.github.com> Co-authored-by: Olatunji Ruwase Co-authored-by: Masahiro Tanaka <81312776+tohtana@users.noreply.github.com> --- .../runtime/zero/partition_parameters.py | 60 ++++++++++++++- tests/unit/runtime/zero/test_zero.py | 77 +++++++++++++++++++ 2 files changed, 134 insertions(+), 3 deletions(-) diff --git a/deepspeed/runtime/zero/partition_parameters.py b/deepspeed/runtime/zero/partition_parameters.py index 992dcd446ad6..030a050b88e2 100755 --- a/deepspeed/runtime/zero/partition_parameters.py +++ b/deepspeed/runtime/zero/partition_parameters.py @@ -312,6 +312,7 @@ def __init__(self, enabled=True, mem_efficient_linear=True, ds_config=None, dtyp torch.half, torch.bfloat16, torch.float ], f"Invalid data type {self.dtype}, allowed values are [torch.half, torch.bfloat16, torch.float]" self.wrapped_cls = set() + self.skip_init_depth = 0 self.quantized_initialization = None if ds_config is not None and ds_config.weight_quantization_config and ds_config.weight_quantization_config.quantized_initialization: @@ -435,6 +436,51 @@ def wrapped_apply(module: Module, fn_to_apply: Callable) -> None: return wrapped_apply + def hook_for_skip_init(module): + # this function is intended for handling the logic of torch.nn.utils.skip_init + # skip_init:module_cls(*args, **kwargs).to_empty(device=final_device), where kwargs['device']='meta' + # the function call occurs between module_cls(*args, **kwargs) and to_empty(device=final_device). + def partition_after_empty_init(f): + + @functools.wraps(f) + def wrapper(module, *args, **kwargs): + _module = f(module, *args, **kwargs) + # here is the post-hook for module.apply(empty_like...) + # after module.apply(empty_like...), the module has completed its empty init on real device + # since skip_init won't involve any computations or weight adjustments, we can directly utilize post_init + self._post_init_method(_module) + return _module + + return wrapper + + def post_wrapper_to_empty(f): + # append some wrapper restoration after to_empty() call + @functools.wraps(f) + def wrapper(*args, **kwargs): + res = f(*args, **kwargs) + # restore _apply hook + for subclass in get_all_subclasses(torch.nn.modules.module.Module): + _disable_class_apply(subclass) + # self restore + module.to_empty = f + return res + + return wrapper + + def _enable_class_apply(cls): + cls._old_apply_of_skip_init_hook = cls._apply + cls._apply = partition_after_empty_init(cls._apply) + + def _disable_class_apply(cls): + cls._apply = cls._old_apply_of_skip_init_hook + + # add hooks for to_empty: apply_(empty_like) + for subclass in get_all_subclasses(torch.nn.modules.module.Module): + _enable_class_apply(subclass) + + # add a restore hook when exiting skip_init + module.to_empty = post_wrapper_to_empty(module.to_empty) + def partition_after(f): @functools.wraps(f) @@ -456,16 +502,25 @@ def wrapper(module, *args, **kwargs): is_child_module = True setattr(module, "_ds_child_entered", True) - f(module, *args, **kwargs) + init_on_meta = 'device' in kwargs and kwargs['device'] == 'meta' + if init_on_meta: + self.skip_init_depth += 1 + f(module, *args, **kwargs) + if init_on_meta and self.skip_init_depth == 1: + # check and handle the logic of empty_init + hook_for_skip_init(module) if is_child_module: # child's __init__ is done, now we can run a single post_init on the child object delattr(module, "_ds_child_entered") print_rank_0(f'Running post_init for {module.__class__.__name__}', force=False) - self._post_init_method(module) + if self.skip_init_depth == 0: + self._post_init_method(module) print_rank_0(f'After initializing followed by post init for {module.__class__.__name__}', force=False) + if init_on_meta: + self.skip_init_depth -= 1 return wrapper @@ -512,7 +567,6 @@ def _init_subclass(cls, **kwargs): self.patched = True def unpatch_init_and_builtins(self): - if self.patched: def _disable_class(cls): diff --git a/tests/unit/runtime/zero/test_zero.py b/tests/unit/runtime/zero/test_zero.py index 6d66ff704416..bc31e3b9a968 100644 --- a/tests/unit/runtime/zero/test_zero.py +++ b/tests/unit/runtime/zero/test_zero.py @@ -14,6 +14,7 @@ from torch.nn.modules.container import ModuleList from torch.nn.modules.loss import L1Loss from torch.nn.parameter import Parameter +from torch.nn.utils import skip_init from unit.common import DistributedTest from unit.simple_model import SimpleModel, random_dataloader @@ -1193,6 +1194,82 @@ def create_tensor(vals): _assert_partition_status(ds_engine, {ZeroParamStatus.NOT_AVAILABLE}) +class TestParamPartitioningSkipInit(DistributedTest): + world_size = 2 + + def test(self): + config_dict = { + "train_batch_size": 4, + "steps_per_print": 1, + "optimizer": { + "type": "Adam", + "params": { + "lr": 1e-4 + } + }, + "fp16": { + "enabled": True + }, + "zero_optimization": { + "stage": 3 + }, + } + hidden_dim = 10 + + class SubModel(torch.nn.Module): + + def __init__(self, input_size, output_size, dropout_prob=0.5, device=None): + super(SubModel, self).__init__() + self.linear = torch.nn.Linear(input_size, output_size, device=device) + self.dropout = torch.nn.Dropout(dropout_prob) + self.module_list = torch.nn.ModuleList([torch.nn.Linear(input_size, output_size, device=device)]) + + def forward(self, x): + x = self.linear(x) + x = self.dropout(x) + x = self.module_list[0](x) + return x + + class MyModel(torch.nn.Module): + + def __init__(self, hidden_dim): + super(MyModel, self).__init__() + self.l1 = skip_init(Linear, hidden_dim, hidden_dim) + self.l2 = skip_init(SubModel, hidden_dim, hidden_dim) + self.l3 = torch.nn.Linear(hidden_dim, hidden_dim) + self.cel = torch.nn.CrossEntropyLoss() + self.l4 = skip_init(SubModel, hidden_dim, hidden_dim) + + def forward(self, x, y): + x = self.l1(x) + x = self.l2(x) + x = self.l3(x) + x = self.l4(x) + loss = self.cel(x, y) + val = [x, loss] + return val + + with deepspeed.zero.Init(config=config_dict): + model = MyModel(hidden_dim) + world_size = dist.get_world_size() + ds_tensor_numel = math.ceil(hidden_dim * hidden_dim / world_size) + assert model.l1.weight.ds_tensor.numel() == ds_tensor_numel + assert model.l2.linear.weight.ds_tensor.numel() == ds_tensor_numel + assert model.l2.module_list[0].weight.ds_tensor.numel() == ds_tensor_numel + assert model.l3.weight.ds_tensor.numel() == ds_tensor_numel + assert model.l4.linear.weight.ds_tensor.numel() == ds_tensor_numel + assert model.l4.module_list[0].weight.ds_tensor.numel() == ds_tensor_numel + + model, _, _, _ = deepspeed.initialize(model=model, model_parameters=model.parameters(), config=config_dict) + data_loader = random_dataloader(model=model, total_samples=50, hidden_dim=hidden_dim, device=model.device) + dist.barrier() + for n, batch in enumerate(data_loader): + loss = model(batch[0], batch[1]) + loss = loss[1] + model.backward(loss) + model.step() + + class TestZeroOffloadStage1(DistributedTest): world_size = 2 From 5dea776a843da475c1f94d47979ad21e56b2a00e Mon Sep 17 00:00:00 2001 From: Masahiro Tanaka <81312776+tohtana@users.noreply.github.com> Date: Thu, 18 Jan 2024 12:15:14 -0800 Subject: [PATCH 101/754] Enhance query APIs for text generation (#4965) This PR was authored to improve efficiency using DeepSpeed-FastGen. DeepSpeed-FastGen queries states of KV cache very frequently. Thus, this PR adds an API for the query and improves the efficiency of some query APIs. This PR also allows skipping the schedulability check in case it is already checked. --------- Co-authored-by: Heyang Qin Co-authored-by: Michael Wyatt --- deepspeed/inference/v2/engine_v2.py | 26 ++++++++++++++----- .../inference_model_base.py | 4 +++ .../inference_transformer_base.py | 10 ++++--- deepspeed/inference/v2/ragged/kv_cache.py | 7 +---- .../v2/ragged/sequence_descriptor.py | 6 ++++- 5 files changed, 37 insertions(+), 16 deletions(-) diff --git a/deepspeed/inference/v2/engine_v2.py b/deepspeed/inference/v2/engine_v2.py index ff73f7ea9680..4a358310377f 100644 --- a/deepspeed/inference/v2/engine_v2.py +++ b/deepspeed/inference/v2/engine_v2.py @@ -104,7 +104,10 @@ def _initialize_tp_group(self): ranks = list(range(self._config.tensor_parallel.tp_size)) return dist.new_group(ranks=ranks) - def put(self, batch_uids: Iterable[int], batch_tokens: Iterable[torch.Tensor]) -> torch.Tensor: + def put(self, + batch_uids: Iterable[int], + batch_tokens: Iterable[torch.Tensor], + do_checks: bool = True) -> torch.Tensor: """ Put a ragged batch onto the inference engine. This will perform one forward and return a Tensor of the shape [len(batch_uids), *output_shape]. Logits for the non-final tokens @@ -113,12 +116,14 @@ def put(self, batch_uids: Iterable[int], batch_tokens: Iterable[torch.Tensor]) - Arguments: batch_uids: Iterable of uids for the batch on the host batch_tokens: Iterable of token tensors for the batch on the host + do_checks: Check schedulability when it is set to True. You can skip this check for better performance when it has already been completed. """ - token_lens = [len(tokens) for tokens in batch_tokens] - schedule_check = self.can_schedule(batch_uids, token_lens) - if schedule_check != SchedulingResult.Success: - raise SchedulingError(schedule_check) + if do_checks: + token_lens = [len(tokens) for tokens in batch_tokens] + schedule_check = self.can_schedule(batch_uids, token_lens) + if schedule_check != SchedulingResult.Success: + raise SchedulingError(schedule_check) self._batch.clear() for uid, tokens in zip(batch_uids, batch_tokens): @@ -128,7 +133,7 @@ def put(self, batch_uids: Iterable[int], batch_tokens: Iterable[torch.Tensor]) - host_seq_desc.pre_forward(tokens.numel()) # We can disable checks since we already validated schedulability. - self._batch.insert_sequence(host_seq_desc, tokens, do_checks=False) + self._batch.insert_sequence(host_seq_desc, tokens, do_checks=do_checks) # Send all metadata to the device self._batch.finalize() @@ -225,6 +230,15 @@ def can_schedule(self, uids: Iterable[int], lengths: Iterable[int]) -> Schedulin return SchedulingResult.Success + def get_remaining_block_capacity(self, uid: int) -> int: + """ + Get the remaining capacity of the last block already allocated. + """ + seq_desc = self._state_manager.get_sequence(uid) + if seq_desc is None: + return 0 + return self._model.get_remaining_block_capacity(seq_desc) + def flush(self, uid: int) -> None: """ Remove all state associated with a sequence from the inference engine. diff --git a/deepspeed/inference/v2/model_implementations/inference_model_base.py b/deepspeed/inference/v2/model_implementations/inference_model_base.py index a7ff699e9058..894a4137407e 100644 --- a/deepspeed/inference/v2/model_implementations/inference_model_base.py +++ b/deepspeed/inference/v2/model_implementations/inference_model_base.py @@ -199,6 +199,10 @@ def get_kv_requirements(self, sequence: DSSequenceDescriptor, max_new_tokens: in """ raise NotImplementedError() + @abstractmethod + def get_remaining_block_capacity(self, sequence: DSSequenceDescriptor) -> int: + raise NotImplementedError() + @abstractmethod def maybe_allocate_kv(self, sequence: DSSequenceDescriptor, n_new_tokens: int) -> None: """ diff --git a/deepspeed/inference/v2/model_implementations/inference_transformer_base.py b/deepspeed/inference/v2/model_implementations/inference_transformer_base.py index 0cc577451d51..fae67dc8fc2a 100644 --- a/deepspeed/inference/v2/model_implementations/inference_transformer_base.py +++ b/deepspeed/inference/v2/model_implementations/inference_transformer_base.py @@ -334,7 +334,7 @@ def make_attn_layer(self) -> None: self.attn = heuristics.instantiate_attention(attn_config, self._engine_config) def get_kv_requirements(self, sequence: DSSequenceDescriptor, max_new_tokens: int, - max_new_blocks: int) -> Tuple[int, torch.Tensor]: + max_new_blocks: int) -> Tuple[int, int]: """ See ``DSInferenceModelBase.get_kv_requirements`` for documentation. @@ -351,7 +351,10 @@ def get_kv_requirements(self, sequence: DSSequenceDescriptor, max_new_tokens: in token_capacity = (max_new_blocks + sequence.cur_allocated_blocks) * self.attn.kv_block_size - sequence.seen_tokens - return token_capacity, torch.tensor([max_new_blocks]) + return token_capacity, max_new_blocks + + def get_remaining_block_capacity(self, sequence: DSSequenceDescriptor) -> int: + return sequence.seen_tokens % self.attn.kv_block_size def maybe_allocate_kv(self, sequence: DSSequenceDescriptor, n_new_tokens: int) -> None: """ @@ -360,7 +363,8 @@ def maybe_allocate_kv(self, sequence: DSSequenceDescriptor, n_new_tokens: int) - This method assumes an autoregressive dense attention pattern. Override this method if this does not match the model's attention pattern. """ - _, n_needed_blocks = self.get_kv_requirements(sequence, n_new_tokens, self.state_manager.free_blocks) + free_block = self.state_manager.free_blocks[0] + _, n_needed_blocks = self.get_kv_requirements(sequence, n_new_tokens, free_block) if n_needed_blocks > 0: new_blocks = self.state_manager.allocate_blocks(n_needed_blocks) diff --git a/deepspeed/inference/v2/ragged/kv_cache.py b/deepspeed/inference/v2/ragged/kv_cache.py index 50da350b6506..ceba3190b93c 100644 --- a/deepspeed/inference/v2/ragged/kv_cache.py +++ b/deepspeed/inference/v2/ragged/kv_cache.py @@ -140,9 +140,6 @@ def __init__(self, self._caches = tuple(caches) self._allocators = tuple(allocators) - self._free_blocks = torch.empty(len(self._allocators), dtype=torch.int32, device="cpu") - for i, allocator in enumerate(self._allocators): - self._free_blocks[i] = allocator.free_blocks def reserve(self, num_blocks: int, cache_group: int = 0) -> torch.Tensor: """ @@ -201,9 +198,7 @@ def free_blocks(self) -> torch.Tensor: """ Return the number of free blocks in each cache """ - for i, allocator in enumerate(self._allocators): - self._free_blocks[i] = allocator.free_blocks - return self._free_blocks + return [allocator.free_blocks for allocator in self._allocators] @property def num_caches(self) -> int: diff --git a/deepspeed/inference/v2/ragged/sequence_descriptor.py b/deepspeed/inference/v2/ragged/sequence_descriptor.py index c8a0c20764f6..6b9f65255eec 100644 --- a/deepspeed/inference/v2/ragged/sequence_descriptor.py +++ b/deepspeed/inference/v2/ragged/sequence_descriptor.py @@ -168,7 +168,11 @@ def cur_allocated_blocks(self, cache_group: int = 0) -> int: Arguments: cache_group (int): The cache group to query. """ - return self._blocks_per_allocation_group[cache_group].sum() + # Currently, there is only one allocation group. + # A shortcut is used here to bypass the overhead of sum(). + if len(self._blocks_per_allocation_group) == 1: + return self._blocks_per_allocation_group[0].item() + return self._blocks_per_allocation_group[cache_group].sum().item() def kv_cache_ids(self, cache_group: int = 0, on_device: bool = False) -> torch.Tensor: """ From 96c5a873e6e73dcff9effdc10509a2e6ab564a39 Mon Sep 17 00:00:00 2001 From: Masahiro Tanaka <81312776+tohtana@users.noreply.github.com> Date: Thu, 18 Jan 2024 20:05:58 -0800 Subject: [PATCH 102/754] Add API to set a module as a leaf node when recursively setting Z3 hooks (#4966) ZeRO3 does not work with MoE models because the order of executing modules can change at every forward/backward pass (#4094, #4808). This PR adds an API to stop breaking down a module for parameter fetching. The following shows an example of the usage: ```python import torch import deepspeed import deepspeed.comm as dist from transformers.deepspeed import HfDeepSpeedConfig from transformers import AutoTokenizer, AutoModelForCausalLM from transformers.models.mixtral.modeling_mixtral import MixtralSparseMoeBlock model_id = "mistralai/Mixtral-8x7B-v0.1" ds_config = { "bf16": { "enabled": True, }, "zero_optimization": { "stage": 3, }, "train_micro_batch_size_per_gpu": 1, } hfdsc = HfDeepSpeedConfig(ds_config) tokenizer = AutoTokenizer.from_pretrained(model_id) model = AutoModelForCausalLM.from_pretrained(model_id, torch_dtype=torch.bfloat16) deepspeed.utils.set_z3_leaf_modules(model, [MixtralSparseMoeBlock]) model.eval() ds_engine = deepspeed.initialize(model=model, config_params=ds_config)[0] ds_engine.module.eval() model = ds_engine.module inputs = tokenizer.encode("DeepSpeed is", return_tensors="pt").to("cuda") outputs = model.generate(inputs, max_new_tokens=200) output_str = tokenizer.decode(outputs[0]) if dist.get_rank() == 0: print(f"output: {output_str}") ``` By passing names of modules to `set_z3_leaf_modules`, DeepSpeed engine stops breaking down the module. In this example, `MixtralSparseMoeBlock` has multiple experts as its submodule. Using `set_z3_leaf_modules`, the DeepSpeed engine fetches parameters of all the submodules when pre-fetching the parameters of `MixtralSparseMoeBlock`. --- deepspeed/runtime/zero/parameter_offload.py | 8 +- .../zero/partitioned_param_coordinator.py | 19 ++-- deepspeed/utils/__init__.py | 1 + deepspeed/utils/z3_leaf_module.py | 48 ++++++++++ .../runtime/zero/test_zero_leaf_module.py | 90 +++++++++++++++++++ 5 files changed, 155 insertions(+), 11 deletions(-) create mode 100644 deepspeed/utils/z3_leaf_module.py create mode 100644 tests/unit/runtime/zero/test_zero_leaf_module.py diff --git a/deepspeed/runtime/zero/parameter_offload.py b/deepspeed/runtime/zero/parameter_offload.py index d1ecd9288878..ab554297159b 100644 --- a/deepspeed/runtime/zero/parameter_offload.py +++ b/deepspeed/runtime/zero/parameter_offload.py @@ -6,6 +6,7 @@ import sys import torch from collections import OrderedDict +from deepspeed.utils import z3_leaf_module 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 @@ -383,9 +384,10 @@ def _register_hooks_recursively(self, module, count=[0]): #print(f"{module.__class__} : {module.id}") - for child in module.children(): - count[0] = count[0] + 1 - self._register_hooks_recursively(child, count=count) + if not z3_leaf_module(module): + for child in module.children(): + count[0] = count[0] + 1 + self._register_hooks_recursively(child, count=count) @instrument_w_nvtx def _pre_forward_module_hook(module, *args): diff --git a/deepspeed/runtime/zero/partitioned_param_coordinator.py b/deepspeed/runtime/zero/partitioned_param_coordinator.py index 9bcf5a91bc95..299138e84712 100644 --- a/deepspeed/runtime/zero/partitioned_param_coordinator.py +++ b/deepspeed/runtime/zero/partitioned_param_coordinator.py @@ -9,6 +9,7 @@ from typing import Deque, Set from deepspeed import comm as dist +from deepspeed.utils import z3_leaf_module from deepspeed.utils.logging import logger from deepspeed.runtime.zero.offload_config import OffloadDeviceEnum from deepspeed.runtime.zero.partition_parameters import * @@ -188,7 +189,7 @@ def record_parameters(self, sub_module: Module) -> None: raise RuntimeError(f"attempted to record trace when status = {self.__trace_mode}") step_id = self.__step_id_module_fetched_for[sub_module.id].popleft() - for param in sorted(set(iter_params(sub_module)), key=lambda p: p.ds_id): + for param in sorted(set(iter_params(sub_module, recurse=z3_leaf_module(sub_module))), key=lambda p: p.ds_id): self.__param_order.append(__class__.__ParamInTrace(param=param, step_id_last_used_at=step_id)) def construct_parameter_trace_from_module_trace(self): @@ -261,14 +262,14 @@ def fetch_sub_module(self, current_submodule: Module, forward: bool) -> None: """ if logger.isEnabledFor(logging.DEBUG): debug_rank0( - f"{self.__step_id}: M{current_submodule.id}({type(current_submodule).__name__}) P{[p.ds_id for p in iter_params(current_submodule)]} " + f"{self.__step_id}: M{current_submodule.id}({type(current_submodule).__name__}) P{[p.ds_id for p in iter_params(current_submodule, recurse=z3_leaf_module(current_submodule))]} " + str({ "avail": f"{self.__n_available_params:.1e}", "queue_sz": f"{len(self.__param_queue or [])}", "inflight": [p.ds_id for p in self.__inflight_param_registry], })) - params_to_fetch = frozenset(iter_params(current_submodule)) + params_to_fetch = frozenset(iter_params(current_submodule, recurse=z3_leaf_module(current_submodule))) fetch_numel = sum( [p.partition_numel() for p in params_to_fetch if p.ds_status == ZeroParamStatus.NOT_AVAILABLE]) if fetch_numel > 0: @@ -390,8 +391,8 @@ def release_sub_module(self, submodule: Module, backward: bool) -> None: """release the parameters of a sub module, assuming they meet conditions to be released.""" params_to_release = (self.__params_to_release(submodule, self.__step_id) if self.is_complete_trace() else set( - p.ds_id for p in iter_params(submodule))) - for param in iter_params(submodule): + p.ds_id for p in iter_params(submodule, recurse=z3_leaf_module(submodule)))) + for param in iter_params(submodule, recurse=z3_leaf_module(submodule)): param.ds_active_sub_modules.discard(submodule.id) if param.ds_id in params_to_release and not param.is_external_param: self.__release_param(param, backward) @@ -473,7 +474,9 @@ def __params_to_release(self, submodule_to_release: Module, step_id: int) -> Set if not self.is_complete_trace(): raise RuntimeError("expected trace to be complete") - params_to_release = set(p.ds_id for p in iter_params(submodule_to_release) if not p.ds_persist) + params_to_release = set( + p.ds_id for p in iter_params(submodule_to_release, recurse=z3_leaf_module(submodule_to_release)) + if not p.ds_persist) # Problem: When prefetcher scans the param trace, it skips AVAILABLE params. # This creates issues if those params are released before the skipped uses: @@ -482,7 +485,7 @@ def __params_to_release(self, submodule_to_release: Module, step_id: int) -> Set # diverges from the trace. # Solution: Don't release params whose reuse was skipped by prefetch. This is # possible because we detect such skips during prefetch and mark those params. - for param in iter_params(submodule_to_release): + for param in iter_params(submodule_to_release, recurse=z3_leaf_module(submodule_to_release)): if self.__most_recent_step_id_param_fetched_for[param] > step_id: params_to_release.discard(param.ds_id) @@ -493,7 +496,7 @@ def __params_to_release(self, submodule_to_release: Module, step_id: int) -> Set for module in self.__submodule_order[step_id:]: if params_traversed >= self.__max_reuse_dist_in_numel: break - for param in iter_params(module): + for param in iter_params(module, recurse=z3_leaf_module(submodule_to_release)): params_to_release.discard(param.ds_id) params_traversed += param.ds_numel diff --git a/deepspeed/utils/__init__.py b/deepspeed/utils/__init__.py index 6237d7239682..b6c371cd5a1f 100644 --- a/deepspeed/utils/__init__.py +++ b/deepspeed/utils/__init__.py @@ -16,6 +16,7 @@ from .tensor_fragment import safe_set_full_fp32_param, safe_set_full_optimizer_state from .tensor_fragment import safe_get_local_fp32_param, safe_get_local_grad, safe_get_local_optimizer_state from .tensor_fragment import safe_set_local_fp32_param, safe_set_local_optimizer_state +from .z3_leaf_module import set_z3_leaf_modules, unset_z3_leaf_modules, z3_leaf_module from .mixed_precision_linkage import link_hp_params from deepspeed.runtime.dataloader import RepeatingLoader from .numa import get_numactl_cmd diff --git a/deepspeed/utils/z3_leaf_module.py b/deepspeed/utils/z3_leaf_module.py new file mode 100644 index 000000000000..57521843a2ea --- /dev/null +++ b/deepspeed/utils/z3_leaf_module.py @@ -0,0 +1,48 @@ +# Copyright (c) Microsoft Corporation. +# SPDX-License-Identifier: Apache-2.0 + +# DeepSpeed Team + +import torch +from typing import List, Type + + +def _do_set_z3_leaf_modules(model: torch.nn.Module, leaf_module_classes: List[Type], flag: bool) -> None: + assert all(isinstance(module_class, type) for module_class in leaf_module_classes), \ + f'leaf_module_classes must be a list of types, got {leaf_module_classes}' + + def _set_z3_leaf_flag(model: torch.nn.Module): + if model.__class__ in leaf_module_classes: + model._z3_leaf = flag + + model.apply(_set_z3_leaf_flag) + + +def set_z3_leaf_modules(model: torch.nn.Module, leaf_module_classes: List[Type]) -> None: + """Sets a flag within a module in `model` to instruct ZeRO3 to stop setting hooks recursively when it encounters a module class listed in `leaf_module_classes`. + This is particularly useful in the context of Mixture of Experts (MoE) models. In MoE models, the computation order of experts varies across forward passes. This variability can disrupt ZeRO3's functionality, as ZeRO3 relies on tracking the computation order of modules to prefetch parameters efficiently. By designating a module as a 'leaf' node, ZeRO3 will prefetch parameters for all child modules upon entering the module. + Another scenario where this functionality is beneficial is in models with excessively fine-grained nested modules, where it helps to avoid the overhead associated with hooks. + Args: + model (torch.nn.Module): The model to which the leaf module flag will be applied. + leaf_module_classes (List[Type]): A list of module classes that should be flagged as 'leaf' modules. + """ + _do_set_z3_leaf_modules(model, leaf_module_classes, True) + + +def unset_z3_leaf_modules(model: torch.nn.Module, leaf_module_classes: List[Type]) -> None: + """Unsets a flag within a module in `model` to instruct ZeRO3 to resume setting hooks recursively when it encounters a module class listed in `leaf_module_classes`. + See `set_z3_leaf_modules` for more details. + Args: + model (torch.nn.Module): The model to which the leaf module flag will be applied. + leaf_module_classes (List[Type]): A list of module classes that should be flagged as 'leaf' modules. + """ + _do_set_z3_leaf_modules(model, leaf_module_classes, False) + + +def z3_leaf_module(model: torch.nn.Module) -> bool: + """Returns whether a module in `model` has been flagged as a 'leaf' module. + See `set_z3_leaf_modules` for more details. + Args: + model (torch.nn.Module): The model to which the leaf module flag will be applied. + """ + return hasattr(model, '_z3_leaf') and model._z3_leaf diff --git a/tests/unit/runtime/zero/test_zero_leaf_module.py b/tests/unit/runtime/zero/test_zero_leaf_module.py new file mode 100644 index 000000000000..8f10fe36c4d0 --- /dev/null +++ b/tests/unit/runtime/zero/test_zero_leaf_module.py @@ -0,0 +1,90 @@ +# Copyright (c) Microsoft Corporation. +# SPDX-License-Identifier: Apache-2.0 + +# DeepSpeed Team + +import deepspeed.comm as dist +import torch + +from unit.common import DistributedTest +from unit.simple_model import random_dataloader + +import deepspeed +from deepspeed.utils import set_z3_leaf_modules, z3_leaf_module + + +class MyModel(torch.nn.Module): + + def __init__(self, hidden_dim): + super(MyModel, self).__init__() + self.linears = torch.nn.ModuleList( + [torch.nn.Linear(hidden_dim, hidden_dim, bias=False), + torch.nn.Linear(hidden_dim, hidden_dim, bias=False)]) + self.act = torch.nn.ReLU() + self.cel = torch.nn.CrossEntropyLoss() + self.counter = 0 + + def forward(self, x, y): + # This fails without setting this module as a leaf module. + # See the comment in `set_z3_leaf_modules()`. + x = self.linears[self.counter % len(self.linears)](x) + x = self.act(x) + loss = self.cel(x, y) + self.counter += 1 + return x, loss + + +def run_model(model, config_dict, hidden_dim, dtype): + model, _, _, _ = deepspeed.initialize(model=model, model_parameters=model.parameters(), config=config_dict) + data_loader = random_dataloader(model=model, + total_samples=10, + hidden_dim=hidden_dim, + device=model.device, + dtype=dtype) + dist.barrier() + for batch in data_loader: + loss = model(batch[0], batch[1]) + loss = loss[1] + model.backward(loss) + model.step() + + # Needed in ZeRO 3. Not doing so can give memory leak + model.destroy() + + +class TestSetZ3LeafModule(DistributedTest): + # Need multiple gpus to test possible hanging + world_size = 2 + reuse_dist_env = True + + def test_set_z3_leaf_modules(self): + hidden_dim = 128 + + # `stage3_max_reuse_distance` is set to 0 to cause an error if the module is not set as a leaf module + config_dict = { + "train_micro_batch_size_per_gpu": 1, + "steps_per_print": 1, + "optimizer": { + "type": "Adam", + "params": { + "lr": 1e-6 + } + }, + "fp16": { + "enabled": True + }, + "zero_optimization": { + "stage": 3, + "stage3_prefetch_bucket_size": hidden_dim**2, + "stage3_param_persistence_threshold": 0, + "stage3_max_reuse_distance": 0, + } + } + + model = MyModel(hidden_dim) + + assert not z3_leaf_module(model) + set_z3_leaf_modules(model, [MyModel]) + assert z3_leaf_module(model) + + run_model(model, config_dict, hidden_dim, torch.float16) From e62a47e2e83647cc119c39cc7cf98fcfb5451cba Mon Sep 17 00:00:00 2001 From: Yejing-Lai <55339926+Yejing-Lai@users.noreply.github.com> Date: Sat, 20 Jan 2024 02:57:27 +0800 Subject: [PATCH 103/754] Fix T5 and mistral model meta data error (#4958) Fix 'NotImplementedError: Cannot copy out of meta tensor; no data!', when loading T5 and mistral from device meta. Co-authored-by: Logan Adams <114770087+loadams@users.noreply.github.com> --- deepspeed/module_inject/auto_tp.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/deepspeed/module_inject/auto_tp.py b/deepspeed/module_inject/auto_tp.py index 2d2ab0372dfd..bf9c2d74c635 100644 --- a/deepspeed/module_inject/auto_tp.py +++ b/deepspeed/module_inject/auto_tp.py @@ -132,7 +132,8 @@ class Loading(): def is_load_module(module): load_layers = [nn.Linear, nn.Embedding, nn.LayerNorm] load_layer_names = [ - "LPLayerNorm", "SharedEmbedding", "OPTLearnedPositionalEmbedding", "LlamaRMSNorm", "FalconLinear" + "LPLayerNorm", "SharedEmbedding", "OPTLearnedPositionalEmbedding", "LlamaRMSNorm", "FalconLinear", + "MistralRMSNorm", "T5LayerNorm" ] return module.__class__ in load_layers or module._get_name() in load_layer_names From 79564203c66e90a95454315c4a3ac493f90f4066 Mon Sep 17 00:00:00 2001 From: Michael Wyatt Date: Fri, 19 Jan 2024 14:58:27 -0800 Subject: [PATCH 104/754] FastGen Jan 2024 blog (#4980) Co-authored-by: Lev Kurilenko Co-authored-by: Arash Bakhtiari Co-authored-by: Heyang Qin Co-authored-by: Ammar Ahmad Awan --- blogs/deepspeed-fastgen/2024-01-19/README.md | 187 ++++++++++++++++++ .../assets/images/fastgen-hero-dark.png | Bin 0 -> 86613 bytes .../assets/images/fastgen-hero-light.png | Bin 0 -> 80553 bytes .../images/th_lat_curve_falcon-180B_tp8.png | Bin 0 -> 151520 bytes .../images/th_lat_curve_falcon-40b_tp2.png | Bin 0 -> 149067 bytes ...urve_mistralai-Mixtral-8x7B-v0.1_tp4_1.png | Bin 0 -> 1145723 bytes ...urve_mistralai-Mixtral-8x7B-v0.1_tp4_2.png | Bin 0 -> 105718 bytes .../assets/images/th_lat_curve_phi-2_tp1.png | Bin 0 -> 1255169 bytes 8 files changed, 187 insertions(+) create mode 100644 blogs/deepspeed-fastgen/2024-01-19/README.md create mode 100644 blogs/deepspeed-fastgen/2024-01-19/assets/images/fastgen-hero-dark.png create mode 100644 blogs/deepspeed-fastgen/2024-01-19/assets/images/fastgen-hero-light.png create mode 100644 blogs/deepspeed-fastgen/2024-01-19/assets/images/th_lat_curve_falcon-180B_tp8.png create mode 100644 blogs/deepspeed-fastgen/2024-01-19/assets/images/th_lat_curve_falcon-40b_tp2.png create mode 100644 blogs/deepspeed-fastgen/2024-01-19/assets/images/th_lat_curve_mistralai-Mixtral-8x7B-v0.1_tp4_1.png create mode 100644 blogs/deepspeed-fastgen/2024-01-19/assets/images/th_lat_curve_mistralai-Mixtral-8x7B-v0.1_tp4_2.png create mode 100644 blogs/deepspeed-fastgen/2024-01-19/assets/images/th_lat_curve_phi-2_tp1.png diff --git a/blogs/deepspeed-fastgen/2024-01-19/README.md b/blogs/deepspeed-fastgen/2024-01-19/README.md new file mode 100644 index 000000000000..98a9346441a4 --- /dev/null +++ b/blogs/deepspeed-fastgen/2024-01-19/README.md @@ -0,0 +1,187 @@ +

+ +# DeepSpeed-FastGen: Introducting Mixtral, Phi-2, and Falcon support with major performance and feature enhancements. + +
+ +
+ + +
+ +# Table of Contents +1. [Introduction](#introduction) +2. [New Model Families](#new-model-families) +3. [Performance Optimizations](#performance-optimizations) +4. [Feature Enhancements](#stability-and-software-enhancements) +5. [Community Engagement](#community-engagement) +6. [Try Out DeepSpeed-FastGen](#try-out-deepspeed-fastgen) + + +# 1. Introduction + +[DeepSpeed-FastGen](https://github.com/microsoft/DeepSpeed/tree/master/blogs/deepspeed-fastgen) is an inference system framework that enables easy, fast, and affordable inference for large language models (LLMs). From general chat models to document summarization, and from autonomous driving to copilots at every layer of the software stack, the demand to deploy and serve these models at scale has skyrocketed. DeepSpeed-FastGen utilizes the Dynamic SplitFuse technique to tackle the unique challenges of serving these applications and offer higher effective throughput than other state-of-the-art systems like vLLM. + +Today, we are happy to share that we are improving DeepSpeed-FastGen along three areas: i) three new model families, ii) performance optimizations, and iii) feature enhancements: +- **New Model Families** + + We introduce support for Mixtral (MoE), Falcon, and Phi-2 model families in DeepSpeed-FastGen. Our inference optimizations for these models provide up to a.bX improvement in latency and a.bX improvement in effective throughput over other state-of-the-art frameworks like vLLM. + +- **Performance Optimizations** + + We drastically reduced the scheduling overhead of Dynamic SplitFuse and increased the efficiency of token sampling. As a result, we see higher throughput and lower latency, particularly when handling concurrent requests from many clients. We demonstrate the performance optimizations with benchmarks and evaluation of DeepSpeed-FastGen against vLLM for the newly added model families. The benchmark results can be seen in [Performance Evaluation](#performance-evaluation) and the benchmark code is available at [DeepSpeedExamples](https://github.com/microsoft/DeepSpeedExamples/tree/master/benchmarks/inference/mii). + +- **Feature Enhancements** + + DeepSpeed-FastGen contains a rich set of features for running inference with many different model families and over 20,000 HuggingFace hosted models. We extend this feature set for all models to include a RESTful API, more generation options, and support for models using the safetensor checkpoint format. Additionally, we improve on overall stability and address bugs in our original DeepSpeed-FastGen release. + +We now dive into the details of the new model families, performance optimizations, and software improvements. If you would like to get started right away please see [Try Out DeepSpeed-FastGen](#try-out-deepspeed-fastgen). This new release is available in [DeepSpeed versions >= 0.13.0](https://github.com/microsoft/DeepSpeed/tree/v0.13.0) and [DeepSpeed-MII versions >= 0.2.0](https://github.com/microsoft/DeepSpeed-MII/tree/v0.2.0). + +# 2. New Model Families + +Today we introduce support for three new model families: i) [Mixtral (MoE)](https://arxiv.org/pdf/2401.04088.pdf), ii) [Phi-2](https://www.microsoft.com/en-us/research/blog/phi-2-the-surprising-power-of-small-language-models/), and iii) [Falcon](https://arxiv.org/pdf/2311.16867v1.pdf) + +## Mixtral + +Mixtral model, a language model based on sparse mixture of experts (MoE), has demonstrated promising performance across multiple benchmarks. The Mixtral model operates by applying a router network at each layer for every token, selecting two distinct experts for processing the current state and combine their outputs. This process is dynamic, with the possibility of different experts being chosen at each timestep. This architecture ensures that while each token is exposed to a broad spectrum of parameters, it actively utilizes only a subset during inference. + +In this release, we are pleased to announce the support for Mixtral models. We've enhanced our FastGen codebase by the integration of the Mixtral model implementation, refinements to our high-performance kernels for efficient top-k gating, and updates to Rotary Positional Encoding (RoPE) implementation. These advancements ensure that users can fully exploit the capabilities of DeepSpeed-FastGen for executing Mixtral model inference, thereby achieving heightened performance and efficiency. + +## Phi-2 + +Microsoft Research has introduced a suite of small language models (SLMs) named "Phi," notable for their exceptional performance across a spectrum of benchmarks. The latest addition to this suite, [Phi-2](https://www.microsoft.com/en-us/research/blog/phi-2-the-surprising-power-of-small-language-models/), is a language model boasting 2.7 billion parameters. It stands out as a testament to outstanding reasoning and language understanding capabilities, exemplifying state-of-the-art performance within the realm of base language models featuring fewer than 13 billion parameters. Notably, Phi-2 achieves parity with or surpasses models up to 25 times its size on complex benchmarks, a feat attributed to pioneering innovations in model scaling and meticulous training data curation. + +Owing to its compact size, Phi-2 emerges as an ideal model for both researchers and deployment scenarios, promising a reduction in inference costs. To efficiently support the Phi-2 model family, we introduce partial RoPE support in our DeepSpeed-FastGen kernels. + +## Falcon + +Falcon is a family of large language models (LLMs) developed by the Technology Innovation Institute (TII). The Falcon models include Falcon 7B, Falcon-40B and its larger counterpart, Falcon-180B, the largest openly available language model to date. + +A closer examination of the architectural nuances within the Falcon series reveals notable distinctions. Specifically, the Falcon 7B model diverges slightly from Falcon-40B; notably, Falcon-40B incorporates an additional layer norm preceding the parallel MLP layer, a feature absent in the Falcon 7B model. In contrast, Falcon-180B adheres to the same architecture as Falcon-40B but stands out as a scaled-up version. + +# 3. Performance Optimizations and Evaluation + +SplitFuse effectively enhances utilization by simultaneously computing prompts and decoding (generating tokens). However, we observed a significant overhead for scheduling ragged batching, especially when generating a large number of tokens from numerous concurrent requests. In this release, we've minimized this scheduling overhead for querying KV cache states. As a result, there's a notable improvement in the performance for scenarios with a large number of generation steps. + +In general for long prompts and a smaller number of generated tokens, we can fully utilize the benefits of SplitFuse, which combines prompt processing and decoding (token generation) in a single forward pass. This provides a significant advantage over vLLM in these scenarios as shown in our [previous blog](https://github.com/microsoft/DeepSpeed/tree/master/blogs/deepspeed-fastgen). For short prompts and a larger number of generated tokens, where most forward passes run purely for decoding, our highly optimized engine and the efficient scheduler for ragged batching demonstrate impressive performance. + +We follow the benchmarking methodology we presented in our [previous blog](https://github.com/microsoft/DeepSpeed/tree/master/blogs/deepspeed-fastgen#a-benchmarking-methodology). + +*NOTE: All the benchmarks in this blog use the recommended DeepSpeed-FastGen persistent deployment mode.* + +### Mixtral + +We developed a new MoE module, which contains kernels optimized for our inference engine. The enhancements in the decoding phase, included in this release, significantly improve throughput and efficiency in generating a large number of tokens as shown in *Figure 1*. + +
+
+ + *Figure 1: Throughput-latency curve of Mixtral using A100. A normal distribution was applied to prompt and generation lengths with averages of (1200, 2600) and (60, 128), respectively, and a 30% variance*
+
+ +We show the throughput-latency of Mixtral-8x7B-v0.1 running on A100 with tensor parallelism degree of 4. First, we show the scenarios where the prompt lengths are longer than the number of generation steps (i.e., tokens), which is typical of popular use cases like chatbots. From *Figure 1*, DeepSpeed-FastGen provides 2.4X higher throughput for a prompt length of 1200 and 60 generation steps. In addition to the performance for the long prompt scenarios, we present new results for shorter prompts and larger number of generation steps in *Figure 2*. Our performance advantage still holds. + +
+
+ + *Figure 2: Throughput-latency curve of Mixtral using A100. A normal distribution was applied to prompt and generation lengths with averages of 500 and (150, 500, 1024), respectively, and a 30% variance*
+
+ +As we can see in *Figure 2*, DeepSpeed-FastGen is showing higher throughput and lower latency thanks to the scheduling performance improvements presented in this blog. + +### Phi-2 + +
+
+ + *Figure 3: Throughput-latency curve of Phi-2 using A100. A normal distribution was applied to prompt and generation lengths with averages of (1200, 1900) and (60, 128), respectively, and a 30% variance*
+
+ +From *Figure 3*, DeepSpeed-FastGen provides 1.5X higher throughput for a prompt length of 1900 and 60 generation steps. For other scenarios our throughput-latency evaluation of the Phi-2 model show a similar pattern, with DeepSpeed-FastGen providing equivalent latency with greater throughput or lower latency for the same throughput. + +### Falcon + +Given the substantial size of the Falcon-40B and Falcon-180B models, the majority of computations are dedicated to forward passes, while the overhead of scheduling and token sampling is relatively minor. + +
+
+ + *Figure 4: Throughput-latency curve of Falcon 40B using A100. A normal distribution was applied to prompt and generation lengths with averages of (1200, 1900) and (60, 128), respectively, and a 30% variance*
+
+ +
+
+ + *Figure 5: Throughput-latency curve of Falcon 180B using A100. A normal distribution was applied to prompt and generation lengths with averages of (1200, 1900) and (60, 128), respectively, and a 30% variance*
+
+ +As seen in *Figure 4* and *Figure 5*, DeepSpeed-FastGen is able to provide higher throughput and lower latency compared to vLLM for Falcon-40B and Falcon-180B. + +# 4. Feature Enhancements + +In this section we introduce several feature enhancements that have been released since we first introduced DeepSpeed-FastGen. + +## Performance improvements +We achieve a notable improvement in performance by minimizing the scheduling overhead for querying KV cache states as discussed in [Performance Optimizations](#performance-optimizations). + +See [PR-4965](https://github.com/microsoft/DeepSpeed/pull/4965), [PR-377](https://github.com/microsoft/DeepSpeed-MII/pull/377) for more details. + +## Support for safetensor checkpoints +Some HuggingFace-hosted model checkpoint weights are provided only in the safetensor format. We extend our HuggingFace checkpoint engine to work with the safetensor format to support even more models! + +See [PR-4659](https://github.com/microsoft/DeepSpeed/pull/4659), [PR-296](https://github.com/microsoft/DeepSpeed-MII/pull/296) for more details. + +## Added RESTful API + +We add the option to automatically stand up a RESTful API when creating DeepSpeed-FastGen persistent deployments in DeepSpeed-MII. This API provides a way for users to send prompts to their deployments and receive responses using HTTP POST methods and tools like `curl` or python's `request` package. The RESTful API provides the same high throughput and low latency performance as our python APIs. For more information, please see [MII RESTful API](https://github.com/microsoft/DeepSpeed-MII#restful-api). + +See [PR-348](https://github.com/microsoft/DeepSpeed-MII/pull/348), [PR-328](https://github.com/microsoft/DeepSpeed-MII/pull/328), [PR-294](https://github.com/microsoft/DeepSpeed-MII/pull/294) for more details. + +## Added deployment and generate options + +We extend the customizability of DeepSpeed-FastGen deployments and text-generation. Users can now specify a `device_map` when creating non-persistent pipelines and persistent deployments that controls which GPUs to use for hosting a model. Additionally, the interfaces between pipelines and deployments now match and include options for setting top-p, top-k, and temperature values. For additional information about the user-exposed options, please see [MII Pipeline](https://github.com/microsoft/DeepSpeed-MII#non-persistent-pipeline) and [MII Deployment](https://github.com/microsoft/DeepSpeed-MII#persistent-deployment). + +See [PR-331](https://github.com/microsoft/DeepSpeed-MII/pull/331), [PR-280](https://github.com/microsoft/DeepSpeed-MII/pull/280), [PR-275](https://github.com/microsoft/DeepSpeed-MII/pull/275), [PR-268](https://github.com/microsoft/DeepSpeed-MII/pull/268), [PR-295](https://github.com/microsoft/DeepSpeed-MII/pull/295), for more details. + +## Mitigate risk of deadlock + +In use cases where many prompts are sent to a deployment in a small time window, deadlock can occur in the DeepSpeed-FastGen inference engine, resulting in no text-generation progress is made on any prompts. To mitigate this, we ensure that there is a sufficient margin in the KV cache when scheduling requests. While not completely resolved, we continue to investigate a fix for these situations that arrive when the deployment is under heavy load. + +See [PR-274](https://github.com/microsoft/DeepSpeed-MII/pull/274) for more details. + +## Inference Checkpoints + +We add the capability to create inference engine snapshots to DeepSpeed-FastGen. This reduces the loading time for large models in future deployments. + +See [PR-4664](https://github.com/microsoft/DeepSpeed/pull/4664) for more details. + +## General stability and bug fixes + +We include many bug fixes and stability improvements to DeepSpeed-FastGen. This includes fixing issues with some OPT model size variants, bugs with MII configuration options, and improved error messages. + +See [PR-4938](https://github.com/microsoft/DeepSpeed/pull/4938), [PR-4920](https://github.com/microsoft/DeepSpeed/pull/4920), [PR-4739](https://github.com/microsoft/DeepSpeed/pull/4739), [PR-4694](https://github.com/microsoft/DeepSpeed/pull/4694), [PR-4634](https://github.com/microsoft/DeepSpeed/pull/4634), [PR-367](https://github.com/microsoft/DeepSpeed-MII/pull/367), [PR-350](https://github.com/microsoft/DeepSpeed-MII/pull/350), for more details. + +# 5. Community Engagement + +DeepSpeed welcomes your contributions! We encourage you to report issues, contribute PRs, and join discussions on the [DeepSpeed GitHub](https://github.com/microsoft/DeepSpeed/) page. Please see our [contributing guide](https://github.com/microsoft/DeepSpeed/blob/master/CONTRIBUTING.md) for more details. We are open to collaborations with universities, research labs, and companies, such as those working together on deep learning research, applying DeepSpeed to empower real-world AI models and applications, and so on. For such requests (and other requests unsuitable for GitHub), please directly email to deepspeed-info@microsoft.com. + +*We would like to recognize the contribution from our user community in adding support for the [Qwen](https://arxiv.org/abs/2309.16609) model family to DeepSpeed-FastGen in [PR-4913](https://github.com/microsoft/DeepSpeed/pull/4913).* + +# 6. Try Out DeepSpeed-FastGen + +We are very excited to share this DeepSpeed-FastGen release. + +* To get started, please visit our GitHub page for DeepSpeed-MII: [GitHub Landing Page](https://github.com/microsoft/DeepSpeed-MII) + +DeepSpeed-FastGen is part of the bigger DeepSpeed ecosystem comprising a multitude of Deep Learning systems and modeling technologies. To learn more, + +* Please visit our [website](https://www.deepspeed.ai/) for detailed blog posts, tutorials, and helpful documentation. +* You can also follow us on our [English Twitter](https://twitter.com/MSFTDeepSpeed), [Japanese Twitter](https://twitter.com/MSFTDeepSpeedJP), and [Chinese Zhihu](https://www.zhihu.com/people/deepspeed) for latest news on DeepSpeed. + +The following items are on our roadmap and we plan to engage with our community on these through our GitHub issues and PRs: + +* Performance improvements +* Quantization support +* New hardware backends through collaboration with partners + +**"Star" our [DeepSpeed GitHub](https://github.com/microsoft/DeepSpeed/) and [DeepSpeed-MII GitHub](https://github.com/microsoft/DeepSpeed-MII/) repositories if you like our work!** diff --git a/blogs/deepspeed-fastgen/2024-01-19/assets/images/fastgen-hero-dark.png b/blogs/deepspeed-fastgen/2024-01-19/assets/images/fastgen-hero-dark.png new file mode 100644 index 0000000000000000000000000000000000000000..1121fa9dafd68a4437b499591f389f404ebe1dbf GIT binary patch literal 86613 zcmeFZc~}!x`Y&#$(^?0Gj>!2&lCX3{K$d`#kVry6SrSo&8mL3{Ee5<(e9wnJ58}3v1D%M46l6;J>LeMJU(`pp!2{uJbus*8Hb7RRDqb46# z%;0-BRKSe>`}nT}{_m8)E8=kMbX9uAU%>RWMmi?KbUv)(2cHE^6Y#%ZwV#by{@Oeh zJLc&7DR>(Hwxs5h6VD)DgZCOfjmh8o(ybcypU-X49M3p$UisG5f5e3BBmeDtUxpYw z+Y9a>Q-uTbU zlrvL3m@fUv`IATA8I^$_;DxOj9kTDrx5%rnB3kElgj>u0qFlhA#(epY94;7o%a$KL?etfG(G^{gpv`0cZTwlXTd-AiCsR+LdogwKnG5gIrUxD?w$immG&`PFwAF@f6(n>OPgl}yIIGWnV6x#O zP@7#|s)v$#=HP}U_gK#~qVILf{%~ru&Z2STiuwGPYMYh9k#fyL zuVe{~{U5n+d~==IQv^O) zkdu^H693e{Hq|1FPx2HRK)t5px;4zRIQTzeMU(+6%!xQ`&sw%O$P}bvnciFhMd*S0 zTSeX060Hk0s3lZ*y@YEKvtt>SA64CA%z;rQPtAcnchpX`LG_V z7S8G;w2sdgp%J0Wk9`QQ|2*+>LSO!CC`vBc7W06vJ-f`Dxc9F20*CcN_MNcEHZgP8 z;ma}YM%u=x_8)0@2n*vR6iw=A+m=4B#t z%JKkBvzHupiP>{ZA4hy*0K4r_x3$caVIlRrg9-`n#&it}*4d_NB}jROnC#VaKQ-?) z(OA_-US7C2#bqQ%sO+JyY&p z)$bp_nlW6eg9$g3dIX`@_-GTaneDB|@sqhIA?MytXh{%(f9Bk9(YX`5aw;da41G?{ zje?mQbx)dqoVhbJoa$>(-0fn>2& zKMMcfb&`MOQ=l)}9StfD_9Wkmdl_}hu$~+<>QkugS!f#rl|SCqb6lQ_lAL2+y+}*n zwKjCVzSUe%YYr_c_8i*&VxVb4r6&^+_EBp}aigkhno}x^UaS8qUm03cDYQFQppN0C zEEjTW2hy_0%_)-bYOBsV)u2vTkrA}^pd+rLfHjECoZ zDXy8R28R9{PWa)cG6k19_ZTf44Z2AfAstf~>$)Fz;I!NRtd8;b=_WDw8zby}4+=fy z!?OYKTvtU{=hCm%Hjf~ZM5fM@7in#K$Ep)-CV|Ao-Kb3xuN(ioR^YRAhTTu%)0SzZ zm)CdKg?S;(Mw;xWp9+@z3JF>PWsc-dWG?ZXW8XwRX7SlQ)e>np8CE8MH%Hr22L(iO zG~;~_H-Q)#AFQxOHr!_@raSM-yt;K!NM~$ROTrOkcX4drYp|r2net6b>O6F!ykiXm zv?r5y+ae*<$NGQH0-AqxBPO ztI=Bb`Jk3ojHkk_t8zLRlk?gPGp09lq-H!e^V*LA;d=r8`VHERss?EEX5&~G=>0w6 z^r^AS?{*-jU($>BSUfvc)KHQ{AvowtQv~x|L4C&TsSR#l{4b3Pd;=TGf#qj=_2-*H zlIX^q5E{Km9p^;EUzEB(t7eu;7bC{b8Wr%D`}lP$5iNOynS%v`GV5UqFWerpaRJy1 z=~?yOkM?qhX;W}5?L3t&FwdFI!zf1OHC2wxqVwt}x)&UXEMtk51{{-PG?dIx5bRH0 z{g&ofGMrbi7Sq3?`*c8i$vxk*#trGoqFcfHm|yv)0jK3|RPyShkL?*EJ$0j5Pd1Yv zF_6jL!)U`kYy0AD7M;h6f)xkhs@UF`m*RdwaW|P)O>^X5!p0Fts(Kb(1Ez}mW@uO} zM|xWG0NV_;tT*ma1t;Q)a2>9pqY(3F<&>*D^--Yti;{Po?~1SM-w?Zp13{YO5L%(?WwQjWLZ380i2`i6d>-o_rW>?chck|;EFoWOWw<=jA5r1WMNyu!$1e>TQIJ0sb zI3E4dr#g(52<*s}m~#U%cwcT+;>lFc*pRE**cS4U^);%Ap~Ff1QCg_pNFJPqS~_({ zo2KQYns|i1^z7(Efy}g^iftu2ht2B)ex@>$6Z+B5i2GAVVbZ{(`eL2U%d?FYT}GRAwk+;-)2xSj0yo2?WR@YMn?B4`>F5$i-9sp- zWzxd?s)19v<|Wb&*M$~+LD-$QTIYqvgJ<*w>-JRMtX>NrF*eMuHHQRp#2J(nAW6I* zc1WqY#w8=0H1~!k(?jj=R!HW*8y|`6lAv6ocl^GE;3;=_<|)z%0@2h9JNMq0eFGo= zqBVwA6#Jro?Yj-ZSgnt6-ylTaC}eR_e3K%B6Sq4>`t_|rvxG3iBIS(GB#kE%Kra&q z&ur4m3=ZCz7?Jb#phyXP7onL} zEbFd}3an=u1^qmTi#ejVT1xLl(Jyqv?w>6l{ATjR)X&R*nV#T+(5OsAw>z~Jbk1r* zg5n$_@vtS*Xlp74jPvDnzPCHV7)7`jU_BpkWSB%ilSLD zA19r6FVQ|XXs9osm#yV~IrQs|HJN~BIiNor!bjZ9tzt`@T1w2CbXQCFE?zZu=R|V< zz6jQ5wP}4}6^a2uQNezPBaE#z^oqh7VWZc`z1PMEql>pMp)S-xI{ORXFnl!H=VzzC zMJL+(*!V1oO){n~p`QF`FP(I*YVemb>98AHOtqIM#43F z2k13mbH8{3KQd@65ztpmC(E@h_KZG2Pv3a^7ofNNyCP+l|2vxf5+QG;Ve94F4GA}4 zwO58BU@yd3dNp~(xm+vW_vl$v_<4R;9D1L$*2cX?*3lOAH8zn>m^_v{#TS$evR#Z= z`xX(H7vw>lOndcAg`#u(VmfC3$$NJR<&w;CPCkgYC#{%izdp;Lqw|L_y zUY@tY6hyU6udk=Yd%tuGN;H1$)M9FJogDe#Tp>1o zCyvWlV$oF;7}Jgr>lgl_cJF8NM>|Hj(QqP`hw%X$`3U(ZDKb4sOHQb%o5pZ6k2~l1 zIp0slK1j{f3!=^Uubw7`gkP?%nSc%uD$M$}A4hkd=;>VSkFFu^jVsd~>otM!O<|2> z3j??r$+JXYw(L}lb>yh$tn`|E-7;y??wS*BPdy|1ImR{>7O53s1@#D=iVjv7vW;l0 z73-eo`my83Abbk=9g^JzeS?k{ihQ~?D*PKbleo7AYf+z_vr_B~ zBcbmj#QbiYtK}juXIW8QX4rF3&xFbF(Sf0ocF)m)T(5&e$=N|fEr$sLEr_V%uT4nx zc`%b*Pm6b(7>x~Ws%sV)*k@&>N9$G8T2Ed&Oky9;Gah#pwplA?v>s&x$n>zb3AYA(g0z8 z2aZ`7jUO_>4x-tZ$KKM0y1 zz3AR>b;x_|8frP z>cP$CzB!d2iQ7>aUO?>2-T&r#@jNfs|4PFEkS>Qg^b`5o1BuqoaA%@D@q`Y2ro*h` zI;>U~=cp0x-IQ+hRJ!h0-)8?_-Anv$!r%`5c3C$!EK|?TW!WC7>GMS8b(?%A`$mFD z!uP9ACfz$*YzswT`rmoyl+~hzmD8^QI*AOB1Df!622$%=QOfYRRV#Nbj6*M(Bxn0G z8z}?6d;P0+S+v$Tt(EW^71VL7uJGIF>72l!+7FWYr?k;Aw#FmQ%3PzyLldu-)jbup zhqg9DGlHw`KcvJH6doC;5Ev)y?_VJ+N=@U0-1l%I zo9Azhz~^d?xgh3=wYe@(hLM-^ObT=n75iW!5@j9AG#ws_HgveqefingWDDnt6HWN; zOHR98sk&j3sYN4Q)m8yaz8_Q2J25!LxpKEGrY3dJYr-VPh&*VZAx@;_Y=h6u=gtj< zJ)h!?L+pgUr{?l|+b}p-pNU3zL8FZ=RefOYsKnn1?3<`AM*m&%Fs5GyKUoBnF0D4M zJ7>CU7SOo=$#8#Akw0aLN*q#!QUisXg-+vbuy$}+F`0WfM?74#dq#G)U9$VN!N8E zQC2xbqE}{MW`BgzbXT6CHks}V9FaQhP=`gy=w+nlT3L>B(V3Rck@ja|bwgJo+YFLG z?8z|F_iRQT^J1p$^~$6S)YrCOU>25QYZ9)QyBJxSJ7}wC8ov?9?s<&Su#>T_v^>S# zf46D;j9_>>#cLFJoukPu4cZ@IeuY(GnFa1UOHhj!`09ouAU0&%^`EGX=ncJ)3*tZf zMvT^!uFx(V*J3ZtG=+tAuetjdSru`v(97KG^T%?l7?jE6T~Ii#eBn*3O|0$7bTotP zp@G0-`a_(EX(#-ez1;}xkFN0(Zu}INbyHM`Irg+P8$pCKBhuF>W<@-Gkv{U46|}=- zTbQ3+kAz%xDtr7oBvuD)GrOV_Zww%wTwkO@l9MK$W7ORm87aM;Elhvfk{6m3i?xexT#MP-cb_E9f>{RmuFs(mLc&J@^rG91F^?R%CfXX z=8lvnJ&LfYjYyL?=Tp@J`~?jlMKkVS(d$WmiflZa<3}0vLxge0aR;U9Uc3^N;;<3} zhD;J3wCBY)!YAq?o2_Wx8NB4G7>BCwG6PApFpBsE`H&j{NKV^}CVga_!tas52V_Ro zI~+3vrKWjYf40myCVKz1c3`?o0sPIT>(G5ks$<4xmN#V1ofm?fAYxKS;eru|AL=vp zIwEr9MkmDuHs3hXQOfA}yn~mvG}Et+=^eo2G4;ruWV3qHeUW5_Zx@7ZbYW2)YseX= z7^GKdr(k=x#rvf%1uyHbmYP~jE4^IjX3e`RGBbcX*o)rNuqZQ-=8K*c#WOPW9*Wb} z$|I~yvRYvv2>Y?)ZRuz@rLI<@Hm?(fE6l6MF8wwTWAQ;7+Dr+RBh0B=JH*HN-C?6YZphHz|I!$i85k=96*c5@Q>(SCQ%-iZ&2fcc;xQnT{du> z!Q|}^851`HQc$6d0D+9%dx3iCT#v>Z{Swi~wB`FSGVGg?#fs%EyklU z#OjBF_4Ayzoug0lb5SSCC-MWKIrq*kJ)`lN7-lL zOYlt6i5%Yn8xrOeXTcT?#PNV`1VF|Ycn1SzG`p@1k-YanPg~n7Xa8q8HPiwYiL-DT zJH6ify5A~{sszauY-6|^W*J};vm#Sc)x^D7Kw&SdpK?w;1paSy0B@HRYw8b0s&#-wsE_q{@Rbt;Zr+4QZXTnA6d`k zGweWNcHl#!chcBa*w@DJU3PMHY^5oH>G^^Byq;+nkS-UT&t&hMt*pWa3s!W8lIezQ z*NWW;#rI*WO^Z!8${=X8qAl@pQ(LgKKfqa7D6Xh8**SHZc$?T&(PmF2vF=F3_^Q0U z{-F>VvT$GDcNV==O{G62xDpHBM0(=}(yGW2-@wn(Ryi|I^CKB_mE~UR7Qqlm-K!+= z`|GPagj{#F4(5`H+sNFoSM$)>&FC%_*>Fy}GJId;um6s0TBM6S3m|DorV6Gm`t}rF z=3xr=A=`DF^Qt$U=!HwC1q6*bi_F<%{Br#m6z)*Bbe`J!CU4HU(v*>BmO~DIKu0bG zeNT)W5Z`&LFG#SZUQ)(Yx6N_&M-}MROehxt%}2xwQ!f(>f=xIf+#Ag)q2?u{#hrd% zFU}Atofttrb@?d~)^zB;!@HkF_7fu!T0!!yoa+{s{EZVDLgM?^PJ2;JSr&$Jdw(aP zZ)kQ1(OJs0e5OB?e9ML@Lo6?Kl_e?N{|oV*K$7mbi#Dpj_krg|SQ#Hyk6sFsxjx|D=b>DD@ic0uBSahWxn~BDsf3Hr%hTHtFlA|e}=V$8+ z)-XhD|EPWHVmTVBSgxhP>(%W>z55p&U#er;ZTae7PoJ?-zp|%yis8tp8kTSk^GU5Q zV}``{*!t~)5zo166@7zi1$xlqSzcaArqiQO+*yq_L&wA*L4B9CIYIpe*KZd8k2{oy z{o@dgcGmkx;rBO2HG6?8)6Y4y4gX-YuyXPS44Y7DTdM9Qc~2g-xB6>D-1iR8)ZO;_ z&({tt09yr&KN_d8;o4d3*|-aOD#W$6S0@LxKrf>k)_`zHx3`WePnO z8N#-zrlgS$NXPIou4|o)VR4~y-uu4mK76P!co7h%{Y$6Yn3LAnG5sucj2Jcn=3m*G zZ8B%*i#xzlmV$q)GQVmMzmRqzvu$da-lV2!T^OSK+6awR_scdrtBmz-F;Vou{0OTT z?Y5a3C1UHC{C7h|L&Mzl=92h=dyb8o6tl`tafQS88oLHT9i|RBfO>;p78)W5Oyj%+HARR!0 z?3{BYtBgVE{Do~X0BlwQN5q5_jAfR=$en>$!<`GKYhp}6R>s9TU17uDO{KfjY~7 zK@NK?J)h0WGh$3*eHvwK=Xjex|RmLHGQ(aI!A*6rV87jW7&IB%Zy%7Y1_07TH)zs(G8I?5P z*^P*|GNnizXQOe}`%hju4SN-&j7-IWdIQiFP<;s87WF`4S$!E@MD7gHkj;tWFJ6Q> z7PflL#OGhhRmVDDXO#4`&2_u!5qb$qV_O`eN%FMeh&-8q1HUmD>j$sIoR8I~&>`on z%!DWO+tj^e-z|xjd{C)$wTvgphIsAc5ZBB=5g^t89xZ67zs4xooPKJe`#yu|hCWDb znXop$?BLu}J@=J5!I{`&MiZkJzNuR)L=_G24A?Pe1cr4$NnH#@ zao@fwF*C5DZY}4iK8~iN5k3{$C}q$kA$t~w7bXas*&tl$?4_CoBaD4&(`4S2sdXm6 z<7}hb)M!;DMr_JW|6Irn5Ck=mm!eS=St6Fz9hGmJnEkM~b^_>S@gQ27?@$T~D5ebN zUIn^i^hPbg5k#!ckK}dBZT9`Kq{zr7stR+F}gEn ztUBT|p6l}}`MG7wOMAyW1uObX{7OI=`aw|P(U7Fhob5Ge1(O!4D;mkhQhR@@UH78p zZnNpufrVTG3AUW+d)z?m;-gm=>G0AP(w}G~{6!T+$)IFGA6w9$AM{UF47X`k0qcmwk1y-CUCNS+r#alc#hn8IfRU5C zc(q=)e!&C5Rq$Js%h^;G*qS4P7yuh(?$M%(KQ}?1EA9+|th@NURR&ndbeJva+>@d= zkdExAlZEFqD=?U0vHSwc__*(3+puhOOLP?oN17IJ)vATY=plL}3V^C?kdF0T;8crm z3+o7z;a_0mGeO2OjYe0=+>36(VytzrMV4D7yvBi&PCtag1g<*SKQAW>v}HH0PMF2S z+ffGuL+VptSa!8RYx-1E4TV=vmo6NS@6HA2ralvC`jN6d5UF-z8acC9x-QFl{J!a> zmLcw@#a%t5eJVA=N5hXDi_5=Nd$x_$MLq9TVdi?%ssiwptc-VRlAovZxMzzykzHT) zGIfuBpTwD?zqZH zWYWxwb>E(U31ud9ZUkEq8!!u^H^7caEW)&v5m3e!TfA?jB^eVybJ-BT2$kM~i z2q|SE=lMg*LSp!#_Iq~om^gWk@o`B+LyomAmYW@aw7BZjP4i1aLd>J0z0^TWHTFx*<-kT;LfAnpSIZZEC1miGX9Cg@s{wRf4P8Uh> z^TqzZ(D%uRC-mh!$|=T5T<#&mlI@9p>DLUzT$b3XomJ62mTD!EV{kMS<^j> zM-6#hxP?TTQ_KqR0HUSl=_N%>?r!*LRX=eTeR=7h+n@$z-fU-U8a7>{5Fuf|_IacP znht~)A6bS}Z$)84Ntt4Ln4v!dQf(}n%^81Cwi`3kR3jM|3dqaI@>TsJIquLQowF9h z8G_`d^fs%2zXfS8?=BMP^TSi(6Q%yO+MjMq^edUytFc27cuH{jC$pn>>=-L1JqbKD zQ@!laW|wK?iQ5+EN*kPj=BclrCdC25Y5^cgz_Rk#`Lv-^H;byOLYcq>2PwShDkTZj z2uiw8lAs8?gHxHZ%lHGO`|e8$k77$jUI8+BoPyC&b2Pxo7b|keFWFpgP=@oGc+zYE zxO56R#&sg`&B(j+L}-?CwOG*MW%2pW^`{PFaG#vt(qm!grixy}-TYgi?u8+0_jA`G z`-Y5fQ{OZ8BORS92m82_{qQHV57>uW^J#(F=@j;U4(#56YAM%qfPTt1s<*7sSVsaU z?z`Z%NRC2acVzYtcq`oVPdE_vhN2TR_zESF(0%A*bHS(G)qrTLIQX>G5PEZ)NxA4Y z1#l&?4=Ic6FeRdOCkZmQG>9?+Bpa1!Zb)eQH` z?02l@Q_Xa8EU+**GZ=ICxjxw4!rC-6I?ZwR^?Sd4w7HVu7NoSmR!u{EY}ML#T@H#r z`*B8xw9f+3s3<~n{O5;EUcA$xw%GwNXQu4t`IEu@L8{~B2Cj_1#)I~wEHJ)gI z4h`UiIUl|74)4W;hWf5Kbf3jGP>TDIMKHV&igA}JB=hZGXp6^_o+J-TW(z54a)DW+ z28lTR<#;<~ft5wCwhfI!EQSjED=Tir(TZ5xEYP#=zs083kFkk+gVfe)^5`C;n^nzZy-tfp!2KJ>QqY(_Vb3HTl*aVI^7ihvBmAWyj?kID7tAJ zf>b<_MhMzB)qjP0-C`cC<5g!4x(`8$0O++K{xLWc26e4)%p9!Fiwd>HJEzB=po|jY zuVO)BP-?14o_b0Qt1mYxsn&LjIV2Pp?057&kaVE(-}uZ43$mcZE#8CM-VOX+$kkc* z%9RRV&EW{6dVLf;yjGJm@=_NrT z(+l*Fb#Y7At!m#{ub-?W*_^6zVK`dHK|zPo;**IxAQMl@i8$93gAA4s%m8CZYKR!7 z3>pdc27t7%sXruY52&<7KqD>d;xm+NR;e!L+6PfN|4CE@Z(<(4w3{$hj3vP+qgcj| z*m!mE)0fOZPO>4)l5xi_hxE>@2u1VsoyA8i&Dl~k!-ZJw^ zDSq)y0D6_~ilSF|O&o>bK%v5W??YhkDYJkCYRSL#2MJ{U3)7ZWk#hksu3v@@{N%Ib zwR-2+fIi%nb+p3>I*Ik!woJq?BK^?V*olqtC+;a}Njz($e?>fcme1WfF&34$7XN)O^SCa#3_K+#!^jmLlPmUM5!?VBfmYL5@>r2A3=~8^W zfJx~bK<0MLVq!0^B5VE**F4Z#@Djg{7&AlBJBv-SE9XGPM0zC(kjuXpJH0(bNe)dp ztSS7Py|zoINp8f57rbxo0|FrgWLg65{NlJy+JWkdwB)j=uagpsV3DfzjN-v$P$>ba zhFcbZUNFjF^|7H+(?J)Z@1EJyLSLog9tRx+wxyRavQQ=ni13|gE-mfctH%7aO>!b| z@{1tLjdT3d9j#xLrtg z(GhC&*0MmeXqMw~NRAIBJXqKt0>!57nSDAu76j^ck8Mw;mNN{kefuMwi6I#mAM(b# zu~%|7%ZsJKMn(J01>LMNXsNK8J2;aJkuOMi*Wi_2C!pzWB4K_*+6kjsnfy~q8puoI zh=swJ45ezT5i!!F?V!1U0HLYI)qK}BB9+WJ&jhlElqyv7C()E?GC(u?Fq9@4rL6#- zV#Pk;3mzy&mx3A(0KzW4>{{DQIAs9`=1*(lO~4@z^=ivRmFe*JTghEvQ{L0-kKaCt zrlvoviYb{)o?^*WZc;n!G6UUSh>4dSdpueVJy*9w%Bv8>aM0oQ_U|$ww|0PDJm`Un z9o>Zo&Pd!-oMbk)J!W(-Cj9bhQw<-P;FFqnOH`RB1UmFTWa98|&@A9CwYDlNd=rx{ z^3$D3&OY^lhBM%~6e8-;(=Wo|f*=}U@-H==`;SdM>wtF~q6&j0r-|@#!b5%)V=WGJ z%i<@zDZ_0u2}eK-jZ62P?_1vvs-d+Y|GtgJ6jD+^p#0Vsruz}wd^>msFw_^7RY8w~ zNXJS>GFC~}vrrCHTU3G{Zo>o-12~|s6ZtuDhLlr}#YG;?^Mx;}wRTR;V(3tNwA z9a?X)uflW0L<$Q%cIBBm-#v3X1U&~SeV=Kwj}uZ`2Ep>Gr$5N6ev=NpD2^L2wWutM zdv7}Fhb~ZNdlM%sE1LP9{stTR1MSCEGs8;(<=D!&I%{-7%#l8&Reyrb-wrEhL*P+- zo>6OILwoE8pi!aRL}jCZ49P6Yq9`+m17ekTnTYT|x*xY5k33#47GDj`!C7-c=qii8 z?~ZbKhXL^w2FhP%I3|bzZLt%CUguSS{?Kq)?}lynes&P)mhiwF<~%bf(sRQ|EejDQ zXg*I(F?u=}&_Y{1_B2_SArIeQG;16yU^=8OUrDc>3_|atbi(V#4x{peVI_k{CJCd& zj=-B*vCA}sSK3=qe)dOKl*{yB4YF7FDx1x=T-`sM zp*co{4%#iE#{dk_g*8o`Ody56RG)g<&nQBK5nv9&A+NM;5ER=SQ7e228uIYGpl)x^ zk?Syw!>V0aw%A?Tr-KK+Diy+LM-g21#B%#-`Te}*{?#JD3$=d-@|K2)W=sdBfA@fL z_L4L{hCM&@-m!lMeN5@K+PDc;UCqHT%H$cuV$9=%!@0keZ9kqSXn0Vj7!eQ}qJ~2+ zlmkA^n&trLj6Qe1X_h<_J+^!^1<br4G!1#ybUA^I;De@ozkFiEB>Q!3wl;5)!?wj>*}ax#C-p_Qfu;q z=Q$yF%W_eVpE);D=%KND?j6;2D`vtVnK>3@)%QKE&1b0*vyQVQ+dk~7yDP$Xb zc-{fk;RWK7?g%~%u)Y!e1@_U0^q!!qvV56$3T1TPsC&p_&!bFF*1fitsON&f2DUg& zC@3B>_5CG1zi^X!m1#BtcV2c)xC29E6O4w3NQ3D5?$+lw8dCN}P)4m#%dRoZ`9zw1 z8eeemsj_ZsX7`M0G%;9b=0ZukUoAOBN@Nxdw1-H24!I?kwvZ>XB8@p>EMyqXK69TgD!BkVi%64dgOTIkg|^JB7JH5H+{4)8`DaO zOQIR|NL=|TNZ$L5TUL>cNU7uvchz@5P;9w&Eq|Z}g*`qLi0{Bkop3~BeijnY6n_X3 zwg&ja%e1(+K#KIpxM5W7PT6VTH3IGU>gVFm2FK{OwYpPhwayX7N(s%ygZu5ZH@wnY zLCOjGLQfoAEj8ntvdYUMgZo1?_V{sq6tD8>>wB0iE16W;Et`Xg_~^efMF35x>XreJ zccy>oX}+caO`ZPfIYU!Mg9;~`-AO?wZhh}owA)_04;AjB(Obic+dmZE z`{hH~UU|mesQSpljQwYkafTG$_Z6W3D*|v3;Z}pGU~_*z^Xk@LxGj7o^#ZlEe6`OS zoOahhOmjgbJ@O$tCj2vtkLx>&(T=Rj)n|o)4vHt-+7a-!o}~TF*BdUvbmj-c5v7X_@rS8dD;VXnqbp%4qns9 z8pCwNlsh&K;*zHg z9tlZA^wshjWJD;0qVc2vptYI9Eajo^->dQ$D6@E>RR~eriPfT%$4H$1Ofo$|S)D3$ z2mTkFhWJWttQ6B`iQNcr1BH5MA`S;TSa2zB+})(FFbMUy^EOPh8tV(Q*VbU=FKV<~ zKDEfFhf)@OqCy1`yEEdy3`KR&?#64o3{SXP#mx;tV|!tyXAmn0`G0P84O8Ea#Ir_ue5R zX6dp?Yc#46MrrrHyD@%3dUs{fIGSKm>CRZ&To?Z`}|90E2DH%oaQHzU586tS|yUY*A z@&9{te$(9q{}sl6g|XR~z#0GFZ>{*RX8gaZ8GpJK1%S6d?YT2}_DXd;Oy|$nqFl`3 zq{lUuD{l+gDi8Z`rHauB@Z`hQE8r)1G&N5AcKu3|^7@tEUio<`mSdx*x{4c*I{)bx!segc zxip+&u<3*U>}!ZNX5Q1dx%suO<3>Kak9Eae+VpK-P3+N_JCn2UMA-@9b2*^MB?edRBQqROq|6Z{KQ{ zU*j8$lyq%%6Sa7^tlPO*Kk8C&H(KJ>R^S}vjY_{gUaebNT3#zL*f^WzSh@gnSzqu{ zaaL^55|$q>O(!}}Xt*x_dY$snb1W)0O_u{MmHO@R!*on^^!r~7TAI6ZnrT1XQqWx1 zFJ}3=ZYZ$Fj%ac{*Vj4*;t2^?DIdi6;dc}<(^d7uufZe8Wf`A7QiF6%T}HVy`#N2| zabyBNe(J)12HzrE0t=XTY1Z3U4LYyi4!T(X16BKN_FLG(e%(Jlq=*JH*zeMOWM8HB z*@<_DT$&Vmv-&^w*P$a+e9@rwW2#}1FB^U3JVu&)5&A^d6V&vL;CKj z9s0vPzmb5+tptLPCcd55q>W+rUDJ!~ErqPSI>P@jx9^=qD)EF_O+6)H{oB~T+AZ#hrHrTK}zlwW`LEK*}TS)H>cU)LzD#@N)vzjdDI_Uc@E^^_y4TZ@@g zZ9K|2=skYo!#}jyJ+(uJp1h_lS|v%(e3+IoBJStjZt82tqmq~y(9VCX&hh7< zGI0>{`_mTf_&1Jd$!R9g>(>K@GZuWSnH;NO_HYfcb?(`{=rdK_EhOFFzOPQc8&(on zCUaZ+G7Ob~ugm2Zb~xEC-O2by%cnrH?hy(kU|!Pn50c{THQTm5*8i}7!wN*cdQ1qB z94#7uzje#2LhjnMWZYFYJK()uV4qS7S*|R?L0Qr`>fWshdsgomd8 z(#ylHcrOi<1h+X*p3f>B>Bqm7pqw63{G+q^U_P+Dn`KTZhdNvC3*Xp4QZ zpKiITF*Ur@(v6*=BJhfr_KR&5wD%Z~Y{|2vdyo2u(=D%bxbf3{orW`1=S78ZsTb0_A2{{6zz zRqKo^w^UtneB!R*UXtdqv3>iNEqxb6W9!C@8}W2>TFWs`{ENq0eOW*vr+d>yby2tX zlvl`lkDeN`@7_N-F%V4$ zdwU=}VTMv&BeEffn5eIdWw|4JZ6!)QbX6TlnYt#gQ31<%dyTer#PZX9XPsDJf2Swz zG(Ag!ZrL*Xov1#+6?d6c-jG<+)#0}M>vl*P^I8X5QK1tz_i%Khbi4eUft}Y#9a-)* zytge?3rMw#%|enc=dZ(eI8o5Zb?N;6iK&*<$1BY;Ysv(F>TyhMw%tjQb3aVEW^VN- zFlS>lma{{tUpcyJ&-?`{^xCZwZd6=e6c)572W0hZ3|6W1yh!6{J=Q1&8>;0h8d*Qi zh?ka+CWL2&W?kM@Haq7MZzC~r^8H%QIo6ZnyqGw0qz(P`SkytStNP(9vy^HTk&Wer zH*J(~6sYahT8X1i=gs;}swO#0YCZ`4(fB9JE(4*wqGLGFaC(<9FZV-!-^A#sAKSC# zhq#OKD$&Ly_tx^FdP3%{#Sy(L(61NIY%C5#Huhx{yI1*L^Lz41)Hfw_xGCoIr30SdydHcL;EsV{lr-j{u@>@cYXGSR&76e%vmA{)p%n#XHiwUv8Ro16{hea7p)AA45= zxP+mfn4!{@TE8}h?zSe6wiSJY@r~u(jG|kL<~^frWsF4k?8~%U^C{}84eGG?C=+gD zLfef8M83|Kcn4t0XEMI>$g(EHu0NcCTaQ)NS(+(pdZsdI- ztKe2-R*T^=(XL5Y-vQKO*H;>432reP5Z$sKURq5=JUf5P2p)vOoX{8Vm53j?c0=yF zRqSrH=vbW#X_6cZ#QDTcJPt%=2hUenc4O3m<`+zOgx`gz6$}K;7ag?clg|Gw#Zn$w z=B?54{5+rP*;5M%Rf9zowyneWP*QHmx9(hNE1TSqb+`a?om1$4G>_rqE|qO_ zmgRk;YAc>a5k*xK*|U9JL|Sm#BOTiSIuu{MF}Gg-HQl5?0E#UNXn=!e$;M=;yhG<0 z_l(s2e2$T4+A18pSbgSl=c05xnONX!lYD`}51}MnV*BE40FW zU;ZPJ%Z$ADDAKvn*!B%LX0*PQy4|bs+!L$AkeaBnh2EwMPkhd3*2tvLnuY473nv%< zGO+HuI(vWR-Rhli_Ir#qxv^_2>0EuFHt}KQnSO9q0gBYQQ(=!(;JzUNu#^_ODkN46_|&miw&_4XKPWEB6E^&DpF+#bee>?H zO7}Ov9y=fJ+?=R;-#4GA&ig&`y1pxLP{4XS*6uJxNu3a8*Kz&tHp$A$DW(K%~RK%L))GVvIdFX0FV_0YA#J zOWo@6cYgfdrF=4##85={t`|)2!U)@Y-fr1qiI1F<4={ENkw>qgPtH=>-*;`V2cFAo zn_`qZv~d>rtLw1@Gw78~nsV*F&!|39|AJP_)cH0m0T6`EL)P0V~l$$A;*vy*I;%xrAU;U5IJWYF~%{DX|t$tOku`t ziiQ|7lWWG9>-V1ad3O7Lzd!%%s%Ac~`+mJXy|&-rXSBxjtpkje7D`XiSBf5jfSheV z!;2r8{#%GkLxSH+DGEoFLV)5(j;^FQg=1cwtjWGianzx3UY%;MibmwVX|LL%LoGKq zkn%-}*oP+|j&>hS$2|Ho51biRK3a}@m97zJ7Q+1(BZGXkC5nsAFW@QLEadBgvp!UU z&kve_>Mxqk+SCoJ{(I`{D2vpKBNMtk?b&5`a=2%XGG;X?6M1;8IHjrKBq-$X35eWh z!?PqFws4&6nVx@kc;8Z^TT0e*IAP-;2%gNT@$?po&O1K^rr_vGNZJ;8cgPM zJ-h5H8HusY%UfH0d4Y-wp)GQ$Cn9q&MH1^CL6m&HV$H+b1@RXq=8k^&9<=+wc6m@; zi_5y}=1$hs>Z83$=}mRtTXy-e^ryB{58EI~O@?;(bMn`QC&$qN>$ZV2gmG|pt6n9f ztr@ve29#cAB=+o!=7T=Xma{$eG({U4}t(`!3ijTVx|00S%pS zmz3g#q(`IRI0#sDw+-oRMheURCiB9;g%=M=_jsW?tA91hiJx$>ce3W1s6mR`EGPRI za4;SB=vDPGVvW38pj%`S<)B7->+>N&t1qDA?Kx8Ib?$DQ$C(3-0ojppl}v3L-blF!Ks7kSK_)Dn^w^wW#JNAV zAqEdGJi3V=^csT`Vh9PctIdWD0LkdzXlGw>N5Kukq-$PXLxyA5f@f{|>bZEt6+$!E zMIjaw)E6>nE#z_Kf$e?Gi$^a-g|AmfdU?Cn7J{DQp?J*#q@pBZt4$0Hf*y*_(_1)j z6Q4K@V+h(lt5Tk*z zh75gbymD;7QABWSGPv=2hXxqDjBfy7PmL{e=@Wkkn67thUx~5xP`y|G8}TfNp)noJ z&WBEPcj*-P1qiff`~rds>+rU$Vx1sE1s)9f5Ri@-X>6PW_SqY)U+SEU@}dIhb=&*V^olsYSu&g;~>$z?hh8UPWZ)^GKOe4hv@!+p8uM za9Z>>G7sqk=ii4V_}$^Z+TQHO2@|y-jtsQ(%$f43tIpog8@Ul03LJ{YhPuL{;MjFw zDsAMIcc3n5Culgu6FY3GOmMTN<$`Pfq0Vr=XiC~nJZ>HOs96pdeA>_BL1KX~D;hZi zwsW)L#4f)8aEmlP+o&(1faTfcaZGrwv$x*FxGluIHs%midZhXX1o{WnBFFltsaaR$ zD8yjI?PaJ?Ck1wZB;$5E670D}Jdn;)jy4nYJpJnj^Yw=b?TMrtfrHr>S|=vm%b8j_ zoJ3{q347otccTinHz6DsK^1y74S4DD1<`xAU#VKX8ep}1Qn))%kXEn<4jWelmVp45K)T7r3cF>IU8Y2q9O$bzT z1PjY3{G?dkuO7s8^1wyVKLiYV>;d<#f3~bbk8;jV3nLv@&9zIU%+?!_uW`{&2zc39 zyF6QO6n|c{je#~VKbwoU&7#8?NxoGDRjZOn$K}$w&L9gtml^1q{zXVuKgIS&w8vq^ zAoG8&sWA?_;zJ9LP)s$4XhFKN#{Jp)I8JHQ9VDcZIhEZT{g{ofRr2o#&FpLH!gEWF z6OZ)~FwrDOFIw?inGGjnMLLljgU~G)bL4OB)Eg)Z?~!4Zmpv zYEjXV%LzQiMOsTra@0K%>(gZ5Y;o>q0Uu2aTAgg?Nsbpp!seSmDhPMsM=FT}1GgZb za?e2wlju2bQk=)4VjsM*Vysr~Q}%Z1yDO)uA?0RWjn|aA8c42(Xg(6cyxIFbmA9CH z68R`1%_QgO2H2?vpdCIlCQX<4N?fGsjUwgJK-$+UL&0Xlw8I4k7Y!c-x}zyqc7 zs7kTYz{z&p4J+DN76ktFGkImZ(be~sWLcfQ2-2aTF~Z?*Wy4&pQO&A?P*$wB&2XH@ zRNBNTk4?8YI}rVud!$K~*0jvVShgK!DENm=^p0iqcROA9lyLi-hK38pHESb}cSKci zXX*#*R!Zmi>GDN+r|a7#)i27mlDa$N8g;m^K27(Ift4+r3|}U-|4I!%9jGqRYCX6{pNBMyn9g zl8pt=W&;I^!$^Q0R9*W4*5^Yu#IY{cK98MJF8Drcex?&)y__=B?U}J0Y_{O6PwZ-E z>I8HlZM&9;7gEC$7Yl=t*t|_gvjB!J)`37 zrz>3{S{0xIrBodr`_?j!5DGa=z$_32HjfS%1k5}^@lP9e$!XHx0MzzOc2O!OXzVc% z0)P>*kcEX$3#XCPxnmn4G`1qR`CUN_6?L`UVU+^&V?nxr6uTu$D|L&w4opQGPPtOV zbTR9+vM7f6h&P(Rzv}d`=&m|_{s1YX+FWnRlH9(1=sj(PQn6`s&(em7r*;^T`aIez z#vY%dH>=Ylyvlmp_(_?vXor47FQS`)q?VhzQ|6}3X1KU;d8a5eM)(M$k~LCXyEgw= zeW#0{T3~6@v!QnE>^_vap4jyVFS-kgRs5P2SsSn_zwKAk&zu~$_Gymrs_pIA?$0_l zI}Hh1^J=%p(ZTw#t@U`ya0d?Lm>!GG2m@_U2)a0f6BkVrBOO-F%}Nku+TD0(0T+k! zWcrXv*;hfni244i6)YnvE_lK!m1iKYJcOOUzIrBaIebJ;bL?R;J7puENjS>tVfz+Y zM>Xe55}JK($+NAi7l)B`x50QCwJbT-+r$pE%O4 z2@oiKN(9>p3I6#=mj-cr;vH*L4TudK;)(IEGSX9Olt|#R;_cLYq`yg$a6 z2n;bVd!pv0SRGc!Wk+8EDMUu>LsP%O*ib6Xy!&ezUQI%kgtWdc`lL0chrN{reM^ob z1c@1aW}^sJs1&7ir`YDxJb&m<@F`ol-)(xAbufb8-3Xtf;$H*{A>8>VmkY>t4NHK3=m;zJ+xqwbqV@YhLpP4~D}? zxQ=&cG}QDiu6s?-ZQWoNz5hz)o!@fT25;d20VKBZ^5Sz?K1QJ3gNKKUe!YZ-gXIBC z0Pb46`^&D{<*t(jKpvq6SKpVO_GYhIl6yGCpv;0eIwKc4m=NqvN^Jes8r^KzM=r>& zW7UpD3^t_KrHq=u(NV&RV?LGrYLBuCrw_a^_T4*#Y_CWgeWZ@=rG+rsSr}d z?Z)KKG^QkTEHAc(n-==x))T1TrY^T^`&1^jVt1KM*|_D9$NsnY`9U0;pX|Hk*st#u zN$}HYc5SDCl6DdiBI4Z&nzZc^en`YL1S%25th-ilfza4*85Ee!zw1Uhtj=nbc&vm- z^5H$(!o)jn%eihs)za+Novabb!Oy{gVW$l^UQ@we66X=?C8VWi3JQ= z-{5du!Dst1**jMeyqYJL%HS($0$qPYp9v++ z`q)AgcvEt(UtU5DXeUT6$HyjIXj_iIMx->~DuPS?8I)=m9wcSnA?tYH(4O~zXn1&2 zou(oON_nQAV<DQfRd3^4Jlsv_qy<5#{t;&=)%97|x%&lyU+`z_e&d zerUgDYzRW4_YbM2ahplpM7QhAT)?;W$y}ubU>1=KF^CkDmWXaIy)qZzR9g7pq&6Xv z^p(sDca+?=)2%a;upUv5(%d;5YRkCssNVTOzWw#>c5Il~;_fs^Icu~eFmV)cVGh>& z{BZLNS`e?o5wKVCy|hZFnh&JTZQeum%ow?4+f&3-%|A9@ z(O=ReoI341AslMyx#%kM?&I>#s4>jK+&=^DNXJIzlLKckh{)gS0#$&;IE)M5TGlhb zO7e3az~g_p<~8JjH(DZETMR~~5MmsC>SL6exy5%8anof?_3*UYg!ScWMt&pz*i->X z;y`7l9VehbvOM0_X|WZr-&3ro&H3Q90XkjHWVkc`rIsWn%f4m}vOtnt$g00M0_t~> z5)aLwTuU*2$&d%l+<*1a=}1~fKXZH4?xk+y(WJokEwd{bY{hbZFmiANg-`UX@!vC+ zx#1rK4#pc>w@!q#bp<`-8S-6oBz^5WTE9UM>mLwm4=@RiKNx`dmO_rhHmmq2f* zsndsVny1g|!hApk!gej}4)Wd;9GhMzHZM~NlVc9oxD`aq94$Fu{kfc5CN)mr53aLY zTTIR`-iRTX*0_=21hFh=v$kW=6o@xNt)+Cv`Bi=0T9ML%w98ed4J=f9{3*UZY}U9N ztn|j=S424AsBl3{eE1C-a ztAard*|4a`;$URzFe)R_qpWw9b)+S7mu;&4(dTbK^d*QWtlbWtg~+1b4)e7iZF$iv z_gL#SEvkI=^TXvNE-9~=PO;+@d_ROEi0jCR)1r%ZmGb#DIsO)2@q6p5kEHbM>9Zw%MA|loxGIegHR-p(g@< zyM_|h#N>=^dck@;gk3dx8CIZwkkW**zLzrW+kC8{^62z6Waqv)_VsV@oB2Ug{<5YX z^&%lQnLoKYEru3&XAGuj5Ap^*7plw)xP6cHDYdq8O4r^5J!v+QHJvI7|GUiTYREXf zi40#{%;QB+9Kg29;6p3R_^@GI;NZvvpQ%+qT05X8;5KJB=Kwaap} zQTVoxI#EaC)x-F*veFXCDolL-?nlt>a=beMOI`0g`2j@SnC~=y(?ac%@*D;^W8~Bp ze7|5XzO4VVU=t1;d4Is>UVEnIfD3b!_3Uk;XIWoY$YjIWW(ruk=d^M$+WdJqRgaUdiNEbWj}W&` zjyd^k|3~a0)9}t$<3G%P=#D@l*1vM*<=mliE;AdGl-Jeu)E_pTS6F8$2C_&_B5<8! z6cC;2xo~ley6`Y21Q{ERibp@pNXN5Gtz=}X1cSwoJt%A~Zl(W0ZwKa@BL1fW=O=n~ zh*>kxf*hAz%98NI$`Z5|;C}aJsIH{%yJx|4!{Nt!Y8?CC%tf7~`j7FPZD4dtfoD&sewgieLZwvSJqo$Lw$3${Oj8zA+0%LZ0V ziQfuWVm7BfttA`&mKLT9R;y?aW@tt;iq=sw?_MqMjOQsrLb3YhBr>ONtpFDnmxb_T zz~THa6=q&rz^jMhpVWa#OJn zaxVWtFYjjJn5XDcn01f1V^{YfP-KtH4gl>z4Q5X0BhXgRpRFfDqg5JkkaV?3IA2oz zAO>Z~rPwKd%2)Y5DLqpcJ0H_htY`z%O_|Lon+jII08zlrmLm`I{&_NMBAeZ>sSvcT zKgs>Ezq;q*IJl0K>BdQ;^aOzIz{!rsv)7PyfJ&ppjr6PPusxw1W<#7Ky_qz=t|U{` zx&4di$Qr)AJy`^D@oS<*%o|(Gsx#VZH_E|lG*g<0R+2O-7 zGQ?_+K`@Lszf#Y>N_tK<9=hC7LR&xwAE$Sc(PJk`PA^&5-tEM`&Pn?oAxxIk-t4W! z#Rg78bN9ddX-|gbg^T#nu+Akf2RWUjG6N6dP_y3y4Jwa4+s(}c%|P@Jl74JMt!ZAZ zy6{H0J-&Oq5t==q;T4&2H6$>Q{x+EcZ*uoICY-v7}wwD&OH?}1HN%fd|4!BB9y9qP+NO?2mX zj1W?kG3z!hMoG;Hi?ko6{NkUFPnJ#HKX63)GNsy+{DR&8io^FqK?x0-!h^tb=yq$jqC-g(xhSt-4 zKJ0xwtj!YrM4XWhGJu^RJoTW5d70;?U08pv)#IfBmvy#y_2Xpx^CYtGTD0wF3M|wK zR0Tp?rDeZK_oE6j@2Zylxo2o{EX>B%e0u@ZopIRUchI{(l60ex8YfzxJxq-iKi6j2 zj&6Z@ApfUk|6XV^&m;%Yy3yb*B|wi-^my!eFYa@{T7Y*mU7ovlQvWeH#57TIlmL^T zEA32sYuI-+G>2;@Bcl!D<&sXc6o4)w6vpr}*iZS1HG(H)uY^K&>6~b3o8cv&fKTRe%+9kbuO$S& z#5?FLj@54p$$eR!smdTh{IqMdEv_nUB%d6>y^SQyFhL&fonuzx#*APsTo5pZ#jbd7 zv`t`&jvFsxV(?!yLao&>Xe!z+&#r;uh-n*j1&B|WXbpK%g>s2SuaBJ`0qhISe*+v> ze9o>;;7H|sFPNN2>Ie9pTQ(tWTLpq{Aj#DNU{e!;2=1SLsP2?syU;ZSdEC_#wp~HK zI>gznvY_YY+76ur0e5M{1ne&HzNtV(#^mSil9|oo!0Kp7?iug=AM|9+y1 zwgw$)1P1z@<;7_AIVUEA8sMwpC7ylwoF|nAW^U76S^uJ&M?X*n`$V4Q+yi zq5NRNg2_ttVT?5xJ2I+9_ebG|#jjbN!n|Y&%Rq&4nMJR|WCZjG#Io_AB4p*iH8Xlp z5^?u7{#L7sg`<1T!%bYgP&&l~Ua1ru)QdC6(bZsd|8=njK&#e+$S!5|??UYh=OOc> z2!8A!o)t4^Zw9Rwq1EjL^WbRBGXD0WvkEee(TDbdw5>Svxfg8Oeo)$Hs<*viRD}}C zx(yd#&w@aRa-nb}Y0D`)tFLtDR3K^V&iG?}HtIj(*xszFH0L+j@F-&Fv_(<f=7bsRs7Z;1pw!!s4`9ftZi3Rd)ptq9g;ec?*%z{!078`4=QIZkL+@jS?T7G~s$ zxMYF3Qbi^2Vzf(D{MsN+SX;vY0f$ukDu$Q^2~VAUS1kqkPjViHrvW!_$V{(mzrlQb zHKdePP5N#NaItxd0k3-7fqeer@TI00l&sPrvfcx#IxTCd%hTk`;E zOeO965g?-&Lev#xjgBC&&Zu`%L^LFUGxo|ugU%FgprkGPL5428!B1>MJ($E7?U%Xo z%l21d(b{@Pk{99utd3=`7v;1n<|q2yaVJp*9A`cIj|Ctd!@6SbpcjjdmDHE^qI2@Q z+qqh@-x@phz1P*7tQd{PA%>c|WDPtDe2A3DP$>aGkvCn09I*H&3^bD)8hM9@#V zejsqZTu^q5+0Zi`7mL;JjQd*VX$rALn64!!RZ$Df#k+I=s1k{E@J!HFCVeM;9B7xt z!VQN)`_pf_?8yOKE}%BhXA6)CX^#3tOm5~IJV9j`l`U;`nDD-HDyRkZsaQkgKr`36 zB<1&D-}Q!eby7pal*E5MSjUb?p@AxXnPCI^2J=mC-LP+Qi%CoVw=!?6ML$Ta`4e5B z!@4Tlo{}tit%LNdDI*7LHhmrIcVDK zyOy;qnY3YYC7|3()IAyXBruAa1I~z(MhT052ZMSpExD5I`ND;e1h2bucdFvW57XMa z(qeaP`^t8KauR$!yikjEwO&tb#gEp?Z_jw(QUkk#n+YbQT!9ePN0xfT5|HZX(R zuG(@RV^kRo6___Pdoe7@5uH_x3|(XD+Ku%~dDDwv*ooHeArq~;yi=ezND&Nb(TwfJ zy_|($gZ5OY^+#ZDIK}UY)wz)L zPd5*uJe!loLm=7&S8!h{)TN;4kiX>Ux zS3v5{+!q;TNL%z92Z@-Nw`;eIu>&+EQj&h_^+7PddJ~P>x4zV7HBmMvY)hQBOjVu9deMG~s%ej}VKN%N|- zWh&ei12bfEE`B3(6SWD>ra&Br;)~m-+Cyc2?pa>=KpKiCgKlV)`Ug;=;bgxjRz*Xy z-V8VgalggK;b0F)Pi`g&(;KU!N$MqNzJctF7h~JW;5=wRaE_jm8E}N2sRM(EHTu{> z>6qOQrR*$>O-MmIZhVmRxFot{`QTQP=}{>(>YzjKBQ#KAs|N~;Go5ALVVC{iupy2W zQ|EMYBEFJo?IfD=h0~S6n_;qTV3eg0lC=D6L98Y_xQlR|z8=OfLiZ(}T}jFW#WOGy z2VA}fm@2y?+ExHA|KS^}9)Y*4oD6=H@(>JUUTR4hRslV=b2E5}Vw*3!?wW)HGe2&* zYC$deWS3_369jcBKG=c-MpAy=6}8V$3L}%@7qrY%9tvg@9+re$7hhvL z8C9E*PO1U$JM8Z=K`|d=VPIK1R{UzX7IY*-UhZ}T6NNMLmSj$*bZjED=o652I&j+H zklk(>Je86LzOiO2iYJ}AeethR7;XjtOVYx zPMB0-z#aa@+K-)59Cb&E zE9*}5A}+SJ_>TA~vMoOL$zafxp>uIWKE1T>h4^;dzSUMLF62e-Jz+ zFXypH?r!-tWHr4ea#0uJXrv&}^UnoXq}hJ7)f!S%mp10(_bJO9s4iA(Pq>h$t5^=+ z4c!rqN)wx5<9tK1fOwIhmT!NoU9=w@1_J?ICRgjRy`li?k{paqNjuI{B6tvXl=FB) z=1SBi{$`7uX3p;+(plJ_%a{F@jTgHDfxeIJ%l3TvD$A(J6CtY`0Z^lsd!Z?CEEqs zVmz~@RX~#Z3XIxXoV_1>l9TZU#5jmtwLRr)#Mktr-@NE|hDLG0)ErGPtqv&W`Yfa) z0mH@tCBdA$ns=Gm#Gj`ouP*LmgLk30_^bekoK~UcmYZu#`PhbK!JaHiw@)rhYm|QJ zhKy@@LiP$@jWLa(0mwcR2{FyO-J!1_fxfyN;mq9r&27%RPTX>crXpT^ART?RlAVIx zVT&kfdg6cjUhEO@trcV<2@C$Nn|YgRzWIn##^BwxM*y8X7P_R)Ye{xciEtkBm@&D` z)c9~em|k;hX48^f(K{|Q4)1zDvoH1$d4Asr3H(ztd1V=w>f&SV@fY$I6k&V3JHC?n zR7y2lwWqLFb+yELgO?*{vlQPv;Fl$V76{PTG*=>m51x~q0R`3(rE7qAef!pP%A^kt zv22ui{%ku2-=CCeGuPa_v_s~FBg$YiB^*Ho#hWnM!F%qdq0T`YV-R>yXY%UEK5z*P z=`z0}R`cDxuA262)4>#zU_o(-pEaJ5Mgm5FhlK5zM(}+KW6-Zb9n@g7bG`2aEm~1Q zqTyTRU%#-;!ge6CAP!EF-!_?Oc+6Pv?77tS-AQ-YWox1jiCxLc9Am$a-U(=nC?`{{ zxmDLWiS3S3zJ0O1p^TAIf=8d-J1^$Y4jLrk9BM_ zv<887-H;jzEdVid z{k0QsKx!(Q6Zl3-%Whax@wk>`Wd6Zo5YwA+NaGUF@qPQc0Gr)prHK>V?-eLeMqStf zb|B~2hMz*vhTIxV6l$B{-Q{EP^}nMw!vWi5WO&$+0dqaxjZPs`cJNSOEeV+=Il*jl z@7b!BHPsw6#;w)?b%=WPT#CW*5{>d0MZ<+Y4Q-iV7brXulo!EvNIkn7V;@ovtOz3O zYEfonm!rkYI3{XFGoD9yDX1)sn`BIHR42uBd@eZn!ck(LY5vzM77H@9bCHb?Q;G#DjuON}AOX%;AR za{Q#<7b;ZhVB zk59uz@GB`NhFUI-gTlQo#K~nk3b&?s@{+Lv9@r$WhA#9=Y0p-z1iXeHOD3;b{uCJz;PV$MbVnBEXlfOQkXQ| z=R8f%RFi%jx<1?8?w>oT)mMLE0K|fHaC4i=#*dVzBpdU0ev%F}E6#z{qOlM0KZ3dc zujPy2qr)9z^WPwwKNj2C7Y_!KX2AkpXwG}7;AXw4uil1&!ws++MA368R@0A?l9G7! zYsPE&{&K|*tI$?5FvyEI;Zv;OtIZ(64ffZ#IQrL_yn$Oaj-n}g=@tfR*HWC!#~J(% zVjc~R>ro1Ver(*$yYA&LJA8V!KK9*f-(o2R;>qhd8h$`RZ_96&Ml6-~iq;aPi#py| z@Ibl#_FsXhhS~xq2d(qnDgcv0!2JXy|-KTy>SDuShkkAJz0N(JUps5bl zs6GH(lU$a>U%l(BHr)DM`?VHT(sIlh4k8#hzw+cjpu+N@X4f^P8d_qt9A2gi@ zG+q3#xu=}wvze4h<;CvL;w@*Iy(K3%E zUkd)8bnH~eKYbt>nq(UtQyma62B@m4imSCSCpkNS)?+j+KizdNg08n-WKy@q4T&Dw zYDPGf5UER^mv~tFN_{`1f9Q(O$#XH)$0~ui=?wz1KnBkI0+c;% zXm3X;jWOnb-^jWZCVvf|-){?s$+eOw_NReDkg_D84awK&l+FvY-+)qK++cUJoF>Na zC79&Focrt*>@1)`h7^gB(`?PPcw4EZ08>&R!s*g}AItwrb~j~myzhGQn&Te=^ce7; zLQeS^JiJdTI?Of8&rO503$I}Eet7cyKS7eiEDJvh$=Q(N-D(iZPhT^Xn=&sG<|cw! z3Q5rC+&A^a$^ypr<2x}$i}Oe`)RDQ#f!!UqOH-R}-{}3okaAVwB2j-MKzj(B~0Ou*LER(9|i^H+NN7ToR zbJZA0#|A*aQB1iEB65y1qu&3Xf8_#KEpHhpzUZ?YXzY_l9+0CEK+mJpPo4GnQV!V5 zd6L7+C762B{WW{49zxG@HQBv@&TYLob#z)C05G_;7pQtxzpmsb(KqxnpVu{SCe4D; zx**l&_zV0WW$_^W*Ek8ZdwZwz3Te}XyzUUbEt@wdjR!7{dw2OuLx@Pxcg=I6bbx-q z7wA*m%s!HWvh-esW2D9b7E`>d=R{zPn9v8Ctf29__ua}!oB|ceVW1W#1EhOvk>OVubyDh3HCizrwa zCiw10zzQf3gyAm)p$HfIO5%@;vo7NEKGpjkmr8;zfsGKg{=|empxC?`l)r^1Fa02; z#;}#SUt~Pt0LCalDiSyQfHo!Ad-E>`nz>*uOgKxR>6d}?0DC6V)eN81)tn$)0qad71 zT@StfDnwrSe}bU_wt^w~i`!mJihGrkjYroytZFIHXwPb(DT`p44vc^^B41&8%Nzw` z5QAw%?Qe?yU|0jJ1pbnASfaU%c4oc>iEAi~A<0MwcBDY~+k$e7NR3T*WkA%kx~r$n zYst{UOldUq*{5S#5@IS7>0YU0n_n*_^8^5()Gz6xxcQv~zkUfM0}_Li`;WwS=32Mb z$;aaJ=hc9@0;i?JK^1Q2^$Y)jAt?!(35Np43`*0$#htJTp}jWzf#jrGXvJ{!q86#@ z79VHnxbt#b6Q)Lp45B~2BP)|)O^c%Ls@h>W*`EhAc6atdF_ylHh~SGm?1| zvhkqEVx@6M%Aq@75M;U?d@Tk_`5Z~+e+H(@4GXedi1jP>$>065=C4Z4IEkL+EDc8= zUzNfVeIDqIIkf)g;{??ibMV(6&bSO9Tz$Fp1y|%0v_*V--&{J_VepoYrq*a7M7c2- z1;GidFk1^0@uWqcPrGJD+BJk!YMj{h7SQVW5R2}aLxS8(4&H&E{jM1$%MJDOlw4E(r$1g_Q!&L7pnG?2mTN~d6A zo)*FloP^4Pz!~UDzE`yn7_DM=2DD~PfNL@p&%f`P+f|F)Zo)JQGO)r9El%MlxKnk9 zWmeRR8<GGa0HX57grtfia2KvTZ55 z@NSHlS8|#s2%*kxqM1Hzo|8|LVln;u?$68bm%y2UmRV_75WhUe@gj-CVdhn2x!N@m zwj+v4LT5!;hyRRI`hpgnF+e40FrrZBo{tt+;>>8j4jyT^&30>)GRp21IFdf7HD;M` z!7WC_E^7r9Q=Z>vEt2`U{S;R}ue4+I@d%h&N3Z>N=^ha+EW-h#dk5A9yX#|7JHjJ3 z>LbTUzcp~Xll-3Gs`a5-U^GzrGhO&4_9;ny816i7T?Y<~HShXyzp72(QqF>e+O2_P z%}T;-m<&)m(V+Py{b@b%h0ki;35)@>kqjN$=?U0s-+y@k#CH>sg7il2Z~EvOT1@NzL~REooeI3-3Q@=T|M7`xyo8l#8Ox{P_?9cAKr=i zKH#gUfuzjjHPq(-32cLpkE7N88!uT&k4qG+7fOLh>%Uwh#hwV5#_VE3Q6!+kCmyTb ztdySkK)|JVgXQc8shx_B|0TmIKnBtox<3juX1xAGAPQdQWi^}P zd%uH1WPHvxg9#NQAPVcoN4?$+ZKXRpbk#|1Ah3c;htPUu|22s;v1DatXYR28uaB60 zeiA?Z?~<l?$x=cV`VRXxp}*ShMz z=)Aeo`17?PS%pGAd^c&vU}}9RqHqMYowyxWv?$OXc!G7RwCg;}r9?#z6+R7_GaR|DlIjN;sFfwW0Dx%0epsPBgLk?*QOgGMxx!$ChCqa8zeD=(z zaq(jPLxk#2=q|Ywr>}#4KYua6T^r;xpk3)2qI)!z;0nmDJ;GmKghal7c?T0mJy7$W zuqb&8oG@qICSrqyR1Qg^{a`&EEvz*jS(XNI^Yi?n6mO+$FUf3j>K;r(o z#ghIuXQK1`d~jK2MNgyjDJ}y;6C1AzttV%zNBp0h_2?M8-)`R#B0MmlZLIjX_cJWn z3?YBLSQTA=pwvv#((8dN;~wd<7ATPBhcGAwEg{xxZ$PKSb&1A)k8%-$R zO|F}rvWu_h=0LWv^uy-`s`mE*hA;ob@Cs;WE$D~3QhVC4n!3|YZk13Z+HRtZ)8U`N z2*HaIW`gE_ctsw(Q`T^xA6OgTgR$Y`2{ZipS|djR-@Jjv-f9gGNP~`^AK~tYe8L)p z{oH2k*i3)x(QCTnZ4qbZ+-Ob!hBGzid;123_cko>z!e^wNiPdbrV}In?P{A$(f{tc zw~^z;k!x;JQkILWMTEg^k6ZTpF~YeW1tfx~Yf#jxfUKRc_xK@pcd- z=%wVSx})nz4@Vlm)1VwEhS8Sn!@qus)y+@&`emoh&cvx5iJp&AGl!d`%$IqQj9tDK zB=L;MCZFzX6c~GCqkF;uNTCz^>2Jh5y_)=axihE*;?CZw=kITYs|D0ZS^MsIArvE) zZJ-3IO|FwHJE-Raq2R?ZqL{epADb4Zl1C_IW^BtTarEKjwAdT0Ht|(Sn;h0GxDN2I zAuWO0zGuN;ZWKP+wV2csv=fjsX>L^em0e-TtKEOA_l)%wP}ucdF(K4oOem}}bY(}P zM#0<>`tm3_Pn4R)Bw_56Rkx`v4jmr)+>9X*^(QA@#eGu3A1|& zli)nnJ*hg$eUF@}Aj!E!hMicT70qYE9NV!5Sov>d<|IF36Z4)qWwBdp1s7o6+_QJva+>8es?^g%-nE z3ed|&J;p4fB^&ZvtJ>=RL%|UF%obLR_znBts2EFuXH8gEt=u}zh}Y26~52>>SEo7ZY8fSzOXge<)=U4)gHd{t>Ww_U=Jv0YPQx~^FVoLT3YJJ zt~xUwr*|s&2^U{W1s2Y%>*Q?6@v+~l(Lwd^!{^3<$f4bzg5d|79q|`5Hz-OX;_18_mITAzZk#D?DcJY`Inudyt1KCwX}(6`g4$--f=1qFaHHF8JJEEom)C?bM8dQpywo-|HNd_ zqG=Ix0jNX(bZj!XESMr`UUiWg2|?I$9-+_th@HVbZd~!yF&+YbLWRiR&91p_DzD7`L_saDbG5FoD{T623+V;lTKjy)H09Rpd2;{nwRtvZ zsN~2WkpAlrNDlx=!x4~BDIMv1D~mkP4}HRjQYnZ8(3*C_JFF)5Q#vEwG&fUw=!9ZM z8t$|xc%lrOU&h463Pz#|SiGrD!M5@Jw1IzrAq5wx`->fEJzhD3O2+LZJ?4gxTWlW+ z6#(>1^$Kb!(-SrvMA1YnzSYq4$1j8+=8&e|z7{_}R;P-Pz9)B8X*Kdtd1urK(xXN* z&ewA~Qh!lrvROh{+#WPx0oN7(qm-&!m5-PkkK?~4q+&&J65y%6B@?616LRc0qna$E z9)H%QWVz_IiN4O5>2LhLAgLcYmgyQ&WYS9}ZdGD+y`7Dg7ICM|+Jciy^Y<4!**?U) zYvFhavcvk%>-_0v4=_4XGjr~LX1o~r#1GhQOzXs&kdKttMJ?j+wd z?EUXS5eC0aPhZZ-76XrW80K{rC!*L_FGpCS>bB_ZwySED>{y{_J~E`^PiyR&xo+g> ztu9p}0l)OK5=q_xk2jo9mo&ijVzU*}kem^TCa>AN=`?x;ImbFklWiwDZK(T6O`*C~ zMOmoWa{`LBTMO@I{Z?J$M656*!#vdgvAOUy5b8rMF-JZuSPZ+S_<}NP>64a6YbV2k z7KUdjBVqXHm*Eo7s%;^5HsNC`+W72uA-bf#kKRYuf)&fXSu?ZgF5TPay&WNI1$AJ>uMhARKTrTcnK!;F^TxYO~N zHn@<)9qVeHJ|lK$&tTH^yRx$$|6e`#K-){cvooyXc5wEEHiS)5njcH`yzt)0o>DWq zeNVMwMSPk@&(v=48>F||?deP>%SW)oUAd8Hf}kz28?7lp68>#qkDN?3yPBQ^$45|A z(3SfX?K;lKDV!MmD>MY}BER{b3RK4Q%*e=Fcx6tLM7UXaT6CFO7CM_(riWXe^C^lJ zaBqi7P3?nv)&<7@x(x!WeC}Nz=Ec40$Q_0ZU)l zrD+gF>%yGQ3L5hYU21a(BA2PO%uQMg3>CXEonNrVP%-j&cC#2he=FxbbX_y zm@%98gob6ep8)2w(Hc4XzDDd(sw~>h~pz+>MwqG@I_(xW`QevV3F|qk`PT12kZJ52~Fdfl3w@P}bWZgbH zW3FPRbA#%O-+W!kOXivIf1TSs7j*c+UqIeHUNA@OUkr7h;wIN8*K;rb8PHyFkY-x% z8|;(!w)pL3i8?jy&fvM@;EPv7!mz2d1X|X_g$Y#&I}H0<(_$RQMD!?t&b6K7iCW-Z zzx^<|KC`#d|CdPhC7Z_E8ntj>OsHj3?a(`i5v-EG6eKwL+j{OYtgz@wAt8Wu+D$R- zUg-Y;;`#Uyse{hts$wjr4CXg>1|kGG$iDec4mY42Eo7N+%7iNQAvS<61dhlzObLh_ z-zY5hK$!?p0@vduYcTHGyOYSoR-LX%%fG_q@$V|xXT?LXjH1E-!%btK+$|4O z`u=7&6DBO|R~KCiktsLC=@uP8Fuz1OcZL}K6HIZj5pPs$y;N^E9XZJCgU25KQy64k zv_^d0-Dr*G|CmWDZ=BGYKVf$2kY;&+G)R~EdABo&6Z!`yn^d!Gx4XBrJ(=mg7M{p zpJ$*}?_sUcZEXcEEg(oY>U#MMVTY6ZAh{wsHV$?B`JWN{!C%$}XqH%Fv`fg2$}A=)Bwq#dY-@SX7leLi zjaq$*)h)_XvI{VrO05ss`&VXr#DV5f>`VjiM!r4r4a}$q(g!!X_orW%`FW_ib7K|e zbcrih)fAhxNo&}e+;R2K0P%Xzt?i|y)z{v9y)`_ee8vTGwO zRQZ2?%MB?Xu_@}tIU~2Gl!T#6uPJxS^#90B$2rc0=FQlV!)?E0WqZY5jkCSo@E66a zv37_NE|fp~2 zw?KvIcIE%}CDyO24aUr#KPfBj-&5a|Nv=3P$5i^ldR~BSaw~H(HgM8s(+t30UiwR; zUS$1IZ!zpK;O(w$`aN=}!m4-7;NV}1{HTrb(vZg#?+vGx<$PGU>I{ns3@Tu->xq!QXQD;2$A}=W-D=#*4O8 z-d2*8?OG^CRoaFA3qk#oTBUy!UcwvKO=^E)%yRwv#td`6kWchh#u(0PV!!_!PC4@n zUvXx&V_!Xt+T-F@*&dEJslEK|{{;86_`{~MbESXJnBnoiu-x4&n49Og8!l;1C_Qnh zIVaLF<4>fY>it{=deJ%~(5NqXS=`~xA9k7xI`rl9q+X4DTC~Rae{{WfT$A_uK5pwd z+8za3MNvVJ;wS|{MfR#v1w=qmK(-5zZ3rPi7+R_*2vHCbSt?7yULt{jmZdTRK|n^5 z8k8`T#sC3g;Cnx`B=pzM@4xfv!6(mq-0Qlp`+CYX3olM#F~(q|LVOC`j#sV)d&JVY z_%wznUq?K$DylqO&T%S}ic}{UMU#`}`F2jqqyM;#%^pnekjwp&@X9*YQcJpZb*umV z-L&#CCjycVp}SAmT14kI_h~&7?a+BgBC^L0EpR?F6CZarMK$(mtzPnJ4TlUz^`>$j zd7xtN)c)~*{&Xfkq0jZqQ0h(-k8JS7(Pywu*rmCj*1HOQK*?8xy-p5*)D6{|Pjp$N z8EDpZ99ix0It6bg0Mk*_yhE`+e7o5Hs>u6z73fvX-1YS12e>uosORg|%sk;#ivJ`s zruRX`&KgY^*ECj}*wYGGOv?FTzD%m5 zX;SF5KNh+`elj=bx!zs0{Nsd?_qq^h2!!sXk8WP}WVi*lWDw_OW~nUwB8KaZT%Bu7f#Y zhwUx?U9aCdd`K0Ma zI4lKC)o$c(mQ-bxiFBSCVz^8FN=dABufe z*1z~PX!q7tvFe;tZigf9C6&au+>^D`CYDe!4>#FXPkh5A(FOmHb(*Y`dQ;3S`Sszt zx8)9UTkuUsS4E!uJVFdU?-65+zushrt!qNKy6o*6qHw8o6l^BYI>EPKoIyvc9f~bZ zP*tJH%i{mB6w4mTzO&}Uu%$mu6bdZpa`>j-MHfrv9*eGbPQ9sHB_+nA0*ZZ8J=qNj ztBy0S8;WiKjW-WE-;>_u5t@i=T8e48bU_q$<9@dD3k$ZEQhnXtba*^mU-sUOH=;zv zrh!$>_+XtDuAz3A@`BF@`ekdg$Ud(F>PgEXRMlsCQtI7CF6_Wz7M=v1-MUxgr_R+8 zEbv9+jAQ*z?j3ik#(v3U9JE^%KL4Bd=#oVKBSxubIaBxPZOW;<{=9TOX%Ny4b5XWlUyVH%)r3YwEHU-}d{eV`wcMl$5jUY3lZm z{9)`OvPUW#L|*#9<7LlXrcy`pq!_w0&r`CgcA+QrbXM=93<*jwS8J!*UAnvDa|9uJ zhgLt~E}$D%v`q~Ylfz8=E!aMWTCy3dH!;ovGy8tnFTr%_VFu209_%zw@A!s9(S1;MMlb}=Xv2O($@rq)j@@B)@EfZ(BbSOEl!Hus zpFdY+>~UZU!+7|#{pz5JvY=w9f>z?(Ec{BU^#4q43snsE%4XjXp*jzZtfgGe^^W1o z%2o1=se1adxi?lt{H>Yb0PQu#a{U{2Cf`f~xe_rutqP8HS{p-!q-nWb;aQ-Q9eng3cleL3R$ zUO}u20e3hr_KPC%&(HR@7?coV*1rTyT5$ttB&vX0EO*4uhy*DcC_C+>?$15Bk4a)jBGTcxf0FDLAOsmJpD+%j5LKeFtezbskv@crGU$>H;DWT!dWo6Thn zJK^UiClkuaAD)Kfs=kr1%sTkMK_R~4!uB2h$;_17C*rfr7N!O>upjpAqbH|1n8u91 zndx(yOORSb%_ckkvYeOrd;Joxp{&*wtVi!W6~Ehw;-mVdVS^#I1@9Q-&&BkAh^x32 zJ`yMQ+5jK(7IDSCu_lz8u2){Wru*&v$u#~cGj)D`1Kp5g8$2<}r!9Qj@9uwkd6!!Y zzc(EyY5RrA2{ke@jh7VkPSpo~XdxTy(S3JsYrksx{Me*g^)uxDf9k!p+vnWPn~o#% zZcpQP$JVjv|Czg^8$SK}nMZ!FJMy!R@iN^l-80&c{pDPi_xaG~v=*+I*d9}>!Q#~5 z<{Rvkp@%z1O=4JmzDrG$=zl&LI4vzmiD;cxXQ-JQA6K9=)u<4>dnGBl#t*5By$`=k zGz{;}#LE6!kvDMS|8VYc=4iX7g{x_1#>YJm@X>o< zyegarC8n8jzJmYzfMMgkxMw;7>-n<6zL=KJCVHbWe%cw*=_Z$ymz$E_6%Nkfj2S>t zi##c<&f5WuCkN#f&rO-ek3`Qh*NSG~q@#R%-g41p8? z9y#JcnyIN-K|wcn__Y2ZQ3`zExNDj$;2VCQZfZ~tDeA}VxCz7L$3-VV-dpl&{) z!Ya`m^^$ez#!X`3{) zfAiLjuQtqCy%QyGke*8)ovI}3pg#7g`m5NAi`1=n);&>Z>$S3$<4+S5(`)=jb{7V^ z;|0Y*zpdU6Z^D_GS^lI(6YuhRHHznKMNlYS6y-~7{_5%^Jbm_PI=-#V)cym-FbVN` zLHGah6r>YTKrkh@O1Ne9K%e@M><0x=lrD&+jx1n{A2IUy?&g$7(@)`FpA{8m-tlrT z_>B`b7~&H^y4yEi&f22tB#r;PdL2jA6%8sqqg|>)J9ZZW3f2~s`j1CIIlGl@-7{8G z-muL>3{WV`n3j1HQDjq^>fL}3X(y;WC+sC@X}ZS)#Hr{T*Rmk$DXe+9_kCfv`&kUf ztNO^D3Y9cM6@8!V*y?o@P~UK{h0yb@o{z5x&z=gZSp5@}T|%_&xlL zC@hs&EpsS(b~^!ip<~F~)V|N6r)hoDrSPm(_iLy1OsOU8cr`ytg|dS;9aOve5r-_O z!C%sl&WoC5d~XeLj+cPl>bC{Ia8H!?oO`}Ozo~V5wS#ZXNO;XmAOUW`E3+0pmGZl7Ng zrYD1jR{cb6M@#dY_rr%D`j(%?(t=VF`>0VbrW3zQ`ma}}1D7-B+@m94e;sq$JleAG z5yMtRy23=-3c{SZ{g2xMrQjORhD)+&XK*8H8)Ix93SY@To zd5o`1N!#jSt$Aj^*Xltl-eq8oAng{MX5u@avoFVviLjxmx;YP7c0z`05xRJ4@lWWMaGWbn*3QbyIRjeRx;)Qmu#o7oTCPIN|;KSuVfq zUfJfPibLL6zsjBHOjN=*)V5%mxs6l?#eO zQ(QO)3!SP|o>_WEBg1K0Ry`OlB@wJ0xXKoA1O0m>%@z`hcbH2pg=AImvxq^b^g?(D z7Ut>F?HJhh{aKA;-zSwyiq81=NsFS07J}kif@$%P;l6mF1yTHLnbAu-@w6@02?0KK zQcN`S-1+)Ve)W>ViyKxzIsVqdvG+vDy-g#V@srnyOM=@*@6Z2jRc?2G5VLhU49U%2 z*_r|t&!w{e5cNk|zjpDR1_hIu z*8Bx(Yn)2}R(9!S5I=hbiMgg7pq6okoqn+~VM}o}^Wg;Ja7iiAU0-%7f4uj&%G)5<{U9i+U$GHIOF1^W!O!BR?460_)AUuY+s9m>ampo^s}7W zm#YyyPx|)M(Xtxpt8hPsN^o<`SKCnosyU*%WyZl^WXAFozPPn3Ra64@ib z9LDH`A#5*X)rc|RCe>7R`+h&M6cWN7sJc_-^1qeTXx%}wOhDR*{8XiENN>t!W@Tx7 zY&Vt^;I&Kqf{_U08Z+c_9*{du9Adl-3<9g^3aA%FXcw`k7j(yb^nwH^t(nQyUFj#eRs)l#j5sLM2JOk$2I!SRU{DE`3; z1&UbX2eUqE%!@1@Cd2VPDYIF;R>D}tHD|JHFc`UR%nyc*1y@+K67jY>Qgf+}tC#_Z0(eSN9{ z=YvWip|7PH@DDqoxLE=5)cw6x^eoN%OB6^@gx8!!$U+_f8C7}U4bt0i=k-Iza9 zN(3fI4XhUung3`C58$r`x6WwVi=$yCOvg*Ssi$_0tR)pvUKWsmkk+6_ca;f|qv}u9 z4F{R_7Vt`Nf+NgSV{FIsBbsN$QEA+8+KbcGl-B&VA=&N}7^eA(PZDFDP%5(IO`zoP&;dVHUIWf8%Zuy=+2YlyGw51X# z)S?;(m4z0iChhsW{8shr?--wLe(m2dk;C@(x9&4skNf;_ZqUY@2+h?9a(hJ9D@f0O zoG4ViWz04?iy3(1+K2D8Ku`b*);{j4%iB35NgH95!}{$)EDt&U=m{2l2ZG^15x4Fr_6Cks0rL z3@%}jZuN3+O)q3a<-_Y2IMMsk`@<)KVnj!=*Qi5|IB%L7nBDlP@HcsP3bLvz6-T<;f26pX+~1V zb^d83aD+&QEFSpiec1#RY}@068&o4QO88eINPGtmmBnzGLscwCl>Ir#AqOTR6o`Fb z9@in2s{+c^PM@Vm$vl%t$g}YT;@s~+(+>#V&+DHSbSwGyX?yLPU>rdWtU8sOzOQ?* zK_xD!7hMA~_NWwAMH=9E{H`rgarw_`dgs2`fX(Jp78g!@8QeMSFaFM%ZKbi`Wa`*^ zbXrhgyWs2IleW(y_#=^dK;_cmw{8MqJJrpN%0c~f&V%z> z_DVXY(La^YZG6@oHL<9TKO6*9W(2GTCvXDzPdSs79j9<{N$FZBhC1WE$fI4Ay!d0_ zsG-kLnu103A);4wtHX;~67k8$x8mPOaH$;xTyfAKf0T8)HmgdB+Q;f6@@^-!XX&a~ zppU`a#3v;M6(4!VesM`v!~3rEL6%_HN`rsqGz?=`B`RJP}*&Mwk#YyGyRYA{O` zDqTx|v@Fybh6s?~jl)N@22I;E$Ew!OBJkDT2&%vnztpZpwGslS8}p={o5)`xC)SB` zG?ZK)9C>|efamx|EHUQGB5#7GM4NRkuZzIS4R_{`voO2?t%548FVQ2~Onu^|L4V#K zr=%YYAC8;=%br*_A0gSspVvh#l}#vx7f%rA)WkUYVIc6~RZ*kf9BDnIa7@+)It)s+WLCw$B@N5Loxi~^s=-c`8p`C_6IQ^s zYw{SwQ!V8FNc&H6lp3#?Rz3eIT=Bb8nA7wK3!XFQIWL+%?%IpfB=d%LZjN#pIlvqD zWRlMEwh!N>F*;w(kRGt=8s(!l<))a@`5}3%kl{c151Eb=Ie!_}RJHuA!)K?|W+`Qg z(aU5-y%42rgr$i~Qyqw)mRF!v!h%wL^HvbG7liF@JJrbU#7hhxo3}p{PchbKoW|`p zqn_#`ML3@DTh1LOS*Y4C&fM@`r8GYqRQiqf8X~vFVWu~%i1k9Nsg2y3-J)WJP2)VU zt$aN()RLWUdm3PAo?#xbo9z9n{6 z7$l9x!*9i9kmctG=wiv-N!n*sNGtwe&uyo8I1%xdL}MR zCM0>5H?qUA-QRB{7_Sv@6}7O|X)3+_2a7%jY%!y=I-qZ7F7e6(wg+|S1-4-=u&eXH z1C_1)&f_t(q&%(tB0^x3^1YweJtfg1=n;Z2&pt{-WlOzNs;6k5p0b#W+rDzN*7O_Y z513(EnjB(}hfXIe;}$7(OKs(yTGIwZa#t9W6JNk0F+Pz3iVa6oxuYHZ8t=o{9b14u z@7Uc&KZZT&*nG5UaOaQC2G4?7t;$4hmCvNiv}{j5BPQQgApLbYcc;fgiXnEXxqG=2 z7&P5`v|rNlbwql;Eo+O5Z0@;Lmq~0Ua$ZNUhUVn%I160Cl1&Xg!F5Y4(9vf|qGP&e z4za;LQ|4>pj8r$*>nGT;&+xQ|JK-W7!N8^%o|5tZksE4BB}F$#d`idBoQ%Fuj%#Zx z$~yOsx%)>-c)T89PCghP5@T=2)7~oWYcj7Uqs{}R$)Yr1#b-KpHC;F=LG?<~&ONt} z)8)P?O2wS7->$bI)`*QEE067>;+o`bd-VN;`OVaiMO@DXT6e=JO@YQD5OLo}ZG6fP zXS~~>IbB&CkDzRye9wfMS?5Nybzrg()DYO$NzIv6Hp>m(f^JK9!#?Z5MYwyb{SN#5 zAD%?H+8S;^lZUN6F3pT?(m%#>aHLQI=yr}4aFw65E!0H?KW9jinlA7TlEWTBS`v4= z0T*MmzK5qXGJi*VDtN>`fr>)??+`F`h@O-UTq6mO5@#EW=;6N_WpElizr(_VbuvzrPv zNd1&tpvhXE7c~5mIirPX{(cjgZ{HN8#CG$VKM2?U(siN39*O+agBn({k5gJ2joF2| zd&ONI1sCbYr7)9Uj5E`isYatTO_e8Avkw)hqu4#`sonC84qyl2S6W|GQE|5e zbtRq@xe<45%FjJxE-*!+ON_|8q!;2<$k+6A{xb0foq+*TzH@l1Pv4NLxYH_Az%)e7 z%?DpKKKTBjG0rK!;+}t=Q4AP^*7PYNd1tPJHkJE*QgCr_k*0Xso6{t6Puu5{jq;JV z&U6&kV5yZ=`!VRxWh>dF?|XSMd#6yWc7F&P4A90-%Eh@ikC!tH?Lc{PC!Lkth?SZ0 zedGH-2*l*0GXAIO!zz_aGAZ8a{O;QgNd(etu*S6x^_EE_=p6!Gp(g>5m-#;qX7xXH zoJtpe!glv@(R>}ku8Y$8bZ^J_g6*pWvH`0-e{UGNM>3*5;-&(;MD2NG_)ITEIuoX( z_Va^P*;vNiY$2Su&5HivWvvY->a(lZk40I0aRw!B=&v(J5fbn74H#7+DZFZST+Es2 ztx@7RZ1pz&_TtOwtu2;1Y< zjncNQ{HZSlf6UN$YM$S5Y<+c{7WLkQfxF}H_Jcmr63FOS|9tG>%aFqJR1e%T_RCBS z>B8{*42Lb9XOnp_!-;Q^Hxss(4`i{T7U7&P*i5bG&W5mduEF&6QX@x+xacJ3k@&uV zV!6x1w%BxFj!zgEJ03@jzA?|n3UJ&*s-8>ydtzk7H0mgqqU(Rt@-z;Xq*+_Xy!>2@b4heYliO>k>T<-twpla1;q3?nBlB((9T zB5at|Gy!uoU*C5`9d5&33mp9RWAMCvR3-}-Tjk`HJ3jrr^_d}JM2WnZ%K{DfE_7JF zMb(iqXw`8u^npB=s)MGk9lo2r(jxfdX&pC_g+aXz3s8#;GWE07=_B64AADh5qdGOC zj8XVhz^3ySD~l)G<{~?`)S#PNM<`*vEEyCL*HlcNS@IfnL zZdAU@m_bE-ID1KTpL2Ronu55Uu4UNRFs%Y=Qkcb4(XF|+PKi_!)+-ChXtPqvlq&R6 z@bkFSjz6Xp7T-xyaS~NaJEx82dKwiqY&5Uk!t0c4HQh^L^6wZid+Tyz@7s3DR=tb8 zPsOx&6ccJXv@W0GhAuXod&kuJsm6RE9)4@L=KH(L&Hv)@=@$vAKhk!|l47kP7~5+! z)qi9e!33vNi<#}OD-afmsb!n;?X-SNc5hhocXF3bQ>=ssx>zHu*c>Jw1`i*?i6F>lps#pt*KWPJ(%A~!S+I>H10X}zD zeazTjP1>V#mO`Gih>mK>)Z78YZnN3&3MiuYHMKqvwgAre6XjkGyR(ujTK0Q)mj2`) zdE0=9+mWkfMa6DP>U5CNsS3`>$ShmZPGg4fGBS&2U%2{Z>6Kmokl2Qn5YNQb2TfF> z#*g(;>%s370vCySa|h)VfWhsvcKpElldV*JR|n9)9ltJ15#Nm$otDfJyLu3P&A z&b0+qm{e8ApA4FJ5pk$We$B}#%uY`Q*U;ya^&XsE|488EsLYt8wk-W3p3Xz2eo+9) z=vI|h=XZUbP$WSTSI_t}8PoEds*9ciu&Q_9y$^+Hjp5*u?P3o*VnUi=;3pu2eRF+d zrshvb^$a9dJ*?jV9ak09PZ1U-1;1)Xymy(neo>A)lw^T*Ol6p~qe-aIp#fgSz0dy} z7=A#!cgP|b4C1Kr@cbwXS1Wj%KRy)&1oZ^|`t6iIdY~x*GmSCEeuvY8-1vnsjd7Nh z4hZC0PFdp0FxNqO-%kK8p%Ey{1C&TWgLP$Qpbw`uXmi&Ryrs-76wrWPf! z^oL8}aN562Ha|gfk@3b4q&9S+QK*D=c_>W_KB~Y=30^luE!GP4@wpT9IkoEdgpdfuE#adL6={W~F}P7HS@Hz|h1G_VxHz4n%evyuNo6Gyug<><4| zFY&vK>AaeEr`RM53%XtC&(>0g0sW!Jchu!pkq25}=^+TwXG(v*2FJDpy3d#16G9yQ z+!l`7my-i>bGCtZHSW(nQ}bZAT4|s#Z0WyDfVKVBnVIKpOgAvTme~7Y>u(y*76h`@ z$@pV8(~R}z|$X@%FqV&*xl3? ztbnDc14 zI@BHYwVQ;&z~f-FF zXEf$6$b+ZXM;nRzJmA&Fvt+3HlhNJ2zd`!H7=bi#Y+>ly%>59h6F{0wsBRC*>dz{Y zy-9YsjPQ>P!GM|N9T(?sg@t4OWBynA;cgjkas=lyHp9YOi7;%h;u^Fqcf1hX`t<8| zZb4N`o4VfLxsdD$I`ce@te(ZP&wRDMlNvniV{`Oxs-ViwKTRTSbL+>~y`w(Xk=6hG zjc!cUPbrLj>}p#Cw&FO5PW-opj`ah5GwCEuaco1#M3I8Hiy7zOR<{TIdXp(kL6h?I zj~L!=74FkuR+k>#4|@`hd(ms>QCvselJueXJ2IH%a#=NXti=FkT$P5yoyi zVSmasE!_o~lhO-ue6>7Q(vwyH3_4*=s)fG^AqDFLYzh9vm&j1Li9nYDo>R()3o=AW z)VFH4joc~Wa;*a<{n+y_tfa-*T~4;V?IYC@N#k+&Gb%l|nQ1|V{$(@f)(OtZ($gkJ zh>8UkjF~ff4~00?3f{OM-14Zo?8KE`>48I3yJnx6}dK7Jj*Q>XcQEEuRI zMH@-%v8aqE;x;7(pXMpI_|0gLv4a3(@SZQ(M|JYJ;sP3K;Km~+&hCM)K~H<$EV(G_ ziBigR8caHJh@4T>HH4U+kYLSUHL@bU$#A#obg}u^y7f{KJ2FmZcs*hcm8Vwm-M>)& z7^$AMkO}`dQcZ(AehpoQ3m7C`VI;-qrzO_6R3>6w6Sd?+K8SvOhVE8mz0om9D#JUd9Ps&4T$ z?x&FTM#Qiw435-NA$EQ~@vsRXc2t1E;SF{O(|IkEFQK8QHRo=*$hPSj#o-zii#*fi zk7CVHb6cE3Xso(vZMUt|dB(KbSkWE})JGN4zObezQHRKUmCpuLF4bvFKW;pv<`QHM z;Mivb-rUgiI#%_~*^J1-H+2~kRxw}hgat$pyE{+CsFKPE-NTI1%-qkDy;02(j@wsi zdWAz|vY=HmiS#{j-dxk@HeMrvg^TG{Zqg&0L*l>+Z_2ZwEV3`Bvo)ZY(&M=$GO9;iijkZ_~?IDk1WqN%}1qG9Nn0VM%b(7vQA1AX_m!+;yp47?x#rhpW`#i2oCe0|l-y^N zNE@kofH=u9#(4FW8vei!NgbPdk2uaA9~=3R!*SabrTX`ZXZ3xu+8!>SY{NL;E-IW3 z)xU&zKGM&~ChToup2aN00y}dDOhYc>+~WfgF%(AErM1G=2`qDO$N0^)+{Hg4-pft$ z>-=~`t*k260OL<3;y~~q-C-omZs1RbC-374MyF84RcU(RY zoXzX^OXp3XS#?Yw7i<%sBCvlaSbV}Z!^LHPk^Yl)knDcTNTLuT&O1ZJ8D6_`UM=hd{JJiS0 zVf?88yud|2&>5&g7C%G}1pMr;X+n6@m8p~SzZ7YhojZo=mv-MdqMG!GS$+HOB49h@ zgo3`1ZPaQ;g>4TNuXXtXlJ{)!3(G=APs;}-=?TeBrja(iV^R?NH^UWfSberzofXSB zYA=W%ROu0uh9iB%tc~eq5~V!SahsyVpN1_N`TQ^$0NruCEis9MBWWlH7T<1A=}uE{ zehzJ+5ehRspeWGgW+#&t*!P{&m%8Cj9HxG2yFmX_N6j}iSeK=}K*6aeC@#7!-8J3; zoWgK*(+oLS+e&Bo{4e5M?$V(~SHINYx+w62f>)oH!43yazvweFz2JuBs#*Not)u(F zW>a~tuOZ)IJ~b}mRMp45grpzzXsCNy~slhB$8J$~*wzOT^$E#ea%xnmOmH>Nf?97ZTt|ejtaGKI+tfV- z<_Ilo95VT;7vfzajF*v(RsM$Z%3 zDi)-G^{(;KPKad9gj;=z@$`A`?gQ&4fg0Mkr{(ErfX9EHAJSo30CSa02!Zbx`~ z3V8FID+JAL_pDR99L*hPn?35Ik~N{iZ2VyCo6g(|E=JQ-<28WR7w!BatYA?>zWcT1MO{e0(4ZH2 z-S^pdQ7&Ci*NJmS(In#w%U6(4BL^K&&*I^iOm%1CAx4>7FRzA;wiNe*BQc?JrIO0N zTjtY1XGI#=3>e=|1u^UXEJJ19^ZH$~`Wh=_y_dI?aSsmUgA?g)k7X##21=IaC?zA7 z1i@cD0m-w_c<3e|rR#(0d;Zyr_H4TVUSUm9UB(AbBD%?AeU(El8JJ#u{>!U@dB0%a z33<-w!LNnM-1^%Ykx51T3kE74d#Ss2S#&vM$Sp9n**_@z|9mii`HsDSK8S;|IZkZ7 zL3#eww4~_PM|M2BVM&0R6;Q8#4`6@qhyAz^%8V*iQ#5#7&@C}?QxC2hhBJ&*O3j%q z->eW8?z}$a{w?=bYe#g_bg%mZ6j?B~xV^sOJ1NyG$79l)9NUqo7xE*w)(_Wa<@Orw zJkdt?;LXDdiC!@cuxc#Sj3-i<2DD6F4GXo04&>CJDT3*s^_kj$rO6XJUZ6i^ol9PF zkv879%44GcwA$(RtZS!q?pPsNLcmSMnoRN8Gu0iLhspZ4jijE|7y=WbE6fR z(>3AIICAcrk`9+^eSwtbhJB-8G83ubZoJRyWPq3z={;fu_z>z2Q`ZTOy{{*d) zI;}_&1?O0MZ99f}rvX>Z+~L+Giyn2)g^Kxs$xP~TcNIpOIl9$S?H5#Mos$9x$Lt8RBZ;aKo zKF`)`pz@ntWv;yTngqC>9L%}s_KxHt6K-8Tgl`zd=^J^{(SI(j|6PBXphqxu0aB`q z8yxR>X!ZI4R(%XElaP15@oCET#<|B;4Q;0Y_?rnXR%*Au`6#Lljb|Nvr`|Svg7?W2 zB5pD-d_M!e!C8x4d@o?med6Dur@u+;!0h1;CComQ2VJ~J^&JbrZr}T%PGjW&%+IdT zM7^cm3}JV$s;50bI0TCvcCC(nFiZg_1x;^zBJ?;0M7h)&x!GZNhC-=|;k4W*(rw<3 z&_C4g1H@wm-3O_n8b7WhT@QM_RcWT!SX6X%MGKutw;B-e<_aN`OP&tPn8g?qzY0nx z8|EL2$VnqjFIp$m8R~w#w+;x|86a{Zfj7o~zv6n%f5&7#EkoBUA4tU5^a!f`6pndY&O7$b>K4+e{>>Aq=J*10frZj0bV zC|eknHbi8K8i!j%H0(A4U%r-qgvh_H7k*s!WGc2Z_E)43B(>wjPy#QM%ho3~9WOq@ zniZfT28NR702kAc$I{iA{@FWyqJ}9LmgK=)pfd#^Ebum93JQJHlo!U41?^h&-}^2B zOBIYfrTPedxesay;DFCQwleJ}S^eX}Zt#%+wcoZWPWQGS0B8xYhY7ATRe85__+wTj z)twdHz*Y!nGYa;KCp%!{w5F^AG89y@t6-mq{B60Zc33(P-p<0Vps}H;;|4?*d=k|d zd$RVj3MZXcO=HzdplDiDM>kNYxeUGfGH9+)NwE#k8YBDgX8$HaXE>P}+4hblVUZDj zFcVQiY{QGh@YV(gpvtXmzkCTj#v$V39Olh`<-YjHogu0w)v_4+W6@_yccC)af^+$fVcoo^rx!WCatbFmr8W%jho}uQSeW`e__*7xdO|5AH(d)L+0~OX_6AovIN=~{B zZSEQ4GFi*TW1MwhFmvEG^j3md5DbFshTRfE+(!bqzim^4-BJ+kmg8>cI!Ig|xTW)v z1c%RJRG=pej0U$bJ2^Nh<`vZIEf^%j*{o`(NM%O1rkG{mDAfaD+m9}zyq#gR=abl- z^|T3G#~Ab`+CRN>4!LYCRUe_H6THp^b;U1?o+;hf zB=2~v-<#xTCq++!RK5Xv?YRgB#TmU0<=Y-a=U`joJSbhM{CF!pNev?c{u4$aE>RazBQT9ZJZEP6ULxHws6QGai_j@B4+fx3D2FCNqMA3v=0 zi`I4d9Ej$a_)$;p6VI?qeOhI}?x}Oj)_ApZWO1X%@>b@MZYK7h4DRG@Qgzr)q3Z3&)yOmCtiNf-*x0E$Hwd+n+Y?s$kYR+IZ&A!oO<%grbP9ZWcO zm6d6mm%BO!O|+k}!kb<9Q}uXz#CHO+#Mu8Jhgp7@TkC(C$W~SHatkwTxj@S-2JYS! zL;A^yQm3zqoy{pTFmT-ld-UN1aOR)BSk_R)%Uxb|h92p!F2fed_&*NP=7SVts7-$s z^V52L%Bk##{V9xZd(7fU=6WG_g=DT>#Mt8pe;6xF8EgCieAnq-CTXBgIZVM7n?@zw zF|+>`stBzBc_M$aU%4a|E1BeP&G~!;!```6TE*hWm_4#fWgxK|_=#3j0V}=g#c$5b z!agAJx9=0vmhxD?icn>!FRTAT*x6ijUaej2=Q~Cc@5FWt-_0K{k{6dxMFwhE@5XMH zSwuYAj#z+{D(DKd4tGTY8~!ih&hy_<-7>c&Ob0#;KCyh!)XDDKD1?rrfeHJ(*!yX$ z8mJ*_srSbD`k20LQ8MQOH3(WZw{X`KHnH`7%Dn3w}9zZDCsf;|>9j<3rqM{y1$PEpRWDC!PDSHJd#cMw|OY z+ZsmYrboy^lg18{QG?3}YNdg&#o+TKsLzm%@X9EkTAtL=3+Xgl=>e@NNnQ}2QP~nD z3k~PTnKIjoh@dRc>6PZC)}u!a^!E$y!$IucyWQacvu z_imynSJ$t$2U0$6%M)X_@9Ew8^wYMr?L!Pbwe|zU5Bc7s6N|VnfqsDF{s~Ou_0dUk zc`SoQf%dz-J-7g7GS48526M*Nx!u-IspO85tPcy7zO%A;**0NKz2^N%?#4C-kfd(9 zb3OyXgZEv<+^M){sDRhyPHdRTP< zeKJm*#X#1)AZY4I-2~Nip^;!ge%l5hPJTBwgIFF^95j92O_;C0bR!O&p9J6{e;h|c zT7g&6py{0nV|uPpkahPoksl-!;^T}Z+=LpNC3`#M0EDhXcir&Oal*iCLXKzjLRo(z z^ny9=Q{{n1^ED2|Qm`i?>8$rB!`9;fW-NaDvLu6w9_uFL1hHI=WIbMjx5ay^>Z6#m zAgwU^%5f#}UDMk*uP|V;9XWS{pDYP6>#fZPU`VK*M=s7flHXm-hI$u{JW3>$=bdxR zC+p+*@@U*t?_eIG8`Q>Rfh(kw=CKqE{^075D|pHpF9!VYz+${nF(KtmvwSAXQ#CBq zT8cbmSQEd_FTRd<791SB&nji9lsCuUW>yV4F0mkGoGJSXfA}g$F%*F`!);>;aiKcZ zd2^Yr<0m4_ESnK&CeP?Mi?B1^W1m3d;V(=^FXVto|LMG1ze#Wf!IYB+1J5VIk54qEazoY>+|GOt+X1|bIu7u+>!Fk63R*?Z2KDjl3M}ejhKdaDu}(Ck z|MJV~k*9Lli4w}ro~$_nT!2%ejkwqacc`!Vf^AQouVh3a?{C?R7omZB#Av)JjX^dX z^3GO(k5Ie$}gk#><)KUKdvF*i5nsog=|Em7Qw*(99 zWj9;O)t)g`Py*m+W(2oMH)pP2r5EyY5_(kkAqt1~BOpmkguYe30AmUVAd>7TxP8no z>yDB5;a2Uwc0`KlD)duq%ooV5i2oJz=Ap++Xc8Y^(BorqSsWcGB!pkZP$ClQt5u_5ibGo2m z=Z^$Gdndhe5YOBU)_h~7ufFEo<_$Cx?eY5F8tCzX=!U*791;OWbcZ}Bee}cHi^t(b zSIyu4alU3*5{=v;76NSU?xl*Qp~6R(*plFOzgxmV?Y4?G6To&dGp;lD>MBSk|pYyR+uia%Ht1vdld7%hKEZdvsZ%Z zwO$t=LGgz8oF>ZqAAwbS4@NZ}WI)CWDQFa6zU#r2h{!5yUgn=|FU7*J##!s!r8jUW zA5PT2Z~#3*V+kRFWQ~1w>}ASBAiEz7+&9)rATj2V?!Zat^gS<#S>pXBrOz@46HXL~ z_P)#~*;iHxz6AtI9!c80vBg1@JcJRZ7gDlm>z-;cip=A$HXujeO08uz4KuFl_;081H!9Bpg<^el$ZRIqX7jIMmrh&R2Y z@}SvX*E$yuKu#}G@Rvc?y~6vsftIZPIc;HJSaS&(yEv z;8jaUeU4-71fe+S(z+zWeL4pa?%NKibKs{x|NEFOfs=bmQ1NYrwLgJNBL`aLRiNq# zNKRy>==2Y)gQV(xnPRvKa!duO-ujhcG}?an?G680eIgc_RvYq(_EQ9MOf}rAvxuw* z^a)PGJJ^Vpui>QKzwow9vEw5c`KcAgyh>_NA)J%Xzs|{KfYm=G0W{tg1d;57mNAT2 zd;n7#5as*t&+0NMgGm@v*_7em0rYQTy8b!cf4?aP#;7*H8C^im2xe!N&Q4|f>4Umx zA+mfS^t`6zHX`8;pxBS z5db>?zh1~gG_gG4c1^Yp zwgCqgExp3V0oMYmSpJK7n;y*yj^A*kpj*53t-q!|BfJvWl1n)^kte>SqwcN?^R9!#Cj30br$;Jk#KHT-5}Ca3$4+U7hrkK z!h7&IW2o~N+#Ji73bHc_6rKl^AlWA+B zoO=Y{rUcod#mh_JwF-zqh%*S*^DpTV9^L3Z&BOQLyBRUrghv6mK**+SLR{_qcE%Ws zYdl&Zc?q9K@V5%}=*f!cAeUzuot3gwBKwA&)$=Uj{9n%-XGFk}wNAb?)(Ne5ws>x! zE35fFNMsElb#+k6?9v#59<=G1Jt~IbebAeFfD|SQ>oSF2K(unFo~+_l@$f98#JVc) z=QK@OwQc_u-PgYlDIk|cWG#N$EjSzgd{6r+r`l(P?#$t?Ur+!49Frztd|J@|)!oCF zz+D9M_4HXFPNaFuc;oSgzson_-75GEx%xelRZ|%#Q&N66nFUg2vUtfm7XQAon*v!T zpbs*pSsuA7&s{3x35kJbl>XYaGI9sD0N+c2kfoIA8LbLbOg!J+iDI1}V_QLP-)zaI z{&_9v{`vd=-q^&`yc$r^P`{oQ25#Y#vkBc*Ztl)j&jWCL z5G&wZKP_y&3$LopiOM8d?EEPcqWzfaKpktOUWap&v+dOtk%vKo5rmgS{}49E&khu- zK66#a4D?CMdHnk0sw=_jTDZT_X5@1o=M?w3oT@#7d~Cx_Yqyh)wrRZ+LMCcie;fwK z|N3IgioF)3Qp-X2N_|WMjXsbUrm={|7Hb8Mw_zmi7_Yk`%uGcFn+qpj1^OBFp{I76 z111#NQ$4(-BrE-R1-cNLm5mibaZw**qqzrSU+7Rv2fZU)_4dBp^M7pWS(Z;&AR^VW zbBD)J&sgzWQ;rz0-~~$z)K@~XqtFiQdUl7Q166WLXYZVW02QQnE$shzCJ=frsTnE6 z*3d!7V5w2z>&bsvzD@74*9NYHv0C}T*gW`RioiXX8xw=QWxV#aklQ6XEgM8VM=6DY zQvpr6)Se~@>x4^k+wkk}u8>wls~>>D0u$?8I=SOb1t-z`V1FSHFoxGS3dhCQ2>mPN zt!@>q23(YX!|vFe`n*|+Cd*(6K4;MK^^33nWnrJ8E6fE(ppTn#4(JTVxU(j+@%WZC zTA~ky2%r2JaeA#f0uNu%BrH}5_X9O7Dg4)0*Zk|LTLZ@fe$dtIZU#l12=++|>kTLf zgbIF^5M~+E3DS>D;9Cw&_Aqr8cJa=KqAx87UvsO)P#6OPHBY?sArBbcC0OiBU!b&*Jm3W^|K+lLQVU`v zeoC3HN!EU(@fgBb3CNglbJ0AIxzYw%v+zdD9QhE?MIX_3Pf{x6r?TnAuzABu>)kG| z=s~PRf!?=Bjt+SfCNL+b66AvB%M>m2QOIDv`dakA??Ufe5H`*9j!qf@`Asg6%aQLO zaIDv&g+c=>j=&34{Xsjbry?*BGvHNEE{-kUswE^mE5qOWWJ%NJClhn?_Y!!V-#Fr(DN3HBo9Q}vW(bnzCgtbgypRH_!5Q3-4-r)v58 zy@k_J)=r@pLMva&|NFTWNCy*SAeinx_A`*8|J5(We7*MnSU=?riJ=eT)4m|qt)8b6 z9?F}XjcT&}-^Q2!ax#TbR{4U|MRHoT#~ws`vtP2W$@ZI#KmOZyIY4^n0Vf$wpbfR2(BrU0i zk169|HkPbZGdWq8oh3pROedm(gGAY>siAwc`hsr15jT`QeEDa{8sv8^9JM$*IGC?C z2oWJ+tSuld3muI!Z2i|N?FVIp#XJxco%)#8!4YQ@E%TvL}#E}Kiv|I5@aoyGjW_TDtE>1+EJ z4qCO;ffn030>`6ZQ37h1$5S{hhA?QDgfM88U=ju)1cWfPrP4Zp0tUmB!-0SaLX;4O zgsEDYCj%i62&hbwKu{n==DR}`{U6TrJonA>xi4;cqk;T>d+)W^UhBJty;g)rfPTJD z%Aau(##X}*q4RZtP}d{uGbgEeVfKLpN>H&`?F(01Bq4{xz z&YpgmR|kIMUuSGF{QE{hQ&%o8ZitshAa)jqgn;A?9bk|oti?LsVq*_)Um`9)_l0C~c5*ztd?H3zaLci(HIyi3-i}7y8Y2Yqv42VW)RquNK>xOf23uNU` zKte8MWHi*>)+e(XUsmx#ICLCB`r8H$?lFAV+C!$qD(L}mb+*yudg4un!nuv2{Eoar zSwLuhHsa5~0jQ^a1Er(|--u`K(BW)zi|6tb)df(3KI=-S{Hn&}Hqv?zxc3^}FLyeu z%!@&H)4c_vSx6)JKfiSXHOxk@?td`m0t$ZDL${IEyS1%jhMv=Vv^}m$>Glq7J1RgC zo@6g@$3L~+e;cXgKTosYgS8wHy{C*x%80yq2^*LLz)A12`S^dK#<}$#1qZImzq~*W zo_cHjbaJap>;@*5Cm@5HSze@cF(yGkbbEgluKa23^^F2ZUm%Ya&~M;-U!;ys4mQJs z9Kr5;_M^{#_rZ#M2cB-Z>S0V^eVr4_?!Y2N_q&{by75FGU|_i{GI*KzJ0IrqS3$TR zzuJHp^u1((4)U5>r(ovNLhWi!hF?`!Kl1#RjZi7)%p|q5_uG35u6ry{0Dl_?Xg>UD z!=d;lL+-xDULW()7kBasZdibu)H_F}0;;_FZO(u9-`)xu7M%u;-=x z?Mtgq1sr<#a>JbOPjqRHjK&B+=C!=&+aLa$KWb98{=Q>t{;k~AMy19O48Q>aKrkFA z+jVa91}WntmxS&+tKzt zXk$cSfZ8KBP@g9};5MQGHIg|KD16 zaO=8q`_Aky+k6hcVT-y#B{oyY?x#9FqraqkdcMoo?}PZoZp0g1_8=v-DR1$3A^QN1brp176tM> z^i9t9{UMsQn6wBh0F~CCLLvGa_Woa>PODfuT`jTlTezk$0qxh)5S4ugs!N|XKIZb+ol`42J4bwb8rbtZ?e`5$lu zEwUbznQNMBKm74OkI&X@d4>Dnr0A0-jvk;0-p5Yoi<=ItSMXbx&40_N%()uB=7zh9 zTAbsK%iDXr%-M8c!$()$W;xzN^O*pn4?s$>uud`#);*_}<~LUHi|{93j>L zkTR0IsU{q(eDiwl9ppW`pQixNDCm2!dTHz?4%wTlX708}?MpSqy+3Z)_@AQIN@0MS zGy$KNc~O0*x}P3?c~Rj*_qg{ss{urioua$T1;Cxv7tDAY<8bxa(15P_XD5_5Z2Fdc zAbGuI=WutPvDtiAX8oX%`K}Yn|H+>}-vkw+?LnAprZ{})Gmz{eYp$AHJ)owrm%MSB zH#70$lg*%OO2COS0o9}c&R%)^%XWsU+Lpav{O8g9{VONmGK*{w6&qpJ^FS#qHE8+) zb3<*F4>?!s0RE@r-?aNjg}CMS;Wx9tnoJd#t81(6-Ei7}cLvOKPhND*AjX3Xe9KXw z0;p59AE?2X^y7!RiR(sZ`E^jG{W^%8H0%_+(1dyA;bFl`o*0g4n!jo9-ut0J=6j>)r_CvLL5>0E%l1?ExDp-_#J^Zqp*^%u{IG$lo8Og) z%L6s#vwUhLw%&*3@5K;pR=OSiX3KF|+kftF}kWF*!@L$2i4(q#U% z7U$C@Z8dWOhuB$OUyWk=7-YA`gKHsB`Bjv1-Pju&!0Pr0LwS(^z42cv4h;JB>IPh$?Umh-giG-}DmaO{( z?)|>jkYz1g=c@fcj_L)7!HBh{d&-dF|MJq;!@!YQD4H$lzY>@Yijvw-eKqw(s=|7n z$cI;-T`Q_KJ~y!xTnl(AXt7-t z-{udEWY^FCE?#bVp1h6@v*i#lG#z=FeM+~=HXEMV08)QHxE5A2Ud9FV7&rlq4@?2d z7lDdb{l%dTeBbU9`1Q|KpUI z&A&$jb!F!80MwMVS3I$218E`J0oPhuOc>xk|G$9EXlk!;QAf3T9;azK?JH#C;c~2tt3odA}ba0 zA;VyO`_G>Txh2x#A1}x;ryKASzd04V-d5%x$N#iNc5V%Q8Gh8OK;BsTk_NkP*?mdB z_CxcGbtti8Vs>C?5Zs$`@HlnC4>4H7OdYWB+Vt@A4ZOd_P##{Vvkl8YMEzIqP3Jze zEm%MFTgnYjfN(x7Z5AXqB;N4edTzbp&zhGP#8-a*>22AWP1ftd&kxJ`mJWiTYiW<( z3Lk3gzh@B0Lxqjx{V#|Na{j{|rS(-p{MK8&yq||c?beOP9;9c(x;Mw}+!&;QJUp}k zZ$S=hv`Zo9t^U(U+zHX&=s{Jey|%%h_uoM8rr4buT)>bX$VNB=S-&E*4%Gi5puA=K zUj)?piv!mhTmN;0sej2p5ES43mlAoT`_hS|9%$^ioiX?9#BLB&f}B50{tdJN4!d?u{wKd9 zR#w3R>nFBff)BB`E@>F&e>|A{UH`{_-mdm>4rtZ;pSOEh^>P3eI0nu0-D^a_a@~?X ze@PxANNak{{K7O+L~9ZD}$?xH8Tqq;mhqe_(RL9nP=o_CwTNuUJUAczCj7bg?fR(8 z^IC7evys2zF5_QnBa1q&F1~lAH%Eia`njpz_lI5Sz9xzDXQCv^TLC}yg4w7vrdkzE zw6r&JU6)Zk=1NO8;VtnZ{O!-dOAP;6{gc;EQ@?xIWjc($F}>Tqspi?V$D(|ISd)A6 zo5HqwD_5i$S2hoYAERuE&M_UZl2#z(ta|Y8-rwp_+pvzRk+zwL(K}0feRGyH^vcGb zsZLLT*++J?>?vnz>CNj*2PsOmMjtKxDzc!~GHzQF8<nhlOTI+`rB__@hco%@~{pZqF7zH|G4#wT)`R2;-(RlR?XyO3X@E

8iq_S4QvAsU6wyo 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

hEp;XVz|kyEu$eDNI7Z?F7zLK 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 literal 0 HcmV?d00001 diff --git a/blogs/deepspeed-fastgen/2024-01-19/assets/images/th_lat_curve_falcon-180B_tp8.png b/blogs/deepspeed-fastgen/2024-01-19/assets/images/th_lat_curve_falcon-180B_tp8.png new file mode 100644 index 0000000000000000000000000000000000000000..6ccfcb0fe17fc2d28ac431154fbb10f333cf732a GIT binary patch literal 151520 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 z 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%0Dio4*&w;X&l$DC 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

^c2S0*>r5jLqBqF`Td1a*^YrhkDOd#3 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

qQS-`b9#aBe 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

U$IEDupV-%ZS5iViRTqc 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 wUM@)MV=osk=kz1jZ5E))`<8bm~4 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

4|I~Y`ySg`IRNk zJ&E$l%1E2#eNJR`VL17VME;nWk*jW2zk7@O$8BkdpNetTM0H_u$=DckkQsoF_`aSe zO;2ZfI?(qPE%asfQiUoaYZ(@SrIhFf46B&X)0c*)a3h=m&0eR@MZd&JRO3b0A4pnt z-%M?8{6q##3V@~a{ayDjnEZzPXKmwja)HF2&#Su-wHZZGfVl87 zB%DP1+$b`cLn;d6^{0cJNbAWfw|eKtD3lp{Q$nIf^ok}~FH1#jNDoG3#qt%>E-Iw( z4O)@Vu&AXXKj>1IU*IK(Qft%>z@&~y3(#|NFC9jdv^;lG5qWG%i??v%KZem?qSyZ- z&_`f*YN&OZxGa3~Z(Y&$=TxWQ^ila?iUUBT?q6;uCpFH=s?M_5N5vPt*y+W4n$5UV z#Ac>GvyljA16lU%To=qQOv9p^C_+{249;ke1l@Qyfalu~gAiH&=yf%#bwB!JvBfYl z{U~E3&{B{6)Jy2S{`Sv-gGWKl&UPk~0uggWd2O28qPOV9H>7KT;Q-9$Euh()!AI!u zL$YY%u4hINU-3!rz(R`Lm*{200|w{!EXlJQlW*VFjC6fKtlkTRaWfHR6+zujOJX2w zoWHKlUH8nJe~4GV$O0Nika2d-IN!5W;~N#BdukHzXma$*WPrq>jPcoBKf=->QYxxh zkuL{-y|*^sWqQ)41?XxXkC?sl&T5@8k%55l92W79A+#`JttU;RC_h21Lnnme(?;Tq zi~Y-8NF2myX?T!mwHb#T{P#Cev7%D?7@z8gPsNkOIjB_Z_ZnbS;e^HV>wEt!a&p8?j}`RPcD1^4 znmSJ}gCAZshCZ2o_kaf}Nuc2yUooN!2vHvhc-50jHvrZU!be`7kj%K)2Bz3w)UAMRkb$=5?S8~ ze)Y4*3|VY=M_^L;Efj^;jN)B5rR;D$p7zCExkF-k5Uqpxp@ojIlIpsV>xkEO!#6aR z3v`aFBidj^>;}VN{afD?PcJgIe&>3&I)|?mw-md_IAw(gjRqLTcFBoRiQWmC5tn?W zV-K%q7ajqQPm+;D@x(4g?8!o5zcmuS9CJUAq6dbVndt^?kb9DdC0ec@TqYe7YUeXO zvAsSW&U9dokBM!L^0?PWZYAY@1qyt0kVM%B1n3>S3dI>|eS4(Lc9mOnRRP@nt{#nw z!v?PpPPe1d3dFq&?f83b9Z)c5_LIz^|CUpsVQ zyLHIVPnEp?fB4VU{eMrk%&8gyI&^OH!LFQM)pD=S=QhmGUymU~@f$QqunQ0p$Tchz zGTYUU?1|XVi6<>*x2tJ<*IXEDse~dwtE&%#A_Cg7o#U*?W$=^VS$lmO#`VZb0qD;2 z?)MzmLe%m#UV|+Xow?j;Zix4UkH`^?KCo|071EBM<)?F#pWb}r6?t|!qSR~cH~FB7 z1KI>hP|HJkoa~os>63Z@wSC~zMKlPAR}HH|Ra~Hy;{wXF`2vC)Rt~=}V&P=LUSA2ss>~ zC4%!Osio%(bQ3!KbWV!d9phcjh$GR_G^RtE<`W?M(k%=>Ph9|65x~`Y_UqaE#%O z$6|G>t!@1Bjt_97F(cX8sEAc${pZnL3qVE;74xZw&2fRB25N^UGTC$( zME5b^t=E@p(cK?v&ze)st<8crs*!7lW_7N}u3VQ8J$oZU-X-;v?Ev zaREl@eNX__@Zlk-EtEXPi@itGolWpwAtUi$_r(CNnVYL_ zGf>JupPusg-6Ov*4LSk8b7D_)uwvvier2f!aA%I9605VbI|6noWxsk4Z-6JdLaHAg zrJs4R=j&thCKsSXtpV$#qT7!l4XM$|VT=)!JC0j`JboTsDcikjSm*DXuOHssB^7yh zT=V`~bR22uXQ2V;&+yh?I`Mx4op*PZ4kid&W6&#tqhkBxGYXzyVxH|{;3;!d4~fga zE8eY4%I9!$I2IiLoZvx4#SK;9jX#a8(zh?0^F!{t zP|765ZC)R?5OUG{nTT}Vi_2+RQPm{fY!Q-23F^BVj88C)Dk;a52la3|O_SIxBXgxI zP3Quw;)(2;R;Y-r;jR@fC!T%|)F*)Ayt{ksMFtj^T;}uk^K}u5H+(#a>f(LmeIRsD zv((5e;5d(tVT7Qtz|M2it6iwAm?_OSb&;QPZvUEmIVKF{l1~I6Qz;d8*z4{#57LPTw@40)}IUbeg-3c)u8Rou&MXbinW`*j|)~F`1c4LPZD~B09Gu6_JkC zO3}S1{sHTbqyf5@{m)YT+N6n76vbFSZpeZ~G@W5x141~x{GoyGUXW<>_YN!pb?i4+ z4Tmt8IREcJm?%Hi2bib@ZYpO-k)I>E@`n6v#0%CYcM9_;tuvd~fAPn>?jH&w<%{j4 z6~)CY2^4Kuvyh(LygV9aX6BEN`}_L?LtmO_9hn0yNcRK7RBCE-K zl4%i*4r?gA9PyIY4NZE)Lj|DlE_2Qtg&7O88PIhXF*GK@_o3oCzc0Sonb97P2;(Ng zy*HIMv(kuvWsR4|X=w+DQO`$PAln9S7yI*?bxRvtRdp`lM@1)b@Nih!6;DZznQ4r0 z%c03~Z^pn;aeR<%ye3Zdwu&Hw^cqSc=OL|Y);fYYcBG~KVVT@zRi-;$RnMQpidD?B zdEHU|of1jFk&U?}Ee1~~jwFPBN-!QbTs>gwE+Lz#LxVn9q=moQ<@8JoJn%ZW1|s0! zL^_`7uX4#%TjYz7j!|=>{FUlDwf|%6UAfv3gt{R8|2h9K)ctBnt#O8$}-WQ0{jt zNSaCx|LVbQ1jY{=NG_mO4*(0gR7o{i^sXAy>)l4sx6g$xXv{~`a0Ja?7qW>3v$CIo z>tvS`9!rwbaAc{?2=qb;joky%t+5Afhz0)8;DQhmyQSbV61ji`jo$6+QUs+W39pLqEjZOX>xqz{u(xPxX}r)0T{y!AYHz=qE9b|GDAVbc)nQHoxc z?)yRy1UAQ(3ZDzc${u=a!a4F-%ihXfK>F-)S;La-Q@&!1KADWM7Hk#-OnqeSGT)tx zV_It!v0C$()SslWfvbMctZS&w8}HiY!u{~LA8a={#?kV6bn!j(IVdT)5ol}h2sQ)@ zGVSp>i2%SG&kX>TZB5&AWHU)t#x7zu_RDe-`K}A$*WG2jQ8CIv@$qzE)CRF+60kHU zt06LZkFo#zY4I^mia+|p@dJK`51NgZXKOj1BZyH-YCngE8+Bnq@O?;bWsIfSz~yk4_>2NR-rEvFs5bQO@AilLo7+mq zP^w^HsKid)CsIxnxaggbR-Ii$ewqjNH_!8~i^J8xglIyBp_~Q)f_LBXC9GWF`HuEY zj*NGB@5{neW$WxbN!t)GK98tXKryd$31>+e!|mMoPoAP5`SZo~LjiBVqLUTV#~&DW zL#|CHQ46s~h{&EHmlO$dexA41M_O;y6U5uH8&{b|q3qQ&meAOO>Xd3)OIMsra5Fm_ zsvYTE;sXy0|B8L6_kq0i_?^W{${`4WShN+u=}G(%KSRUAoyMNV2ev2#Dcl4kOEpkU zn)3`FQe$lRP-`4hD~`(8CP{l2ng(}|BK@nK0ZK%J8H0)s;akFdM}0MGz^P^+IJ2n5Nv!!yoFv?wUQs?1LUCi!hs$r52V3tVib(f zr<&4EZ72pmpGUS`n7=dAW#8M^p_;Xq`~OQT!$^&EbOgud5gnhf0xQgx`EB4DVS%O) z(5O@WXlGUHxU}(nOhTcZ+(3r3BxOWgS@#dPp5D#pcMq8Yjsyn%ii=52n{zlwOk8Wc zhcie_;JX{|9w*-LxS7Ou0x}0>KArLh+kH(p%Y$s?*si|d41!n`I{75v?|=3tllKyR zk%}7DRB!khWo_AP|FpoY+vjbSX~4N*cdFf{RTCv9Hx?gSkWLbs<*{nn1hLnIKdI|VDFTG@SCgzu+vNG?fe`2n;4oTzsiHDUminII zZ?t0?BXO~ES&rrBBobJuieNT|lspHAyVervmP{|FZm0(>4;{Ve{6RGj4h^dJZ!Bxu zox3xk-dmuH=EakuV70s^3=#{8Q#6=YgciY_!tTdVr)di%Q1!E|H)oeT)~un(<&@Ml z>Q*7+zk$*_;M!_%vJP1Ntm!@qQzy7R2KEjQzTBuNW=9e?n|qdx4=22jo6T&1j@%)y zitNnLOm40Mw_D?d?F}XROw&gO^ai}Ln;=@DhNYnKG1EKfz33+|jUcPX0-YNLGiYNmP$rY)H{^n(tboHJh zSNDp*p5ig1BrQ&20H=@IMb05innECrI`X%ut!}k>y7MYvTClq^;d%oW*@TCjMtP^C zBmSPl=|}v(mDf1?uidx)zlwt7j~_KNG=@`*xUWCzHWj(h(3-Nw4S3-kcb!YLH~TYA z3lU)An4!*^H9C9_mH^{w+QKk|z)YF~oVn%$Hd29nPiTIM{#@MA;CI6YL>-*SB>OS(~QAK(e%n{4)fYp z2o_>+w-;DB=HsLnfayQ}OE!qPGe$iXk}U)r1o8+AY( z*wy8_!|^rC#bb`$?biAzBwDs3=YUf-Cx6#He6Lw1uPE>98Jse~BrnTnAkq8|*6U_B z(1;DVDY9PZ)slus|9eQsw9L3pNcKgS4xBD$O{A7KM*Nym?J% z9<$>8`$kM6*)darMuw1+>W4vzKP)LsPZbehEc&3Bcs`03 zHP8NQt}0L~WMo%B50={84%#psRwMXUj{4c9iquL_A`Y1Wm&RW6vBJr(5mey6yvT-y z0w@1r#w&6$eCwPEylF%P7YbKFwqCDHvZ=Ly09jfB?=Y%hgBg*P*Z7SDDAeQ89TmN2 z?t~O8(9$}&RRC9p86T-x70Hoqh@CnjA>ExwzZ8Gl7#_=Nt3RF+VElrl;<)$x^=^$x zLu$SY@n>ID(#t)qt0nZb1Lq?iz@pnQ(fh232jsPXbj+k>usM(7s)k6p=%vLn>9BS5 zgxZxK+ovNFj!z6D^}(B$Gj#vempSx$dfwDc&4Dt)iCM+f)Tmtc=ImQI?Nm&H6eAVK z4tgt0BRN}+u!jd5aSVC-!~+4f&I>pB9jm3!T0M82__v$}vWJ()eO;?7ie?4pN{g98 z9ZwCZnw(#u5^hFP>ir!1E)rmsUR>H>m)fGQHoxXcEkXe#rSB9aS&ICRu76SsG(c}sf z>zN7?GmOwwwtQin_ZB>SW>d9E$JthNOCTX*&{XvNb801Sk@;C$WyNlVrI~q5*?vSI zgu*QNov>$rSss7`$`qW3|;8k=F>D6#r5NS-O2{xi*^lC-)ACU6RTtVWvVEc#9{YH1*7}KKbgPBp= zCKsr=FEC!i6ArnF{3b=s1{e4i1wmok7q`@B=Ty8&qLywtr;38afUY! zsbn%!CJ8&oY>%5CF;yJ__yD<{IgG)CIg!P?N>NnkcTBnZKJ@v_iFx-iF#0sX{?Vkl z501tOxgZ1ng~L%*USh)Rl6&&GF`t)8>-tq&<31YwZG5s={Ot(yr=w=abpN&qk-)~y zGqd(bSFLl2 zU_$cb(_W>LeM_7cEWWtR3KB2gknY%AC4M1fWr$i8Shd0cJYyXnRQcmq97F|=^uoLa zQ$DxjuFbKPsVitLPq}|Hl)#bv_gTAg!okzijx{NX599E;=T}@amO_o+9dRa{Kz|xY?SrqKx~jKg5$Okv85KT@5jff5NDS zSi7o;sHM66{|;zjv<<~LI1{SNCbA&6&aav12XAM-iNg$0%^)%co?l&_h?*ilGXMV3 zIr}c~q!2&Ds8f~y4JUWvYY9)>fp|*Y>zrkdg4&B}9yL`j>^BDCWQ3XyoE)!3Hc*%% zq9Mw5`fe1c1vhT0xbxqq&{f0o{V%KI$!-qsDXU8xE}c@?UOsS`I&^eTdfm~NEJdd1u4mEsDK#qNh!HNeBQ(qcPLMQ?c>NMg z<*s1yBd1;()liax*KY_tfi+>%FJ1C|r0r}b7Q|xCezyxwZzEJ&K2mI57PLKf(X%?G zI$ll%eoHebN)u3pvSWr2a>tVxW2&oJv2RV;M}>)iKDmqDFL$^OD-SQH@R7J%uvjiB zfgTUL;k8DhLEza=#$z8wz4+|HA&JUWC0@FDI5;jTk?jTk5 z6*nlf|GQ6~(qBd9_dV+T&Qt1z#l^TQ?R*PvsCDx$!z(GEv8V{-`Dqw2TUpg^^XrszW>HDN2O#las-Q3fy3F)iBNKh z3-V8qiEq*wq9}bbZMoy#yR?<*;B1&n+wSrIt5JcwaJ1|4j7PE>5;zQL@)Y$0=wy$8 zT=}hm&eeB>A3#qMITu)Zj!3-vcthl~gxZQ&^mVHG{NoByPKtgpGdV}vcW4DB=hK)B zFrFV=&u6-j-iUdM(9CoH@{_yp{KGq8%d_gTPfrSI1{35er&>f0wu%6eS?@IFr=oxv z+$xo#%Dl46Jnit%osC>ga@~a-yO*C0j-3sGvemJXo;SSDq(<#N)^z8AxM?wxe%gk* zQ}JzfK$}jUIKBzmR9n4{xF=EmkHrXZYx=7UsG1Q4MkbYJ0m*(N4NG)3WBRCkg3UD@ zM_VwY5sL~Gvzl&yYp08_DK?Nkta#o(Q7EdEGxrA7LcCANCgqai(d)(V0jBdTqu<&5 zZ;TC9Jgp6#rIP?#zDe5Vr z$t(4w<4P$Fa#P#tI*MA(3bTGRTZ+%*wTCrHH=-H~anror@)glpG*Q{Zk;Wyd9f{wm z@{h=b*H_$Esi6aU496yB7Vyqk@!+|$IZP&3D^E3!0Ozbd>jSz zF7Y{sCjvQTeYH6qCuWZIaJ$hQLs*`o2w-^Yk=6NS>ay5bOTp}Xl!QI_gJ{B?qG{&_ zc=jR5J$0Lj2Xq%#hl}0!o+MY++@&?9w`(X~@7Z>)Rs|Mpx{1@EY3x31*C|{WGn*E( zgH(3=9i_?5SO8eRMKO%Hu}5(XvY(p~mOl?=eHB9z5eam3-y5QPb<8oaHz=Z3r)WBz z)y{GZ-~*EbN7obDY#UWHv_ZZKNCt6c3fLJ>omO9$J?PsRfy^myulzt+|H)ssyxDIZ zQpZq6J%pMO+_C*}61hqC`tHz9Utw>_`Nz(3ijYJH1NHO^tzT`SbSVbyq4e{tZ7@tOWqx9R{&` zJuN`G`mN{-*1x-&1fc&ue8b?oOSrGrV!5jUk}!;L55SZEew6Q|7xgIVbhJ{gCcqF`5Np^ub!7u%nHg*?XvgAmPf?S|4TOW(sco z8;qD!a9p8>vpWmX`=lQ0&MuJnTk4~4+&<9oZt>{!A0aLL8*h{IOY*18suj*r0b*Po$vIP4!fne0$XE(oair7MCJ#R$9*(9V`lK>Qz@eG3Awn)XvvGRM%Vg?Bj;Uf z_9pz08O)IADDalumx+|s&ex0!m|m4IB;9jf{;>x9)kF@U&q*2nX8o~Zhb2Jd_L!l_ z(OnR1^T)~ll;m?tn$6>#T>*(=3pojzhqipoqX(~1pUK;TNZAD*`^drIt_f@BOmTkCk>4hoMj#KxRi}!qboO zsQ{VCfT@1e<_(O#bLL?6G-SxW2jN^3Aq@ay!Yz+8RA6jy8^8(Ni&u_Riz^73Yr z5v)Y2%`LViWQERWC{W6JmZWn=0zpB1VXh3p7vIoNlDA}INip5@8yrIIG~{J#;hyjO z9h{M%tGm+O>V3q$(U9Ad!jq*&zL(xMQFnc8P@@E93^Yq82(t9iTjmizw%RIMa4S(N zFgu+JUUEPqbD69+{DN4nDK8X6>0pnDhrrlw0?EZfS_s|78u=xQN6=nuJ@UM%V%uYD z87qR0ru2pt`)k&QP%}pv+ZR&foOiD3ATrdiOkV4Q#X_{Qv781Fe$$K2v`l4EVNL$i zu340;Zw1xIZkms|m(1JYAJg@FWtxa>X4`m-&(WFJkCK+m#WU0QVR=>x6b~x7(*3kp zeqd$%Gq@)c{bz{e(^Jw12KtF^^lOy@+HYI#K-cT+_t(Sgv%1!jI+VJ3jO(_>&#sFg zp_9+*Rwg`MhZ7~*wwVf%&fSTHn$)umpr*NI7Yp#lvqx$RYcC&}Jv6U{DljhJF|)i3 z57>76@<6_GfbsVFSY-MG98klz?X@pDdY`GXnk1MTCOZ$7FG!#w8Xs_du-{BEY}$a3 zEMNT9Uleg~lT86b8tJqc99#X6+k{V|e6LYm=bcGzfx(VBvl79#@X_8EF?+Fa{yikw z{<{E&AF$bmS0l&d2?Jcp-%686jaEOuLOYOTzUAdT&xBb}(y=|Y@`fIjtfyD&&?swHv1*Hq&&CO25IszmB?c(MBg6wdfJQdJ=1NH)9a8jb! zDXt3@^zhXhSvKU-28@f5C_mqu{=pczV(BW{8@$7vzC)Ld3%Zk+ zeAA(H{7)5o#5L4vS0+DItzG~Lf>4se!{NE&p{7uc>=E6wZmkn1@3yia74P? zqrTGyVR{$2H(~}GpTNnR6&#k&YLL`u)&VoRBc=SVB^AJ`|EUr8PyskI6LW&z->cq9 z&`zYjiUy^-=3iOi_hVfL*iMWXWso+MwFk+CX+eq}mmNG0CE{dqtVnuVqy&84G9k(O z5=x2D!Oc%3ZO!>cl=jV(!OG^<*{@%CJL83+K}fAScD((=)V7q(I%%RPqAUd z&IKmR-(ktYNFB;vJvn1jGvLxTamRLdCaAXWBe8bytSQ~kRjQEGyCGM=WT9_8}n&&X%9QK^c03|?yvhtAjy+~1Ku zHBQxfrl}LAI)TbBcxUbHTkzcVG?44K2H}t4+;C1fWmIaq?7`(BwA$suqvCwfI$$%= zNVH7Y=gbSBc zp|ge&dH;VU^B;w6SmLUAa&7aji~ubO||{rWJ<7x%00L@5%$H-N91 z(2$9}65KGB#>t3j> zQkD};_N*&nm^M43wi{mcY%UG`qM5i}e#`HgMFHvGhqxrFg`we#iPF^Y3S)+q-}&)N zBrQE1Kh-Cfg!hpbE{9aP{q)}ZtD}6|;acj~cZvAWi<|hQqQ^&VH8wxE18ZEHpI*;y zKKZ>@ilLI^{HxoST!))|v4Frm+6lNlHq)S#zoyOSr+UNEiuZcIrYj09(<||c*e@=` z=PFm*>r+>m=c-yEh3}ZBu3pKZ^a3}&Nl;Ws5(*rPnkQ|s`QNSc{r3Co7v>N5zVTKG z{=XRs{F@oQQ7Z-p{MC_G5jPL_i=2*U3|BWDGu}t4^O+3Y)mTz7QA{lUZG} zL+mj2@S;V8rqa+bkDw9KyQ3PTzdoO{-kaW<SescJc#9egSh=uM(nOlMwRJ1 z*9$^+d+Tg}au>9EV}Mi8Vd69sxEYRB*6-w=_Zffga<@X;oDh*s zlk^ET3{ayt5`K3RIf*G+^j_ObLHIL5AQUcruUM-BJtNY&fJ@l{tqW(iHrE(%v=D2{ z{h*CvX`B2W7jg_=)Gu3bc)knNd)YOQ$ipZ|^7q=YQ);lf7p$XNCaD6;gz@w}S<<8l zsszxx8wDw3H)#pEN6}`66`!8B$>cz+&h|jnwm3p(3F-i&yGjz1&u^4ShTFmd*LxX# zGOW=xq*GgD0p6GCr8t(4ibLFL#PLL6n&-)OB}ORt6z1hJ2K=rzc%P;KKPs*|tYu(Q zzC%}fngUEmkJ{~Y;##b~dYn21&|j5i%orA`vzVMpfOjl{vzNIF#`#CMe~zNXPvF1# zjcgP4?qcrXS$Qc>`I(`06w)@e>)3tocrd-_{!g+*-B=V$RFtW`ucE2R>fAImIk(@Xn3S$55Hsz4>4P8M3JRfJ<+Z&;RLHPQkMfQCuBg;e&3`D-&b|j3qRr zu)CBW8JF?qn9cM2Lj%A=@=1H>vug^?b=YM8OpRVN6sQuiQAk*t9B%a&iT*(NGJ!J% zCY3;t5-Z+N61>5xO1|#H#pN~npelRpZ66j_%7Bq>#gbO62od!kE27BJQI%~}JD{m` z6?Gnn>s~)C{dT4`=ep?aPsYa1&YoZ}nI}(vy@V;+dI!LzR@7Ur-c5!K04(V=?66tP1>4r^r zcXzXaO?Pt_KF|A|^M3bU{uul~*Pd&}m}8EiVd*=bWlSQmU`JXZltDb{g?3$FbTEwM zWL*w3>R0~(4fGqwD#bu}%aFn(7BL>5;@4IAYDEL0cN%@G$2eST4+D&)Rg{&FOq#DW z8hz~$!aI7pMT@r8tb)EO{6?}WE@Q!nz}NWu%Co1*nPlGUju`37PK1@ee*Ge2H&#y4jgiDse;aFX%;sVrp1N_o#>L$;&5bWNk+-y*$iEO{ z!>GO3JV{pe49I0smYlMxNua@EUxyw$O3Jc_=%$pFdMxn(s47? zVe_ybTm~1mC3;$ykaPAN+-S2c+Ff?IHc9s@FTi}Jj>1JnSv%Iwd<(9DjlBx*b`P}W z$_O^7tH#JoN=j-w3d3$c!WkYbu!70+vaLzV<>r_HJ6e1J?zi#)K_IUD%mT?X;)smb zg^S0MIUv>vYu6#KEjQQ8d6^}jO-A5i)hAch`q(gUB!Je(F{&OlR^966wj1I*v}CoE z-ki3GDg+#aA&nwQdja-9KawkO986@|swAn)&37$dZso1FlDz=z%Uq|U+OjVpbGOve>A?L?8)efYIALm>SJGw`xEblFgPFPu7;`nsnmh`ZEc@XyM?SZ%$W4QY$Zb&D`KwU;ZVev z(4^{{wcsW<$lc0OoFG%(>TD=lj|H2LMnO~<)1@S4%QfO?*GEcOY26DkWAL;`&Nh|} zyOV=y?^iAqw+eq{)0r9BIK8m8#+r2{Vt+TBJ-;%HVyj+!mwUs|O2Wf`4)VgBc z$XX{jAnrLmxPBc)_?*LBikJLpj*C06bS%8zLPZDuMEF0ot23*f0od92BVoK?>)<_V zWF5uvzG_%m%S+I%cr>*il~ZqUD!yP{KtvjSy2*HIWAeTkFgAe6EB7-F1IED{I(Rx6 z!jGwRj_-X=!Pe8Sgs={KvK|_2ZA(cvN~A&W1!sxG4@TDSodt)}NcQJA=VHCj& zScU|;6At*MP6$8Kk#IArrl%t^Nixc}!0Hq{FX@sEVAqg1eaOPWwM1Hq?qR!@9sx*X z!(Xm77``enW035E(lkREcGtnBK^L!RiAzZsaC3kb|_u?wD-iD z_>{Q_@}D>S9M73@9!7l^|(Lju^V8hMR?QS z0LZ%D#>ye%QGT8kW;eyPT50BQetJ0CSXg=FumOdNunzrL#3dLp1J|#2CD9FyH znq?|9W^v%BWhy`6CZRPyj`lVQ><$k{MiC+c}#eQt#CyW4fWazAOlI%soWfkuqTRRuyDpB^5s*RYOi5{?4%+O)x!4mYS z>6bAUCTP~6e25HcaM*Tz;?Atws(pUcLSWNeKQp~#vGU5D#bj6;>U`LBd*S}$XGPEO z7}?8LH*Sm5&7SV`vZp;|UsT;URytI!77Nq(8SW!y%MHZk$3l$*Mi;yPD2GQ~@Mcf{ z)O2|`)6P_&Ws`I$N|;YR#Ho&7Zii+VG=iuxWXA9L*BUcUPwkhe%^ARfGlB*V$=OMU z{#PgvQ)VIxgB#m=Ff@G^pA3)uw;l5@^%gIFGM80Yk5zbbuJ;!sD&^voou~k(g6loX zdp4vgV(ReBV2n%>A3t@WZVEsrQG3kcK;*IaT?Qbb>!<=J12m_*8&mvd=YzzUo8hph zZ{|3RVLqKTty8^!W8YB32sTMc+4lP!)k79WBBaFPFb$GU<--_IE$ON`FyhKYtzQ4O z#&63WLX&t`!N-gKfhe8^!N1~3%`+%H-o0+3gHP*(eN^PH^ng%za3 zhLJ*{5}l(rB4Zw9*0Q>{=!Krvi#zJgN!+R1tK|kbhD7-%F?0Po9%C5kR`W1X0(%j0 z0t+>cXS73|gA~I?NuN^VKIY3o3_VwR()pX^0+CGc|FcHe5b1b*N4_6?Ug_g|)ps$Y zLry5f>$n$Sx6zGQuBSE^Vf;DyqZ!P@bZzr1XLvdTS>VJlbyajmAx8`_eA1~FI6P}R z;k(8v7 zojx_$j<1bJ!a$)}VHnz_ujKE=R)~OafH9c0p@_ICast0Ft9x}X3ZAdM4 zfA{q+H=-kw&}O-GV8<4@zj|E=&Ng&Kj-~ek<()l6jMsaM_wBc6+>v~TEJhqS9JbYP zKZ&(121j!q*=-KGzfeEprEq9F>s1@Y*bQ@|wAzJAXmZ18PRq8%W1yA2c4e=bZN?;r zDD-sB=$Fp$U#@CRX{#J`YPx85IFQs#aOXSLzFJsDwXVG6|2P4uGMn&o4~UUeCrxg7 z72yz7@H>r^q49Apcuj5Oe0RdXFSiH*Y&=B#9Hh;8`T6P@d_%X&DP>*{_VgNTq#HeQ zq9f^*C#(L2CwD9PYUn?M015_1?K1dv#gcs(Q%^UfcF}(S1LsPrd1?N-jki>X!-$dI zU?N-?Q;osny*?E3YT+sDz&ao1UUh9zv*JBG`Ek~a_EB6fYmo3TshQPHpEscH66B_KcjUDef(;J%p3GCdLE8tWy$BKk{`o2D|v zq$Ewh84jCezpk(eW+zMHAau!&)iyI1XfazjS(@?6E3?bAXyb=rwz~+K$~yBftAQCw zxfOl8LHx~4K=i7nh<=5UB^g&13?M?wG6&`;8Y9G#Rd8 z2kwLtuRDF?|6WP(?_h^C`pb8UOUIkE?m~srTieU^9wYNvFE$GccIGScqPHL*M?wN* z6<>$VgUj|`GTM0#?Fgl_bAW=}ZEjMfg(|0$(;h;V4Hn-G&GGey^?fc*?9ZV%m_SRIb+DA75!*Mg%5w2udxa{0uc7= zc7kRf!N-#*LKb}lwemkspx!Fxlm zAweQSK4^`c_w7X62XbK4WBA20qMxM#7@`YCwmclz5PmR}usvceNmqYnnnKzoS zi5Iv~P5Wctwgrse#z)9iT13xmEV@o_Yijy%pW(Z0Jl$Nm&7?%!RMHxB4RV&*iJ9ce zxnpbQFZ&O^b*45LU-`j(BG(IgayN{;WBAbhh`(!KBQig`LT$8|CPC)R#1Za}V$oCE z)sISA{;fSsjjfz^TW&A7J_gBPIJTDAWRGqzNdVKqShhV?eS*d0vS`+egomtIyLPHJ zb-wSpY|k(7R3ETE@Mr&Wa$=7>vZXRUa1S`Eyms>(DEwU=%i;Y9qSxX=M#DeWPPD%2 z+gv3h;Qgq805_+XMFm%+WWQ2RJtn!zdHeNbJ$v*ey$UEg+g8-K9kjgN$$X!Mj3 zOvbO0DV0D2m>VG;%;)9Eq@eTNnj(?8(ZOT!{qXgE;)TCjO7L|*>?^yb?$8fGUvxDI z>JlZoemG*aTd+#1yO@?lCExYrxEm934(ZJv(`R` zZ*zUOz0v4;Z=Gncg6zO-JP1N3KeXEHD9rZG z&9!^DnZ^lC+E(7Bp$wX6%_?7!_NC#!C&13-_{OUGbYd<8vg?ZOZq+0E(ZFUt)09#k zj8rg-puBbcXnKtPjv<}+FWMLp_V0TB(Q2a1wKCy4=*Pq$XG_D z+i-CvUoNB7vTrZrneI;Jb-k9E(f%T9;X^HIIY;yK z*(^_^HkMAMN2x43=LHJp|+pF0RxA?h{j|_@pPs8&^(I0{iu%;gah76wk zHp`u`g-Og=(s7=i7?a)L4J3`>vDnhdDGJm#t_Dzq*foI|Gf4F134SY`Hr!?Pa5iJCU_Rf9#1c35)&u(F$0uyCS_A@-L4w7_F-J&QJOD{-TwwR3>A*=_qi^+IGpzWIZ0&v7yZ7ijTkBU3V2Gk!ehaxes%0DAR2MfW`N(hfxxfa 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 bk}Bsevn+eEG}B@c_}IV4$)2|RUormy<(BN| literal 0 HcmV?d00001 diff --git a/blogs/deepspeed-fastgen/2024-01-19/assets/images/th_lat_curve_mistralai-Mixtral-8x7B-v0.1_tp4_2.png b/blogs/deepspeed-fastgen/2024-01-19/assets/images/th_lat_curve_mistralai-Mixtral-8x7B-v0.1_tp4_2.png new file mode 100644 index 0000000000000000000000000000000000000000..f2bf11cda74bb35446bd366012851c2e949958eb GIT binary patch literal 105718 zcma&N1yEek)+LO))3`%$4+$0=8VC?H1PJaVNN{&|3mV+r-GjS^;M%xbaGOh>%zXb} zGw&5uKzHBnK4+h`ZS8eK6y>GRQHW8XprFv-OG_w2K_MbRK|x0&App-bJHCkp{y^I) zONl|1kCE;{K~X}zmk|BvtaIpr*ofDA`{c&nM$<-s_coN6xk_9DJRKYw(Ib{UnKUOI z&iO-kI;oJe>J_nJ#iSXi%A0|S62|evq3@qaWw@e-hvyU0>y@^GW4;AyY^ z4F(74E!Kbd+<#r{FG55`=~EdVURI9sUo7YE+mQW+-i|8^x*ijqjulq@ucB_;puf<$1l`u^LMU@_3Zy~0X}srs$@pHJ$a3-D1i z{P#}&pC=1kABPPb)$qXFe(`_0@?TJi7AfTXkC^$FDTa`sk^PO0EF4t-E2sf)lct;| z{O_UZ?+w>QO>+Nqf6~7@nKP4(T;CTeNPihxGw&E9?k6GUo@lrNVI(L`lt zVmiHFeI{4aaWU3$7)#;7e7wKz_qbjT;u;s=+GrbdXr=sR=lQTfk>aX8r&hqryScbZ zE1R%3_U@!77@OvF`NWf_!qcT`u4;Cv$!@YjwlSuOeDOfELFaM4om4-sr;Cj3>tma(rHLXH`orpBwwvD-o&h;g zLi`n`?+EB;hlT79X3&Gk90|*twu%27&evqRcDIH&-d8?zY5yS!9mJ1*) zuW74IfhCunw9$oVE1f(|ukQVByKzC&!}Arlll5N;!eCWZRlm#0FNtmuAFK|5&4jAR z^W}9$?TjQFZa*_uv>NO$ed~C%29{_zE_glCQsVCA%-9oePP zcMymQ$K@yfa>hT6Ry# zz)698+K<=KQM?c&xm4b&&hZAT<*)6_Hy+LQd&=FqH_MJsw>t$(>^kwQ3z;Pwe%_67 zjd8P+Ol(_tMGxh;i8zU&#EIwoIS}dVp}gHFqqdWdXQAEkEaBw#t>^oWXYuRfWiEMQ z%~b_{FPG+^%cDhtKTS$pP5Z?q`)pYh36_tYn4Wr`EA1Zl4|L8yNAp03r zI5afWOlLD;H+5kOqF;hp@2BvxD9`EU$vD4S{AQTpaW%-Ov#nBazu*qnm8j#2{BSC8 zv*u?r2_{Gmc^csw_cj=ZC(!cNv}&TQFu|fhB)E=fSoM5I?tUtI;WNBb#e1~be-TT^fVuZJv(K{0}K3veuXTzqhvru6Vbi zydH9}m7JH?gD4^!R$Nilv~1wVcsI~!0tu8qm1~9QcLx&bM_*bm+3!uk>v~+q6H#Ca zoO-*=(^g0Y2rx5UV|j&2rji^(MwrXrf~0d4Jq=q=QKnKO(M9NCU`T5+K-5s@yy zgV%Oi?~9EjdpGkK%)R5B!{K!KTP?@sV%ucJ_5!AVI`Z9dlG-ezMawY7(<$Nx+UAW7 zfmCgd-{==p2Zy&pce^y=`MlckBdxEjaadg?nb*BcSNl)3{tD}I=P z*Cu0!>&ffMYmHR5Vf+hU0D~W=8{^a{@T8j6*uXIn?Z4K$gGf4$YQ}}Q9>SietrAWa z>dY5H3=i(9f^srOwHv>rT|S*Bc9h=R)R>HhXAEH@?b&^sEhn2P(+on!r6bG`;%OUC z;)K=VnJ74zfb@oa;K20QGoLMw7fD*R)!+5lyzo@;eyJmXt-01&(lHiGrm z=k|V=5XcKZ+ArDklQ{_HBE64^hS6=O=4W0f+`M2kQ28m(=6-xJE{qwu&VV23B>D3! z;Hb_B2dQmEcjVyf*RT8BDi08X4vxv3V|0+bW-3w_iB)5#1cC{3_@}np?G#S)85V1L z5b7%PqGdx`h>i!~qNU9Pg`diu_8i|Cf2Hs35yupqmQY=FnAL_CejcRHc%xL;6XM&D z$fthVZEv`Vja7kDQB9N!QRUvHJ;r-^KmmT55%G!Mh;8N5T;HZOnOfU!9cF7OJ)X*V z`ctq?Vmg@(Hu=RI<{aO_t!z0dCZZ*yHDn?YDm$M^&qhlT|9FF(jZh&}?A|yXipMOM z>D$69%4rDa_cb<*21{8zmu&-d_ob=mux?hT8yb;Rk>e0;W&L81 zlk0XGrF;n@3C8;Dtu|1GaqD`!mH1(yKgFsUSq^Vd3_1kc(d&M3HQbO#gVKoUt$b2J zh9@y;AqXdlINBg$(MF!0L-n-Eu;2F!Jm8cfD)cmxu_|6uE+ZK>O4}F7$I%#HmNBR@uU9HaXW%v@apu1H&KH>>d_{a>%RpeRd=|Du~RTsnijU71i^-o_`R*fqH@58l0KH&M^{E1!p^ch zjgXxU*vF=-kq(ohX1Je+VCU{iQ(YZ*p<|OaZ1hJV4njMj+Z<|n-fqzyF@+h@gyvho z^59z&@Ty=>^tC1&&@W1)*lHWr($Z9?#ai)1eXpLc(zIn_k(}qpb}UU~G$3->kq_F# zg6B`=RpY}XOzv;`S(j=zT7N@}rR<(hn3O6Lc0v+M+)htAg8Idd3WkaY-TDGc zG1po!OM0vdsAyV}okYs{)CcVB72L62ppH`^^DIaS1V+{J)*&GJ>WqFfKer&yS_7S* zK3=b`p4!qI`Z=q*JNtb8Aq)di{>RU`(x6oQ-cih`R6J&)jGC~=jNJNQFxV*?t^$4P zS|wOS+Uw0@v6W}i2}$D9?~Ac_<3^~j5P{&u?n`UmrfHpJ)*t;jRGS5aNr=}K1>((3B~=U5On5G{9$loIuaIFy+7-@ghw4un{cw{N zEhQR2At_fPCdG5&09PmmCx*h6$}9KWhs1sLol%>?T1jG<7OR>9M04ZQr)Y?RA(!#K z(`Pb7OJH{`A4x_(5;siV6+hJDK^&1gXPZH6f>A!k-vIrLdIogPATn7rF0|sj5kYrJ z^UH+av~7z9Ybp{%MMx&T^Ogn=$lV&hJ}nHAH9yp3JfZ;+vZ4x|<|!C8ZM!w<9sO%O z$%B|yCDN?rR7majm{8DMFa`Yk&^pi@gAwnZ^hL6KGMrfCGAeuPM6f*?{kZ?zoZqeC zn)M;5Z;s^LY{*ZafpVY-+nRCB=HXleRNWs=WY{&Hoc;^jZx=1oTD&UN7dwDv47L6@ zc0WUs3Z+5whlPN8gRC_$XYZGw#0z1vtikuc-@DnZycT2tyA<#mW*DZk!#J(C-XG{b ze;q5yo#vroz zg)n?pIaLr6(Yh3LOye)M)Etnd^HUgZm9$N?T{L4L-&hFG4o?6#%J$fN?wD)0O=UO6 zJHo{(D}Iy41P%}OS>C5~7-}9K>*I6J&`Oq6#PHZ0X9>5;N(>a)JvcFgp(e1q8BHWE zN|qKXgCzfzJzyVJlxIXT`{<@X#~j!Yy9LIvy4&=@4KNVjl%&=SnZ7OrGa96I4d_Qw zjL}?mYx82LX2$!z}|LG7#?W#76Hbu7E%Et|0Zi;v{w)nlrgPWbC_U}@5O|sGL82~u% zvWgNLYiO&<*`Exr!rZ?Ly+@#)I7u2Uz(>$M6ZGZK{#zDjG*W#`0GPE1I$Fz zdnG?HytJK%lrStB+a(yP_&-3gJ}WVv2IOpq(X5L^>QF8bB39eY7^xpijmLvq!EjbS z(bUM@KDYg8+i_n+_ST$w+JG;wkDrVNz1v+YfK3_VC2J`aP81oycr6xfYQ||B>Pw#X zM=pL(h@Mq5RH^?=u0RmnBNt$p0E2ixj43V2%0G7H4ktFFpr3H1ugwxJkRAf4yu1y~~iBBUL&atru990=EEMGe#NXc67D>PK)ciU_dsgmlwt37POFl5wt_uJf3FP*QP=+Yh-%J_YR41+ir}nH~HHV-$poNeTcyu zczUT?lY7AD*m#w`YvD4W*tFS%ErO&Ojm~!5HTVzE;Uy$#_zgUoh3r>f|+yb$N} z&($&PR^;o%@>xk60ZR4Z68V%vacPljqh}HieC-Si&8YoU@cfaoPWHL8SA4TB*hob1 zGB{hQqSEg;v*R!PTy``VrtQejme+E{MyK&t`pwK1l24>7lv;1EKFs!`LZ306F-5AM z6$h@u_V}OB01u08H&sC}gMK%bV4J8fe+H$R)+0z7NXz>p^f#3^2L=OH6*u`G60j>m z3D_0QFQi_I7#S@T6T`B_2Bw!P#{FZ+_4|Kd`*^gc=8;fQY?TByX}8->W}=;f9frz} zbeG=fevTZWRIwmyJQ13lMdz`H3pbPN`N^$3$3RB{g zi|F_1EEJKH;9#N!3YS_G#8>punp$}QOArGP!2y;kFCqTW6L-uw?lNBwW2mO2N6h4?3lM!#FxyqD+PuMLv7;GgB&V~|kH zw3hnxVn>^8d=U*E8^gF)oLf>9U>JZJIDa05(XTFqupm98?8$_X5b&Z1TF}$Le!=uC zc-f0R!t4;_j9Bm9l=I$^f;&$O;% zNH7v8p$V2YQDhe{#eP<)hn71$b8F7j22L#0s;66<)Mw(oWsgm_<5Y5tRxqr}AG)ya zriGOEl%zaXso0vSU1$5L^irv*Z!!l{_!#mznI`zUBQIh%5+=Qm#m++Z{P*JY*NK0c z@kl;4qgswcU`OummhuRsaJpDRJV>AAI_2D(x)&MUMO$nxn6Q-nb2*Y(?y7W-_p=Ox z57=lV$b2|7EFAo;af0O#nRlwcU))=4GHa7*Hdwti#~{;k7n+snkJ-{0PIUvWvPV$P#P>Y zoz^+t!y3HM4+UwCpF3fwa;yk1r3(1dx-5iy1AsUwnXV|2Lm17r$(snog-%xL$_@}L zsVx*m@pmt$8L(lo9>a?@h%-#^jcWn@Fqp=s`mPeL zJYqkCo6ou(`BjS2$e(yNM=oIRT^f??4w_gx_Ac9Cws1d-%7Y1$77Z^2SxN!!;qElw zx<9U*5w&jlt5VYMpc10aot0FGD&^)enbnXroRQOg(o>uzq;*67k6aMm4#}5PON?!1 ztZFvNeNN@*mU7;ioLH2wiwFa*)oU#`25W*Jg5HhRWk$8RcH3;0Qp$r)rhPxTXb z7a9Z(mbF;Yp3fm_w1?lnY{WaOKHj`EW=yXfTAY7BqU*p6CKF}%m8AB)UW9j{sac5T zsdD}hMyrEYcHRDY2lPo{Bs8I3UBsB%z2*Qo+m6FSr^6}fiWZfjj zNYYqO3394Uw%*f6XP_g;&5H_Ym)oa5rYv<|>G@Ohnv2N85RKdx1r{gWWt(W@+a_0R zRPxXck*5}kbf^*-%Y^&G>)Y(i_1wiAmEre@iEO^n*dF1LG6bRn_cxvUZ+)X7@HsOK zP|9)d)pkd=;27TcMmxN&Lxm^t^nMqkaEs)hDsVVU?sll(gC-f=1g_VD(Qk$oPP3~t zLru5b0nLmDk6FM_{YrnWn%APZYpf6V{hsCR4l$dvy}`w|om7dZ$S+z%*(1}{AUv0q z6t`Lbd!h$HG7W+LQ+BUg+0dqHWd8@O{GWZ&@G()>`Ye|_5eNBB;l2pUm3@hgrV9CiUUek3YIGZSV$v~yJE#l6&+*^=o3kABaQMaVyxR`o5sXZOU+ic^zDKWS% zF=`~Wa;-1QsJyfmKG8A0;nfaO+~@A1`O*&5ylM5e?zR^}c7ggrhJ(YYJ8$PL)ORmZ zL0$95x^1owD=CyHmQlxH7%&jky+s7|yD`od+@&wjjQD3PEc_QlW%1)g{-7h?wN>|v z4{t0N-q7H1!>o5>3R{ek=kj*$R5=3{q(@<}H#uwNOBbKblO?btPx`fjDRlEQ7~`00 zGBwf&r!3VicHEyPvWF{0B+0T-u`w5-0NqU{>I~2VDVT~+?$^ssJgSxGAa6qC-sSfK zxPCE~_Ue{3quh*9HXL@;{;})>beo);DeB6>*}EwURd`5kk(wO?iHTfD$!xK{X>N!% zLP+Mkjl#e5`kUrQ%1Ta!DN^`l!!C(#-tCq;+68D#D%59!7qMf%+ ziFM82PHkN@!3Iv+4$``mPf&?XvT78{%{o=UQ1x1e_8y8ia~@Bpeb9o8v26P|W#EaQ z#qrvzMQT!RZX=Y3$TNK`c(OOevi*)=xh=F4tCX7ht2Cu$T_c-Nbim98<$1|Lf+e*s zCwBQ!7^%6LdK1wz|vX1iH2deP|ldjGff4c8dOLO@X=QPo(ma{RfN zNUIF+gA&-$+=2MQ{q>X(x1*-jSWP6$)*#2Bh z1&w}qL=(xx0GY&ys2lxhLtz_)p+W?~(@Iuwl2Hnq?AGR=N~}i|&8jES*$qTf(R~gV zBgk1~DCG1Yho^410at}!sPg|z#*c~g1>>4lg(47dalVrjB{dSGlKXN-QMlc;**P;d#goej{m%$AtAl zyYvIpvfh|wZqhI)M(f6T8{SEz(i0yAvljJU!X_b`+Ok{dw0Tn-wpQ@Ihx=E;UMN>N zFk%qGtsCqzlVWR@Ya0O1d0eH~nNarQ9;FvKlT{>FUh!Mqx(hp+D!CiniAt*26tKfH z=I3wSxsgi1o0$=8FHQzs% zL;@3xI{q`4QaZ*D5~o6_-(Q<>2-~|1u+GE5n*g)bJm_=;GSzwgI>vG6QzN!FHI?p4 zE#C8osx&2|@WQss8O_m!&NsCza-#i(YUMO?xbLAusZQ+UtP3#7n8zgH0Wj{oaWdpO zV%kBb!3u%B7kzgYP7ruxN~24mp3uEBc;-s&1MJBNz`^D0QWM9 z1*^J4ev@t-Yio(tCabY`x-Yd`i(ca#8!7p9yqB|ZZ;6HR)5C4w7|ZpNUDW(;XIvXg z&uoY?IhRTJdy3Je9l7tlPj<`eZ9ReY4k(sm=*Xlg7Kl6W$VdU^h`NDhb3 zUf+UcU2u`Ma*8w9UeJE7M7u5CbYB?kqsF#nG-HT`u0qs;>c?9RFK%@4IFTq9*>B#8 z-vK99@w8!oG)3gUnw`ysglmdr!ZaAkq9euWgBzmX_#myHiw#CW`8<{^*BXiFIu#=) zYBrp}+LtUx|C+4J>MU$_ibw(R-8lV5R;vJgs4o@SmV1I7I?Z@2*~Fmb^^Z?%K>cLn z%NNX8tSFF0v&1-tu?H}dLz^rn`mfNyD*Q=%0#0{HmeoqUnWv(YF}ObrFnY;QgaT0f zEl@c-_VQEY7LyHP#~y(JRD;~f>&Yn1QrG#NCOxiRr8zD!tjYVt92pOIzWy9LrP~EszqJ)Q zD6QFdd|yM3vI|n%d$Z0LYQY6B(C!?}PRCS`78|9~-y!IJbER-io$)ncDRJO}|RL6y%-Oq~8vv7=8RcwluV6xml zo-6U8g4<28LS;i_`H{GAG#xHPq^LX%qAVIo{F@a{?{zmT(1wtb6nux|jS{@9|KO9N^WdTLz%7Hs(7NQkr+!$lOc{r!T!&x6H9w2I9X4@7~FRi|ES z5iy%5UuFY#^WO;vM7)8~J{p#mD(ipymh3=axL>FtafJP{lYhw%{)aXom<(oC$Bnfw zk}OO?_z}eVx%MX@1&BJR=pcW0+-SJa4pdQmjR22q^Xmi8dUhCFsJ7Q{y}xJhvTDi| zU`^o-kJGOIe(L}GMLtNB92RpNskTFmbEX*{imIvs!|WZT6z-?cLQgk_wO@Z1i=y^N zkOToEZX9N{@*dhmEovVQm@5_Be_1Au1dv#8ski3mBgiJOh^BB`Dk>={S#5|t{yidK zV~R6K(=#&$z$6tAF(5KAGY=D^ri_It%x4z3{Y$eFhYzzgP{Huz01Qc03gmk`5h=7x zCwjvO3@0*0o!0{htf!Tvh-@az;j(U2zl@?@O8(1a=rHvUGBElGe+XDV`>(XQEzU_^ z|8JoUr<5Kr#oYZ}qBi1&t#i>^(ABM@fd5a6W2wRoh3Jl^3zEPhpm8Yq!y;n5q09Qo zW526N>ULPwc-n>fqJe0I6FVy@jI^ke{pWXzI3t0EDqdlkRL%nv%*l2SwI zGoL9HZE-w0-~`IZ0MXV4A>(1ciIBPLfdC5kkp)r4qRj`?8QA2j z7$E&A>qi{&E}BJ>4;$heG-Dfn^A&g3C%To-F9tmL-Z({dGe8riw>c0)O$hH!U~QAe zp$`*?`LczdQ4L7lFg~(?@(JU}dYZSkTfvSm{f1A#8zZUSa&f^aTh1ISBQ#^ZZo7Zj zq&o2sj~xy&`+1bp%kq=e!~Tx&Ghbg6MHGPNGB%ptm!L1v=CtZDn_F!mUE8Ia@OU?BXCj=9PJqe!dFcHmiF<@30Q=2@Ps|r_A|ydAv8%Dhm2T zag5s!qE5GfY@rg65g-V^g9Ou9FMKJ`|Fb(e2TYCaVAwt5QDSD)^kdB-X5qOgB1846 zQ6YUneNt>b977kq3A&8F9DbMJM%%W}cF#It=2qdh+Ei$ERB`v$T^u};P32gDO;|&Z zZu&_iIfXHtn!d)f8&gf1?o6Kb)2?{zDT6w|^00z+&ENJv)M@aYmb{FwNL4TX{8He- zx_9>f08B!rV16+7nw@`usNrwhi;s|74MI0F~1v*4*hi%KI?u4;+#EO_PV!g(L zBfyUT0~fLP21DpZFVC65+S}R!3@@I~`enLM$wv_Rgu89?sEQ!4Yl0lQg}95*uO4o= zyg$#bK@BnC=A*p@Iqfkv*~bU-_rLN#kmSbKl<|dMPS%fZxpy4m2_FobJS~)x-l&4X z;Lj5;^?9nxb}|?bX*fhTq$93DVGOln%9Rb8VGJg^EA(jj_@Y}ymm#>48! zbSsHcEzIU$zgBuay4G4PFU+P*IhKXaE-Q6L8@Y7{qN`UKz%$@Do~#IRi|o^W`^Kct zfOdpkSwa=gX(n5F=&Hr-+Ce$dell~ zyPHS1K}_A|M|4v{bZ`9%Zd92fA?#aWA!?p^ms&82sqmCuE95KYlkOq2?p0fARai*L zQ6508&zO_cwEV5*sJ=GGZGXCmkjn(^MTG)D7PjN*vcl%LX~#7kc^--2*Bf_0z$8g} zI9HXk!#{i^)}9+;xL9vVi-m9YP^dou`oX zv>VfAPCrQhd~=Xcz}Y%kXPt@ zfQFFI*2r%cqhpmz^s0Nj8E`#K%0I767iIosXr;se?YT`P)A0 zz_Gpr*I?p69ci_4A-wx*CEcE|2q~)ZFucG)gEdb~Xf6d=Jakm(E=an%zS-n>rWHD@ zu%<5_2;Zhe&7H{#A2z#B5E7(!g?~Sq2LunGL8Yshoxg7`$sxcH2^bB2dL@vDJm^rk@e69+={-MV113G;U+5nXUlT522Hd zxf(3{n%j#(zyDF%nE`QlL3*5H0n}hBi7pecszx#4Z^#)ue$ zS{_G2D|IwEA)L82{+4=GVZBqhOyh9_k%aT`IekJDnPduL1kX+AG=2w|@tQS_<~(&B zk4x1h>uz-CoiryP{V7{>{RYIU`^_?Jmp@@K-|XIHiu#@29aOjlies>hD}uMh_~v}y z1`r^A5@HR$>;Ed`!5Cz2TydkpXPr`ZOPD0K(ws?7>O>cQBbrdxTaQtS*j5#}_Ynabd-NwSXW69GO5uP#+~>|q z=8*lRNNwPLa9f4~6*Tt-ij0pn5aJpE>Fa*^I-frxxpStCw*!zawpL!MXfdtWz9xIFeOzE!rI2nE2kokvOwu0soJAwX~$SJSK1Klqzt$;ekr)v+G1gF`~ zYyd$k=%p2CSawXoc25WPk)`liApTRB?(>bQS>H0}NVcP6 zU!M|*V*_ecEsq6D==tGdJ9QgS!2N1%_=W60oXGy74^|7}bWs4rnF5A7kr<`-Cmj@W zK^-QeKWcfEoVQ*ClZjW?OWu-feKj=-d|Pn{vwwBHHycqAAJi4Fz!>$Eie(kQ!eE&* z@FgA%-)6MOb=Os^J(Q9*j@FkW3bhj7YzDeoW29i%uLyhUxtLXz!47xR3_);!w8xcU z(?@i3KFl6bQCU5;b^3TURe7sQ2wRiNn+Cx6#+5uUhBcj0fY_H_URaxXGberx+)OXot=?Ww!b>k~iDmGe~fLqT_F{qsDt=O>IF6IBxLzEvx+eDSYS&_4qM zF4q`*IXq$W23YYsWZ;*=L%P+`#W8L-Eg|N~E-g+05sd{q9y`@+x_*SSJ+;a>Rr`$J9P9K$87fn(uIgAFd z4#-YkWY$*Advqf|-l7V+UBTJ3ZpO+^WP?#(B)yG*HWAj&Y+eudw_A?nZfkUTp+3(+aU=%cQ18hDTVtaDp+(`XN+Rqf> zvS+X0y)(b+k4=_8QE>Vlj~0??Y$PK|lWkv(y$J0)yq+JT;BBPTK$B|VREtMd9XPRu zj-hom;m17%bosp9iqIdzjD@#9UE6MoyKeH)s>kacP@@8oP@-`9{YWj&>_mQD{X8&* zi6m@X6;F2$dEmW8IAPZc=>kOehc!`ru(3r9O|YIoo!6&N=ffe4Dj6~1LZy9s$#GMX(;kc%<^70j z;J2PwL7&Q^`3ZKk1y-sx1`8cVN3)HRlmxBKp3dLA>*siaUI5hh-!wpIiW0mc{M=v_ z0f^3ttu9+uAIEYNx03@#f4r5wZ#BrXsF-UcEL-Izj^G{2# zi!js@_QI%ReGqhuTMC)Sac1KNtKdt1J_Zz%f#$LIbNLoKef2;Go&2Yw8uj%2d#?n7<4hQW`j_G)^39wFWl zx`6XTTj_NjG(Ff0wSdhMYLogWCU%&tMO}wpJT*d3Foj0ZT}k$~0*bAb^OL$8?_hWg77#z#zblQ*6qA zP3PQY6Yw)$X?00@Z7j1Kb?e)40}1Q=lOX8&2Py}J5yzF)2b-+`dJw}rDzt9)%CtGM zW$~TEzQ5aXQ@@rikT@YgnT7=2It zaN?{BvF7sw{Zlod62l~izNhbj>HbmnQ)(8r<{5d~3Le7?)oi(-{Q_Fj)J>EZpU`zr zT6)&sCxf*U1-aOlB1N83t~`8)SB2#P_{IpJ)DSwV3B?y3DDbMm3I~v2<<%7g(s&>jKozng-uUmxxd=e{%lg zQNt>?sR)zrgp?tE6B8HsCQ=nz z)^MFJNb6n5Q1U5TcSCye8%)xC{Q6)%EGD3}hEo3NkMp@J5j$7KCL-~QSM!-TQ{z0q zyT$YPn79Apb%Pm`8SVJ&?Zq7JjDCkTmdijr<=d4baYl)$c`k7JJ4FNxKXDJ2`6!~d z6)q9#RIthW%=fPYoN!zpzJ3xxPW(m4b7t#_f9e9ebTkG+0n#o{%X8C3TFb9w{OKqz zI|hy?K)@|hq0=_P<|;{&>V7`R3#4jVtnGJ5G)Y`5sC!JADLyMWKyaKGyZ`87!J#FL zseVU2@yLXQ0Y=#adN<>=nD=+==+eDLEq%4z|5ZN`CA&F(@#fFQl`47A3rH9s) z<#Agr1($2L5OYR<5g|f8ozeWJU(t4T{(&-AdVuVt^g4oPg<~>=?42XpQkHSp2hd5> zU$|xm=IESX;bZ@AvS4fb=Q%Z&Cvbzrw!6Lw0`KFWUxGw+4DQ7PTA^f^ehQp;0^_`K zBD-I9!B^D(Xn%}4BSgE6DhLS~i$XqeYx0mJ-B*SXOUzP<>^%B}4&C^y8HNo<=-wh} z`xW<8D92nfVbR@}g!WeW5~I%VM*#6z8totZ9_S1D*l=ow)OyOmDZt>w>P4h}_Bq?I z%@fLgj_VSMI*N!aM@Y!xHl7-Zi=_ulrA2k*YAQ1Wl!*EO+1UuFX3zEtGKfJBp_H%I z?*LJFCBU_80HLcJS3$rBxO?U&*=MRY6<808X{0oQDLe*B_>bh5;8t%oyvKwAgWcBC z#S@G-CtCJe=Pr6ioFfIeR5~Otm|&J@6cBa=?%7EabgOUj1R^ZQ7v>-|A_HahbIftv z&G}J*lz^fomwFBrvvaalfLKu&M^04;=*gSAH8^K9G1U92hL7x@9;jo)ex4#5P$eXZ zzeM;(?kdzLCiX{C!|2yypCQT1y3$mP+IgyTtvdAtMnq3lG?v~9Wu-A-g7To+yQ$Vo zNH91a{7-w8w9Z~ol92i|2S|z2AVuMH8;(l-^nHHC|J#sv;*0K2Na}K76sD#ptq(_c zw${h4UXD*dfTK8xe*c|rJ;^YV({%A+S4tQL)6^tOWZ+{a(1nMg{)krG%yC*nt1ha)ZrUc$lI*Kzo8`9!+_i)_KJRwY zc3o*QN=$=uz99Utj=8(s(y(I!H&h@dKobN73RB>;tpN&kv&rm$PHmX1oppji)W^T> z76Zpk7ZKZLV8EcpCAb()GW)3mH9EuU8aMMx%Z)=l5-S^EL^wh!Pt~aEjS6b7G%iyN ztEMgd4KG_6y1#zM*#|!7dPy@lu*7p~++;xsQ1G(%fgGH{-rfkMrI`FsV#k1k^$ zS+q=#3Cmppg^>nRYkT{abXDvh6|?}`-!}d|XgLBqq`zv*G z09Ktom6=VKHfY?2)$9BovVFymuv@8?n-%^lFh-Ka-S(?&r2*Wx%n#_{3IQW|NS~{2 zK34nqZmTG5ko#avU@={%$nHJj_+qn?GrDPb6HJw*Thtq)S0p5~+;ipiz=b-^9eewaeL^SY`Qo?B5{7bSUrn~AM2g5#JFbzN40u4_IC7pPua zciw{CvsO|3r`6jASVx~7VJWhIg3SUg-1^J~Khz|#yXO6p;^dgC39SW}Q zAS5jP8UYIYB#6AT{TJ@*lz43g2tx%ZOOFJCaoNAK3vHszvJ6*=|3=OnL6j{`KVUD5 zrnU14zkg<%dSBY%rhWa5xa+_&QEK?WuhD}arh5xp|9{XEc}~{doYVsTQuRE_rG1EX zg~sgA0@umLi@%`BceV{f_{jmP0?TJ2OnP?=`8cP|y@W}zYfF_`TN1I1>U>3oY z@v6C(dGHcpkHN4o;0zSD04rkn!_poO@wfOKU8@?!iZ2jr(VKaxo7bt-}Cwip9WAqEUK z59}LTlWb<_5WiCXedoU%IFX4TQlg*@o+z^*uwu4*oqJ93X#yKBHxfC^n6Aov;=(&( zv*r&RY3PMB()xso6n>@Le-|6=+*4$AR>Z5pJo)LYLCig-m?a?c)+k_eN07BE^ue8}xqfiE8o>7rRZ?58r(F@pOuur?d(L|r zH~3)g-p;{p?@?xN@dBta*ID7ilz^YZem*AJ-c-0g`9}ggMhDH{o816m{n?{;*-FMV znd8zxVK{z$&=vUiB&h!{CqXSN#Lb3ivO0KFCNgg5jp258;XA4*`y0E?LDQSn#?P``~GZRq*+ikw=P7?ryknZGSYTF5x7`FKb!yMdb43b z>p=j+KgUb-gYF5xbo3tu9uN=~>V|co7ZOQ^bok-ag%Qo#EZd}agZ;+FgXAyk&r0)A z)X$iT6BT+($A!DS(;UG$=~6I@huE4z#FTgGCHNiZXsR=)y%j^6XczpULm|Ih*411Q zWwFBQD7PIT_x9Q>+rzUN(7#i>Egi3mW|K?)dbA8o7F^d)IwiiCm`suIznrL|I_UGa zX@WDcd)1M9vF_7@ai7~~gs!sZLL1ECV~JzOe-xveA`wb{MitbA!>l;` zQFc5fd_vRKywuE%8+?d@#m{Pz*(ssFQbw@&_c1`0h~8NnEhi^odiZyuH)j%*oz3k7b&ry zD0b^LcJ0(lnyWsk>v${SfqmW3&^i6d9<8Ai!DJQvqX%s5JjU)jl(l4bPBw5qN1uA0 zx$9r3;c$s|E@Njf5jIa)fxJ-hUH`F@N~CzlqiVI7!xmcvjy>5CEE%Cl^S6AL3Me)Dc4`tUR zvjNx^X6=QLs?JBW5^gBnC0L6m6thY6Imb5>g~D}-;mu@AoV%-2P$ZQIK z*U?M{)|ku7lFoArGaaI~#Tr<3t#cEIfoJ3e=-KYcsEODz%>!LeBg-^D2CoUcwzPQ!n;E0PceCfyETigR)#|NbOr{4f5xjwJwd)?E#l^Rop!;a^tMqoH2N7BvGBt6^eaxnoA zPjPflr$NF!FG}0re*hxP5YWi>tEy?oLvr2D2kC8qTZY%$u2;IZM^h$SoW7A-|Ac;N zO{@CJ-P8qn7Ds`(h8`w+B?L%m@Qx*g4S0CnZz*6TKZYf!B9(CHl67zMoVvMz7)Gqi@7y)G8&E1RaBI_|ZX+%HBMM_KV+%B0=jSIumA z(DTe|N-=;uIGj-Hp0mbOPCSflSa??1l; z<{@t-ro$?LVXFAZ3v}w)zy|Ko8KWM&F`wdmU>`k^YWFv;ZTE}XrPpHe^8TSAu?_<_ z7MJ*Z`Q@D_>vO#9{#g7)8*tqdf@^bBHw(%1!{`F0TN^11 zI{}#<0CzNJUeRXV2~V&FOvR;ufj9?nldcGOFE>xySuv)NkO_%xU9`MdQd}z^f0)q|@s5isaK08%wk9r%OfBpmDfHb!45i2RD^Uf9bY~xIi}yeVZQfTmdIhVRb|qKUF@~JB-o-ykS#jq{AY##uQ%?s zu0Qm)?uXdz1U&53dRZhjgko1qa3r_$lX38Kc#b&a4K;m7JKBgp`XDb6br8T_l(QRk za|H-faK@p9TVPdGTLz=D!x6BSI?Gg=bg(u+^-~;rM{jsi!FTc6Po{lIKLDG$a%of= zvlnD|go7NC!8@C&}q^BzA{=}Lzg!9P;2=qPbAQ6P_*1t^BbyOY6~ zZweukpERlG0oLvX=w}YA0X#?=2_&?{75M!#m>LUiQ=U0>0#KIwVil6R0tijGKj5o8 z%)T|p;|4RH39jH~5v$3qJH+-a<^+@}^w}ObLaz@T;3iZU<+72aK$DdVi=cL%~a-cOR_Af0A7(Ym`Xu}d8+ReV+| zL}eJm5s09T%>4QJv1_Mw!ujzVHA6jFDAjG@*Ba`44=oV!CyQKz?=H#?)yx48HdcpZ zwG}G|1ksmm71$CP!A8z}g>cbGe&vRs(JF||JH1Ysdm8+X+i@K4zXSlKm5~8x*00^P z3Vn~mlVIC@0MMdZ&-l8&%I#d&R@Axi&)>(+&6SzmnBXO>3jE@ON3J)0ph+(LB#scd z;H=|g!v@tz7-qkw5ES70+Vx8|eGZZw%@7S%4LV*U!^tt$D->0{vb2!1hd+l8(O#Zl zTM))WauE2%i*seL_W?1J*_1-FS}cBFg53}RVqvC`!vHu07v2D-KSE5=v-jBF#jciM zsnhO3EDqlk1T)>Z+(!BE-G@=-#4wsk@{ zT2IUw6hBr4$`=DVk)bN7vn}54iL=Rt=ODpC8UPAMVDMk{UA)cl#;7!`v%?1)+&WA= zvR0nlyYQXT9VGS!Q2DtapF+;1kfRyw=&bmhCJxuE*l3ADo5AN+pfoS4-k)y%;OA3g z18{_2V$WTDhiMq|OQ^C%^+Hq|yC>cxx}RYCIZDYcOP-rAy;QF9+ws{eLrzfFBxUhr zTW=|g`d-xN9ko4>ZnXkn{LibNuIpM59b3tsVdHTbFlzv2fA7ghEMZDtcr-EDu2N51 zYUoZR=>Xp!zF40YV7~07za@59ptUb}@$V_M?XTawu{zfc@2upy9uC>i z2c~3kKV8=~eWM>F72*(H*_RrhN6hWGs?YJ{^qRBRW>_!R);G{3hoBBG>`m|KN$al^ zQvfOidA$#dDyh0Tw${Z#GkM9lr<0&!>RtNgeC=OkH>@dCqXeRD_oE+ye`*hiBP{^ZU93no zz*8J;P>A$xOX^Q-e6$MxK(;B%-EW{fjG5-M8Kpd}1?=erQnYi+F#?EmSxXeD){-Z|76u7#dG~Z4Pe(3}sA4vR-r|99Wx+!`6wmK>Gz@IL zXPI9}yr-$-M6~*MR|bj_w9S%Cz2`|tx ztb$&GXIsj-aT(zb1mZR33u`&?Su1)3PE@iMK6)rWVB5T_SzHONg8O58Eu z9xsxMUZsev0bvz9zkpTByY;K63ehdd03xnFlNY~rRjzO31niiel|N z$wQ{ql-2MnHEv8gt*|Btc@glGZ9PW02p0(mwE?PCS)_HrRMR^71C~G>@r*P_Ahjy! zX(m3DQOdKwyBhG(V5s6;mOsAS{Fdp_R_eB*KM%=4@%`m!b2+GwFAqdmB6rRXfqEUF z)LvDQQe0=jXKxI>EYCz|@e+w&&pTw4_?jKU=@DEf2N5hhHv4jr59oWQX*Tg`p86zS zK1f@A*#Ehh{tH~B*K>~ii8l!$1n?4(G9tTlO&WfH)Jw$1WDFwvu+bs&as9=28Z0iD z*buX3sbG5$jqK zz->)|`c8BDMV^g9bh^bkBxvT|(g@8WOO0~PNdTonMSiwWvHNt^;KzF^=^eN(yt<7+S-wtYPWWO1X(5GY{S&gkZtjXys_vi z3>@I!mq5$CAnPVPoB2T(0ht_6Y9CxHm>I-$*^CFg^^0+lLRYlb;C81f<##7P?|MD) zes0{PQv>^V&CHrAteRu<#s3bYOA>6w4pX+EEK;RwYW8&uUeuV68L2*+|8F&1Y2^Sm zoHqs)|NEDx|5YfpqHmV}YJwJA?y($i!E)?tnNI_oj!@$e0i|J0|GkvFj7+M5j z^1ePqHx~+Af>W#{pk}#HZ;#H(M+O6~4+GDp;@6VQe8@i&s-c^+K zn)hcS{b^!u;{@pPbW<%Rvc*IzjP1br&y(4crDX>J?W%Pqi#cwneBq;g99gR_q|Ls| z1Z_@MdCZe+@!{D_wB)`Sw1)3YIi~x&Q$5!mdsr(}5Z}rTt+^@fTGCIyvz9z9^MJ{t zXe$*sVg9^{K1J~tE`~x*;S@jW4JF&Iva$pSYcCRIp!}&^#rf0uHaX;&K}#HPH=qng zphUVHyN)yoMm>SOi%?{f{2qYl{P%E0@ZcpS+y>fj3p5n455a6wjeSK}BKUHIG?csG$vf6t zSu}4ws@tK>1)vSu@RM5sn{_4m(j8GGT;}6jvr?9inzU^yf&=cMZssfREdUK`TNit5 z>F1A~z@jpb3u*Gpab2!`J92+f>X#N7r**m6>W*Hf*TKhPk%$zkO9iT_5 zC!<38)7~{LNOqsw)xuRsN43;&+ z{y_9zNMRxc2M}Q+=tP~LHWM25k_ikIWmgD{>3na$1$5nzTD~zYL)W^<>pcUYrSEx| zf11aQnd1eckl4hnU+exSXUtwjySK~z4};1+7%B;Q?UJzj=Y@M2F%o(>&H+Ki9HSu1 z8D;TQmXRP*L*LY&mrzoEId(e7bJB2QNJ5^n1z7ox!HgN&6XprBG&}{?leCBKTMqk3 zoO{l;f5t#5Zld>cMw)@lyXd9}m}M};yvQekggvnseffsubr%Rux80kp&#W!qlmkIr zmw0;CIUbX`z%rc2{_L-_YOLV*E0nzwIb{m{+Dq{t2xxGCq$qAryX05E~+FHYOAk$un^czS@W?NqE2mEincp@03|gEP;;E znlJxnW%3|U1wcN&K?S7M`R}c6LXAX3%CXrggPXP;+`^i_LYZm6LH?)Z!hOqJFJF7DWm_oKnicoAyb)e0(g3dau1bC5#uF@Fuirr6_Pen#foI+G+0+vbdi1E=y@ zzU=wuyo0{g?GP+P_w$*$4->Em7uA6lsB0O}25)Jj*<-_h^ z)O%s7d3N8*LaOZaC(-N&stuIQ=!y?y4%oJ?+ya(~l zrUe15e~}nFgz`=PHK{))OBT?0>{31@8N2u5<^HaaI8|#CRp2{CSJICEdv~m)u?I5p zL8kWWUkU7V*T2X=m$e>2N}wYhgpx5d9=-Z@iPp8A7)-YxjNvO|FRA!5Bjkv|qSE17 zmj$kC5%hI*T@E0mFegt{EN=KTX3>O@XW4DG8_#fWa=b|5@}NT!5t{sL(C;hmz&Q@m zzWHBF{r@1J3@r_`v!};~{Z{T)@z`w>tl2ecnK(mv<2=pTezQkyj?bf>wqGE?} zM3k|IJ|4|zIX==T{*VfGzX4L13bsoRwtU(|0`Pjs{>Tw^UGUya=SfKiDHvP>@7Yl% zJ3V5frBw9!oEOmkxS|AG5f6ij5DwsF<%%D+@g^HwmZfkzr(3+u-(=qkBIO%BaWCPH zVWdX#b~4Wk|GEHDtwMFn^ze;j9S*4@RAOcU55G!@_SI#Nn+$$a&bUwPiEECe3s9Bw zruCa!5*2SgGdFk^71_J0QGEfMTf=CFkcG+P1n&S;wnP|y+?C`g3E`c%K`ElEaB;=; zM&?`F$VL8|gjey19HM8yz(n%mDT8C-{o!*?QiDGYLPop!A?1_jdi~(0)xi1;gZ&`EJKa1Ml%?)jOtNudYv0 zEl$fg`m%w`=; zZH2*?_V-6x>I+_8B@_MjkIPO<{%x*;2Y_i-hWQtHUXK3;#utdP<7e0RiTt6uVQv)0 zJJGXI=__D1LPmKbQpVb3?7g1c2x3gN0@Q-5tOg^5aTtA$SwtggR5SU`$FfS5kYq@L z!4yE~>Nitk1#|(CuPlExA7Ov`EStJ>S*1Gs@{=qrka{64>RceTKer3UItqgN@p}Eb z1qVqqD0v-6uxjrJb@c$KHp7D}A&TSu$p0vg*-@FD4PjZ*q5ST>^AkSq2j|GcI@ULQ z;<@}>W9Srp($qBxG@i9e*G51FyBpb_#83AZ9Be5AIhPK5V-vS zRU1{eh2Y?89n#iNm0p5BfYuj6Z z%zcQH4rLc;ycL_|vBPrA&-~0M@)t$;MWmhpskSVZoQ(@!HDkD(vu=4>WMs0osYG0dE5&r@DT!lfa;~fx8QZm*xquW z12!AGSm_ujhUcRwyB3k3x(N;1(}jwSCcbk+sPaS6sKx(e1Lv_ovE|00VfbOaI4DE( z_tQ-8kng9m^+39f$#e`TB`tK8zh&3}WB8k^Wb!AWuop)lh=sQ+1q(T-tssc*v*l$9 z8(!RhFvCN)|6qm`Xn;K?fH4QBoT^U;2oU~?(F6`9vMFPCbOLshJ)&XpKgV%iSIcjX z!3eU}A|J*~FC)kfxEy575!6R=Ik{F_wk>y5w&mM!^w}y(m&>|}**5CCfOA3&k6HfX zLt|S+6LK`3T^O`Sl}=tL#gHInh)7VkS)|jmOm)iJf2@%y-$7; zt7Y`W1vl(@qr~Ni{MU(-l(;8@dubrwp-n-UGgy zBwv6{$v^zLxAa6<2ILHf-<3TUtIOwi~Al7=hxqpUIk4ZnXUFY zDk+h^XgKMsl6aQ9Z&JxTlUD$Cw*WSwE71Iad{NX# zO5@MXZZ&9&GhVr>Ja_HIU*g}%5_BJ}crJ`aCWHrO88V-zb)jtN^jOFqJrtM1rjX~ zJj~0)y!sU>%y#ON**BfyEP3F+l>teo7>xhs+;Y0g9MWS}0Z=`+v=k-PG(Zpn ztoq#@_uKp`O%`0t$eh~#ISa;xYM*mEV~;V}jaiV%Jf{teLN1GX-^&9zyg23Wud(Bl+aqU2 zLO47uw(7jQ(n=}OqHNdRivPvg_E7N-`vSPzwHuv(Df{&TXVykZaZVR7q>S_3LsD&8 zc0Oi0ajCIX%K8m3YmGIrffXvx zWrn|tGV*}E`2fx1guUa!h?v>S2(R}kG_T{0yQKo~{Bd~h=#cukXjvya@2-8k0&jZi z#V#<9sgKaV1I`tizf0zNRnDfdi18DoxCk3$Op2pVB?wH%r@-#?lbnQZ>e}RYex2=3!M(jBV#c4wUe#y?6hS7|I9#NEi z>7+wy`U`5e(QQirU?&~N_{_bi*W-lwe z-o&O?^98VT&&kAaN4fxoyY1H_FsLm96JCD?ul;EKenW}pbA13*5rK~LWCFOwSL5Z$ zI{}xOIk_kmi0`j^*BzMZljrQz7fnQWOL$Mf#PMgqts`uO(lIB>)K&BY@ONVf?{Qo+ zwEym55!um4iHVCSvtICWFnKosA6M}4mLvE46>S5YZ?EOKol{SRL?&OIz(FG%njiej z$ZSG!a)BcW-^OpKLY_M>YVZnIv72%zgE?TOOaRuklyZBhd~aDwc!3{r!GPNR)U45! zkz+F;*N1!b94oi%jeyUsb#E!eMeH6PY$}Kp=2UjnE%Y3YiklOSmK+5?J!Vd z+z?6H@N;>*#zG3?TnyQgZ<=5PzT)v3{e)J&&u|-Ja1QrE$5F3@=|?`fj*v$Oc`N_6 zc2y3>52lLO$7LAO?64#r1M2vq*4IE!34tK00V$GR;5v@)G_evd{5>3os`l>FKbZwc zsKF_`gQK-}LQK{0nM^`v0ju4XAGCN(S(=u2eyR&Et;Puhe-aEpr%-^co@>z#r7eeu zO+JR0Hn_?Rj(eUVc$9oh>mjX1p5Zn6f4h-y%L&J;xi`gf?O;cnO;^g(lw{H93rbzn ze6y^+K1I8u!GaMPwAvcY>#Ozz837r!*}!%izUR_FLe@Oz4A*iHdv@DYTFC+6@h%tC zUA7r!H!HP7rqD3a%* zirck=iw*)~k5~IwAyn*k(NBNsERZv5P-PY@$VUIOBJj9uK85wXDT5?HD!vZCd@j<`kJyGSM_RCx`VU->ZjwgfFh(Wv{&yXY{VtHUAAT+Jvx%KuP?Ad za?aNvT&*nhR2-&=;%xTt*jYbx;FL?Qj*fgXU!o7jYP^`W=kz{#fh+nANg6m4UNz3e zc>aD2sbH{$vnv~Gvu2yrae9_2_C;}j>XVf6gdPK}nd01^xsjOzmpELx%@2WMX&*NBdR+!gvVR+4lf_P+d39YyoQS-YZUhG`+;d1P z`;%kyYRNlPnVv3|*kZ=|b?zo7t?!zKkO-d>9Gxo6fNI*$$pLZ06U(+B+$iF_BBOv~U;`_YfWaNw-(Z5KAAY=MNuTMrQe zb;~60$L8kQyLMpxOyhUXDVB>=_YPsydJ@jL_!M4Zh?p7_6f-N^N>=;eB6cWyaW%py z+hQM5G;(*OTYIl zECC1xx7ZN-h2#BKwna}Swy9zgirq=*IPn}Tgxd@B2Kv8*9k=gXW-uN8>y>mJ0qtJG zW>8x(FoMj97xsV@i7(tP|E`u7!AE74ZCzSUuI|ayu>vq4){b|6T_GjJso zSku`a07p0EK9-*jHA<;&NtYZME=Nn9f?ok-g`(Ls^eZd0+cTKM_HD}JlpNRh=FPFB z`KWh4XYW?ZF97CTvnW@$zWVv`bK~~Msp|WS+vOhIf>eUV$KBCAinm9qLA!pG-(l;1#h!{)*H?v&-l-pqzMsK|&;U?xB#;)0uRT_{%nkR<1& z$eH1nc%|d&u)V3>mF65!-#)*S0P-`AYig#tTsw9yaSx#r(S0Bbk!{S{D4jZ{RS`iVH|b>Q+~pDD5vxJpMOZCxwOlIW$6=Jc%`tu*>w&Bm z_2s!yBNicl1@X_~A6&NGKg7Obk2fkyg#!x|WV>I3?cQH!!uQW&zVCEdxpEb7TSDMD z@D>=&|LR|4r3V64vOE6*mCqXmUY{D1qJ(^3kLDif0AcMPPQaniTdh2;j%?W${(DnE z-1H(c^?YE!BvTK{odThm4CTurYyIYUQu1&lNA^IlDL%B^H&fc+(LsTqH?+{-YM~|y z-=$LNj!)UNy+~u1Cl97$Hi6S?&1}s5@lN9QxsnfyK=#}hWUuX_9>Gvu-CqV(OWIk1 ze=vX?h|V)ONfWy3kpeeU#Adsts_51IClmye(8(wc^TRFrtGNIY9=kE3>E$O@4VK>s zWWf;+_s{cq91wt96;`m=j-?reSW{Z_Em7H784Z2YJ@UDOGFT-V^3F9l?scrF*+*qA zG7{_iKQM(qJi3o(YMcw5dhe zFT5|Br$mFSv=rV62iadwFfA@_6FJO^pO4u9tb(=KP|ql!!JchyMg)RlraX^R-gFYI zT6sChvGMFqBT_BOs`9-f(4T13Vc5(t*HHlsE@lo&b?(=F1)_ z6#+KeERpEH4|-g3HNyq+XT+28e_G5i%RGCptxAsIU;<4FVf?MZS{oxrqq;m{9cmunSkTNlHl2Bv#_Ghp67XaSMJ(>aBb<@@|o)c4}V?)ws zRZ0p4=+WKN}figxAjpetEWp+=RdtQJ3G>;lXNSs2b zj;*VTX0I3h1#>Yhb20QCe*uE9KjxMj({w+P4^W3=YAX1R=?^p49y%#@oH@02Xk zQsWEHm0>jMUGtB@vUT-yFpk(Ue7(|YXli*`P$84J@wt^nu)1}ltTO0j4)iO4SGoT< z`~CI?l0pKJl$nD4=1um0KilLmLW(*xQ>K}HWg@5fj(j|N(PQRBuB*)(*T0W|)REti zObIIx&J(~OTijct|E*qu0QS-sDb3rc)aJ^OTe-{R*%a)D2eMBKXkQKx&j^9%3a5rD z#Me)8nnl3tq{8ry$@$y(0wpjnjSeb|gHoaZlb4#F(D-q06P4dzm#+fWVYj(A?daqg zVZekYEeV5$HtbLuv`RXRjxMz09Ly6FBpxMqzgLge_5=ygCg0knZzgMg5b=IRpEL+| z-d-06vUFu^`3`GG7yVG|(dS_wd7-KLdj{mku%YOGYe)(#b3pySUnw$(b$))pHdZ)) z^jFXHto`m3SjXq0hWBC`V}v#h%8Es}s{9!i_O(bVF&?T|fGgktsXj=p(KH~{2ZWDG-P_Zca{Atv6Dl2SG0I@+ckL%d0Ioc6ohefe_RZUa%zlFK7VS~3% zGqwjlsgvK5BS2cWegndfog9hOySJ54pKl5Ue8TejKs9;A8^(#?_;AThI+Av-%nFw#O0EL;T9LhUfBkxRP<29( zLV{C(fy1%Jld;lxpAN;yiNT;@l4s<|ntxGe6sTwVY_V;8*3N!T|5iw+Y%&sl?y138 z5CT;&j2b0V!H_hPv=k1PI{(8%Gkt1irmyoz)9VlBAAG00$;qG9T+aIXPnx_*ZXGcp zc~%eQ5yC+QohJH>k$tBvaCGsj%q#NzV|;ofLCH@S&Nkn~Q-6C)=?(S74r!3`aieuq z-OEjut4i!M7Rl&TvQ(-Ky`RbxfaXNjE0-LDQdU_#+8!n`xTr0{|6?t#bTX8-PaDkI zbqq)4NSGXmoMnQkp{VKOV}gFxss^*Pp%(0~V!A+Ty4{_)%B&V)3u@(`6*vv~-LNV7 zuu9BQV!bmqjW%WIv3sT5!}ALJh%Mx)b4?w%mJ<}?rZH^lpn2oms0d~Pt4%6mQ`ZoV zj=2O_Hr8die#aND$z9Q7QajLkiMXZ3(e52z^cFLkqV%3aMf^tXxonw^CprjC%8aK=6GlM?6(8x_5J%|| z6^My1)@ANL(>D9cF_i+6gl4QR9YwztVd|28 zd-w42n80x3y&OWD<8)|`_Z;5s*tnLsH>9i(=2$nCsAM$BPNS-nc7?IPDK`kshfYcB zTmG53%6L07juKc)LF;WjbWt-(kR2ekf{+Uf!0*VDK5HZ5@0 z3?peo_2$z7)b@Sy65si9&$O4mnFdF2S%sDj%MqMgN3>w{BEMCvvOteSFt8wgqwXAA zy!TR>`EEEMX)T>|ZcyqOj}8=xds1AvH38H+qMYxIiD5c7SLYBr@IKK*x!|OiaNhCo9>G9j^uxaR)UD)HTQ~eHa{(=4l%jl_V6hYw~gH zpmoBW$(A>kUZv%bcI_LgB9p$9)6-^kIdfKWt9p>4w5@WRQu!LgvOtJ!8VcS+9)17| z*jV;tCq! zCo49wfEygZ_RpGR0c-LT+v+y`f3L|`9Y=Ss))yq1m}fh?(Y(nbaj_E3dWrGSt9p1a zJ}i)`&-_TyyUM(0_|9!vpDI#6%7r_)FS}kif(KIs`b{;;0q8^eTG zBvV~n+h0Fe8`52dKuLe@7Z<)9?PuWbU7sAry(@tIZ7%4)N11cCYrYQ)I z$kty1w@Zx}$W4$WF+HjUjY8J{UK zYe8;46siLvhxms~=p_OENdmBQUxdMxb zef6zu6(m0B?)ns)gruy5g8u~T{crC*GiGZBCtB<2fzg>y#xnCd@MtZfpJ=GK*E|{2 zBveB1?KOBhaDEE-`J5u8+&kEYx6i~Sh;Uo`ez!zr<*ptw@!Sl8WoPhAThR_WBc%j$ zFyotrkN#XPU0h~!jzPkLTWZ7+Vj+y8thMQkv+3eU;G+U`>HqwwCoai&&kN?c71mcv z%59K1KMd_!_M(`LJ>`u&;+}4mlUdua3ASp=5o361!JpfjKa)W9ZAf?i-6Gb#GeXB$A z?LedyMPW3ED3T`e4Zm#EDjR{SXGu(t%s-@dX*ukgyOSCnetVRCd% zT%%N-(aC&=n`#0B9zX5v|FsOhg(ie7-cgJi6eZyeXCd~y(sf5~7fQu6<-J7Gka%@0i_IJrCKI-m3OQ;G{2_7VGNpk04Y%&)Ed zuzF5$dkK5khI)6BDq&R===rJCu05b5o*FneomXD0j|D6i<>$jZ|BCPduU#6)BumiPLg$pZ=jZz@dU0`znVFd(cDR6vaH0sL3e|?U*3&vMTb6;aJ8H18 za00i1hzbgr#C9^=Xc;LF7(*Iph4^9gUC|;D&5D)?DEo!l{aa_9*jdhB!Z`A z(C07x%Xk_stFL${?Xx#%@*G6$?1MdbgV@`3%Dql#j&{lh z@T0;y??)esU#=^e9T?x6e62aQsZ6)=vxS=xi4S~t3j3kg<%rq-h5MS0COZQ zCp29LoC+n@Ppzovk1=oUOC-33mSr3Wb_x1uh@1szkI8lWIcW;-V8bcV7?xk%-K2$(0UidNVJ zd9dG`ppIqdBM$fLTO=-pr0OU_OnP2p{L>V3OZfb_7K|?f%Z0*-wgn75^cF-B-v&+j ztr-x0q6GMbXbf2&EVKj{VajtCefu*Qm(H@sK`=Lnp?5MghUJ@W0H5Svgocv{Rj7*S zV{Ek`8u~{?qNsdQU7PQ-$Lyz?f$@mxAtoytLVXWdWf=UzG*D04tj$cV=*)F$fVT{D5B33Pv}~nYMqd$8FVV83kYd7}uX`>LJ{ne(0#1f=Pn& z5FZ|f`mLaEj5cam#i)J8%sfkw>>x6msmaq;BO6i``0%HKE4i}eWI*=b)bCgpVv%ED zVmkTyC6twu7>OmDGD|#AEcM&O6-;&FX;^N;_VX8k(CHX7VbIhW=J(#~rx}e0RPVXH zxRq_>E_O-Bb~O;)4Lj9&I>sgUtFSu3*u!1$@7NQ^`empG%Xf?{uy_hqv>)2`XA(`` zFU;SewVd)(TKak=FWwH9YkdrL&CCc&BV48LJ5Cmh7Hm6NCuD3R9zwC8TlkWOc)Im1 z(4kr^gCr>ud$WPLl;#YYYXdsl2orA0VD`5ixqKWGJuJQYg+YwcJ0o4fZaZ?j!+^1? z0Rm(xren{Q9%P4)NiMsms}v7}kb5wvO1kQ+$i3IF0WE;wyLD%~3y9H6Gms7ntxi_I z{{uR8c3k_RX>X*UBKVv&Ew2&%X{7mczELx}1*}|7Z<4}5LIuNNw*hgdA zhS=YtcpFROz|BlwY3@*rJKcmk-H4sWk4eZOAx$4lM{0`PVgECEwd~vJFAY7l#`g9Q zt1gk2cbu4+$1Z#@h^7cTBaDVMN$(^oiQ4d~x4NtE6v@{g3wo&MlR+grK0X){J}8R7 z@_AOTezLxPI-{j;2kd{HzdA}DD?RTjgkeN+gH-;}0z6?cSZWS+IbP|7T;Ot?edyP3 zCC@~wRE)gnwTeFVApZBM46ZP5oOPP3M+bq@{CedE!QOb+r6Qy*CD>a3^A$#z@7peY z;{sC#p%?S0Rjxpb9x`^f2EWA}YS{wA=f}xy0d0>d4oq%_BmbG)68Z^@tZ`~uZQiVP z1uS`pX_%sTD8Wa}J310+vZB0^%zW=?jr*IC)4<@9%BvnEa7b9vkAOwwC)l>K*zl#i z&?PX?)_k-c{q%^gPsHI{!IgBb-;?*QwGX1=nI9-cJW&klP#73B9Y8`Zhc6!%1x0zo z?xM-7Ky1*R#Z%JMwt-Bb3YsO58_VIcBms%etLXV~+XO@}AZk(*4-e1y?rT?<)Tm-N z@XAn&ijsMhzE215>!!Z$) z5-15)Q`P^vnrLWz$K=g))Jk{Wa>+P6S&uqCCxiwj& ztqXs5{i7ocxkFc<$kaM%mD!(V2pmxTE@!%9zq(Xfkhw57#^Ti#o5Z#XIAoxYMUzUj ze<8gLeYkI{|1R15FeCRGYg{xWlaKK=vQ{)u-ny*DbX1w=J4@c*C^w1Cexe7pmQM21 z2gN$Yl^|sj`ngu)-d|k0A$#nU+U8*b2GiW-B5R^nxb%gzAZ{1H84axyJ7s1j16zX}h|+FXZXElWlr1ch{{ zLNx?Z96zPcvdbJcxJkn_QBF;CEL|MwgvP)?+` z2OZmv{)LD6a`eR?#HF{mZzk2G47ewqx^^S)o>WGSi~reZQQCJ=-bTWSD&c#>1FIBWBR3A%}-nmd=Py zf8fS-wipWa_E?i1FOQ3GTUu)uNv394PQ7-dq@y}I+g{j=5d;{Dy4&dQ*=(9?L5`10qd#;>yzD3gvk6Xh9hqWbi+DA6RcVJkFJs2?n;)nbUaq+{T=Q1hfK znM{-DO%cw%8eZ4T2gzRqBB5&-zK#cvS@OR=W}&pNU}o@*`#|c-nMSmHku0O&bkhfd zZrd2M#(#cenQl+zIlAL>h+3 zFRXo}7G{mE)zIt1ooFyUS4$iILY{&+5si1E)IW!V^3NAY6flC;`x&bqjnON&GBTf3 zVsRI(HI&YQD3YCh7z~}(Isqg`ki+kBs&WTQ`I*uGT*`N|Q5Hf%tO{0z8D+ud;yYK& zuB@=GB)>sse*ee^L~v=nfUlk;xSN5)o`A!zvEEVeNMt+0~IWB^yTLrAbp_ zh~pSxr?h%)ei4z zEc?nO&53I8zdoPeo~)_IlTFxP{YeL$?<5``H25N};zNR-`dmRYowvnfaku~lx zb&TCGhb5Z{wvE3L1C0*p{!ZCVInskx+B^Oy8=WFTC;ZA&h`R9tXOUWp`BP|=>%`KS z&^F$OTf?CTk^z^`mzE^0&Y)p~n%sjcp4Sca-SGLGjy|LQ3l3oEf=<2CO8yrtWPz6! z-3iv_s@n3;ZIUYyC&y>SkS~B^B(%#aD<4kFOS39pqK6=!4r+%$kGu>*-}*qBsiv`U zG`O!~70Ae%1wh8Gcr3W!36)+gOTyTg6ml1c>HUsAp?E;c2C|z-5m7P^IskNRlNy%6 zQGdZTE9*O)5i~t6mFw4#50(5*{jaihe4)iO^wRzbML|r1x;VV`5LEuNKvf1dgyz?X zLY@iz3h`K`>5`dXkQ{h*tjj(5#uv?cMK#l#BQEyt$JzOq0kQy&h(7$U*7{d^G@a=1fv;NVUPX)`O*Mf zVF7IOkYIU`PO+ItY24-~I6gkk0i3?z#*vl4hs(fY;19+{#3YxoE3G#*7Rcf1Pw|Ph z2yfpOd{9X2y{Jj;{cb|h(vC8PF^h?qrDUAyM?30^fMuVk{%Jql*sH$gmM|M@z6O4} zKIQ-wrlQ?MkdYWsPm_mPq0BGEbuJZ&p*=1{vX9kgu@R{z4}%H37};2mv> z-4{$h*L(UOFm%YZ4oHTw5Isn!FzAqw$2rg}MrwGiA}k21Lq0&zgzD?og8Y0xoUr|u z%homEPJp2-LG7P3f;r=1iluS@H`9S~;3KL}RYjA_l+@I8ncHpF9DeJn2isa39Jaux z`IM`eu`Et7yCasYqc29nv(6%ONX6{J!3tJwl74)JxnK_*ZtRAJ{=Yu)=E|~hAAjr- zNt2fkupGGgB#w#q8M-ukes9W>R+=atK8d4!70SMMORa^~VQR>|qn(V#~`H}D1+(<5nXY4NBgtTL*m z723TBZ&!rxuue4hRdnJ|LQ4rm&tiqTVV5bOCi3?7{?_`6&tjFP^p-(Tj=7k=AdXB3 z4j?2h7v)kPU#e3IlQgd3Tn~E68u?jG%tDaE^5{0Zr2D!7E4qck$C=B93X|=JX{{-2wCBJ|)bJi9`=&ESNhKL?tdE!_j#*f2@9+M7hE0du+Lro}Bnc`K zSi&*wsu7NBjObG~i&%*+vh;FdelPyLz~F*_(lfs@AKj`Wo!qHa+aL`I@` z>R%_+u3Uy|?7!3#2lXTaQcwJTRGn+S#t^7R`NXOhamawR&c|wBHa+E*kXADgL3L$gCr*i<@DWDaOLGp=B-P47aXcBy>r86>x- z1VypS3{h=xteTv3KO)|sBEp=XW5~!iQ1VS~Yi-_Ldy$IHqJyY{kSnkC!@ZMHL`W3O z3S3@pr&s&HlU)3EcBG84qXU4@Z~}zJ<`Yx~(|v&7qSrFv3EzQ?lT$?-g(6=P?4n4e zG10_JzES@qR<4(wSE$LN#b4j^J3wtMbh14U>WvC^`i&MioX#h~A)=D0lNl`Y*Bi0} zZ;1Wne=!80RIFokm3B+`F=1uWU`R=X@SwqaR5demKCCpmT5U@-aw@;fYTM#+*bm#8nKw&V$@x~;A zhGK>*4rx>Jd*@>(Xl5Pk_VD4hL@c=Pyf*#~eY~(emj$kGq#&IxOq4VAY8NzR9wyeD ztV+eZ*18*IZ^0@bUYETzt|n!6c&A2a1s$oyD(^2RRZ8Y#_snWo2vwwr#w*H3|1v_= zcxc-go##KHl&xJibIID$mnEs;NpRq?$7O{bIP?p-oNqN_;_%JtA#o zT2Wm}=>3lQeI_qT_4C^|8xg9!9ov4n4)h#HuW|>2M%NTZm4{6k^saZ9DcLb|N#s^m zg0e`>&TO8MzDLWbB96<2-u3pu94%V^eYA9HtSi&{@sPb$gSs)n^iYD1V5z>F zFne~Q#ervvlA>f5VR7~OKV1p9RDe{(Ym|2y1ZW(;5x;{rG&F?V;pKC&_YTs9G=lVt z=dUqSQc_mJpO|!jJCxq-&o!*p46^;?QH(9-F;6Is$Nxiz50$AJv2T^vnXwz3@L57i zJa<>a>gkAFZX3-~zlj4o>OTI;sP)|55Rut$p`~xwR$XWCf1-&7A~Js`h8C*R^ypKu z)#Wz3`mIL|I+&slm=W+=(=9BeBc4hiCbtsfzG0?El4j&onyIN_Pg*n6{tS~LhPTT* z{Pge%h2F3!F-hAf|Nu$cJwHHC!0=u1`IyWj3Ntf~jzB<{vi zHaovRpePJm2IV&fIRA#uO+RDyYa1zk{|R7)M0wxa;jn$H;NdLQj_V)6wV6;iS}oed z9A{3HO7}KT<_2MWkuhvP4!7Omcx{pe1&F?V2VK#Gkj4f7HtvazRQ>^^TMK^d)~s(z ziTEZhA>CTMHwWgEU_cV^C$NQ%3hYy_;rkK!g;ZVeXq=Ht(Bu7oguP`z)?3&0OLv!a zNP|d+G}5S)lypm}bhm^cB^?469ZE`fqlA=nH%NEGSr>bI-@fm2o^!tJ&+f(lT5HZR ze`Cx|`3=l$gLS<&HSA!%S3yKRPwbvvKr9be_Rl{Q&~|9MCfYnKS(F0vfAG_x1V5eL zzkfQvFf8A1t~C1|mJmuq71ktbb^EAXdS1x`dgD+qQx2N^-^Qq1LqxHa8Hqc6NRSL& zlEmGFO%ePJLEV?vU8h__`hu8dx&17xes@=5h8xO;V~-#nE~&9mau}f5B7P5@Y=Hko zQ4Jn_H0}fQKHMCLab#`RuPaCzSZMzQGMspaEZp%xH zzH@%x36!0iKt&Ai<4^Vqwle~plg`_0S65(~3JNb@^&hYaHT8d&AMrGCIfAD|%1%Juv5G<(3Vrc+dGK-R*mLhmM1-NN|ys4H&~8C2U1Z2y{=AaXlP*Z85KL; zc^{GK0$0QXx2lQ?Ly%Vj6~I(9G=iWU`o((sI^HfE>rW;F!o=uRy`+$8R8WlA;tn1m z(5S-+HQ~uMJug5YnjW=p9=C>jbCZ)zNAyJlcKs)8SsB=v!bCqvyZPzn29O$?Y1G-` zvc359Di^{&N2{1@Y#Q5t>qRD(Bx%~nv7TQ&&0;U8#D@*-%rK*=*(Bc|^FDpVO^{{v zPx%35O%7uJp5`T)enh|W%VLeS-!F*qi#-r`v>AN=t6BoyW_U_}-`A(ig$9!>%+DkEn^dECp1_x~&V4A=6!I z)V|+=uVe_^2@}meV$nRNA3!m#S1fa0$gF6zKnOvy+&cjJ#PxWcM%c}+=Dsj9Iqo(H>rmyC+DevB1wb#luf?P;>Wv* zHQ#45qkrF^y`{CV0=G(#GYsmC$eK(fg{b%pKfx`wWRg(a%6}^H|2fygD3|_6ynQ2b zAW0^klMeSo6NVF&2D|4JjU?5K;-q3S5M9CTah-J( zIIRDq0VB!4z`#U7Cl-t5M?m7k7T$+}3dj%cE-&4We~3)}1;~j-$w8zK#NoA2pZ?vGp4;1hIhlU&%IrS> zyNWfIOL*Y&J7+V3)UN*|hMG|F<`5*|b5g)7gIxt9+YN4(s^irpL$0 zeL`Q*k4Ghpk}u1{qsm6*cJMBDy@%B=$! zQ*|x0z6Wz_tT0NE%ZJrZ9M-6xJRyO`>Z!l72k(a*wt+h0yKhK+9n*$=v~6zp9EQ9DFORDMwLBNwm z7pSaT%n~p=PsW8ftYUYnxSYI9djE4Owa`kN3o zqBh;3@N1-r->#L2>_tsIluEtDQQ>7Iu(g|A+~!4>tK)gdWk$xwv)p)gy0jR~-U|LA z0$!vWvt)@Ju(lS>-a_3TP}WEQ7oOB?D06s^Bmvz6N{ipf~pX(KZ|C z2&V_^gV+=y0#rI*0`E+yn+l@t|QcW+?SH$bMrO@`}k8FiK$$tv~Am zN=e{Nn*rDKv%#(xmEu2$AS?JSlkOECdlXerUEy~@D~LMP>%W^Z1?mlIUP9aXul5VR z_U=&%j?&VvARp)?Wwbp{+No}F_L}cRp)0|&48&F=SX}(~e-*sk80mHZHqy?Ic3`CQ zRj2xAw|1o1tw8)^z28S?V5~`Aa56{tYD5?lj5XUL#ciGuBJnoK%AzbvVJJ}0Die7z zYiG9cb33m+hg(`s`Sf{afh&KcU_$+nY^m+tL14bhix-$6WUK?V4d()JyNgVFNlNm@ zOu=(y{}X8U-dHkAPFVBc zJO<+r$Y9Itq<&Ba?{nKyzAwcZyCm03=nI!yeq|<@DamYzvZ|g=^Im6*&^{8lF*s}? z>y3B{Au6I0`AsusVzU{=ez$BuJ9~Mrot1Y5A+3}c_#7Y@sSP#jqPE3XB#GNZ-(s}Ak=6&)iN|}m^DX=jK;=bgi5+-yRv*WKOpm_Xg#*>iZ;)zH&zIhb`?BLt&Av` z+93@Y^jLfo2Du%w7-9hEn#qml%vM$J)_~!ahVe3swd0NwR@J3Jr_<^hgwqQrjV1~G zROxR(2mK!MmH{qAB0o+%2}*U&WT_yvD$OY8+{o&}NanNd8Y&jHsRI5eo?rWsH52+0 zQ_uX@wBN{(*`#~I5fH)cDnu=J!;kB;`r+Zdput;WWnoqL(F!!VEC{5<>CSLE*jq72 z+UI(iY8iwoIp5@GWWZWlTAug6^L`IzQTf_oplp%S_EIN&OUw(d;4V|jzV;H25n1E7 zc}VSsq-SX}a(RgkB$heX%1~v<=vZc7J*R@e_3F*SFXq+PCS6Q+=&7U)$HOw$yDn~8 zH5}ut5^_6C@^ZmTk>nwt?X$|8#Xy;+6H9!esh9zl!3w-Uw7n4~fKn_M*QR@OjWr-( zl=lfgvTibm(}dh#4G=v>>WiN7jgxi1L<9(6#W-K;l6<7oY8!kA4lw@y0Pn@5|M`UR zOtnp7#CpMgWZ3FA)u3t$H%`+bcQK2oH^Pe(^rb1Oy<2fA^2 zkQU}+M~?%&wdjk-_6>NQ&$5alwPz zHeKt%$((ClIYvH_%&Sr^y9i^&IoN72mw6$8yCBZMVPS%?cOWY>4!lFiNLlU*Z#mvv zJekAD4&UAbsALZxYFiwurZF&IKiFBZ6^K%hzPSHP)m*)SHgm09E5os1Xt}OKQ*KeZnE>hH7t_m6Hc3Gfke)zYw z`X3~42}~8FKMnmVw!?7tRgTK@hf#cl8=OQRBFZ{G*swnoHcD)f#} z6<$kY>mmN~U?9z^qh@EvuC1*#N~Lxb^cy$O6eUgOgijPuVP>8>UBnMKz2cX-XEP^$ z{R$wi>sRd#RtN)R%m^eJ<#K8iac))gHVz4Nh(qo&m*-RGx zMGX97JNQGfCctU>)*!qbqlqhG(MMLJfJ3^20mE5QyAZm>Hsyz2;fZMft+!3)=VUrG z-3Nx!g(LF%AYb>0!7bNBDizODr3vG~KMs492D{N5p(y^F4zljrg8O4~d5eAEQh#t|FD!Qern?V7{^j2F|2;&^NVYZ*qI)Y+M`N7MU3{o9BCG#2%+1vYKq z?Fa!0m<5gLyf>b}@t0pvVE04FVGSeAbqRHQx*EIQWlv@xttsa!zhVRW$T)9n{Td%P z0dXwnqi=VA|6u_}(r;G^H${O9zS%@o=yKT`#YRRZ=!^69=O>F^4O%g{Pc5X_$FHwF zO<%tbJ{f;N0~wkLB(ahqEX`QNNU_FsGN#Wgj2u*Nv^}jS*~l&839E5lljHcD@x)3? z5FBm$J4CTicvV$Zu)Tayy;%2o%%BGuu0fzE*^Y=C{4*ieSK2{G?A_%YV-A!yC44;A zp}ql*N^iQOBmHtofm9n!7rOvNX2SsLyoIXC@1JV5nnlN)f~jV;58J8WMBEXW`&QN* z;iy@kc`0-6;o!}-sE#w#03I5#``Oyqwf9LS7U*x=gdau)f6467r_M!>N-Th}cneb) z2`4Yv_}edd>yn8Lan76UdmnOJEN zMA8e?!C-kHb4D{rSjc#q1*i*1SRkmInDqcAscdRmNpKon{KO6n%SUkyTOLBbh*A}h zmXS{A%P8||n9Ix4rg>kYcXWmawlCVo;iQV{F*7TKJWZmilLS`R6Ov@NV6Z7WzK*Z8 za^ajsK%c96?d(g56DU3K*Km!53zcB<#1J-`QN4U=T%24bY-@_Jd%{&m-&b10*0}&v zMa`b5xOHfI|8hpKz1=>9Q6ljZtng7-?dlJ+^J>}ClYcs4N5NEA5bz8bxDtQGTV8(t zdWH9MASt@|Wgsv+=R9`Kd1(n&sked@m3;ZR67LgMs9$!X-lb&z6p&c>T@cb&c1yJR zs8bM5KuAU#VSK@&yPHvCn`SL`>0P(q`ME|1ZnFl7Qk8MB+3WSclbMw zmFiJd=J|1x`J&G=NoAVES>YAD6l{1e_!+DTg0mij@i=8dLBc|K+eET4rGE9$?kG`2 z=mB7M)RZ?ykQ2G2Z?Us0tP2{UUs)Z3kxqpg)-lLd{Rq}Jz$5E2p673`gW|XhL|lPg zjMDY=Qx(~!l&RDWTgCPJAe2Kl21BsZ_4e8g2=5XvJ>~|70}9$@{%VpijkLXtA@_sNeecJxv3?zK#^sBNPY9lN<%R-l6Eyb4>^BCOr@j4mNMgOmhG$?&MSmPm zt`zw5XJHyRRQ0-`_8Q#R>^=76*Z9gFGV&P1T}o4G)Q=~L*1`llCfiuj9f9^I=k8h*ZOSe;_g%-`SaNy(mF7XETRksWdV=&blhLiC{F4*3#f6?p|k( zppRL(kMg2i#N!9l8^OgUQDZ&+7yw5;&h%TL>d|fGZOwTZ2x4-JSltriC%q&o}w;2%M?&|L>U^ zu`3{Tohd6w4N1n4Ki)Hn~zP~0JWLBf(MP^U|j5E?O-&=XdN-lSa=Vf)NNC zg3@%*q=$5`Qxa`$ZC!eq&0o}U#Iuba{N5lR)(C`E0v~!xX=uZX=wMLFNCE`@&op-| zkmk*E3J-L-6pUkHR#D~@`N6=9e#bG7x<2Kw{C@{eLc4GB&O?`(X*K;h%K^w>!V`i~ zVDzS>?pwNuZ*L8YsIQe|qru6wLFjEmAFa62*;hda8;T)@f_9ao8wRM`8e|BF0 zUMX2<&0UMR{c^$EM3FL=eV=(F2rLEa?B{YBN(hQhIQ9ANqB==x5 zDVFfReL^q_;u{{#F91wS`M=G<>HKuW0b%z`nXd>YW&qsjvLcupZXecnqE|33HBQK5 zFdq2g*EBvkmuO_ko}#@vNCO>`%si3y1KAkXC5V@2)#E`?v-=L7Igy?J#}CWqc8`o6 z>6w@c-uwO{gA>PHbkn|(oJ=Xm$zsz$^$zoO6+c+*h&zQR7A*U)C<1Z=0Lp=^?=;9r+Pc+<|EH0RmJSZXPq|Q{n)U(8(YF-sDY< zJ76L%oO7nYp`QlG-3EQR~QdSZyT`JOVvd$^i6I_1{CgL?AF}=qOF0~+}ywn@YF-wRN|RjI^>isLVCd* z=zu_veQ0MYU3}~PTkhT-)iZ%YnR`!+h&H)M;S8teqCZ}}GC8+h=A8h;uY(DL?NunI zx{KPDolU3tbicTM*FFw^^zgHQ9UN40tgsxZ;Nj1~1S6BgKOX>!CB^W#T=zT@3pNuz zBwC~KHLQxaGiFB~Q)56Bu|i2)Exu`xal^lz&i3?lG4vyFFF{yd1t4OVHDMENKwM+Q z-AiUh1*P$4e)=Plb&@jX*1#=lid4kKUzZ-tH`WynZ-M@hhQ=1TDyb=G?H|A3g}o`1 z-=6CPH$l`JSLGiU@AQ=!ltLsfZNo&V9mdbpxEs3Ck(bJh5lbyT)kUrL`URqoPKQ)L zM#5r0%#=%C#23F-GMp2p7SWR`ylbj@MRoaQS2J^47-$Z&_yN1onGBOaf(Pt^>|aoi zfJM+xhJ}{&*xraN6W=C&xY-h%^bg_m2>pXypxSZzr`owU+Wo)%wf&2B)Lj&7xf!ay z7*p3BUG&L{PdP%q!3t5}J%ZPneg@~A@!XGZu;~)bR>1cYEg|Z$iKqkt)lf(S^S}14?A0MPcr_~ZXy4uSV_9*q*%mhGXNbfZPI)@DjRlOp4~2k} zLK3IC==UG6OH02rye-5MoV@~aBW&3x-M}qS$B2@WlA@xgw*%_PDWz~M7FvZAT{Zh( z5-N4s*x>IS^p_Sujwi{&>VE40xnmQ5N_8MVq5D)0<4y6mxslgF#!@#2StaX#IT~a8 z#TqFAyHVm+vpT`swB)L=7iZWY>}^0Ypf!MNW66GrH{;a3Knc0BfXs)xKm4Q}&$dI) zI~2hvdxlt~hfYAqe0DVBLN!?M(iW|(-+wu0EP0ug_vw^3K#$oOPu0QeDgu37<-4;A zNCm111@1`1sdf$Qsc^>i`oGrQ2;*RbdWYcIAhOI3755&s=Q@QUcwBL z{wg|>iHDmH`zzC~5cTewu|8}<=AzDj+0aVhOHNyu^h+gW5TBi1=RcYN9>_QBXnW(> zuBWen<)o}^rcoOHk(c@6C*yJG+t8@#e{gv2WhQJQB3l~QxDfym;@k*|62|+U$au@^ zDv3C#2CBvNkJW2*I57wvP9ykUa^*H4T!JSy>!lfeskg}fYC@0a#@1!QOF!#kSYu=V z6x!)W0{T`(PnuL|vv<~kF~r{Z{#Vlu{nhXYld@MZAXUTvlrf7w&JgtyH(x@&qBwxu z1YaD*6;!^!tHb6l)-9M9mC|7y9fMQMJN$$%a&pp>UR>14|7)z_`#{bss)q_26Pi$e zD)i<68Fdh)bWzvzx3^gPGq&xR0#3gPs@}~PXB8Y1cETnIDE)PCg&54ZuExBBT38r$ z__oB3q6WHzy>$6p6*lIlB#GeOEM#luwKmpkb-OA#JI4A6PKz_#%VYX~env(mQzJzo zt&NnU1vUh;G%iW>*XnxCL9WNnIjl15ejJfzED+opeu+e^p8 z3rppLVKarG%nTM1hr^lw1W)AC6r$-zJa7Hnp<`5TFft6EZQA1db8rZ5A-CeQ8nzvCL7SV1(|SFxntvwT6y28D-QL)E)` zcc{V{f|0#F*KWg+;`QxWGq%NbFr_;RSOZM@GhK{*2M#b}GdzEF3__-IWE$PKSUj=J zXP8*$SU}f4hkzC2;~6y);0u%FZ=U?-!0Bl5b^J$bRrJZDJsK!-`F~uv2Uk6=UG5Qv z=pLzaFrR0$w{0BjG2~JJoUXoc7m(r2trBO7?onVx z^A5f)VSP0r?n1@v{y{#)eA~41EYZN>1+C~gHB>$N5FU=HNL+nN1I5EX`a^}MYw!Qu z(W}B6CO2Mp=se@_dPp!}T>AKZ|3E;c@lad)hP9#v3r`o2D&yIDWQRmN;O4I=2Xj77 zp^cxdYrAd;WzGznLM`{uL2f_e~XL zG^q&L5Xq@>)8zsV@(b+{Dk?bO`hI}OO<=OIHePA{*t}19{&SYE`=w(UC-}a~hW_8a zuj~rV7r4GmO1h(J@B}_6*@|$27y1$z=#i&CT2Om^-&9{PU^n6Vs&)N-jH9d z#+#Z!i%Q4N&Vkj`#l5D?Y94`=4B}aGXo2VbRcEG=Haco2^aPvI0onks zFUI~3gHfl~)1#NWk5Vd!ir>j?J+7Lmda=LRMdr8IKB`e^CsrLDY^NRg_|>1Q$pGxP z(W-M~zMr@I+^+j9*a|!zes_B}@I&17gl#9>PXe&yGVTp~1a;X+;7=q-_&^+WNX)8hmQd>@U6fW3YBr>;c z3{}a#A+sj+xM32*G}HItusH=IZp3^P7kGyc@PHfL;b&r){w!bf&E zNBrp)zm|S}c)j|gs^q76zPmFj%%n%gTxlun%b!61n z{fqS?#!}wIxMgO{C_3x5J=Px>nROY18wx8r_F~#6b_>VuzPHb?>5=LqRd=H@>{ZOg zfbZ01DL2yPIRDV;CW*UeP)&h{5t*1r&W6PikCU~x8NJJ!nFQDKWMJ3Z*-uMWH&9qa&Pq1iWe&JZFfNdHMEw(7|9n?v9=E zXHbumzb5{=mVujM+5hL(qw9^0kFVRM@dWVI(6Bi&yP)7yCG1HXIy;1Mww(C@jBIM` z{>mWX=i`Aa+%y|rp3KYI*jT@UTmn1TluznWa*X)%=vV`ukP(y@a3$@7HI+M^7@fpb ztJUT&9<2>%uH3)+a3#8^eW|Q`lqW<05PZGB+WP$*Ot5=cB{tsOLYrieYaDFS9YMp* z{W2z$T*;WDZYSi$p0nqOgv*bdqA-uUm2YMKN-OZ+%6Hi!3+t%<8g8{Cr7mB;gv zSr}|gfFFc6r9?V}m>NFc3T!!kcF8{g&(<&AgRr{H8H|{)fw(DVUW{F+D;|fl5xY=h zC!zQ&d(HfiL!Lgv=>8~4qNyG6#XL^GZm}L69@^6}GADSk@owf6cww6UlC@u#sz z<9b^tJyPbgv=AYTk#_L1Olsb2%+sTp+b+i1CSBGDsPb8RmM}G#pK>+w3jUbW-%LcB!tI)H=;p*lb0C zLxvArsf$*zY9rgDO9(wKmGRgV1^JRbF3#UnAG7fNU?Ln{9q!iK%7ax8_N#Kis!}5T z$#Q&Wmw1U%SIN<@U)QfiDG?ahllnfEAbSOvEHC@Rm2iG{tG-ap?$opretPo+xItFV zZ+f2px(*rtz)xdD8H@5&5JB1Ptd6@S2b;-EYSWSl*|?s?F6#xQ5hdx#qkAb{zzGeI zdEUpgTfHHdDRr-ed5pg`B;EhiCGi8|b(9PNt_)n0J1qaXF&WD=>j2d-D+0qQqKLKX^$1TD16FZ+xlmPw`tahA2@P_7H5ivq$~Q_>bZRfcGm= z*p2IP;@44dvR5?PbqmAng0pqLdV-%wEWw*Nqy3! zSCf6V!1m-DT7sijPG}*pH??ht)u{A@m#KHe7Is4TLB1IB^8t9lvy;BBxhPEE5tm;2 zF@NzDux5AUoY60zkg}z$Sg)~u5cL^j5Lx_q@J85?U#UdjzwO2`FLCLxH?F_#l)i5h zVbQu|b-Ap&{9y96CvpapS13A|tcd6IReIad37QL>t^*AC%i*35NUj)n1J*dSB;;9k zty^B@a?E_8Jd_-JQTTT+MSqoV;&Wk#U*2z@S151{wah1N3+IPx54I*SwCB!pOZ*zK zZwvBzW}BfrA3ZSOlhKL z2>kNn8R&$tvw|JijkT?G>-cFY*C`Spk1p{lq&lSturcKK%y-nMb^(1HT2RRNhYNHj zAQB^+$;pQ7M&%g*bkDsQoHsE6yLMCYIcUz?9BxE5*7ig{c%4SKliP&2`1B=)|Fxpb?(8x80|SWjvkEW!eyJ4 zg&#Vcr=jin_5C(zqW3#$3R8U@=|m|Fnvjc3t>VGZ=wb|Gwc%0+ksd38V>aHKIgvvY zWwjMcURPV%G*^Em^{q+*Q(*}UQ_q|S)u;A=u21+1=z3x^gT@su{CClPl2NjHsQdj6 zp*RXir{sCDNiL4V)<3jay7Nzlejx~-kt^#Ls|o)z(0$^_d}Km^o#eD@@%H|c0)abP zT3R1IeGT`c#x4>V~L7NYObi zgW-q9fY)Y4FqiS?F-kCXCWCqz$vs}?uXT>hyg)fQt~>GpTNGu#KA>{L=7~GF_+&^z zKqpdu--+CIfxcHcSU8!?_mJJM3k?jLl)6W#n9rUtVpfjc_*+@O_kO!_3HhP|#L~5X z_~DUz`s)_XFoCN*0o$7fko(mWZk{1sJe}%CaN`i8+l&v{5R7=w>!lc{x)wc~tzr<~Es1(rn+Dyt5R8E2K zk+JJ?1>KJ=K+wLAxP}Ii`|*a~@v&oH3O}}x^L7hBOV%$JdT#~?mU+z0f%VCQo|rvy zUbBmP%mKm3qqbLiDErdXBUi%>WrK@jo6qOilq&R*kw+j`{)$)r%$V41#`9>tetUc0 zzUOWX{d^6uwR?@q3F6Zn42NC#QKhvNmb2f=2^{Lr-TeawgcW01%(G~m1k<0~jnRL!B1N>exZ zv<9Uq$A8M$>=;3g9U#9;^He;Qa>AJ65?#)jrzQVm|A383T-@B6bNC4L0#81a&+op3 zB${_)0mYl%1AFTa3jhdl!vo_S(>e+&5!VToJ#mNle-)~zCXQz4ZY*G7nH$^k1t)m) zpSs1lB@r$HpA{BOVWVTAW$*kA==GY6wZ&ebdQQzfnGm%U_%e8>soa&KSBL9L5tXNdYZYlV$gS@BnBmb3b|5XrhDjM@WEdX+89C>KT zEmDyYBbZaE8@uu#a|3k%?v=!Jum6)`ZNwQLG26rJ*ZbZ#3zq_~f#8KYItrV@2V3s~ ze>R8S(f#oUcUCopjX4r>V;6L=ao-UCCF-VhJB?>QTO$lr-Yat)esKop#uGQ;WChRAbXkHrk@peGehwjVmF4n8x2e#87 zMLqvCaHEk){JGHvv6qP$ZFlEelHh!A`MpMCFLplCOHZHe8xfluJRxaD3oq(?+jVV5 z{NC${D=Tof5fH!__`FyZNai$barZo{=f<%fW^~Pj)z~L>nQ8x@Cl%ZHa}P$bX^W(3 zi-X#UD~d@)L{?-`j)|4Y;}wUG0@kp3ypYRw8r;r<;cxb47V=M7ilklkJdbge^@_eH za|ie6=s--PBzxX|qaH150QK8tqAyfe`ICkvJ}LP{c%zVfh&bJ^p+R`%=g+6xL*u?H zyo0cA|;`I2_iQNhc)JC-EuWD!1g#ozhi^7K%{EznFt6tNWi~288TIu|w zA=EmobATlEzBCasD6yYU7vId-bE6}ZpG-Cr3BI(J|NK^Wi23zl6u-h1MzDxMU~>0P zd};UByS+(*R8k$6HEEEM+&Rn*#uUpkpFYt8eLu__reSUyE&SvZu@1IsQ&}7T((G)6 z7={=2otjD_Cu%L{3PP3++90F=>$QmN;#pi8Pk6#;MxzCOel5`l%NxhqGPLuxNO3SF zh?N)jUw^Bz{JMu02R7;E;VHm1%>^MVXwZN?|AJ)Gum6jX%2``HFh^lWO;LW$Z_( z;-)gt|NBpUm5yWOx7*QfsqpU z=n`d2K*Ln~uAo-1cUufQD$$0sqGT|GTOexfwa8!|TY}BVoByYjU zGL}iyx_n14J!KcH+*{YyrqbJ-w_+O~9F`S5<`q$gg9HPtui0+d{~1RRhE84t*YtBn z!WV?Jb$&T#z-vF8lJ9glq3JaVq7xW!yW1x*)F@$knv`#!QAG^lkC1GLqJ@j((Y)KK z`#A23;K9Kt_ymfIzrB=qI%TiODD@8l!KJ<36#iNnkB8Q*cmj_l(bF-NS`2I_UB$o-_W2{e2StV?6x z58{B;3!8|Ad48D%GL4ecVUeXswJ0-z`c#lvE=0nG7qQS+N*(WUquLw9sjc<8B5aQW z3frnbcd6=O52X>2QS2)ZuUBA*Nm;u`3DK<~I zkIkeQkqW|?Qt52hn@;zT^Xq;R#cGuH(dr$g+J>%EV;ER7^Ez!1kpHlrYn1ENd9GDnm0m0dRFWsPw!ETnH;#{ze z<07sR@ZS7_0dr+}dGWW!Q=#9^2Ap0|oysimdfZRes^oF*F-cWzfJs6XF>gTon&9kE zU%KTgriKn>$u5J`tj6;ZfL)uk`Xd5vaLCaI7s$2xkN#<<13s9^31I*$P2Q28z8ct< zIE;YXtK7W`d|F0alGu_87~Yo!s(H;-L^YcXV9{{|iOzkBgaPj&jUP0cb?D!KpXaBS zXUXdvPJ?a&ARmMF9SmlU_>#Dx1`Vi2kFz9xhxz5bt~p zsioWyftO1uWKyJ;E_mUKy&dSLY!(W9sV<&RzO{_m<&j3V2geO>9v|SRQa0>~4j`*& zUk|-~^UHPO1=Y|+&pq?PBcTN3VCTL$G;adr?Ck8CUG-C!gmSwt(t7r?2XXH2 z9CY@P;%ggDh+mu-+RN?5p2ahV4j(-B>vydiX#y;c&A0o>A`@ z6gO)=4Er((N)>*(wD&Zl(_1$CR&vP&e5KFZf{@k6GV61Dn-G3K6IK}J6)uR0{f$cs zgdd*Bd!uqoD!F5%b$bt?pX(s98o|~e@=x#|N~Br+HO5MaU!7MnN(uH=exYUV{SAQu z!XGGnp=v8r*}9{ko(mq|;7{s>I&3IO&<1eA51ZO=`Oi!k6a;{ui5Oe#ngg1+nNAc- zeLZ*96f8^Sb-XlSG4msaF{`GAxY6V6bW_soIoJyIkLd(t>E(8|g(t$`dd8ku2DoqGcOidQNgO^`=^}meGRr{ z4f!@bL;o_GjTu z74G}sJSF=mzTSLNaU&XK&Af{GYkR2wQzuc+&JsB#uz{LwgQ?EXtRwbG6PJJC1=pme zR}%DPG-_?1MA-Jye!?cFi+3; z55@cAFbed(G|Z09q`L@i4=KH|;K>+1Tj4)5{zwX;H5ORFH-(bDYZ!7`irl@SjXEBb z(EtksIbC*jffeH!O-h7f4kig#N1TPtU4W`_tP)O;O{gzLk-$MlGtrnr7;(@~q%c z8v8Lj2#dho$@z9hK+{t?4pT85?2;@=woItvZBkHD>IOS69}yT>mdSFw0ahstwkK0i zww65h`RBlIB>5AVvC4XDBRwsSpTA6_P~QmhRCQc3pcG)z;~g=&F(fxi=bP4tkOrS9 zJ0GxL=9wLtn@NT>MdcZbt10&0*i0jN?)x3yZLE*$qnnxsobJq_(m~9!>0dwAC z2CG!zQ+0z=06~WAxGIMX7SbvZewh0v{G%Cv4<>w7{4h>ISkC1|@cu-EEQ%n~NR9}0 zXyC?LIr;+aTyaR4oSxSv3~2B1PLeLhuhh8eGFc*Tl1f zY?D2ZDXW(w>#{RN7+tN*6{(0bEZ+g*8rDU*{u`MWe>}DhcEGiQjXHWMmfDnnC4E}3 z%y-RY6qJmrT=4Zh`#%CWy4) z+(lD&v9UE@z4*Q$87@p2b5$-(J2=KXZed@b);7D@f`oROTry)F+vd6&ogHZ0Xpx;U;+ng}BuJTblIpSqGeU=Lay|SbkOe zMe5EUHK>gli5ILgWc9o7c7{(_jdv)|PmB^Yj?>lf{PWM%qmD_sAFH~0x#}qVJKlSG z>7KevmQ6<^a*G$BMsy68iL(MilINmR5?dsI4CE#xB_#z^05{HD@Ei>% z1|>TTBwHeOxEgpZn3PogXnp)1rs=(MA)=A&T_#?pnnJATY3-4s()pZdYyw(EL`+#$ zzoVLgiwZP98Klzv=@_&1XtdykJot% zHP0!ls`~%>rKao9&s+R5gjOcZ)+z7hM>YN?2xK8sK!JK#W^#A7ULwWnpXfd?XRU}v zn^F9?A2;ePEkvt)zA`o3h{W0qb#XL6iizTy#ayJ9D7hGgc|UD`H(Jlc{w{QD=1nFIx@_@zxG z9-)U{b_OgftLx;K1B_DdWYy5n==a>{z8x5le`4wCjcr1IDvnge_zVG@Z2xsT5~NN$ z!*i<$>}Yg;_*hg^X!5zP&N4kT1>NMoR z7nblku$iPJE}K?aSIvt+pc)YpPUD^*wy}SQEFfr^T#?YIZRPtX&W^3~-#9yvN6hnM zUFH(6^rH`j5E2Nr`~0@?l#3qm`;U-@6^J_Lho&!zk1e4Q$Jo&0np(Xn96%dn2uyNy zi1wFtfLFf2RKDfizbiYVH&i7Yzipo6H#bT$3N}KPekH{xE#6|Lni~NZpuZLJ!A~<@V}ADQ{O!}GmDib78jQmmvRm;q8Rg=JWKLX9On@cnH4#6)|~a& zniD?nhzdif*YM_av1Yf9S{2)~$xSnicJqYoUP;FrFuUNW77l>N|ElE{I(q`)L&nh1)1!X=GLYky{*nV= z0y@=ir9nAjq8dtp&AA971kd_uo1bpcyTVCc{-S^A_?6hA7@xWPvJc)}u__S74Nh|F zMNuy9yDgLT=1&3VFyDS4e^S$jMyCIpOuRuhLA*AbE4lP_S<6qs0}~EeyF3LpiK+oh=$% z=z4Db&zam5*9A>A%5|_&`53W3AubL|-L!(T#Zw3Hw z@zJ@XKdxB_SmwTjg$yCtcgXa_!>^|J#$UD^tJcH2J%DvH@jHggveY^Cklin};T-}# zL1sW?FDTgvI5OGZoV?JguOgO~mfof|MK<~%vDsu`dJ$)jOha?ticIDE8;Mfb6$cd+ z)xz3Z=x!Z2@jN$W8Hae`!^!X;yRB|CxvgkgG$JS&YSlhqx=Ddy&0^=+C!!Xaci*3q z-A4$j0?QMqyOi}|-*!cjzfa+Z-)lrx(||MSf=R#gbWFs7H2_K)D?Ah5hv6t02mDsl zYg1GWN0g+k9T{+(J)hq?{a)?x9aIFBpwMEs&r)JAo?kDTsc3pLIC)@%+<(051WpLL93CIsJWV95RV>h`D__fk2> z1~V4bpG#6%=rW$^TTC?ON(7-|YnXQxLa$In@DKv|?TvK_tQwaY_^nLwKx%7IJ3F_j zkH2&t-Yk{gW>M(72!rFL$9f6}ur?B?7iHj;mcD)jn36qD;_8%jRV`{T$0-V;J$~Ir zkDa}nBI_ME_6!`PRP=X=#3wl4n`g@5dOuYxqGA;BS3Z_C#8@Rz+Xa)jQQp3J>fK5)z| z?i4~d0r*$_o4h)F-aDKN$4C%kp}{vy94iL!l9iQks3F6W-^s4}O4$iO4;0$mRru{5qkKl7~C@IKC>N>b%M zVx9Y9juAL-(8~16U$*@f#QwpcoX;+Sgkk$GY&jD8YZ}B4xbs;)DK~I$WNOhawfuwq z-CoiA!=;mv`Sm^Lgu7{MAm2xp>LjC-5#XleYY+>I#p&ELyNENxYGWFMm}xTT9$GCX z$bUAT(1riZglj1kGv$C49WzM7)!|H>=gib>lY=*79_(mhyQ%=*-j=8sS}bgkNgf^3 zFDd!6_2LND9nsO|b{v@0k{$2_{n8(`az#d0dvK-Or+cSPyxWy5_(&479QnI9%A|Bn z8DdiX6ta*0FeksQ>rxdZ7c$LwU+H3IpTa4G z`c`-vcJ+!|ML3t(o4Hz4mk*+MQE-OW5-K(~i;3_fcb`O9u^`b7 zboZ0rfgpiyp1#o{#UA+{`~&;n$)JoI?N2ihka7+Z9U|k7`=v&@khKp(7ujEeQlNIH zrL5X_O#Cc>+aALDqr87MxiAtL%kGZ(X7*A7@+-friYL)z!_d=QMtq3?3 z3$oo`;9HKdS$t(j7q3*#j=9VnSj85F(I`Q>_73{Uj$2t| zc|dr0ID{t)y5BcCCgxLO;>I(6_w`g48MO0%e`A9H}f6xJK@C|WPGAnjK078`{>i!g!8Af9`4F#U}IgPS1Oc*Ks zn8K#C*bM>XeY=GfqO(+CHbSDvG;zK9myZ6x;$(cj{At*DoeRPv=4BCx4mLQ)x5OR7 z>4*I-pT_-GFjRD+{BxL+XTUdGj-!h%B~-wUcAWu3Z3TAdfCd(W+@kfN2*a>^svCyF zy!}$RL7)T9?U~PAHM?QjEeJH@82kF_JrGrXC4@RYcH3^}X_ByLAUm&m#v~Ia&%vOw zJTwNUwkHdhgY}|EoXqS;=Ga(J$BmD;j*LM?&M}N=1695ViYXynj1Thv!`54H1-VAu zqI7q6cSuW@q==+QN-Etg-3Wq!fPi#&H_{Cv(%s$Nc^}w&f8V)hoIe1A#rv$7bFR5O zTuTpw(hnCaLwyGxy5aW3BJz%H^}lgSynhE#+VsO`M8)od?O5JR9dA$Kii-9(=K^HI zhJCKG&7v8wIu$L>ya<0t^rKFnmGwKjyR>mO^Q#_dv=OY{2`79(Ya}{Os7fv{40jo_ z2~trfuv|Vxl&$^zVp@>wx1=)30hYmJwG!9s;O2mgU{-{F!|S7mTd@zxwiqHuJ`I+w zZ+<`^;}LZHa^gp7PVB!PbICBWOjA)B?i z;C?8jtxfC<0EMsNGbbpZ^v63b3Y{=l>H19&sI;wTtNJt;iOG?H!;~2WT%_Nw`!J(2 z>I;1bASe8B4Pc5n98qGo;EYi+JD7EBlG%&$F%`rcc(xQdCJN*D*hvKOu1u&PXv1wV z`a8B@pZcf;w7nl`qqqGB)x_UqcuW|y+qW+vSH#Cg+@Ppi4&rMA&p+ky6bnpcv)vTs znv;cxw-(pJQJ7k(UGkUWmfE+ z_MihS+?H8RbE>}i=!J`feW=#mX?jX9(>rXK=7BB73x6NZDZUm4Y0m~x0VlKJo;v~k zTM*|oxfZQA)tZ}D#@psgaAxIK&!Y|FCEgau!6e9=OL*&g*sbYNjTH4`cHPfcWMMMw zFB(=Uf0xGaA#6`jV3JpcC;2~dpHC=EWyI7%1Y(@fT7wPQHLez$xH}57Ga}ZQ#tUmy zg-7PHWd%(B?AM(!7X(^1(j(ODK_eKi@KJcJVYcRcRlcbF{tFLw3SQKS-TS7uz%37F zHnXr$hFf3|&Bo$ifroD-ygMNgcNzP>PU(y<8(sJmQj8EMPuVl!03W*SBHs2tEr4)t z=-3V#&qSO=YY$)1_)UfcM?YGb@mmUntzA8M28=J-mIxZfl~cy+3%MWB%ia~unR}^y z_z(_Mx7RrW2JJ9H=VPi*$6ub5B;x*X1|T=^dERh)ofiTDLs*G!6A=JzeM-si&2qpe zEcMSP?BZvcRgIN5$2!tRPxn_;?iG^kbL0O_IG2X_JgsbBc< z9338gI9|apg(1hb_+(%%3h{s19lYR2=sT7P{Luq6qsK9|S*ma3!kY4FLLiVuF#&Qlz> zh*4`T_ix9@s49fqs*W#73Cnc72;)WdWVg0x&U$c~t}?!CahX4N{9zLxH!gLT)CY10 zOtnfy6!v(VFc7#BB_1*Eg0<}NhE7$Kjo7mjS5-|s`Ahur==5Wox44`)2fe%ZS>Xp$ za8-9^@zYA@{NZJIqz>i~AqySxO2vAhTbLLbkNIH)Ye5P?ep*2IMlO0#$S+$9`}_BA zPlZ?g73W7C=!s~JCSJG={;s8*bRU}4XJ>}qIbo2OxI(J-tWoCY>o~IMK&*w~c;`}- zO-NG|$6d4aktX}&(1=<^Ig6i0*&g?&q%Y;E75V^a_s-aq=!YghnLPv;(LUEY9cffYz#B4WuLM^F3Auc!?J7XeYbE-$3rcdwwwNU;`0fu$ zfbI&XhlbA}m|g+mu!-Ipb%<5m+|fr?vke}V^D$WlkJ}#Wg$@FV+23xN6R;zn;x&`x z5P2i`)MS0{Dn326UI)>9r|oxsk~C#AQOXpGxh18kij;MMFs4-U0`?m&bW;xGXM9+y zKbaU7YLj)7acZqvG?Pf4%2whxMZ&I1@;}jfHwGZP!z&Lf7pUs0Ff0NGt2E*zqV>J9 z;aoS=)A>$xKgqWrlmIvVGdR7sZ9jq>fd2rSbQpneRu)d$EC$7+{jmv4_{g8qc*39J zg_Wa2%N2rAKQ;n|9d>YzM&5u!W-B=q$%1QZof+~bgCvHD`NE2y+eF?`WeYxinDzcj zv{wrKhV8Tw&HpyN zi}o+PsV40KL2Br$4PGfb>s+F2;%xrd*brh=pt?%qpAAVRr`Gga$C+pd|Lq~i8&2@I z2aK9R%*1Y0+)%i)KBMFi=k$SGWsBp6`j5C<4023U>_&?ic7<%eAl?go!@bE6@Nc=J zRZ@qSPes%5;*b1U;JRYRGKiGi#gPO;Bz-$j`pRytsXzV-!?Xlii`ZvO2vYXmO#g4G zhqskD*2}}<_N#g-!sF_nh7pe$l=rU#Np0m?znr^pxb^MgZ06_oykpl=#iJ!Y)P z{)Vu`*j)#@)CNq0czgoloNH!pB#wmx7g>2pec>iSgg#jBkocij?$6$Ct=~@j=r-(m z+FLs0hWO2JY6c}q2Q^6xehBpym7-@URD&Wy0QE15WWP)hHL9Ahr>I%-1W87|c@v0j z{piJ^C(uL2CC#_m%ec8=%;U9O7DcOJ-L1Vom!Oz0IZCDp9;o|!JcF2S2jCjiI{jxw zDMU+!>8aN;`If25#pOD;{TqdW=u$bIt$_Nj4HfK2g;Yfb|P{Nxy z>%OW4y?o!;Yc+;%jq0m7*f&&jws3hf)L!Ojko=jxZMCov=`(%_{zEY@A-WD(BmfGm z@=ogS_vo^Eq+Sw?0*D5K_@v@&he*2J31M*Mqw#`hNOuRfBN&=@o`#d5m%Da_vT~y& z<&%)#@bFVr{uJV0R#4EdZu_|_6!*z>j);ipmE|{cJg1PB}|?G~G&MUWFVwm2evMDg#^`m~~f% zcK$viU)|C*!}a*WJ|h0Wt@{-Pu%L=|tfJWMPOnO5sSmQECq%XvtF5SQV+Y_?r`YB3 ziSqhOR;H4(PuMxbDA@a`p9wvO3AZlxskBl?LcIV6Y_?}SX^Tz}{0M@)AR79Dj`gJdih9V1jf1Ws`Lb#Z9^PjE7FtYv zcMR*hBxBNEl-MAG4^(qIcTJSO(p+ed`(cPrzP2^w$?15b>g!PLW2Imp-aTsFuc8=iL{40TO?;#n$3CIX>9e#_x)I8pinCtcAUPfRANLE;=4Gc3Z9c)F*)ArJ_{<}eI;GY zu=INZX#v->ziTzKKCh#F;K|QQRLiJ$6sFQZO|1Q?kNEzmkjG+T34nr~Pb>(quzj+V z0HEOMwXdGn^(UdrIfv%ORDK6I?HbEA*M=M-DI*bFSdE{KP9WSBjspC7!Z1k>5P5Ti zM{8$wFa);#v=Rc8V_Y}(P>lpVS+n1dPAgx$x4u>Tk@$4rY4HH^dR4|n>;txZD)1tX^3L}QnQd4$r z0oSZ)9GoxE65gT8*MvK)ltg#$iY0&O=l=}W`-XeB160@DV3&^FZbfnqco$KkwSygl z>pG(BAo_!Dv{&O=_S@FDTM5&YW?E{;~J6QB}8@=tJT^5 z#t7bk;YFi5YkO8^^pGeFKe8G>{I>sJ@B4=Vnbu)mXykM*CL(4NoJe6P*}fk$x|Y<# zc36yMwB#aoP-$sqH_=3}ua(W6n7Qc6J?nZzX#Ozg^f=W%b#!y$pwY2e+;4qCazt8@ zk&tZ9$JPDO67Ke+WXO)QDT|AX!(THx3w44%@6$YQ#2r#`oIYWYS}J7E0@Phs(so&q z9%kfDdHbg%8J&psZ?E6t`9bUik;NE3y3%SmJo&4 zu{+l{>&Ktf7%D&nJJ-hC^shhpLT(g8pXBx!FBJa~`y-xa&IaaY+bZ4YKo&W~mPbV@ zt2{O*Q-eubn~WsL*)N|JuxP9L8&q$GP>FqFnWb8B)aZUK!|4wYe3FpF>AXm9@zk(^ zjglFf7kNg>!D)`sp!If70E*uPS)Pv%A_ z7I2x4wUY`F39n8pCUz;V-+(gRUmwW={$wV20|^P}t)4}M9x%^7u^vx$GGYm|b=%<( z`@BrJ?0|B=KbO+U*?_Ip{kWL0~{hN=zuvxOe`eO(s3E*m5R!)ZU+UA(zUw=*k6J9 z9S0ZJ?3z^b;+Y!*mip<37fXQoiAqR7EYRZu>zQYVi{z@g3SHo$jpufO*Uf0^%CE)y zlF0_ z4tXKA{Pyk0ei5CTpMsTCCa&q1P4xOX>dXHDhaa!kC}?zh!!eb7#SFEn?X}-TO*Y`? zTV;s+InH9t1BWzU3H{cGu@p~Br$n5sIqx({T~7y?VMvG-!OJ2jqn;FLH@B~>4ol($ zkiRg~SX5%{ zUf4#xj8XYQmtCl3A7`I+T=wb51!@K{*~gb`jSwWlNILGU>|P!et_?=>CIzQ=&kR6b zmmIIqSjh`FGXPK+1AxN)DLrU_(gG@tKDfo&+{A4|8H zdu8{F_wpjBSuA*c)>{0LFX|g`5)r9Xj%sR!vqY1V!D>S?<0cO`;x>aG-$89&%obc; zZhytQ0CCW$8a8xXIin{XQedGp=DxWxIT=Z*4%l%OWj!{xFoNNrdWYG_RGal8O=lK_ zBeJis)xCeWoc)Ku@5F2J;T9=Hdh{BiaV+^K}yV0%iCgbb9+oc(UME~VzV@%RbO+Y(;94Y+N=!Sj#$jZtJ zz?7;|y5%RkyqK7nrR+FePNV2=X9j>C`t|RG8QETzkHptZ!gm`IZ+bwWf3#VgT4hWv zYmhgsmGl$Mh#|tm1jS_!;s@B~V+ydO>WZd=RLzB&o`&RD&6RJ)Ul^)EYZNKl;qgt*gfXV{YPQ+Pakn$|q&R?Dq9PdnPBe6y0$F)*U$hBNz} zi%W(-vmD|AM}g;(*wS_`HMz$1xzqF~sjGb(Rk7nL(9NT)|1O;&fH{{5(}i52@WHW!L9EBz*FFNXvSp!3 z-A1?0OMiH!d>l8&_Sa}wSWq@JNKI^{hN?zgHO@a{7V30Ml-?U=$$-%*(Z6i<71-b- zYdmU4PLn7$C7u_0mIMYOW%hKuO=#v3Dqyb-X-d4ZOVvDiXhw^u=T zWmA_VlI#aOtU4vT)l8l$;kZKM@&9IFPy<`Ds8dg5if>A7_V1JHK5QwX|BQtBh>B$< z!RTqK)l3ca88Z%G@Y>=FgdZnjc>z~rg?*ad;HP(kHB|o2^ED#IhK8tQ6VvY!zQAC$ zRO||SLUiGaubRUBC(P>n2)tmuZr1u2DnCEJ2z*+UzwPD0d~@@|kJMBffnrAN7nO7b z_2eLotz`{3eBdgCw;W2!H2Ib~%|qB|w=+YjYqt_w$7;{^Q5m88rFCm>7pbUXRVYk+%0)mUkyFk;z@E0n?81uybF#DEvQ8$D$c zi3M7ySZ@CZsQ6*@5CkXlcP(^nt%-)~cV{ZGHZOy2Mr;RI>Np6kz0%|_6&o8Hk)0^T~(?-ZS0)FlpitlE3L)i{X>^;0WU+IRJ zj~DfD#rHZ*jOy)Of^IX#bZUqDg!sP7;@z;Q7Q8`L7_!T}6Ml;K!{SfuH5bKkP2b)66$(-x6PXRKiVw5_EFc;fU~qemH$z*Um-=^Ix#vX zjMM6|WcP;^fNI6ojdaFM2Z`oWCtpD=8CU0!_V4PCJYngdH4+o03c}DuWIOvVxUA(! zU)q10tdqbL8%UsuHONxqI()yCnrSSrLKI%9+^3`@kR)>Q}#M&{LY?mpShFE_F{S~!EF zN1I$rgUl(+<-bhsdsAvCnd?$mnc~f3$vbI{b3~Byka0w;eS_cc%xoY6E>vkXc=1An z@w{w&*`_9)cRUCY;QkMbAa9AdX;b*L8Tmx1v=_{C_yJ5|wd`z7FYK}XMlZAgjxxLI zrccoeN{-`aN{aOsMb;QF*DGqHjni3ixM9_*LTI_)w-JvzQP;7P(kM)my?SPET>yJK z5Z2OQb)p?is}U-uP25mTDlY!J$5es}jYbbzY0$+w41#)z0V?q&E|BscH1pHY*BV|O zIS_EHumIxL*-=->^$Y=AJv0Q%5_=S3WDRNbQ{oJWY0wdg4=1C;h?}YO{K$a6XU-AzWzsM)cls~1<^Dq?3JRAiO+*F0W${A^te-6M7U-=JRfM-i96CFS-}*%> zhY%IePKBEzUO0}kww3HfTG0@Y79N{gp_WuOnncLb&P3rmWtYb3!EOA-7ZzwBy8Fbg z=Yd(bj^|`UR(Pz$tLjd}L3VL~uUQPz_8XD_X@ytz7~e;~sgw{_cLbvwffa@)_y?dt zo4eMI{_IHuPoh>J`EdnO)(*5jUW9ON%=^RSx?{|HmUAyEmZ0;VC|eIgEOWW8wdl%W zfh%M&H{XS?cBamj!6&U;K~Wq+4$_ee2m70IjuzmiilltXTo5AmOk~Q7lusz@dqaqK zS8(Y`gLjIR{z|CdoaI7xep6(>)brBRcRQVcRZ(`go5Z%&_k zuHp@W`{!;CMsrz1dHc>-HNdq=)?Hlk9$CXf%de(NBqeg7`l-`u(a}Fg8MoD||934*JQ4A-xZGv+6 z(vX(y)2G(L(vfRnc4PTH8~A^C3x2Ff4qJ+&vr+S8|AFBKS8v<-y;Bo60SDJ-#za%JEQqll!Kb++2+TI&^`LlV9y{licrKAnMSCcId zxPmSR+~>wC(5$NLPSbt;=)~94^%Aczf)K-j+Z6z+sXXX72)B4hf%IqGjI3w^W;R`@ zJciZ0JQl`~4uVgG9v6=(_{ReqJcGR9L)MwXiaC@H8fxwR~KsmDY~4G>H>&R$QT} zz6z;u3!Z?eitB`)G19!gjp~v2xs2BesoQG?fsV~S@V2E$27+S z%|NjW+hd7ZnAJ3Z_%Kf+32l)L%~Vs33nYJ4ayy47i~I_C_M0Y`8usI#cuH%k0_*on z>2BYg`;CN(7TK828J`)`KIKgtFk5YYP!GQu;xe|zc(10m46f6NuQ2#ooNWzX4Z1Wx zovQiS?(lGT&A`Ui(;v(H_S~fX6B6A66bpJZKgyFunFr-MMHk1qYStH2Oxq6Vsw5y$;;Mx9!V)RmU(f^s?TYJxva?o2k&`*tK9Hf^J zOFtWN9mC>xA!=jZl8}Eq>4?Ul4acn(A~kgBZ{6WT7VVQ1CH89R*8fE9XF}>UQAj_1 z?)x-G&wNtOgKTBeVYI_=c3g@&{X4+=O5lu0$kkT<gN|Ez_Ln|9GzV82BWFtBsde8VF#f8;23jy4{G< zOFzdNG;-aqmgPTjNvkH?au26)oRg<)bv8xHc_GLV)SB}azGHaoi$04pR7a~Z^G4!2Dh#~T(>9Vs}{Knmw4)mAp z;#)a6Na(!9^@a7EWNlkp-+}=tR@C!~5pRo0G=~@%sOBBOoVj@wMz};yqgA zPm9SS7UCWyy&vHu-hTLOa2I=+yJYMT@x16?UM|F*uZ#RLNX{Q81d?7?P9W*!IJnpe zQKP~rH2S@T>S&=z{F5KyEo*VRc<*$K2SZnKI6mPW>R~V(em?@Zl##jN`8wb z%~&u7qV!(5)`;Nkpj!c(Y_K=E2ZWCOYl@xX5`{ZaskY($Hq*pejxgt@g4<`7StZ<8 zdz}MF`8MSDYl9rb))jm*#+jX=tXK`xw_(K|i6II&wz5vclLCOi*#=<*wPVfFWHWb& zMIIC!*JGMcKFDm0^U3=30{qezw1EU@B{w_&0wRNSLr~cLo(g;Se=qrLO*dQHuTz`B z%Jf_$?J}0?EkpH=%F+^6RP(&vo5(Bm;EmVvG&LBjm?$Z7LO)os&mr@XG+6FrUlsS0 zsf7eryyj>4a$IKJqLKby6AX~;2wGs|w<)>f41wzS0S7F_md4!Ds$UDmyHNgg8+>&f zdJei4sQ$qZ(`dA<7T#lj2%7IW%WNra*JL5!LvOq{2-A$Z&E$wLj(gfUG<09wpb^1< zp6lc)3WnDx4-S%_@!zbsmzbecg(;MLlFs4^B2Zh3103&=?iqc;eVyiCv&!tdK|~p;VsKvHe@PGE4h|!N z7J}~%whwnpDkuR#q8a;L_`cJXfvUE@@qCg3#zscF_QmC>f5y>AkiQ1{_>SQx-SLmP z(56%FQ^w0}&W|m_%c?zbn?Npi0^T4~q&w!2!*^NM{y&&7Nv@&-6-tS4!k<;La4vJP zvK?2@MM<S&FQ>*_l|;|{;DQ=CaRGYjE8w%!sY73 z{l4>$#Eo@pVPZ2%4Xp8oA}*Qq?8|_%y=s&QNCKva+Bw^G{(S+GCBpZ708@7|K;=1Lj!zb9@v$YGk$Fu;#v`Yr(8# z@&B8oT~dri)ee0L2lqt|x9qiNi)i;a#l6A<4%X#H~ivz*) zcYYDf`(mtV7!Q0-EZ-1pU(L#~iD3iqG~E7wPs4Fs*Qx-n;370N3q`*b)lmElQWC9w zjfJ8KU5p2a=%8pE8yc)RKQt7wD_8O~#I(D@bYP>B|on7xa7-E+kPDv50|wG%@gd4 zs}Avc-sf|nZxxw1=vYDDiqQMUHk0&6%$HeT>HWXnc(qVD3b9V{#)RJ%khKVL@FeRPHUjx}S0KC&G1c+~&t&B={pva6^Y>L{ro zM8AO8@DX5qDaHx2S}DiF&$Ee?ch}1Y#|#JlOBQ2prQcUe4+sFv$Omf?0gD$IgQjz| z?}J@dt@$x-$2CY&Gv_XRFmfRoHVYS`a&fyNr(z;LZyHJYwSkb|GN(WMJdsWdS=uS? z%4;*TR-Q?S)gEmZXRKHiT<4em!R^ac_+74&EqY1s3RqeU;SFH+!3G4c#dCayKY)T8 zBP!AaLC`2B>5Dsn)A{Y8WmZZ5z?{NC4C5$_67-u;Cs=c)!T-o1OFfSbm%a&x-S%DB zQU_I7yuWUIu0XN7E|n}Bsz_CnYIso5m}^0mX&rf7?*g2-w00B>!J^C4-Jb6iH_!k_ zo8PX{Z%8LN&=-YLXe8g)%dVzQ5rhX91;id7z=?v^Re)C?lgc7>)pcNv)TrcGLgbDRZw`<;!yULE9;xTWOxYC z>DYUuRm>tHE?3Jb2$l~_DPYu{BRW%=7hhnDsx2hE9dfSJX6JaGM?n(R=LQ=!F4526 zDjluT*<^a0&mVNia1-CLgVy*%h}#rsb2Nm_wA3RftUiLDopoQW!wftOWzE`48b@6B z$0A08HRq?$)-jx+L^b_rYYh*D{&>i##3ff^bP|YL^L?#(uRl2|rb??784&KiYuDFU zNQa+GeW`Prndx@QT5;CdMymJC%%F~UUHfh*u+ zoiU`RLO@LPl%KVVM6#y&@CwE7gN^7wck~ulY`L7lky>nN?Z85ikDtI%S?C0*& z?cf`N+Kk%UBzE^J8&Xyl&Gtp5@zC(=E${9nl>E%CJa!I2di+ZxA-`CBvs9~k#{`!?yjm(gIo7RI_> zij15KYtAPLes)4z$*gQ{D@QVyOP1j27@D;^_|gqF7A{&)It zEA2li?4NH<$A`4Xy3sb|j8tQ=M)>Z)POGiEjN?ewMX1sPnb|GrRipJrU&wEK6ce4I zOWh=L2NlaDg9SO7-lAAxJ=*B@izPV;cflhp**~32Db7>Do~d)Muc`T>?Pn$o<9c@J z?+x!J4`VM4jg!4m%D)vH2gJX`KYau0DkYFH#&IR&uxpHhzt{>oBDgL=rn%TaiaGH_ z{zPiLru(<4At+!yI~%>=hd2B9fupKbhXr%{d94MDLWd#dI)*B{i%5Lo9cqj>4T=BT zSl>PXeBaSrf|Gq$Khgk$k11!z7<7)SxsQw6%3KPOot>emMa1qY!0uFV^$R=vd>v-T z-l$@5?P&Lo`+wTpoF?-iy{Ou(2R<>hwlfjmRwgF$%3VSVTKHbGQrdVP7+E>B%#Ys< zjlDjE;bGJ57?&o~fTJL^UP9g9SYO%M^$3Ild#%>fOY$hc*D9MX5Zyfww!RCU>)lNT& zWMfQgQ1vo8v@I-#zNRsO`n(!o#4aql(g~!ONXnst%0;EUOt}sGkGCyA5TBPUk@}dB zF!&Q;_qXPq5n-|u9{;67aGJ;byo{O6I@n1>V zSq7@W zDJ6qQ9ox!s;22)O0hhhJK?)wK@))WxudTy|mmk>2aLF@2KeslVTB?nADc}=%n;1e- zDvFwvE#PM*wpa)St=e!})JByEncd833Iv0h{KtpX)U7v2`VJQ?WuLj88eJ`ZNB1&! z7Ybf=bY?@(?et(%<2He>aICA%1EpacoTC!%UgH{&;LK|R^s6|DP3pdBv4RISiP_uF^ieJ5<@43K4VOw2(@oz8Os9Qy^^P?GW9O3fpcL0)dG}uatgkWYw z?QKEX;^*PchKXAJum2I7XoYC?diC>}`3RtKCz9YXHf9Lq;11|5^N%L@PCcYYl4uPj za*iYRt-Z}(O5tuebH4@E6hR{%O~H`hw}+E^_j4AqCJ^8u2bDhZkjXDeMf2?qu96~)qL=i^>#Ord;jwgwS7^AgRS+nFzUmgodW5^Yx+65#fHx^Rj-8VADj>7a430lb< zpsMFi+{vxnNx&uNT{0c#;Bxu=^oNM`N~l4YvZYsQBA4xhmi8ju;(_fYgLNb}Wa^bO zeh~l5)Xr`$AHyo9C>|zLru&V=tbH}&u$?+0tb1#?jTZiFEUmiI@D`yv?jOB)C}{xZ z0-F~03yZ~&{w#}Q&T=aI;tPVZLzn$v+di?sjP3lg`M;>D2{zMVgZf$83B|+Gg$|sJ zWaAvr$?@Plfo@Ol-n{j7okd(7;!-IOLyLer%~W{0aAAcF4*gLyt;R)q=B4aFF3mYM zqut6g=p?WRQ-j6c6(9p=P%97uxdJ>%krfot4ez7QRlqKIoz} zBmv?m#BjhDStWFLYDH5|V5egsNyEfgiE}adI`(r>!%jX=i;Ckdt5%l${&>y%v2^QP6V{T67H`VZj-Nql$|bbfc1M$=SE&= zRosLH>_~!3=5ZhBaAaK@uZ=lMTAC3U8A0+fxkaeW1{27;|54?_Cr$+XrX}zGWtx0nJx}2kSm?Zc#v-)&#j-jZU`O_dx%FW)(BJmNMzZWXl)_4< zSF|K!33-H!=P;{y14o?!^w1Q;7_g0CH$h`}%v;#Nh`1TirtYpZN+vYId5gZGKAeVI zUkW54;`fcFQ9JgfDv_7df5g^bq~#NVRz>a+scH-g|AGE#o$)*YwL(Zrkd6NK^p=_6 z-nA<;1Il%m6*$3Sx_T~pQY{JS9)GE#Cq!Rhvlh|*@tl>@JogdfqFFlDroOf4s7aPY zg<%)^%yhKo1w+-sFy7How$WgfyEu?^Oy!pRi4IF|WGd=D8X&ZT)}O6uMTJ1pClLJO-M^0U+p>J)Yi$J}S?G0gh^A7UYMVUe zr4eAQC9M~A!^EmM%?)yMKOK3n--@!HWXI!`%u+8V@HbX=uP`yyFgxX_w>S?1DFxwhOM2iF0~rv4a0RZtFS>ATF?a56(FfUbl2LJ^mfYJH~p*hv`~mJXqLG`? z)@jz(`eLe)WG%4W-kV$?gA}z1^vNE|WMmX%XHwe|jK5j~5FxF_=F$t02)MdQzlpaX zcKbIs*33U)to={Jmey(Ew>Lu7WEu-8emZYOt0!%K#O+QBn*Sc6%@6}tSC_i6$-ss~Y0C?_8YNm8%vtydw7apE} z{%+`f)XNZxuVX^xp^?}H*!*;ZK-l)KToJWNXY#you-2ZhJo4j(n<60 z_9Wk|>+a20A_LbAF|2U|I+LZPS;N@9kj<-m+@fyRHh*j6r=mftGcxk99hV9ZFt{!L zH;qdM&Rkq%$Mt%RhW~ycEN!>}zl(4M#}o_W3KM#HLYZc-Ma8tgUabxMB4CI|%sRJ4 z5N|#yg>o(4Q|j_#`7VC$F;N2B-|y4xDYb(rCocXLPl76Mw)U%pNa$6rG+Mh18D;TTx)EBA>r}(NgOt zJ=pbZ{u1qRS8j`)ykwg!p_=^8>2szFnf0w1w(2FswK~jWi-d-` zf4ao3ItPo9Y1qndHfUu0P%V*%m;Y^XcOFpCm{8B-fj7HGlO-)xE)#)gCK-$pl6q)q z8QkqWrH1}om+YA@21iSlRGlU3T;4N|V+h?M0{s+$y?R==U6(@Ia#$TlJl67TW7ozq z_()t|r{Ep(czT{7f@6%f7ez|Mq~;&&VA<^qDQx@xAf5kgo-0DGbTCOykm}bF-B91K z<=n~UX{n%+fX>z~okJW;g}Bip_sMlc9MXYZ3lmq}V8?0sr94KF<##cc1?|}cm#)6J z>EzT}@rmk-`Ib^TkDR<=OhR9wYo~cF0D$d5HaYsY6W$p5Y1?&EQ+dtLs!O+Q4OjH2 zp0)uI`2!ut3$kuWP)wTqG&SSpN*-*`%aX~^bb^i&W!g<}r`S)-+0u&>$i`y|nm6ScP>kZO+EC4@U;{1%#R z!D|w#DW_LX{h|@f3)5?>N|BRi=R1Wf7y9pi^cssXmS?1q&1m~fo@EO!A<^{;s6rUR zV**}saF-nh@_ro0L}ZRZr`x%$ zf`<@1JSzk17JAs?)5bq1kJ!Q9$PGK$!UCJ_ljipcG{(!|S^i#ao|xitw?4yfzu&JW zrj2cTg{yz7=#%5%r=g$?bJj9Q_b!9D+YTi&vE)Y+VMnidI*x8&U>h&I-~}B$9)MEY?UHx(GDe(Kgc|_Zy^NYrSc$C)6zpWyKeA(IXdi zb)&7(Mjqd$u#7~x7uRd*>5c|YpO*~|P<<-V6FMraUGyT}oha@Aj#qZO#kE0v2%@)p zT=FSGgpU_Ck3rykH#G27pa@>w?zRfE_aRL-)2!pph%8jaTI1wz6 z|CA57?zVw1)$V`4)R|MpLUW9o8kik86`01-Zae14pY%z7pI1qW?dDk@a4tVsKLzZrh|)r=D0Q@A*s5Ia@Ro5>M5Z$8X$fq z@xn}NJP%<69v)&3j%oQByS+St8l6mX$S6k1jdXuGf}(K$5rLOy;IUc1GS0EZprg+P zecCckmgs%{>(P)Oc9mh@H-kJ^QiV_>6zWX!UDS5457plvpd&{rryzcU z@0u?iX`c8=Fh*kRxe1vI-Tyqp06T%LDCC=Zw?^;!aJ|U^%+BtvdPL#)ab1Ad@ZO%K zYV;V0cwUr*GFEl4)CX}rq+vK;KG8ve4dHu$*$C7xCI0eBFII*HGAGtadD0I6dM0c33ple z+~d++Z9dL4kTiWjvkPPP|4_$!@M2Zl#Jo;77R6!`k%AikXl*4Vx?YpSVM=_(rt&7O zso@_v*I!as+2V=04)D)Vu?I&kYyC{|Y7l)GAS_M3Dfq3liWiY;^o&K65$mlFIgYtKM>> z2K?bVb zsu5(Ub1-{zV6|gOM$}wdcVV{fdc(p)uSVn=251BL;M~to(uOt4Xlj6>Cb^Yu0ljSN zf&x}U_-shxNkFlxNrq+1-max7EROIHkvceC*-Uq;aH z=L7$Mg#9YMDxpIAOe((&xY4Ab0h_e?da7R2?yxOYLo;YE6l}Y%&4wC3O~?T|tY+1C z`XoL{_kMh6p7CFsJFR^(InmVAZ00Jo-3P+K(@#!YbFy&!#ML%dRslj&U%CSj&Jn8h2oxhR%g`Y0Q4Z#3N!>3Td(_lPCAGA^I{BA>l=i{2<$X`ukVpwuo)S9Oxo3fyHd(IdHDaYhcbUb0BN(m^B1Au! z_Rs^(D*=B6?B~xG$4mZkcHG8c-Gj~q)VBK({JwgP33*7`36=}KFYu(_3YS*V z;j9RYzzRDfvzY-R#4m)wHFiW#8C)$-`Ai4teWObJjTE_cv_3U19AF-ff<-$oTORLEvD3I%Y@X8mkLSB!?2C3DBvT^FQS#>-JSJde-p` z)ul$N&CHza|vL_zg27$U(M zM0$my)^J|kKD1Xxd>t41f?=3-7d`(qC=a=UN&yEf?`xctK7(0H;C!tU|YKFS26S-mUd%@Cc^e6I`ZU5d}?6uvo0zY zi(EVTBz#Exv$N}`$}{N;3RQ=i+@VXF8{RS9t0jr|{{93b6yakT@M{)gXQ0&dVKi6q z64n4n8n^E3MK0_AQc_b>Z@o8Aw;1P4Ysx3eyTakSL{yq3L*!iXqR5QUkaJ*-jEAG4 z)69^jheBf2{PHRt{43(ETQf@(KI%+0YIf49$TlHN z8VrZh@XW%%hsYr7xDAfXdrKN?f!p!ePvYFTi2};5`uI|gLHS7q)2yncO#vW z(k0!U(v5&L($XzRhjhx_cs$QJ&->nc$8ekve(;Rn{;$3ET64}dR~Ex*&1Od66YwnK ze-VCyY1}d2V4I1=39sb??D9Ox94J@4#cl`r)wzkDZVs$@ zh^(ximRy8r3@dv)En$(MBSzU~N7&}W?MHx0NmkPs)^-wTjd0UPMPerJT-}N6n=XIS zqc=Sr<`zYWG@MGonSdef%3G%9sLG6kBv05AV)9Y(% zY%WxZL%XL*Oz{m`Ky)umaU32DSr)0WgSSRt88$wWGX3MpP#GNR3MUvHUnYF#uMh^R zbSFY2qY~+0V;2pVi|-75E;)1piIX=sXNtb-&?Tik8qLm-^eqSg*pe{sP}5X+UHs|8 zOtS@s*C@;3)(--iy`itOTx_lYR@g8`s+t<6A2JLavsNeHMUUWQOsPxAQDWDIWhDWjno{z6KQb2UIrcIMR;p(Zd_K&W4&}> zi`;&*Tbkwc{0)BB8%+%jK^S$gK7puDr*9?3-S7?5{2Xm9vDWxpsY+Xd6+xI_=^}L6 z@{=h%%)LEFGJx2q0Q8DklCjppfj(vk8(uV>n~VfBV>z$y2u1e=?y4jx=9LW*HY3uR z;=6&+^|z|zz^Az;psKw5Ym&ya@?yTs9HQKm z06`azY*vkL*-0W{v|*m3E!h3|kgs}W;pM^DIhEnMj6RB;hAwcd1#Em%Qx}s2+1vX_ zp@+bo%jZ&Bt=g^Fz@XfgX5QS(4OiPzrH@-N-15&@2v=8SilwjPf^XoftgU;rD>}St%jI9o%et36Elk`XSWjogBA3{5<&!(THF7!1r)tVBA#c-ES{BYFsq6 zQ{Sgb4>*mRiN_1#9J~k|O+EP7NNtzlJ-Zy}m46*Gejr#k)ULq+2K--uh3~9I(Wju~ z5ssI5c<9Bo)$5DI-}1Tq42iV*JxZWA2oV<{K?Wa>SgXL~M}~|-YGFPKXA3mvy*E)E z);ILLZLbohkJH_Jf)c|@@WP??ZD(e!hK-ICRVEQ3B&Q8$PBFXT3Mz8uOu1SYKO?il z?g6iwz5PfAzP0JO;I)p22*>k7U-|{sFXI3V>$5C)J#}wNms(s&d3YA4Ue#?VwwFPP zi$vf#K(Ws}B_(*m>>kc0FF77)MAWnRQu^syjtpRfusU;>ln$m;l`#Z$^UZE$Q^~Wk z4n%aD#G)cSKlX6ILYf#Bw%4+#B*}z07pU0(8C^)Rz8g$>?PTi#KhD=h{4o~tgSSM> z1Q-$#wtmk9*DHd>OIbRZNcXwrC@j_c;ij_Jlv%q?wV#XAr+w83KlLGPs|Tx_2hO>( zJJPivnF$+-?=l=`X>MHnH)lA{1KUm2GT(eQthqfhfc6ZW~}aDck#c-oI+ zj&z(71z`V4Jk;_+)8O`^iq&Rke?_^r&S9z5>|hA3Zdf8oH)SG!}fY0Tvk?g_M= zVI0U%$LI$Dx)%$cv z5H?#T6`g*M+P5`Be(+g)|0!49S72R1XZ zTi2S!43+x%LyuxDw$4YiJn^(N*Y>F?d)R9JPAni+l z1zV*WF*x0~Z_&2clXR%D@W|rwJKylqzJrzsH{v~;W0)AM74-cL1OWR4s`*8!Tn!Fx zjv=_Dk#JR}hF*Bq@>Y}{#1)b8GJA;uIs}P)4Syi}RXFu~>q9r;p-lJ$$nym`HFy2K z)NacVC=F|};52vmvIfxXJGF)pw^>9HVvPuJHhfieKx6(%G3$i_g=%OH4Kg2TDSNTV>0m&*esB;F^=6MJW=i z>{xymLs>g~u;8%5W;A@p_|9(sj91GG&w-Qw-f828Q%A8>`R3%M40m}jxa_#Yl~b$c zTpcBR@M#(VFPTF}i7hf&$CO+HDV6>)r7FG~v+nG;gU(vDwos~c8^Oy;^@lQNcFsue z>h7BHjW_ERj=Cqw7kN%N{d=|?ScJ03bcqbQ7TVXO*_pSxkSUh(`4?=eW@8HoqY#J= zF6M(NAK$b9px$DG@tw-}9L*4hcOk-gs|$11C^B%YgOYRmydRO%14TG&{o(#7U=LnF z626&?(*|#>!)HI(bLWYQrryj1eYDEf%(pJPNQ=#Q6+ltf55yGpny#KI38MrTXv z9;%gdm<)i6DgLOzsg2MrPOhL+05`B}7`)@_=mcN9LKO20A!l@GCQ3>zJOkt~Vto}a zvTdL($e0M+TLp$Klz;0SAtt06hg0-6yrnVnDe33Ja#DDrC(0QZH={l`LkoK0M90D) zv}uZ*#3@GaKEIia7(_b2fxCO1sG5)UXgBBV)?2R|NUZd0c325!6XUR`mI~U8VW`AIy3tclyg`Lm!^OjojGu|P6DFb&csDXgf zrEKPEswW19pp6IHli;MC?i5gE zVw%Om1tZP}d)A_Y-XLRvq+D-Beuy#5VC1&cgaK$*dD-X}2S8-F^zyEk!#9HuntW>{ z6qfboQ*#rBaH)N$7{4JlqK3O?Qv#XVZ&DzUP!Hb?l5*wMlU(emR@oz5e=E9Wybie)ak)92$TM-a132L5_m)pQi?LpI*X z|IluOue!|68~u>`ZN}s1DUC|V_2n+KR3^Pb0tLlh4LQT;D-AC~0_&a&Q zby$==Nh$RmW`v#qQy2qt8cFX#_Oj6Y5PA-Chd$fpL?vi0T8x1nk{Tc!Tr#&eE)iNk z!m<#2et{D4%V}@uVvYWfim3{cj##Vtz$M|7xa-{wWR?NU*z|hb;>5&$Bv^LIo`cTO2o-~&n+4F)MJ)!&Je!#YI`Vu|Rko6r}9)Hl4y zNyYC5@B9-{32D%$vhD#>Y+n$x}ezVbu8^O*~-D~VAvEr~{Vc$85pa&?ewt(I8&2E}D}F2TtTL>tX_#?b0*=bN9OZkB1`0GHf-r5AN(G;hxa5ULY%I}jZE7VN!}D|i{I8r zr_!{d#0)_pFacW6}lkmf*GQ-``Hu)_4^)AhFrLKG<0v`p*3;Y zJ>Rtw<@rh6}Gz#V+(a{>gWVZr}E-L_kH$rZv2H38G>2H%(<&pI3cuCfS zm`6U_)OZ;$Kes(4MWM4;FVa9;$P^9QboqEq(Iw?l6DB0P}O>a`)xOPRo0 zit4QLjj*9~PLNNEOokEmK#Mgg?a~v(P zmdb$!&qgd-)sH83CZuvrxDry&!~`H-<%fy1H0nPG(q*EbGkEt$O%Az3$}CTGh`WA#I>0+{MzsX#a+C zANKBh{k)vfUn!5?>pZUT>wx$W?C>`D)fc7MhA3Y&A2EJw73@BjeP^{u(FunePo{P# zJePvQl3D#sl_np^Rm-%ZRE-t)34TURPm`l#VdYj;!B)1$`nP-e6)TDc0f`NXo3i-Y zbkFUO*SyK!Q%4$ul|X`=sEhe=yVV&mNNi{ga*yfQ4kvCF=_=IpU=9+n2x;788%{?r zfU=5N$SpgFWkG!ZLVvAP3U}O!@UZ$1N2)oh(3Styh2x_{kId@vkf5apCG!&IFfPnl z8dM$@c7?w#c@Q#=iyi_ZG4p;Fd^Z@i#iU1XfV?l4C0xz$fRZmOhPxBUM{4`!Zm&4@ zTpA-t=QGJP8)MKX5{iu9!TVbSZVi|DJHvL(F#bS*p6LA!bWRygcyMMm&j48es2Ru! z@5iCU3!KqX4E)}wC@6oR!&!S$BI)MSBwGU@U2elix#im{3~6ALTOuD#uJEY82r)a( za>@a=a$8hr-NVTwGyzHel{uZlXmRyUFF%Oy-}Wf;$b1MjqJ-8To(0<&mo`AzWu@U397G!G3bO^&X1T2W@{8{lfAoc!3L6C z2CDZ1%D9nm5TkwkOj^UMqAFoqV$>yz-(|LF!|S69m65`b)UxJhW}I-tRKV8#+2`*s z`y>$tLhlQV)(NlxYkWK|o>O3NU9M&|n(^7|l5OpvA-ucr?2?n*MvLHx;nMu^Su%Zm zmWtDK$7>s(Wxw1sd-doWKgie>Fye71q=NqB*M1Gq`#cJgc6MG;sf;UqIF@7mVEKiS zVEh1UhEio*aNG z3gCh?faj*mvMbvbYOIg!rb znbOeJ#9Kf4T;DGuKYhv=DC*GeXUi(LnH+E6K<+_geAEv)cyIb4ApZ4k?%eohj(9D5 zAYB~``zkalwjA+a?Q-=A8{Tfu^RIV4Yt|rL2yWT`+XYk(yqE4ZUlf9aA5{a;tPNPw zxjbicq#`fJ_w@x|--ZTkq+J`6z!4GN^h07p2358~fZbcQ^ibf04Y0cx#q>>3S=@b7fa44RQ~KA}*(~~A zbNTpe->cfER?Q00r{^AQkEB*BQ>GstrW$N(Bq0+dStW1=@!l&HA&2$nqcUr+{gR-! z(H0(Wqt+@;wUm4hi$fy+g9;~AIfa5+I_2SEbl%03-}I>Fg3F`Qi+}H&yE3TeV&1YX z)AZmz?YwMDeR-n5YZGxaZB})zjLwY(PgY}1D?cLoO^g-3`9giJ=e_f%)wIroh4NCn zAjgGz5*Wg?;)G+*Q7$x^wK4(eyMcen2dwrfH-2zw{zPmJM(!0*Zy6_NHJgCg<=d*BU)TalK>H&^y^0Y>%Lr_3LpH5AqQk!(J z5I&VuwJ^ddoTuMiCZhtsp=CEuwJVO)xqI~>|6>7 zVg))^QH{hoTG{yFvQ7F@jjmx#?DShEtoKN0UL{7`blo{Q2I}>+vHa*G0`UZVWsc9} zqg@HYoo^p@So(5w?{7$klEg=Tg&tx+*zHYy!aNUi;7C6cGOHEjoASNf$~P+N8$G8+cL zjnyf?N33>|5tJw2im1rZXH1@E`8Ym4OsP|pKE-b33BR{s+iU7wkHSHlE? zx4smL@E_1uTQ^DAW5fu1grTcq&Q)gj6Z;I5a`gp=^4l<<1+C3~I(l<`a$r23qu|eb z>f$Giv~{glD4-yjN3C|ZH~;MhGbY%j^EJU>Alwet({u4P+viilUcdhP5M=hLGK4-V zLjN>u-*gh>vRbT1%CUxAq>uCRy|E**nbmWycnwWsaoqS_gj&^QMt^V!pP|E2QOEo3 z=lgpqmdoJ@ZK2yi+zhTym90A|w&ive5(L=?SG!)%c@&0PU9&Kt^yZ}nw2749+vX$p z-~3n_akZVk2NgAStixv68A>od`9x8S zL^AWpVGQl-EF0|@{qC*`Cs^JLd*f;;V9~X-m4zYaM>)9j+1>y0PXav!2 zc%g)+bWz=>`zkI$e%t+>+r7Cg2zrjFn1wRjRIwAD^QHvFH{ZcV4!wv%B{JH?7cNESP!qTqm-|qFfF5F(WF|!JSkgkt+Rp+ zRp3XeO0ZWm_6z>Jfx+V}g?BB`*0k^Mx56W)yU;O)EUa z2c?qq_Rs(4r*{lURjYe^!Ve(y#!k&&i&rc|R40=h6T&VhBi|FJCt%+|d7HpHy#7~e zTrWmd3wT}%Cqa0#AQclK5XQPsT5TELKQ&qI2z}tcbZT7~s#KI3zEzORe$8kfNM%jN zEENHxs6T=i<91p$nn)MZZ1;rZb(JQESjUbfF-~kY7S!4N@pttiOCVO}yPo5(|4pyb@-fqR5)@C*=P7 z^I=9Z;F0FjBECdjC)RXsROuI@1S0WMPLw7|M7(U;LD)>dt!T1HI2pv4TdaGV>^78m zk-))gu1n^yp@j&8#<9iIXKMKFkSpd}DH?tNJI<~|S!6VfTb>80yuk1TlJ;%bi!SsU zV#a4PBP*hb9aPok?fuJqDzzazPn-^=lJzJ zeJv87BpfSzIFq4T&u^1xe@6Dp^3#j!t?3s`oX|-8YI#MJcw(R0f4p0GoxPWh#X2At zl|y*vgh<@>F^IZfpbOO!4IXu9 z;`S)wGnl3D6&J7PN260%_PwWh0$pD)SC55vF&EP?ce8)zL1LU; zv@y$0B>bsAH`%MMuq%M6lJqg1JNu?^EHo=`1QUvwjG$kyLdIa}N?DEZYua@|q2ytI zHO_8zcr$ZbPsMPQ{G(ZPa9FeJ@$$a8rH&!pD!Gq6mp7Uhp?3;=zQCf;Zux&a}A`2si5 zV~gle!VOy6V^~9rG2F!4eTeG^o$0*l@^PM5LVt|oH&1dKU{bX-FG)7v>b4sq^oxAU zJvWttK9jgseRAjR*!f@a@KH)oxl~12rfa#)gTm9A2X>}XmqB?|yFcfhjU8F|g>ctC zT}Mb+8p(;aKupdF$@v3`LP_f;5v?X)cm~W?Y?f@sYP95193yk!e5JM}T`jRSWe(IR zS0D4f+;lmb+aBEzF>IgS`7VmC8$0uJ(rzoxZ7ty-?z1vWa4WL^b1N)H4~mbo;PxNu zJ-_!qP5YuJJWnB~0=W^HG*5~JGdK@xZSs?4bCOgnjVnbNmVp1`&x;wE+joZ)Yb_DeUeILFl z7o4MfR~I9eRa*U%E&j`+b8h;2#aTaCl10i*v?cewwr>F6;5p>Dwjh=%IK>}oIvdC zk?WDE7&Uxiq!Wotu^jJ@`Gn0E2~01#2)(a_H0rI2@w~y}-+17BBnfErxLsz2aPOC!?R&cwY~9_gHQPKj>{x2{1o zE}KAB;HvXQkxpAPSP9HTuHCdO0e@scua``5`udKk(K@xiOr2!K$JUr#PzdvJNd<{O z9*%R1A|K%dgNWN^fMvy@klSXM)!}^paI0}?i|?kj?XY#kg>ue5r|MS||2h&YN}mms z7;!>rehz!qh`-LTVnc`^d0Jt`eUEO_T$(&@SqI-H8drHULbd%hQr=jHV3zA5SQ zthxMkY|_mBomte$NkH>59~BFq_fOS5dOf!VTu04ZuLMe-5oMNSJx4BfGvaif$Q&U* zuZv%|F+SfPS~*vexlv0=!RhTR`~Q9SdWEnnYY*n@;+`SC?C*~u#aDN}T=D7nfWsmN zq_^p{-Z~_(2RxOxuQvi%NbdzV^v==nBf9e>y+u4fe(8Io8!&R*NBF5o zm&hUu<(R$7mG8GUw^=MsIWXQcpss+6&L$8RxMK1ji&by1S=s>he(@-zViMqgoIuCs zv@Ms+W|@fRG$w=tJp^6$Ap}B|cv#@s_uMC$-WogDHJQLeu=FX z)=y00Qm|WA930{*&6>&^ZcPY0gh*^?V`^ZVR}HQHuEiD(hZjKTLwoW~Ri&3Ip4qre z>5wABY|cO@^GFIm^c%`!i)}0PrMfN-y`Zqr;Gy zKATC*CsCAb7$K>BKJv_AdHVhw2Av_`ZO*K4f_lggedb3iVdQE?0Z&ZVeYj!+6 zokKry&O{Kq8IeMH3arc8t+xM{FJt<;36vw$uSt!Hjj zxkODyh!bWg@!TZxmF0VG)VJ?>`$?Cqa{pu}lowq*N3Dw7PTN^{{u0h?-gobCc;8il z!3_0u+nEj@AN6+6Cf?iq8cBB`jE%cF-+K$H8K~knpBC`XV^Yq*AdJ&l{Xl3Z#sOZS zV%4T2Nv5_9*K^_RR~y}5VoLJMH(-Qm^YjZbF(>8hB8l(R=lUGH7t;APKJ<`I zRe8rU(?)7s@Rsqy{htSntx-xZ>1(E~^>Fj5e}6N|KC2bA?ZhjAEnY=&1LwfUBf|~7 z(NFZ=o>vv)g!Q;Qqytvv2?;c+lAD7Gn?<>ivEKJLR9i%nqZxe0z|8#?vxLBXn;3`9 zBHrO;B8{pH7yO#Ym(CQK@U3Sv)5au6>51D2A6#G7r_w95M^4&2YbF4Jwm!hot*RrW zAvd&Rnsk4GwlgM_XRa7CUnhzz;x8agb!}n>kHvBSN|>WIc82UriB}GoLQ(*y&G)PpQxZQ$(o@IATMMj^UKGfkL!DX!RnOoE`%l3evbQ2S?!`t@ zyN)6V1m0IV=F?V{Q>9oR5MXquB6dJ!96$w@T@*-APsoA@OJ;iC!oka@TX|BT*zM;Cd0^cjpMtF2JF#Iol)x?NCLfShZ&%i3+Cpxjvz9EgfNY++DqDiTYlk<+K(qO>~W%CV9T&SVETyzF#hr7iX90EFiPOFP~$5RqOtARA30K z;H3iZZZ@EG2AKNrNF#7L5^dYB#nOebb)O+%6M=0rQdd5l*h5JSglT@CD6)yF98KZC z1CWD`aR5%dygRzVmLXPE*P5uO$0N^XNm`+DnY>uuu=L23Bp8AdMhN1SAVdmOz0DFe z(4!@Rf4_tlnsyH5*t3ng#Rh7ZTELqD3SKaFD?~R&i*PMUNgJ6pOC+kKNM5XlN%i#ae~*04WrTzM4hH7$=M$+jbm9 zKZ8Y!tq${-NV)}L*uvHMIuwXmybHsp@eDT& zxs}`122Q=PDsX?E41B!K&Kyg1w|NhIObXj+T*aU*+%s(*?^C$>d#cK;H?JIhC~Jm4 zEKcb`W#eiT@BJ`p8%(XZo(?1I!1BZ`>&Ct9G+N@0=_3etLf(_;BV?E;OO_~Bc)^pA zYvFy|KQ6~>p2%y!6bs|_v9-Re#T!5!@H>;M6Fw`)YrBNP`}6Znig`}vrAQJu+y){B zJ{D8RTvvKA(y1cNuA_@9Nc_lL_h-ZB{z?JvMGT0{uY|oI-07~e1AYU00UqZdb8SWo zzd*@z?D&yl$?Ot;p(G~aR|=A?BgEQXrKtDa_@F0p`oR-ZGEzkM7MC?i{M|sfT_|N8 znOj}6b4rHOS2D?NG%Ww*jBkYGr7EGTldWzWzYKfTF~a093T|NyFs8J!u+~V+1VQ*%I#Wz<9ig0fYM3w63_o?6@h?f0e2#p z+a5U*pT=P)|K|Ik=_5)vZzK_P19hfxEDYoP*x|x#?Siox@r%PHnqYjFkF;u4f;KG& z?4a)Z;0Xq(B1Z~y`7rR*xep$(t9Dxn@%NOUo1IBlJ`gf6n?|17iog(fH%i2jlfdA~ zeT)=Jl|tUwRBBL*dZCTx?CUtJSv>yFi*jvP4N5&Efso-es%nS)1mj&>pYSpUeNwDy zIp}gZaRUI_ZN%6_D*UVA_j{J~t27NMZjm`~oXx9w6IsM!44=o~D0urbu1&}tp@Ln$ zb&?lFhENg1+c?ctt?49!f2FTuEol#G&gw5MzjC9> z(w8MJ15bnF(rMC0uj{?r`Y%_)hf_^O5yT2#h$aR+XFxZfW#mK%n2qxsqzU=XQ7#*w zWR9APwrm;t_}ft)lrD02x5mUilpDEkan>O+#a6bXhVpyk&EaX(B6FSeOKfC4kjktC zNb&kF`&8bFKjIjzi9Q7vf4+3HDFE5LC@mgU=mSU8E+-;Ag~G6ti5EjYPwIa=C zbe>w5f!m|e1o!h433>ULuqXQ~0@Yc;OPXf5RE@|?YSnp@1Z2}5n;0<_+T{;X8NC-u z>5QEkMJ(mV`2`G2|Kp-|JF*=V>-D1^UA23ae}Hr;Runh7I{xD7LBF-o8 zY33R9^o!A1sSq-CabMy@b`k-=*=Zd_`h^JCQX(iD zL?XF%I;HL#=e0KAFe0#OcU8D4tHUi~${n?qfUhO97GHY{+cWqSrx2MY4jG z&;m|!f0!%wr3?o&H!P9jIjS$Yq%gU+$+Yhq4?P!}6gR#{(FN;y?m8?2-fEPGA*6PA zKdz#67_Y9WtpLOW{_lAB+Wz`SnbC``&7q{BP>Kx7qt??%r`@SHU|AE<)Fj);HxciF zk4Dvq%B zd}%V^=E^&{8fS~woENM~fKdx*5L9xixkp7Y3b?n!_Q>b~qILsmPr0W`V+5ktKKA%NrGYaXSE}!lwRYo%(6WkaR zE*%OC;}m-aF1eU{!dXgfGE7PPV$gg-8<7d?+yIN!;Nw;h?3}d>Ne4n*rGqL~0 zDMLFlmG-;?yh;V02=m%b9N}o+@z~IV1m(X<`J2}@m9bo~Fo-W-5qci`g%NzYl)(#J zXt2fd+=qyC-kVMUs0+2Yp}oC#HKJQ7;&OdZ6Swgoy7@{wpW9vNw8=!hwFfBv)P4+8 z5i_)_z1DFzA8juZoVEA3OpHb)yC`|6$%W4JoEQwkD0qz@nn3;tcwS3C0-kzUN|id= z>^6&(3CG_Tjk5z7p&1piYPALh3cq##GK3%byfaBxxY`>LO8F_^SLVa;2Tpf+`gWID z9Fu}v-2jBg6Y>V{`y=^6QwvSY2bbSIujE0U+TWtZG-b|_YM+;4%g{l4@;xfleDdcl zr0EneWu2jL&P!OT^X3IMW>l3BPX~v1`LaNZte!om`twB>4p_kyp97Z7MNCy_Yj!%X z6Ma#C|5)=PKf?_8v{?fVK3r&X(d7_B%SHr8djceq6|vVXX0e1|{6L&2|HGmr4t#Ld zy-;8lq3LAc!SIIF=6>HP(?a_RH#e;G)YB0r+k6$X3uOSx%vR|;fEfzOfmpIjzoj;h zh8qqN2rLGjG;~fYleu5F?i7(#Te%f(@@5#@;dx1zxRjcTF( zASTo2m-imRe$L~G9za$Yw$uy{FPMLAJAB$;y zF}C@&pA-}OF;b||o$f(lJOq<9xeLyZ3tyLicXPc@sRApY-U{XVSQt`*&z1X1Mr-gOA2amBlt zZ=!?1aCc#b`(cdUc{c=skltbK{mnt@lt1C9c-$3Kd1bun*sItkfp~QjF&hi?6fcY; zqPz1MU1Ks{7WvJxnvvKch7K+F^IfvXI+Qf6U|u!yS(0(S=jb=0G-bpV>jRCL>r+u` zC1msEMgL%{S|q+#3I)S9bG17(*F(CI2|b5-0I6Z{_ZOyc^D%yE zf;`89TUJhp43#+CM{e&dVzb+6|B1Zamul{$FGjx=%q!|xoxp{myY3^q-I&L;9D+Sc z`w9&e{fHc2Y=U01>U~XVF&c=K-OLHskZg1BQ7BQ86Eip`g?;WIM6wP-P6E_j43Bk} z;Z)%aDtK5ePJeu@*6W0LUja4{o`Cw}E$|b`v-nn`fb<;RzUNKY_?4wpU1jTZ;r7MJ zwdeV1nMIj8@fbQz=_Hn=8pj8^aL z`$uR6e(JaH>nZRW{qkxCr@1wz%(dKTeQhay*esOys$I6Q_)pbwvM6NMYsl!x zAgwbt$lH83b-b$|Yt96lD-^gg#1MXWky^*ou8`kfK|vdah~p2*Q*OT??`QX9JwTKx zEjMl`wtQ_9qgyMIZreI8yFKuKA49={B6q5%1DWV7`reG@NSpH>Ed|ktxXsw-W>SC5 z-VdQ|Ja|4X?19}#4GOu1)BunwEW6W)cAOUw*o9Wt@jiyV;RAj0Tgp#9kM$SOg&@jK z9?+z|uHSn#K>5S5;>Ssu1?NNb`->!95n#sLwCW!+iBv4$b2rY7^wNcp-|ofymS~^j z00o*YD^Ejtv^cHq@{{CUbw2jEO|D$_&FuUj`=CflXS`jxv;LZ1?Z@ zpN0FXw`I2u$6~ny+W4>L86m)Hvj>HFob{ATHN8UquQI1FiEFBqhR3^gM2o>Ae*Pj{_ zzIHrJpdsnGgUk`m znY&P;>e$@%xWM2L(yseu-tgH~kFNA1MO3h$$}QfXNAhvBsl-v`yf=bmb0{1gOOv#- zpaQIMz*nBDCgH58_V%KA8<-lQGfuY|7s`>6zMulM0Su2<8%O*Pt;!9nIQ(o9v0_`_ zt&L@9hlb}{H`H?j7mG4FO_4}G_KEc(`RT*rZGUa0QQo-g3K+{#+moSWb9GX?nc=z%V;fo0I@M8|4?G+-LIB@z@ zop4Sl`#Z#Hfp;K+*PidPd9r3J%gjZw308;_h2M{B2nhRc&i;B9 z8h|3qa2rNI8}hB~m$jz(R~~~hdrgjoo1Wc=*64S*TQ|f*Px*OVLaY`r?V;GMC>^@s zRJ8Zu3AtJ8?ov1!s`0b*x~B}ILX|44=D4r+JA5{dIA!O;dx#t6ftti|Qk>$s1D4Kq zfoRPhfX+-N&)YBKlP;wkmq?6%(CI%SORNL!VTAS-)laXOR29>ez54JI%R{~z{DiJw znllx*61Rc~SV|6$(Di2gDc0>c3GepBfef&X9FzY>CiJR1jghESd1}V^=X*)8)4YEY zVhc4ahjH_4mNzWNS}$-9q;cgNNF-6A*+aPOqN@i6*vDHjmC0cRfcW4*_`jY8cjg5; zJ2BsbXQ1}o>$l;UB!y`PUQu5qbHz0;5b&I@SZ=gB;$*5ZZRM&aZ`XnqhhEL^z?iPz zUxvrin2KKa_*hKWx`efi#vDzpWM`{|xo&_A0*B?l ztM|X9Q>W&#`Y}HQ9^QOC+=vs6-i0Gm%p;ue&G4vD#zF}g<)iTbDt)CV5A#AWjW7Ud zgs(!A!(l}!HC-yE1R!;|?A~dW>Cys@UJ+C$gKRL0^M$QaF-m!vf4>`}p7W|z0R-

#$-0(XzTA>45HUY?|q2ON4j4GjJJeRq}KD*BOOOT3oVs6K!EY@(ocsP8s zffjSr(SZ5&*A?kcn-F-BW}5iRWwh%%M;Z*3Y9xd{J`Y+LeZXqx&+_}t9T2VWV$B=K zjS&i_tPc-u8Wlw)|88^s-3X@3g28GJ32~c3rUt6{hakj&9$NHSwAuRzrLBuXC91un zi_Enc|CUGf&f!(>rg38HnC2rJ@rZDl@*mJ}_97!DmEgIi^>b~htr+B9 z$TRl(;Z_@rW-iG@g!kxsD8 zuTiMZVi|B_Ug#XZmC3N|YQtI)vCNB!zY~14dKONv_PwhaYq~RqH8ihK9G?^ClME)S zxE^(^=hm0l-@*o{0&h71scE3<8ia*e3qc`;%IpcpqEQDcXr&$(cJ4eGA`wmI_iBFJ z!hJF+EAR#|z?;CVEXlI6ZTb^iB2oa2`k+)E12#XegEzcOx1nm>!CChcumnxLw*SV5 z6Y6KD3?H3;-f4zTHx-=0gzdI6iOD5AC9HMpmdHM13BnOmWlSFf>cI|U7Sjwb{X%g^b zg4w9kbj`$%(%nm(We5iqWkb&nEX$4Op!eiBApw*qx|jxoShzB0s`;XeWn`Q3;g_pD zgjty_F&l4M&I?F<}^_@=;eUUbT@N6DO4z?T!X>agPXD#1ztQ@W7+27iWzq zjnzCBa8qvptC~=j;r0UuhuH{#>s*Rl&%Y1lh=v0pPGodxWxK`=fGIOQPeQeP?$4QR z7CCofZBiAKgqzqKSMm1e*_?l!=(LG2YHfIkH(i_17(a!d@bJE~cc^=xdsI?d77!&5 z6eSzYd$BX`Q8@Hpf5F+Qo9hZL<(L1Byx!2sA^lH;<{*jBm_ccCVgxQK{>pI7Nd4xg zCu?%jidSLlU83*pt)j_ca(;{dqXba8wsKYCOP@2gD-MpSK=ov{9tFi+q!3{QG&K92-uu^MRa zs`Q&2Ul?c!W%9n5`g}dZ9Lax)fhRKtFA!3X$3|^lc@H=2yAPI{*`^jkrs>8f zyFs-cFdfj?zME*5-00t;Nj6H+2Gq~%-_#GnAL{1=z}}YIG`xO>*6Z6gqL;k@7 zz(Ft1>-Hk!WXL!(U>fK%-v<5{>J)%4*XHg#*Jz)s)K!6>SO&WRq$&sML+XfGPZ-vt zglYn1+yJ78!dTgmX1F{k<@$7JVfo|2OMsWp*;mBADZr7&4Jb z1n!9FH0$F9eq9MutCSVtxjr_sB}0!?YzCjlU^?gA)#%AiVdfxJVHydIN?Ejq3#HD~ zH^^rQ(O_98d2R4*yf{AuCMwa>-+%o4iG2}80ohs@Ag8$Ar1kkFhfJQwNAHyZ!nzmYxi;p`{j zL|SzcTz0GIB(TyD>=dR0PEWEggbjkh>5 zd1}0EJJm#qa)GLrUB@NqI%y+o^&Sq6Ngv$}^?!v_6iT2wb4}&QCIsgHsq9O@sa(7F zBig29Ol2ly2pKmr6J?&0kPsEMjUn@J2$^TQ%u0i?l6jtG3Q1(1iI5D%f4y|h`Of$I z&i9>v*S=h*-CO5*pJzR5xYxbbVkM}E)N<$kaW3IcYV9i(*Qwub^BMtBD(l~fQZ1+7 zhh~Q*OszDZ*2t@R0vfnyPWOOW2<#rdOy{M+i+)FrT1+-a60WwfH(0x~mI%FF6eNh} zD<-`b#%Crb$T1t;v=D!hcaT*c>L&IxiAJdmf9B1R#8c~e!|ih;?HN>91|5@{$bjg_ znkMRJ@Sl?ccz)j6)U_^pgZhz~y3m78KJoLa&MxR~JH7=>C8jdryeaTL&0!?yr#CRu zSnB8cd%{(q_NAyM30=JLF6s4h*+Ooadgadzqb(BDSFtm&I?RrN3HjV$-@Njx=q{<- zKtPQIGD%nWA%n3xJyY}_OGKiTisL`JWPkbPNgFY)h3n>(iAtPk$?S4pR$>mxv~sK_ zkv=`R1+M=>gRzLZ=?wV^!u@28;O}&(TG^l?JkUWvcmZ4{3TDu^!Ei#$)ybBgN{{=o zmmIfNr&bq>I=SZHb}EOV#|h@%KMB9;@vX0w6Q<{VXnkupkqJr2#Lp+^cdpW2eT%~S zd+Y@B7#*L}9xi36`z>*qu0Cj!-!AjkP43A3DD$q5+h0?+fit%Tb*5W-!nbZPWR0#T ztU?+SyY7z^kX&|x#N^a|{lo#g5boDUMf!7XW04mhn|Ns;*@yQz``HK3kNME3QNU?l z*U9tRFCq$s0%5IKP*0JShGDr&foh$Zkk@gnhD+Po;${u$pQm5n{-FPD?6l*RRWnQ) zpR(w7w-O7tL2&Ogww}`0%36`{O^%eAba80p&ly&Lq;UT60{>bjBfP}9W&y+h1jDs4 zZmO>MO2^gRo?+XXxKx!ntSRdFU2ZY@CM z;_!%M9hOa#oI0dk{R});+~2C7e$h0!@F1jvy{JBGUn6xL+$22~r4BuT7NN4Itd2q5 z%yBp46e?%j&)u#Bju8Up&2eH_HnkW8TsTr)pB=lp7fxgA| zrh%9^2M}L`O6t&iaZo3WAOBet#1xu`NES%Ib*?_cS2U@JN;~j=bl`vVn^^bhN{99< zqxV>J_!cy!pEAy^|IT!BBXW<3GM-@UUw>+f?FiG|+DEx9v zzvw=b@Va_gA={)s4U`;wC6(bTh3FP>f;spN?bUvg?MXW^I@4#-X;RMr@pwL$-OC$t zoq4o6>UZoCq@)+Y_(nLt0`<))@%F%~j$Q^`dO0u+uuPKB&At}Kfh0woZAPX8~Y}j!sB5eyV`FgC(}Eaet@$) zHJyAnE|AglGBk&Zd=>q>Npwe{n6;w|BY=3i|Dodbd1+L93Ffy${!$kw*PvT=Rw3ZW z=FzE4Q_nu;W8&Vb&WEP%e+CULZ0h&{_Bhjz->UP(e?8Az3cJI0P4xD4M@1JGx)7l@ zZw!qTbC^E8befgGk6Gf83ICM~fhN0oS>>ypS7*Xv;z=dFa=~m(br8sbGbF2wN~2U; zoe+(Q_T177Jl}5bGHImol(9G5QJe;FYU3(M5(lhDuBKm#$w^KLDL;0b=S&p6`#3|Z`?0-0r)Dg|bjQ7R*$RXo?*haCe1kQg+d{yBRfQUs zdt~-Yr|o=FR9RFvNwYmI><`(2LCfrkOqE7z8IVKtgw}ua?R0-SBDHM!j&s^MKmnA+ zo&8w!q#U@30?<4+_PXPAd!qe2;SbHgKg;Q0bJVuh5KF5U2dWtI(Y%aD^s#bPt_MJl z)MgQ7Z#?9~bQP~~zwR*&b$??qvczHL67Y!eF|OWkb_mVy=e2Z7O6(8`v_GalIbXyo zFR&iwZKC3No)}J@8?j)J)m4Gq*0&?qX8TU;!R*qrlpN|Y5RaWX4r5?*hM<|3cB$h{ zrHpjRDFU5Tt}ReY_|^Fx5Kj|^t_rA_%$`M(w}4X3QyH*piZ=7iR)J|4;! zyh{_`x`deHM0m#1{x~brOFpm6jv|{;^(UJlo>5`$r0JyhU%4#K$#y9Qqy6rKxI21w zj6+(|Q)qU53+$1byi66f6llSy6b9+4yzCzkmXz)2n0#^BGEQDyHNyS!MZ>jZg4%yD z#*i$tTIw{b%<$xO=j=pT`m`{r!aCOXKZ5oiuLZ1SMa-x`nphp{&z`w3URSd;5p#@E z^7;b<9n|mmFsQqyO%XrVH@7^5r)GYCm$v1>nD`M2%snqCeavI(&2IN)!r$;At!)>t zE@}Oisd`0@ek{qBS;AZ3-7#_1_mo6CYf#oHv^rAhQHF@<_V;Bz%hnh>iFl$)sja!^ zhyK814;T;gssH%RLbK!;9$b-Q?~QcS&;V@0Z+mR0l3>R@&9AG3H=q5NqWD8&{Kx+| zq2Wy`H=)>!^B@28-@o*Bz;z@Ow`xfGCDjMA{dYgFoyQR;cu2#H`nw1I`h5psmu!M> zA9NSwMM{PchAj||Ex?lWz_j-n3*xuapcbDFyh}JI|1}w+Cal-)7QSlz&n_hSpI5#b z+@2_?1Oufxz#tZ$-yHR`A216nx%)yU55^e!j~2Ony{>p@ZSz+>7S$Q@3Nv{Q;DM;m zeJaj#V<@y>=ZD5CC()Q|stpK}R{!Od*sbgR14`Gxu=eDcO1thX6KJe)1dn+$VXP%TBu_)f()eZUV>5TD#09&LO5!Gt!Vo9cq-P_xb8tD8XXNXFxb z=6Z4LYDrW__!*TF9~!?Cn@*`7Y7JRylQtad__#YgPPb-oC&2NZ=<;n0VcDJ1F`sW# zFHr9A?-haxd(GfIVrBKnN#9zx`Dpm8tQRc9e(>g#7IG!Jv`zo4w^KM3o6t0o6BM^r zRrf+~4y)JR&d5|NcOD5bgMeFg_*k+Ktx?=U9iHN_$La|H<|({ z$kf}%Vh-8ccGct9Y8b-KMq}z;p!-bs;#rFKva_M|p5E#S{IZ|#FIRZb$Z$aQ*w_o4 z{wSc;0U~`i<};W8C;Ms~6qI!B@xZt7Q1K9%`+Qg6TMGZsqnZ#G5aq$*tOT zI|=Pv3r}9Q*QkEkZi8wZDskw$U(M?hH!kwvxt=I?Fcd9z4 zMQLU(-?6OiXT=+;%&W^yzT=7vh`7ai%2P=a)s$mp-B%SjxZz7|ABwtpVq~UCIxb*I2v9Lf=dafBjimzqx zir9$&d;8@=($%3sD>JXhrBmb^Gn|f}&PL};>dY~zuKG)St*7iGrYw87Xb*)%&(EM2 z1uX2;Q=$3=E@)G1;WU_rzFM?19;_>e;nn2?HQkq2^u!2(%3+*vsPM!$Xms7TMn=ni z4J~^2GnP~?kZz30{ac@b{8~oaSia;-=O+4lXHY##j2@FW%WT>uaPQc%EBICJZZG)G z3YLuq&OifHjuelL#C!DSDx8FGV-uIEz3Ui=ZFqLcG1m zTkjggj`Ji2l!)FL`C#@zt@wP@+z}C?dkg()md6DuEZPp!c8{&pu;=mr)OTt#hnVb^ z&Tef0G5&&r8PA=>YM(GCj7{_FHW+~ZjD;wk*Z9;a1@*>d;qK;Qcly#^78c_75f@|nnhaDo_XeV2GUcF9AuDk->k&B zro@#V0~In{4Gj&u$9U=`n=jmWbNFy%8Bzx47WmoegYm`pVZWU)X8LWqK6jdq*#D_6 z2evt6jT^lxr-A(ex`8;Zy><|I+aJvO-`Tj-FEj$2qI;Yo^G(&)M%st^k8E6-f+=Xd z3OJ7?d)19Iwf~0l)aghT)d-XLf_4RvRyR9$4T>YaRD3saY7d`dqh(L=+|DUn{`!eT zX^knJqN}GD+J+ddB5CUeSNgNS$ zIf#_IDVXXalO5+{DLqBW%Ghp35(5 zVoZh=X^c;sdTwPgRp4uTnc6i_8y2?_S1?CBeCNN_1yQe4c8>9iIThz{x5>*ZugmA? zj4obcqD`#XXhX_AnPth8u6CaIN+#-F4t8Pq zN;k~DTohSe;9s~Qa(?{VVOmktF@_g~mzgA@Ti9qB&^ozL%Xv$Uu#_U(M)c!~Oz_Qt zLV&q-$g^O`i4Lt+CwhWpYh-WNs?hCerBxl?hq0g-h!Asxg))r--c#+-WUFC8Zec$s zVm}@1tC};1YVC$ggLO zvTlZAM29o6{i;fdiKe-?EzAYSnvQ!qZY+;@nSRgb zBqlz-k9P^*o-X}_KkO+YpmKy{CaStozVve3kAr(YrNNN+Wm3TeYnpgwdinm7suFb5 zDo3@)Xx z6l9;~X<-Tzwehe=^di2}y!vFr7Bz`$$-Yh`Nerl<`BjPAw&0;!WVoq>`Y1gnTX2!iCPFE>Nq{~sV zs}Bb$Wd{_qB$%%LY5_4W^_AjTf|BAxhv=9tD#+^Ip?{{z_e=i14IaqfyERqS+D%0M z9Z>IQk<$&d7x52=kgDsUpXQZJpNehtXA|^+ zn#t#fyEEQ%n=4I#ohPT%ODJLMZ>Gj67NLC12o>bo61q$F!%iP^93G#fPU7Zlc(b5? zqs1*?xUcHxMshj8Fk5p%%jpE@0_cF^o56$Z=u}>LA+n>>dF@1VUw*eTsoX(yh%oh~ z%%pgEKJ9HfdJKIy!}hLswHwDGIy1cfh9kDd%HFQ-@B|%{Y>AiR&Mc0hPf;l(n7E7u z6uPe6m|!J1$55Nv*&(LV*cZ^?JW3hhap>~Q--u5DrP;zAjS-eTu_Yee)mW^R^W zx4KTzc;GtSbvbc;2Cu_FHc6`-y}L8A_sk)K>|J%#<3lFd8@yQXO`7YDNxvX11&#Hr z_qjp%CLNi~7YA%S>hM&49qFfg_}YvKkLRmvRwQ$L*Ir`s1?YS+&SU2#v10tLs}|Ie z_2Z8Z>4cV=Z+Pu}_wp5Tclk0Fh)Vw)F@D_2eARe7lui4=II0EeVEb_9(0(iP&-3(` zr`mYS+6`G>#OmNC+OTI*G#qQSO7YPDX5O8yc*{>VMammPtc{VZP=G$9HSc^ z^v<+xXO9iUp^Mx%SH{k55cTUU#zb{wk(Vdkajg$$QsumGPNew!N~P3~l{&q7y&wJc zC;gS>?}J~P^KFEms#rBYlA)@T!F4jygY&|eg5nWQn=av!x34>Ech5Vuu`YJ%%)T*V zH@gqEDPf#2a9HS=u2A3rD|AOn?tM zbu!@#e=CeeN$YrC$J{kA9K1&RwJv}Sjo0&0)y3+pN%>{Px=;9F_6ok&C#ap%$3NPn z1X5tN0?Ih3LfsYZR`B$Q67#eLWX|i3ax!JKSs=PWLDS2*?qxZ;>PKu!^vG4L z`EKjeuH`S&9!K@fiVKETs_z=C5UiEP&@z0btDR=5-yB*^5VQ(w9SYFRfC?EMTJ3@y zQPt$tVFB0mZY8~Z5;_aLXS!NBR=|yx6`M`<3-zQc`?YNuWRIWRN%UVzyo5^Y4o5pb z-iIU(fQi5VIYgf7*G13Q&wh}Z`5!+sAf~f^wK?GWdnV_Y^~l2CRT zSopa4%*DT7?Jt}K9;l{=V08HFb=!Zm68@w^^!^t@!XI(`*9HGdPvP9d1H7^+i5nMzYMh3_ z;|pkv>kNIo-N#_Bl7s?8?1suLVWzDCT4mB zXdpQ^JOeMKos}X zYq<)H|NMkWAf0{CDcanJd?I|ID7IL6uD);GOKHoZ!;aCxO!Wy9ZFj4Fvcp?FLCU^F zYzH&7BgaRAdO~KfVRuW<$@YV569uzfI8mQGcb1;4<8(iZaBwW>bgxhJfHo50^EA%a z9x_N?X^}84{SDIDngGzVAmQ#Ql?u0SF*>9Z5L~*qdmv3Hz$__QY%G3Ug^_J44^IjA z4v@1UL)Dskhs#}ykP?xW-LFlI1|vS5An&J?5Nc#0IdZ;GBFGNRN_7z+*9XnPe_!oDdPcdgm-P#bmCga7Gagvr z24AH-@1+f$KVV9GnUI0hh6X$(fO_Z=>G5c%g=3_c^(+NYW*>5m^)B@}bciX5QJZ>v z)0-mkJ%^NTa;y`oW~(Nqr+*t|s!jC4=+k?wch7gi{mi*NBu)^ie|TaS+{a1Az0Ib| z9g(}A&(|bU^SPtTM(M6rxV@&sRO6g8y*pg0r!GEsdJA4D#+=yR=kRg^jVTrS6;jH4 zLdixX#1P8-ih3fU+U2=O8VYklt}X~yCWu-;(5;k zpcdyi+r^yaw*q9U2*~Q0h+T*KcXet-UR<+zbTV2)zckocb2R9J@z7zX=X%ex*GHl9 zAqLPbshXR_984BOO(NSq29z!yUmIxb5s-|K1Di_M7_k6|)syvlXZKHs{f0)-uRe7p zWtJx#=v)HOxh%w&U*%ZqnDz8z3ygO+s7FC|M<$gJxvmYu&j(}<4;uJ*S`;`W;hm6u zN*ECzEhB=5J!NEl9|omy$+ht!rT&-9#eg1EG8v_^@w18^Cot&M-tPA*uEADbbo^4U zj)tE41$6glxx9}cdB=0e=G0?{r~75!n$;bddLhq97V8XG@!7^bK9^iZFipuaxHgEZy5Z=kq=02(B3~yLFv|w2`2x;N5e$X7GsM=ZRM_Oy@s9` z0v4wy#w&Nxa$~Cg8Sk8*4UTYxFkzu%hM@C8d_yPT266v6gCKUD3q!JNjCUN6S` ziv_I@jO)@49T?y$$b4x9idN#G zm(KI2%KTQ$`$nBW8fQ>95}#*K_f-!6#7&)my^<#K{q4{Fwf)?=hEv;ObsK*2-lVmo z&AyVHOt|U~&!WGPJ)$8m4HIzY;Wemxoy{DqS48ozFOTQD_u z3?<1NFAdM-)XLU)KQgT(NEm2oB?;bWSMIuwR$-<@Pu}W(adOQA(&M_0DPizP*4ulp zex%>U4Wv((AHx*sJRBsgMJQ5YW8*4tA0hjoSE`9l1_leYLknO=y#v*IAm;ibHPF!f z%hf3+1>KvaxJm-rZN4Z+ss?8=0K<&4-Z^QL*%Abb(ltW0XlAs^<-h~M#r!F_-Pr;^ zd>X$*BVsGFZ)NcHCX-@?nQxlnPuA4mnG6L_N=&}(w~I`|I8Pe;q2BgI2W==X#+$j8 z_cNid$T5jUe(IwqOh;vWSvd`f+5uk4nUzF4+RTI*p_s9;vok7u6{nT&QX7w+_dR?x zM=d(*gkn82%lq^;0DZH1LdMUR^uIKEp0_Bas6=?d)NfWfl-_E1>_>&W7(t{+5rEHJ z>Ew}4-S~47ks`05`_%l^#!cTdq6#PG(F9AnkCiKet!p-YsZxV@LgS9o`FG)GN~<|< zTo-_ZYYfXJ@)@HzEsh}&03S1o&3a%?Ps42kHH0_l#xzh#5E~`%SDBRMN>0EQ zezG>5n#ifUzj+bdV(GcH&-g0UIRycNeWNnLyg78H)`Euh%(=GEXpINxDobt;?h%Z= z5JkI_%^g7z2OFWr^bCx%Sl*Bg2MKPBgEV3&*d55yO)-}hX(Y}*@z}lYn1UfSfoPB7 zi`f&DVtvw5sKT?CV7^ad?*)d`;CLveEJdjWYh@ZVB)X&hj^$`)5O4eTKDVYZf53O5 z4baLbQ%wG>)TDi?_yYLER4cy?k@qFMIPE}I%W11*m0cF^@#5^RzxuUMq#Ci5as34} zxSZ!vZEobn`0qiIA`&PmjcBsSJ5;6KR2i81bSCkQJg=Y6?R6U^h{)}TtOV(zlxy1L z_A{ttp8qOzM0w-*W2ltj0SC_3msZqQ4Z zF5z@Z@{`sQo1@r94k_ICl_+dT5UB^)%RY2u={mSWnllU+Xe55}(gi68w*Je06q;72 zgGUf7qPLk6Nym)%oEGxl8`MkOvucF|a=C_V9cOY4E!Sekgk@P|P-YRCHI-B(KJK(e za~(|nb=lCs>KvyEhgwo*j}VI+aai^2b*1l$5(G{iOpXgoj&4WNmarZ_zo>!fpFG*ykXV`mj4&1= z?Up_R(?>a+p8I~zX);_m{QZ~hLlV?zRQ1N8xuwuCHevV3rj=Jz6f*ZnEg$uj#woyo>Wo`%~ox4u(nBvdkjG>xvsiS(^<<#WNFsgmfV zMc=g(W2zw|gyFkJV4?DY#8i3uH-UNXO~wvbX>os@Er*IfL*d!KrbO z8`MR&UweL`B! zY?s$U^*7hgnv)lm?-D7ERDA!;4Q{RmuEQ&^KK~6zJTLg zH^C!!zJIbjM`MeL71CX721&v3N$7@z?k?R z!vv8pSM%&PZeII!o1j9Vi{GLKAlThjao!>7*c@xs+N0?BkM& zFo_se;%>8`MufnLl#h#Lq_Yw%g^+s$7LARj`anyNOJhQQegqw-6~aEUfqicDeghGi zr!c94d~Kxv&S1B5x1TGtHH=xK>?i`Z9w$dXVx_THzmm!+oF8A5M(63jxSXc_uu)<{ zJBPlbPu@){vptj#fpzV-YifwB7~f7vp^3>CGgt}i&eGio60hH5wI>V9L((4|;F3G( zn-)sJ3|JFrTV*ySBOk-8oq4?+lkc=NsCTYVB9;-ojGsT$eB$y%QU`j2|O{T)GFkMAFW^8S@B~X1 zsXv0S`l^^z)z);fN6y6}+vQ;H+z8RnF7jfO~0_C{=qSaaDXLi5Rac2#~kpNZ$8s@|BYgR*M5~B`-l+G?Uf1M)3S1fLs#*ANp0! z&^(_lS8@I2lzsOwwQJvrnbM!RX`_v6#ZE<1G2Y)9);HpbYI;XL&g$^`2g zdC4cFx8N^}V0o4Eqx;&QxRp1ay#`_kpAX$OT$KQ7aLD=Pg&1%P)Grn=z=2%BU7P8Q z2g7XyfR&Du2t82;7SNaEA0vA|Q=lb@e#o^Gk8YaLMaMy;@ zYX>xy@vKct;zgFYzqh;K6DBCbMpI@rN+AyM|NO|rfxc{~pyOlRk4S!p6aNmPq(p9V zdhdYM-#ze`@0+9GZ4G@VEPt)^uWXxt|MD6O;G=3Wr*>5Ly{-TLunevtoGHHwraW~2 z#K9E&*N^IHfNCFTo2MM0W&izQWhNB>NN*5^#Uoud|L4d10b+BsZY>J_gNMOA0%y9G zr{=4`U-s(ncAh^H_K^M3Lyvz1cl+=l6ec#b$%TKkhwR9`P{=9h{P(l?kDDLC1_xAx z*VOhucJJUIsuf@llgs=1Ir!HKPp|A9awu*L6!Jf5aR`20R8&{UmAmHq{{We4 B+UNiP literal 0 HcmV?d00001 diff --git a/blogs/deepspeed-fastgen/2024-01-19/assets/images/th_lat_curve_phi-2_tp1.png b/blogs/deepspeed-fastgen/2024-01-19/assets/images/th_lat_curve_phi-2_tp1.png new file mode 100644 index 0000000000000000000000000000000000000000..7e92417a64fe7b36c70be4bc21a03cae75fffe7c GIT binary patch literal 1255169 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 $+konl0(A6Q?mXZ?ZShzbPM1 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 Sl*_Sh!$ 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�lvVQ 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 z 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

M`~_+2OU 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

`Ri|JbUG7Nx5LVNCeezAY}d2L4Hc1S+)dcNOL zR|)@ik$tBBxXue(nVbNy$^#%#G)MlNW{eV`5l=Ia~Yr%FDoTwz#X_g_@Wi^JVaU?)7EJ3Uchp+_YMvk_tW;1aGGd& zKflSjTmzbnn~vSYv~qwH93V}L#@Tdi;D7XC@A@b}6p1nK^N?Je@^b>)&iiM7D7a*q zZRgli`ZGQ9<-QF58HI{AAeKA*^ES{nordZ0eBnG-LD0RunTbq=RB>RxO$|7|;_CSd zW77G=1r4V60l>aU&5$n(GO^k98D>Ly{3GSQP0$gFYVSxIF3CJ_;(D2Fc<;b}26KWY z0QmD2AIKT-^kzz3FaIPp*=$5F50miO?|oXjxD-MsK(slcB+22kHMlNeE8B>qI7cxQ zy#e2K_swr1_|_h%Rs^8c3I^b!w!7n`*nD5cemaqZpOoM{8d!}|_}mw74oEo&@wJd$ zQ)72P(5jEClf{L*1`nAWdKNoc{f=Ieu=S3msv`m9?Qj9obK&Fs!U|jy&wz( zFDh{h%l!>ns2qlrF86A+jVt;%hc^95s*mZzfY|2TyqVo}45lsY)eW6bWsC|bhgezG zmTv>>8537J%1M}ML6Tm_Wzl)gn8PJBzy@->IX;&`^2xQ#!sEo8QiqOvJCbSi3bKiJ z(IkI3--EVDrdB@Su4XSp-zo~UZBDEnkocO`yz~hh1kAMn`DN6E{~uJ@e`n8HLW@U| z*JAyd(FVoq1b!Q7;3~%$=)0M}C#q82e*Gfz1T0UoJg4QoKE12| zvm-yratYU5 z{Lp%;+W9es2{8Vx=+B^{tV{*GlcY6(QdlRNo221FckG_BJbsP(Pbd~>8|Nu2M6d<42WG2tN!;J2i@6d-1A`vfkQt0H zX%qf}v3Gx4hF^SeN|tr0_>WP$`3gOA_MNjcf7ch9a6sX2)a0%a*x5S(5@?i?w8)KI zsE&^HCBx0tnV{xNl(&oyU~u5R7=Vp(n_LkUN?xu^Ft7v)@Qs?z2)|?=&w?P~+x~Kk ziSuJF8ZTFc$=`eS@-X9R09hw^iCRGs;J4=^^vQyEM)4v^K?e|uwg<7_oP*`we7 zt5`CIh}p-zWGy@O(MFHr{B+VeO$hGwb@AOWrk^AHz1d}P>P74u{l_ilpOh3SuK>>( zsD+~Ap(aARP+!d~A#^QIGPYS>@q<_XH-dL#)XnRT-Z=++C#)iJ3TT;%;a=(mS}BxZ zsb`-6DvKm=>>S-3yfuKoPj(FD&H=0H4>COydh8%^ z@>gxGQB9o!`M*Fg3W4D)z-O@$aPnCFQC?}wN5vG-SK+Mbn>S~6vjIA5P^#8QVCpNa zNfyCzwY}`pdWB7OeSd5UD~Jfeuxep2gdn@+C(182&Q$*O&4peCD~2HwAed*%t8ykd z>8o&nv?3z!r&^&YOLi1%e~uaLbY(gi76i4(LD2jqi~uo>95HM$iTFYaAf=oUrw12h zZ(kp)ErvZM#1f1O9t)O9#yQSOEPk25H&)+aSziKtX-ou>DUC_aLy=s|7gr9VgRG}glY$u2(;!Ho`ajg111;f7cs~2A-=smwS^qSy2rm__4L!|>LmK!Up%tx&zvVDj`3a|_r`Ul~w10aom0sIS+1ynvco9tBI)J4`eKWjE` zrJPZF{rWXLk2BgAsd$t@fwr>{r31Uc0bsRT`gflv^t=cJXYIiywad6DGgY1|Q_=pM zdJyhHUT$v6F6^VUrkNRp@p`II{i%EsciXY9Vy+fDsJGnv%b!GB?68%9UvKf=9R8G- zD7t2}&(twbD=r62v+pJD*_6c!I9^fTaVG9`oMVNp21K*MY<^xXPqrjqm*4+`-D+co zshtFDA^TUON_uE?SI*P!#Y{=8giQ0?{21{+7M3z20#y7iY2TBr*hL%XA%6w5n)}pw z|1mT?K~p|?T?9q2pdcCMy#*ka1~TgLEUxGt$QIH#S6;DMHc71>hg=wbiL7_4kr2N; z+Z>_d?f8}0UoB&NI_R+C|K~eLQV+0yPLj`5AV@!WKn!Pqiug9paV{w$zPs5qAkp9v zCJ9P_z87pZ3h(mxOcLbt>66wba8k?|225f+EqY@}l`(P!g(Mk7w@F>w(>ufsP|Di#nTA;#*Ut@BPpM*IeP%BV zRw1!Y7~FOo!QrQnda^=9R7?Kc$^41glzW^tB@3jS%byW~Cb6Ljifd&a!1MzKL4+9B z1n-aPIh594Ou4?>dk(Y^FM$#~WKt{_{7k!$c~EbrFg}=XCor|UJqhQyyt|l$pRrR! znIdW%T>=N7s-z~GFDZ68!6{N$qOi?&vR@`to&r{;&y~!O_%Yo9I+jTsW5@>uU(99I z*$1#07-dLxW^0e)791M-CuO8}F$xB;CT(DliBlz%`ON)2S>MSM#^a@Vy$92q<-*vsB17N&T^I8oAfa|6h$s6?0!(N`7 zy^OSJfWr5SxDW7Kv$)o>JoKERVBU*osl z^2EDGJ~eIl^heFEN#)%IB-;;sy`z76GGz`pm3=&>@;{pg1Ja;yWSOR@ZYIl;!X@#R zl{K3pY{2tHUfQcfU+5)0P6pg;pknIPRw|0)WhSh`-q)a*5`&>GY{(vA^~zl7FxNK~Q9DZc+$PUWTc3NL2@zd-mP=!wvgfO${J@5*6jGKRGwS*==wi%aw>_t#}sy zalzAspf*bU_pH-KXRm)djZ8?L3j!7WK5k9ljeW~UaWy8*-=i3xeoOG8TN}s?^5W$a zpRYzNepK?X#*lxCYpUN5*Nn9Eprruuv)xB~E(d_W?(-ZqzwF7nL&rmc*7bm)j|Jci za9wQm@r8Lhy89g+H5P58wHS^lbgt#cT_ioyn`c26sc zlh&T;iN54~q==r;-_fJ#jblRmmT_Mu?}JIUOI(SLMS325H#jjdm{-$m5Ybnh{xW2m z!gZ@^Z)yZRO@~u#);3Dn;-$mVwN45d6CR79s(!(Eoeib=9pn4np`7r5%}q+{N#&2N zt>pbl<>VO|;pLX<_;7ewnUzLlkFu`VdHin|pN6{mOy^ea{g;>gA$lq}jer;R~4-PtQBG)}lHwjcq= z|D9ZrXHhzaL%VrvMV|j_x6nD9V)sGCjJNg`+xL8gFrEs3Glnu7^n90ERA~J*<4@$# zvP~+g`Q!#oMpAP@YF3KgG%)zt+3KX@Glolyd$x|(FypgiJdWMubz|m)eoeyIrmFWD zXiOs?s!ty7a#WZuW5gUA1AMC_60LWAeBI|1T3u36sIaaCt|DM0BzzyV#?A4q#~-wF zXElQ5erd6opzUu}idoV~T)WG=7$ZmT?!Rz1PkEQPE_{0~-LRVum(RJ2<=%X# zFLilGhLscbRa1B?(ORC`mcFc~$6~99;hwBt4&EWdqRiX)Xcp#>oS}Go^RN7jb-KJD zYk@xxW$qsN5xbJ=NW7xWyChO~`FqB6{&rITZNdHzivQSFE^3=6{>Mn1waWm z*)ww|1=*X^;fWCUM(mpKIUxjZ7p9t{Hd*?dzq(+}Q2eH7ZCi{C^VZI&=Ut0-M8pnG zlt8sVb^HMaa%7jQ%>?_xb!6wq6>X2waMGgL0)`r&aZkw%ST9!4p~FmP002U3OjGA+ z-Szxc!s>U)qPJqQ8oX|1N}e+3N0dr1z+{$HC==Hb(Vi$%Z%yF>xROVOjyeA92kW zr4f)l6f>FViD4hgh`T=p|AjGCXh1GtB(WcBM1uz zP_KwTpE_L0U~01xk9tssKvJ>&n->6;OYW|j>hC^7!4`IQK3Q%&(9~l(D1N4clE`#l zi`PH_-$-;~zkYRqU$JrktTJ~IL)kAaTt4tGN=~yW0>~k$$-7-4Kbe?dmMuy9$YgR@ z(C8HBijY9}kZ^(`9oo_$;EUFrILTuVn2k93LfC6nB>e7A9&-@Q{TPP~(|+Ew>)sZo zRq}iJa#`Z6N1_+LdoFG`)Huc+tAfzsf^}-s1t+(DHB}!2pt}Ek;?h|_aZA|z? zh6A@Kse;Mf!%lU*Qp$F`(QJM!&| zbdJbBj@EzFZgZ(GKym$*%HAsxLrpTl=0E3|PjJB8N#e2GPt059(+z_dg{V$T9;E8V z29Uh|BV`!pGepr^SB$ftY5Yy^#;R3r3cF=P;GPBXB|o1VUuqt?Iqrh|W+ku*AA6B; ze*tZ20X=n^mK%`B*Ck>>Q!zV`r^d>pQ8eSV^@%^O9o9gk1opAgJ%o2CPrE06y2VZc{eH&hbbG+>wmHRzhHr zHfX{|rm=c~V(|lz3*?W5j5K3_wAq07=A*aWw+7f-2W5cg#re7MjsYXab|B{kTVe#7 zgn2)RNl7AlEB1?CAWYoz{eGp7m#7-o4*&z`>$+*sva_IH*f%xqk=jKrDLnp(Q&NC+ z(|w+G%a{o}_vy&`mNZAYec_L}+`vA{fu z`Z3T|{JW}`MA_k?BiNC9v14dR>GD$i;1&=*0))=LN}P9NO`Du5nT;}lWS>NM075ZK zD2*dD_PSkw4`5i~NsPO8^X6V$0Ee~o{l|NgAVRwgq&Gg_CZJUthzkX6+SJTdOKJn3^cU=-YSi(q zt09uIZuCf z+{vR{%AN0%+8=z#x@x`}-4J^#wSbrlq34y)|Hn8k4pVBR-1DcEydRFLYK)4CgLU_@ zruuN+o6J}Rw97f%Yzt{R%1V7W>zbPOYJ6lQA*Vpdhn7$G ziP$?urat4GKY720gm&NE2|)|L1AW*3YdnXlCsjem7-8xRV4l->P5-a0%t3tko5>hp zSK@t>>OMdcaS)f@3I_#SJHxK_LZ1=yr*YyK?lBbxs?UiMI_I`K3gx!U@E8pGC#}E2 z@hKm*_GmU*^sm-Qu9!;$rZ>Uj!VNX$TKlm(_W?^>4Xr$Iz{jtx<6ElLQmjZ3R=Zthk3$f>#}vELfn z2l7mZYX8s%`&@$l0wbpSGul@jxJ^C}yp{b7s74{@$&~lzX*Su^Zy|>t7IzylBy@+F zEBy{dMQrLgzo}R}PQ}mIieQcFR(Y97*KjZ5;hGy~-ZS%^wOZ;nW#6u3uPx`2;$lEt zVtk8?oZLS%6ZGo!>)+LDuTX%Z&p>DL?^zEkBkpZT!U|VoSMpYD^cqTeEbY8MOJ@HF zAZEt+)&)!IzH$Ew8>yX**U+7GL=`FsvffX1#1We~Zje0hC&vSS`-F{y9C zc^i;`>F>y{8)3Y1VTb}DZN6(==?BM>Iy$~I+r_^Q8JO%T_f#x?yXl1FEcjiyn;ix? z{!j>wc<;T6{)PmFBQe+YFx~G4zj!!#eU#D#eb|3lG3(WuYv*rY{@Jy{R)6YK)XD3( zjo+`|F_~ItDhv$?*(wpm8DHoOl6Rj7=MI%$drIKP{|)bd)|G%n#>PM;=!2zYMU_m{ zT#`f)&SmeWVrD^L*IZ2X``r;ByE~y@Lo(<{m&TCT+}hQ#&J_|dbz?vR z+wku?1892|q=h00Kz9HLO8)IA|6AXgO}#P}J#*Vx4J8{Tz&LJUgfE|ORWg+NV4{e? z(;&Kio|yc%gWDedWZF$irQIF=xsGk69Dsa20#|#WYny{uV*@(=z}ZaJ2cJv9-%~la z^(TLPgQGkSsW%X=v-=f?A?4OzxkEJ^D`oBm3_F#XZH}UTj%yc3r4yu;nFIKIy+VZxFpolYvhNKqVpdp_O|8 zeo?RL(aJn*7Q4FFB70Rq3V&Aan@szx-YH5PX@Ys}0=Cvs@N z16KKYwk=P)4GMtSZNIZJSt`8+5tK3=^Lp`Z!@aX1S`#(Ab}!v>6tI*fDc;T2_Ad?z|TxN~SJ*tz7l}4Sdems)rb&FzAq|4?S_N!9v_# zg7$G{w>XbZIv=V!xfQ&DPh6ff9(+U)1}uW)~H1dvgD1g`umqW1xqR9ZUSFPt)dV3R6Wpb6HtD#E$Tk1C$l^94h(*b3SJF(_P_@i?HerLS(Gocq%*I2wAk7SR7en z#>*9~Q}{=VCY8hPLWy=5{X(ra3`jYxzs*`GJad7%5xk|!e=e@&4yszYJL2lYZ=BV* zO*_iaZVs?*G;OAHn)B4!y!1H?hnGpdZSvjKFSOVQwBFQhev+fhs^C4X0nM=kS(B(6 zK1=>mi4RgBw3%KVP^bx0e2Y0;VJhAl`Zat?>s#Q^W;h!DKF;FB?G-JegCSRzC0<;+ z#x0I69_zB zt6=%3s6GcC@}1!il_r&HOOnOCs_R|%D4|pAYPk_8=L_-uR&d)L%zZhuRS@Vo9-?#Y zC7Wm97z_eXZ+`Aelvum?&GAT^uS$!rj|*~Md_TioCGraMv|Yjnu%53pd#*mH_0tk_ zpP8%Po|8?n>i)erf#o%{0A2}t7Mm;^D2)#wAAbxia`S;c@A*&VjHeEIE4K~&tZN|U zz>Qsx@S92xseXqjnV^!d^{}-zg$#ADgR7_-rDG8PnmVlGzFmO%b@+^@zTu@dJjt)l zuq4s*_IK2btKWWc!;XdO0^W_&etFbezIg|l+k(_LUKW~yf_D<|l>74w^k}P`H8%VB z65qItE_46KfhnBRsx+%(k|$p|-IHi*c!o!2Vzo1le(;{I^(#X`T63K|$Kc@d0Soen zlO`krXLE~?6s-(rGZZ3dpBW-9!x^qL@hu2j;sCjSAmN(mNkHj-2SGya?jws2`C%GLT>sMYswQKqoN>XUoT3COz-6z{w>6QY!)7M3knD z*EzIFI@5nN_Orvx_NO}TB#+b{(p@F;`HS^zrXMs1;--OM(9N`)jG8Ax zZ5oIjCz4}LF|NAQ`AA{^F|ESP&UA%wdX-@zov#Bn!~@-}1Y?)FoNha9G3480*5qF` zW*+wZes!t0Y=V(vwo{tEf4jzaL5_3GM`kWmEiw3SB;5BlLZx zhCMpw@7we&U&Cr(>oTd@^)`4YiSQcdn(}xd?8e?MK!3u7Pk+Aq#0}G8A9)kb-AMEj z6m*!Sa3|+;dXj9L4qC1tY@Vjw{Z>|BVgmZ$c#k_~nL6nwbo_dSPL2@NbnUpcmY8EU zkUb=MW@i8XhGhTfrQ2m2%WXdmVSspp%TXq?=Endr=K7bb{mEi+_IXjAh~Z5|9CA2$ zm&xPYde%<@i_EDsxhH=X2;D~pfNLwx6qL_O3VasUFd$yya8W@cQdOI=H0@K_ur$=u zgQNF=M$lGgUzK9w{Mzr=N1V132vx3m#ki%vu zUKI~C$0hcuRsTKbn&PR{diF*(TFarjl!qb#sQ1q6wv>OLZL6eU??>s`QM_Ut+?0D^}4q8Ogbw=&nz{|MKwW2-ylQ+u-X~ zMFrd+Aj>kTL4RuRjC+8p^jn${-r~P>rOg|VxK)NhXM+hGM>uK)^_sI!lsSzlzAzL? zr7#%UjC6TjWu#0RU*|4yPPriJd@mUa_NK>}`<^AshX3yw zg(U^h{mQy&>m%03+l-r>T=^bt-$yM4v!z?8>jA?&`m%rE(93Z8x zaBwk zDj7|l$O}eLC74g+54i*R@Z{PLKCGQxu$KMWM*LhRXQ=V@t?(7CzfyxM7tY_SP!1K8 zIojp4bPbGcE4{DUZ0yhP_Ga9y{$#~d@)!k*xY6bV>+EN?vqo+|w200vD$V6aa%CtG z6*dH=I{VX7_m^uJ<-8xiGwAP%^ns7}#^;2QiVx#V%0Nqf=|K`Wjc?HJ#nE4|x4A|1 zaVweu&)f`;GwaWP9@u99r6r{;{zF`7K~JNN+hi&0_=SPrf5u4*@73Fzx=)BFw$#|$jiq%2OjEt;;ruqA^68>(wBI;mWRun?l_1kTAL z?d_>*dM*cH{Cf%(Z#?vcdHtUk?S+V0UG!!^K{=Ek)}|yYlPK5zzrTv(D+)vfTgSInlsi&3J`iL$~G(Yg&yc?~Ot=t6sNkPu=5w=~Y zua2VnB?Y?raR2#q{tr@I0~FKB+TD%omrXHMS&7=dH8c+x=?$vU*nTQr*YF>k6-?Y+ zCYt=h-w_}D`etrrT*hhv=HC+V&+B^g;9(b6-piz7Z@15@#L+`#%Z%%GS$zxkVinh_ z!XxQgLAa@iW?bK z4Ma+vL!?{P3%x3K*_C8^{@D=x?F!T${MW_Z6DP(N>a_~Dr^`45u`Jh}rQBD2qiZqy z9lmIFU1^c2n4x}zGm3*DvR?y_rpiW3yfOs6@<0 zXzq9lOg@1g#xS$8f z;W^$SV`*3|seNp3`dY8dTHjSzhI)}_QfwH^WzLjdU7SkbIR1G7G4ASAR`Bt~MswhY znQ93Uml&(Wvl{{1V_&9UGif~SN@o>)#9rauBECmdklYyeY9W?!6E+#f!z=<+tMCX2 z*#B6dv#0{sDSd@1k|P?Bzj7^3I85|tjonU9HJ72vldU7kcG-fbEYXtd{L$#$;^f$4 z;IQ3z)VDh%W?xsf{-zt6>ut)L!q4c8Xy?3*O&q#=c~qU7Mi>{gClwH^12YUQk+S-)a{(vq!10cUggTY+3po z!DK(!!Ed8GITO@4qjR^%y8fQ9ABS6h+-dycxF)-8LRMEPya05GXR+IIT|ccz`p%2o znoW}eI;7W4o7Ukao8MDDZV8BqSKZt z#0s5RF`dng^E6bgAZ<&rTUPGK!2Ars;4xPeB{`oj8((p}UBq|1o_eHSxenkfw@N@= z82t?Ut4y_W?2R>9v_Z?_=*cl+)zT1%lj_pQ94~gLNdbnesZyp=ZV%EwgQ?Ly#RI0#9=jPZMrPDIF9p3M(ZS?(-2W zZKi7eS@lc7xcvbniR^?IV}QX}plse~5p-Oo8^iD+KQQ+w7-RxTU%y~k_EhkM%M z9Y5W&?F5g|UYKZtG|{w@k%N)8!XB)~=6`J7KHHmG(hp2ldl{@hpEK+0H!+%VcLLfR z{+hz)m0Mk+y{i9VD%H>Zrg~xz+rQf61)cVrZNJc=?D?}7`lQa=ezPKSP9yzul7T%? zM_$nJ@NyLq9eHCYdiz(m6dpYudO^EWe}+%1zk-_snV8BN9^gl)^&8R;zsi%#4Jenz z(wEoZJs&S-jpul(>z01}o$dlRJ+y!LI}T_#Rw?0j!!H|;Ga9fxGQY?X?|BSF$KO2u z_n{K^&roEFEvV`N4U->SdsT{l;k167v+(5PqE6}k023}q+1I?bc|*>aHiqoy z*J{p$(`mjAII14_N2qP3J{|9S%DH^g#C`rl=-_?KS*Of75E=$D{z{9lY8nbPxF8zU zcE}=20V^h-%YxBNG};Bdrjv0p@f+ta4MVz_-E{g{8v2;`=4hZu?+qG=ExHvTr5?5K z_^esidk8s_>j8->O!v=_fjsWvVi{ zYEjKCeoVPHpLyU1>p%(HfVXst-h8LuS+}-?8FYW2X_2XQ{jgaTVPb);P8aSGkbG*F zhG)ezvi_!O;KV zvdjms<%NIDyQz*Ddoj&DW>*T-lYOA!pw1kYfKa^S-;7jd%%q$=q&$)Zi!vv2{mN2` z^a^g2`1DGPgLQ~w9;e))Q@MosKi``! zJ=?Ny+dS{n&wg4G?R#wuv1Hjnn+* zg&Y`v30d2$+Ys3LQFDs1Zyt<`E2Z2;$Mfqd=sYB}b#&5o@iieG;;ARPjO)&N(HBDM z%^5+<(TO6jWyAWu6@z3=-^;+}sfsm&eZB|2tT!vRNN|3YJjK@CO-lzY5U@vsv9wpSl2x!G}%%4R3Mg*J_ zB+8@K;Fc)jcAD%nQ}tD=LG9ir1~ZmVd(5!6K#5Ny@-_(D%Zc2d|BvaTPn<<)Bk}l+ zP|%MhMPaU%-N?ZPWI{>Z87<1Qn7BRlSH+y2S!1H0Y#U$5hou#)S4MY3mx*bN-~I}Uc6aiRV6elil9xM@pi}3One8nC zy%zUfJ-lxa!%!xb=pLw$@)p^GBq=0@E@E63>&*qhpeM!eRe)Vnljl;f4T9D!7}3C` z4UtUy{!o8*)pv&E+%KZtx%vE84W>}6>GC^~`RQf**6$1nq;z~bimi$g7pVsU0tF9b z{Xi|eV%+RE7}R~o$%HrE73H&`*8Eb?+)ysr*J^IUx>=yjcF2`4mRYBULfrcapv3&! zx&aFUV4i?_T_%aZKN(vv3REJ%Apg%F9I%wI&c1W1Y=YDm%sSdnv(=Me7*u_g@zc*I zx)Fz@yn+MAEwO9$`41o9p2=Q_5zw&@Sk=<)dUpq9fM6k{NLi=(qhV%sIzCBN7I`%W;7!2=A3t5!yY1>@2XkcPE-}r`4z#l3XAk^ zBtqtcIyRjI!bWwZ)ou;?3sB>^=3bjp#9c%6Z;fp6ibQ&aTw_MC6of1>E2-cD5gq=h zx1p1~EvZ#16=9#5A>LF#Wp+$ZdEvVsAn1n1%;Sn9uPxCtEjL=cr66nY=RKeB*AIA! z5y{E49oCzQGElT1P#Mn^f;uX%t=^|OBZ{JvMB=kTTMTqd3warAsC<1oBcZ*&J2g+F zm@DV}zh-BlCF$Mu$h%H>;Ujp&A?-dsnzBTIgfZIiqX`+O`S|f%xeH+gefmbO+Q$|n zHiv(;(y#HtLv#aXfVOY8s;51&^@~*4xh;bWCLG^Tsr7lGp(<&moxc805*TEXc!&^I zs>W;qXOQIJBuUn2%;`Am57|PGjJZcZQC7)|rLh1X0Ij`on@VZ8C&}uFAqCoGg zmcI`Slgem~Z>%lLDy=Fms;Y{;TeV~3L=WI?%F zEL-Lgm25Iy!#PxI_?6bAPOl}asUIhY*dPauzeYQsy3H!C5C2hRocG8N@@E6(5L)8Cx6z*Frmf$Jxi;rBij#6Kpoh6VJ% zaN3ATDQQtbAAgfb;>U)f48W?IbB=Xh3Wh^`7tsb^VOcmh^s>S!%-u;&rmb>-HiuN6 zr<-}ecjfe# zyud(>D5goTp8ESfT2qWJ1zAq4<-GoTPoTDY`K%ZM2dDdu%Rb_Y8e-$?U-ebU2uBRa z#iSY~3Z-JiT*lcgruiYZU#K>G1nJuzy%fuoaa1=L;?yNP_hxXlnI66JKH0hIO?_2q z=BvYI4wsmwUZCZqJD@V}j}~31@5>{E11Z2|``o~jA;NT8DyKj1H6D_q+PY4IfYMqy zM-~rSGRv=ClJ@OQT8eUXzXv+N=#fJVs6e07<%L-svM}`^x>3vuA)%cD!l!%!(R2EO8SxF^o z%<9*E#~jX9ta61a)9)LEh$U)9us%^znQl-X!{;*TqQmH`8 zOiCkf)OllgXyj{j9E0gL#S8Nx%Z%x7{lzV8qt}6yYi^H$d9^^e<2gmhz zbtbhZCA;igg6cauFjtQ$yu{COW^q=x5DhJXl6{GZ^B&!IgZ4iyJwC)mv?40FKWMvF z3)Y1b+bp@^n|@++a;Qx+?)Gd?v5>sXcRm?&oEXPW{T>pA^wp?8R^6KS@<|Pl?9r3I zJM5>Qnt#gkzs4ZREnX<^Mk8~ihce~4cEObuMdxgGumYEJg_fZRZ4-r2~mx%i!@esyaMS>Y$Jui`#J<3Xw&3t+v|urihLt zs3ln>P9iZNB8m-*cXuM7Jhx1D_xWk%1%vo;$S>m7CMT@>)GDm9EO?Yjz7gFY^jDIZ z#We|2>h_krn+1Pk@bA=K6_kRyX;Ynh7d1Nrpp2Etof%dJJtf|CA!P0Xeg=J5Tt0VDvQ z{OR3^>-NpTgv%9E>B!CQY@eBww}(NYQ=ZKMU5j&P{izkYDd&gP5_`(G6fQY+Kd<|6 zD;FZex8cQ>h{{iNoJS-OI{=r)%``?H4!5QLOkvwBJ||?8&A2DNUzgQl2T^}hAW&~O z?K{lZr{I(vBI;%ncUtR1ofIz{1wF@Kc?#mjSF<1$3;0HQ^0}W`C_u^) z3i9tN_Ke&=b#YVZ@p#Ue#+wbDe&RBFn#oMzi48f8HWhT+ZuRbT-W!vnl$eF|oriLE z3y~UfgZqcsNkDM81vqsYrqLBRuy500i6U6 zAVEK;8_soKNfj{SZD?0B(33p;e7vI%6tQxE8h4otB^`4*L%M5oZ(Im;dx=9hMbp};R3O( zbM?J2Gfp`A;Lec{V3}!hKUZN$ocU&j4$e{Yc0%u|u0wFh3%`@6bk}!>eK|!XF}C$G z^+$>Y)|!wyxL*>Yid80ql;OYTKmU(;5q`PMq~|oTsVa6(thSnPhnIV$YweVxWfQ4>%}5T8_*2)$Xx& zdBsw{@EE21Y1{o6=SD2>?xA_=K2?q5F{aN8Nwh^Y=Mp^*x6+L^d5|=5#_|rD*e4tv zv{R5+fOr7o$cPW|L;$#nd8{&T)}s#+BG`Fp;Co>6%gKaR9($5liSYc0z)eQABn{f! zh%Nk7{g9hER0~ZEP3oW}|2%Z!?Dh)P#2+lbGczhyEKd~ zm3i*OPS?sTqkq7w>3SJ(T0i2%&C!VXq3s5MW-_*-#{JQn<~HmF2?Wbz@A!Piar#<$ z!HvzAg+Tp;-Ja6@#P>q3<;#@frrPBKE#yDWmWCO~1Th(DnABtdj0~zRQfVvk(W-JU zc;hSl;^xYAqE;oS%IFXN-n{H<`HWwjXXQ>!Gpz0fw}E_N_;A z)T`y2L$65pJ;aFg_Uwfe$knJdW~#=;3gV2eYjlimh;EE-YBX-NIPR237@;dauZ4IJ zn2eW%^I0aoFA@=_7U%AZmkA`&yr_$r#yV`d0FeeaNstS=zR`O%pEy_JW25s5no4nS znbA3~xV(O~ON4cVV?s^-tq}Deq@ZMTmvclgqsjmj_Tt}{oj{$Z$WW#uKFi!ktF!y@s?Ru5L zzlvpX7%tJa-jSCR&=OnkJJAlqmwq;!A$i!Y;I5i-_pQn|4d9~@LOERqXHE?68tN*yd#zwa>+@@tdaV;G%Tc^~p}+Ql|5GPtAeKTGWJCHrT7mNU77h!i8cyXl%>8a!Xs-!B$v|6+ zR1A4gJ@`|kl4+})Im7l+@Q{)th&5_@#OHpnL#FNp_HRN?pJt6xpKo{br>@_2gz!&a zNvs)@MA`)W&Kr@dC@6STup&|L66?yNWTENF;AcyiV_#mhz%TVsj7`FKH+{H+r1XXC z;hEATLF!LHM^B?J96AL-LZ#1|$5!-0X<6w)jndA>FSjkrARwV~P_ymGqC_iUj0LY_ zS9u3@mDL#zqzCWLZzS0I5sZdXu&&rPzueS||EI`H!Tugvn+;@D3{k0TXz)H2Eun_l zk;My4u>*-trqN=f9}HxCX0BQvdAJDxhVg+i3y`-}uO$G&^3{$Z|4OEro{9lXvcB*a z^M`HF?lf%_O_)uYKin?hTkcbjYcGiNd5+PYbrn&M^$F7tGYs>S#lV;sp*`XBgcr-j z%F|OaU=e@3tt$TC^L>sLj8O?O#IQRB^UT9z?~;)b#HS*qY>g9XwlDKn0ULSWklTnS zrpg992!4|D#g@yFU~`(vX&PsA)XXl4Qj}zBJx}7v)L=ZD^8abxSeWSYm#h~Lp&ROc z%mY1{JyJ?4?nOgda|$1q%*c6Z8XsAv?_2HnzR5|hYDh)qe*iIJJiHar8rx;yd>+2|O8SOdT&v`+ci`8<3qb4 z^g~Bq>@Iwxax{(K^1baj(`%WU+FIBSuy% zzHcCcraQxKcDkN>$h@;zZ^`QebbF5 z1WBB9?RCjw$6}RZ-RsfM_kAq?XqBOmp^(0lZh2#Cq%p?>cst|Sa7g}artHb`u zisHPjj8KY8hSprB*0yIBAtv-reMT$Q7`q(He-;!LO&4L9s!J>1c~eNFNJxa|MvUqd zcO-`|WFYc+dOf?Uwd{CFXM!Z+{7}|b!&YJG!FwmzM?FRPyL-EP2YW|=yCA6H^qUy2 zncAi4yN>-2C3o(Elr3~pLN+t@GyTNFmB+P6b1-wYCt;i)b&r|zxcXlQL-yeYBWOQ# z3OW^?hE5-f>iLX@9+6$i!)u(IWL1AqDU`MOdAImzVF)#0Xx8KA0(1X@`9_r<_gR*u zlA?e|3%3}s)Meh0n0Lw9(O5uRO@Qj(y)6uc#Ih_DUQ8C8x0p|1W=T@n=xpPT7gY-= zeOgb+M+G3Z5W}?vL^=h>%LvbW#JJ37MdVz!5`#E%TB=F|dVff&InwW;@1k>QSjSQ=LWUIT}K z$HBAUBk)y@kG${R^Nmj}2&pTj^KN>Ck;}2`v=hqohI1Cs3((7ScY0K@m%4L%I_ta( zI(Su;q74aA;637|)2NQ2CB~H+Yn9}joKHCt7bV`i-ycXq(|hCQDLUUVqMy1U!dMMl zuy8rQeu(Z@Ntp*`%^0y-u}yb}R6h5E5BcC}RXYOgX_Pe3sOcCxu~jY*d)3+?p9*m4 zS=(8mNF;v*e*!;@KY5Z4BrbLSRi-EHcqnzKz3%;qnJntnl$2L_B{ZTWCc!9cU1Z26 zlqH{s6?{i@-dxBc5`d%W$DHf;QEnW6h|Ql*Loh(g8U7)l-_}xAkC^)pgP17)_F(x8 z(#-K|WGG>~{u}eiUZ&U)AEg{~y%iE}xtsNBirLUq zEOdlIh%F8j2$*#{eSng>X1qEZX&*3KS39^7+lk+4H{x7Y&*N)fm*5a*g9JcWHG%&h&@&)wRV`EehB|gZP zLflvH&Vr%TYfI?m)6QYA78jfmjeoS^JblzlD~Xnx$MQq%c7A4dLrya#aE)Qk^@L#y z@Z1HhxU~0WcK^Y&!CB1`pX@G|ZUa@!@Gi*+@SGFar5?+5{TOAk^jRO%hsX5^WTn2ip9zOf&B zgJS?MDQpr@8`xmvao+v%4F~RUy45@dE^MVdzGztW41BGEdue3Ud#&eZJ08FKGf`ku zF&(Zrc%e95Gb0}9WA3fdj;rQVZH5FbT+ZmSD&ZXr394 z6!BCS8xA}Wx$#cDE4ub@;~fEF+T|2%R-`^R(OspIc#*Np$_t02QpUxvkxK_sr^(`R zS(x-5k}`q@WCnL;FUn-XfNQece>5HLfTnspa1hwV*yY$&J)=NR@F!k5)7)$#6eBGn zB8u^wOPV|Na!`I6s;-E=$(Rr99IQk`UrX)&^n+x&U9v2BXCYryktt4%K=fD`uw$z38^an|>(g zDrF9kEStBJkz1VjKL_X9#2}*5K<5Nu^<&M|)WGEP%h#K}830XLGS(p8I=K>vxTaEp zKCW1t*$;L(nJn45i!((}ti^k4$r6kAl-T{HmhyW_3{M}Sa;bh?v zPh8i+Aiq`_p^GN&^pGz#-n| zavIn4n0e-(N8Xy43;c?cl8paKL7nPV%NCT00XqS`Z6i#DTYSLZ>5(bGyOa6rFHg&b=EnK(-t>=&p)~B z&Sm$VDz$Q0BcA}GX`lQjF06&P(kSYL&R`((`npF}&1#FBO6n}4^6p(~^rWriAp5=b zh=94?ym0Fnl6JlwFw$iv)m*d2$7v4A0PO7Q0^dnHv#2X{^E^_io);RXWZz9rGo75A z`%qAc!PD=hQfL%lIRkNz4oiCWOy!AL8AYS>WQ`YB!!h^@4X_ab*dpqr^b1L?K5;qT1(-2#08)St7!pS`~S!2 zDajYaPD0xNP=^HuFQF^yW+TM&2N<17E8l`Ul6%FOtpmy#Hdf~zn>?Ic{-je(7)hTL zP${$^a7)Rt5*1ButJ+Ugpjt_0>TE7tG0|f=-AT85;a?4STs8%h8) zY_NQ0#}vo9H2va2pAstUoq-R1wi@A$zP<=}fQAJ5)?t0ES0W?v5qK!gX~wDaTIn)U zgRt@L(T4CoXb3shJ%}*fQ)-e``N8&jiMbX@MgdB4B7>*;69iJCPwS_}>+qlYm$v*+ zts|kJV$1&B$HXBtb~XmT6pq##s_(mY`w&O2TDV;LpS_GLi4(9lrCWpS5+iBffnPkW zW$tp8Rb>G%QNVzbEMWe1jVJMETJm&%a6}xH^0R?6*&udUBl+l zgCum?yr%6x)WnP>{7!VrUgeKhna4W(oFTJXA$lL(2Fj*J<~_dz%7EhDfq5tiXrL<1 zO&5f7g7X;p8)pj9CS5}9iR75E`T9}Z4Poj`Xx1Qh$IKS50cDz=K4-=JUT{!R$|4-g z53}E*%2F29$1OFD_a`KvVLHby@^9Y^L(qD_;^~_-*5OZ#MD0KIZr5RcM`4YWN<=I-}d=FhWM@chfJEXzqU? z8vt!j*H(q`6kEIC-VGuAPmbSTxE5MwBT0w!A`Xdc=-B>JS2n}3*M8Az`twuvY1Q8T z-q8z}xDGbeJ^VK^8YF?y_4k+skyzc`nA$6|!;nAkcJ~JM+V{|V7eO2tycm4=oPMD% zCH8;st&*PkpdoqiJ~k7c4lE>Qa-u4QMofK=l-IH_vExHXvQhOt*@8`W6J}}lL2Nw5 zCt9Vz#S7eG{?gO?C+k#+zm~QW8YvdYT;e=G6osYsiFO;slm=1(FN0_INx#<@->vaM znOqWy-=}fzBWkTAk2ohpDw}%suC0uE4^0|JN7gh=TKaWS|JA90kMAxS#7t7{vOQIv zyR=%vi|Xn{wcgQ|mjEaMswc*+YwxM<*yyF&ymW`ZoVB&yPJi{BR-qk%^rzFYIaR28 zGpaHrer9~zwHTs)YPib<-cEA;lUtg3cS87nee?Ib0)uj@F&+-MJg<7q4a=@o?NfM7 z2JpxpUAf&^J@-6LzXvY@SGWMe{6nz&*L51lorj#%k`Hm;pQLsq<@gTR#vwIvFp&?r zm8!Fb$SjkFu^R6$!~^pG(`XS@OQZyiffEKTzXHE2|7WmT|A(juWqDIh(@+}!{wxA? zR6pO0db1yWlr>!~sjh4ixQ)rPa^vrgycKXxkgxC)l=EzD(QPD(pb3|At0n819ExH+_l-=tz>6S_not zMa{B9v+(@n<692AF2i<57Kb$C`<`n8t}#RJ%lJ6sEBn&}WZT zSAE%~{yIGz=VsW_aR#tKD|Pp8CStr6`xnPBf>CsdzY-fMO(~1Xa$%e?DyhC{z_MPs zOI8~?XR`hW>FbwQ)VFQ%eoBoD8Ui5 zLk(!G6Yj-f$yxEgU)edj>9O+SXQ5WEY;MusrRF<~5{QHR9_aB}Lx+OuGHNb0V(=4_^^l4V%q${=G<8jYz#iPKs^W^JHM#}19 z&&`F@M(ZK5uxBjmOk0d|`=o6(Qk5l&yKreST!olWPE}!N+u*agnKC9rD41=GS-4S# z+Q5$AI9M1%J(cgYkkyQ-mo0cQ#5L-BKLja3fPe$OHG_9z9(y)#qbMc8A+%2pdcny; zGMzBh_O!;d&sG~OoVt6@P4^;#RXPM8)l_1p)o@ow;z$Fxtd;$&7(4D~8=Qf9;TpWB zfuC8JjfKWZodidOVc?ogAtEaGlv;u%`XSNxVaH;$N=G_0&R49-vT)+&v8wAk2hA5?sgAAcfXVYW%^%&H8pfUg*W!m_~ zZ79~+hMoHE#mQe8KX7ZyT;xduG8{vuESg>6&f@jE$I2syd0 zd{#UD!gIQiP$ikOSo5bx7)*(8DFU}QiV9Tt)VBEP)Gm*TP^Q<9C2m^7`1Zen#PC}M zp-;r?M{nyKOg4&V!P>!c7<|DjKFs$zd<|Y*Dl#;>E{p2|_(Gk-kG(OZARxHKSyiKb zq(4^Y(3#LZH(gj;6vGTyT3dW1;B-zfFQ_G^Pf`~$zo)t{zc0HVxG%h~L_>9x&~BUk zaIwO4fISk#-lfyWL@znx;;kXMfnm?Nllb*)P3m+Pw+DCr@FH1HIq))nUT+`1pESw3 zoeVGouO9PF-S#mLZpG!u*v2qnpr0BN00}7}iJnt4W*Ly0i##q&1Uh2Ci52@|i;a4_ zrCt%|58{#nRWFB1@j>;{%mtZ>DH}eSz)I6SnF-!78H%b2%BL+<9&A=7c;GWCSbStK z4j`1+D;MP{bfm^p28Q3Khb@D=c>WYoj7`~ZcE$-c|H92UTUj$~F)KcKlg6@Q-K4)Y zmF5nT{k%0&$b9dYEO3}+L#}a-!p_ip-E*DKP|@%(vJP~JN8cmVpUMkmnANdo*=~GS zP*2i;YZ#li198odZ*E}~>4Fm6N~?z6=fo)(SV@E}`7?RR(O=T^)B4`enp1WrY^L~M z_%0-92xJRz8@%P0?iYTYWQW^JZNq2trowQpk%a&Zw^~GwvPAKXvQ7HT`}E1=P$Q{( zU0N64-;hb?f^yS3sGB7G&g*-+tHlw3_FvK)N58TfQzFf%wtxLkA z$z1F>ax^S&8>fbpQ=eBP$2s2II;Qpcud|j&lT_z2bhW3-r0G4V19fi!zA^q-^=bzOpp~Rt@H~VodjsBR8R+D=( zdyl5;o`GBgPSPvIl`RYsYXsUxN8F3vy}uL}9|V4CunUGOpkA4&pTl(Sq{{D8DsMF} zd>8Bv>327vza$D8^tDJMpHhv}*TRuD*nLAH{pF46n<(i%^wgVO-DBvH)<#|!0+;>> zemQ&!x!B?Y4KP#oI`*#F(pokHrplN9&H8T7n~)2VB7l%~s7?u(PJz`7#S9IfX&U}C zHk?s6ocLjkA+*N|RVNX7UD#5}v)ZF^JUVu@tLMWWY$*A}p5kcKk%Pe`K?SeYV>?Z+7;ELDvnk@wN%_ln^hXu+dQU1=?cLFmK zW&cs0VEST*avS~3%(czo$aWj}!n*OjM~Ur>Gj~T)ArSpOj0Hm^3X4}}A4=>_{hor1 zT!%ae7Tu7hLtUs#an<$c8mwJ{h^UUVm%F2*`nqO=G_AQa1$$oSeyt8$(_woU1OM|V z(q4{G!0Wu-hu3?rmzv2D9IT`Y@;sn@UT;Qd{mvErTP)Q4HKC0_fdw9x3#OGtCo=LM zt*zHq@xr1tTr&T4W~#%{x^Zy7yxhy63H^97L29x`?vHey3ich@jvFw?at1ev-oOdwEZcN{xr5Z(SBXt1268j!|zj4U~{#GbFVlA|f@}@DWV}DBDtMysReLQj!vRw*OvMRD- zGO0Lwj7Ut+#3SLOLy)D66iG30rr6OTggn^0uj0WW*MQ`r-#fMVMQTaH>s7zU55Fb- zwU|%e5HK3lZ@^u*>YC&@U))Fw4z@sz>8{WZU|yaQGHIJ6xv^49T&6J zjkkH3SYzbFlw+>}0dHrbH0JX&q~L==U<{FO4B zsT<$$+<-vv$s07@@lIypcS|<=vw_c3+mwA)%CB72l9WO0Mf2d9kGR41RF1!0ckkU9 zsmF`{a&K$dFO(o84}G?Vg5Pjwdrf^=U9XM>{8TOVd%bLhtVL53Cp}TZFgcGNJRs2K zhZYCfTUaOb;{&$0Y!s^fy;0@_`Vm?LZz2q6Y18Vl3wf98-fRSG6Y?_jf0Q-V!62`t z3L;++6pD~3PTDZX!^$A7BN#pECTUAh8#P(bo%&W&=e(`<#QQ7{U@sZzI?fK_-6m@a z9tieg|FvhXrgVdcp@vldA2}guTvjxyO_Wa^G4?5RA%F)?mNf>2F&SK?s#!AQSykZQJ zC^?BB2^CTNsF&E>z8?xq7bSz=JeJzm@7*X;(KBX|I8Hh}0VXAfd&e)N_*9t(y&-;R zZ%`ID)dKACNjZ$ySTN~n+0|~&H;22=C@k$qC^ka_&#=DyA z+WDFhK!+^*ejrjMFfG+b1ml=Y`Wgk)309Gze~o{bcJcrdEX!^DingoFJ$XFa6xoTG z@DgSKPXIUsP3KJ9%bBP@Uv$vJ+FwL*CKH3XOZJpltvgjgL*w0uWP8+sWc%Z_r4#K} zTxXHlM2M!(r`_5QNx-TCsDDy2Goffhe7p_m>3d2CJAIX0`eF)Y#+{E*&i*IIu;O&XOW;eTR&UdaCa zG$@67Jgprt%2dplXAflSGHg$Lf1jnxvi*Ho+RL=T;7+gbqz+B0b*~WC$wRSM8Bf2D z&|<}?c39!ZihO?o5|Wt3%Iyw~ar@&`V${&mo`O%^{U|@yiD~YGFu;fZ{dP(c)Vs;$ zvTg^Ddsw!S78~-{!zw`C4LW!ls>2pXzfUYP5B@2LJ%zmkgqHmysIbPC(`BVoBehW}4=m7MRWrH?P?z|&_qO^`X>VkS0fcn z!zCQU0eTrPhvg{jd#6!#B8c=|MS@J_Kk_QmdQE4I1p2EKR&5zWKt9sAKNc zMv7(C5Mp-#sO`NZJT4%>df0`KMEtI%^0AKUEKnU&8)bo;zM6=86ep#usyPYdVY&mB zfEecnjyq#rECU?*XU*0di6zj>TmZ+puu=0PKCd0=TTm0DN6ZQ^O2%V3mUMb7ME>hy_A89 zh?m@3?<%`1(M==Rnkx4Wb>snWC7&l)NHE`fxL@%Ur%$SMO$@3eu6PL;p-Bt1pTH1h zP}1YgvxOG$-iqRSr0HoF0V>;Dc@55&?V)V}?2UIo>rZ|uR<9ffAiyYIJ=wc z{>PU+>1M=*foJ=7FbZhAV#iTGxlPC2#|Z5YU*CvOD0n-$Za+IHD#yVQOU`bylLAeN zK$9sJy^JV9o7kVG}AZvLUKQTR&oCUYe{RXC!E zL_`Zcv8rCQVf6HUrdC%mXk!>T1~m<(44EaYydGdwI?l(xgs$(0kEtITc+m&WWOmdM zku|edOM(;oAE=IN1Zk889Ndfw*@)(qsIHoP4Dc@r7OM;WUX@oVs%*0;AAQ|HQAL&qq>!7==Rmw`gA(;T-(-k;U^07#l2tfRdDR0R?7Octe;R z#-a58vkL!Fiwel8`1njGCGhLXgc1TcDkvA0oY`W6PRWA|sV%r8{o?X|QQw&tRDG)6 z+O+}ZEs}?_T^5ZhM2AQyT|el`fxJV9?zr7>jl};hw6~Xh#yLlu4Bj6MdK~;h=`n%y z0F&w}4c96Wb^nSa$a=b7dwYs*vt08Fn**|s0M>{JO`Q2`qqe)9(36Z^Z9S;mFw1&% zR20$HWBKUT%;r}CKLy0VfKE1+YTm)_gU}qhK{cs9z7~!rNs+f8@XP;9p}?a9nDKuv z#2%T9KEZ!$abp2mYVK=y>;b<_x32y8Js`E$`{Y_bV?S1C(VpW9jtZAjk#R{5o#&15 znb?+H5kFGG89gH^7}7w53?sIFI$sh4EHdg~&e`|=c<+aP}=@~{*YVG9_#;$4t{LSn4KA>Q>Vm1#p)T&Et?V~R_ zHF8ihBjF3lC4)_6e|usUB=k0Srrs6wu7JLKrSB{27(a;Z&!OhrqYg{V+BpMwU8X0+ zt7AegU$?WMGh#w0x9ZYI&}f@3a9}6u&S>0b$u$EX%>T@iD@3vWQ@I16j5_zVSKbm5 z3QY2ZKNi0DKXG4WcA9JbcIDQ2uZwo+Koqcc(aFr;uf!j@=W=&9Vb{khTp{hN&JsVt zSZ7ohe96rZ#Z2P4bR0tWIDopHmX2nQv7P4H08sjM9D#hPQ1qMOOci*5FGB<;-9wWH z{r{c(l5bL})w8Ic>C2`|nMFZksrGWD#;=z+kZ)P`^V6L(2-(+w^^6s3Eg71mJ zMywbDej{F;3Mt0|9i4Wh&Oy3QvGCpZos}*hWGWM9{V8~RD34lx+Br|Mt9RQ=f^H7 z5Y(ltV*(S{^nthozH571dmmGg7;{v!YkT6lUb2J;aA4DFEqpsBD`WDNyU>Wj7Lgt342yv6yAm||U~yDNksBE;>P zXsi}7;g{n#=U2op)jxQ&zZfK}MS1ZmC z&II9ewP<@xSe9o@)8Gc3<*8;CX2)S`{BfV}5^NtGyYM#hnJT!v#foIfjt{u3I(IOI z=W|$UA>wcOquU^$+Yu|^G{6Y5u^#@OYD)Ygo)H%-SDbS3KEtT(N6u_?3?zp6J#wrI zX7#j{jkkZ9K4DpE(Vm|-fI6P7(+2O=K|~z&d06$Fd8> zReBd9_9xf-#M`;qXctg1Bvut(dYeOWK9pH6i9q2x5Y>UDsjefi20stKF$Qsw z+F=kI>neJm?kQpI1|}mW1QV_@PmxyX2Oi zfcczm^+(-LStA)nC5dqZ$^K?vLxZay$bWW_1RI_ac2uqq8-NO^%j;lXI*erRC$cwH z02ublW23YTQIvDgE11ju)<(-B+gxDG1(YLbdwxtt;Dfno@gp?(DNT-~%`E+5OId;T zK8PKD=|sY(*3bQSc|stj%<&} zjMuJ7$IwZrsidwtj1_i);+d;CG})AF_G<(LCAK0?@u1=JisJywe5pX%jTye=!heN6 zc`J(j80R6&eI7dIdqB3toJ@~K^yxjav(TU%>;<+j-h|yZ`}bxSIriA?Meuc(>383@ zbowY{sxWGI`54u?7!Kk z-6vBkgaFGANTK}CTJc>N@VNgyX5Wur-6#APTE?@1gT^;&a;(*@Qh#2c);Ty#gX*q(lNid`o1Ct zD0+?a*X(N0-s}}x$XgGULdR}Sk&4&zteqp8owoV1>uM9_p!?D1$G(NV|TET&I=M&&4m)RYv)gMW99Odw<`%7 zalYksYvE<(Shb<1p$T~);tXr{8rEFy-Ecrzm0tv=pvDd{$&ycrYHKcq_+Lj&&+I#W zwNs(cXo$jQU<-aeS&=EiCFXe`ZQJ6dohdwr!2W@#u{m6o%yfdW&aE?d^8_&&c=y{4 z3W44EeWF?v3LXU&4QD6;Q}{A>z$pa8D@ii(PTKQ(@N)oPZZcR@V=1K>)J0Z1$V-;5 zjVisSQ&H7`>qTuPPp0ku1xkelHz>!a(Bp78zyM@blHKRFuCT)}@_GA0!=;iMYW2`doaa~Z2uILoh`gh!11&|_X&5}fDgq70I zb0pQA-V}Y_-xrnz^NBW1qI@slJ%eh22c?*O>a>mGff6fkj8>~ zV$TwlHcnDxHY81#fCwv)j3i0eogf+k3hK{H5KT%mX6hKv=mOHv6# ze9F@!_&spST#VE~-n1SJ^q4GF$LeS#J2&^A;w$;v6AYROApiU0T#0W%qjRJciCP6X zacuixJbNELdskZf?`zuX-u74e_C_i6DXvQxqg@iD$uAlzQ-p_8UJ)e$q+MYLhrdtQ zkBcJhHJHRDe);4EbICLf;QdtTc7fTv@;baisY(4(Bfu>gRVbFg`Q!vE@Yz)XC_U7t zc;Bq$qB9DRZ?n*mJfMy^b`y#avtZk=EpEpF&nY(S=_9kq145kIq;A$zQz)kA!K2Ky z77r!%-ahu8QN%|kn}wc;xraSl%vih>A_}qMAa3FZzcJ*8P;+erE)`jGHxjI-wXaxm52L`UlzZ;n*pcP ziW+l_e1Q}z8PwII%YvpoBqvMtf-O>+RkMFLt+ny7BOfJ03zlO($fyUw8MpeO_9_#v zR>zAIL>&1wjq3K|Idj=q1+K!MsY;FYfj(7s@EZGW+;&)a-b#5bI|u%e`!RX`#bZue z!ju^YZ$zL9qqcd^N9yHeH?)z!iBA5%>xi=TUDF4do{6iH#%im`YA5Ggu8mEImb^*TP$>cK%ll2%6Yy#5rZr}N9BJ;1OFGBa)rmBQy8Nn z5UUBKOi<*B*=y4X0%yI_bL0pQFjG=OZ7u>+OjIH<>YY4l#t?`{ySmXkdZ~F|C@{Uw zuMBQej`pi;QJVQIH(<0`DDr$@V>NgfUqe~u)9F3-QMOUmacQyU^#kLQc@|WU?d+b! zOry%{Y2dnN$?ZNySE@22s&lUxKiy5gcG}%rE_DMM33r|+Kpgq``-zNrjk!+SKF#h1 zWZHf%;->vYUYy97w~b5W>bQrA!$E5dayV6w+V9+Xl*@doPwhz!>CDu%>Z!|r$NJ^w zEOwrzz4)}l9%~F3JXK-G_Z%?=i3F3icpV$qVo>w50N(oUgrJxhTB=g#S#cl&V{rDF zLrzYBs7_^TjUfdWC3Y|C_|yK61lXIze}en^`;>FH#lb#^U$>@SzB8LgKRd}g^siQ^L*#I|iimuFA#Rhj<8HB2Jf zNPrM4pjpSyYym}Ihs-{B=kQVQwQCilulUl8dqLpUpq>^^D3Z|TLV)7dEv-fVcd*O9 z>RBMair;nJ`XDV>WgNWs#FFVqFhXAgW=x28pAS}=f=&p^VlFVQ`x@A{JF~-|jaC?g zhS5i!Ml{GL8bSw}J-s)FMSg9j+fr`s_Xz^HBNqU!pOxynnrd1L2=6__zibDiC65>| zWcLpg6ICwu?isA=R}VpI>r$C(fUH(@7$gyrkQes#v@-`%qI;LfUq*VQ-M>vQ!sYH> zgo`2)#i7$`i)W^6%FlOxpf6Qwo2~gQ$!E!L&bQ2CfFt6n$C75}m7Mp?BF5`WyYuhP z`)U#YFarJ;bASeIo}dxX(M)-++uF&>UsC=VsxV!9N7jB=(cU^EjE|}TFnlPc)2p~U zC=1ScX+0k(UJlF`SYIXdPEGq$_-L)PY8cCLhv#jFi>9WQM>o01_O)}yFe05oqV*Zt z@D>`KLp)%I>mEEjQIM)+*`9^K{Qc}NfZ(sM9WE6lO5zYhE)wZ#~> zmTdhVd;EfgM6@JGLg1T)Lt+BO;r*ca$P8*L-S{3vH-pEo3g?SN`IrL=ahfo~QtA+- zgk@ga5G|T4{=OYq)qVHG8!S;w&BQ#)Wr2E3+X}-F-?eOL+g=x^#KG4WSAR?=eK$)y z&qo5i?ie`J5Wgn_C9bd&w<0v`-GMt)g}@s9cq*(Wgu1yy_j;M#d7Zkz*aL`c>ax1@ z+^Zpayky~Mb8jhGq{>eQ*w6vpFoA*bV~bdF1)*%F67fJQ`~;G$+plYS^d2Jx5%1XW%`skF02i`)hX(MpGq*E# zFYhiL*9_6nw2$nCZ77_RvnK`=c5HZ`-$2Ami{R;egZ^vTZfjRP0ZY}Z}dq2Se#0CS{ zhcBcvj1)2sbA-wwh1y!fq)V_f#8Etwc|i%)7tvA+gH@ZXt1LE*lV-p(qqYc2u=;Whl<<&ZG{Gt#;)-^IWI~{5AoU2MK_*3F zNX~|o_H+|K zID)N}-g)GzlKzJl3%QLH?+4OqVY)N-KHMjYiH(lF>$_HwNhLG!Wj~j ziwqygt+Rgq&m5Ku<($r}>=};4h1~!us(0fvd8NrjEb@;)DtQTC;q*S(O>!f7e-=U$_AJZ* z7lfy(WTPFe9xcu3q5Xxw{6z8Rs{l*=UOtCo0ha(avQN_wF%Myz$=JP26g(x)5j6PW z_)z?}2E*IRR>d(SghPM^cE>14Em|d45lGUMr1XBeB9gL5&_F8?*D!xFW|^~p-v-H& zHqx@Y6_a+#4ka;G)_A#8VxHYpyFEE*?6v?QQt$B9l;ytD31-L`Gs@PV+ zW}JiXN}})ym{s5j22_^Mh7e+Izk@lmbft07%$d9k9DgG1En6uYOkPy`g9%3p?S3u3 z(V5ph!e8KI{i6}E#5f9@Wn}-!ECF~ufg%6Z0xl{>BS2pV5tHphexTo2}VZlxw+zYn<|NQ4G5JmAD5#Jj{_fwf&l zW?Ew|1D|;E^B1AS(CA1{ANJ7in`jvUy~~%N0oh~`dwR(SZ&^%O=@<`7G|h{00s|`O z0<$*Z=|J=$g>&gKW)IA`1oV?F5*F zKCvQY>(dZdf*tPQ7by6_pXOo8Mi_Tp9>;?h+0=PfWk_nj!{PVucf03{x5Dis^Y9@+ z&TL9`V>iduV2#dmvUPIHBdmrp%#Rk4p$2a=8)qrWQn}mADS*o;2#&uiOwWj?t{?xh zZ5AGSHJmXx3!WYafU#VSb-r`b!}`Wk&kZs&qjPvbAs;_IhNuB9;}4pydR-ozM(eA6 z6HA-IFqi(i7D%;-L&>*Dj-h5VvAhuj6T&IfSAi$jo8am*MLsC@<`H4WrW!c|mSl)3IGI?6Y1r~z+J@sPj zE_5z;32_MrTy#v`owk{s(l)2+2h?uXowbQT5_Mp*;6?C3V_4@p0oPj#u*GZ4`xb^4 z`UkwU3y*sr1|DXLC1Ed99=AV~XIy>6%4qg@lquJW+NzA@0=PJ+{rtBrJR~>gSjPPZ*`~6^m6ymB11Mf^{;Zh zdMr#VN}Y^FaAR;Fem&Ldmvfd0Vtr@TeJ}yv;6S}rhI;-HekdD|zGbSSaCqcHzX7t2+4(tIAya0$J+o#}X%L8q(3W!=m8-n}r|SF_A)S>4ym#Hs!5&uoOIE z@Dh=p47Jt(jW9TD#a#vJ;0xvF&`Xwu)FJZgK6X?-Y<6u1DxYaRuHth1*FHa{KhwhP zwT;&vh0EY^;B8*NAk){e#&}^qvBb{3|S=V2R^ObslAEKCVV+J;#LI zY+RK)8q@H_X{>g}jZi0y*wo=i@tI+bRi+XA0uux~9u%Zobw^CAaE3dP!f3D_;T-`t zY<+4)>1`7dX6Zpdt`j>-50>kl@c4P3@7>xhBLCKUaod#MirbG|Lax^q zWnGuNdGY@r%DytH3aH!m&`OAcNC~KPhjb&--O>#L(jA9X5GkcQq+7Z}Qo6fA>Fzr4 z_VK&##=GCU?|Xl63{eN3vG(3;%{kYc?p|V}Dz|)%%3h<7&nbGS^|1By9(X7p;rK)% zmtKZbRCVIM3T9k<*<*~re8eI3YObdAA{#=1Ab=495k9iYl|Oq-`&j>h$Ep>gFV!*g zT7Y}^b-Zdyhr-@?PkVt|MC)e;TQ9y%Y*PDW>M_z*x#dB^*VT2VLzrGY;Uq!zR;z?I zM0NYTNf&jG7KW$}`W)w241AZEY?{>eQ@^{ll+}JFJMVv;Ep$Iq>KTa4Kfnl+NkF(1%-4Hndso!_>$r(z^Y&J=s$4Vvm^gZ_F#G~3x& z;IfWVrFY2QHGuf`)=ws)%2ygeZeudGOOOJqUV8fo^fVRL{t(1H_Y(F?B8z$Q=I>kA z_9eFA3!Jr{u71y$2VL;-Ng*V!&5B}~nROv~d`&1+L~^UC$s3y{d?=*96G@H3b_)sK zsOnK%CM~&PM;(3P8Ix^K^__VSSkYTr(O?m=7YHfRy0|-i0cTBV_ESi_7FIJF{BFl3|mFn?hay3Z2R>{w00@ z-muF;{ToJ|_?_yVtrC)e`P-oSv-pg&of_{dfw#NS&i$R7J=LuqMr7%;yHN_#U{4=* z*$rR(OZZ6?*pN2DvvIjw?{nV}^l2vUT^vD?#HGB2G+gBSuU*Kzv29Z;<&3Awb!vtx z=up*0#YV}<#Z}mH;fn5R@k-e$$?61J^)F}?q zM)zg4m*+Lv6@$kUZ|^T94ysfHVlNQi*>+w{P~n1s1?&#}SN9BLZ1{EY?<>%&F9+5L z|J|cz&i+X&W$VUZ7<#(ALBBu8euI%Dhw6_-(HM**_hsC}DCsmuEBC|KH;y275FX;R z@E)#Katy4r{+2Z4V1f2jtEAE@Dk)C8Ms+favD?@a)hyd+tDdz)mofXHf()?TLKx;` znyq`^a{n4x7?>&o(!MgUs?xjB>V$5p+W2DhgQ1~cEYpAsS4%c7#5uRRH4pH*Q|<3M zk~=~>;*sy#eKF`Aj!6^d^gm{70~5@K^dt-$$OR(tUV5 z#xYxEDJ+i?oHR=Monbr!XFiF*I(v7PXDY0LV>(ARh8%DN@ zg241!0oB`0iN!qVxu$KGaZb>LfhO0JhG_1Re|S-(xA(^s`TB>k|JPq(_~e&$$KzyeJA# zHj#fLqj!3K|3dwhuJ3aVk9&D3)0fJ zESq>E*(Y6dEMi)-Qd+~)DLg{aY(mF)LUEOG>Zcd2lw*ny4}k zuJnj!KOwPLw&mY^c=+(aY!Axg_YZuPVYunedy=$13B*g*KHb9<|0aJL7+}UOc6Wom zVrHM;>K|A_f)X&lJd}E-_2Nx>+q)>7_D5@vgrBH|33aw^{O3-!#oxnkvc+ET7V^2cPdITRF%5a*r zuC?5X0fSw5K7dp80!Zy?J|Wox#F15LOsc0mFrd-s7I^yg106gb>0bj9$3{MDe|Qv> zk@m$F-y@&GvU3RoswynSPna%=(}F06IQflW%G$$E0Ui0veNY_XJh5|hN z^D_m!A(~T`2=+HGqK}Svk5nzF1?^rz*iXM&kT>JS#W4^IGQ{v{s>c#a;=tn?nNvD*VxyoIVxxgF%i@v`T08j?F*(lf0| z^z=BXDE+U`YV2XJe~Ok%0C%+hJ9M-li*gTVKeK_}$>EH44g+Dbnx+VQ{2`kZ8vC@0 zq&20ZMf|B(ve<{%j^7^8vp5`t(rSzw`dP4GuA|Qwv68c{JTMTI<-sH=kU>oO^p$#@ zWJZgXhV?y!IRD2?W)K%0pUbH)(b8*%R`MKDYiWwv&o9xROT}uj4Jf;xoK3;*AJW+X zLc>p%ZPdsF(acD?OEkgoYj!L{jcUgalK`u!%w>+nBa?@?Bf*Rxh>2%Y9?C&<*P zC_@+n8P@3tr4t09zE__tWF{9fM4=P%*Iz)`QZ_+TtBY__r@)*+%E+@;%}_nWC_I|z zJyaDAouLnCMSY{WZ)%e35(S|JqodaiYZotS1P1K6{7`+pRmz%YG*|~`x~KQk+}_mh zFl|k03rvG}_v_sTLml^Q;Pl?SxWq?DS9+q6$*o!i7`Iyy*@2Fp3*q# z;Ol(-eU!S#>M9kv8UW3;81x?_f5mpx4J2MsWVodpE(e_NZb9W5b<^eedoEpu$xiWM zKMx?Kr$})LkfKZZQ*7^Nt>(L&kFOKERj#h)<^}n=4k^(vHxI5Y%N-oUpOoi8Aor(I zZ$(s#5jVN;b`qfpXGyW^8EfWgG5d8A^?RIK*E`uuu)&*eWs4L`M{|2MG8aoAn>=#q z(G2yp`81PsZi_Wt@jp8^a4ZTWsl7+;7!Z*Xvrx9MirAX|o6FK%cK!iq{iWPPpknfn zA<)_Xfo6d`zTfc^I=#1VLFh&A7NvEwJOjH^a!+RU? zX0r3QL=2ETtFi1*kI`v1fIViDntN{IF2BY!7=8@dyAlQQzS&0+b%p+@B|}{@4GZO7 zNQRM+W5Y#5eB<#aH|^pFsw!JGPlws~m6eR049f0=rinu_WxH7b=j?nwu` z(QQ{4w(3gOLTiF=yl@dgc&9r=XAVKz=)))}goiGHjcJ$!PY#%A)XitmybFp?JbkIA zl<(48Uhd5*-qY5{&nnd8A0i^2hF_&;)Ol^lJ^A|Qy*sG`x0%zHVutpj&Xg-89VF7E z1OEg1Nv@kG-H)qzTrDyC)vFy1%njZfY)$D!>A80XjPEM!a+&-wO*8O;RGaak_OEk) zqqtzthNt%aOYgw2apt>w+?`#Ts$lyg6$DnPaE$4PzaGvL?qqje=ehB?CAuY1lw-l%gjUyL}d|#j9M?|{^_E=ls?qwD?dEUIOrnsQ&VNRzOq-nK$R~02A7Wwl~r`w$?!+z{bh*@O>x!VzzZ zm?sTuVQUFd$O#t@rfp{KBv)mP%p0Zr@7H!JtSev@Y0DFivaNh*IOd5|W8eN6yZYbK zh{E5g7R?8Ym5a|t=BJNt6#PU_A1ZpLye#gW^DgGHct7k@A3N{E%RP`=N~WwFI^d6DwIg!mYRJ~MhKTyan z!;iYt8Lf*H@{)>f43P<$mqLYVg7Ts7TTBA)4G+G>A`|Dwve;3NGjWV@+Q0SxKn}zV zl>44OYWBS~3wf|eeIOtqBSSP$d->PuVs}Vea=ZL{NCnfDMxfCA zgByX+cBNZxLyCafhyBhe-B*^az6eC@@4v41CuA0Lx8&F|O#1Aee-t4i)esLo3>3N% zd6)l8h3qxiS3>RtXxNd`u9NH%e6jRD5{3V}Q}MqEU^YkS7w_TWS0s1HsVI2&^OSPS zV=FZ&5A5kf)7pTe6a7QycH|PbAc)0ffLrcSgs`SymocH#u8f!h&WN%F?mgS7>XCHF ziSiMjF_HqFLiF#{%T(XQQ?fX#O4d_{H%DASde>jKGu_?@r)KDXVg3jro)v3o(H0*M zlL*p&rB)L~I5cYdZFl8&a~J{P+zJ>L;(g9Kzw%ZpI8JF}Fon1=x%cENtx667!~^qb z1JjK7w76fB6fefR{^}qNg+rfnT!^u+SvB){=Cnn;ti)f-*v-Es`hVmbQ8uyMu+nl9 zFzYpP*IKN0BIqe^WIXsOKF}BOyog8gWcec!2k~`TeO;UI%1Yn*KvDn(-|SDZ#lw~M z0DPhcvN3OeVpz43zxD9&_+g9~Yd7*McwNytG=+=Vqdc_nw(C~YWmZ^-W$z&_)%)|^ znV%T9#9TJx;Us+03m6XY)+zR#4GdUNn?`*}Y2c*K>#u`mN7uX+p#+|F@C3qDYP$`8 zanjplU0wJBPLqGg@&3InP~3p54=LiDdJAiZF{Um8!#VomIkNQib2aaoIH#{UjSO%b z-7`MYQ{>}akAm?X9oju*i$mLmjn4f8vf2ZMSY9N*`pr9`(cz`KX7`CReF=+-q(%9u znwv*V*1^F~{67k75Lm{$nAloR%6i;GZ8s5k)Jt^IXRG4!?AKT=r)++BoG1SdcP^Yi z^qjBuc_GRaNS5<_{nZkJjnTB>yy3E8`mvPD^wt7WTA3!^cXJY+Nw3+keYsW*$3r8R#OPw*xFt#A^fmRki5 zLG%|e^u@;t7sRKXzFcNlr=(*0N}XVdAjg{U?(XtK6+s3hCH{L+()SLk{)0>8$~c8< zW}~1<9B>U$()X)`b3CVqr1H4fg)V=>2uEp*|4MPeBn7PD<&;!k{mq~shrieVM+QBx zi}{OLz5y;M!|k|n6hS*a%_rd(Pmdnu%Rel7@H8+ei28vSfjXk>>GZdQ2ekt0eRew6 z6_!5|3Gi)^ABUYo*y_~?!L;g6ukQ8>clb%#NOfY8qk~8x!m)D)i)PWAP%(_RtBCPI}*5 z>}3?lhM!%N`a~Z|@`fr9sh@U`eJ^(FrFcT6#0(QoV`1w1V&3a8QhIa(UvbcKFw!?! zG9)uxd4$j%x0?v&yQhk4lKM=N6gIeE@P(tN!pkL`)VIIuvL&0#f({P?{E z@R%~Ir&N6xjC<&KgO2TG6VFggNLx(sf^mn6(T3U7hl=t2>YyDK$l1xBnfSdjRKtJE zQ}Mm@F5xOadQ4@OeQfV-7LlAXj?D&@1tYD>Qe2l16IPx2wsUw8FM{yZu6sTEJXB~; zlQuK*#%mS^)6Tze&9>RUU}CCo*z}2IKc>65As_wDTVfm7;H_EXBd&L%fZ$gFi!1Mo{{`+^m8UVkoL&Q^0tcwBe`4kVe~W-&euS)!2U+iZ z4C1z(l%a3%44szlMSGgr%2O%dhUu)M^*V%^BTaUTBq z?6RuCh825rHr29UxLOe@%T=@;9H&*9I-c%#q0}y&LNScBp`d-}oIgp3(RD0n3MUSl z*UG=%wPLi9VZoHIQG_@r$ves0xZ1E$FHP!0L(Dr2lPx-jsNs!%PcSq0Z8FfP*~c`>qeVy*dD0ggj{FZ7n|uV5=zV-io>+|z7LJe>oFvyHDu{} zvc{kLPqfOHP&VL8U7qgZz_l*?% zN_T&1MKL=F zF|xRCqf)*WfOBSGsRYCz#0dEbH9$4Cef-#0SS@<+M|o@dL$oBo(UIUQ1}J?>6cMx`~}tOFAGOySE8R(Q~HGvlgSS^Arj$a&|#n zKr+*Cdb3nIf~#OsYnTf(iJ$i0HI87lXtdl_af$WC#@wBd*%C#*e0CYhPzIQ>(6_C! zp>H9w{SvOsBm~}_O=wcuJsl5)r8%|wrGypAM{yu&Cb_1h{T1G@(xm9LIysE#*Uh}t z;*_ZLK=eZ;u3&$0{Jfrpm^I+dYn-T(c3mZ-kJ8iIa;(y)q?=S#_vFZM5&-P~M@cv`N z^ASRG$&F-kU5|XHdl=XucDN`cT}6Hof*SL`eQY&s+ zIn*97e>UTKz#229Dq;o`%lRM0wE3Z(Q#4SZ$jT@(BL#U-0M)oOdRFhB%y>!b6bF z>QRiK_^aCxZ=2}jSgE9SfM!Y2k7ZGkWP=6i&Qt z`grUOF=V!4LKb_HTulke-r<#2A=)qb7WgmNjD_w;>F6@{UAl|*`hZP8>{!-YiO4SD z+*wfVW)>>*X|E-_iKL})VPSBrq@8E(W{%856L$_{P z=Xp5a?{M4wkGq4vf{kmKn%$cC1ewRj6ow{JT$v^nyvt{xEmOK~zetj@h;86j@E+T= zX;SAYu8kRzkWa@Ce+2slXGl)!h7O5>u*01A?D!;tjEtATtY2tB1~bAhTt}Rf=nu6f zeVysZr_XuEhcKcd`|C}nv$v^Xt+%WJK)68`f*WKXxN=<(FIrD4^&g#@v`Ia@K}!S& z=>NVk9Yh^jRq}47Ntpj_W3LcwOYzQpwe^MqVP6#6od9SWAYXkW%I;pk&xw&5M0_yu zPlgn~w1IS^qOhv30>9ktK!jlA-**&};Fk9?j}W!T?qQ=EMCo=2m>QHy#SFPcM7r3~ z%W;Snd|VA?Q@~lrp;+%!_`^3lmLFwHmQI5w>8DDF_Uq|%)OJ45U-(Q~Tl&Q%My=7i z*evcsbsLpEpWcAy6mZFM|Km|`T5W9rQ9#SfeFMs1N%suihb3B-jHqeoX7laWlC#{U z0XimzUPJy*UmP}_!lv;^e8KBvzytJa;{|Gk z%LZT5(#T{l-Y(e@fiMc~^f#`rW}C!j_s@sG8sn@JZEjp;URdce&po+?jV`w5VBQNk zpFX7YTY;MJ=&Q15SY2gh2#{%1uFF`!-dcu( zN|O~%#^gGk6Y=oT-NiI3k0iRp<0JA!#S_l3Vvi3_CAMQi}WZyw72(Nm&2UaM(FncH;gWcL!el&B{0$+!pO;;F-VtY*%-<)ly z`leBgpwY$&vD0+1h>?RQ$bCh{r5)PtC*&nXns;*C$BYlz?8Mi94$0upTS35L)-y9RL(O^h z^M2-uJCC0MK`4Pp?u`tL*D}1#-qSMY%)@QMMOk_5$1kyFM#9HmI5rYEOxvsbnC%7 zK#-t$3;jUBzM$1*`t?SC?;Ws&8Ew2CZKHy3ntfr{XMO6+?(?YucaC9iW}lbLXeeb9 zaT8aRg0Px#c5}Agv#`=Wa3>^iG_OSlIuuu*!sN`W={c8{MWTNjQC)fGqcwHsQM{=l zA2N1B=h%xgkQ$q7p>qDd?XpRltWLXqw3@DXNBPX+F1vo>_ASYhm#(#*mw53VtSC_s zRxap%EXP5kEq5RU`?lRQu8Bo2rw&WBI-4YJaN0<@IgLu&9iz>C{=u@V`~G&wM%ST7 z92^xKf!jkw@Y?cRUk%mN+6zFWlRXONPeJBO45??o`6Q(yV}b=SM`U8{gjAPqr~*J0 zcu_MZkMA-3*}gd2e(CL;z85%hRA#U_NoWyF&9!k-(u&aaz8IWKHRA z7|Kn-5V#*c4zBrpnMIeQO}Pzh>eJK;+(4_v9=bgNg*fA=6<)8j8MZHb1|mJ{G`61T zrJl&9zZ0cLcz6 zQM8Hw1L2TIyY;bds4oP9ui9slDR6&#;=G<b)b9K$p7BZIzc|o$1fvbs0(ot{A-K0tp>X3;7t)UvrK_)c5hK*#t+Bl+ zA4Jlet-IHpIX~oGvTIgjAs&Lyk-xS<#Anbf9yVQ=QNlNhDh0ikUht?@;+4^_WK!*m za2U_(RfOJJVodndr*88riypxA@zfeh%juR>)DGrVB<^A6R!w))+yeS8#rsX3HB3#X zzV7aMm;0`+JI8&FXG1<_TU)ss+Xp`SyWtv1EvUXY`;Yg-2S#;Wdq~>7#I@O0joj+3 zc3;dh;h3bL-0A#iHIEP&7hrFRQseAr>RVd(O9)p7v)RApC;m6bgwzZ0$o^H_fh2di ze;c_&@a@PCH-KZ%?@F%u7hrcr|AHribACna{x-LCmB+xh(yi>`qv(;%%T)6;K@i?a z`Wtz-NK>UiMWR4M0ic2R#ERzcNKT^^ysCyl8r-Xe9J%agjQqc5bHc{!DuU#X)bi)+ zobnaIwWB3^GnH)e-Mu>2MW!=;oc=4N+kt|M%_ekrxdy?!9ZS2*0=C;+_1gu7pb4LW zcy;`k17S`q3?gbWdg%!9A4a}^+HbzGN%7pT^UJtsMZ!j&5Sclw6V5DO|MrEr64*VV zCqdGM^V59puDB9yl#CLl-Tip-H-leFQ4Xcu-)>xY3*BW<$t5ClMJA`mGq;}@d`^<; z+Le2?MViMi67KzxBGXt}?3$O;7_nW-=^>Q$DJ?KkE1y+$64{6w8M9%G)Db_QPnh zEf2rlo@DIQ*$%W*y1WpFUS0Zd&BS!TbwR1N536zJOak1`FQ=q*^Y6CggP4xzQj1aK z?u!i13iDK&NG(rB7^*DFSXr2atQf1_({fnQL1*7xAL8bFBjxK2SQo(Ls~0_;lM93v zWYkD)a=u)QPxASc=6rG07@KpQ8l!iuQcB>X+E%FfFdU;Hxp8-BfK-vk4LjAnh8;|8 z&X}7QzWLPSaXNBUzgw;YO2xC8^LgO*{aq;_l1HNyu8S&tQwbvDGZGSPoXxMKQ%%;g z(;&RqXWq=-8V{z9Er!NqyWs|B$|5>K@KQ{~Nw9&JA>7O8|4Kl-KWcOQu%zd)g0i)q zlzlRIQ{U~*uzETMD+B*f3FO#lKLGJ*G#PE$LjrU zx>dkW_TTnP!0k`j0RNKW*7_4e@BV7Y=MRZ}@)5Mg=Sslv z!Jy91ptND1cfn=Onohsj%kCTDjf0{W8KiBpKurdI>jE(2UT{;Qz!xx90^Hy1$J}25 z%;}?C&Ewm7(OJcs6a@4A+12K?pQg9he{At@V}Zqa!a6;4u!IThDQb;tX)S7N@k!6J z&ta?lke}USY9q)UPWkmDO?Rs7dxy}CLc z0XCUCr#y6_}2oBxlGHL>O!q6=Ys2AOf}j$Q8m(ANj0*(V%K{$iHSb1 z0*(Fsf)-sNl{lRra^`8|up!rMu-7-;A^X%kwXToEICf{RhPu$OT?u@Kg!Su*9Q)sm zFQx*GJ(jM*Pb<=TbVDU|>o2_@ikYhVd#(?=Wnp7GzgxbzWckk*W!~GIB)EYLobaOi zi&et4h;Zn?2Y9rCmlf_ntW{YHO=cA>(1V|a>;ve*Vbc(Ku!{V*L2l9OKg`)6m9H5J z^`Cq9?ev)&uI=f`5U`=k(re19WXE=|?@NUoBJXDNdDc7)f{H zku$XkUM>ef5>4i{ZR#lV0;MSBWFx|ex%SD94?D56_#qxMrg0A;r>h~%>JtTONXDNq z1pU!CDx+51S#j4seaYr;{P~$@9E%Lv`Y>0g&H0x>-ZvI;c4fSl^!UG9X2ueM2GXwHv|3&LY z_=NHu8{ATE=MBE5O@Q9Zy~XVy1)7>gj7hLr+dxta^D9Uz9G!Pv^Qs!!v#D>;ZNW>8 zj}w?-cUO2Q{6rMXF>FGzHK1;Rk7d!IF#k7P!Aln_oB~O6+>jp2^>iFsAVxJKP0$WD zY|mmf_R5)5vtf1JbAqWZU)zb9*Hko8g zT2`)FT(8;`2r6F)LB#LP&iGk^$>b^4+nhns6QQFBTOw!T$qguX?FcxjDt`xNh1 z7@O#6t`+{a#K!J$P5AKb?cIfI{aU~BL=lgC8kCbAB4S%>7}I>SP>Pg}78ti*-)CL{ zLk%*H%76R+gI;K`A*S#r z`yxS89#{l)O}C5#5rhy>Neq;y?T#-*ypYDN)>(KX95|rNq-_gK#kZAnJzU=w^niXbp z6M0JHm#_ubr3rxNmFCDL6=>JkB(fO#J2*J_Z$01sRCRmnb+*62mv`qrp{DT{=73%- z;5Ysr&JYa}ee;7rK<6VMC3)PW5Fw|oEjKCqE%)Bg^BMD>2h_?C4(7(gH@^`SnO-%c z`l9A&=NuoC9~)`B9Gq9T=%z#YvC(DGtOYa(&50WYB5=o7U~b?yx1RS%EBahmmFXL& zZ0ux&bDGLL`-W${Q|_F3K27hf{MTvIy7TrQ?OxuA1&z{K7;2*G*#cSU{uf+C~#wSusuw}L|4vpQWqw=V745yqCCfaH?VHgTry z+Pv(>tuXfdg9lZY6dGy;G6$;P3R>tVT!b3h!-zPe1+U&(j=r^A$+>s8$}djRN8{2j z?>*nF)P&9rsN4^YO|<-BIkUdX=JjS1IcQ4A;Jg2!E_CT_^uD4N0)gEu;TMVoIMsMr z6zDjc>};DguQ$n;f?Og#(1opf!7CDg%V4eaQx36s5-?@XgL_2M<nXv@K_Ys-ktrcYR8{#ee!OSuKOQOOHRp%LmWAyC{iDUJ(7J#=2 zOz(a;ARA0rqjw9uqwjG7u|-QqeCZU6*058pVIUrLWq<466Zi*o z27ai>zss-ks=Xh8Yj;V@-F0hd0|*&A1B4+;41KObnzy8HR1lRa`kzmb&_{H zdiS_B+Be&3RfUN(uvP>El+Iy+Mk%Rp0wleIXCpb2zNGe*F9UPStpjXZqh-|A`-FJG zX-uwuBh~X1y!CmYsDFyR#1Dp0bS|74_B!p)YhEmRmNGRSwi)OFx(3TvS@`gy(dwVZ!Z@G+k*6vjOnMcjHCD z_<@dbYuTqyd)p<;2qM2cEKs8FV(n5kBIg-WIR%q*9)a$E#B0r@wz*jrd}Kqk?0D;z z#_ICxaUEuF~M7PA0U(Atlpk-4=;SSCAfOLACUFWUxMFU+=o zkN2K)MRs&5>w$eEx7J<0c8?9QpnE4EQ_;1NXFRu8aFC-rB!~MIXF1A!40ZNR(!8_P zu(<2sRD43AG_@}5o3I{LhWyXwK)8N z{x7WJ7ewJ=MDTp`f=qAlT}omIQCk8rm&f5Z4bnU>9@i3u>JT)U@4B~gHQd{a3)GXH zNY;xw*Q*!@eyhxgnurlyOH{{h$O^94PWoXdKhd%s2c4}7Vg-o8B0c7b z!La;n*B_x6`75EX)IsEn3$HfG0;vg7yA%G^ngm1n4RShi335)6V#XVYzQH(f?yQ?8 zrqZKRMu<^@(b0?Y|60g!gG? zI&-SeoqN^$kyma!K9sbKAtQlU#Qt$>@u+AJU?+)q+78%6yI)5UHOeRuEV-Ie$nZ;1 zb|1aK<7#XB7ScUYk0}k|Z~7=qkH`2Yp|w7OpZ2p5LhGpYXRD-U%d}<__c*Kbfy{Jt z5DrAm&yE(+F%{I`t5lUI05$Mj9{#n(bMvx?D?SFHhLQFqYowS+Vdl96mIPLYhZid* zilzjiylnmTHx22DR55(4kCN)dkXMn9;m+#nas{eA#9qSTw=E8)`CoQo3re&vQ-+8* z_%W|nf|_w?SZEJe+#&2wVM7?o{Fe(kx^p$O^cBJZXm|ypX!;AUA%dQgFr9`xUi3pL zz6B;clbN5A*;hY>f)$PpimKri;kG|fpqsFTt` zgb!MTwB?e*?dIIcCJMQ_NL=IaF?>Pp$?10CVpivPXSyj#yll4EJo5jZyv3CMxvA@i zAxQd%rN1}m=nJ?EMZ*F_by~Q~ioDLVlya6S&^i9nw%RH9a=$-eu@7uEYywzjdrV?` zc0x3*SnCS8mSPrqAh5OI3N2rF#+XGaz|YWYMRrsZ49W4$&XfTDt#k{H5g=-m;+#Ih zS;r$E=p`2Kv;6a~(sIaS{?l{+Ne=|sQmLH&y;4cw2g?Qig%^RE^TV`a9LR}<2wxRx zRc&i9XFEce_5&YAAvtD>1fY6=F2H{~O?9IYz&S{elcd&&e(cPTaSS{!y^cEZMbw5` zV0*Uke!-t)2k>lIFXRlw3&M^UmhSH^AghhA^SLu13DE=OhN7pqd{EXBFVQxCqF_125_ir&qw0^+VI`ai2&M zM0ksjR8K;#XbP}$R*`dN*L5MEGel7>yt^>1msThBUoyMyogsOXBbe^nk+}PAA-Iz;9 zs78r-dZ`((IFy67jeKaiVyK#!Vwl2oa!gvk4S%7O@Vs^5R11Lp=zOk@_&IvTkKK=h z71K`;q#NKVv;vcn7r^}P_zzSyZ~3KS^M-3+;ZFU-cTW#-*CMymY&5V6z8HDzGvp*0 zcyZOLiD>`&$k$nn{z9RAUO6TDKvUd6EjGlz`>9+GS@nk_Sh?$k-kvi?rRkUr;~>*G z4cAhHj`sd_lGF7TT2f5Vm)C>S`JVflr+5&pntg%=hdy+W9JBbb9T)hYyB3{3-czl? zd_Kw&AeS>r5lJiS$Ol?BquN=ybXw`vz^_3uFCmElBfm{y;QB(PqV&p8ksko}R4S?+ zuRl)5iMjo%nO=~LzcTp}3Hj`nM*_OmkhM<|o_=l7{cRs~D$K&DWaAId9A5cRyQ5>Zl!O}wilDKacG8V(#;!Nel;%q zkyI3WDs*n^L!Mx5)N=f;o7smJP{e5O{Iv5OEFUI?9bm1Q=NE}>APe+RK=B2^=n z69rpv9aX_6J#cn-H1^9^EHp~ymi>fVR@$$dP;7{Zv;8@kChPegU)(S3ubM>M2<8!74RjE_c&}!- zqKCIXsId~xK{wB)e=`{|(HsM-vbB)d>$BV+WFeC}S&U-?%`D|WKGQ(S?ux>lP-$wk z7|QUSP3EAJ^_`YQpKbaNXZ@-}t1?&H40Lq#DpQ$^or^cFNa}e-MQ>`DpITm@Lcsu# z)*v#M`%?7WVmKYT|J^1{JajsjR^_}7+9sMR7A&1nVJ1bw=TX7Z&n{!Y3F0mDPo+AC zejJ-KT=ux_KhDaLYYGldkfKy7pLs;QE+Y9zL9E7D|3}2`V&{?MZ25#}N^7A`-0GiW zfv+I7P?I%ACSj4ub#SAR>}l}Al8-hgzNJXcPKY0=v~v(`jSwmP+HbyxAuf2@RwuF( zKAFEo^j-AWad6$Gt4G`fB$$HG9(`V9M%*7xq;b{6j@!2I0&Zmnug(h5V?aA{V zcWT+Myw1nXGuTm*1}Trpw6VIeqD{ zwfscjBBJ?UBb>7XGAGD^ub8=<0Ba2HWh^>>#Ef!&)zd~$sS}kJV-U-10a-qE2-QF$ z#~7T=27QnwoR!w|ft{s)r{?-9OxtMzDDR(rkCSUbUtY3P+9Jrp$y~eazkFbf;9Fk8 z5|Q_{OXj)G?I>D8LW0OJ+ARrcLdzDhH`3QX22Nds=9>UOYfc4TZ3Zc2^RoEUu@*r; zrD`fAK4@Q=5Wd4^IH|R7oc_b~3iZ)&f4*@gC$*?MaV(wB4lmcP`kz0x8qIShCntoq z+9PEGOKA75YwNZSW4{I*zU}42Wj4wc#?-hs9ar0&?|l~t8u4)#sdcISH8l5q&poLM zs$JspK`(=Z_?cz*ENG<#Wl?5QR9Q-cT?PvZQ&i}!Hh$k*Ze($(vD7u9=QL)LsL<8t z744}MTHKt@_NGlJUJ)|J)a0cdPxdP>K8u|y)~;!Ech^6tK>E4lHFR*-P^^7Y>F((L zIEmAGsw+$oyxUJYuFv=?%?2LT=pGDz7vr0+ZV?^J1?0%`BiFXM6{bb>c{xqLIWmm# zYHL5ODmulGXDF64<-*ppPivhkL|>b)H*EdRPdCthymAYu{`Kk}>z}r3U4I(vs|&@$ zNPwMT5S`j=1~7tF%`exTD7ebgOEIhlRB3ggda)N!WR?bEolN9CS=-nOVLl$u5KWy+ zJJD%4o-d;qvc7ju3l}e`*zLxx<_G^Twx<6 z4*&Mv=bmdxEEOn(bYd8jR<51m0Xwx5%b|O*l=dgQA?Y-e>`w#6W1-s!@95l$!CuF; z4`Wzd9~`^Q=}2rHcit!QiGOh1Ic;V8xU<;yJ?quo<-ipUH8r)Hg})jSmh5IxhD<9$32{(!Tm7j2Zt(#Awd)T)DMD!$)?)AvrE(#ciFTww)V^5 z#)8)KKiM)j2#kJaG^V4s=_5{s>p7D7Z@phe(5J&9?4Bz?o(Y?YlY#H0GDd6B3&X#mhp;C+Ig6kk^OA-!( zZquPdIvwRH^vZn6krI)A|4w=7uj`*xj?92w%Jen2BPDg=D)ILi&}j=++c1(^nvl|K zT*FZxieZ#x3U`~!hvQN>y52~~$h#C7Ov}`e_XCNfs3^->=rn1*-&-?PA5t0~E$eVP^gSFFE7y#~Bb9{JxJB{^A& zZb%(sPtA0IP!VyH6XFxZx7qCTUc)i z5F;8@A3klvIH@ondL-zc5l_q`{|NbhV+9M_+@0_Q@R}2_i>1;u*sl4{!3UwzUE7nz z+GvL~?cH?9|DZnM;<4-RaCp>?*J`o|QqLgY__%v;2xCZ<76k%adRmHsm{VVsG8-mA zeoe;hi~Fi?Dnk@)qEufWk6wK|$+nsBxf6?OFc{x93iH4}bf`O1ZWitm@@g&U0yX(2BS-+}!mnvf_mk7^^xP@t#L2>Gsgq4}|=;Zu?%ymGr8W#b%uh~!ZLNG%b|)E$8Yyyg7d^!EKiw`APuGSxT-2U6H!Kjg|`@8 z(2RcCrb+|#`e*&F);in@7!~UcLzp$C4emp^EvvJC?$-H?_UGM!?Awn@UI(DJvG2$8 zO!q0Ob=m`q?eI^{Ruh$5TF~PjEnq4rRs8y1%lVcWX}MO3NJ*Ov>f7 zUeAZ#xNpz9r&=BGbLk83x!Y*2*Clnk@4J0n38!z?Umsd(fuY^_>Zg6sNWfUH;~a3j zkq&&u*!w{6;VdEQ-lH4t(0*A#SS<$lRQlNU$t4CfhEh-FkIYiF!`(g3XD|hhB?C#J z?Bu?@X3GGg|U_LBEf_EPs+^7i;|Q(LWmk{R&2QTqUm zCz3vrU7^?2v7fC0TY{{_EBLSsq&JBiXpmu`hPGU3yRsox!1P6gBDx+o6PHpK=`$DW z?TK_!%KRQ|Crx##(Mx0%P2``^IChG{zB`Z~`Dv$J?KWINQ>;aaMMN=C%B+_6B8Hy2 z=_oLwW-)S(SpXUR^5L##X=>>M=}&;;&R!pY;tgK(ezP0b#LPJU+TDkHm%feo@kj=6Z$QSOHK)Xc!p4@u*Ew~e@eNF^g zg4!SNzHg1MOfjw9DQN(7tj10kvF*4JASjo!Kfy-}yiOxL#B>JFcL?mr!gUrP>RWir zhslPA7I8xGV&1X-YCY);5bVIk3}|NOTV=x{z!cAX$$zt35#TJ7>^R6HqR$S%eK-3U zq^Ilj%oTw@y&~!SU9g?gL^^8KchVm z?Szy+zFB76XXT>H0din0!!HzkMbY3b7wQ4+61dGFU*t7TfJ0*;ZZ{_jS2GMi{}cdOMoS zq#f7Zis+41hu!4CR~YL%5Ti5s!!STsAKC=H6>!S4n))G9avxaWdGXD1!J~05H@9}r zx?b?oAcs%9Unz`;ut3MXdC}X`@9t*llMPu9*lLZ+*3cgq?PE6I>cp=&y*<$cXP80Y zM7BEBgHGGD&ur(YJD5S>2ziOwj=E>Y=7zXb5E@v=Inw1PLi~B9WT3+rL3E;ePjaGE zNPeO~?tiiOo>5UP+uCr0C`pNKQAv_fB#C4R5(FfRNR}udQBsqGfJ6b2oRJ`sLjz4l zvLG1=P0q1Nl4+p7YR^92bMCv(J?9h2(IQD; zBT3-8l0RT8B+gfFW=z)yR&5#w4Gt3Rzm2%GaZghpbrk$baxJqZ^wQA0ZM)OZ8}2uE zINuZ7b;QsWSxf$CI5!wwZYnB1H%sCR454cRS1$NX+GkfUtx{O6h`1kWd7f5$OTaloB4 zOjpER#e$9|U3z>7QbH-@_m*Az$-nZ5Otr*Zx*{v${*+qC1rH`oi0+)Rxq*dOW2(3d zSskzN(uSnO+>=}Sj)GiSvIT)Rf_xRG${c6gvAZ?GE98-DzUAeOjJx%nr{qH5-EZ?0WMoo*E4 zsy_gE5E_MI0l+^Cx^PYADATGJYV*d=yv|Aa3{=B$Zh)4Hz=w3TaXcX_*}_QOK?X!3 z2V4tP0-({44D2twHz3(U;A)Sd1!>}!gUeZzUd;OYdjk=1)u*6&UG?47i5&Rp!B*Zy zy-=QaAJO_KEc4WHyC8L{Cf9Q1<@%4(Vj;)XV$fu-+)~5Qzr}I2Us+G+;KfnV)NsDL z#=+*W;`!;m{oZyy)?;C^isHu816q<+A1}{`CHl_S)`pZA-1vvbQY&~XI=p%FQF~ph zhyD+0&*ceg#a8D(K@N5M_f*-DC-FB9-6ROz#0p(KU;aQg*qUq4+)M1=_6%DeRggqg zI1eG`VrST$8{e)^Ie&0Fy7lE{Jt|+L_yX&W><(JgQ&;Ddda~i|CDi4C+9ODXjmYzZ zjhtF*SKqFPu59Pe|sp_JJN2eW>JzAmeuE`y4-%Uh_+ zHex!nm8!H6qBY_XB9-D1Vh!TTk0RGTbN8h%=4>oP$mF{py}kV~h``(jyJ359(B)Qf zn&k?_2`K=skO;GH2_FW%^c*ITnx3a?H+iiSw+f01S`Kp1KQ!idRAhtMxl84Gahi5se+;OFp}8>;Vj z#;hl*rGLydREhgnzhhE;20pR_#vRIw>XS)uiSx!v*f9(Yn|}yr|xWd&!z4J z9%Avdtsfh`h-Yw{XW;sm{1-G`9%xU%duLk=d&B@fBzvSVd#)w>)pw$zx?B0zC?ENp zoUAkun576ko2v0jr1e^D>W*di%@H`OrN5J4dYo z#MkHD^TI`60+k1xoW&r=qd@dPnkQ@}&0F-#nd`|?9PTWW`eTicgJu40a+f3{mmsl> z4hJByn3S&Q6QL{6P5`;i6-`0qb8jtFL*G+h$HLWa-keSo(|nbEs>X@%H1W{Rry9^JPBWfIYj1IBz?mJJb#7?fteo(*NH5U8 z7a$74B8!Pium*|O%iY(1h~oPNS*3jM?kikI{7#SM>ME`1MsK9wi3FYVX9j&>CZTOW`mmvJ20m(#as-``E->!~mc*-)mpqD^a> zQR96z=%Pq1raRQJKT;5>Z$91c)fbEd#tW_K8c~6_d~7t=(PGhNO9iS_>MApX{M$s zvi_51iL)v)&T`c9v2^`m0QKX`(j<3%>D5E-u-gBTOMvbBEbA_-bQWtpEA`uhG-oI? zjWOBB4wG1{egV9WECN5Cp<=bS&dTJT;eu4mks4)ZwJ zj<%ksXCIDF{SG#cJm=Ad&*o?On*xZa&Gfy`_2ylT$s3QjgZsqB+aqXSku!U2v>)$! zhuJM;>`plk+!Q|4IfDOe^eg0c0X-4}uAYntLC;3khf#dH!lxtn)|R8ao{tWGd}%!% zdFf*4&ue{}y@A~|2UpAKBX@5maX&;v29Jgmxt_i*iggbIaJ*1_6g5@5NC-(zke5$MB$jWQ;)>p?T^6D-%%R^!B&XbDIk~(0b zGLj5LEq&I9w!MDHnX3&erHhsiAI=NKw;+eW1)g%rGNR5X{-#&hs@Hpdj+%I;20YOX zNNWTyTOse?Oce1k9>vr9Vt$7C+qa9b*)Z|2L)$PC@Wr#I<86ADK-Y1J35+4ptE-^b!>VzuvJmH3|WPn1Y-NK8S@B};&ayX*3{-BsB z4UgUZAOt7P@xW@7WBqF|E4dvry&_Ipp9n?pEpTaS0d(_=<%*82w4Qj5a^Jag*USQH zn}LpzTEu-nXqv~aRelUNGRSeq05;c>8J^)tx3ovEv{XSFPk$=)t=jQ5qmeX26a_a^ z8X+lbpK?4SbR{Kr?9#>Ek^3R4*-sgv)WUpZQxEvFC&*78W2?|LOJRmzGwDBPq|S_x zKT7=+;h=&W+Rfc@6Z>(EzUcY>5XT*Ur}gJL4IZvVxSwadP(9Q|s|v2DP51;z2wH9+(aZXA!6dWpctdh#g*S4y zf{bOm7Hp+6c+rQKaBs-vJqjm*YgbrQ0)r@IxDM*0)>8w&T;JWukPe-+L^UPLo;0oK zRgoF+3if4AOxttz(CV{z}WqXgG_sl?rSc*ouP;2W;>!D^0mkN;_< zY1c$0^ofR!Fg&eLk85y*Bf-Ej4sDX}jYeE(3U%DzJR9~(67KU#E&U3*@J5E+s{Iz= zUC+9Eq;KMRdcPc8Os0LbMF{xkcfn3I{q66y%pI2RmoUj^l)f>17|R~ojzkbzkCjM| zd}<+cKL?k5p6z|#1Q9D-hUR37#$$)refI4ihcoD+64bVSq^6FC-fLp9x(9YWU9A;t zn@e#Tnk@lrWbR!Amctg(MtX%My(t=FfwUKq$M?M%uh!0x7dPJD)rw;r8E$SJ*P6YO z_I4%){m4Vib~*$6oP1m-PnKpGjOv;#1a(8w|O^!US zg$Z1>H6vG%#_@lHhs7$&`|)U{Cn=|1mjUW`(pA@HCi1H5x`rb#kOm85rN(;PQkyfk z?P$G-c+wI^k53Ve3EMb#6VQS^4rl?tsw=x#$dm}t({F8#Bvz!ejQuAq#9}5=EdC_) zwz7~!n)~`RPC8i&3`P=C@2>hsL@`SnN#OX?`9d546BCTumIVyLH0W@7UMLgMIRaaG zx-r7OzIrn4ZpyBcSYb};bSTvd$Ol!KzEORC%lVE% zy$P*X-%zjJ{CELvR^2OTrZHWrRw0e0;>x%U^|O1qX*Dp5-#M$wIc zVM6k_3lmC;tFSPh+Of~Hx5q#4_95Es`o`OLovd22t{ko`-l+6)Gt)WxZdPeC&0h)a zbkx~H(d)o0VhXkPatgJr4?758ZSo|BwhB}MeB;DoR^{BreB=F}C=0#OVI#Fi%&46f z#ls8K!14Z27=ETjW}&X!SNhvYe9|pw_u;(NL}gJ#{1^qFc1r*yFhBfSDMCreHVS@( zJg0S;+W}wA?$7U(NQ(EoJUJE{f)9qICjkN|- zB6HIC#*hd~GE{FsYjU=g)qaCF+ViB8ZWm!sb9T1PP&+D{GKbc`6~$s(e&rh9c!HTt zIS~BEbKT_API%B=-PqS;PV+<`y^ZFpE}gJp+g#7jVLpUE-rAW+Z&DFHn$)UnA+qEt zo^yL?i`wKLe~W8VPH8h1A5TaLFj}MNCGR7oXih-;2+h~?Aosg()mtSQQ`L|V%6BLl zlOtV>nLx5#X?sM{c7o&BFyFms=dB3s8|{}J#zM|8hDAAU`Pq2%8DA7cPC4*CoaZ{5 z?oLQFAaDERQHIx62E?|x=Q<3BEq(f}VmO9%K0&?kpuio@*PNq46Fcra4bMUfXDJT! zx=8)!aSumdc^3T*SOKh5vHeZikbR!F+q>~bnP}V`?UBK@!GbRE(?vmxpwPxJ0(5x? zCosr^0n1#I(S||^Cnz*fjE?@X#I$3C!kLy{oE%Ps^>}=RHKh~$?ARE_*%0KPPIyBq zLn8c-x+h+j-@UuMy@m@HyOP#MEK2Fu*NJAKmj!0LMo*{?;y76qIg+DnyD?tTSYgTE zHtlMb&HLKuMWYwvs>dP1ynmRSZiSFjDuQPf*(rXe1-E%f;&-~+#TF?Z-J5RPXbtp8 zk?}kmW^w`O2=)97j`*t=FFY;^&rwglbghVqq(H87v-WPhG3YHQRosXjZ+2}Q`%=2F z>Fs%{Gqa^=WwdhpP^Y$Kv*U@3RsXi_iV^0m}7M zh(aLgEECa6+ucBE%V$xJ7-i_bLd>@j=aM^JpXp<{qGY-`o={=&iepyR3BjS4k$(Si zWAdG^g1~dT(R!H&S6GkKI6W7M38|nKk}8(`LkHU;7#4T1X3S?GzMov&7=G_8T-k%~ zr{8g1-E^{`suQ9u6ycBouEXVVhwj(bokQi3{Hi1mQLaaQrBl!iP+s|2XKz`*s%0D0 z1j!?<9STi4uX)#o``l~lBjn(6U%n+z6`MI*Op;4r^oiTJ-Go3KziOR?RRWuvs`n`; zr0vDhOy^}m{~(5-1N?F(+$k4@AeB4SJc3#{EVRB}m(!$V3!YNlu(M!*FtJL$3GkO; zQV9}}EFn$1FTGO-*$1TEv$8Zif@Pj}cdrmptu71tn&F(CC~B^__2ywJnJ`C>T>`uR z%`B^rOH@&$V~he-upUd7^GukKCi6u%Kx~Oqo^S-UbNrNR4npK8UgX%|dX&W&7uh>9 zIF;Z7GOj^aGQ*{jfC>6)p))jzy=KkBb$_|ZkH<`Q3eRv?6FUoucP-{!7L8oB-o4Yh zoUT{14?mhtGU`bzbZnMsO;vtmc=(OM6cm~`?PbAOA{dUPCOe%RFEK&o<5Y}Fg3NfIQ#UfJB}s3SAHgE@WlV3@8VCFsk)o=h}07$bK>MV9x!V0-15TJjgb9W0PD3Mb=cg5&urBMJ(CvZU)@3Esh0Zf_D6KZD0TG1)7Av;CO}Sxdr_-ozl|gFQE&c(~&7nTg&C|*-bN%n_yp2CZ z-A{$wm-C)Lmq{54=8GB;;Y%;ZD<=y2WQJ97(kTlRIx8xzJ6~0*CFpOai{5drjc0ooSuPme>r!aQa7#C5dWnla78f#EtS7Ho@7iW7t+iAT>iu zmYX4LpLIfSsN(i(=u?}Tr3!X*MW5{1j&9cEBiblrywO`znFbZT9rWsR(-HL_?n6=p z>@sRWs7oMl*NoXF8Ei)TmmyV>KJ59B=nj9p%l@a}S3^0<&X4cXNxW?~@5Ju6Z8&Ma z{5pDvb^dDS3Eo^8f%w{2PAOI{0G~UtRgC`VMxXiAOJ-cNqsAA1N2244lRhVYKO&y? zvOcL7eR=KN71&-Mzwn6(%s7Hq_-scu$oU)Hz$}U(oJ)910H&tQTf0gRo3II;k7?zv zE>vNKTGH|eG(_1xsiJ9OG3wiHWbvZ;qcYq0Zkr9cj2BB?79K~6!pSY}p~WBXkU~C{ z*1~NdAC+Cd`()o;f-0#hOlX%yPu%r=Z+aM|jIT1mRs-7WdhLP;>M%_7l3mL{=3S)K z6ASFMs}3tqxZCPh)sO2>Rdq=ymEvbOpq}V+Q}sM4J@Kf8I2|GA%sJ;S3%7%REq7-d z+1(%vPX3p$nTV)00^}AWQh>?|Iw;4YRbeqa*+?p8Z~k;kA^KpawJ*(e`PL}!-Umsd zQinc~QIJ7HYws=hSRe1qRX&olZg+5HzY^+OjPtZi_`~i^{>xrlxM?hb!&yIttp)mulTD1nhv~0ye7FV zHzUy;6{#s+75EHZ(D|Ng^4<@1_<45U#v+)PE!$U6xRfuF3X=^hUHq-jHraHz-7|X9 z1ZPao%Ey`C&&*<*_%)QYQiasmL6J9u1xQ`USPOLc32c}?e<45F{o@mhU&nc$$16mu zJyc!A;d_VjeI5$gtTlG}zSf`6m{<5a^mn9)mA+Ca-oP6A`nmtbrN{Rhzkiae zD6KzIO0^XvlyFA83e$64Dp$ZVKR<0jB4I0I(22sny3fz=!a&%2?<#r0^0usj@M}tP z`s~^1a7Z*N2B4GYV8fquH7?a%w+q;l8cC;|VOwREz@BLXX=(CGlnUJ29qY?SY2bx4 zOPfzBKVDAXTj_Id5TKhUXwbz;KX$5zTvsJ{2YH8gd6@@WW!bq5@=!1~lA`J*fI(8g zDx2T5n!MQ-9YjoKOh4_imTijKG<#8r6kB*97`9m%>i-FS;mnAwNX47HLl$XZ=(7>r zv~u9baMe$Tt^+D@wUt-ynmDU$-TPz9`N|ckG(5bunqY%SiCV{HkMn~svs)}_n)7G0 z^+ka^WZ3=N4ItQ?syR@8;UP&04dr538T4UB5x*LqN)m z8Hf;V8BCBr=&u4^jGjtBQXX<|{yq4VPy?>Wn<|Z7p0#rUl*z}WO^ozU{F7-t_an&_ z=J5=pOdl9~&>@qBobsGD$A_7&AVGhS7o|qhwLsjy3CcR0af?iF3FwJFG79>ac1BPM z4mzFE@1{t>3QBetKFo=@P?K@kRsL+iigsd9hEC+!Gpv^svw%5 zJV*D>MW-|9DXt9Uap7NhlO*1`U8q-EiSkZ2UNsD)UcQ)dN$zVho3FoFC$`GYw~5)*waHC!>*hS1EnFyUp=?2JMBpN9 zjZqT;)qdTv5tY}xyGvud8JCwWUbs}6jSgQ@!fvqlOj`kH|MclL!E@=aSg{E`BF{ zX#|g_zNng7PdrJv&slqaeJg=>H-}ajX#faTQ(gJ(Z#RiVa$s3Z|`OFtfcbf>rEiD zK>N238Yrnj2(|8VLxy`g|u+$Z^CBikL zNfpEiB=@h1LA#>*pIvN+BRaO#VX0aECIabm@0-3XRJhQjy=|eAQ25wi#XXyBxRW6J zO=|Vq0njQ}09i~Q6oiZ{E?G$|zTMEx@oLJe5(6f(Z)VZKIQT_#=(jUip~s*XmlHaI z*88k9j8<$qSjJV%|K6Dx-LpC8)@=(wcsqxt`Iv^@V1Gc43Y`d!=A#xTf6_Y7M7W9S z%q-MLD{oG{NE=fl_B2En9j2ss{J1*d4$pp3CiMc#{NhQ%vyFl?Xejb4ffyneH=_J@ zj;D>X?gTUC%%4~D~}{8-stezlFbnH<+g2-DlAdEJ$^ zwj923M_lIgEAJ~5oWHMDAs@e zhd`;q=6jxuJLb^62-VNsxAR|EC-Pd~#uwN3a*a=cjwiRCzO;?GC#@cz=GH~#uJv3n zKAoE{=)#mfW{!jv>kA%$QPM%j=}F*(n1HRZ<|E`2LINV_tV`=4p(4x62npkF#UlLy zE}d_?X*u$~hW(jKxo&l%vr+d(x-r9iz2_l!zVrr3 z{EHtmaGG{g!R(-8?Y$7x1xmHxy;1IV9l29hmcdq%?UOc#;9Po@tdgxz&L{KAM#YYC zj9Ve%(WA>p^G)r#B?f?;7a0^iFL$25n3%ajoN6`W2_Fm=I-f-o)7|41*Ei=kOswfs zAf3*ZXJ}$^ebZ`S$L&wzcd)DMWp>ucP@@>`z184;xW@>8JfMs7O+%Nots@~xYaz{E z^3UV(D>9ii9>BN~nqU3|L?~4ZSYLvuaqf}u&UZ`o2dnG=6lLez>qjg)W-(Im8l+8% ziJ$N?;`2;h;Cv1d;=YtrKpz0KwR7K&9og~ot5n$TSBA{acbRmpi z8+18D7S(Q*0lBNNjQoSit0Zn1-asVBZlQhTvm)h@?Z;arL3gy7*6iEg-?Ew8O{j5P zn{SQhpYecgv})x&zsrJM__Dr+*LwU%z|~vxWScPN(;Y9y+JT-ZlQXka*Yv$sJrfK?bCHSJ5bSztXhl6ahL1*Q<+qRjYp~X{wxpM#bC@hCKAv6O(5w zVpq5Ki(!YgciA?!5+NM&Qe2N!^6j1~*P`l14i}e-CpO?eN^SZY%#DQ`tOy(2zTfa3 zZ83eHV!qH(P~NH5z04Wpt0MR~{bOFaK2f;uM|N!~y+@=TqG*rnE?Ijyv_T^0;#8-n z8>;;eN|SZPc}kz_euy$y8P%6jSHXWsrum%d#}D5|nR(>;Jv5m=Gu~5NWqo}9(rf3| zqOqKf?L}4d#YE}XD2ZV590|sOv<=fhdq?ne?`XwVX-Cc5k`(vXwg>xPs*JE^x8B!= zp7Hl@b~->>Q3BB9bW(YASmqv0VSZeZTL45{|KoP{1U+`|;!Sn0D=Cyw==v$B=}Ic4 z)A$*Zhs=_m)Z~Gy6N}*>sSc%x(E7tpv#l}i_0{0n4>#GGm1s4XdJ}m^5~pOhAYB`~ zC|N$*ddU8StqgOoQhlLv+6Ca3Opp)NnBwZF4zuwB|T#ykVXdM{S4!uE)jBCuj(N2P6d5_pa92=-_1!j!t?;$NDnrQ zy-LlG=udOs608OFubaOjZH8{Ev64A4GW=r&yho&tgE7(4ZFkI%L7i-E-&?Nhs%9YO zD3pt0RysZb(s1G36%g9biw;G~(7XnvSK%n6=jpy35w)oN$mPzr9~g0M_;6TAlQ6|7 zTj(^qi<1@MfqV1nHK7>J&4~*riDfo{OL1z3Vw1jwTlq2a@#etqZJsEgMhPg z);jYhi`=IHVd67f1S9WmG;wN^Q(yI z*Z@kYY>1fBCN6C!cgo|5S?xyh3n=;|4B5GUP&klMtQ8TLG}eD;y}3c-X(b-fdAQcW zmhxq}Z9@NGGo_WB`e^r!&U93twoNqH@>$)8^Vci} z*3!akd4Ad%`sq#wQi{RdD4P_;L@8>Ky9J>^QJND#O{Gs-{!Bau&F}xIPK;Wdk~buE zw9b{0=2f}HtC3HV*BzFeKYE<4yl>T71LnTQ-FBwo-1_Xev(kKk;3z>*qLb;6La8B>nLv7OP(bE&$@r^X`Wqw#WWniz{cG_@!%cmAdl zKh`Qp#DQ z-{r)5?fZjR#3b0$F$@TBdxRVT%i(!?RsOx;NF(~RwI+NSTRmWSO}!O=D-QVKeqgx# zWucGx!RnfWg&)Miz?DBI??`e3aME`JY!dM{Nmi&mN)U$=W|(bU`klj6hL##1 zR}NQqH6ryymFJ-rGoBQ|VsY%DQYong*!^DTrxQmr%9TssHCUPBuDJ$#|Kta{L)I&& z-xwlY;4kZCqft$`u_X@O?eBvxXhOV0nxFhmK+x4{f((R&|69y($;=$QOEShX-}b%1 zm_hy?6uBf!d85yZT2`=dsb*XKa5lQ4?;3-gWy)p)YD)>{DTRtuvemeNj9rjv$_`b{ z>epb|Xam}eXE@1@>r&|ndbs_!cucFl;)^u`rTXNGz~TqV0*QA7AeALtC53ZCtJ;3a z3M4zApU#ui4*go*uwE`h!0D2}Z{O8@8NugoWB>+N9aDZ4#c zrF19qh2f+FVbL}JcTVe48Ok&=$0s8?ssmF;GZFK}X`Y~KW&Nx}*L9e_7q?Ey9XHSL zbFBy|z?gR1lKBg$1=mILUdUlB7U?l?+rVui#jn$CWyz_QE-aRlS5rzG0toxB8Tgg} zd7p5lbPTf~a=MzyA&x1MLI6SXvXJ#4X_Qhbru~|3U~j63dyR-mu}+=InE!fuy0OOD?iqk(FNmGO9PBdggA^!* zoS!vCf36A^izE~xgUF9b@Oipj-;o0U&n%eIv4L=R8ZEvbzGFDGWw57d*tMHnJ#Ggf zLO$U%BKNts$;n&h4bAZ)sekV@#N{b~J3rB3eUZgLQaTWr{F+E)-6r#Cr|^gB)x_)B zNe?()bPGYJ5y)o3Or;1~ubW|f*7R?ebJCvZi96tJ3kT&s1po(_IlEEy=PIacrPs5jFPTeU)J8ERzHsvq2>>M}|wmb;rAr4!0CSm(NDz4#3f zCTgD*lqRE?AU(vLyUIrM*JYS#!bvFh{C8VP!x zxtJLM{l#~Dy0tGS7pQHWI1W9a!KB$z;q^FvlLXi|a&M#PS1VWBSQ+L_oBi>(+>+UF zq(Ee21fHPt#q3-2D3i-xy^2_m?*+UB{e!1asJ`Y=(CBnL5a^9XS@?;j{n}*9Zp&Gn zD7xHnX+b$i&Y#;6*s0Celg6GNNhhz9AKP8+OX4pU-`4n%1%vE|urW{2xG&y^uxlA* z#!Q&TY}TC9Png9CLT9&lkURA(Kt$F)(TVG6X-0DqqxWWCJm2fgtcZ|RqMuC}`D!>E zHQ6ipQ$FARD?jwxme^QB?S)YwQn*hkx9&%teqFOogJGD+8?>8yZtoTMqbWs@%e-D7 zRVT+YUhv&t?6Mh!Z^HLDnNg-#1*2U$aN6c=!)|9N+;`CuZKKLeIO8LhV)0WJ*OtWqwH1CNd-GuAE= zoEUBRUsT)wuq(IGgPk5^7GJw9CGot*myAvNeS+SjXw8ku>VcKd@f<0P@q6;wh}%Cf706V$3tdi!HUyX6CQhtNh-76=oI;nGul@jb#u+hrQ> zORexTksv=Z;-ziUsIz;d4&b@y6)*!8X3+in>~C8{fU5Ks`PVx;eT!{hnrFL&T$0lq z*!w!y43_kV8dJS{7FSG}#L`-by;7&ly4D<)p8Q0u98O=HAHUb#p5cj+HN#qs(NI#d z`X)#y{ykcIr8N!rMZ8VN^JD`S>f^!`udz46s31D%R;2#8pbV&-nPg}z*^9VsvclAm z>U2z!@AhrB(k5$-3)%cA2H{>94JeC=CLzVtX;v(9rsy~g*Q+?c|@QX5$GSpHYtqZ z8U1=NEX%cCa+O}zlL`iEmyY-jkNBFnn3PLeb?GQPE1f5qp@f5FS9N{@=SFeH-t zj7w_;?POXu%EQ1W_Xr@HQRP>bO2K<{H~G6Ydwx>z-FGS^+-CDH%*mMnFz*NpZB2Dp zmco8^fgULen=k9+9$jp*WQmxZ1sMD;NWAgHd=tKKPMMl%iRd|J_h^7Ruy`lkuJ9XcV zHQ4tv4l4yGpJa!>7!SF|=-!z?qW#O$zYQFp*Ri2K$iAJpz8{7da>d^7nY8 z0IFgpB=o}{AP--r+iI8GSx-h3CLvmglc>GV^ml(`P`!k>^$ME8r!5W_qfBk<3`a^c znYJud4fXs}1f3vDF!CD<=Doa&QKU+<8|%Z;6rnL7cq_p~a9jWd2fg{maRaO#$uH>u zMm2!Z3J}me3*RU88N}M(#_k9C*Vy}|1C@Ymf=(HhQkRWBubqv@f_4a6Z@vvpL|B_u zz`x(~Ua#>=bsbaT&!c(J96n>4OkLOUaKe2>KV`>Z;z2%nF^q24E$M;&Q4mA-1xg=A zEcTF+zZVIg0Y&qH`fv|oBl)JgVGg(dewe{2wgVXcpAq0+1tQpG&FUiTGjuiymYHs{8gsE_d{~?3vvAgE;++t<;y@3DlxnU9;#mVzj0z z<_jBw5C5-l8|G{5Tuwjpwkp52F*-Kb=77whl^OHFsxP!#@PZD<%uGzXv-1l%o~9cG zlTlhH4Q^nPsED`j-N5qEm^h~nwbN8p<&tAQ=spM;<#5Bxx=;}nnQTgBe$X@<_sz2; zkSa>B)^Q7qk#!Rh0~||%5;aE5?vuOklEDgA%O8Yn^wj@2`P-HOYlxYEXS{|lzHs@J zc|IXiCdp~d2-HmIXh5DCPPGc0V(_xsW=E&KAl7P97z)u?lxmLJgpEBtpV1DLN_RxQf06*+ z{V3(eSSPNx@o4IJ&z3+=n4W$`zMe}rMEE4#cJrHO1N>=iPq_#**|s)X$6_K*&+wIe zam6#Hi*A>&M(h|Sd7CoO%gLlC(YkDHNR930-DZh@2nqhj*nna+iA0;e1`xYs?u}YY zUEXb?q4swm;6Re4RK7M2hVcdSMc(;?ohe1E{+K65SK+@|4$O}nn1KkKMhqKGLcfHk z4@u-YMeCYUzUZxBYE&$vZA1^^i_cj6te$e5VijIb*SA`+j?+v)>%3w@6YnnTW3_Kq zYP|~FKF`#10e1K_E26+{NqO^qOW=5EOgrG>fVtLM`?x_iYEw>zhIc-VK9(21?S%Ep zszeVuZ4js5&{X5tzWZUf+Mg90*stH1^!Ma1;YY*k6MI;$8oS*MEWmbK=u8XTT(0D;Ww7kSU2b_31S6SlTM_-ASYGeps<#QVY!EICZN@xq*(#lzYYX0grX#lquq6?U`xqR>@c;TkYV}*s&e>23nL4 z(JO3SqNc2E$!n``&7M?TVP}j!({a+K!;r|oDVG15{Dm7xC3%@B2=a}Tuux7uHXXj& zc=Ne%Jt%kWg&QnFj8CVEYr(G-g5jVEF~h&$rST%|{W&3129<_R^NnqlJMgs4TD#1G zzLm6zK2OxN%~w`i=GRcQOYR_Svx)4Bs^K7OzZv-WOuiakHM^&}LJ!sE^?| z$cX{o0bdGT!?%8V%QNi4bN0e}ypX@JG`8o(`0V3+>%)QraGdBtDb4T0`+M@w_Wf@J zDd#E$xy(zJu1RZnqtO?pr)LM}vEhrO;{YGHZ}U<<@JFe%2L@sNCujF1#DbEX<-)1b zuxGn+7LMREMczb#w;ZX}5vCkmW1`&MG9KA{r?J_PkD3?={*GkjR-NL0-od0YMm(a$U)|&9~ z8{MekCt)MlHqK z&5}|zven>F!Rzi2bFcv$|9oCP{i5hOiMSQ@e`-~aeJNS&2<`O5XIwi9Och}*#C;qu zwRaxls?>yvo|R|?5}D3;Syq~>w&Moj{|6gVmJ-XnIVfJt`)%0Svd+d7%A2pmn>J~8 z$Xutb+B&QK}C-L_-LFh&qSx;Osr$8Hc5TbEQ;Fx z+Y{l!^)zUQ^+v&oPQLZdS9Lzm_1ikTfn@Y;BOv$i`;7gb{N-V*visI~dSV7^^6Qy) zVF=0Gs?O2MeHQ7%vn}m}zI`G1sw;l8v5{$u7gOC5cGD0z(WA2W#3bb48`9s$4F4k3 zq?783EW+-`x^y~To=a{$mB$YtaxLK9iJ#+5K#`uyl%56*tqkz_FaICjJR>Ojn9{k5g z@0ua=&oa~Ahp00LnA<_O#SbpwIe%F^?VA0WwiMS}uf8X4))pgja}uW<)fn$f8wi<& zBf4TH{T@s|V#c_|f9EQ#anf%+=D(Q9NY@cdda&fKQ$dC`@VOPuiHi$#3i0eOsnlZ? z$8K`;kJZ;|ZH$;ICdSua)F3R26L>95Ml#-Mb%dK@n0||B#Qy6ftLZw$N~^UeK-FPv zo+l+FLfQut-oZw5a^f zfxhlyW5Z~37wA1OTI4pvz^lRYFuN48|F(JmN!42kEf>-Wdj5}W?*Ft8ui@4>T%0*Dj#(iF3ru^y zgsxnmWHNd|*#UHNz$%bBqquWsyT=O}PfayOG5QNb#$d#2sK7d*a%ITkOy5Xg$r?nK_u8qdQu@?g;%r3!z= z8-L6*5heBMJn#AyC;gjXY5xzOL$!WIoWOq|$$qnCf3;af&+e}D@`8AfY{f)AneM(_ z02gXsP5!J9q-FV&1O~`fg1>~CV^UH7?i2#McX>)m0Q}|etn2T|Uqp{O_1Ec)WiLqGTa?=}DNp|9@e&zbDFmh3>x><8Lv%$ZY)A zNSCFjt!k#<G$L>9OW-Q>)+7?MEK%=IFe&nl;7+Ad-4}>=~trlAGsK? z96@h>u`*zWNv^*mxeE>vK}|4*Bl-<2e^34bVg6EK{y#n?^p5|#J^yu803b>JcYFTt z_WYB={r{u&EF<@^&%CAu2_gLioE0gkx2wXe7pUT)r~Y;iLjAx5LoOa3r&GS=1K#tC z3)UCq8{kF!WtFg1m>z`)_@$9xtp<@Y05i}ue>wdUE>Se(IbI~02@7P2rr`J;-n)Xf zAkX`5K#hD$1CMUrAA@J)UVut{Phi7>SU~n1=*?8`YX^ycQ-XlLqW4ce_y^H}UoTPt zSN-en0ojxf0S$cbL6>+jk8gT%U53P1&i$ex(k8N6j=?1drNci-_mY>O69bEsT?ujnDyQ!AzWwGjm>R>24Gm!%$5gd|p6 z!gzR$4wCNUeaI5Y>g9AG2bO4dhDaZ;3H#7P)NxgQH6ryMep8er*z|5u)_PVeoHDoi!aY z1_tQf_K?6lnQdA7-zrNyNY72MRzV5Qk|Y^@z?*;<;O)&Y3z9_ziqhIaQ^y6OcDiOP zG-wgzFi%J3U^l;}a!10iWeeP(lwus(s{7uIZl1`f51*X5>e6ibV?W)p558RV4`o}k z83;7z#)9aD*^~K{m+=rk+WjWBXA+~C_Ilzi%h^tsN5sJ%2 zS79_6^l2n?k-Rq)BU#%rz>#1~QB!%BB|0C4_tXo0e)K+#fNuV(;KRkiZ#kS&XLMT% zO;-ps@7-XR(meLPwy2^y`5_}!BFLr8?ckoO zFBn{&ahzTz0i_ntEho9%5Q3xhC{OmwdLAArw(3nvoS0m%MPZ+1cv<8BN7!2jMAd)W z!+^93Gqlp7fGDA~bOS+sEgA z?|a{W?)}GP2Iid4*|GN8YoT7!##MvWwlA*+L)lc*6?OqMiwGsClS`Bz5c{^URhb^C zGtwNV=V0jl?Ft{O5L-!k@JiegpIS9*trgZ3xi(SMj6336i7Uk~rlYZE8V<~Lr3sJj z85Ib!1P&HiWOzlRR%5q&>YPHzO!+ml$YtvuH6`OW2^GtWfXtpI*QNv0bc@)GCB%e}#;7=*W{RJp~w?SUVcj~CJ z3My;LX@SmoN%7FW#rB8&RuG;T(aZmHurw%s zC7MC&J?K1Le|O6s;m|O-@L27^7u>$}WJ>?>^N{`H6kq<)V|MxW>cM;W(eG;8Gpw09 z&A#2_%Gru@R_E4KoKg1$CP7&t*?oUjVt*D?3D(wSWiNV(^j+F;!n0yesDWEmAaKM+ zCIb1Uoy&}5rxeTZ7?LY#(KuJRdbc*1yn*NIl-wK?Q8&>RHU@0{#&tMfwG;eN< z$bAb^D3Zbfk57Au8sp~Tizg1Wn-D78EHg!PCIv%{1_t~4u^&OgU_HA{VOC+i4rCPF z$Ik3yzBg`bg8t(p@P!zb^Wb@tyFIw`yT5w77@;GtHR7g@!XBi;#% zphl8SWx93`m?}BwZGAV07DCc5sPIX@@n@I+KAZcyo(0x!Z^NJmA^r)FXKKSNOGaY|V-SGvu=Tq{8=R?IF zV4zVMy8a$CSe8~vZ$Y5q_vGd*9iM+wt{kEE2uM_P58k@f7Eod`?l&HcUvk>-VCsbX zPb5Af9`)i2*_%?R2CgBFpC*u}k#R%mZq01fIUc(8hua_bf`PeMy=xhwm6QrPUIgJD zmu1l#4QG}WDnrS6s}Hs)iZNg}hs3C*DY_pYGyPm>!f#u>8fFxX=U0|ZebTviu|SKa zGLKX-?0y$C{Az<^c4JO_?Ym3;iAdGQ=2!vp9L{p@n&)zAl|xl>&cRx5hiB#WNy)D zYNH`?kWzwvA3cFjjODxcBH_05+lD`P%&+}PQQzyrhCGo+k^+~j+PiK&{c;eUadtO8 zODc(cJ!8afbDbmh^w$0mJhpCm!5dzY%jLDk+QRtA0Q}Cmp5DR!fzoq-m_Q4tfVnZ0 zTma%8_mN+IA;0jR8>qKhw-SzOR&i4M7+Q#4Te-`)UME0S7-SV)X%{|1U#Z`;4MD*T zNmyyLf>B+$-(H&!16R(fg_@i&e(6OPuY<}(;b1z9(!#cQ?Sd@aUYWAD&ZEV$vMpRi zH$$(^z8NM8yaHQ&X{^g` z7@Yeh{2pllH3;u+XK>SNfVZ2=YwOwyUZCJ#t?{{Csp(eUD=#^Bv;`Jh-9{(Kps;h( zy(I+dlH=<&NJwhCy%m7}e#)${ZG2XdR&NbX?(2fI53PL`$aP4bsn6b34oG&{AHc4! zUl6F)G2HGYi0<~?@3)^@Y_I(|a~O-P7`?jkdiHJg-k*i? zV34Tdp<3i2qlIrhRhL13)f_r>{q5H$57NG9evuRym_C z@KF4*vvp#!_5F4QKi0A2lnhHV0W)cM$-%uh@PRjP?;NM&^)a2bX@Cd+J1jaa?VSAn zQEp1UE;nL-{r)B6?jnMLP&2HyIw7_qwdcr{=WulEnE_Vy_k3X`zx52OrQi44qM|hp zdqm%T<7Czq6&v!)=a0+4bCr;IPV1c9&=E3@mN>c(Tv z>6`qZuXEVL@dU@40(6I+>iX}(1j(`kOo{>+)h`VD;F;><^|9{z7evSFOcita-R|7( zpI<~f.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

7A=%m_1pNTL|>n{}tNR0hH7Feb|Wl;Ew z`wYS)ioLkdRY7E`2D*KZ;Lu-y)^2m^7_FgR7W41T9cnT+%bT1ll8I~s6}&;Wb~ zxhcci65zu=M2?`GEy=!RJtEk(MgLA4(Ie|EM0V}2`V|$2lHU87Dhs)tOVFA_RmJqi z-`*)8<;WlucvEBE!P}$U2A3^og-HzKw$CaZQVGmxCDan;?bKSeMZb>fjN0-v1MXoB zH3Eu5pUL;q__ptORp~i%CgSw@sdrmrE&&|D!A0agAH{3ilZHXnpJqXzn z;R1zvK+5@CB(;9dWADCQsbL|So;xg?ykF}@=#YH!Z^(@O<=3j&xq^=Pu=r}*n1bke z55KPo*!k9C?Hnlkglfz@a#EhF|5IP_mZDQs z$hXtc26YKsd9zI=%>LbHr0Oihop0Q;J*Jv)c`z@nIP`$tZN<8&pZ)Uq8_5@5-YOn> zaXoGWVIFxl1Q}e``LkI^qG85?*zBw-kagNmbuaU5aY1$cty^XDkv2zUXglFeP?*}o zbG2Ph_M>$)wFav8_+725l!~y8F*fq7zLDTkFIFG@`o?_Ggl57-%2cL%<#}BylLv}b ze{Xo|8{XtJfSRg^xx>L}Y3kYR(%T4i!im z#ed$WO=!5d^m6+GO}?tO_M1a_TB2C2HtTobc}xJ0O^?4;qyo+s{lt z_|WUot#_Fdy?@l4m(a>H<=MThTx_d+S{a^Z`8fi)26KLHGq91Z<)Otgc6tL-fPLj* zLDjCyZB6drH$%>?B_pmoX%mud9~eI_*W3=G8~;VNNv=fn3slj^-B#SEZJkw7t)ORO z`xbss@5%0l!??#(gucVhp>)1)W$-YI5jxFfx*jouuxW=qiv?9-w+|G$#Y04+%r|@>qa-ULqfEL&=L2+ts8(jyLpMQXS>5y z--!q#tYeG~2NFZYM%LzX!CxNxUwjfa{5Lz(Lr;v_>8esKqx8Mas(5gt@5H=@%lh#! zK~o#n1*IE5d@SJ4z!UBL6^)BNjDpLHf@yy%gNDA3Wqn{q2>WgHBJsQ)65gF186W;3T?uS$2jhh{k&!YV*63fiQErwtG=#1;w!Kw*`u90_hfCkcj{>x zz6&2VW%+qA-#b!p-m6?~W6X){7Tvu2dEO6P0}^y=cKI)MM_35_Wk6p2b+JzxY#|gy zO2c+zhOV@2v2^+=xNZse(CH(NQ4>^?@uV#=LBvjDLF4bE7EJ!(BHW zdMNo1Mr}&v9~kP5_G1x+y{Gr8-Ax0Q2P-|7U+w(zy+YuQQgOngj6)OZJKm9Iv|%^y z|BNqv_-^f;6sdOpmi)Od{ud(M4}HIV)sy35uGZ(aZB0O{+>$@X=i=|%S1#_`SGY@e zhW+K#AwxfJMV!_r{|jZ7ILt2R%bh6pX(YmIW zS1WFO;!BW^i`Q=xbm~a;il0!n5gjVD6jjnZzw*s3u{AN=kdZL=?qOPtHjVmnR~W-> z*IsBqQoZ5MN6v}kHjudrC2Z#pBoCLPmJd`K1siNcJusasty0)>oS5 zf&v~*82#$>j(P3#TwJa2$wF?vJztN2Ms)i6(0ER%L|MI?MAzEe_da?dlskj>v^^xrf>~lew0rJbH8=R~om+hKN@=7?dQs9u(c}3?m&aFi;SN5* zcb?=pe=b|0qTJuzkn^4D4?aY5EM(aV3pAcKa0!uw9!}m~Z)+Ik{q>1e49&B(V26PC zJ7g_{-*DLpdtl#1+f-M2kw42JO^sy{mQ@UiOacFlvJpM>Q3@Ma23Zwn>u}3JEUVhM zblXf;<|k>klxwN6uIf_uy}YBdP3kl+bI7xMLsKTb4RAi@E_DU=0%7&C3dx+%4n9BJ zQ@QWE*z+sIc*HGXKJ1`p>%B`~gj`9$QSrwOF(�Uo(LONq(WyZ(H0kk(R?5|Syg1mFMCf2EUDtTO1Op?*N^YT6R^ zUgVpZIPnH)W!qu~G9MNtw|ied>*{MS*yULeV@70`l}G+LSXZ6zLPnzoaITM^4Wi3WX=6m&%jtjb9x$@<|^CB-x^LdWHEPVniJe%RJIKmbcs%uU0TbBx-ZhANIfXP?m z;-1Jb%`h9C6V}Bh4bSO3>r=tjQ1b{-t|q3n;WsLBarRU|*!Lc$B6brDD^Tc87khF3 z%lD+U`$#EyBd3pk#3w_emnl$-S+=3mwX+k3W!3efv~7gND`M`IigzY0KY@_#*#)z$ z=kY0SYUN6UA66u%dZ%)opC=1Gbo#72Cjh{W3TxaI*&*Zg_dzvB8M0tzTUg+^u{jMT zNqTPks4n55dhb)C!19(~=pAbki(~rih}e73?_Hu~qJj~m_DOnznEarl$#8b;+?ATt zq%hw*qWUUx7IZmtub4W)`pYG)Z%REkvuA< zdNz#(@>h_52!0Stx}-jneUe)c>ryh>7ZelvalX&IbFb1Bivg*$mYXMpfqpx0f!6GT zeq<7q@KNO&7Dj&wlQURULLExpWlW1{8IUnP+v~_Tp}cZxY$1M5{Z7$abYfan7&gNw zC=THah`I&WlRxT6HBU=4)5i_{cV5+WD{EhZW+sshXALz@Y+`lAP=(+ejvevU(DWtH z;%FKytC^I>z?%lj%$Ze6U;X-HuEEeIj!B$2ydDpcuF}eLtiZKtmzt?d3ThEZC8`B8 zIrU4Ygnx>CZHR~{f}n$){`{TT85sNhHChnDm?t(H6vf3^c0^~Y`(fCh*J;)3r}|ab z{KYtyq~gWY<{=n#^U$-B+!GbmEl=WKD;-)IDItm4Y|h9AZFFp;&UET`MN%f)`Q{=% zh|7FknT?8$Ug5*vbw~Moi)PN!80iORq*koH$6U(a|MhKTTL;MErudB3aX1O#J!WSk zo)WqN-^o5hWZgwfc)q=;o-Ef^(%r)RBMDv949a!`1pn}V7yJH?uw^R)iI!&;cix&z z@mK0N?cW-l^jzSQ=S#ZImCN}V+UJivSk(Svh#eQ$HzZ(pMx}D`i;ea-&2iq+Sx5kYVc{b>GLq-eM~|Bd))y((7ijfszX&nR3bpi*CnoR|MT};6MwDFr(yk5 z^tZsmt|JHZZ|l$C$DJm_WZp%`f6SKJ`7RO{7P~W|b5LHP*UC#6Q80e;XVv|NH+HbG zcbarmNbOHT;IDOXg=kA+Rl4LT|8@EMM;S& zkNc)))8~%*^j3j-)jX@Q**B4fg_UCSk`d=>n^LIi786f}Ppi9Js&-X>_3M?}SxbJG16hqlYU;(d`3B0K z`E57FgbP#!bRK-b%-X@D-+wNbNq|3ImXJJxr5$vcGN(R0b&=;$2uI((6L?IxQ7@<+kjNs%%;e;M_JyYFbTUw=7iUk&0pdtbHKN2&ziME?0siP zQe9rYjkDy>tCv4nnl|xG+sfK~v2nMLOifDL@Zp@u{cLHmS;)pbaB6zlaqB0DY5p>p z2UPy{`LB`2(ff(N0)VYIsQysyv&<%0-~f|o%aYFe>nBIZS|ZJ3Y68<{BdQlKMTLDa zm^kHWrCpqoU}m^Y&X@I=CiUYgk^`&r&QDv9*?xR_|8f=fmwfxmt|3=WEb=1y;*Z4p zLA_IBs->@pH-eatiLHZ;Pxsn}6o-Xrq3tMY_Hm`Iu&D-XyP_~Wns`NTX4+aTnxC6icJKYWFGR5!meGEJJ#U(mhe2~MpkbYdA; zP^a<4ws{5@^@|mCbb2rL{=^yg&j-t`&y{7F{`mM!$Xr?rK0j>r#U^o^7@Y&VpBr%#K&QlrPb5_n*#tz5iOIghW%+w<4mA)9P5 zMLEkgy)`L0t-yWjm76SuS}f-PI#fAF-7&1pGEwcLfyunZ4}Fy-i_+Qlp&nzK#-VF+ z(!>`!xJ;kw;6jHI?FFyez^|x3R#RPTQ*JT4M86ztp6H1STKz;H0#jsx<5mNGr^Z?0 zY-IXL;pPy^7x~uYekpGwYJ-u-p2lEPo2F-~WcN4|YJ^9E$Goii)J^nY;|bA2z#^QC z?Pw(nJVDyqd%ejX>fv@DdjdTTci1y_!F3Y!%_RQOkJ(FMpRh*>Pz@NRyAytzlMoQ1 z{Kj~@y}K?h$-qe7l-WR-z_aCwrw{H_#>7q zHx)7(uNNr0MEk2hve{ZpEh3q%Xdd_h6HVy)>_iHk(hoPn{#~t*@5Qf!JA=UMQFk&{ zHP5;{gV3$pCA(WS#z$JCN=J$jw;)fh z(ihUHw+6_4XY%BgFy9O!kt_^4;Q3oqP`!-Bo}W@zkyFprC-ZQHCEt=3bj;zCSJcYX z^UvL#Xo=?=lmoFO1LsA5$jz#|aZy9YDtL?X1_c?7h2nL$BAS)s%*>lh4sk-Pdp1|q zgHKer|Dd-i3iB#7rzDe zDt-Q_s0Rb5Ti)(&GA1ZIKVoYz(e>qS+aIM>Ibqo`!z-un(JqUCVWWFNnl5DiXrFDX z0WXHP-_u&RvlJ7-zT0`|n%=Qn-D$!)p;01%4H>7y5B>r>{sA57%*a2d=iKo<1vZvrIxD#=GXIVli7Q_E#>_0 z0KMqjx6JKNZ^Pf*2+g=BRC)8X%Di}lK6FvfW2j-l*w8EbdKNAdq&!%arYC*DN7-3f zxPx&;o~l1VwI~dHtrHZ@!~L$ub%M3=jWYAoxfh~YQ`FJIu09`%}0paMW0S~2}&r;h}nH4A9y)8pCP(UO?5pc4xFB| z(E$1~+gcg24-E|2(@IbX23sv{j>YWr9hPV|TJgeZls^!jqH}k$?BmoU;N; zO~7wXxCx^R-3C+S%K}*!Uf+j6B&6V{H(p!hC>E7=wv^YzXt;-`2(CZDthUTt2#aO< zvfQXmEk_h87Bf_xL!+L+RtPtxeb8IWqTI*uV%w%CJD#a}YX$*OOaJ?+U-fYsHBjm! zLJ8+5rX24~mVu-m{T3jU?02K{O$mN`H~6L4iHRIw8UFCcfa573nVG&5Z4s511cQ1i zZ_SLap!Cor{kF&iX{9%%}ZRrZLCsKkd#U+=|7nq33lj z8y-N+b!@-qE`vBO)E`3or>(YpN^6G@#Blgr%#ZWx7<9) z)OX3d*6Z3s*y4e+INgjX8D~cg%HI}kt)Sb|cgS(*`=R%p-i=T%C$7sH`_c@O!P`4h z6X;Y9EjGC9y}jqMrYMXMMfPx+?9lMI@<`nf{m}K#RxSv8I5pDuaf&ddIa?t=*{nv+R5lT<(2)6e@2t6{Y%ZQOJS{ z>jGBg`;ERE9=gvimGAdpaJ{~rc*)l`wQ>ofLl z<)j4-OZ_yGu|NDT)%OHARQB?fL$;oe&(LSCe8Q$01cUi+jdu1Xi<~$#zUTUSaIdpx zuH}t#gZq!)4kGGKpWa0;?mS!vc)-HsDY0#87f!BM?ft2|Z378;xvzSc3+M8A_nxJ+ z!s>IUaXZ_=M?W|TbI!!g7DOc+3^CDyGLJI$r2_jY0VKPg>SnVbtnIVK>5?<2cFxHE zzTma*7eti(z^}AsZ05+`-FkjH#=9hJZn$dNZ?AEsF;>Z94r@PY4&B zyTu*41pOdYa8_&aMeWpaWXRnfWSdgJ@N8G;&i9+QIm(t7dZZj2wIfbnNK@QvidDoNW4PM7{VEjqEh-~btVQSYDs#8h=@)X!&c=uomTy zk~}%OtLJ8z^XWx~jr`vp3%I7vTR+5VEtdXMEseudH0~48$SSU?}*RKu3j+7 z-6bfmF=sVx=Yqgh=12KY-BE;#4SwgGT%*(-^2#1Yr^Lu*>~t~3UnPco6@opU9X~AG z8oQ9m^b&>YnR_&bC7hGT$!}*|3UrVS=>)+Ys9(li3`CB!%;!dp-fXA&t_g3SAr^w19Qv##Kk=Ig#7T6FU$Y;zt%EsEn@o=9Lr2ueP$u*^ z!r~EX)0xku(r(j-SnlCzZ|6XqNcRE3a#zW!gC?}gax6oiG*xEWr}JE0tv)|Iynk!` za5dQ(@^X0RjPRSOX~qx>rv53cq*Z&RX4=5HZ&Z+3*>=9b@b~M2%U??jJ}wZ!kbI?~ zYXNy8+oqF!x2VW7QJg>!t9w~|EONa(90=iT+CrYI4!d_qLzy>o*RuB_#Sib*P z6J^$UnBAQ@>)L@$yo*Z@Xj1p)l<@Q;rlp5}kaDY%zqDLiVmv6(X!XpljbFN6b4}VD z5wfN5ROFzKrb=|wiO=%C_1pCq_=vswo$n#73UWSD)5#?#l<``3Z5*Wg5S@9A^$V=# zn_cf>?%Bw@c~ET|Ooar0{2Yodyi?Sps)W^=843fWnQl*RG&;CvsBwr~=A$}dY^Vb<=c<0N+xM%B z(K}%F3$G0|^JJQ_KUdqjKb-{)yenUA0CLKTlm{ojjoZ3LPIUUV#OmwtFOk5+kG>Dg zmwObAwv=lpI{p_n@qf9e@%4le>IWm0=BGvS^Z>}TDu~7(C2y>0(X{fKwUha!5WO`0 zBV)rKDbBr>W*N}F4|!BhuA@h)NfMW}lrI|(>#9>lvC({`|4R8wZeFH}`e5ebSRUI= z?Md_e$G$K3F@9+W#Hfn*lT&id6g$(`o)Ev0EFl)j#FzL@Z|IEbbN84VizLf2?$Tt9 z2q&1}kgX+$5>GdN7CFv%(nBWZ(Z(tbFZ&PWL>}Oy?E^#y*cN6U01EDyNZMF2CERv* z^s3Y~Y&IL62P3CRpM#`lK|LhgGZl`#4{biua^_OxUQvUq=ke^{rP^QtuvA$j{J@{SmT zRp@pDT}hinqF>3{hAYW%l<#Hw2Cdo+<>h}y0ki7jh>ARm39di|7gILetu9}Z>$Il*cMqH+w-A&v~6DWt1Y|cY?alzJ2v+V3=$xKg_ zLm!szSGIOt)Imx2JU1$&CJy3Hoi858CDBg08pb*Q{|4;Uj-PualxQLeCgvd*J-Wuz za;B^qs)6u4%k1Rr!8zp~7kK$_1e4ikhp&nqCA}p~8a1GF{F9)>ZkvA=DpbE@_NcH& z+I4%B$cMZm#!{$z&Q*fHL`9`e8C`DwZ)z6n z2@~BDC+liDc_AeWJ_Vc#8m_O@vYrDsAW|ClM>vtu?`RuBL(xjF8jo6 zC-lrd7&S;^;zfh_L$26u-AJ2z-=5|6NC6}9rKk8(7xrHwX?9H*ileHUtD@T}h>zAX zkf<+EtkXDit4~f6W2$a&W1`Mv1-_;GRQxK5jR`gvEJBC{ z|1%UDDLne~zsC1ds9!QH%OC#d=P{)=`8l#oQGQ3u@SsJfRHEh+TvHi+nJQE+P{z-` z{p-|8qN&xnL-&Fy;q2UoIl(7cucp)_`&XGXbqVI9`4=Y7Q*YYOu2t^kuJ3?XF`}^6 z3}Sc0?KEdo{Fr!rvN+qO=(EL1Q#DcFTV+jwG&D^6JCx75JuJZthK`tjBB^EH+Iw^X z^vhaMKrqP~9oH5gRpftPzs;1;Q7;Esu`6>TizcLfq3Q04Za+aLMgsls9WGlJ#7`Fs z{u8wTP~9ff-;gCLg}>~nRbOD@y3Y=DD?zn`X6^58xv;{IUOaqWp*5PHMYQ{IWoAHQ zH*oMuU{t?KwuI#t{*`WU1eOApYzIR&)m;vnej>QfdOhjRUX%<;bBSnwL{?HY7~tR4 zHx=5E$aF=Kh;6Zg_#qBYO@sm#`DGl(Bv=&@1*7x+sA@-Ys+(<3pJxh zp$3{3PM+rD(p9K4TSMdPK2@tw99Q(t_&{xjyjO()dTk3{Q8D}p$FH2bkwTIMpXoA7 zkIWibDCdau>w?U(kQxTcfa}KWqH|(qUPHrOxZUcUdxh|p-Zshtkmjl}d+2_5@fY=j zU{7C%$wYd6y~|I-##ozY4`PLaOO}+EV^FP+@}F*pK6qKgOJ{@k%Vhdubb34OIbAeH zaJAdgQK=`Tvm|ZgWQ+-4ZeAj6#NUeZDwVEL29|%k9lH)^$YL3Y`E}$1si4#$77{WK zOBgSmRhYAUM!d7%bA#5?0AKayUr$oDIPz|^&<&3zdS%t?CYl{2-Lm3~*`%9y zMumswr<2+w`F1-F-$pjrtk-q!+HSw4Db$(l6(If7XFezA2yVJ(YKjW1K3L*a$Ecx9 z|JB#gPADvb|B1kJHKn|)ByU0X5nQPI9 ztg9ZQ7T@+Z*)7PFv<=ag?$&~1{0Z!&RvTm%2f>zbLjrgc;NX|GirYVJbK2N*Yg6iW2w z42Uvg-U0EBAV`Tg4+*?rL-!aYsurZ>{&dN=_!_>mxh{UgWx42n^lFJn@_CJP(8m@X zeyj&B7$4?tOByqU9=?u)oV1Z^q>20SaP|$^AKZRHGIBsZ*{Hs=!@};GdUyaZthQpP z6W6As(SUwfrwaI$Ul;lwYR9)8br!#1-63P=zc38$(%NPyC>lOGd_N~rFg1Wm|3#fc z*KE)OH=Y9k9`-OL!kd!f?lbui`LRA4T(prgp*n8S{57|jCxgu+??;9mX)il&InH-c z4V1|s>}xZj>kWeEGEi~yrd>hJz?vYdPsxAMcsTFU$Ka-}!vf%3S=; z!&HbHy@ix#l&@ksKONAFD*(f1PI5|9PZiP98ZN_7vE%>?`=pWSdw@5Ke>!LgFs#zxnuN1)@>K-zpUzROcwT}_F1 z+V?t24C5T2=AyI+Egr9LDC8M&;19rk#H%k%qW|TZ%xOH{n>RLNQO!?dd>Jt`Q=kj# zZL=iTu)=CBafQco=xFaG)p0L!J^3ODj+}lP%--pHms4VScPOm(B)8~kxBa%5dX_(uCY{4?7ew+ypII=;ue6J+90%U6Y4W)e{x$yzUn`t z4tsHg(encvbVmC>s%z0*+cz^)CoJ1P|959${NJ7BM&DKJCY7XN&f^W#a|UV#k#3an z3t4)FAFbu@zdu`%9s{80+3e>Nq+BFt#pUjBeOVb4I$=|x<50oW#ZnMXHoC}*-oV%^ zSx}VVs}u8|q5PB9YSpE3_hwoKCAs-bNm=$xfm=g6YYQe{uh#e#-G5UwpA0-KGhKa_ z{j(LUa#c_;v*!Kt_bXZI|0d5VuvbonvgaO1{>u{$eXf(ZIEhE^$X+SIi%9uxYpy>A zdPL&EqefSYHe$f=J;!X$yhy64=1aEOsuUH98KBg)23bB_L%Js=MsS16sLGBaw0e%> zH+0B+GeYwlPR=mP#D_ehjvG{;tFq}&MJG{tjrV~paxX2Ck9qNtNL_x|P||sHA@~)1 zxP`^Ko6m|zwDj1#t|K|_ZzqB6{@?oHTL^8}O<_3!79lU=D*~@WO;4`&-D}}d{m0$?4@(zb}xtVE*5RXPgB@3YYle(N1M@VRw$_0Ui#yhZV3ER zRv%O}C)B$udbO%q&>Q1zjZVB&plC{0H%&zp{bO0rFt??Y9JFN__1@y)kkHBDomkVo zxeGrH6P7)Q^OG8PiKgFg*g*4&VgvT6z_M#%{i09PE)znB+SFM5l~ga{GFhoApzA0O8)#o|Gk`R$H;t0 z^vPsBTr`r28kAJ?Po(Brl&!qE%h@x^Ry@&J$>@Qm>_UhsAy%d6Y^OG9*q2oB;T%Ag2l$uMx3`ZC4U}(u&-lZ__ZV#AKH)#^qQ(JU{*}dzNt>Y zwE&ELdBHbW{9Hg1ADM&ePZY`U0fvfZGb}$6gb=jEtfe~=fG3k($i6qEJBkaAAm42r9l05Nmg5)=DMx5q&jK*+mOs1mV= zF4(gemQ}(#OlLRWyrp?w$>%C?05XRqZR9M&WMT$YYld6e^15%MEyq6;AM@jX9$QBr z!ju|>lwSVJ>AS`dD+>$&m(99IJ?KtYVjqR42VHUh0Z`kE(qLTEQo`y`&{3wL zv!SoN{3e%3Qi|Zl;QwgD5_T{+;8$5Lw%x{Cf zCH#KS{UE=;z6ZmRUK&)l-&hZXtZJyf4Bh>1NzA+kSxBTHdlVgSKQQj|Xi8w;JA~=3 zZOxr-j>$9CBSE=trC*J2Q~O)yROz&S?~VjhP4ObB-~CB1&bQ3aQR{0y+iMOHA3DO6@fZ>&Qj!#_=(my$tc}(?33V?%&9QP5n6%(zqV6i=|9$K&DRqwo)e{DV^Va)h?$@YW9HRV44Yup?4- z^9G-c9zD1o7TyK4d|8v}5p;)RFk^1ngYu~$i`5lpHB87~m}dr@moTBj@FYmc=dkUZ z$FFfY`k?QUSt9DJvys*GS8V6w~Dd_X%d=RR5+~d3^_UH+2(E2kyL;~piFCtbOeIqR^mI5+U?5(c^};LpWi25V6nwr?f}wEAyw>N2>BE6*`Vu(;ao5QM zob&T#SA<(F>cRZnJs&K}MzOBl)vEJ!QIPBV&0DvQ-*m(8ZE+sIW-fK?^+&E(cRi;g z>Pbverq<$@biCEpQLK-pq07agHhJqA?m1}saG5CK=sZ1T%J<7vZRC-cU?-Y(9;BY0 zL=^GmQ!{VH<+QI@;Th949JZ^t+0TdT9X5-H*JjM7Cz+>}oDdJ@r<)BZk?IFL->Q9Y3aVJo}m4 zn1_jh#&qJWd3?)8zlt1WO*gKb-ce{>OFq!ux`U6Hi~2;H-lGK31?hGYm||pcuY7Y9 z8vjf+4WLKAJ)fLX+hRDji+4B|*BR*pAX2+sbhpm!DD)Q5_v>`6R-P^EVGcoPZEk>L zGpAs1EkvLT*0Ob`)GR_~uh>m(c7cNB9!_t1Js&VvrTS&aUOhrRHtXgyRC5mBR?uYV zcsa7jPxT=fAKr-SeyhE8)i0+aP@`Qou1V1^-N_3xyB*!cY;=8|afD9`9D2n>w2Co3I(NNPWIqIl_9CN7Go@ z_zA@>_30<D z?_WK150^C%HgE;=8r_fnnnlW?mKXXSq^0{(Pi|6O(u97)!l#wI%uiJuc+38FpNXKc zb5@|d=j4x}q!q^rJIFw*)JT#;?JM8^#L zhdKDPN@_T8I)S(_@g^CXVC@siSq-lkH56l1w3{kQ5!7Q9EEDmMM6+tF1*kso!sxYy z!!Qr_bJdMsm`+Xj%{lkJ5~e1~^Jrm%06N*vU^eBhET7O2#XH90H~lq+uW-W*z_!s9 zR!0Thp9aM=#KavYuTTTFMZ0J~mJ>G1Vy3lz)6ZVOTEuSO@@Gp#zHY4aO3xx;JE7 zm?qSP>JwRJDcQqae0weMIOt; zJy1s+d7A$~YrrmgH?$ge0drxU4Iv6%!x$}#8lyHNDO8upHvhcK2=+@}WI>({#^{e8 zEKmT+(DTEq#@x+c!&{{N*(DyesHqqb9pPBD`%RJ(T0AmHcJ5CNh>lmisms>3r2Gj>n; zg26WlUnM-fP+$)cR1=#8m7r7v!j+KupnhOWhNcu+YszQ?t#EWbP0v+XX`GG&6&t~pbBqhhrEJ|ns`x)FuZZZy1u>8R+r z1ws`No`yWdz^@D?Mshjz_QWE7prp97WIEQvPG|C7H`jdkB@HQb>V=`WVuK&XecS)z zcDoO5g?N$DS+UOp3fg1S^-+}hcv1TXoC+Cg_nJb1U z)%^-=7$7p`G>)UyM*07cMhsBfC6jMbU}w0{@?@&OZHw%@=D?@l5F9Mk_~m}XRd2v#z2*96Ub)qIQ$E9lVej z_SPeIr0nOxDH<{AwcgvO;?vA;QUS$Z%Aw_`f2+UFlD6)9gB{LE8z`YUH}k6$ zaQvgv$2cdrCtLzEcI4Mp-?Lrq`T{q%Yf4`pfqv+{!ST;~z0~5@=DWvzEI}+W7lZ0l zUmY%jU|-+3qz%=pegIDgH0D@8E}r9@$C$TZT#oF>!|yH%BJyielYYA+!KbF`F^_y@ zo>9jAt@BL3cH4v7mM#?yF-gfR*;@s4ClWc2_r$AL)#N2NI|KaDF0wp`^$!b9Y70*G zm7egrdV4m+*2l&0pKMMHwHPUu{N3uFW{W;net&DHp>qR&~pf0t@ z*LIKHGq-0X+!zCb;X!9-Ur1F%cgP*Wb#gM}>OuO&c9Nor)s~t-PF!Qg?*~``(BB&# znMJAzh6tE{@!*U0qS+i7>a#jS5Z z0Uv>5KVrgwbK7M$C-JM7yKi+?qJ831=wfRfMj*wYe~3Zvb2S9Z2-0Dc1eouA{p zzwH; zoE>VU>BoGp{$|xb=^^6GBfJ)R=&tILl@**T<_YM%re_SYcK=Z;JDrnPAA8I-Rf(un zM?ty}Xj?&C*N66|uo~0jzR-RETFl9|rnb9v&;EI8SB~!u4JD6Vl&C&-wIy7Lv4p*4-}4eS@IqCb;N2__BRNtjxY@tN9N=MuKpqV%GmMW^Tu4>NJq ziU{dh@f$&mC@Ss7SCbEe|LS{+8jB^}!%=-cuDQmKczdV4RW6q;4};ee{c)KqM=v{Y{><>*;`Rt6JV>5S>u5RZW&}_8JA-%fc*!jBKi(ppN||bF zl-^}sO51X!O5MNmt5W0A-!;82z9nBTaB>se7c28(?F$#>^m zekJ2p@k+H6*V>X$-0&pFDp%2x2D9O1!xpq(m-{Gv6?qi(Qj%5lwHCSO;^?QcK~)$xxa zNpZZiFMobOu*$EK`*Dc$xSMtjT$tiz)t1*x|CG<3$M|Y)hOc>3B1~d!a3*fZJeN&` zCpRs#rl7zf$`~+gTV!76dIOTfOM0?BY-9$`(i-wx#ZsZm>7Yx3k*#Vf; zU8KjcUQ>CC$nC5Pn}lxYx{Q(=Ib22hbkqdjYH-aUW+nqEUpU*aBJS<9J>WH^+dITCJxZ4-6i3Vkx$F_4nH*; zCOh?0^w)#Hv0&F^RVts@nM0T00rjG^Z<#qeE-_^B6Zd!a1@UniinV*_LH*j-vEv3x zsHk;?|5=j!xr2gmw55213msBMgz?Dx9*JdL*9uLDuB018`408P7tB zo1-2>g}(cZ>BNBgY?$t$;(s~u(4Ig6Yk=Tc5kxAfkrxm0D?v;-aUF5f8z0 zqcO&y&CGn=>l@~N88Lss?SV5oF%h~xf5m3!lC~7~-_M!kqF^OZ5F$p+3 zvemxCHkbQKdv-m1T6ZU5X%g5jI4wa&ED7C!NjQlOl;(as_8(0;(zg7Y^G%xghZ{4a zcyXvqP>{b16$k(AIQ}~37P4-vDxxZ<$O6!>O;yK%zkO=n$xJ&cv)G)QtJT2hbz3+- z%Xk#sq@A95?@&u0P*~KS+|r=28WA&@}i6`1Ek5^5qnbpm#L9!pK5N3)*OhlC>`K7xEC zcZbi0->xA)CWUwpde3RFrEYTwfRW*(B^y4I(8Mm|r|?GGBy^a)(zbZ)NZl9OjNER>+UFwemFGhe(eA|o1CP&VIpSU` zu1eTsSB2e}@jCu-0bAex&_M@%d+(vHb0_B8?71SzTobv&?F1FFL#H>kJX=3TqP!zl z6V>e$cD?WB#IO0Jk7>_E{FZM<*p7Jy1!%r*gmzqmrrw2*q>p#E|F&Ci+uskzE0I`L ze=D6m@0xzOY*I2{ShlvM*Dc(WYY}?Yq!aUv!?TGSf&TnJmr=q z(Br{>{V%!cwPO{yso#sxgwc&nb67vYO#(?ju%0dXwQ#yb{udhOS7!Pf{U+mO$mn=E zu;Q;xw~Dl~#vI)vv{Pgq1Hz(gsMy9JP}dZ$aDNV0vzhWXC1%sgsG6^ zY$+iWl`_vUcr@O4^>;*3(`)$`FFjbA6CxQ&IG^KZ=-mT9pMY4dGG z&Rv&g*l`hY%5{HzS4~=CYNZ$R{NOU~J}_Tlr;?uf-Im3J27~h%eE{@cMFl}SCg5Oz ztX%1KV9-rmR2g@1Wk|;L(OldHHnl6F=bQTxgm^#kUSHyr(b4qWqZ54j;4EF>(zdj` z#GG#Tg}?t$=h1WUOF-t4es@dgd&N1A?imk|c6x?AY%p$OlG494`pBzOa^_VkMP;cb z=oWIk{ZQV@ZT>WMuKTF#%G#g=Oq>8h!$$Ypu@(c>0l_Gl1JvJjzze13Ul_ih6lM!Hlojp66zr!+zIk|!Le zATU(`lV{*@ditgAz8vSHCfZWo_z~F4cF}@pqotvZfOlN_!YCSgA@bh(QuZ#%^1JId z)#VMtM0@h)mnZY?3DFkch1x@B>9j5nu^2L?NZvR8+SaON9FIz;0xx8{8FR%dA3I{E zBd|EOD$(i~^oB3QNlf=r+CZ~ILo4Nq5+<&#|7LOio5>3`XSv{j?sV|+bBO{DUsDrK zwO}D_uP#1i5=gX3RIO@8@L%3(2zI3K#)Sa4;pJJ3-pd>dSs51FGdDg{i{ekEkxz|; zXVaX!Oku{S!xTfES}aUv!%ykE*^6y4)a}H^B`P<*xlEVE5!-*|mRK5)Ryo=-3QQ`i z#_B}9yJO-wvBN~Lv&)XizRJXXJK=AV`8{;1(wJokBy{6|Ww65PR(2QI%!if_lx{7Z zowrS00QB*bDm0mxu@6|}9te%c-sN%f#d0}#Y8bPeFM2hZ+SN+oZ0%x3u5bc$@yiBp zjymr1qbqybOO7Yfw--cP90nF9!qMH$D4;Lv?GUzNGtXM>X|Zc(T0N7)16z_iWBfhm z@t_~XX+X+SZc(0A-nLEelF0?GR zo(+jZOfS=fO(*i9cp)s<*pA0Py@~DBE9De$zmX+`ckvfvC62U6-Zm-UOWJQ-@-?G4 z6#T>b)U#9%ezG4x?SrL3EHS><<8`4iZ|;nfQ!LJbAEs^ZS8bQ{iOfE@KEZU1s=N~1 zftZ=N={_9g(aGk;=EmmXcO&PCN4;47i8h%xtkm+*gFz)mQC~K0L=?_U-H```NJvk% z#(2sjps>ocV&SCyjyoB!#tp5;H=19Z`$t#e$JQMWn~o=CHb$e$n2}A*t6ke%4y(i^ z)7E|BY=?1fzu2N*U+M9S+aBd8D>P z&)$`|$}Hvq(Utojnjex;rO}i9t27;RoLPn~`tpv^1d=a1B$9r+uF*#ui5@F zuSZO+TK5+@Q|wZ5&z1NpGw?%oC_zbX*nge$@jpUE3`o`P~`H3Nw>i?4XQAudsQQd^`Q`6=z*< z$Q0~wx!*sqCU8yqIYd~*<`2aFy#qVAO<7f(S?TwFKeDLte)2ZUa(_qY%B%_}&ziG+ zQ-QA(ASDSK17uVSdhf`COd#0_#CRPj$8k8wSz2g-sM8jMHG(W!;YZt9E%5oO+H>7L zm2B$%{c6f=ofFU1t}(a#XIT3b)LVoP_tnY;<)@2++LcD};+Um{gNKBUm|JwCeqWWs zt#&FV*3j<%(=S&FTYh&^+ok$k^o4UwH@I(cHMmi==ixW^B;3Ozs_v|!no;}-rUC=# z2jg9o^iwBK>UB=&CZjsw5- z`@E;Oq~GedMCuU3oFb|B+9}WwU!^pYa&YJ!RQ}gD=-~!Bruy33$n@I4tav%PxD#bX zdOCj0{yJS>AE{0gUlnw9K&Z|}fJ!mWM`u+L|B-QH)cWnG^v>wP*5}FXP}}=f!u{}(eEn+1)T9v>|16Xz-=eNdVSBnq@ak$PB{X?(?J@^Og23Z zbXwERX{wjD^!GZ@9l1grf*kr_d+q=QqRGVu-Y9XCa_Y$U0RqGW) zbX`7tW0OGKQb-ENVkOi!Q4z~sVKodr8KXz{t3R;pO0HA32nq{9vMWAoXHFJd2=*Dl z!*=(8?s~fuh4@0=N;151Lpyrcl6g?UCVIo5b{r8vN&l$0MqI{tY`M895C*p3M_*(R zmj11WG7!%aEI#B^31Aug6o5fthrQeY8w-ee zHm&kKL{cn|sxVKTu_fm~Xl>wj#q#fg^$6r#2N;v?`&oBz_W2-&ju?Gx^iQe|0Pgj7 zr1U_xnAc?uhh)AT_KHT{aN1Id?$R%LSA_h*t$CoK=%N}BEi*%N-Zs-!yZhuoTw(4z zsZrxFok;!n^Z5q-Eaw?Y+Y+}phi1ZM6fXeTSbSHI+|WdeF@J)?+REPFym{UgV{6MZ z)B4Qtpa9+))>!#n!&z|k%lK-9SkGwBr}K?@<}Lq@6y|F2Zvp;C&*XrH=~?FoR(z6S zpN$xi3)wEgRXf|SZF!3IImYS_&#}6I2gT_QYgUsyF;ANRQAQ!tHspY-;|brpWltG; zr#xVY3@BSYI;(7aJf!U0&Mk(9a;l@=E}(8uXC$c(4M=tt=p-nIL5e;k&(rW*Qq<|#@WEncJWx3^~d_Xmgb zMsrl7`c%No?rGCuxzO)u2rE>9c@=P+r1>$o^{9VKaqZ(U`h6qx42`97^8+r7k~^#7 zd9G=q8lt}}b}BoS#6Xyd;>(AF#!9bakI86dfm9748AM5a1^?O}263K&@4Cm@f_Xr( zBZtPyi^n~x5?f<+DzGC>7>B*Rlik~FHnjO0g*6Myy>svyTzCy;w$YSW0xO|tE6w&O z%J@ZZz~-2o#hE06Qgu^=ogSn}&Esdo?^>&&r%p2+FYW>QOq3gp-SroQ`~~M@ zXoyGOMTl$D<8Y3l*tiI!vDw!d$a^K+$H1eSdyQ`Whcyx%KZ0g@`hGW@;50xDKkz9q7o_FltxA0Jl4uOpHz2qyOufO z_7Z0>-M1mAXxB#}t{Ym?MNvL^gjRN>U;*2qX*r0NFd2t8^z5=)iF@R_xR5D9FGiex zBlXK9#VKzXb(oOOhj@7>%VkZ7%O$N|SCgXU_hGGXU*JH|0Ccp>Du-(KOQo?nM+UcW znf~IV^UZ>Zf?USzTi)+}%u?MY{PhS<(i4wtMa|4*M|^mm>)Q~ii`P~|=79*1m00(= zj)`#jyYD`JuDA=YW3x(2`iT{-$S_$omG@3P`l@17Wx)b5vzEx7!Su~lMc>lEh7vO` zDfnm4vYfJ9Lkz1MC2)(-yBgEMJ{6-SxF9%dXh}@<3=-H7JZD)y8Bk}g%pH8@7p)Z? z^8Qt-q7m6*VtnwAgqs`hUI(sD-_Scp7>kuWaIL{o?1u9CyaL4 zIB&qf25dYGg`JP3nmT)bx;dK3h%06kgm3&4?QvnWanT)amC!DfaPuzlR8NOrYQbni zdJy6a$LVI0SF)vz+{%?ex0HpV`Gh4DlTR)oqwFw){u!`=&HC4Sdw#V3^0K z`O{XpC+7ZH*1~h?u3rJAorK`SWvmX&xE}9u>+Y6tu$jPq=plKK70_^)^o!7*zL<_4W6+6$<>dsJ9utrWA{uHu`zBd3}k2@aMxZLdCkFN znD>nO0pu#1|GH>Qn3Bfx`XV}_WOCD8-|Rrpn|nESFm@z2-+&iPD4|=$d-A~Je+9;E zTW|L>)TqAZ3UB1u-GaUw>Wr74EjPv?{xk8F2Feb@vO;^ZG(6C;K#sdJ*<#!Pc9wKTEFk@f?=O z<WW8x za&@G^*38(waAXJ*Ta6nhvbBaeA=@jkHtIT8KJBMf?=_)%5xUi-IdguDY@a1MJN*Yx z+RAOj-pX!x$9TWl`eCs<0(xPmyzy*!qr>+`?tl_MI*kC28&0;rHmhNou>upq1sMd{ z;%_=)#$u3nx7NDHKB4ax%P-e?m|^@D+`8(pl%!3-i@(Nj_L!2m9Novg&u9f@fv+eE@RKibFBBX#vDc?`ffGk;x$0W9cy|cpX-`107o{4Lbb{ zcppXA1?n1G#Mlyb;xX5^?uY#>V+b=k$Fxw6*;s8wo_2S)fVu|FQuo8}rf;0##AcaH$%YVin z2FZnJ5=+w$X*-?otiMKacCPZ{iqZ>jM#^Rcf7fyB&mZ21I(|1Crm5<5M5j4?GQ~~2 z7k@h$J{*9BUo?hp&7BE>boG1wqg$`GE0Y?3twg_zU21D z_3(SAyy*1E-0F=UPRkbCB`A~qyim_zVzqf@uwrDSKi*sk`zrR}l{mPavB)c+GYxJiETiqIYvudR9}{poV99KZn`S5dI;g={!rCVuz~c?{kvC z1(DpWurIB@nVawP*NKGx@Xv?qbIkZGC_^=ESw(>pOq8sHhn%LQnj^ic z0}Vp_1s%+2Qy^Ihq*iRW+qKM#6>t#gwy&3qo50@Dtje{t%JB%=BH>vvIivk2@^QfE z;;i}hUlf~WAcA!N^!$*nYsJ=aJC~PMb!j(wT^jYpX6;OPd~aUetn#Hu+^-v}U$yWvxrH^JGNoaVKs>7AfKqQUnX2g4r)?9M@=V!rSkOCY|gVk!9^bQMkvkKHnAHjrk_;>QQn#(Hn~Na*vw0}BCZwL z>jvqPFP*Uv5l{Y!m6b9w2-3LIGrptXp#BW0?zT5t|0vq~vwNy8k4r_96P9L7%DHK^ z>-OIpvC2k(l_cLr5FB3W32P^OHWEs(`hMevvEWtlqX4@b3jB^6wy=jZ-Y-Weko@a% zFx3+(?JE*S+4)Mj2v-K!#<)R9vd2)*$6RM49Rq>k9*_~9;=DFZGj?tVpZi^tdD%tL zM$%jS$UX05vbmp(d6f7xAz*2^XI~=erGLC~I8Fa7r=a%V(pOqf@qa%$Kc~dF)VJ8# zz0}mN#RXA4anWHxY|!i920heCr$ElAm%Mxc%5H-(ns`Q?LlTLWa4F6V04+v+NK;^E z$w4>2dfivPZ!LkX(GBvrz?SX&e@wl3IF$bz_OFmqjZ)e7H3=cZSO!T*NRpi_Q3jJ` z2s4CAcE-MwLbC5Wg)y=(jj@ZtXsk2Vu|4-@oVMUx`@>=4>xVOS4%xb~p29Xv4!#6Y9&at-R!*#>1j5YCu3^-|9 zhGnPXVUs^k;!|J;JJA8>P3>E88okou<`Vh6vjKiE9Ah?)F7aYM$~}XM2kF<|q<86z z#n(YkEIcL=M6)nflF{`(M0JR(=iHl+;M+5L@*{y$dg9BmuJ@wRBbeZ*4ENY+qw+e( zRi046ovvM>#HerH+Kq9doc?%o&mTGeI2?jdIpclY6BeR%x0*{(iXK)^_;d-uTovlf z{gck9iMvv9M85#EH1*YwBkV}((8_DxPC?JO=G+y5Z_pnUrV3ai#fhSBepa85o4^>&w4hPV$pPbff^IN zd^V!F{Gsf1)+)%monyqrv!is#3T!)~GIf}*d+_(z3XqlsRyGXen`XI+m~FJjDC5Of zsj(TO!+D;?kjm96uiG|ZrvxVWQb<{mibHa??Tx=T1xf( zD5Ptl0(W@3BCKCD+e+zElOFB8FRRo4S0%b5I^#lNI>|*X>tuJ=j>sboJsvU@kJq$S z+?aecPGO479;C?j=MLW4Ie25eYoNNSsfalk{Pbv1Cu!HIiQgMD!X+*e>+ko6jTrhR zO>Q2(6WkA3>%u4duF@W1xV|~ z3E?^1VrMWW*=6d$&WJv}T(W4S0Lhmvn`Lx`H!?IJR-9admvv7Wv=AidD!Si{?<=dyjU2RdeGTkKId-Y|k+JR61*~F$>BLgZ*o?J;qN0?WptOIjh!P@t9x!ky29~q7}pK zA_AU|TYDf@TAOaKf}_c1oQ_!Z;5#!TGAEM5d!y*&(mFwFXq2k6T*7%s)8_L(tmc0+ zp<96yofw}4-P#7zCtXZvjiv4$8>~{9r|q>L;nxW+D}RIR%+pK$_#IT($?e|TznL6n zVxUN)2>o{O2x_cifV}JU%LL~*{&)0uSX0cqXBmnR_l9Q;FWg%KKA#;<9^0lXTNxmK zwkd%E8Z+MOt=fsWN5MYF6FRzjjaF`&gx~se(CKey;aI={oE9l>pObkv{?EYXFBQo<Ve+}GBSaP|xq3#f`7r;~Y`lXnZ8-8#Q|1W%S+nCEcl#z)w8 zE=?&z2_-n7tOj@f{@3N8mem==CnF_VQtFC|RX_ary*HND_hvzRa?PB?L!_jQ%xXtwKw|e6h z-Zl1Ab@?AhJvQaAwT{{>M^JwZw6WB3$=jNE+chVTXyflpw6`aodgS2fPSirvRZ+?E zURUKTkF*JV1h+cKRL@bIAY^O;xly&&=>C-QjTfjoy|^2cvnfiDuSc~IegrMb#3r^X zb&~C9Y0jf>`GNHdo~1kd_B$Kvz(_4d39Ip`Px!EMpx6wujoM9APKH%9q&o92=Z%z2I%D=ZEG*yA&vhYXVB8|&+i`sUN3E@k2cd-g{ z9|F}eqFRFiBbtkK<(aSv+H6{6a1-+u9Z;;SRSj>BstIHz?6s7{4HnfM{W~_N@rvGwaSlc(pc9UGC zRc4QdOhI7lks`isWjjuMw!czGv9cOx`#o2-k78HjOWCCW(CnN{s!{}JsMn^mU4 zwZ>D#=ap|t8s%rcNm124^|Kync<;^uMf?Y6VzUJn9XWv`o( zYut{z44p|xdVia-KFp&k20PhP+L>aE{QfZDTl4)EgM6XfDY)OSO?!~#v6yTuTj(1np_iG;EBfrb~eV1$8Yjh)s zwwX_1*&E7}@H+0(Ylf55tCJnL^33JW@OzD)Pe;JsJB^|ePmGmGh>A0b^UMxBbyx6pgIP~cAqlBa*3K0r~b6dyShhO*i-k{ zQvQ#Vx>lAGH-CbO1-rJ;&NXLz)r*Piuq-`R)gRJvujKUoqE&Mq^==BQ5^Qab0tzkn z&OL<%l_s-ZJ8L?1ua~j_Gd=&S+q-L;>?yIGiReF_>aD^!O-PbvPMXJ8n(<8ArM^PC z4kwjM$jeg?0OAO+wXJaFf5>iW9m{h;IT{Zvo{Fw6_<-&*81adjCO@n_)X(9o;2)OI zX_NSMiH4qy`D3Zzd_w0n%Zrt_9Ox#XN(`UqRA&X%p#NxYuNdF^b%~`NGEt6+%uztBZfM(1Gcjot*4GR>P|Vu7adzgQh&HI zpP(%;Pq!@u{^%-I>ppl1)|+}S^*X`S5a}MP$JeHJf!M~Hdfn^sTHhyFb_;+KU`!)v zz?sDuzc}dqOo)VN=P)sAEYIoQ)6Nnm3rTY+U%TJ*iLNf^gJmoNHGQEiSS5@Nm8>o3 z>0rRD^FWgsqi}JpKaPOM1|1oEd2FY>-R(bPb6rpR8K30v%23cCS7`g3vQ0N|`f0br zB!w+YXm!|0Shm~$;&e~yLFaPY(@N8U&H>$;7oo3+g%SlbWfXPJYtO^2qrx=A8Gks~ zl`s`|0J5{6j>k~HXW>JE$XUTNg7XgAw_IPCxmq1P(jp}5SQXL0PePNJ)0xBLErmw| z9=F0Gpv0;VCGJBkjfv6YEM33zm@SwyfRZ~%H}Ix_la)Bu{KpRZK~U|;5_Mj)o82kw z1=U8nyYYTBCfIsZl=B4-IX3j}zWdwHQ18rPrkx~`_BGw$;q9GD_i`Na1t&h+6`c~D z27EA+2af1YYigcUcoVY$cwQG*%fAv&o9y@Kvub5t zmyWk2T2oMxPC~q%A14q@Jq@fm&Dgh4G9#5*WKMrUiM-t34m8iUwGQMa+aFbqn^+NT z?3E*fI-8)B5aJzZMW>QgkHI`;cr>{`vIWu3RO?t`Sotd8u-Pm3OR@$8sp*$`cSzj@ zoqc?6as$AA)9XRn8%c<%NpJG@3eFk zj zo>^5eW^?Tiu`13eP(BnewE{(-ba)R)iEM_%87MyI(hMc*5e>;NEu*A(G1GTU&C3=; zD|ew~p9NWNj2^6UxOz({zCQ-GIDG+bNVk(`eiW@sL&LKao8C@c{}tyIv?=Qv?OIhQO0cwT5gM+8t$6BC!OkF37b-I7Nd*gA~T)Tl{6%s{;>3w79u1-wWhr!Vs$hRc#)?sh3S(;G*>)d3c!f(+n`O05` zhas(C>Bg-f-EK!v$qK#O(z-$Y#G7lSHr%FR7h=4+FPzQz>B-<9iuaMoQwL9`AR zU1t-^ZU?Z$gco#Ovj){~XCIgyTWw#r0U}C#fr@k~lpNUg+2f4Ri{?Vy z*AfrkQhuL%+us67OxY$^1o!VS2-JFAZKKq=D(|NvBIN__*`)E_-sGSA&BVeQF^YQO zQjEEe(BB_7@#PF02fN;Hbq3-BSXl%og`6oX?m%^!&XIC3DR(enbR*WlxPY0L-F~}) zZK6fgM_?fHI8HH!%}hC8{|$%$s*c!f;tq5VPgedUT@Pp(9vnbtd@A86+)ZAkYJ<8K zsHJ+#o%NrsmVCQ3Zp3^Ji(HxPo?E`ue+EGAQt;++P6?hOy~}E+J!t|kl3yJd%fPM* zxzcbE;p|>~Tx4p=_3cGP=8@d;^Sg4Kg-aEk?PSK#0GcsH^kw;EuMgA3rxvQUacl(vn1*D7*)9KWl29?J#CDJT};EY%^*ke$la=M8k00Gd)|Nc;M9S&!DAKty> zOF;jrCcfRwlgG{yh4yQbO5S+r%lG7B3npp#!P$s!*7l`D&5CXF{MDPjcS+W~1l;u0 zN=>M>lV~wJkPL4@{0gBddIZz^7fMZ;TN2~K-Wwnnx!?#NTZ-Ke=^-izXFtonjaRNi zFtXJS?Tjtzck;i8nlHT8rQfqUTTN}qFD73`_4*DalhIVg-NvBkFHTnRdI?IFgAo;D ztmKVJsyKu58cs1BMe(s04(xUu_Z*nhErqPOiN%+4((cFxL4;eZEkghX< zDqkL>>pAD&8@**e_O>sX>n{5@+Eu1a-UAl^RU=^JERXxq+}vCQ!T(-%$0{|pnn%>U zDi*OB%(gSYE;QOWj2!`HSkJZc?WgkFr^DhT?`*mg4M*8I4q%uSoK zI_s2bGX2X2nEhKF^6KANN{PD`~pJzgSN0G0AY| zNnlGd$SDT6hUBEy=(2zM6DAMaFz+R0S&=L<{Ch7$qBYXjmMCWaFAtQwXe{283C~UV zPn&Q~d%8r<_4i`K_FoI4{sWmD)3`@+2%o{$J-6(4KB~HaumTe@r2%A!WpcD}yb!N5 z)~g5_Cl!#~Vvcc%+8a~|PsAte{x!;GHJNC#%~%ERr>U3|dfA3s9N^Bfp2V0)P7CVu zsTd6<%aAqvVpm%#!{lcjZ1RzX>PCx|U~*JzyfMYDPb5Iv#>AHq9L9u;od8jw6$E%XsIx8+6o|Cf;gPa<{dlggEy-+ zo{AQ3LqKIm25(n{A@|OGpQEP_cBiLPk2~^HEIR+A^TXG)08i}#8!l8(GmS}QyOU4~ z9hv$aEB^Kdz`u5y>OEQJK+go*)1SL!7Dh`y<2#aS7yNP;n4CkUdPGtTo3{dbc*3r@ z#^%VlF+W7#vmV_?C>?L0&flbnX(yOo|I8RkClLHQ@B9TB&x^o7UqS?b-HZLQ&dnh7 zSBC1JDTmFiM>F_?GacgXQnatmmGS$cj8)9so|!>cv^$AS0)-Fr92D6TOhx0fB%Ls50?IwXfd5;7P`!MCM8!b4J>?g{|1=q=c0Ui%U(=0ea z#N#;m0NN>gH{tKK9~XKt2PNI}-rO|CU%#Xuax6c)-rkJ2)U2&z_^2P8S?w(h17-}v z@6hs;hsnCk;?Gl)g9hfy%tY<$ZW`ab@0yV#KM{($H;9Y>m5#`3SKz#amks^y)ZahJ zSBJsY2uoh(^NU_K-fB~a)6{QL znDLqeE?Ao@W~UI!W^=Z8`X36@$1izPQxd@uFmk{)>Ux*3bh@0G`AXc;o|`>Y zBLgYWO6AB-H+`-?V_NJQSsTGbe5>gRb|>_pv>qM%dxbST?KFemcXV3yLn(y6VX*jB zc0Hs*xC+zBVy7c59@wogEjgWj9CdPUHvIQa&XEQ0!ZR{|?TV^cWPiTGqGLzS;nI|u zpo?sqA#bsj6Xgk~#qgEuc}v3SeJ(un7w|4v8#HpCQ( zwh1guktG}ONF8yiMdkIYbmzM6lpp-Gj29*AetP8edvHh=msrz+S!pSDYBaSDw*hD0 zGMV5K!j!wgSIiZdCLt%cHi4lHkOk+)VVAN9)VCUcz8q{jD}$d+U6eTcy}#TW!QDA$ zw=G9zK30d`2#n_y=ebFtP!5{xZf+;~Zvbsrq@!mwTPj>+?vCWGsn7NYwH~S-WDiy< zW`Ebb+Xtz<{>RDvAJ?yRytehjjSoz>MY7q3cMr;sUqa+6N~DL}>|ZT@>Hlqa&6n0? zQ(_izRc;EBBgiXZ^LqNvtFDr6ZW@FYgo$(ik3(18G29mtP(3+87@C1`+Q67ZT3-Ov z6zc)3X_4G--a=Ow`|sOJRu;;(v;?kVX_jOF5y%$*6LNFu+YI5!Z1=H2sd1pFk3DE- zO8IwYm@zih6o)q`F_F{(J<)UL9H;Jc(Ihf~eF&I{wW3#8S!%Ifz8#(GTR4iXFJjjr z3hUp~(X;(~H$}_W=0pWl@x}7*m`o>mdRn!&-#hemjtQXWt+D{&5ziW>@reSXa zNwb)l1Oku-;Rx`%-dq>NA_vJrwS=>QMRCM3%}C}Iswuib#E6t}!|dzjp5rlwX6!a$ zH6IEgYn`5CjB`*QWw~2v46~4Rc=h^2K;`-W9dEvS@~-HDuTzA+VsV&}KT&)846H?? z2m`%G2cE>$Rk8bm-G1bia~moBi8dP#A*EbK=u!LFIBtx`bqHACl1@0*A}mu$ky(36 zI~vi}`qt}s)AH+HrPF!SGcV*1nvu6Bl8g*PQ~jo^)mx09THKz{vJ(q#;laFY7b$k~ zHG0H(Pu;=#T9h2MqW@AV930#in>l>lrBOqPoCcfrIT`s>aRWx^SY-(ah6s>KVbLe) zS9*J#_l;NFi^UJOfQ6rg6I)JVfQ$t1lh&m+!uVL@{!axMudmP?2Hotx{c22R)k6jw z9cdYC6)XBYFe#l}X%k`@=Sp=rju{;S)durav|^8{yQsUdBW9kX7aH8jueh26y_o#h za$_9cU&*E?4b4iCrq8iaG-EjI4}JD6VtyLiOQfhmoB|3VvKKJ=t_f$_OqHW16)Z#n zKXvY?HixW(THL<_g}p0mp5#}pky5@}W{T~bJB_3iPXza&L924Ar;7iTg9kgAX=#JS zwns!jgN+(piM)}WsFE{<&DtNfz&LM|aMQLFN&f7PlXXnSi&0ZbY@2YKp@=U5no@D% z;M7xxscHYUFuyg!eK5~X&S~#{5qp?PCxg93brA0pmYpE|xqtc|8XO$?>&;_u$OY`*jO75oDCDne*ay>5|h_REb{6+=Opxh{EzkC3j zKlp|LQfJ-S`S0*JvtiR%eSm45=C*IXXbGIEcei-f9#qV5bRUcMRS*-gu+QibKa{Q8 z`?$@Hy%-pTj5FF#o$HBGz@k>={oM|>$l^OwhBbSn->-nqlC`1Ky*4RI)SoX2!sy`? zy`EZCy6WoAojI?#9BNJWIV;1o&XBa~wx-rAa_4Gn_u|6%iTAfV@DaUe%3^HHzyE*T zcB#MxaKioiDUWqmrtdtj8eJWn{%}V5&BHI6&mO2r%%2xEidCX#4N87L^T<~}>+6g{ z8>8tFfIuL=%@?Kvwj@DbPv1=Pi;0z^Q&tkPKeXd_Z#mL0PKvTEC{K0%qm~NW%3cy* zPfS@DyL`Lgoxrx_Tcc}Bec8*MjOD@`!l^>iGX|BB9dJvlDFvN07bf<@;)f+srRe-% z_H!LVQo;}Sx@zcdo!8e1&=Ke{4RgH28aCwmix*n(Qryhlm_bct;?euXS!-sE;5VKP zGsP&b((fhb@9LbRNL?2cTZ1!4fkDOmCc&PlOKo%wi$Z0=l>^ zmv;GN=40G~x6v<-kNu=~G-HkNG}mJ}HFSi64kB9!623x5)VGstJm=5DU^e_iehEn7 zbb=vz#OP}YYY!Z?-;|RnIc)H=N#o;kOzZvRopY&4E?)()ml~{DEsiBupPZGB2j`fh zjXe@KW?AW>ik+w)StY)pGVDu(rZxqr%Y)r6~ zq0393lFKkxLTAl^noF4UQbBCVPvxz1H{FE2CV0~ug#O@d6m1z#3v9X3_StbM7I1I7 zDWPk-J$|XDTX3upZ&dcZFht{EeLc=BqLSKOs(4Lzr9s~R<;m^aI#M@yd;hS(yP zhClA)JYZ1`cX3tq=bG$xqxc`ptX=V!3mu+_DVb{lyy^B~;BtoW7a#>n2#$>6vSWg_ zYWO-NMCHV|+Ew$^?t_z#ZEH0+dv2cebbnzz+@JbDb$^}hjW#5qt;U#Y(~y%7G0D&( zskI=}&!t=JQq+`9@3G}>%1iF5L0rCXo%JE7L)aj{8#(@zybx$=bo`_u!ZbJ&$Ez4- zgJj03q6(PS(7}ZYpY)y)=SeM}dE@ovwA39Av$#GyT{TFE0BxDs=dPa)nyXwQ8CZ5W&1b)3yqmtzCF($X zb2uvgsB{~?_)EUJCr)`ddnZoeLB_+fcs-c=Tum#}hU>Ir-u=J;V9QjOw=W_}iDyIR zqciCbGA4`SyZ$`3%0065<#=R)yPOmd0Da+;9Oh#-ETmiGGzR`iwY&h=Sn)Mt2{I5a zUFRNh_WgvA;Zoi|=`q>NBd{D9AoD5N9iRgL(jPi1g>OuB4I8+yacW(_-%*@M<7Xhz zesu_P6VULg+dnwwKvBN#AY2&_D`cKfdkbGeTyIU~E^B+e3e_Wb`J zXJ1g%XBrSjYPb|_v@-H;8J(=x1Qg$)8QkcXie@FCXe9@7* zC6uWQZKDJnzq}((UDh{@`W@x6tFBv}cCYC7Zer8xSpqFet&swc7Dzq(;lh@>TwS6| z8WAd;E*|ovs9L0%bS*xK$=^I{Fon_`RdO}hLlueIXQ4z`!~pA$nETQd3O3MzbHXRd zu(4Lub=}XoyT(X)rUoy)?Is0)mSTeZegd@a&jUX60mh%5rs=wjah>$>@z`^|J`E2J zMLqcjZBPGvCfL;?>^(`co-|(00?;4U642NfX5GvrcpL+>J@#WnM`z{oh+nyWEn->D zPP5_!p+w`{w`5$bgfN8gyB`xsJ-O0=3c77Pes?dZc6cf(4S^a--XRu$!zpQ4Vu041nR2<8H~;CMJwv6N8b@YWr)Fh!7w9x((QnH%#yhkY-3u&gufPO;rhq|&COBZ^q9KePUW**Lh9UZD|M7Uqpqf~a~9 z%x(qc)VfNT>w2>3PaQHL&--?uoV8$t;8orRHNOO_#Zatl?{0eUf5X_dA8EfMe~vjt zWm?`w>2;_77{vt##ND!=KXHB#AGjMot6GG^4#pV?!>6{rC0wg<>oXNEmSBGji1#Wr z%Z8ecqQzUj02>z2=TZcD3j>edoh6(##T`J=%E?euG6@}TLZG~LFK`N-kM=7Cy~Nln zv?A84eO@XJEL?6d-@Y{Wxy-T(Yx?@WC>}k#y*Vlg)%y+&<|Q8Ir(VOm}`#x9GgK z{I+(GQ))Y;#u2(^TP6RrQ=`Z6no zmFFX^qhbVx7iU0mF6kfasjDyW6+PO?Qxt1a59E|3QDra$nVb+wK+k4-*fN8d$b=;H z^L&=Wzu1HC1&&C2usW!phDD`>8e(Nr1!2=2gu|^_pM)nvkW>A$SnlnXG;waZBjUs> zYKK#qpMFgZU>yn7{GW9Ma5WSubU_j=7gF54Afu-u>;gH!wp~JOAz_HoO&Bipl&&|! zwMUL#Hr+zFieCMx7kYjMU?_CPKTN!eWM%-TJO5C7#3x?(>;ry3=RIGxy=0u&y|)qr zg}**O2<6MnE1lzV(&34&cOQB5b6=s1Q52ngBy>cd5o{FQp!Wm3(p2~I$pf{QSa$HI zsb3kvr5#!uQtV&we`Udpx?2||2ZGz%r!PlG7CijGH~jA6GQ9+~tUp93_~_#O{$%N= zx34+a;LbgzKhvpJqRT5^KV=rOXn!V@#_FLCa#@Oy6>?S;|$ z_}w4+0_!0{=p5X^D1s1oSM1sCq}z;Q8)6C!c52hr_9y8`?={m{w< zuofZjou9cPjR8>s1_A>d&+F5pBprS&BN%StrNVMhwjsrryDoaXdV;^b_;Bt{QHkxS z)B?@znSzU*1EW7N=qx)Qp$|2q)TGyq{}8%a|2^jais0_`W4&FYL%2Rzg?(sgM8a{v>?$ zriiaTApf4#owqPx{^do_`O|vKX95K7R6eQ;?sYeasJ_rM@8b1$s^Y2_P3Fea%o-%_ z!##*?FSg}S+F)7NqS{IoH>Br)9&jK5@14=gIX=I3Q(PQlWaFZ3c;&0bs`}z!%%n*7 zVa^VE&o3ovzls6ck-y&L3%|uDzuvDoPe7n;m@2CJ#-)zsX`N#&2wbzm_5fSV-BC)=TG} zl0FTp)gG{TmAhw##CWagpiJ{xs81w|nG|FD@3$Qz_uNX1YNjSxI^y7*YUhDUlgv=t@Ilt7k z-Z=d0Ppr$J^##Mh(DE`2Jo}wXM2+Ny>Q+%zb)PND;jKyknR`w+x+6`n~5j<*QyGk~(TL<6<;jEn*9vS4D zc8sox8gV9j?9vl&YM@&>hrW}2gEubsUwDELmu^VQYNcE{{N^D`zI6QJ@YZ&u>0_mX zkDgoG)d#pUQq%PNcTe@yRUP9OfDMkWsRfDFLbkqx@IaUHmAUL14B=$iTGFER+1V23 z!7=sDh5H*A*!(_6-4B2v#Uvm4!^QOZ=smZMKy#P2N6G>LaSS(Zup4>ioOzT@nU^6$ zEL)WCrDmC*pWxSUzJ~G2ZZ51y)QV$uSJSwwn~#l0xR0=f-zu9r_wJymf!CW@i0q`tS*~71H6`FK$sx_7fsejnG}tA^s_!%LwczRCj9aqWgbhDU-TS8 zqb8SME`62+&KaAZ`~so(2`>2Cq(s&EIWO5vgr)wD4F4djJI(WxUx+^`xVhuk{T5}I z2hkP*uPuD|DTMI=_FChC?8s=|znc2}tX6I_W?DFmU&~f@aVW5ZU8(uv(6&m|nfE|| zdY?&8$jBjyw;fbuG9+##DYO>!mf6RE!Oi$WX$V7 zsbi`n`kp->tMipe02rg{1)h3~E*%y<8!Vf*NQcYl8Vva#PXmCK<@7<_q&mOh-Dw+W zYBt7Z9IB}1Ut$8@D=rLu%{ql~9MvH_jl%PPE1A=ObCcCn{zwZnDOUP zi}MGe~fl4EPBP>0omzzLD4(d>dp;B zKJf@hWKdgGAU&}fR2~XJ-maLhwzt7QL6IT$3yOp>#Gm>#aZ}QB`Q$F`Ytp5VF;keUCC=!aCyAOc`a zy0e@G+uVJ0ukA*BMFaAxpWzdcvIiidtIXdyuP88On`lXCuGu7n&#W*EbMA4QjpKw+ z2B!skZJSw<5uK+gz>&kn^8W%Ni0;3EJJxSsW17V2)c!vKlP(hOl5fCa{+f3#*`+^) zWT2t5f|u-#n)!@>{=QMPY>xH^FJ02#1F*`6#t-8U2+uvsSKfdp@0_ce{p!zgUiDnG z!>3LVLx$`fTcN-Ipv>qSLXYoFyi_rOqCf8jgc*lj3!2ioRR6OkvPsQ+=_ZR54_;({RW*q-J-{9ne^lGfC>JY*~kEb{`0BG82|zMdlcP8E z(01gy2POU0k`c+xZ#(}$(+m}NAj{z38}-saz!3<Cg6MKNLH>&Xpx<=9f6cgwACaCxmVYF)@B! zHnM&C;62X{xrtC-qh#POpaI>myo5K*B_ip^iz<`%w_b zW2EU6x_?KW{Y%yAb9!yklLZ^J_s-s%AttZ)4_RBvR7+PHK^fYWBY`j>g^3&pO{1iT z_G{hX*Lj1PUrmnBxCn2{#Ms1SvJt2eIcj^YcD@eR;|EnfXmPJ;4#jX4KrdqMi!c1c zwD;8R)9Ev|S=Mp;^a-8ymj#hA{X1Um-Yv1Wdi4BUv+A{5vERUKy%fF)hmdH(SBHGa zDARsjZI7TCxivz+FzZuo`OJUFJCb<}CiZGMt{CCzQo2g>QHMcZ`02QZ+ewOU7{!d! z=&p4eUXIdvK^xmNr+BFsRLKbqRAPER!iq)%W0SwShM~N6r3HL^ItA~4X$jiIn-&bh zmuPM`Ij^}Wc*4g$T~FiWssWF|Q1}k~1TRMbUC8Xu*3SX=K)i@?SBK1y8hXZk^vOvs|K2_PMtFr}T6d%X zO=AcpulMkhSMZ?e=)&}Hrj{+wAv5j=K044gvvM3v6{Duvw{{uAa5X2H$D{pTa;TgZ zLI<9ML2=J}^3}M9!G3O&t4J;@F*Qz9sxdUCh}g#~7Xx*YcoUyJx#>6gJ>?bZUsHup zyn`wK=p$N~OBBSgn$-mGWHFiT#BpJ`Xud`4Cw9v%C!faN$d$)7w3csAj-MMkWA*%7 z1^nJ_A7(jI%k{gUBvUMGAvaZiv+ndbvm^&T!5u)u8=k>i!*UNb7I0F{fO;zlWIg6@ULkm*==vnXg7xX_Fb2TzahYOM*IJd`9R_E7YYEv0fJ zf<~~N{R#N?R;VhnXKv)iR7R?T8PqIVD*%oQmj33mw8j;!AQ2-b|I%$*BP&93)J@TN zBepc2=^Mjd|5Sw-dCU3Ci<2Fp=S$a^i5w|_5om#{3?aw)t3(H7IK`(r`Sw|KJN0>0 z_3Eqw*03R3I%~H9K3zJ9Yd~>N0-IGOe)X9l-aEq_ijR3*LGORp^qs6;g1`@HeWzVB z$wJi~^+SUmja~`aE?Eq4S44?)>}78$CfB_58g-BcPim_w(^}HD4@#!3{|$$Uy;}bN zM-_oZ^XA~Rzyu(eHXYOUhQKBL?5zq@Ac z4(v9yh#*Ar_BRi1UkX#ZkEx<@@nxUEUTEqN|dNeV>Y=%*6?#9DkL_w5wjEhnz7Z!ng}& z^F9r%Go6kHI+&B0vuvl9IX5hopNmGA^;jOJmCHIoyb2DMYZ8;xDezuBo(wz@sDlZAEQ;%-LuGAxQP>jE710YEm4nFO6bEAE`{PNB<~Y zZj*9^{iCVT+VfwgD=758ernoQ`{MttYwkcCjlTW*qo~H}bvcW^luLdyo-MTid#RXC z7W~%3S$G^k+=n4vl6- zgZaW9=-*#4dwKVg-a|vl&sr_XEswu~Ya1-D~g=DSO*o))UN0i{)d#=jiaXy%yd^55sjT zs~E|2`wjCNG)&FaH%lLbk7nHwi{%O1bJt*jG%r#dzWb#D&riXT%m zd8}rzu&-dH1O2~ePS>37gcpyL( z0QLr4b?)pLsCONVjN_y^-2#eL8DekQ+(I81Ag_3SF)e#q%m+~69$TC_I9NM$(VlCL zam|k(zoZ81Hjfk9F#~tpI3^my@cFm*YHASuBUu~|KXivwq3RSIrs3Gmg#rd-P2h^P>aCmn5ELz-t#%{2_C_XCarN~)^ z+F@W{WGy~<@2ltDeMFRFAP{*x><0Sd^ytFT7A+gV-8iAlE=rp^Iqi`I|NE74YxzJK zS0!ynX%^a@nM$+KfDg#uF?VvQ0#7+~l*ZY5l)%>rhN$dhcQSPG32PGuf2&L5qjF`= zwfgA9_Cd!EqN^tcC;pN{YaJRP!G?Fu7L+YjzYrN=S8;f)qx|{~t%d$(KWshlKtAvl zq37sUVX=Je+U-923BYxL`|g{v(5z>2L}j$FSqA*bQw!|}Ry&3J7J|sDP==#5nmzZ> z&e|apFmhx9DH;&&E(_j?V+&Hf=cm`yWrwk`jRNJ=)pVG$F?@uPe+5Fn^A$zm+RjVP zVa*LAM|szuwvVxHPW;9h+g<6as^MQ=Y;t9K&!Gy_(synMAEv+ZsN zd{vBRZPOmmnKjA~+qkxsE5u;Ml|fua^paY6qg*eXp5 zwLtn^)+_v5w#cmX#Gmr^58yXkUwNCToF=_kW^nr2=3v_a0iG_J=m}*v3bYx=*bV?K zp>rSM^_b#*SN-qR!U(KE__v<-&EFu<@4Tl5)*j%ey%KQ~z{g3GKjCMfqMnx+o(|6y z;D}H%&S8oxLli8iZg8MYp4bI4B(Y3>m-1O8=-K=Clb?{Q|m;7k#Vp2Pg1 z2*{KDz1U8i?h;iM2h6{C)*i}uzKraPkWQ@1xH`5|I5@gQn6FmOhmA@vSRI~g5Lm~F z_^T1s4qy4!qU@0#j|v)jti-xqxQI!MUczP;yfjv2u8=prj&k==syY{7GFkj(6t1xoM53pI5}7m z8vij7e@ujxWZkI8rTpr>{hB>&F;!T_u6W0Hl5eHtg|0|TpmY4Ow4bice*ZSp&N&+_Ki%T5(w=p+ z4+(Pu(g7`v_atXj$;lxu*ssiivddrLmUZmaV@OI(PoP9anTH_D7;alp{9{iU4;iTj z_|ZtMFVfRNxu3V~7`rxs&Ot$b5~mL=~0T#)Ax5{O&=GY8^p(GU+k>CRe~ z1&UXKA78p^sLR^YGlrSEQ#Jh(VOX$!y16KXKV+kY+sQ8;^gKdF6~Hll8$8r^w%92j zAG3(@ugJrwq15{-XGz^~$B+_UKXr@oLe(P8e|3XHGn0HGb`;C~Vj_u)<9YT%+mwHf z#7;|%eep!gsB@GcOpteZ+)t?#H$Mxc7md}s?HjPky9<~Nd7m`@H}+Fu{WrC<(HhFL zn>hPyFsCDO@xXPbSh^O9VHk0QCC%RSF{MN)tB2v!Q3W`p$40#yoAp#;qKUK z|MDZ;9bXyHzg|0Y%8yS)wGS^~na&3M2vtLw$9{;njYrByH$a!5Q2}g=5y~{qSFC)j z*TgIu|Adgn#}vCfTp}UWt%qpPd|Fu^E_aUy9aAZ_fFk4ngWTr+4|2==AfpmU6ex`+ zqV>?x!CFC|I)Io9&RDAu*|js_1NtQ9Ni<>V!^idqzaB|zjA%doanBnVt@qFbMZWA- z7Y<_?sCt+Jq#bzi2&La-6K%NdYtKao3l`G<{$BS1=AHJVzH?yx*1ahO<&UJQmv>!R zk_z47>OH`CP3VjxjLlxqRyydDyDSrWkJ0+PqCvN;et=EePEVcR;TxlG{!Q8E`))pH zwlsJv^!8b-nW!(l(0_W&b-!iZmr|+rd1dY17GD)EU3wGd;+oxG#4JGlcIIFYC^F>d z??onbYHy{}c?9c{UfT%i-+Cu}NQW{~h+PwkL92E1t0QoLsPQoTe5vcKYw6tY(2&qz zSp)k&ftt^IoPrAXvgE`Z^qv69j{WduhZp?M=AG7r$0L8xZ6P#(h=36b+_g+CsW{(xD*i(j_4v-SytT|MNZ{p3iV`E%)9tbLN~gGx0g-`D>Y0F$nXvGj#K+ zsX;P^XBf*h&)u~7h|sF(rjZ>Ai$Cp-x7a5`{=J{t~cRRz;KK7 z5aXHI@PE)C{N!)hDPX*o!Lv)s&>Hv}V(;Dt=SETcjpR0cdW0@aGWen=Mxlr z10+rCbRIHF3ScOnzQ^yXDn~(SBr%UN%a!nusm`g6?riG4&i5KI-We7MV)0HAJz_~^>6VW%?oiH9WDsmIJ;`y_8ygU$|v`xC}Nyp@hNnGWy5*;^dkv(*U zJ7(uf9n^M)%Ndd$xt+QAH>KX({&-Ptjoo!K>=ekOwC$5!3i;%YIpUNF&*ZWz-DGmeg$5@DWhX}5@7j+>&+8!E3!8r54btOwMt|j_V=P_U zF|c&JDV%&`u76w(o26IPqgZu-c+f&bF|?)ELNhDhl^BIJz*llxJc-vkO_Q*ch6E(6$%G!R|? z9xf2!#6U`Rm>={=-9K*P(K28JMw+d97k@WthKN4U-C_5uyV?S_n7leKuF#^d3yC=z zF>=(~YVr;?Gv^j_i!JE0k|eW-+@(phgJ!$l+PjH0^)s0cUGTtaF6Wt03aNWUQ0#?$ z;#ip*EY>8x!&^q0otyrr$>1n7peunvk8~mhkZgyQC(XGzt8s&yJ zTNYdXxRn7@$*-!2!A_XebgMHG)P z7agCKzNE+Xeuv3tO7oX}y{MD3OfWEA8U2gZXH=a!{Fh4bbJ#cgV#)A-wh1jw4V6CW zcXcBe$*JqZm|>h(Z?8$Ga~ggGl#GDjWfSL5_(7zRZ1*Bq6eWj1gwqEwn|6r+MrArb>PoAcgmcOQ#Bn+ZaT<&{OCS89X(fa1RTfSEzB-S>T zz(`0*4$}@>J)*H@=_LQadMuKhVaFdg!6Q&k3fvjI{^9H=zIH#i!@}ahSA# zOEE__9(Phob1@N`A)3AuscYkdkEW;y)58}Q>uGx1;G*A-yKD&i3EzRAVyC7u<+eEG zSF=<$^ORZz)KY~I6n?W#EkfsGS>>zs!E2I)$s}bWrRg$I=3E-?1C`T6)X8G&lBB2q z13q9Bk>}31S$+F^W9-dU;XI;{2AU;xKc!pnwAw_gC-)>mWN!>7KdE9#Mf}l*X$v4y zXt*Z|gL>u2&GJDLm^?(F`F37&eio;2C}m8U6h`m3*&^oTHED7MJ36vZ zJBQKTKIA|NDU$@R*YjkDjszi+_v3;S1AjYqBn?Q`a{pNkF4J3+uk@~ZbGP5>I~>|# zEAl#oThV!U!e~{cDIc+G^+HrT;$O~~O~y~#Ycd&rFGTB!?>9J#rjq&a#Xrr{E#1r1 zy+EGl*qX2Y#=x6Ikg zShOWh(5W;1b6ekcJ}!J?!3qCC{P^wlJl5yl0E3VL;P{|H@HOqz^mVOJr_~FBZ6aH?nT?42KWiCwdvxVL5v+p`>V{cW$s_ z6U1Eomg>weq(jEh#HQ`H&2R;Cz9A@{72|w5w#4jZio%1nobr9h7OXq1)#^K}UG0(H z7qsjW@lXgQE7Yvcx1R1Dt8x?Oz6-t=N*SVQUBmik{y@Td(RVWpCey|*sxT>GP6&Mp zauIGw8S+hID)LPodoj9YQ#*AwAh4)ew8e3nD1A>cm(_mZQ!lLEUm?J+Ee$-*W&-~J zdI;o+d}Rs;Bb;(2W`Yu!{sUPVmI7iN|7194&hyc(oLrhUio}Yf70PHZZ8u)do%bjn z8J@9pgCI>fk*ZiGcLd}g*Uth$6uZ9I6yctVk`}lzG6Ad$wkzP!m3^O?(a*n8LD+dO z^xk6zUS)FVCnuSO37hBdJu8&>%2f4Viw_6x(pk~Jg2YjZfW`hG*~kdWp3TZggSp|{ zu9s`>YPWjokvJ4cXTPVbS4OTxU5l~Ia(E_ehlY6xuRH`kY6acZmlTzPL#+P#Oq(M$C8*c8~8TCyX@JF!(QgMg+vMsoH4qDowub zDTQk7{WlqURmbG+M4{WPR$T~~1##oKh|GrE#e>FpnN2W4$b>V%A$eeC{O4KNs(~8S zaj9o7L8O*XsSK4W{ogtE&9E~LDW59Uv?Ybm#-}Y+QFMLycv~+nm02OTm7D=OzkZn6 zQ1y6BfI^i0xFUc81YVyi5${5&4VEpDe_EVz`EUW?B@K<;**DS;XpO zr+q`tKKCfjc1dETVe5|ve|bW-#oD^@dnSbbuqzf`VGv~p53hzz3K^zv33n~o;iAWTmW9N^xD%p)g~ zB@H}^c3&iK(nRc*7TR6Yq&&VRl$Wb2x~(Xj@^6(L(cQ^FY_^-tBGr8gIl@+@?pd5= zoGEEMan?LNqOu^+%yc>Pc)$LTo)_mJ6vx?ZjY|&g?3`~>_k}O%I;$<2Yk&W1`-lX7 z`|RAa5P#uXC#wn>d-vSjDzN_H9@E*1lqqm*b81ms4BtN9(k6*LjPjSg+TAA20Bg`2 zrdr4r?slb2r`|b@o{X^F zn7<=+cZUh~$E2{U5tTeMZs-b^qpxmh??9#XJ8wOFFeM6-#Ge_Vt6DqG{eZ*{*e_m> zcNu~Pc|G0FY==k#T_tS)C5qk)%k+5%&H@-VQNqYym})q$Asbokgu~a?4M*Aj zz@TC_HACeBZCO_dgP>`~x2YXRQotUQKHv=e#o$a`7S&G`lcV13XCOvAWeU8mWFpvA z1z7)$NT?`lOyOX)jqA`}?ALv%3*&1NPj(r`_8ed%xy8b0^m*t4$=V2T-kdi4P#I&j zV*ZbtmV4USn``l{dlRF9kP=fw*bjeNr;WPWSJ-ctBa6SSZf`_dc79!yqT}vXzx`Iy zHVMtP9+IM>D>4EN?rkV0+%b5&2^S|9k9;cTopyf7WZkZ0smC(7?s09Cu|7W4OMD$Z zA_Dpy8X`q&N4+q*T$*`=G@(wRj7j6AxqHA8EGiBqpJ7^e8P@3N)V}M*>j~=VJnu)a z8$I|8qE;MQ9sLhu6oK{OJS>tg{~_8hR#k4t!@}scQ;8>e4-{mcA|&-HRG1#g9Yjgv zhH4hA5ug9_!asjZ66Y>D+E;xVcI}c9DJ{GB z)`~{r)7kmd%2kG)15I&vf*0A^Xh1g8ii0@iD;f(Y+C&+aGS~fNOkyr)D6Qhhm>!zl zK6+?VH|OCeyD_`GQ{i#`6}4bz&tuz`9;yoEmG`G_Q{8U1`hNB8M~ioDB&6yci3@>z z6?Uma8LFIo4E_**0cFZF=((1nN?H;}FcuW4q^Ntleb1-lf%D!ftpRPsN=+O+v|ANG zuR@E#T{BoP(#^Sfx=j$;z1MBQIj^LPm7Nm0tRYezfE2na)cHr>a3v>OkBH`prm9@< z9crf3sqE*tVkb)7yIY4IE}33E>rV{Mwj;Uz$n1l2`(q4Q4QA<633%3#(6Q;~m$|s# zB+mGCY>T}Se^w(n{Z@5m>23VyOGFJe6`BgYzv!4!JKNtZ^TEHz3`=-OS9j{XN!2nc zK6U>z!Q}fkM^H~$U?*>tu;aEB+CpTimDJ54(BsNvlPMUj+nF)SA0j=ZyYu`HmdW^n zZkqpxXh7Oa=nMfeS^$)l;U^r-!P~=Aa@GeD9XO#UkWFN<@7u@0DA-MQpAaqz@YITq zy{%Y$Y*EN!qEq$ryTNKK=B~l%$?SfQ7)#as4Org|W_21j&WhMIY<-tvKePa?O=e9j zyYR7ejayC>)x{!p zX2&}faKiz;mP1jy3Wthq_a<#)~w$)>Hg`bOeFNQ0*j~`g|2u_K?(W;iW<#-c50L z96qN(UIMKW8>CoCN+7Y)d_uROGE4H23$YRe3gnIN?c(?GXe)%Aa0xRtgGyZJzI5nt zbP($k${To0moQHm7Q98+4k#{O#FYVEk7+ zJ1#PTag%EeGU_%@{IUoYH~y}y%NBPy1F*~gmd8c0dS`hcMD|Wd-FV5JE z9!M-ujThOko)IgJ2(~1#AQb=3($jM`*6KXk85RJ2%&2TZCN4{x*L?xi6a5t^)uubQ zx?z>W_pR`(QGfF7p8a0aV(9$k3zZ&^!g|^jTi|G`ITcqJm;3O~C(tq?v=Zw9fw}JC zJIeIf8|M*6VprmpZnJ(Kbj%vYEaIAVk5Nxv&7J0Mh0c3GgstP>Y|PziA5csjRI~*^ zy+^M6AW1(%kjtp$qS=>_wJ$pqezPCI`f=*8JT3`qtjTb#9~BeVE#|{PC+JH|F24Mzd(Ed6@ofsz-r@i%>oa26B;i+Pkx6X> zaKW2Ri^dvBAFCS83rBkr_XE-qU~yVO%Z5>u4Ce$I!AYc)#4Jd}vb~uDq zKaaUiqif&wKnx|vn(YmQ5Gh3gbO0OXepeOibC6jxPy3s50%$DjnCOaL4e!P6%HRrF zFj$FbbF@s`uoZf(CCLbI6F5(i%xt*~@QX zaRQD%+SRJMc*Tlf^+(OUcRk3<(06*%=%frb{H?#)j zCfEba+94?iAHO(13N{x)(rYa~>D*r7@L?_LA@+HvaL@kr=)3J9LFKHe~^8z+G|zf9RdY#L^7dj=LUHvCVDZ2P8g542H|F!BYO{GOvJlOw%7hA^-A zGOX#!#QBiy`y}q}&?YHda#N??rh(ut{|nX2=VARcEjVGZT0^MhB&rotPxvd%ec~34 z0;BvtWNVWHR@REkmW>oLjtK*V&P|fBq)N9H`Ny3mZ7+qev1onkHE6%cY$|iK(-lxf zJFR!rWfPKl6V@@^R6F8n1RUGRru^tCYxKZd&9Iv4UE@yklePeD7R`U}52ODHR>{?8 zC3Tq8Vo;GvvLHoSf)|3b?umsa2B+_~H+kWui^Dk<&?`IV)zv})P-P^aUyJy!mqB49 zm_;BM_QJnOhj#N`zcGcB5XJ9G{v^1W3iH!Fd9fg_G(~+=t)O;DK4o#bA=UvG0t#^Y zt3U2(S*X)5lGY+Q^Wm)28jM$eQyNX={%j=5EYvTg8M-pSy{cr=TAqhHkYUKLt5&RC z@$=s-bmgctON_1uNf0X)z85_Or{N%M;1$0YjI>TG@{cxI`|A3(5U+HwpV#w7o+TMyefC0+?RT1`dw>OxgC3g9khRA!k{+t|LlK6oM%2S%n-Q$}8zL@@2rfuPXXO%;#V-8|n6b>p`61V9kw@1bm9 z2HXwoj(`nsNoU@)$YRoOuETu9vEkC_oR;*rj-G0+GCWtAFvw^bib8*37(5QBm&Tp^ zgj^W7pNhg}{!(qpJGT1p?=~bcsva?bFMy@U$cAUUaTrn(37-+(7hx-PcIc;y*V<17 zL7hyM3c4M2A^OHdVz^F?k)i>=G2cIdAoCoa{W4X&bYuxQO^kSH`$e9=HN4rMDu2SG z$AgaKEX5rh&C9@g&hJ{4vxta(bsK`rYQtmtMcckSMtlV8dkK3AnsDo*`O7BoZnhx# z`W2);2f57zNA5>>?WHOQ>8~?SHOGS>uVZIiM>xWUc4q+9cIrf^?WjyL=_Y=ee-kr z1=~0V97yWBg1DFR!Q;Ku;VT-oLgl;{$^?A<4KQr(r~U-88d`Jn8|zM^l^?A?7wsch zCecKH&Bu@ro>92nd}i}y1^AJMbFKX%;hvXveKifye%%khiC`T&#tmmodnI7b31ZsPcBtcG8jCmG$ z6_D79U30J+C_OME3>c8@Z1j>h?<>1o71!j4d|aQFeSXT(PK#lg8KiVs?^6-#Z$#)=^=(b&I(>S0|u)$H(X(BYR_h7*z=s)x}HyY*tcbYyqQmN89qTPvyLAF63OE7 z_w74?XG(6MvH0pf1k`+H9)d(@Shu{a)$B;at%=jYkV&C((Uuu3Rx%1%W4I+bUG^0_ zhOSXU10S^ZReuy7c^>`WJz&R-+xjz*%Pu`__*=o+hndw5I99grQ}4^7rN^aqco0!z zTeaeBeOamXGI7=0Z+D)>Jtx$3)xsfP_CBlW%0ikd*5icL+K#wku_~cO_=IwYJ#-&t zw{&V#G)5-4SY5HDdpia}_V0<5ws>mea@=gnbzaZdx@}*ntarD^P z4@ZE95GmalxDw+k_^g6EyQj)&?94l<+eEXN=MQ5q!+G?M1&RvJx>&MTmrsB|2>}(4 zL@!p;c@HBk7^{Ig>J92OqA`xsWYF^b!VFZp#3wuV-Ba}rzO(CLte5uIhE9&3@3=f0 z4P@MpNBp@z(9}#h^uYQWFo9V0IuGnrgua9<`M!Ga1w=i7GbEf#e!v%GR1vjv9O5e8 zZ0cFADV8(p$$U^@i^F$QY7_C&RFiCe@jT%uZUDpi=+hdszT>cKMF6qtSEZ>K3kWrl z(>)_S37b&yBilLsihjn2l^_GS6G>v+sfZR%d2UYVYE1l7hJ4#QC*_K+;K6P_$9H?Z z$|G6y{=F}W&?Q7lyIuUu?9s|&17SOxHt#F^arhW~Sp7&8qIvfVIe1o+Qz}0nSL*pi zhS05y&v07{PxECDuZvgD#2RnDI0*JKZZu|Hvr^orGf$dp!M{k;V21Mc)OoRI^}Xw^ z2=fV-R4R^cruaT26R(c-+fmq^qIFAm%DMUxv-3&3rmEka@1^ZnS{N+3Ai1^T#7P=I zKW=b(iL;r|)v>pG_oDXfGf@+|2XiuVX~Q(k++OR{*}U@COL)O7#=m0X@H=`Au6V^B z-B{a*T3qYG92{o{JjnljJ~%*cUY}lQ(qr|3*pggyRjT&Q;ugF2Lkmuf@p*v=Kw-%+ zOxHDzUm?O%61h!FyD?PABH;C#Dz4p5%x_31{V~m+<1C5jgdf&G9d}6ozHb-9J_M2P*HQbm;PuE(;}-40%nZP+pPGcG=P`Zn-j+^ijNe+ExX zoPR$40)tMg(S$Q@Q-@dS;qbB87JIQ(~v=fj(|t zwq(1?EBVQgi&CxrJV{HI#kbmFEk(WziociqlpqWfi+zuU)!>5Wk0JRv60)E@y;VfoeE=fF5Hjv2++Syt>(NymUiic}r7AyEezdra!do~!{TVp>b;`nvj0^b0sw?-Kq)7tnf0lb43tC9<;1*V#` z_1&#A0f)*W>6kL=xJz74`+AOuNDhSao^foj|fY5tFySXWT zX`gn;&+vpiUqd$A!X>2y14x*E2^dmSCD1cc+8;*2raT#ue`u=3@`z%3znq_z&=EX7ILi#a> zV1UJ9|1pLu((f@xErP4;MAIv3_!r?$pMx3iCdVn1nT4iQrX6@%b$~J}W1BWN0|6oZx*j~P=?((+Kle0z`ZfN{|-WUbmR~{j_K1s~D2>P=w-iI+&-yli# zsy;<+j-i0fG#@jPgrRRmxCPT~+Rei%w;ga_oB=%&jKSI-iBs;n%zD^Qhb3|c?RGQ9 zI$=6z+?XmFc6gv-+)L;x$Qr$9uF7@Kde>@|)|n~qrR;Bu8t){j;%Fot`OlO!k~@>W z%OGFwaUGZjR@GL4tLa$&cD%Uqe2FoHcOrci3XtJNd|{EJYoav68fku&Xx5o8B^g@} zy;7!oyZW{NZ_E3%vuXoTX#koTlS1)ceA)58_%su4&b8jNxUxE}9?(p1YR~$WACSK9 zcYnVA;1~asf6&71I@Oxf-w*|#{*AxN4s%Y#blEY($m4zYQN3%}&1=?GsXcY=+q~O; z32du{coYy?Ls0bR9`D3v`u6}k(d!|99&au3lAnwN{~=H43WnouL+Xg3mlD%?ZGN+N zH8?X;j2Q;&=a2Q8o`+v+9+lm|C{mKJLBcuA5b*C7uN0oOmbM$$OQaQh#G% z9#1jW0W*xl#Oa&KPz0VHsEom`W&dFHYWlIPs^*=}ZJ&Z%>LS(S-0KMO5~<6>I-|vz zgDR(;9%;alany=48T|9lOzdJW@c?y*{UTwQvBjH?At@Hzptoct-J1_C<6crVJ$Du< z(ug@`w|1qF0L-3fK2>+&VXbxa3#81fvb)U&F{xK z>M+mG%q^b5u50+-qcKzlE9e!;-wDszmf1&@A-R!rbQ_@un zd*fx6*?TGcwQP$%tteVOd+4BHVnf_q)W}NFVdA;DZmgw-D7K|WTl{g5d1#~pdh{J< zV%`N}=+}K8ihQ4<)`V>{y5Ycxg$AP)_FlJB*EEe5cZ5B-piC9fTaI zF(Jqtw?w?Voq*OT(Aia)Cj2jgNXeKWxWD~Rcd9A*PaDn*Xpg&O$8o$g=z_V$k<_+m zOXd3rNkxz4DpuZuU6k7yFj-@nKq1 zm$!*0w97e~vhEtu^!M6zaGWWG$p5D;)r@qe*<=FIJ1DkI5FgITU(OjjieuYPLzwL$ z!Z07X52jU#dG^i;h>otudSmymy@fO&&CyGPtz<+_7D{T5P?XR}9wz?PF8&p+2frY> zc(r(N2-}x2rhw@7+eGnonF1z7vM)<9N$KFXk!MWmgncg{CF@-PU4(}Nd5Xs^{VnoA zBzNTf$TyMq(3T!9w7gQ+Kw?lR~-A$*M^2QHrK3S2?{82ji?_2yWAND0k>cs54jg4I{AfdQJ<# zSLN3Cem!5C`10(cq<`@$m`y)|e1E4x=A9sfK^L|i=}Usr!lb=?ShZ2}u7 z2iF5Wf*8D#ldLLAkO|i&{gJ*J6~Ii=gacEr(TFPY$cR|0l3>#Y*~ zL<6g@$j^=_!jmfG^r+g6oLlo~p$=!nm334gR&wgP8DMFCmoRcaWYJpd#_~sLv5mOK zl;8EAvnMY}c8TQCjp?u11lLqiZ(hgaO{7Ydb)7)251KvG@7X@D!NEpSDyg(2Euc51 zh&1tBov^k@b-xH-%%!-IlgZeoK91XW4ZA6GX1u4|-14t&oMVJ=D-xzWG~p2r^6Jxk zX0@N7#ew!Aj27=BG4|h(zkx3i$xX<)9sat+H@D5%3etr|`F!EfJnG@$W1PXwC{ON< z`DaN^#PHWSm@f{Xs*c$TO&}$sthm>rFJJ)v#MWI@Q2t0Z9_H5ECfz<}gKF93CNodm z-R`x^r4*QTU^Fu*J(73n!d;GB0RFYoHEj=;jJB)VHx!Dsbq0g70y1I~xoaCK4y-;i#I|UFxy_xFDZl68OBfljKFyMl zDX3r4()t-~u|c|V3-=qW%sK*)2i7=mr${R zYnOJU=hf-E>xQp3*}UcENSbI$-0jU~rQU%u6>LXJjVpHTn~O>2NBQL9=K%hQW~{4e zDi?M6e>z#4yv|SS64eGE0l%l7)nLUZUAavwHEEbtH5lHJ97fBIYvk@jK>gRp`T%F5alin7#LkZgXtku(^;YVZGH!H_S zJtUY}bV_wa$K{e)u!Fb@O8qw5b1$lcKiZmnX?Z%XkneIOBfi+V>^z1(b&m#`r|z40 zovzndiFx`b_ws1ecsWN@1yKAMY3_2MFcFqRr$oS&Bzo&kcG9)(jUv0i3p_1VG`)UM z*{L1uE;OuY{q9iE4#q9F(oh#{+9C4^rY|=wX)z>e`Rbnc3#*Z{TnofOgs0SoAkaYj z&KW26;RnkPZ1hcE^BxGHz!y>nyQb4K05c5~zeCNci#f#VXM{3-60?x}I05!nwSx_l*-xxXU8F&@=dnDXWn= zNWlO34aF)g?#K5H?jM;vSnZsFGqYb6eKJp;iS!qcPBSBHiiz5IUTRjqh{{ce#ftB3 z*1R0#ecN#&04jud%5JCn(*JyKkE%Y}G?t-s_qE3zc)DyzKH6zLTKtJ~*Sh9b;JVhz z6xVeuE#Sl><=4a17k>CwPlbkW%cZ!}4I5``NRf2Gy6`ox9*SOp25Sqef@0=Jj(vYg z5UXZ~G*xO=NrdJ@CMI>8Z4S7m2>*16X1iwf;vJO>f*_mw;xA;xQMTmNl4!5{=YfDa zaM5>%Bq$h(ABeLdO)H1?RYx{5GYf0 zUSm?V>lrjx;B%!N<5t+z-A|*7M~(EMe7EE3jmNp*@uXnfa>>++lVzsw5k)rE`=*8O zEm;!T{G}V2tAvZ4kbktW?p`52?D<(cd8>@XZbgQmC%Vr;mx{`C>2k7NW`?&~9iYjX z7r{7;OvOr=3y&WuN!YASKkahwSMaF|+RT7n;%#2={4Lsr} zV&7y0(&1q0D(=n)Q@I(xi-w4602xoIG7<_B{@(TP zC2#cP>gjf{DW}N@YW$*S>+^I;jJkM$ABiYHA{y^QN={TCox%L#Jq}7s&=@?jO@P;A zEAGh-PnDsdzfZz|FPAi7Bn*;_UZ0UpcjA(k`f%B@x=&ElNss~dfpidmn|%HOZ(2G4 zYEs&kq3-@9P0;`Z52HUfPKs9f(gD}CJeHrAMDVB?`l7$lH8XrGq( zqjjX|!efQG*N@NuE(ZUb^4WNdx3gJNhlfqV2^6zJE9p(;D?xQ^DWRndKOd2 zS;`yWY6aolBK4aP+ggliP_8jr$-H?=C;-ccr~DE9{u-$jnrfI&Q1PG74No`54=OVW zjL9!Hu!a%)xDwAM&O3Y4n%i=JgUb!emd9qb*0^py-_9e5JrDUs?{X(E8}jpV(S%R; z>TAd4R}p31K5X!hY_>h{@Of&L6>(yNYLiZ4x++ai<8m)gZ)qiR{*x5f=9b>~sF1k3 zEs1=b0u^hSMx^5R_sH(jHtBkrw7v3xVCivlxu zUB~goP+L+0D!b=+Drh^kxs&c(rFP!2UL0z_&oP@qvTuq>uKM$qsIM(z(jsYhOvw34 z{l`uJYflV-yYffm#gG**G53(i=V!JR6{0&zu3Q~IF10t#MOZX)f*yB2NHV4PpVi4^ zzYr@6px~I(;7s7(m9mQPJ_IlX>uW_9Z_!0vizjjy z53e2Ii}EswwMW!n4_=&qSxMVLxNWc=@Xr~~_U@fCtZ3{w-u#K`4?H9|dA{TLthF?y z_M}&~rvjU`6LK?t2S5}r)d zkR+>D=;105WVysgobW~ke9RIbg^GP$YR`4gd= zs3u3a%h}DRQ$J#>lDppT zH1RcsYlLW}*|nOALKZIess!T$5(SQRIlP;w>4O@Kbf7~=P48O0#ZVFFY3iy`q&SC! zU5`(4Acs^pLBHOw`J+wmzESUMdU{3KKdCBYTSzGwL(6z@s{d(app|QK=ZqOdV!dDl zQBWbV(_T8FLV)4bP;@rm)%*p!`n%@dD~8Rne={F5XeDHhau+3YQ!`i`S>|F{1bY6P zx||di$AoX9?T413*`cDdR;^;tCZ^A(r1V%{_39*Rf|GwJ)jvd;Oqu&;osAxMfH40AuSxL!kFJbVYI!ju zK?YPLqajyMU{2=x!^h6VUO>_!ZRief@ub$ik0&;j#pgjf(ECEqV)B-~60h$#gV&d( z2)hH;*Y)Fu;^|4xo=4yccFN&ja@=E!MUp|3@m}wv*xtU2v`t?;C+-n?*Qw3s$Vsep zGA+H*fm#djauspCjbU>=uLnoNhPB9^u&~Pui*p31!G~8l0ue0QE_Y_i3wQ0tK-2aG zWFV$qJdmX#X1GFXzocR2T61t*`35{5NJ+2_IgHcbV%={6HVHXb9c)$Dd@Z|v z`^sIaPI>qu{h$3XRIRTnVol#;@{&_Y*MHeFpC756fAU&qV?`(b(Wb(6FIf#)of;0pJ}>kfmz__6UUOJ^r;|0&oaV zL?3(PKEDyCLqc}nwS3x2WdEP0_#E_C9!{D6V=i5;5ue!(K@7F$R;&pp$4E~Z$YQ>k zNo=WHufs!b-p@~2%4dSdkI>yg31tWGWF|vTiA=LzGrK03QDOAZlW1IcyYH+dO|BVv zv`3h?GiP)zd_z0TG*tj0Qum-whTqmOAcluhh6y8lY~}a|uY7 zJI7X>%%Y-C-cqXCop|Ao#*#ps0M85T%!p?pQ2?lNY#H}y;> z4{H{CwJo$-Ut1&PFEUs7;<=*pkLXNoV8hkUQMVPw0L-0q@_HDZ*t|NB?p=0}h#2^0 zqC&&HOn{OMydNm#iD*@ZudSo^7lUjR{>gm?)w6&`HdykF8Hq#0SOI%aAOI(Qn!i=7 zu&HU&I8oKz-+NDN{OdDBoJcl4cryCcbPs`DRfe4!U`gVe{}(#-@TR89Ks+4Nk&B^E z6}~~;sfI=*b8Jt&IPemearI_h(<-Q2__y9Z!}f{mO#H>QlWm>7uW*ezKVNNf!u%;P zGgefi1)~ahGxA0QBfnB^_nQS{qGnLHqJ^Yu%)_BO^859joQAzEA`Qc z(QH;HTx<(BT7lFDe}Vcrm-R~4D0j!9+{)3pKW)$GK%`{Cjea2h(MRAoohX4gKWmg| z0@|hsu@P}2;Wa~Kx~4IVo8M#7ZyCE4?^$h6HyU|jVHGd(Aq+5$NLKlLktreQxng!t z-tkYpt0RbRXZ(9|`>o1%c%R)odtnxUI0$q!qHIO;$o6Fg|7rE+-9rX*gFD+aKwo|t z2n}{1v3OpLu{b43d?WwvTH2~yl4!sa^}Bzy0<7N{8KQZL8dvZkV2x*eI0h&4OMJEO z3b?gCh8^eKmWrN75-C^y_G$fbin5XFS8JvPg!%d|%s%A&VTg0xTyZz6FP2OFt7w4V;8bDLBzB!B_S{-e^!;a9t`?ko%{EgAMDboJI8}co)GkcZQ zRa4h33VZD0Xq z$Ifg1D?7ni4LfN>kv6`M0Y(w83x*rx*#IeF+vF%Ovq@JGz8`@{>&8Lr^Xb*>?L zJNz6p`d3KS*`!o2kFmbt&n;(bg8|>bAJ`QCZF<|3wIm(9eYt+`qADbyPjZ?VU;wwoAp;YzCl$1k zj)o6Wv0#1uPQic=yEHpAO4Fi2Ui3lcR=aP?rRfs? zIt+=G1|C6}(_jJVt!36&l3zKH5J9UmX3_10rK}Uf*+RXl{!GcKw}Sgfw}0J%=RcTC zGAiBDRi}KsH8)PERDJhWzFxv#cjP(Ua2a#E`c&RsRW7ESs5abh-tcJS$cVhAeC8uq zXaGEw)O7X`>5dsiR}!L|tG9yo7N0Bui18D3ECEFaF9`eQ*Ou+DEi~w6XA5kkww;_`oS6=7Z`jt3I?Wo03Kr(h7LE_i(QqmdxxS$l( zH0#NAEgR@~RO$|AjDG%ewO7n&i(=|xN5|gH_HTEGp~obXGabO_+T-kWLd{UGvU^3s z)@q|SBSgJrH;vR7pf3M0C)r_$ikSR>0@vW|Qcyj5++un4R|H(^j`XU<`J3Nk zUTYBO?pRY**`V=sRT(bazLfDZ%16dZ%GgJzQuEC+CRbvbeHuOaU3C!~;3jceLGWcf z@R<4H2LaOLwBjVz?S*c1D^^4Cg^@!Kwr1Gdc^ieJW%-jyBnd(e zzW^BT$js+0+Vet%>yb1i9M~@9ex7Wxy#kXrh|}a#SjXDUQsW?ombxBfB+^h zaJ#wT)^(S3z(F+Juddj^fe+lHn!LG)npl$RGZ5)+u39#$+M0plv=`9F${1I0j^whk8kv3Kkt`#+*uH0;ZQW?qxot<40eEHdC|oVLT!#1G zRXE8YB1L&B=xEH5!$}CY`p37kitwV26C8Yzt9(e+mvF?2_60R{%2Q z39Z1(_%+X-i{7Cgva4D#9Sy_M;)2ZF)bsb^_fsBb+c`~rgkLXO4AN}XnH2lR%bVr@ z;T>=*T}LUF{mzD8>&(`hU-g?PelqofZOy5@pNWmXyF8O5kI%+Fywv8+!@Vxg^)tcS zzIM6Gg-?dK&a1Yc^_7$-pF!#69{f0^2&*%W+f}im-kI@n51SSmZ*K52sXo?Yc`Izk znk@fSI{Vd&=?{L+yv-A2G6X1Jam(FKsZ+X&Niy+(1I^P6$=t*MllLJuQ&Y=UF)jp4 z%-1?rCwWDlVE_r6^}Y_@b@hp-UI@b>*G-BjkORnTGIB zG^piY$xD5R3`NP&yr^kj%e9zQ=<%u)&p~8ns=09*- z%W4%{1|K6wQ3fg86s#i5x=dN{gOAEK8_Q$DZ27D^?v47eagUl6~DH54xNJRKAPgYM4e&{7cV{FcfIs0impsv z!i}+u{Z^%6cgqcbrT!BqCo$%CEO+O9{xULdHR^wHo9ooi+%{Jx-T`am>)mm!f7zll z6St@o9@Z~gBqSwuz*_!G00FuAwGl(NC;lB{F5Mi<@ZUVElQF&tx=nQdA5G`s&34$g zan#;wZ)$IJl-RAkN@;7x-k}JoO&fbgjiQ7gV!e6Z=RD{5 z1AfQ3bKl=_U7w2(ymzA~Hzd_yJ>r9WabpF>uZDkwuT@y*9Wr$!M8xS1Q5U|XpgT_P zyEyq4o=1*0u2?6#x^oa1zyDg@dF9l-Y3<}ferDb!ti|-<$O(wO_M8^%}*mx%&1DJG|?CI?6M=vX<^b*N2^t9b5IW8I(+3TtTsqiV|Tdh zW;zT-eN2{C{co}gYyCv>n4U2%t*@7A(~atAu5lPc z0204y^m?;JSl|$OzmZJc`sS7YN-JQDq15`p1CU!4+t7NZ&rxcB{i#8&_vVuJ;Y6M< zX&~0R=ONJ-K-}5I2!|gXmHye+(P_5N@YX6f1nZq9#R7E(ZBE;~ko}W5*lq)(Iu!EtlE&>Br)fN?5VHjb9@t>nsIXw-G&y zwocUtG3FFkl9iC&A4yUA?wbkguRzhM8l=t#N^mIg*Ssw4cH|FU4yAm-!2ANMxa6$v zU*k6!G`0dxQExx7oS2%A4nXEPJRwUq_!oObP^W#mwv-ym?dP6rel=l^Kd`#$8UI{j zJ71wb|8@lXXd$UY!xG(O8acj6c^t_OjX7`BL0fASmWpJAlSz@Nj{AR1N=;nv(&^l0}{(-Q5jf`bG|ms!0{l z>I+ER0TycP=37S8)nuNI4Ae`Wc)78R%Sp7vFDTsZkN)k(2)WPMpY<=s6h(tCE5LtP zVezm?5%Eu|^y{^l5JCKE&G7IyhbEqO&>t;@!p28F(n*kD_qf^%x*lYux`fK~sxCG< zRt**JP9S~1o-jXnHCLA}Zy zeB1O*obmAHRPH*l@Vr%Ui&H<2Yimj&Ft1DJ?T(S!=6s+ZTM`V0GC@aCr2TlU)@wRx zU*9y@)ABEo-~Sh3*E`-xSD`_I#I&@0ZSQ1_#lVGv7$u z!MZi}Hm~+U2Kxrrm@+7@SDP?HBm9ATMZqBnQ6ttw)R!{N_wQR7MM05;?8j^Hj_Z4M z1BA-H@XO zg1-1jYVK$~Z8DSY$h&!rLaBXU=~fwl28mdG+ezgF=1U z#cD++{}(z!HS~S<2Y0F@Ji6baspL{$qXf3OYksL$bixk0uuam`h~(el3glx*AjSlo zUu&-{`yGz?%M!_G^dw%2zzn=oJpSAric$F1`2km{B3=01qRbR*t!DYq9=DM)rR+4; zwdlje6QkTexh>eHqmk>iT9H8ZL9B}X5TE>*NRs@=*1!z*d$x4J#zhnb-|T>Bk^-Fl z=6O}DNk7HLhkwO+{kd<i(&OYEMoQtUu-Ehh(a_RI}pdaMN_j zrQpUkN6i{%BkXVWSn)X@kHK~4(CEXjn3BXQ*k%dJ>S#S6Byxj&1b)eLooOuucD&h0 z*{@H(_BTE^ zjg=q6KbTol++_q#@*Rz_^`f0=ez&fwt9^xfJG%+OUP9t#?=58TdDZyf{bz--PHXg2wTdE2`*lI^MgTa{ zWm`)P%%2!a9sWvg_~jHlEHf#Us_oucKw+C#a$J5ke|zLuv(Ea`ly(#S#joaid!))$ zIRoWN7X9>T$)fe~NuKQg%Vq*@=Et4+ML@)Da3zwWi3a?$V2g;jD`nly&nO^3cKI&( zzo;9Y6w|n1vkt;4`3>z*wcl;IRjG?y8#6l-jk%M<7dwLPa#y7Vmn7}uvl%`BpM7nu zCX+G35?L248S!Q%5$MUcq{VPZeAs-hiORCF9x8$VRx&JlBczdELG*0lu;`MRJAPk3 zOLaySvLu|bNga_T_w4A;4dUI+8}&hRd=J9}d0WuA4Bly|;vdw0)`H-r``cb)I%ZhW z5Vhk6xy4`ay|(%C#eEd@3_x}>OPT|GC3!Pkp=5Z0lW^;|%9{HSs)~o9o^0^k-La}E zsr@$@cX225ThXNtj4}v<*4-Lfs82f|KI#c2ReRoS1}*hJOSlvo{Al~mUJP0qek`R< z85u6P)x@5YKcT$wljD~LvzqPQ??uM5lJXsb&#V$hzc%K>c`Da$GK((rp`FyiN>Rbys@= zAPc&CBO-USyTMTO^MG5iTX^$hk_QJ3m0g z+Qa0_lIhub%<(z@4Y5+}*VTc>X2q{$H!4Q+GPupqUaGO|)%X=MPEtCKCPeD3T4RJI z(Wk!0^g=?j2vAf!p({?ZPnL8sT(u{$tV_Hlmn|VL`1KBOgbLm1MT=d@r+mycLtRBB zofBfx`7Zv!d+K+dA1=OP1{F7h2-Y*QcOwNMLd4DqJZLfbG8MLid7?K}`7V6IQlwIn zJ(eEtz3D<7OrUu_Nmr>`K+(;~a}vmW&)R|sL1gyaa|pL8NM9hP{U#A8K$GuQ|JZ|T zmjaO=*D?eba4FhmdPaN?J^Iaeyd*>87e%0jVA?u8Qq0?_P*PA$E#k@Q-g-{89nl*T z;dgGCO!AfQKv%*@Y2>zYdsNbN1xb%DRSu)C{L0uD_Mx(4;Mwg{l9wdKxNyqOiIw8I z--K_63)hpyo!rvTrJ^;^m{i18MOG@Xe=RAMT$Lk!%UiEQMQ;tZiAh%OM$7}9Tw6`j zjAy*)c8M(OnpNyW8i!*8+gH5sFHJ^3;jp(f9CR^7zR4j5{_D3wbr2#GBOT{LXoQ1$ zjPd-Jl=;%pfBN<`HW2&jrf3fomA8J&i!?Z<4xlo~V_mvygVxI8VCcN3zm@IMD?T{6 zLW2J%GAk{fY~J(@j;g<3WsTEc*ZN#!Lpf^|z@leuD)QHM=ES8JH+7$6c8>^>qeL+B zX7A4Bzidc)NN4G18~hkv&9s?HP|~F{U21t)-X|Nxz?1?$Ev~WpQ-@H4Qkk2xM{l_? zMS1z>dflZ*Jj~m9NNk{GdGyGn$(sMKL@dJW(394U1>OD4Dg9S#G_E%(_GsgG)big2fdCA(cRdLnMkYh;GB zJ2w!t-ZBf3U2kQc(T?i~dZ1i`pOaLjPwzRjo8K6QLt_B#Eh~qxkhy32Td<{BcBceaPSPEbP*an`uTUR=Ju3+Ie)K=Z z7VcB`I%E<&CUlJWbqkc#qHs?%u!lz=tVv^H#m~0Ld6-aR{0;V%Dl9XHbbZVoSV8?X z=(c7~O2EjA;d1^t`P8vuTtvRkX>1Ir8GfhT7k39})cmIpnSZHv5_hTkNv=2GO!H2? zF@a-^SP89R9}(o$WIxp2etGO*w9Snl7gYeHfUBkh%P#Li(oddDG4WgK=6k5G%3aXe z?+o7K*qUMvB~DP;rC#pmPTva`qH+3hg>3a10)%a9@ypb-4RS=7mbL1}Y(|=1Z2-%HIs5@bl?8bXt zI~p6R60Qo58;3m|NrQq2d;bo)HZkibomq59xyn05ABy6^hcMjhd11RBri?=DQh)4K zO{!vRWkk#9YQ)$!@?Tap72B?hT{46#fDq@Q#taerTflQO*2>k8pIS$g1LOnw=XY5% zvPxfq3Ga~%C~8S^^W`+3z5UHVbJ7=%((B{Nr3~BeH|zB4Vw*^dR`Q!XQ>Vi7jdk`t zyGw^_y!>e>m6y_W|0}l04^o*PDY!rDy6a-=$4AWTx{k64yCMwCA{Q48Ob=nS@7b++ zDT~W-i$DuCD{RD^^9iS+9M@vTaIN zFx?lc=la)S_WY|J+?dfWm9kcHz7qTXm*DHVe3Dd+(Bg^8pTex0IM$<>FtJll z5Sc~^zz>EJzi#ulWc4dGYK0HsAF!KDJ;62rVW^48jS|PNH6nb~VUD~TI<#hPNh5;6 zFN}Ozug^P_`uvbhO0?tLE;lm_yNN)HaTSvte!SMgNpEnOJAx^}Ih`0L8j`aubj5D2 z7=gMEb{ZM*JpAG}WhLVxe7ei0oq8WFLoXIC+zp{;Qdb`Nt%3-v`m>?4H-Cu?ST}A@ zA1jj@csfVBF~Kty4d8Iu|JYX%@kizl*U3j-usVSJ!&Aw)@3#0ibV@Fct!}cHf;CbI z2q7^V<$pe6$vCY@zEMW~vua>ZP~pX8Mc8~~3&d#T#uSD2{WobnyYsGLV4rp1KpozZCv*zD=gP1zKfaOInN8z^wmFVTV&J_~ zqi4Uyy_?NLqCT=LQ{Y&@lp;)#q4~n5NL^np@v1&=TjW@__96VmKeLe)3$`14KiH}4 zsL{ZX9KXfQ4XE);=W{t|Sg`F=bs7CU{wGuPWCb@# zhph+Cw(dzok~C67?*7x*K;akT{0aTvvxsdM)mS6TaY;GdlnEacOPEBE;x)Du@VWv6 zW?y@B9oOdh7L(zZPS;78Lw8HhHHjWYZLqK~u8F}rl)1-S37|>8Sn1QV!?tets5OxR zdk0_{Eth^a@AIfAP3xTgls0JhAm!*AG*lRlmN>1vxU&M4(@_3|_{@O*?D4OQa3K*C zA&2~YEiF*K@(?7TYoxqERP}8-Z89u+W` z9;)YLJL7-+zG$`~Y?&Cm>)|Gd7C1l#jz0jCssWTwxJzMm?st6%ucO5lD4uLrsZ)HJ1yRJC;RlP)m* z56~h{P4b*rTr5vpybcl1@(WGmsTVsoVbxpAT(`p>DJj5sk9BXN#&zPYjz`yywu9NB z?Sx;Jt^W?sQ{wR6r&==fl|6J7rW27~Zi=BNANz##z(RG!iOt3_t0_d$6$hT-WU(p} zB*Y}L`LqefV6kEWi88u;B}DCN>gP>FqdK<9GO7l5(lMY zD_>leS+`zA+@zd%A8>Ud_bm9S$a?F#;Qm^uS2U^a$*7Kb7=Rp5>`i*|eDzVJ*;Aea zN-kRgxH&3o`Hf9K`e z59#eVO)j9qCtvQX?RLCyk5(-;Vyct``^At{Rrn%_m{;}?%0KjlG_Ai2_?z!oiO`B$ zHEESZ`{5t4A;_N)r1>PySoyZx7NSgA`W2$@bYZ+Ak2g8IZB#$JH5+m(NR^)m2kYym zNhPqfTSZ6GQoo}g9Kb&e$crFW@rjiijq~~_0Mnpy%F{;w36B2d%WtV*+E-TALqB&< zG`bLFsjsQ#*absTpH4s$n_2P2G>6|YgY3Ss!lhmf<@&c>6MI_k@Ii9h6e&=iWAV!BZB`raTa z^o*T{uWySCZA6i6x*Hx5!x`kfwffxsb6it`@#ks)IR}lqpwRrCZwYeScD-t9>V_Vw z2$)ER8}M$*OqEOEqPFDsR4wi#s6qwvw##mvPvcT<4IR$@ad_1jfSph&nvY9C7SHWEh1?Jh>dule01wx-OmpMqX0Hkch&^|Xa=gER)l@g6)? zari-hC({h2^QS2l5iCv+?!q1hyp*fF{`FPS@<-`1`@>?`FM4-*kZ*kV zSwHM+E%-K!Kv1ea3rreAfa}6&mABf2*Rdn&hQ!jV`~5fU&ReB-j}93rx6zXWJ34Ils!k0;r+{i zRhn*@peDA4ARJSJcO=XJ|5 zw45$91go3#AasfGHwEA7!GzLgy77a;q(21A%3tmuF}^TASbF`Q3!W52_^6@apAWP` zwu#z_;Av05s~t_`DYHhegk-=^B~@~>fy^LSdT!t1ot4tifP_}T7I9hgWPaS!k?c@@fEPi{yAJyDA{$nit7E@ zpiqG=j5|)yk>WD>WpXV;8$)*zF3Kl=SmWWk^|~ZLpr2)F;Bl{DXPo@uA20 zv%QxJ51KLm5m|Hw$@5TdB`Pr>%S^^dsPGHunk(O)?Capbwogo+a>9XJO38N>*kHC$S@IdCmp7GEuu;0vf{*aQCp8Iy3r!PQ8C@vs+7uq-GLoVM`>-(LRlW`^hRbg+40O0ryJw_$CE1jQud{|ah4YBy& z8GCiW>L9%10S!=8%DcyxuFI9KG-D@TqtROSXLg=){kPFenIn0^^vBQEUSlB$^%{0L zFXaOLz8H?Q-Vx|5y9rFOtE*96t~g)4^-(s9X2v5pbPDe%TlEJq4Eunnb|)0cI5}*= zMg3Nl)JKR@1x9SA?OJ70$gPLqlx|AAdBf`|d-dI8cWQglb)N_-$L_L&o4*^zE)TbcGq)Wx)tHc+`4n*&It1ADmlB|61iSDfuh z)l*E)zNX<5^1$U6R9%fVh5xcLki~ordxx{YY~Fhv=Qk8M{TvlPr9Q76F}>^d##?!B zP$zQ4%A635{D1(v8Qi1XFB+uhine`7;jTk0zU&$1PjMAJUfnb=xcQLXa<`g2bfyXG z!)7z1VsSI7RH(e^Cf9#G5EDv@exR`d9*+GCI^@1c>uw}htvw|Kn5ib(%_UKYQS>G! zu|$$_@ca z>Y~qM;gz4oPK$;kd$2)1+lhz8COy*%8dobTB9D2-(>5u^pL)|)#NR?7^T@!6;y+l= z&$fnnnZ2`t*>RjqNl^8IOBvH{*Ee=_)e!w@=(LQLOIXpdv+M# zIpB8T4r*Ijz5Cbs3ccW>dEsK=SuqD;c`*m^uYx(kjPkVE3P((ZYrdYvqgnnmk*%>r zL}KQ}4rwMSnyJOKg^a?}{`BP`K6gl)F;K4=2B$(1o$m)@myrhQXPUuQ z^0^s8u0vkF1qLMEmsdp@>TJ>Mn<+7}dgcjA-VTMYL_Q~xxqL@N9@pIP1Z&Yob)1k? zWSEUgFgs12Qom-UB1yfK$KRN6EFkJLo< zp5~FNr2mdJpryHP9}5P;ecuyBuEs^SMRFCUk4$?Ik39N}A1&E>jXp3?U2{pG?}hXh zegssVX~CzDn=rl1{cgBaN`Wok{D&>0s@Mf=Wjt?UnJmlP!A zU(2j+n-hrs1`$}p9-CB;Bn`{5P-$r z){mtN%mY>C6?rX&*$q@J@y(=DL^1aA5f``;zu0HoZqeWhxa*?s$$RvYUgS=d;^xFb z{NlOrv~TOl7db_eK`d(_+t9z^PK76$FBRXfPoB_DwF0_Dk5MGS6RlJNR0iCpE6@hb za)GAe*G<2nU0zNJ3b7FwoV=Rq`mDLf6Rgh;nQ zg=kqO&>XvlVYxE|>HR|3T$+UB1&D_vv}qUv;i^mpNl zg~V!k?e?9)$QQ@<>cL7AwDamwc0PZ(@UasR5mM?q$W ziz4)8;Lq+(WN@yGqp-uM?sT#C?@qr0SA+Z;A1(^7%y4kPOJA}tCPvbjpdc1G4(%0LbLp;ZFv+9?*C80GGZ)B0V z#sYW;x1B(ArLix6j`&LUa!CyCC04|iFu5kebg5DA zg1%=77>_R$xxw`+%zvjN#I$uh%v5^yr8P1LA%)0Qce1T+>*234J%Bxl^J!!1k#mYQ z9e{uCBXA)5ZQ{SplGZ)77mIT5Us;Pd)W*?X1*RKQWB{CHN$|0=aoEy8w)>TMm#ztW zvY|FjLSOm2nGT*F}n>S^;Ni|#DZMZccxIr;{=IGI|uD$0B-~knZBwr0G zJB%MgzNbEMduQ4QI7W7Z7oO7=czjm{OS7uOR#@dXd$abn=}q$ zyL=ZO{>AYO@r*AEq(T?&W3*(?*Z-fAb!M7kZ8)JXacNFUpwP;z@lIHY;URz59gyJG z?6?elg7li9nxsjIfMGI~T-u)^ z@P!minlA9wdE!qkx-F&+#Hcc#;NVdcUdUV=Adsw1P9VJQ(r}h?vmjGpKg|;4K4_g1 zFwI{el4rJUXC=vmjFPD*$-Qtav$`|=-mRniS1!{^8rh`#j2*w|!GGr+k5QaxS9+xM zoO~SO!=)wr#_m3QS|1;qDDq%ZW^;O$%PdU$+G9U6qEDMp+m_I5EAKX5Cy1>RBD4uX zsVLmKmfFO)R*oU0*{jw@i1Y3>b@)CvqgdfR#P#@Tovig%|F6X?qgAyi!$vnfw;p9E7$A_dhWTN=Qp%tW`%a_| z!3|YLhzq(M&=H%&eHn2%s-Y6}v|jQQ+Opr^7%^nq zVZOry{QXm@{?;Gvy~^z^o^5W`ELmCWDJ4wd1Hd3dSjp4?!shMZwYayoNxro|?w>NCb7|o;cHvyl=Lo+2#s)G}7ev z@n1z>=%AFF0G?v}laYA36M9t_k6aWuiVeV+svEt^_5qM1Vi|hKz3k?~9=Wjw&tBOY zE=FChjh65~eaMbxJsPLar1&>{?kPR0V3)R4#z2T8jZPk5#_MVz`8i8Xci7K*x2|xc ze9hqv&$nIGb^>-kG`;=QJtK?PO18VG=2W8hO~I4}Y%lAF2mwe=nbw$m9L9D_$oHI& z`|P>@76fT-&ccrTeg_=)(4!fW33@=TRG02s{88?42jA%~DS{`ho{_aecDAHhKtDU` z^{dzkA{)q(K#K3@rbVtukYSu)@VoIJHO_Gy_r0r3YlL(L*f}#|7@{5imzWU+9!aQ6 zu<40zu+zyY=8a3%9$~WbE&iy8^kVwzm?^aZ&h*i9v-(|Q>EP*2M79PjOVZi$4po^U ziQ)0#2JJR<`~2YC;}O=WSdFGTs;Q`z0@fxyCKel$*G+&)K1S62(et8CJ76u|V4-~A z{Y!Y9)CX&p2N~hq=Ly|kn;oSVec_$dD|09w^aRP2oPGU#Ri9fWRs$Hsqk$IgaTz0f zsxnOLoBWw*P+npvNRx-p1WIZk!YllwaY58+f2~z^YDa;e05GTj-sbB89+_jqu1Ql? zQSnfd)3j1q<**OZaB-p~W7mBt9oE9MoI5p!*P3z`@;kCt_0^3j&*7S57993@+m*%N zdG2`kc;$VJpVAp{{g}Vy~&m*Gs{e+|&jh!(oT5KWF3cJ0ksDUU{!?WP-L}U!9 z<+2}xmr1dt*X8b)h(waRPERz4^IN+^41Z)>t7=VHOgVJr+b1hg*sQ&;08!lwqUOlC zlR*MZd>5WtZJ?9!ejaO@LX9(gHkr8LDQ%OLzr&y|K4BZxWZ?N*?RWl(-0LA5*&THZvSVfs*RPuE|(hmg88x~f^KYM0Gn$8 ziN%74EZSO#gw?fO(m8t(Q%`D?^>y{_ewm@j0F~mwQ_R#CUxQdYr`fbTd)arTuWF5J z5*NqYS3^YHckU3&Xq8^8itBk8ONRYkAtE%A>1`R&gNg4VzxqY~dp7aPW`})WYt!a% z(&qQHXq*#sjDmkvfAYa5(E-&gp?5KZ-;kjz>3owfGL(0}HoYJkv+|IILaN(P4)6xz zk(dk0w=nC&GN5xn)vM7mif!-=lX#!CZ_0%$#rG5VytXNROeeLNJ+PU{qz*-%0BbIU z31kgG_G0U`-7=@`&q~?e=jGWs)5TLUl#aG7~X;kIObvP)8n9|A!M;c06TEMri8I%Tl1 z!xp^6lg6w%uc}Cn8{wJmK=ho~Xp2EoB7NY+o|KnWVNNf+bC-<8teBH(fnKBa9}P9| zSIRn0Gl6UF`^CdMPFJZmU(RA7Jk~izC7~=j?6K{$xS8_>d-?@04PZe}!N+(gd$*U|%nFcrdeo zIJK`oiPfBjabF@oFHJt;1Dj>pFN6hDaX$Gv81g<|rAetnY;Xy!qpV z@Cv#@^S(69&>&3s4{2|VtBU7!&-7UqI5dmUS3xB=*z{4w&Ba#KNwqWXB|+hW>Cs`2 ztp8SZgXO$QwY6#%i^v*PMMiAuPQ3?QG`OVQ%#h!L;AT%0{~v7XpeRr%L@%e~gyyxc zbK}(r9oQLEBM@opDBPCH-1|IyVkpskHtkL7ktbk~X2NmvzE;h9A{ z86L=M)~zXXFQ+YFk+Ha)sGXWr&1iTP)Njm7_9llPUFbMKh-r!_VnBx@evzB|*KyS4 zgCkmSR_om~FX#|VMZ2jK^U^+_GjZ%yYx7DQz$ z2;T8Sv3{}LlGMFG^pGjWp)826Sc#kfZOP-9+x=H<>UJKS{q6ELNLMYsc2HKC0?}Lq z!7k0-&jQJ|L>Ij}x41M8?@)o#VNW7C+B7h1-TM~UW2sO9FU6U=<(HJ#tM_oD3Vsn= z?Xi%yO?ifTz4(Ioz6A$qIhok!+^CEG+B>&!wfudR9DS)Hx_=_wLkGu?s4h?S!!_)% z%J4PdrG;8=05kia`x%ODH7C*8gcNg*_m`4CARAQnYu_Gy-gpdmj~|4e$Qz@@K7CaW z&(o#1&B&hw@`Y|j`CNK?8-r3yr%E=5&pzYf=U=v1?qoBZSNyae`JfR0Cl%7Jn_uDm z@X{+(-v63#4>~S5(MB8}V;Wi`m9#^>EaE5Rh?+clJ5|Q7kdas7+PoqtGlHFx!#W5) z^#sKby0`dYcRH%!NM3|}y*F^2>#cEb5sGL=82k}(&*fTfW;*~Q4|}y+3t`>nfw=Ef z5|Rsk*Z!ft zR)c)v`xoQRh4AAZ$%;i|X+o(hrD$y2qH+6*fp`#W1|i~1`z3`Xddb>4^mG9{7WU!h zC%4ptUNPU;2PH4ZUUN0J1k$Y}+SdyW(=+u2nBq(R*}FT$a54kpJ0qL=bMMp&)M%I* zJtdejDvO6I&Yi?wPdBO!e15rj2#3|pXkQk|P65IiXGXHwi+;7w@@M_@;Jp9-=~&6| z1{tzkjrwBJ0>*^gkq)Y~sZ)5~nAEaksj6jEbTvpGV0u>giw&T36%|lDitPyf;1}Da zW&ZbU;%#}$+~BTI_0{^KG*8uL*X4Aau}!6iyHAE5m$?HH@W*{362sNUeEw#`7;G z{&OB|3z#Dnxd>N2_&2yxrbyj=3_f&1)M5ubaj_^Of(i z^od&8<1b;hg?wdhGQOX*L;zKANu8w*uEE#!Ayt0ays^r&92@Yx-x|nTtE}p!WbHtz zn{?p$gSOeVm=bKlB@8-SiH+K&tsQ6c+_wrj1Y>rDe{k<9A3Z$Xx$n=rq~Utdq)=Re z)Afa3)}EK$AmK`!pmvY*)h6-@#YgixpLVP?NQ2TkN?p!v1D#(;BLauCkXzPf`y#UU z_29Eb-UX*Bs}+`=ZFa?HqwKsxFv5l+7s{o}=|`Qa43KmdLS?_Rjy0 zHLC;MYFOU0YUndqnV_GgrXsuuQG}*7ohK52s|Ju1>EtG24*)#H39P+qQz55uQkgrKhWsbIn9Y)Y%JeXTuj87sc_Ptc*k3XG)5%_5NMF)pKX|^TF*|9`%{c4IGHV zS(;Q~X(oTpOwg?^lBQ8ljN;alNz-~l+Mpfc)w%a{5ewaO~*Sb;x_ z*Wm|z1iv97@|KK%*jmpHH~F1I_JW5xDusaD4E3!H&|L=}vZveWC*I*A7+@EcK4-mu zUEj2a*@&smP8h4bg6x9M2Nqrb@+gWP4ZP(sYOpsRO_Zll%D(eFiZqXhG=1B&*Rx)D zZYQI#y8n|GV`k=TX%^X6QvFxGRt|Kxzl!OKERcXVANTnEcS?$-icgo?O~2-}4}GLd zp9tB3Qoo>iGkrWJNXSl-AIYA0f{RW*x@ScEQmwS0$%NAsEFd8iUlXtO!^k^tZ+z-W z*eVlR&@xVrR2dnsnWPkD()cfPQShuxdk5D&V#!cNgLqfNet7q0{yV>Kgoq29yA*bk zp=UZ^vo9ERplyF+RJw-Q)LapnsDe8|ti03d%d$vuRe56#pVDvicdIewD`Zx?f;0$2 z0lx9<@!x;NqJs9Bszf{hw0i9XhdMmmRl7REDT@~Eddhdz%cl_FR{Wc-Jk@Jg5%}qA zoz6m!gN@|j*7cqOM1Ia8MDKN=WXZ|HI$sf6g?C=ym>nPY+diN(QE&#|D;QI;HZqlz zA?#&!qe9v3O*h6+YxINDVY{;0s&6E?K*JwH!LOla&wc_jlbTLfCt;mJK>b>YpUS$} zc440T2{lULfnPTD7lxGie!!E_>=XL)53*oq26A*6^}fOywH0Q66}v=LjC7|zf{P6wty-@}7kWzzQt_LQwOPl@VwC%&2YFB;AzaySO;;y;*cU5@}VlkimKH1e6 zlV;ow4Aj)jhsG*5<+wZeBnB1Bncv!43u%tqhz-}{GcRGhxs|3AoKR(XYn1!u=OU*v zBvHYaXSt8z_Kef3T)QdL;0F&S{YUF{0>mg$IsaW^WlBo|f?9<_@r85h(oIDoj+I z(W+0gKp2dPtk~hoMK09?KfVcZ7j$tG4`%TA)MW;FI{H4Swr!PSv_q6-gvqi+bX}&? zSm$T#07d*rhUxAXrAZwMK%|#qH~6LOdFp0*66S19Z{z2@smpAuTSjlNhA^1xkR}Hu zmY2Fi8>URYS$_F?AM7$p6FQb$%s!XrOAjp7t>)fHud1cM(ygfQN9V~D1UzAdPG-!Z76%K35 z^4MrP*85t7|6}b>F(y+^vwp6HMgejAvg>Nqze+>cmInp07d*B`G$h$6j84h-^`$KscrB-vz&cMNNS$_Ea z=$G7BP`wX2w%y zhG$cYjY?J9h`Z>p0O>I>`Jwz=53IkKBAv*b=i?1Xx5BSl?OT&KLy)`T8j*ob= zQ}W-wb{YGsRsH-&Np}3(H|;Brb*i7B_}ezaP0ZY^1rwAOnuf%$3{S7@jb^*c^e;%* zs34y?5(8Bacwyin zeV@*G4)Fpl^F*1%ltlQjL_%+(%-P_(E^YG+n&7FxRsMGG<%?YqUzQL6wV844Fdbj; zX54e-mrhUTy5I%<##XiIDJTInErxRQ|J)|Q{k!7kq67HZV@|^DIo?pKeX$_u)5?!H z?3l&!%MMO(`wQu%`Chx4FxRWail8H25VvV?OttfPLf4ZI{G&Oo)t{x0J#7DK7e>l5 zO_y(BbL^N2LrVI@w(?${4CT;2%ZPVyLKaGf0$-`m5a&WX-*klk9o`Z0Pq#|gD{tcY zon)~q2TrlwUZ&^TK-yqSlUpk$>EQilQEuH%eZG7Tx{2i9hvgxu0cQw?qc=`-!TQTc ztv_7IT-Y6m6Dh+alXoToemohPYTDj=eZQMjUE>?*+C$?oou>gN21n^%upd^3q@PUH zVhMtN{&y>lZ7UuSF8-v0zV70boo58u;RSX>+Md#;4?jd8Cm!igtloF$!bi_X0rT={|^U24MJo&}ai63Pz_P}l1IiOsnT;P-q6mX%A45EvwfJWCoMON+_0`CfvMlUAoZhMrUP8q1WsdIz{oSHPIRK|o&#<#uZ2{7 zvE36??NMp3!8k9#+SI@H<7j8TKk8K_04&3TCxf-lGRVROucYFP2UBxSxFSL|H>GCA zM4e2r=UgYwV6KytmgYLCeYAr;Oyos}y(ncg@_)pVTj?-4PXYNs2Pa{gXP)t#W6o;y z8FwJ>i3nV-9!ZzLbrWmG}8_Xt4=F`M(kwfI}L8y&>ue{b1^Bnme9YH@shx7y}jdFFbNt zUO|s0^qJTFG003Ni}liRvufqMN6%9`9X!tp)d(gVK= zw{Db2=Dee%uv}r=am(h`%8?}Uv)7_9iPp>!3!tWV?GQ-Td`Ftnt^au&#J4^E{@rKT z={ug}YXj~ktregR;EmyjU_+?zZHoCD;2O9DM52)IPiB=b8YScHz(@MBT+137Q~ceB z#Uhnk>uINwR7uB+U*y*4*exRcvB=h>I_uYg8C+>? zX_Y!PNA)9AVt4ZG!yet}H|Z4VXw;g5>UW00TNxd=}rLmLPG|Hud6eaS{0Hi8LJqpg=vo>1-w=NrGXPc^0^GkN8TUeJBmNOu^ z@9Q1rUcE9_nE8^}6c;Yq=X^_lELB}UyJ;-1ZSW>K8MiR6`RN3{LXMAdcWj_gw}1a` zUY=oF>r9v*u~L2?Z$H6Ul);OKD5lqI#;psXOHxSI(}Ol2-C(M{6hs4?H~8VX%BP$K zKWm)q(+sal7|abGpi~t|^Pc9-R_!?lCxmB+XHI-Q6$o{!86xMtHLho;e|I~DLMO?`g~^GQBShZp)9F|0GUqi~Z0 z>4MJa9XJ@58)i8;jMH{R79H4x3V?jGf^r(~!*ndL*Yp#JH17b|?Gs188+b{4OM zMt%H8unsW**N+c(4rBd0_}c!0R9sQH?ocmKx4_(HoU5GOM%Hig<#rS!u3{tSKv$>f z7ATK7oCKu3?ld3V%s1h3^@G2#$BLn=czT=j(sK7+cb)&~)`QPE`Ste^4!4WerH);V z8^>TsXi7+%n1*KrfH=%h?pWmi$a@oiDBt&QSRzGeL$bC=5z<0-B}pnumJ%aNc9Src z!IULiD3Z#)6xqhUjU`zo$-WFT2HCeUmSGrX+~?)<`QG>Q{J!_|7d)?5FPXWn7!UdXJTKA{xO{wGE1A7}Q=^P)@y zpPjb4jvVk>5UrLrtiNRqPh))1)$Muk%fmr;RubElyuIJ5b|yh{>)(fL!dXzUPJdvN zTg9ORK_T27sJ|V*m89@;mfT^LE14T{V~4i&7zIQ1$}ZwgxooGy5-Glmsi;}9-*oWG zfwlL^SZP6v?h)FO66!XPby-x>ewO8Vrt8-7h=i-iaGjfy;%b_5H)~34jBN~TdbDBN z;4^Y1q;5ri5a+1pa?3Biw#am_2>;M87P-8qae81BFEt|OXQjNct^w140sWBVVD5$F zaoVB*_tkE3Uz0N%++#tYzsp;vl+y1Hb1Qu8U5>hN%d&6h_)gu}Y5fK;c<^xtpVJ7N zgWyTaS2DBD6vvMHXyf>j55xXyeJL(HK4sLHvXto%-Sk-Y9DsopO4!~0Eed}EE*xoc zXeMlgZiVW9L`}qqkTJ68Ydv?Ygn80_@rRV2yD}ahEh8JA%2-A%3vZtlw!D!2LNE8R zpo#PiWv4FI7T-~K1;0yy=ywBRNgqto;&~5T3ejCoyOzl;K%LMJPd}G?c(0gbPOJv? zhvgV5Rz7PesN$=_H=T_iR=;annCN*U7Rjs1o{!p_lv`rM*+OIfI(VN*Hj#t?VJMlR zv7nvsF~1iz|7K(C;=Ws2@0DD~l(CWvk6xS_mgrDN_dM_`=Q7TDT5JKI_}b4g-J1Sb zHhaR>BZ zdw+4!;=+oc#m3lUO2qMY<;q(M{lBlCV3Uhli=&^ElX!lM>umjr+j5P69N|6%87h-%p&iD zlCjKjeFZkxQ-1g5@oMH~12E6-iVxCPRT*%f#)jpCiFeq#=G{^Uz6uiWTzc+!b{Ty& zCi2MYH(b+tov)aL&F=L(XQ{6$&GRu-OWm2kx<>9eP4>E!++ z4&wvvpM_7sC!!PYL_Q6dwxoU@m(_4frfl)l z3jczFs9I$4{r8%eEb~71iZ6L!e_8%z9iI`7#a;GubD2CbYqH(G_&k|n-CgxYJkR}Q z(Z)M7bb>yKHG!4%EIyjk^5=R^DRPG61fNp|+wv9I>o)Vd8_bfMrp;gby?t&9FQqg1 z_m0=!I_uCsYG=8Bu_OH@H*G(chl$(mpFa z*rZj<$t0`kcdLaCmsPB|W(2Fv7dC%~855)0$uKxCJfCmIck9B;sm=Rx{*2YXzqt6# zbTAu&{ZHou=Zjirgyaq=@MAn&u3ltpbXC9KJ1<5L=*XLVIqY_JIEC8pu-y{mf{<~@ zyNbPr8@{o{-tuJ7%Clf4Q7mR6_)jz&;?iePUB^Aue`?c`XTOQ==MDZ>Zh3L&8peNG zP^~@JisN*C!n5|vY*t;j9L1B8mHJe-Z*kCkR5U66w8UH!Kcp{i!(_x zjp-jUIOJcSk7j;;(9QR0o{Qr)i-rQMkFPzQonpGavsHxbKsI@94pcKT8`*?GI*4-PR+Hyxki-;vy%^(P$gKY;L9N%Dns*;d(!! z7%^XrQ1W>4${8pL_dl%=XB^uAElqWq$2X35GMk(jU274s64xEZ2yhuGL}$!&9#{xpLHRwtcO1k+HnmtJbXks=0z7Dtd0} zyP^LI^Lge>s|2%)!t;~cV*;T@)Jq=C%p-Pn>MLpT=U&xTz*z^vJ$%OO_NdYV1oL^D zG0Mz=4^;?kQju5qzX!86fg zI+l-VzhtvK%PG;STlq2**zHjfSA{&04bb=dvafvb6bHJ}2vsB7el?ldeWP=u+jPV4 z{R@@xpS+*1fazZHy5y^zZmxmW*kRfimB6|@&WYv$E`qs`yz^Dz{=C9D%|sy$c*46t@2K+ z<9J`YL21huYm&Kq1)D;D(v$KBrA^y~u&uJR35?%oxQ~`RCt-r@7B@a9;kl=BAAdZy zSsYHucX{DwsuIuR0ZRAHl_+ZZwD~c1uDk^gr$9#NWk^ zvibc`RvrmvoKVAMx%ViKNjgc_b|*)BU`J27-WX2Mfp1|Le-*|&zgh>r&$!{*#h$n#>$g#>YfTkAQF$L&_To;?Q$G8xdl3d4di2=%`BsAXW~^2< zZyEY8cX?RaMMw+$S(7+0ciidA)yR!+KG&<_@0lNL({%E_DCeGca!I$P`06mdbZ^~X zeOeUJ@@c=TX%fr0?IPthm#7l{tM7(u#aVt0ha<#G9Z&BDFg|kX4F5`8c9EgF!EfGr zE5C_At=cFjDj9YtwkM1~u0DIx*40+!-K{i(9f@z3?4;$H@u4-cNxFIm;%*~ExDeEr^J za%sD*O)sg@n# zmsjb(xmQuO1+E)^^BY9|Vk6gz2gv!8%6>AKBv?AS$0B*E!s0Q$O@1_L`RY@LFX+E! z+XpOhRP0z`3+KL2joNRs)-}d*o z$Ze%Rrki=Rj;O-|=35Tq#-n8IO&;8t@Z#o9cw|>y7_9P*gF&QCjoz|Yt)SWENE(ds zeqD4V!b@%VO1K2>7vE{_DfG5);ipuF?7pe{3BQ`*@s2flI=O>qjaX6n*UR&!!LF#j zno~&Wj%}R&R$n<$O|hSpo{2~`bB8PI(VK%~ z=LL(MLjw9v+|18bbBn3#B3l;R-s}a03k?6v%oN?<^mm}&Cj@sq2JE3M|4L$^lWY96 zu=QQvAN*zA-fL#pIFm-EwoOeJQ+T`nkCab;=!4HGozH)Gb}CHW zR2mfb{84?-srb|m)x(>&qu{`-=!!#rV+eMxLHnXJ-YRlN6!$IQk5*fZ!j0PTxb9TX zeJ~#G@bu^yJFi0|tC+FN^iH@#NNM2x6Y+bS<0c}WR(V9EI=nZsykt0C!K?Ch$L*?b zz7tLU`_7dAL4FZMZr#dE*JWPegs-b51ibz#=|nqrl`;!_1)I`arw8+Ahc88ysv4>J zP~}~XioTISwOXzDhb-P$E(Vd8!EN8xz;PAZtgW{Ea-=pLPA3jk+SHBEy1@<^@9|$miOnRG|qCOaj?MZt2cyCGRH@OZdUIco+G8 z$MC;ZPraK2Z6%BD)AGnN8+9XZr4paj2+h^jD#xkzP^+F3ZMxTN9&DcewVAJD^BHGH z%jYItnra>v?EP|=u`DDkqmZ|pVzXA-uj$jcetOz+nu}Z&HD=S~vtH??RLPboq3X`P zUGh1Fx~x5$7cHcm-eL7Z>Z1I{>wGy6s}>IcU_RR@PqTUtP ztlg2z3ffU0pa16a&16~abFK=)+Vx#jtuk$q{1q!i?s4hAQ+pukTQZ*=cHi}X3!Mj= z1uX7fdd?sA%L8R1GhVtFN~7NF`&Kvu%gKL$OStKNH}Nu=PCGt~?52m!CAp&&%XhYx zJ{2A>v;10?qL`o64x1hJ)1o7Ly(AMcCn{96qK}H3cgZl-te2vRDlWnLt+QiGwnnLV z`3x@_A=ole-?G1MxY{?_O)A+E|7eoQ!xa4&VHyar!z?&ZBl)XyxDqBb$<-v_Wq z^OR$8CZoy^Zi|MD*Bu_0wUh4j?!dm_;`JS=@*}1%UJjk3GU(HG8g(-6$yNQzpWG6w z`m0IT>GKIb1eEX4;k|};)=eM^68BXtqyXz*O4qz_u-&ic=KOTwwBs;4wL=Z{$!rFz{k*>$! z^?KE~BJ6aCIqkDBn_<6$gduobU0Z;?k!em=zCtJsn`+;B$2V*1AlhI$-;Hshca!c% zA@^izlceX8jp`zrmKb!0dujF!OTzT|gHZy6B*ijRUfMIIusIK`u08Goh1>^57x%i# zu&##g&{kzeABJOgQnsJL$k_+<#SMGvlLu6C`Lphta6=>tdnX0&HX6Z^RO=hz z@HE|Y;uPQPu=fwGzvv3=rIcpt0XQl-b3~)p{Q)Z17uM=NeSPhj=Z>F=T$@+6pSgp^ECIUs*WoshEYj!2e%&LR?EFE&MIc%ukh06 zdrPxbV(^ceF3R~zUYX&06?S#-9sG0!=jhAmKHg+Hg166i-fy*}CTfmtj%s~klc*50 zXoQ=CW!CB{*{JAIv&#-{6+FqVealZ~(8JG~7V9?5qurvsWOd{F)1};na0}&@-Sn;} z_>|i>pG8>k!^>B0Nfu4jA6nUFPi^#@JVUg+d{Hn;*0MWOk#`L(+i{Ik*0E<`okH-> z7AnR+tive);}W>B_wCW-RkO_ezB;p=FELpt!R%F|Di2}~DvwbqnW)C$Uh80hp;2dh zG7x-g9XTV-77O(7Y)%adx<@S^e{G+;kE5`0!b&`mi+YF@3cBoAHOf)N;)qYx7lf2bnoqvEHfyU7#%0Z)86Z<~cp)sBC{u z5!+wJvD=F#n;PBs?>`8smf9WejPjygn%^jWYSZs7 z{w>=w~(641W8!H~V0yc+x=I&M=Zp%=c<@K){KE&||LR%6Zd0{)U(N;;;I(UV-~w z$TnS#B;}495zZ>wL*Hx>^Fe6q%5Uo*_E<};`U_?UFthvvy;-Z z%gwj^!%%bDnW)V;)Zn5!8d*ATO7_ccBC2M4DO2-Rr9SxP9FW)KfTGI1^KRni; zGVx9Wf6w`43}RLXRz<3s&nLC$`n{y;O|KQO`Va07OL1i4wBkkRR_w6@Wq*(hk^WvZ z(}4wsOv48H`4D?+C!-Vy-cD1jy9(;w(7%ta-Z83rNc};;3{6UtLUnyCsJvRLE6<}I>dbi!%}Uim_pO>ohr?H$CM8zUao z<3c2DUGImO4&TKdXZIYFQWfe@F>x*5!%0iX{n6GhE!A$P-)1s@l=wcEPuAyF8k3a4 z=6`D$wgNhSO93JYD8qt2)V2nRZ>k9+jCInKe4Q7jL1?ja zGqXQ?>AUk-4yf885LS$!XvhL#n|TJh2IEeqrxaX}E?F!3aFFfera4R=Q>s18hW`yx!7d2hQ4`{+v_#~YRCF?Jdx}(z5bK0wjj}^nSWY@ z-|@;+>}So{aqH;5nTXhDZ!g`iw?8!e`QR4OjFQIZ4yTuNkg|t50~ZB|PYKu%;(*v3C(UvQ-wqrI>|u{iUTw>ss$gW>B`%1O90l0DiVLgM~x% z7^#tDqGM6p*hLS87ISQ{Puo0fhqj)jrIH;ki)`hr{lUS$RJ#(3PC!{5%2jLTedV`a zoa|(i?7O~c!+O2ogwJLx%oz=QOO<@Q%FK1{IZB<1`0zgZH~E_Lo7><-<|fx)PcLId zMpTZssFp+DP8zU`a!TH46jv0%6Q=dg@PmP=-mM-2gX;u8bBUGrqqmc{?;A0BL$O!L zbM!T-6z%IY?Rn=di;}AHAjOxAgi)J?G*hCGL*sbp-Voi|;-&ic6~tK8>)-fC9-*vQ zy$G`7Mh-MoWn2&{U2Rt?$0|?B63_bg+*gv)oV#9d%V&!);tUxIBfcb2rLa)YP-W4{ zS3Sx~ta?|z0L?zoljA-&_1bddQ6(5y>0EZuVxgkoJ0;qbX|@hjCSp_^?z_E$-t6l)qH4*Ee^9Yr6tTi0r9_oYPOnPo79#3KTD~0V{^Y zgZ9*N>W!e0ls)lN#m zXTwY*uZ@M=uT9#X5chzqZ7l_>4f(CaBtwP**R!xuAdagw;nrL-bmX?6c4okR=S^DN zp{Jnt>^6=DrunMDW8{_g^^}Aztfo;+x=Tzs-?K>)0jEdr-yFcIezY2rdwpgASG!)i z{+in-g`>TWccW1>NE$u4yu)%9ZU})VH=OFimoH#8q=yYxq zEX<@+Yof-dXFPPLVqf`EF(X8$PA?p0xKDNEeN+ipf0yAV9N-Z_ITm(xl@CASRe5~U zsI}CZ#2OFUY^Dd?;#bd$|2=I#vKc%Ti=zBCsx6`~i|n{ymV#u4nwC*JRMd_?n*vP* z&cF*VofRm2&iygg0W$Eg>P9^`g4J_mqgfswh1wopjXLPR7CiK(T*m9uLW_9v(4tod zvW&xY=0;*<)znq=AeRcIbN!8cb?SHrShn@}(Pu@l?J+)##m?`mw33k!hHjw_6p0dl zke5Zzlzn3(dS8s@6ZKTkg5KT!KNHz|@44ydn932qtVJAVrCmR_x+(rP3FB6rNm-n=_1bHDC|8K0 z^f{e8>q`@f1=ny7I@^PS!@p>jLK4Z1J5CajYDacsBy`~E@!CCrH{`Aq|QAnJzYeCmc-5!bo+S>p__9YXf5ryHvg5Efc8TAcbzHYM( zI`ai4i*l=c3yfwz*gp~y&6geBQ1KDvwp5!=aIMna(ai@^dUFR+R%ov*;IV}qbJvd5 zqW#u#h$aS+3R9mDnM%a(q}r`T5=c0Vkp0C;eJZhJ4%o&G>bF>PY*0#r@&Vi#n}7%= zA+i1Iv1p&KNW~e*o2>)nf@lyJEt zn6-1ea(?KwLQ0AT*D|F?mpn|_$PicgPFyc5Cyi}D%Snl`F-|}ZuO|KD@HBn4%=xct zonOcZ7^d}?mo;#!RTHP=%I)N=C%&3G~L-sZO`7!e4(?cw)mS(=fbP+JDxqM?$ z|FQ2ON0pHA){~5_x*cSkz7K&g+;2wfjza_`L!(Y$Q`@LtJQ?MuD~Q7GgQ?W|7C6q# zpX2^O$D!yr#8{}fSxWkS5Hjv-wP<>u*55q~QDpZl&>8BBPXEW0Vk|~A*19(u^rgh) zkLjOhr*}p9_0owkvPT0s{mn05?0s;gr0cmt(I9AzPW&1-WgY8q=%1h zskne>Ah$P6eM>RBPUMuL#DB~MEOzqW5&WOu1I?!Y`d47}pC$HxIrv{6ua7?Y@4fuj z7yZ{~!T0IB`8QPm-wyuQ`7ZGP|LDRUMWN}2NeA}&AOEbiCa*>l0H(NZb@9Irn!5~S zSH}H+jcPs9`Pzg3^ZUR&5r7)LalUF?>Hv6SJ$Yv{S%|(pt){jU_dm`JUQPxKHS3~i zJ<{l9*v=a4yg$cB-uagJ{F=wr(NBCYWlXN_e1T!F_Xl8LP=;t1j`ugfqqe^ECgQbhe~#H5nQk_cu3JAKN7M4Q~xo%lN<@lCshx z?ZNU!5hGP;Gl)O3SVyGd`hX=t9{}NXN~T&(dZr4=j<`ej?Oq07{^$`cU^s-aKj_A4 zryeS0CQ9$zl{Yg7dT}DPTByJqsj`pce(9lZ27_O{vfQ)>Ppgi11onqRpkw_*rt()6 zvR8-04n=pT_r4mPvOX@dv$4IPb?5@$ndu$!4!uq&*$-d2Win7@ec+*h)^T=`&Te6~vn9 zV)`Cf-sATHh?R7tnOZ%qLI5z5gy_pLD>bFh8NqQC%~z#2hVtFo9L$PIMXl1riWCRa z`6o`(i5^Lwj$p_+Lu*sy)6~GZtHH>GsQi@v>;}ERW;fGt6B?$%E9dutek1Hbh8m&4 zf&DQw1&+#t$>mjjdH9$lN(SQh`Aj!fM9Wpy){tcSf(=O$ws{A+>#sL{@|9_DDP$1o ziym;)5*w-$FJ~+e^;+&SA1`VNM8hFF@ z66xF~KsV0%=J$1f(lY2xsnB?sVlpcNR8dfJwu{`=+xVoth=IKby z*;4Bh=SyzlzenU3XO-pcbBF7)F=n*X@JRs6y8RwA@|!f0PJz+;U`}=G4t4#$&Ng#V z+7UWnxFS+h86jK;z+BU#Xq`LuL`oAHyS|6JFIYI;wJF-R?;k0ItD;O7EchG%ZrNLv zIVurC_%oz)=x)H!sEz9C=iM-hRata#BG*uzjVgZf_=Uy=Zx8R}?XMeI`B=UXcDqAy zK6e#eyL=6-F#3{cnL_IL5p<}njZDa5Co)1eP}=TxZ^5d(-S;|@79ar zYI5ns5xOa|Nz$y#49sK1ANnx0wj7y0Szbpct*497vn2bUvOLAEJ*9%A#SM2>7uWYD zu9osuDA98)^yn;bJuXUr1CLf&<+={r_K2v`lg&Q6`2Yj)5CQseMlKX;5uD12iu8J}N^s9Z&Mx65ca>GaXoby0 zL6iaV^j#GxGC;@AsPc996vd$<11B6Kz4!KUI=={LKO4I1QQlQxGdypPeNWYVpAgg` zK%BYdl$nUA63ui030pcH@(&pC(S7xoeg;^pZMNtlyqfAZ!s})zV*myXMxtbV{&INe zx=N3lWYo@f4qSQSCC@96ba6ZKRdohQ&jfpZ zRQ-?(9;Yikn)sqPo|xOJUyRQ8sF^Q~ADTGZA`hI!*Rxd)pXQ6GXDgw#@uxBFuSaM^ zYhh??xY|<3Ss@YNNXt%TSzhhV{%x0S|1PD`Jg$g`wPgMlIG`1-z@=^T$zt2K$6 zi2|E+*V$u*Jcd}grDjA%>h1&I>(`58Tj1bU@#+dU>y1=i`PF_4Id(L8V6aix{~@+_ zx$9(V=lZu)h9_{TJt_$^P_7^4yI_ea|E)~2)18+)t|YB`7fi&t`Bz0!%2uS$9X`+b zj#>l=y7xXHiOG0r+r;lWR=Zvt=j|blZ4JSj$~T|h^tqXk5jmU82VBXRP{vH#baB#J zuC!J<=miA=h&>>FOn9S@viq;Sl7ICZ8%kd4n^5NQWk57S+-k;UmFQn4}?c0r)X_8cJ<_{-Sp z4-3C^kORBU@xIaaB#dE=1krkAvT$p~AQ{Bd68>JCrgg{N-|lq!$PS$q8VeZs(_-5! z%*0^zLc{QVFS)`M8|88SMD$cew<+CK0~|hW8(lj`=J4De7a2)nP%>>`>cBrroS2gy z88o2q)M%nY#d~ZhPuz@bF^5%U@DEl%_$R(u`qtK?t5!pAt=ratvKgE(eMYOihB}P# zIx$3MERxG0r$-v&tMiPzTm4H@y4&E|76D{dlldDDPiAEV-wZj`4Uu0uH}YA-&Y+;6 z0uD-&0QqHu{H>qVtx{Soku#kt2{IC=9Xb`hGrhB&oZo3cI9B6)w%X31Xp`Nj;s(`i z7&E+zBG+M96!-=P`Tudy9Jb4xfV+8U<58qGU_Crw2Cwk= zvor+$xaK=0SiT?u&~zk-5#l?(b}^aTXLK(K&`jP`6DYcTx%pL~9Ylro_fb9>92Yp` z>Hy8WXz|SPD7G;e1f=3D@Cc0Xn8=vu*vYZcvD0H`-2Y^(YNS4XR2?w!E>}mGc}^-M z4p6aGPrF2RmPI_4k=(?C{?>tDzo-XY0l|@X@U0Hs=jH>1DJkv2mQgJNzqS3Ql}0|_ z9s$U#N-%ba_*~W8knyf=bCgZ3VmG|SRWyp>8-&*jcF_SNbENgn+ePjmLoKUdL9Z%| zPwg0dy-#gtRm}r_>>KyoC++EA5U8H(&3^suUNbI4t`Nno6-N2y7TfGbu%ZXEVzmQC zb+o?4XYz8ey1$%oTM=4kaFt3@WH<Un54Lq-@=}$K)Z9Uc${}^`t z5fEq)x*mA1=|q`xbJY;Lg&?})78$oq7^B>bl+zzJcZtA=*;|!Wn$KHTbwDQ z=j#DIWW9l+qj&liU6Z%m#(7Jeommi$-X(S|w{EZUvRuEoZ&=Xj=v%Am8wc9~LsNfz zKrnBn=eZqX5W?{HP`0-Zv6$>-zBw#msV}-?P#?tf0DS6>-UrdMHkQHy69B?`8iADi z`bC*WH7NReEFW??96#Z2-t`W>960maVF;LXvH#-y<3krt&vB-(t8=SuFXb~mV!WUd zJ>XH^z3EjE(k2I9X1+`WSDQ#EBLd-bdy^#y?nq# z_~o~YSN8j_7VKsN#5Z7bpc(8rI-!nESYNPF!wC6Ox=10XBW<;Wy+Fa>a`Ir(&h~Wq z(fij@>1`w1_aGJogHw~-@cFSm{ys{FOYsl2A^vdMuH)mied?D_Vr zSPh#Z1}FW;Isn%yOq|csRbFmfyxJ?{-4%`x2h>=k53U`8_BErdGPdH$J}a!+{P8c0 z2;Vf*hM5!}9g8RCTQgZ}zxUpYQ=|8&xrbgoPzKVrSoL6U!pEPw+*g+Z)pdvQ3u%DN zDce^awA~=WcwvLOec^nw@w^EsKy*NOY3Wp`U6YCb*J#xPANK)ENB@j$C`(@X_SLF+-dB9P%rt@EmU41UN~ zzZ0;XS(TsnW#{gm8M(llL7b=9pAS>M$-ARH*1y>7xvm>ny!q$(m8MT-n{Qjhl*~4N z87;~_T@>J6mA+AV5(R5FiJhBSSdVA@J_KymY6(O%Vg@?+vsZZX>qj+hoDSWj{L6}S~6XTBg;}~b+sZvm8qDhh7BE1@XJT$HtAVT+p}Bv|*ee83m8(NJ}_FXS9 z?i5)Arioo!gaX3w!V#AGhv{Ieu%L-5f6)Pn(P_ZukJyQ9{?e*aj!$Ee5q@9=>V^e( z-)-#xAdahXs-eUNzXZMyT1|Qy8n7-C3ZKfYWI%BpN(jzN+BFUfYktU)RlMy~M0j*i zblPyE?f7R-yCWx#KYpRt+4;@z0C&^pBj45#?I4V0*3228=i1BFbDyWT6fixqSbu`6 zGW3XoN|Hpv?eZ0Y!)HO^%HKflP6BnEL$mn^*}pq1f@ftaG#gNQEQ-AW?8>2^83le; z4VGYsv>(E%^SQ;~ew+9fF0FqNHwSXJ+(3YIw}>&JDmT9$QSo|W20l0HRG(BfORA5S z8tybN)?xn@Ao__7iev0*O&W8Y2BBBk!r!!w2Mc@Kva1J3?X3p82I+eKJc@_vM~f$m zjlgvigce@}LqvgF(BZH%$Gra9B(G$=OnI5{@_j4i)x-5MknD7Fu&Yx?P&*Jb-QI=; zh#DW8_}Zbo`e(6iZXpMvONe{rqv2qJd_I|U<&V49hWBt9A6O#kFuloVq1)FASHV)Z zZg>GxXYU6qnO!eR16Ei(BXjiz3Y?_c?th43DJ~SA~sdSY2Rn`AI7+3i|W4Y zY4*h4@ie#9#88%7xT0{9>BawL}g zG&G4Jpbnl+!{3HOvH-cy$(YCwO0<=|nEuMhl?C3u0f%=P*6GzZmIJZHf79 zkl*dMDvv5|?I40&01olDyNSE-#t$|`@^IGd0LZOpcN0dVrUoq?NcjpEz|DK>J`K9OPI$EoZ8M1O(1R1g;(Lf)&C!g%GkoJz|wseKJ}m*EE!GraV<;AK072tA8^*B|;dqFJ zz~N)Wn!=pXz}%Ti76eBF2jbc;$d!hqgW9CX9ca&TR}HYzEsdGJfZ~EJM7`VtOZ@9A zc@@WTsM58YEG&WoLm42==7e?_&G7A8RC5A^Gfn-DdR?9YMd_Nd=_DkAyLPR=6SWbH zn(<7I(n3rB>~M`>G$2$$a2mg8XN(LdJl0b=JHtAUlC78mFzyJ(ia~Cyms_wc6A7( zd4OLF*aTmw^A#wA!Y?L*28uUG3}XL2&!1tOTVeZ51D2!+%_gjoyA`i}od44LpWkQ#h2ochhj@DlQuhH!UN;Y8QQw=oka zwN_dw2h^lU>^6k+iSdVr8SCX9>pTj@Y_B7D_&Gp!e(P)8F;v*)LX(NAV-E%gT4A~1 z=}O3s&krXyqW%iBv=X+?-;%~P>lRIyL<%Gc08A{P?dvPn?gr?&rzvQNK5*mac$x68 z{hvRa{R-9O5+NhXc)wLm$4Mk9E6X3lKR8gw=M}P-|D6f7pba8nNNIdEwvenMhPl%m z8`x$WEs~TlpO+jR0g?81gV< zLYI-D0!6+fWk(WN$SDC__PXBPG57=G37ujV$BuZP>Mc58&aR#b7FKpa+)uEkKmgvY zY~=Fp8n1NM!Va(7c6MLpK}LKqDxS%7W#G;`qlYEmf2{11ODn%l6YAMSh8Wu&JJra} zTzMbH8f?cM;sL6L#w^1N#*qt%#0TL%bttl3)PE$`!nRcaDVP~8#C@);`8{$y_LO5&ik18d;4eQ$(5k{=SxYgCM;waC--NS7h|s&C zG`U#gkH;&ORfu9n|9OjcCn2;pyG9dG(MZ49Pk`Tg!Yfg8Q@6`#;X+k7Q8T$u7UbZh z8%<=*;W??yG~PuhF~LB!?tlC>#`E@A*9q^0G=tDgtD*QhP zYED_ne82@VpV=ev{d{UDR3R;eYzl`GuHB4!9aFc3*_AL+d(94XvjG_diNC}17T>`3 z9~;#kF{`-muP(Bt^t_jc{Q8sK>U-ZQ$lw2KJE>n#%rRyGuE6ow%DztXoa@!t_<}R* zvsj4CG41*qJm6h?wx)%#^85n!*Lm+Bxy)TAAdw=P+>r68Y;{*gAEFF)_#voH4;6DIhe$_9eo!@xHlWe@7VKVg46CK9Zq zRO|E^G;oc5=ez;6?!*&T3s#CrY+Buo)E(_ueTBt}aXh3{DNRJ+zo&1F>@dJ&E8{&Q z%|jSmT3joWOB+0hK7>|vvfoWb5WNqy+*y;uq?BB~u}DgmE7Z=S%6jNsxoJmogJg;kqqI#fk z26lwrx(k|t(U_zQK0%UC!AjT*LMQ)m1E#7kH^x97!8g+hK*8YBaggDCGGv;2b{1gr z;@z0q&s-?OEv*ABA&1u$!EEQbIMk0qIYafHD+BiC`d;d}W0U&2Dy6OR=P6dMzCf@s z=QaryTLxh(dY(_6=QhTp;1CAK$UFZY_hQOt>sFnTjhb~^fB?~AYCulmV8VFqf?81g z78%fheRIGy)ts-5w`CHp2N(0MDpya~!CXoBsjXH_5D>dB%~P;C$=9{mu(rlE1k?BvSx4uA_=xfLl6pb{hlwgo634CDnyG)ES}04RZG zZWWt8DCYhHi%Gy`f&S=u%$IU@|Nc!yTpt?Bqx&jNpxz8CW z@fZ~s@t#SAChoyTr1Fr?;Teb}m!6){Z*Lh<{$;qJW%k?UWys5P;U&;?`rTm7IzGn~ z2teRQ)nh!E?U`1y^`iFY`WLhJyP4S@6?s@V3k}#h9#>l?d2Q_nQ5+E3M3d`LfE$h6 z&Qk^3^bF*yY>~=gRP~|V;t0g|@4~~Hwhul}I3{q)Ry>f&zeL^f+pr63Y6=}RV$W87 zfe$D?Z3!U7U=}4h*vtpWZEDQX5yqu#=AKKMLh>LSu?NY8-|<+Em>6i}o0#SCUx~f1 zL@MFf4RKCd5}yw^afOzDVw1UbB$!WL!q*!9YJ?{H8FG{RB#2G+Y|`gNcMeY4;hzPQwV}bqK5zcs5_IDjV8t_gEa}wLj{gIVoZ8&h>2V>_^Q583>8H zH-`nS_3tHb=jo0bx11CZt8RO=C(HjyJpIgPj!0KJ=)Pg)|HXsdFt#S8WK(7J&t)0U zfDr^gRMujsBc9Po;SaGD~MPZCgd5zkh8@6D?CQXXy8 zW%w`Uc$9riI5XMLn~&`~v)=N1?ZPRB`;FAcfv_<4l@n|tJ})ralQJWdA&|#s9kr?D z-(p9n`Ej8;R@YGGnJxEJ7oKrD)KQUjIG$IFfYmj9{mmy`Fq>^Kf8S!>Xm3D(^0vm^ zJAZ4(^e2=a7R>2K{t0NEK{O@prbzep*R7e<_3;FHzssJtQzF7m)fv3(K~w3`A}gB! z1T6crId-y*HLdI2Yz82y2!N!0?|O>7mOtpE)E? zvM=G!j1JLAa1=&K8mhfI@y3oA(SFxHmlfpZ$oAc{zW>*}Lc1*8bxv^?U|;Dqtqqq# z&YT1+wm}|u4KI-g?;O|>E|K|j=Nc$-5Wozol={4z{spsS-cZtvW|x7?gE07Ggu(aW zK{=pB`g2I7uLR3lCBYfven2nibF@g9)BayiuBU)lPIhm(rz`T#yzpdu=8lfP#39XE zoPZIexmlk^F{Vv1$G&@CLYIG#;4*lW<;$B_dgFc0y_zEhNw+3B(|0j*gxs%N0u$d4 zternFzX}oORW4V*9czNpL-$8Ge z9O*iG+h^#TnaiQ&L)<#YxRm+M*z(ozikBlom!Ow9;=5$BBBB9yCbH>f#6l}ZdyBNEmJ zZITht0}-!p9(eCfXt94lG8ZL$AZxpa$@3ubw_Cf=cN|CPZL-YF!?)%Ps&Q5QrBxXV zNyx=PvFph|6X4Do#G7CG^9>uCjDuNHfbOx3gdx}ND%GeIQ%kG6G|DSB+B#5(l_3Y(mCKN8n>Ghz%)TxF%O$aIAH?IUC%TX+T+Hq=`iJhiV z5O8!_JKb8Jlavb;Zt3-~<${w8j)y*f;s5;AF$v<2e!Z;8mMIFGNg%gI`9Fe$iO_M2 z;j!=A{K*V5IVO@jsQI0H*6q6y+;r}pC2rHCh5)I_s}t(V2Z2kkk7S4M>}Gg*Kowp# zpN}as8D9BF-0K3Vrx7lvxdn%8-)TER4|})+xv%lS^ys}ufJ5c(hFEOFfoi~lRBI<_ z|9P?}OT}Q9_T0MGbZTOTM185rPkwlAzw(C&tIS`hTJae9w4P%5xRhe*?1g{`)*Ib}mR_OkxfUTdDT#d0qmAUDB*B%9~n6fEZ}gv0Z_@(LwLV z!&+|fI%iZ(ZAv);5!a0TgP6S1p1IQmJw&WgsF@ zIm;)HZPakj%xU4}5a;n{hgiacN}V?L>2YT>pl1{qyNi_#`L%Yl4bJEmP_JnkgOuW% zS^!&J5Lws~1PW3h1+h{BqNR4VQ~Q~hndX%NyJ&YqK%*J+OVyK+!pDC;AuVS?V@1?k z@lO&0OX>LR)&{`~_}u(S&;%zfvszu_E}>Q%!RLDmt?2;@PGP7`b_0>JBt4IhARRIh zp1h*Bos^aFsfT$93M@JZQ zye|k7`519_&9d7CIPNQFXlWF-FvzgBAEj>UeyI6NE`5e4uK^s#-j-I&Q2$p&bmf%LQd$nLr&V?~NUx>li>KT96Cz z0C)EdX8ja`udb^H10=_m=ol#X#=hDY?7IcrWjR##m1J7`<}RzxnqqcqLLPgq%+|98 z*bTpbZa%f!bo(Z4&Iyh*nHDd?%v^@=lOh^SbD{azo%ZqUgxM4X&}6u+PD`Dz5C=fz-!a+U2-jQ^Vh=9z`y4^0v|u6SNdB)SsN`)_a1?($dwD%{BLoKI zWzxS$gZdPxQoPEuh2^e;s>rvx&zM34$=K7~!bg`wV6woqP!#P=li%hr{t$2e*L8AX8s1-|lGRi-5p79s`%md-X?3 zhQHi-Fa(L=;6CF3SbgpM=%3BL?x(qR{3X|=eIJs_6Q5)eja~<63Jx-ryv=a(R}8!8 z=uHX5eynT*{!<|&DMe;is`qZ@bvJ9NSKnFH$h7jS1@W~2Z13u?b;1Z2+ngv#@(V^d3l+J&2kN|!Se8Ao+{H~dMyPh{b(0NzYBzainb>oNm z>p=!7q7RyI-~VG-f#fxFJw(1wE2LdQybphxK?E9`!G{Mr&5_SQm(vw*s60r>$1LLg z$W%Xct1MLHvW4_y7{N2~PNz?5<)n<)bNel^f-U?2k0@%a44@le{ToY|JKH>MQ2;*~ zFS$bR)g5%GV!O8c2bxB&wT&9RH6G7lmf`EX8APu6@F?1-1NF$Aubc5sw z2uQ=wIU?P{3^mkmKX}f0&*%M}?|IMp$5~6)lHqywzV~%saqk?$4kr3Tk0G0OJ#G;m zj^1QYaP*|NXCVkPeZ+B4J!0Tq0kyJcvMKG8xePmgn_pEvrx4o#k9==Kq57APIU}&e(s7Q(4y;*16IhuwX-jKS@ciek=)T>`2oZ@ha;R65^CD-qBRsWiy0pbo;FjUMGJC36q_| zLaD|9_XDwzw*o}c%zEOu^fr>e+m{psX_>nTjbC5GZUM8F&SI}H;lYO8{*`vyahIdM zAc=C$le#AA!oHWlr&$T8iu@#x?e-+pVhzJPAiXrU`Y`?3i{zmE`Tp69zfZ48To-(N z=qdi{>5QLPL@eUTby*AhANwI;!ws@8ULM(=d2Y+^KwB@f*2>UvIJ)nyMnSE_`k^LK zi{LNOxAw)KXexNlK)cPAJHA`C%Az25Gy(Pl!U-s|b;rQS_593Hb^$~d&w7(X_?_GR zHChTafOXomfy!R3knL^dDPXObfB^2Xim%zd=Xf7jO8iUC^?_s403c>}z3lhH!M9H? zpBILdMj>x?H$mJ3gQ7K>eNDz1n~eR>hQ+y4mv>7m0l&aS(a-F_STF6>ck{%s$Ojb9 ziOA857#w%s(8detY#$LL43$R<1$q&`pm>q!!|gW7ldS_9s5NjHRamohoj%C{i97%L zV<;hV>%6kkI06bUkx13+bZd|TvSz_&j!H7y5T^s7BbzUL9{W%1%v|SpPq7!xdJ)tz zF880>UVLmhx>B8O&4pmq)@!aBUP#UI!2%XJMa8G7zFGdoe>P?PF#LY+LvozJ5Y zAL~ITX)R7a?N$wlwvL~fii{Oh@R|1E&r^lBl4C1ibZY7?C<5eE(1 zI!#gc_ur7Ogql8I^YJ6&L@B$}OQS=*x&C|lpC>%_rvhKJTSx5-AM#J>H&&nbz$d3k*Ld&9+R*%YJHiBhU*Qo`BAYvih*Ly>}*C%6_7zaZK9 z#JV20+z>}`6XMbErI%rLI2FslAa8W%GVieT?VHN2;`nn~0SzY8w5Be-q3s~Ioc^!y*Z14CD~E= zKAXHDNYmwawtvoK3mdurc{9Kp;Zn$0w)4zmq=Dv8YyXDvr8meI>AQ{of-&F2x_rcv z;qnXZ1~%?P$A7PFpU>KemAgwNxt(zis_f-s{BwFv;p3cq7k0zP1rR0gXu>JfzzH^Q z)O?#TI=_5N`L~)}Ia|m1i*L&Fc&T=T(u8{xR6mHUd~pgAolFA`RUxahG%I8)-GxF! z6W`3j*%g8>3i|4h1_^PhC`QyEW-CY!R28P|M+>nRJZJY4L7Z4$v@ROFS0^a^Xa$*d zCT`gXQmulUW<6#V$8y}Xe@KlT44UIonMg3Ir8I9cNN)($nQxtM=rQu??IMvUIY!eNd<-i0>XL@rCV{+ucWF3Oj)g38!_^(}7HOX5hDj z3(Ox=ZAk6eMS0-6nOW^WpD{g9;^h?oZ)+OYEw*2;5o|OaRSPK_)Ko z(}Uj4>5ZIg51z-Kdk2mmzp2-P^zO}z(nMDWHvoNGG37K-pg%*Rz2xHAE4~N()wZ%U zc7YvAFE5Y2g^FLOPX*VRZY}WVWuEs`C6S^H=xEFz($*hz^mV<~YGfEz-HY1imt|XlfHtJIbxL3Cli!CFPJLgE&mXCtQ*jc6x#oRCmQXSX zmbvA=w-*z320>Lz#OWadb$0YZF6WKu6IT#{avI4sx^cbi(lFs=h6$Sw@UyJoPL7&m z2#k3{&PbTAa7F^ZGMJ9op@Q_1(+7mnf@OBnFqCAdfTGW<(^%K&yl0u5%9?)~QJ-@O z%V+Ohapp>j+qsWh>2vQH7W=*mx59JZI(jW@B}+Fv0D{P7+N0qEE;D@e7N z@F8Lv4HxnN%45SiWMDYUJri|7!YbltT9t!|9wCp*?sQeJN7?+9+}9mgwarkT3VTZQpA4z~vj+Jp91(??ZYCWNga!hnmY zE9X2Kc$-WiU@}7O;C2}9t3*8zB|h`h=n>XD$x*9qiS7_Ih?cRJ>p@T&b*1BYKPTEoC>aqFv4S~H7~BVz-%##mwdRRV#aF?btBCVxCB zH|D`9H%v)YxrpdZnDH%L8WxMO4B z!megw$fMV;hum^R$?K9s=dAGP`8O*$*_Dvhex2v!7f+4s5@bYtiO&80rQ3XmMl~fO z(Ki4}7u8ffg%VO55t%?3(b%JTWH~o0x$}j$>p45ScpHFay)O$ zOhdhRCP%1&zGj@Sjd1|7PCB>N#|M7Jh+ej?ds zOR2}f?q2X^%2-_z!=^i=AV8@6GOKXF8f)b|#Kw^dV$RAd-_LAiPMlB*DjQ+;j-#<^ zYm{2Uz<5}X#d;!7xznzBPdYQaqT*D<-SM4gOS+`+>f|cCq2ly#*}iDcuHg80XTfos zknZ7f^+-A2^Mo@2`p!9H=Cd;b{834N`xLa{5@qgXiy(})S_ugEiah;wt20;8Sqz;U zcp{urPP~RdfXe;nIy7$KO#kbQ1Z78ulw^JtriN(a;irwa- z#KS7PBzJ`U;&(q8zW|y1MhO}MGLkFbudne`QalxFI-x0!}?D@ikD}p1!K9E55!nS zBC1b8pkr^N24b`yj(_<**h>43o*=-Q8dG81Pmo$6Me4b9Q|`r)$EK){9`1q!bl&C@ zVjhD12#h;${Tb;ig7RfaHs@c2!Ghf*>xFXJ{+t%s5G;89)3Qf$-`E=EVQrnAGB~~% zX19(?cHCHeU66FJVDEK^tX4(@vn?KD4h!IWc#8(;`9*`xu|=f4?%}Txy~FWU-NWgi zUe5bdS$6nmu9FZ5T!c1hsd*DlP;48MRPI|sUfYSs53df*bIjkLXP{Q^;OuY)j-eAv z_rY|gp?TSPr7+2p{j*R#dUM~y8t#j^@l9SC02mvxKdVC)`gKNwe=cU=I8cL2#uE2_ z_Y|F?U8`ez#ZT)zdT0$s$AwONT`3Npk$Y~h5BIn^TN}EyyB;L=if>MC^4PAw7pmAj zR!fZCB&H!bc=6^NQMh5@G3PF=dq26(#Z&#juiu>>uJ>=yK6bs-uQe8X6~A#eK)}D@ z_Ehw*9iu#43T@l)uR-v75-Gq!VYt1@hDFlBGS<7mh;O$O)%U$P*~UFGVKT$LW4%Xo zb5fjm@3wZe;@;c@bOfwJrq2oBQ#f<;P(OtjJX=Wm7sW1tRj86MWRtaNr={UvTqi!Ob&}^T2c$7>=5xz$mZGjw(_e#jto5FxG4R8F{Rk>87+Q{Q` zeG-zuLaKaDTpD#o73!o?-8c8W0)-Q}U0etmV#HZXUd%c`kDm_j1ac%^B|JUYEP$`B z7r?hU3hFm;3+iWg3+mTt3hGzGbPvDJ6eR5wqLbOhDc<@t_46c+juSBrj!)RZHw5g) z#%ni+$Ag$1H&BL7(^MH%%X*M&62I}rwOs&MjBbJh#3;{4jkWECjCT{4mmJeh!! z^*y`WQoN94aU{$@)BvRo)FKup3LMejKL2&8_}2@bopyOXDF6j(eq#_uoTwGRkBWy? ztL?1q5bI!3>`kUus4-8CJ4-rjH2qFlWEP`D>>s$=9Y0aVHXJ6o*Xt!IRY~l{?^&&< zhgq)Y6$x+JrcPjdl2-#xrcs`_U+M>-fe|%g5va8pW}w(5 zi7CDJGpH}VrP04PAZy6H-KY|Y)B&Y&rA_A0Hb$%0D+|Yg!Br!D4w8-~jd22j#J8&5goawZ=WrJQ01L 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%0A0`9r%HeR%gk>+h#KT^X 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

o5 zm{f<-p*$E{C)D|}1+%osmOuC9-H@{WG;qVAf{-u$?&G*;025&0b>?@BUHv!p6`Z)l zp!WaWqy0XkF?5UrG}bA1*_1fI2Zum9h`+ryKcUM@I@5;VliO#$cp{WMOGf5^R@rNA z;?$a-P73;J0oC3Zb**-MqMEUPg+hLb72b_998G|m(18TVBLTYq8Znst?J|2DasI`X zYF9!avOF>q9Hf(OG`1qt(M+d^$T+V}P*d}zeRX>wGca}r4?n>6aJZ4+L}yUr6SqqZ zemf(eJOw9mP`zDh7EN^d=n2aBX!TD~5yzMbJJlznyJ_;2ujp58)UkJIawCuD^0>~k zUe{8Zwv}br&O-Ax@sKI-032cmvScZMqF2QC+ z2BAWns$Rc>47qJ^h1p*NKeJkjCOcV%K$D-Z&CG_Eq#>KQ239z^?$m!C@Nq>%ZH5+|g!jo$a#-^GW85hW}7-5tDl zw)kzS10$~PooQ*`jwn}DP8T(Mjie2&PbIjo@<6GP`!fCj01@qQ(MQuG znDl@7e!s@q3ibdO;)g`wk^|m_y^gUGAD4}evyJ$m+Tk6fYV~AEKB&cRr3Q^zqwr(O zS}Ky*ofEHbh$ver$i1B%o+YTe8hl0h8Cp}G@SbN}B-$qTmd=?0ej$?q54F;nLFm+Z zuIz=sH>6)OM>?`aL!Q+qnFpolx!6`%wnKY2W$TA0N9BgmorE9raknIDXJ@eADkwze;HVpCg~NrC``VV!~3Ejr5~a&HBn8|f+By?@mircD3x9T#Mqh8?|&dpkg7o-YI~aS}a9cTm-C|JgV4 zDKIDKI3HYqW#(o|`GQIVQa#C&uTv&_@`-L}Vzv%TN`gN0vOB-H>3?1ASO7zzZB*a1 z`>5{JPd$ck-y>n3&G=Jii%GM(*lrZ4)0qso!wWEkyZ}af;VN6S#(g=dqA#Jq#oB0r!x_q84BX&Jeq~JTn{az&b{%mz;~e_hy#_y(@tl)a0BnkwCYRjy*w0?6JloF$3=%M;?*tYT9YJ z_`?!QyE{H-mcwJvS({l4cUhn2-}E+^+U+XFJmNAD!m>RZIX<8-*`*WH<%?0X5KdcN zreM28{KNEe6`(xP$(&N^{@w5s#+_@dL_|mRzYAk%6*> zy5@wpr!6B8>%iJel+jfS+C04%xXrdMci{E(l6J3#!Bir{uZLrRdHVDt?xp6Xt^bsE z;tnL88j+U&#-Rxc(oJjggVq`KwiYdR2Vakq_=2h332m}8iguLjx&@}yQhz<|Knl}t z3*%i}iUQ*qi7tYzm7ADVKYjFbRDYw2DQ&R7b#J;=&%~-N5y&@_MI1G=5^^p{99=nf zWQC4+T$P7QO_eOmWbQ-o)3Dwpe44iw3@8715r+S)1d}YJjIkMxB2~?<$eU1Z9{Xyp z?UL9ct-v4c`D?Dgqevxy@eS`_jo3LD0Z>X@k<(5!vBH~J!_K(~HR2q=W zxGtF)aT_AE>oxJo6MwUC^8MgAkN808?cmbVQq!owmbg|LJ6JWHHTGR;kcLX{46y+a zp}PqB*@f7+IKAS@0<*?^AjeCS_9AX^#Bufp4EymPFM9}7{_85U&|0X_{y12*z_Vod z>qKGk%WW^FLcr3rd|Q)=IAe`YKxEXkNcG3tDtf6?=q0XolVCcfzJ0F`?6+?dDGvsp zKTO|_TjjIVaAiF`w{TXw{f<`p9YWo*hg+9XmcJf~XFmDK)c+2jBS796J=?2pJ?TfC%WfHPxWL&a%ZK}wE~a%oI9kdwlhD`W?e%FT>;uP3 zC;W5zhHv9ACo(>Vi zbU2n|h3}i!iRcMuN(!gs6$I<|z0E;zF{bTH-IRTQs z`h=!hpFGB}i1I($L{DQrJf1)fDmOY;^+J~ufFsZyx@vl=2A3B1IL*xKbIOZ|bsas* z@nhJFi6}N#y`Q=b2oOgUubFlo;0=&|wDbu%B@iG3l12`O+Ys0v?f;yFwvh~yI9x6? zRRc*WJ+AGtT}o%J!y?*FCC90r>PF<=o-Z98-7yi74vkl3cfL0>TW-RF-Sy~Qp!G{0 z?9C|U`0wu|OF5b}=_5Fx|6L}ipGY2z5v%La2AtS@Zl)~}P$to!4u5EbC!|O$sf`9> z_=eqSDGK-X-RHi4)gzj~ON?wk-1@{YJ9kIl7R=jaLYpCR2L);YPCo()CRFQ_2DT9P zl*CIfb~l&m`ro}hZQn0~ws9{DKujj!SQh&C<0kri?c{Z7?wQs*`kl{mf2gPO60zY^ zY&&AUZR=B|AJoDGdW6LATm4mOB}w|nkaN?AJ*C&aVL5$R9mHuuP_vzrP8u&BUM%0v z(_E~UVS8BPUY?*sU2J;&=d>jk4HZ*Y1Vxc@O8rHLaFwfJlYV>lE+t@ZcXA=-9;{I< zHVqQv>ND}0cy|d@U#EVr2Au9uA_K#*jV9Z472}TQE8rI9*}-|k=0UwZD%GjiyWE^( zai<{6^+NNU>koK4uE5M-lIipAj>z1v&tXIk9Z<~ff3!`HC||7J_{iS0rGO2ys;wU? zU>e&HVlK#rf#L^H6>$h0Ri+ND_mu1pfE73v8SgU| z!Z;4n!B4+24PqlcOA6K?5AfT;fT@Q`(N~&?lEp$XHxscLBmPUofGiRcUWu21x8aZ z9DiUs-uiE*-yet&)W+?cJ((_fcNhtmI#Qnzi{WzniGn(8-;V-A-b7<+W875jmrRS1 z8q*HcPc^*KS6?EMtTwxfxR>A8p3q16Ey|=iP4R@-_8JKoAdy}FGC(8?@k$wwf+><- zkv{{InP7j~N?bkfR7W-+zWFJ9-eE#5ar%S40<_XTu_2DlaJVlbhm~)@xV0wz#T65j zokT}Pyz*CDbll;c<~>fKxDAOq7k0e$Ozelt*hSw|PR+|)G{>02kLcEiQ^$s}o6IFd z|CX4uKT(glB#nrEZj*8kI`c2Njv+4;H|_|s%A$s1rASD7cU+(rM27z5++B^5!@Wj@ z=ImikyR;7bt2GjV`d!r!SAigDRxH~`n`SDH1+ixD>eE~@Ry>dQ&F*vI4pcr+ zuY9sq8jPLwpsMIUH-?ha=L;#egV>Ep1QXUwfJ%K*Hl2p6b;9IWkeAGH% zf6nwYtf*d!C$dIcrN+jN@kq#MF18_=k>Ua7iYc)8tV=L32}da0fK~aJ>R9t5zQw{A zevL#1jR7p>ZlVH^Rh$rzU{NE-c_?gYDgvtX|7K0_rIKTCvY6R#C^N?%oLdXSaykDnTAoUBf1%Tynf5ELAYMs;7ZMts&O=!K7%6w|&|dsci_{zMQ)h3m3teG^k`%}b{# z6)vIE_2KNXpgmV9UU1qqWvD8Hz18~#WR)Ikj?5`v`H{I@avF$SmCtZM?$zOnWrG>W zWodnlQ{(#BMrgpMk;swoaz-zjj)_Saoq0TajM6;k$AC|xvArV8xx&u}t5TW>-Nw+F zkh+Bv=mI|{7=9vqSgs1m>YlX-^>)8k<_pnIJOdJwypK1T3g$G>vty!-9~{_4+peAk zes6}KB=i`s;VhiZkz{N=8&FcLmGH9AqERIT>AZCX&CL}YZ8%eOzKVCq2ZP@Ao5mHf z(=tw@SW|_p%eptL6}Roq%=Nz$LJSSa#ajDZTzDHId-hej&4;cgRghYMI=~WE!c7CZB+HGQX zLvNrgcf&^dpQM}@;x81>reYSKgz(9ykzox4CK&@=Fw~sZWJ^Uf}OK*1b>47p}s6#VOU{ z^@F<1>O@M0>@W+{d+c#ejllsTu&ti~TNN9{Up1~_&d6FOD9j?WdRed+(a>|tC>rz9 z#Tw5=IxUF|&WH^9$HO*8PZr$^+x%*4q?5aYwt3b|`krRKe8tgZE*{qLMqu-*=5jiP zPqQdZ_)r(*lJ$fwq$)f!gX9G+h|H356nP2zbP9f*3o%F;T)JBGU{J+KF-eHM>q;M? zZq21>3udkKC+`<0x%hO5WK%zGr@gk~xq|YW1Xgs@17rtFR0u$VXD?sMMQuW6(I+Jc z2SW@qU}~UFYfnw>!~aO==n2j{?W1=A9bwa7D!}2tWoGQsbVB=HoQ5tDZ8`+&701m! zn`GQlpnV3D0FK4-392d>@G^;6gnjLMIB>Z;%jKV1j^*QNzg#zYk?Zk}5azZI#!QcP zUbK_uOX@Alwk)>dbW;9@4qNSsMUz0~$){I(sYs<&Gg8y;_0ipMl>ZxH3bw}7XvCjJ z`73~nk3U5);0dgf29wkM%zSP3C-2uPT>nso}<35SKGWV_=L2;V7=0WvhHKMGg(M@N@q~=n?Yqtel51 zF<77(-r;o*7j@6X69>MIL6?{kb=&s&w%l6Vv}6yG2o7p{A!brlm&-ZnlPHt2$LY`f zDXt{w3dhZ!rsfIPt`XaH<>FB-eo33 z)U6KthAaJva`n|q-N+TTq2~N_kDg#*GjhM7la(^e#J-XmLxxr)-K+e!LZ(eGdByo;rPJ%&W+3$kO0Y37x zE%rD_7!rQ42uAhp#Hy5DwL&u5l1~j4eZ0!vlX~aNExk(`!LOz8Y1J^4fLO6uUhvLIkpUVpdKg&vy1iN8ZHznhrWgBolMRc`n^16RO*lkCC4~7{uA+vIgKoWki!!`}BhKb+En((rNTm!#O6VKKA zM=w+*Zbqm-rzminU>@6m7Mo2wD_o7aX!ISs2T#rxtwZL~fGw%66lE!8?z$ zBkaCYukRU{K8OEe3Xvs7UKn~p-76WHjW(MigS%0@TwbPQ{2k`BB(=kDt9pbA!lw66 zAZK3BoPd#F395OWV68|-#=Y?7v;{HMeHkjr!~OzJNW;c%&!pPoxI_Qb&f6U%?VcBS zS6*&mt@`@_6vfjlitJ`~w4z(XJ?c=I1^GwXXVGY_78*ydqZd6!g@uLhIz*g@ppFu& zHr+fU31g2TH))VZr*%1|_?oBP?bet+@56$~4F@5X`}g|j%{3vAlL-l3Y`UlU;2)m% z`cNmHA9+gGZ@Z4)#D+m!c_SXkLO&Z@$e!@woZGD`}DzW7bk4Y&2@;Kfziat+yI=n~uHJOqZob zE#z}$2X@e!STU-{-oIZ}JGG0naE({d^JAuqDFn2%)?pF2aN`6}#gCRePA zdTy~k4~@2HgvCH?O^nm(g>t`e!h(fzZsvwe^$h`i8r~-)9*RhlugW%nn)34H@-rP< z#Gi7mRy!};$p1}d8LWY?1p^wS z$PZ{1`=icW8Dk+k0zx;MlL^;QmhYXX_ocVqdbKdg9G&eZ+*;Rz<{Q@RLct&)bLvu^ zX4&|1;RhWTXnmmbh85Sp_BLy0VKm?FgaCsK~l z;6=&-GU@aKv2Kkrm((tK3bI20zx|Imart<>tW3AK^%R?rgy`~n<&hDTX-Zb1%$Pgy zc!LtE!E=tyxc8Wza-L23^clxD`@8pe-6wyfbl~Z6pg!Lu2V+KJ-$;BTllPnb8~ThT zi_MvG+>jessDf(yYrS<<5x3Vuhl-1GokjtY>d&Ss%i(60D!JV1+lrIPyJ!fsxO9aG zzPg?0wOK2UJl(JIKlgtXU^x#kA(sj)Zs)F4j^HtxQpm58=+-KV-ae|uUT8slAK-ZZ z3j!GvPbbj5Jmyr^u5iPi!xBINsva2s^QkROx#YrkET4A{u3*a=l$|qP`>IG!QCfD; zF(_W7717}8CpmFVMNmKme@>=XD|hj_b}o(f6U28Kd$h?pTqP}>sKCCQ`U)mMz9hR5FfB*3XSs+jPLgJEIUW#XF2v&$U4x`Bq#8l_h+;Kd7cx22}^ zqH7L^smd>I$KkJvdH*W*!qxZ%1?;y>lUKWhuTW8G?rsdYZ*=YXmYrSoDz|v~yFk4p zc$_s)SJ&l`vTni6M4PGQvdTO2-7Buv{JfH5wATINoQCm+hv^mrk<8+vx4U^}(8=P~ zR1Cs~f$Qsc)$HbAIi|QhNqfeo6I+2vrdt@PRf1^5%U6p34aMqT|E(oubmRtxP&=AM z0Tv3Qr}Yo!t#6HXfk`LGF(2Pbzl5Cv;pn;Rjr1GX$Z&9f*+&%+O2zT1=bk+>J3Wo4j+%+zGQBmxSK32G zvRGPIJX_XSDbYVE#0B&@QD5m+aY8MHhJ5ok!e^me#V>gs_^zo-c5mqv&MtqszbCq2-{x1+cmjKQ&|NYZC+hF>v5w&AZ z8GB^hp{Y0lZZ+rieMd>^imr7+^XliTlQ-*06{qOOK1Db^K395+Xig?o%JDNTZR%+K z6CB5R1HFRr z)U7`Eav!}{=BesWD?%U0QvL3T;DGDt;N9c{Wj@uSnsBe*4||`JAcmbap=U$N6Yiy9 zj9KZ@>odkm%=yPfo({dYd2NU0*VC_(5I=FY>v1ukYr!QgxBK|3l8#jCvu3VE)js%+ z)r7`w3GC86LYYh*pnt5SZVif<1V-)_Gp}~vBmEDjqcqybrt`Z#xY<@gYP~0jjCJ4L zx#ntqdwlS!>c0@+mucygsbSf@CJc=-f|B@B5(H-!e)OJdKigel(P;os%3*h$vC+bq z-7A={caK>!f!))vlPP(ZNOT(yv)%w2GUY?=`5iiCfkY~qroDxum}zlrvq)h2i!^+9 zl{;#vAwguP3jEHHSH8(H3W*}`bJ}3Z2`Qydi_YSwE>FBF(UR3pCxa%N$5Q$VjM4R| zrVL(O-1&uX62M-*er5Dkj=#oZ4l|CvL5;6Y&d2r zppjB_uMz^RuPO?loB+}If2K$t!d>z_l+h!qNq=)e(#(PDN{sJHS7+|%HH}D<;wqZu zN8iL4^Z$M^V!zNEzgRyAd3^O8%@O69w$vFCQtHV3sFvF8O*6|-^2LkKu8<_H!3evk z=C{7pw!*{{hU4lnYAEEUrnA!cP`#ae^SJS+^BF5fJ;*)nJUG~`oYLW)Lgmk0vpP2J zmEMS7)8X`=Q!U{vit>nbqRGHI*&?{6`HZ-Rh)>P9rTZX|lR|ko*6J1>JhV|Psau90 z*yaDZy4i_%Q;rQL=sD|(MOp<@nrfv>C)i>gl3E&eSt9OZC64}-4Nq+53M_uekh<7< zcwPpGuQijLw=ihGwH-vU*B>KTim;KJ-DK6e`S2C3CcXeA}F`b#WtlV?$G(Vwj{p|-4mRbZa?vM;| zLb$)7SFbQJrKLNomPV>o&JK32!cv98A3l1w`)u6nBv;vFRq#qtO3z(6cYtl4RSH=5wwM+M^#feUkRzr{% zqbY&I2U5u68NE;IpROFmlU%NF=sQ|A5ZG%{Qhc&npgB`s>cjp6K*UceZ+A>0;Q@bx z>^16w6tKg2*nB(8TntD)^>a0KjVB$iYCxpVAwQl3Z->Sby2-#zeR5MF- zBK+s#sSXr}&xO5W^5m$VOjQ2FRiese@O=DNPRGUVdP#9IJ-blS!2(QV1*?Hm-a{AB**^60nGdm4B*S3o!p5PA@d+)V5 zgsoiaw@+;}g}x0%e|#+DQDUN%0|)yu2;e3lthy0WCBh)NnI4ojRjx&0|004MI}bqg z8o;ATC?D8iRCO>tbdE#w!M=MG%y*c*Hte^?+%G96UsX;D1!$Ll%ym63x=vRz z@3@egX&iHU%d^tt!FBfq^(;(Hg3?8+LmsVlyP*&CO8Y!WNdc?_loWzb7sx`%8S8yF zg7ROZ!Gf-Kq_B=xko!2aE2!4Dm(iB!jfWzEEE0jloTWL-7v%6k<%!Suq_L*4 zmHW8bj^(+erlCFGb}Pf;vouG6ibU5Okf;Pd{%aY5u(pA2+X6u3}Usay(PEA0~+hRWK5=H^(4#`B^8FIZ3H63h`pKx zY9|>cXy`O$L>ItvMU1v`t>JKs170E*kDXzvq&*9?l#9k}K&8mub~+?NaI_h|s~Ruy z^0`Jo3OG(uM7Ynh)kkw{-O~MHPDf9_&$g$OG*)cr zsw!ko)@Zm6x0S{tYp=v`(HAQ1QrOcIuhBF=jeXRN<~J)5J<;j4Hg8iMue?-2ytTg+ zba>zh_Us^}R(+PQKaEz>+u9pinzzg5%e0&72<1RSFx&%bVllB?fL%FE!h4*p-m_;d zSZA$*91h3{@jFF{hn=`})5@7cH`(4*IC`ssIGRUrTQ45#4T$sRs3abEkXGNwk2qK< zgsXEICGRGojJ#Gp#1Nd@6nxlwPM+*6_xml ziQuYamYewWDW*oN=v475aCtAD)TbSHeFv@}IL*`Fi63)vQSP@PdVaEcp7Q{O*btHA zbgDvszsX?KLnI;M{(VZ@`M@p^qwsAlj`Y9gkVmxbmEfjoj|I`rkn$8pNs{`_nrE0N)>Sn9})eu=mtB7sUVY>J;#`yvCEErq*gj3Rg}agvl2wifn9h% z5}gW%S-^ISDVSb6CO|9o8Dgl}QexRnCIn_z%uRhHDyZs~DPz2Omj;pI@r}vb_6WbM3uHGH+_`x1A1NuZXx+}icMM-L33F#j z_m*`q>#F**&u|)e@#6QWWZN|}KeiX%o5hYC06o-PogPzfkBp!eNV1O6;@VzkSIu!l z4LD+nq&+0CPDkRBqBK;AcEdXbFyc06-Ul@U*Ppb7#`nElke4GC0>VpgyYuSsnh%uX zu}Bo>Z1=peG-Z_{0!X{}dSUlWYYMhLWSXW!UJUZ9R_|6u!OD({t||FYOJXaMA2CGy zRsgB-1V&6wJZj5h!`Yf#ViWvfcJlu3$T@w7DxTvWRf$~{7ENDBrE)mVhar3!*sfH!EIpe^$sZP42GH>|5@41pJqW) zxaZH;FP&Bz80B(CR&Qk!sAr3HEfcjJgK6S%OyWXIM(w$$0kZ39r~Svy}AF;*yfnmd$i$?EAmP>fjH=@V3j&3GV^#$o&GN zl{uf>r^2xku78@|o*mh3n@Q}R2Fj_%Ci>$cG1HcuPyi86M|aoACu~mMp3Kfsp_qJT zyO8eS?751+p6KgK$AS!oV+f$h{dMns^PaDe+Z7^-7_;ajNNUn8g4XKq(Jxw3uBEho z&$-?Q@XLSuf==mZa5vWBPu~;&rQAMSG2$zAWjTIO;1;kd!c+ny?z$^9tH#Fjk!rv( z1x0)D+SrOW^lcOcBl0&7`}qR=yro{&FbOa_WN2wxTS*Z z5n=|BMoCZbX6-N)h45qGhjQ^WC8I34kI5xDzqsTs35rzqVb2Lld02k5=Vrpfe08dC zI-2g0ppN3U1wt1y^<4@1dO72sNfn{4{-i;k(G*);|FnZ|(}|?LDnDKz^vveHAO86X zHp9M#y2jN%-@HxhQ$|9qV4(TAPsiV^XyT%3z-^6x1Z7^KXvbCfvpu@Zn7qS}T;`So z`jEDJc8=^I6V0#Mwd6o(RZAeeL}It!rCR#Tt#%Xeze9A!G+$7wZGNzM}xuU^)YW0i%W&GfMH`|Dp< zpv2|?^I3c5Og<;X#-)$qoI^OXK1}EP0{lg0KoK#$o2y<<7_eTS@B12inR%}Q)Bv-v zcZHC$2YC2In4aA0hPD3H+>ERH`ghfg|KUAQiEze96}l2WYB@gGkN5SEDpIX03dXCPQmj-9LRKMTElO=GbvF?WBqe`D!%rXaQ@2h3;h1U1| zKrZugpEacJxL>%kW&;ce`{?9rt4`yuUm5=A;ZZGBWv_kK_IkW)Q0wofR?H^vDS9EA zE&Kr`>o{CqJT^9SOWIusy1)tC{5sHefAt82!jz;(3k@cLd!U|1S)_K)#Wlxn+Lw8S zJS^RQZFMz`%Ei~xDF9d4)a&cIX>omi`LVF6{$D*ZQtglw#xS~xtk9O7N3>csi@e3EkxLYzRtBxa$3n0Ds{u>Tl;bNntTZM<);VvAz0mSJ?-y1%Eh{cwv zVuu%|v%d?!91IJC^l&a^uZPzjE2&90rAcwRFF#=fviPnW}oJ=8nf zfh>alVvA{=h-5k`frp81k4&Zm1YAxTlYm6pl_CiI+Clgbd<{9>?lN|V>pU5&Cd;@5M4LyV zc%_gHs?>q<9&+o=zL<21AO5-CAE4_rnft~8FMh^^{RHBey7ilnheRRA-jWs%w8Dcn z^I|{x>!JG=MONB&+|k(%@jwndUsra~0$F79dyxf-j=(EOWIb~3eokSbF8o43KS=3PoQ9&%oPM$-2SdyuiMamkA1BVZ8GV^|SZAc#z8l-R6|9FYq2-`W1q| z{+WDuu{XC!#1gjVQZ_4wDiT1$;li@o0_D?oYHl)CN-;REy%f978=G z%D-#PojM*aTE7ura}JRmd_YD6W6N(BZMR`sh%$U1U2^zY3J*Fk9l!;neFpk#Ist-V>ZLs`Pn^`W(W@-aq<~bheo~k~I)L3$r=6_X;2^WY)J<;_zLfA8gH4?HoAUAtlbz4)tcTEP zN9M#RvOvlg3(!F;$Wrju`)vyvKpgs@s;cVo^ZmwR%a+z8?Y55ux{@_-^rEeh&-8cp zR4#nHT=dePBA&6|^tL4`EI%o_tq7JbY}N=&T+uuGpXK-isigZgpXP{^9ktm|)(h%5 zEfv=J%ed!eFlp9aD!j_~>`jqUL5a(4>AKknql0x+|L-n%rHOCa+2V+(Inh8!9{-&; z$DD%~fLx=>)ky)(F910>6}jOW&vhDk#z?3)*CLxNW~$?ywzW9p7iPGXwc3$9>n%N9 zTSTwy+K4~EfQBK*e${k5CrxY}T!nRMNa;fPH3`WNZo0(s>mb))!TM~U1oaDG>4m&W zs`{2X51C!-U?Lb|5Kpn6MkhRN>o2)U{AGV7cJ3#!dt>(9@7_IA(kwe=dhl#J5p^~^WaQ)xoSvECyD67=giG44*uu2mc&!|x zSdWCyZ6OJbazE|TWt9iYu#b*!EXAvACm-oZ6C6-L;|qKs)O{!M(DS4BDr5@5cLHAD zKdbwwM=E?9?~g#qA8*bM2DM(6C@W5$)o@ed(RX&xRjL=*KTS;Ech!(PR;g5Yo2bzB zL}6%-$;$4Pg;Xvvq+ag*5k#gzk9T+98v};oWsKZ_btn~R=WAQ{ZojGj(p>Cic>F2c zxJbe?X|wFue4!{GJr%f$uY$J@dBaWwomk zBfFgY-I`a@UwN&~HOi=ujWBM0JsEh#^P6xIo158Y0lfNGc7L2bPjdP6GRKp+xL`zk zEgZP&|5n=u@w@lMm9$h6>ME+aV91W&rwI?@q-Kk3jXWS1s`=J=to%tIWve8OYtNx;cZN&Pkdv^9q%q=R7azpBqs90yfE{!p^aLa#5GdB3LKEJo)YR7aDb+t-K$KGuPkri z*+fsCds(Mvy?abIntwp;TaWNK3;dcrn>@rjbM_V(2pR89}V=>*4 zjfELTJ%jQE1zNX2!b_J`kbeLk=d1W-6?l16!*Px+kxsh2IjPSO4*F(xOJkLOIDlPGFv=Q@^&`?T=YJ6 z07E1-0MHnqQf8DEzn9_Gb6pxLy))Qc$H6Fpg%dVV(!O6h-I4L6(d6BXhnt~~cE5-y zxj!@OW4rCwk)fbH&Ua+5R*ocTg7F8W$BqsHg%4JWaqTN^7m4iBEVq60C}^ZJ()RB~ zb?yllUiO}DP0_v=)hJRJ*}Fp)@^qDGiJW5iyv&3(hDg^xK=gPA^B%gzGp|6GU(j*6 z20KHpnCZOX3HAmtBHD|_(Jk>N2HCn`-d|b^-qU(wpvNdz=qR$mXkT|w#aS5OPd=aN zskA|@L`_U|z(}=zm=|vDguxa`i%ytYhV&G((0}V!K0(oH|BXxGbhHo#*$br}~P-SdOB8>4d*^HR#%;CnCiGWYGvkIuvR2#%3{6`8X9Bi{{NN|-2 zLIYy=!~PQ{j2ciw)NFg|f+Sh@Cx)+-2=JqNa`C#qE<|SePR(bna0D7$1sh$&qe6T} z>oYK6m&ov%hD5KkqaVdou@ci%3g(|F?#_1N#V8$=bNgP|sG2Wsahiydl63}Q!^F?G z1@7ZdZ1bH}x@r%86?p!5p49p3GPf@Xvf5A2D1LVR=F01d>q=_Mh>WDL{w(7!Q+zxj zeM5TpB8DhgxiBc90BF1oATAApf4hG0uRzr3Eg*GhbA{8R6I=GDw60Pdr2VAvERdhc zR}8k=Z0LiVwrYqt$=X5P($#isgU{PVPO^}CAx~3W>1|pU zSJ(6iHbNK0mX(y~j&in0oattBsfJ@OofJJhseb7GgI+7_3L_CLyMU55R9V#I8sxdN9gbA*+z`e79J zK}1xrgJ{c5`=lk03O{xiR!RR&S;-dx;ZbkJ3!OiDm)!JG`qDCBvB3kyRk^fcyll76Zlg{oEim9{krt%m}POX%% zdQMpQJhjimZ9vFCls@0d;fQ(~5CJH$IE zSlea>5^4CwmtBSHdD_H>c98D|EYdkXHir6qTf}*M@ZhpD zYw#OftX7}-?tm>_y76bM8i$N9htK@!nO~sZxodT5%I*bNSmimumxfq4G`O70m=@>e z`%2PNIGOfjzH=`t_BnflrnUV%5$zq{(a~4G?4IQdH=fJZRbdSBIU&b%nZPT592mcQxm-Uk%pz;Ae{S2dq{EZ&E9U7JfaGc@Yi8QU@uPtqs(!{w`eh?ZT~@ z;v6kj)Sn`5XPPyNmI?QHeyZBZwpPO$CW{Uc> z8`IXx-zemef-Brhy-QiAt5;G~?2nPDx-_K8l*A@VvaU_< z2UfVwBzxD(Ydwh%kL6~ZSnDY1e5N7!#=!KUf$2@?Bg_>{Jk3rXEFJ1+yDv0s&E`;m z!%u#VIn!2gq)hlhulrNVVLqmyjU#2j%O>^iGzX>&$0LeWM*GbQ^=OHOnP9`mz2S_x zI4!XyULZl56@DJ_T9MW7{~J8Dp4EFlknRY1g{JsIKB$LE=xHew=vWMzGp7%QT9=%jlyvO`g$|x5sQ;c>9Ptmbclmurf1*b7H|QuHIJNgvfIzqim zGD0;M-Su&2d~R&tK9VV{K#i)QH|Ih!)9qX3+e4VO_jt9!Yilm&=SONKH-o!g_)AXT zpdG+(NZ5;v{v3!m^3=9hz~=iMhC4lbGzGOaM>-TM zDd2yeA;VXUTt}&z?r<}J+2)%KudLgXFh#$bx<|*SnXPyRyzRYA1_W$pO`e8X6S&Y) zObg=#vh-eRx1*9;Z;MJFdkNPOY{#}vEnKd{KGpd=`A@@q>w&^6>P5mo0$3$|i7njl z7$gbB=FrT)0=J_yCp$WVAg{gcw(`n_lHs7o=kAArRu&Rhe{Tc~9^XVwMP^hbxbSv- ze~VDnjcL>LLQYpYzNu>$IuucX8{8!>TzNw(gLSM$@LmMHP$4J*U0n^+JHNEIyR-E1 zYn(DFC4nUI&(PG*sz)Gv~b9r2P}_M_(|eDAeJ) zhRWHi#xA@B2bs0hY>-{hb4*

$c0!!HN=bR=$u{^Jp0�|8+IT8b;@-MeXC*6+3 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 literal 0 HcmV?d00001 From 1ac843a37263f6a1611f3416cf545ace14e03b22 Mon Sep 17 00:00:00 2001 From: Michael Wyatt Date: Fri, 19 Jan 2024 15:00:46 -0800 Subject: [PATCH 105/754] Update README.md --- blogs/deepspeed-fastgen/2024-01-19/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/blogs/deepspeed-fastgen/2024-01-19/README.md b/blogs/deepspeed-fastgen/2024-01-19/README.md index 98a9346441a4..9a5c8a83df46 100644 --- a/blogs/deepspeed-fastgen/2024-01-19/README.md +++ b/blogs/deepspeed-fastgen/2024-01-19/README.md @@ -29,7 +29,7 @@ Today, we are happy to share that we are improving DeepSpeed-FastGen along three - **Performance Optimizations** - We drastically reduced the scheduling overhead of Dynamic SplitFuse and increased the efficiency of token sampling. As a result, we see higher throughput and lower latency, particularly when handling concurrent requests from many clients. We demonstrate the performance optimizations with benchmarks and evaluation of DeepSpeed-FastGen against vLLM for the newly added model families. The benchmark results can be seen in [Performance Evaluation](#performance-evaluation) and the benchmark code is available at [DeepSpeedExamples](https://github.com/microsoft/DeepSpeedExamples/tree/master/benchmarks/inference/mii). + We drastically reduced the scheduling overhead of Dynamic SplitFuse and increased the efficiency of token sampling. As a result, we see higher throughput and lower latency, particularly when handling concurrent requests from many clients. We demonstrate the performance optimizations with benchmarks and evaluation of DeepSpeed-FastGen against vLLM for the newly added model families. The benchmark results can be seen in [Performance Evaluation](#performance-optimizations) and the benchmark code is available at [DeepSpeedExamples](https://github.com/microsoft/DeepSpeedExamples/tree/master/benchmarks/inference/mii). - **Feature Enhancements** From f64343a79ea1bac99cd45c154a6cb201562923fb Mon Sep 17 00:00:00 2001 From: Michael Wyatt Date: Fri, 19 Jan 2024 15:07:44 -0800 Subject: [PATCH 106/754] Update version.txt --- version.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/version.txt b/version.txt index e2e3067ddc5f..54d1a4f2a4a7 100644 --- a/version.txt +++ b/version.txt @@ -1 +1 @@ -0.12.7 +0.13.0 From b7f7ae5a0dd2fbac12e335ddb7e87b5a37302e38 Mon Sep 17 00:00:00 2001 From: Michael Wyatt Date: Fri, 19 Jan 2024 15:12:37 -0800 Subject: [PATCH 107/754] Update README.md --- README.md | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index a04a59ef84e2..6c3d4c0712fb 100755 --- a/README.md +++ b/README.md @@ -15,18 +15,21 @@ ## Latest News DeepSpeed empowers ChatGPT-like model training with a single click, offering 15x speedup over SOTA RLHF systems with unprecedented cost reduction at all scales; [learn how](https://github.com/microsoft/DeepSpeed/tree/master/blogs/deepspeed-chat). +* [2024/01] [DeepSpeed-FastGen: Introducting Mixtral, Phi-2, and Falcon support with major performance and feature enhancements.](https://github.com/microsoft/DeepSpeed/tree/master/blogs/deepspeed-fastgen/2024-01-19) * [2023/11] [Llama 2 Inference on 4th Gen Intel® Xeon® Scalable Processor with DeepSpeed](https://github.com/microsoft/DeepSpeed/tree/master/blogs/intel-inference) [[Intel version]](https://www.intel.com/content/www/us/en/developer/articles/technical/xllama-2-on-xeon-scalable-processor-with-deepspeed.html) * [2023/11] [DeepSpeed ZeRO-Offload++: 6x Higher Training Throughput via Collaborative CPU/GPU Twin-Flow](https://github.com/microsoft/DeepSpeed/tree/master/blogs/deepspeed-offloadpp) * [2023/11] [DeepSpeed-FastGen: High-throughput Text Generation for LLMs via MII and DeepSpeed-Inference](https://github.com/microsoft/DeepSpeed/tree/master/blogs/deepspeed-fastgen) [[English](https://github.com/microsoft/DeepSpeed/tree/master/blogs/deepspeed-fastgen)] [[中文](https://github.com/microsoft/DeepSpeed/tree/master/blogs/deepspeed-fastgen/chinese/README.md)] [[日本語](https://github.com/microsoft/DeepSpeed/tree/master/blogs/deepspeed-fastgen/japanese/README.md)] * [2023/10] [DeepSpeed-VisualChat: Improve Your Chat Experience with Multi-Round Multi-Image Inputs](https://github.com/microsoft/DeepSpeed/tree/master/blogs/deepspeed-visualchat/10-03-2023/README.md) [[English](https://github.com/microsoft/DeepSpeed/tree/master/blogs/deepspeed-visualchat/10-03-2023/README.md)] [[中文](https://github.com/microsoft/DeepSpeed/blob/master/blogs/deepspeed-visualchat/10-03-2023/README-Chinese.md)] [[日本語](https://github.com/microsoft/DeepSpeed/blob/master/blogs/deepspeed-visualchat/10-03-2023/README-Japanese.md)] * [2023/09] Announcing the DeepSpeed4Science Initiative: Enabling large-scale scientific discovery through sophisticated AI system technologies [[DeepSpeed4Science website](https://deepspeed4science.ai/)] [[Tutorials](https://www.deepspeed.ai/deepspeed4science/)] [[White paper](https://arxiv.org/abs/2310.04610)] [[Blog](https://www.microsoft.com/en-us/research/blog/announcing-the-deepspeed4science-initiative-enabling-large-scale-scientific-discovery-through-sophisticated-ai-system-technologies/)] [[中文](https://github.com/microsoft/DeepSpeed/blob/master/blogs/deepspeed4science/chinese/README.md)] [[日本語](https://github.com/microsoft/DeepSpeed/blob/master/blogs/deepspeed4science/japanese/README.md)] -* [2023/08] [DeepSpeed ZeRO-Inference: 20x faster inference through weight quantization and KV cache offloading](https://github.com/microsoft/DeepSpeedExamples/blob/master/inference/huggingface/zero_inference/README.md) +

More news
From 3831d4b57af1b9bef933bfdcc98d397249a64b3b Mon Sep 17 00:00:00 2001 From: Joe Mayer <114769929+jomayeri@users.noreply.github.com> Date: Tue, 20 Aug 2024 09:04:37 -0700 Subject: [PATCH 472/754] Bug Fix 5880 (#6378) Allowing hf args to be passed through class to AutoConfig.pretrained. Co-authored-by: Ubuntu Co-authored-by: Logan Adams <114770087+loadams@users.noreply.github.com> --- deepspeed/inference/v2/checkpoint/huggingface_engine.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/deepspeed/inference/v2/checkpoint/huggingface_engine.py b/deepspeed/inference/v2/checkpoint/huggingface_engine.py index 46a84c61f884..77dfa7a23b1e 100644 --- a/deepspeed/inference/v2/checkpoint/huggingface_engine.py +++ b/deepspeed/inference/v2/checkpoint/huggingface_engine.py @@ -15,13 +15,13 @@ class HuggingFaceCheckpointEngine(CheckpointEngineBase): - def __init__(self, model_name_or_path: str, auth_token: str = None) -> None: + def __init__(self, model_name_or_path: str, auth_token: str = None, **hf_kwargs) -> None: super().__init__() from transformers import AutoConfig, GenerationConfig self.model_name_or_path = model_name_or_path self.auth_token = auth_token - self.model_config = AutoConfig.from_pretrained(self.model_name_or_path) + self.model_config = AutoConfig.from_pretrained(self.model_name_or_path, **hf_kwargs) # Define this property here so we can use it in the model implementation if not hasattr(self.model_config, "max_seq_length"): if hasattr(self.model_config, "max_position_embeddings"): From 96393f561dfa47017496139a6cbbe325b2286ab2 Mon Sep 17 00:00:00 2001 From: Jinxing Pan <58251866+terry-for-github@users.noreply.github.com> Date: Wed, 21 Aug 2024 01:22:02 +0800 Subject: [PATCH 473/754] Update linear.py compatible with torch 2.4.0 (#5811) deepspeed/runtime/zero/linear.py:67: FutureWarning: `torch.cuda.amp.custom_bwd(args...)` is deprecated. Please use `torch.amp.custom_bwd(args..., device_type='cuda')` instead. Fixes: #5682 --------- Co-authored-by: Logan Adams <114770087+loadams@users.noreply.github.com> Co-authored-by: Olatunji Ruwase --- deepspeed/runtime/zero/linear.py | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/deepspeed/runtime/zero/linear.py b/deepspeed/runtime/zero/linear.py index e9dd78864cde..8c8db60768eb 100644 --- a/deepspeed/runtime/zero/linear.py +++ b/deepspeed/runtime/zero/linear.py @@ -16,6 +16,7 @@ #when implemented outside of torch.autograd.Function import math +import functools import torch from torch import Tensor @@ -33,8 +34,14 @@ def print_rank_0(message, debug=False, force=False): try: - autocast_custom_fwd = get_accelerator().amp().custom_fwd - autocast_custom_bwd = get_accelerator().amp().custom_bwd + # Fix `torch.[device].amp.custom_fwd/bwd` FutureWarning in torch 2.4 + if hasattr(torch, 'amp') and hasattr(torch.amp, 'custom_fwd') and hasattr(torch.amp, 'custom_bwd'): + autocast_custom_fwd = functools.partial(torch.amp.custom_fwd, device_type=get_accelerator().device_name()) + autocast_custom_bwd = functools.partial(torch.amp.custom_bwd, device_type=get_accelerator().device_name()) + else: + # original implementation + autocast_custom_fwd = get_accelerator().amp().custom_fwd + autocast_custom_bwd = get_accelerator().amp().custom_bwd except (ImportError, AttributeError) as exp: autocast_custom_fwd = noop_decorator autocast_custom_bwd = noop_decorator From b65ea50631fe122f8d0c66e238d05926ee64bccd Mon Sep 17 00:00:00 2001 From: Joe Mayer <114769929+jomayeri@users.noreply.github.com> Date: Tue, 20 Aug 2024 16:25:37 -0700 Subject: [PATCH 474/754] GDS Swapping Fix (#6386) Fixing gds api call Co-authored-by: Ubuntu --- deepspeed/runtime/swap_tensor/partitioned_param_swapper.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/deepspeed/runtime/swap_tensor/partitioned_param_swapper.py b/deepspeed/runtime/swap_tensor/partitioned_param_swapper.py index 120723fae5ab..26fbf6164d54 100644 --- a/deepspeed/runtime/swap_tensor/partitioned_param_swapper.py +++ b/deepspeed/runtime/swap_tensor/partitioned_param_swapper.py @@ -121,7 +121,7 @@ def _configure_aio(self, ds_config): dtype=self.dtype, device=get_accelerator().device_name(), requires_grad=False) - self.aio_read_handle.new_device_locked_tensor(self.buffers) + self.aio_read_handle.pin_device_tensor(self.buffers) else: self.buffers = get_accelerator().pin_memory(torch.empty(int(self.aligned_elements_per_buffer * self.param_buffer_count), From 8b191d7ccfb06430e3ac3fae7c86943f9ee78be8 Mon Sep 17 00:00:00 2001 From: Sam Ade Jacobs Date: Tue, 20 Aug 2024 18:46:50 -0700 Subject: [PATCH 475/754] Long sequence parallelism (Ulysses) integration with HuggingFace (#5774) This PR enhances capabilities of [DeepSpeed long sequence (context) parallelism (aka DS Ulysses)](https://dl.acm.org/doi/10.1145/3662158.3662806) with support for HuggingFace (and by extension other frameworks) models. With HF integration, users can use sequence parallelism for model pre/mid/post-training, finetuning etc. Usage requires both _torch >=2.2.2 and flash-attention_. ZeRO-1 and 2 are supported, ZeRO-3 and SPDA support in progress. Corresponding PR in HF is [PR32305](https://github.com/huggingface/transformers/pull/32305). --------- Co-authored-by: Logan Adams <114770087+loadams@users.noreply.github.com> --- deepspeed/__init__.py | 24 +++++- deepspeed/comm/comm.py | 15 ++++ deepspeed/comm/torch.py | 8 ++ deepspeed/runtime/config.py | 12 +-- deepspeed/runtime/engine.py | 9 +++ deepspeed/sequence/cross_entropy.py | 60 +++++++++++++++ deepspeed/utils/groups.py | 18 ++++- .../unit/sequence_parallelism/test_ulysses.py | 77 +++++++++++++++++++ 8 files changed, 212 insertions(+), 11 deletions(-) mode change 100644 => 100755 deepspeed/comm/comm.py mode change 100644 => 100755 deepspeed/comm/torch.py mode change 100644 => 100755 deepspeed/runtime/engine.py create mode 100644 deepspeed/sequence/cross_entropy.py mode change 100644 => 100755 deepspeed/utils/groups.py create mode 100644 tests/unit/sequence_parallelism/test_ulysses.py diff --git a/deepspeed/__init__.py b/deepspeed/__init__.py index fe0043547860..d8655299282f 100755 --- a/deepspeed/__init__.py +++ b/deepspeed/__init__.py @@ -77,6 +77,7 @@ def initialize(args=None, dist_init_required: Optional[bool] = None, collate_fn=None, config=None, + mesh_param=None, config_params=None): """Initialize the DeepSpeed Engine. @@ -144,10 +145,22 @@ def initialize(args=None, distributed_port=distributed_port, dist_init_required=dist_init_required) + ##TODO: combine reuse mpu as mesh device and vice versa # Set config using config_params for backwards compat if config is None and config_params is not None: config = config_params + mesh_device = None + if mesh_param: + logger.info(f"mesh_param to Initialize mesh device: {mesh_param}") + mesh_device = dist.initialize_mesh_device(mesh_param, ("data_parallel", "sequence_parallel")) + #if config file has sequence parallelize and data parallelize, then use them to initialize mesh device + elif config is not None: + if "sequence_parallel_size" in config and "data_parallel_size" in config: + logger.info(f"config to Initialize mesh device: {config}") + mesh_device = dist.initialize_mesh_device((config["data_parallel_size"], config["sequence_parallel_size"]), \ + ("data_parallel", "sequence_parallel")) + # Check for deepscale_config for backwards compat if hasattr(args, "deepscale_config") and args.deepscale_config is not None: logger.warning("************ --deepscale_config is deprecated, please use --deepspeed_config ************") @@ -162,9 +175,8 @@ def initialize(args=None, assert config is None, "Not sure how to proceed, we were given deepspeed configs in the deepspeed arguments and deepspeed.initialize() function call" config = args.deepspeed_config assert config is not None, "DeepSpeed requires --deepspeed_config to specify configuration file" - if not isinstance(model, PipelineModule): - config_class = DeepSpeedConfig(config, mpu) + config_class = DeepSpeedConfig(config, mpu, mesh_device=mesh_device) if config_class.hybrid_engine.enabled: engine = DeepSpeedHybridEngine(args=args, model=model, @@ -188,6 +200,7 @@ def initialize(args=None, dist_init_required=dist_init_required, collate_fn=collate_fn, config=config, + mesh_device=mesh_device, config_class=config_class) else: assert mpu is None, "mpu must be None with pipeline parallelism" @@ -208,7 +221,12 @@ def initialize(args=None, # Restore zero.Init context if necessary zero.partition_parameters.restore_init_context() - return_items = [engine, engine.optimizer, engine.training_dataloader, engine.lr_scheduler] + return_items = [ + engine, + engine.optimizer, + engine.training_dataloader, + engine.lr_scheduler, + ] return tuple(return_items) diff --git a/deepspeed/comm/comm.py b/deepspeed/comm/comm.py old mode 100644 new mode 100755 index 85b7fab2c548..2895e0f2e011 --- a/deepspeed/comm/comm.py +++ b/deepspeed/comm/comm.py @@ -600,6 +600,21 @@ def get_all_ranks_from_group(group=None): return group_ranks +def initialize_mesh_device(mesh_shape, mesh_dim_names): + global cdb + assert cdb is not None and cdb.is_initialized( + ), 'DeepSpeed backend not set, please initialize it using init_process_group()' + mesh_device = None + if hasattr(cdb, 'init_device_mesh'): + utils.logger.info(f"Initializing mesh device with backend {cdb.name} \ + with shape {mesh_shape} and dim names {mesh_dim_names}") + mesh_device = cdb.init_device_mesh(mesh_shape, mesh_dim_names) + else: + if get_rank() == 0: + utils.logger.warning_once(f"Backend {cdb.name} does not support mesh device initialization") + return mesh_device + + # Main DeepSpeed Comms. public API. def init_distributed(dist_backend=None, auto_mpi_discovery=True, diff --git a/deepspeed/comm/torch.py b/deepspeed/comm/torch.py old mode 100644 new mode 100755 index 83754e98f033..ed2645d415c4 --- a/deepspeed/comm/torch.py +++ b/deepspeed/comm/torch.py @@ -386,6 +386,14 @@ def _reduce_op(self, op): op = torch.distributed.ReduceOp.BXOR return op + def init_device_mesh(self, mesh_shape, mesh_dim_names): + if not required_torch_version(min_version=2.2): + raise RuntimeError(f"Current torch version does not have device mesh" + f"api (torch.__version__: {torch.__version__})") + return torch.distributed.device_mesh.init_device_mesh(get_accelerator().current_device_name(), + mesh_shape, + mesh_dim_names=mesh_dim_names) + # This will become a light-weight wrapper around torch.distributed functions # TODO: create some example to show how this wrapper can help profile communication diff --git a/deepspeed/runtime/config.py b/deepspeed/runtime/config.py index b49b4a8b6086..8be2f7ac4055 100755 --- a/deepspeed/runtime/config.py +++ b/deepspeed/runtime/config.py @@ -705,7 +705,7 @@ def write_config(self, filename): class DeepSpeedConfig(object): - def __init__(self, config: Union[str, dict], mpu=None): + def __init__(self, config: Union[str, dict], mpu=None, mesh_device=None): super(DeepSpeedConfig, self).__init__() if isinstance(config, dict): self._param_dict = config @@ -721,14 +721,16 @@ def __init__(self, config: Union[str, dict], mpu=None): ) try: self.global_rank = dist.get_rank() - if mpu is None: - self.world_size = dist.get_world_size() - else: + if mpu is not None: self.world_size = mpu.get_data_parallel_world_size() + elif mesh_device is not None: + self.world_size = dist.get_world_size(mesh_device.get_group(mesh_dim="data_parallel")) + else: + self.world_size = dist.get_world_size() except: self.global_rank = 0 self.world_size = 1 - + logger.info(f"Config mesh_device {mesh_device} world_size = {self.world_size}") # If elastic-mode enabled, update compute + update _param_dict self.elasticity_enabled = elasticity_enabled(self._param_dict) if self.elasticity_enabled: diff --git a/deepspeed/runtime/engine.py b/deepspeed/runtime/engine.py old mode 100644 new mode 100755 index 27d294b3ae01..61e6da2663cf --- a/deepspeed/runtime/engine.py +++ b/deepspeed/runtime/engine.py @@ -194,6 +194,7 @@ def __init__(self, collate_fn=None, config=None, config_class=None, + mesh_device=None, dont_change_device=False): super(DeepSpeedEngine, self).__init__() self.dont_change_device = dont_change_device @@ -233,10 +234,14 @@ def __init__(self, self._is_gradient_accumulation_boundary = None self.scale_wrt_gas = None self.losses = None + self.mesh_device = mesh_device # for debug purposes - can then debug print: debug_get_module_name(module) debug_extract_module_and_param_names(model) + if self.mesh_device: + groups.mesh_device = self.mesh_device + self._do_args_sanity_check(args) self._configure_with_arguments(args, mpu) self._do_sanity_check() @@ -615,6 +620,9 @@ def random_ltd_initialize(self): raise ValueError(f'not yet support') #self.lr_scheduler = lr_schedules.WarmupLayerTokenDecayLR(self.optimizer, self.random_ltd_scheduler) + def get_sequence_parallel_group(self): + return self.seq_parallel_group + def wall_clock_breakdown(self): return self._config.wall_clock_breakdown @@ -1187,6 +1195,7 @@ def _configure_distributed_model(self, model): self.sequence_parallel_size = groups._get_sequence_parallel_world_size() if self.sequence_parallel_size > 1: self.communication_data_type = self._config.seq_parallel_communication_data_type + self.seq_parallel_group = groups._get_sequence_parallel_group() if not (self.amp_enabled() or is_zero_init_model): self._broadcast_model() diff --git a/deepspeed/sequence/cross_entropy.py b/deepspeed/sequence/cross_entropy.py new file mode 100644 index 000000000000..baa7bc1ea7a8 --- /dev/null +++ b/deepspeed/sequence/cross_entropy.py @@ -0,0 +1,60 @@ +# Copyright (c) Microsoft Corporation. +# SPDX-License-Identifier: Apache-2.0 + +# DeepSpeed Team + +import torch + +import deepspeed.comm as dist + + +class _VocabSequenceParallelCrossEntropy(torch.autograd.Function): + + @staticmethod + def forward(ctx, vocab_seq_parallel_logits, target, sp_group): + # vocab_seq_parallel_logits: [S/P, B, V] + # target: [S/P, B] + # return: [S, B] + + # Need softmax for backward + softmax = torch.nn.functional.softmax(vocab_seq_parallel_logits, dim=-1) + ctx.vocab_size = vocab_seq_parallel_logits.size(2) + loss = torch.nn.functional.nll_loss(softmax.log().view(-1, ctx.vocab_size), target.view(-1), reduction='none') + + sp_world_size = dist.get_world_size(sp_group) + sp_rank = dist.get_rank(sp_group) + ctx.sp_world_size = sp_world_size + ctx.sp_rank = sp_rank + ctx.seqlen = vocab_seq_parallel_logits.size(0) * sp_world_size + batch_size = vocab_seq_parallel_logits.size(1) + + loss_all = torch.empty(ctx.seqlen, + batch_size, + dtype=vocab_seq_parallel_logits.dtype, + device=vocab_seq_parallel_logits.device) + dist.all_gather_into_tensor(loss_all, loss, group=sp_group) + + ctx.save_for_backward(softmax, target) + + return loss_all + + @staticmethod + def backward(ctx, grad_output): + softmax, target = ctx.saved_tensors + + step_seqlen = ctx.seqlen // ctx.sp_world_size + sp_rank = ctx.sp_rank + grad_output_part = grad_output[step_seqlen * sp_rank:step_seqlen * (sp_rank + 1), :] + + grad_input = softmax + grad_2d = grad_input.view(-1, ctx.vocab_size) + arange_1d = torch.arange(start=0, end=grad_2d.size()[0], device=grad_2d.device) + + grad_2d[arange_1d, target.view(-1)] -= 1 + grad_input.mul_(grad_output_part.unsqueeze(dim=-1)) + + return grad_input, None, None, None + + +def vocab_sequence_parallel_cross_entropy(vocab_parallel_logits, target, sp_group): + return _VocabSequenceParallelCrossEntropy.apply(vocab_parallel_logits, target, sp_group) diff --git a/deepspeed/utils/groups.py b/deepspeed/utils/groups.py old mode 100644 new mode 100755 index c49f4520e16e..9dd288ef46db --- a/deepspeed/utils/groups.py +++ b/deepspeed/utils/groups.py @@ -30,6 +30,7 @@ from deepspeed.utils.bwc import bwc_tensor_model_parallel_world_size, bwc_pipeline_parallel_world_size from deepspeed.utils.exceptions import DeprecatedException from deepspeed.accelerator import get_accelerator + # Expert parallel group that the current rank belongs to. _EXPERT_PARALLEL_GROUP = {} # Expert data parallel group that the current rank belongs to. @@ -47,6 +48,8 @@ _DATA_PARALLEL_GROUP = None +mesh_device = None + # Deprecated groups initialize function. def initialize(ep_size=1, mpu=None): @@ -398,8 +401,11 @@ def _get_data_parallel_group(): """Get the data parallel group the caller rank belongs to.""" assert dist.is_initialized(), 'dist is not initialized' global mpu + if mesh_device is not None: + return mesh_device.get_group(mesh_dim="data_parallel") if mpu is not None: return mpu.get_data_parallel_group() + # Return the clone of dist world group return _clone_world_group() @@ -442,6 +448,8 @@ def _get_expert_data_parallel_rank(group_name): def _get_data_parallel_world_size(): """Return world size for the data parallel group.""" + if mesh_device is not None: + return dist.get_world_size(mesh_device.get_group(mesh_dim="data_parallel")) global mpu if mpu is not None: return mpu.get_data_parallel_world_size() @@ -464,6 +472,8 @@ def _get_data_parallel_rank(): def _get_sequence_parallel_world_size(): """Return world size for the model parallel group.""" global mpu + if mesh_device is not None: + return dist.get_world_size(mesh_device.get_group(mesh_dim="sequence_parallel")) if mpu is not None and hasattr(mpu, 'get_sequence_parallel_world_size'): return mpu.get_sequence_parallel_world_size() return 1 @@ -479,9 +489,11 @@ def _get_sequence_parallel_rank(): def _get_sequence_parallel_group(): global mpu - if mpu is not None and hasattr(mpu, 'get_sequence_parallel_group'): - return mpu.get_sequence_parallel_group() - return None + if mpu is None or not hasattr(mpu, 'get_sequence_parallel_group'): + if mesh_device is None: + raise KeyError("No sequence parallel group found") + return mesh_device.get_group(mesh_dim="sequence_parallel") + return mpu.get_sequence_parallel_group() def _get_sequence_data_parallel_world_size(): diff --git a/tests/unit/sequence_parallelism/test_ulysses.py b/tests/unit/sequence_parallelism/test_ulysses.py new file mode 100644 index 000000000000..915c89e0b00a --- /dev/null +++ b/tests/unit/sequence_parallelism/test_ulysses.py @@ -0,0 +1,77 @@ +# Copyright (c) Microsoft Corporation. +# SPDX-License-Identifier: Apache-2.0 + +# DeepSpeed Team + +import pytest +import torch +import deepspeed.comm as dist +from deepspeed import initialize +from transformers import AutoModel +from unit.common import DistributedTest +from deepspeed.sequence.layer import _SeqAllToAll +from unit.util import skip_on_arch + + +#Use mesh device to create data and sequence parallel group +class TestUlyssesUtils(DistributedTest): + world_size = 4 + + def test_mesh_device_creation(self) -> None: + skip_on_arch(min_arch=8) + model = AutoModel.from_pretrained('bert-base-uncased') + sp_size = 2 + dp_size = 2 + ds_engine, _, _, _ = initialize( + model=model, + config_params={ + "train_batch_size": 8, + "data_parallel_size": dp_size, + "sequence_parallel_size": sp_size + }, + ) + assert ds_engine.seq_parallel_group is not None + assert ds_engine.data_parallel_group is not None + assert dist.get_world_size(group=ds_engine.seq_parallel_group) == sp_size + assert dist.get_world_size(group=ds_engine.data_parallel_group) == dp_size + assert dist.get_world_size() == sp_size * dp_size + + +#Sweep b,s,h,d to test all2all consistency +@pytest.mark.parametrize("d0", [2, 4]) #batch or sequence dimension +@pytest.mark.parametrize("d1", [4, 8]) #batch or sequence dimension +@pytest.mark.parametrize("num_heads", [4, 8]) +@pytest.mark.parametrize("head_dim", [16, 32]) +class TestUlyssesAll2All(DistributedTest): + world_size = 4 + + def test_alltoall_output_consistency(self, d0: int, d1: int, head_dim: int, num_heads: int) -> None: + skip_on_arch(min_arch=8) + model = AutoModel.from_pretrained('bert-base-uncased') + ds_engine, _, _, _ = initialize(model=model, config_params={"train_batch_size": 8}, mesh_param=(2, 2)) + #4D tensor : b,s,h,d or s,b,h,d + input_tensor = torch.randn(d0, d1, num_heads, head_dim, device=ds_engine.device) + scatter_idx = 2 + batch_dim_idx = 0 + outputs = [] + seq_dims = [0] #seq first API + #TODO: Add support for batch first (that seq_dims=[0,1]) after PR for bs>1 issue with batch first is fixed + ## See discussion in : https://github.com/microsoft/DeepSpeed/issues/5808 + for seq_dim in seq_dims: + gather_idx = seq_dim + #first all2all: sequence parallel to head parallel + s2h_tensor = _SeqAllToAll.apply(ds_engine.seq_parallel_group, input_tensor, scatter_idx, gather_idx, + batch_dim_idx) + + #No op + # second all2all: head parallel to sequence parallel + h2s_tensor = _SeqAllToAll.apply(ds_engine.seq_parallel_group, s2h_tensor, gather_idx, scatter_idx, + batch_dim_idx) + print( + f'[{dist.get_rank()}] s={seq_dim} input: {input_tensor.shape} s2h: {s2h_tensor.shape} h2s_tensor: {h2s_tensor.shape}' + ) + outputs.append(h2s_tensor) + + # Check outputs are the same as input + for i in range(1, len(outputs)): + assert torch.allclose(input_tensor, outputs[i]), f"Outputs differ for sequence dim {seq_dims[i]}" From 7260890452eb89185f9ab1e09550938f78ea91db Mon Sep 17 00:00:00 2001 From: ranzhejiang Date: Thu, 22 Aug 2024 05:52:48 +0800 Subject: [PATCH 476/754] reduce cpu host overhead when using moe (#5578) The operation `.to('cpu') `is not necessary for exp_counts, and it will cause device to host synchronization which damage performance. Co-authored-by: Olatunji Ruwase --- deepspeed/moe/sharded_moe.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/deepspeed/moe/sharded_moe.py b/deepspeed/moe/sharded_moe.py index c09a11e213db..340bc82de508 100644 --- a/deepspeed/moe/sharded_moe.py +++ b/deepspeed/moe/sharded_moe.py @@ -208,7 +208,7 @@ def top1gating(logits: Tensor, mask1 = einsum("s,se->se", used_token, mask1) # gating decisions - exp_counts = torch.sum(mask1, dim=0).detach().to('cpu') + exp_counts = torch.sum(mask1, dim=0).detach().to(logits.device) # if we don't want to drop any tokens if not drop_tokens: @@ -324,7 +324,7 @@ def top2gating(logits: Tensor, l_aux = torch.mean(me * ce) * num_experts * num_experts # gating decisions - exp_counts = torch.sum(mask1 + mask2, dim=0) + exp_counts = torch.sum(mask1 + mask2, dim=0).detach().to(logits.device) if drop_tokens: # Calculate configured capacity and remove locations outside capacity from mask @@ -368,7 +368,7 @@ def top2gating(logits: Tensor, combine_weights = combine1_sec + combine2_sec dispatch_mask = combine_weights.bool() - return l_aux, combine_weights, dispatch_mask, exp_counts.detach().to('cpu') + return l_aux, combine_weights, dispatch_mask, exp_counts def topkgating( From e6fcc226c728ba99a09cda9d196f93986b489edd Mon Sep 17 00:00:00 2001 From: Perry Zou Date: Thu, 22 Aug 2024 07:59:39 +0800 Subject: [PATCH 477/754] fix fp16 Qwen2 series model to DeepSpeed-FastGen (#6028) based on PR #5403 (Qwen1.5-MOE) and #5219 (Qwen1.5), support Qwen2 series model. including: 0.5B, 1.5B, 7B, 57B-A14B, and 72B models. Co-authored-by: Logan Adams <114770087+loadams@users.noreply.github.com> --- .../v2/checkpoint/huggingface_engine.py | 6 +++ .../kernels/ragged_ops/includes/top_k_utils.h | 3 ++ .../blocked_kv_rotary.py | 2 +- .../blocked_kv_rotary_cuda.cu | 2 + .../qwen_v2_moe/container.py | 40 +++++++++---------- .../qwen_v2_moe/model.py | 2 +- .../implementations/moe/cutlass_multi_gemm.py | 2 +- 7 files changed, 34 insertions(+), 23 deletions(-) diff --git a/deepspeed/inference/v2/checkpoint/huggingface_engine.py b/deepspeed/inference/v2/checkpoint/huggingface_engine.py index 77dfa7a23b1e..d88d99ebebfd 100644 --- a/deepspeed/inference/v2/checkpoint/huggingface_engine.py +++ b/deepspeed/inference/v2/checkpoint/huggingface_engine.py @@ -108,6 +108,12 @@ def parameters(self) -> Iterable[Tuple[str, torch.Tensor]]: for checkpoint in self._all_ckpt_paths: inference_logger().info(f"Loading checkpoint: {checkpoint}") checkpoint_sd = self._checkpoint_load_fn(checkpoint) + + # If the model has tied embeddings, we need to make sure the lm_head weights are tied to the embeddings weights + if hasattr(self.model_config, "tie_word_embeddings") and self.model_config.tie_word_embeddings: + if self.model_config.model_type == "qwen2": + checkpoint_sd["lm_head.weight"] = checkpoint_sd["model.embed_tokens.weight"] + param_keys = list(checkpoint_sd.keys()) for param_name in param_keys: param = checkpoint_sd[param_name] diff --git a/deepspeed/inference/v2/kernels/ragged_ops/includes/top_k_utils.h b/deepspeed/inference/v2/kernels/ragged_ops/includes/top_k_utils.h index 2cc430ccfe34..f5104f899d9c 100644 --- a/deepspeed/inference/v2/kernels/ragged_ops/includes/top_k_utils.h +++ b/deepspeed/inference/v2/kernels/ragged_ops/includes/top_k_utils.h @@ -14,5 +14,8 @@ } else if (4 == N_TOP_K) { \ constexpr int CONST_TOP_K = 4; \ __VA_ARGS__(); \ + } else if (8 == N_TOP_K) { \ + constexpr int CONST_TOP_K = 8; \ + __VA_ARGS__(); \ } \ }() diff --git a/deepspeed/inference/v2/kernels/ragged_ops/linear_blocked_kv_rotary/blocked_kv_rotary.py b/deepspeed/inference/v2/kernels/ragged_ops/linear_blocked_kv_rotary/blocked_kv_rotary.py index 7e1ec1a13cb9..aacbec0bd3ae 100644 --- a/deepspeed/inference/v2/kernels/ragged_ops/linear_blocked_kv_rotary/blocked_kv_rotary.py +++ b/deepspeed/inference/v2/kernels/ragged_ops/linear_blocked_kv_rotary/blocked_kv_rotary.py @@ -19,7 +19,7 @@ class BlockedRotaryEmbeddings(DSKernelBase): supported_dtypes = [DtypeEnum.fp16, DtypeEnum.bf16] supported_head_sizes = [64, 80, 96, 128] - supported_q_ratios = [1, 2, 4, 5, 8, 16, 29, 35, 36, 71] + supported_q_ratios = [1, 2, 4, 5, 6, 7, 8, 16, 29, 35, 36, 71] def __init__(self, head_size: int, n_q_heads: int, n_kv_heads: int, dtype: torch.dtype, rotary_dim: int, theta_base: float) -> None: diff --git a/deepspeed/inference/v2/kernels/ragged_ops/linear_blocked_kv_rotary/blocked_kv_rotary_cuda.cu b/deepspeed/inference/v2/kernels/ragged_ops/linear_blocked_kv_rotary/blocked_kv_rotary_cuda.cu index fbafece5ccf2..f7bc693eefee 100644 --- a/deepspeed/inference/v2/kernels/ragged_ops/linear_blocked_kv_rotary/blocked_kv_rotary_cuda.cu +++ b/deepspeed/inference/v2/kernels/ragged_ops/linear_blocked_kv_rotary/blocked_kv_rotary_cuda.cu @@ -265,6 +265,8 @@ void launch_kv_rotary_kernel(T* kv_cache, LAUNCH_KV_ROTARY_FOR_Q_RATIO(2) LAUNCH_KV_ROTARY_FOR_Q_RATIO(4) LAUNCH_KV_ROTARY_FOR_Q_RATIO(5) + LAUNCH_KV_ROTARY_FOR_Q_RATIO(6) + LAUNCH_KV_ROTARY_FOR_Q_RATIO(7) LAUNCH_KV_ROTARY_FOR_Q_RATIO(8) LAUNCH_KV_ROTARY_FOR_Q_RATIO(16) LAUNCH_KV_ROTARY_FOR_Q_RATIO(29) diff --git a/deepspeed/inference/v2/model_implementations/qwen_v2_moe/container.py b/deepspeed/inference/v2/model_implementations/qwen_v2_moe/container.py index b4621257ff82..e499379da7e3 100644 --- a/deepspeed/inference/v2/model_implementations/qwen_v2_moe/container.py +++ b/deepspeed/inference/v2/model_implementations/qwen_v2_moe/container.py @@ -8,45 +8,45 @@ from ..common_parameters import * from ..layer_container_base import LayerContainer ''' - # HF Qwen1.5-MoE-A2.7B model looks like this: + # HF Qwen2-57B-A14B model looks like this: Qwen2MoeForCausalLM( (model): Qwen2MoeModel( - (embed_tokens): Embedding(151936, 2048) + (embed_tokens): Embedding(151936, 3584) (layers): ModuleList( - (0-23): 24 x Qwen2MoeDecoderLayer( + (0-27): 28 x Qwen2MoeDecoderLayer( (self_attn): Qwen2MoeSdpaAttention( - (q_proj): Linear(in_features=2048, out_features=2048, bias=True) - (k_proj): Linear(in_features=2048, out_features=2048, bias=True) - (v_proj): Linear(in_features=2048, out_features=2048, bias=True) - (o_proj): Linear(in_features=2048, out_features=2048, bias=False) + (q_proj): Linear(in_features=3584, out_features=3584, bias=True) + (k_proj): Linear(in_features=3584, out_features=512, bias=True) + (v_proj): Linear(in_features=3584, out_features=512, bias=True) + (o_proj): Linear(in_features=3584, out_features=3584, bias=False) (rotary_emb): Qwen2MoeRotaryEmbedding() ) (mlp): Qwen2MoeSparseMoeBlock( - (gate): Linear(in_features=2048, out_features=60, bias=False) + (gate): Linear(in_features=3584, out_features=64, bias=False) (experts): ModuleList( - (0-59): 60 x Qwen2MoeMLP( - (gate_proj): Linear(in_features=2048, out_features=1408, bias=False) - (up_proj): Linear(in_features=2048, out_features=1408, bias=False) - (down_proj): Linear(in_features=1408, out_features=2048, bias=False) + (0-63): 64 x Qwen2MoeMLP( + (gate_proj): Linear(in_features=3584, out_features=2560, bias=False) + (up_proj): Linear(in_features=3584, out_features=2560, bias=False) + (down_proj): Linear(in_features=2560, out_features=3584, bias=False) (act_fn): SiLU() ) ) (shared_expert): Qwen2MoeMLP( - (gate_proj): Linear(in_features=2048, out_features=5632, bias=False) - (up_proj): Linear(in_features=2048, out_features=5632, bias=False) - (down_proj): Linear(in_features=5632, out_features=2048, bias=False) + (gate_proj): Linear(in_features=3584, out_features=20480, bias=False) + (up_proj): Linear(in_features=3584, out_features=20480, bias=False) + (down_proj): Linear(in_features=20480, out_features=3584, bias=False) (act_fn): SiLU() ) - (shared_expert_gate): Linear(in_features=2048, out_features=1, bias=False) + (shared_expert_gate): Linear(in_features=3584, out_features=1, bias=False) ) - (input_layernorm): Qwen2MoeRMSNorm() - (post_attention_layernorm): Qwen2MoeRMSNorm() + (input_layernorm): Qwen2MoeRMSNorm((3584,), eps=1e-06) + (post_attention_layernorm): Qwen2MoeRMSNorm((3584,), eps=1e-06) ) ) - (norm): Qwen2MoeRMSNorm() + (norm): Qwen2MoeRMSNorm((3584,), eps=1e-06) ) - (lm_head): Linear(in_features=2048, out_features=151936, bias=False) + (lm_head): Linear(in_features=3584, out_features=151936, bias=False) ) ''' diff --git a/deepspeed/inference/v2/model_implementations/qwen_v2_moe/model.py b/deepspeed/inference/v2/model_implementations/qwen_v2_moe/model.py index 7cddbf978369..c7841b24e5fc 100644 --- a/deepspeed/inference/v2/model_implementations/qwen_v2_moe/model.py +++ b/deepspeed/inference/v2/model_implementations/qwen_v2_moe/model.py @@ -73,7 +73,7 @@ def n_heads(self) -> int: @property def intermediate_dim(self) -> int: - return self._config.intermediate_size + return self._config.shared_expert_intermediate_size @property def n_heads_kv(self) -> int: diff --git a/deepspeed/inference/v2/modules/implementations/moe/cutlass_multi_gemm.py b/deepspeed/inference/v2/modules/implementations/moe/cutlass_multi_gemm.py index bd90cbd5d697..a9b01d1233cd 100644 --- a/deepspeed/inference/v2/modules/implementations/moe/cutlass_multi_gemm.py +++ b/deepspeed/inference/v2/modules/implementations/moe/cutlass_multi_gemm.py @@ -42,7 +42,7 @@ def supports_config(config: DSMoEConfig) -> bool: if config.input_dtype != torch.float16 and config.input_dtype != torch.bfloat16: return False - if config.top_k != 1 and config.top_k != 2 and config.top_k != 4: + if config.top_k != 1 and config.top_k != 2 and config.top_k != 4 and config.top_k != 8: return False return True From 649b078571e24869852b44a82193ecb1cc01551a Mon Sep 17 00:00:00 2001 From: Masahiro Tanaka <81312776+tohtana@users.noreply.github.com> Date: Wed, 21 Aug 2024 18:24:27 -0700 Subject: [PATCH 478/754] Add Japanese translation of Windows support blog (#6394) This PR adds the Japanese translation of the release blog of Windows support. --- README.md | 2 +- blogs/windows/08-2024/japanese/README.md | 123 +++++++++++++++++++++++ 2 files changed, 124 insertions(+), 1 deletion(-) create mode 100644 blogs/windows/08-2024/japanese/README.md diff --git a/README.md b/README.md index 304169b56777..2f6661ef5860 100755 --- a/README.md +++ b/README.md @@ -16,7 +16,7 @@ DeepSpeed empowers ChatGPT-like model training with a single click, offering 15x speedup over SOTA RLHF systems with unprecedented cost reduction at all scales; [learn how](https://github.com/microsoft/DeepSpeed/tree/master/blogs/deepspeed-chat). - +* [2024/08] [DeepSpeed on Windows](https://github.com/microsoft/DeepSpeed/tree/master/blogs/windows/08-2024/README.md) [[日本語](https://github.com/microsoft/DeepSpeed/tree/master/blogs/windows/08-2024/japanese/README.md)] * [2024/08] [DeepNVMe: Improving DL Applications through I/O Optimizations](https://github.com/microsoft/DeepSpeed/tree/master/blogs/deepspeed-gds/README.md) [[日本語](https://github.com/microsoft/DeepSpeed/tree/master/blogs/deepspeed-gds/japanese/README.md)] * [2024/07] [DeepSpeed Universal Checkpointing: Efficient and Flexible Checkpointing for Large Scale Distributed Training](https://github.com/microsoft/DeepSpeed/tree/master/blogs/deepspeed-ucp/README.md) [[中文](https://github.com/microsoft/DeepSpeed/tree/master/blogs/deepspeed-ucp/chinese/README.md)] [[日本語](https://github.com/microsoft/DeepSpeed/tree/master/blogs/deepspeed-ucp/japanese/README.md)] * [2024/03] [DeepSpeed-FP6:The power of FP6-Centric Serving for Large Language Models](https://github.com/microsoft/DeepSpeed/tree/master/blogs/deepspeed-fp6/03-05-2024) [[English](https://github.com/microsoft/DeepSpeed/tree/master/blogs/deepspeed-fp6/03-05-2024/README.md)] [[中文](https://github.com/microsoft/DeepSpeed/tree/master/blogs/deepspeed-fp6/03-05-2024/README-Chinese.md)] diff --git a/blogs/windows/08-2024/japanese/README.md b/blogs/windows/08-2024/japanese/README.md new file mode 100644 index 000000000000..7e437f737f58 --- /dev/null +++ b/blogs/windows/08-2024/japanese/README.md @@ -0,0 +1,123 @@ +
+ +# DeepSpeedのWindowsサポート + +
+ +# はじめに + +DeepSpeedは、分散学習と推論を簡単かつ効率的に行うための人気のあるオープンソースの深層学習最適化ライブラリです。DeepSpeedは、その豊富かつ高度な最適化機能(例:ZeRO、3D parallelism, MoEなど)のおかげで、Phi-3、Megatron-Turing-530B、BLOOM-176B、Arcticなどの最先端モデルの学習に広く利用されています。しかし、最も普及しているオペレーティングシステムであるMicrosoft Windowsをネイティブにサポートしていなかったため、多くのAI開発者やユーザーが、DeepSpeedの革新的な機能を利用できない状態でした。この問題を解決するため、DeepSpeedの完全な機能をWindows上でネイティブに実行し、Linux上と同じ使いやすさを実現するための取り組みを開始しました。 + +このブログでは、この取り組みの最初の成果をお知らせします。現在、DeepSpeedはWindowsにインストールし、単一GPUでの学習、ファインチューニング、および推論をネイティブに実行できるようになりました。ここで重要なこととして、インストールと利用は、Linuxとまったく同じように行えます。ファインチューニングと推論のワークロードを通じて、HuggingFace Transformers との統合、LoRAのサポート、CPUオフロードの3つの重要なDeepSpeedの機能が、正しく動作していることが確認できました。このWindowsサポートは、バージョン0.14.5以降で利用可能です。このブログの残りの部分では、これらの成果を示す例を紹介します。 + +# テスト環境 + +Windows 11 Version 23H2 および Build 22631.3880 を実行している Surface Laptop Studio 2 でテストを行いました。このハードウェアには、4GBのVRAMを搭載した NVIDIA RTX A2000 GPU が1つ搭載されています。また、PyTorchバージョン 2.3.0 および HuggingFace Transformersバージョン 4.41.2 を使用しました。使用したサンプルスクリプトは[DeepSpeedExamplesリポジトリ](https://github.com/microsoft/DeepSpeedExamples)から取得できます。以下の例を実行する前にリポジトリをクローンしてください。 + +# インストール + +DeepSpeedは、2つの方法でWindowsにインストールできます。より簡単な方法は、pipパッケージマネージャーを使用することで、もう一方はソースからビルドする方法です。どちらの場合も、Python 3.xとCUDAサポート付きのPyTorchが必要です。 + +## pipを使用したインストール + +DeepSpeedをインストールするには、単に次のコマンドを実行します: `pip install deepspeed`。 +これにより、最新バージョンのDeepSpeed(現時点では0.14.5)がインストールされます。Linux版とは異なり、Windows版ではすべてのオペレーターがすでにビルド済みであるため、CUDA SDKやC++コンパイラをインストールする必要はありません。 + +
+ +
+ +
+ pipによるWindowsへのDeepSpeedのインストール +
+ + +## ソースからのビルド + +ソースからDeepSpeedをビルドするには、DeepSpeedリポジトリをクローンし、コンパイルスクリプトである `build_win.bat` を実行する必要があります。 + +## インストールの検証 + +インストール方法にかかわらず、`ds_report`を実行してインストールが成功したかどうかを確認できます。出力は次のようになります: + +
+ +
+ +
+ DeepSpeedのWindowsインストールを確認するds_reportの出力 +
+ +# 事前学習の例 + +Windows上でDeepSpeedを使用した事前学習の例として、画像分類モデルCIFAR10と言語モデルBERTの実行例を示します。 + +## CIFAR10の事前学習 + +CIFAR10の事前学習に必要なスクリプトとコードは、次のパスにあります: `DeepSpeedExamples\training\cifar` + +以下のコマンドを使用してCIFAR10の事前学習を開始できます: `deepspeed cifar10_deepspeed.py –deepspeed` + +出力は次のようになります。 + +
+ +
+ +
+ DeepSpeedによるWindowsでのCIFAR10モデルの事前学習 +
+ +## BERTの事前学習 + +BERTの事前学習に必要なスクリプトとコードは、次のパスにあります: `DeepSpeedExamples\training\HelloDeepSpeed` + +以下のコマンドを使用してBERTの事前学習を開始できます: `deepspeed train_bert_ds.py --checkpoint_dir experiment_deepspeed` + +出力は次のようになります。 + +
+ +
+ +
+ DeepSpeedによるWindowsでのBERTモデルの事前学習 +
+ +# ファインチューニングの例 + +DeepSpeed-Chatアプリケーションの教師ありファインチューニング(supervised fine tuning; SFT)を使用して、ファインチューニングの機能を示します。LoRAおよびCPUオフロードメモリ最適化を有効にして、 HuggingFace の `facebook/opt-125m` モデルのSFTを実施します。この例を実行するためのコマンドラインは次のとおりです: `deepspeed training\step1_supervised_finetuning\main.py --model_name_or_path facebook/opt-125m --gradient_accumulation_steps 8 --lora_dim 128 --only_optimize_lora --print_loss --zero_stage 2 --deepspeed --dtype bf16 --offload --output_dir output` + +出力は次のようになります。 + +
+ +
+ +
+ DeepSpeedを使用したWindowsでの facebook/opt-125m モデルのファインチューニング +
+ +# 推論の例 + +推論の機能を示すために、トークン生成のためのZeRO-Inferenceを使用します。ZeRO-Inferenceは、CPUまたはNVMeメモリにオフロードすることで推論のハードウェアコストを削減します。ここでは、サンプルスクリプトを使用して、HuggingFaceのLlama-2-7Bモデルを使用したトークン生成を実行します。4GBのVRAMではモデルと生成処理の両方を実効するのに十分ではないため、モデルパラメータをCPUメモリにオフロードします。 + +次のコマンドラインを使用して、8トークンのプロンプトから32トークンを生成します: `deepspeed run_model.py --model meta-llama/Llama-2-7b-hf --batch-size 64 --prompt-len 8 --gen-len 32 --cpu-offload` + +出力は次のようになります。 + +
+ +
+ +
+ DeepSpeedのZeRO-InferenceによるWindowsでのLLAMA2-7Bのトークン生成 +
+ +# まとめ + +最も広く使われているオペレーティングシステムであるWindowsで、深層学習フレームワークであるDeepSpeedをネイティブに実行できるようにすることは、多くの人と組織が、今まさに進行中のAI革命の恩恵を受けるための重要な一歩です。このブログでは、この目標に向けたプロジェクトの、最初の成果を共有しました。Windowsのサポートは現在進行中のプロジェクトですが、今回の成果が多くのユーザにとって活用され、またさらに発展していけることを願っています。次のロードマップには、複数のGPUでの実行、モデルパラメータの量子化、パフォーマンスの詳細な分析が含まれます。 + +# 謝辞 + +このプロジェクトは、Costin Eseanu、Logan Adams、Elton Zheng、Reza Yazdani Aminabadi、Martin Cai、Olatunji Ruwaseを含むDeepSpeedメンバーによる大きな貢献の結果です。また、この機能を必要とし、様々な問題の解決策や、建設的なフィードバックを提供し、私たちと共に歩んでくれたDeepSpeedユーザーの重要な貢献に感謝します。 From 0f0f231e8a18e816b68b7c4ebcd3048f75ffdbe0 Mon Sep 17 00:00:00 2001 From: Logan Adams <114770087+loadams@users.noreply.github.com> Date: Thu, 22 Aug 2024 08:38:42 -0700 Subject: [PATCH 479/754] Correct op_builder path to xpu files for trigger XPU tests (#6398) --- .github/workflows/xpu-max1100.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/xpu-max1100.yml b/.github/workflows/xpu-max1100.yml index 1042db100a21..adeeb0acade2 100644 --- a/.github/workflows/xpu-max1100.yml +++ b/.github/workflows/xpu-max1100.yml @@ -21,7 +21,7 @@ on: - "deepspeed/runtime/zero/parameter_offload.py" - "deepspeed/runtime/pipe/engine.py" - "deepspeed/runtime/utils.py" - - "opbuilder/xpu/**" + - "op_builder/xpu/**" concurrency: group: ${{ github.workflow }}-${{ github.ref }} From 51da191eb54b69224edfb7cb4ce69db9a88956f7 Mon Sep 17 00:00:00 2001 From: Guanhua Wang Date: Thu, 22 Aug 2024 10:18:17 -0700 Subject: [PATCH 480/754] add pip install cutlass version check (#6393) fix this issue: https://github.com/microsoft/DeepSpeed/issues/6006 cc. @tjruwase --- op_builder/evoformer_attn.py | 20 ++++++++++++++++++-- 1 file changed, 18 insertions(+), 2 deletions(-) diff --git a/op_builder/evoformer_attn.py b/op_builder/evoformer_attn.py index af3aa7429775..7f68ccf87290 100644 --- a/op_builder/evoformer_attn.py +++ b/op_builder/evoformer_attn.py @@ -52,11 +52,27 @@ def is_compatible(self, verbose=False): if verbose: self.warning("Please specify the CUTLASS repo directory as environment variable $CUTLASS_PATH") return False - with open(f'{self.cutlass_path}/CHANGELOG.md', 'r') as f: - if '3.1.0' not in f.read(): + if os.path.exists(f'{self.cutlass_path}/CHANGELOG.md'): + with open(f'{self.cutlass_path}/CHANGELOG.md', 'r') as f: + if '3.1.0' not in f.read(): + if verbose: + self.warning("Please use CUTLASS version >= 3.1.0") + return False + else: + # pip install nvidia-cutlass package + try: + import cutlass + except ImportError: + if verbose: + self.warning("Please pip install nvidia-cutlass if trying to pre-compile kernels") + return False + cutlass_major, cutlass_minor = cutlass.__version__.split('.')[:2] + cutlass_compatible = (int(cutlass_major) >= 3 and int(cutlass_minor) >= 1) + if not cutlass_compatible: if verbose: self.warning("Please use CUTLASS version >= 3.1.0") return False + cuda_okay = True if not self.is_rocm_pytorch() and torch.cuda.is_available(): #ignore-cuda sys_cuda_major, _ = installed_cuda_version() From b81b197ec333331a92189ea17b35737104715a78 Mon Sep 17 00:00:00 2001 From: Yizhou Wang Date: Fri, 23 Aug 2024 01:24:38 +0800 Subject: [PATCH 481/754] [XPU] API align with new intel pytorch extension release (#6395) with intel_extension_for_pytorch new release, we changed deepspeed kernel API. Need to align with upstream DeepSpeed xpu op builder. Co-authored-by: Logan Adams <114770087+loadams@users.noreply.github.com> --- op_builder/xpu/inference.py | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/op_builder/xpu/inference.py b/op_builder/xpu/inference.py index 9114dcc2c315..a9ac4f84c2ca 100644 --- a/op_builder/xpu/inference.py +++ b/op_builder/xpu/inference.py @@ -30,7 +30,10 @@ def cxx_args(self): def load(self): try: - import intel_extension_for_pytorch.deepspeed - return intel_extension_for_pytorch.deepspeed.transformer_inference.transformer_inference + import intel_extension_for_pytorch + if hasattr(intel_extension_for_pytorch, "deepspeed"): + return intel_extension_for_pytorch.deepspeed.transformer_inference.transformer_inference + else: + return intel_extension_for_pytorch.xpu.deepspeed except ImportError: raise ImportError("Please install intel-extension-for-pytorch >= 2.1.30 to include DeepSpeed kernels.") From 8c2be7e942ab219989a7c84a714e94c5e2cf7310 Mon Sep 17 00:00:00 2001 From: Logan Adams Date: Thu, 22 Aug 2024 15:37:17 -0700 Subject: [PATCH 482/754] Update to prepare for next release --- version.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/version.txt b/version.txt index 226468ee5b2e..a5510516948f 100644 --- a/version.txt +++ b/version.txt @@ -1 +1 @@ -0.14.6 +0.15.0 From 0a4457cc48a3d5b926d3e85096dfed00831a7058 Mon Sep 17 00:00:00 2001 From: Michael Wyatt Date: Thu, 22 Aug 2024 15:38:13 -0700 Subject: [PATCH 483/754] Pydantic v2 migration (#5167) Pydantic v2 has been out for some time now. We have been relying on using the v1 API available in v2 until now. This is a refresh of #3902 to bring proper v2 support to DeepSpeed. Corresponding DeepSpeed-MII PR [here](https://github.com/microsoft/DeepSpeed-MII/pull/423). @loadams --------- Co-authored-by: Logan Adams <114770087+loadams@users.noreply.github.com> Co-authored-by: Logan Adams Co-authored-by: Olatunji Ruwase Co-authored-by: Abhishek Kulkarni <11399+adk9@users.noreply.github.com> Co-authored-by: Abhishek Kulkarni Co-authored-by: Lev Kurilenko <113481193+lekurile@users.noreply.github.com> --- .github/workflows/nv-a6000.yml | 3 +- deepspeed/comm/config.py | 14 +-- deepspeed/inference/config.py | 119 +++++++++--------- deepspeed/inference/v2/config_v2.py | 3 +- .../flat_model_helpers.py | 8 +- .../inference/v2/ragged/manager_configs.py | 14 +-- deepspeed/monitor/config.py | 16 +-- deepspeed/pydantic_v1.py | 16 --- deepspeed/runtime/config_utils.py | 79 ++++++------ deepspeed/runtime/zero/config.py | 69 +++++----- deepspeed/runtime/zero/offload_config.py | 19 +-- deepspeed/runtime/zero/stage_1_and_2.py | 5 +- requirements/requirements-readthedocs.txt | 4 +- requirements/requirements.txt | 2 +- .../v2/ragged/test_manager_configs.py | 2 +- tests/unit/runtime/test_ds_config_dict.py | 2 - tests/unit/runtime/test_ds_config_model.py | 17 ++- 17 files changed, 201 insertions(+), 191 deletions(-) delete mode 100644 deepspeed/pydantic_v1.py diff --git a/.github/workflows/nv-a6000.yml b/.github/workflows/nv-a6000.yml index 3ce406948432..484948b28e34 100644 --- a/.github/workflows/nv-a6000.yml +++ b/.github/workflows/nv-a6000.yml @@ -47,7 +47,8 @@ jobs: - name: Install deepspeed run: | python -m pip install docutils==0.18.1 jinja2==3.0 urllib3==1.26.11 ninja - python -m pip install pydantic==1.10.11 + # Update packages included in the container that do not support pydantic 2+ to versions that do + python -m pip install thinc spacy confection --upgrade python -m pip install .[dev,1bit,autotuning,inf] ds_report - name: Python environment diff --git a/deepspeed/comm/config.py b/deepspeed/comm/config.py index 1c441bb6bfe9..57501c9dd237 100644 --- a/deepspeed/comm/config.py +++ b/deepspeed/comm/config.py @@ -3,20 +3,12 @@ # DeepSpeed Team -from .constants import * -from ..pydantic_v1 import BaseModel - +from deepspeed.runtime.config_utils import DeepSpeedConfigModel -class CommsConfig(BaseModel): - - class Config: - validate_all = True - validate_assignment = True - use_enum_values = True - extra = 'forbid' +from .constants import * -class CommsLoggerConfig(CommsConfig): +class CommsLoggerConfig(DeepSpeedConfigModel): enabled: bool = COMMS_LOGGER_ENABLED_DEFAULT prof_all: bool = COMMS_LOGGER_PROF_ALL_DEFAULT prof_ops: list = COMMS_LOGGER_PROF_OPS_DEFAULT diff --git a/deepspeed/inference/config.py b/deepspeed/inference/config.py index 1d5018aaa75b..c7c7684fff79 100644 --- a/deepspeed/inference/config.py +++ b/deepspeed/inference/config.py @@ -5,38 +5,25 @@ import torch import deepspeed -from deepspeed.pydantic_v1 import Field, validator +from pydantic import Field, field_validator from deepspeed.runtime.config_utils import DeepSpeedConfigModel from deepspeed.runtime.zero.config import DeepSpeedZeroConfig -from typing import Dict, Union +from typing import Dict, Union, Optional from enum import Enum class DtypeEnum(Enum): - # The torch dtype must always be the first value (so we return torch.dtype) - fp16 = torch.float16, "torch.float16", "fp16", "float16", "half" - fp32 = torch.float32, "torch.float32", "fp32", "float32", "float" - bf16 = torch.bfloat16, "torch.bfloat16", "bf16", "bfloat16", "bfloat" - int8 = torch.int8, "torch.int8", "int8" - - # Copied from https://stackoverflow.com/a/43210118 - # Allows us to use multiple values for each Enum index and returns first - # listed value when Enum is called - def __new__(cls, *values): - obj = object.__new__(cls) - # first value is canonical value - obj._value_ = values[0] - for other_value in values[1:]: - cls._value2member_map_[other_value] = obj - obj._all_values = values - return obj - - def __repr__(self): - return "<%s.%s: %s>" % ( - self.__class__.__name__, - self._name_, - ", ".join([repr(v) for v in self._all_values]), - ) + fp16 = (torch.float16, "torch.float16", "fp16", "float16", "half") + fp32 = (torch.float32, "torch.float32", "fp32", "float32", "float") + bf16 = (torch.bfloat16, "torch.bfloat16", "bf16", "bfloat16", "bfloat") + int8 = (torch.int8, "torch.int8", "int8") + + @classmethod + def from_str(cls, value: str): + for dtype in cls: + if value in dtype.value: + return dtype + raise ValueError(f"'{value}' is not a valid DtypeEnum") class MoETypeEnum(str, Enum): @@ -91,24 +78,24 @@ class QuantTypeEnum(str, Enum): class BaseQuantConfig(DeepSpeedConfigModel): - enabled = True - num_bits = 8 + enabled: bool = True + num_bits: int = 8 q_type: QuantTypeEnum = QuantTypeEnum.sym q_groups: int = 1 class WeightQuantConfig(BaseQuantConfig): - enabled = True + enabled: bool = True quantized_initialization: Dict = {} post_init_quant: Dict = {} class ActivationQuantConfig(BaseQuantConfig): - enabled = True + enabled: bool = True class QKVQuantConfig(DeepSpeedConfigModel): - enabled = True + enabled: bool = True class QuantizationConfig(DeepSpeedConfigModel): @@ -120,9 +107,9 @@ class QuantizationConfig(DeepSpeedConfigModel): # todo: brainstorm on how to do ckpt loading for DS inference class InferenceCheckpointConfig(DeepSpeedConfigModel): - checkpoint_dir: str = None - save_mp_checkpoint_path: str = None - base_dir: str = None + checkpoint_dir: Optional[str] = None + save_mp_checkpoint_path: Optional[str] = None + base_dir: Optional[str] = None class DeepSpeedInferenceConfig(DeepSpeedConfigModel): @@ -136,7 +123,7 @@ class DeepSpeedInferenceConfig(DeepSpeedConfigModel): `(attention_output projection, transformer output projection)` """ - dtype: DtypeEnum = torch.float16 + dtype: torch.dtype = torch.float16 """ Desired model data type, will convert model to this type. Supported target types: `torch.half`, `torch.int8`, `torch.float` @@ -198,7 +185,7 @@ class DeepSpeedInferenceConfig(DeepSpeedConfigModel): """ #todo: refactor the following 3 into the new checkpoint_config - checkpoint: Union[str, Dict] = None + checkpoint: Optional[Union[str, Dict]] = None """ Path to deepspeed compatible checkpoint or path to JSON with load policy. """ @@ -214,7 +201,7 @@ class DeepSpeedInferenceConfig(DeepSpeedConfigModel): specifying whether the inference-module is created with empty or real Tensor """ - save_mp_checkpoint_path: str = None + save_mp_checkpoint_path: Optional[str] = None """ The path for which we want to save the loaded model with a checkpoint. This feature is used for adjusting the parallelism degree to help alleviate the @@ -243,19 +230,21 @@ class DeepSpeedInferenceConfig(DeepSpeedConfigModel): replace_method: str = Field( "auto", - deprecated=True, - deprecated_msg="This parameter is no longer needed, please remove from your call to DeepSpeed-inference") + json_schema_extra={ + "deprecated": True, + "deprecated_msg": "This parameter is no longer needed, please remove from your call to DeepSpeed-inference" + }) - injection_policy: Dict = Field(None, alias="injection_dict") + injection_policy: Optional[Dict] = Field(None, alias="injection_dict") """ Dictionary mapping a client nn.Module to its corresponding injection policy. e.g., `{BertLayer : deepspeed.inference.HFBertLayerPolicy}` """ - injection_policy_tuple: tuple = None + injection_policy_tuple: Optional[tuple] = None """ TODO: Add docs """ - config: Dict = Field(None, alias="args") # todo: really no need for this field if we can refactor + config: Optional[Dict] = Field(None, alias="args") # todo: really no need for this field if we can refactor max_out_tokens: int = Field(1024, alias="max_tokens") """ @@ -274,31 +263,49 @@ class DeepSpeedInferenceConfig(DeepSpeedConfigModel): transposed_mode: bool = Field(False, alias="transposed_mode") - mp_size: int = Field(1, deprecated=True, new_param="tensor_parallel.tp_size") + mp_size: int = Field(1, json_schema_extra={"deprecated": True, "new_param": "tensor_parallel.tp_size"}) """ Desired model parallel size, default is 1 meaning no model parallelism. Deprecated, please use the ``tensor_parallel` config to control model parallelism. """ - mpu: object = Field(None, deprecated=True, new_param="tensor_parallel.mpu") - ep_size: int = Field(1, deprecated=True, new_param="moe.ep_size") - ep_group: object = Field(None, alias="expert_group", deprecated=True, new_param="moe.ep_group") - ep_mp_group: object = Field(None, alias="expert_mp_group", deprecated=True, new_param="moe.ep_mp_group") - moe_experts: list = Field([1], deprecated=True, new_param="moe.moe_experts") - moe_type: MoETypeEnum = Field(MoETypeEnum.standard, deprecated=True, new_param="moe.type") - - @validator("moe") + mpu: object = Field(None, json_schema_extra={"deprecated": True, "new_param": "tensor_parallel.mpu"}) + ep_size: int = Field(1, json_schema_extra={"deprecated": True, "new_param": "moe.ep_size"}) + ep_group: object = Field(None, + alias="expert_group", + json_schema_extra={ + "deprecated": True, + "new_param": "moe.ep_group" + }) + ep_mp_group: object = Field(None, + alias="expert_mp_group", + json_schema_extra={ + "deprecated": True, + "new_param": "moe.ep_mp_group" + }) + moe_experts: list = Field([1], json_schema_extra={"deprecated": True, "new_param": "moe.moe_experts"}) + moe_type: MoETypeEnum = Field(MoETypeEnum.standard, + json_schema_extra={ + "deprecated": True, + "new_param": "moe.type" + }) + + @field_validator("dtype", mode="before") + def validate_dtype(cls, field_value, values): + if isinstance(field_value, str): + return DtypeEnum.from_str(field_value).value[0] + if isinstance(field_value, torch.dtype): + return field_value + raise TypeError(f"Invalid type for dtype: {type(field_value)}") + + @field_validator("moe") def moe_backward_compat(cls, field_value, values): if isinstance(field_value, bool): return DeepSpeedMoEConfig(moe=field_value) return field_value - @validator("use_triton") + @field_validator("use_triton") def has_triton(cls, field_value, values): if field_value and not deepspeed.HAS_TRITON: raise ValueError('Triton needs to be installed to use deepspeed with triton kernels') return field_value - - class Config: - # Get the str representation of the datatype for serialization - json_encoders = {torch.dtype: lambda x: str(x)} diff --git a/deepspeed/inference/v2/config_v2.py b/deepspeed/inference/v2/config_v2.py index 85e4b7a0e0a0..325b57d8f56a 100644 --- a/deepspeed/inference/v2/config_v2.py +++ b/deepspeed/inference/v2/config_v2.py @@ -3,8 +3,9 @@ # DeepSpeed Team +from pydantic import Field from typing import Optional -from deepspeed.pydantic_v1 import Field + from deepspeed.runtime.config_utils import DeepSpeedConfigModel from .ragged import DSStateManagerConfig diff --git a/deepspeed/inference/v2/model_implementations/flat_model_helpers.py b/deepspeed/inference/v2/model_implementations/flat_model_helpers.py index ebdb59bca920..c5e02adaffc4 100644 --- a/deepspeed/inference/v2/model_implementations/flat_model_helpers.py +++ b/deepspeed/inference/v2/model_implementations/flat_model_helpers.py @@ -27,9 +27,9 @@ class TensorMetadata(DeepSpeedConfigModel): """ A class to represent a tensor specification. """ - dtype: Optional[str] - shape: Optional[Tuple[int, ...]] - strides: Optional[Tuple[int, ...]] + dtype: Optional[str] = None + shape: Optional[Tuple[int, ...]] = None + strides: Optional[Tuple[int, ...]] = None offset: int @@ -37,7 +37,7 @@ class ParameterMetadata(DeepSpeedConfigModel): """ A class to represent a parameter specification. """ - core_param: TensorMetadata = None + core_param: Optional[TensorMetadata] = None aux_params: Dict[str, TensorMetadata] = {} diff --git a/deepspeed/inference/v2/ragged/manager_configs.py b/deepspeed/inference/v2/ragged/manager_configs.py index a5e98e5bcef1..17283b8bc0c4 100644 --- a/deepspeed/inference/v2/ragged/manager_configs.py +++ b/deepspeed/inference/v2/ragged/manager_configs.py @@ -6,7 +6,7 @@ from enum import Enum from typing import Tuple -from deepspeed.pydantic_v1 import PositiveInt, validator +from pydantic import PositiveInt, model_validator from deepspeed.runtime.config_utils import DeepSpeedConfigModel from ..inference_utils import DtypeEnum @@ -173,11 +173,9 @@ class DSStateManagerConfig(DeepSpeedConfigModel): Enable tracking for offloading KV-cache to host memory. Currently unsupported. """ - @validator("max_ragged_sequence_count") - def max_ragged_sequence_count_validator(cls, v: int, values: dict): + @model_validator(mode="after") + def max_ragged_sequence_count_validator(self): # If the attributes below failed their validation they won't appear in the values dict. - if "max_tracked_sequences" in values and v > values["max_tracked_sequences"]: - raise ValueError("max_ragged_sequence_count must be less than max_tracked_sequences") - if "max_ragged_batch_size" in values and v > values["max_ragged_batch_size"]: - raise ValueError("max_ragged_sequence_count must be less than max_ragged_batch_size") - return v + assert self.max_ragged_sequence_count <= self.max_tracked_sequences, "max_ragged_sequence_count must be less than max_tracked_sequences" + assert self.max_ragged_sequence_count <= self.max_ragged_batch_size, "max_ragged_sequence_count must be less than max_ragged_batch_size" + return self diff --git a/deepspeed/monitor/config.py b/deepspeed/monitor/config.py index c4200877089a..960ce1ba997a 100644 --- a/deepspeed/monitor/config.py +++ b/deepspeed/monitor/config.py @@ -5,7 +5,7 @@ from typing import Optional -from deepspeed.pydantic_v1 import root_validator +from pydantic import model_validator from deepspeed.runtime.config_utils import DeepSpeedConfigModel @@ -36,10 +36,10 @@ class WandbConfig(DeepSpeedConfigModel): enabled: bool = False """ Whether logging to WandB is enabled. Requires `wandb` package is installed. """ - group: str = None + group: Optional[str] = None """ Name for the WandB group. This can be used to group together runs. """ - team: str = None + team: Optional[str] = None """ Name for the WandB team. """ project: str = "deepspeed" @@ -137,8 +137,8 @@ class DeepSpeedMonitorConfig(DeepSpeedConfigModel): csv_monitor: CSVConfig = {} """ Local CSV output of monitoring data. """ - @root_validator - def check_enabled(cls, values): - values["enabled"] = values.get("tensorboard").enabled or values.get("wandb").enabled or values.get( - "csv_monitor").enabled or values.get("comet").enabled - return values + @model_validator(mode="after") + def check_enabled(self): + enabled = self.tensorboard.enabled or self.wandb.enabled or self.csv_monitor.enabled or self.comet.enabled + self.__dict__["enabled"] = enabled + return self diff --git a/deepspeed/pydantic_v1.py b/deepspeed/pydantic_v1.py deleted file mode 100644 index 6aba072ad929..000000000000 --- a/deepspeed/pydantic_v1.py +++ /dev/null @@ -1,16 +0,0 @@ -# Copyright (c) Microsoft Corporation. -# SPDX-License-Identifier: Apache-2.0 - -# DeepSpeed Team -"""Pydantic v1 compatibility module. - -Pydantic v2 introduced breaking changes that hinder its adoption: -https://docs.pydantic.dev/latest/migration/. To provide deepspeed users the option to -migrate to pydantic v2 on their own timeline, deepspeed uses this compatibility module -as a pydantic-version-agnostic alias for pydantic's v1 API. -""" - -try: - from pydantic.v1 import * # noqa: F401 -except ImportError: - from pydantic import * # noqa: F401 diff --git a/deepspeed/runtime/config_utils.py b/deepspeed/runtime/config_utils.py index 5522a8e79d69..d5c3a1548360 100755 --- a/deepspeed/runtime/config_utils.py +++ b/deepspeed/runtime/config_utils.py @@ -5,11 +5,12 @@ """ Collection of DeepSpeed configuration utilities """ -import json import collections -import collections.abc +import json +import torch from functools import reduce -from deepspeed.pydantic_v1 import BaseModel +from pydantic import BaseModel, ConfigDict, field_serializer + from deepspeed.utils import logger @@ -54,67 +55,73 @@ 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" or k == "replace_method")} super().__init__(**data) - self._deprecated_fields_check(self) + self._deprecated_fields_check() - def _process_deprecated_field(self, pydantic_config, field): + def _process_deprecated_field(self, dep_field): # Get information about the deprecated field - fields_set = pydantic_config.__fields_set__ - dep_param = field.name - kwargs = field.field_info.extra + pydantic_config = self + fields_set = pydantic_config.model_fields_set + kwargs = pydantic_config.model_fields[dep_field].json_schema_extra new_param_fn = kwargs.get("new_param_fn", lambda x: x) - param_value = new_param_fn(getattr(pydantic_config, dep_param)) - new_param = kwargs.get("new_param", "") + param_value = new_param_fn(getattr(pydantic_config, dep_field)) + new_field = kwargs.get("new_param", "") dep_msg = kwargs.get("deprecated_msg", "") - if dep_param in fields_set: - logger.warning(f"Config parameter {dep_param} is deprecated" + - (f" use {new_param} instead" if new_param else "") + (f". {dep_msg}" if dep_msg else "")) + if dep_field in fields_set: + logger.warning(f"Config parameter {dep_field} is deprecated" + + (f" use {new_field} instead" if new_field else "") + (f". {dep_msg}" if dep_msg else "")) # Check if there is a new param and if it should be set with a value - if new_param and kwargs.get("set_new_param", True): + if new_field and kwargs.get("set_new_param", True): # Remove the deprecate field if there is a replacing field try: - delattr(pydantic_config, dep_param) + delattr(pydantic_config, dep_field) except Exception as e: - logger.error(f"Tried removing deprecated '{dep_param}' from config") + logger.error(f"Tried removing deprecated '{dep_field}' from config") raise e # Set new param value - new_param_nested = new_param.split(".") + new_param_nested = new_field.split(".") if len(new_param_nested) > 1: # If the new param exists in a subconfig, we need to get # the fields set for that subconfig pydantic_config = reduce(getattr, new_param_nested[:-1], pydantic_config) - fields_set = pydantic_config.__fields_set__ + fields_set = pydantic_config.model_fields_set new_param_name = new_param_nested[-1] assert ( new_param_name not in fields_set - ), f"Cannot provide deprecated parameter '{dep_param}' and replacing parameter '{new_param}' together" + ), f"Cannot provide deprecated parameter '{dep_field}' and replacing parameter '{new_field}' together" # A custom function for converting the old param value to new param value can be provided try: setattr(pydantic_config, new_param_name, param_value) except Exception as e: - logger.error(f"Tried setting value for '{new_param}' with value from deprecated '{dep_param}'") + logger.error(f"Tried setting value for '{new_field}' with value from deprecated '{dep_field}'") 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) + def _deprecated_fields_check(self): + fields = self.model_fields + for field_name, field_info in fields.items(): + if field_info.json_schema_extra and field_info.json_schema_extra.get("deprecated", False): + self._process_deprecated_field(field_name) + + model_config = ConfigDict( + validate_default=True, + validate_assignment=True, + use_enum_values=True, + populate_by_name=True, + extra="forbid", + arbitrary_types_allowed=True, + protected_namespaces=(), + ) - class Config: - validate_all = True - validate_assignment = True - use_enum_values = True - allow_population_by_field_name = True - extra = "forbid" - arbitrary_types_allowed = True + @field_serializer("dtype", check_fields=False) + def serialize_torch_dtype(dtype: torch.dtype) -> str: + return str(dtype) def get_config_default(config, field_name): - assert field_name in config.__fields__, f"'{field_name}' is not a field in {config}" - assert not config.__fields__.get( - field_name).required, f"'{field_name}' is a required field and does not have a default value" - return config.__fields__.get(field_name).default + assert field_name in config.model_fields, f"'{field_name}' is not a field in {config}" + assert not config.model_fields.get( + field_name).is_required(), f"'{field_name}' is a required field and does not have a default value" + return config.model_fields.get(field_name).get_default() class pp_int(int): diff --git a/deepspeed/runtime/zero/config.py b/deepspeed/runtime/zero/config.py index 2089d59dbce4..1cfcd784e2ce 100644 --- a/deepspeed/runtime/zero/config.py +++ b/deepspeed/runtime/zero/config.py @@ -6,7 +6,7 @@ import sys from typing import Optional from enum import Enum -from deepspeed.pydantic_v1 import Field, validator, root_validator +from pydantic import Field, model_validator from deepspeed.runtime.config_utils import get_scalar_param, pp_int, DeepSpeedConfigModel from deepspeed.utils import logger from .offload_config import DeepSpeedZeroOffloadParamConfig, DeepSpeedZeroOffloadOptimizerConfig, OffloadDeviceEnum @@ -30,7 +30,7 @@ "reduce_bucket_size": 500000000, "load_from_fp32_weights": [true|false], "cpu_offload": [true|false] (deprecated), - "cpu_offload_params" : [true|false] (deprecated), + "cpu_offload_param" : [true|false] (deprecated), "cpu_offload_use_pin_memory": [true|false] (deprecated), "sub_group_size" : 1000000000000, "offload_param": {...}, @@ -128,7 +128,7 @@ class DeepSpeedZeroConfig(DeepSpeedConfigModel): the allgather for large model sizes """ - overlap_comm: bool = None # None for dynamic default value (see validator `overlap_comm_valid` below) + overlap_comm: Optional[bool] = None # None for dynamic default value (see validator `overlap_comm_valid` below) """ Attempts to overlap the reduction of the gradients with backward computation """ @@ -168,27 +168,37 @@ class DeepSpeedZeroConfig(DeepSpeedConfigModel): parameters). Used by ZeRO3-Offload and ZeRO-Infinity """ - cpu_offload_param: bool = Field( + cpu_offload_param: Optional[bool] = Field( None, - deprecated=True, - new_param="offload_param", - new_param_fn=(lambda val: DeepSpeedZeroOffloadParamConfig(device=OffloadDeviceEnum.cpu) if val else None), + json_schema_extra={ + "deprecated": True, + "new_param": "offload_param", + "new_param_fn": (lambda val: DeepSpeedZeroOffloadParamConfig(device=OffloadDeviceEnum.cpu) + if val else None) + }, ) """ Deprecated, please use ``offload_param`` """ - cpu_offload_use_pin_memory: bool = Field( + cpu_offload_use_pin_memory: Optional[bool] = Field( None, - deprecated=True, - new_param="offload_param or offload_optimizer", - set_new_param=False, + json_schema_extra={ + "deprecated": True, + "new_param": "offload_param or offload_optimizer", + "set_new_param": False + }, ) """ Deprecated, please use ``offload_param`` or ``offload_optimizer`` """ - cpu_offload: bool = Field( + cpu_offload: Optional[bool] = Field( None, - deprecated=True, - new_param="offload_optimizer", - new_param_fn=(lambda val: DeepSpeedZeroOffloadOptimizerConfig(device=OffloadDeviceEnum.cpu) if val else None), + json_schema_extra={ + "deprecated": + True, + "new_param": + "offload_optimizer", + "new_param_fn": (lambda val: DeepSpeedZeroOffloadOptimizerConfig(device=OffloadDeviceEnum.cpu) + if val else None) + }, ) """ Deprecated, please use ``offload_optimizer`` """ @@ -242,8 +252,10 @@ class DeepSpeedZeroConfig(DeepSpeedConfigModel): """ stage3_gather_fp16_weights_on_model_save: bool = Field(False, - deprecated=True, - new_param="gather_16bit_weights_on_model_save") + json_schema_extra={ + "deprecated": True, + "new_param": "gather_16bit_weights_on_model_save" + }) """ Deprecated, please use ``gather_16bit_weights_on_model_save`` """ ignore_unused_parameters: bool = True @@ -309,16 +321,15 @@ class DeepSpeedZeroConfig(DeepSpeedConfigModel): """ # Validators - @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 - - @root_validator - def offload_ratio_check(cls, values): - offload_config = getattr(values, "offload_optimizer", {}) + @model_validator(mode="after") + def overlap_comm_valid(self): + if self.overlap_comm is None: + self.overlap_comm = self.stage == ZeroStageEnum.weights + return self + + @model_validator(mode="after") + def offload_ratio_check(self): + offload_config = self.offload_optimizer if offload_config and offload_config.ratio < 1.0: - assert values.get("stage") == ZeroStageEnum.weights, "Partial offloading only supported for ZeRO Stage 3." - return values + assert self.stage == ZeroStageEnum.weights, "Partial offloading only supported for ZeRO Stage 3." + return self diff --git a/deepspeed/runtime/zero/offload_config.py b/deepspeed/runtime/zero/offload_config.py index b7adc13a0ea2..74a5673bc1bc 100644 --- a/deepspeed/runtime/zero/offload_config.py +++ b/deepspeed/runtime/zero/offload_config.py @@ -5,7 +5,9 @@ from enum import Enum from pathlib import Path -from deepspeed.pydantic_v1 import Field, validator +from pydantic import Field, model_validator +from typing import Optional + from deepspeed.runtime.config_utils import DeepSpeedConfigModel, pp_int @@ -25,7 +27,7 @@ class DeepSpeedZeroOffloadParamConfig(DeepSpeedConfigModel): `nvme`. """ - nvme_path: Path = None + nvme_path: Optional[Path] = None """ Filesystem path for NVMe device for parameter offloading. """ buffer_count: int = Field(5, ge=0) @@ -56,7 +58,7 @@ class DeepSpeedZeroOffloadOptimizerConfig(DeepSpeedConfigModel): `nvme`. Optimizer computation is offload to CPU regardless of device option. """ - nvme_path: Path = None + nvme_path: Optional[Path] = None """ Filesystem path for NVMe device for optimizer state offloading. """ buffer_count: int = Field(4, ge=0) @@ -88,10 +90,11 @@ class DeepSpeedZeroOffloadOptimizerConfig(DeepSpeedConfigModel): fast_init: bool = False """ Enable fast optimizer initialization when offloading to NVMe. """ - @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 - ratio: float = Field(1.0, ge=0.0, le=1.0) """ Percentage of offloaded optimizer states to CPU Adam. Only valid with ZeRO Stage 3.""" + + @model_validator(mode="after") + def set_pipeline(self): + pipeline = self.pipeline_read or self.pipeline_write + self.__dict__["pipeline"] = pipeline + return self diff --git a/deepspeed/runtime/zero/stage_1_and_2.py b/deepspeed/runtime/zero/stage_1_and_2.py index 57e80911d645..83cf996ca019 100755 --- a/deepspeed/runtime/zero/stage_1_and_2.py +++ b/deepspeed/runtime/zero/stage_1_and_2.py @@ -725,8 +725,9 @@ def reduce_gradients(self, pipeline_parallel=False): def get_first_param_index(self, group_id, param_group, partition_id): for index, param in enumerate(param_group): param_id = self.get_param_id(param) - if partition_id in self.param_to_partition_ids[group_id][param_id]: - return index + if group_id in self.param_to_partition_ids and param_id in self.param_to_partition_ids[group_id]: + if partition_id in self.param_to_partition_ids[group_id][param_id]: + return index return None def initialize_gradient_partitioning_data_structures(self): diff --git a/requirements/requirements-readthedocs.txt b/requirements/requirements-readthedocs.txt index 1a2ad18611e7..a48a47e4428d 100644 --- a/requirements/requirements-readthedocs.txt +++ b/requirements/requirements-readthedocs.txt @@ -1,10 +1,10 @@ -autodoc_pydantic +autodoc_pydantic>=2.0.0 docutils<0.18 hjson packaging psutil py-cpuinfo -pydantic<2.0.0 +pydantic>=2.0.0 recommonmark sphinx_rtd_theme torch diff --git a/requirements/requirements.txt b/requirements/requirements.txt index 6840d6dbcc98..70c94a745435 100755 --- a/requirements/requirements.txt +++ b/requirements/requirements.txt @@ -4,6 +4,6 @@ numpy packaging>=20.0 psutil py-cpuinfo -pydantic +pydantic>=2.0.0 torch tqdm diff --git a/tests/unit/inference/v2/ragged/test_manager_configs.py b/tests/unit/inference/v2/ragged/test_manager_configs.py index a5f270cced8c..bdd513445ddb 100644 --- a/tests/unit/inference/v2/ragged/test_manager_configs.py +++ b/tests/unit/inference/v2/ragged/test_manager_configs.py @@ -5,7 +5,7 @@ import pytest -from deepspeed.pydantic_v1 import ValidationError +from pydantic import ValidationError from deepspeed.inference.v2.ragged import DSStateManagerConfig diff --git a/tests/unit/runtime/test_ds_config_dict.py b/tests/unit/runtime/test_ds_config_dict.py index c11c63d04867..d06b35e208fe 100644 --- a/tests/unit/runtime/test_ds_config_dict.py +++ b/tests/unit/runtime/test_ds_config_dict.py @@ -67,13 +67,11 @@ def _batch_assert(status, ds_config, batch, micro_batch, gas, success): if not success: assert not status - print("Failed but All is well") return assert ds_config.train_batch_size == batch assert ds_config.train_micro_batch_size_per_gpu == micro_batch assert ds_config.gradient_accumulation_steps == gas - print("All is well") #Tests different batch config provided in deepspeed json file diff --git a/tests/unit/runtime/test_ds_config_model.py b/tests/unit/runtime/test_ds_config_model.py index 87ea747cf423..4d184b2858a8 100644 --- a/tests/unit/runtime/test_ds_config_model.py +++ b/tests/unit/runtime/test_ds_config_model.py @@ -4,18 +4,25 @@ # DeepSpeed Team import pytest -import os import json -from typing import List -from deepspeed.pydantic_v1 import Field, ValidationError +import os +from typing import List, Optional + +from pydantic import Field, ValidationError + 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_2_old: Optional[str] = Field(None, + json_schema_extra={ + "deprecated": True, + "new_param": "param_2", + "new_param_fn": (lambda x: [x]) + }) + param_2: Optional[List[str]] = None param_3: int = Field(0, alias="param_3_alias") From 55b4cae80fc1479ac802b91b4b8955da444016ae Mon Sep 17 00:00:00 2001 From: Logan Adams <114770087+loadams@users.noreply.github.com> Date: Thu, 22 Aug 2024 15:46:10 -0700 Subject: [PATCH 484/754] Fix torch check (#6402) --- op_builder/gds.py | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/op_builder/gds.py b/op_builder/gds.py index e024674e01d8..01c2d5a245d1 100644 --- a/op_builder/gds.py +++ b/op_builder/gds.py @@ -36,7 +36,13 @@ def extra_ldflags(self): return super().extra_ldflags() + ['-lcufile'] def is_compatible(self, verbose=False): - import torch.utils.cpp_extension + try: + import torch.utils.cpp_extension + except ImportError: + if verbose: + self.warning("Please install torch if trying to pre-compile GDS") + return False + CUDA_HOME = torch.utils.cpp_extension.CUDA_HOME CUDA_LIB64 = os.path.join(CUDA_HOME, "lib64") gds_compatible = self.has_function(funcname="cuFileDriverOpen", From ca4449e84378e1239f5c46d7353cfc24dc9c4c83 Mon Sep 17 00:00:00 2001 From: Logan Adams <114770087+loadams@users.noreply.github.com> Date: Thu, 22 Aug 2024 15:48:34 -0700 Subject: [PATCH 485/754] Update version.txt after 0.15.0 release (#6403) **Auto-generated PR to update version.txt after a DeepSpeed release** Released version - 0.15.0 Author - @loadams Co-authored-by: loadams --- version.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/version.txt b/version.txt index a5510516948f..e815b861f023 100644 --- a/version.txt +++ b/version.txt @@ -1 +1 @@ -0.15.0 +0.15.1 From e2654bfd1ab431bde088a7501ed01b503daa5ab1 Mon Sep 17 00:00:00 2001 From: Joe Mayer <114769929+jomayeri@users.noreply.github.com> Date: Fri, 23 Aug 2024 16:17:38 -0700 Subject: [PATCH 486/754] Fix Type Mismatch (#6410) `num_bytes_per_thread` was a smaller type than `file_num_bytes`, this caused issues when dividing by `num_threads`. Co-authored-by: jomayeri Co-authored-by: Olatunji Ruwase --- csrc/aio/py_lib/deepspeed_aio_op_desc.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/csrc/aio/py_lib/deepspeed_aio_op_desc.h b/csrc/aio/py_lib/deepspeed_aio_op_desc.h index 7305f6920c91..350d28d29d58 100644 --- a/csrc/aio/py_lib/deepspeed_aio_op_desc.h +++ b/csrc/aio/py_lib/deepspeed_aio_op_desc.h @@ -16,7 +16,7 @@ struct io_op_desc_t { const std::string _filename; const long long int _file_num_bytes; const int _num_threads; - const int _num_bytes_per_thread; + const long long int _num_bytes_per_thread; torch::Tensor _contiguous_buffer; const bool _validate; From 8ac42ed73a2f487f3c21fbc3bbaaec5f2eb5fbce Mon Sep 17 00:00:00 2001 From: Sam Ade Jacobs Date: Mon, 26 Aug 2024 18:10:21 -0700 Subject: [PATCH 487/754] Fix redundant seq data parallel grp argument in Z3/MiCS (#5352) Deprecate redundant sequence_data_parallel_group argument. Users/client code will control across which process group Z3 parameters will be partitioned from one of [None, data_parallel_group, sequence_data_parallel]. --------- Co-authored-by: Masahiro Tanaka <81312776+tohtana@users.noreply.github.com> Co-authored-by: Logan Adams <114770087+loadams@users.noreply.github.com> --- deepspeed/runtime/zero/mics.py | 23 +++++--- .../runtime/zero/partition_parameters.py | 55 ++++++++++--------- 2 files changed, 43 insertions(+), 35 deletions(-) diff --git a/deepspeed/runtime/zero/mics.py b/deepspeed/runtime/zero/mics.py index 99e3bce9ecd0..c9ae58a121de 100755 --- a/deepspeed/runtime/zero/mics.py +++ b/deepspeed/runtime/zero/mics.py @@ -17,7 +17,7 @@ from deepspeed.runtime.zero.parameter_offload import DeepSpeedZeRoOffload from deepspeed.runtime.zero.partition_parameters import Init, AllGatherCoalescedHandle, ZeroParamStatus from deepspeed.runtime.zero.stage3 import DeepSpeedZeroOptimizer_Stage3 -from deepspeed.utils import instrument_w_nvtx, log_dist +from deepspeed.utils import instrument_w_nvtx, log_dist, logger from deepspeed.accelerator import get_accelerator from torch import Tensor from torch.nn import Parameter @@ -88,6 +88,8 @@ def __init__(self, if it was constructed in the context. data_parallel_group (``deepspeed.comm`` process group, optional): The group of processes to partition among. Defaults to all processes. + Synonymous with sequence data parallel group for param partitioning + across both sequence and data parallel groups. mem_efficient_linear (bool, optional): Replace torch.nn.functional.linear with an implementation that allows DeepSpeed to partition parameters. Defaults to ``True``. @@ -149,16 +151,19 @@ def __init__(self, dist.init_distributed() assert dist.is_initialized(), "Parameters cannot be scattered without initializing deepspeed.comm" - if data_parallel_group is None and sequence_data_parallel_group is None: + if data_parallel_group is None: ds_process_group = dist.get_world_group() - elif sequence_data_parallel_group is not None: - ds_process_group = sequence_data_parallel_group - elif data_parallel_group is not None: + else: ds_process_group = data_parallel_group - else: # both given - raise ValueError( - "Both 'data_parallel_group' and 'sequence_data_parallel_group' were specified. Please provide only one of these arguments." - ) + + if sequence_data_parallel_group is not None: + logger.warning( + f"sequence_data_parallel_group' is deprecated and will be removed. Use 'data_parallel_group' instead.") + if data_parallel_group is not None: + raise ValueError( + "Both 'data_parallel_group' and 'sequence_data_parallel_group' were specified. Please provide only one of these arguments." + ) + self.ds_process_group = sequence_data_parallel_group self.mics_comm_groups = create_mics_comm_groups( _ds_config.mics_shard_size, diff --git a/deepspeed/runtime/zero/partition_parameters.py b/deepspeed/runtime/zero/partition_parameters.py index f76bcf0eb781..e01925cbd32b 100755 --- a/deepspeed/runtime/zero/partition_parameters.py +++ b/deepspeed/runtime/zero/partition_parameters.py @@ -814,24 +814,22 @@ class Init(InsertPostInitMethodToModuleSubClasses): apply_param_persistence = False override_module_apply = get_config_default(DeepSpeedZeroConfig, "override_module_apply") - def __init__( - self, - module=None, - data_parallel_group=None, - mem_efficient_linear=True, - remote_device=None, - pin_memory=False, - config_dict_or_path=None, - config=None, - enabled=True, - dtype=None, - mpu=None, - zero_param_parallel_group=None, - zero_quantized_weights=False, - zero_quantized_nontrainable_weights=False, - sequence_data_parallel_group=None, - param_swapper=None, - ): + def __init__(self, + module=None, + data_parallel_group=None, + mem_efficient_linear=True, + remote_device=None, + pin_memory=False, + config_dict_or_path=None, + config=None, + enabled=True, + dtype=None, + mpu=None, + zero_param_parallel_group=None, + zero_quantized_weights=False, + zero_quantized_nontrainable_weights=False, + sequence_data_parallel_group=None, + param_swapper=None): """A context to enable massive model construction for training with ZeRO-3. Models are automatically partitioned (or, sharded) across the system and converted to half precision. @@ -841,6 +839,8 @@ def __init__( if it was constructed in the context. data_parallel_group (``deepspeed.comm`` process group, optional): The group of processes to partition among. Defaults to all processes. + Synonymous with sequence data parallel group for param partitioning + across both sequence and data parallel groups. mem_efficient_linear (bool, optional): Replace torch.nn.functional.linear with an implementation that allows DeepSpeed to partition parameters. Defaults to ``True``. @@ -940,16 +940,19 @@ def __init__( init_distributed() assert dist.is_initialized(), "Parameters cannot be scattered without initializing deepspeed.comm" - if data_parallel_group is None and sequence_data_parallel_group is None: + if data_parallel_group is None: self.ds_process_group = dist.get_world_group() - elif sequence_data_parallel_group is not None: - self.ds_process_group = sequence_data_parallel_group - elif data_parallel_group is not None: + else: self.ds_process_group = data_parallel_group - else: # both given - raise ValueError( - "Both 'data_parallel_group' and 'sequence_data_parallel_group' were specified. Please provide only one of these arguments." - ) + + if sequence_data_parallel_group is not None: + logger.warning( + f"sequence_data_parallel_group' is deprecated and will be removed. Use 'data_parallel_group' instead.") + if data_parallel_group is not None: + raise ValueError( + "Both 'data_parallel_group' and 'sequence_data_parallel_group' were specified. Please provide only one of these arguments." + ) + self.ds_process_group = sequence_data_parallel_group self.rank = dist.get_rank(group=self.ds_process_group) self.dp_world_size = dist.get_world_size(group=self.ds_process_group) From 1bfa341bbdc8c3fadde426486fc83f5b0c80a727 Mon Sep 17 00:00:00 2001 From: jiahao su Date: Wed, 28 Aug 2024 02:15:48 +0800 Subject: [PATCH 488/754] add Huawei Ascend NPU setup guide (#6445) This PR adds the setup instructions for Huawei Ascend NPU. Please refer to the remainder of the guide for instructions on other devices. --------- Co-authored-by: sjh Co-authored-by: Logan Adams <114770087+loadams@users.noreply.github.com> Co-authored-by: Logan Adams --- .pre-commit-config.yaml | 2 +- .../accelerator-abstraction-interface.md | 1 + docs/_tutorials/accelerator-setup-guide.md | 113 ++++++++++++++++++ 3 files changed, 115 insertions(+), 1 deletion(-) diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index 11a14256801a..c9b41439801b 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -59,7 +59,7 @@ repos: # Do not check files that are automatically generated '--skip=docs/Gemfile.lock,tests/unit/gpt2-merges.txt,tests/unit/gpt2-vocab.json', '--ignore-regex=\\n', # Do not count the 'n' in an escaped newline as part of a word - '--ignore-words-list=youn,unsupport,noe', # Word used in error messages that need rewording + '--ignore-words-list=youn,unsupport,noe,cann', # Word used in error messages that need rewording --check-filenames, --check-hidden ] diff --git a/docs/_tutorials/accelerator-abstraction-interface.md b/docs/_tutorials/accelerator-abstraction-interface.md index d7c153638c0d..ec92d5ebcb93 100644 --- a/docs/_tutorials/accelerator-abstraction-interface.md +++ b/docs/_tutorials/accelerator-abstraction-interface.md @@ -81,6 +81,7 @@ torch.distributed.init_process_group(get_accelerator().communication_backend_nam [Accelerator Setup Guide](accelerator-setup-guide.md) provides a guide on how to setup different accelerators for DeepSpeed. It also comes with simple example how to run deepspeed for different accelerators. The following guides are provided: 1. Run DeepSpeed model on CPU 2. Run DeepSpeed model on XPU +3. Run DeepSpeed model on Huawei Ascend NPU # Implement new accelerator extension It is possible to implement a new DeepSpeed accelerator extension to support new accelerator in DeepSpeed. An example to follow is _[Intel Extension For DeepSpeed](https://github.com/intel/intel-extension-for-deepspeed/)_. An accelerator extension contains the following components: diff --git a/docs/_tutorials/accelerator-setup-guide.md b/docs/_tutorials/accelerator-setup-guide.md index cf2d01d2b25c..36d33f31b5b3 100644 --- a/docs/_tutorials/accelerator-setup-guide.md +++ b/docs/_tutorials/accelerator-setup-guide.md @@ -8,6 +8,7 @@ tags: getting-started - [Introduction](#introduction) - [Intel Architecture (IA) CPU](#intel-architecture-ia-cpu) - [Intel XPU](#intel-xpu) +- [Huawei Ascend NPU](#huawei-ascend-npu) # Introduction DeepSpeed supports different accelerators from different companies. Setup steps to run DeepSpeed on certain accelerators might be different. This guide allows user to lookup setup instructions for the accelerator family and hardware they are using. @@ -132,3 +133,115 @@ accelerator: xpu ## More example for using DeepSpeed on Intel XPU Refer to https://github.com/intel/intel-extension-for-pytorch/tree/release/xpu/2.1.40/examples/gpu/inference/python/llm for more extensive guide. + + +# Huawei Ascend NPU + +DeepSpeed has been verified on the following Huawei Ascend NPU products: +* Atlas 300T A2 + +## Installation steps for Huawei Ascend NPU + +The following steps outline the process for installing DeepSpeed on an Huawei Ascend NPU: +1. Install the Huawei Ascend NPU Driver and Firmware +
+ Click to expand + + Before proceeding with the installation, please download the necessary files from [Huawei Ascend NPU Driver and Firmware](https://www.hiascend.com/en/hardware/firmware-drivers/commercial?product=4&model=11). + + The following instructions below are sourced from the [Ascend Community](https://www.hiascend.com/document/detail/en/canncommercial/700/quickstart/quickstart/quickstart_18_0002.html) (refer to the [Chinese version](https://www.hiascend.com/document/detail/zh/canncommercial/700/quickstart/quickstart/quickstart_18_0002.html)): + + - Execute the following command to install the driver: + ``` + ./Ascend-hdk--npu-driver_x.x.x_linux-{arch}.run --full --install-for-all + ``` + + - Execute the following command to install the firmware: + ``` + ./Ascend-hdk--npu-firmware_x.x.x.x.X.run --full + ``` +
+ +2. Install CANN +
+ Click to expand + + Prior to installation, download the [CANN Toolkit](https://www.hiascend.com/en/software/cann/commercial). + + - Install third-party dependencies. + - Ubuntu (The operations are the same for Debian, UOS20, and Linux.) + ``` + apt-get install -y gcc g++ make cmake zlib1g zlib1g-dev openssl libsqlite3-dev libssl-dev libffi-dev unzip pciutils net-tools libblas-dev gfortran libblas3 + ``` + - openEuler (The operations are the same for EulerOS, CentOS, and BC-Linux.) + ``` + yum install -y gcc gcc-c++ make cmake unzip zlib-devel libffi-devel openssl-devel pciutils net-tools sqlite-devel lapack-devel gcc-gfortran + ``` + - Install the required Python dependencies: + ``` + pip3 install attrs numpy decorator sympy cffi pyyaml pathlib2 psutil protobuf scipy requests absl-py wheel typing_extensions + ``` + - Install the CANN Toolkit. + ``` + ./Ascend-cann-toolkit_x.x.x_linux-{arch}.run --install + ``` +
+ +3. Install PyTorch \ + `pip install torch torch_npu` + +4. Install DeepSpeed \ + `pip install deepspeed` + +You can view the installation results using the `ds_report` command, Here is an example: +``` +-------------------------------------------------- +DeepSpeed C++/CUDA extension op report +-------------------------------------------------- +NOTE: Ops not installed will be just-in-time (JIT) compiled at + runtime if needed. Op compatibility means that your system + meet the required dependencies to JIT install the op. +-------------------------------------------------- +JIT compiled ops requires ninja +ninja .................. [OKAY] +-------------------------------------------------- +op name ................ installed .. compatible +-------------------------------------------------- +deepspeed_not_implemented [NO] ....... [OKAY] +async_io ............... [NO] ....... [OKAY] +cpu_adagrad ............ [NO] ....... [OKAY] +cpu_adam ............... [NO] ....... [OKAY] +cpu_lion ............... [NO] ....... [OKAY] +fused_adam ............. [NO] ....... [OKAY] +transformer_inference .. [NO] ....... [OKAY] +-------------------------------------------------- +DeepSpeed general environment info: +torch install path ............... ['/root/miniconda3/envs/ds/lib/python3.10/site-packages/torch'] +torch version .................... 2.2.0 +deepspeed install path ........... ['/root/miniconda3/envs/ds/lib/python3.10/site-packages/deepspeed'] +deepspeed info ................... 0.14.4, unknown, unknown +deepspeed wheel compiled w. ...... torch 2.2 +torch_npu install path ........... ['/root/miniconda3/envs/ds/lib/python3.10/site-packages/torch_npu'] +torch_npu version ................ 2.2.0 +ascend_cann version .............. 8.0.RC2.alpha002 +shared memory (/dev/shm) size .... 20.00 GB +``` + +## How to launch DeepSpeed on Huawei Ascend NPU + +To validate the Huawei Ascend NPU availability and if the accelerator is correctly chosen, here is an example(Huawei Ascend NPU detection is automatic starting with DeepSpeed v0.12.6): +``` +>>> import torch +>>> print('torch:',torch.__version__) +torch: 2.2.0 +>>> import torch_npu +>>> print('torch_npu:',torch.npu.is_available(),",version:",torch_npu.__version__) +torch_npu: True ,version: 2.2.0 +>>> from deepspeed.accelerator import get_accelerator +>>> print('accelerator:', get_accelerator()._name) +accelerator: npu +``` + +## Multi-card parallel training using Huawei Ascend NPU + +To perform model training across multiple Huawei Ascend NPU cards using DeepSpeed, see the examples provided in [DeepSpeed Examples](https://github.com/microsoft/DeepSpeedExamples/blob/master/training/cifar/cifar10_deepspeed.py). From 77f61e677175225333237af28075b346c3dcde6e Mon Sep 17 00:00:00 2001 From: Logan Adams Date: Tue, 27 Aug 2024 13:02:07 -0700 Subject: [PATCH 489/754] Revert "Fix torch check (#6402)" This reverts commit 55b4cae80fc1479ac802b91b4b8955da444016ae. --- op_builder/gds.py | 8 +------- 1 file changed, 1 insertion(+), 7 deletions(-) diff --git a/op_builder/gds.py b/op_builder/gds.py index 01c2d5a245d1..e024674e01d8 100644 --- a/op_builder/gds.py +++ b/op_builder/gds.py @@ -36,13 +36,7 @@ def extra_ldflags(self): return super().extra_ldflags() + ['-lcufile'] def is_compatible(self, verbose=False): - try: - import torch.utils.cpp_extension - except ImportError: - if verbose: - self.warning("Please install torch if trying to pre-compile GDS") - return False - + import torch.utils.cpp_extension CUDA_HOME = torch.utils.cpp_extension.CUDA_HOME CUDA_LIB64 = os.path.join(CUDA_HOME, "lib64") gds_compatible = self.has_function(funcname="cuFileDriverOpen", From eb37cacf229ece71580a30bec723bf361f4ba82f Mon Sep 17 00:00:00 2001 From: Logan Adams Date: Tue, 27 Aug 2024 13:02:44 -0700 Subject: [PATCH 490/754] Revert "Revert "Fix torch check (#6402)"" This reverts commit 77f61e677175225333237af28075b346c3dcde6e. --- op_builder/gds.py | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/op_builder/gds.py b/op_builder/gds.py index e024674e01d8..01c2d5a245d1 100644 --- a/op_builder/gds.py +++ b/op_builder/gds.py @@ -36,7 +36,13 @@ def extra_ldflags(self): return super().extra_ldflags() + ['-lcufile'] def is_compatible(self, verbose=False): - import torch.utils.cpp_extension + try: + import torch.utils.cpp_extension + except ImportError: + if verbose: + self.warning("Please install torch if trying to pre-compile GDS") + return False + CUDA_HOME = torch.utils.cpp_extension.CUDA_HOME CUDA_LIB64 = os.path.join(CUDA_HOME, "lib64") gds_compatible = self.has_function(funcname="cuFileDriverOpen", From 1041c8a1720113490d4f40e4778e478af7345bbc Mon Sep 17 00:00:00 2001 From: Dogacan Colak Date: Wed, 28 Aug 2024 11:28:10 -0400 Subject: [PATCH 491/754] Add documentation for launcher without SSH (#6455) #5728 --------- Co-authored-by: Logan Adams --- docs/_tutorials/getting-started.md | 30 ++++++++++++++++++++++++++++++ 1 file changed, 30 insertions(+) diff --git a/docs/_tutorials/getting-started.md b/docs/_tutorials/getting-started.md index f9a4cfdc68b4..9f44c7c6e740 100644 --- a/docs/_tutorials/getting-started.md +++ b/docs/_tutorials/getting-started.md @@ -226,6 +226,36 @@ deepspeed --include="worker-2:0,1" \ \ --deepspeed --deepspeed_config ds_config.json ``` +### Launching without passwordless SSH + +DeepSpeed now supports launching training jobs without the need for passwordless SSH. This mode is +particularly useful in cloud environments such as Kubernetes, where flexible container orchestration +is possible, and setting up a leader-worker architecture with passwordless SSH adds unnecessary +complexity. + +To use this mode, you need to run the DeepSpeed command separately on all nodes. The command should +be structured as follows: + +```bash +deepspeed --hostfile=myhostfile --no_ssh --node_rank= \ + --master_addr= --master_port= \ + \ + --deepspeed --deepspeed_config ds_config.json +``` + +- `--hostfile=myhostfile`: Specifies the hostfile that contains information about the nodes and GPUs. +- `--no_ssh`: Enables the no-SSH mode. +- `--node_rank=`: Specifies the rank of the node. This should be a unique integer from 0 to n - 1. +- `--master_addr=`: The address of the leader node (rank 0). +- `--master_port=`: The port of the leader node. + +In this setup, the hostnames in the hostfile do not need to be reachable via passwordless SSH. +However, the hostfile is still required for the launcher to collect information about the environment, +such as the number of nodes and the number of GPUs per node. + +Each node must be launched with a unique `node_rank`, and all nodes must be provided with the address +and port of the leader node (rank 0). This mode causes the launcher to act similarly to the `torchrun` +launcher, as described in the [PyTorch documentation](https://pytorch.org/docs/stable/elastic/run.html). ## Multi-Node Environment Variables From b5cf30a0857a1aab4040bb795f045bb37d08c9f8 Mon Sep 17 00:00:00 2001 From: Raza Sikander <54884406+raza-sikander@users.noreply.github.com> Date: Wed, 28 Aug 2024 21:32:51 +0530 Subject: [PATCH 492/754] Dtype support check for accelerator in UTs (#6360) Check if the dtype is supported by the accelarator if not then skip --------- Co-authored-by: Shaik Raza Sikander Co-authored-by: Logan Adams <114770087+loadams@users.noreply.github.com> Co-authored-by: Olatunji Ruwase --- tests/unit/inference/test_checkpoint_sharding.py | 3 +++ tests/unit/inference/test_model_profiling.py | 3 +++ .../unit/ops/transformer/inference/inference_test_utils.py | 7 +------ 3 files changed, 7 insertions(+), 6 deletions(-) diff --git a/tests/unit/inference/test_checkpoint_sharding.py b/tests/unit/inference/test_checkpoint_sharding.py index 5bae9a151a27..f1e37ee26536 100644 --- a/tests/unit/inference/test_checkpoint_sharding.py +++ b/tests/unit/inference/test_checkpoint_sharding.py @@ -14,6 +14,7 @@ from huggingface_hub import snapshot_download from transformers.utils import is_offline_mode from deepspeed.ops.op_builder import InferenceBuilder +from deepspeed.accelerator import get_accelerator if not deepspeed.ops.__compatible_ops__[InferenceBuilder.NAME]: pytest.skip("This op had not been implemented on this system.", allow_module_level=True) @@ -44,6 +45,8 @@ def model_name(request): @pytest.fixture(params=[torch.float16, torch.int8], ids=["fp16", "int8"]) def dtype(request): + if request.param not in get_accelerator().supported_dtypes(): + pytest.skip(f"{request.param} not supported by {get_accelerator().device_name()}.") return request.param diff --git a/tests/unit/inference/test_model_profiling.py b/tests/unit/inference/test_model_profiling.py index 23e49f89025b..319055d0ea55 100644 --- a/tests/unit/inference/test_model_profiling.py +++ b/tests/unit/inference/test_model_profiling.py @@ -16,6 +16,9 @@ if not deepspeed.ops.__compatible_ops__[InferenceBuilder.NAME]: pytest.skip("This op had not been implemented on this system.", allow_module_level=True) +if torch.half not in get_accelerator().supported_dtypes(): + pytest.skip(f"fp16 not supported, valid dtype: {get_accelerator().supported_dtypes()}", allow_module_level=True) + @pytest.mark.inference @pytest.mark.parametrize("use_cuda_events", [True, False]) diff --git a/tests/unit/ops/transformer/inference/inference_test_utils.py b/tests/unit/ops/transformer/inference/inference_test_utils.py index 9c7b428c0e68..9cfcae809f09 100644 --- a/tests/unit/ops/transformer/inference/inference_test_utils.py +++ b/tests/unit/ops/transformer/inference/inference_test_utils.py @@ -26,12 +26,7 @@ def get_tolerances(): def get_dtypes(): global DTYPES if DTYPES is None: - DTYPES = [torch.float16, torch.float32] - try: - if get_accelerator().is_bf16_supported(): - DTYPES.append(torch.bfloat16) - except (AssertionError, AttributeError): - pass + DTYPES = get_accelerator().supported_dtypes() return DTYPES From 9bc4cd01b7eb6039bb2c02b63b4b37720733dee3 Mon Sep 17 00:00:00 2001 From: Raza Sikander <54884406+raza-sikander@users.noreply.github.com> Date: Wed, 28 Aug 2024 21:58:22 +0530 Subject: [PATCH 493/754] Store/Load CIFAR from local/offline (#6390) CIFAR10_DATASET_PATH -> Path where the dataset is stored STORE_CIFAR10 -> Store the dataset 1/0 CIFAR10_OFFLINE -> To use offline dataset 1/0 MISC: Added getDeviceId to get device if by name in case of accelerator --------- Co-authored-by: Shaik Raza Sikander Co-authored-by: Olatunji Ruwase Co-authored-by: Logan Adams <114770087+loadams@users.noreply.github.com> Co-authored-by: Logan Adams --- tests/unit/alexnet_model.py | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/tests/unit/alexnet_model.py b/tests/unit/alexnet_model.py index dfab28aa7477..51e80e7f9e62 100644 --- a/tests/unit/alexnet_model.py +++ b/tests/unit/alexnet_model.py @@ -101,12 +101,14 @@ def cifar_trainset(fp16=False): dist.barrier() if local_rank != 0: dist.barrier() - data_root = os.getenv("TEST_DATA_DIR", "/tmp/") - trainset = torchvision.datasets.CIFAR10(root=os.path.join(data_root, "cifar10-data"), - train=True, - download=True, - transform=transform) + if os.getenv("CIFAR10_DATASET_PATH"): + data_root = os.getenv("CIFAR10_DATASET_PATH") + download = False + else: + data_root = os.path.join(os.getenv("TEST_DATA_DIR", "/tmp"), "cifar10-data") + download = True + trainset = torchvision.datasets.CIFAR10(root=data_root, train=True, download=download, transform=transform) if local_rank == 0: dist.barrier() return trainset From 405b6d5e33d28797e363253d933982e73858b2c9 Mon Sep 17 00:00:00 2001 From: Roger Feng Date: Thu, 29 Aug 2024 00:55:33 +0800 Subject: [PATCH 494/754] Add the accelerator setup guide link in Getting Started page (#6452) Add the link of https://www.deepspeed.ai/tutorials/accelerator-setup-guide/ into the installation section in Getting Started page so that users can easily find the doc. Signed-off-by: roger feng --- docs/_tutorials/getting-started.md | 1 + 1 file changed, 1 insertion(+) diff --git a/docs/_tutorials/getting-started.md b/docs/_tutorials/getting-started.md index 9f44c7c6e740..ce9e3ee9a892 100644 --- a/docs/_tutorials/getting-started.md +++ b/docs/_tutorials/getting-started.md @@ -11,6 +11,7 @@ tags: getting-started * To get started with DeepSpeed on AzureML, please see the [AzureML Examples GitHub](https://github.com/Azure/azureml-examples/tree/main/cli/jobs/deepspeed) * DeepSpeed has direct integrations with [HuggingFace Transformers](https://github.com/huggingface/transformers) and [PyTorch Lightning](https://github.com/PyTorchLightning/pytorch-lightning). HuggingFace Transformers users can now easily accelerate their models with DeepSpeed through a simple ``--deepspeed`` flag + config file [See more details](https://huggingface.co/docs/transformers/main_classes/deepspeed). PyTorch Lightning provides easy access to DeepSpeed through the Lightning Trainer [See more details](https://pytorch-lightning.readthedocs.io/en/stable/advanced/multi_gpu.html?highlight=deepspeed#deepspeed). * DeepSpeed on AMD can be used via our [ROCm images](https://hub.docker.com/r/deepspeed/rocm501/tags), e.g., `docker pull deepspeed/rocm501:ds060_pytorch110`. +* DeepSpeed also supports Intel Xeon CPU, Intel Data Center Max Series XPU, Intel Gaudi HPU, Huawei Ascend NPU etc, please refer to the [accelerator setup guide](/tutorials/accelerator-setup-guide/) From 4864991f53bd2e12446198bcc655f919eb9157f9 Mon Sep 17 00:00:00 2001 From: Siddartha Naidu Date: Wed, 28 Aug 2024 13:04:40 -0500 Subject: [PATCH 495/754] Allow triton==3.0.x for fp_quantizer (#6447) Tested with triton==3.0.x and the kernel tests pass so adding as an allowed version. Triton 2.3.x is not well supported on arm64. Triton 3.0.0 is supported on arm64 and it appears the fp8 kernel works fine with triton==3.0.0 so this simplifies usage on arm hosts (GH200). --- op_builder/fp_quantizer.py | 16 ++++++++++------ 1 file changed, 10 insertions(+), 6 deletions(-) diff --git a/op_builder/fp_quantizer.py b/op_builder/fp_quantizer.py index 40cf504c2c83..75ee54c09bf6 100644 --- a/op_builder/fp_quantizer.py +++ b/op_builder/fp_quantizer.py @@ -49,23 +49,27 @@ def is_compatible(self, verbose=False): import triton except ImportError: if verbose: - self.warning(f"please install triton==2.3.0 or 2.3.1 if you want to use the FP Quantizer Kernels") + self.warning( + f"please install triton==2.3.0, 2.3.1 or 3.0.0 if you want to use the FP Quantizer Kernels") return False - # triton 2.3.0 and 2.3.1 are okay and the only versions released in 2.3.x before 3.x was released + # triton 2.3.{0,1} and 3.0.0 are ok. + allowed_versions = ("2.3", "3.0") if pkg_version: - allowed = pkg_version.parse("2.3") + allowed = (pkg_version.parse(v) for v in allowed_versions) installed_triton = pkg_version.parse(triton.__version__) - triton_mismatch = installed_triton.major != allowed.major or installed_triton.minor != allowed.minor + triton_mismatch = all(installed_triton.major != a.major or installed_triton.minor != a.minor + for a in allowed) else: installed_triton = triton.__version__ major, minor, _ = installed_triton.split(".") - triton_mismatch = major != "2" or minor != "3" + allowed = (v.split(".") for v in allowed_versions) + triton_mismatch = all(major != v[0] or minor != v[1] for v in allowed) if triton_mismatch: if verbose: self.warning( - f"FP Quantizer is using an untested triton version ({installed_triton}), only 2.3.0 and 2.3.1 are known to be compatible with these kernels" + f"FP Quantizer is using an untested triton version ({installed_triton}), only 2.3.{0,1} and 3.0.0 are known to be compatible with these kernels" ) return False From f2739b4f722203b781722cec84a374d0d798b084 Mon Sep 17 00:00:00 2001 From: Joe Mayer <114769929+jomayeri@users.noreply.github.com> Date: Thu, 29 Aug 2024 08:59:32 -0700 Subject: [PATCH 496/754] Change GDS to 1 AIO thread (#6459) The `numThreads` config option determines how many threads are used to read from the file. In the CPU case these threads are created via AIO, in the GDS case they are handled by the GDS library via the cufile.json. If we were to also create AIO threads it would have a multiplicative effect. Example 8 AIO threads * 8 GDS threads would be 64 threads reading from the file when the user really only intended for 8 threads. Co-authored-by: Olatunji Ruwase --- csrc/gds/py_lib/deepspeed_py_gds_handle.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/csrc/gds/py_lib/deepspeed_py_gds_handle.cpp b/csrc/gds/py_lib/deepspeed_py_gds_handle.cpp index 3a35ad3145a0..15fd516acaae 100644 --- a/csrc/gds/py_lib/deepspeed_py_gds_handle.cpp +++ b/csrc/gds/py_lib/deepspeed_py_gds_handle.cpp @@ -20,7 +20,7 @@ deepspeed_gds_handle_t::deepspeed_gds_handle_t(const int block_size, const bool single_submit, const bool overlap_events, const int num_threads) - : deepspeed_io_handle_t(block_size, queue_depth, single_submit, overlap_events, num_threads) + : deepspeed_io_handle_t(block_size, queue_depth, single_submit, overlap_events, 1) { _init_cuFile(block_size, queue_depth, num_threads); } From 0cd9bf59785f24aefae4c407f184bf71339ed5d4 Mon Sep 17 00:00:00 2001 From: Yizhou Wang Date: Fri, 30 Aug 2024 00:42:53 +0800 Subject: [PATCH 497/754] [CCL] fix condition issue in ccl.py (#6443) previous condition check is not right, it would cause this condition always be True. --------- Co-authored-by: Logan Adams <114770087+loadams@users.noreply.github.com> --- deepspeed/comm/ccl.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/deepspeed/comm/ccl.py b/deepspeed/comm/ccl.py index cdf4c030f5d6..8753cf9f70ed 100644 --- a/deepspeed/comm/ccl.py +++ b/deepspeed/comm/ccl.py @@ -15,7 +15,7 @@ def build_ccl_op(): builder = get_accelerator().create_op_builder("CCLCommBuilder") - if builder is None or NotImplementedBuilder: + if builder is None or isinstance(builder, NotImplementedBuilder): return None ccl_cpp_module = builder.load() print(f'DeepSpeed {builder.absolute_name()} built successfully') From a7ffe540fc98a945b9d3d2a9c05653e160d62dcf Mon Sep 17 00:00:00 2001 From: Ramya Ramineni <62723901+rraminen@users.noreply.github.com> Date: Thu, 29 Aug 2024 12:15:52 -0500 Subject: [PATCH 498/754] Avoid gds build errors on ROCm (#6456) This PR is to avoid the below error during DeepSpeed build on ROCm. The error is because of the incompatibility of GDSBuilder extension on ROCm. ``` Traceback (most recent call last): File "", line 1, in File "/tmp/pip-req-build-lv1v39xc/setup.py", line 180, in op_compatible = builder.is_compatible() File "/tmp/pip-req-build-lv1v39xc/op_builder/gds.py", line 47, in is_compatible CUDA_LIB64 = os.path.join(CUDA_HOME, "lib64") File "/opt/conda/envs/py_3.9/lib/python3.9/posixpath.py", line 76, in join a = os.fspath(a) TypeError: expected str, bytes or os.PathLike object, not NoneType Total number of unsupported CUDA function calls: 0 Total number of replaced kernel launches: 1 ---------------------------------------- ERROR: Command errored out with exit status 1: python setup.py egg_info Check the logs for full command output ``` cc: @jithunnair-amd --------- Co-authored-by: Logan Adams <114770087+loadams@users.noreply.github.com> --- op_builder/gds.py | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/op_builder/gds.py b/op_builder/gds.py index 01c2d5a245d1..727ebdf48372 100644 --- a/op_builder/gds.py +++ b/op_builder/gds.py @@ -36,6 +36,11 @@ def extra_ldflags(self): return super().extra_ldflags() + ['-lcufile'] def is_compatible(self, verbose=False): + if self.is_rocm_pytorch(): + if verbose: + self.warning(f'{self.NAME} is not compatible with ROCM') + return False + try: import torch.utils.cpp_extension except ImportError: From 89c4d9f5a73d06eb8db8037d61188c628ceeba51 Mon Sep 17 00:00:00 2001 From: Raza Sikander <54884406+raza-sikander@users.noreply.github.com> Date: Fri, 30 Aug 2024 03:35:20 +0530 Subject: [PATCH 499/754] TestLowCpuMemUsage UT get device by device_name (#6397) Co-authored-by: Shaik Raza Sikander Co-authored-by: Logan Adams <114770087+loadams@users.noreply.github.com> --- tests/unit/inference/test_inference.py | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/tests/unit/inference/test_inference.py b/tests/unit/inference/test_inference.py index eadf670d9328..581a2ce433ed 100644 --- a/tests/unit/inference/test_inference.py +++ b/tests/unit/inference/test_inference.py @@ -298,6 +298,12 @@ def verify_injection(module): verify_injection(model) +# Used to Get Device name +def getDeviceId(local_rank): + device = torch.device(f"{get_accelerator().device_name(local_rank)}") + return device + + # Verify that test is valid def validate_test(model_w_task, dtype, enable_cuda_graph, enable_triton): model, task = model_w_task @@ -484,8 +490,8 @@ def test( pytest.skip(f"Acceleraor {get_accelerator().device_name()} does not support {dtype}.") local_rank = int(os.getenv("LOCAL_RANK", "0")) - - pipe = pipeline(task, model=model, model_kwargs={"low_cpu_mem_usage": True}, device=local_rank, framework="pt") + device = getDeviceId(local_rank) + pipe = pipeline(task, model=model, model_kwargs={"low_cpu_mem_usage": True}, device=device, framework="pt") bs_output = pipe(query, **inf_kwargs) pipe.model = deepspeed.init_inference(pipe.model, mp_size=self.world_size, From 9b7fc5452471392b0f58844219fcfdd14a9cdc77 Mon Sep 17 00:00:00 2001 From: Logan Adams <114770087+loadams@users.noreply.github.com> Date: Thu, 29 Aug 2024 16:43:21 -0700 Subject: [PATCH 500/754] Add workflow to build DS without torch to better test before releases (#6450) - Adds a nightly workflow that tests to confirm we can build DeepSpeed without torch as a dependency, as this often only surfaces when doing a release. --- .github/workflows/no-torch.yml | 45 ++++++++++++++++++++++++++++++++++ 1 file changed, 45 insertions(+) create mode 100644 .github/workflows/no-torch.yml diff --git a/.github/workflows/no-torch.yml b/.github/workflows/no-torch.yml new file mode 100644 index 000000000000..794c02b3c4db --- /dev/null +++ b/.github/workflows/no-torch.yml @@ -0,0 +1,45 @@ +name: no-torch + +on: + workflow_dispatch: + pull_request: + paths: + - '.github/workflows/no-torch.yml' + schedule: + - cron: "0 0 * * *" + +concurrency: + group: ${{ github.workflow }}-${{ github.ref }} + cancel-in-progress: true + +permissions: + contents: read + issues: write + +jobs: + unit-tests: + runs-on: ubuntu-22.04 + + steps: + - uses: actions/checkout@v4 + + - id: setup-venv + uses: ./.github/workflows/setup-venv + + - name: Python environment + run: | + pip uninstall torch --yes + pip list + + - name: Build deepspeed + run: | + DS_BUILD_STRING=" " python setup.py sdist + + - name: Open GitHub issue if nightly CI fails + if: ${{ failure() && (github.event_name == 'schedule') }} + uses: JasonEtco/create-an-issue@v2 + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + with: + filename: .github/ISSUE_TEMPLATE/ci_failure_report.md + update_existing: true From cfc6ed3722e54480af54899a2eea05cebd238090 Mon Sep 17 00:00:00 2001 From: Nadav Elyahu <88962733+nelyahu@users.noreply.github.com> Date: Wed, 4 Sep 2024 18:27:26 +0300 Subject: [PATCH 501/754] bf16_optimizer: fixes to different grad acc dtype (#6485) - fix step function to cast to FP32 before step in case of different gradient accumulation data type - remove redundatn function initialize_optimizer_states() --- deepspeed/runtime/bf16_optimizer.py | 33 +++++++++-------------------- 1 file changed, 10 insertions(+), 23 deletions(-) diff --git a/deepspeed/runtime/bf16_optimizer.py b/deepspeed/runtime/bf16_optimizer.py index 325188f02931..6619e602235e 100644 --- a/deepspeed/runtime/bf16_optimizer.py +++ b/deepspeed/runtime/bf16_optimizer.py @@ -197,10 +197,6 @@ def _setup_for_real_optimizer(self): see_memory_usage(f'after initializing group {i}', force=True) - see_memory_usage('before initialize_optimizer', force=True) - self.initialize_optimizer_states() - see_memory_usage('end initialize_optimizer', force=True) - self._grad_acc_hooks = [] if self.immediate_grad_update: self.create_grad_acc_hooks() @@ -252,25 +248,6 @@ def _lazy_init_hp_params_optimizer_state(self): self.optimizer.state) self._hp_optimizer_states_linked = True - def initialize_optimizer_states(self): - """Take an optimizer step with zero-valued gradients to allocate internal - optimizer state. - - This helps prevent memory fragmentation by allocating optimizer state at the - beginning of training instead of after activations have been allocated. - """ - for param_partition, grad_partition in zip(self.fp32_groups_flat_partition, - self.fp32_groups_gradient_flat_partition): - # In case of grad acc dtype different than FP32, need to cast to high precision. - param_partition.grad = grad_partition.to( - param_partition.dtype) if grad_partition.dtype != param_partition.dtype else grad_partition - - if self.grad_acc_dtype is not torch.float32: - for param_partition in self.fp32_groups_flat_partition: - param_partition.grad = None - - self.clear_hp_grads() - def _split_flat_tensor(self, flat_tensor, num_elem_list): assert sum(num_elem_list) <= flat_tensor.numel() tensor_list = [] @@ -317,8 +294,18 @@ def step(self, closure=None): mpu=self.mpu, use_graph=self.graph_harvesting) + for param_partition, grad_partition in zip(self.fp32_groups_flat_partition, + self.fp32_groups_gradient_flat_partition): + # In case of grad acc dtype different than FP32, need to cast to high precision. + param_partition.grad = grad_partition.to( + param_partition.dtype) if grad_partition.dtype != param_partition.dtype else grad_partition + self.optimizer.step() + if self.grad_acc_dtype is not torch.float32: + for param_partition in self.fp32_groups_flat_partition: + param_partition.grad = None + # We need to link optimizer state after the first step() call self._lazy_init_hp_params_optimizer_state() From 5df12a4a8559852c19d6423fca54d828846addc1 Mon Sep 17 00:00:00 2001 From: Olatunji Ruwase Date: Wed, 4 Sep 2024 11:31:31 -0400 Subject: [PATCH 502/754] DeepNVMe tutorial (#6449) Co-authored-by: Logan Adams Co-authored-by: jomayeri --- .pre-commit-config.yaml | 2 +- blogs/deepspeed-gds/README.md | 2 +- docs/_data/navigation.yml | 6 + .../accelerator-abstraction-interface.md | 2 +- docs/_tutorials/accelerator-setup-guide.md | 2 +- docs/_tutorials/deepnvme.md | 247 ++++++++++++++++++ docs/assets/images/deepnvme_ops_report.png | Bin 0 -> 8964 bytes 7 files changed, 257 insertions(+), 4 deletions(-) create mode 100644 docs/_tutorials/deepnvme.md create mode 100644 docs/assets/images/deepnvme_ops_report.png diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index c9b41439801b..b89c872eefe5 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -76,7 +76,7 @@ repos: name: check-torchcuda entry: ./scripts/check-torchcuda.py language: python - exclude: ^(.github/workflows/|scripts/check-torchcuda.py|docs/_tutorials/accelerator-abstraction-interface.md|accelerator/cuda_accelerator.py|deepspeed/inference/engine.py|deepspeed/model_implementations/transformers/clip_encoder.py|deepspeed/model_implementations/diffusers/vae.py|deepspeed/model_implementations/diffusers/unet.py|op_builder/spatial_inference.py|op_builder/transformer_inference.py|op_builder/builder.py|setup.py|tests/unit/ops/sparse_attention/test_sparse_attention.py) + exclude: ^(.github/workflows/|scripts/check-torchcuda.py|docs/_tutorials/accelerator-abstraction-interface.md|docs/_tutorials/deepnvme.md|accelerator/cuda_accelerator.py|deepspeed/inference/engine.py|deepspeed/model_implementations/transformers/clip_encoder.py|deepspeed/model_implementations/diffusers/vae.py|deepspeed/model_implementations/diffusers/unet.py|op_builder/spatial_inference.py|op_builder/transformer_inference.py|op_builder/builder.py|setup.py|tests/unit/ops/sparse_attention/test_sparse_attention.py) # Specific deepspeed/ files are excluded for now until we wrap ProcessGroup in deepspeed.comm - repo: local diff --git a/blogs/deepspeed-gds/README.md b/blogs/deepspeed-gds/README.md index 34416c07ea4d..84a97cb22eab 100644 --- a/blogs/deepspeed-gds/README.md +++ b/blogs/deepspeed-gds/README.md @@ -17,7 +17,7 @@ this problem, DeepSpeed has created a suite of I/O optimizations collectively ca DeepNVMe improves the performance and efficiency of I/O-bound DL applications by accelerating I/O operations and reducing hardware requirements. It achieves this by leveraging storage innovations such as Non-Volatile -Memory Express (NVMe) Solid Storage Devices (SSDs) and NVIDIA Magnum IOTM GPUDirect® Storage (GDS). In this +Memory Express (NVMe) Solid State Drives (SSDs) and NVIDIA Magnum IOTM GPUDirect® Storage (GDS). In this blog we show the benefits of DeepNVMe using microbenchmarks and an inference application. In experiments conducted on an Azure NC96ads\_A100\_v4 VM, we observed that DeepNVMe saturates available NVMe bandwidth for data transfers with GPU or CPU memory, achieving up to 10GB/sec reads and 5 GB/secs writes. diff --git a/docs/_data/navigation.yml b/docs/_data/navigation.yml index 3bd3e451ab49..b17685b8dc4d 100755 --- a/docs/_data/navigation.yml +++ b/docs/_data/navigation.yml @@ -55,6 +55,10 @@ lnav: url: /getting-started/ - title: 'Getting started on Azure' url: /tutorials/azure/ + - title: 'Accelerator Abstraction' + url: /tutorials/accelerator-abstraction-interface/ + - title: 'Accelerator Setup Guides' + url: /tutorials/accelerator-setup-guide/ - title: 'Automatic Tensor Parallelism' url: /tutorials/automatic-tensor-parallelism/ - title: 'Autotuning' @@ -69,6 +73,8 @@ lnav: url: /tutorials/curriculum-learning/ - title: 'Data Efficiency' url: /tutorials/data-efficiency/ + - title: 'DeepNVMe' + url: /tutorials/deepnvme/ - title: 'DS4Sci_EvoformerAttention' url: /tutorials/ds4sci_evoformerattention/ - title: 'Flops Profiler' diff --git a/docs/_tutorials/accelerator-abstraction-interface.md b/docs/_tutorials/accelerator-abstraction-interface.md index ec92d5ebcb93..a1aa38725970 100644 --- a/docs/_tutorials/accelerator-abstraction-interface.md +++ b/docs/_tutorials/accelerator-abstraction-interface.md @@ -1,6 +1,6 @@ --- title: DeepSpeed Accelerator Abstraction Interface -tags: getting-started +tags: getting-started training accelerator --- # Contents diff --git a/docs/_tutorials/accelerator-setup-guide.md b/docs/_tutorials/accelerator-setup-guide.md index 36d33f31b5b3..4936e53fc00c 100644 --- a/docs/_tutorials/accelerator-setup-guide.md +++ b/docs/_tutorials/accelerator-setup-guide.md @@ -1,6 +1,6 @@ --- title: DeepSpeed Accelerator Setup Guides -tags: getting-started +tags: getting-started training accelerator --- # Contents diff --git a/docs/_tutorials/deepnvme.md b/docs/_tutorials/deepnvme.md new file mode 100644 index 000000000000..480bcf2d95df --- /dev/null +++ b/docs/_tutorials/deepnvme.md @@ -0,0 +1,247 @@ +--- +title: "DeepNVMe" +tags: training inference IO large-model +--- +This tutorial will show how to use [DeepNVMe](https://github.com/microsoft/DeepSpeed/blob/master/blogs/deepspeed-gds/README.md) for data transfers between persistent storage and tensors residing in host or device memory. DeepNVMe improves the performance and efficiency of I/O operations in Deep Learning applications through powerful optimizations built on Non-Volatile Memory Express (NVMe) Solid State Drives (SSDs), Linux Asynchronous I/O (`libaio`), and NVIDIA Magnum IOTM GPUDirect® Storage (GDS). + +## Requirements +Ensure your environment is properly configured to use DeepNVMe. First, you need to install DeepSpeed version >= [0.15.0](https://github.com/microsoft/DeepSpeed/releases/tag/v0.15.0). Next, ensure that the DeepNVMe operators are available in the DeepSpeed installation. The `async_io` operator is required for any DeepNVMe functionality, while the `gds` operator is required only for GDS functionality. You can confirm availability of each operator by inspecting the output of `ds_report` to check that compatible status is [OKAY]. Below is a snippet of `ds_report` output confirming the availability of both `async_io` and `gds` operators. + +![deepnvme_ops_report](/assets/images/deepnvme_ops_report.png) + +If `async_io` operator is unavailable, you will need to install the appropriate `libaio` library binaries for your Linux flavor. For example, Ubuntu users will need to run `apt install libaio-dev`. In general, you should carefully inspect `ds_report` output for helpful tips such as the following: + +```bash +[WARNING] async_io requires the dev libaio .so object and headers but these were not found. +[WARNING] async_io: please install the libaio-dev package with apt +[WARNING] If libaio is already installed (perhaps from source), try setting the CFLAGS and LDFLAGS environment variables to where it can be found. +``` + +To enable `gds` operator, you will need to install NVIDIA GDS by consulting the appropriate guide for [bare-metal systems](https://docs.nvidia.com/gpudirect-storage/troubleshooting-guide/index.html) or Azure VMs (coming soon). + + +## Creating DeepNVMe Handles +DeepNVMe functionality can be accessed through two abstractions: `aio_handle` and `gds_handle`. The `aio_handle` is usable on both host and device tensors. while `gds_handle` works only on CUDA tensors, but is more efficient. The first step to use DeepNVMe is to create a desired handle. `aio_handle` requires `async_io` operator, while `gds_handle` requires both `async_io` and `gds` operators. The following snippets illustrate `aio_handle` and `gds_handle` creation respectively. + +```python +### Create aio_handle +from deepspeed.ops.op_builder import AsyncIOBuilder +aio_handle = AsyncIOBuilder().load().aio_handle() +``` + +```python +### Create gds_handle +from deepspeed.ops.op_builder import GDSBuilder +gds_handle = GDSBuilder().load().gds_handle() +``` + +For simplicity, the above examples illustrate handle creation using default parameters. We expect that handles created with default parameters to provide good performance in most environments. However, you can see [below](#advanced-handle-creation) for advanced handle creation. + +## Using DeepNVMe Handles +`aio_handle` and `gds_handle` provide identical APIs for storing tensors to files or loading tensors from files. A common feature of these APIs is that they take a tensor and a file path as arguments for the desired I/O operation. For best performance, pinned device or host tensors should be used for I/O operations (see [here](#pinned-tensors) for details). For brevity, this tutorial will use `aio_handle` for illustration, but keep in mind that `gds_handle` works similarly. + +You can see the available APIs in a Python shell via tab completion on an `aio_handle` object . This is illustrated using tab completion of `h.`. + +```bash +>python +Python 3.10.12 (main, Jul 29 2024, 16:56:48) [GCC 11.4.0] on linux +Type "help", "copyright", "credits" or "license" for more information. +>>> from deepspeed.ops.op_builder import AsyncIOBuilder +>>> h = AsyncIOBuilder().load().aio_handle() +>>> h. +h.async_pread( h.free_cpu_locked_tensor( h.get_overlap_events( h.get_single_submit( h.new_cpu_locked_tensor( h.pwrite( h.sync_pread( h.wait( +h.async_pwrite( h.get_block_size( h.get_queue_depth( h.get_thread_count( h.pread( h.read( h.sync_pwrite( h.write( +``` +The APIs of interest for performing I/O operations are those named with `pread` and `pwrite` substrings. For brevity, we will focus on the file write APIs, namely `sync_pwrite`, `async_pwrite`, and `pwrite`. We will discuss only `sync_pwrite` and `async_pwrite` below because they are specializations of `pwrite`. + +### Blocking File Write +`sync_pwrite` provides the standard blocking semantics of Python file write. The example below illustrates using `sync_pwrite` to store a 1GB CUDA tensor to a local NVMe file. + +```bash +>>> import os +>>> os.path.isfile('/local_nvme/test_1GB.pt') +False +>>> import torch +>>> t=torch.empty(1024**3, dtype=torch.uint8).cuda() +>>> from deepspeed.ops.op_builder import AsyncIOBuilder +>>> h = AsyncIOBuilder().load().aio_handle() +>>> h.sync_pwrite(t,'/local_nvme/test_1GB.pt') +>>> os.path.isfile('/local_nvme/test_1GB.pt') +True +>>> os.path.getsize('/local_nvme/test_1GB.pt') +1073741824 + +``` + +### Non-Blocking File Write +An important DeepNVMe optimization is the non-blocking I/O semantics which enables Python threads to overlap computations with I/O operations. `async_pwrite` provides the non-blocking semantics for file writes. The Python thread can later use `wait()` to synchronize with the I/O operation. `async_write` can also be used to submit multiple back-to-back non-blocking I/O operations, of which can then be later blocked on using a single `wait()`. The example below illustrates using `async_pwrite` to store a 1GB CUDA tensor to a local NVMe file. + +```bash +>>> import os +>>> os.path.isfile('/local_nvme/test_1GB.pt') +False +>>> import torch +>>> t=torch.empty(1024**3, dtype=torch.uint8).cuda() +>>> from deepspeed.ops.op_builder import AsyncIOBuilder +>>> h = AsyncIOBuilder().load().aio_handle() +>>> h.async_pwrite(t,'/local_nvme/test_1GB.pt') +>>> h.wait() +1 +>>> os.path.isfile('/local_nvme/test_1GB.pt') +True +>>> os.path.getsize('/local_nvme/test_1GB.pt') +1073741824 +``` + +Warning for non-blocking I/O operations: To avoid data races and corruptions, `.wait()` must be carefully used to serialize the writing of source tensors, and the reading of destination tensors. For example, the following update of `t` during a non-blocking file write is unsafe and could corrupt `/local_nvme/test_1GB.pt`. + +```bash +>>> t=torch.empty(1024**3, dtype=torch.uint8).cuda() +>>> from deepspeed.ops.op_builder import AsyncIOBuilder +>>> h = AsyncIOBuilder().load().aio_handle() +>>> h.async_pwrite(t,'/local_nvme/test_1GB.pt') +>>> t += 1 # <--- Data race; avoid by preceding with `h.wait()` +``` + +Similar safety problems apply to reading the destination tensor of a non-blocking file read without `.wait()` synchronization. + + +### Parallel File Write +An important DeepNVMe optimization is the ability to parallelize individual I/O operations. This optimization is enabled by specifying the desired parallelism degree when constructing a DeepNVMe handle. Subsequent I/O operations with that handle are automatically parallelized over the requested number of host or device threads, as appropriate. I/O parallelism is composable with either the blocking or non-blocking I/O APIs. The example below illustrates 4-way parallelism of a file write using `async_pwrite`. Note the use of `num_threads` argument to specify the desired parallelism degree in handle creation. + +```bash +>>> import os +>>> os.path.isfile('/local_nvme/test_1GB.pt') +False +>>> import torch +>>> t=torch.empty(1024**3, dtype=torch.uint8).cuda() +>>> from deepspeed.ops.op_builder import AsyncIOBuilder +>>> h = AsyncIOBuilder().load().aio_handle(num_threads=4) +>>> h.async_pwrite(t,'/local_nvme/test_1GB.pt') +>>> h.wait() +1 +>>> os.path.isfile('/local_nvme/test_1GB.pt') +True +>>> os.path.getsize('/local_nvme/test_1GB.pt') +1073741824 +``` + +### Pinned Tensors +A key part of DeepNVMe optimizations is using direct memory access (DMA) for I/O operations, which requires that the host or device tensor be pinned. To pin host tensors, you can use mechanisms provided by [Pytorch](https://pytorch.org/docs/stable/generated/torch.Tensor.pin_memory.html) or [DeepSpeed Accelerators](/tutorials/accelerator-abstraction-interface/#tensor-operations). The following example illustrates writing a pinned CPU tensor to a local NVMe file. + +```bash +>>> import os +>>> os.path.isfile('/local_nvme/test_1GB.pt') +False +>>> import torch +>>> t=torch.empty(1024**3, dtype=torch.uint8).pin_memory() +>>> from deepspeed.ops.op_builder import AsyncIOBuilder +>>> h = AsyncIOBuilder().load().aio_handle() +>>> h.async_pwrite(t,'/local_nvme/test_1GB.pt') +>>> h.wait() +1 +>>> os.path.isfile('/local_nvme/test_1GB.pt') +True +>>> os.path.getsize('/local_nvme/test_1GB.pt') +1073741824 +``` + +On the other hand,`gds_handle` provides `new_pinned_device_tensor()` and `pin_device_tensor()` functions for pinning CUDA tensors. The following example illustrates writing a pinned CUDA tensor to a local NVMe file. + +```bash +>>> import os +>>> os.path.isfile('/local_nvme/test_1GB.pt') +False +>>> import torch +>>> t=torch.empty(1024**3, dtype=torch.uint8).cuda() +>>> from deepspeed.ops.op_builder import GDSBuilder +>>> h = GDSBuilder().load().gds_handle() +>>> h.pin_device_tensor(t) +>>> h.async_pwrite(t,'/local_nvme/test_1GB.pt') +>>> h.wait() +1 +>>> os.path.isfile('/local_nvme/test_1GB.pt') +True +>>> os.path.getsize('/local_nvme/test_1GB.pt') +1073741824 +>>> h.unpin_device_tensor(t) +``` + + +## Putting it together +We hope that the above material helps you to get started with DeepNVMe. You can also use the following links to see DeepNVMe usage in real-world Deep Learning applications. + +1. [Parameter swapper](https://github.com/microsoft/DeepSpeed/blob/9b7fc5452471392b0f58844219fcfdd14a9cdc77/deepspeed/runtime/swap_tensor/partitioned_param_swapper.py#L111-L117) in [ZeRO-Inference](https://github.com/microsoft/DeepSpeedExamples/blob/master/inference/huggingface/zero_inference/README.md) and [ZeRO-Infinity](https://www.microsoft.com/en-us/research/blog/zero-infinity-and-deepspeed-unlocking-unprecedented-model-scale-for-deep-learning-training/). +2. [Optimizer swapper](https://github.com/microsoft/DeepSpeed/blob/9b7fc5452471392b0f58844219fcfdd14a9cdc77/deepspeed/runtime/swap_tensor/partitioned_optimizer_swapper.py#L36-L38) in [ZeRO-Infinity](https://www.microsoft.com/en-us/research/blog/zero-infinity-and-deepspeed-unlocking-unprecedented-model-scale-for-deep-learning-training/). +3. [Gradient swapper](https://github.com/microsoft/DeepSpeed/blob/9b7fc5452471392b0f58844219fcfdd14a9cdc77/deepspeed/runtime/swap_tensor/partitioned_optimizer_swapper.py#L41-L43) in [ZeRO-Infinity](https://www.microsoft.com/en-us/research/blog/zero-infinity-and-deepspeed-unlocking-unprecedented-model-scale-for-deep-learning-training/). +4. Simple file read and write [operations](https://github.com/microsoft/DeepSpeedExamples/blob/master/deepnvme/file_access/README.md). + + + + +## Acknowledgements +This tutorial has been significantly improved by feedback from [Guanhua Wang](https://github.com/GuanhuaWang), [Masahiro Tanaka](https://github.com/tohtana), and [Stas Bekman](https://github.com/stas00). + +## Appendix + +### Advanced Handle Creation +Achieving peak I/O performance with DeepNVMe requires careful configuration of handle creation. In particular, the parameters of `aio_handle` and `gds_handle` constructors are performance-critical because they determine how efficiently DeepNVMe interacts with the underlying storage subsystem (i.e., `libaio`, GDS, and SSD). For convenience we make it possible to create handles using default parameter values which will provide decent performance in most scenarios. However, squeezing out every available performance in your environment will likely require tuning the constructor parameters, namely `block_size`, `queue_depth`, `single_submit`, `overlap_events`, and `num_threads`. The `aio_handle` constructor parameters and default values are illustrated below: +```bash +>>> from deepspeed.ops.op_builder import AsyncIOBuilder +>>> help(AsyncIOBuilder().load().aio_handle()) +Help on aio_handle in module async_io object: + +class aio_handle(pybind11_builtins.pybind11_object) + | Method resolution order: + | aio_handle + | pybind11_builtins.pybind11_object + | builtins.object + | + | Methods defined here: + | + | __init__(...) + | __init__(self: async_io.aio_handle, block_size: int = 1048576, queue_depth: int = 128, single_submit: bool = False, overlap_events: bool = False, num_threads: int = 1) -> None + | + | AIO handle constructor +``` + +### DeepNVMe APIs +For convenience, we provide listing and brief descriptions of the DeepNVMe APIs. + +#### General I/O APIs +The following functions are used for I/O operations with both `aio_handle` and `gds_handle`. + +Function | Description | +|---|---| +async_pread | Non-blocking file read into tensor | +sync_pread | Blocking file read into tensor | +pread | File read with blocking and non-blocking options | +async_pwrite | Non-blocking file write from tensor | +sync_pwrite | Blocking file write from tensor | +pwrite | File write with blocking and non-blocking options | +wait | Wait for non-blocking I/O operations to complete | + +#### GDS-specific APIs +The following functions are available only for `gds_handle` + +Function | Description +|---|---| +new_pinned_device_tensor | Allocate and pin a device tensor | +free_pinned_device_tensor | Unpin and free a device tensor | +pin_device_tensor | Pin a device tensor | +unpin_device_tensor | unpin a device tensor | + + +#### Handle Settings APIs +The following APIs can be used to probe handle configuration. + +Function | Description +|---|---| +get_queue_depth | Return queue depth setting | +get_single_submit | Return whether single_submit is enabled | +get_thread_count | Return I/O parallelism degree | +get_block_size | Return I/O block size setting | +get_overlap_events | Return whether overlap_event is enabled | diff --git a/docs/assets/images/deepnvme_ops_report.png b/docs/assets/images/deepnvme_ops_report.png new file mode 100644 index 0000000000000000000000000000000000000000..c05e9b863b77c6810be396bc382ca285d4e719b3 GIT binary patch literal 8964 zcmaKS1yoesyFLg=DIqYZNS6pRgMKnA)SJRbVxTt*WiGplr)UAAdPfN z$p4_<_y66y?z)$?4$KVa?04^XzwtcJp758-GIt3c5@29p+?A7+RKvi)gaNOc@NNUY zEl*B&fIpbdYBJ&&h`~o2z#D9HF(ok!jH>s9mqs|idwd63ZD$M&5cAE2DW}G?hk?P6 zA}1;K%3XgugD{3-BBOig#r@C+k}n59IgP!^BoReaMr5=19ZXH=6TWv-C*S98BcTwx zg}+ns)KH6F%(#u9O9CBs%Y#&IKwN{3EU*$r_h4@C2@la5Mscg$7`lNwoSZdlf^*j? znKKO+t_xnx8(wP{uU%X|IwOaK8Vc8%uZ4XE(ae-(J2Q@+N}&RW@}UetByn%$w|VJ< zV#2b9?}^KHzO=xnXEJ_V8$@#NDI(P9bl$51xfnt4PNi1SgV+GlYmM;L(#xWHSSwXaA4U$YJ7m;r9u^Z1Ssv8Ko>LnKp$>xZE5D z-uqHDFHXLhxFUiLwC{IEQ(JG+waL0EeZO3MQ4m+r8Y`O3EG4I;6!q|hdu2u+b;Vm* zCX~&w@Gpa;h7(%%CgsL8u-+Co^KR> zgGlPdyIe$f4I2miIwPLgsf6P^z&*>am8{)3l-1OZ|FIVV{gM(2f zy4HD!$Rg>`8>(HMcX;9D6RLPU_H9AI;M1T>L2K*+FD6M-&Yj}|c9qbDg~!yE!LEbp z{8qd3r~=HWs3?~0ytmiCt!5h?SNn}WD$+81fBy45^p&Qj`5KHB_m|s(Ps8S1bAvWv zlCD#DDvxEH_E4sf4lf^H+E9m_bTi5Hk8fa|`XcR`H&ZgPnSCGF)CZ3Dx~c5H@z3oe zZ`-4eHR{ZVXw*Y+(0nmEvUKR?JpYBdw7b4&UWC_k39ue=ytbmcdUW|Cco@-oxdOFn z55l+F94{`Zt9z~II%QTcpd#_@Cuf$w+Vak!dtm?k$=JwlT-yhK@8 zQX*fj(=eE)Sq?KB9c&@qX!urZ8E<)6q?)TJKz6`BHa>2;N&b@0SFZa#tv!S$-GX(u z<-%_5yeF1%HIj%{cy`?X#NVtxF~$3r850w=KKi>q7VdZ$DWf8Guq-87jf6|D*=WBR zp&H`4bWPOb#!n?%Sz|H6aQL>#enFTqXr|tlFpqxY&pdlin?TDia<;{eIH0#@RY=6aL5)+-v zlDiMMByH!A6L~e54G%+!X*K$jpu3mBpDUya_NceTn(OTs?CkVN+D*1?3Te-d#TJy1 z2K0%{tsD#AxgEBDJcA#ueno_V(9;Q;`j&+p0s7575<-mu{i2b*>>0^3G%#3>0 zn!1|;=&}h#TjI+CEy8Fwj+lFzlu!8x2&SX$a4Q{uNY{YcFQY!m&d5ZzL>P61Jjn0f zCLdKEh6V~Fa0o%kJ`Tn;I1Q8*JOUp`rGCz%W^@(Tx%;uFgAJZAJf<>++rq|Bgo{u0_FOwvq;-U+!&HDC)l(MEZ? znA5WCJvl@IGY;Wl5WKuzyym>~OBmgVP?1@}rwe z#Aza4@R>h0g^Od0s9!6Q;N}W-BL(VR<(A+7TDgQmggu+ebHu;y&guB%a<#Z2Q~}#U z0dFVT&!;`sioI%kl*f$)kJFvU^Yiy*>3|}rHtwBQrdYl^CNqZ!p6HFVwcUKbz3uu0 z_B=X~oZ7kdcxW@n|7zeQTjc8X*Q>#y0oVHF<`&}|G*ehu-JGLVas9-k>#TcSu7O-Q zOzU;NReyi^ov%YG8EQk;u~%O=#$2PRB(vOQoM@@{jrH=kiYFtTsR)q_F~3oupXP9s zKDm@6dqo%v_PZv#aV6yAiy%r&^b2)#y}O3?1|v9nL0 zj}Bg6Js@=PtW@EXRK>IXw>&dQ7W-Tfl?WDyj6Cr1{gtRv+JQ@}K2&xQB8Qb1OZ-Ne zw)Es`$0$COcl6e#sNRr`MXhsK{K=Jk25eR+b(>eLcwS^=Wd3mSq2){8z=XBD(|8TZ zCr8M!=|bbgjO^m{ili0S_U`4WUCB=K+`EMa^`lve(7SANIQ@09^QB#md7uSHlxJ}h zjIQB$yL5HqxX|UHDSO238C-%qc=#C)PjXRWjN&`wYVPKen7~g*&ZQFK;%4)A>RXxf z2*`b&t}@!Q)iotye3gwA7)NWK)GmKM4AC%&vTHa{XM0dY>2ru#1?m$i9uus6DR3fE zELDGGtWbox`D7w?tJpMIA(>?jH$4vn%|SP1pHasQw7SBRg=dA#2a9Y4 zZvC#)AKtD!S(ZC4(x(x26c;MW{o!@2cJcdS^*(fz06Z@q-k`da(E2U$v@Q^6I3;z~ z=v1dET*Z&VbIXElrS2<AKIgKH+LiuFQnY@c};SD#hf>xYC#RrE*`tTBQO@%c&)|JlhJU)-|Qt~h{ z$(18J=x~9S4*8rs5j1nObIJGI-Fqr%Hj)!e`HSfV^Xo}0Hdbn|MvEUJs81>}CeyQh zaQwp-UgMRLf);&_S+vOOnfJ%P1xlp&u%aad@T_a;d{IE!bZtO zE`mV=xiHS$`=A&Ni!T6-Vd&id@ujq{Po6QR{h#(FKr1S@{A;Iqw`6;!p_I!0(?}lB z7Z9#Hvz7-ql1W*`#d5DVDyhThps?DWpUpSD>#}|>JT-3+o1)O$;D$NGg6LXo*Fze+BJ5&``tN~}?sP2Pm1Tov-?s@fq{LGb0CSn21`)=Q`3)wFX( z9MjK!m?s)Lk0y*n==E(bSFATrD&Q`(kF15WZ|gcBGOCM8Hh+@@V}FsXIC;t5_TXy( zi28koXoFZOXfSPCQK`5k7L48}p$R!g_D1NAWYEY6hq?abl6#9wB=Nv~w3qRH=k1E3z5iOeU3Mqa=+j|Ki*DE{OZSNb`D)*j2u`8$GW^3~`s9P`Pgz;${@Z zbKuM@x5hD3U72NHx9tdyIe7^wi&Z}T-uL2hP409Yar5bhg<8o^dBIq7&QwF>By#IL zHFu;s{7{LByJN5atdG3{F5NkGYvjn&44c79d~|;S`oa)-YtL_MyMee=rzMUHgPTdj z`vAi0zK2sFh)LWlEVL@t9As$2j>O;FE4|86D{Qf*>{RT!60jOqt??j18@nhlg?}Od zBPpe$9_9<5RJ~7$#U8{p3hKn6fy;el@6@32GgD~UVrS_)vh@j{L(MssSto1EGUZe2 zFDqG)`YeHbu76);Fyi3>y`DdZIf!HlU>6ZYNVl%gBKnH)j=oL{h(2fxy*lFDD_e^B4yAiyACfLy2ECWTERFO2IE>#@Xm;H~{H z#1bVp1EQkIOz&_`%0xff0I|ilhwSL}ez$3I%K*P1kABvg$>4upC@j?n_696`r zR?hLOyu9G2$3R3?2FIJBv%Qk2l7_|Kkv!;2vpLbH);<|Pi)gPr`LE6M{ ztJAhY(yur+>x`K0JeU+`wwjCI%R`J3l4z!$NC+%W69l-ZNselyU43$+Hn@)LXklq_ zGysQCu_>(PV@(nze9>6@nOT$QDZ;_b2$)*hFn0%?w>uuoRe_kO$P>LrSzW-V!ho;d zX$2+5+?fB5lkcbYk^E5$Bx1|rpoNLYr z-O;nt6(mV(0%zFX3 zga7z8vhC&{A~{9sJ(K+5W*hxZ{yTb$eeL3>5I#%BX>qq*d7(jkB+f9!tx94Dgnp(T zn_kXNvFqi3@%jeoj$T;xJ{HL{0_I@+f1LnRf6&w=Ln&=*TketYbs&XXiH6PYpHP$@ zAplR~59e0_N)3iQ?l9!j)YVUiSYXr&Lzef57v?-^vczAf=55JMbf&cp! zh%Y|Vx7)~d-96}-A{yVo-i9leh{9s7s-$(MwnZ`iaqK98?d*=8@8_R5A2AP8U#$+L z3NrDZ;E z1UC{c{HDxo%c-;atna^X&-1zFpu1Gh?&sQiPi{_>3SI=Mih%G0uxVxvUfRrm^04|= zX~bgR8Ai&IK^(W7-dTP0Uo(JaabC(31WX->Q=D82B{SKfV8Hi4gd6_V#Vnpk{8hN5 zfZDSZxF&Ev^M^(5E#hv|bGywCF!2K*wElct1+*UIpVrgSKK{*^%F&OOcx`}()z^&a z`X;N~5!_^@!|kgMXoTKe!Qs7otT$FOw;(s^;GFN=B`z5;=onxd2q6`+QK0A0WCMrmZL{zSO#;v_w4oH<>*@AskNZ z+b)knV#J0qrg6ShQVY5kJvHf0{-gkD>QtoY_B{DHRnpWng;%oR*7K^6mPCHs?R3s9 zEyY<2>nRksh-xP8gq>`i3j`F|Ka0{87xX@J_`y$?gS46AVwAndwlsNNQd)LH1CxCT zM~V z9sdE`vk^@AgGit-bm0!UP-gnn-gAk->v?36SJBvh0O>fdL+f+TOd&0Cgdl0YdKJ5L zLB(VYf+pQ}$a>>$TH=12v+d$Nm}H7W+jNUh^V8qb%i(nc*c}fW)*J73pBIW;755HJ zDzVS}xa>KiuEu2H`&Ywx_kq+$egXQ~T;IdY6ZcMQwavb>?vs;hT_AKDt98Q;by-tt zNx>lo{BzAfdt2~(6X-i0%P5oT`4E!ka)`vxLya=>gPrWkSR+K|^A%cQ^ zd}pp%X`yl~!{+MzxZtXYGP35Pqk=;xZh4Q~?VpYc>GVLv-!Tv2_rn`AE8DxN%X_-G zf&aiGz!#i<<=f0$q8s#tD_xtn-qV2f>IQDPBLWwxMwS*y-movS@z+P*RebgR19~Yi zS`F|9^&OS$U;eb1Vt%}36m4yYTDtLo`SoH}I!p(c+ zFlZrIGMt2ULk;iAtFc0r-50lKw6G-8tM3j=Eh?JaemMFZG_%J+5(B-+)kR{ayW}|! zv@_xKDs112^|0#Lq~!W?Z62obePG*un%docExArwq{*-&(6> z4m+bGzKD9r+n0y(O9M$Nc$40+tw}Mz&k~oYM>Ttl7zZ2PI90lz+^YoK_YBP!;IE<$ zne^8mQ_#LZ>$$s9Ghv4PoN^ctAHUNtwJ+(wK-z-my*ayQyfX#?{k;pMjbDC-nWccC zcjsQ0$Npw%#X~I6hOZx4q8}ICRSKmZJXSk*hb~&%*YrnnFvL$R@OINXc#Z=$S+&dS z&E9`15YUMsk!3+3;@)9aq+#1FvMIBOrI*n=wlHXU>^=be=j*t~`Y?Sw zv1ZxLkna3%Di~?n(L-$3E(0 zDLSOUR-thsjkEu|fVQ5r;Shgug`A*&;^42ireucq=Pckq;p3?k5T-Rl9hzXJV{7|G z>89oH7Gb^k-Y$y)r|ePxRV3DMOBhOKL44A2?}V+Dwn#;qHKzS$RMiuFFaxhE1LlWJ z`#LsDAe;b{X?ik9UDpI@XCEpy?WO^?K6A9cPRmy=GBeu$ ze-Uorrkmfc^FULhk>KpxMWwG~5QUT48+kw2YBy$^)$F%cPV_$iL;#YD>-=c$jM!%z z1bk3a6#2N)uw7L6a}S;+R(;no;R2?ur10dr>*soB={pQ&{Lc^&vU|ig6R1{Un;4m< zSTvq<9PU$DNpCKz=7wrplIr8JPcjTrza0%gNfBH~% zlDv{AldEnddd62;-;HrD(<|s2&(iZ1l2WgX9>o)zo@oi7p#zuyRrzl&I9}3%r)AlS z6<)?IOUM+jvlUm<$ntMkR2|^JnO{MwgO0|@Tnh?xWj=4)!`cZ*!OoY()4pY=XjL%s zfy1NG-~a`Sz(zL@%utA;M}lUjEcwQoH}jyrnuw$j?e|bjk%#&SgXD8|>-#;jI{vko zb1Y)By|Rmqj%-u?yAe5oC zb!ka?Iqz?5WhMa-eaELw&iPs~|DM(UV?x!6FfKMCAQHhWo^_!x{6Py)?QGFFKAfu7 zYVp$)AjaqySw44EoCL}P zlAaz3H^u2zk*dtsRWaSj32-dabDSh{Y9R35bNT2P7`xfKJ=%I$K*1+x8A|zoGNQdG z3o|PYX`D`83W|rP^AS0-S?McGI9Qb*_3_q zX=BITzwLnDZ%1z=a7q`xyBS?L3_^NQBFXZoi|1&3ZDRra==E*;yi5v^Ce*^j*@olSs(DbLh zQ;RbO$D9tTJq(qc9tKX3`egS3@&dp|#3R`VuOwQT_cV14vMK;#8@U1N*+KOHWxN!< z7*0Gt_l%cbj)KR836cE|a%%ljE*#lftv2VO{6eJY?^AxY9aCry;;!LD;JhT|1>A-1 z1}-+f`uQ(fltX%;On5)~OPvZ{0UP zcxubkIs)gnLIgL=_Kh<$u<?xNgv>dBWjpX`pIQHf-rV} zpilmIdmc5x`1-Y#l1tsWx1VF9WiaT6=2H)h$m9XM!Rl9qV3AXZc-#$*U}f9UBWakS z9{G8yoc=O&dM3(`XkzIX8#pt$3}e5uGdQ%?0WsR%v@z>Ek=f!i@eFlYtwMXuh%(gr zc3Rt*Q*jDGU4zdXZ&dzRWVD9>lnj!sASN878*||E*=B^>?C5D-GbVuk*FU-(MbaBWGlk22eF2Xh02+Q+bi{Re-D{uR zd?_V6I}I1lU-io7?LcL+gQcX`b2Yh<#$f{#3@qok>!}}^OZiox-A5^Mo%l#tq1IhE zi`P08^feq%%eUs=8t7#wSw~ZI$3NT|{&l)>fa59hPU|yP-Sw#IPX(Bt8;*D7>c3NT z_${|KPZ4C35v(=I{cmxJBR@qfSkhlnf@8v@_vr@Y>Y{BbMoD*QUB;2Rk!vbP!mX1z z;U@DV7X>>X+5dRXDGu=45Q?2l&WYVv`{4hN#B_?d3lk-cB0`UBP@lWLO#n?aP~YZS zD5;euX$;~VGEILF5{q3aHPFqP7*lh@d~%0pn=z!R2S%16RIzR$F;^|HK5Mq;c>YRtn_63ic19r>_)5^Ss`JbdKg$(`v=pbMXz2P;ak& z>wq)e8YMjXE^HPmj`5N5_zLSPpJ$(A$~lK$g^-NqwgKT%S~8CDWw>HD{du-VXtGoy zKJXQTKe|tfZp{({+ErHrR??E&b@Ic^%r%;8%!PI`AdT3Yw!XJBu(F3o4=!ey_E+2> z5Af0?Nu8dV(0os;*$Rh0Fg&+wB_Vrs`FP`cxyf0j!jg}LsJKkKMjCZIsUz(Wc*_V; zTB=Sge3s?01*UhbIYtu~p$*>3%sur<$jBW}YITo-U811HFD_=|&4w)m^q1U0^V})+>-j`?4pFbbH+`Pt|64hv{gi*Ty Q-(10vlTwyMh#Lm{KU9c+tpET3 literal 0 HcmV?d00001 From 9d17116fcdb44b81eb00d3bce91431dc35cd69b1 Mon Sep 17 00:00:00 2001 From: "Joshua C. Randall" Date: Wed, 4 Sep 2024 19:22:07 +0100 Subject: [PATCH 503/754] print warning if actual triton cache dir is on NFS, not just for default (#6487) move the logic that prints a warning when triton cache dir is on NFS to act on the actual calculated cache_dir rather than on the default. this means that: - when the default directory (in the user's home directory) is on NFS but `TRITON_CACHE_DIR` is set to a non-NFS directory, no warning will be printed whereas prior to this change a spurious and confusing warning was printed - when the user's home directory is not on NFS but `TRITON_CACHE_DIR` is set to an NFS directory, a warning will be printed whereas prior to this change no warning would be printed fixes #6486 --- .../ops/transformer/inference/triton/matmul_ext.py | 14 +++++++++----- 1 file changed, 9 insertions(+), 5 deletions(-) diff --git a/deepspeed/ops/transformer/inference/triton/matmul_ext.py b/deepspeed/ops/transformer/inference/triton/matmul_ext.py index c77d8a8e11c0..412c8740a216 100644 --- a/deepspeed/ops/transformer/inference/triton/matmul_ext.py +++ b/deepspeed/ops/transformer/inference/triton/matmul_ext.py @@ -40,13 +40,17 @@ class TritonCacheDir: _warning_printed = False @staticmethod - def default_cache_dir(): - tmp_path = os.path.join(Path.home(), ".triton", "autotune") - if is_nfs_path(tmp_path) and not TritonCacheDir._warning_printed: + def warn_if_nfs(cache_dir): + if is_nfs_path(cache_dir) and not TritonCacheDir._warning_printed: print( - f"Warning: The default cache directory for DeepSpeed Triton autotune, {tmp_path}, appears to be on an NFS system. While this is generally acceptable, if you experience slowdowns or hanging when DeepSpeed exits, it is recommended to set the TRITON_CACHE_DIR environment variable to a non-NFS path." + f"Warning: The cache directory for DeepSpeed Triton autotune, {cache_dir}, appears to be on an NFS system. While this is generally acceptable, if you experience slowdowns or hanging when DeepSpeed exits, it is recommended to set the TRITON_CACHE_DIR environment variable to a non-NFS path." ) TritonCacheDir._warning_printed = True + return + + @staticmethod + def default_cache_dir(): + tmp_path = os.path.join(Path.home(), ".triton", "autotune") return tmp_path @@ -80,9 +84,9 @@ def __init__(self, key): self.lock_path = None # if caching is enabled, get the lock and bin path self.cache_dir = os.environ.get('TRITON_CACHE_DIR', TritonCacheDir.default_cache_dir()) + TritonCacheDir.warn_if_nfs(self.cache_dir) if self.cache_dir: os.makedirs(self.cache_dir, exist_ok=True) - if self.cache_dir: self.file_path = os.path.join(self.cache_dir, self.key + ".pickle") self.lock_path = self.file_path + ".lock" From ddeb0c19a006fd7b632e82655051073ac100a9b4 Mon Sep 17 00:00:00 2001 From: Masahiro Tanaka <81312776+tohtana@users.noreply.github.com> Date: Wed, 4 Sep 2024 11:43:20 -0700 Subject: [PATCH 504/754] Fix patch for parameter partitioning in zero.Init() (#6388) This PR fixes an issue addressed in #5921. With this change, we only apply the patch for parameter partitioning to classes that have `__init__` so that we can avoid applying the patch multiple times. The class that does not have `__init__` now uses its superclass's one. So this PR also applies the patch to the root class, `torch.nn.modules.module.Module`. Thanks @VeryLazyBoy for the report and initial solution. --------- Co-authored-by: Logan Adams <114770087+loadams@users.noreply.github.com> --- .../runtime/zero/partition_parameters.py | 28 ++++++++++++------- 1 file changed, 18 insertions(+), 10 deletions(-) diff --git a/deepspeed/runtime/zero/partition_parameters.py b/deepspeed/runtime/zero/partition_parameters.py index e01925cbd32b..22a6746bb57c 100755 --- a/deepspeed/runtime/zero/partition_parameters.py +++ b/deepspeed/runtime/zero/partition_parameters.py @@ -262,7 +262,7 @@ def new_tensor(cls, *args, **kwargs) -> Tensor: # https://stackoverflow.com/a/63851681/9201239 -def get_all_subclasses(cls): +def get_all_subclasses(cls, include_root=True): subclass_list = [] def recurse(cl): @@ -272,7 +272,10 @@ def recurse(cl): recurse(cls) - return set(subclass_list) + ret = set(subclass_list) + if include_root: + ret.add(cls) + return ret @instrument_w_nvtx @@ -465,11 +468,13 @@ def wrapper(*args, **kwargs): return wrapper def _enable_class_apply(cls): - cls._old_apply_of_skip_init_hook = cls._apply - cls._apply = partition_after_empty_init(cls._apply) + if '_apply' in cls.__dict__: + cls._old_apply_of_skip_init_hook = cls._apply + cls._apply = partition_after_empty_init(cls._apply) def _disable_class_apply(cls): - cls._apply = cls._old_apply_of_skip_init_hook + if hasattr(cls, '_old_apply_of_skip_init_hook'): + cls._apply = cls._old_apply_of_skip_init_hook # add hooks for to_empty: apply_(empty_like) for subclass in get_all_subclasses(torch.nn.modules.module.Module): @@ -522,12 +527,14 @@ def wrapper(module, *args, **kwargs): return wrapper def _enable_class(cls): - cls._old_init = cls.__init__ - cls.__init__ = partition_after(cls.__init__) + if '__init__' in cls.__dict__: + cls._old_init = cls.__init__ + cls.__init__ = partition_after(cls.__init__) def _init_subclass(cls, **kwargs): - cls._old_init = cls.__init__ - cls.__init__ = partition_after(cls.__init__) + if '__init__' in cls.__dict__: + cls._old_init = cls.__init__ + cls.__init__ = partition_after(cls.__init__) # Replace .__init__() for all existing subclasses of torch.nn.Module recursively for subclass in get_all_subclasses(torch.nn.modules.module.Module): @@ -567,7 +574,8 @@ def unpatch_init_and_builtins(self): if self.patched: def _disable_class(cls): - cls.__init__ = cls._old_init + if hasattr(cls, '_old_init'): + cls.__init__ = cls._old_init for subclass in get_all_subclasses(torch.nn.modules.module.Module): _disable_class(subclass) From 5d1a30c0331357e48e8c4d636d286f26686f1f17 Mon Sep 17 00:00:00 2001 From: Olatunji Ruwase Date: Wed, 4 Sep 2024 16:30:56 -0400 Subject: [PATCH 505/754] DS_BUILD_OPS should build only compatible ops (#6489) Currently DS_BUILD_OPS=1 fails on incompatible ops. This is a deviation from [documentation](https://www.deepspeed.ai/tutorials/advanced-install/#pre-install-deepspeed-ops) which states that only compatible ops are built. image --- setup.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/setup.py b/setup.py index 8707209526ad..6c6971e5ae84 100755 --- a/setup.py +++ b/setup.py @@ -183,8 +183,8 @@ def op_enabled(op_name): if op_enabled(op_name) and not op_compatible: env_var = op_envvar(op_name) if not is_env_set(env_var): - builder.warning(f"One can disable {op_name} with {env_var}=0") - abort(f"Unable to pre-compile {op_name}") + builder.warning(f"Skip pre-compile of incompatible {op_name}; One can disable {op_name} with {env_var}=0") + continue # If op is compatible but install is not enabled (JIT mode). if is_rocm_pytorch and op_compatible and not op_enabled(op_name): From ddd357182371d38bd65a7a2026952e55b46380da Mon Sep 17 00:00:00 2001 From: Jiancheng Liu Date: Wed, 4 Sep 2024 16:32:02 -0400 Subject: [PATCH 506/754] Add default value to "checkpoint_folder" in "load_state_dict" of bf16_optimizer (#6446) Add default value `checkpoint_folder=None` for compatibility. 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 6619e602235e..9898abce801d 100644 --- a/deepspeed/runtime/bf16_optimizer.py +++ b/deepspeed/runtime/bf16_optimizer.py @@ -482,7 +482,7 @@ def refresh_fp32_params(self): def load_state_dict(self, state_dict_list, - checkpoint_folder, + checkpoint_folder=None, load_optimizer_states=True, load_from_fp32_weights=False, load_serial=None, From 662a421b05432045280c27726592715c1e9100c7 Mon Sep 17 00:00:00 2001 From: Olatunji Ruwase Date: Wed, 4 Sep 2024 17:06:04 -0400 Subject: [PATCH 507/754] Safe usage of popen (#6490) Avoid shell=True security issues with Popen --- deepspeed/utils/numa.py | 4 ++-- op_builder/async_io.py | 4 ++-- op_builder/builder.py | 3 ++- op_builder/npu/async_io.py | 4 ++-- op_builder/xpu/async_io.py | 4 ++-- setup.py | 3 ++- 6 files changed, 12 insertions(+), 10 deletions(-) diff --git a/deepspeed/utils/numa.py b/deepspeed/utils/numa.py index 13617826b1ce..4fe7cbba90ae 100644 --- a/deepspeed/utils/numa.py +++ b/deepspeed/utils/numa.py @@ -49,8 +49,8 @@ def check_for_numactl_pkg(): flag, lib, tool = data path = distutils.spawn.find_executable(pkgmgr) if path is not None: - cmd = f"{pkgmgr} {flag} {lib}" - result = subprocess.Popen(cmd, stdout=subprocess.PIPE, stderr=subprocess.PIPE, shell=True) + cmd = [pkgmgr, flag, lib] + result = subprocess.Popen(cmd, stdout=subprocess.PIPE, stderr=subprocess.PIPE) if result.wait() == 0: found = True else: diff --git a/op_builder/async_io.py b/op_builder/async_io.py index e7f16adbf2a3..0f9e34106487 100644 --- a/op_builder/async_io.py +++ b/op_builder/async_io.py @@ -81,8 +81,8 @@ def check_for_libaio_pkg(self): flag, lib, tool = data path = distutils.spawn.find_executable(pkgmgr) if path is not None: - cmd = f"{pkgmgr} {flag} {lib}" - result = subprocess.Popen(cmd, stdout=subprocess.PIPE, stderr=subprocess.PIPE, shell=True) + cmd = [pkgmgr, flag, lib] + result = subprocess.Popen(cmd, stdout=subprocess.PIPE, stderr=subprocess.PIPE) if result.wait() == 0: found = True else: diff --git a/op_builder/builder.py b/op_builder/builder.py index ca4b339e2447..5a45f59f4b43 100644 --- a/op_builder/builder.py +++ b/op_builder/builder.py @@ -482,7 +482,8 @@ def command_exists(self, cmd): cmds = [cmd] valid = False for cmd in cmds: - result = subprocess.Popen(f'type {cmd}', stdout=subprocess.PIPE, shell=True) + safe_cmd = ["bash", "-c", f"type {cmd}"] + result = subprocess.Popen(safe_cmd, stdout=subprocess.PIPE) valid = valid or result.wait() == 0 if not valid and len(cmds) > 1: diff --git a/op_builder/npu/async_io.py b/op_builder/npu/async_io.py index 86560353b1c7..3eb898b75693 100644 --- a/op_builder/npu/async_io.py +++ b/op_builder/npu/async_io.py @@ -74,8 +74,8 @@ def check_for_libaio_pkg(self): flag, lib, tool = data path = distutils.spawn.find_executable(pkgmgr) if path is not None: - cmd = f"{pkgmgr} {flag} {lib}" - result = subprocess.Popen(cmd, stdout=subprocess.PIPE, stderr=subprocess.PIPE, shell=True) + cmd = [pkgmgr, flag, lib] + result = subprocess.Popen(cmd, stdout=subprocess.PIPE, stderr=subprocess.PIPE) if result.wait() == 0: found = True else: diff --git a/op_builder/xpu/async_io.py b/op_builder/xpu/async_io.py index 0fd43f72e60e..62c3298fc72c 100644 --- a/op_builder/xpu/async_io.py +++ b/op_builder/xpu/async_io.py @@ -70,8 +70,8 @@ def check_for_libaio_pkg(self): flag, lib, tool = data path = distutils.spawn.find_executable(pkgmgr) if path is not None: - cmd = f"{pkgmgr} {flag} {lib}" - result = subprocess.Popen(cmd, stdout=subprocess.PIPE, stderr=subprocess.PIPE, shell=True) + cmd = [pkgmgr, flag, lib] + result = subprocess.Popen(cmd, stdout=subprocess.PIPE, stderr=subprocess.PIPE) if result.wait() == 0: found = True else: diff --git a/setup.py b/setup.py index 6c6971e5ae84..5b8a917dbf8f 100755 --- a/setup.py +++ b/setup.py @@ -160,7 +160,8 @@ def command_exists(cmd): result = subprocess.Popen(f'{cmd}', stdout=subprocess.PIPE, shell=True) return result.wait() == 1 else: - result = subprocess.Popen(f'type {cmd}', stdout=subprocess.PIPE, shell=True) + safe_cmd = ["bash", "-c", f"type {cmd}"] + result = subprocess.Popen(safe_cmd, stdout=subprocess.PIPE) return result.wait() == 0 From 10ba3dde84d00742f3635c48db09d6eccf0ec8bb Mon Sep 17 00:00:00 2001 From: Alex Morehead Date: Wed, 4 Sep 2024 17:28:13 -0500 Subject: [PATCH 508/754] Handle an edge case where `CUDA_HOME` is not defined on ROCm systems (#6488) * Handles an edge case when building `gds` where `CUDA_HOME` is not defined on ROCm systems --- op_builder/gds.py | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/op_builder/gds.py b/op_builder/gds.py index 727ebdf48372..d815ccea387a 100644 --- a/op_builder/gds.py +++ b/op_builder/gds.py @@ -49,6 +49,11 @@ def is_compatible(self, verbose=False): return False CUDA_HOME = torch.utils.cpp_extension.CUDA_HOME + if CUDA_HOME is None: + if verbose: + self.warning("Please install torch CUDA if trying to pre-compile GDS with CUDA") + return False + CUDA_LIB64 = os.path.join(CUDA_HOME, "lib64") gds_compatible = self.has_function(funcname="cuFileDriverOpen", libraries=("cufile", ), From c210e601e3a82a64a648f3201ea8f30bae4c63d1 Mon Sep 17 00:00:00 2001 From: Logan Adams <114770087+loadams@users.noreply.github.com> Date: Wed, 4 Sep 2024 18:34:42 -0700 Subject: [PATCH 509/754] Update version.txt after 0.15.1 release (#6493) **Auto-generated PR to update version.txt after a DeepSpeed release** Released version - 0.15.1 Author - @loadams Co-authored-by: loadams --- version.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/version.txt b/version.txt index e815b861f023..4312e0d0cae3 100644 --- a/version.txt +++ b/version.txt @@ -1 +1 @@ -0.15.1 +0.15.2 From 857780a85aa26fa51ed2e61a9993e6401ccac959 Mon Sep 17 00:00:00 2001 From: Nadav Elyahu <88962733+nelyahu@users.noreply.github.com> Date: Thu, 5 Sep 2024 18:43:08 +0300 Subject: [PATCH 510/754] HPU: add required ENV vars to acccelerator init (#6495) Co-authored-by: Olatunji Ruwase --- accelerator/hpu_accelerator.py | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/accelerator/hpu_accelerator.py b/accelerator/hpu_accelerator.py index 1f407e86787e..723a66e4c6fb 100644 --- a/accelerator/hpu_accelerator.py +++ b/accelerator/hpu_accelerator.py @@ -18,6 +18,7 @@ def __init__(self): self._name = 'hpu' self._communication_backend_name = 'hccl' self._compile_backend = "hpu_backend" + self.apply_hpu_workarounds() try: import habana_frameworks.torch.hpu as hpu hpu.setDeterministic(True) @@ -28,6 +29,15 @@ def __init__(self): self.fp16_supported = None + def apply_hpu_workarounds(self): + + def update_wa_env_var(key, value): + if key not in os.environ.keys(): + os.environ[key] = value + + update_wa_env_var("PT_HPU_LAZY_ACC_PAR_MODE", "0") + update_wa_env_var("PT_HPU_ENABLE_REFINE_DYNAMIC_SHAPES", "0") + # Device APIs def is_synchronized_device(self): return False From 4f803852ac785d375ad7488d158fa85fd90e6c4a Mon Sep 17 00:00:00 2001 From: Jinxing Pan <58251866+terry-for-github@users.noreply.github.com> Date: Fri, 6 Sep 2024 01:03:34 +0800 Subject: [PATCH 511/754] Op_builder->is_compatible quite warning (#6093) Set the default value of op_builder/xxx.py/is_compatible()/verbose to False for quite warning. Add verbose judgement before op_builder/xxx.py/is_compatible()/self.warning(...). Otherwise the verbose arg will not work. --------- Co-authored-by: Logan Adams <114770087+loadams@users.noreply.github.com> --- op_builder/builder.py | 4 ++-- op_builder/cpu/comm.py | 4 ++-- op_builder/inference_core_ops.py | 2 +- op_builder/inference_cutlass_builder.py | 2 +- op_builder/npu/async_io.py | 2 +- op_builder/ragged_ops.py | 2 +- op_builder/ragged_utils.py | 2 +- op_builder/sparse_attn.py | 1 - op_builder/spatial_inference.py | 2 +- op_builder/transformer_inference.py | 2 +- op_builder/xpu/async_io.py | 2 +- 11 files changed, 12 insertions(+), 13 deletions(-) diff --git a/op_builder/builder.py b/op_builder/builder.py index 5a45f59f4b43..807cbee7aa70 100644 --- a/op_builder/builder.py +++ b/op_builder/builder.py @@ -296,7 +296,7 @@ def cxx_args(self): ''' return [] - def is_compatible(self, verbose=True): + def is_compatible(self, verbose=False): ''' Check if all non-python dependencies are satisfied to build this op ''' @@ -679,7 +679,7 @@ def version_dependent_macros(self): version_ge_1_5 = ['-DVERSION_GE_1_5'] return version_ge_1_1 + version_ge_1_3 + version_ge_1_5 - def is_compatible(self, verbose=True): + def is_compatible(self, verbose=False): return super().is_compatible(verbose) def builder(self): diff --git a/op_builder/cpu/comm.py b/op_builder/cpu/comm.py index 69b9226fd806..fec960b63b2e 100644 --- a/op_builder/cpu/comm.py +++ b/op_builder/cpu/comm.py @@ -28,7 +28,7 @@ def include_paths(self): def cxx_args(self): return ['-O2', '-fopenmp'] - def is_compatible(self, verbose=True): + def is_compatible(self, verbose=False): # TODO: add soft compatibility check for private binary release. # a soft check, as in we know it can be trivially changed. return super().is_compatible(verbose) @@ -65,7 +65,7 @@ def include_paths(self): def cxx_args(self): return ['-O2', '-fopenmp'] - def is_compatible(self, verbose=True): + def is_compatible(self, verbose=False): # TODO: add soft compatibility check for private binary release. # a soft check, as in we know it can be trivially changed. return super().is_compatible(verbose) diff --git a/op_builder/inference_core_ops.py b/op_builder/inference_core_ops.py index 45e8628e669f..f7c0b47f92c6 100755 --- a/op_builder/inference_core_ops.py +++ b/op_builder/inference_core_ops.py @@ -19,7 +19,7 @@ def __init__(self, name=None): def absolute_name(self): return f'deepspeed.inference.v2.kernels{self.NAME}' - def is_compatible(self, verbose=True): + def is_compatible(self, verbose=False): try: import torch except ImportError: diff --git a/op_builder/inference_cutlass_builder.py b/op_builder/inference_cutlass_builder.py index fda6e74bbf6a..aa5294b1cbda 100644 --- a/op_builder/inference_cutlass_builder.py +++ b/op_builder/inference_cutlass_builder.py @@ -18,7 +18,7 @@ def __init__(self, name=None): def absolute_name(self): return f'deepspeed.inference.v2.kernels.cutlass_ops.{self.NAME}' - def is_compatible(self, verbose=True): + def is_compatible(self, verbose=False): try: import torch except ImportError: diff --git a/op_builder/npu/async_io.py b/op_builder/npu/async_io.py index 3eb898b75693..76d495b8106f 100644 --- a/op_builder/npu/async_io.py +++ b/op_builder/npu/async_io.py @@ -83,7 +83,7 @@ def check_for_libaio_pkg(self): break return found - def is_compatible(self, verbose=True): + def is_compatible(self, verbose=False): # Check for the existence of libaio by using distutils # to compile and link a test program that calls io_submit, # which is a function provided by libaio that is used in the async_io op. diff --git a/op_builder/ragged_ops.py b/op_builder/ragged_ops.py index a4e365786a2b..10afb193c738 100644 --- a/op_builder/ragged_ops.py +++ b/op_builder/ragged_ops.py @@ -19,7 +19,7 @@ def __init__(self, name=None): def absolute_name(self): return f'deepspeed.inference.v2.kernels.ragged_ops.{self.NAME}' - def is_compatible(self, verbose=True): + def is_compatible(self, verbose=False): try: import torch except ImportError: diff --git a/op_builder/ragged_utils.py b/op_builder/ragged_utils.py index a855f072af8c..654ba07e0879 100755 --- a/op_builder/ragged_utils.py +++ b/op_builder/ragged_utils.py @@ -19,7 +19,7 @@ def __init__(self, name=None): def absolute_name(self): return f'deepspeed.inference.v2.{self.NAME}' - def is_compatible(self, verbose=True): + def is_compatible(self, verbose=False): try: import torch except ImportError: diff --git a/op_builder/sparse_attn.py b/op_builder/sparse_attn.py index 2385adc8fe9c..66f748ee8f7a 100644 --- a/op_builder/sparse_attn.py +++ b/op_builder/sparse_attn.py @@ -64,7 +64,6 @@ def is_compatible(self, verbose=False): if verbose: self.warning( f'{self.NAME} requires a torch version >= 1.5 and < 2.0 but detected {TORCH_MAJOR}.{TORCH_MINOR}') - try: import triton except ImportError: diff --git a/op_builder/spatial_inference.py b/op_builder/spatial_inference.py index 8a6b36cce0b0..d6c5fa661156 100644 --- a/op_builder/spatial_inference.py +++ b/op_builder/spatial_inference.py @@ -17,7 +17,7 @@ def __init__(self, name=None): def absolute_name(self): return f'deepspeed.ops.spatial.{self.NAME}_op' - def is_compatible(self, verbose=True): + def is_compatible(self, verbose=False): try: import torch except ImportError: diff --git a/op_builder/transformer_inference.py b/op_builder/transformer_inference.py index 88b77499cc0e..1b056ecef3ed 100755 --- a/op_builder/transformer_inference.py +++ b/op_builder/transformer_inference.py @@ -17,7 +17,7 @@ def __init__(self, name=None): def absolute_name(self): return f'deepspeed.ops.transformer.inference.{self.NAME}_op' - def is_compatible(self, verbose=True): + def is_compatible(self, verbose=False): try: import torch except ImportError: diff --git a/op_builder/xpu/async_io.py b/op_builder/xpu/async_io.py index 62c3298fc72c..7ed527e016fa 100644 --- a/op_builder/xpu/async_io.py +++ b/op_builder/xpu/async_io.py @@ -79,7 +79,7 @@ def check_for_libaio_pkg(self): break return found - def is_compatible(self, verbose=True): + def is_compatible(self, verbose=False): # Check for the existence of libaio by using distutils # to compile and link a test program that calls io_submit, # which is a function provided by libaio that is used in the async_io op. From 3b09d945ead6acb15a172e9a379fc3de1f64d2b2 Mon Sep 17 00:00:00 2001 From: Nadav Elyahu <88962733+nelyahu@users.noreply.github.com> Date: Fri, 6 Sep 2024 01:07:57 +0300 Subject: [PATCH 512/754] fix pipeline eval_batch micro_batches argument for schedule (#6484) Co-authored-by: Logan Adams <114770087+loadams@users.noreply.github.com> --- deepspeed/runtime/pipe/engine.py | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/deepspeed/runtime/pipe/engine.py b/deepspeed/runtime/pipe/engine.py index 26196ff37ac4..7ebf5487cf9e 100644 --- a/deepspeed/runtime/pipe/engine.py +++ b/deepspeed/runtime/pipe/engine.py @@ -482,9 +482,7 @@ def eval_batch(self, micro_batches = self.micro_batches if num_micro_batches is None else num_micro_batches # Do the work - sched = schedule.InferenceSchedule(micro_batches=self.micro_batches, - stages=self.num_stages, - stage_id=self.stage_id) + sched = schedule.InferenceSchedule(micro_batches=micro_batches, stages=self.num_stages, stage_id=self.stage_id) # prevent dead-lock with multiple evals sequence dist.barrier() From 2a647c51d4c6020fb9c54bc15f9af98f492c46e5 Mon Sep 17 00:00:00 2001 From: Roger Feng Date: Fri, 6 Sep 2024 21:09:30 +0800 Subject: [PATCH 513/754] Fix the broken url link (#6500) Simple changes to fix the Intel cpu example link and add more xpu examples. Signed-off-by: roger feng --- docs/_tutorials/accelerator-setup-guide.md | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/docs/_tutorials/accelerator-setup-guide.md b/docs/_tutorials/accelerator-setup-guide.md index 4936e53fc00c..6f50afe139a3 100644 --- a/docs/_tutorials/accelerator-setup-guide.md +++ b/docs/_tutorials/accelerator-setup-guide.md @@ -95,8 +95,9 @@ ipex_model = ipex.llm.optimize(deepspeed_model) ``` to get model optimzied by Intel Extension for PyTorch. -## More example for using DeepSpeed with Intel Extension for PyTorch on Intel Architecture CPU -Refer to https://github.com/intel/intel-extension-for-pytorch/tree/main/examples/cpu/inference/python/llm for more extensive guide. +## More examples for using DeepSpeed on Intel CPU +Refer to [LLM examples](https://github.com/intel/intel-extension-for-pytorch/tree/main/examples/cpu/llm) for more code samples of running inference with DeepSpeed on Intel CPU. + # Intel XPU DeepSpeed XPU accelerator supports Intel® Data Center GPU Max Series. @@ -131,8 +132,8 @@ XPU available: True accelerator: xpu ``` -## More example for using DeepSpeed on Intel XPU -Refer to https://github.com/intel/intel-extension-for-pytorch/tree/release/xpu/2.1.40/examples/gpu/inference/python/llm for more extensive guide. +## More examples for using DeepSpeed on Intel XPU +Refer to [LLM examples](https://github.com/intel/intel-extension-for-pytorch/tree/xpu-main/examples/gpu/llm), [Megatron-DeepSpeed training examples](https://github.com/intel/intel-extension-for-deepspeed/tree/main/examples) for more code samples of running LLM with DeepSpeed on Intel XPU. # Huawei Ascend NPU From fc22d9602db9a988eebaadac442e2603cf1c4943 Mon Sep 17 00:00:00 2001 From: "Geary.Z" <92413813+TideDra@users.noreply.github.com> Date: Sun, 8 Sep 2024 06:37:14 +0800 Subject: [PATCH 514/754] fix environment variable export bug for MultiNodeRunner (#5878) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit In some multi-node environment like SLURM,there are some environment vars that contain special chars and can trigger errors when being exported. For example, there is a var `SLURM_JOB_CPUS_PER_NODE=64(x2)` when requesting two nodes with 64 cpus using SLURM. Using `runner.add_export` to export this var will add a command `export SLURM_JOB_CPUS_PER_NODE=64(x2)` when launching subprocesses, while this will cause a bash error since `(` is a key word of bash, like: ``` [2024-08-07 16:56:24,651] [INFO] [runner.py:568:main] cmd = pdsh -S -f 1024 -w server22,server27 export PYTHONPATH=/public/home/grzhang/code/CLIP-2; export SLURM_JOB_CPUS_PER_NODE=64(x2); ... server22: bash: -c: 行 0: 未预期的符号“(”附近有语法错误 ``` This PR simply wrap the environment vars with a pair of `"` to make sure they are treated as string. Co-authored-by: Logan Adams <114770087+loadams@users.noreply.github.com> --- deepspeed/launcher/multinode_runner.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/deepspeed/launcher/multinode_runner.py b/deepspeed/launcher/multinode_runner.py index ce58deadc281..f8d1e00203fa 100644 --- a/deepspeed/launcher/multinode_runner.py +++ b/deepspeed/launcher/multinode_runner.py @@ -34,7 +34,7 @@ def get_cmd(self, environment, active_resources): """Return the command to execute on node""" def add_export(self, key, var): - self.exports[key.strip()] = var.strip() + self.exports[key.strip()] = f"\"{var.strip()}\"" def parse_user_args(self): return self.args.user_args From 8fa6b50bfe9384b2d063e27cc0c17f2f765c7435 Mon Sep 17 00:00:00 2001 From: Nadav Elyahu <88962733+nelyahu@users.noreply.github.com> Date: Mon, 9 Sep 2024 18:27:54 +0300 Subject: [PATCH 515/754] Revert "BF16 optimizer: Clear lp grads after updating hp grads in hook" (#6508) Reverts microsoft/DeepSpeed#5328 After offline discussion with @YangQun1 , we agreed that there is no memory effect as clear_lp_grads flag triggers zero_() ops which just zeros buffers and does not free any memory. the outcome is compute overhead. --- 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 9898abce801d..6b63efbb23f7 100644 --- a/deepspeed/runtime/bf16_optimizer.py +++ b/deepspeed/runtime/bf16_optimizer.py @@ -534,7 +534,7 @@ def state(self): def accumulate_hp_grads_and_remove_lp(self, lp_param, group_idx, param_idx): assert self.immediate_grad_update - self._update_hp_grad(lp_param, group_idx, param_idx, clear_lp_grads=True) + self._update_hp_grad(lp_param, group_idx, param_idx, clear_lp_grads=False) def create_grad_acc_hooks(self): self.grad_accs = [] From c27483933d50a693fef9c48418d2664cf6a6a6f8 Mon Sep 17 00:00:00 2001 From: Omar Elayan <142979319+oelayan7@users.noreply.github.com> Date: Tue, 10 Sep 2024 19:08:50 +0300 Subject: [PATCH 516/754] wrap include cuda_bf16.h with ifdef BF16_AVAILABLE (#6520) --- csrc/fp_quantizer/fp_quantize.cu | 2 ++ csrc/fp_quantizer/includes/fp_quantize.h | 2 ++ 2 files changed, 4 insertions(+) diff --git a/csrc/fp_quantizer/fp_quantize.cu b/csrc/fp_quantizer/fp_quantize.cu index cca063956167..66ea7392e011 100644 --- a/csrc/fp_quantizer/fp_quantize.cu +++ b/csrc/fp_quantizer/fp_quantize.cu @@ -15,7 +15,9 @@ #include #include +#ifdef BF16_AVAILABLE #include +#endif #include using ROp = reduce::ROpType; diff --git a/csrc/fp_quantizer/includes/fp_quantize.h b/csrc/fp_quantizer/includes/fp_quantize.h index 507252d6e722..60c75541f603 100644 --- a/csrc/fp_quantizer/includes/fp_quantize.h +++ b/csrc/fp_quantizer/includes/fp_quantize.h @@ -10,7 +10,9 @@ #include +#ifdef BF16_AVAILABLE #include +#endif #include #include From 659f6be10574e49d7d5b76de7949c7c0254cd857 Mon Sep 17 00:00:00 2001 From: Olatunji Ruwase Date: Wed, 11 Sep 2024 16:07:06 -0400 Subject: [PATCH 517/754] Avoid security issues of subprocess shell (#6498) Avoid security issues of `shell=True` in subprocess --------- Co-authored-by: Logan Adams <114770087+loadams@users.noreply.github.com> --- bin/ds_bench | 5 ++++- csrc/aio/py_test/ds_aio_job.py | 5 +++-- deepspeed/comm/comm.py | 5 +++-- deepspeed/elasticity/elastic_agent.py | 4 +++- deepspeed/launcher/multinode_runner.py | 2 +- deepspeed/launcher/runner.py | 8 ++++--- op_builder/builder.py | 8 ++++--- setup.py | 14 +++++++------ .../BingBertSquad_test_common.py | 9 ++++---- .../Megatron_GPT2/run_checkpoint_test.py | 21 ++++++++++--------- tests/model/Megatron_GPT2/test_common.py | 9 ++++---- tests/unit/common.py | 18 +++++++++++++--- 12 files changed, 68 insertions(+), 40 deletions(-) diff --git a/bin/ds_bench b/bin/ds_bench index bfacbc8e25c8..80bf4029604e 100755 --- a/bin/ds_bench +++ b/bin/ds_bench @@ -10,7 +10,10 @@ import sys required_env = ["RANK", "WORLD_SIZE", "MASTER_ADDR", "MASTER_PORT", "LOCAL_RANK"] if not all(map(lambda v: v in os.environ, required_env)): import subprocess - subprocess.run("deepspeed $(which ds_bench) " + " ".join(sys.argv[1:]), shell=True) + r = subprocess.check_output(["which", "ds_bench"]) + ds_bench_bin = r.decode('utf-8').strip() + safe_cmd = ["deepspeed", ds_bench_bin] + sys.argv[1:] + subprocess.run(safe_cmd) else: args = benchmark_parser().parse_args() rank = args.local_rank diff --git a/csrc/aio/py_test/ds_aio_job.py b/csrc/aio/py_test/ds_aio_job.py index bbddee1bf26d..e9579a48fe4d 100644 --- a/csrc/aio/py_test/ds_aio_job.py +++ b/csrc/aio/py_test/ds_aio_job.py @@ -6,6 +6,7 @@ Functionality of swapping tensors to/from (NVMe) storage devices. """ import subprocess +import shlex class Job(object): @@ -39,10 +40,10 @@ def close_output_file(self): def run_job(job): - args = ' '.join(job.cmd()) + args = shlex.split(' '.join(job.cmd())) print(f'args = {args}') job.open_output_file() - proc = subprocess.run(args=args, shell=True, stdout=job.get_stdout(), stderr=job.get_stderr(), cwd=job.get_cwd()) + proc = subprocess.run(args=args, stdout=job.get_stdout(), stderr=job.get_stderr(), cwd=job.get_cwd()) job.close_output_file() assert proc.returncode == 0, \ f"This command failed: {job.cmd()}" diff --git a/deepspeed/comm/comm.py b/deepspeed/comm/comm.py index 2895e0f2e011..df8e8022081d 100755 --- a/deepspeed/comm/comm.py +++ b/deepspeed/comm/comm.py @@ -697,8 +697,9 @@ def mpi_discovery(distributed_port=TORCH_DISTRIBUTED_DEFAULT_PORT, verbose=True) master_addr = None if rank == 0: - hostname_cmd = ["hostname -I"] - result = subprocess.check_output(hostname_cmd, shell=True) + import shlex + hostname_cmd = shlex.split("hostname -I") + result = subprocess.check_output(hostname_cmd) master_addr = result.decode('utf-8').split()[0] master_addr = comm.bcast(master_addr, root=0) diff --git a/deepspeed/elasticity/elastic_agent.py b/deepspeed/elasticity/elastic_agent.py index 039b999dfeca..c6a69dd2a49f 100644 --- a/deepspeed/elasticity/elastic_agent.py +++ b/deepspeed/elasticity/elastic_agent.py @@ -54,7 +54,9 @@ def _set_master_addr_port(store: Store, if master_addr is None: # master_addr = _get_fq_hostname() - result = subprocess.check_output("hostname -I", shell=True) + import shlex + safe_cmd = shlex.split("hostname -I") + result = subprocess.check_output(safe_cmd) master_addr = result.decode('utf-8').split()[0] store.set("MASTER_ADDR", master_addr.encode(encoding="UTF-8")) diff --git a/deepspeed/launcher/multinode_runner.py b/deepspeed/launcher/multinode_runner.py index f8d1e00203fa..a816b5685760 100644 --- a/deepspeed/launcher/multinode_runner.py +++ b/deepspeed/launcher/multinode_runner.py @@ -406,7 +406,7 @@ def backend_exists(self): if not mpiname_exists: warnings.warn("mpiname does not exist, mvapich is not installed properly") else: - results = subprocess.check_output('mpiname', shell=True) + results = subprocess.check_output(['mpiname']) mpiname_results = results.decode('utf-8').strip() if "MVAPICH2-GDR" in mpiname_results: exists = True diff --git a/deepspeed/launcher/runner.py b/deepspeed/launcher/runner.py index f140d73ee0d0..076f65b201b3 100755 --- a/deepspeed/launcher/runner.py +++ b/deepspeed/launcher/runner.py @@ -20,6 +20,7 @@ from copy import deepcopy import signal import time +import shlex from .multinode_runner import PDSHRunner, OpenMPIRunner, MVAPICHRunner, SlurmRunner, MPICHRunner, IMPIRunner from .constants import PDSH_LAUNCHER, OPENMPI_LAUNCHER, MVAPICH_LAUNCHER, SLURM_LAUNCHER, MPICH_LAUNCHER, IMPI_LAUNCHER @@ -445,7 +446,8 @@ def main(args=None): if args.ssh_port is not None: ssh_check_cmd += f"-p {args.ssh_port} " ssh_check_cmd += f"{first_host} hostname" - subprocess.check_call(ssh_check_cmd, stderr=subprocess.DEVNULL, stdout=subprocess.DEVNULL, shell=True) + safe_ssh_cmd = shlex.split(ssh_check_cmd) + subprocess.check_call(safe_ssh_cmd, stderr=subprocess.DEVNULL, stdout=subprocess.DEVNULL) except subprocess.CalledProcessError: raise RuntimeError( f"Using hostfile at {args.hostfile} but host={first_host} was not reachable via ssh. If you are running with a single node please remove {args.hostfile} or setup passwordless ssh." @@ -458,9 +460,9 @@ def main(args=None): if args.ssh_port is not None: ssh_check_cmd += f" -p {args.ssh_port}" ssh_check_cmd += f" {first_host} hostname -I" - hostname_cmd = [ssh_check_cmd] + hostname_cmd = shlex.split(ssh_check_cmd) try: - result = subprocess.check_output(hostname_cmd, shell=True) + result = subprocess.check_output(hostname_cmd) except subprocess.CalledProcessError as err: logger.error( "Unable to detect suitable master address via `hostname -I`, please manually specify one via --master_addr" diff --git a/op_builder/builder.py b/op_builder/builder.py index 807cbee7aa70..e935a179f6af 100644 --- a/op_builder/builder.py +++ b/op_builder/builder.py @@ -253,7 +253,8 @@ def get_rocm_gpu_arch(): rocm_info = Path("rocminfo") rocm_gpu_arch_cmd = str(rocm_info) + " | grep -o -m 1 'gfx.*'" try: - result = subprocess.check_output(rocm_gpu_arch_cmd, shell=True) + safe_cmd = shlex.split(rocm_gpu_arch_cmd) + result = subprocess.check_output(safe_cmd) rocm_gpu_arch = result.decode('utf-8').strip() except subprocess.CalledProcessError: rocm_gpu_arch = "" @@ -271,7 +272,8 @@ def get_rocm_wavefront_size(): rocm_wavefront_size_cmd = str( rocm_info) + " | grep -Eo -m1 'Wavefront Size:[[:space:]]+[0-9]+' | grep -Eo '[0-9]+'" try: - result = subprocess.check_output(rocm_wavefront_size_cmd, shell=True) + safe_cmd = shlex.split(rocm_wavefront_size_cmd) + result = subprocess.check_output(rocm_wavefront_size_cmd) rocm_wavefront_size = result.decode('utf-8').strip() except subprocess.CalledProcessError: rocm_wavefront_size = "32" @@ -432,7 +434,7 @@ def _backup_cpuinfo(self): "to detect the CPU architecture. 'lscpu' does not appear to exist on " "your system, will fall back to use -march=native and non-vectorized execution.") return None - result = subprocess.check_output('lscpu', shell=True) + result = subprocess.check_output(['lscpu']) result = result.decode('utf-8').strip().lower() cpu_info = {} diff --git a/setup.py b/setup.py index 5b8a917dbf8f..1b6768d1b2c3 100755 --- a/setup.py +++ b/setup.py @@ -27,6 +27,7 @@ from setuptools.command import egg_info import time import typing +import shlex torch_available = True try: @@ -157,10 +158,11 @@ def get_env_if_set(key, default: typing.Any = ""): def command_exists(cmd): if sys.platform == "win32": - result = subprocess.Popen(f'{cmd}', stdout=subprocess.PIPE, shell=True) + safe_cmd = shlex.split(f'{cmd}') + result = subprocess.Popen(safe_cmd, stdout=subprocess.PIPE) return result.wait() == 1 else: - safe_cmd = ["bash", "-c", f"type {cmd}"] + safe_cmd = shlex.split(f"bash -c type {cmd}") result = subprocess.Popen(safe_cmd, stdout=subprocess.PIPE) return result.wait() == 0 @@ -200,13 +202,13 @@ def op_enabled(op_name): print(f'Install Ops={install_ops}') # Write out version/git info. -git_hash_cmd = "git rev-parse --short HEAD" -git_branch_cmd = "git rev-parse --abbrev-ref HEAD" +git_hash_cmd = shlex.split("bash -c git rev-parse --short HEAD") +git_branch_cmd = shlex.split("bash -c git rev-parse --abbrev-ref HEAD") if command_exists('git') and not is_env_set('DS_BUILD_STRING'): try: - result = subprocess.check_output(git_hash_cmd, shell=True) + result = subprocess.check_output(git_hash_cmd) git_hash = result.decode('utf-8').strip() - result = subprocess.check_output(git_branch_cmd, shell=True) + result = subprocess.check_output(git_branch_cmd) git_branch = result.decode('utf-8').strip() except subprocess.CalledProcessError: git_hash = "unknown" diff --git a/tests/model/BingBertSquad/BingBertSquad_test_common.py b/tests/model/BingBertSquad/BingBertSquad_test_common.py index ef42f85cc945..b47ddfe0c649 100755 --- a/tests/model/BingBertSquad/BingBertSquad_test_common.py +++ b/tests/model/BingBertSquad/BingBertSquad_test_common.py @@ -7,6 +7,7 @@ import subprocess import os import time +import shlex class BaseTestCase(unittest.TestCase): @@ -40,9 +41,9 @@ def ensure_directory_exists(self, filename): os.makedirs(dirname) def clean_test_env(self): - cmd = "dlts_ssh pkill -9 -f /usr/bin/python" + cmd = shlex.split("dlts_ssh pkill -9 -f /usr/bin/python") print(cmd) - subprocess.run(cmd, shell=True, check=False, executable='/bin/bash') + subprocess.run(cmd, check=False, executable='/bin/bash') time.sleep(20) def run_BingBertSquad_test(self, test_config, output): @@ -50,8 +51,8 @@ def run_BingBertSquad_test(self, test_config, output): other_args = " " + test_config["other_args"] if "other_args" in test_config else " " cmd = "./run_BingBertSquad_sanity.sh -e 1 -g {0} {1} {2}".format(test_config["gpus"], other_args, ds_flag) - + cmd = shlex.split(cmd) self.ensure_directory_exists(output) with open(output, "w") as f: print(cmd) - subprocess.run(cmd, shell=True, check=False, executable='/bin/bash', stdout=f, stderr=f) + subprocess.run(cmd, check=False, executable='/bin/bash', stdout=f, stderr=f) diff --git a/tests/model/Megatron_GPT2/run_checkpoint_test.py b/tests/model/Megatron_GPT2/run_checkpoint_test.py index d97a28ff1ad5..824f8269a972 100755 --- a/tests/model/Megatron_GPT2/run_checkpoint_test.py +++ b/tests/model/Megatron_GPT2/run_checkpoint_test.py @@ -10,6 +10,7 @@ import subprocess import os import re +import shlex from .test_common import BaseTestCase LAYERS = 2 @@ -18,9 +19,9 @@ def remove_file(test_id, filename): - cmd = f"if [ -f {filename} ] ; then rm -v {filename}; fi" + cmd = shlex.split(f"if [ -f {filename} ] ; then rm -v {filename}; fi") print(f"{test_id} cmd: {cmd}") - subprocess.run(cmd, shell=True, check=False, executable='/bin/bash') + subprocess.run(cmd, check=False, executable='/bin/bash') def grep_loss_from_file(file_name): @@ -451,9 +452,9 @@ def run_test(self, test_config, r_tol): checkpoint_name = test_config["checkpoint_name"] #---------------remove old checkpoint---------------# try: - cmd = f"rm -rf {checkpoint_name}" + cmd = shlex.split(f"rm -rf {checkpoint_name}") print(f"{self.id()} cmd: {cmd}") - subprocess.run(cmd, shell=True, check=False, executable='/bin/bash') + subprocess.run(cmd, check=False, executable='/bin/bash') except: print("No old checkpoint") @@ -474,8 +475,8 @@ def run_test(self, test_config, r_tol): # remove previous test log try: - cmd = f"rm {base_file}" - subprocess.run(cmd, shell=True, check=False, executable='/bin/bash') + cmd = shlex.split(f"rm {base_file}") + subprocess.run(cmd, check=False, executable='/bin/bash') except: print(f"{self.id()} No old logs") @@ -489,9 +490,9 @@ def run_test(self, test_config, r_tol): # set checkpoint load iteration try: - cmd = f"echo {checkpoint_interval} > {checkpoint_name}/latest_checkpointed_iteration.txt" + cmd = shlex.split(f"echo {checkpoint_interval} > {checkpoint_name}/latest_checkpointed_iteration.txt") print(f"{self.id()} running cmd: {cmd}") - subprocess.run(cmd, shell=True, check=False, executable='/bin/bash') + subprocess.run(cmd, check=False, executable='/bin/bash') except: print(f"{self.id()} Failed to update the checkpoint iteration file") return False @@ -506,8 +507,8 @@ def run_test(self, test_config, r_tol): # remove previous test log try: - cmd = f"rm {test_file}" - subprocess.run(cmd, shell=True, check=False, executable='/bin/bash') + cmd = shlex.split(f"rm {test_file}") + subprocess.run(cmd, check=False, executable='/bin/bash') except: print(f"{self.id()} no previous logs for") self.run_gpt2_test(test_config, test_file) diff --git a/tests/model/Megatron_GPT2/test_common.py b/tests/model/Megatron_GPT2/test_common.py index 1bcd891e31d5..4eb84ac7eeee 100755 --- a/tests/model/Megatron_GPT2/test_common.py +++ b/tests/model/Megatron_GPT2/test_common.py @@ -7,6 +7,7 @@ import subprocess import os import time +import shlex class BaseTestCase(unittest.TestCase): @@ -46,9 +47,9 @@ def ensure_directory_exists(self, filename): os.makedirs(dirname) def clean_test_env(self): - cmd = "dlts_ssh pkill -9 -f /usr/bin/python" + cmd = shlex.split("dlts_ssh pkill -9 -f /usr/bin/python") print(cmd) - subprocess.run(cmd, shell=True, check=False, executable='/bin/bash') + subprocess.run(cmd, check=False, executable='/bin/bash') time.sleep(20) def run_gpt2_test(self, test_config, output): @@ -60,8 +61,8 @@ def run_gpt2_test(self, test_config, output): test_config["mp"], test_config["gpus"], test_config["nodes"], test_config["bs"], test_config["steps"], test_config["layers"], test_config["hidden_size"], test_config["seq_length"], test_config["heads"], ckpt_num, other_args, ds_flag) - + cmd = shlex.split(cmd) self.ensure_directory_exists(output) with open(output, "w") as f: print(cmd) - subprocess.run(cmd, shell=True, check=False, executable='/bin/bash', stdout=f, stderr=f) + subprocess.run(cmd, check=False, executable='/bin/bash', stdout=f, stderr=f) diff --git a/tests/unit/common.py b/tests/unit/common.py index 14beeb317198..c9eb7ffaa5f4 100644 --- a/tests/unit/common.py +++ b/tests/unit/common.py @@ -58,6 +58,20 @@ def get_master_port(base_port=29500, port_range_size=1000): raise IOError('no free ports') +def _get_cpu_socket_count(): + import shlex + p1 = subprocess.Popen(shlex.split("cat /proc/cpuinfo"), stdout=subprocess.PIPE) + p2 = subprocess.Popen(["grep", "physical id"], stdin=p1.stdout, stdout=subprocess.PIPE) + p1.stdout.close() + p3 = subprocess.Popen(shlex.split("sort -u"), stdin=p2.stdout, stdout=subprocess.PIPE) + p2.stdout.close() + p4 = subprocess.Popen(shlex.split("wc -l"), stdin=p3.stdout, stdout=subprocess.PIPE) + p3.stdout.close() + r = int(p4.communicate()[0]) + p4.stdout.close() + return r + + def set_accelerator_visible(): cuda_visible = os.environ.get("CUDA_VISIBLE_DEVICES", None) xdist_worker_id = get_xdist_worker_id() @@ -95,9 +109,7 @@ def set_accelerator_visible(): num_accelerators = int(npu_smi.decode('utf-8').strip().split('\n')[0].split(':')[1].strip()) else: assert get_accelerator().device_name() == 'cpu' - cpu_sockets = int( - subprocess.check_output('cat /proc/cpuinfo | grep "physical id" | sort -u | wc -l', shell=True)) - num_accelerators = cpu_sockets + num_accelerators = _get_cpu_socket_count() if isinstance(num_accelerators, list): cuda_visible = ",".join(num_accelerators) From 170b46e8b146b7ed93cd5f28d194bf8412ba0cbf Mon Sep 17 00:00:00 2001 From: Logan Adams <114770087+loadams@users.noreply.github.com> Date: Wed, 11 Sep 2024 16:21:43 -0700 Subject: [PATCH 518/754] Add conditional on torch version for scaled_dot_product_attention (#6517) Changes from #4724 broke support for torch<2.0 in the flops profiler as the scaled_dot_product_attention [wasn't added](https://pytorch.org/docs/2.0/generated/torch.nn.functional.scaled_dot_product_attention.html#torch.nn.functional.scaled_dot_product_attention) until a beta version in torch 2.0 Resolved: #5534 Todo: - [ ] Test this - [ ] Issue resolution with users. --- deepspeed/profiling/flops_profiler/profiler.py | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/deepspeed/profiling/flops_profiler/profiler.py b/deepspeed/profiling/flops_profiler/profiler.py index de847e59e82e..96306184e42c 100644 --- a/deepspeed/profiling/flops_profiler/profiler.py +++ b/deepspeed/profiling/flops_profiler/profiler.py @@ -15,6 +15,7 @@ from deepspeed.utils import logger from deepspeed.moe.layer import MoE from deepspeed.utils.timer import FORWARD_GLOBAL_TIMER, BACKWARD_GLOBAL_TIMER, STEP_GLOBAL_TIMER +from deepspeed.utils.torch import required_torch_version Tensor = torch.Tensor @@ -908,8 +909,9 @@ def _patch_functionals(): # embedding F.embedding = wrapFunc(F.embedding, _embedding_flops_compute) - # attn - F.scaled_dot_product_attention = wrapFunc(F.scaled_dot_product_attention, _attn_flops_compute) + # attn - scaled_dot_product_attention added in torch 2.0+ + if required_torch_version(min_version=2.0): + F.scaled_dot_product_attention = wrapFunc(F.scaled_dot_product_attention, _attn_flops_compute) def _patch_tensor_methods(): From 2a56f53395b2e0ef2ffe9947671fe153ba026328 Mon Sep 17 00:00:00 2001 From: ShifaAbu Date: Tue, 17 Sep 2024 01:24:45 +0300 Subject: [PATCH 519/754] Added Intel Gaudi to Accelerator Setup Guide (#6543) Added Intel Gaudi to the list of accelerators in the setup guide. Co-authored-by: sakell Co-authored-by: Logan Adams <114770087+loadams@users.noreply.github.com> --- docs/_tutorials/accelerator-setup-guide.md | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/docs/_tutorials/accelerator-setup-guide.md b/docs/_tutorials/accelerator-setup-guide.md index 6f50afe139a3..75c20134b5b7 100644 --- a/docs/_tutorials/accelerator-setup-guide.md +++ b/docs/_tutorials/accelerator-setup-guide.md @@ -9,6 +9,7 @@ tags: getting-started training accelerator - [Intel Architecture (IA) CPU](#intel-architecture-ia-cpu) - [Intel XPU](#intel-xpu) - [Huawei Ascend NPU](#huawei-ascend-npu) +- [Intel Gaudi](#intel-gaudi) # Introduction DeepSpeed supports different accelerators from different companies. Setup steps to run DeepSpeed on certain accelerators might be different. This guide allows user to lookup setup instructions for the accelerator family and hardware they are using. @@ -246,3 +247,10 @@ accelerator: npu ## Multi-card parallel training using Huawei Ascend NPU To perform model training across multiple Huawei Ascend NPU cards using DeepSpeed, see the examples provided in [DeepSpeed Examples](https://github.com/microsoft/DeepSpeedExamples/blob/master/training/cifar/cifar10_deepspeed.py). + +# Intel Gaudi +PyTorch models can be run on Intel® Gaudi® AI accelerator using DeepSpeed. Refer to the following user guides to start using DeepSpeed with Intel Gaudi: +* [Getting Started with DeepSpeed](https://docs.habana.ai/en/latest/PyTorch/DeepSpeed/Getting_Started_with_DeepSpeed/Getting_Started_with_DeepSpeed.html#getting-started-with-deepspeed) +* [DeepSpeed User Guide for Training](https://docs.habana.ai/en/latest/PyTorch/DeepSpeed/DeepSpeed_User_Guide/DeepSpeed_User_Guide.html#deepspeed-user-guide) +* [Optimizing Large Language Models](https://docs.habana.ai/en/latest/PyTorch/DeepSpeed/Optimizing_LLM.html#llms-opt) +* [Inference Using DeepSpeed](https://docs.habana.ai/en/latest/PyTorch/DeepSpeed/Inference_Using_DeepSpeed.html#deepspeed-inference-user-guide) From 61de0171760f02a24f6f091631d6c3120305c880 Mon Sep 17 00:00:00 2001 From: Logan Adams <114770087+loadams@users.noreply.github.com> Date: Wed, 25 Sep 2024 16:18:44 -0700 Subject: [PATCH 520/754] Skip failing newly added tests in accelerate (#6574) Adding the new tests in https://github.com/huggingface/accelerate/pull/3097 caused the nv-accelerate-v100 tests to fail. Due to other CI issues we didn't notice this at first. This just skips the problematic test for now. cc: @stas00 / @muellerzr --- .github/workflows/nv-accelerate-v100.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/nv-accelerate-v100.yml b/.github/workflows/nv-accelerate-v100.yml index 915493bb3183..76b8c93fba3f 100644 --- a/.github/workflows/nv-accelerate-v100.yml +++ b/.github/workflows/nv-accelerate-v100.yml @@ -55,4 +55,4 @@ jobs: # tmp fix: force newer datasets version #pip install "datasets>=2.0.0" pip list - pytest $PYTEST_OPTS --color=yes --durations=0 --verbose tests/deepspeed + pytest $PYTEST_OPTS --color=yes --durations=0 --verbose tests/deepspeed -k "not test_prepare_multiple_models_zero3_inference" From 7622cd9e68756d6e2a65e654f2b4ca678d55c251 Mon Sep 17 00:00:00 2001 From: Masahiro Tanaka <81312776+tohtana@users.noreply.github.com> Date: Wed, 25 Sep 2024 17:34:38 -0700 Subject: [PATCH 521/754] Use msgpack for p2p comm (#6547) Use msgpack for P2P communication in pipeline engine. Co-authored-by: Logan Adams <114770087+loadams@users.noreply.github.com> --- deepspeed/runtime/pipe/p2p.py | 8 ++++---- requirements/requirements.txt | 1 + 2 files changed, 5 insertions(+), 4 deletions(-) diff --git a/deepspeed/runtime/pipe/p2p.py b/deepspeed/runtime/pipe/p2p.py index 2b12a9573c4b..ed6d80b8d4fb 100644 --- a/deepspeed/runtime/pipe/p2p.py +++ b/deepspeed/runtime/pipe/p2p.py @@ -3,7 +3,7 @@ # DeepSpeed Team -import pickle +import msgpack import typing import torch @@ -96,7 +96,7 @@ def wait(): def send_obj(msg: typing.Any, dest: int): """Send an arbitrary python object to ``dest``. - Note: ``msg`` must be pickleable. + Note: ``msg`` must be serializable by msgpack. WARN: This incurs a CPU -> GPU transfer and should be used sparingly for performance reasons. @@ -106,7 +106,7 @@ def send_obj(msg: typing.Any, dest: int): dest (int): Destination rank. """ # serialize the message - msg = pickle.dumps(msg) + msg = msgpack.packb(msg) # construct a tensor to send msg = torch.ByteTensor(torch.ByteStorage.from_buffer(msg)).to(get_accelerator().device_name()) @@ -133,7 +133,7 @@ def recv_obj(sender: int) -> typing.Any: msg = torch.empty(length.item(), dtype=torch.uint8).to(get_accelerator().device_name()) dist.recv(msg, src=sender) - msg = pickle.loads(msg.cpu().numpy().tobytes()) + msg = msgpack.unpackb(msg.cpu().numpy().tobytes()) def _to(x): """Recursively move to the current device.""" diff --git a/requirements/requirements.txt b/requirements/requirements.txt index 70c94a745435..296398f680cc 100755 --- a/requirements/requirements.txt +++ b/requirements/requirements.txt @@ -1,4 +1,5 @@ hjson +msgpack ninja numpy packaging>=20.0 From a5400974df59d99d58dabd173bb8d89180bbd773 Mon Sep 17 00:00:00 2001 From: Olatunji Ruwase Date: Thu, 26 Sep 2024 09:07:19 -0400 Subject: [PATCH 522/754] DeepNVMe perf tuning (#6560) Add performance tuning utilities: `ds_nvme_tune` and `ds_io`. Update tutorial with tuning section. --------- Co-authored-by: Ubuntu Co-authored-by: Joe Mayer <114769929+jomayeri@users.noreply.github.com> --- bin/ds_io | 6 + bin/ds_nvme_tune | 9 + deepspeed/nvme/__init__.py | 8 + deepspeed/nvme/ds_aio_args.py | 175 ++++++++++++++ deepspeed/nvme/ds_aio_basic.py | 134 +++++++++++ deepspeed/nvme/ds_aio_handle.py | 222 ++++++++++++++++++ deepspeed/nvme/ds_aio_job.py | 50 ++++ deepspeed/nvme/parse_nvme_stats.py | 148 ++++++++++++ deepspeed/nvme/perf_generate_param.py | 97 ++++++++ deepspeed/nvme/perf_run_sweep.py | 320 ++++++++++++++++++++++++++ deepspeed/nvme/perf_sweep_utils.py | 13 ++ deepspeed/nvme/test_ds_aio.py | 25 ++ deepspeed/nvme/test_ds_aio_utils.py | 81 +++++++ deepspeed/nvme/validate_async_io.py | 10 + docs/_tutorials/deepnvme.md | 52 ++++- setup.py | 2 +- 16 files changed, 1350 insertions(+), 2 deletions(-) create mode 100644 bin/ds_io create mode 100644 bin/ds_nvme_tune create mode 100644 deepspeed/nvme/__init__.py create mode 100644 deepspeed/nvme/ds_aio_args.py create mode 100755 deepspeed/nvme/ds_aio_basic.py create mode 100755 deepspeed/nvme/ds_aio_handle.py create mode 100644 deepspeed/nvme/ds_aio_job.py create mode 100755 deepspeed/nvme/parse_nvme_stats.py create mode 100644 deepspeed/nvme/perf_generate_param.py create mode 100644 deepspeed/nvme/perf_run_sweep.py create mode 100644 deepspeed/nvme/perf_sweep_utils.py create mode 100755 deepspeed/nvme/test_ds_aio.py create mode 100755 deepspeed/nvme/test_ds_aio_utils.py create mode 100644 deepspeed/nvme/validate_async_io.py diff --git a/bin/ds_io b/bin/ds_io new file mode 100644 index 000000000000..681fd634764c --- /dev/null +++ b/bin/ds_io @@ -0,0 +1,6 @@ +#!/usr/bin/env python3 + +from deepspeed.nvme import ds_io_main + +if __name__ == '__main__': + ds_io_main() diff --git a/bin/ds_nvme_tune b/bin/ds_nvme_tune new file mode 100644 index 000000000000..117adfba22c0 --- /dev/null +++ b/bin/ds_nvme_tune @@ -0,0 +1,9 @@ +#!/usr/bin/env python3 + +from deepspeed.nvme import sweep_main, generate_main, parse_sweep_arguments + +if __name__ == '__main__': + args = parse_sweep_arguments() + print(f"Running DeepNVMe performance tuning on {args.nvme_dir}") + sweep_main(args) + generate_main(args.log_dir) diff --git a/deepspeed/nvme/__init__.py b/deepspeed/nvme/__init__.py new file mode 100644 index 000000000000..6d0de857cbd3 --- /dev/null +++ b/deepspeed/nvme/__init__.py @@ -0,0 +1,8 @@ +# Copyright (c) Microsoft Corporation. +# SPDX-License-Identifier: Apache-2.0 + +# DeepSpeed Team + +from .perf_run_sweep import sweep_main, parse_sweep_arguments +from .perf_generate_param import generate_main +from .test_ds_aio import ds_io_main diff --git a/deepspeed/nvme/ds_aio_args.py b/deepspeed/nvme/ds_aio_args.py new file mode 100644 index 000000000000..9ed71c34a74d --- /dev/null +++ b/deepspeed/nvme/ds_aio_args.py @@ -0,0 +1,175 @@ +# Copyright (c) Microsoft Corporation. +# SPDX-License-Identifier: Apache-2.0 + +# DeepSpeed Team +""" +Functionality of swapping optimizer tensors to/from (NVMe) storage devices. +""" + +import argparse +import os +from .test_ds_aio_utils import refine_integer_value +from deepspeed.accelerator import get_accelerator + +MAPPING_DELIMITER = ':' + + +def refine_args(args): + if args.io_size and type(args.io_size) == str: + args.io_size = refine_integer_value(args.io_size) + + if args.block_size and type(args.block_size) == str: + args.block_size = refine_integer_value(args.block_size) + + return args + + +def _get_mapping_dict(args): + if args.folder is not None: + d = {i: args.folder for i in range(args.multi_process)} + else: + d = {} + for m in args.folder_to_device_mapping: + fields = m.split(MAPPING_DELIMITER) + d[fields[1]] = fields[0] + + return d + + +def _validate_folder_mapping(args): + no_error = True + error_messages = [] + invalid_mappings = [m for m in args.folder_to_device_mapping if MAPPING_DELIMITER not in m] + if len(invalid_mappings) > 0: + error_messages.append( + f'Missing delimiter ({MAPPING_DELIMITER}) in folder_to_device_mapping {invalid_mappings}') + no_error = False + + folder_list = [m.split(MAPPING_DELIMITER)[0] for m in args.folder_to_device_mapping] + invalid_folders = [d for d in folder_list if not os.path.exists(d)] + if len(invalid_folders) > 0: + error_messages.append(f'Invalid folders in folder_to_device_mapping: {invalid_folders}') + no_error = False + + if args.gpu: + device_list = [int(m.split(MAPPING_DELIMITER)[1]) for m in args.folder_to_device_mapping] + invalid_device_list = [dev_id for dev_id in device_list if not dev_id < get_accelerator().device_count()] + if len(invalid_device_list) > 0: + error_messages.append(f'Invalid device ids in folder_to_device_mapping: {invalid_device_list}') + no_error = False + + return no_error, error_messages + + +def validate_args(args): + no_error = True + error_messages = [] + + if args.folder is not None and len(args.folder_to_device_mapping) > 0: + error_messages.append(f'--folder and --folder_to_device_mapping cannot be specified together.') + no_error = False + elif args.folder is None and len(args.folder_to_device_mapping) == 0: + error_messages.append(f'At least one of --folder or --folder_to_device_mapping must be specified.') + no_error = False + + # Validate --folder + if args.folder is not None and not os.path.exists(args.folder): + no_error = False + error_messages.append(f'Invalid folder in --folder: {args.folder} ') + + # Validate --folder_mapping_to_device + if len(args.folder_to_device_mapping) > 0: + no_mapping_error, mapping_error_messages = _validate_folder_mapping(args) + no_error = no_error and no_mapping_error + error_messages += mapping_error_messages + + # Validate --gpu, --use_gds + if args.use_gds and not args.gpu: + error_messages.append(f'--gpu must be set to transfer with --use_gds') + no_error = False + + if not no_error: + print(f'Found {len(error_messages)} validation errors') + for i, msg in enumerate(error_messages): + print(f'{i+1}: {msg}') + + return no_error + + +def parse_arguments(): + parser = argparse.ArgumentParser() + + parser.add_argument('--folder', default=None, type=str, help='Folder to use for I/O.') + + parser.add_argument('--folder_to_device_mapping', + default=[], + nargs='+', + help='Specification of mapping of folder to (gpu) device id, (ignored for cpu accesses).' + 'Can be specified multiple times for multi-process runs,' + 'e.g. --folder_to_device_mapping /mnt/nvme0:0 --folder_to_device_mapping /mnt/nvme1:15 --gpu' + 'means access /mnt/nvme0 with gpu 0 and /mnt/nvme1 with gpu 15') + + parser.add_argument('--io_size', type=str, default=None, required=True, help='Number of bytes to read or write.') + + parser.add_argument('--read', action='store_true', help='Perform read I/O (default is write)') + + parser.add_argument('--multi_process', + type=int, + default=1, + help='Number of parallel processes doing I/O (default 1).') + + parser.add_argument('--block_size', + type=str, + default='1M', + help='I/O block size. Can use K, M, or G suffix (default 1M for 1 megabytes).') + + parser.add_argument('--queue_depth', type=int, default=32, help='I/O queue depth (default 32).') + + parser.add_argument('--single_submit', + action='store_true', + help='Submit I/O requests in singles (default is submit queue_depth amount at once.).') + + parser.add_argument( + '--sequential_requests', + action='store_true', + help= + 'Delay I/O request submission until completion of prior requests (default is overlap I/O submission and completion requests.).' + ) + + parser.add_argument('--validate', action='store_true', help='Perform validation of I/O transfer in library.') + + parser.add_argument('--handle', action='store_true', help='Use AIO handle.') + + parser.add_argument('--loops', type=int, default=3, help='Count of operation repetitions') + + parser.add_argument('--io_parallel', type=int, default=None, help='Per iop parallelism') + + parser.add_argument('--gpu', action='store_true', help='Use GPU memory') + + parser.add_argument('--use_gds', action='store_true', help='Enable GDS AIO') + + parser.add_argument('--slow_bounce_buffer', + action='store_true', + help='For GPU memory transfers, measure impact of bounce buffer pinning on critical path.') + + args = parser.parse_args() + print(f'args = {args}') + return args + + +def get_validated_args(): + args = parse_arguments() + args = refine_args(args) + if not validate_args(args): + quit() + print(f'Successful validation of command line arguments') + + peer_tag = 'gpu' if args.gpu else 'process' + args.mapping_dict = _get_mapping_dict(args) + args.mapping_list = [(device_id, folder) for device_id, folder in args.mapping_dict.items()] + assert len(args.mapping_dict) == len(args.mapping_list) + print(f'Configuring {len(args.mapping_list)} {peer_tag} to folder mapping') + for i, (device_id, folder) in enumerate(args.mapping_list): + print(f'[{i}]: {peer_tag} {device_id} <----> {folder}') + + return args diff --git a/deepspeed/nvme/ds_aio_basic.py b/deepspeed/nvme/ds_aio_basic.py new file mode 100755 index 000000000000..b346fe9bbfeb --- /dev/null +++ b/deepspeed/nvme/ds_aio_basic.py @@ -0,0 +1,134 @@ +# Copyright (c) Microsoft Corporation. +# SPDX-License-Identifier: Apache-2.0 + +# DeepSpeed Team +""" +Functionality of swapping optimizer tensors to/from (NVMe) storage devices. +""" + +import torch +import os +import time +from deepspeed.ops.aio import AsyncIOBuilder +from multiprocessing import Pool, Barrier +from .test_ds_aio_utils import report_results, task_log, task_barrier + + +def pre_basic(args, tid, read_op): + io_string = "Read" if read_op else "Write" + num_bytes = os.path.getsize(args.read_file) if read_op else args.write_size + file = args.read_file if read_op else f'{args.write_file}.{tid}' + + task_log(tid, f'Allocate tensor of size {num_bytes} bytes') + buffer = torch.empty(num_bytes, dtype=torch.uint8, device='cpu').pin_memory() + task_log(tid, f'{io_string} file {file} of size {num_bytes} bytes from buffer on device {buffer.device}') + + ctxt = {} + ctxt['file'] = file + ctxt['num_bytes'] = num_bytes + ctxt['buffer'] = buffer + ctxt['elapsed_sec'] = 0 + + return ctxt + + +def pre_basic_read(pool_params): + args, tid = pool_params + ctxt = pre_basic(args, tid, True) + return ctxt + + +def pre_basic_write(pool_params): + args, tid = pool_params + ctxt = pre_basic(args, tid, False) + return ctxt + + +def post_basic(pool_params): + _, _, ctxt = pool_params + ctxt["buffer"].detach() + ctxt["buffer"] = None + return ctxt + + +def main_basic_read(pool_params): + args, tid, ctxt = pool_params + start_time = time.time() + AsyncIOBuilder().load().aio_read(ctxt['buffer'], ctxt['file'], args.block_size, args.queue_depth, + args.single_submit, not args.sequential_requests, args.validate) + end_time = time.time() + ctxt['elapsed_sec'] += end_time - start_time + + return ctxt + + +def main_basic_write(pool_params): + args, tid, ctxt = pool_params + start_time = time.time() + AsyncIOBuilder().load().aio_write(ctxt['buffer'], ctxt['file'], args.block_size, args.queue_depth, + args.single_submit, not args.sequential_requests, args.validate) + end_time = time.time() + ctxt['elapsed_sec'] += end_time - start_time + + return ctxt + + +def get_schedule(args, read_op): + schedule = {} + if read_op: + schedule['pre'] = pre_basic_read + schedule['post'] = post_basic + schedule['main'] = main_basic_read + else: + schedule['pre'] = pre_basic_write + schedule['post'] = post_basic + schedule['main'] = main_basic_write + + return schedule + + +def _aio_handle_tasklet(pool_params): + args, tid, read_op = pool_params + num_processes = len(args.mapping_dict) + + # Create schedule + schedule = get_schedule(args, read_op) + task_log(tid, f'schedule = {schedule}') + task_barrier(aio_barrier, num_processes) + + # Run pre task + task_log(tid, f'running pre-task') + ctxt = schedule["pre"]((args, tid)) + task_barrier(aio_barrier, num_processes) + + # Run main tasks in a loop + ctxt["main_task_sec"] = 0 + for i in range(args.loops): + task_log(tid, f'running main task {i}') + start_time = time.time() + ctxt = schedule["main"]((args, tid, ctxt)) + task_barrier(aio_barrier, num_processes) + stop_time = time.time() + ctxt["main_task_sec"] += stop_time - start_time + + # Run post task + task_log(tid, f'running post-task') + ctxt = schedule["post"]((args, tid, ctxt)) + task_barrier(aio_barrier, num_processes) + + return ctxt["main_task_sec"], ctxt["elapsed_sec"], ctxt["num_bytes"] * args.loops + + +def _init_tasklet(b): + global aio_barrier + aio_barrier = b + + +def aio_basic_multiprocessing(args, read_op): + num_processes = len(args.mapping_dict) + b = Barrier(num_processes) + pool_params = [(args, p, read_op) for p in range(num_processes)] + with Pool(processes=num_processes, initializer=_init_tasklet, initargs=(b, )) as p: + pool_results = p.map(_aio_handle_tasklet, pool_params) + + report_results(args, read_op, pool_results) diff --git a/deepspeed/nvme/ds_aio_handle.py b/deepspeed/nvme/ds_aio_handle.py new file mode 100755 index 000000000000..47c0cd709ec5 --- /dev/null +++ b/deepspeed/nvme/ds_aio_handle.py @@ -0,0 +1,222 @@ +# Copyright (c) Microsoft Corporation. +# SPDX-License-Identifier: Apache-2.0 + +# DeepSpeed Team +""" +Functionality of swapping optimizer tensors to/from (NVMe) storage devices. +""" + +import torch +import os +import time +from multiprocessing import Pool, Barrier +from deepspeed.ops.aio import AsyncIOBuilder +from deepspeed.ops.op_builder import GDSBuilder +from deepspeed.accelerator import get_accelerator +from .test_ds_aio_utils import report_results, task_log, task_barrier, create_filename, create_file + +BUFFER = 'buffer' +BOUNCE_BUFFER = 'bounce_buffer' + + +def pre_handle(args, tid, read_op): + io_string = "Read" if read_op else "Write" + gds = True if args.use_gds else False + device_id, folder = args.mapping_list[tid] + filename = create_filename(folder, args.read, args.io_size, tid) + if args.read and not (os.path.isfile(filename) and os.path.getsize(filename) == args.io_size): + create_file(filename, args.io_size) + + task_log(tid, f'Allocate tensor of size {args.io_size} bytes') + bounce_buffer = None + if args.gpu: + device_name = get_accelerator().device_name(device_id) + buffer = torch.randint(high=128, size=(args.io_size, ), dtype=torch.uint8, device=device_name) + if not (args.slow_bounce_buffer or gds): + bounce_buffer = torch.randint(high=128, size=(args.io_size, ), dtype=torch.uint8, + device='cpu').pin_memory() + else: + buffer = torch.randint(high=128, size=(args.io_size, ), dtype=torch.uint8, device='cpu').pin_memory() + task_log(tid, + f'{io_string} file {filename} of size {args.io_size} bytes from buffer on device {buffer.device}', + force=True) + + io_parallel = args.io_parallel if args.io_parallel else 1 + if gds: + handle = GDSBuilder().load().gds_handle(args.block_size, args.queue_depth, args.single_submit, + not args.sequential_requests, io_parallel) + handle.pin_device_tensor(buffer) + else: + handle = AsyncIOBuilder().load().aio_handle(args.block_size, args.queue_depth, args.single_submit, + not args.sequential_requests, io_parallel) + task_log(tid, f'created deepspeed aio handle') + + ctxt = {} + ctxt['file'] = filename + ctxt['num_bytes'] = args.io_size + ctxt['handle'] = handle + ctxt['gds'] = gds + ctxt[BUFFER] = buffer + ctxt[BOUNCE_BUFFER] = bounce_buffer + ctxt['elapsed_sec'] = 0 + + return ctxt + + +def pre_handle_read(pool_params): + args, tid = pool_params + ctxt = pre_handle(args, tid, True) + return ctxt + + +def pre_handle_write(pool_params): + args, tid = pool_params + ctxt = pre_handle(args, tid, False) + return ctxt + + +def post_handle(pool_params): + _, _, ctxt = pool_params + for buf in [BUFFER, BOUNCE_BUFFER]: + if ctxt[buf] is not None: + if ctxt['gds']: + ctxt['handle'].unpin_device_tensor(ctxt[buf]) + ctxt[buf].detach() + ctxt[buf] = None + return ctxt + + +def main_parallel_read(pool_params): + args, tid, ctxt = pool_params + handle = ctxt['handle'] + + start_time = time.time() + dest_buffer = BOUNCE_BUFFER if ctxt[BOUNCE_BUFFER] is not None else BUFFER + ret = handle.pread(ctxt[dest_buffer], ctxt['file'], args.validate, True) + assert ret != -1 + handle.wait() + if dest_buffer == BOUNCE_BUFFER: + ctxt[BUFFER].data.copy_(ctxt[BOUNCE_BUFFER].data) + end_time = time.time() + ctxt['elapsed_sec'] += end_time - start_time + return ctxt + + +def main_parallel_write(pool_params): + args, tid, ctxt = pool_params + # Avoid overwriting existing files as it could be artificially faster + if os.path.isfile(ctxt['file']): + os.remove(ctxt['file']) + + handle = ctxt['handle'] + start_time = time.time() + if ctxt[BOUNCE_BUFFER] is not None: + source_buffer = BOUNCE_BUFFER + ctxt[BOUNCE_BUFFER].data.copy_(ctxt[BUFFER].data) + else: + source_buffer = BUFFER + ret = handle.pwrite(ctxt[source_buffer], ctxt['file'], args.validate, True) + assert ret != -1 + handle.wait() + end_time = time.time() + ctxt['elapsed_sec'] += end_time - start_time + + return ctxt + + +def main_handle_read(pool_parms): + args, tid, ctxt = pool_parms + handle = ctxt['handle'] + + start_time = time.time() + dest_buffer = BOUNCE_BUFFER if ctxt[BOUNCE_BUFFER] is not None else BUFFER + ret = handle.read(ctxt[dest_buffer], ctxt['file'], args.validate) + assert ret != -1 + if dest_buffer == BOUNCE_BUFFER: + ctxt[BUFFER].data.copy_(ctxt[BOUNCE_BUFFER].data) + end_time = time.time() + ctxt['elapsed_sec'] += end_time - start_time + + return ctxt + + +def main_handle_write(pool_parms): + args, tid, ctxt = pool_parms + # Avoid overwriting existing files as it could be artificially faster + if os.path.isfile(ctxt['file']): + os.remove(ctxt['file']) + + handle = ctxt['handle'] + start_time = time.time() + if ctxt[BOUNCE_BUFFER] is not None: + source_buffer = BOUNCE_BUFFER + ctxt[BOUNCE_BUFFER].data.copy_(ctxt[BUFFER].data) + else: + source_buffer = BUFFER + ret = handle.write(ctxt[source_buffer], ctxt['file'], args.validate) + assert ret != -1 + end_time = time.time() + ctxt['elapsed_sec'] += end_time - start_time + + return ctxt + + +def get_schedule(args, read_op): + schedule = {} + if read_op: + schedule['pre'] = pre_handle_read + schedule['post'] = post_handle + schedule['main'] = main_parallel_read + else: + schedule['pre'] = pre_handle_write + schedule['post'] = post_handle + schedule['main'] = main_parallel_write + + return schedule + + +def _aio_handle_tasklet(pool_params): + args, tid, read_op = pool_params + num_processes = len(args.mapping_dict) + + # Create schedule + schedule = get_schedule(args, read_op) + task_log(tid, f'schedule = {schedule}') + task_barrier(aio_barrier, num_processes) + + # Run pre task + task_log(tid, f'running pre-task') + ctxt = schedule["pre"]((args, tid)) + task_barrier(aio_barrier, num_processes) + + # Run main tasks in a loop + ctxt["main_task_sec"] = 0 + for i in range(args.loops): + task_log(tid, f'running main task {i}') + start_time = time.time() + ctxt = schedule["main"]((args, tid, ctxt)) + task_barrier(aio_barrier, num_processes) + stop_time = time.time() + ctxt["main_task_sec"] += stop_time - start_time + + # Run post task + task_log(tid, f'running post-task') + ctxt = schedule["post"]((args, tid, ctxt)) + task_barrier(aio_barrier, num_processes) + + return ctxt["main_task_sec"], ctxt["elapsed_sec"], ctxt["num_bytes"] * args.loops + + +def _init_tasklet(b): + global aio_barrier + aio_barrier = b + + +def aio_handle_multiprocessing(args, read_op): + num_processes = len(args.mapping_dict) + b = Barrier(num_processes) + pool_params = [(args, p, read_op) for p in range(num_processes)] + with Pool(processes=num_processes, initializer=_init_tasklet, initargs=(b, )) as p: + pool_results = p.map(_aio_handle_tasklet, pool_params) + + report_results(args, read_op, pool_results) diff --git a/deepspeed/nvme/ds_aio_job.py b/deepspeed/nvme/ds_aio_job.py new file mode 100644 index 000000000000..0f9c8b5f1bcc --- /dev/null +++ b/deepspeed/nvme/ds_aio_job.py @@ -0,0 +1,50 @@ +# Copyright (c) Microsoft Corporation. +# SPDX-License-Identifier: Apache-2.0 + +# DeepSpeed Team +""" +Functionality of swapping tensors to/from (NVMe) storage devices. +""" +import subprocess +import shlex + + +class Job(object): + + def __init__(self, cmd_line, output_file=None, work_dir=None): + self.cmd_line = cmd_line + self.output_file = output_file + self.work_dir = work_dir + self.output_fd = None + + def cmd(self): + return self.cmd_line + + def get_stdout(self): + return self.output_fd + + def get_stderr(self): + return self.output_fd + + def get_cwd(self): + return self.work_dir + + def open_output_file(self): + if self.output_file is not None: + self.output_fd = open(self.output_file, 'w') + + def close_output_file(self): + if self.output_fd is not None: + self.output_fd.close() + self.output_fd = None + + +def run_job(job, verbose=False): + args = shlex.split(' '.join(job.cmd())) + if verbose: + print(f'args = {args}') + job.open_output_file() + proc = subprocess.run(args=args, stdout=job.get_stdout(), stderr=job.get_stderr(), cwd=job.get_cwd()) + job.close_output_file() + assert proc.returncode == 0, \ + f"This command failed: {job.cmd()}" diff --git a/deepspeed/nvme/parse_nvme_stats.py b/deepspeed/nvme/parse_nvme_stats.py new file mode 100755 index 000000000000..09c79ada5b36 --- /dev/null +++ b/deepspeed/nvme/parse_nvme_stats.py @@ -0,0 +1,148 @@ +# Copyright (c) Microsoft Corporation. +# SPDX-License-Identifier: Apache-2.0 + +# DeepSpeed Team +""" +Functionality of swapping optimizer tensors to/from (NVMe) storage devices. +""" + +import os +import argparse + +READ_SPEED = 'read_speed' +WRITE_SPEED = 'write_speed' + +PERF_METRICS = [READ_SPEED, WRITE_SPEED] + +METRIC_SEARCH = {READ_SPEED: 'E2E Read Speed', WRITE_SPEED: 'E2E Write Speed'} + + +def parse_arguments(): + parser = argparse.ArgumentParser() + + parser.add_argument('--log_dir', type=str, required=True, help='Folder of statistics logs') + + parser.add_argument('--metric', + type=str, + required=True, + help='Performance metric to report: [read_speed|write_speed]') + + args = parser.parse_args() + print(f'args = {args}') + + return args + + +def extract_value(key, file): + INVALID_PREFIXES = ["ds"] + for p in INVALID_PREFIXES: + if key.startswith(p): + return key + try: + if key[0] in ['t', 'd', 'p']: + return int(key[1:]) + if key.startswith("bs"): + if key.endswith('K'): + v = key[2:].split('K') + return int(v[0]) * 1024 + elif key.endswith('M'): + v = key[2:].split('M') + return int(v[0]) * 1024 * 1024 + else: + return int(key[2:]) + except: + print(f"{file}: extract_value fails on {key}") + return None + + return key + + +def get_file_key(file): + f, _ = os.path.splitext(os.path.basename(file)) + fields = f.split('_') + values = [extract_value(k, file) for k in fields] + return tuple(values) + + +def get_thread_count(file): + f, _ = os.path.splitext(os.path.basename(file)) + fields = f.split('_') + for key in fields: + if key[0] == 't': + return int(key[1:]) + return 1 + + +""" +Extract performance metric from log file. +Sample file lines are: +Task Read Latency = 0.031647682189941406 sec +Task Read Speed = 12.342926020792527 GB/sec +E2E Read Latency = 0.031697988510131836 sec +E2E Read Speed = 12.323337169333062 GB/sec + +For the above sample, -metric = "read_speed" corresponds to "E2E Read Speed", and 12.32 will be returned +""" + + +def get_metric(file, metric): + thread_count = get_thread_count(file) + with open(file) as f: + for line in f.readlines(): + if line.startswith(METRIC_SEARCH[metric]): + if metric in [READ_SPEED, WRITE_SPEED]: + fields = line.split() + return float(fields[-2]) + else: + fields = line.split('=') + return float(fields[-1]) + + return None + + +def validate_args(args): + if not args.metric in PERF_METRICS: + print(f'{args.metric} is not a valid performance metrics') + return False + + if not os.path.isdir(args.log_dir): + print(f'{args.log_dir} folder is not existent') + return False + + return True + + +def get_results(log_files, metric): + results = {} + for f in log_files: + file_key = get_file_key(f) + value = get_metric(f, metric) + results[file_key] = value + + return results + + +def get_sorted_results(log_dir, metric): + log_files = [f for f in os.listdir(log_dir) if os.path.isfile(os.path.join(log_dir, f))] + + log_files_path = [os.path.join(log_dir, f) for f in log_files] + results = get_results(log_files_path, metric) + result_keys = list(results.keys()) + sorted_keys = sorted(result_keys) + return sorted_keys, results + + +def main(): + print("Parsing aio statistics") + args = parse_arguments() + + if not validate_args(args): + quit() + + sorted_keys, results = get_sorted_results(args.log_dir, args.metric) + for k in sorted_keys: + print(f'{k} = {results[k]}') + + +if __name__ == "__main__": + main() diff --git a/deepspeed/nvme/perf_generate_param.py b/deepspeed/nvme/perf_generate_param.py new file mode 100644 index 000000000000..d0313d728ad5 --- /dev/null +++ b/deepspeed/nvme/perf_generate_param.py @@ -0,0 +1,97 @@ +# Copyright (c) Microsoft Corporation. +# SPDX-License-Identifier: Apache-2.0 + +# DeepSpeed Team +""" +Functionality of swapping optimizer tensors to/from (NVMe) storage devices. +""" +import os +import argparse +import json +from .parse_nvme_stats import READ_SPEED, WRITE_SPEED, get_sorted_results +from .perf_sweep_utils import BENCH_LOG_DIR, READ_LOG_DIR, WRITE_LOG_DIR + + +def parse_arguments(): + parser = argparse.ArgumentParser() + + parser.add_argument('--log_dir', + type=str, + default=BENCH_LOG_DIR, + help=f'Folder of performance sweep logs. Default is {os.path.join(".", BENCH_LOG_DIR)}') + parser.add_argument('--verbose', action='store_true', help='Print debugging information.') + + args = parser.parse_args() + if args.verbose: + print(f'args = {args}') + + return args + + +def validate_args(args): + for d in [READ_LOG_DIR, WRITE_LOG_DIR]: + log_dir = os.path.join(args.log_dir, d) + if not os.path.isdir(log_dir): + print(f'{log_dir} folder is not existent') + return False + + return True + + +def convert_to_param(key): + assert len(key) == 6 + return { + "single_submit": "true" if key[0] == "single" else "false", + "overlap_events": "true" if key[1] == "overlap" else "false", + "num_threads": int(key[5]), + "queue_depth": int(key[3]), + "block_size": int(key[4]) + } + + +def generate_aio_param(read_log_dir, write_log_dir): + _, read_results = get_sorted_results(read_log_dir, READ_SPEED) + _, write_results = get_sorted_results(write_log_dir, WRITE_SPEED) + combined_perf = {key[1:]: value for key, value in read_results.items()} + + for key, value in write_results.items(): + new_key = key[1:] + if new_key in combined_perf: + combined_perf[new_key] += value + else: + combined_perf[new_key] = 0 + + optimal_key = None + optimal_perf = 0.0 + for key, value in combined_perf.items(): + if value > optimal_perf: + optimal_perf = value + optimal_key = key + + aio_param = {"aio": convert_to_param(optimal_key)} + + read_perf_keys = {key[1:]: key for key in read_results.keys()} + write_perf_keys = {key[1:]: key for key in write_results.keys()} + optimal_config_read = read_results.get(read_perf_keys[optimal_key], None) + optimal_config_write = write_results.get(write_perf_keys[optimal_key], None) + + print(f'Best performance (GB/sec): read = {optimal_config_read:5.2f}, write = {optimal_config_write:5.2f}') + print(json.dumps(aio_param, indent=3)) + + +def generate_main(log_dir): + read_log_dir = os.path.join(log_dir, READ_LOG_DIR) + write_log_dir = os.path.join(log_dir, WRITE_LOG_DIR) + generate_aio_param(read_log_dir, write_log_dir) + + +def main(): + args = parse_arguments() + if not validate_args(args): + quit() + print(f'Generate DeepNVMe configuration from {args.log_dir} logs') + generate_main(args.log_dir) + + +if __name__ == "__main__": + generate_main() diff --git a/deepspeed/nvme/perf_run_sweep.py b/deepspeed/nvme/perf_run_sweep.py new file mode 100644 index 000000000000..0155a4d46cae --- /dev/null +++ b/deepspeed/nvme/perf_run_sweep.py @@ -0,0 +1,320 @@ +# Copyright (c) Microsoft Corporation. +# SPDX-License-Identifier: Apache-2.0 + +# DeepSpeed Team +""" +Functionality of swapping optimizer tensors to/from (NVMe) storage devices. +""" +import os +import sys +import argparse +import json +import itertools +import shutil + +from deepspeed.ops.op_builder import AsyncIOBuilder +from deepspeed.ops.op_builder import GDSBuilder +from .ds_aio_job import Job, run_job +from .perf_sweep_utils import READ_OP_DESC, WRITE_OP_DESC, BENCH_LOG_DIR, \ + READ_LOG_DIR, WRITE_LOG_DIR + +OTHER_OPTIONS = '--handle' +PERF_SCRIPT = 'ds_io' +DEFAULT_SWEEP_CONFIG = { + "block_size": ["1M", "8M"], + "queue_depth": [32, 128], + "sequential_requests": [False], + "single_submit": [False], + "io_parallel": [1, 8], +} + + +class SweepConfig(object): + + def __init__(self, args): + self.folder_to_device_mapping = get_ftd_map(args.nvme_dir) + self.search_space = get_sweep_config_dict(args.sweep_config) + self.search_space.update(self.folder_to_device_mapping) + self.read = not args.no_read + self.write = not args.no_write + self.flush_cache = args.flush_page_cache + self.log_dir = args.log_dir + self.verbose = args.verbose + self.other_options = f'{OTHER_OPTIONS} --loops {args.loops} --io_size {args.io_size}' + if args.gpu: + self.other_options += ' --gpu' + if args.gds: + self.other_options += ' --use_gds' + + +def validate_arguments(args): + if not async_io_setup(): + error_msg = """ + Failing because environment is not properly configured for deepspeed async i/o module. + Possible fix: apt install libaio-dev. + """ + print(error_msg) + quit() + + if args.gds and not gds_io_setup(): + error_msg = """ + Failing because environment is not properly configured for deepspeed GDS I/O operator. + """ + print(error_msg) + quit() + + +def parse_sweep_arguments(): + parser = argparse.ArgumentParser() + + parser.add_argument('--nvme_dir', + nargs='+', + required=True, + help='Directory in which to perform I/O tests. A writeable directory on a NVMe device.') + + parser.add_argument('--sweep_config', type=str, default=None, help='Performance sweep configuration json file.') + + parser.add_argument('--no_read', action='store_true', help='Disable read performance measurements.') + + parser.add_argument('--no_write', action='store_true', help='Disable write performance measurements.') + + parser.add_argument('--io_size', + type=str, + default="400M", + help='Number of I/O bytes to read/write for performance measurements.') + + parser.add_argument('--gpu', action='store_true', help='Test tensor transfers between GPU device and NVME device.') + + parser.add_argument('--gds', action='store_true', help='Run the sweep over NVIDIA GPUDirectStorage operator') + + parser.add_argument( + '--flush_page_cache', + action='store_true', + help= + 'Page cache will not be flushed and reported read speeds may be higher than actual ***Requires sudo access***.' + ) + + parser.add_argument( + '--log_dir', + type=str, + default=BENCH_LOG_DIR, + help=f'Output directory for performance log files. Default is {os.path.join(".", BENCH_LOG_DIR)}') + + parser.add_argument('--loops', type=int, default=1, help='Count of operation repetitions') + + parser.add_argument('--verbose', action='store_true', help='Print debugging information.') + + args = parser.parse_args() + if args.verbose: + print(f'args = {args}') + validate_arguments(args) + + return args + + +def dump_cmd_lines(cmd_lines): + print(f'cmd line count = {len(cmd_lines)}') + for i, cmd in enumerate(cmd_lines): + print(f'{i}: {cmd}') + + +def get_ftd_map(nvme_dir_list): + ftd_list = [f'{dir}:{dev}' for dev, dir in enumerate(nvme_dir_list)] + ftd_arg = [' '.join(ftd for ftd in ftd_list)] + return {'folder_to_device_mapping': ftd_arg} + + +def get_sweep_config_dict(sweep_config_json): + if sweep_config_json is None: + return DEFAULT_SWEEP_CONFIG + + with open(sweep_config_json) as fp: + sweep_config = json.load(fp) + return sweep_config + + +def get_sweep_cmd_lines(sweep_config_dict): + + def flatten_options(key, value_list): + flat_list = [] + for v in value_list: + if not type(v) is bool: + flat_list.append(f'--{key} {v}') + elif v: + flat_list.append(f'--{key}') + else: + flat_list.append(' ') + + return flat_list + + flat_list = [flatten_options(key, value) for key, value in sweep_config_dict.items()] + cmd_list = list(itertools.product(*flat_list)) + cmd_list = [list(cmd) for cmd in cmd_list] + #dump_cmd_lines(cmd_list) + return cmd_list + + +def launch_sweep(sweep_jobs, sync_job, flush_cache_job, verbose): + for perf_job in sweep_jobs: + if flush_cache_job is not None: + run_job(sync_job, verbose) + run_job(flush_cache_job, verbose) + + run_job(perf_job, verbose) + + run_job(sync_job, verbose) + + +def create_cmd_tags(cmd_line): + tags = {} + for param_value in cmd_line: + fields = param_value.split() + if len(fields) == 1: + tags[fields[0]] = None + elif len(fields) == 2: + if fields[0] == '--folder_to_device_mapping': + tags[fields[0]] = len(fields[1:]) + else: + tags[fields[0]] = fields[1] + elif len(fields) > 2: + tags[fields[0]] = len(fields[1:]) + return tags + + +def get_log_file(io_op_desc, cmd_line): + QUEUE_DEPTH = "--queue_depth" + BLOCK_SIZE = "--block_size" + SINGLE_SUBMIT = "--single_submit" + SEQUENTIAL_REQUESTS = "--sequential_requests" + FTD_MAP = "--folder_to_device_mapping" + IO_PARALLEL = "--io_parallel" + + tag_map = { + QUEUE_DEPTH: "d", + BLOCK_SIZE: "bs", + SINGLE_SUBMIT: "single", + SEQUENTIAL_REQUESTS: "sequential", + FTD_MAP: "ftd", + IO_PARALLEL: "p" + } + + tag_default = { + QUEUE_DEPTH: 1, + BLOCK_SIZE: "1M", + SINGLE_SUBMIT: "block", + SEQUENTIAL_REQUESTS: "overlap", + FTD_MAP: 1, + IO_PARALLEL: 1 + } + + def get_default_value(tag): + value = tag_default[tag] + if tag in [SINGLE_SUBMIT, SEQUENTIAL_REQUESTS]: + return value + return f'{tag_map[tag]}{value}' + + def get_config_value(tag, value): + tag_key = tag_map[tag] + if value is None: + return tag_key + return f'{tag_key}{value}' + + tag_list = [SINGLE_SUBMIT, SEQUENTIAL_REQUESTS, FTD_MAP, QUEUE_DEPTH, BLOCK_SIZE, IO_PARALLEL] + log_tags = [io_op_desc] + cmd_tags = create_cmd_tags(cmd_line) + for tag in tag_list: + if tag in cmd_tags: + log_tags.append(get_config_value(tag, cmd_tags[tag])) + else: + log_tags.append(get_default_value(tag)) + + log_file = '_'.join(log_tags) + log_file += '.txt' + return log_file + + +def create_perf_jobs(io_op_desc, log_dir, cmd_lines): + py_cmd = [os.path.join(script_path(), PERF_SCRIPT)] + + perf_jobs = [] + for cmd in cmd_lines: + log_file = os.path.join(log_dir, get_log_file(io_op_desc, cmd)) + job = Job(cmd_line=py_cmd + cmd, output_file=log_file) + perf_jobs.append(job) + + return perf_jobs + + +def script_path(): + return os.path.dirname(os.path.realpath(sys.argv[0])) + + +def async_io_setup(): + return AsyncIOBuilder().is_compatible() + + +def gds_io_setup(): + return GDSBuilder().is_compatible() + + +def remove_folder(folder): + assert os.path.isdir(folder), f"Error: cannot remove {folder} - folder not found" + shutil.rmtree(folder) + + +def run_read_sweep(sweep_config, flush_cache_job, sync_job, cmd_lines): + read_cmd_lines = [[f'--read {sweep_config.other_options}'] + cmd for cmd in cmd_lines] + # dump_cmd_lines(cmd_lines) + + log_folder = os.path.join(sweep_config.log_dir, f'{READ_LOG_DIR}') + os.makedirs(log_folder, exist_ok=True) + + perf_jobs = create_perf_jobs(io_op_desc=READ_OP_DESC, log_dir=log_folder, cmd_lines=read_cmd_lines) + + launch_sweep(sweep_jobs=perf_jobs, + sync_job=sync_job, + flush_cache_job=flush_cache_job, + verbose=sweep_config.verbose) + + +def run_write_sweep(sweep_config, flush_cache_job, sync_job, cmd_lines): + write_cmd_lines = [[f'{sweep_config.other_options}'] + cmd for cmd in cmd_lines] + # dump_cmd_lines(write_cmd_lines) + + log_folder = os.path.join(sweep_config.log_dir, f'{WRITE_LOG_DIR}') + os.makedirs(log_folder, exist_ok=True) + + perf_jobs = create_perf_jobs(io_op_desc=WRITE_OP_DESC, log_dir=log_folder, cmd_lines=write_cmd_lines) + + launch_sweep(sweep_jobs=perf_jobs, + sync_job=sync_job, + flush_cache_job=flush_cache_job, + verbose=sweep_config.verbose) + + +def sweep_main(args): + sweep_config = SweepConfig(args) + cmd_lines = get_sweep_cmd_lines(sweep_config.search_space) + + if sweep_config.flush_cache: + flush_cache_job = Job(cmd_line=['sudo', 'bash -c', "'echo 1 > /proc/sys/vm/drop_caches'"]) + else: + flush_cache_job = None + + sync_job = Job(cmd_line=['sync']) + + if sweep_config.read: + run_read_sweep(sweep_config, flush_cache_job, sync_job, cmd_lines) + + if sweep_config.write: + run_write_sweep(sweep_config, flush_cache_job, sync_job, cmd_lines) + + +def main(): + args = parse_sweep_arguments() + print(f"Running DeepNVMe performance sweep on {args.nvme_dir}") + sweep_main(args) + + +if __name__ == "__main__": + sweep_main() diff --git a/deepspeed/nvme/perf_sweep_utils.py b/deepspeed/nvme/perf_sweep_utils.py new file mode 100644 index 000000000000..e6832c1baa49 --- /dev/null +++ b/deepspeed/nvme/perf_sweep_utils.py @@ -0,0 +1,13 @@ +# Copyright (c) Microsoft Corporation. +# SPDX-License-Identifier: Apache-2.0 + +# DeepSpeed Team + +SCRIPT_PREFIX = '_aio_bench' +WRITE_OP_DESC = 'write' +READ_OP_DESC = 'read' +READ_IO_DIR = f'{SCRIPT_PREFIX}_{READ_OP_DESC}_io' +WRITE_IO_DIR = f'{SCRIPT_PREFIX}_{WRITE_OP_DESC}_io' +BENCH_LOG_DIR = f'{SCRIPT_PREFIX}_logs' +READ_LOG_DIR = f'{SCRIPT_PREFIX}_{READ_OP_DESC}_logs' +WRITE_LOG_DIR = f'{SCRIPT_PREFIX}_{WRITE_OP_DESC}_logs' diff --git a/deepspeed/nvme/test_ds_aio.py b/deepspeed/nvme/test_ds_aio.py new file mode 100755 index 000000000000..a17350414739 --- /dev/null +++ b/deepspeed/nvme/test_ds_aio.py @@ -0,0 +1,25 @@ +# Copyright (c) Microsoft Corporation. +# SPDX-License-Identifier: Apache-2.0 + +# DeepSpeed Team +""" +Functionality of swapping optimizer tensors to/from (NVMe) storage devices. +""" + +import multiprocessing as mp +from .ds_aio_basic import aio_basic_multiprocessing +from .ds_aio_handle import aio_handle_multiprocessing +from .ds_aio_args import get_validated_args + + +def ds_io_main(): + print(f'Testing deepspeed_aio python frontend') + + args = get_validated_args() + mp.set_start_method('spawn') + multiprocess_function = aio_handle_multiprocessing if args.handle else aio_basic_multiprocessing + multiprocess_function(args, args.read) + + +if __name__ == "__main__": + ds_io_main() diff --git a/deepspeed/nvme/test_ds_aio_utils.py b/deepspeed/nvme/test_ds_aio_utils.py new file mode 100755 index 000000000000..cf167f647460 --- /dev/null +++ b/deepspeed/nvme/test_ds_aio_utils.py @@ -0,0 +1,81 @@ +# Copyright (c) Microsoft Corporation. +# SPDX-License-Identifier: Apache-2.0 + +# DeepSpeed Team +""" +Functionality of swapping optimizer tensors to/from (NVMe) storage devices. +""" + +import os +from .ds_aio_job import Job, run_job + +BYTES_PER_GB = 1024**3 +BYTES_PER_MB = 1024**2 +BYTES_PER_KB = 1024 +LOG_TIDS = [0] + + +def task_log(tid, msg, force=False): + if force or tid in LOG_TIDS: + print(f'tid {tid}: {msg}') + + +def task_barrier(barrier, num_parties): + assert barrier.parties == num_parties + barrier.wait() + assert barrier.broken == False + + +def report_results(args, read_op, pool_results): + #print(f'pool_results = {pool_results}') + io_string = 'Read' if read_op else 'Write' + if None in pool_results: + print(f'Failure in one of {args.threads} {io_string} processes') + return + + total_bytes = sum([num_bytes for _, _, num_bytes in pool_results]) + + task_latency_sec = max([sec for _, sec, _ in pool_results]) + task_speed_GB = 0 if task_latency_sec == 0 else total_bytes / task_latency_sec / BYTES_PER_GB + print(f'Task {io_string} Latency = {task_latency_sec} sec') + print(f'Task {io_string} Speed = {task_speed_GB} GB/sec') + + e2e_latency_sec = max([sec for sec, _, _ in pool_results]) + e2e_speed_GB = 0 if e2e_latency_sec == 0 else total_bytes / e2e_latency_sec / BYTES_PER_GB + print(f'E2E {io_string} Latency = {e2e_latency_sec} sec') + print(f'E2E {io_string} Speed = {e2e_speed_GB} GB/sec') + + +def get_block_size_and_count(io_bytes): + if io_bytes > BYTES_PER_MB and io_bytes % BYTES_PER_MB == 0: + block_size = BYTES_PER_MB + block_size_string = '1M' + else: + assert io_bytes % BYTES_PER_KB == 0 + block_size = BYTES_PER_KB + block_size_string = '1K' + block_count = io_bytes / block_size + + return block_size_string, int(block_count) + + +def refine_integer_value(value): + unit_dict = {'K': 1024, 'M': 1024**2, 'G': 1024**3} + + if value[-1] in list(unit_dict.keys()): + int_value = int(value[:-1]) * unit_dict[value[-1]] + return int_value + return int(value) + + +def create_filename(folder, read_op, size, tid): + io_string = "read" if read_op else "write" + return os.path.join(folder, f'_aio_{io_string}_{size}.pt.{tid}') + + +def create_file(filename, num_bytes): + block_size, block_count = get_block_size_and_count(num_bytes) + dd_job = Job(cmd_line=[f'dd if=/dev/urandom of={filename} bs={block_size} count={block_count}']) + print(f'[Start] Create {filename} of {num_bytes} bytes by running {dd_job.cmd()} ....') + run_job(dd_job) + print(f'[Done] Create read file of {num_bytes} bytes by running {dd_job.cmd()} ....') diff --git a/deepspeed/nvme/validate_async_io.py b/deepspeed/nvme/validate_async_io.py new file mode 100644 index 000000000000..10fb638347bc --- /dev/null +++ b/deepspeed/nvme/validate_async_io.py @@ -0,0 +1,10 @@ +# Copyright (c) Microsoft Corporation. +# SPDX-License-Identifier: Apache-2.0 + +# DeepSpeed Team +""" +Functionality of swapping optimizer tensors to/from (NVMe) storage devices. +""" +from deepspeed.ops.op_builder import AsyncIOBuilder +assert AsyncIOBuilder().is_compatible() +assert AsyncIOBuilder().load() diff --git a/docs/_tutorials/deepnvme.md b/docs/_tutorials/deepnvme.md index 480bcf2d95df..70c6ac097963 100644 --- a/docs/_tutorials/deepnvme.md +++ b/docs/_tutorials/deepnvme.md @@ -188,7 +188,7 @@ This tutorial has been significantly improved by feedback from [Guanhua Wang](ht ## Appendix ### Advanced Handle Creation -Achieving peak I/O performance with DeepNVMe requires careful configuration of handle creation. In particular, the parameters of `aio_handle` and `gds_handle` constructors are performance-critical because they determine how efficiently DeepNVMe interacts with the underlying storage subsystem (i.e., `libaio`, GDS, and SSD). For convenience we make it possible to create handles using default parameter values which will provide decent performance in most scenarios. However, squeezing out every available performance in your environment will likely require tuning the constructor parameters, namely `block_size`, `queue_depth`, `single_submit`, `overlap_events`, and `num_threads`. The `aio_handle` constructor parameters and default values are illustrated below: +Achieving peak I/O performance with DeepNVMe requires careful configuration of handle creation. In particular, the parameters of `aio_handle` and `gds_handle` constructors are performance-critical because they determine how efficiently DeepNVMe interacts with the underlying storage subsystem (i.e., `libaio`, GDS, PCIe, and SSD). For convenience we make it possible to create handles using default parameter values which will provide decent performance in most scenarios. However, squeezing out every available performance in your environment will likely require tuning the constructor parameters, namely `block_size`, `queue_depth`, `single_submit`, `overlap_events`, and `num_threads`. The `aio_handle` constructor parameters and default values are illustrated below: ```bash >>> from deepspeed.ops.op_builder import AsyncIOBuilder >>> help(AsyncIOBuilder().load().aio_handle()) @@ -208,6 +208,56 @@ class aio_handle(pybind11_builtins.pybind11_object) | AIO handle constructor ``` +### Performance Tuning +As discussed [earlier](#advanced-handle-creation), achieving peak DeepNVMe performance for a target workload or environment requires using optimally configured `aio_handle` or `gds_handle` handles. For configuration convenience, we provide a utility called `ds_nvme_tune` to automate the discovery of optimal DeepNVMe configurations. `ds_nvme_tune` automatically explores a user-specified or default configuration space and recommends the option that provides the best read and write performance. Below is an example usage of `ds_nvme_tune` to tune `aio_handle` data transfers between GPU memory and a local NVVMe SSD mounted on `/local_nvme`. This example used the default configuration space of `ds_nvme_tune` for tuning. + +```bash +$ ds_nvme_tune --nvme_dir /local_nvme --gpu +Running DeepNVMe performance tuning on ['/local_nvme/'] +Best performance (GB/sec): read = 3.69, write = 3.18 +{ + "aio": { + "single_submit": "false", + "overlap_events": "true", + "num_threads": 8, + "queue_depth": 32, + "block_size": 1048576 + } +} +``` +The above tuning was executed on a Lambda workstation equipped with two NVIDIA A6000-48GB GPUs, 252GB of DRAM, and a [CS3040 NVMe 2TB SDD](https://www.pny.com/CS3040-M2-NVMe-SSD?sku=M280CS3040-2TB-RB) with peak read and write speeds of 5.6 GB/s and 4.3 GB/s respectively. The tuning required about four and half minutes. Based on the results, one can expect to achieve read and write transfer speeds of 3.69 GB/sec and 3.18 GB/sec respectively by using an `aio_handle` configured as below. + +```python +>>> from deepspeed.ops.op_builder import AsyncIOBuilder +>>> h = AsyncIOBuilder().load().aio_handle(block_size=1048576, + queue_depth=32, + single_submit=False, + overlap_events=True, + num_threads=8) +``` + + +The full command line options of `ds_nvme_tune` can be obtained via the normal `-h` or `--help`. +```bash +usage: ds_nvme_tune [-h] --nvme_dir NVME_DIR [NVME_DIR ...] [--sweep_config SWEEP_CONFIG] [--no_read] [--no_write] [--io_size IO_SIZE] [--gpu] [--gds] [--flush_page_cache] [--log_dir LOG_DIR] [--loops LOOPS] [--verbose] + +options: + -h, --help show this help message and exit + --nvme_dir NVME_DIR [NVME_DIR ...] + Directory in which to perform I/O tests. A writeable directory on a NVMe device. + --sweep_config SWEEP_CONFIG + Performance sweep configuration json file. + --no_read Disable read performance measurements. + --no_write Disable write performance measurements. + --io_size IO_SIZE Number of I/O bytes to read/write for performance measurements. + --gpu Test tensor transfers between GPU device and NVME device. + --gds Run the sweep over NVIDIA GPUDirectStorage operator + --flush_page_cache Page cache will not be flushed and reported read speeds may be higher than actual ***Requires sudo access***. + --log_dir LOG_DIR Output directory for performance log files. Default is ./_aio_bench_logs + --loops LOOPS Count of operation repetitions + --verbose Print debugging information. +``` + ### DeepNVMe APIs For convenience, we provide listing and brief descriptions of the DeepNVMe APIs. diff --git a/setup.py b/setup.py index 1b6768d1b2c3..e39d8c7e05a3 100755 --- a/setup.py +++ b/setup.py @@ -298,7 +298,7 @@ def op_enabled(op_name): else: scripts = [ 'bin/deepspeed', 'bin/deepspeed.pt', 'bin/ds', 'bin/ds_ssh', 'bin/ds_report', 'bin/ds_bench', 'bin/dsr', - 'bin/ds_elastic' + 'bin/ds_elastic', 'bin/ds_nvme_tune', 'bin/ds_io' ] start_time = time.time() From 0fbe96a5022d30470b8cb53f65237389ba26c57a Mon Sep 17 00:00:00 2001 From: andyG <135115931+Andy666G@users.noreply.github.com> Date: Thu, 26 Sep 2024 21:10:52 +0800 Subject: [PATCH 523/754] [Accelerator] Cambricon MLU support (#6472) ### Description This PR includes Cambricon MLU accelerator support. With this PR, DeepSpeed supports MLU as backend for training and inference tasks. --------- Co-authored-by: Logan Adams <114770087+loadams@users.noreply.github.com> --- accelerator/mlu_accelerator.py | 300 ++++++++++++++++++++++++++++++++ accelerator/real_accelerator.py | 18 +- op_builder/mlu/__init__.py | 12 ++ op_builder/mlu/builder.py | 35 ++++ op_builder/mlu/cpu_adagrad.py | 24 +++ op_builder/mlu/cpu_adam.py | 28 +++ op_builder/mlu/fused_adam.py | 39 +++++ op_builder/mlu/no_impl.py | 34 ++++ 8 files changed, 489 insertions(+), 1 deletion(-) create mode 100644 accelerator/mlu_accelerator.py create mode 100644 op_builder/mlu/__init__.py create mode 100644 op_builder/mlu/builder.py create mode 100644 op_builder/mlu/cpu_adagrad.py create mode 100644 op_builder/mlu/cpu_adam.py create mode 100644 op_builder/mlu/fused_adam.py create mode 100644 op_builder/mlu/no_impl.py diff --git a/accelerator/mlu_accelerator.py b/accelerator/mlu_accelerator.py new file mode 100644 index 000000000000..bef716f0ee4e --- /dev/null +++ b/accelerator/mlu_accelerator.py @@ -0,0 +1,300 @@ +# Copyright (c) Microsoft Corporation. +# SPDX-License-Identifier: Apache-2.0 + +# DeepSpeed Team +import importlib +import inspect +import functools + +from .abstract_accelerator import DeepSpeedAccelerator +import torch +# During setup stage torch may not be installed, pass on no torch will +# allow op builder related API to be executed. + + +class MLU_Accelerator(DeepSpeedAccelerator): + + def __init__(self): + self._name = 'mlu' + self._communication_backend_name = 'cncl' + self._compile_backend = "inductor" + self.class_dict = None + + def is_synchronized_device(self): + return False + + def use_host_timers(self): + return self.is_synchronized_device() + + def resolves_data_dependency(self): + return self.is_synchronized_device() + + def handles_memory_backpressure(self): + return self.is_synchronized_device() + + # Device APIs + def device_name(self, device_index=None): + if device_index == None: + return 'mlu' + return 'mlu:{}'.format(device_index) + + def device(self, device_index=None): + return torch.mlu.device(device_index) + + def set_device(self, device_index): + torch.mlu.set_device(device_index) + + def current_device(self): + return torch.mlu.current_device() + + def current_device_name(self): + return 'mlu:{}'.format(torch.mlu.current_device()) + + def device_count(self): + return torch.mlu.device_count() + + def synchronize(self, device_index=None): + return torch.mlu.synchronize(device_index) + + # RNG APIs + def random(self): + return torch.random + + def set_rng_state(self, new_state, device_index=None): + if device_index is None: + return torch.mlu.set_rng_state(new_state) + + return torch.mlu.set_rng_state(new_state, device_index) + + def get_rng_state(self, device_index=None): + if device_index is None: + return torch.mlu.get_rng_state() + + return torch.mlu.get_rng_state(device_index) + + def manual_seed(self, seed): + return torch.mlu.manual_seed(seed) + + def manual_seed_all(self, seed): + return torch.mlu.manual_seed_all(seed) + + def initial_seed(self, seed): + return torch.mlu.initial_seed(seed) + + def default_generator(self, device_index): + return torch.mlu.default_generators[device_index] + + # Streams/Events + @property + def Stream(self): + return torch.mlu.Stream + + def stream(self, stream): + return torch.mlu.stream(stream) + + def current_stream(self, device_index=None): + return torch.mlu.current_stream(device_index) + + def default_stream(self, device_index=None): + return torch.mlu.default_stream(device_index) + + @property + def Event(self): + return torch.mlu.Event + + # Memory management + def empty_cache(self): + return torch.mlu.empty_cache() + + def memory_allocated(self, device_index=None): + return torch.mlu.memory_allocated(device_index) + + def max_memory_allocated(self, device_index=None): + return torch.mlu.max_memory_allocated(device_index) + + def reset_max_memory_allocated(self, device_index=None): + return torch.mlu.reset_max_memory_allocated(device_index) + + def memory_cached(self, device_index=None): + return torch.mlu.memory_cached(device_index) + + def max_memory_cached(self, device_index=None): + return torch.mlu.max_memory_cached(device_index) + + def reset_max_memory_cached(self, device_index=None): + return torch.mlu.reset_max_memory_cached(device_index) + + def memory_stats(self, device_index=None): + if hasattr(torch.mlu, 'memory_stats'): + return torch.mlu.memory_stats(device_index) + + def reset_peak_memory_stats(self, device_index=None): + if hasattr(torch.mlu, 'reset_peak_memory_stats'): + return torch.mlu.reset_peak_memory_stats(device_index) + + def memory_reserved(self, device_index=None): + if hasattr(torch.mlu, 'memory_reserved'): + return torch.mlu.memory_reserved(device_index) + + def max_memory_reserved(self, device_index=None): + if hasattr(torch.mlu, 'max_memory_reserved'): + return torch.mlu.max_memory_reserved(device_index) + + def total_memory(self, device_index=None): + return torch.mlu.get_device_properties(device_index).total_memory + + def available_memory(self, device_index=None): + return self.total_memory(device_index) - self.memory_allocated(device_index) + + # Data types + def is_bf16_supported(self): + return torch.mlu.is_bf16_supported() + + def is_fp16_supported(self): + return True + + def supported_dtypes(self): + supported_dtypes = [torch.float] + if self.is_fp16_supported(): + supported_dtypes.append(torch.half) + if self.is_bf16_supported(): + supported_dtypes.append(torch.bfloat16) + return supported_dtypes + + # Misc + def amp(self): + if hasattr(torch.mlu, 'amp'): + return torch.mlu.amp + return None + + def is_available(self): + return torch.mlu.is_available() + + def range_push(self, msg): + if hasattr(torch.mlu.cnpx, 'range_push'): + return torch.mlu.cnpx.range_push(msg) + + def range_pop(self): + if hasattr(torch.mlu.cnpx, 'range_pop'): + return torch.mlu.cnpx.range_pop() + + def lazy_call(self, callback): + return torch.mlu._lazy_call(callback) + + def communication_backend_name(self): + return self._communication_backend_name + + def is_triton_supported(self): + return True + + # Graph operations + def create_graph(self): + torch.mlu.MLUGraph() + + def capture_to_graph(self, graph, pool=None, stream=None): + return torch.mlu.graph(graph, pool, stream) + + def replay_graph(self, graph): + graph.replay() + return + + # Tensor operations + + @property + def BFloat16Tensor(self): + return functools.partial(torch.tensor, dtype=torch.bfloat16, device='mlu') + + @property + def ByteTensor(self): + return functools.partial(torch.tensor, dtype=torch.uint8, device='mlu') + + @property + def DoubleTensor(self): + return functools.partial(torch.tensor, dtype=torch.double, device='mlu') + + @property + def FloatTensor(self): + return functools.partial(torch.tensor, dtype=torch.float, device='mlu') + + @property + def HalfTensor(self): + return functools.partial(torch.tensor, dtype=torch.half, device='mlu') + + @property + def IntTensor(self): + return functools.partial(torch.tensor, dtype=torch.int, device='mlu') + + @property + def LongTensor(self): + return functools.partial(torch.tensor, dtype=torch.long, device='mlu') + + def pin_memory(self, tensor): + return tensor.pin_memory() + + def is_pinned(self, tensor): + return tensor.is_pinned() + + def on_accelerator(self, tensor): + device_str = str(tensor.device) + if device_str.startswith('mlu:'): + return True + else: + return False + + def op_builder_dir(self): + try: + # is op_builder from deepspeed or a 3p version? this should only succeed if it's deepspeed + # if successful this also means we're doing a local install and not JIT compile path + from op_builder import __deepspeed__ # noqa: F401 # type: ignore + return "op_builder.mlu" + except ImportError: + return "deepspeed.ops.op_builder.mlu" + + def _lazy_init_class_dict(self): + if self.class_dict: + return + + op_builder_module = importlib.import_module(self.op_builder_dir()) + + # get op builder class from op_builder/mlu/__init__.py + self.class_dict = {} + for class_name, class_obj in inspect.getmembers(op_builder_module, inspect.isclass): + self.class_dict[class_name] = class_obj + + # create an instance of op builder and return, name specified by class_name + def create_op_builder(self, class_name): + builder_class = self.get_op_builder(class_name) + return builder_class() + + # return an op builder class, name specified by class_name + def get_op_builder(self, class_name): + self._lazy_init_class_dict() + if class_name in self.class_dict: + return self.class_dict[class_name] + else: + return self.class_dict['NotImplementedBuilder'] + + def build_extension(self): + from torch.utils.cpp_extension import BuildExtension + return BuildExtension + + def export_envs(self): + return ['NEUWARE_HOME', 'CNCL', 'LD_LIBRARY', 'PATH'] + + def visible_devices_envs(self): + return ['MLU_VISIBLE_DEVICES'] + + def set_visible_devices_envs(self, current_env, local_accelerator_ids): + for env in self.visible_devices_envs(): + current_env[env] = ",".join(map(str, local_accelerator_ids)) + + def get_compile_backend(self): + return self._compile_backend + + def set_compile_backend(self, backend): + supported_backends = torch._dynamo.list_backends(exclude_tags=()) + if backend in supported_backends: + self._compile_backend = backend + else: + raise ValueError( + f"{backend} not supported by {self.device_name()}. Supported Backends are {supported_backends }") diff --git a/accelerator/real_accelerator.py b/accelerator/real_accelerator.py index 037162e867ec..69e96d285bb8 100644 --- a/accelerator/real_accelerator.py +++ b/accelerator/real_accelerator.py @@ -20,7 +20,7 @@ except ImportError as e: dsa2 = None -SUPPORTED_ACCELERATOR_LIST = ['cuda', 'cpu', 'xpu', 'xpu.external', 'npu', 'mps', 'hpu'] +SUPPORTED_ACCELERATOR_LIST = ['cuda', 'cpu', 'xpu', 'xpu.external', 'npu', 'mps', 'hpu', 'mlu'] ds_accelerator = None @@ -94,6 +94,11 @@ def get_accelerator(): except ImportError as e: raise ValueError( f"HPU_Accelerator requires habana_frameworks.torch.hpu, which is not installed on this system.") + elif accelerator_name == "mlu": + try: + import torch_mlu # noqa: F401 + except ImportError as e: + raise ValueError(f"MLU_Accelerator requires torch_mlu, which is not installed on this system.") elif accelerator_name not in SUPPORTED_ACCELERATOR_LIST: raise ValueError(f'DS_ACCELERATOR must be one of {SUPPORTED_ACCELERATOR_LIST}. ' f'Value "{accelerator_name}" is not supported') @@ -149,6 +154,13 @@ def get_accelerator(): accelerator_name = "hpu" except ImportError as e: pass + if accelerator_name is None: + try: + import torch_mlu # noqa: F401,F811 + + accelerator_name = "mlu" + except ImportError as e: + pass if accelerator_name is None: # borrow this log from PR#5084 try: @@ -198,6 +210,10 @@ def get_accelerator(): from .hpu_accelerator import HPU_Accelerator ds_accelerator = HPU_Accelerator() + elif accelerator_name == 'mlu': + from .mlu_accelerator import MLU_Accelerator + + ds_accelerator = MLU_Accelerator() _validate_accelerator(ds_accelerator) if accel_logger is not None: accel_logger.info(f"Setting ds_accelerator to {ds_accelerator._name} ({ds_set_method})") diff --git a/op_builder/mlu/__init__.py b/op_builder/mlu/__init__.py new file mode 100644 index 000000000000..db12afbbf20e --- /dev/null +++ b/op_builder/mlu/__init__.py @@ -0,0 +1,12 @@ +# Copyright (c) Microsoft Corporation. +# Copyright (c) 2024 Cambricon Corporation. +# SPDX-License-Identifier: Apache-2.0 + +# DeepSpeed Team +'''Copyright The Microsoft DeepSpeed Team''' + +# MLU related operators will be added in the future. +from .no_impl import NotImplementedBuilder +from .cpu_adagrad import CPUAdagradBuilder +from .cpu_adam import CPUAdamBuilder +from .fused_adam import FusedAdamBuilder diff --git a/op_builder/mlu/builder.py b/op_builder/mlu/builder.py new file mode 100644 index 000000000000..17b9723ffcc1 --- /dev/null +++ b/op_builder/mlu/builder.py @@ -0,0 +1,35 @@ +# Copyright (c) Microsoft Corporation. +# Copyright (c) 2024 Cambricon Corporation. +# SPDX-License-Identifier: Apache-2.0 + +# DeepSpeed Team + +try: + # is op_builder from deepspeed or a 3p version? this should only succeed if it's deepspeed + # if successful this also means we're doing a local install and not JIT compile path + from op_builder import __deepspeed__ # noqa: F401 # type: ignore + from op_builder.builder import OpBuilder +except ImportError: + from deepspeed.ops.op_builder.builder import OpBuilder + + +class MLUOpBuilder(OpBuilder): + + def builder(self): + from torch.utils.cpp_extension import CppExtension as ExtensionBuilder + + compile_args = {'cxx': self.strip_empty_entries(self.cxx_args())} + + cpp_ext = ExtensionBuilder(name=self.absolute_name(), + sources=self.strip_empty_entries(self.sources()), + include_dirs=self.strip_empty_entries(self.include_paths()), + libraries=self.strip_empty_entries(self.libraries_args()), + extra_compile_args=compile_args) + + return cpp_ext + + def cxx_args(self): + return ['-O3', '-g', '-Wno-reorder'] + + def libraries_args(self): + return [] diff --git a/op_builder/mlu/cpu_adagrad.py b/op_builder/mlu/cpu_adagrad.py new file mode 100644 index 000000000000..68b7bbe514ee --- /dev/null +++ b/op_builder/mlu/cpu_adagrad.py @@ -0,0 +1,24 @@ +# Copyright (c) Microsoft Corporation. +# Copyright (c) 2024 Cambricon Corporation. +# SPDX-License-Identifier: Apache-2.0 + +# DeepSpeed Team + +from .builder import MLUOpBuilder + + +class CPUAdagradBuilder(MLUOpBuilder): + BUILD_VAR = "DS_BUILD_CPU_ADAGRAD" + NAME = "cpu_adagrad" + + def __init__(self): + super().__init__(name=self.NAME) + + def absolute_name(self): + return f'deepspeed.ops.adagrad.{self.NAME}_op' + + def sources(self): + return ['csrc/adagrad/cpu_adagrad.cpp'] + + def include_paths(self): + return ['csrc/includes'] diff --git a/op_builder/mlu/cpu_adam.py b/op_builder/mlu/cpu_adam.py new file mode 100644 index 000000000000..b3c8e476bf39 --- /dev/null +++ b/op_builder/mlu/cpu_adam.py @@ -0,0 +1,28 @@ +# Copyright (c) Microsoft Corporation. +# Copyright (c) 2024 Cambricon Corporation. +# SPDX-License-Identifier: Apache-2.0 + +# DeepSpeed Team + +from .builder import MLUOpBuilder + + +class CPUAdamBuilder(MLUOpBuilder): + BUILD_VAR = "DS_BUILD_CPU_ADAM" + NAME = "cpu_adam" + + def __init__(self): + super().__init__(name=self.NAME) + + def absolute_name(self): + return f'deepspeed.ops.adam.{self.NAME}_op' + + def sources(self): + return ['csrc/adam/cpu_adam.cpp', 'csrc/adam/cpu_adam_impl.cpp'] + + def libraries_args(self): + args = super().libraries_args() + return args + + def include_paths(self): + return ['csrc/includes'] diff --git a/op_builder/mlu/fused_adam.py b/op_builder/mlu/fused_adam.py new file mode 100644 index 000000000000..0198db7cb276 --- /dev/null +++ b/op_builder/mlu/fused_adam.py @@ -0,0 +1,39 @@ +# Copyright (c) Microsoft Corporation. +# Copyright (c) 2024 Cambricon Corporation. +# SPDX-License-Identifier: Apache-2.0 + +# DeepSpeed Team + +from .builder import MLUOpBuilder +import torch + + +class MLUFusedAdam: + + @staticmethod + def multi_tensor_adam(chunk_size, noop_flag_buffer, tensor_lists, lr, beta1, beta2, epsilon, step, adam_w_mode, + bias_correction, weight_decay, *args): + + torch.ops.torch_mlu.fused_adam(noop_flag_buffer, tensor_lists[0], tensor_lists[1], tensor_lists[2], + tensor_lists[3], lr, beta1, beta2, epsilon, step, adam_w_mode, bias_correction, + weight_decay) + + +class FusedAdamBuilder(MLUOpBuilder): + BUILD_VAR = "DS_BUILD_FUSED_ADAM" + NAME = "fused_adam" + + def __init__(self): + super().__init__(name=self.NAME) + + def absolute_name(self): + return f'deepspeed.ops.adam.{self.NAME}_op' + + def sources(self): + return [] + + def include_paths(self): + return [] + + def load(self, verbose=True): + return MLUFusedAdam diff --git a/op_builder/mlu/no_impl.py b/op_builder/mlu/no_impl.py new file mode 100644 index 000000000000..375c148b4a5e --- /dev/null +++ b/op_builder/mlu/no_impl.py @@ -0,0 +1,34 @@ +# Copyright (c) Microsoft Corporation. +# Copyright (c) 2024 Cambricon Corporation. +# SPDX-License-Identifier: Apache-2.0 + +# DeepSpeed Team + +from .builder import MLUOpBuilder + + +class NotImplementedBuilder(MLUOpBuilder): + BUILD_VAR = "DS_BUILD_NOT_IMPLEMENTED" + NAME = "deepspeed_not_implemented" + + def __init__(self, name=None): + name = self.NAME if name is None else name + super().__init__(name=name) + + def absolute_name(self): + return f'deepspeed.ops.comm.{self.NAME}_op' + + def load(self, verbose=True): + raise ValueError("This op had not been implemented on MLU backend.") + + def sources(self): + return [] + + def cxx_args(self): + return [] + + def extra_ldflags(self): + return [] + + def include_paths(self): + return [] From c85c8703bc49eefb78d8d64b5f0027f7b8acf9ff Mon Sep 17 00:00:00 2001 From: Masahiro Tanaka <81312776+tohtana@users.noreply.github.com> Date: Thu, 26 Sep 2024 06:11:24 -0700 Subject: [PATCH 524/754] Fix gradient accumulation for Z2+offload (#6550) The ZeRO 1/2 optimizer performs incorrect gradient accumulation in the path for ZeRO2 + Offloading. This issue is caused by two main reasons: 1) The micro_step_id in the ZeRO 1/2 optimizer is: - Initialized to 0 in the constructor. - Reset to -1 during the backward pass. For example, given a gradient accumulation step of 4, the micro_step_id changes as follows: - For the first global step: 1, 2, 3, 4. - Subsequently: 0, 1, 2, 3. 2) Gradients are copied to the buffer on the first micro step and accumulated in the buffer during the following micro steps. However, the current code incorrectly copies gradients at steps that are not at the accumulation boundary. This PR aligns the micro_step_id initialization in both the constructor and the backward pass, and corrects the condition for copying and accumulating gradients. Co-authored-by: Olatunji Ruwase Co-authored-by: Logan Adams <114770087+loadams@users.noreply.github.com> --- deepspeed/runtime/zero/stage_1_and_2.py | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/deepspeed/runtime/zero/stage_1_and_2.py b/deepspeed/runtime/zero/stage_1_and_2.py index 83cf996ca019..df7a2f83e3bc 100755 --- a/deepspeed/runtime/zero/stage_1_and_2.py +++ b/deepspeed/runtime/zero/stage_1_and_2.py @@ -39,6 +39,7 @@ OPTIMIZER_GRADIENTS_TIMER = 'optimizer_gradients' OPTIMIZER_STEP_TIMER = 'optimizer_step' OPTIMIZER_TIMERS = [OPTIMIZER_ALLGATHER_TIMER, OPTIMIZER_GRADIENTS_TIMER, OPTIMIZER_STEP_TIMER] +INITIAL_MICRO_STEP_ID = -1 def input(msg): @@ -224,7 +225,7 @@ def __init__(self, self.gradient_predivide_factor = gradient_predivide_factor self.postscale_gradients = postscale_gradients self.gradient_accumulation_steps = gradient_accumulation_steps - self.micro_step_id = 0 + self.micro_step_id = INITIAL_MICRO_STEP_ID self.ignore_unused_parameters = ignore_unused_parameters self.round_robin_gradients = round_robin_gradients @@ -1231,9 +1232,7 @@ def copy_gradients_to_cpu(): if self.micro_step_id > 0: accumulate_gradients() - - # at the boundary we will send 32bit directly - if not self.is_gradient_accumulation_boundary: + else: copy_gradients_to_cpu() def set_norm_for_param_grad(self, param): @@ -1824,7 +1823,7 @@ def step(self, closure=None): """ Not supporting closure. """ - self.micro_step_id = -1 + self.micro_step_id = INITIAL_MICRO_STEP_ID see_memory_usage(f"In step before checking overflow") From ba58682a138760ee44b1366165fdbe4d87522323 Mon Sep 17 00:00:00 2001 From: Nir Sonnenschein Date: Thu, 26 Sep 2024 17:55:12 +0300 Subject: [PATCH 525/754] fix errors when setting zero3 leaf modules with torch.compile (#6564) When setting zero3 leaf modules to a higher level module and running with torch.compile, there are a few errors from ZeROOrderedDict. First it doesn't support Deep copy for not having a constructor with no parameters. Second, it doesn't check the existence of ds_status attr on param before accessing the attr. change contributed by Haifeng Chen Co-authored-by: Olatunji Ruwase Co-authored-by: Logan Adams <114770087+loadams@users.noreply.github.com> --- deepspeed/runtime/zero/parameter_offload.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/deepspeed/runtime/zero/parameter_offload.py b/deepspeed/runtime/zero/parameter_offload.py index 92702edb733b..1ce2414a1e17 100644 --- a/deepspeed/runtime/zero/parameter_offload.py +++ b/deepspeed/runtime/zero/parameter_offload.py @@ -38,7 +38,7 @@ def _apply_forward_and_backward_to_tensors_only(module, forward_function, backwa class ZeROOrderedDict(OrderedDict): - def __init__(self, parent_module, *args, **kwargs): + def __init__(self, parent_module=None, *args, **kwargs): """A replacement for ``collections.OrderedDict`` to detect external ZeRO params. Args: @@ -56,7 +56,7 @@ def __getitem__(self, key): if param is None: return param - if param.ds_status == ZeroParamStatus.NOT_AVAILABLE: + if hasattr(param, "ds_status") and param.ds_status == ZeroParamStatus.NOT_AVAILABLE: if self._parent_module._parameters._in_forward: register_external_parameter(FWD_MODULE_STACK[-1], param) param.all_gather() From d45cfd34551537ce6f8317504bd520d7a2a1a588 Mon Sep 17 00:00:00 2001 From: Liangliang Ma Date: Fri, 27 Sep 2024 04:39:59 +0800 Subject: [PATCH 526/754] [XPU] Support DeepNVMe new code structure (#6532) In DeepNVMe GDS update, many functions are changed into a more abstract way. Also added some files. These change break zero-infinity on XPU. To bring this feature back, we have this PR: 1. modify the aio opbuilder for new files. 2. Add custom cpu_op_desc_t for xpu users. (XPU don't handle buffer aligned here) --------- Co-authored-by: Olatunji Ruwase Co-authored-by: Logan Adams <114770087+loadams@users.noreply.github.com> --- csrc/xpu/aio/deepspeed_cpu_op.cpp | 51 +++++++++++++++++++++++++++++++ op_builder/xpu/async_io.py | 17 ++++++++--- 2 files changed, 63 insertions(+), 5 deletions(-) create mode 100644 csrc/xpu/aio/deepspeed_cpu_op.cpp diff --git a/csrc/xpu/aio/deepspeed_cpu_op.cpp b/csrc/xpu/aio/deepspeed_cpu_op.cpp new file mode 100644 index 000000000000..ee98c2d5cac2 --- /dev/null +++ b/csrc/xpu/aio/deepspeed_cpu_op.cpp @@ -0,0 +1,51 @@ +// Copyright (c) Microsoft Corporation. +// SPDX-License-Identifier: Apache-2.0 + +// DeepSpeed Team + +#include "deepspeed_cpu_op.h" + +using namespace std; + +cpu_op_desc_t::cpu_op_desc_t(const bool read_op, + const torch::Tensor& buffer, + const int fd, + const char* filename, + const long long int file_num_bytes, + const int num_threads, + const bool validate) + : io_op_desc_t(read_op, buffer, fd, filename, file_num_bytes, num_threads, validate), + _cpu_buffer(buffer) +{ + // XPU don't handle buffer here. See XPU Accelerator pin_memory. + _contiguous_buffer = _cpu_buffer.contiguous(); +} + +char* cpu_op_desc_t::data_ptr() const { return (char*)_contiguous_buffer.data_ptr(); } + +void cpu_op_desc_t::finish() +{ + if (_read_op && _buffer.is_xpu()) { _buffer.copy_(_cpu_buffer.to(torch::kXPU)); } +} + +void cpu_op_desc_t::validate() +{ + validate_aio_operation(_read_op, _filename.c_str(), data_ptr(), _file_num_bytes); +} + +void cpu_op_desc_t::run(const int tid, + std::unique_ptr& aio_ctxt, + deepspeed_aio_config_t* aio_config) +{ + assert(tid < _num_threads); + const auto base_offset = _num_bytes_per_thread * tid; + + std::unique_ptr xfer_ctxt( + new io_xfer_ctxt(_fd, base_offset, _num_bytes_per_thread, data_ptr())); + + if (aio_config->_overlap_events) { + do_aio_operation_overlap(_read_op, aio_ctxt, xfer_ctxt, aio_config, nullptr); + } else { + do_aio_operation_sequential(_read_op, aio_ctxt, xfer_ctxt, aio_config, nullptr); + } +} diff --git a/op_builder/xpu/async_io.py b/op_builder/xpu/async_io.py index 7ed527e016fa..6a6798eaeb9c 100644 --- a/op_builder/xpu/async_io.py +++ b/op_builder/xpu/async_io.py @@ -21,11 +21,18 @@ def absolute_name(self): def sources(self): return [ - 'csrc/aio/py_lib/deepspeed_py_copy.cpp', 'csrc/aio/py_lib/py_ds_aio.cpp', - 'csrc/aio/py_lib/deepspeed_py_aio.cpp', 'csrc/aio/py_lib/deepspeed_py_aio_handle.cpp', - 'csrc/aio/py_lib/deepspeed_aio_thread.cpp', 'csrc/aio/common/deepspeed_aio_utils.cpp', - 'csrc/aio/common/deepspeed_aio_common.cpp', 'csrc/aio/common/deepspeed_aio_types.cpp', - 'csrc/aio/py_lib/deepspeed_pin_tensor.cpp' + 'csrc/aio/py_lib/deepspeed_py_copy.cpp', + 'csrc/aio/py_lib/py_ds_aio.cpp', + 'csrc/aio/py_lib/deepspeed_py_aio.cpp', + 'csrc/aio/py_lib/deepspeed_py_aio_handle.cpp', + 'csrc/aio/py_lib/deepspeed_aio_thread.cpp', + 'csrc/aio/common/deepspeed_aio_utils.cpp', + 'csrc/aio/common/deepspeed_aio_common.cpp', + 'csrc/aio/common/deepspeed_aio_types.cpp', + 'csrc/aio/py_lib/deepspeed_pin_tensor.cpp', + 'csrc/aio/py_lib/deepspeed_py_io_handle.cpp', + 'csrc/xpu/aio/deepspeed_cpu_op.cpp', + 'csrc/aio/py_lib/deepspeed_aio_op_desc.cpp', ] def include_paths(self): From 047bcf6af6a3721cfac31a13a1ab07c6b5482fb9 Mon Sep 17 00:00:00 2001 From: Masahiro Tanaka <81312776+tohtana@users.noreply.github.com> Date: Thu, 26 Sep 2024 22:37:32 -0700 Subject: [PATCH 527/754] Add APIs to offload states of model, optimizer, and engine (#6011) This PR adds the following APIs to offload model, optimizer, and engine states. ```pytyon def offload_states(self, include: Container[OffloadStateTypeEnum] = None, device: OffloadDeviceEnum = OffloadDeviceEnum.cpu, pin_memory: bool = True, non_blocking: bool = False) -> None: """Move the ZeRO optimizer buffers to the specified device. Arguments: include: Optional. The set of states to offload. If not provided, all states are offloaded. device: Optional. The device to move the ZeRO optimizer buffers to. pin_memory: Optional. Whether to pin the memory of the offloaded states. non_blocking: Optional. Whether to offload the states asynchronously. ... def offload_states_back(self, non_blocking: bool = False) -> None: ``` Here is the typical usage. ```python # Offload after forward, backward, and step model.offload_states() # Do something requiring a lot of device memory ... # Load states back to device memory model.offload_states_back() ``` You can selectively offload states to balance the offloading overhead and memory saving. ```python model.offload_states(include=set([OffloadStateTypeEnum.hp_params, OffloadStateTypeEnum.opt_states], device=OffloadDeviceEnum.cpu) ``` Performance (4.3B parameters / 4x A100) - Environment (4x A100, [benchmark script](https://gist.github.com/tohtana/05d5faba5068cf839abfc7b1e38b85e4)) - Average Device to Host transfer time: 2.45 GB/s, aggregated: 9.79 GB/s - Average Host to Device transfer: 11.05 GB/s, aggregated: 44.19 GB/s - Mem (allocated by PyTorch) - Before offload 18.2GB - After offloading 17.7MB - Time ([benchmark script](https://github.com/microsoft/DeepSpeedExamples/tree/tohtana/offload_states/training/offload_states), offloading time/loading time) python output_table.py | |pin_memory=0 non_blocking=0|pin_memory=0 non_blocking=1|pin_memory=1 non_blocking=0|pin_memory=1 non_blocking=1| |--:|---------------------------|---------------------------|---------------------------|---------------------------| | 1|4.34 / 3.42 |4.99 / 2.37 |6.5 / 2.42 |6.0 / 2.39 | | 2|9.9 / 3.28 |5.1 / 2.34 |6.21 / 2.42 |6.25 / 2.45 | | 3|9.92 / 3.19 |6.71 / 2.35 |6.33 / 2.38 |5.93 / 2.42 | | 4|9.55 / 2.82 |7.11 / 2.39 |6.9 / 2.38 |6.5 / 2.43 | | 5|4.4 / 3.35 |6.04 / 2.41 |6.26 / 2.41 |6.32 / 2.47 | | 6|4.4 / 3.57 |6.58 / 2.42 |6.88 / 2.4 |6.35 / 2.43 | | 7|9.51 / 3.12 |6.9 / 2.39 |6.9 / 2.39 |6.46 / 2.4 | | 8|4.77 / 3.64 |6.69 / 2.39 |7.39 / 2.42 |6.56 / 2.46 | | 9|9.5 / 3.07 |7.18 / 2.42 |6.67 / 2.39 |7.38 / 2.46 | TODO: - Enable offloading to a NVMe storage -> NVMe support is non-trivial. I suggest adding the support in another PR - [DONE] Discard buffer (and recreate it) instead of offloading. We don't need to restore the contiguous buffer for reduce. - [DONE] Check pin_memory improves performance or not --------- Co-authored-by: Logan Adams <114770087+loadams@users.noreply.github.com> Co-authored-by: Olatunji Ruwase --- deepspeed/runtime/engine.py | 41 +++- deepspeed/runtime/utils.py | 36 ++++ deepspeed/runtime/zero/offload_config.py | 9 + deepspeed/runtime/zero/stage3.py | 189 ++++++++++++++++-- deepspeed/runtime/zero/utils.py | 15 +- docs/code-docs/source/zero3.rst | 53 +++++ .../unit/runtime/zero/test_offload_states.py | 125 ++++++++++++ 7 files changed, 443 insertions(+), 25 deletions(-) create mode 100644 tests/unit/runtime/zero/test_offload_states.py diff --git a/deepspeed/runtime/engine.py b/deepspeed/runtime/engine.py index 61e6da2663cf..b590ea432658 100755 --- a/deepspeed/runtime/engine.py +++ b/deepspeed/runtime/engine.py @@ -18,13 +18,13 @@ from torch.optim.lr_scheduler import _LRScheduler from torch._utils import _flatten_dense_tensors, _unflatten_dense_tensors -from typing import Callable, Dict, Union, Iterable +from typing import Callable, Dict, Union, Iterable, Container import deepspeed from deepspeed import comm as dist from deepspeed.runtime.utils import see_memory_usage, DummyOptim -from .zero.offload_config import OffloadDeviceEnum +from .zero.offload_config import OffloadDeviceEnum, OffloadStateTypeEnum 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 @@ -3681,3 +3681,40 @@ def compile(self, backend=get_accelerator().get_compile_backend(), compile_kwarg @property def is_compiled(self) -> bool: return self._is_compiled + + def offload_states(self, + include: Container[OffloadStateTypeEnum] = None, + device: OffloadDeviceEnum = OffloadDeviceEnum.cpu, + pin_memory: bool = True, + non_blocking: bool = False) -> None: + """Offload the engine's states to the specified device. + + Arguments: + include: Optional. The set of states to offload. If not provided, all states are offloaded. + device: Optional. The device to move the ZeRO optimizer buffers to. Currently only `OffloadDeviceEnum.cpu` is supported. + pin_memory: Optional. Whether to pin the memory of the offloaded states. + non_blocking: Optional. Whether to offload the states asynchronously. + """ + assert self.zero_optimization_stage( + ) == ZeroStageEnum.weights, "Moving buffers across devices is supported only for ZeRO stage 3." + + assert not self.zero_offload_param(), "Moving states across devices is not supported for offloaded parameters." + + if device == OffloadDeviceEnum.none: + logger.warning("No device specified for offloading states.") + return + + if device == OffloadDeviceEnum.nvme: + raise ValueError("NVMe offload is not supported for offloading states.") + + self.optimizer.offload_states(include=include, device=device, pin_memory=pin_memory, non_blocking=non_blocking) + + def reload_states(self, non_blocking: bool = False) -> None: + """Reload the engine states to the original device. + + Arguments: + non_blocking: Optional. Whether to offload the states asynchronously. + """ + assert self.zero_optimization_stage( + ) == ZeroStageEnum.weights, "Moving buffers back is supported only for ZeRO stage 3." + self.optimizer.reload_states(non_blocking=non_blocking) diff --git a/deepspeed/runtime/utils.py b/deepspeed/runtime/utils.py index 2c01c3475a70..adcadd349803 100755 --- a/deepspeed/runtime/utils.py +++ b/deepspeed/runtime/utils.py @@ -1065,3 +1065,39 @@ def to_tensor(v): total_norm = -1 return total_norm + + +def _make_offload_state_key(key): + return f"{key}_offload_buffer" + + +def offload_adam_states(optimizer, device, pin_memory: bool = False, non_blocking: bool = False): + """Move optimizer states to device. Note that this assumes the state structure of DeepSpeed Adam.""" + + def move_key(state, key): + offload_buf_key = _make_offload_state_key(key) + if offload_buf_key not in state: + state[offload_buf_key] = torch.empty_like(state[key], device=device) + if pin_memory: + state[offload_buf_key] = get_accelerator().pin_memory(state[offload_buf_key]) + state[offload_buf_key].copy_(state[key], non_blocking=non_blocking) + state[key].data = state[offload_buf_key] + + for _, state in optimizer.state.items(): + if "exp_avg" in state: + move_key(state, "exp_avg") + if "exp_avg_sq" in state: + move_key(state, "exp_avg_sq") + + +def reload_adam_states(optimizer, device, non_blocking: bool = False): + """Move optimizer states to device. Note that this assumes the state structure of DeepSpeed Adam.""" + + def move_back_key(state, key): + state[key].data = state[_make_offload_state_key(key)].to(device, non_blocking=non_blocking) + + for _, state in optimizer.state.items(): + if "exp_avg" in state: + move_back_key(state, "exp_avg") + if "exp_avg_sq" in state: + move_back_key(state, "exp_avg_sq") diff --git a/deepspeed/runtime/zero/offload_config.py b/deepspeed/runtime/zero/offload_config.py index 74a5673bc1bc..ca35d7a7d169 100644 --- a/deepspeed/runtime/zero/offload_config.py +++ b/deepspeed/runtime/zero/offload_config.py @@ -98,3 +98,12 @@ def set_pipeline(self): pipeline = self.pipeline_read or self.pipeline_write self.__dict__["pipeline"] = pipeline return self + + +class OffloadStateTypeEnum(str, Enum): + """ Enum for internal buffer types """ + optim_states = "optim_states" + hp_params = "hp_params" + lp_params = "lp_params" + lp_grads = "lp_grads" + contiguous_grad_buffer = "contiguous_grad_buffer" diff --git a/deepspeed/runtime/zero/stage3.py b/deepspeed/runtime/zero/stage3.py index 796957a4c6e5..fb75d2bcebd5 100644 --- a/deepspeed/runtime/zero/stage3.py +++ b/deepspeed/runtime/zero/stage3.py @@ -6,22 +6,24 @@ import sys import gc import collections -from typing import Deque, Dict, Tuple +import itertools +from typing import Deque, Dict, Set, Tuple, Container from contextlib import contextmanager + from deepspeed import comm as dist -from deepspeed.utils import groups +from deepspeed.utils import groups, z3_leaf_parameter from torch._utils import _flatten_dense_tensors, _unflatten_dense_tensors from deepspeed.runtime.base_optimizer import ZeROOptimizer from deepspeed.utils import logger from deepspeed.runtime.fp16.loss_scaler import CreateLossScaler from deepspeed.runtime.comm.coalesced_collectives import reduce_scatter_coalesced, all_to_all_quant_reduce -from deepspeed.runtime.utils import inf, is_model_parallel_parameter, get_only_unique_item +from deepspeed.runtime.utils import inf, is_model_parallel_parameter, get_only_unique_item, offload_adam_states, reload_adam_states 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.offload_config import OffloadDeviceEnum, OffloadStateTypeEnum from deepspeed.runtime.zero.parameter_offload import DeepSpeedZeRoOffload -from deepspeed.runtime.zero.utils import apply_to_tensors_only +from deepspeed.runtime.zero.utils import apply_to_tensors_only, get_mapping_to_flat_buffer from deepspeed.ops.adam import DeepSpeedCPUAdam from deepspeed.runtime.swap_tensor.partitioned_param_swapper import PartitionedParamStatus from deepspeed.runtime.swap_tensor.optimizer_utils import OptimizerSwapper @@ -29,7 +31,6 @@ from deepspeed.runtime.swap_tensor.pipelined_optimizer_swapper import PipelinedOptimizerSwapper from deepspeed.checkpoint.constants import OPTIMIZER_STATE_DICT, FP32_FLAT_GROUPS, PARTITION_COUNT, ZERO_STAGE, LOSS_SCALER from deepspeed.accelerator import get_accelerator -from deepspeed.utils import z3_leaf_parameter # Toggle this to true to enable correctness test # with gradient partitioning and without @@ -425,6 +426,8 @@ def __init__( self._link_all_hp_params() + self.offloaded_states: Set(OffloadDeviceEnum) = set() + if dist.get_rank(group=self.dp_process_group) == 0: see_memory_usage(f"After initializing ZeRO optimizer", force=True) @@ -563,21 +566,15 @@ def defragment(tensors: List[Tensor]) -> Tensor: cpu_buffer = torch.empty(sum(p.numel() for p in tensors), dtype=get_only_unique_item(t.dtype for t in tensors), device="cpu") - tensor_infos: List[Tuple[Tensor, int, int]] = [] + tensor_infos: List[Tuple[Tensor, int, int]] = get_mapping_to_flat_buffer(tensors) orig_device = get_only_unique_item(t.device for t in tensors) offset = 0 - for tensor in tensors: - tensor_numel = tensor.numel() + for tensor, offset, tensor_numel in tensor_infos: # move the tensor from device memory to host memory cpu_buffer.narrow(0, offset, tensor_numel).copy_(tensor) tensor.data = torch.empty(0, dtype=tensor.dtype, device=tensor.device) - # record some data so we can restore the device tensor later - tensor_infos.append((tensor, offset, tensor_numel)) - - offset += tensor_numel - gc.collect() get_accelerator().empty_cache() @@ -725,15 +722,11 @@ def _create_fp16_partitions_with_defragmentation(self, fp16_param_groups): for sub_group in self.fp16_groups: for param in sub_group: parameter_partitions.append(param.ds_tensor) - device_buffer = __class__.defragment(parameter_partitions) - # setup flat buffers per subgroup, these are each just sections of the - # contiguous flat buffer for all parameters that we created earlier - offset = 0 - for sub_group in self.fp16_groups: - sub_group_numel = sum(param.partition_numel() for param in sub_group) - self.fp16_partitioned_groups_flat.append(device_buffer.narrow(0, offset, sub_group_numel)) - offset += sub_group_numel + # We need to keep the reference to this buffer to make sure you can free it in `offload_states` + self.lp_param_buffer = __class__.defragment(parameter_partitions) + self._set_fp16_partitioned_groups_flat() + else: # partitioned params offloaded to CPU when not in use # create a flat CPU memory allocation for each param group self._create_param_groups_fp16_flat_cpu_memory() @@ -1008,6 +1001,15 @@ def _partitioned_params_swap_out(self, i): swap_fp16_params[0].nvme_swapper.swap_out_partitioned_params(dst_fp16_params=swap_fp16_params, src_fp32_params=swap_fp32_params) + def _set_fp16_partitioned_groups_flat(self): + # setup flat buffers per subgroup, these are each just sections of the + # contiguous flat buffer for all parameters that we created earlier + offset = 0 + for sub_group in self.fp16_groups: + sub_group_numel = sum(param.partition_numel() for param in sub_group) + self.fp16_partitioned_groups_flat.append(self.lp_param_buffer.narrow(0, offset, sub_group_numel)) + offset += sub_group_numel + def initialize_optimizer_states(self): num_subgroups = len(self.fp16_groups) @@ -2782,6 +2784,149 @@ def checkpoint_event_epilogue(self): def empty_partition_cache(self): self.parameter_offload.empty_partition_cache() + def offload_states(self, + include: Container[OffloadStateTypeEnum] = None, + device: OffloadDeviceEnum = OffloadDeviceEnum.cpu, + pin_memory: bool = True, + non_blocking: bool = False): + device = device.value + + self.empty_partition_cache() + + assert self.optimizer.__class__ == deepspeed.ops.adam.fused_adam.FusedAdam, f"Offloading is supported only for DeepSpeed FusedAdam." + + def needs_offload(target): + # return True + return target not in self.offloaded_states and (include == None or target in include) + + # HP param + if needs_offload(OffloadStateTypeEnum.hp_params): + if pin_memory: + if not hasattr(self, "hp_params_pin_buffers"): + self.hp_params_pin_buffers = [ + get_accelerator().pin_memory(torch.empty_like(t, device=device)) + for t in self.fp32_partitioned_groups_flat + ] + + for src_tensor, dest_buf in zip(self.fp32_partitioned_groups_flat, self.hp_params_pin_buffers): + dest_buf.copy_(src_tensor, non_blocking=non_blocking) + src_tensor.data = dest_buf + else: + for buf in self.fp32_partitioned_groups_flat: + buf.data = buf.data.to(device, non_blocking=non_blocking) + self.offloaded_states.add(OffloadStateTypeEnum.hp_params) + + # LP param + if needs_offload(OffloadStateTypeEnum.lp_params): + if pin_memory: + if not hasattr(self, "lp_param_contiguous_pin_buffer"): + self.lp_param_contiguous_pin_buffer = get_accelerator().pin_memory( + torch.empty_like(self.lp_param_buffer, device=device)) + self.lp_param_contiguous_pin_buffer.copy_(self.lp_param_buffer, non_blocking=non_blocking) + cpu_buffer = self.lp_param_contiguous_pin_buffer + else: + cpu_buffer = self.lp_param_buffer.to(device, non_blocking=non_blocking) + + self.lp_param_buffer.data = cpu_buffer + for tensor, offset, tensor_numel in get_mapping_to_flat_buffer( + [p.ds_tensor for p in self.module.parameters()]): + tensor.data = cpu_buffer.narrow(0, offset, tensor_numel) + + self.fp16_partitioned_groups_flat.clear() + self.offloaded_states.add(OffloadStateTypeEnum.lp_params) + + # LP grad + if needs_offload(OffloadStateTypeEnum.lp_grads): + if pin_memory: + if not hasattr(self, "lp_grad_partitions_flat_pin_buffers"): + self.lp_grad_partitions_flat_pin_buffers = get_accelerator().pin_memory( + torch.empty_like(self.grad_partitions_flat_buffer, device=device)) + self.lp_grad_partitions_flat_pin_buffers.copy_(self.grad_partitions_flat_buffer, + non_blocking=non_blocking) + self.grad_partitions_flat_buffer.data = self.lp_grad_partitions_flat_pin_buffers + else: + self.grad_partitions_flat_buffer.data = self.grad_partitions_flat_buffer.data.to(device) + self.averaged_gradients = {} + + self.__param_id_to_grad_partition = {} + + self.offloaded_states.add(OffloadStateTypeEnum.lp_grads) + + # contiguous bucket + if needs_offload(OffloadStateTypeEnum.contiguous_grad_buffer): + if hasattr(self, "_DeepSpeedZeroOptimizer_Stage3__ipg_bucket_flat_buffer"): + # Record properties like shape, strides, etc. as a meta tensor + self.grad_buffer_meta = self.__ipg_bucket_flat_buffer.to("meta") + self.__ipg_bucket_flat_buffer = None + self.offloaded_states.add(OffloadStateTypeEnum.contiguous_grad_buffer) + + # Adam + if needs_offload(OffloadStateTypeEnum.optim_states): + offload_adam_states(self.optimizer, device, pin_memory=pin_memory, non_blocking=non_blocking) + self.offloaded_states.add(OffloadStateTypeEnum.optim_states) + + gc.collect() + get_accelerator().empty_cache() + + def reload_states(self, non_blocking: bool = False): + + device = get_accelerator().current_device_name() + + # HP param + if OffloadStateTypeEnum.hp_params in self.offloaded_states: + if hasattr(self, "hp_params_pin_buffers"): + for src, dest in zip(self.hp_params_pin_buffers, self.fp32_partitioned_groups_flat): + dest.data = src.to(device, non_blocking=non_blocking) + else: + for buf in self.fp32_partitioned_groups_flat: + buf.data = buf.data.to(device, non_blocking=non_blocking) + self.offloaded_states.remove(OffloadStateTypeEnum.hp_params) + + # LP Param + if OffloadStateTypeEnum.lp_params in self.offloaded_states: + cpu_buffer = self.lp_param_contiguous_pin_buffer if hasattr( + self, "lp_param_contiguous_pin_buffer") else self.lp_param_buffer + self.lp_param_buffer.data = cpu_buffer.data.to(device, non_blocking=non_blocking) + self._set_fp16_partitioned_groups_flat() + + for tensor, offset, tensor_numel in get_mapping_to_flat_buffer( + [p.ds_tensor for p in self.module.parameters()]): + tensor.data = self.lp_param_buffer.narrow(0, offset, tensor_numel) + self.offloaded_states.remove(OffloadStateTypeEnum.lp_params) + + # LP grad + if OffloadStateTypeEnum.lp_grads in self.offloaded_states: + if hasattr(self, "lp_grad_partitions_flat_pin_buffers"): + self.grad_partitions_flat_buffer.data = self.lp_grad_partitions_flat_pin_buffers.to( + device, non_blocking=non_blocking) + else: + self.grad_partitions_flat_buffer.data = self.grad_partitions_flat_buffer.data.to( + device, non_blocking=non_blocking) + self.averaged_gradients = {} + + offset = 0 + all_params = list(itertools.chain.from_iterable(self.fp16_groups)) + for param in all_params: + self.__param_id_to_grad_partition[param.ds_id] = self.grad_partitions_flat_buffer.narrow( + 0, offset, param.partition_numel()) + offset += param.partition_numel() + + self.offloaded_states.remove(OffloadStateTypeEnum.lp_grads) + + # contiguous bucket + if OffloadStateTypeEnum.contiguous_grad_buffer in self.offloaded_states: + self.__ipg_bucket_flat_buffer = torch.empty_like(self.grad_buffer_meta, device=device) + # self.__ipg_bucket_flat_buffer.data = self.__ipg_bucket_flat_buffer.data.to(device) + self.offloaded_states.remove(OffloadStateTypeEnum.contiguous_grad_buffer) + + # Adam + if OffloadStateTypeEnum.optim_states in self.offloaded_states: + reload_adam_states(self.optimizer, device, non_blocking=non_blocking) + self.offloaded_states.remove(OffloadStateTypeEnum.optim_states) + + if non_blocking: + get_accelerator().synchronize() + def _handle_overflow(cpu_sum, x, i): import math diff --git a/deepspeed/runtime/zero/utils.py b/deepspeed/runtime/zero/utils.py index 8f913d065934..2d1cf17962d8 100755 --- a/deepspeed/runtime/zero/utils.py +++ b/deepspeed/runtime/zero/utils.py @@ -4,7 +4,7 @@ # DeepSpeed Team import os -from typing import List +from typing import List, Tuple import torch from deepspeed import comm as dist @@ -160,3 +160,16 @@ def apply_to_tensors_only(function, value, warning_msg_fn=None): logger.warning(warning_msg_fn(value)) warned = True return value + + +def get_mapping_to_flat_buffer(tensors: List[torch.Tensor]) -> List[Tuple[torch.Tensor, int, int]]: + tensor_infos: List[Tuple[torch.Tensor, int, int]] = [] + + offset = 0 + for tensor in tensors: + tensor_numel = tensor.numel() + # record some data so we can restore the device tensor later + tensor_infos.append((tensor, offset, tensor_numel)) + offset += tensor_numel + + return tensor_infos diff --git a/docs/code-docs/source/zero3.rst b/docs/code-docs/source/zero3.rst index 2a6a48ca91db..f0974c08c9f3 100644 --- a/docs/code-docs/source/zero3.rst +++ b/docs/code-docs/source/zero3.rst @@ -456,3 +456,56 @@ The following code snippet illustrates this functionality. # Free GPU memory consumed by model parameters ds_engine.empty_partition_cache() + + +Offload States +-------------- + +The DeepSpeed engine maintains a set of states in device memory (e.g., CUDA memory). The following API allows you to offload these states to a different device (currently, only CPU memory is supported), reducing the memory footprint on the device. + +.. code-block:: python + + def offload_states(self, + include: Container[OffloadStateTypeEnum] = None, + device: OffloadDeviceEnum = OffloadDeviceEnum.cpu, + pin_memory: bool = True, + non_blocking: bool = False) -> None: + """Offload the engine's states to the specified device. + + Arguments: + include: Optional. The set of states to offload. If not provided, all states are offloaded. + device: Optional. The device to move the ZeRO optimizer buffers to. Currently only `OffloadDeviceEnum.cpu` is supported. + pin_memory: Optional. Whether to pin the memory of the offloaded states. + non_blocking: Optional. Whether to offload the states asynchronously. + """ + +You can selectively offload specific states by specifying the ``OffloadStateTypeEnum`` in the include argument. ``OffloadStateTypeEnum`` is an enum that defines the states that can be offloaded. The following states are supported: + +* ``OffloadStateTypeEnum.optim_states``: Optimizer states. Currently, only states of DeepSpeed's FusedAdam optimizer are supported. +* ``OffloadStateTypeEnum.hp_params``: FP32 parameters. +* ``OffloadStateTypeEnum.lp_params``: BF16/FP16 parameters. +* ``OffloadStateTypeEnum.lp_grads``: BF16/FP16 gradients. +* ``OffloadStateTypeEnum.contiguous_grad_buffer``: The contiguous gradient buffer for reduce operations. + +Note that offloading states comes with a trade-off between memory savings and computational overhead. This API allows states to be reloaded back into device memory when needed. + +.. code-block:: python + + def reload_states(self, non_blocking: bool = False) -> None: + """Reload the engine states to the original device. + + Arguments: + non_blocking: Optional. Whether to offload the states asynchronously. + """ + +Below is an example code snippet demonstrating how to offload FP32 parameters and optimizer states to CPU memory: + +.. code-block:: python + + # Offload after forward, backward, and step + ds_engine.offload_states(include=[OffloadStateTypeEnum.hp_params, OffloadStateTypeEnum.optim_states]) + + # Do something requiring a lot of device memory + ... + # Load states back to device memory + ds_engine.reload_states() diff --git a/tests/unit/runtime/zero/test_offload_states.py b/tests/unit/runtime/zero/test_offload_states.py new file mode 100644 index 000000000000..cc60908d3c33 --- /dev/null +++ b/tests/unit/runtime/zero/test_offload_states.py @@ -0,0 +1,125 @@ +# Copyright (c) Microsoft Corporation. +# SPDX-License-Identifier: Apache-2.0 + +# DeepSpeed Team + +import pytest + +import deepspeed.comm as dist +from deepspeed.accelerator import get_accelerator +import torch + +from unit.common import DistributedTest +from unit.simple_model import random_dataloader, SimpleModel + +import deepspeed +from deepspeed.runtime.zero.offload_config import OffloadDeviceEnum, OffloadStateTypeEnum +from deepspeed.utils import safe_get_local_fp32_param, safe_get_local_optimizer_state + + +def validate_device(model, device: torch.device, include) -> None: + # Make sure the model parameters are offloaded + if include is None or OffloadStateTypeEnum.hp_params in include: + assert all(safe_get_local_fp32_param(p).device == device for p in model.parameters()) + if include is None or OffloadStateTypeEnum.lp_params in include: + assert all(p.ds_tensor.device == device for p in model.parameters()) + if include is None or OffloadStateTypeEnum.lp_grads in include: + assert model.optimizer.grad_partitions_flat_buffer.device == device + if include is None or OffloadStateTypeEnum.optim_states in include: + assert all(safe_get_local_optimizer_state(p, "exp_avg").device == device for p in model.parameters()) + assert all(safe_get_local_optimizer_state(p, "exp_avg_sq").device == device for p in model.parameters()) + + +def run_model(model, config_dict, hidden_dim, dtype, include, pin_memory, non_blocking): + # Currently we only support OffloadDeviceEnum.cpu + offload_device = OffloadDeviceEnum.cpu + + model, _, _, _ = deepspeed.initialize(model=model, model_parameters=model.parameters(), config=config_dict) + data_loader = random_dataloader(model=model, + total_samples=10, + hidden_dim=hidden_dim, + device=model.device, + dtype=dtype) + dist.barrier() + for batch in data_loader: + loss = model(batch[0], batch[1]) + model.backward(loss) + model.step() + + hp_params_expected = [safe_get_local_fp32_param(p).clone() for p in model.parameters()] + lp_params_expected = [p.ds_tensor.clone() for p in model.parameters()] + lp_grads_expected = model.optimizer.grad_partitions_flat_buffer.clone() + adam_exp_avg_expected = [safe_get_local_optimizer_state(p, "exp_avg").clone() for p in model.parameters()] + adam_exp_avg_sq = [safe_get_local_optimizer_state(p, "exp_avg_sq").clone() for p in model.parameters()] + + # Start offloading + alloc_before_offload = get_accelerator().memory_allocated() + model.offload_states(include=include, device=offload_device, pin_memory=pin_memory, non_blocking=non_blocking) + alloc_after_offload = get_accelerator().memory_allocated() + assert alloc_after_offload < alloc_before_offload, f"Allocated memory should decrease after offload" + + validate_device(model, torch.device(offload_device.value), include) + + # Reload states + model.reload_states() + assert alloc_after_offload < get_accelerator().memory_allocated( + ), f"Allocated memory should increase after offload back" + + # Verify restored states + hp_param_restored = [safe_get_local_fp32_param(p) for p in model.parameters()] + for hp_param_expected, hp_param_restored in zip(hp_params_expected, hp_param_restored): + assert torch.equal(hp_param_expected, hp_param_restored) + + lp_param_restored = [p.ds_tensor for p in model.parameters()] + + for lp_param_expected, lp_param_restored in zip(lp_params_expected, lp_param_restored): + assert torch.equal(lp_param_expected, lp_param_restored) + + assert torch.equal(lp_grads_expected, model.optimizer.grad_partitions_flat_buffer) + + adam_exp_avg_restored = [safe_get_local_optimizer_state(p, "exp_avg") for p in model.parameters()] + for adam_exp_avg_expected, adam_exp_avg_restored in zip(adam_exp_avg_expected, adam_exp_avg_restored): + assert torch.equal(adam_exp_avg_expected, adam_exp_avg_restored) + + adam_exp_avg_sq_restored = [safe_get_local_optimizer_state(p, "exp_avg_sq") for p in model.parameters()] + for adam_exp_avg_sq_expected, adam_exp_avg_sq_restored in zip(adam_exp_avg_sq, adam_exp_avg_sq_restored): + assert torch.equal(adam_exp_avg_sq_expected, adam_exp_avg_sq_restored) + + validate_device(model, torch.device(get_accelerator().current_device_name()), include) + + # Needed in ZeRO 3. Not doing so can give memory leak + model.destroy() + + +@pytest.mark.parametrize("included_state", [ + OffloadStateTypeEnum.hp_params, OffloadStateTypeEnum.lp_params, OffloadStateTypeEnum.optim_states, + OffloadStateTypeEnum.lp_grads, OffloadStateTypeEnum.contiguous_grad_buffer, None +]) +@pytest.mark.parametrize("pin_memory", [False, True]) +@pytest.mark.parametrize("non_blocking", [False, True]) +class TestOffloadStates(DistributedTest): + # Need multiple gpus to test possible hanging + world_size = 2 + + def test_offload_states(self, included_state, pin_memory, non_blocking): + hidden_dim = 1024 + + config_dict = { + "train_micro_batch_size_per_gpu": 1, + "optimizer": { + "type": "Adam", + "params": { + "lr": 1e-6 + } + }, + "zero_optimization": { + "stage": 3, + } + } + config_dict["bf16"] = {"enabled": True} + + with deepspeed.zero.Init(config_dict_or_path=config_dict): + model = SimpleModel(hidden_dim, nlayers=4) + + include = None if included_state is None else [included_state] + run_model(model, config_dict, hidden_dim, torch.bfloat16, include, pin_memory, non_blocking) From 1caf6e8107689f5ea9611ac2d6bbbf3a3e6e9731 Mon Sep 17 00:00:00 2001 From: Nadav Elyahu <88962733+nelyahu@users.noreply.github.com> Date: Fri, 27 Sep 2024 09:11:06 +0300 Subject: [PATCH 528/754] add bfloat16 to inference support dtypes (#6528) to allow running inference tasks using bfloat16 --------- Co-authored-by: Olatunji Ruwase Co-authored-by: Logan Adams <114770087+loadams@users.noreply.github.com> Co-authored-by: Logan Adams --- deepspeed/inference/engine.py | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/deepspeed/inference/engine.py b/deepspeed/inference/engine.py index 74fc7f74f6bd..68836ceb523c 100755 --- a/deepspeed/inference/engine.py +++ b/deepspeed/inference/engine.py @@ -73,8 +73,9 @@ def __init__(self, model, config): if hasattr(self.module, "config"): TransformerPolicy.hf_model_config = self.module.config - if config.dtype == torch.half and not get_accelerator().is_fp16_supported(): - raise ValueError("Type fp16 is not supported.") + if config.dtype not in get_accelerator().supported_dtypes(): + raise ValueError( + f"Data type {config.dtype} is not supported by {get_accelerator().device_name()} accelerator") # todo: keep this self.injection_dict because we don't use to change config.injection_policy API # todo: this will get changed when Molly's PR on auto injection dict is merged @@ -324,7 +325,7 @@ def _validate_args(self, mpu, replace_with_kernel_inject): if self._config.checkpoint is not None and not isinstance(self._config.checkpoint, (str, dict)): raise ValueError(f"checkpoint must be None, str or dict, got {type(self._config.checkpoint)}") - supported_dtypes = [None, torch.half, torch.int8, torch.float] + supported_dtypes = [None, torch.half, torch.int8, torch.float, torch.bfloat16] if self._config.dtype not in supported_dtypes: raise ValueError(f"{self._config.dtype} not supported, valid dtype: {supported_dtypes}") From d4e189507659aca7970185d33b84115fbb11b490 Mon Sep 17 00:00:00 2001 From: Yizhou Wang Date: Fri, 27 Sep 2024 14:45:42 +0800 Subject: [PATCH 529/754] [COMPILE] workflow for deepspeed + torch.compile (#6570) We use simple model + deepspeed zero 3 + torch.compile and count graph break numbers to demonstrate current status of combing deepspeed + torch.compile. --------- Co-authored-by: Masahiro Tanaka <81312776+tohtana@users.noreply.github.com> --- .github/workflows/xpu-compile.yml | 59 +++++++++++++++++ tests/torch_compile/ds_config.json | 41 ++++++++++++ tests/torch_compile/test_compile.py | 99 +++++++++++++++++++++++++++++ 3 files changed, 199 insertions(+) create mode 100644 .github/workflows/xpu-compile.yml create mode 100644 tests/torch_compile/ds_config.json create mode 100644 tests/torch_compile/test_compile.py diff --git a/.github/workflows/xpu-compile.yml b/.github/workflows/xpu-compile.yml new file mode 100644 index 000000000000..c2392091012f --- /dev/null +++ b/.github/workflows/xpu-compile.yml @@ -0,0 +1,59 @@ +name: xpu-compile + +on: + workflow_dispatch: + schedule: + - cron: "0 0 * * *" + pull_request: + paths: + - ".github/workflows/xpu-compile.yml" + +concurrency: + group: ${{ github.workflow }}-${{ github.ref }} + cancel-in-progress: true + +permissions: + contents: read + issues: write + +jobs: + compile-tests: + runs-on: [self-hosted, intel, xpu] + container: + image: intel/oneapi-basekit:2024.2.1-0-devel-ubuntu22.04 + ports: + - 80 + options: --privileged -it --rm --device /dev/dri:/dev/dri -v /dev/dri/by-path:/dev/dri/by-path --ipc=host --cap-add=ALL + + steps: + - uses: actions/checkout@v4 + - name: Install prerequisite + run: | + apt-get update + apt-get install clinfo libaio-dev python3-pip -y + pip install torch==2.3.1 -f https://pytorch-extension.intel.com/release-whl/stable/xpu/us/torch/ + pip install intel-extension-for-pytorch==2.3.110+xpu -f https://pytorch-extension.intel.com/release-whl/stable/xpu/us/intel-extension-for-pytorch/ + pip install oneccl_bind_pt==2.3.100+xpu -f https://pytorch-extension.intel.com/release-whl/stable/xpu/us/oneccl-bind-pt/ + pip install torchvision==0.18.1 -f https://pytorch-extension.intel.com/release-whl/stable/xpu/us/torchvision/ + pip install https://github.com/intel/intel-xpu-backend-for-triton/releases/download/v3.0.0b2/triton_xpu-3.0.0b2-cp310-cp310-linux_x86_64.whl + pip install py-cpuinfo numpy + pip install .[dev,autotuning] + + - name: Check container state + run: | + ldd --version + ds_report + python3 -c "import torch; print('torch:', torch.__version__, torch)" + python3 -c "import torch; import intel_extension_for_pytorch; print('XPU available:', torch.xpu.is_available())" + python3 -c "from deepspeed.accelerator import get_accelerator; print('accelerator:', get_accelerator()._name)" + pip list + + - name: Compile Status + shell: bash + run: | + export FI_HMEM=system + ulimit -n 1048575 + cd tests/torch_compile + export ZE_AFFINITY_MASK=0,1 + deepspeed test_compile.py --deepspeed_config ds_config.json 2>&1 | tee log.txt + cat log.txt | grep "'graph_breaks'" | sed 's/,/ /g' | awk '{print $2}' >> $GITHUB_STEP_SUMMARY diff --git a/tests/torch_compile/ds_config.json b/tests/torch_compile/ds_config.json new file mode 100644 index 000000000000..361bc115eaee --- /dev/null +++ b/tests/torch_compile/ds_config.json @@ -0,0 +1,41 @@ +{ + "train_batch_size": 8, + "steps_per_print": 2000, + "optimizer": { + "type": "Adam", + "params": { + "lr": 0.001, + "betas": [ + 0.8, + 0.999 + ], + "eps": 1e-8, + "weight_decay": 3e-7 + } + }, + "scheduler": { + "type": "WarmupLR", + "params": { + "warmup_min_lr": 0, + "warmup_max_lr": 0.001, + "warmup_num_steps": 1000 + } + }, + "gradient_clipping": 1.0, + "prescale_gradients": false, + "bf16": { + "enabled": true, + "loss_scale": 0, + "loss_scale_window": 500, + "hysteresis": 2, + "min_loss_scale": 1, + "initial_scale_power": 15 + }, + "wall_clock_breakdown": false, + "zero_optimization": { + "stage": 3, + "reduce_scatter": true, + "overlap_comm": false, + "contiguous_gradients": false + } +} diff --git a/tests/torch_compile/test_compile.py b/tests/torch_compile/test_compile.py new file mode 100644 index 000000000000..529ca56ae0a8 --- /dev/null +++ b/tests/torch_compile/test_compile.py @@ -0,0 +1,99 @@ +# Copyright (c) Microsoft Corporation. +# SPDX-License-Identifier: Apache-2.0 + +# DeepSpeed Team + +import argparse +import deepspeed +from deepspeed.accelerator import get_accelerator +from deepspeed import comm + +import torch +import intel_extension_for_pytorch # noqa: F401 # type: ignore +from torch.utils.data import Dataset, DataLoader + +torch._dynamo.config.cache_size_limit = 100 + +import collections + + +def get_dynamo_stats(): + # TODO: consider deepcopy'ing the entire counters struct and + # adding a helper to do subtraction on it + return collections.Counter({ + "calls_captured": torch._dynamo.utils.counters["stats"]["calls_captured"], + "unique_graphs": torch._dynamo.utils.counters["stats"]["unique_graphs"], + "graph_breaks": sum(torch._dynamo.utils.counters["graph_break"].values()), + # NB: The plus removes zero counts + "unique_graph_breaks": len(+torch._dynamo.utils.counters["graph_break"]), + "autograd_captures": torch._dynamo.utils.counters["compiled_autograd"]["captures"], + "autograd_compiles": torch._dynamo.utils.counters["compiled_autograd"]["compiles"], + "cudagraph_skips": torch._dynamo.utils.counters["inductor"]["cudagraph_skips"], + }) + + +class RandomDataset(Dataset): + + def __init__(self, size, length): + self.len = length + self.data = torch.randn(length, size).to(torch.bfloat16) + + def __getitem__(self, index): + return self.data[index] + + def __len__(self): + return self.len + + +data_size = 1024 +data_length = 100 +rand_loader = DataLoader(dataset=RandomDataset(data_size, data_length), batch_size=1, shuffle=False) + + +class MyModule(torch.nn.Module): + + def __init__(self, *args, **kwargs) -> None: + super().__init__(*args, **kwargs) + self.fc0 = torch.nn.Linear(1024, 256, bias=False) + self.fc1 = torch.nn.Linear(256, 256, bias=False) + self.dropout = torch.nn.Dropout(0.5) + + def forward(self, data, residual): + output = residual + self.fc1(self.fc0(self.dropout(data))) * 0.5 + return output + + +model = MyModule() +params = model.parameters() + +parser = argparse.ArgumentParser() +parser.add_argument('--local_rank', type=int, default=-1, help='local rank passed from distributed launcher') +parser.add_argument('--deepspeed_config', + type=str, + default='ds_config.json', + help='path to DeepSpeed configuration file') +cmd_args = parser.parse_args() + +# initialize the DeepSpeed engine +model_engine, optimizer, _, _ = deepspeed.initialize(args=cmd_args, model=model, model_parameters=params) +model_engine.compile() + +residual = torch.rand(256, 256, dtype=torch.float).to(get_accelerator().current_device_name()) + +start_stats = get_dynamo_stats() + +for step, batch in enumerate(rand_loader): + if step % 10 == 0 and comm.get_rank() == 0: + print(f'step={step}') + # forward() method + loss = model_engine(batch.to(get_accelerator().current_device_name()), residual).sum() + # runs backpropagation + model_engine.backward(loss) + # weight update + model_engine.step() + +dynamo_stats = get_dynamo_stats() +dynamo_stats.subtract(start_stats) + +if comm.get_rank() == 0: + print(dynamo_stats) From 828ddfbbda2482412fffc89f5fcd3b0d0eba9a62 Mon Sep 17 00:00:00 2001 From: Logan Adams <114770087+loadams@users.noreply.github.com> Date: Fri, 27 Sep 2024 09:22:13 -0700 Subject: [PATCH 530/754] Fixes on the accelerate side mean we do not need to skip this test (#6583) HF accelerate implemented fixes here: https://github.com/huggingface/accelerate/pull/3131 This means we can revert the changes from #6574 --- .github/workflows/nv-accelerate-v100.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/nv-accelerate-v100.yml b/.github/workflows/nv-accelerate-v100.yml index 76b8c93fba3f..915493bb3183 100644 --- a/.github/workflows/nv-accelerate-v100.yml +++ b/.github/workflows/nv-accelerate-v100.yml @@ -55,4 +55,4 @@ jobs: # tmp fix: force newer datasets version #pip install "datasets>=2.0.0" pip list - pytest $PYTEST_OPTS --color=yes --durations=0 --verbose tests/deepspeed -k "not test_prepare_multiple_models_zero3_inference" + pytest $PYTEST_OPTS --color=yes --durations=0 --verbose tests/deepspeed From 8cded575a94e296fee751072e862304676c95316 Mon Sep 17 00:00:00 2001 From: Logan Adams <114770087+loadams@users.noreply.github.com> Date: Fri, 27 Sep 2024 13:32:48 -0700 Subject: [PATCH 531/754] Fix torch include in `op_builder/mlu/fused_adam.py` and update no-torch workflow triggers (#6584) Changes from #6472 caused the no-torch workflow that is an example of how we build the DeepSpeed release package to fail (so we caught this before a release, see more in #6402). These changes also copy the style used to include torch in other accelerator op_builder implementations, such as npu [here](https://github.com/microsoft/DeepSpeed/blob/master/op_builder/npu/fused_adam.py#L8) and hpu [here](https://github.com/microsoft/DeepSpeed/blob/828ddfbbda2482412fffc89f5fcd3b0d0eba9a62/op_builder/hpu/fused_adam.py#L15). This also updates the no-torch workflow to run on all changes to the op_builder directory. The test runs quickly and shouldn't add any additional testing burden there. Resolves: #6576 --- .github/workflows/no-torch.yml | 1 + op_builder/mlu/fused_adam.py | 6 +++++- 2 files changed, 6 insertions(+), 1 deletion(-) diff --git a/.github/workflows/no-torch.yml b/.github/workflows/no-torch.yml index 794c02b3c4db..eb3ac9b03161 100644 --- a/.github/workflows/no-torch.yml +++ b/.github/workflows/no-torch.yml @@ -5,6 +5,7 @@ on: pull_request: paths: - '.github/workflows/no-torch.yml' + - 'op_builder/**' schedule: - cron: "0 0 * * *" diff --git a/op_builder/mlu/fused_adam.py b/op_builder/mlu/fused_adam.py index 0198db7cb276..2343e55568c4 100644 --- a/op_builder/mlu/fused_adam.py +++ b/op_builder/mlu/fused_adam.py @@ -5,7 +5,11 @@ # DeepSpeed Team from .builder import MLUOpBuilder -import torch + +try: + import torch +except ImportError as e: + pass class MLUFusedAdam: From b93c7a20c8b50258935d8598e53a6e388762fee9 Mon Sep 17 00:00:00 2001 From: Jagadish Krishnamoorthy Date: Fri, 4 Oct 2024 14:31:25 -0700 Subject: [PATCH 532/754] [ROCm] Fix subprocess error (#6587) Fixes https://github.com/microsoft/DeepSpeed/issues/6585 Use shell=True for subprocess.check_output() in case of ROCm commands. Do not use shlex.split() since command string has wildcard expansion. Signed-off-by: Jagadish Krishnamoorthy --- op_builder/builder.py | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/op_builder/builder.py b/op_builder/builder.py index e935a179f6af..f95341f137b4 100644 --- a/op_builder/builder.py +++ b/op_builder/builder.py @@ -253,8 +253,7 @@ def get_rocm_gpu_arch(): rocm_info = Path("rocminfo") rocm_gpu_arch_cmd = str(rocm_info) + " | grep -o -m 1 'gfx.*'" try: - safe_cmd = shlex.split(rocm_gpu_arch_cmd) - result = subprocess.check_output(safe_cmd) + result = subprocess.check_output(rocm_gpu_arch_cmd, shell=True) rocm_gpu_arch = result.decode('utf-8').strip() except subprocess.CalledProcessError: rocm_gpu_arch = "" @@ -272,8 +271,7 @@ def get_rocm_wavefront_size(): rocm_wavefront_size_cmd = str( rocm_info) + " | grep -Eo -m1 'Wavefront Size:[[:space:]]+[0-9]+' | grep -Eo '[0-9]+'" try: - safe_cmd = shlex.split(rocm_wavefront_size_cmd) - result = subprocess.check_output(rocm_wavefront_size_cmd) + result = subprocess.check_output(rocm_wavefront_size_cmd, shell=True) rocm_wavefront_size = result.decode('utf-8').strip() except subprocess.CalledProcessError: rocm_wavefront_size = "32" From 239b83a77e952533439104fced9a72456a010a75 Mon Sep 17 00:00:00 2001 From: Logan Adams <114770087+loadams@users.noreply.github.com> Date: Mon, 7 Oct 2024 10:01:53 -0700 Subject: [PATCH 533/754] Cleanup CODEOWNERS file to be valid (#6603) --- CODEOWNERS | 76 +++++++++++++++++++++++++++--------------------------- 1 file changed, 38 insertions(+), 38 deletions(-) diff --git a/CODEOWNERS b/CODEOWNERS index 2c16aef39a1b..c0fc85cb8b89 100644 --- a/CODEOWNERS +++ b/CODEOWNERS @@ -7,50 +7,50 @@ # top-level repo folders -/.github/ @mrwyattii @loadams -/azure/ @mrwyattii @awan-10 -/benchmarks/ @awan-10 @mrwyattii -/bin/ @mrwyattii -/csrc/ @awan-10 @mrwyattii @cmikeh2 @arashb -/deepspeed/ @mrwyattii -/docker/ @mrwyattii @awan-10 -/docs/ @mrwyattii -/examples/ @awan-10 @mrwyattii -/op_builder/ @mrwyattii @cmikeh2 -/release/ @loadams @mrwyattii -/requirements/ @loadams @mrwyattii -/scripts/ @mrwyattii @awan-10 -/tests/ @mrwyattii @tjruwase @loadams +/.github/ @loadams +/azure/ @awan-10 +/benchmarks/ @awan-10 @tjruwase +/bin/ @loadams +/csrc/ @awan-10 +/deepspeed/ @loadams @tjruwase +/docker/ @awan-10 +/docs/ @loadams @tjruwase +/examples/ @awan-10 @tohtana +/op_builder/ @loadams @tjruwase @jomayeri +/release/ @loadams +/requirements/ @loadams +/scripts/ @awan-10 +/tests/ @tjruwase @loadams @tohtana # deepspeed -/deepspeed/autotuning/ @mrwyattii +/deepspeed/autotuning/ @loadams /deepspeed/checkpoint/ @tjruwase /deepspeed/comm/ @awan-10 -/deepspeed/compression/ @minjiaz @xiaoxiawu-microsoft @conglongli -/deepspeed/elasticity/ @mrwyattii @awan-10 -/deepspeed/launcher/ @mrwyattii @awan-10 -/deepspeed/module_inject/ @mrwyattii @awan-10 @cmikeh2 @arashb -/deepspeed/moe/ @awan-10 -/deepspeed/monitor/ @awan-10 @mrwyattii -/deepspeed/nebula/ @tjruwase @mrwyattii -/deepspeed/ops/ @mrwyattii @awan-10 @cmikeh2 @arashb -/deepspeed/pipe/ @ShadenSmith @duli2012 -/deepspeed/profiling/ @ShijieZZZZ -/deepspeed/utils/ @mrwyattii @tjruwase @awan-10 +/deepspeed/compression/ @tjruwase +/deepspeed/elasticity/ @awan-10 +/deepspeed/launcher/ @loadams +/deepspeed/module_inject/ @awan-10 +/deepspeed/moe/ @tohtana +/deepspeed/monitor/ @awan-10 +/deepspeed/nebula/ @tjruwase +/deepspeed/ops/ @tohtana +/deepspeed/pipe/ @tohtana @loadams +/deepspeed/profiling/ @loadams +/deepspeed/utils/ @tjruwase @awan-10 # inference -/deepspeed/inference/ @mrwyattii @awan-10 @cmikeh2 @arashb -/deepspeed/model_implementations/ @mrwyattii @awan-10 @cmikeh2 @arashb +/deepspeed/inference/ @awan-10 +/deepspeed/model_implementations/ @awan-10 # training -/deepspeed/runtime/ @mrwyattii @tjruwase -/deepspeed/runtime/activation_checkpointing/ @mrwyattii @tjruwase -/deepspeed/runtime/checkpoint_engine/ @tjruwase @mrwyattii +/deepspeed/runtime/ @tjruwase @tohtana +/deepspeed/runtime/activation_checkpointing/ @tjruwase +/deepspeed/runtime/checkpoint_engine/ @tjruwase /deepspeed/runtime/comm/ @awan-10 -/deepspeed/runtime/compression/ @awan-10 @conglongli -/deepspeed/runtime/data_pipeline/ @conglongli -/deepspeed/runtime/fp16/ @mrwyattii @tjruwase -/deepspeed/runtime/fp16/onebit/ @conglongli @awan-10 -/deepspeed/runtime/pipe/ @ShadenSmith @duli2012 -/deepspeed/runtime/swap_tensor/ @tjruwase @mrwyattii -/deepspeed/runtime/zero/ @tjruwase @mrwyattii +/deepspeed/runtime/compression/ @awan-10 +/deepspeed/runtime/data_pipeline/ @tjruwase +/deepspeed/runtime/fp16/ @tjruwase +/deepspeed/runtime/fp16/onebit/ @awan-10 +/deepspeed/runtime/pipe/ @loadams +/deepspeed/runtime/swap_tensor/ @tjruwase +/deepspeed/runtime/zero/ @tjruwase From 940887ded1000121cc11b746a6a2eb9b53e3e6fc Mon Sep 17 00:00:00 2001 From: Logan Adams <114770087+loadams@users.noreply.github.com> Date: Mon, 7 Oct 2024 11:22:05 -0700 Subject: [PATCH 534/754] Add SSF Best practices badge (#6604) Work in progress to ensure we meet SSF best practices: https://www.bestpractices.dev/en/projects/9530 --- README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/README.md b/README.md index 2f6661ef5860..86711c4374f8 100755 --- a/README.md +++ b/README.md @@ -2,6 +2,7 @@ [![PyPI version](https://badge.fury.io/py/deepspeed.svg)](https://pypi.org/project/deepspeed/) [![Downloads](https://static.pepy.tech/badge/deepspeed)](https://pepy.tech/project/deepspeed) [![Build](https://badgen.net/badge/build/check-status/blue)](#build-pipeline-status) +[![OpenSSF Best Practices](https://www.bestpractices.dev/projects/9530/badge)](https://www.bestpractices.dev/projects/9530) [![Twitter](https://img.shields.io/twitter/follow/MSFTDeepSpeed)](https://twitter.com/intent/follow?screen_name=MSFTDeepSpeed) [![Japanese Twitter](https://img.shields.io/badge/%E6%97%A5%E6%9C%AC%E8%AA%9ETwitter-%40MSFTDeepSpeedJP-blue)](https://twitter.com/MSFTDeepSpeedJP) [![Chinese Zhihu](https://img.shields.io/badge/%E7%9F%A5%E4%B9%8E-%E5%BE%AE%E8%BD%AFDeepSpeed-blue)](https://www.zhihu.com/people/deepspeed) From 20695b39b19b64bf0ae0ef3e590bc29bccff36c7 Mon Sep 17 00:00:00 2001 From: Logan Adams <114770087+loadams@users.noreply.github.com> Date: Mon, 7 Oct 2024 21:06:51 -0700 Subject: [PATCH 535/754] Move V100 workflows from cuda 11.1/11.7 to 12.1 (#6607) --- .github/workflows/nv-accelerate-v100.yml | 4 ++-- .github/workflows/nv-ds-chat.yml | 4 ++-- .github/workflows/nv-inference.yml | 10 +++++----- .github/workflows/nv-lightning-v100.yml | 4 ++-- .github/workflows/nv-mii.yml | 4 ++-- .github/workflows/nv-nightly.yml | 6 +++--- .github/workflows/nv-torch-latest-v100.yml | 8 ++++---- .github/workflows/nv-torch-nightly-v100.yml | 4 ++-- .github/workflows/nv-transformers-v100.yml | 4 ++-- 9 files changed, 24 insertions(+), 24 deletions(-) diff --git a/.github/workflows/nv-accelerate-v100.yml b/.github/workflows/nv-accelerate-v100.yml index 915493bb3183..346055e2685f 100644 --- a/.github/workflows/nv-accelerate-v100.yml +++ b/.github/workflows/nv-accelerate-v100.yml @@ -19,7 +19,7 @@ concurrency: jobs: unit-tests: - runs-on: [self-hosted, nvidia, cu117, v100] + runs-on: [self-hosted, nvidia, cu121, v100] steps: - uses: actions/checkout@v4 @@ -29,7 +29,7 @@ jobs: - name: Install pytorch run: | - pip install -U --cache-dir $TORCH_CACHE torch torchvision --index-url https://download.pytorch.org/whl/cu118 + pip install -U --cache-dir $TORCH_CACHE torch torchvision --index-url https://download.pytorch.org/whl/cu121 python -c "import torch; print('torch:', torch.__version__, torch)" python -c "import torch; print('CUDA available:', torch.cuda.is_available())" diff --git a/.github/workflows/nv-ds-chat.yml b/.github/workflows/nv-ds-chat.yml index c823c194e83c..2ad336cac4ed 100644 --- a/.github/workflows/nv-ds-chat.yml +++ b/.github/workflows/nv-ds-chat.yml @@ -26,7 +26,7 @@ permissions: jobs: unit-tests: - runs-on: [self-hosted, nvidia, cu117, v100] + runs-on: [self-hosted, nvidia, cu121, v100] steps: - uses: actions/checkout@v4 @@ -36,7 +36,7 @@ jobs: - name: Install pytorch run: | - pip3 install -U --cache-dir $TORCH_CACHE torch --index-url https://download.pytorch.org/whl/cu118 + pip3 install -U --cache-dir $TORCH_CACHE torch --index-url https://download.pytorch.org/whl/cu121 python -c "import torch; print('torch:', torch.__version__, torch)" python -c "import torch; print('CUDA available:', torch.cuda.is_available())" diff --git a/.github/workflows/nv-inference.yml b/.github/workflows/nv-inference.yml index f863226bfb95..c0a4275bd2b6 100644 --- a/.github/workflows/nv-inference.yml +++ b/.github/workflows/nv-inference.yml @@ -22,7 +22,7 @@ concurrency: jobs: unit-tests: - runs-on: [self-hosted, nvidia, cu117, v100] + runs-on: [self-hosted, nvidia, cu121, v100] steps: - uses: actions/checkout@v4 @@ -32,7 +32,7 @@ jobs: - name: Install pytorch run: | - pip install -U --cache-dir $TORCH_CACHE torch==2.1.2 torchvision==0.16.2 --index-url https://download.pytorch.org/whl/cu118 + pip install -U --cache-dir $TORCH_CACHE torch==2.1.2 torchvision==0.16.2 --index-url https://download.pytorch.org/whl/cu121 python -c "import torch; print('torch:', torch.__version__, torch)" python -c "import torch; print('CUDA available:', torch.cuda.is_available())" @@ -58,8 +58,8 @@ jobs: run: | unset TORCH_CUDA_ARCH_LIST # only jit compile for current arch cd tests - #pytest $PYTEST_OPTS -m 'seq_inference' unit/ --torch_ver="2.1" --cuda_ver="11.8" - pytest $PYTEST_OPTS -m 'inference_ops' unit/ --torch_ver="2.1" --cuda_ver="11.8" - pytest $PYTEST_OPTS --forked -n 4 -m 'inference' unit/ --torch_ver="2.1" --cuda_ver="11.8" + #pytest $PYTEST_OPTS -m 'seq_inference' unit/ --torch_ver="2.1" --cuda_ver="12.1" + pytest $PYTEST_OPTS -m 'inference_ops' unit/ --torch_ver="2.1" --cuda_ver="12.1" + pytest $PYTEST_OPTS --forked -n 4 -m 'inference' unit/ --torch_ver="2.1" --cuda_ver="12.1" # run ds_report again to check updated op list ds_report diff --git a/.github/workflows/nv-lightning-v100.yml b/.github/workflows/nv-lightning-v100.yml index 6af228f7fb2f..a9a26b7ce816 100644 --- a/.github/workflows/nv-lightning-v100.yml +++ b/.github/workflows/nv-lightning-v100.yml @@ -19,7 +19,7 @@ concurrency: jobs: unit-tests: - runs-on: [self-hosted, nvidia, cu111, v100] + runs-on: [self-hosted, nvidia, cu121, v100] env: {ACTIONS_ALLOW_USE_UNSECURE_NODE_VERSION: true} # Allow using Node16 actions @@ -31,7 +31,7 @@ jobs: - name: Install pytorch run: | - pip install -U --cache-dir $TORCH_CACHE torch torchvision --index-url https://download.pytorch.org/whl/cu118 + pip install -U --cache-dir $TORCH_CACHE torch torchvision --index-url https://download.pytorch.org/whl/cu121 python -c "import torch; print('torch:', torch.__version__, torch)" python -c "import torch; print('CUDA available:', torch.cuda.is_available())" diff --git a/.github/workflows/nv-mii.yml b/.github/workflows/nv-mii.yml index d394b7e24bd6..a576e5933b08 100644 --- a/.github/workflows/nv-mii.yml +++ b/.github/workflows/nv-mii.yml @@ -27,7 +27,7 @@ concurrency: jobs: unit-tests: - runs-on: [self-hosted, nvidia, cu117, v100] + runs-on: [self-hosted, nvidia, cu121, v100] steps: - uses: actions/checkout@v4 @@ -37,7 +37,7 @@ jobs: - name: Install pytorch run: | - pip3 install -U --cache-dir $TORCH_CACHE torch torchvision --index-url https://download.pytorch.org/whl/cu118 + pip3 install -U --cache-dir $TORCH_CACHE torch torchvision --index-url https://download.pytorch.org/whl/cu121 python -c "import torch; print('torch:', torch.__version__, torch)" python -c "import torch; print('CUDA available:', torch.cuda.is_available())" diff --git a/.github/workflows/nv-nightly.yml b/.github/workflows/nv-nightly.yml index 8658ff5d2348..e6032941ebb3 100644 --- a/.github/workflows/nv-nightly.yml +++ b/.github/workflows/nv-nightly.yml @@ -18,7 +18,7 @@ permissions: jobs: unit-tests: - runs-on: [self-hosted, nvidia, cu117, v100] + runs-on: [self-hosted, nvidia, cu121, v100] steps: - uses: actions/checkout@v4 @@ -28,7 +28,7 @@ jobs: - name: Install pytorch run: | - pip install -U --cache-dir $TORCH_CACHE torch torchvision --index-url https://download.pytorch.org/whl/cu118 + pip install -U --cache-dir $TORCH_CACHE torch torchvision --index-url https://download.pytorch.org/whl/cu121 python -c "import torch; print('torch:', torch.__version__, torch)" python -c "import torch; print('CUDA available:', torch.cuda.is_available())" @@ -58,7 +58,7 @@ jobs: run: | unset TORCH_CUDA_ARCH_LIST # only jit compile for current arch cd tests - pytest $PYTEST_OPTS --forked -m 'nightly' unit/ --torch_ver="2.4" --cuda_ver="11.8" + pytest $PYTEST_OPTS --forked -m 'nightly' unit/ --torch_ver="2.4" --cuda_ver="12.1" - name: Open GitHub issue if nightly CI fails if: ${{ failure() && (github.event_name == 'schedule') }} diff --git a/.github/workflows/nv-torch-latest-v100.yml b/.github/workflows/nv-torch-latest-v100.yml index ebef2d35c278..e888c472638f 100644 --- a/.github/workflows/nv-torch-latest-v100.yml +++ b/.github/workflows/nv-torch-latest-v100.yml @@ -19,7 +19,7 @@ concurrency: jobs: unit-tests: - runs-on: [self-hosted, nvidia, cu117, v100] + runs-on: [self-hosted, nvidia, cu121, v100] steps: - uses: actions/checkout@v4 @@ -29,7 +29,7 @@ jobs: - name: Install pytorch run: | - pip install -U --cache-dir $TORCH_CACHE torch torchvision --index-url https://download.pytorch.org/whl/cu118 + pip install -U --cache-dir $TORCH_CACHE torch torchvision --index-url https://download.pytorch.org/whl/cu121 python -c "import torch; print('torch:', torch.__version__, torch)" python -c "import torch; print('CUDA available:', torch.cuda.is_available())" @@ -55,5 +55,5 @@ jobs: run: | unset TORCH_CUDA_ARCH_LIST # only jit compile for current arch cd tests - pytest $PYTEST_OPTS --forked -n 4 unit/ --torch_ver="2.4" --cuda_ver="11.8" - pytest $PYTEST_OPTS --forked -m 'sequential' unit/ --torch_ver="2.4" --cuda_ver="11.8" + pytest $PYTEST_OPTS --forked -n 4 unit/ --torch_ver="2.4" --cuda_ver="12.1" + pytest $PYTEST_OPTS --forked -m 'sequential' unit/ --torch_ver="2.4" --cuda_ver="12.1" diff --git a/.github/workflows/nv-torch-nightly-v100.yml b/.github/workflows/nv-torch-nightly-v100.yml index 257040439005..74495812add5 100644 --- a/.github/workflows/nv-torch-nightly-v100.yml +++ b/.github/workflows/nv-torch-nightly-v100.yml @@ -15,7 +15,7 @@ permissions: jobs: unit-tests: - runs-on: [self-hosted, nvidia, cu117, v100] + runs-on: [self-hosted, nvidia, cu121, v100] steps: - uses: actions/checkout@v4 @@ -25,7 +25,7 @@ jobs: - name: Install pytorch run: | - pip install --pre torch torchvision --index-url https://download.pytorch.org/whl/nightly/cu118 + pip install --pre torch torchvision --index-url https://download.pytorch.org/whl/nightly/cu121 python -c "import torch; print('torch:', torch.__version__, torch)" python -c "import torch; print('CUDA available:', torch.cuda.is_available())" diff --git a/.github/workflows/nv-transformers-v100.yml b/.github/workflows/nv-transformers-v100.yml index cfed6d6583e6..18c5e2c98bc6 100644 --- a/.github/workflows/nv-transformers-v100.yml +++ b/.github/workflows/nv-transformers-v100.yml @@ -18,7 +18,7 @@ concurrency: jobs: unit-tests: - runs-on: [self-hosted, nvidia, cu117, v100] + runs-on: [self-hosted, nvidia, cu121, v100] steps: - uses: actions/checkout@v4 @@ -29,7 +29,7 @@ jobs: - name: Install pytorch run: | # use the same pytorch version as transformers CI - pip install -U --cache-dir $TORCH_CACHE torch==2.0.1+cu118 --index-url https://download.pytorch.org/whl/cu118 + pip install -U --cache-dir $TORCH_CACHE torch==2.0.1+cu121 --index-url https://download.pytorch.org/whl/cu121 python -c "import torch; print('torch:', torch.__version__, torch)" python -c "import torch; print('CUDA available:', torch.cuda.is_available())" From 00c4b98ba0786d3ce99bde46ee60811f07f01dff Mon Sep 17 00:00:00 2001 From: Logan Adams <114770087+loadams@users.noreply.github.com> Date: Tue, 8 Oct 2024 10:42:22 -0700 Subject: [PATCH 536/754] Fix SD workflow (#6609) SD workflow needed updates when we moved to pydantic 2 support that was never added before. Passing nv-sd workflow [here](https://github.com/microsoft/DeepSpeed/actions/runs/11239699283) --- .github/workflows/nv-sd.yml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/.github/workflows/nv-sd.yml b/.github/workflows/nv-sd.yml index b348d5ff931f..0344c80451a6 100644 --- a/.github/workflows/nv-sd.yml +++ b/.github/workflows/nv-sd.yml @@ -53,6 +53,8 @@ jobs: pip install image-similarity-measures python -m pip install opencv-python==4.6.* --force-reinstall python -m pip install docutils==0.18.1 jinja2==3.0 urllib3==1.26.11 ninja + # Update packages included in the container that do not support pydantic 2+ to versions that do + python -m pip install thinc spacy confection --upgrade python -m pip install .[dev,1bit,autotuning,sd] ds_report - name: Python environment From 745dd48b90260bff3c65c7620d993df9ca6c529b Mon Sep 17 00:00:00 2001 From: Logan Adams <114770087+loadams@users.noreply.github.com> Date: Tue, 8 Oct 2024 11:15:46 -0700 Subject: [PATCH 537/754] Pin accelerate to fix CI failures/issues (#6610) --- .github/workflows/nv-accelerate-v100.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.github/workflows/nv-accelerate-v100.yml b/.github/workflows/nv-accelerate-v100.yml index 346055e2685f..3bddc329e3dd 100644 --- a/.github/workflows/nv-accelerate-v100.yml +++ b/.github/workflows/nv-accelerate-v100.yml @@ -47,6 +47,7 @@ jobs: unset TORCH_CUDA_ARCH_LIST # only jit compile for current arch git clone https://github.com/huggingface/accelerate cd accelerate + git checkout ae9cb6e4db6f81fd18148c2cc67d72b903d81a46 git rev-parse --short HEAD # installing dependencies pip install .[testing] From e97b453645a03bc6901d74ec13be1c5d7f1a1fec Mon Sep 17 00:00:00 2001 From: Yejing-Lai Date: Wed, 9 Oct 2024 02:16:04 +0800 Subject: [PATCH 538/754] Add llama3.2 vision autotp (#6577) Llama3.2-11b and llama3.2-90b including vision model and text model, these two models have different num_kv_heads, so we need to set num_kv_heads dynamically. Co-authored-by: Logan Adams <114770087+loadams@users.noreply.github.com> --- deepspeed/module_inject/auto_tp.py | 3 ++- deepspeed/module_inject/replace_module.py | 10 +++++++++- 2 files changed, 11 insertions(+), 2 deletions(-) diff --git a/deepspeed/module_inject/auto_tp.py b/deepspeed/module_inject/auto_tp.py index e6eea2183de5..52d7c95ec9d8 100644 --- a/deepspeed/module_inject/auto_tp.py +++ b/deepspeed/module_inject/auto_tp.py @@ -495,7 +495,8 @@ def get_model_num_kv_heads(self, config): num_kv_heads = None # multi_query_group_num is for chatglm2 & chatglm3 kv_head_names = [ - 'multi_query_group_num', 'num_kv_heads', 'num_key_value_heads', 'num_attention_heads', 'n_heads' + 'multi_query_group_num', 'num_kv_heads', 'num_key_value_heads', 'num_attention_heads', 'n_heads', + 'attention_heads' ] for name in kv_head_names: if hasattr(config, name): diff --git a/deepspeed/module_inject/replace_module.py b/deepspeed/module_inject/replace_module.py index 64dc5479940c..cf70c4530c82 100644 --- a/deepspeed/module_inject/replace_module.py +++ b/deepspeed/module_inject/replace_module.py @@ -274,7 +274,13 @@ def replace_wo_policy(module, all_reduce_linears, prefix="", state_dict=None): _autotp.set_tensor_parallel_config(config.tensor_parallel.tp_size, config.tensor_parallel.tp_group) # 3. Try to get num_key_heads from model_config.num_key_value_heads - num_kv_heads = _autotp.get_model_num_kv_heads(model_config) + if hasattr(model_config, "vision_config"): + if "MllamaVisionEncoderLayer" in str(module): + num_kv_heads = _autotp.get_model_num_kv_heads(model_config.vision_config) + else: + num_kv_heads = _autotp.get_model_num_kv_heads(model_config.text_config) + else: + num_kv_heads = _autotp.get_model_num_kv_heads(model_config) # 4. When we have num_kv_heads defined, uneven division is possible, otherwise enforce even division set_num_kv_heads(num_kv_heads) @@ -339,6 +345,8 @@ def set_lm_head(module): "weight") and not module.embed_out.weight.is_meta and isinstance( module.embed_out, torch.nn.Linear): module = replace_wo_policy(module, ("embed_out", ), 0, "embed_out") + elif hasattr(module.language_model, "lm_head"): + module = replace_wo_policy(module.language_model, ("lm_head", ), 0, "lm_head") return module def conv2d_parallel_shard_weights(model, rank, world_size): From f74ea69abf09294834eba13b003568a440e3d22b Mon Sep 17 00:00:00 2001 From: Olatunji Ruwase Date: Tue, 8 Oct 2024 14:38:51 -0400 Subject: [PATCH 539/754] Improve DS logging control (#6602) Disable `steps_per_print` by default. --- deepspeed/runtime/constants.py | 2 +- deepspeed/runtime/engine.py | 8 ++++---- deepspeed/utils/timer.py | 9 +++++++-- 3 files changed, 12 insertions(+), 7 deletions(-) diff --git a/deepspeed/runtime/constants.py b/deepspeed/runtime/constants.py index 679230ca7d4c..55cfa8f59c91 100755 --- a/deepspeed/runtime/constants.py +++ b/deepspeed/runtime/constants.py @@ -77,7 +77,7 @@ # Steps STEPS_PER_PRINT = "steps_per_print" -STEPS_PER_PRINT_DEFAULT = 10 +STEPS_PER_PRINT_DEFAULT = None ######################################### # Training micro batch size per GPU diff --git a/deepspeed/runtime/engine.py b/deepspeed/runtime/engine.py index b590ea432658..0371c5663a2d 100755 --- a/deepspeed/runtime/engine.py +++ b/deepspeed/runtime/engine.py @@ -2145,8 +2145,6 @@ def _take_model_step(self, lr_kwargs, block_eigenvalue={}): else: self.zero_grad() - report_progress = self.global_rank == 0 if self.global_rank else True - # Check overflow here since in DS fp16 optimizer, the overflow is updated in above step() function. overflow = False if hasattr(self.optimizer, "overflow"): @@ -2166,8 +2164,10 @@ def _take_model_step(self, lr_kwargs, block_eigenvalue={}): # pipe_engine.train_batch() self.lr_scheduler.step(self.train_batch_size()) - if report_progress and (self.global_steps + 1) % self.steps_per_print() == 0: - self._report_progress(self.global_steps + 1) + if self.steps_per_print() is not None: + report_progress = self.global_rank == 0 if self.global_rank else True + if report_progress and (self.global_steps + 1) % self.steps_per_print() == 0: + self._report_progress(self.global_steps + 1) self.losses = None self.global_steps += 1 diff --git a/deepspeed/utils/timer.py b/deepspeed/utils/timer.py index 00f17dea709c..64ae8ac0e5b4 100755 --- a/deepspeed/utils/timer.py +++ b/deepspeed/utils/timer.py @@ -198,7 +198,7 @@ def get_mean(self, names, normalizer=1.0, reset=True): class ThroughputTimer: - def __init__(self, config, batch_size, start_step=2, steps_per_output=50, monitor_memory=False, logging_fn=None): + def __init__(self, config, batch_size, start_step=2, steps_per_output=None, monitor_memory=False, logging_fn=None): from deepspeed.utils import logger self.config = config self.start_time = 0 @@ -238,6 +238,11 @@ def start(self): get_accelerator().synchronize() self.start_time = time.time() + def _is_report_boundary(self): + if self.steps_per_output is None: + return False + return self.global_step_count % self.steps_per_output == 0 + def stop(self, global_step=False, report_speed=True): if not self.config.enabled or not self.started: return @@ -255,7 +260,7 @@ def stop(self, global_step=False, report_speed=True): self.step_elapsed_time += duration if global_step: - if report_speed and self.global_step_count % self.steps_per_output == 0: + if report_speed and self._is_report_boundary(): self.logging( "epoch={}/micro_step={}/global_step={}, RunningAvgSamplesPerSec={}, CurrSamplesPerSec={}, " "MemAllocated={}GB, MaxMemAllocated={}GB".format( From 5cbbff40bd2eceb4340376d7e3db764c69a2527a Mon Sep 17 00:00:00 2001 From: Masahiro Tanaka <81312776+tohtana@users.noreply.github.com> Date: Tue, 8 Oct 2024 13:41:44 -0700 Subject: [PATCH 540/754] Fix device selection using CUDA_VISIBLE_DEVICES (#6530) This PR addresses #5818. Instead of contiguous numbers based on the device count, this PR uses device indices in `--include`. --------- Co-authored-by: Olatunji Ruwase Co-authored-by: Logan Adams <114770087+loadams@users.noreply.github.com> --- deepspeed/launcher/runner.py | 44 ++++++++++++++++++++++++++---------- 1 file changed, 32 insertions(+), 12 deletions(-) diff --git a/deepspeed/launcher/runner.py b/deepspeed/launcher/runner.py index 076f65b201b3..5f926834dda2 100755 --- a/deepspeed/launcher/runner.py +++ b/deepspeed/launcher/runner.py @@ -20,6 +20,8 @@ from copy import deepcopy import signal import time +from typing import Tuple, List, Dict +from collections import defaultdict import shlex from .multinode_runner import PDSHRunner, OpenMPIRunner, MVAPICHRunner, SlurmRunner, MPICHRunner, IMPIRunner @@ -263,6 +265,31 @@ def _stable_remove_duplicates(data): return new_list +def parse_node_config(node_config: str) -> Tuple[str, List[int]]: + SLOT_LIST_START = ':' + SLOT_SEP = ',' + + if SLOT_LIST_START not in node_config: + return node_config, [] + + hostname, slots = node_config.split(SLOT_LIST_START) + slots = [int(x) for x in slots.split(SLOT_SEP)] + + return hostname, slots + + +def parse_node_config_list(node_config_list: List[str]) -> Dict[str, List[int]]: + NODE_SEP = '@' + + node_configs = defaultdict(list) + + for node_config in node_config_list.split(NODE_SEP): + hostname, slots = parse_node_config(node_config) + node_configs[hostname] += slots + + return {k: sorted(list(set(v))) for k, v in node_configs.items()} + + def parse_resource_filter(host_info, include_str="", exclude_str=""): '''Parse an inclusion or exclusion string and filter a hostfile dictionary. @@ -277,11 +304,6 @@ def parse_resource_filter(host_info, include_str="", exclude_str=""): slot 0 on worker-1. ''' - # Constants that define our syntax - NODE_SEP = '@' - SLOT_LIST_START = ':' - SLOT_SEP = ',' - # Ensure include/exclude are mutually exclusive if (include_str != "") and (exclude_str != ""): raise ValueError('include_str and exclude_str are mutually exclusive.') @@ -299,12 +321,9 @@ def parse_resource_filter(host_info, include_str="", exclude_str=""): parse_str = exclude_str # foreach node in the list - for node_config in parse_str.split(NODE_SEP): + for hostname, slots in parse_node_config_list(parse_str).items(): # Node can either be alone or node:slot,slot,slot - if SLOT_LIST_START in node_config: - hostname, slots = node_config.split(SLOT_LIST_START) - slots = [int(x) for x in slots.split(SLOT_SEP)] - + if len(slots) > 0: # sanity checks if hostname not in host_info: raise ValueError(f"Hostname '{hostname}' not found in hostfile") @@ -322,7 +341,6 @@ def parse_resource_filter(host_info, include_str="", exclude_str=""): # User just specified the whole node else: - hostname = node_config # sanity check hostname if hostname not in host_info: raise ValueError(f"Hostname '{hostname}' not found in hostfile") @@ -355,8 +373,10 @@ def parse_resource_filter(host_info, include_str="", exclude_str=""): def parse_inclusion_exclusion(resource_pool, inclusion, exclusion): active_resources = collections.OrderedDict() + node_configs = parse_node_config_list(inclusion) + for hostname, slots in resource_pool.items(): - active_resources[hostname] = list(range(slots)) + active_resources[hostname] = node_configs[hostname] if hostname in node_configs else list(range(slots)) return parse_resource_filter(active_resources, include_str=inclusion, exclude_str=exclusion) From ca8b1fe945ce8100dd1ac164d7416f3b8f6be8b7 Mon Sep 17 00:00:00 2001 From: Yichen Yan Date: Wed, 9 Oct 2024 07:38:43 +0800 Subject: [PATCH 541/754] Handle when `backend` is also in compile_kwargs (#6502) cc @tohtana Co-authored-by: Logan Adams <114770087+loadams@users.noreply.github.com> Co-authored-by: Olatunji Ruwase Co-authored-by: Masahiro Tanaka <81312776+tohtana@users.noreply.github.com> --- deepspeed/runtime/engine.py | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/deepspeed/runtime/engine.py b/deepspeed/runtime/engine.py index 0371c5663a2d..ba0e0f875625 100755 --- a/deepspeed/runtime/engine.py +++ b/deepspeed/runtime/engine.py @@ -3675,7 +3675,11 @@ def compile(self, backend=get_accelerator().get_compile_backend(), compile_kwarg if self.is_compiled: return - self.module.compile(backend=backend, **compile_kwargs) + if 'backend' in compile_kwargs: + logger.warning("The `backend` in `compile_kwargs` will be overridden. Use the `backend` argument instead.") + + # create new dict to avoid modifying original dict + self.module.compile(**{**compile_kwargs, 'backend': backend}) self._is_compiled = True @property From 645639bcf892e35cd39e7baccdab0e69abb8ce33 Mon Sep 17 00:00:00 2001 From: Omar Elayan <142979319+oelayan7@users.noreply.github.com> Date: Wed, 9 Oct 2024 04:22:28 +0300 Subject: [PATCH 542/754] Rearrange inference OPS and stop using builder.load (#5490) This PR mainly handles all places where InferenceBuilder is used to access any op or a specific implementation for an op. Instead an op is defined, and its proper implementation is picked inside and the usage will be transparent to the user. What was done in the PR: 1) Added missing ops (added a py file with fallback mechanism) 2) Added missing fallback implementations for existing ops 3) removed all usages for builder.load and replaced them with ops instead. 4) added workspace op and inferenceContext which contains all workspace related functions and inferenceContext is the python fallback of inferenceContext in CUDA 5) a small change to softmax_context signature to fit the fallback signature. --------- Co-authored-by: Joe Mayer <114769929+jomayeri@users.noreply.github.com> Co-authored-by: Lev Kurilenko <113481193+lekurile@users.noreply.github.com> Co-authored-by: Logan Adams <114770087+loadams@users.noreply.github.com> Co-authored-by: Olatunji Ruwase --- .../transformer/inference/csrc/pt_binding.cpp | 9 +- deepspeed/inference/engine.py | 17 +- .../transformers/ds_llama2.py | 15 +- .../transformers/ds_transformer.py | 54 ++--- deepspeed/ops/transformer/inference/config.py | 1 - .../inference/diffusers_attention.py | 52 ++-- .../inference/diffusers_transformer_block.py | 33 +-- .../ops/transformer/inference/ds_attention.py | 21 +- .../transformer/inference/moe_inference.py | 59 ++--- .../inference/op_binding/bias_add.py | 31 +++ .../inference/op_binding/bias_gelu.py | 33 +++ .../inference/op_binding/bias_relu.py | 33 +++ .../inference/op_binding/bias_residual.py | 29 +++ .../inference/op_binding/einsum_sec_sm_ecm.py | 29 +++ .../inference/op_binding/gated_activation.py | 40 ++++ .../inference/op_binding/gelu_gemm.py | 11 +- .../inference/op_binding/layer_norm.py | 60 +++++ .../inference/op_binding/mlp_gemm.py | 38 ++- .../inference/op_binding/moe_res_matmul.py | 29 +++ .../inference/op_binding/pad_transform.py | 26 ++ .../inference/op_binding/pre_rms_norm.py | 31 +++ .../inference/op_binding/qkv_gemm.py | 30 ++- .../inference/op_binding/residual_add.py | 65 ++--- .../inference/op_binding/rms_norm.py | 33 +++ .../inference/op_binding/softmax.py | 54 +++-- .../inference/op_binding/softmax_context.py | 105 ++++++++- .../inference/op_binding/vector_add.py | 28 +++ .../inference/op_binding/vector_matmul.py | 8 +- .../inference/op_binding/workspace.py | 222 ++++++++++++++++++ .../transformer/inference/triton/attention.py | 18 +- .../ops/transformer/inference/triton/ops.py | 20 +- deepspeed/runtime/hybrid_engine.py | 18 +- op_builder/hpu/__init__.py | 1 + op_builder/hpu/transformer_inference.py | 39 +++ .../transformer/inference/test_bias_add.py | 14 +- .../transformer/inference/test_bias_geglu.py | 14 +- .../transformer/inference/test_bias_gelu.py | 14 +- .../transformer/inference/test_bias_relu.py | 14 +- .../ops/transformer/inference/test_gelu.py | 12 +- .../transformer/inference/test_layer_norm.py | 18 +- .../inference/test_moe_res_matmult.py | 8 +- .../inference/test_residual_add.py | 25 +- .../transformer/inference/test_rms_norm.py | 14 +- .../ops/transformer/inference/test_softmax.py | 2 +- 44 files changed, 1064 insertions(+), 363 deletions(-) create mode 100644 deepspeed/ops/transformer/inference/op_binding/bias_add.py create mode 100644 deepspeed/ops/transformer/inference/op_binding/bias_gelu.py create mode 100644 deepspeed/ops/transformer/inference/op_binding/bias_relu.py create mode 100644 deepspeed/ops/transformer/inference/op_binding/bias_residual.py create mode 100644 deepspeed/ops/transformer/inference/op_binding/einsum_sec_sm_ecm.py create mode 100644 deepspeed/ops/transformer/inference/op_binding/gated_activation.py create mode 100644 deepspeed/ops/transformer/inference/op_binding/layer_norm.py create mode 100644 deepspeed/ops/transformer/inference/op_binding/moe_res_matmul.py create mode 100644 deepspeed/ops/transformer/inference/op_binding/pad_transform.py create mode 100644 deepspeed/ops/transformer/inference/op_binding/pre_rms_norm.py create mode 100644 deepspeed/ops/transformer/inference/op_binding/rms_norm.py create mode 100644 deepspeed/ops/transformer/inference/op_binding/vector_add.py create mode 100644 deepspeed/ops/transformer/inference/op_binding/workspace.py create mode 100644 op_builder/hpu/transformer_inference.py diff --git a/csrc/transformer/inference/csrc/pt_binding.cpp b/csrc/transformer/inference/csrc/pt_binding.cpp index 2d5332578edc..19dbe73726f7 100644 --- a/csrc/transformer/inference/csrc/pt_binding.cpp +++ b/csrc/transformer/inference/csrc/pt_binding.cpp @@ -452,14 +452,17 @@ std::vector ds_softmax_context(at::Tensor& query_key_value, unsigned layer_id, unsigned num_layers, at::Tensor& alibi, - float rope_theta) + float rope_theta, + bool is_prompt, + std::optional token_idx, + std::optional position_ids) { unsigned bsz = query_key_value.size(0); unsigned seq_len = query_key_value.size(1); int k = query_key_value.size(2) / (heads + 2 * (num_kv > 0 ? num_kv : heads)); unsigned hidden_dim = heads * k; - bool is_prompt = (seq_len > 1); + is_prompt = (seq_len > 1); if (is_prompt) InferenceContext::Instance().reset_tokens(seq_len); unsigned soft_len = InferenceContext::Instance().current_tokens(); @@ -2031,7 +2034,7 @@ PYBIND11_MODULE(TORCH_EXTENSION_NAME, m) "DeepSpeed memory allocation for GPT inference with " #_name " (CUDA)"); \ m.def("dequantize_" #_name, \ &ds_dequantize<_dtype>, \ - "DeepSpeed dequantize with " #_name " (CUDA)") + "DeepSpeed dequantize with " #_name " (CUDA)"); DEF_OPS(fp32, float); DEF_OPS(fp16, __half); diff --git a/deepspeed/inference/engine.py b/deepspeed/inference/engine.py index 68836ceb523c..6574d49fb132 100755 --- a/deepspeed/inference/engine.py +++ b/deepspeed/inference/engine.py @@ -53,12 +53,7 @@ def __init__(self, model, config): DS_INFERENCE_ENABLED = True super().__init__() - - # Have to import here because inference_module is a global, but python - # globals only work at the module level and will not be updated unless - # we import it each time we init a new inference engine. - from ..model_implementations.transformers.ds_transformer import inference_module - if inference_module is not None: + if DeepSpeedTransformerInference.workspace is not None: self.destroy() self.module = model @@ -191,15 +186,11 @@ def __init__(self, model, config): self._is_compiled = False def destroy(self): - # Have to import here because inference_module is a global, but python - # globals only work at the module level and will not be updated unless - # we import it each time we init a new inference engine. - from ..model_implementations.transformers.ds_transformer import inference_module DeepSpeedTransformerInference.layer_id = 0 DeepSpeedSelfAttention.num_layers = 0 - if inference_module is not None: - inference_module.release_workspace() - inference_module = None + if DeepSpeedTransformerInference.workspace.is_allocated(): + DeepSpeedTransformerInference.workspace.release_workspace() + DeepSpeedTransformerInference.workspace = None def profile_model_time(self, use_cuda_events=True): if not self.model_profile_enabled and not self._config.enable_cuda_graph: diff --git a/deepspeed/model_implementations/transformers/ds_llama2.py b/deepspeed/model_implementations/transformers/ds_llama2.py index 7d9eb4113a8a..325bfb4f7e18 100644 --- a/deepspeed/model_implementations/transformers/ds_llama2.py +++ b/deepspeed/model_implementations/transformers/ds_llama2.py @@ -4,11 +4,8 @@ # DeepSpeed Team import torch -from deepspeed import comm as dist from deepspeed.model_implementations.transformers.ds_transformer import DeepSpeedTransformerInference -inference_module = None - class DeepSpeedLlama2Inference(DeepSpeedTransformerInference): """Initialize the DeepSpeed OPT Transformer Layer. @@ -27,18 +24,10 @@ def forward(self, *args, **kwargs): input = args[0] input_mask = None - # Allocate memory only on first layer forward - if self.config.layer_id == 0 and self._alloc_workspace: - self.allocate_workspace(self.config.hidden_size, self.config.heads, - input.size()[1], - input.size()[0], DeepSpeedTransformerInference.layer_id, self.config.mp_size, - self.config.bigscience_bloom, - dist.get_rank() if dist.is_initialized() else 0, self.config.max_out_tokens, - self.config.min_out_tokens) - self._alloc_workspace = False - get_present = True + self.allocate_workspace(input.size()) + # We set the prev key/value to None when there is a prompt if input.shape[1] > 1: self.layer_past = None diff --git a/deepspeed/model_implementations/transformers/ds_transformer.py b/deepspeed/model_implementations/transformers/ds_transformer.py index d87d0de997b5..360113b78a3d 100644 --- a/deepspeed/model_implementations/transformers/ds_transformer.py +++ b/deepspeed/model_implementations/transformers/ds_transformer.py @@ -6,19 +6,18 @@ import torch import torch.nn as nn from deepspeed import comm as dist +from deepspeed.ops.transformer.inference.op_binding.layer_norm import LayerNormOp from deepspeed.utils.logging import log_dist from deepspeed.ops.transformer.inference.ds_mlp import DeepSpeedMLP from deepspeed.ops.transformer.inference.ds_attention import DeepSpeedSelfAttention, BloomSelfAttention +from deepspeed.ops.transformer.inference.op_binding.workspace import WorkspaceOp from deepspeed.accelerator import get_accelerator -from deepspeed.ops.op_builder import InferenceBuilder import deepspeed if deepspeed.HAS_TRITON: from deepspeed.ops.transformer.inference.triton.mlp import TritonMLP from deepspeed.ops.transformer.inference.triton.attention import TritonSelfAttention -inference_module = None - class DeepSpeedTransformerInference(nn.Module): """Initialize the DeepSpeed Transformer Layer. @@ -37,6 +36,7 @@ class DeepSpeedTransformerInference(nn.Module): for specific downstream tasks. """ layer_id = 0 + workspace = None def __init__(self, config, @@ -52,10 +52,6 @@ def __init__(self, DeepSpeedTransformerInference.layer_id += 1 data_type = torch.half if self.config.dtype == torch.int8 else self.config.dtype - global inference_module - if inference_module is None: - builder = InferenceBuilder() - inference_module = builder.load() if DeepSpeedTransformerInference.layer_id == 1: log_dist(f"DeepSpeed-Inference config: {self.config.__dict__}", [0]) @@ -88,22 +84,25 @@ def __init__(self, self.norm_b = nn.Parameter(torch.empty(self.config.hidden_size, dtype=data_type, device=device), requires_grad=False) self.layer_past = None - try: - if config.dtype == torch.float32: - self.allocate_workspace = inference_module.allocate_workspace_fp32 - elif config.dtype == torch.bfloat16: - self.allocate_workspace = inference_module.allocate_workspace_bf16 - else: - self.allocate_workspace = inference_module.allocate_workspace_fp32 - self._alloc_workspace = True - except AttributeError: - self.allocate_workspace = None - self._alloc_workspace = False + self.layer_norm = LayerNormOp() + if DeepSpeedTransformerInference.workspace is None: + DeepSpeedTransformerInference.workspace = WorkspaceOp(self.config) + self._should_allocate_workspace = True + + def allocate_workspace(self, size): + # Allocate memory only on first layer forward + if self.config.layer_id == 0 and self._should_allocate_workspace: + DeepSpeedTransformerInference.workspace.allocate_workspace( + self.config.hidden_size, self.config.heads, size[1], size[0], DeepSpeedTransformerInference.layer_id, + self.config.mp_size, self.config.bigscience_bloom, + dist.get_rank() if dist.is_initialized() else 0, self.config.max_out_tokens, + self.config.min_out_tokens) + self._should_allocate_workspace = False @classmethod def reset_cache(cls): - if inference_module is not None: - inference_module.reset_cache() + if cls.workspace is not None: + cls.workspace.reset_cache() def forward( self, @@ -136,15 +135,7 @@ def forward( input_mask = (input_mask if attn_mask is None else attn_mask) if attention_mask is None else attention_mask - # Allocate memory only on first layer forward - if self.config.layer_id == 0 and self._alloc_workspace: - self.allocate_workspace(self.config.hidden_size, self.config.heads, - input.size()[1], - input.size()[0], DeepSpeedTransformerInference.layer_id, self.config.mp_size, - self.config.bigscience_bloom, - dist.get_rank() if dist.is_initialized() else 0, self.config.max_out_tokens, - self.config.min_out_tokens) - self._alloc_workspace = False + self.allocate_workspace(input.size()) get_present = (get_present or get_key_value or use_cache) input_mask = input_mask if attention_mask is None else attention_mask @@ -178,14 +169,15 @@ def forward( output_attentions, self.norm_w, self.norm_b, - alibi) + alibi, + **kwargs) presents = (key, value) self.layer_past = presents if layer_past is None else None output = self.mlp(attention_output, input, inp_norm, self.attention.attn_ob) if not self.config.pre_layer_norm: - output = inference_module.layer_norm(output, self.norm_w, self.norm_b, self.config.epsilon) + output = self.layer_norm(output, self.norm_w, self.norm_b, self.config.epsilon) output = output.to(input_type) if get_present: diff --git a/deepspeed/ops/transformer/inference/config.py b/deepspeed/ops/transformer/inference/config.py index 9709328cc133..c0dd29f4f962 100644 --- a/deepspeed/ops/transformer/inference/config.py +++ b/deepspeed/ops/transformer/inference/config.py @@ -103,7 +103,6 @@ def __init__(self, self.return_tuple = return_tuple self.mlp_after_attn = mlp_after_attn self.mlp_act_func_type = mlp_act_func_type - self.specialized_mode = False self.training_mp_size = training_mp_size self.bigscience_bloom = bigscience_bloom self.max_out_tokens = max_out_tokens diff --git a/deepspeed/ops/transformer/inference/diffusers_attention.py b/deepspeed/ops/transformer/inference/diffusers_attention.py index 5efc560db75e..3c2340ccfc6f 100644 --- a/deepspeed/ops/transformer/inference/diffusers_attention.py +++ b/deepspeed/ops/transformer/inference/diffusers_attention.py @@ -10,10 +10,11 @@ from packaging import version as pkg_version from deepspeed.utils.logging import log_dist from deepspeed.accelerator import get_accelerator -from deepspeed.ops.op_builder import InferenceBuilder +from deepspeed.ops.transformer.inference.op_binding.workspace import WorkspaceOp +from deepspeed.ops.transformer.inference.op_binding.softmax_context import SoftmaxContextOp +from deepspeed.ops.transformer.inference.op_binding import LinearOp +from deepspeed.ops.transformer.inference.op_binding.pad_transform import PadTransformOp -# Cuda modules will be imported if needed -inference_module = None minus_inf = -10000.0 triton_flash_attn = None @@ -36,7 +37,8 @@ class DeepSpeedDiffusersAttentionFunction(Function): @staticmethod def forward(ctx, input, context, input_mask, config, attn_qkvw, attn_qw, attn_kw, attn_vw, attn_qkvb, num_attention_heads_per_partition, norm_factor, hidden_size_per_partition, attn_ow, attn_ob, - do_out_bias, score_context_func, linear_func, triton_flash_attn_kernel, rope_theta): + do_out_bias, score_context_func, linear_func, pad_transform_func, triton_flash_attn_kernel, + rope_theta): def _transpose_for_context(x): x = x.permute(0, 2, 1, 3) @@ -77,7 +79,7 @@ def selfAttention_fp(input, context, input_mask): query = query.contiguous() key = key.contiguous() value = value.contiguous() - query, key, value = inference_module.pad_transform_fp16(query, key, value, config.heads, do_flash_attn) + query, key, value = pad_transform_func(query, key, value, config.heads, do_flash_attn) attention_scores = (torch.matmul(query, key.transpose(-1, -2)) * scale).softmax(dim=-1) context_layer = _transpose_for_context(torch.matmul(attention_scores, value)) @@ -117,10 +119,6 @@ def __init__( data_type = self.config.dtype data_type_fp = torch.half if self.config.dtype == torch.int8 else self.config.dtype - global inference_module - if inference_module is None: - builder = InferenceBuilder() - inference_module = builder.load() if DeepSpeedDiffusersAttention.layer_id == 1: log_dist(f"DeepSpeed-Attention config: {self.config.__dict__}", [0]) @@ -171,26 +169,24 @@ def __init__( self.norm_factor *= math.sqrt(self.config.layer_id + 1) # https://github.com/huggingface/transformers/blob/v4.24.0/src/transformers/models/gpt2/modeling_gpt2.py#L191 - if self.config.dtype in [torch.float16, torch.int8]: - self.score_context_func = inference_module.softmax_context_fp16 - self.linear_func = inference_module.linear_layer_fp16 - self.allocate_workspace = inference_module.allocate_workspace_fp16 - else: - self.score_context_func = inference_module.softmax_context_fp32 - self.linear_func = inference_module.linear_layer_fp32 - self.allocate_workspace = inference_module.allocate_workspace_fp32 + self.workspace = WorkspaceOp(self.config) + self.score_context_func = SoftmaxContextOp(self.config) + self.linear_func = LinearOp(self.config) + self.pad_transform_func = PadTransformOp(self.config) - def forward(self, input, context=None, input_mask=None): + def allocate_workspace(self, size): + # Allocate memory only on first layer forward if self.config.layer_id == 0: - self.allocate_workspace(self.config.hidden_size, self.config.heads, - input.size()[1], - input.size()[0], DeepSpeedDiffusersAttention.layer_id, self.config.mp_size, False, - 0, self.config.max_out_tokens, self.config.min_out_tokens) - output = DeepSpeedDiffusersAttentionFunction.apply(input, context, input_mask, self.config, self.attn_qkvw, - self.attn_qw, self.attn_kw, self.attn_vw, self.attn_qkvb, - self.num_attention_heads_per_partition, self.norm_factor, - self.hidden_size_per_partition, self.attn_ow, self.attn_ob, - self.do_out_bias, self.score_context_func, self.linear_func, - self.triton_flash_attn_kernel, self.config.rope_theta) + self.workspace.allocate_workspace(self.config.hidden_size, self.config.heads, size[1], size[0], + DeepSpeedDiffusersAttention.layer_id, self.config.mp_size, False, 0, + self.config.max_out_tokens, self.config.min_out_tokens) + + def forward(self, input, context=None, input_mask=None): + self.allocate_workspace(input.size()) + output = DeepSpeedDiffusersAttentionFunction.apply( + input, context, input_mask, self.config, self.attn_qkvw, self.attn_qw, self.attn_kw, self.attn_vw, + self.attn_qkvb, self.num_attention_heads_per_partition, self.norm_factor, self.hidden_size_per_partition, + self.attn_ow, self.attn_ob, self.do_out_bias, self.score_context_func, self.linear_func, + self.pad_transform_func, self.triton_flash_attn_kernel, self.config.rope_theta) return output diff --git a/deepspeed/ops/transformer/inference/diffusers_transformer_block.py b/deepspeed/ops/transformer/inference/diffusers_transformer_block.py index b0156f905a06..d01638f36e40 100644 --- a/deepspeed/ops/transformer/inference/diffusers_transformer_block.py +++ b/deepspeed/ops/transformer/inference/diffusers_transformer_block.py @@ -10,26 +10,9 @@ from .diffusers_attention import DeepSpeedDiffusersAttention from .bias_add import nhwc_bias_add from .diffusers_2d_transformer import Diffusers2DTransformerConfig -from deepspeed.ops.op_builder import InferenceBuilder, SpatialInferenceBuilder from deepspeed.utils.types import ActivationFuncType - -# Ops will be loaded on demand -transformer_cuda_module = None -spatial_cuda_module = None - - -def load_transformer_module(): - global transformer_cuda_module - if transformer_cuda_module is None: - transformer_cuda_module = InferenceBuilder().load() - return transformer_cuda_module - - -def load_spatial_module(): - global spatial_cuda_module - if spatial_cuda_module is None: - spatial_cuda_module = SpatialInferenceBuilder().load() - return spatial_cuda_module +from .op_binding.gated_activation import GatedActivationOp +from .op_binding.layer_norm import LayerNormOp class DeepSpeedDiffusersTransformerBlock(nn.Module): @@ -76,8 +59,8 @@ def __init__(self, equivalent_module: nn.Module, config: Diffusers2DTransformerC else: self.attn_2_bias = nn.Paramaeter(torch.zeros_like(self.norm3_g), requires_grad=False) - self.transformer_cuda_module = load_transformer_module() - load_spatial_module() + self.gated_activation = GatedActivationOp() + self.layer_norm = LayerNormOp() def forward(self, hidden_states, context=None, timestep=None, **kwargs): # In v0.12.0 of diffuser, several new kwargs were added. Capturing @@ -88,17 +71,17 @@ def forward(self, hidden_states, context=None, timestep=None, **kwargs): if "encoder_hidden_states" in kwargs and kwargs["encoder_hidden_states"] is not None: context = kwargs["encoder_hidden_states"] - out_norm_1 = self.transformer_cuda_module.layer_norm(hidden_states, self.norm1_g, self.norm1_b, self.norm1_eps) + out_norm_1 = self.layer_norm(hidden_states, self.norm1_g, self.norm1_b, self.norm1_eps) out_attn_1 = self.attn_1(out_norm_1) - out_norm_2, out_attn_1 = self.transformer_cuda_module.layer_norm_residual_store_pre_ln_res( + out_norm_2, out_attn_1 = self.layer_norm.layer_norm_residual_store_pre_ln_res( out_attn_1, self.attn_1_bias, hidden_states, self.norm2_g, self.norm2_b, self.norm2_eps) out_attn_2 = self.attn_2(out_norm_2, context=context) - out_norm_3, out_attn_2 = self.transformer_cuda_module.layer_norm_residual_store_pre_ln_res( + out_norm_3, out_attn_2 = self.layer_norm.layer_norm_residual_store_pre_ln_res( out_attn_2, self.attn_2_bias, out_attn_1, self.norm3_g, self.norm3_b, self.norm3_eps) out_ff1 = nn.functional.linear(out_norm_3, self.ff1_w) - out_geglu = self.transformer_cuda_module.gated_activation(out_ff1, self.ff1_b, ActivationFuncType.GATED_GELU) + out_geglu = self.gated_activation(out_ff1, self.ff1_b, ActivationFuncType.GATED_GELU) out_ff2 = nn.functional.linear(out_geglu, self.ff2_w) return nhwc_bias_add(out_ff2, self.ff2_b, other=out_attn_2) diff --git a/deepspeed/ops/transformer/inference/ds_attention.py b/deepspeed/ops/transformer/inference/ds_attention.py index ffb58175daad..24f710d22494 100644 --- a/deepspeed/ops/transformer/inference/ds_attention.py +++ b/deepspeed/ops/transformer/inference/ds_attention.py @@ -89,7 +89,7 @@ def __init__(self, config, mp_group=None, q_scales=None, q_groups=1, merge_count torch.empty(self.hidden_size_per_partition * 3, dtype=data_type_fp, device=device) ] - def compute_attention(self, qkv_out, input_mask, layer_past, alibi): + def compute_attention(self, qkv_out, input_mask, layer_past, alibi, is_prompt, token_idx, position_ids): if isinstance(qkv_out, list) or isinstance(qkv_out, tuple): qkv_out = qkv_out[0] @@ -108,7 +108,10 @@ def compute_attention(self, qkv_out, input_mask, layer_past, alibi): no_masking=no_masking, layer_id=self.config.layer_id, num_layers=DeepSpeedSelfAttention.num_layers, - alibi=alibi) + alibi=alibi, + is_prompt=is_prompt, + token_idx=token_idx, + position_ids=position_ids) context_layer, key_layer, value_layer = attn_key_value return context_layer, key_layer, value_layer @@ -136,7 +139,8 @@ def forward(self, output_attentions=False, norm_w=None, norm_b=None, - alibi=None): + alibi=None, + **kwargs): if self.attn_qkvw is None: self._attn_qkvw, self._attn_qkvb = self._merge_qkv() else: @@ -157,10 +161,17 @@ def forward(self, gamma=norm_w, beta=norm_b) + is_prompt = kwargs.get("first_token", qkv_out[0].shape[1] > 1) + token_idx = kwargs.get("token_idx", None) + position_ids = kwargs.get("position_ids", None) + context_layer, key_layer, value_layer = self.compute_attention(qkv_out=qkv_out, input_mask=input_mask, layer_past=layer_past, - alibi=alibi) + alibi=alibi, + is_prompt=is_prompt, + token_idx=token_idx, + position_ids=position_ids) output = self.vector_matmul_func(input=context_layer, weight=self.attn_ow) inp_norm = qkv_out[-1] @@ -210,7 +221,7 @@ def _split_tensor_along_last_dim(self, tensor, num_partitions, contiguous_split_ return tensor_list - def compute_attention(self, qkv_out, input_mask, layer_past, alibi): + def compute_attention(self, qkv_out, input_mask, layer_past, alibi, is_prompt, token_idx, position_ids): if isinstance(qkv_out, list) or isinstance(qkv_out, tuple): qkv_out = qkv_out[0] diff --git a/deepspeed/ops/transformer/inference/moe_inference.py b/deepspeed/ops/transformer/inference/moe_inference.py index fc001a86d42e..3a9785985d19 100644 --- a/deepspeed/ops/transformer/inference/moe_inference.py +++ b/deepspeed/ops/transformer/inference/moe_inference.py @@ -7,16 +7,16 @@ import math import torch from torch.autograd import Function -# accelerator modules will be imported if needed -inference_module = None -specialized_mode = None import torch.nn as nn from .ds_attention import DeepSpeedSelfAttention from .config import DeepSpeedInferenceConfig +from .op_binding import SoftmaxOp, VectorMatMulOp, GELUGemmOp +from .op_binding.bias_residual import BiasResidualOp +from .op_binding.einsum_sec_sm_ecm import EinsumSecSmEcmOp +from .op_binding.layer_norm import LayerNormOp from ....moe.sharded_moe import TopKGate from deepspeed import comm as dist -from deepspeed.accelerator import get_accelerator -from deepspeed.ops.op_builder import InferenceBuilder +from .op_binding.moe_res_matmul import MoEResMatmulOp class DeepSpeedMoEInferenceConfig(DeepSpeedInferenceConfig): @@ -110,16 +110,13 @@ class DeepSpeedMLPFunction(Function): @staticmethod def forward(ctx, input, inter_w, inter_b, config, output_b, output_w, q_scales, q_groups, merge_count, mp_group, - async_op): + async_op, gelu_gemm_func, vector_matmul_func): if config.q_int8: - intermediate = inference_module.fused_gemm_gelu_int8(input, inter_w, inter_b, config.epsilon, q_scales[2], - (q_groups * (2**merge_count)), config.pre_layer_norm) - output = inference_module.vector_matmul_int8(intermediate, output_w, q_scales[3], q_groups, (merge_count)) + intermediate = gelu_gemm_func(input, inter_w, inter_b, config.epsilon, q_scales[2], + (q_groups * (2**merge_count)), config.pre_layer_norm) + output = vector_matmul_func(intermediate, output_w, q_scales[3], q_groups, (merge_count)) else: - mlp_gemm_func = inference_module.fused_gemm_gelu_fp16 if config.fp16 else \ - inference_module.fused_gemm_gelu_fp32 - - output = mlp_gemm_func(input, inter_w, inter_b, output_w, config.epsilon, config.pre_layer_norm, async_op) + output = gelu_gemm_func(input, inter_w, inter_b, output_w, config.epsilon, config.pre_layer_norm, async_op) if mp_group is not None and dist.get_world_size(group=mp_group) > 1: dist.all_reduce(output, group=mp_group, async_op=async_op) @@ -150,10 +147,13 @@ def __init__(self, config, q_scales=None, q_groups=1, merge_count=1, mlp_extra_g self.q_groups = q_groups * 2 if mlp_extra_grouping else q_groups self.merge_count = int(math.log2(merge_count)) self.mp_group = mp_group + self.gelu_gemm_func = GELUGemmOp(self.config) + self.vector_matmul_func = VectorMatMulOp(self.config) def forward(self, input, async_op=False): return DeepSpeedMLPFunction.apply(input, self.inter_w, self.inter_b, self.config, self.output_b, self.output_w, - self.q_scales, self.q_groups, self.merge_count, self.mp_group, async_op) + self.q_scales, self.q_groups, self.merge_count, self.mp_group, async_op, + self.gelu_gemm_func, self.vector_matmul_func) class DeepSpeedMoEInference(nn.Module): @@ -187,18 +187,7 @@ def __init__(self, self.config = config self.config.layer_id = DeepSpeedMoEInference.layer_id - global inference_module - global specialized_mode - if inference_module is None: - specialized_mode = False - # InferenceSpecializedBuilder is not among DeepSpeed provided builder yet, so we infer by builder name string - builder = get_accelerator().create_op_builder("InferenceSpecializedBuilder") - if builder is not None and builder.is_compatible(): - inference_module = builder.load() - specialized_mode = True - else: - inference_module = InferenceBuilder().load() - self.config.specialized_mode = specialized_mode + assert self.config.dtype != torch.bfloat16, "DeepSpeed MoE Transformer Inference not yet tested for bfloat support" DeepSpeedMoEInference.layer_id += 1 @@ -213,10 +202,8 @@ def __init__(self, self.res_mlp = DeepSpeedMoEMLP(config, quantize_scales, quantize_groups, merge_count, mlp_extra_grouping, mp_group) self.res_coef = nn.Parameter(torch.Tensor(self.config.hidden_size, 2)) - self.coef_func = inference_module.softmax_fp16 if self.config.dtype in [torch.float16, torch.int8] else \ - inference_module.softmax_fp32 - self.vector_matmul_func = inference_module.vector_matmul_fp16 if self.config.dtype == torch.float16 else \ - inference_module.vector_matmul_fp32 + self.coef_func = SoftmaxOp(self.config) + self.vector_matmul_func = VectorMatMulOp(self.config) config.mp_size = 1 self.mlp = nn.ModuleList( @@ -234,12 +221,10 @@ def __init__(self, print("DeepSpeed MoE Transformer Inference config is ", self.config.__dict__) - self.bias_residual_func = inference_module.bias_residual_fp16 if self.config.dtype in [torch.float16, torch.int8] else \ - inference_module.bias_residual_fp32 - self.ds_layernorm = inference_module.layer_norm_fp16 if self.config.dtype in [torch.float16, torch.int8] else \ - inference_module.layer_norm_fp32 - self.einsum_sec_sm_ecm = inference_module.einsum_sec_sm_ecm_fp16 if self.config.dtype in [torch.float16, torch.int8] else \ - inference_module.einsum_sec_sm_ecm_fp32 + self.bias_residual_func = BiasResidualOp(self.config) + self.ds_layernorm = LayerNormOp(self.config) + self.einsum_sec_sm_ecm = EinsumSecSmEcmOp(self.config) + self.moe_res_matmul = MoEResMatmulOp(self.config) def res_coef_func(self, inp, async_op): inp = self.vector_matmul_func(inp, self.res_coef, async_op) @@ -346,7 +331,7 @@ def forward(self, dim=0)[dist.get_rank(group=self.expert_mp_group)] if self.config.mlp_type == 'residual': - inference_module.moe_res_matmul(res_mlp_out, res_coef_out, output) + self.moe_res_matmul(res_mlp_out, res_coef_out, output) output = self.bias_residual_func(output, residual_add, torch.empty(1)) diff --git a/deepspeed/ops/transformer/inference/op_binding/bias_add.py b/deepspeed/ops/transformer/inference/op_binding/bias_add.py new file mode 100644 index 000000000000..d2ae38f546eb --- /dev/null +++ b/deepspeed/ops/transformer/inference/op_binding/bias_add.py @@ -0,0 +1,31 @@ +# Copyright (c) Microsoft Corporation. +# SPDX-License-Identifier: Apache-2.0 + +# DeepSpeed Team + +import torch +from ..config import DeepSpeedInferenceConfig +from .base import BaseOp + + +class BiasAddOp(BaseOp): + + def __init__(self, config: DeepSpeedInferenceConfig): + super(BiasAddOp, self).__init__(config) + + try: + if self.config.dtype == torch.float16: + self.bias_add_func = self.inference_module.bias_add_fp16 + elif self.config.dtype == torch.bfloat16: + self.bias_add_func = self.inference_module.bias_add_bf16 + else: + self.bias_add_func = self.inference_module.bias_add_fp32 + except AttributeError: + self.bias_add_func = self.bias_add_fallback + + @classmethod + def bias_add_fallback(cls, input, bias): + return torch.add(input, bias) + + def forward(self, activation: torch.Tensor, bias: torch.Tensor): + return self.bias_add_func(activation, bias) diff --git a/deepspeed/ops/transformer/inference/op_binding/bias_gelu.py b/deepspeed/ops/transformer/inference/op_binding/bias_gelu.py new file mode 100644 index 000000000000..f0fee0b0d06e --- /dev/null +++ b/deepspeed/ops/transformer/inference/op_binding/bias_gelu.py @@ -0,0 +1,33 @@ +# Copyright (c) Microsoft Corporation. +# SPDX-License-Identifier: Apache-2.0 + +# DeepSpeed Team + +import torch +import torch.nn.functional as F +from ..config import DeepSpeedInferenceConfig +from .base import BaseOp + + +class BiasGeluOp(BaseOp): + + def __init__(self, config: DeepSpeedInferenceConfig): + super(BiasGeluOp, self).__init__(config) + + try: + if self.config.dtype == torch.float16: + self.bias_gelu_func = self.inference_module.bias_gelu_fp16 + elif self.config.dtype == torch.bfloat16: + self.bias_gelu_func = self.inference_module.bias_gelu_bf16 + else: + self.bias_gelu_func = self.inference_module.bias_gelu_fp32 + except AttributeError: + self.bias_gelu_func = self.bias_gelu_fallback + + @classmethod + def bias_gelu_fallback(cls, activations, bias): + # Expected behavior is that of casting to float32 internally and using the tanh approximation + return F.gelu(activations.to(torch.float32) + bias.to(torch.float32), approximate='tanh').to(activations.dtype) + + def forward(self, activation: torch.Tensor, bias: torch.Tensor): + return self.bias_gelu_func(activation, bias) diff --git a/deepspeed/ops/transformer/inference/op_binding/bias_relu.py b/deepspeed/ops/transformer/inference/op_binding/bias_relu.py new file mode 100644 index 000000000000..ccfade1d9524 --- /dev/null +++ b/deepspeed/ops/transformer/inference/op_binding/bias_relu.py @@ -0,0 +1,33 @@ +# Copyright (c) Microsoft Corporation. +# SPDX-License-Identifier: Apache-2.0 + +# DeepSpeed Team + +import torch +import torch.nn.functional as F +from ..config import DeepSpeedInferenceConfig +from .base import BaseOp + + +class BiasReluOp(BaseOp): + + def __init__(self, config: DeepSpeedInferenceConfig): + super(BiasReluOp, self).__init__(config) + + try: + if self.config.dtype == torch.float16: + self.bias_relu_func = self.inference_module.bias_relu_fp16 + elif self.config.dtype == torch.bfloat16: + self.bias_relu_func = self.inference_module.bias_relu_bf16 + else: + self.bias_relu_func = self.inference_module.bias_relu_fp32 + except AttributeError: + self.bias_relu_func = self.bias_relu_fallback + + @classmethod + def bias_relu_fallback(cls, activations, bias): + # Expected behavior is that of casting to float32 internally + return F.relu(activations.to(torch.float32) + bias.to(torch.float32)).to(activations.dtype) + + def forward(self, activation: torch.Tensor, bias: torch.Tensor): + return self.bias_relu_func(activation, bias) diff --git a/deepspeed/ops/transformer/inference/op_binding/bias_residual.py b/deepspeed/ops/transformer/inference/op_binding/bias_residual.py new file mode 100644 index 000000000000..ecad50e10ffe --- /dev/null +++ b/deepspeed/ops/transformer/inference/op_binding/bias_residual.py @@ -0,0 +1,29 @@ +# Copyright (c) Microsoft Corporation. +# SPDX-License-Identifier: Apache-2.0 + +# DeepSpeed Team + +import torch +from ..config import DeepSpeedInferenceConfig +from .base import BaseOp + + +class BiasResidualOp(BaseOp): + + def __init__(self, config: DeepSpeedInferenceConfig): + super(BiasResidualOp, self).__init__(config) + + try: + if self.config.dtype in [torch.float16, torch.int8]: + self.bias_residual_func = self.inference_module.bias_residual_fp16 + else: + self.bias_residual_func = self.inference_module.bias_residual_fp32 + except AttributeError: + self.bias_residual_func = self.bias_residual_fallback + + @classmethod + def bias_residual_fallback(cls, output, residual, bias): + raise NotImplementedError("bias residual fallback isn't implemented") + + def forward(self, output, residual, bias): + return self.bias_residual_func(output, residual, bias) diff --git a/deepspeed/ops/transformer/inference/op_binding/einsum_sec_sm_ecm.py b/deepspeed/ops/transformer/inference/op_binding/einsum_sec_sm_ecm.py new file mode 100644 index 000000000000..f34b10f786d1 --- /dev/null +++ b/deepspeed/ops/transformer/inference/op_binding/einsum_sec_sm_ecm.py @@ -0,0 +1,29 @@ +# Copyright (c) Microsoft Corporation. +# SPDX-License-Identifier: Apache-2.0 + +# DeepSpeed Team + +import torch +from ..config import DeepSpeedInferenceConfig +from .base import BaseOp + + +class EinsumSecSmEcmOp(BaseOp): + + def __init__(self, config: DeepSpeedInferenceConfig): + super(EinsumSecSmEcmOp, self).__init__(config) + + try: + if self.config.dtype in [torch.float16, torch.int8]: + self.einsum_sec_sm_ecm_func = self.inference_module.einsum_sec_sm_ecm_fp16 + else: + self.einsum_sec_sm_ecm_func = self.inference_module.einsum_sec_sm_ecm_fp32 + except AttributeError: + self.einsum_sec_sm_ecm_func = self.einsum_sec_sm_ecm_fallback + + @classmethod + def einsum_sec_sm_ecm_fallback(cls, Q, W): + raise NotImplementedError("einsum sec sm ecm fallback isn't implemented") + + def forward(self, Q, W): + return self.einsum_sec_sm_ecm_func(Q, W) diff --git a/deepspeed/ops/transformer/inference/op_binding/gated_activation.py b/deepspeed/ops/transformer/inference/op_binding/gated_activation.py new file mode 100644 index 000000000000..d28d818ce4b3 --- /dev/null +++ b/deepspeed/ops/transformer/inference/op_binding/gated_activation.py @@ -0,0 +1,40 @@ +# Copyright (c) Microsoft Corporation. +# SPDX-License-Identifier: Apache-2.0 + +# DeepSpeed Team + +import torch +import torch.nn.functional as F +from deepspeed.utils.types import ActivationFuncType +from ..config import DeepSpeedInferenceConfig +from .base import BaseOp + + +class GatedActivationOp(BaseOp): + + def __init__(self, config: DeepSpeedInferenceConfig = None): + if config is None: + config = DeepSpeedInferenceConfig() + super(GatedActivationOp, self).__init__(config) + try: + self.gated_activation_func = self.inference_module.gated_activation + except AttributeError: + self.gated_activation_func = self.gated_activation_fallback + + @classmethod + def gated_activation_fallback(cls, activation, bias, activation_func_type): + # Expected behavior is that of casting to float32 internally + # Explicitly using the default GeLU + activation_func = None + activations = activation + bias.reshape(1, 1, -1) + hidden_states, gate = activations.chunk(2, dim=-1) + + if activation_func_type == ActivationFuncType.GATED_SILU: + activation_func = F.silu + elif activation_func_type == ActivationFuncType.GATED_GELU: + activation_func = F.gelu + + return hidden_states * activation_func(gate.to(torch.float32)).to(activations.dtype) + + def forward(self, activation: torch.Tensor, bias: torch.Tensor, activation_func_type: ActivationFuncType): + return self.gated_activation_func(activation, bias, activation_func_type) diff --git a/deepspeed/ops/transformer/inference/op_binding/gelu_gemm.py b/deepspeed/ops/transformer/inference/op_binding/gelu_gemm.py index 63323c150752..60bbb4b48bdb 100644 --- a/deepspeed/ops/transformer/inference/op_binding/gelu_gemm.py +++ b/deepspeed/ops/transformer/inference/op_binding/gelu_gemm.py @@ -4,6 +4,7 @@ # DeepSpeed Team import torch +import torch.nn.functional as F from ..config import DeepSpeedInferenceConfig from .base import BaseOp import deepspeed @@ -14,7 +15,9 @@ class GELUGemmOp(BaseOp): def __init__(self, config: DeepSpeedInferenceConfig): super(GELUGemmOp, self).__init__(config) try: - if self.config.dtype in [torch.float16, torch.int8]: + if self.config.dtype == torch.int8: + self.fused_gemm_gelu = self.inference_module.fused_gemm_gelu_int8 + elif self.config.dtype == torch.float16: if deepspeed.HAS_TRITON and self.config.use_triton and self.config.dtype == torch.float16: from deepspeed.ops.transformer.inference.triton.ops import fused_gemm_gelu as _triton_fused_gemm_gelu self.fused_gemm_gelu = _triton_fused_gemm_gelu # type: ignore @@ -28,7 +31,11 @@ def __init__(self, config: DeepSpeedInferenceConfig): self.fused_gemm_gelu = self.gelu_gemm_fallback def gelu_gemm_fallback(self, input, weight, scale, bias, out, out_scale, dtype, transpose): - raise NotImplementedError + tmp = torch.matmul(input, weight) + tmp = F.gelu(tmp.to(torch.float32) + bias.to(torch.float32), approximate="tanh").to(tmp.dtype) + output = torch.matmul(tmp, out) + + return output def forward(self, input: torch.Tensor, weight: torch.Tensor, bias: torch.Tensor, weight_out: torch.Tensor): diff --git a/deepspeed/ops/transformer/inference/op_binding/layer_norm.py b/deepspeed/ops/transformer/inference/op_binding/layer_norm.py new file mode 100644 index 000000000000..31219a58ac3c --- /dev/null +++ b/deepspeed/ops/transformer/inference/op_binding/layer_norm.py @@ -0,0 +1,60 @@ +# Copyright (c) Microsoft Corporation. +# SPDX-License-Identifier: Apache-2.0 + +# DeepSpeed Team + +import torch +import torch.nn.functional as F +from ..config import DeepSpeedInferenceConfig +from .base import BaseOp + + +class LayerNormOp(BaseOp): + + def __init__(self, config: DeepSpeedInferenceConfig = None): + super(LayerNormOp, self).__init__(config) + try: + if config is None: + self.layer_norm_func = self.inference_module.layer_norm + elif self.config.dtype in [torch.float16, torch.int8]: + self.layer_norm_func = self.inference_module.layer_norm_fp16 + else: + self.layer_norm_func = self.inference_module.layer_norm_fp32 + except AttributeError: + self.layer_norm_func = self.layer_norm_fallback + + @classmethod + def layer_norm_residual(cls, vals, bias, res, gamma, beta, epsilon): + channels = gamma.shape[0] + dtype = gamma.dtype + vals_f = vals.to(torch.float32) + bias_f = bias.to(torch.float32).reshape(1, 1, -1) + res_f = res.to(torch.float32) + gamma_f = gamma.to(torch.float32) + beta_f = beta.to(torch.float32) + return F.layer_norm(vals_f + bias_f + res_f, (channels, ), weight=gamma_f, bias=beta_f, eps=epsilon).to(dtype) + + @classmethod + def layer_norm_residual_store_pre_ln_res(cls, vals, bias, res, gamma, beta, epsilon): + channels = gamma.shape[0] + dtype = gamma.dtype + vals_f = vals.to(torch.float32) + bias_f = bias.to(torch.float32).reshape(1, 1, -1) + res_f = res.to(torch.float32) + gamma_f = gamma.to(torch.float32) + beta_f = beta.to(torch.float32) + res_output = vals_f + bias_f + res_f + norm_output = F.layer_norm(res_output, (channels, ), weight=gamma_f, bias=beta_f, eps=epsilon).to(dtype) + return norm_output, res_output.to(dtype) + + @classmethod + def layer_norm_fallback(cls, vals, gamma, beta, epsilon): + channels = gamma.shape[0] + dtype = gamma.dtype + vals_f = vals.to(torch.float32) + gamma_f = gamma.to(torch.float32) + beta_f = beta.to(torch.float32) + return F.layer_norm(vals_f, (channels, ), weight=gamma_f, bias=beta_f, eps=epsilon).to(dtype) + + def forward(self, vals, gamma, beta, epsilon): + return self.layer_norm_func(vals, gamma, beta, epsilon) diff --git a/deepspeed/ops/transformer/inference/op_binding/mlp_gemm.py b/deepspeed/ops/transformer/inference/op_binding/mlp_gemm.py index 3064c00d1755..5f1f915ec021 100644 --- a/deepspeed/ops/transformer/inference/op_binding/mlp_gemm.py +++ b/deepspeed/ops/transformer/inference/op_binding/mlp_gemm.py @@ -5,12 +5,12 @@ from typing import Optional -import os import torch import torch.nn.functional as F from ..config import DeepSpeedInferenceConfig from .base import BaseOp from deepspeed.utils.types import NormType +from .pre_rms_norm import PreRMSNormOp class MLPGemmOp(BaseOp): @@ -39,23 +39,45 @@ def __init__(self, config: DeepSpeedInferenceConfig): self.mlp_gemm_func = self.mlp_gemm_fallback elif self.config.norm_type == NormType.RMSNorm: self.mlp_gemm_func = self.rms_mlp_gemm_fallback + self.pre_rms_norm = PreRMSNormOp() def mlp_gemm_fallback(self, input, residual, input_bias, weight_interm, weight_out, bias, gamma, beta, eps, pre_layer_norm, mlp_after_attn, interm_scale, out_scale, dtype, mlp_act_func_type, transpose): - if os.environ.get('DS_KI_FALLBACK') == 'True' and mlp_after_attn and not transpose: - residual_add = F.layer_norm(input + residual + input_bias, (input.shape[2], ), gamma, beta, - self.config.epsilon) - tmp = torch.matmul(residual_add, weight_interm) + if mlp_after_attn: + residual_add = F.layer_norm(input + residual + input_bias, (input.shape[2], ), gamma, beta, eps) + tmp = torch.matmul(residual_add, weight_interm.t() if transpose else weight_interm) tmp = F.gelu(tmp + bias) - output = torch.matmul(tmp, weight_out) - return (output, residual_add) + output = torch.matmul(tmp, weight_out.t() if transpose else weight_out) + + return output, residual_add else: raise NotImplementedError def rms_mlp_gemm_fallback(self, input, residual, weight_interm, weight_out, gamma, eps, interm_scale, out_scale, dtype, mlp_act_func_type, transpose): - raise NotImplementedError + inp_norm, residual = self.pre_rms_norm(input, residual, gamma, eps) + tmp = torch.matmul(inp_norm.view([-1, inp_norm.size(2)]), weight_interm.t() if transpose else weight_interm) + up_proj, gate_proj = tmp.chunk(2, dim=1) + + from deepspeed.utils.types import ActivationFuncType + if mlp_act_func_type == ActivationFuncType.GELU: + intermediate = F.gelu(gate_proj) + elif mlp_act_func_type == ActivationFuncType.ReLU: + intermediate = F.relu(gate_proj) + elif mlp_act_func_type == ActivationFuncType.GATED_GELU: + intermediate = F.gelu(gate_proj) + elif mlp_act_func_type == ActivationFuncType.GATED_SILU: + intermediate = F.silu(gate_proj) + else: + raise f"rms_mlp_gemm_fallback not implemented for activation type {mlp_act_func_type}" + + intermediate = intermediate * up_proj + + output = torch.matmul(intermediate, weight_out.t() if transpose else weight_out) + output = output.view([input.size(0), input.size(1), -1]) + + return [output, residual] def forward(self, input: torch.Tensor, diff --git a/deepspeed/ops/transformer/inference/op_binding/moe_res_matmul.py b/deepspeed/ops/transformer/inference/op_binding/moe_res_matmul.py new file mode 100644 index 000000000000..ef3558c8bc88 --- /dev/null +++ b/deepspeed/ops/transformer/inference/op_binding/moe_res_matmul.py @@ -0,0 +1,29 @@ +# Copyright (c) Microsoft Corporation. +# SPDX-License-Identifier: Apache-2.0 + +# DeepSpeed Team + +import torch +from ..config import DeepSpeedInferenceConfig +from .base import BaseOp + + +class MoEResMatmulOp(BaseOp): + + def __init__(self, config: DeepSpeedInferenceConfig = None): + if config is None: + config = DeepSpeedInferenceConfig() + super(MoEResMatmulOp, self).__init__(config) + try: + self.moe_res_matmul_func = self.inference_module.moe_res_matmul + except AttributeError: + self.moe_res_matmul_func = self.moe_res_matmul_fallback + + @classmethod + def moe_res_matmul_fallback(cls, residual, coef, output): + coef_t = coef.transpose(1, 2).contiguous() + coef1, coef2 = torch.split(coef_t, split_size_or_sections=coef_t.shape[len(coef_t.shape) - 1] // 2, dim=-1) + return residual * coef1 + output * coef2 + + def forward(self, residual, coef, output): + return self.moe_res_matmul_func(residual, coef, output) diff --git a/deepspeed/ops/transformer/inference/op_binding/pad_transform.py b/deepspeed/ops/transformer/inference/op_binding/pad_transform.py new file mode 100644 index 000000000000..876fefc3bcfb --- /dev/null +++ b/deepspeed/ops/transformer/inference/op_binding/pad_transform.py @@ -0,0 +1,26 @@ +# Copyright (c) Microsoft Corporation. +# SPDX-License-Identifier: Apache-2.0 + +# DeepSpeed Team + +from ..config import DeepSpeedInferenceConfig +from .base import BaseOp + + +class PadTransformOp(BaseOp): + + def __init__(self, config: DeepSpeedInferenceConfig = None): + if config is None: + config = DeepSpeedInferenceConfig() + super(PadTransformOp, self).__init__(config) + try: + self.pad_transform_func = self.inference_module.pad_transform_fp16 + except AttributeError: + self.pad_transform_func = self.pad_transform_fallback + + @staticmethod + def pad_transform_fallback(query, key, value, heads, do_flash_attn): + raise NotImplementedError("pad_transform fallback is not implemented.") + + def forward(self, query, key, value, heads, do_flash_attn): + return self.pad_transform_func(query, key, value, heads, do_flash_attn) diff --git a/deepspeed/ops/transformer/inference/op_binding/pre_rms_norm.py b/deepspeed/ops/transformer/inference/op_binding/pre_rms_norm.py new file mode 100644 index 000000000000..7969d20f0527 --- /dev/null +++ b/deepspeed/ops/transformer/inference/op_binding/pre_rms_norm.py @@ -0,0 +1,31 @@ +# Copyright (c) Microsoft Corporation. +# SPDX-License-Identifier: Apache-2.0 + +# DeepSpeed Team + +import torch +from ..config import DeepSpeedInferenceConfig +from .base import BaseOp +from .rms_norm import RMSNormOp + + +class PreRMSNormOp(BaseOp): + + def __init__(self, config: DeepSpeedInferenceConfig = None): + if config is None: + config = DeepSpeedInferenceConfig() + super(PreRMSNormOp, self).__init__(config) + try: + self.pre_rms_norm_func = self.inference_module.pre_rms_norm + except AttributeError: + self.pre_rms_norm_func = self.pre_rms_norm_fallback + + @staticmethod + def pre_rms_norm_fallback(vals, residual, gamma, epsilon): + residual = vals.to(torch.float32) + residual.to(torch.float32) + vals = residual + + return RMSNormOp.rms_norm_fallback(vals, gamma, epsilon), residual.to(gamma.dtype) + + def forward(self, vals, residual, gamma, epsilon): + return self.pre_rms_norm_func(vals, residual, gamma, epsilon) diff --git a/deepspeed/ops/transformer/inference/op_binding/qkv_gemm.py b/deepspeed/ops/transformer/inference/op_binding/qkv_gemm.py index 250bf9864e1e..9ff5366fae5d 100644 --- a/deepspeed/ops/transformer/inference/op_binding/qkv_gemm.py +++ b/deepspeed/ops/transformer/inference/op_binding/qkv_gemm.py @@ -3,11 +3,11 @@ # DeepSpeed Team -import os import torch import torch.nn.functional as F from ..config import DeepSpeedInferenceConfig from .base import BaseOp +from .rms_norm import RMSNormOp import deepspeed from deepspeed.utils.types import NormType @@ -56,19 +56,23 @@ def _triton_autotune(min_seqlen, max_seqlen, hidden_size, dtype=torch.float16): matmul(A, B) Fp16Matmul._update_autotune_table() - def qkv_gemm_fallback(self, input, weight, q_scale, bias, gamma, beta, eps, add_bias, q_int8, transpose): - if os.environ.get('DS_KI_FALLBACK') == 'True' and not transpose: - inp_norm = F.layer_norm(input, (input.shape[2], ), gamma, beta, eps) - tmp = torch.matmul(inp_norm, weight) - if add_bias: - tmp += bias - output = [tmp, inp_norm] - return output - else: - raise NotImplementedError + @staticmethod + def qkv_gemm_fallback(input, weight, q_scale, bias, gamma, beta, eps, add_bias, q_int8, transpose): + inp_norm = F.layer_norm(input, (input.shape[2], ), gamma, beta, eps) + tmp = torch.matmul(inp_norm, weight.t() if transpose else weight) + if add_bias: + tmp += bias + output = [tmp, inp_norm] + + return output + + @staticmethod + def rms_qkv_gemm_fallback(input, weight, q_scale, gamma, eps, q_int8, transpose): + inp_norm = RMSNormOp.rms_norm_fallback(input, gamma, eps) + tmp = torch.matmul(inp_norm, weight.t() if transpose else weight) + output = [tmp, inp_norm] - def rms_qkv_gemm_fallback(self, input, weight, q_scale, gamma, eps, q_int8, transpose): - raise NotImplementedError + return output def forward(self, input: torch.Tensor, weight: torch.Tensor, bias: torch.Tensor, gamma: torch.Tensor, beta: torch.Tensor): diff --git a/deepspeed/ops/transformer/inference/op_binding/residual_add.py b/deepspeed/ops/transformer/inference/op_binding/residual_add.py index 6f9b35cbc05d..93b229c5d1ac 100644 --- a/deepspeed/ops/transformer/inference/op_binding/residual_add.py +++ b/deepspeed/ops/transformer/inference/op_binding/residual_add.py @@ -3,9 +3,10 @@ # DeepSpeed Team -import os import torch from typing import Optional + +from .vector_add import VectorAddOp from ..config import DeepSpeedInferenceConfig from .base import BaseOp @@ -22,11 +23,32 @@ def __init__(self, config: DeepSpeedInferenceConfig): else: self.residual_add_func = self.inference_module.residual_add_bias_fp32 except AttributeError: - self.residual_add_func = None - try: - self._vector_add = self.inference_module._vector_add - except AttributeError: - self._vector_add = None + self.residual_add_func = self.residual_add_fallback + self.vector_add = VectorAddOp() + + @staticmethod + def res_add_bias(hidden_state, residual, attn_output, attn_bias, final_bias, add_attn_bias, mp_size): + hidden_state += attn_output + (residual + final_bias) / mp_size + if add_attn_bias: + hidden_state += attn_bias / mp_size + + return hidden_state + + @staticmethod + def residual_add_fallback(hidden_state, residual, attention_output, attention_bias, final_bias, mp_size, + mlp_after_attn, add_bias, pre_layer_norm): + if mlp_after_attn: + if pre_layer_norm: + tmp = (residual.float() + attention_output.float() + attention_bias.float() + + final_bias.float()) / mp_size + hidden_state.float() + else: + tmp = residual.float() + hidden_state.float() + final_bias.float() + else: + tmp = ResidualAddOp.res_add_bias(hidden_state, residual, attention_output, attention_bias, final_bias, + add_bias, mp_size) + residual.copy_(tmp.to(hidden_state.dtype)) + + return residual def forward(self, hidden_state: torch.Tensor, @@ -37,28 +59,15 @@ def forward(self, attention_bias: Optional[torch.Tensor] = None, final_bias: Optional[torch.Tensor] = None): - if self.residual_add_func is not None: - if final_bias is None: - residual = self._vector_add(residual, hidden_state, 1.0 / self.config.mp_size) - else: - if not self.config.pre_layer_norm and residual_add is not None: - # only use residual add if its set and we are not pre layer norm - residual = residual_add - - self.residual_add_func(hidden_state, residual, attention_output, attention_bias, final_bias, - self.config.mp_size, self.config.mlp_after_attn, add_bias, - self.config.pre_layer_norm) + if final_bias is None and attention_bias is None: + residual = self.vector_add(residual + attention_output, hidden_state, 1.0 / self.config.mp_size) else: - # fallback - if os.environ.get('DS_KI_FALLBACK') == 'True' and self.config.mlp_after_attn: - if self.config.pre_layer_norm: - tmp = (residual.float() + attention_output.float() + attention_bias.float() + - final_bias.float()) / self.config.mp_size + hidden_state.float() - else: - tmp = residual.float() + hidden_state.float() + final_bias.float() + if not self.config.pre_layer_norm and residual_add is not None: + # only use residual add if its set and we are not pre layer norm + residual = residual_add + + self.residual_add_func(hidden_state, residual, attention_output, attention_bias, final_bias, + self.config.mp_size, self.config.mlp_after_attn, add_bias, + self.config.pre_layer_norm) - input_dtype = hidden_state.dtype - residual = tmp.to(input_dtype) - else: - raise NotImplementedError return residual diff --git a/deepspeed/ops/transformer/inference/op_binding/rms_norm.py b/deepspeed/ops/transformer/inference/op_binding/rms_norm.py new file mode 100644 index 000000000000..128883ce5d43 --- /dev/null +++ b/deepspeed/ops/transformer/inference/op_binding/rms_norm.py @@ -0,0 +1,33 @@ +# Copyright (c) Microsoft Corporation. +# SPDX-License-Identifier: Apache-2.0 + +# DeepSpeed Team + +import torch +from ..config import DeepSpeedInferenceConfig +from .base import BaseOp + + +class RMSNormOp(BaseOp): + + def __init__(self, config: DeepSpeedInferenceConfig = None): + if config is None: + config = DeepSpeedInferenceConfig() + super(RMSNormOp, self).__init__(config) + try: + self.rms_norm_func = self.inference_module.rms_norm + except AttributeError: + self.rms_norm_func = self.rms_norm_fallback + + @staticmethod + def rms_norm_fallback(vals, gamma, epsilon): + variance = vals.to(torch.float32).pow(2).mean(-1, keepdim=True) + vals = vals * torch.rsqrt(variance + epsilon) + + if gamma.dtype in [torch.float16, torch.bfloat16]: + vals = vals.to(gamma.dtype) + + return gamma * vals + + def forward(self, vals, gamma, epsilon): + return self.rms_norm_func(vals, gamma, epsilon) diff --git a/deepspeed/ops/transformer/inference/op_binding/softmax.py b/deepspeed/ops/transformer/inference/op_binding/softmax.py index bc309d94df14..2e08541596fa 100644 --- a/deepspeed/ops/transformer/inference/op_binding/softmax.py +++ b/deepspeed/ops/transformer/inference/op_binding/softmax.py @@ -3,11 +3,11 @@ # DeepSpeed Team -import os import torch import torch.nn.functional as F from ..config import DeepSpeedInferenceConfig from .base import BaseOp +from deepspeed.ops.transformer.inference.op_binding.workspace import InferenceContext class SoftmaxOp(BaseOp): @@ -25,24 +25,42 @@ def __init__(self, config: DeepSpeedInferenceConfig): except AttributeError: self.softmax_func = self.softmax_fallback - def softmax_fallback(self, attn_scores, attn_mask, alibi, triangular, recompute, local_attention, window_size, - async_op, layer_scale, head_offset, mp_size): - if os.environ.get('DS_KI_FALLBACK') == 'True': - alibi = alibi[head_offset:head_offset + self.num_attention_heads_per_partition] - input_dtype = attn_scores.dtype - if (triangular): - tri = ~torch.tril(torch.ones(attn_scores.size(), device=attn_scores.device)).to(bool) - attn_scores = torch.masked_fill(attn_scores * layer_scale, tri, torch.finfo(input_dtype).min) - if alibi is not None: - attn_scores += alibi - if attn_mask is not None: - # expand atten_mask from two dim into 4 dim, insert two dims in the middle + @staticmethod + def softmax_fallback(attn_scores, attn_mask, alibi, triangular, recompute, local_attention, window_size, async_op, + layer_scale, head_offset, mp_size): + scores_len = len(attn_scores.size()) + heads = 1 + if scores_len > 1: + heads = attn_scores.size()[1] + num_attention_heads_per_partition = heads // mp_size + + if alibi is not None: + if len(alibi.shape) == 1: + alibi = None + else: + alibi = alibi[head_offset:head_offset + num_attention_heads_per_partition] + if attn_mask is not None and len(attn_mask.shape) == 1: + attn_mask = None + input_dtype = attn_scores.dtype + attn_scores *= layer_scale + + if alibi is not None: + attn_scores += alibi + if attn_mask is not None: + # expand atten_mask from two dim into 4 dim, insert two dims in the middle + if len(attn_mask.shape) == 2: attn_mask = attn_mask[:, None, None, :] - attn_scores += attn_mask - output = F.softmax(attn_scores, dim=-1, dtype=torch.float32).to(input_dtype) - return output - else: - raise NotImplementedError + attn_scores += attn_mask + if triangular: + if attn_scores.shape[2] == 1: # query using kv cache + token_idx = InferenceContext.Instance().current_tokens() + tri = torch.arange(attn_scores.shape[2], device=attn_scores.device).ge(token_idx) + else: + tri = ~torch.tril(torch.ones(attn_scores.size(), device=attn_scores.device)).to(bool) + attn_scores = torch.masked_fill(attn_scores, tri, float('-inf')) + output = F.softmax(attn_scores, dim=-1, dtype=torch.float32).to(input_dtype) + + return output def forward(self, attn_scores: torch.Tensor, attn_mask: torch.Tensor, alibi: torch.Tensor, triangular: bool, recompute: bool, local_attention: bool, window_size: int, async_op: bool, layer_scale: float, diff --git a/deepspeed/ops/transformer/inference/op_binding/softmax_context.py b/deepspeed/ops/transformer/inference/op_binding/softmax_context.py index 0dc4e08a3633..d745df678e93 100644 --- a/deepspeed/ops/transformer/inference/op_binding/softmax_context.py +++ b/deepspeed/ops/transformer/inference/op_binding/softmax_context.py @@ -7,6 +7,8 @@ from deepspeed import comm as dist from ..config import DeepSpeedInferenceConfig from .base import BaseOp +from .softmax import SoftmaxOp +from deepspeed.ops.transformer.inference.op_binding.workspace import InferenceContext class SoftmaxContextOp(BaseOp): @@ -23,13 +25,108 @@ def __init__(self, config: DeepSpeedInferenceConfig): except AttributeError: self.softmax_context_func = self.softmax_context_fallback + @staticmethod + def transform4d_0213(x, seq_length): + assert x.dim() == 3, F"Dim {x.dim()} is not supported" + batch_size, num_heads, seq_length_head_dim = x.shape + head_dim = seq_length_head_dim // seq_length + x = x.view(batch_size, num_heads, seq_length, head_dim) + x = x.permute(0, 2, 1, 3) + + return x + + @staticmethod + def repeat_kv(hidden_states: torch.Tensor, n_rep: int) -> torch.Tensor: + batch, num_key_value_heads, slen, head_dim = hidden_states.shape + if n_rep <= 1 or num_key_value_heads == 1: + return hidden_states + + hidden_states = hidden_states[:, :, None, :, :].expand(batch, num_key_value_heads, n_rep, slen, head_dim) + + return hidden_states.reshape(batch, num_key_value_heads * n_rep, slen, head_dim) + + @staticmethod + def bias_add_transform_0213(input, bias, num_heads, trans_count, perform_bias=False): + assert trans_count == 1 or trans_count == 3, F"Trans count {trans_count} is not supported" + assert input.dim() == 3, F"Dim {input.dim()} is not supported" + input_biased = torch.add(input, bias) if perform_bias else input + batch_size, seq_length, value_size = input_biased.shape + hid_dim = value_size // trans_count + head_dim = hid_dim // num_heads + + if trans_count == 1: + query_layer = input.view(batch_size, seq_length, num_heads, head_dim) + query_layer = query_layer.permute(0, 2, 1, 3) + key_layer = torch.zeros_like(query_layer) + value_layer = torch.zeros_like(query_layer) + return query_layer, key_layer, value_layer + + qkv_layers = input.view(batch_size, seq_length, 3, num_heads, head_dim) + query_layer, key_layer, value_layer = qkv_layers[..., 0, :, :], qkv_layers[..., 1, :, :], qkv_layers[..., + 2, :, :] + query_layer = query_layer.transpose(1, 2) + key_layer = key_layer.transpose(1, 2) + value_layer = value_layer.transpose(1, 2) + + return query_layer, key_layer, value_layer + def softmax_context_fallback(self, query_key_value, attn_mask, rotary_dim, rotate_half, rotate_every_two, heads, num_kv, norm_factor, triangular_masking, local_attention, window_size, no_masking, - layer_id, num_layers, alibi, rope_theta): - raise NotImplementedError + layer_id, num_layers, alibi, rope_theta, is_prompt, token_idx, position_ids): + bat_0213_query, bat_0213_key, bat_0213_value = self.bias_add_transform_0213( + query_key_value, None, heads, 3, False) + + if rotary_dim > 0 and rotate_half: + from transformers.models.llama.modeling_llama import apply_rotary_pos_emb + + rotary = InferenceContext.Instance().get_rotary(rotary_dim, rope_theta, bat_0213_value.device) + cos, sin = rotary(bat_0213_value, InferenceContext.Instance().get_max_tokens_num()) + bat_0213_query, bat_0213_key = apply_rotary_pos_emb(bat_0213_query, bat_0213_key, cos, sin, position_ids) + + bat_0213_key, bat_0213_value = InferenceContext.Instance().update_cache(layer_id, token_idx, is_prompt, + bat_0213_key, bat_0213_value) + + bat_0213_key = self.repeat_kv(bat_0213_key, num_kv) + bat_0213_value = self.repeat_kv(bat_0213_value, num_kv) + + bsz = query_key_value.shape[0] + head_dim = query_key_value.shape[2] // (heads * 3) + + bmm_output = torch.bmm(bat_0213_query.reshape(bsz * heads, bat_0213_query.shape[2], head_dim), + bat_0213_key.reshape(bsz * heads, bat_0213_key.shape[2], head_dim).transpose(1, 2)) + + layer_scale = 1.0 + if alibi is not None and len(alibi.shape) > 1: + layer_scale = max(1, layer_id).to(float) + + alpha = norm_factor * norm_factor / layer_scale + bmm_output *= alpha + bmm_output_reshape = bmm_output.reshape(bsz, heads, bmm_output.shape[1], bmm_output.shape[2]) + + recompute = is_prompt + if attn_mask is not None and len(attn_mask.shape) > 1 and attn_mask.shape[-1] < bmm_output_reshape.shape[3]: + attn_mask = torch.nn.functional.pad(attn_mask, (0, bmm_output_reshape.shape[3] - attn_mask.shape[-1]), + value=torch.finfo(attn_mask.dtype).min) + softmax_output = SoftmaxOp.softmax_fallback(bmm_output_reshape, attn_mask, alibi, triangular_masking, + recompute, local_attention, window_size, None, layer_scale, 0, 1) + + output = torch.bmm(softmax_output.reshape(bsz * heads, softmax_output.shape[2], softmax_output.shape[3]), + bat_0213_value.reshape(bsz * heads, bat_0213_value.shape[2], head_dim)) + + output = output.reshape(bsz, heads, output.shape[1], head_dim) + output = output.reshape(bsz, heads, output.shape[2] * head_dim) + input_seq_len = query_key_value.shape[1] + t4d_0123_output = self.transform4d_0213(output, input_seq_len) + t4d_0123_output = t4d_0123_output.reshape(bsz, t4d_0123_output.shape[1], heads * head_dim) + + if layer_id == num_layers - 1: + InferenceContext.Instance().advance_tokens() + + return t4d_0123_output, bat_0213_key, bat_0213_value def forward(self, query_key_value: torch.Tensor, attn_mask: torch.Tensor, heads: int, num_kv: int, - norm_factor: float, no_masking: bool, layer_id: int, num_layers: int, alibi: torch.Tensor): + norm_factor: float, no_masking: bool, layer_id: int, num_layers: int, alibi: torch.Tensor, + is_prompt: bool, token_idx: torch.Tensor, position_ids: torch.Tensor): if alibi is not None: batch_heads = query_key_value.shape[0] * heads @@ -42,6 +139,6 @@ def forward(self, query_key_value: torch.Tensor, attn_mask: torch.Tensor, heads: self.config.rotate_every_two, heads, num_kv, norm_factor, self.config.triangular_masking, self.config.local_attention, self.config.window_size, no_masking, layer_id, num_layers, alibi, - self.config.rope_theta) + self.config.rope_theta, is_prompt, token_idx, position_ids) return output diff --git a/deepspeed/ops/transformer/inference/op_binding/vector_add.py b/deepspeed/ops/transformer/inference/op_binding/vector_add.py new file mode 100644 index 000000000000..015340a1084b --- /dev/null +++ b/deepspeed/ops/transformer/inference/op_binding/vector_add.py @@ -0,0 +1,28 @@ +# Copyright (c) Microsoft Corporation. +# SPDX-License-Identifier: Apache-2.0 + +# DeepSpeed Team + +from ..config import DeepSpeedInferenceConfig +from .base import BaseOp + + +class VectorAddOp(BaseOp): + + def __init__(self, config: DeepSpeedInferenceConfig = None): + if config is None: + config = DeepSpeedInferenceConfig() + super(VectorAddOp, self).__init__(config) + try: + self.vector_add_func = self.inference_module._vector_add + except AttributeError: + self.vector_add_func = self.vector_add_fallback + + @classmethod + def vector_add_fallback(cls, a, b, gamma): + """Based on csrc/transformer/inference/csrc/pt_binding.cpp code of _vector_add""" + dtype = a.dtype + return (gamma * a.float() + b.float()).to(dtype) + + def forward(self, a, b, gamma): + return self.vector_add_func(a, b, gamma) diff --git a/deepspeed/ops/transformer/inference/op_binding/vector_matmul.py b/deepspeed/ops/transformer/inference/op_binding/vector_matmul.py index 011be859634d..cabab8d8c4ab 100644 --- a/deepspeed/ops/transformer/inference/op_binding/vector_matmul.py +++ b/deepspeed/ops/transformer/inference/op_binding/vector_matmul.py @@ -3,7 +3,6 @@ # DeepSpeed Team -import os import torch from ..config import DeepSpeedInferenceConfig from .base import BaseOp @@ -25,7 +24,7 @@ def __init__(self, config: DeepSpeedInferenceConfig): else: self.vector_matmul_func = self.inference_module.vector_matmul_fp16 elif self.config.dtype == torch.int8: - self.vector_matmul_func = self.inference_module.vector_matmul_fp16 + self.vector_matmul_func = self.inference_module.vector_matmul_int8 elif self.config.dtype == torch.bfloat16: self.vector_matmul_func = self.inference_module.vector_matmul_bf16 else: @@ -34,10 +33,7 @@ def __init__(self, config: DeepSpeedInferenceConfig): self.vector_matmul_func = self.vector_matmul_fallback def vector_matmul_fallback(self, input, weight, async_op, q_scale, q_int8, transpose): - if os.environ.get('DS_KI_FALLBACK') == 'True' and not transpose: - return torch.matmul(input, weight) - else: - raise NotImplementedError + return torch.matmul(input, weight.t() if transpose else weight) def forward(self, input: torch.Tensor, weight: torch.Tensor, async_op: bool = False): q_scale = weight.scale if hasattr(weight, 'scale') else torch.empty(1) diff --git a/deepspeed/ops/transformer/inference/op_binding/workspace.py b/deepspeed/ops/transformer/inference/op_binding/workspace.py new file mode 100644 index 000000000000..19de7d9576af --- /dev/null +++ b/deepspeed/ops/transformer/inference/op_binding/workspace.py @@ -0,0 +1,222 @@ +# Copyright (c) 2023 Habana Labs, Ltd. an Intel Company +# Copyright (c) Microsoft Corporation. +# SPDX-License-Identifier: Apache-2.0 + +# DeepSpeed Team + +import torch +from ..config import DeepSpeedInferenceConfig +from .base import BaseOp + +minus_inf = -10000.0 +key_idx = 0 +value_idx = 1 + + +class InferenceContext: + + __instance = None + + def __init__(self): + self.kv_cache = None + self.kv_cache_elem_dtype = None + self.num_tokens = 1 + self.kv_cache_num_layers = None + self.kv_cache_size = None + self.max_out_tokens = None + self.rotary = None + self.allocate_called = False + self.static_shapes = True + + @classmethod + def Instance(cls): + if InferenceContext.__instance is None: + InferenceContext.__instance = InferenceContext() + return InferenceContext.__instance + + def gen_workspace(self, num_layers, num_heads, batch_size, prompt_len, hidden_dim, mp_size, external_cache, + elem_dtype, rank, max_out_tokens, min_out_tokens): + self.allocate_called = True + self.kv_cache = None + if not external_cache: + self.kv_cache_num_layers = num_layers + self.max_out_tokens = max_out_tokens + head_size = hidden_dim // num_heads + self.kv_cache_size = torch.Size([batch_size, (num_heads // mp_size), max_out_tokens, head_size]) + self.kv_cache_elem_dtype = elem_dtype + self.num_tokens = 0 + self.static_shapes = True + return True + + def retake_workspace(self): + return True + + def _retake_workspace(self): + assert self.allocate_called, "retake workspace called before allocate workspace" + + import deepspeed.accelerator as accelerator + if self.kv_cache is None: + self.kv_cache = [] + for layer in range(self.kv_cache_num_layers): + self.kv_cache.append((torch.zeros(self.kv_cache_size, + dtype=self.kv_cache_elem_dtype, + device=accelerator.get_accelerator().device_name()), + torch.zeros(self.kv_cache_size, + dtype=self.kv_cache_elem_dtype, + device=accelerator.get_accelerator().device_name()))) + + return True + + def update_cache(self, layer_id, token_idx, is_prompt, bat_0213_key, bat_0213_value): + has_workspace = self._retake_workspace() + assert has_workspace, "Could not allocate workspace" + + # Update current token + if is_prompt: + self.static_shapes = True + if token_idx is None: + self.static_shapes = False + InferenceContext.Instance().reset_tokens(bat_0213_key.shape[2]) + else: + InferenceContext.Instance().reset_tokens(token_idx) + + if token_idx is None: + token_idx = InferenceContext.Instance().current_tokens() + + bsz = bat_0213_key.shape[0] + + # Update cache content + if is_prompt: + cache_max_seq = self.kv_cache_size[2] + cache_max_head_dim = self.kv_cache_size[3] + seq = bat_0213_key.shape[2] + + mask = torch.arange(cache_max_seq, device=bat_0213_key.device) + mask = mask.ge(token_idx) + mask = mask.unsqueeze(-1) + mask = mask.expand([cache_max_seq, cache_max_head_dim]) + + self.kv_cache[layer_id][key_idx][:bsz, :, :seq, :].copy_(bat_0213_key) + self.kv_cache[layer_id][key_idx][:bsz, :].masked_fill_(mask, 0) + self.kv_cache[layer_id][value_idx][:bsz, :, :seq, :].copy_(bat_0213_value) + self.kv_cache[layer_id][value_idx][:bsz, :].masked_fill_(mask, 0) + else: + if self.static_shapes: + assert type(token_idx) == torch.Tensor, "token_idx is expected to be torch.Tensor" + self.kv_cache[layer_id][key_idx][:bsz].index_copy_(2, token_idx - 1, bat_0213_key) + self.kv_cache[layer_id][value_idx][:bsz].index_copy_(2, token_idx - 1, bat_0213_value) + else: + assert type(token_idx) == int, "token_idx is expected to be int" + self.kv_cache[layer_id][key_idx][:bsz, :, token_idx - 1:token_idx, :] = bat_0213_key + self.kv_cache[layer_id][value_idx][:bsz, :, token_idx - 1:token_idx, :] = bat_0213_value + + bat_0213_key = self.kv_cache[layer_id][key_idx][:bsz] + bat_0213_value = self.kv_cache[layer_id][value_idx][:bsz] + + if not self.static_shapes: + bat_0213_key = bat_0213_key[:, :, :token_idx, :] + bat_0213_value = bat_0213_value[:, :, :token_idx, :] + + return bat_0213_key, bat_0213_value + + def release_workspace(self): + self.kv_cache = None + self.rotary = None + + def reset_tokens(self, initial_tokens=1): + self.num_tokens = initial_tokens + + def current_tokens(self): + return self.num_tokens + + def advance_tokens(self): + self.num_tokens = self.num_tokens + 1 + + def get_kv_cache(self): + return self.kv_cache + + def get_rotary(self, rotary_dim, rope_theta, device=None): + if self.rotary is None: + from transformers.models.llama.modeling_llama import LlamaRotaryEmbedding + + self.rotary = LlamaRotaryEmbedding(rotary_dim, base=rope_theta, device=device) + + return self.rotary + + def get_max_tokens_num(self): + return self.max_out_tokens + + +class WorkspaceOp(BaseOp): + + def __init__(self, config: DeepSpeedInferenceConfig = None): + if config is None: + config = DeepSpeedInferenceConfig() + self.inference_context = InferenceContext.Instance() + self._is_allocated = False + try: + super(WorkspaceOp, self).__init__(config) + if config.dtype == torch.float32: + self.allocate_workspace_func = self.inference_module.allocate_workspace_fp32 + elif config.dtype == torch.bfloat16: + self.allocate_workspace_func = self.inference_module.allocate_workspace_bf16 + else: + self.allocate_workspace_func = self.inference_module.allocate_workspace_fp16 + self.release_workspace_func = self.inference_module.release_workspace + self.retake_workspace_func = self.inference_module.retake_workspace + self.reset_cache_func = self.inference_module.reset_cache + except (ValueError, AttributeError) as e: + print(f"Using fallback functions in workspace because of {e}") + if config.dtype == torch.float32: + self.allocate_workspace_func = self.allocate_workspace_fp32_fallback + elif config.dtype == torch.bfloat16: + self.allocate_workspace_func = self.allocate_workspace_bf16_fallback + else: + self.allocate_workspace_func = self.allocate_workspace_fp16_fallback + self.release_workspace_func = self.release_workspace_fallback + self.retake_workspace_func = self.retake_workspace_fallback + self.reset_cache_func = self.reset_cache_fallback + + def allocate_workspace(self, *args, **kwargs): + self._is_allocated = True + return self.allocate_workspace_func(*args, **kwargs) + + def release_workspace(self): + self._is_allocated = False + return self.release_workspace_func() + + def reset_cache(self): + return self.reset_cache_func() if self.reset_cache_func else None + + def retake_workspace(self): + return self.retake_workspace_func() if self.retake_workspace_func else None + + def allocate_workspace_fp32_fallback(self, hidden_dim, num_heads, prompt_length, batch_size, num_layers, mp_size, + external_cache, rank, max_out_tokens, min_out_tokens): + return self.inference_context.gen_workspace(num_layers, num_heads, batch_size, prompt_length, hidden_dim, + mp_size, external_cache, torch.float, rank, max_out_tokens, + min_out_tokens) + + def allocate_workspace_bf16_fallback(self, hidden_dim, num_heads, prompt_length, batch_size, num_layers, mp_size, + external_cache, rank, max_out_tokens, min_out_tokens): + return self.inference_context.gen_workspace(num_layers, num_heads, batch_size, prompt_length, hidden_dim, + mp_size, external_cache, torch.bfloat16, rank, max_out_tokens, + min_out_tokens) + + def allocate_workspace_fp16_fallback(self, hidden_dim, num_heads, prompt_length, batch_size, num_layers, mp_size, + external_cache, rank, max_out_tokens, min_out_tokens): + return self.inference_context.gen_workspace(num_layers, num_heads, batch_size, prompt_length, hidden_dim, + mp_size, external_cache, torch.half, rank, max_out_tokens, + min_out_tokens) + + def reset_cache_fallback(self): + return self.inference_context.reset_tokens() + + def release_workspace_fallback(self): + return self.inference_context.release_workspace() + + def retake_workspace_fallback(self): + return self.inference_context.retake_workspace() + + def is_allocated(self): + return self._is_allocated diff --git a/deepspeed/ops/transformer/inference/triton/attention.py b/deepspeed/ops/transformer/inference/triton/attention.py index c05370ec74e5..6845d91b06be 100644 --- a/deepspeed/ops/transformer/inference/triton/attention.py +++ b/deepspeed/ops/transformer/inference/triton/attention.py @@ -125,7 +125,7 @@ def _triton_autotune(min_seqlen, context_4d_matmul(output, qkv, head_size) Fp16Matmul._update_autotune_table() - def ds_compute_attention(self, qkv_out, input_mask, layer_past, alibi): + def ds_compute_attention(self, qkv_out, input_mask, layer_past, alibi, is_prompt, token_idx, position_ids): if isinstance(qkv_out, list): qkv_out = qkv_out[0] @@ -143,7 +143,10 @@ def ds_compute_attention(self, qkv_out, input_mask, layer_past, alibi): no_masking=no_masking, layer_id=self.config.layer_id, num_layers=TritonSelfAttention.num_layers, - alibi=alibi) + alibi=alibi, + is_prompt=is_prompt, + token_idx=token_idx, + position_ids=position_ids) context_layer, key_layer, value_layer = attn_key_value return context_layer, key_layer, value_layer @@ -161,7 +164,8 @@ def forward( norm_w=None, norm_b=None, alibi=None, - use_triton_attention=True): + use_triton_attention=True, + **kwargs): if not self.config.pre_layer_norm: qkv_out = self.linear_func(input=input, @@ -192,10 +196,16 @@ def forward( triangular=self.triangular_masking) key_layer, value_layer = qkv[:, :, self.hidden_size:2 * self.hidden_size], qkv[:, :, 2 * self.hidden_size:] else: + is_prompt = kwargs.get("first_token", qkv_out[0].shape[1] > 1) + token_idx = kwargs.get("token_idx", None) + position_ids = kwargs.get("position_ids", None) context_layer, key_layer, value_layer = self.ds_compute_attention(qkv_out=qkv_out, input_mask=input_mask, layer_past=layer_past, - alibi=alibi) + alibi=alibi, + is_prompt=is_prompt, + toke_idx=token_idx, + position_ids=position_ids) output = self.vector_matmul_func(input=context_layer, weight=self.attn_ow) inp_norm = qkv_out[-1] diff --git a/deepspeed/ops/transformer/inference/triton/ops.py b/deepspeed/ops/transformer/inference/triton/ops.py index dd87d08d4d2c..dbed45313780 100644 --- a/deepspeed/ops/transformer/inference/triton/ops.py +++ b/deepspeed/ops/transformer/inference/triton/ops.py @@ -3,12 +3,10 @@ # DeepSpeed Team -import deepspeed -from deepspeed.ops.op_builder import InferenceBuilder import deepspeed.ops.transformer.inference.triton.matmul_ext as matmul_ext +from deepspeed.ops.transformer.inference.op_binding.layer_norm import LayerNormOp from deepspeed.ops.transformer.inference.triton.layer_norm import layer_norm, layer_norm_residual - -inference_module = None +from deepspeed.utils.types import ActivationFuncType def vector_matmul_func(input, weight, async_op, q_scale, q_int8, transposed_mode): @@ -76,15 +74,12 @@ def mlp_gemm_func(input, if use_triton_ln: mlp_input = layer_norm_residual(input, input_bias, residual, gamma, beta, epsilon) else: - global inference_module - if inference_module is None: - inference_module = InferenceBuilder().load() - mlp_input = inference_module._layer_norm_residual(input, input_bias, residual, gamma, beta, epsilon) + mlp_input = LayerNormOp.layer_norm_residual(input, input_bias, residual, gamma, beta, epsilon) # activation - if deepspeed.utils.types.ActivationFuncType(mlp_act_func_type) == deepspeed.utils.types.ActivationFuncType.GELU: + if ActivationFuncType(mlp_act_func_type) == ActivationFuncType.GELU: activation = "gelu" - elif deepspeed.utils.types.ActivationFuncType(mlp_act_func_type) == deepspeed.utils.types.ActivationFuncType.ReLU: + elif ActivationFuncType(mlp_act_func_type) == ActivationFuncType.ReLU: activation = "relu" else: activation = "" @@ -121,10 +116,7 @@ def qkv_gemm_func( if use_triton_ln: qkv_input = layer_norm(input, gamma, beta, epsilon) else: - global inference_module - if inference_module is None: - inference_module = InferenceBuilder().load() - qkv_input = inference_module.layer_norm(input, gamma, beta, epsilon) + qkv_input = LayerNormOp()(input, gamma, beta, epsilon) qkv_out = matmul_ext.matmul(qkv_input, weight, bias=(bias if add_bias else None), activation="", use_triton=True) diff --git a/deepspeed/runtime/hybrid_engine.py b/deepspeed/runtime/hybrid_engine.py index a991c4304563..8a6311bb6e83 100644 --- a/deepspeed/runtime/hybrid_engine.py +++ b/deepspeed/runtime/hybrid_engine.py @@ -17,16 +17,14 @@ from deepspeed.accelerator import get_accelerator from torch import nn from deepspeed.utils import logger - -from deepspeed.ops.op_builder import InferenceBuilder - from deepspeed.module_inject.layers import LinearLayer, Normalize, EmbeddingLayer, OPTEmbedding +from ..ops.transformer.inference.op_binding.workspace import WorkspaceOp + try: import transformers OPTLearnedPositionalEmbedding = transformers.models.opt.modeling_opt.OPTLearnedPositionalEmbedding except: OPTLearnedPositionalEmbedding = None -inference_cuda_module = None class DeepSpeedHybridEngine(DeepSpeedEngine): @@ -61,12 +59,8 @@ def __init__(self, args, model, **kwargs): self._total_batch_size = None self._gather_latency = 0 - global inference_cuda_module - if inference_cuda_module is None: - builder = InferenceBuilder() - inference_cuda_module = builder.load() - self.is_lora_fused = False + self.workspace = WorkspaceOp() def convert_to_linear_transposed(self, model): @@ -160,13 +154,13 @@ def unfuse_lora_weight_non_pinned(self): def retake_inference_cache(self): if self._config.hybrid_engine.release_inference_cache: - retake_success = inference_cuda_module.retake_workspace() + retake_success = self.workspace.retake_workspace() if not retake_success: logger.warning("Unable to acquire workspace on first attempt, emptying cache and retrying.") gc.collect() get_accelerator().empty_cache() - retake_success = inference_cuda_module.retake_workspace() + retake_success = self.workspace.retake_workspace() if not retake_success: raise RuntimeError("Unable to retake inference workspace.") @@ -269,7 +263,7 @@ def generate(self, *inputs, **kwargs): self.is_lora_fused = False if self._config.hybrid_engine.release_inference_cache: - inference_cuda_module.release_workspace() + self.workspace.release_workspace() gc.collect() get_accelerator().empty_cache() diff --git a/op_builder/hpu/__init__.py b/op_builder/hpu/__init__.py index 6527ace087b5..5ad1b9a7f891 100644 --- a/op_builder/hpu/__init__.py +++ b/op_builder/hpu/__init__.py @@ -7,4 +7,5 @@ from .cpu_adam import CPUAdamBuilder from .fused_adam import FusedAdamBuilder +from .transformer_inference import InferenceBuilder from .no_impl import NotImplementedBuilder diff --git a/op_builder/hpu/transformer_inference.py b/op_builder/hpu/transformer_inference.py new file mode 100644 index 000000000000..e397c99200ec --- /dev/null +++ b/op_builder/hpu/transformer_inference.py @@ -0,0 +1,39 @@ +# Copyright (c) 2023 Habana Labs, Ltd. an Intel Company +# Copyright (c) Microsoft Corporation. +# SPDX-License-Identifier: Apache-2.0 +import importlib + +# DeepSpeed Team + +try: + # is op_builder from deepspeed or a 3p version? this should only succeed if it's deepspeed + # if successful this also means we're doing a local install and not JIT compile path + from op_builder import __deepspeed__ # noqa: F401 + from op_builder.builder import OpBuilder +except ImportError: + from deepspeed.ops.op_builder.builder import OpBuilder + + +class InferenceBuilder(OpBuilder): + BUILD_VAR = "DS_BUILD_TRANSFORMER_INFERENCE" + NAME = "transformer_inference" + + def __init__(self, name=None): + name = self.NAME if name is None else name + super().__init__(name=self.NAME) + + def absolute_name(self): + return f"deepspeed.ops.transformer.inference.{self.NAME}_op" + + def sources(self): + return [] + + def load(self, verbose=True): + if self.name in __class__._loaded_ops: + return __class__._loaded_ops[self.name] + + from deepspeed.git_version_info import installed_ops # noqa: F401 + if installed_ops.get(self.name, False): + op_module = importlib.import_module(self.absolute_name()) + __class__._loaded_ops[self.name] = op_module + return op_module diff --git a/tests/unit/ops/transformer/inference/test_bias_add.py b/tests/unit/ops/transformer/inference/test_bias_add.py index 843c9b889c2b..f25bbc1be692 100644 --- a/tests/unit/ops/transformer/inference/test_bias_add.py +++ b/tests/unit/ops/transformer/inference/test_bias_add.py @@ -8,12 +8,13 @@ import deepspeed from deepspeed.accelerator import get_accelerator from deepspeed.ops.op_builder import InferenceBuilder +from deepspeed.ops.transformer import DeepSpeedInferenceConfig +from deepspeed.ops.transformer.inference.op_binding.bias_add import BiasAddOp from .inference_test_utils import allclose, get_dtypes if not deepspeed.ops.__compatible_ops__[InferenceBuilder.NAME]: pytest.skip("Inference ops are not available on this system", allow_module_level=True) -inference_module = None torch_minor_version = None @@ -22,15 +23,8 @@ def run_bias_add_reference(activations, bias): def run_bias_add_ds(activations, bias): - global inference_module - if inference_module is None: - inference_module = InferenceBuilder().load() - if activations.dtype == torch.float16: - return inference_module.bias_add_fp16(activations, bias) - elif activations.dtype == torch.bfloat16: - return inference_module.bias_add_bf16(activations, bias) - else: - return inference_module.bias_add_fp32(activations, bias) + config = DeepSpeedInferenceConfig(dtype=activations.dtype) + return BiasAddOp(config)(activations, bias) @pytest.mark.inference_ops diff --git a/tests/unit/ops/transformer/inference/test_bias_geglu.py b/tests/unit/ops/transformer/inference/test_bias_geglu.py index d5ab13964974..05de4fbb4cf8 100644 --- a/tests/unit/ops/transformer/inference/test_bias_geglu.py +++ b/tests/unit/ops/transformer/inference/test_bias_geglu.py @@ -8,13 +8,13 @@ import deepspeed from deepspeed.ops.op_builder import InferenceBuilder from deepspeed.accelerator import get_accelerator +from deepspeed.ops.transformer.inference.op_binding.gated_activation import GatedActivationOp from deepspeed.utils.types import ActivationFuncType from .inference_test_utils import allclose, get_dtypes if not deepspeed.ops.__compatible_ops__[InferenceBuilder.NAME]: pytest.skip("Inference ops are not available on this system", allow_module_level=True) -inference_module = None torch_minor_version = None @@ -27,10 +27,7 @@ def run_bias_geglu_reference(activations, bias): def run_bias_geglu_ds(activation, bias): - global inference_module - if inference_module is None: - inference_module = InferenceBuilder().load() - return inference_module.gated_activation(activation, bias, ActivationFuncType.GATED_GELU) + return GatedActivationOp()(activation, bias, ActivationFuncType.GATED_GELU) @pytest.mark.inference_ops @@ -56,17 +53,14 @@ def run_gated_silu_reference(activations, bias): def run_gated_silu_ds(activation, bias): - global inference_module - if inference_module is None: - inference_module = InferenceBuilder().load() - return inference_module.gated_activation(activation, bias, ActivationFuncType.GATED_SILU) + return GatedActivationOp()(activation, bias, ActivationFuncType.GATED_SILU) @pytest.mark.inference_ops @pytest.mark.parametrize("batch", [1, 2]) @pytest.mark.parametrize("sequence", [1, 128, 255]) @pytest.mark.parametrize("channels", [512, 1232, 4096]) -@pytest.mark.parametrize("dtype", [torch.float16, torch.float32]) +@pytest.mark.parametrize("dtype", get_dtypes()) def test_gated_silu(batch, sequence, channels, dtype): activation = torch.randn((batch, sequence, channels * 2), dtype=dtype, device=get_accelerator().device_name()) bias = torch.randn((channels * 2), dtype=dtype, device=get_accelerator().device_name()) diff --git a/tests/unit/ops/transformer/inference/test_bias_gelu.py b/tests/unit/ops/transformer/inference/test_bias_gelu.py index fd82da51380c..b69030e87ace 100644 --- a/tests/unit/ops/transformer/inference/test_bias_gelu.py +++ b/tests/unit/ops/transformer/inference/test_bias_gelu.py @@ -8,13 +8,14 @@ import deepspeed from deepspeed.accelerator import get_accelerator from deepspeed.ops.op_builder import InferenceBuilder +from deepspeed.ops.transformer import DeepSpeedInferenceConfig +from deepspeed.ops.transformer.inference.op_binding.bias_gelu import BiasGeluOp from .inference_test_utils import allclose, get_dtypes from packaging import version as pkg_version if not deepspeed.ops.__compatible_ops__[InferenceBuilder.NAME]: pytest.skip("Inference ops are not available on this system", allow_module_level=True) -inference_module = None torch_minor_version = None @@ -25,15 +26,8 @@ def run_bias_gelu_reference(activations, bias): def run_bias_gelu_ds(activations, bias): - global inference_module - if inference_module is None: - inference_module = InferenceBuilder().load() - if activations.dtype == torch.float16: - return inference_module.bias_gelu_fp16(activations, bias) - elif activations.dtype == torch.bfloat16: - return inference_module.bias_gelu_bf16(activations, bias) - else: - return inference_module.bias_gelu_fp32(activations, bias) + config = DeepSpeedInferenceConfig(dtype=activations.dtype) + return BiasGeluOp(config)(activations, bias) @pytest.mark.inference_ops diff --git a/tests/unit/ops/transformer/inference/test_bias_relu.py b/tests/unit/ops/transformer/inference/test_bias_relu.py index 881af78e92cf..57134665b241 100644 --- a/tests/unit/ops/transformer/inference/test_bias_relu.py +++ b/tests/unit/ops/transformer/inference/test_bias_relu.py @@ -8,12 +8,13 @@ import deepspeed from deepspeed.accelerator import get_accelerator from deepspeed.ops.op_builder import InferenceBuilder +from deepspeed.ops.transformer import DeepSpeedInferenceConfig +from deepspeed.ops.transformer.inference.op_binding.bias_relu import BiasReluOp from .inference_test_utils import allclose, get_dtypes if not deepspeed.ops.__compatible_ops__[InferenceBuilder.NAME]: pytest.skip("Inference ops are not available on this system", allow_module_level=True) -inference_module = None torch_minor_version = None @@ -23,15 +24,8 @@ def run_bias_relu_reference(activations, bias): def run_bias_relu_ds(activations, bias): - global inference_module - if inference_module is None: - inference_module = InferenceBuilder().load() - if activations.dtype == torch.float16: - return inference_module.bias_relu_fp16(activations, bias) - elif activations.dtype == torch.bfloat16: - return inference_module.bias_relu_bf16(activations, bias) - else: - return inference_module.bias_relu_fp32(activations, bias) + config = DeepSpeedInferenceConfig(dtype=activations.dtype) + return BiasReluOp(config)(activations, bias) @pytest.mark.inference_ops diff --git a/tests/unit/ops/transformer/inference/test_gelu.py b/tests/unit/ops/transformer/inference/test_gelu.py index 675860b00bdb..beb74d09ab30 100644 --- a/tests/unit/ops/transformer/inference/test_gelu.py +++ b/tests/unit/ops/transformer/inference/test_gelu.py @@ -7,11 +7,12 @@ import torch import deepspeed from deepspeed.ops.op_builder import InferenceBuilder +from deepspeed.ops.transformer import DeepSpeedInferenceConfig +from deepspeed.ops.transformer.inference.op_binding.bias_gelu import BiasGeluOp if not deepspeed.ops.__compatible_ops__[InferenceBuilder.NAME]: pytest.skip("Inference ops are not available on this system", allow_module_level=True) -inference_module = None torch_minor_version = None @@ -45,13 +46,8 @@ def run_gelu_ds(activations, use_triton_ops=False): device = deepspeed.accelerator.get_accelerator().device_name() channels = activations.shape[-1] bias = torch.zeros((channels), dtype=activations.dtype, device=device) - global inference_module - if inference_module is None: - inference_module = InferenceBuilder().load() - if activations.dtype == torch.float16: - return inference_module.bias_gelu_fp16(activations, bias) - else: - return inference_module.bias_gelu_fp32(activations, bias) + config = DeepSpeedInferenceConfig(dtype=activations.dtype) + return BiasGeluOp(config)(activations, bias) @pytest.mark.inference_ops diff --git a/tests/unit/ops/transformer/inference/test_layer_norm.py b/tests/unit/ops/transformer/inference/test_layer_norm.py index 9eac612aa29c..2912807e9f43 100644 --- a/tests/unit/ops/transformer/inference/test_layer_norm.py +++ b/tests/unit/ops/transformer/inference/test_layer_norm.py @@ -8,6 +8,7 @@ import pytest from deepspeed.accelerator import get_accelerator from deepspeed.ops.op_builder import InferenceBuilder +from deepspeed.ops.transformer.inference.op_binding.layer_norm import LayerNormOp from .inference_test_utils import allclose, get_dtypes, assert_almost_equal try: import triton # noqa: F401 # type: ignore @@ -21,8 +22,6 @@ if not deepspeed.ops.__compatible_ops__[InferenceBuilder.NAME]: pytest.skip("Inference ops are not available on this system", allow_module_level=True) -inference_module = None - def ref_implementation(vals, gamma, beta, epsilon, channels, dtype): vals_f = vals.to(torch.float32) @@ -32,10 +31,7 @@ def ref_implementation(vals, gamma, beta, epsilon, channels, dtype): def ds_implementation(vals, gamma, beta, epsilon): - global inference_module - if inference_module is None: - inference_module = InferenceBuilder().load() - return inference_module.layer_norm(vals, gamma, beta, epsilon) + return LayerNormOp()(vals, gamma, beta, epsilon) def ds_triton_implementation(vals, gamma, beta, epsilon): @@ -83,10 +79,7 @@ def residual_ref_implementation(vals, bias, res, gamma, beta, epsilon, channels, def residual_ds_implementation(vals, bias, res, gamma, beta, epsilon): - global inference_module - if inference_module is None: - inference_module = InferenceBuilder().load() - return inference_module._layer_norm_residual(vals, bias, res, gamma, beta, epsilon) + return LayerNormOp.layer_norm_residual(vals, bias, res, gamma, beta, epsilon) def residual_ds_triton_implementation(vals, bias, res, gamma, beta, epsilon): @@ -137,10 +130,7 @@ def residual_store_ref_implementation(vals, bias, res, gamma, beta, epsilon, cha def residual_store_ds_implementation(vals, bias, res, gamma, beta, epsilon): - global inference_module - if inference_module is None: - inference_module = InferenceBuilder().load() - return inference_module.layer_norm_residual_store_pre_ln_res(vals, bias, res, gamma, beta, epsilon) + return LayerNormOp.layer_norm_residual_store_pre_ln_res(vals, bias, res, gamma, beta, epsilon) @pytest.mark.inference_ops diff --git a/tests/unit/ops/transformer/inference/test_moe_res_matmult.py b/tests/unit/ops/transformer/inference/test_moe_res_matmult.py index e1c8127a83ac..dcf9f16baaf1 100644 --- a/tests/unit/ops/transformer/inference/test_moe_res_matmult.py +++ b/tests/unit/ops/transformer/inference/test_moe_res_matmult.py @@ -8,24 +8,20 @@ import deepspeed from deepspeed.accelerator import get_accelerator from deepspeed.ops.op_builder import InferenceBuilder +from deepspeed.ops.transformer.inference.op_binding.moe_res_matmul import MoEResMatmulOp from .inference_test_utils import allclose, get_dtypes if not deepspeed.ops.__compatible_ops__[InferenceBuilder.NAME]: pytest.skip("Inference ops are not available on this system", allow_module_level=True) -inference_module = None - def run_moe_res_matmul_reference(residual, coef1, coef2, output): return residual * coef1 + output * coef2 def run_moe_res_matmul_ds(residual, coef, output): - global inference_module - if inference_module is None: - inference_module = InferenceBuilder().load() coef_t = coef.transpose(-1, -2).contiguous() - return inference_module.moe_res_matmul(residual, coef_t, output) + return MoEResMatmulOp()(residual, coef_t, output) @pytest.mark.inference_ops diff --git a/tests/unit/ops/transformer/inference/test_residual_add.py b/tests/unit/ops/transformer/inference/test_residual_add.py index 91830e25fc81..807da4904341 100644 --- a/tests/unit/ops/transformer/inference/test_residual_add.py +++ b/tests/unit/ops/transformer/inference/test_residual_add.py @@ -8,6 +8,8 @@ import deepspeed from deepspeed.accelerator import get_accelerator from deepspeed.ops.op_builder import InferenceBuilder +from deepspeed.ops.transformer import DeepSpeedInferenceConfig +from deepspeed.ops.transformer.inference.op_binding import ResidualAddOp from .inference_test_utils import get_dtypes if not deepspeed.ops.__compatible_ops__[InferenceBuilder.NAME]: @@ -36,11 +38,6 @@ def allclose(x, y): return torch.allclose(x, y, rtol=rtol, atol=atol) -@pytest.fixture(scope="module") -def inference_module(): - return InferenceBuilder().load() - - def res_add_bias_ref(hidden_state, residual, attn_output, attn_bias, final_bias, mp_size=1, pre_attn_norm=True): if pre_attn_norm: hidden_state += (residual + final_bias + attn_output + attn_bias) / mp_size @@ -75,8 +72,8 @@ def run_residual_add_reference(hidden_state, residual, attn_output, attn_bias, f @pytest.mark.parametrize("mp_size", [1, 2]) @pytest.mark.parametrize("pre_attn_norm", [True, False]) @pytest.mark.parametrize("use_triton_ops", [True, False]) -def test_residual_add(inference_module, batch, sequence, hidden_dim, dtype, mlp_after_attn, add_bias, mp_size, - pre_attn_norm, use_triton_ops): +def test_residual_add(batch, sequence, hidden_dim, dtype, mlp_after_attn, add_bias, mp_size, pre_attn_norm, + use_triton_ops): if not deepspeed.HAS_TRITON and use_triton_ops: pytest.skip("triton has to be installed for the test") ds_out = torch.randn((batch, sequence, hidden_dim), dtype=dtype, device=get_accelerator().device_name()) @@ -96,19 +93,9 @@ def test_residual_add(inference_module, batch, sequence, hidden_dim, dtype, mlp_ if use_triton_ops: from deepspeed.ops.transformer.inference.triton import residual_add_bias ds_out = residual_add_bias(*res_add_args) - if dtype == torch.float16: - ds_out = inference_module.residual_add_bias_fp16(*res_add_args) - elif dtype == torch.float32: - ds_out = inference_module.residual_add_bias_fp32(*res_add_args) - elif dtype == torch.bfloat16: - ds_out = inference_module.residual_add_bias_bf16(*res_add_args) else: - if dtype == torch.float16: - ds_out = inference_module.residual_add_bias_fp16(*res_add_args) - elif dtype == torch.float32: - ds_out = inference_module.residual_add_bias_fp32(*res_add_args) - else: - raise ValueError(f"Unsupported dtype: {dtype}") + config = DeepSpeedInferenceConfig(dtype=dtype) + ds_out = ResidualAddOp(config).residual_add_func(*res_add_args) if not allclose(ds_out, ref_out): print((ds_out - ref_out).abs().max()) diff --git a/tests/unit/ops/transformer/inference/test_rms_norm.py b/tests/unit/ops/transformer/inference/test_rms_norm.py index 508a40e12e8d..fde9c9510771 100644 --- a/tests/unit/ops/transformer/inference/test_rms_norm.py +++ b/tests/unit/ops/transformer/inference/test_rms_norm.py @@ -8,13 +8,13 @@ import pytest from deepspeed.accelerator import get_accelerator from deepspeed.ops.op_builder import InferenceBuilder # type: ignore +from deepspeed.ops.transformer.inference.op_binding.pre_rms_norm import PreRMSNormOp +from deepspeed.ops.transformer.inference.op_binding.rms_norm import RMSNormOp from .inference_test_utils import allclose, get_dtypes if not deepspeed.ops.__compatible_ops__[InferenceBuilder.NAME]: pytest.skip("Inference ops are not available on this system", allow_module_level=True) -inference_module = None - def ref_implementation(vals, gamma, epsilon): variance = vals.to(torch.float32).pow(2).mean(-1, keepdim=True) @@ -27,10 +27,7 @@ def ref_implementation(vals, gamma, epsilon): def ds_implementation(vals, gamma, epsilon): - global inference_module - if inference_module is None: - inference_module = InferenceBuilder().load() - return inference_module.rms_norm(vals, gamma, epsilon) + return RMSNormOp()(vals, gamma, epsilon) @pytest.mark.inference_ops @@ -51,10 +48,7 @@ def test_rms_norm(batch, seq_len, channels, dtype): def pre_ds_implementation(vals, residual, gamma, epsilon): - global inference_module - if inference_module is None: - inference_module = InferenceBuilder().load() - return inference_module.pre_rms_norm(vals, residual, gamma, epsilon) + return PreRMSNormOp()(vals, residual, gamma, epsilon) def pre_ref_implementation(vals, residual, gamma, epsilon): diff --git a/tests/unit/ops/transformer/inference/test_softmax.py b/tests/unit/ops/transformer/inference/test_softmax.py index 7d0d6e14b651..4f6d69160aa7 100644 --- a/tests/unit/ops/transformer/inference/test_softmax.py +++ b/tests/unit/ops/transformer/inference/test_softmax.py @@ -11,7 +11,6 @@ if not deepspeed.ops.__compatible_ops__[InferenceBuilder.NAME]: pytest.skip("Inference ops are not available on this system", allow_module_level=True) -inference_module = None torch_minor_version = None @@ -43,6 +42,7 @@ def run_softmax_ds(input, use_triton_ops=False): def test_softmax(batch, sequence, channels, dtype, use_triton_ops): if not deepspeed.HAS_TRITON and use_triton_ops: pytest.skip("triton has to be installed for the test") + device = deepspeed.accelerator.get_accelerator().device_name() input_ds = torch.randn((batch, sequence, channels), dtype=dtype, device=device) input_ref = input_ds.clone().detach() From 1062a0c6583453af2d405e8ca2c0ad08b903d23e Mon Sep 17 00:00:00 2001 From: Logan Adams <114770087+loadams@users.noreply.github.com> Date: Wed, 9 Oct 2024 08:22:41 -0700 Subject: [PATCH 543/754] Unpin accelerate tests, update lightning with node16 removal. (#6611) HF accelerate fixes implemented in https://github.com/huggingface/accelerate/pull/3145 mean that we no longer need to pin the Accelerate version! nv-lightning tests now run on Ubuntu 20.04+, so we support >node 16, so we can remove the explicit permissions for that in the env config. --- .github/workflows/nv-accelerate-v100.yml | 1 - .github/workflows/nv-lightning-v100.yml | 2 -- 2 files changed, 3 deletions(-) diff --git a/.github/workflows/nv-accelerate-v100.yml b/.github/workflows/nv-accelerate-v100.yml index 3bddc329e3dd..346055e2685f 100644 --- a/.github/workflows/nv-accelerate-v100.yml +++ b/.github/workflows/nv-accelerate-v100.yml @@ -47,7 +47,6 @@ jobs: unset TORCH_CUDA_ARCH_LIST # only jit compile for current arch git clone https://github.com/huggingface/accelerate cd accelerate - git checkout ae9cb6e4db6f81fd18148c2cc67d72b903d81a46 git rev-parse --short HEAD # installing dependencies pip install .[testing] diff --git a/.github/workflows/nv-lightning-v100.yml b/.github/workflows/nv-lightning-v100.yml index a9a26b7ce816..044c282ba119 100644 --- a/.github/workflows/nv-lightning-v100.yml +++ b/.github/workflows/nv-lightning-v100.yml @@ -21,8 +21,6 @@ jobs: unit-tests: runs-on: [self-hosted, nvidia, cu121, v100] - env: {ACTIONS_ALLOW_USE_UNSECURE_NODE_VERSION: true} # Allow using Node16 actions - steps: - uses: actions/checkout@v3 From 474a3288cd5a89c64c37f1e51978a3d031a87b4a Mon Sep 17 00:00:00 2001 From: gyou2021 Date: Wed, 9 Oct 2024 23:23:16 +0800 Subject: [PATCH 544/754] Enabled Qwen2-MoE Tensor Parallelism (TP) inference (#6551) Modified _replace_module in auto_tp.py : The modification keeps the layers 'shared_expert_gate' and 'gate' in qwen2-moe the original type torch.nn.Linear and not changes them into LinearLayer. In this way, their weights will not be split into multiple HPU/GPU cards. Then the qwen2-moe can run on multiple HPU/GPU cards. Since the weights of 'gate' are not split into multiple HPU/GPU cards, all gather operations are not needed, which may improve performance. --------- Co-authored-by: Logan Adams <114770087+loadams@users.noreply.github.com> --- deepspeed/module_inject/auto_tp.py | 3 ++- docs/_tutorials/automatic-tensor-parallelism.md | 1 + 2 files changed, 3 insertions(+), 1 deletion(-) mode change 100644 => 100755 deepspeed/module_inject/auto_tp.py mode change 100644 => 100755 docs/_tutorials/automatic-tensor-parallelism.md diff --git a/deepspeed/module_inject/auto_tp.py b/deepspeed/module_inject/auto_tp.py old mode 100644 new mode 100755 index 52d7c95ec9d8..221d490a37d2 --- a/deepspeed/module_inject/auto_tp.py +++ b/deepspeed/module_inject/auto_tp.py @@ -333,7 +333,8 @@ def _replace(self, child, name, conv_linear_layer): weight_shape = child.weight.shape mp_replace = ReplaceWithTensorSlicing(mp_group=self.mp_group) # For mixtral-7x8b, need to skip MoE gate linear replace. - if name == "block_sparse_moe.gate": + if name == "block_sparse_moe.gate" or (('mlp.shared_expert_gate' == name or 'mlp.gate' == name) + and 'qwen2_moe' in str(type(self.module))): return child # For Yuan model if 'Yuan' in str(self.module): diff --git a/docs/_tutorials/automatic-tensor-parallelism.md b/docs/_tutorials/automatic-tensor-parallelism.md old mode 100644 new mode 100755 index e1903ed05892..d5a08b27bf4d --- a/docs/_tutorials/automatic-tensor-parallelism.md +++ b/docs/_tutorials/automatic-tensor-parallelism.md @@ -158,6 +158,7 @@ The following model families have been successfully tested with automatic tensor - plbart - qwen - qwen2 +- qwen2-moe - reformer - roberta - roformer From 55f7f3789eed805d8f5deab0e2276516a302d745 Mon Sep 17 00:00:00 2001 From: Logan Adams <114770087+loadams@users.noreply.github.com> Date: Wed, 9 Oct 2024 10:48:39 -0700 Subject: [PATCH 545/754] Update version.txt after 0.15.2 release (#6615) **Auto-generated PR to update version.txt after a DeepSpeed release** Released version - 0.15.2 Author - @jomayeri Co-authored-by: jomayeri --- version.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/version.txt b/version.txt index 4312e0d0cae3..1985d91413de 100644 --- a/version.txt +++ b/version.txt @@ -1 +1 @@ -0.15.2 +0.15.3 From 7d751ee8903187cd7cd82f43816acf1d5d0907ba Mon Sep 17 00:00:00 2001 From: Masahiro Tanaka <81312776+tohtana@users.noreply.github.com> Date: Wed, 9 Oct 2024 08:23:33 -0700 Subject: [PATCH 546/754] Clean up prefetched parameters (#6557) Parameters prefetched by ZeRO3 are sometimes not used. This occurs when the actual sub-module execution differs from previous tracing. As a result, the state of the allgather handle for such a parameter remains `INFLIGHT`, causing functions like `empty_partition_cache` to detect it and throw an error. This PR resolves the issue by ensuring that communication finishes and the parameters are freed. As this issue was mentioned in #6011, this includes the change of the branch. We need to merge #6011 first. --------- Co-authored-by: Logan Adams <114770087+loadams@users.noreply.github.com> Co-authored-by: Olatunji Ruwase --- .../runtime/zero/partitioned_param_coordinator.py | 13 +++++++++---- 1 file changed, 9 insertions(+), 4 deletions(-) diff --git a/deepspeed/runtime/zero/partitioned_param_coordinator.py b/deepspeed/runtime/zero/partitioned_param_coordinator.py index bdec8a55fcbc..5780b2afd6de 100644 --- a/deepspeed/runtime/zero/partitioned_param_coordinator.py +++ b/deepspeed/runtime/zero/partitioned_param_coordinator.py @@ -153,11 +153,18 @@ def is_invalid_trace(self) -> bool: def is_record_trace(self) -> bool: return self.__trace_mode == ZeRoTraceMode.RECORD + def _clean_inflight_param_registry(self) -> None: + for param, handle in self.__inflight_param_registry.items(): + handle.wait() + self.__release_param(param) + self.__inflight_param_registry.clear() + def _invalidate_trace(self) -> None: if self.is_invalid_trace(): raise RuntimeError("attempted to invalidate already invalid trace") self.__trace_mode = ZeRoTraceMode.INVALID self._clear_trace_structures() + self._clean_inflight_param_registry() def trace_prologue(self, sub_module: Module) -> None: if self.is_complete_trace(): @@ -204,9 +211,7 @@ def construct_parameter_trace_from_module_trace(self): def reset_step(self) -> None: """indicate that we have completed one fwd+bwd for the model""" - if self.__inflight_param_registry: - raise RuntimeError(f"still have inflight params " - f"{[p.ds_summary() for p in self.__inflight_param_registry.keys()]}") + self._clean_inflight_param_registry() if not self.is_complete_trace(): # not self.trace_complete: # Make sure that recorded submodule orders are identical across ranks @@ -409,7 +414,7 @@ def release_and_reset_all(self, module: Module) -> None: """release all module parameters""" for param in iter_params(module, recurse=True): if param in self.__inflight_param_registry: - raise RuntimeError(f"param {param.ds_summary()} still in flight") + self.__inflight_param_registry.pop(param).wait() # TODO. make this throw if if there are still active submodules. currently # there's a hook execution issue From a1f98bdc703dacf95e11c4ae25f6fd11b6d1277e Mon Sep 17 00:00:00 2001 From: Joe Mayer <114769929+jomayeri@users.noreply.github.com> Date: Wed, 9 Oct 2024 14:07:31 -0700 Subject: [PATCH 547/754] AIO CPU Locked Tensor (#6592) Restoring the functionality of the cpu locked tensor in the AIO library. Make async_io operator available for CPU accelerator, i.e., CPU only environment. --------- Co-authored-by: Olatunji Ruwase --- accelerator/cpu_accelerator.py | 6 +- csrc/aio/common/deepspeed_aio_common.cpp | 43 +++++---- csrc/aio/common/deepspeed_aio_common.h | 2 +- csrc/aio/common/deepspeed_aio_utils.cpp | 18 ++-- csrc/aio/common/deepspeed_aio_utils.h | 22 ++--- csrc/aio/py_lib/deepspeed_aio_op_desc.cpp | 8 +- csrc/aio/py_lib/deepspeed_aio_op_desc.h | 10 +- csrc/aio/py_lib/deepspeed_cpu_op.cpp | 79 ++++++++++------ csrc/aio/py_lib/deepspeed_cpu_op.h | 10 +- csrc/aio/py_lib/deepspeed_pin_tensor.cpp | 22 ++++- csrc/aio/py_lib/deepspeed_pin_tensor.h | 7 +- csrc/aio/py_lib/deepspeed_py_aio.cpp | 6 +- csrc/aio/py_lib/deepspeed_py_aio_handle.cpp | 8 +- csrc/aio/py_lib/deepspeed_py_aio_handle.h | 2 +- csrc/aio/py_lib/deepspeed_py_io_handle.cpp | 47 +++++----- csrc/aio/py_lib/deepspeed_py_io_handle.h | 24 ++--- csrc/aio/py_lib/py_ds_aio.cpp | 4 +- csrc/gds/py_lib/deepspeed_gds_op.cpp | 6 +- csrc/gds/py_lib/deepspeed_gds_op.h | 2 +- csrc/gds/py_lib/deepspeed_py_gds_handle.cpp | 20 ++-- csrc/gds/py_lib/deepspeed_py_gds_handle.h | 8 +- csrc/gds/py_lib/py_ds_gds.cpp | 4 +- docs/_tutorials/deepnvme.md | 16 ++-- op_builder/builder.py | 2 +- op_builder/cpu/__init__.py | 1 + op_builder/cpu/async_io.py | 91 +++++++++++++++++++ tests/unit/ops/aio/test_aio.py | 84 +++++++++-------- tests/unit/ops/aio/test_gds.py | 2 +- .../runtime/zero/test_nvme_checkpointing.py | 4 + 29 files changed, 362 insertions(+), 196 deletions(-) create mode 100644 op_builder/cpu/async_io.py diff --git a/accelerator/cpu_accelerator.py b/accelerator/cpu_accelerator.py index d4fcbb0b1e3e..1e4335b19292 100644 --- a/accelerator/cpu_accelerator.py +++ b/accelerator/cpu_accelerator.py @@ -301,9 +301,9 @@ def get_op_builder(self, class_name): # is op_builder from deepspeed or a 3p version? this should only succeed if it's deepspeed # if successful this also means we're doing a local install and not JIT compile path from op_builder import __deepspeed__ # noqa: F401 # type: ignore - from op_builder.cpu import CCLCommBuilder, ShareMemCommBuilder, FusedAdamBuilder, CPUAdamBuilder, NotImplementedBuilder + from op_builder.cpu import AsyncIOBuilder, CCLCommBuilder, ShareMemCommBuilder, FusedAdamBuilder, CPUAdamBuilder, NotImplementedBuilder except ImportError: - from deepspeed.ops.op_builder.cpu import CCLCommBuilder, ShareMemCommBuilder, FusedAdamBuilder, CPUAdamBuilder, NotImplementedBuilder + from deepspeed.ops.op_builder.cpu import AsyncIOBuilder, CCLCommBuilder, ShareMemCommBuilder, FusedAdamBuilder, CPUAdamBuilder, NotImplementedBuilder if class_name == "CCLCommBuilder": return CCLCommBuilder @@ -313,6 +313,8 @@ def get_op_builder(self, class_name): return FusedAdamBuilder elif class_name == "CPUAdamBuilder": return CPUAdamBuilder + elif class_name == "AsyncIOBuilder": + return AsyncIOBuilder else: # return a NotImplementedBuilder to avoid get NoneType[Name] in unit tests return NotImplementedBuilder diff --git a/csrc/aio/common/deepspeed_aio_common.cpp b/csrc/aio/common/deepspeed_aio_common.cpp index a65cc500cc82..81c315e9a558 100644 --- a/csrc/aio/common/deepspeed_aio_common.cpp +++ b/csrc/aio/common/deepspeed_aio_common.cpp @@ -68,8 +68,8 @@ static void _get_aio_latencies(std::vector>& raw_l std::accumulate(lat_usec.begin(), lat_usec.end(), 0) / lat_usec.size(); } -static void _do_io_submit_singles(const long long int n_iocbs, - const long long int iocb_index, +static void _do_io_submit_singles(const int64_t n_iocbs, + const int64_t iocb_index, std::unique_ptr& aio_ctxt, std::vector>& submit_times) { @@ -89,8 +89,8 @@ static void _do_io_submit_singles(const long long int n_iocbs, } } -static void _do_io_submit_block(const long long int n_iocbs, - const long long int iocb_index, +static void _do_io_submit_block(const int64_t n_iocbs, + const int64_t iocb_index, std::unique_ptr& aio_ctxt, std::vector>& submit_times) { @@ -109,18 +109,18 @@ static void _do_io_submit_block(const long long int n_iocbs, assert(submit_ret > 0); } -static int _do_io_complete(const long long int min_completes, - const long long int max_completes, +static int _do_io_complete(const int64_t min_completes, + const int64_t max_completes, std::unique_ptr& aio_ctxt, std::vector>& reap_times) { const auto start_time = std::chrono::high_resolution_clock::now(); - long long int n_completes = io_pgetevents(aio_ctxt->_io_ctxt, - min_completes, - max_completes, - aio_ctxt->_io_events.data(), - nullptr, - nullptr); + int64_t n_completes = io_pgetevents(aio_ctxt->_io_ctxt, + min_completes, + max_completes, + aio_ctxt->_io_events.data(), + nullptr, + nullptr); reap_times.push_back(std::chrono::high_resolution_clock::now() - start_time); assert(n_completes >= min_completes); return n_completes; @@ -134,7 +134,7 @@ void do_aio_operation_sequential(const bool read_op, { struct io_prep_context prep_ctxt(read_op, xfer_ctxt, aio_ctxt->_block_size, &aio_ctxt->_iocbs); - const auto num_io_blocks = static_cast( + const auto num_io_blocks = static_cast( ceil(static_cast(xfer_ctxt->_num_bytes) / aio_ctxt->_block_size)); #if DEBUG_DS_AIO_PERF const auto io_op_name = std::string(read_op ? "read" : "write"); @@ -145,15 +145,14 @@ void do_aio_operation_sequential(const bool read_op, std::vector> submit_times; std::vector> reap_times; const auto max_queue_bytes = - static_cast(aio_ctxt->_queue_depth * aio_ctxt->_block_size); + static_cast(aio_ctxt->_queue_depth * aio_ctxt->_block_size); auto start = std::chrono::high_resolution_clock::now(); - for (long long iocb_index = 0; iocb_index < num_io_blocks; - iocb_index += aio_ctxt->_queue_depth) { + for (int64_t iocb_index = 0; iocb_index < num_io_blocks; iocb_index += aio_ctxt->_queue_depth) { const auto start_offset = iocb_index * aio_ctxt->_block_size; const auto start_buffer = (char*)xfer_ctxt->_mem_buffer + start_offset; const auto n_iocbs = - min(static_cast(aio_ctxt->_queue_depth), (num_io_blocks - iocb_index)); + min(static_cast(aio_ctxt->_queue_depth), (num_io_blocks - iocb_index)); const auto num_bytes = min(max_queue_bytes, (xfer_ctxt->_num_bytes - start_offset)); prep_ctxt.prep_iocbs(n_iocbs, num_bytes, start_buffer, start_offset); @@ -285,13 +284,13 @@ int open_file(const char* filename, const bool read_op) int regular_read(const char* filename, std::vector& buffer) { - long long int num_bytes; + int64_t num_bytes; const auto f_size = get_file_size(filename, num_bytes); assert(f_size != -1); buffer.resize(num_bytes); const auto fd = open(filename, O_RDONLY, 0600); assert(fd != -1); - long long int read_bytes = 0; + int64_t read_bytes = 0; auto r = 0; do { const auto buffer_ptr = buffer.data() + read_bytes; @@ -309,7 +308,7 @@ int regular_read(const char* filename, std::vector& buffer) return 0; } -static bool _validate_buffer(const char* filename, void* aio_buffer, const long long int num_bytes) +static bool _validate_buffer(const char* filename, void* aio_buffer, const int64_t num_bytes) { std::vector regular_buffer; const auto reg_ret = regular_read(filename, regular_buffer); @@ -317,7 +316,7 @@ static bool _validate_buffer(const char* filename, void* aio_buffer, const long std::cout << "regular read of " << filename << " returned " << regular_buffer.size() << " bytes" << std::endl; - if (static_cast(regular_buffer.size()) != num_bytes) { return false; } + if (static_cast(regular_buffer.size()) != num_bytes) { return false; } return (0 == memcmp(aio_buffer, regular_buffer.data(), regular_buffer.size())); } @@ -325,7 +324,7 @@ static bool _validate_buffer(const char* filename, void* aio_buffer, const long bool validate_aio_operation(const bool read_op, const char* filename, void* aio_buffer, - const long long int num_bytes) + const int64_t num_bytes) { const auto msg_suffix = std::string("deepspeed_aio_") + std::string(read_op ? "read()" : "write()") + diff --git a/csrc/aio/common/deepspeed_aio_common.h b/csrc/aio/common/deepspeed_aio_common.h index 2940de945ee8..aa4e49f4f4ed 100644 --- a/csrc/aio/common/deepspeed_aio_common.h +++ b/csrc/aio/common/deepspeed_aio_common.h @@ -35,4 +35,4 @@ int regular_read(const char* filename, std::vector& buffer); bool validate_aio_operation(const bool read_op, const char* filename, void* aio_buffer, - const long long int num_bytes); + const int64_t num_bytes); diff --git a/csrc/aio/common/deepspeed_aio_utils.cpp b/csrc/aio/common/deepspeed_aio_utils.cpp index 763b2c253a34..0536ff6a362e 100644 --- a/csrc/aio/common/deepspeed_aio_utils.cpp +++ b/csrc/aio/common/deepspeed_aio_utils.cpp @@ -18,8 +18,8 @@ const int c_block_size = 128 * 1024; const int c_io_queue_depth = 8; io_xfer_ctxt::io_xfer_ctxt(const int fd, - const long long int file_offset, - const long long int num_bytes, + const int64_t file_offset, + const int64_t num_bytes, const void* buffer) : _fd(fd), _base_offset(file_offset), _mem_buffer(buffer), _num_bytes(num_bytes) { @@ -36,7 +36,7 @@ io_prep_context::io_prep_context(const bool read_op, void io_prep_context::prep_iocbs(const int n_iocbs, const size_t num_bytes, const void* start_buffer, - const long long int start_offset) + const int64_t start_offset) { assert(static_cast(n_iocbs) <= _iocbs->size()); for (auto i = 0; i < n_iocbs; ++i) { @@ -64,24 +64,24 @@ io_prep_generator::io_prep_generator(const bool read_op, _next_iocb_index(0) { _num_io_blocks = - static_cast(ceil(static_cast(xfer_ctxt->_num_bytes) / block_size)); + static_cast(ceil(static_cast(xfer_ctxt->_num_bytes) / block_size)); _remaining_io_blocks = _num_io_blocks; } int io_prep_generator::prep_iocbs(const int n_iocbs, std::vector* iocbs) { if ((_remaining_bytes) == 0 || (_remaining_io_blocks == 0)) { - assert(static_cast(_remaining_bytes) == _remaining_io_blocks); + assert(static_cast(_remaining_bytes) == _remaining_io_blocks); return 0; } assert(static_cast(n_iocbs) <= iocbs->size()); - auto actual_n_iocbs = min(static_cast(n_iocbs), _remaining_io_blocks); + auto actual_n_iocbs = min(static_cast(n_iocbs), _remaining_io_blocks); for (auto i = 0; i < actual_n_iocbs; ++i, ++_next_iocb_index) { const auto xfer_offset = _xfer_ctxt->_base_offset + (_next_iocb_index * _block_size); const auto xfer_buffer = (char*)_xfer_ctxt->_mem_buffer + xfer_offset; - const auto num_bytes = min(static_cast(_block_size), _remaining_bytes); + const auto num_bytes = min(static_cast(_block_size), _remaining_bytes); if (_read_op) { io_prep_pread(iocbs->at(i), _xfer_ctxt->_fd, xfer_buffer, num_bytes, xfer_offset); @@ -95,7 +95,7 @@ int io_prep_generator::prep_iocbs(const int n_iocbs, std::vector* return actual_n_iocbs; } -int get_file_size(const char* filename, long long int& size) +int get_file_size(const char* filename, int64_t& size) { struct stat st; if (stat(filename, &st) == -1) { return -1; } @@ -103,7 +103,7 @@ int get_file_size(const char* filename, long long int& size) return 0; } -void* ds_page_aligned_alloc(const size_t size, const bool lock) +void* ds_page_aligned_alloc(const int64_t size, const bool lock) { void* ptr; int retval; diff --git a/csrc/aio/common/deepspeed_aio_utils.h b/csrc/aio/common/deepspeed_aio_utils.h index 9c58c2286610..20e81fe8eebd 100644 --- a/csrc/aio/common/deepspeed_aio_utils.h +++ b/csrc/aio/common/deepspeed_aio_utils.h @@ -30,13 +30,13 @@ Functionality for swapping optimizer tensors to/from (NVMe) storage devices. struct io_xfer_ctxt { const int _fd; - const long long int _base_offset; + const int64_t _base_offset; const void* _mem_buffer; - const long long int _num_bytes; + const int64_t _num_bytes; io_xfer_ctxt(const int fd, - const long long int file_offset, - const long long int num_bytes, + const int64_t file_offset, + const int64_t num_bytes, const void* buffer); }; @@ -54,7 +54,7 @@ struct io_prep_context { void prep_iocbs(const int n_iocbs, const size_t num_bytes, const void* start_buffer, - const long long int start_offset); + const int64_t start_offset); }; struct io_prep_generator { @@ -62,10 +62,10 @@ struct io_prep_generator { const std::unique_ptr& _xfer_ctxt; const size_t _block_size; - long long int _remaining_bytes; - long long int _num_io_blocks; - long long int _remaining_io_blocks; - long long int _next_iocb_index; + int64_t _remaining_bytes; + int64_t _num_io_blocks; + int64_t _remaining_io_blocks; + int64_t _next_iocb_index; io_prep_generator(const bool read_op, const std::unique_ptr& xfer_ctxt, @@ -74,6 +74,6 @@ struct io_prep_generator { int prep_iocbs(const int n_iocbs, std::vector* iocbs); }; -void* ds_page_aligned_alloc(const size_t size, const bool lock = false); +void* ds_page_aligned_alloc(const int64_t size, const bool lock = false); -int get_file_size(const char* filename, long long int& size); +int get_file_size(const char* filename, int64_t& size); diff --git a/csrc/aio/py_lib/deepspeed_aio_op_desc.cpp b/csrc/aio/py_lib/deepspeed_aio_op_desc.cpp index dc820be528d0..6f311c5400c7 100644 --- a/csrc/aio/py_lib/deepspeed_aio_op_desc.cpp +++ b/csrc/aio/py_lib/deepspeed_aio_op_desc.cpp @@ -11,16 +11,16 @@ io_op_desc_t::io_op_desc_t(const bool read_op, const torch::Tensor& buffer, const int fd, const char* filename, - const long long int file_num_bytes, - const int num_threads, + const int64_t file_num_bytes, + const int intra_op_parallelism, const bool validate) : _read_op(read_op), _buffer(buffer), _fd(fd), _filename(filename), _file_num_bytes(file_num_bytes), - _num_threads(num_threads), - _num_bytes_per_thread(file_num_bytes / num_threads), + _intra_op_parallelism(intra_op_parallelism), + _num_bytes_per_thread(file_num_bytes / intra_op_parallelism), _validate(validate) { } diff --git a/csrc/aio/py_lib/deepspeed_aio_op_desc.h b/csrc/aio/py_lib/deepspeed_aio_op_desc.h index 350d28d29d58..f841b8ce520a 100644 --- a/csrc/aio/py_lib/deepspeed_aio_op_desc.h +++ b/csrc/aio/py_lib/deepspeed_aio_op_desc.h @@ -14,9 +14,9 @@ struct io_op_desc_t { torch::Tensor _buffer; int _fd; const std::string _filename; - const long long int _file_num_bytes; - const int _num_threads; - const long long int _num_bytes_per_thread; + const int64_t _file_num_bytes; + const int _intra_op_parallelism; + const int64_t _num_bytes_per_thread; torch::Tensor _contiguous_buffer; const bool _validate; @@ -24,8 +24,8 @@ struct io_op_desc_t { const torch::Tensor& buffer, const int fd, const char* filename, - const long long int file_num_bytes, - const int num_threads, + const int64_t file_num_bytes, + const int intra_op_parallelism, const bool validate); virtual void run(const int tid, diff --git a/csrc/aio/py_lib/deepspeed_cpu_op.cpp b/csrc/aio/py_lib/deepspeed_cpu_op.cpp index 41790b99bb88..da1a52d9c6e3 100644 --- a/csrc/aio/py_lib/deepspeed_cpu_op.cpp +++ b/csrc/aio/py_lib/deepspeed_cpu_op.cpp @@ -4,31 +4,30 @@ // DeepSpeed Team #include "deepspeed_cpu_op.h" +#include "deepspeed_pin_tensor.h" using namespace std; -cpu_op_desc_t::cpu_op_desc_t(const bool read_op, - const torch::Tensor& buffer, - const int fd, - const char* filename, - const long long int file_num_bytes, - const int num_threads, - const bool validate) - : io_op_desc_t(read_op, buffer, fd, filename, file_num_bytes, num_threads, validate), - _cpu_buffer(buffer) +cpu_op_desc_t::cpu_op_desc_t( + const bool read_op, + const torch::Tensor& buffer, + const std::unique_ptr& pinned_tensor_mgr, + const int fd, + const char* filename, + const int64_t file_num_bytes, + const int intra_op_parallelism, + const bool validate) + : io_op_desc_t(read_op, buffer, fd, filename, file_num_bytes, intra_op_parallelism, validate), + _cpu_buffer(buffer), + _pinned_tensor_mgr(pinned_tensor_mgr), + _is_managed_bounce_buffer(false) { // Need to use CPU bounce buffer if buffer is not a page-locked DRAM memory. - _use_bounce_buffer = !(_buffer.is_cpu() && _buffer.is_pinned()); + _use_bounce_buffer = + !(_buffer.is_cpu() && (_buffer.is_pinned() || _pinned_tensor_mgr->is_managed(_buffer))); if (_use_bounce_buffer) { - if (_read_op) { - auto options = torch::TensorOptions() - .dtype(_buffer.dtype()) - .layout(_buffer.layout()) - .device(torch::kCPU); - _cpu_buffer = torch::empty(_buffer.nbytes(), options).pin_memory(); - } else { - _cpu_buffer = _buffer.to(torch::kCPU).pin_memory(); - } + _alloc_bounce_buffer(); + if (!_read_op) { _cpu_buffer.copy_(_buffer); } } _contiguous_buffer = _cpu_buffer.contiguous(); } @@ -37,15 +36,20 @@ char* cpu_op_desc_t::data_ptr() const { return (char*)_contiguous_buffer.data_pt void cpu_op_desc_t::finish() { - if (_read_op) { - if (_buffer.is_cuda()) { _buffer.copy_(_cpu_buffer.to(torch::kCUDA)); } - if (_buffer.is_xpu()) { _buffer.copy_(_cpu_buffer.to(torch::kXPU)); } + if (_use_bounce_buffer) { + if (_read_op) { + if (_buffer.is_cuda()) { _buffer.copy_(_cpu_buffer.to(torch::kCUDA)); } + if (_buffer.is_xpu()) { _buffer.copy_(_cpu_buffer.to(torch::kXPU)); } + if (_buffer.is_cpu()) { _buffer.copy_(_cpu_buffer); } #if defined(__ENABLE_CANN__) - if (torch_npu::utils::is_npu(_buffer)) { - auto device = at::Device("npu:0"); - _buffer.copy_(_cpu_buffer.to(device)); - } + if (torch_npu::utils::is_npu(_buffer)) { + auto device = at::Device("npu:0"); + _buffer.copy_(_cpu_buffer.to(device)); + } #endif + } + + _free_bounce_buffer(); } } @@ -58,7 +62,7 @@ void cpu_op_desc_t::run(const int tid, std::unique_ptr& aio_ctxt, deepspeed_aio_config_t* aio_config) { - assert(tid < _num_threads); + assert(tid < _intra_op_parallelism); const auto base_offset = _num_bytes_per_thread * tid; std::unique_ptr xfer_ctxt( @@ -70,3 +74,24 @@ void cpu_op_desc_t::run(const int tid, do_aio_operation_sequential(_read_op, aio_ctxt, xfer_ctxt, aio_config, nullptr); } } + +void cpu_op_desc_t::_alloc_bounce_buffer() +{ + auto options = torch::TensorOptions() + .dtype(_buffer.dtype()) + .layout(_buffer.layout()) + .device(torch::kCPU) + .requires_grad(false); + +#if defined(__CUDA_ARCH__) + _cpu_buffer = torch::empty(_buffer.numel(), options).pin_memory(); +#else + _is_managed_bounce_buffer = true; + _cpu_buffer = _pinned_tensor_mgr->alloc(_buffer.numel(), options); +#endif +} + +void cpu_op_desc_t::_free_bounce_buffer() +{ + if (_is_managed_bounce_buffer) { _pinned_tensor_mgr->free(_cpu_buffer); } +} diff --git a/csrc/aio/py_lib/deepspeed_cpu_op.h b/csrc/aio/py_lib/deepspeed_cpu_op.h index da96dd2b1d50..9de2fa254048 100644 --- a/csrc/aio/py_lib/deepspeed_cpu_op.h +++ b/csrc/aio/py_lib/deepspeed_cpu_op.h @@ -10,13 +10,16 @@ struct cpu_op_desc_t : io_op_desc_t { torch::Tensor _cpu_buffer; bool _use_bounce_buffer; + bool _is_managed_bounce_buffer; + const std::unique_ptr& _pinned_tensor_mgr; cpu_op_desc_t(const bool read_op, const torch::Tensor& buffer, + const std::unique_ptr& pinned_tensor_mgr, const int fd, const char* filename, - const long long int file_num_bytes, - const int num_threads, + const int64_t file_num_bytes, + const int intra_op_parallelism, const bool validate); void run(const int tid, @@ -28,4 +31,7 @@ struct cpu_op_desc_t : io_op_desc_t { void validate(); void finish(); + + void _alloc_bounce_buffer(); + void _free_bounce_buffer(); }; diff --git a/csrc/aio/py_lib/deepspeed_pin_tensor.cpp b/csrc/aio/py_lib/deepspeed_pin_tensor.cpp index 752823dc7dd2..6d2800468e06 100644 --- a/csrc/aio/py_lib/deepspeed_pin_tensor.cpp +++ b/csrc/aio/py_lib/deepspeed_pin_tensor.cpp @@ -19,17 +19,23 @@ deepspeed_pin_tensor_t::~deepspeed_pin_tensor_t() _locked_tensors.clear(); } -torch::Tensor deepspeed_pin_tensor_t::alloc(const size_t num_elem, const at::ScalarType& elem_type) +torch::Tensor deepspeed_pin_tensor_t::alloc(const int64_t num_elem, + const torch::TensorOptions& options) { - const auto num_bytes = num_elem * elementSize(elem_type); + const auto scalar_dtype = torch::typeMetaToScalarType(options.dtype()); + const auto num_bytes = num_elem * torch::elementSize(scalar_dtype); auto pinned_buffer = ds_page_aligned_alloc(num_bytes, true); assert(nullptr != pinned_buffer); _locked_tensors[pinned_buffer] = num_bytes; - auto options = torch::TensorOptions().dtype(elem_type).device(torch::kCPU); + return at::from_blob(pinned_buffer, static_cast(num_elem), options); +} - return at::from_blob(pinned_buffer, static_cast(num_bytes), options); +torch::Tensor deepspeed_pin_tensor_t::alloc(const int64_t num_elem, const at::ScalarType& elem_type) +{ + auto options = torch::TensorOptions().dtype(elem_type).device(torch::kCPU).requires_grad(false); + return alloc(num_elem, options); } bool deepspeed_pin_tensor_t::free(torch::Tensor& locked_tensor) @@ -43,3 +49,11 @@ bool deepspeed_pin_tensor_t::free(torch::Tensor& locked_tensor) return false; } + +bool deepspeed_pin_tensor_t::is_managed(const torch::Tensor& buffer) +{ + if (!buffer.is_cpu()) { return false; } + auto addr = buffer.data_ptr(); + if (_locked_tensors.find(addr) != _locked_tensors.end()) { return true; } + return false; +}; diff --git a/csrc/aio/py_lib/deepspeed_pin_tensor.h b/csrc/aio/py_lib/deepspeed_pin_tensor.h index 4350a4ac7df6..4b8ad7e76085 100644 --- a/csrc/aio/py_lib/deepspeed_pin_tensor.h +++ b/csrc/aio/py_lib/deepspeed_pin_tensor.h @@ -15,13 +15,16 @@ Functionality for managing CPU tensors occupying page-locked memory. #include "deepspeed_py_aio.h" struct deepspeed_pin_tensor_t { - std::map _locked_tensors; + std::map _locked_tensors; deepspeed_pin_tensor_t() = default; ~deepspeed_pin_tensor_t(); - torch::Tensor alloc(const size_t num_elem, const at::ScalarType& elem_type); + torch::Tensor alloc(const int64_t num_elem, const at::ScalarType& elem_type); + torch::Tensor alloc(const int64_t num_elem, const torch::TensorOptions& options); bool free(torch::Tensor& locked_tensor); + + bool is_managed(const torch::Tensor& buffer); }; diff --git a/csrc/aio/py_lib/deepspeed_py_aio.cpp b/csrc/aio/py_lib/deepspeed_py_aio.cpp index eac268d33433..02b04057d1ac 100644 --- a/csrc/aio/py_lib/deepspeed_py_aio.cpp +++ b/csrc/aio/py_lib/deepspeed_py_aio.cpp @@ -51,7 +51,7 @@ int deepspeed_py_aio_write(const torch::Tensor& buffer, if (fd == -1) { return -1; } auto write_buffer = (char*)buffer.data_ptr(); - const auto num_write_bytes = static_cast(buffer.nbytes()); + const auto num_write_bytes = static_cast(buffer.nbytes()); std::unique_ptr xfer_ctxt(new io_xfer_ctxt(fd, 0, num_write_bytes, write_buffer)); std::unique_ptr aio_ctxt(new aio_context(config._block_size, config._queue_depth)); @@ -83,7 +83,7 @@ int deepspeed_py_aio_read(torch::Tensor& buffer, const bool validate) { const auto start_time = std::chrono::high_resolution_clock::now(); - long long num_file_bytes; + int64_t num_file_bytes; if (-1 == get_file_size(filename, num_file_bytes)) { const auto error_code = errno; report_file_error(filename, " fstat for read", error_code); @@ -95,7 +95,7 @@ int deepspeed_py_aio_read(torch::Tensor& buffer, if (fd == -1) { return -1; } auto read_buffer = (char*)buffer.data_ptr(); - assert(static_cast(buffer.nbytes()) == num_file_bytes); + assert(static_cast(buffer.nbytes()) == num_file_bytes); std::unique_ptr xfer_ctxt(new io_xfer_ctxt(fd, 0, num_file_bytes, read_buffer)); std::unique_ptr aio_ctxt(new aio_context(config._block_size, config._queue_depth)); diff --git a/csrc/aio/py_lib/deepspeed_py_aio_handle.cpp b/csrc/aio/py_lib/deepspeed_py_aio_handle.cpp index c7ca5e82afde..2b1093e99286 100644 --- a/csrc/aio/py_lib/deepspeed_py_aio_handle.cpp +++ b/csrc/aio/py_lib/deepspeed_py_aio_handle.cpp @@ -16,8 +16,12 @@ deepspeed_aio_handle_t::deepspeed_aio_handle_t(const int block_size, const int queue_depth, const bool single_submit, const bool overlap_events, - const int num_threads) - : deepspeed_io_handle_t(block_size, queue_depth, single_submit, overlap_events, num_threads) + const int intra_op_parallelism) + : deepspeed_io_handle_t(block_size, + queue_depth, + single_submit, + overlap_events, + intra_op_parallelism) { } diff --git a/csrc/aio/py_lib/deepspeed_py_aio_handle.h b/csrc/aio/py_lib/deepspeed_py_aio_handle.h index eb6b90ea22f0..1398df9a56c9 100644 --- a/csrc/aio/py_lib/deepspeed_py_aio_handle.h +++ b/csrc/aio/py_lib/deepspeed_py_aio_handle.h @@ -16,7 +16,7 @@ struct deepspeed_aio_handle_t : deepspeed_io_handle_t { const int queue_depth, const bool single_submit, const bool overlap_events, - const int num_threads); + const int intra_op_parallelism); ~deepspeed_aio_handle_t(); }; diff --git a/csrc/aio/py_lib/deepspeed_py_io_handle.cpp b/csrc/aio/py_lib/deepspeed_py_io_handle.cpp index bdf2a858d797..48ea8a1339d4 100644 --- a/csrc/aio/py_lib/deepspeed_py_io_handle.cpp +++ b/csrc/aio/py_lib/deepspeed_py_io_handle.cpp @@ -18,16 +18,16 @@ deepspeed_io_handle_t::deepspeed_io_handle_t(const int block_size, const int queue_depth, const bool single_submit, const bool overlap_events, - const int num_threads) + const int intra_op_parallelism) : _aio_ctxt(new aio_context(block_size, queue_depth)), _single_submit(single_submit), _overlap_events(overlap_events), - _num_threads(num_threads), + _intra_op_parallelism(intra_op_parallelism), _aio_config(block_size, queue_depth, single_submit, overlap_events, false), _num_pending_ops(0), _pinned_tensor_mgr(new deepspeed_pin_tensor_t()) { - for (auto i = 0; i < num_threads; ++i) { + for (auto i = 0; i < intra_op_parallelism; ++i) { _thread_contexts.push_back(std::make_shared(i, _aio_config)); } @@ -56,7 +56,7 @@ const bool deepspeed_io_handle_t::get_single_submit() const { return _single_sub const bool deepspeed_io_handle_t::get_overlap_events() const { return _overlap_events; } -const int deepspeed_io_handle_t::get_thread_count() const { return _num_threads; } +const int deepspeed_io_handle_t::get_intra_op_parallelism() const { return _intra_op_parallelism; } int deepspeed_io_handle_t::read(torch::Tensor& buffer, const char* filename, const bool validate) { @@ -64,13 +64,13 @@ int deepspeed_io_handle_t::read(torch::Tensor& buffer, const char* filename, con assert(_aio_ctxt); - long long num_file_bytes; + int64_t num_file_bytes; if (-1 == get_file_size(filename, num_file_bytes)) { const auto error_code = errno; report_file_error(filename, " fstat for read", error_code); return -1; } - assert(static_cast(buffer.nbytes()) == num_file_bytes); + assert(static_cast(buffer.nbytes()) == num_file_bytes); const auto fd = open_file(filename, true); if (fd == -1) { return -1; } @@ -108,7 +108,7 @@ int deepspeed_io_handle_t::write(const torch::Tensor& buffer, if (fd == -1) { return -1; } auto write_buffer = (char*)buffer.data_ptr(); - const auto num_write_bytes = static_cast(buffer.nbytes()); + const auto num_write_bytes = static_cast(buffer.nbytes()); std::unique_ptr xfer_ctxt(new io_xfer_ctxt(fd, 0, num_write_bytes, write_buffer)); if (_aio_config._overlap_events) { @@ -188,13 +188,12 @@ int deepspeed_io_handle_t::wait() return num_completed_ops; } -bool deepspeed_io_handle_t::_is_valid_parallel_aio_op(const bool read_op, - const long long int num_bytes) +bool deepspeed_io_handle_t::_is_valid_parallel_aio_op(const bool read_op, const int64_t num_bytes) { const auto op_string = read_op ? "Read" : "Write"; - if (num_bytes % get_thread_count()) { + if (num_bytes % get_intra_op_parallelism()) { std::cout << "deepspeed_aio failure: parallel " << op_string << " num_bytes = " << num_bytes - << " not divisible by thread count = " << get_thread_count() << std::endl; + << " not divisible by thread count = " << get_intra_op_parallelism() << std::endl; return false; } @@ -206,11 +205,17 @@ std::shared_ptr deepspeed_io_handle_t::_create_io_op_desc( const torch::Tensor& buffer, const int fd, const char* filename, - const long long int file_num_bytes, + const int64_t file_num_bytes, const bool validate) { - return std::make_shared( - read_op, buffer, fd, filename, file_num_bytes, _num_threads, validate); + return std::make_shared(read_op, + buffer, + _pinned_tensor_mgr, + fd, + filename, + file_num_bytes, + _intra_op_parallelism, + validate); } int deepspeed_io_handle_t::pread(const torch::Tensor& buffer, @@ -218,19 +223,19 @@ int deepspeed_io_handle_t::pread(const torch::Tensor& buffer, const bool validate, const bool async) { - long long num_file_bytes; + int64_t num_file_bytes; if (-1 == get_file_size(filename, num_file_bytes)) { const auto error_code = errno; report_file_error(filename, " fstat for read", error_code); return -1; } - const auto buffer_bytes = static_cast(buffer.nbytes()); + const auto buffer_bytes = static_cast(buffer.nbytes()); if (buffer_bytes != num_file_bytes) { std::cout << filename << ": buffer nbytes != file bytes " << buffer_bytes << " != " << num_file_bytes << std::endl; } - assert(static_cast(buffer.nbytes()) == num_file_bytes); - assert((num_file_bytes % _num_threads) == 0); + assert(buffer_bytes == num_file_bytes); + assert((num_file_bytes % _intra_op_parallelism) == 0); if (!_is_valid_parallel_aio_op(true, num_file_bytes)) { return -1; } @@ -251,8 +256,8 @@ int deepspeed_io_handle_t::pwrite(const torch::Tensor& buffer, const bool validate, const bool async) { - const auto num_write_bytes = static_cast(buffer.nbytes()); - assert((num_write_bytes % _num_threads) == 0); + const auto num_write_bytes = static_cast(buffer.nbytes()); + assert((num_write_bytes % _intra_op_parallelism) == 0); if (!_is_valid_parallel_aio_op(false, num_write_bytes)) { return -1; } @@ -288,7 +293,7 @@ int deepspeed_io_handle_t::async_pwrite(const torch::Tensor& buffer, const char* return pwrite(buffer, filename, false, true); } -at::Tensor deepspeed_io_handle_t::new_cpu_locked_tensor(const size_t num_elem, +at::Tensor deepspeed_io_handle_t::new_cpu_locked_tensor(const int64_t num_elem, const torch::Tensor& example_tensor) { return _pinned_tensor_mgr->alloc(num_elem, example_tensor.scalar_type()); diff --git a/csrc/aio/py_lib/deepspeed_py_io_handle.h b/csrc/aio/py_lib/deepspeed_py_io_handle.h index 2974ebe87bfc..4fedf8080818 100644 --- a/csrc/aio/py_lib/deepspeed_py_io_handle.h +++ b/csrc/aio/py_lib/deepspeed_py_io_handle.h @@ -16,7 +16,7 @@ struct deepspeed_io_handle_t { std::unique_ptr _aio_ctxt; const bool _single_submit; const bool _overlap_events; - const int _num_threads; + const int _intra_op_parallelism; deepspeed_aio_config_t _aio_config; std::vector> _thread_contexts; @@ -28,7 +28,7 @@ struct deepspeed_io_handle_t { const int queue_depth, const bool single_submit, const bool overlap_events, - const int num_threads); + const int intra_op_parallelism); virtual ~deepspeed_io_handle_t() = 0; @@ -36,7 +36,7 @@ struct deepspeed_io_handle_t { const int get_queue_depth() const; const bool get_single_submit() const; const bool get_overlap_events() const; - const int get_thread_count() const; + const int get_intra_op_parallelism() const; int read(torch::Tensor& buffer, const char* filename, const bool validate); @@ -61,7 +61,8 @@ struct deepspeed_io_handle_t { int async_pwrite(const torch::Tensor& buffer, const char* filename); // TODO: Make API's args to be shape and dtype. - torch::Tensor new_cpu_locked_tensor(const size_t num_elem, const torch::Tensor& example_tensor); + torch::Tensor new_cpu_locked_tensor(const int64_t num_elem, + const torch::Tensor& example_tensor); bool free_cpu_locked_tensor(torch::Tensor&); @@ -73,13 +74,12 @@ struct deepspeed_io_handle_t { std::shared_ptr _wait_for_aio_work(); - bool _is_valid_parallel_aio_op(const bool read_op, const long long int num_bytes); + bool _is_valid_parallel_aio_op(const bool read_op, const int64_t num_bytes); - virtual std::shared_ptr _create_io_op_desc( - const bool read_op, - const torch::Tensor& buffer, - const int fd, - const char* filename, - const long long int file_num_bytes, - const bool validate); + virtual std::shared_ptr _create_io_op_desc(const bool read_op, + const torch::Tensor& buffer, + const int fd, + const char* filename, + const int64_t file_num_bytes, + const bool validate); }; diff --git a/csrc/aio/py_lib/py_ds_aio.cpp b/csrc/aio/py_lib/py_ds_aio.cpp index 3171d0c6bf3c..b80fa2d6c8e6 100644 --- a/csrc/aio/py_lib/py_ds_aio.cpp +++ b/csrc/aio/py_lib/py_ds_aio.cpp @@ -27,13 +27,13 @@ PYBIND11_MODULE(TORCH_EXTENSION_NAME, m) "queue_depth"_a = 128, "single_submit"_a = false, "overlap_events"_a = false, - "num_threads"_a = 1) + "intra_op_parallelism"_a = 1) .def("get_block_size", &deepspeed_aio_handle_t::get_block_size) .def("get_queue_depth", &deepspeed_aio_handle_t::get_queue_depth) .def("get_single_submit", &deepspeed_aio_handle_t::get_single_submit) .def("get_overlap_events", &deepspeed_aio_handle_t::get_overlap_events) - .def("get_thread_count", &deepspeed_aio_handle_t::get_thread_count) + .def("get_intra_op_parallelism", &deepspeed_aio_handle_t::get_intra_op_parallelism) .def("read", &deepspeed_aio_handle_t::read, diff --git a/csrc/gds/py_lib/deepspeed_gds_op.cpp b/csrc/gds/py_lib/deepspeed_gds_op.cpp index c370a448e5a2..dae2eef21c6f 100644 --- a/csrc/gds/py_lib/deepspeed_gds_op.cpp +++ b/csrc/gds/py_lib/deepspeed_gds_op.cpp @@ -95,9 +95,9 @@ gds_op_desc_t::gds_op_desc_t(const bool read_op, const int fd, const char* filename, const long long int file_num_bytes, - const int num_threads, + const int intra_op_parallelism, const bool validate) - : io_op_desc_t(read_op, buffer, fd, filename, file_num_bytes, num_threads, validate) + : io_op_desc_t(read_op, buffer, fd, filename, file_num_bytes, intra_op_parallelism, validate) { _contiguous_buffer = _buffer.contiguous(); const int64_t device = _buffer.get_device(); @@ -123,7 +123,7 @@ void gds_op_desc_t::run(const int tid, std::unique_ptr& aio_ctxt, deepspeed_aio_config_t* aio_config) { - assert(tid < _num_threads); + assert(tid < _intra_op_parallelism); check_cudaruntimecall(cudaSetDevice(_buffer.get_device())); int64_t buf_offset = data_ptr() + (_num_bytes_per_thread * tid) - (char*)_base_ptr; const auto file_offset = _num_bytes_per_thread * tid; diff --git a/csrc/gds/py_lib/deepspeed_gds_op.h b/csrc/gds/py_lib/deepspeed_gds_op.h index b7fab64d4054..c9d4c076f189 100644 --- a/csrc/gds/py_lib/deepspeed_gds_op.h +++ b/csrc/gds/py_lib/deepspeed_gds_op.h @@ -23,7 +23,7 @@ struct gds_op_desc_t : io_op_desc_t { const int fd, const char* filename, const long long int file_num_bytes, - const int num_threads, + const int intra_op_parallelism, const bool validate); void run(const int tid, diff --git a/csrc/gds/py_lib/deepspeed_py_gds_handle.cpp b/csrc/gds/py_lib/deepspeed_py_gds_handle.cpp index 15fd516acaae..43705939dc3e 100644 --- a/csrc/gds/py_lib/deepspeed_py_gds_handle.cpp +++ b/csrc/gds/py_lib/deepspeed_py_gds_handle.cpp @@ -19,21 +19,25 @@ deepspeed_gds_handle_t::deepspeed_gds_handle_t(const int block_size, const int queue_depth, const bool single_submit, const bool overlap_events, - const int num_threads) - : deepspeed_io_handle_t(block_size, queue_depth, single_submit, overlap_events, 1) + const int intra_op_parallelism) + : deepspeed_io_handle_t(block_size, queue_depth, single_submit, overlap_events, 1), + _intra_gds_op_parallelism(intra_op_parallelism) { - _init_cuFile(block_size, queue_depth, num_threads); + _init_cuFile(block_size, queue_depth); } deepspeed_gds_handle_t::~deepspeed_gds_handle_t() { _close_cuFile(); } -void deepspeed_gds_handle_t::_init_cuFile(const int block_size, - const int queue_depth, - const int num_threads) +const int deepspeed_gds_handle_t::get_intra_op_parallelism() const +{ + return _intra_gds_op_parallelism; +} + +void deepspeed_gds_handle_t::_init_cuFile(const int block_size, const int queue_depth) { if (deepspeed_gds_handle_t::s_cuFile_init == 0) { std::string depthStr = std::to_string(queue_depth); - std::string threadsStr = std::to_string(num_threads); + std::string threadsStr = std::to_string(_intra_gds_op_parallelism); std::string json1 = R"({"execution": {"max_io_queue_depth": )" + depthStr + ", "; std::string json2 = R"("max_request_parallelism": )" + threadsStr + ", "; std::string json3 = R"("max_io_threads": )" + threadsStr + ", "; @@ -107,7 +111,7 @@ std::shared_ptr deepspeed_gds_handle_t::_create_io_op_desc( { if (buffer.is_cuda()) { return std::make_shared( - read_op, buffer, fd, filename, file_num_bytes, _num_threads, validate); + read_op, buffer, fd, filename, file_num_bytes, _intra_op_parallelism, validate); } return deepspeed_io_handle_t::_create_io_op_desc( read_op, buffer, fd, filename, file_num_bytes, validate); diff --git a/csrc/gds/py_lib/deepspeed_py_gds_handle.h b/csrc/gds/py_lib/deepspeed_py_gds_handle.h index f324e6b65e80..a3c10a4f6467 100644 --- a/csrc/gds/py_lib/deepspeed_py_gds_handle.h +++ b/csrc/gds/py_lib/deepspeed_py_gds_handle.h @@ -12,11 +12,13 @@ Functionality for swapping optimizer tensors to/from (NVMe) storage devices. #include "deepspeed_py_io_handle.h" struct deepspeed_gds_handle_t : deepspeed_io_handle_t { + const int _intra_gds_op_parallelism; + deepspeed_gds_handle_t(const int block_size, const int queue_depth, const bool single_submit, const bool overlap_events, - const int num_threads); + const int intra_op_parallelism); ~deepspeed_gds_handle_t(); @@ -29,10 +31,12 @@ struct deepspeed_gds_handle_t : deepspeed_io_handle_t { bool unpin_device_tensor(const torch::Tensor& buffer); - void _init_cuFile(const int block_size, const int queue_length, const int num_threads); + void _init_cuFile(const int block_size, const int queue_depth); void _close_cuFile(); + const int get_intra_op_parallelism() const; + std::shared_ptr _create_io_op_desc(const bool read_op, const torch::Tensor& buffer, const int fd, diff --git a/csrc/gds/py_lib/py_ds_gds.cpp b/csrc/gds/py_lib/py_ds_gds.cpp index 66eb34d4ea8c..57bf8d2207c4 100644 --- a/csrc/gds/py_lib/py_ds_gds.cpp +++ b/csrc/gds/py_lib/py_ds_gds.cpp @@ -20,13 +20,13 @@ PYBIND11_MODULE(TORCH_EXTENSION_NAME, m) "queue_depth"_a = 128, "single_submit"_a = false, "overlap_events"_a = false, - "num_threads"_a = 1) + "intra_op_parallelism"_a = 1) .def("get_block_size", &deepspeed_gds_handle_t::get_block_size) .def("get_queue_depth", &deepspeed_gds_handle_t::get_queue_depth) .def("get_single_submit", &deepspeed_gds_handle_t::get_single_submit) .def("get_overlap_events", &deepspeed_gds_handle_t::get_overlap_events) - .def("get_thread_count", &deepspeed_gds_handle_t::get_thread_count) + .def("get_intra_op_parallelism", &deepspeed_gds_handle_t::get_intra_op_parallelism) .def("read", &deepspeed_gds_handle_t::read, diff --git a/docs/_tutorials/deepnvme.md b/docs/_tutorials/deepnvme.md index 70c6ac097963..4ed528412eae 100644 --- a/docs/_tutorials/deepnvme.md +++ b/docs/_tutorials/deepnvme.md @@ -50,7 +50,7 @@ Type "help", "copyright", "credits" or "license" for more information. >>> h = AsyncIOBuilder().load().aio_handle() >>> h. h.async_pread( h.free_cpu_locked_tensor( h.get_overlap_events( h.get_single_submit( h.new_cpu_locked_tensor( h.pwrite( h.sync_pread( h.wait( -h.async_pwrite( h.get_block_size( h.get_queue_depth( h.get_thread_count( h.pread( h.read( h.sync_pwrite( h.write( +h.async_pwrite( h.get_block_size( h.get_queue_depth( h.get_intra_op_parallelism( h.pread( h.read( h.sync_pwrite( h.write( ``` The APIs of interest for performing I/O operations are those named with `pread` and `pwrite` substrings. For brevity, we will focus on the file write APIs, namely `sync_pwrite`, `async_pwrite`, and `pwrite`. We will discuss only `sync_pwrite` and `async_pwrite` below because they are specializations of `pwrite`. @@ -107,7 +107,7 @@ Similar safety problems apply to reading the destination tensor of a non-blockin ### Parallel File Write -An important DeepNVMe optimization is the ability to parallelize individual I/O operations. This optimization is enabled by specifying the desired parallelism degree when constructing a DeepNVMe handle. Subsequent I/O operations with that handle are automatically parallelized over the requested number of host or device threads, as appropriate. I/O parallelism is composable with either the blocking or non-blocking I/O APIs. The example below illustrates 4-way parallelism of a file write using `async_pwrite`. Note the use of `num_threads` argument to specify the desired parallelism degree in handle creation. +An important DeepNVMe optimization is the ability to parallelize individual I/O operations. This optimization is enabled by specifying the desired parallelism degree when constructing a DeepNVMe handle. Subsequent I/O operations with that handle are automatically parallelized over the requested number of host or device threads, as appropriate. I/O parallelism is composable with either the blocking or non-blocking I/O APIs. The example below illustrates 4-way parallelism of a file write using `async_pwrite`. Note the use of `intra_op_parallelism` argument to specify the desired parallelism degree in handle creation. ```bash >>> import os @@ -116,7 +116,7 @@ False >>> import torch >>> t=torch.empty(1024**3, dtype=torch.uint8).cuda() >>> from deepspeed.ops.op_builder import AsyncIOBuilder ->>> h = AsyncIOBuilder().load().aio_handle(num_threads=4) +>>> h = AsyncIOBuilder().load().aio_handle(intra_op_parallelism=4) >>> h.async_pwrite(t,'/local_nvme/test_1GB.pt') >>> h.wait() 1 @@ -188,7 +188,7 @@ This tutorial has been significantly improved by feedback from [Guanhua Wang](ht ## Appendix ### Advanced Handle Creation -Achieving peak I/O performance with DeepNVMe requires careful configuration of handle creation. In particular, the parameters of `aio_handle` and `gds_handle` constructors are performance-critical because they determine how efficiently DeepNVMe interacts with the underlying storage subsystem (i.e., `libaio`, GDS, PCIe, and SSD). For convenience we make it possible to create handles using default parameter values which will provide decent performance in most scenarios. However, squeezing out every available performance in your environment will likely require tuning the constructor parameters, namely `block_size`, `queue_depth`, `single_submit`, `overlap_events`, and `num_threads`. The `aio_handle` constructor parameters and default values are illustrated below: +Achieving peak I/O performance with DeepNVMe requires careful configuration of handle creation. In particular, the parameters of `aio_handle` and `gds_handle` constructors are performance-critical because they determine how efficiently DeepNVMe interacts with the underlying storage subsystem (i.e., `libaio`, GDS, PCIe, and SSD). For convenience we make it possible to create handles using default parameter values which will provide decent performance in most scenarios. However, squeezing out every available performance in your environment will likely require tuning the constructor parameters, namely `block_size`, `queue_depth`, `single_submit`, `overlap_events`, and `intra_op_parallelism`. The `aio_handle` constructor parameters and default values are illustrated below: ```bash >>> from deepspeed.ops.op_builder import AsyncIOBuilder >>> help(AsyncIOBuilder().load().aio_handle()) @@ -203,7 +203,7 @@ class aio_handle(pybind11_builtins.pybind11_object) | Methods defined here: | | __init__(...) - | __init__(self: async_io.aio_handle, block_size: int = 1048576, queue_depth: int = 128, single_submit: bool = False, overlap_events: bool = False, num_threads: int = 1) -> None + | __init__(self: async_io.aio_handle, block_size: int = 1048576, queue_depth: int = 128, single_submit: bool = False, overlap_events: bool = False, intra_op_parallelism: int = 1) -> None | | AIO handle constructor ``` @@ -219,7 +219,7 @@ Best performance (GB/sec): read = 3.69, write = 3.18 "aio": { "single_submit": "false", "overlap_events": "true", - "num_threads": 8, + "intra_op_parallelism": 8, "queue_depth": 32, "block_size": 1048576 } @@ -233,7 +233,7 @@ The above tuning was executed on a Lambda workstation equipped with two NVIDIA A queue_depth=32, single_submit=False, overlap_events=True, - num_threads=8) + intra_op_parallelism=8) ``` @@ -292,6 +292,6 @@ Function | Description |---|---| get_queue_depth | Return queue depth setting | get_single_submit | Return whether single_submit is enabled | -get_thread_count | Return I/O parallelism degree | +get_intra_op_parallelism | Return I/O parallelism degree | get_block_size | Return I/O block size setting | get_overlap_events | Return whether overlap_event is enabled | diff --git a/op_builder/builder.py b/op_builder/builder.py index f95341f137b4..1609bc9005f4 100644 --- a/op_builder/builder.py +++ b/op_builder/builder.py @@ -76,7 +76,7 @@ def get_default_compute_capabilities(): cuda_minor_mismatch_ok = { 10: ["10.0", "10.1", "10.2"], 11: ["11.0", "11.1", "11.2", "11.3", "11.4", "11.5", "11.6", "11.7", "11.8"], - 12: ["12.0", "12.1", "12.2", "12.3", "12.4", "12.5"], + 12: ["12.0", "12.1", "12.2", "12.3", "12.4", "12.5", "12.6"], } diff --git a/op_builder/cpu/__init__.py b/op_builder/cpu/__init__.py index 30238add3f90..7084db8469f1 100644 --- a/op_builder/cpu/__init__.py +++ b/op_builder/cpu/__init__.py @@ -8,3 +8,4 @@ from .fused_adam import FusedAdamBuilder from .cpu_adam import CPUAdamBuilder from .no_impl import NotImplementedBuilder +from .async_io import AsyncIOBuilder diff --git a/op_builder/cpu/async_io.py b/op_builder/cpu/async_io.py new file mode 100644 index 000000000000..493ef174566e --- /dev/null +++ b/op_builder/cpu/async_io.py @@ -0,0 +1,91 @@ +# Copyright (c) Microsoft Corporation. +# SPDX-License-Identifier: Apache-2.0 + +# DeepSpeed Team + +import distutils.spawn +import subprocess + +from .builder import CPUOpBuilder + + +class AsyncIOBuilder(CPUOpBuilder): + BUILD_VAR = "DS_BUILD_AIO" + NAME = "async_io" + + def __init__(self): + super().__init__(name=self.NAME) + + def absolute_name(self): + return f'deepspeed.ops.aio.{self.NAME}_op' + + def lib_sources(self): + src_list = [ + 'csrc/aio/py_lib/deepspeed_py_io_handle.cpp', 'csrc/aio/py_lib/deepspeed_py_aio.cpp', + 'csrc/aio/py_lib/deepspeed_py_aio_handle.cpp', 'csrc/aio/py_lib/deepspeed_aio_thread.cpp', + 'csrc/aio/common/deepspeed_aio_utils.cpp', 'csrc/aio/common/deepspeed_aio_common.cpp', + 'csrc/aio/common/deepspeed_aio_types.cpp', 'csrc/aio/py_lib/deepspeed_cpu_op.cpp', + 'csrc/aio/py_lib/deepspeed_aio_op_desc.cpp', 'csrc/aio/py_lib/deepspeed_py_copy.cpp', + 'csrc/aio/py_lib/deepspeed_pin_tensor.cpp' + ] + return src_list + + def sources(self): + return self.lib_sources() + ['csrc/aio/py_lib/py_ds_aio.cpp'] + + def include_paths(self): + return ['csrc/aio/py_lib', 'csrc/aio/common'] + + def cxx_args(self): + # -O0 for improved debugging, since performance is bound by I/O + args = super().cxx_args() + import torch + TORCH_MAJOR, TORCH_MINOR = map(int, torch.__version__.split('.')[0:2]) + if not (TORCH_MAJOR >= 2 and TORCH_MINOR >= 1): + args.remove('-std=c++17') + args.append('-std=c++14') + args += ['-Wall', '-O0', '-shared', '-fPIC', '-Wno-reorder'] + return args + + def extra_ldflags(self): + return ['-laio', '-fopenmp'] + + def check_for_libaio_pkg(self): + libs = dict( + dpkg=["-l", "libaio-dev", "apt"], + pacman=["-Q", "libaio", "pacman"], + rpm=["-q", "libaio-devel", "yum"], + ) + + found = False + for pkgmgr, data in libs.items(): + flag, lib, tool = data + path = distutils.spawn.find_executable(pkgmgr) + if path is not None: + cmd = [pkgmgr, flag, lib] + result = subprocess.Popen(cmd, stdout=subprocess.PIPE, stderr=subprocess.PIPE) + if result.wait() == 0: + found = True + else: + self.warning(f"{self.NAME}: please install the {lib} package with {tool}") + break + return found + + def is_compatible(self, verbose=False): + # Check for the existence of libaio by using distutils + # to compile and link a test program that calls io_submit, + # which is a function provided by libaio that is used in the async_io op. + # If needed, one can define -I and -L entries in CFLAGS and LDFLAGS + # respectively to specify the directories for libaio.h and libaio.so. + aio_compatible = self.has_function('io_submit', ('aio', )) + if verbose and not aio_compatible: + self.warning(f"{self.NAME} requires the dev libaio .so object and headers but these were not found.") + + # Check for the libaio package via known package managers + # to print suggestions on which package to install. + self.check_for_libaio_pkg() + + self.warning( + "If libaio is already installed (perhaps from source), try setting the CFLAGS and LDFLAGS environment variables to where it can be found." + ) + return super().is_compatible(verbose) and aio_compatible diff --git a/tests/unit/ops/aio/test_aio.py b/tests/unit/ops/aio/test_aio.py index e6927efc3824..a074cfca317f 100644 --- a/tests/unit/ops/aio/test_aio.py +++ b/tests/unit/ops/aio/test_aio.py @@ -23,12 +23,10 @@ pytest.skip('Skip tests since async-io is not compatible', allow_module_level=True) -def _skip_for_invalid_environment(use_cuda_device=True, use_cuda_pinned_tensor=True): - if not get_accelerator().is_available(): - if use_cuda_device: - pytest.skip("GPU tensors only supported in CUDA environments.") +def _skip_for_invalid_environment(use_cuda_pinned_tensor=True): + if get_accelerator().device_name() != 'cuda': if use_cuda_pinned_tensor: - pytest.skip("CUDA-pinned tensors only supported in CUDA environments.") + pytest.skip("torch.pin_memory is only supported in CUDA environments.") def _get_local_rank(): @@ -52,13 +50,13 @@ def _get_test_write_file(tmpdir, index): return os.path.join(tmpdir, f'_aio_write_random_{file_suffix}.pt') -def _get_test_write_file_and_cuda_buffer(tmpdir, ref_buffer, index=0): +def _get_test_write_file_and_unpinned_tensor(tmpdir, ref_buffer, index=0): test_file = _get_test_write_file(tmpdir, index) test_buffer = get_accelerator().ByteTensor(list(ref_buffer)) return test_file, test_buffer -def _get_test_write_file_and_cpu_buffer(tmpdir, ref_buffer, aio_handle=None, index=0): +def _get_test_write_file_and_pinned_tensor(tmpdir, ref_buffer, aio_handle=None, index=0): test_file = _get_test_write_file(tmpdir, index) if aio_handle is None: test_buffer = get_accelerator().pin_memory(torch.ByteTensor(list(ref_buffer))) @@ -73,12 +71,12 @@ def _get_test_write_file_and_cpu_buffer(tmpdir, ref_buffer, aio_handle=None, ind def _validate_handle_state(handle, single_submit, overlap_events): assert handle.get_single_submit() == single_submit assert handle.get_overlap_events() == overlap_events - assert handle.get_thread_count() == IO_PARALLEL + assert handle.get_intra_op_parallelism() == IO_PARALLEL assert handle.get_block_size() == BLOCK_SIZE assert handle.get_queue_depth() == QUEUE_DEPTH -@pytest.mark.parametrize("use_cuda_pinned_tensor", [True]) # TODO: aio_handle pinned tensor API is broken +@pytest.mark.parametrize("use_cuda_pinned_tensor", [True, False]) @pytest.mark.parametrize("single_submit", [True, False]) @pytest.mark.parametrize("overlap_events", [True, False]) class TestRead(DistributedTest): @@ -89,12 +87,15 @@ class TestRead(DistributedTest): init_distributed = False set_dist_env = False - def test_parallel_read(self, tmpdir, use_cuda_pinned_tensor, single_submit, overlap_events): - _skip_for_invalid_environment(use_cuda_device=False, use_cuda_pinned_tensor=use_cuda_pinned_tensor) + @pytest.mark.parametrize("use_unpinned_tensor", [True, False]) + def test_parallel_read(self, tmpdir, use_cuda_pinned_tensor, single_submit, overlap_events, use_unpinned_tensor): + _skip_for_invalid_environment(use_cuda_pinned_tensor=use_cuda_pinned_tensor) h = AsyncIOBuilder().load().aio_handle(BLOCK_SIZE, QUEUE_DEPTH, single_submit, overlap_events, IO_PARALLEL) - if use_cuda_pinned_tensor: + if use_unpinned_tensor: + aio_buffer = torch.empty(IO_SIZE, dtype=torch.uint8, device=get_accelerator().device_name()) + elif use_cuda_pinned_tensor: aio_buffer = get_accelerator().pin_memory(torch.empty(IO_SIZE, dtype=torch.uint8, device='cpu')) else: aio_buffer = h.new_cpu_locked_tensor(IO_SIZE, torch.empty(0, dtype=torch.uint8)) @@ -112,14 +113,14 @@ def test_parallel_read(self, tmpdir, use_cuda_pinned_tensor, single_submit, over if not use_cuda_pinned_tensor: h.free_cpu_locked_tensor(aio_buffer) - @pytest.mark.parametrize("cuda_device", [True, False]) - def test_async_read(self, tmpdir, use_cuda_pinned_tensor, single_submit, overlap_events, cuda_device): - _skip_for_invalid_environment(use_cuda_device=cuda_device, use_cuda_pinned_tensor=use_cuda_pinned_tensor) + @pytest.mark.parametrize("use_unpinned_tensor", [True, False]) + def test_async_read(self, tmpdir, use_cuda_pinned_tensor, single_submit, overlap_events, use_unpinned_tensor): + _skip_for_invalid_environment(use_cuda_pinned_tensor=use_cuda_pinned_tensor) use_cpu_locked_tensor = False h = AsyncIOBuilder().load().aio_handle(BLOCK_SIZE, QUEUE_DEPTH, single_submit, overlap_events, IO_PARALLEL) - if cuda_device: + if use_unpinned_tensor: aio_buffer = torch.empty(IO_SIZE, dtype=torch.uint8, device=get_accelerator().device_name()) elif use_cuda_pinned_tensor: aio_buffer = get_accelerator().pin_memory(torch.empty(IO_SIZE, dtype=torch.uint8, device='cpu')) @@ -144,7 +145,7 @@ def test_async_read(self, tmpdir, use_cuda_pinned_tensor, single_submit, overlap h.free_cpu_locked_tensor(aio_buffer) -@pytest.mark.parametrize("use_cuda_pinned_tensor", [True]) # TODO: aio_handle pinned tensor API is broken +@pytest.mark.parametrize("use_cuda_pinned_tensor", [True, False]) @pytest.mark.parametrize("single_submit", [True, False]) @pytest.mark.parametrize("overlap_events", [True, False]) class TestWrite(DistributedTest): @@ -155,16 +156,19 @@ class TestWrite(DistributedTest): init_distributed = False set_dist_env = False - def test_parallel_write(self, tmpdir, use_cuda_pinned_tensor, single_submit, overlap_events): - _skip_for_invalid_environment(use_cuda_device=False, use_cuda_pinned_tensor=use_cuda_pinned_tensor) + @pytest.mark.parametrize("use_unpinned_tensor", [True, False]) + def test_parallel_write(self, tmpdir, use_cuda_pinned_tensor, single_submit, overlap_events, use_unpinned_tensor): + _skip_for_invalid_environment(use_cuda_pinned_tensor=use_cuda_pinned_tensor) ref_file, ref_buffer = _do_ref_write(tmpdir) h = AsyncIOBuilder().load().aio_handle(BLOCK_SIZE, QUEUE_DEPTH, single_submit, overlap_events, IO_PARALLEL) + if use_unpinned_tensor: + aio_file, aio_buffer = _get_test_write_file_and_unpinned_tensor(tmpdir, ref_buffer) if use_cuda_pinned_tensor: - aio_file, aio_buffer = _get_test_write_file_and_cpu_buffer(tmpdir, ref_buffer) + aio_file, aio_buffer = _get_test_write_file_and_pinned_tensor(tmpdir, ref_buffer) else: - aio_file, aio_buffer = _get_test_write_file_and_cpu_buffer(tmpdir, ref_buffer, h) + aio_file, aio_buffer = _get_test_write_file_and_pinned_tensor(tmpdir, ref_buffer, h) _validate_handle_state(h, single_submit, overlap_events) @@ -179,20 +183,20 @@ def test_parallel_write(self, tmpdir, use_cuda_pinned_tensor, single_submit, ove filecmp.clear_cache() assert filecmp.cmp(ref_file, aio_file, shallow=False) - @pytest.mark.parametrize("cuda_device", [True, False]) - def test_async_write(self, tmpdir, use_cuda_pinned_tensor, single_submit, overlap_events, cuda_device): - _skip_for_invalid_environment(use_cuda_device=cuda_device, use_cuda_pinned_tensor=use_cuda_pinned_tensor) + @pytest.mark.parametrize("use_unpinned_tensor", [True, False]) + def test_async_write(self, tmpdir, use_cuda_pinned_tensor, single_submit, overlap_events, use_unpinned_tensor): + _skip_for_invalid_environment(use_cuda_pinned_tensor=use_cuda_pinned_tensor) ref_file, ref_buffer = _do_ref_write(tmpdir) h = AsyncIOBuilder().load().aio_handle(BLOCK_SIZE, QUEUE_DEPTH, single_submit, overlap_events, IO_PARALLEL) use_cpu_locked_tensor = False - if cuda_device: - aio_file, aio_buffer = _get_test_write_file_and_cuda_buffer(tmpdir, ref_buffer) + if use_unpinned_tensor: + aio_file, aio_buffer = _get_test_write_file_and_unpinned_tensor(tmpdir, ref_buffer) elif use_cuda_pinned_tensor: - aio_file, aio_buffer = _get_test_write_file_and_cpu_buffer(tmpdir, ref_buffer) + aio_file, aio_buffer = _get_test_write_file_and_pinned_tensor(tmpdir, ref_buffer) else: - aio_file, aio_buffer = _get_test_write_file_and_cpu_buffer(tmpdir, ref_buffer, h) + aio_file, aio_buffer = _get_test_write_file_and_pinned_tensor(tmpdir, ref_buffer, h) use_cpu_locked_tensor = True _validate_handle_state(h, single_submit, overlap_events) @@ -213,8 +217,8 @@ def test_async_write(self, tmpdir, use_cuda_pinned_tensor, single_submit, overla @pytest.mark.sequential -@pytest.mark.parametrize("use_cuda_pinned_tensor", [True]) # TODO: aio_handle pinned tensor API is broken -@pytest.mark.parametrize("cuda_device", [True, False]) +@pytest.mark.parametrize("use_cuda_pinned_tensor", [True, False]) +@pytest.mark.parametrize("use_unpinned_tensor", [True, False]) class TestAsyncQueue(DistributedTest): world_size = 1 requires_cuda_env = False @@ -223,8 +227,8 @@ class TestAsyncQueue(DistributedTest): set_dist_env = False @pytest.mark.parametrize("async_queue", [2, 3]) - def test_read(self, tmpdir, async_queue, use_cuda_pinned_tensor, cuda_device): - _skip_for_invalid_environment(use_cuda_device=cuda_device, use_cuda_pinned_tensor=use_cuda_pinned_tensor) + def test_read(self, tmpdir, async_queue, use_cuda_pinned_tensor, use_unpinned_tensor): + _skip_for_invalid_environment(use_cuda_pinned_tensor=use_cuda_pinned_tensor) ref_files = [] for i in range(async_queue): @@ -236,7 +240,7 @@ def test_read(self, tmpdir, async_queue, use_cuda_pinned_tensor, cuda_device): h = AsyncIOBuilder().load().aio_handle(BLOCK_SIZE, QUEUE_DEPTH, single_submit, overlap_events, IO_PARALLEL) use_cpu_locked_tensor = False - if cuda_device: + if use_unpinned_tensor: aio_buffers = [ torch.empty(IO_SIZE, dtype=torch.uint8, device=get_accelerator().device_name()) for _ in range(async_queue) @@ -270,8 +274,8 @@ def test_read(self, tmpdir, async_queue, use_cuda_pinned_tensor, cuda_device): h.free_cpu_locked_tensor(t) @pytest.mark.parametrize("async_queue", [2, 3]) - def test_write(self, tmpdir, use_cuda_pinned_tensor, async_queue, cuda_device): - _skip_for_invalid_environment(use_cuda_device=cuda_device, use_cuda_pinned_tensor=use_cuda_pinned_tensor) + def test_write(self, tmpdir, use_cuda_pinned_tensor, async_queue, use_unpinned_tensor): + _skip_for_invalid_environment(use_cuda_pinned_tensor=use_cuda_pinned_tensor) ref_files = [] ref_buffers = [] @@ -287,16 +291,16 @@ def test_write(self, tmpdir, use_cuda_pinned_tensor, async_queue, cuda_device): aio_files = [] aio_buffers = [] for i in range(async_queue): - if cuda_device: - f, buf = _get_test_write_file_and_cuda_buffer(tmpdir, ref_buffers[i], i) + if use_unpinned_tensor: + f, buf = _get_test_write_file_and_unpinned_tensor(tmpdir, ref_buffers[i], i) elif use_cuda_pinned_tensor: - f, buf = _get_test_write_file_and_cpu_buffer(tmpdir, ref_buffers[i], None, i) + f, buf = _get_test_write_file_and_pinned_tensor(tmpdir, ref_buffers[i], None, i) else: - f, buf = _get_test_write_file_and_cpu_buffer(tmpdir, ref_buffers[i], h, i) + f, buf = _get_test_write_file_and_pinned_tensor(tmpdir, ref_buffers[i], h, i) aio_files.append(f) aio_buffers.append(buf) - use_cpu_locked_tensor = not (cuda_device or use_cuda_pinned_tensor) + use_cpu_locked_tensor = not (use_unpinned_tensor or use_cuda_pinned_tensor) _validate_handle_state(h, single_submit, overlap_events) diff --git a/tests/unit/ops/aio/test_gds.py b/tests/unit/ops/aio/test_gds.py index 53655994b560..e94d42cd22af 100644 --- a/tests/unit/ops/aio/test_gds.py +++ b/tests/unit/ops/aio/test_gds.py @@ -54,7 +54,7 @@ def _get_test_write_file_and_device_buffer(tmpdir, ref_buffer, gds_handle, index def _validate_handle_state(handle, single_submit, overlap_events): assert handle.get_single_submit() == single_submit assert handle.get_overlap_events() == overlap_events - assert handle.get_thread_count() == IO_PARALLEL + assert handle.get_intra_op_parallelism() == IO_PARALLEL assert handle.get_block_size() == BLOCK_SIZE assert handle.get_queue_depth() == QUEUE_DEPTH diff --git a/tests/unit/runtime/zero/test_nvme_checkpointing.py b/tests/unit/runtime/zero/test_nvme_checkpointing.py index 75cba2e789c1..850c8eb3e349 100644 --- a/tests/unit/runtime/zero/test_nvme_checkpointing.py +++ b/tests/unit/runtime/zero/test_nvme_checkpointing.py @@ -15,6 +15,7 @@ from deepspeed.runtime.zero.offload_config import OffloadDeviceEnum from deepspeed.runtime.zero.partition_parameters import Init from deepspeed.ops.aio import AsyncIOBuilder +from deepspeed.accelerator import get_accelerator class TestNVMeCheckpointing(DistributedTest): @@ -29,6 +30,9 @@ def test_nvme_checkpointing(self, tmpdir, param_offload_device, optim_offload_de first_stage_steps, second_stage_steps = 2, 2 + if not get_accelerator().is_fp16_supported(): + pytest.skip("fp16 is not supported") + if not deepspeed.ops.__compatible_ops__[AsyncIOBuilder.NAME]: pytest.skip('Skip tests since async-io is not compatible') From d7ca3d83732854eea41e6c83e603639699faf1d4 Mon Sep 17 00:00:00 2001 From: Nir Sonnenschein Date: Thu, 10 Oct 2024 03:47:44 +0300 Subject: [PATCH 548/754] reduce setting global variables to reduce torch compile graph breaks (#6541) setting global variables during training will create a graph breaks when using torch.compile (reading global variables doesn't). this commit attempts to reduce the setting of global variables in the checkpointing flows. there are 2 main uses setting global variables: 1. Share data between functions 2. Establish that this is the first call to the code For most of the cases the data in the global variables is data that can be computed on demand or set once in an initial state in a configure function. For "check that this is the first run" use case the code was moved to the configure function. --------- Co-authored-by: Olatunji Ruwase Co-authored-by: Masahiro Tanaka <81312776+tohtana@users.noreply.github.com> Co-authored-by: Logan Adams <114770087+loadams@users.noreply.github.com> --- .../activation_checkpointing/checkpointing.py | 100 +++++++----------- 1 file changed, 37 insertions(+), 63 deletions(-) diff --git a/deepspeed/runtime/activation_checkpointing/checkpointing.py b/deepspeed/runtime/activation_checkpointing/checkpointing.py index f955cf5ebcad..d65126999199 100644 --- a/deepspeed/runtime/activation_checkpointing/checkpointing.py +++ b/deepspeed/runtime/activation_checkpointing/checkpointing.py @@ -36,8 +36,10 @@ # MP parameters mpu = None -mp_rank = None -mp_size = None + +#set default values +mp_rank = 0 +mp_size = 1 mp_group = None # Model Parameters @@ -61,8 +63,6 @@ # Default name for the model parallel rng tracker. _MODEL_PARALLEL_RNG_TRACKER_NAME = 'model-parallel-rng' -transport_stream = None -cuda_device = None def detach_variable(inputs, device=None): @@ -518,35 +518,10 @@ def save_args_for_backward(*all_args): global mp_rank, mp_size, mp_group global contiguous_data_buffers, contiguous_size_buffers global data_offsets, size_offsets - if mp_rank is None: - if mpu is not None: - if hasattr(mpu, 'get_tensor_model_parallel_rank'): - mp_rank = mpu.get_tensor_model_parallel_rank() - mp_size = mpu.get_tensor_model_parallel_world_size() - mp_group = mpu.get_tensor_model_parallel_group() - else: - mp_rank = mpu.get_model_parallel_rank() - mp_size = mpu.get_model_parallel_world_size() - mp_group = mpu.get_model_parallel_group() - else: - mp_rank = 0 - mp_size = 1 - mp_group = None - - global cuda_device, transport_stream, PARTITION_ACTIVATIONS, buffer_0, buffer_1, buffer_0_offset, buffer_1_offset - - if cuda_device is None: - see_memory_usage("First Forward Beginning", force=False) - if dist.get_rank() == 0: - logger.info(f"Activation Checkpointing Information") - logger.info(f"----Partition Activations {PARTITION_ACTIVATIONS}, CPU CHECKPOINTING {CPU_CHECKPOINT}") - logger.info( - f"----contiguous Memory Checkpointing {CONTIGUOUS_CHECKPOINTING} with {num_layers} total layers") - logger.info(f"----Synchronization {SYNCHRONIZE}") - logger.info(f"----Profiling time in checkpointing {PROFILE_TIME}") + global PARTITION_ACTIVATIONS, buffer_0, buffer_1, buffer_0_offset, buffer_1_offset - cuda_device = get_accelerator().current_device_name() - transport_stream = get_accelerator().Stream(device=cuda_device) + cuda_device = get_accelerator().current_device_name() + transport_stream = get_accelerator().Stream(device=cuda_device) if PARTITION_ACTIVATIONS: inputs = partition_activations(args, CPU_CHECKPOINT, CONTIGUOUS_CHECKPOINTING) @@ -631,8 +606,9 @@ def backward(ctx, *grads): raise RuntimeError("Checkpointing is not compatible with .grad(), " "please use .backward() if possible") - global cuda_device, transport_stream, PARTITION_ACTIVATIONS - + global PARTITION_ACTIVATIONS + cuda_device = get_accelerator().current_device_name() + transport_stream = get_accelerator().Stream(device=cuda_device) # Rebuild deepspeed_saved_tensors for t in ctx.deepspeed_saved_tensors: if t is not None and hasattr(t, 'saved_data') and t.saved_data is not None: @@ -764,35 +740,10 @@ def save_args_for_backward(*all_args): global mp_rank, mp_size, mp_group global contiguous_data_buffers, contiguous_size_buffers global data_offsets, size_offsets - if mp_rank is None: - if mpu is not None: - if hasattr(mpu, 'get_tensor_model_parallel_rank'): - mp_rank = mpu.get_tensor_model_parallel_rank() - mp_size = mpu.get_tensor_model_parallel_world_size() - mp_group = mpu.get_tensor_model_parallel_group() - else: - mp_rank = mpu.get_model_parallel_rank() - mp_size = mpu.get_model_parallel_world_size() - mp_group = mpu.get_model_parallel_group() - else: - mp_rank = 0 - mp_size = 1 - mp_group = None - - global cuda_device, transport_stream, PARTITION_ACTIVATIONS, buffer_0, buffer_1, buffer_0_offset, buffer_1_offset - - if cuda_device is None: - see_memory_usage("First Forward Beginning", force=False) - if dist.get_rank() == 0: - logger.info(f"Activation Checkpointing Information") - logger.info(f"----Partition Activations {PARTITION_ACTIVATIONS}, CPU CHECKPOINTING {CPU_CHECKPOINT}") - logger.info( - f"----contiguous Memory Checkpointing {CONTIGUOUS_CHECKPOINTING} with {num_layers} total layers") - logger.info(f"----Synchronization {SYNCHRONIZE}") - logger.info(f"----Profiling time in checkpointing {PROFILE_TIME}") + global PARTITION_ACTIVATIONS, buffer_0, buffer_1, buffer_0_offset, buffer_1_offset - cuda_device = get_accelerator().current_device_name() - transport_stream = get_accelerator().Stream(device=cuda_device) + cuda_device = get_accelerator().current_device_name() + transport_stream = get_accelerator().Stream(device=cuda_device) if PARTITION_ACTIVATIONS: inputs = partition_activations(args, CPU_CHECKPOINT, CONTIGUOUS_CHECKPOINTING) @@ -899,7 +850,9 @@ def replay_unpack(none_value): raise RuntimeError("Checkpointing is not compatible with .grad(), " "please use .backward() if possible") - global cuda_device, transport_stream, PARTITION_ACTIVATIONS + global PARTITION_ACTIVATIONS + cuda_device = get_accelerator().current_device_name() + transport_stream = get_accelerator().Stream(device=cuda_device) # gather inputs which is partitioned or checkpointed before first forward if PARTITION_ACTIVATIONS: @@ -1152,6 +1105,27 @@ def configure( if CONTIGUOUS_CHECKPOINTING: assert num_layers is not None, "Must specify the number of layers with contiguous memory checkpointing" + global mp_rank, mp_size, mp_group + + if mpu is not None: + if hasattr(mpu, 'get_tensor_model_parallel_rank'): + mp_rank = mpu.get_tensor_model_parallel_rank() + mp_size = mpu.get_tensor_model_parallel_world_size() + mp_group = mpu.get_tensor_model_parallel_group() + else: + mp_rank = mpu.get_model_parallel_rank() + mp_size = mpu.get_model_parallel_world_size() + mp_group = mpu.get_model_parallel_group() + + #print configuration only once + see_memory_usage("After configuration", force=False) + if dist.get_rank() == 0: + logger.info(f"Activation Checkpointing Information") + logger.info(f"----Partition Activations {PARTITION_ACTIVATIONS}, CPU CHECKPOINTING {CPU_CHECKPOINT}") + logger.info(f"----contiguous Memory Checkpointing {CONTIGUOUS_CHECKPOINTING} with {num_layers} total layers") + logger.info(f"----Synchronization {SYNCHRONIZE}") + logger.info(f"----Profiling time in checkpointing {PROFILE_TIME}") + def is_configured(): """True if deepspeed activation checkpointing has been configured From adec99121b411709e1b185a486d18aa846c82c64 Mon Sep 17 00:00:00 2001 From: Masahiro Tanaka <81312776+tohtana@users.noreply.github.com> Date: Wed, 9 Oct 2024 19:59:26 -0700 Subject: [PATCH 549/754] Add API to get devices of offload states (#6586) This PR adds an API `deepspeed.runtime.zero.offload_states get_state_devices`, which gets devices of offload states as suggested in this [comment](https://github.com/microsoft/DeepSpeed/pull/6011#issuecomment-2358068777). We could lift this up to `deepspeed.utils` but would need to resolve a circular import: User code -> `deepspeed.utils` -> `deepspeed.utils.offload_states` -> `deepspeed.runtime.zero` -> `deepspeed.runtime.zero.partition_parameters` -> `deepspeed.utils` This will require a significant refactoring as long as we have `OffloadStateTypeEnum` in `deepspeed.runtime.zero`. --------- Co-authored-by: Logan Adams <114770087+loadams@users.noreply.github.com> Co-authored-by: Olatunji Ruwase --- deepspeed/runtime/utils.py | 10 +-- deepspeed/runtime/zero/offload_states.py | 74 +++++++++++++++++++ deepspeed/runtime/zero/stage3.py | 3 +- docs/code-docs/source/zero3.rst | 16 ++++ .../unit/runtime/zero/test_offload_states.py | 23 +++--- 5 files changed, 110 insertions(+), 16 deletions(-) create mode 100644 deepspeed/runtime/zero/offload_states.py diff --git a/deepspeed/runtime/utils.py b/deepspeed/runtime/utils.py index adcadd349803..b9617d3e632f 100755 --- a/deepspeed/runtime/utils.py +++ b/deepspeed/runtime/utils.py @@ -9,28 +9,28 @@ """ from collections.abc import Iterable -from deepspeed.moe.utils import is_moe_param import os import psutil import gc from math import sqrt +from numpy import prod + import torch -from deepspeed import comm as dist +from torch.nn import functional as F try: from torch._six import inf except ModuleNotFoundError: from torch import inf +from deepspeed import comm as dist +from deepspeed.moe.utils import is_moe_param from deepspeed.utils import groups, logger from deepspeed.utils.bwc import (bwc_tensor_model_parallel_rank, bwc_pipeline_parallel_world_size, bwc_pipeline_parallel_group) from deepspeed.runtime.constants import PIPE_REPLICATED -from numpy import prod from deepspeed.accelerator import get_accelerator - from deepspeed.module_inject.policy import transpose -from torch.nn import functional as F torch_memory_reserved = get_accelerator().memory_reserved torch_max_memory_reserved = get_accelerator().max_memory_reserved diff --git a/deepspeed/runtime/zero/offload_states.py b/deepspeed/runtime/zero/offload_states.py new file mode 100644 index 000000000000..f521a11a7aa4 --- /dev/null +++ b/deepspeed/runtime/zero/offload_states.py @@ -0,0 +1,74 @@ +# Copyright (c) Microsoft Corporation. +# SPDX-License-Identifier: Apache-2.0 + +# DeepSpeed Team + +from typing import Set +import torch + +from deepspeed.accelerator import get_accelerator +from deepspeed.runtime.zero.offload_config import OffloadStateTypeEnum + +from deepspeed.utils.tensor_fragment import safe_get_local_fp32_param, safe_get_local_optimizer_state + + +def _make_offload_state_key(key): + return f"{key}_offload_buffer" + + +def offload_adam_states(optimizer, device, pin_memory: bool = False, non_blocking: bool = False): + """Move optimizer states to device. Note that this assumes the state structure of DeepSpeed Adam.""" + + def move_key(state, key): + offload_buf_key = _make_offload_state_key(key) + if offload_buf_key not in state: + state[offload_buf_key] = torch.empty_like(state[key], device=device) + if pin_memory: + state[offload_buf_key] = get_accelerator().pin_memory(state[offload_buf_key]) + state[offload_buf_key].copy_(state[key], non_blocking=non_blocking) + state[key].data = state[offload_buf_key] + + for _, state in optimizer.state.items(): + if "exp_avg" in state: + move_key(state, "exp_avg") + if "exp_avg_sq" in state: + move_key(state, "exp_avg_sq") + + +def reload_adam_states(optimizer, device, non_blocking: bool = False): + """Move optimizer states to device. Note that this assumes the state structure of DeepSpeed Adam.""" + + def move_back_key(state, key): + state[key].data = state[_make_offload_state_key(key)].to(device, non_blocking=non_blocking) + + for _, state in optimizer.state.items(): + if "exp_avg" in state: + move_back_key(state, "exp_avg") + if "exp_avg_sq" in state: + move_back_key(state, "exp_avg_sq") + + +def get_state_devices(model, state: OffloadStateTypeEnum) -> Set[torch.device]: + """Retrieve the devices of the specified state of the model. + + Args: + model (DeepSpeedEngine): The model whose device allocations are to be checked. + state (OffloadStateTypeEnum): The specific state for which the devices should be retrieved. + + Returns: + Set[torch.device]: A set of devices of the specified state. + + """ + if state == OffloadStateTypeEnum.hp_params: + return set(safe_get_local_fp32_param(p).device for p in model.parameters()) + elif state == OffloadStateTypeEnum.lp_params: + return set(p.ds_tensor.device for p in model.parameters()) + elif state == OffloadStateTypeEnum.lp_grads: + return {model.optimizer.grad_partitions_flat_buffer.device} + elif state == OffloadStateTypeEnum.optim_states: + return set(safe_get_local_optimizer_state(p, "exp_avg").device for p in model.parameters()) | \ + set(safe_get_local_optimizer_state(p, "exp_avg_sq").device for p in model.parameters()) + elif state == OffloadStateTypeEnum.contiguous_grad_buffer: + if model.optimizer._DeepSpeedZeroOptimizer_Stage3__ipg_bucket_flat_buffer == None: + return {} + return {model.optimizer._DeepSpeedZeroOptimizer_Stage3__ipg_bucket_flat_buffer.device} diff --git a/deepspeed/runtime/zero/stage3.py b/deepspeed/runtime/zero/stage3.py index fb75d2bcebd5..6895916783f1 100644 --- a/deepspeed/runtime/zero/stage3.py +++ b/deepspeed/runtime/zero/stage3.py @@ -18,12 +18,13 @@ from deepspeed.utils import logger from deepspeed.runtime.fp16.loss_scaler import CreateLossScaler from deepspeed.runtime.comm.coalesced_collectives import reduce_scatter_coalesced, all_to_all_quant_reduce -from deepspeed.runtime.utils import inf, is_model_parallel_parameter, get_only_unique_item, offload_adam_states, reload_adam_states +from deepspeed.runtime.utils import inf, is_model_parallel_parameter, get_only_unique_item from deepspeed.runtime.zero.partition_parameters import * from deepspeed.runtime.zero.config import ZeroStageEnum from deepspeed.runtime.zero.offload_config import OffloadDeviceEnum, OffloadStateTypeEnum from deepspeed.runtime.zero.parameter_offload import DeepSpeedZeRoOffload from deepspeed.runtime.zero.utils import apply_to_tensors_only, get_mapping_to_flat_buffer +from deepspeed.runtime.zero.offload_states import offload_adam_states, reload_adam_states from deepspeed.ops.adam import DeepSpeedCPUAdam from deepspeed.runtime.swap_tensor.partitioned_param_swapper import PartitionedParamStatus from deepspeed.runtime.swap_tensor.optimizer_utils import OptimizerSwapper diff --git a/docs/code-docs/source/zero3.rst b/docs/code-docs/source/zero3.rst index f0974c08c9f3..ae7cedd1a8b3 100644 --- a/docs/code-docs/source/zero3.rst +++ b/docs/code-docs/source/zero3.rst @@ -509,3 +509,19 @@ Below is an example code snippet demonstrating how to offload FP32 parameters an ... # Load states back to device memory ds_engine.reload_states() + +``deepspeed.runtime.zero.offload_states.get_state_devices`` returns devices of the specified state. + +.. code-block:: python + + def get_state_devices(model, state: OffloadStateTypeEnum) -> Set[torch.device]: + """Retrieve the devices of the specified state of the model. + + Args: + model (DeepSpeedEngine): The model whose device allocations are to be checked. + state (OffloadStateTypeEnum): The specific state for which the devices should be retrieved. + + Returns: + Set[torch.device]: A set of devices of the specified state. + + """ diff --git a/tests/unit/runtime/zero/test_offload_states.py b/tests/unit/runtime/zero/test_offload_states.py index cc60908d3c33..9105a54661fa 100644 --- a/tests/unit/runtime/zero/test_offload_states.py +++ b/tests/unit/runtime/zero/test_offload_states.py @@ -15,19 +15,22 @@ import deepspeed from deepspeed.runtime.zero.offload_config import OffloadDeviceEnum, OffloadStateTypeEnum from deepspeed.utils import safe_get_local_fp32_param, safe_get_local_optimizer_state +from deepspeed.runtime.zero.offload_states import get_state_devices def validate_device(model, device: torch.device, include) -> None: - # Make sure the model parameters are offloaded - if include is None or OffloadStateTypeEnum.hp_params in include: - assert all(safe_get_local_fp32_param(p).device == device for p in model.parameters()) - if include is None or OffloadStateTypeEnum.lp_params in include: - assert all(p.ds_tensor.device == device for p in model.parameters()) - if include is None or OffloadStateTypeEnum.lp_grads in include: - assert model.optimizer.grad_partitions_flat_buffer.device == device - if include is None or OffloadStateTypeEnum.optim_states in include: - assert all(safe_get_local_optimizer_state(p, "exp_avg").device == device for p in model.parameters()) - assert all(safe_get_local_optimizer_state(p, "exp_avg_sq").device == device for p in model.parameters()) + + def compare_device(state) -> bool: + devices = get_state_devices(model, state) + return len(devices) == 1 and device in devices + + for state in OffloadStateTypeEnum: + if include is None or state in include: + if state == OffloadStateTypeEnum.contiguous_grad_buffer and device == torch.device("cpu"): + assert len(get_state_devices(model, + state)) == 0, f"State {state} must be removed after offload_states()" + else: + assert compare_device(state), f"State {state} is not on device {device}" def run_model(model, config_dict, hidden_dim, dtype, include, pin_memory, non_blocking): From 5c4b97f1092b798508dab4321b2ac79a9f554e72 Mon Sep 17 00:00:00 2001 From: Masahiro Tanaka Date: Fri, 11 Oct 2024 19:41:10 +0000 Subject: [PATCH 550/754] apply fp16 autocast only to floating point values --- deepspeed/runtime/engine.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/deepspeed/runtime/engine.py b/deepspeed/runtime/engine.py index ba0e0f875625..05bb23e8ddd9 100755 --- a/deepspeed/runtime/engine.py +++ b/deepspeed/runtime/engine.py @@ -1928,7 +1928,7 @@ def _cast_inputs_half(self, inputs): for k, v in inputs.items(): new_inputs[k] = self._cast_inputs_half(v) return new_inputs - elif hasattr(inputs, 'half'): + elif hasattr(inputs, 'half') and inputs.is_floating_point(): return inputs.half() else: return inputs From 7a5bc4fdf90d3a1cd711973ed9d0113b582f143e Mon Sep 17 00:00:00 2001 From: Masahiro Tanaka <81312776+tohtana@users.noreply.github.com> Date: Mon, 14 Oct 2024 09:08:44 -0700 Subject: [PATCH 551/754] Ignore reuse_dist_env (#6623) Tests with `reuse_dist_env = True` often causes memory leaks. This PR ignores `reuse_dist_env` and forcibly sets it to `False`. This change might slow down the tests, but I think it is better to manually restart runners and relaunch tests. Memory usages (See #6578): - `reuse_dist_env == True`: https://github.com/microsoft/DeepSpeed/actions/runs/11302940871/job/31439471512 - `reuse_dist_env == False`: https://github.com/microsoft/DeepSpeed/actions/runs/11303250613/job/31440137894 --- tests/unit/common.py | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/tests/unit/common.py b/tests/unit/common.py index c9eb7ffaa5f4..69ba4c2708ac 100644 --- a/tests/unit/common.py +++ b/tests/unit/common.py @@ -25,6 +25,8 @@ # Worker timeout for tests that hang DEEPSPEED_TEST_TIMEOUT = int(os.environ.get('DS_UNITTEST_TIMEOUT', '600')) +warn_reuse_dist_env = False + def is_rocm_pytorch(): return hasattr(torch.version, 'hip') and torch.version.hip is not None @@ -179,6 +181,13 @@ def _launch_daemonic_procs(self, num_procs): print("Ignoring reuse_dist_env for hpu") self.reuse_dist_env = False + global warn_reuse_dist_env + if self.reuse_dist_env and not warn_reuse_dist_env: + # Currently we see memory leak for tests that reuse distributed environment + print("Ignoring reuse_dist_env and forcibly setting it to False") + warn_reuse_dist_env = True + self.reuse_dist_env = False + if self.reuse_dist_env: if num_procs not in self._pool_cache: self._pool_cache[num_procs] = mp.Pool(processes=num_procs) From cf41e8c4e8b7b9ad43f31c8e5b255455278ef15b Mon Sep 17 00:00:00 2001 From: "Ma, Guokai" Date: Tue, 15 Oct 2024 01:31:34 +0800 Subject: [PATCH 552/754] [compile] Show breakdown of graph break (#6601) This PR extends https://github.com/microsoft/DeepSpeed/pull/6570 by showing a breakdown of graph breaks. So we can see how graph breaks are distributed among different reasons. An example of graph break output can be seen from the following workflow run https://github.com/microsoft/DeepSpeed/actions/runs/11199157962 --- .github/workflows/xpu-compile.yml | 10 ++++- tests/torch_compile/ds_config_z2.json | 40 +++++++++++++++++++ .../{ds_config.json => ds_config_z3.json} | 0 tests/torch_compile/test_compile.py | 33 ++++++++------- 4 files changed, 64 insertions(+), 19 deletions(-) create mode 100644 tests/torch_compile/ds_config_z2.json rename tests/torch_compile/{ds_config.json => ds_config_z3.json} (100%) diff --git a/.github/workflows/xpu-compile.yml b/.github/workflows/xpu-compile.yml index c2392091012f..e095e089fc30 100644 --- a/.github/workflows/xpu-compile.yml +++ b/.github/workflows/xpu-compile.yml @@ -51,9 +51,15 @@ jobs: - name: Compile Status shell: bash run: | + echo "# torch.compile graph breaks" >> $GITHUB_STEP_SUMMARY export FI_HMEM=system ulimit -n 1048575 cd tests/torch_compile export ZE_AFFINITY_MASK=0,1 - deepspeed test_compile.py --deepspeed_config ds_config.json 2>&1 | tee log.txt - cat log.txt | grep "'graph_breaks'" | sed 's/,/ /g' | awk '{print $2}' >> $GITHUB_STEP_SUMMARY + echo "## ZeRO stage 3" >> $GITHUB_STEP_SUMMARY + deepspeed test_compile.py --deepspeed_config ds_config_z3.json 2>&1 | tee log_z3.txt + # for each line start with 'dynamo_output', extract the second field and following fields and append to GITHUB_STEP_SUMMARY using awk + cat log_z3.txt | awk '/^dynamo_output/ {$1=""; print $0}' >> $GITHUB_STEP_SUMMARY + echo "## ZeRO stage 2" >> $GITHUB_STEP_SUMMARY + deepspeed test_compile.py --deepspeed_config ds_config_z2.json 2>&1 | tee log_z2.txt + cat log_z2.txt | awk '/^dynamo_output/ {$1=""; print $0}' >> $GITHUB_STEP_SUMMARY diff --git a/tests/torch_compile/ds_config_z2.json b/tests/torch_compile/ds_config_z2.json new file mode 100644 index 000000000000..30e1237c558c --- /dev/null +++ b/tests/torch_compile/ds_config_z2.json @@ -0,0 +1,40 @@ +{ + "train_batch_size": 8, + "steps_per_print": 2000, + "optimizer": { + "type": "Adam", + "params": { + "lr": 0.001, + "betas": [ + 0.8, + 0.999 + ], + "eps": 1e-8, + "weight_decay": 3e-7 + } + }, + "scheduler": { + "type": "WarmupLR", + "params": { + "warmup_min_lr": 0, + "warmup_max_lr": 0.001, + "warmup_num_steps": 1000 + } + }, + "gradient_clipping": 1.0, + "prescale_gradients": false, + "bf16": { + "enabled": true, + "loss_scale": 0, + "loss_scale_window": 500, + "hysteresis": 2, + "min_loss_scale": 1, + "initial_scale_power": 15 + }, + "wall_clock_breakdown": false, + "zero_optimization": { + "stage": 2, + "overlap_comm": false, + "contiguous_gradients": false + } +} diff --git a/tests/torch_compile/ds_config.json b/tests/torch_compile/ds_config_z3.json similarity index 100% rename from tests/torch_compile/ds_config.json rename to tests/torch_compile/ds_config_z3.json diff --git a/tests/torch_compile/test_compile.py b/tests/torch_compile/test_compile.py index 529ca56ae0a8..adbf6eaa947a 100644 --- a/tests/torch_compile/test_compile.py +++ b/tests/torch_compile/test_compile.py @@ -14,22 +14,9 @@ torch._dynamo.config.cache_size_limit = 100 -import collections - def get_dynamo_stats(): - # TODO: consider deepcopy'ing the entire counters struct and - # adding a helper to do subtraction on it - return collections.Counter({ - "calls_captured": torch._dynamo.utils.counters["stats"]["calls_captured"], - "unique_graphs": torch._dynamo.utils.counters["stats"]["unique_graphs"], - "graph_breaks": sum(torch._dynamo.utils.counters["graph_break"].values()), - # NB: The plus removes zero counts - "unique_graph_breaks": len(+torch._dynamo.utils.counters["graph_break"]), - "autograd_captures": torch._dynamo.utils.counters["compiled_autograd"]["captures"], - "autograd_compiles": torch._dynamo.utils.counters["compiled_autograd"]["compiles"], - "cudagraph_skips": torch._dynamo.utils.counters["inductor"]["cudagraph_skips"], - }) + return torch._dynamo.utils.counters["graph_break"] class RandomDataset(Dataset): @@ -70,7 +57,7 @@ def forward(self, data, residual): parser.add_argument('--local_rank', type=int, default=-1, help='local rank passed from distributed launcher') parser.add_argument('--deepspeed_config', type=str, - default='ds_config.json', + default='ds_config_z3.json', help='path to DeepSpeed configuration file') cmd_args = parser.parse_args() @@ -82,6 +69,11 @@ def forward(self, data, residual): start_stats = get_dynamo_stats() +if comm.get_rank() == 0: + #print(dynamo_stats['graph_breaks']) + for item in start_stats.items(): + print(item) + for step, batch in enumerate(rand_loader): if step % 10 == 0 and comm.get_rank() == 0: print(f'step={step}') @@ -93,7 +85,14 @@ def forward(self, data, residual): model_engine.step() dynamo_stats = get_dynamo_stats() -dynamo_stats.subtract(start_stats) if comm.get_rank() == 0: - print(dynamo_stats) + # print break down of graph break stats with markdown, print in table format, start with reason, then count + # print a tag 'dynamo_output' before each line to allow post processing + print("dynamo_output | Reason | Count |") + print("dynamo_output | ------ | ----- |") + for item in dynamo_stats.items(): + # replace '|' in item[0] with a literal '|' to avoid mess with table format + item = (item[0].replace('|', r'\|'), item[1]) + print(f"dynamo_output | {item[0]} | {item[1]} |") + print(f"dynamo_output | Total | {sum(dynamo_stats.values())} |") From 65ab64481f47f92fd427bd98b30e4faf604e5c9f Mon Sep 17 00:00:00 2001 From: Olatunji Ruwase Date: Mon, 14 Oct 2024 13:35:41 -0400 Subject: [PATCH 553/754] Add API for updating ZeRO gradients (#6590) --- deepspeed/runtime/zero/stage3.py | 50 ++++++- deepspeed/utils/__init__.py | 6 +- deepspeed/utils/mixed_precision_linkage.py | 3 +- deepspeed/utils/tensor_fragment.py | 127 +++++++++++------- docs/code-docs/source/zero3.rst | 44 +++++- .../runtime/zero/test_zero_tensor_fragment.py | 49 +++++-- 6 files changed, 200 insertions(+), 79 deletions(-) diff --git a/deepspeed/runtime/zero/stage3.py b/deepspeed/runtime/zero/stage3.py index 6895916783f1..e2c273fd913f 100644 --- a/deepspeed/runtime/zero/stage3.py +++ b/deepspeed/runtime/zero/stage3.py @@ -2299,6 +2299,24 @@ def get_fp32_grad_for_param(self, param) -> Tensor: return self._fp32_state_allgather(param, fp32_grad) + def set_fp32_grad_for_param(self, value, param): + if not param.requires_grad: + return + + if not get_accelerator().resolves_data_dependency(): + self.reduce_and_partition_stream.synchronize() + + if self.offload_optimizer: + group_idx, dest_offset, num_elements = self.grad_position[self.get_param_id(param)] + fp32_grad = self.fp32_partitioned_groups_flat[group_idx].grad.narrow(0, dest_offset, num_elements) + else: + fp32_grad = self.__param_id_to_grad_partition[param.ds_id] + + my_rank = dist.get_rank(group=self.dp_process_group) + value_partition = value.flatten().narrow(0, fp32_grad.numel() * my_rank, fp32_grad.numel()) + + fp32_grad.data.copy_(value_partition.data) + def _get_fp32_opt_state_partition(self, param, optim_state_key=None): if not get_accelerator().resolves_data_dependency(): self.reduce_and_partition_stream.synchronize() @@ -2347,12 +2365,6 @@ def set_full_hp_param(self, value, param, optim_state_key=None): ### Local API START ### - def get_local_fp32_param(self, param, optim_state_key=None) -> Tensor: - if not param.requires_grad: - return None - fp32_opt_state, group_idx = self._get_fp32_opt_state_partition(param, optim_state_key) - return fp32_opt_state - def get_local_fp32_grad_for_param(self, param) -> Tensor: if not param.requires_grad: return None @@ -2367,6 +2379,30 @@ def get_local_fp32_grad_for_param(self, param) -> Tensor: fp32_grad = self.__param_id_to_grad_partition[param.ds_id].float() return fp32_grad + def set_local_grad_for_param(self, value, param): + if not param.requires_grad: + return + + assert value.numel() == param.ds_tensor.numel( + ), f" Number of elements do not match: {value.numel()} != {param.ds_tensor.ds_numel}" + + if not get_accelerator().resolves_data_dependency(): + self.reduce_and_partition_stream.synchronize() + + if self.offload_optimizer: + group_idx, dest_offset, num_elements = self.grad_position[self.get_param_id(param)] + fp32_grad = self.fp32_partitioned_groups_flat[group_idx].grad.narrow(0, dest_offset, num_elements) + else: + fp32_grad = self.__param_id_to_grad_partition[param.ds_id] + + fp32_grad.data.copy_(value.flatten().data) + + def get_local_fp32_param(self, param, optim_state_key=None) -> Tensor: + if not param.requires_grad: + return None + fp32_opt_state, group_idx = self._get_fp32_opt_state_partition(param, optim_state_key) + return fp32_opt_state + def set_local_hp_param(self, value, param, optim_state_key=None): if not param.requires_grad: return @@ -2381,7 +2417,7 @@ def set_local_hp_param(self, value, param, optim_state_key=None): if self._swappable_optimizer_subgroup(group_idx): self._optimizer_states_and_gradient_swap_out(group_idx) - logger.info(f"[set_local_hp_param][update the params' value successfully]") + # logger.info(f"[set_local_hp_param][update the params' value successfully]") ### Local API END ### diff --git a/deepspeed/utils/__init__.py b/deepspeed/utils/__init__.py index 75fb6aa9d30a..c6a202d485eb 100644 --- a/deepspeed/utils/__init__.py +++ b/deepspeed/utils/__init__.py @@ -12,10 +12,10 @@ # TODO: Move tensor fragment and mixed precision to zero utils from .tensor_fragment import tensor_fragment, get_full_hp_param, get_hp_fragment_mapping, fragment_address, get_full_hp_grad, map_to_flat_opt_states from .tensor_fragment import safe_get_full_fp32_param, safe_get_full_grad, safe_get_full_optimizer_state -from .tensor_fragment import set_full_hp_param -from .tensor_fragment import safe_set_full_fp32_param, safe_set_full_optimizer_state +from .tensor_fragment import set_full_hp_param, set_full_hp_grad +from .tensor_fragment import safe_set_full_fp32_param, safe_set_full_optimizer_state, safe_set_full_grad from .tensor_fragment import safe_get_local_fp32_param, safe_get_local_grad, safe_get_local_optimizer_state -from .tensor_fragment import safe_set_local_fp32_param, safe_set_local_optimizer_state +from .tensor_fragment import safe_set_local_fp32_param, safe_set_local_grad, safe_set_local_optimizer_state from .z3_leaf_module import set_z3_leaf_modules, unset_z3_leaf_modules, get_z3_leaf_modules, z3_leaf_module, z3_leaf_parameter from .mixed_precision_linkage import link_hp_params, lazy_init_hp_params_optimizer_state from deepspeed.runtime.dataloader import RepeatingLoader diff --git a/deepspeed/utils/mixed_precision_linkage.py b/deepspeed/utils/mixed_precision_linkage.py index 7dea6ba322db..c97515ca8fef 100644 --- a/deepspeed/utils/mixed_precision_linkage.py +++ b/deepspeed/utils/mixed_precision_linkage.py @@ -5,7 +5,7 @@ import types from deepspeed.utils import get_full_hp_param, get_full_hp_grad, get_hp_fragment_mapping -from deepspeed.utils import set_full_hp_param +from deepspeed.utils import set_full_hp_param, set_full_hp_grad def link_hp_params(lp_param_list, flat_hp_partition, gradient_dict, offload_gradient_dict, use_offload, @@ -35,6 +35,7 @@ def _init_lp_to_hp_mapping(lp_param_list, partition_start, partition_size, dp_gr lp_param.get_full_hp_param = types.MethodType(get_full_hp_param, lp_param) lp_param.get_full_hp_grad = types.MethodType(get_full_hp_grad, lp_param) lp_param.set_full_hp_param = types.MethodType(set_full_hp_param, lp_param) + lp_param.set_full_hp_grad = types.MethodType(set_full_hp_grad, lp_param) # lp_param overlaps with partition if both are true # 1) current_offset < partition_end, diff --git a/deepspeed/utils/tensor_fragment.py b/deepspeed/utils/tensor_fragment.py index b34722580ddd..053c8b5adad0 100644 --- a/deepspeed/utils/tensor_fragment.py +++ b/deepspeed/utils/tensor_fragment.py @@ -57,6 +57,17 @@ def get_hp_fragment(self, optim_state_key=None): return self.hp_fragment return self.get_optim_state_fragment(optim_state_key) + def get_lp_grad_fragment(self, index_in_param_group): + if self.use_offload: + gradient_dict = self.offload_gradient_dict + else: + gradient_dict = self.gradient_dict + + if self.param_group_index not in gradient_dict or gradient_dict[self.param_group_index] is None: + raise ValueError("Gradients are only available immediately after backward and before engine step") + + return gradient_dict[self.param_group_index][index_in_param_group] + def map_to_flat_opt_states(flat_hp_tensor, lp_tensors, optim_state, opt_keys): for key in opt_keys: @@ -95,17 +106,7 @@ def set_full_hp_param(self, value, optim_state_key=None): def get_full_hp_grad(self): reduce_buffer = torch.zeros_like(self, dtype=torch.float32).flatten() if self._hp_mapping is not None: - hp_mapping = self._hp_mapping - - if hp_mapping.use_offload: - gradient_dict = hp_mapping.offload_gradient_dict - else: - gradient_dict = hp_mapping.gradient_dict - - if hp_mapping.param_group_index not in gradient_dict or gradient_dict[hp_mapping.param_group_index] is None: - raise ValueError("Gradients are only available immediately after backward and before engine step") - - lp_grad_fragment = gradient_dict[hp_mapping.param_group_index][self._index_in_param_group] + lp_grad_fragment = self._hp_mapping.get_lp_grad_fragment(self._index_in_param_group) hp_grad_fragment = lp_grad_fragment.to(torch.float32).flatten() lp_frag_address = self._hp_mapping.lp_fragment_address @@ -120,6 +121,14 @@ def get_full_hp_grad(self): return reduce_buffer.reshape_as(self) +def set_full_hp_grad(self, value): + if self._hp_mapping is not None: + lp_grad_fragment = self._hp_mapping.get_lp_grad_fragment(self._index_in_param_group) + lp_frag_address = self._hp_mapping.lp_fragment_address + value_fragment = torch.narrow(value.flatten(), 0, lp_frag_address.start, lp_frag_address.numel) + lp_grad_fragment.data.copy_(value_fragment.data.reshape_as(lp_grad_fragment.data)) + + def safe_get_full_fp32_param(param): """Assemble and return the fp32 parameter of a low-precision (e.g., fp16) parameter. @@ -188,7 +197,10 @@ def safe_set_full_optimizer_state(param, value, optim_state_key): # TODO: Figure out the correct return dtype def safe_get_full_grad(param): - """Assemble and return the fp32 gradient of a low-precision (e.g., fp16) parameter. + """ + Assemble and return the fp32 gradient of a low-precision (e.g., fp16) parameter. + The return data type is that used for gradient accumulation. This is usually the param data type, + but could also be different (e.g., bf16 param training with fp32 gradient accumulation). Args: param (``torch.nn.Parameter``): A model parameter @@ -207,74 +219,95 @@ def safe_get_full_grad(param): return None +def safe_set_full_grad(param, value): + """ + Update the partitioned gradient of a low-precision (e.g., fp16) parameter. + To avoid precision issues, the update value should have the data type of + gradient accumulation. + + Args: + param (``torch.nn.Parameter``): A model parameter + value (``torch.Tensor``): The un-partitioned new gradient value. + """ + if param.grad is not None: + param.grad.copy_(value) + elif hasattr(param, 'ds_id'): + # ZeRO stage 3 param + param._z3_optimizer.set_fp32_grad_for_param(value, param) + elif hasattr(param, '_hp_mapping'): + # ZeRO stage 1, 2, and bf16_optimizer params + param.set_full_hp_grad(value) + + ### Local API START ### def safe_get_local_grad(param): - """Get the fp32 gradient of a partitioned parameter. + """ + Get the local gradient partition of a ZeRO-3 partitioned parameter. + The return data type is that used for gradient accumulation. This is usually the param data type, + but could also be different (e.g., bf16 param training with fp32 gradient accumulation). Args: param (``torch.nn.Parameter``): A model parameter """ - if param.grad is not None: - return param.grad + assert hasattr(param, 'ds_id'), f'This API is only defined for ZeRO-3 partitioned parameters' + return param._z3_optimizer.get_local_fp32_grad_for_param(param) - # ZeRO stage 3 param - if hasattr(param, 'ds_id'): - return param._z3_optimizer.get_local_fp32_grad_for_param(param) - return None +def safe_set_local_grad(param, value): + """ + Update the local gradient partition of a ZeRO-3 partitioned parameter. + To avoid precision issues, the update value should have the data type of + gradient accumulation. + + Args: + param (``torch.nn.Parameter``): A model parameter. + value (``torch.Tensor``): New value of local gradient partition. + """ + assert hasattr(param, 'ds_id'), f'This API is only defined for ZeRO-3 partitioned parameters' + param._z3_optimizer.set_local_grad_for_param(value, param) def safe_get_local_fp32_param(param): - """Get the fp32 partitioned parameter. + """Get the local partition of a ZeRO-3 partitioned parameter in fp32 precision. Args: - param (``torch.nn.Parameter``): A model parameter + param (``torch.nn.Parameter``): A model parameter. """ - # ZeRO stage 3 param - if hasattr(param, 'ds_id'): - return param._z3_optimizer.get_local_fp32_param(param) - - return None + assert hasattr(param, 'ds_id'), f'This API is only defined for ZeRO-3 partitioned parameters' + return param._z3_optimizer.get_local_fp32_param(param) def safe_get_local_optimizer_state(param, optim_state_key): - """Get the fp32 optimizer state of a partitioned parameter. + """Get the local optimizer state partition of ZeRO-3 partitioned parameter in fp32 precision. Args: param (``torch.nn.Parameter``): A model parameter optim_state_key (``string``): Key value of optimizer state (e.g., `exp_avg` in Adam optimizer) """ - # ZeRO stage 3 param - if hasattr(param, 'ds_id'): - return param._z3_optimizer.get_local_fp32_param(param, optim_state_key) - - return None + assert hasattr(param, 'ds_id'), f'This API is only defined for ZeRO-3 partitioned parameters' + return param._z3_optimizer.get_local_fp32_param(param, optim_state_key) def safe_set_local_optimizer_state(param, value, optim_state_key): - """Update the fp32 optimizer state of a partitioned parameter. + """Update the local optimizer state partition of a ZeRO-3 partitioned parameter. Args: - param (``torch.nn.Parameter``): A model parameter - value (``torch.Tensor``): New value - optim_state_key (``string``): Key value of optimizer state (e.g., `exp_avg` in Adam optimizer) + param (``torch.nn.Parameter``): A model parameter. + value (``torch.Tensor``): New value of local optimizer state partition. + optim_state_key (``string``): Key value of optimizer state (e.g., `exp_avg` in Adam optimizer). """ - # ZeRO stage 3 param - if hasattr(param, 'ds_id'): - param._z3_optimizer.set_local_hp_param(value, param, optim_state_key) + assert hasattr(param, 'ds_id'), f'This API is only defined for ZeRO-3 partitioned parameters' + param._z3_optimizer.set_local_hp_param(value, param, optim_state_key) def safe_set_local_fp32_param(param, value): - """Update the partitioned fp32 parameter. + """Update the local partition of ZeRO-3 partitioned parameter. Args: - param (``torch.nn.Parameter``): A model parameter - value (``torch.Tensor``): New value + param (``torch.nn.Parameter``): A model parameter. + value (``torch.Tensor``): New value of local parameter partition. """ - # ZeRO stage 3 param - if hasattr(param, 'ds_id'): - param._z3_optimizer.set_local_hp_param(value, param) + assert hasattr(param, 'ds_id'), f'This API is only defined for ZeRO-3 partitioned parameters' + param._z3_optimizer.set_local_hp_param(value, param) ### Local API END ### -# TODO: Implement API for setting ZeRO partitioned gradients - def get_hp_fragment_mapping(lp_param, lp_start, flat_hp_partition, gradient_dict, offload_gradient_dict, use_offload, param_group_index, partition_start, partition_size): diff --git a/docs/code-docs/source/zero3.rst b/docs/code-docs/source/zero3.rst index ae7cedd1a8b3..aa8139a654a1 100644 --- a/docs/code-docs/source/zero3.rst +++ b/docs/code-docs/source/zero3.rst @@ -369,13 +369,13 @@ These routines can be used in a training loop as shown in the following snippet. from deepspeed.utils import safe_get_full_fp32_param, safe_get_full_grad, safe_get_full_optimizer_state for n, lp in model.named_parameters(): # 1. Access the full states - # 1) gradient lookup + # 1.1) gradient lookup # For zero1 and zero2, gradient lookup must be called after `backward` and before `step` # For zero3, gradient lookup must be called after `backward` hp_grad = safe_get_full_grad(lp) - # 2) fp32 and optim states can probably be called anywhere in the training loop, but will be updated after `step` + # 1.2) fp32 and optim states can probably be called anywhere in the training loop, but will be updated after `step` hp = safe_get_full_fp32_param(lp) exp_avg = safe_get_full_optimizer_state(lp, "exp_avg") exp_avg_sq = safe_get_full_optimizer_state(lp, "exp_avg_sq") @@ -396,34 +396,39 @@ These routines can be used in a training loop as shown in the following snippet. Modifying Partitioned States ---------------------------- -Sometimes, a user may want to modify parameters or optimizer states outside of the regular training loop. This is currently difficult in ZeRO training because of partitioning. To overcome that, DeepSpeed provides the following routines for modifying the fp32 master parameters and the fp32 optimizer states. +Sometimes, a user may want to modify parameters, gradients, or optimizer states outside of the regular training loop. This is currently difficult in ZeRO training because of partitioning. To overcome that, DeepSpeed provides the following routines for modifying the fp32 master parameters and the fp32 optimizer states. .. autofunction:: deepspeed.utils.safe_set_full_fp32_param .. autofunction:: deepspeed.utils.safe_set_full_optimizer_state +.. autofunction:: deepspeed.utils.safe_set_full_grad + .. autofunction:: deepspeed.utils.safe_set_local_fp32_param +.. autofunction:: deepspeed.utils.safe_set_local_grad + .. autofunction:: deepspeed.utils.safe_set_local_optimizer_state -These routines can be used at any point after initialization of the DeepSpeed engine (i.e., ``deepspeed.initialize()``) as shown in the following snippet. +The routines for modifying parameters and optimizer states can be used at any point after initialization of the DeepSpeed engine (i.e., ``deepspeed.initialize()``) as shown in the following snippet. .. code-block:: python [...] + from deepspeed.runtime.zero.utils import is_zero_param from deepspeed.utils import safe_set_full_fp32_param, safe_set_full_optimizer_state from deepspeed.utils import safe_set_local_fp32_param, safe_set_local_optimizer_state # Here is an example to zero all the fp32 parameters and optimizer states. for n, lp in model.named_parameters(): - # 1. For zero stage 1 or 2, set the full fp32 and their full optim states - zero_tensor = torch.zeros_like(lp) + # 1. For zero stage 1, 2, or 3 set the full fp32 and their full optim states + zero_tensor = torch.zeros(lp.ds_shape) if is_zero_param(lp) else torch.zeros(lp.shape) safe_set_full_fp32_param(lp, zero_tensor) safe_get_full_optimizer_state(lp, zero_tensor, "exp_avg") safe_get_full_optimizer_state(lp, zero_tensor, "exp_avg_sq") # 2. For zero stage 3, each process sets its local fp32 parameters and their local optimizer states individually - zero_tensor_local = torch.zeros_like(lp.ds_tensor.shape) + zero_tensor_local = torch.zeros(lp.ds_tensor.shape) safe_set_local_fp32_param(lp, zero_tensor_local) safe_set_local_optimizer_state(lp, zero_tensor_local, "exp_avg") @@ -432,6 +437,31 @@ These routines can be used at any point after initialization of the DeepSpeed en [...] +The routines for modifying gradients can be used after ``backward`` but before ``step`` as shown in the following snippet. + +.. code-block:: python + + backward(loss) + [...] + from deepspeed.runtime.zero.utils import is_zero_param + from deepspeed.utils import safe_set_full_grad, safe_set_local_grad + # Here is an example of how to zero all the gradients. + for n, lp in model.named_parameters(): + # 1. For zero stage 1, 2, or 3 set the full gradient. + zero_tensor = torch.zeros(lp.ds_shape) if is_zero_param(lp) else torch.zeros(lp.shape) + + safe_set_full_grad(lp, zero_tensor) + + # 2. For zero stage 3, each process sets its local gradient partition. + zero_tensor_local = torch.zeros_like(lp.ds_tensor.shape) + + safe_set_local_grad(lp, zero_tensor_local) + + [...] + optimizer.step() + + + GPU Memory Management --------------------- diff --git a/tests/unit/runtime/zero/test_zero_tensor_fragment.py b/tests/unit/runtime/zero/test_zero_tensor_fragment.py index 3bb4af3e3d91..2e3a652668ed 100644 --- a/tests/unit/runtime/zero/test_zero_tensor_fragment.py +++ b/tests/unit/runtime/zero/test_zero_tensor_fragment.py @@ -13,9 +13,9 @@ import deepspeed from deepspeed.utils import safe_get_full_fp32_param, safe_get_full_grad, safe_get_full_optimizer_state -from deepspeed.utils import safe_set_full_fp32_param, safe_set_full_optimizer_state +from deepspeed.utils import safe_set_full_fp32_param, safe_set_full_grad, safe_set_full_optimizer_state from deepspeed.utils import safe_get_local_fp32_param, safe_get_local_grad, safe_get_local_optimizer_state -from deepspeed.utils import safe_set_local_fp32_param, safe_set_local_optimizer_state +from deepspeed.utils import safe_set_local_fp32_param, safe_set_local_grad, safe_set_local_optimizer_state from deepspeed.runtime.zero.offload_config import OffloadDeviceEnum from deepspeed.ops.aio import AsyncIOBuilder from deepspeed.accelerator import get_accelerator @@ -23,6 +23,7 @@ WEIGHT_KEY = 'weight' FIRST_ORDER_KEY = 'exp_avg' SECOND_ORDER_KEY = 'exp_avg_sq' +GRADIENT_KEY = 'gradient' def validate_tensor(model, api_type, opt_states): @@ -180,13 +181,14 @@ def test_bf16_fragments(self, frozen_weights): run_fragmented_model(model, config_dict, hidden_dim, torch.bfloat16, validate_after_bwd, validate_after_step) -def create_random_values(model, key_list, group, use_cuda=True): +def create_random_values(model, key_list, group, grad_dtype, use_cuda=True): param_values = {} for n, lp in model.named_parameters(): param_shape = lp.ds_shape if hasattr(lp, 'ds_id') else lp.shape param_values[n] = {} for key in key_list: - rand_value = torch.rand(param_shape, dtype=torch.float32, device=model.device) + dtype = grad_dtype if key == GRADIENT_KEY else torch.float32 + rand_value = torch.rand(param_shape, dtype=dtype, device=model.device) dist.broadcast(rand_value, src=0, group=group) param_values[n][key] = rand_value return param_values @@ -195,7 +197,9 @@ def create_random_values(model, key_list, group, use_cuda=True): def set_param_values_with_dict(model, value_dict): for n, lp in model.named_parameters(): for key, value_tensor in value_dict[n].items(): - if key == WEIGHT_KEY: + if key == GRADIENT_KEY: + safe_set_full_grad(lp, value_tensor) + elif key == WEIGHT_KEY: safe_set_full_fp32_param(lp, value_tensor) else: safe_set_full_optimizer_state(lp, value_tensor, key) @@ -204,21 +208,25 @@ def set_param_values_with_dict(model, value_dict): def validate_param_values_with_dict(model, value_dict): for n, lp in model.named_parameters(): for key, expected_tensor in value_dict[n].items(): - if key == WEIGHT_KEY: + if key == GRADIENT_KEY: + actual_tensor = safe_get_full_grad(lp) + elif key == WEIGHT_KEY: actual_tensor = safe_get_full_fp32_param(lp) else: actual_tensor = safe_get_full_optimizer_state(lp, key) + assert torch.equal(expected_tensor, actual_tensor) -def create_random_values_for_local(model, key_list, group, use_cuda=True): +def create_random_values_for_local(model, key_list, group, grad_dtype, use_cuda=True): param_values = {} for n, lp in model.named_parameters(): param_shape = lp.ds_tensor.shape param_values[n] = {} for key in key_list: device = model.device if use_cuda else "cpu" - rand_value = torch.rand(param_shape, dtype=torch.float32, device=device) + dtype = grad_dtype if key == GRADIENT_KEY else torch.float32 + rand_value = torch.rand(param_shape, dtype=dtype, device=device) # dist.broadcast(rand_value, src=0, group=group) param_values[n][key] = rand_value return param_values @@ -228,7 +236,9 @@ def set_local_param_values_with_dict(model, value_dict): for n, lp in model.named_parameters(): for key, value_tensor in value_dict[n].items(): - if key == WEIGHT_KEY: + if key == GRADIENT_KEY: + safe_set_local_grad(lp, value_tensor) + elif key == WEIGHT_KEY: safe_set_local_fp32_param(lp, value_tensor) else: safe_set_local_optimizer_state(lp, value_tensor, key) @@ -237,10 +247,13 @@ def set_local_param_values_with_dict(model, value_dict): def validate_local_param_values_with_dict(model, value_dict): for n, lp in model.named_parameters(): for key, expected_tensor in value_dict[n].items(): - if key == WEIGHT_KEY: + if key == GRADIENT_KEY: + actual_tensor = safe_get_local_grad(lp) + elif key == WEIGHT_KEY: actual_tensor = safe_get_local_fp32_param(lp) else: actual_tensor = safe_get_local_optimizer_state(lp, key) + assert torch.equal(expected_tensor, actual_tensor) @@ -325,12 +338,20 @@ def test_zero_fragments(self, tmpdir, api_type, zero_stage, offload_device, dtyp dist.barrier() - def validate_func(model): - optim_keys = [WEIGHT_KEY, FIRST_ORDER_KEY, SECOND_ORDER_KEY] + def after_bwd_validate_func(model): + state_keys = [WEIGHT_KEY, GRADIENT_KEY] + helper_funcs = helper_funcs_mapping[api_type] + optim_state_values = helper_funcs["create_random_values"]( + model, state_keys, group, grad_dtype=dtype, use_cuda=offload_device == OffloadDeviceEnum.none) + helper_funcs["set_param_values_with_dict"](model, optim_state_values) + helper_funcs["validate_param_values_with_dict"](model, optim_state_values) + + def after_step_validate_func(model): + state_keys = [WEIGHT_KEY, FIRST_ORDER_KEY, SECOND_ORDER_KEY] helper_funcs = helper_funcs_mapping[api_type] optim_state_values = helper_funcs["create_random_values"]( - model, optim_keys, group, use_cuda=offload_device == OffloadDeviceEnum.none) + model, state_keys, group, grad_dtype=dtype, use_cuda=offload_device == OffloadDeviceEnum.none) helper_funcs["set_param_values_with_dict"](model, optim_state_values) helper_funcs["validate_param_values_with_dict"](model, optim_state_values) - run_fragmented_model(model, config_dict, hidden_dim, dtype, lambda _: None, validate_func) + run_fragmented_model(model, config_dict, hidden_dim, dtype, after_bwd_validate_func, after_step_validate_func) From 13c16c9562dc41e153679278cf2ecad058a9fbc7 Mon Sep 17 00:00:00 2001 From: diskkid Date: Tue, 15 Oct 2024 04:26:24 +0900 Subject: [PATCH 554/754] Accept btl_tcp_if_include option through launcher_args (#6613) This patch fixes issue #4460. When `btl_tcp_if_include` option is provided through `--launcher_args`, we use the provided option instead of the hardcoded `--mca btl_tcp_if_include eth0`. Otherwise we use `--mca btl_tcp_if_include eth0` as the default for compatibility. Fixes #4460 --------- Co-authored-by: Logan Adams <114770087+loadams@users.noreply.github.com> Co-authored-by: Olatunji Ruwase --- deepspeed/launcher/multinode_runner.py | 16 +++++++++++---- tests/unit/launcher/test_multinode_runner.py | 21 ++++++++++++++++++++ 2 files changed, 33 insertions(+), 4 deletions(-) diff --git a/deepspeed/launcher/multinode_runner.py b/deepspeed/launcher/multinode_runner.py index a816b5685760..74d20a6d53e5 100644 --- a/deepspeed/launcher/multinode_runner.py +++ b/deepspeed/launcher/multinode_runner.py @@ -141,6 +141,17 @@ def validate_args(self): def get_cmd(self, environment, active_resources): total_process_count = sum(self.resource_pool.values()) + launcher_args = split(self.args.launcher_args) + + # If btl_tcp_if_include option is provided through launcher_args, we use it. Otherwise, we add + # `--mca btl_tcp_if_include eth0` option as a default value for compatibility. + btl_tcp_opt = ['--mca', 'btl_tcp_if_include', 'eth0'] + if len(launcher_args) >= 2: + for i in range(len(launcher_args) - 1): + if launcher_args[i] in ['-mca', '--mca'] and launcher_args[i + 1] == 'btl_tcp_if_include': + btl_tcp_opt = [] + break + mpirun_cmd = [ 'mpirun', '-n', @@ -150,10 +161,7 @@ def get_cmd(self, environment, active_resources): '--mca', 'btl', '^openib', - '--mca', - 'btl_tcp_if_include', - 'eth0', - ] + split(self.args.launcher_args) + ] + btl_tcp_opt + launcher_args export_cmd = [] for k, v in self.exports.items(): diff --git a/tests/unit/launcher/test_multinode_runner.py b/tests/unit/launcher/test_multinode_runner.py index ec0459ab0a6f..a3b50a4c90ab 100644 --- a/tests/unit/launcher/test_multinode_runner.py +++ b/tests/unit/launcher/test_multinode_runner.py @@ -32,6 +32,27 @@ def test_openmpi_runner(runner_info): runner = mnrunner.OpenMPIRunner(args, world_info, resource_pool) cmd = runner.get_cmd(env, resource_pool) assert cmd[0] == 'mpirun' + assert 'eth0' in cmd + + +def test_btl_nic_openmpi_runner(runner_info): + env, resource_pool, world_info, _ = runner_info + args = parse_args(['--launcher_arg', '-mca btl_tcp_if_include eth1', 'test_launcher.py']) + + runner = mnrunner.OpenMPIRunner(args, world_info, resource_pool) + cmd = runner.get_cmd(env, resource_pool) + assert 'eth0' not in cmd + assert 'eth1' in cmd + + +def test_btl_nic_two_dashes_openmpi_runner(runner_info): + env, resource_pool, world_info, _ = runner_info + args = parse_args(['--launcher_arg', '--mca btl_tcp_if_include eth1', 'test_launcher.py']) + + runner = mnrunner.OpenMPIRunner(args, world_info, resource_pool) + cmd = runner.get_cmd(env, resource_pool) + assert 'eth0' not in cmd + assert 'eth1' in cmd def test_mpich_runner(runner_info): From 85b7469ea00f7719a27e3e8d1ffaa8765575f820 Mon Sep 17 00:00:00 2001 From: Joe Mayer <114769929+jomayeri@users.noreply.github.com> Date: Mon, 14 Oct 2024 12:31:45 -0700 Subject: [PATCH 555/754] Add first Step in LR Schedulers (#6597) Some (not all) of the LR schedulers in runtime were missing the initialization of the optimizer group lr. --------- Co-authored-by: Olatunji Ruwase Co-authored-by: Logan Adams <114770087+loadams@users.noreply.github.com> --- deepspeed/runtime/lr_schedules.py | 38 ++++++++++++------------ tests/unit/runtime/test_lr_schedulers.py | 8 +++++ 2 files changed, 27 insertions(+), 19 deletions(-) diff --git a/deepspeed/runtime/lr_schedules.py b/deepspeed/runtime/lr_schedules.py index d7f7e15a4dbd..f25a19e8e499 100755 --- a/deepspeed/runtime/lr_schedules.py +++ b/deepspeed/runtime/lr_schedules.py @@ -247,6 +247,12 @@ def get_lr_from_config(config): return lr_params[WARMUP_MAX_LR], '' +def update_lr(param_groups, lrs): + for param_group, lr in zip(param_groups, lrs): + param_group['lr'] = lr + return [group['lr'] for group in param_groups] + + """ Only optimizers that are subclass of torch.optim.Optimizer are supported. So check the passed optimizer and wrapped optimizer to see if requirement is satisfied. @@ -328,7 +334,7 @@ def __init__(self, self.interval_fn = self._staircase_interval if lr_range_test_staircase else self._continuous_interval if last_batch_iteration == -1: - self._update_optimizer(self.min_lr) + self._last_lr = update_lr(self.optimizer.param_groups, self.min_lr) def _staircase_interval(self): return math.floor(float(self.last_batch_iteration + 1) / self.step_size) @@ -349,16 +355,11 @@ def get_last_lr(self): assert getattr(self, '_last_lr', None) is not None, "need to call step() first" return self._last_lr - def _update_optimizer(self, group_lrs): - for param_group, lr in zip(self.optimizer.param_groups, group_lrs): - param_group['lr'] = lr - def step(self, batch_iteration=None): if batch_iteration is None: batch_iteration = self.last_batch_iteration + 1 self.last_batch_iteration = batch_iteration - self._update_optimizer(self.get_lr()) - self._last_lr = [group['lr'] for group in self.optimizer.param_groups] + self._last_lr = update_lr(self.optimizer.param_groups, self.get_lr()) def state_dict(self): return {'last_batch_iteration': self.last_batch_iteration} @@ -615,9 +616,7 @@ def step(self, batch_iteration=None): batch_iteration = self.last_batch_iteration + 1 self.last_batch_iteration = batch_iteration - for param_group, lr in zip(self.optimizer.param_groups, self.get_lr()): - param_group['lr'] = lr - self._last_lr = [group['lr'] for group in self.optimizer.param_groups] + self._last_lr = update_lr(self.optimizer.param_groups, self.get_lr()) if self.cycle_momentum: momentums = self.get_mom() @@ -675,11 +674,14 @@ def __init__(self, self.warmup_type = warmup_type self.inverse_log_warm_up = 1.0 / math.log(self.warmup_num_steps) self.last_batch_iteration = last_batch_iteration + # Initialize lr in optimizer + if last_batch_iteration == -1: + self._last_lr = update_lr(self.optimizer.param_groups, self.get_lr()) def get_lr(self): if self.last_batch_iteration < 0: logger.warning("Attempting to get learning rate from scheduler before it has started") - return [0.0] + return self.min_lrs gamma = self._get_gamma() return [min_lr + (delta_lr * gamma) for min_lr, delta_lr in zip(self.min_lrs, self.delta_lrs)] @@ -693,9 +695,7 @@ def step(self, last_batch_iteration=None): if last_batch_iteration is None: last_batch_iteration = self.last_batch_iteration + 1 self.last_batch_iteration = last_batch_iteration - for param_group, lr in zip(self.optimizer.param_groups, self.get_lr()): - param_group['lr'] = lr - self._last_lr = [group['lr'] for group in self.optimizer.param_groups] + self._last_lr = update_lr(self.optimizer.param_groups, self.get_lr()) def state_dict(self): return {'last_batch_iteration': self.last_batch_iteration} @@ -819,6 +819,10 @@ def __init__(self, total_num_steps, warmup_num_steps)) self.org_lrs = [group['lr'] for group in self.optimizer.param_groups] + # Initialize lrs in optimizer groups + if last_batch_iteration == -1: + self._last_lr = update_lr(self.optimizer.param_groups, self.get_lr()) + def get_lr_ratio(self): if self.last_batch_iteration < 0: logger.warning("Attempting to get learning rate from scheduler before it has started") @@ -844,11 +848,7 @@ def step(self, last_batch_iteration=None): if last_batch_iteration is None: last_batch_iteration = self.last_batch_iteration + 1 self.last_batch_iteration = last_batch_iteration - - lrs = self.get_lr() - for param_group, lr in zip(self.optimizer.param_groups, lrs): - param_group['lr'] = lr - self._last_lr = [group['lr'] for group in self.optimizer.param_groups] + self._last_lr = update_lr(self.optimizer.param_groups, self.get_lr()) def get_lr(self): if self.last_batch_iteration < 0: diff --git a/tests/unit/runtime/test_lr_schedulers.py b/tests/unit/runtime/test_lr_schedulers.py index bcfc485f2b8f..47734c0cd864 100644 --- a/tests/unit/runtime/test_lr_schedulers.py +++ b/tests/unit/runtime/test_lr_schedulers.py @@ -37,6 +37,9 @@ def _verify_staircase_increase(values, step_size): (WARMUP_DECAY_LR, { WARMUP_NUM_STEPS: 10, TOTAL_NUM_STEPS: 20 + }), (WARMUP_COSINE_LR, { + WARMUP_NUM_STEPS: 10, + TOTAL_NUM_STEPS: 20 }), (ONE_CYCLE, { CYCLE_MIN_LR: 0, CYCLE_MAX_LR: 0.1 @@ -71,6 +74,11 @@ def test(self, scheduler_type, params): hidden_dim=hidden_dim, device=model.device, dtype=torch.float) + + true_lrs = lr_scheduler.get_lr() + for group, true_lr in zip(model.optimizer.param_groups, true_lrs): + assert group['lr'] == true_lr, f"True lr {true_lr}, optimizer lr {group['lr']}" + for n, batch in enumerate(data_loader): # get lr before training starts lr_scheduler.get_lr() From bf60fc0ca63b74722d3cf1bbabf17ea9fff37ffe Mon Sep 17 00:00:00 2001 From: Xu Song Date: Tue, 15 Oct 2024 19:22:31 +0800 Subject: [PATCH 556/754] Support safetensors export (#6579) ## Feature This commit implements the following features: - [x] support saving checkpoint as safetensors (more commonly used format) - [x] support sharding checkpoints (which is important for very large models) Most of the codes are borrowed from https://github.com/huggingface/transformers/blob/v4.45.1/src/transformers/modeling_utils.py#L2490 ## Usage For `pytorch_model.bin` export ``` python zero_to_fp32.py . output_dir/ ``` For `model.safetensors` export ``` python zero_to_fp32.py . output_dir/ --safe_serialization ``` --------- Co-authored-by: Masahiro Tanaka <81312776+tohtana@users.noreply.github.com> Co-authored-by: Logan Adams <114770087+loadams@users.noreply.github.com> --- deepspeed/utils/zero_to_fp32.py | 98 ++++++++++++++++++++++++++++----- 1 file changed, 84 insertions(+), 14 deletions(-) diff --git a/deepspeed/utils/zero_to_fp32.py b/deepspeed/utils/zero_to_fp32.py index 24cc342e78d1..e69ecd9acb5a 100755 --- a/deepspeed/utils/zero_to_fp32.py +++ b/deepspeed/utils/zero_to_fp32.py @@ -10,7 +10,10 @@ # the future. Once extracted, the weights don't require DeepSpeed and can be used in any # application. # -# example: python zero_to_fp32.py . pytorch_model.bin +# example: +# python zero_to_fp32.py . output_dir/ +# or +# python zero_to_fp32.py . output_dir/ --safe_serialization import argparse import torch @@ -18,6 +21,8 @@ import math import os import re +import json +from tqdm import tqdm from collections import OrderedDict from dataclasses import dataclass @@ -139,7 +144,6 @@ def parse_model_states(files): def parse_optim_states(files, ds_checkpoint_dir): - total_files = len(files) state_dicts = [] for f in files: @@ -420,12 +424,10 @@ def _zero3_merge_trainable_params(state_dict, world_size, fp32_flat_groups, zero offset = 0 total_numel = 0 total_params = 0 - for name, shape in param_shapes.items(): - + for name, shape in tqdm(param_shapes.items(), desc='Gathering Sharded Weights'): unpartitioned_numel = shape.numel() total_numel += unpartitioned_numel total_params += 1 - partitioned_numel, partitioned_padding_numel = zero3_partitioned_param_info(unpartitioned_numel, world_size) if debug: @@ -521,21 +523,75 @@ def get_fp32_state_dict_from_zero_checkpoint(checkpoint_dir, tag=None, exclude_f return _get_fp32_state_dict_from_zero_checkpoint(ds_checkpoint_dir, exclude_frozen_parameters) -def convert_zero_checkpoint_to_fp32_state_dict(checkpoint_dir, output_file, tag=None, exclude_frozen_parameters=False): +def convert_zero_checkpoint_to_fp32_state_dict(checkpoint_dir, + output_dir, + max_shard_size="5GB", + safe_serialization=False, + tag=None, + exclude_frozen_parameters=False): """ Convert ZeRO 2 or 3 checkpoint into a single fp32 consolidated ``state_dict`` file that can be loaded with ``torch.load(file)`` + ``load_state_dict()`` and used for training without DeepSpeed. Args: - ``checkpoint_dir``: path to the desired checkpoint folder. (one that contains the tag-folder, like ``global_step14``) - - ``output_file``: path to the pytorch fp32 state_dict output file (e.g. path/pytorch_model.bin) + - ``output_dir``: directory to the pytorch fp32 state_dict output files + - ``max_shard_size``: the maximum size for a checkpoint before being sharded, default value is 5GB + - ``safe_serialization``: whether to save the model using `safetensors` or the traditional PyTorch way (that uses `pickle`). - ``tag``: checkpoint tag used as a unique identifier for checkpoint. If not provided will attempt to load tag in the file named ``latest`` in the checkpoint folder, e.g., ``global_step14`` - ``exclude_frozen_parameters``: exclude frozen parameters """ - + # Dependency pre-check + if safe_serialization: + try: + from safetensors.torch import save_file + except ImportError: + print('If you want to use `safe_serialization`, please `pip install safetensors`') + raise + if max_shard_size is not None: + try: + from huggingface_hub import split_torch_state_dict_into_shards + except ImportError: + print('If you want to use `max_shard_size`, please `pip install huggingface_hub`') + raise + + # Convert zero checkpoint to state_dict state_dict = get_fp32_state_dict_from_zero_checkpoint(checkpoint_dir, tag, exclude_frozen_parameters) - print(f"Saving fp32 state dict to {output_file}") - torch.save(state_dict, output_file) + + # Shard the model if it is too big. + weights_name = "model.safetensors" if safe_serialization else "pytorch_model.bin" + if max_shard_size is not None: + filename_pattern = weights_name.replace(".bin", "{suffix}.bin").replace(".safetensors", "{suffix}.safetensors") + state_dict_split = split_torch_state_dict_into_shards(state_dict, + filename_pattern=filename_pattern, + max_shard_size=max_shard_size) + else: + from collections import namedtuple + StateDictSplit = namedtuple("StateDictSplit", ["is_sharded", "filename_to_tensors"]) + state_dict_split = StateDictSplit(is_sharded=False, + filename_to_tensors={weights_name: list(state_dict.keys())}) + + # Save the model + filename_to_tensors = state_dict_split.filename_to_tensors.items() + for shard_file, tensors in tqdm(filename_to_tensors, desc="Saving checkpoint shards"): + shard = {tensor: state_dict[tensor].contiguous() for tensor in tensors} + output_path = os.path.join(output_dir, shard_file) + if safe_serialization: + save_file(shard, output_path, metadata={"format": "pt"}) + else: + torch.save(shard, output_path) + + # Save index if sharded + if state_dict_split.is_sharded: + index = { + "metadata": state_dict_split.metadata, + "weight_map": state_dict_split.tensor_to_filename, + } + save_index_file = "model.safetensors.index.json" if safe_serialization else "pytorch_model.bin.index.json" + save_index_file = os.path.join(output_dir, save_index_file) + with open(save_index_file, "w", encoding="utf-8") as f: + content = json.dumps(index, indent=2, sort_keys=True) + "\n" + f.write(content) def load_state_dict_from_zero_checkpoint(model, checkpoint_dir, tag=None): @@ -578,15 +634,27 @@ def load_state_dict_from_zero_checkpoint(model, checkpoint_dir, tag=None): if __name__ == "__main__": - parser = argparse.ArgumentParser() parser.add_argument("checkpoint_dir", type=str, help="path to the desired checkpoint folder, e.g., path/checkpoint-12") + parser.add_argument("output_dir", + type=str, + help="directory to the pytorch fp32 state_dict output files" + "(e.g. path/checkpoint-12-output/)") parser.add_argument( - "output_file", + "--max_shard_size", type=str, - help="path to the pytorch fp32 state_dict output file (e.g. path/checkpoint-12/pytorch_model.bin)") + default="5GB", + help="The maximum size for a checkpoint before being sharded. Checkpoints shard will then be each of size" + "lower than this size. If expressed as a string, needs to be digits followed by a unit (like `5MB`" + "We default it to 5GB in order for models to be able to run easily on free-tier google colab instances" + "without CPU OOM issues.") + parser.add_argument( + "--safe_serialization", + default=False, + action='store_true', + help="Whether to save the model using `safetensors` or the traditional PyTorch way (that uses `pickle`).") parser.add_argument("-t", "--tag", type=str, @@ -599,6 +667,8 @@ def load_state_dict_from_zero_checkpoint(model, checkpoint_dir, tag=None): debug = args.debug convert_zero_checkpoint_to_fp32_state_dict(args.checkpoint_dir, - args.output_file, + args.output_dir, + max_shard_size=args.max_shard_size, + safe_serialization=args.safe_serialization, tag=args.tag, exclude_frozen_parameters=args.exclude_frozen_parameters) From ce468c3756561dc868672219b2895a56df2babe2 Mon Sep 17 00:00:00 2001 From: Shelly Nahir <73890534+ShellyNR@users.noreply.github.com> Date: Tue, 15 Oct 2024 21:30:42 +0300 Subject: [PATCH 557/754] add option to disable logger while compiling to avoid graph breaks (#6496) adding an option to disable calls for logger while compiling to avoid graph breaks. Here I used an environment variable to determine whether to activate this option, but it can also be determined using the json config file or any other way you see fit. --------- Co-authored-by: snahir Co-authored-by: Masahiro Tanaka <81312776+tohtana@users.noreply.github.com> --- deepspeed/utils/logging.py | 33 +++++++++++++++++++++++++++++++++ 1 file changed, 33 insertions(+) diff --git a/deepspeed/utils/logging.py b/deepspeed/utils/logging.py index 1e62d96e1032..55fb72f6c9fb 100644 --- a/deepspeed/utils/logging.py +++ b/deepspeed/utils/logging.py @@ -7,6 +7,8 @@ import logging import sys import os +import torch +from deepspeed.runtime.compiler import is_compile_supported log_levels = { "debug": logging.DEBUG, @@ -19,6 +21,31 @@ class LoggerFactory: + def create_warning_filter(logger): + warn = False + + def warn_once(record): + nonlocal warn + if is_compile_supported() and torch.compiler.is_compiling() and not warn: + warn = True + logger.warning("To avoid graph breaks caused by logger in compile-mode, it is recommended to" + " disable logging by setting env var DISABLE_LOGS_WHILE_COMPILING=1") + return True + + return warn_once + + @staticmethod + def logging_decorator(func): + + @functools.wraps(func) + def wrapper(*args, **kwargs): + if torch.compiler.is_compiling(): + return + else: + return func(*args, **kwargs) + + return wrapper + @staticmethod def create_logger(name=None, level=logging.INFO): """create a logger @@ -44,6 +71,12 @@ def create_logger(name=None, level=logging.INFO): ch.setLevel(level) ch.setFormatter(formatter) logger_.addHandler(ch) + if os.getenv("DISABLE_LOGS_WHILE_COMPILING", "0") == "1": + for method in ['info', 'debug', 'error', 'warning', 'critical', 'exception']: + original_logger = getattr(logger_, method) + setattr(logger_, method, LoggerFactory.logging_decorator(original_logger)) + else: + logger_.addFilter(LoggerFactory.create_warning_filter(logger_)) return logger_ From 1a45bd8e8ca27ce32a7091e64d07a04b2adb2bb5 Mon Sep 17 00:00:00 2001 From: Masahiro Tanaka <81312776+tohtana@users.noreply.github.com> Date: Tue, 15 Oct 2024 14:49:37 -0700 Subject: [PATCH 558/754] Lock cache file of HF model list (#6628) The error in the following log suggests that the cache file for HF model list can be broken: https://github.com/microsoft/DeepSpeed/actions/runs/11343665365/job/31546708118?pr=6614 The actual cause of the above error is unclear, but `_hf_model_list` potentially breaks the cache file when it is concurrently called from multiple processes. This PR locks the cache file to ensure `_hf_model_list` safely reads and writes the file. --- tests/unit/inference/test_inference.py | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/tests/unit/inference/test_inference.py b/tests/unit/inference/test_inference.py index 581a2ce433ed..9b563523dbeb 100644 --- a/tests/unit/inference/test_inference.py +++ b/tests/unit/inference/test_inference.py @@ -10,6 +10,7 @@ import os import time import requests +import fcntl from dataclasses import dataclass from typing import List @@ -95,9 +96,12 @@ def _hf_model_list() -> List[ModelInfo]: if os.path.isfile(cache_file_path): with open(cache_file_path, 'rb') as f: try: + fcntl.flock(f, fcntl.LOCK_SH) model_data = pickle.load(f) except Exception as e: print(f"Error loading cache file {cache_file_path}: {e}") + finally: + fcntl.flock(f, fcntl.LOCK_UN) current_time = time.time() @@ -125,7 +129,11 @@ def _hf_model_list() -> List[ModelInfo]: # Save the updated cache os.makedirs(cache_dir, exist_ok=True) with open(cache_file_path, 'wb') as f: - pickle.dump(model_data, f) + try: + fcntl.flock(f, fcntl.LOCK_EX) + pickle.dump(model_data, f) + finally: + fcntl.flock(f, fcntl.LOCK_UN) return model_data["model_list"] From c9899dc14a391538ce8f0c4d58920c390dc381de Mon Sep 17 00:00:00 2001 From: jiahao su Date: Wed, 16 Oct 2024 07:36:10 +0800 Subject: [PATCH 559/754] Add README Pipeline Status for Huawei Ascend NPU (#6588) Hello! Following the merge of https://github.com/microsoft/DeepSpeed/pull/6445, I have implemented a CI pipeline to validate the Huawei Ascend NPU. --------- Co-authored-by: sjh Co-authored-by: Logan Adams <114770087+loadams@users.noreply.github.com> Co-authored-by: Olatunji Ruwase Co-authored-by: Masahiro Tanaka <81312776+tohtana@users.noreply.github.com> --- README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/README.md b/README.md index 86711c4374f8..b302e32dfd9c 100755 --- a/README.md +++ b/README.md @@ -142,6 +142,7 @@ DeepSpeed has been integrated with several different popular open-source DL fram | PyTorch Nightly | [![nv-torch-nightly-v100](https://github.com/microsoft/DeepSpeed/actions/workflows/nv-torch-nightly-v100.yml/badge.svg?branch=master)](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?branch=master)](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?branch=master)](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?branch=master)](https://github.com/microsoft/DeepSpeed/actions/workflows/nv-accelerate-v100.yml) [![nv-mii](https://github.com/microsoft/DeepSpeed/actions/workflows/nv-mii.yml/badge.svg?branch=master)](https://github.com/microsoft/DeepSpeed/actions/workflows/nv-mii.yml) [![nv-ds-chat](https://github.com/microsoft/DeepSpeed/actions/workflows/nv-ds-chat.yml/badge.svg?branch=master)](https://github.com/microsoft/DeepSpeed/actions/workflows/nv-ds-chat.yml) [![nv-sd](https://github.com/microsoft/DeepSpeed/actions/workflows/nv-sd.yml/badge.svg)](https://github.com/microsoft/DeepSpeed/actions/workflows/nv-sd.yml) | | Misc | [![Formatting](https://github.com/microsoft/DeepSpeed/actions/workflows/formatting.yml/badge.svg?branch=master)](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)[![python](https://github.com/microsoft/DeepSpeed/actions/workflows/python.yml/badge.svg?branch=master)](https://github.com/microsoft/DeepSpeed/actions/workflows/python.yml) | +| Huawei Ascend NPU | [![Huawei Ascend NPU](https://github.com/cosdt/DeepSpeed/actions/workflows/huawei-ascend-npu.yml/badge.svg?branch=master)](https://github.com/cosdt/DeepSpeed/actions/workflows/huawei-ascend-npu.yml) | # Installation From a36db9cc1c167c24c7ce6b1d3f38a8550c6ec4b7 Mon Sep 17 00:00:00 2001 From: Masahiro Tanaka <81312776+tohtana@users.noreply.github.com> Date: Thu, 17 Oct 2024 10:50:55 -0700 Subject: [PATCH 560/754] Update torch version in workflows (#6631) Set PyTorch version in CI workflows to v2.5. Context: The [error](https://github.com/microsoft/DeepSpeed/actions/runs/11371525624/job/31633793986?pr=6630) in #6630 might have been caused by the PyTorch version mismatch or something. --- .github/workflows/cpu-torch-latest.yml | 4 ++-- .github/workflows/nv-nightly.yml | 2 +- .github/workflows/nv-torch-latest-v100.yml | 4 ++-- 3 files changed, 5 insertions(+), 5 deletions(-) diff --git a/.github/workflows/cpu-torch-latest.yml b/.github/workflows/cpu-torch-latest.yml index bb2b002b1a17..0de6832b37c1 100644 --- a/.github/workflows/cpu-torch-latest.yml +++ b/.github/workflows/cpu-torch-latest.yml @@ -50,5 +50,5 @@ jobs: run: | unset TORCH_CUDA_ARCH_LIST # only jit compile for current arch cd tests - HF_HOME=/tmp/hf_home/ pytest $PYTEST_OPTS -n 4 unit/ --torch_ver="2.4" - HF_HOME=/tmp/hf_home/ pytest $PYTEST_OPTS -m 'sequential' unit/ --torch_ver="2.4" + HF_HOME=/tmp/hf_home/ pytest $PYTEST_OPTS -n 4 unit/ --torch_ver="2.5" + HF_HOME=/tmp/hf_home/ pytest $PYTEST_OPTS -m 'sequential' unit/ --torch_ver="2.5" diff --git a/.github/workflows/nv-nightly.yml b/.github/workflows/nv-nightly.yml index e6032941ebb3..8c56d0445c9c 100644 --- a/.github/workflows/nv-nightly.yml +++ b/.github/workflows/nv-nightly.yml @@ -58,7 +58,7 @@ jobs: run: | unset TORCH_CUDA_ARCH_LIST # only jit compile for current arch cd tests - pytest $PYTEST_OPTS --forked -m 'nightly' unit/ --torch_ver="2.4" --cuda_ver="12.1" + pytest $PYTEST_OPTS --forked -m 'nightly' unit/ --torch_ver="2.5" --cuda_ver="12.1" - name: Open GitHub issue if nightly CI fails if: ${{ failure() && (github.event_name == 'schedule') }} diff --git a/.github/workflows/nv-torch-latest-v100.yml b/.github/workflows/nv-torch-latest-v100.yml index e888c472638f..0b8f504d8b5a 100644 --- a/.github/workflows/nv-torch-latest-v100.yml +++ b/.github/workflows/nv-torch-latest-v100.yml @@ -55,5 +55,5 @@ jobs: run: | unset TORCH_CUDA_ARCH_LIST # only jit compile for current arch cd tests - pytest $PYTEST_OPTS --forked -n 4 unit/ --torch_ver="2.4" --cuda_ver="12.1" - pytest $PYTEST_OPTS --forked -m 'sequential' unit/ --torch_ver="2.4" --cuda_ver="12.1" + pytest $PYTEST_OPTS --forked -n 4 unit/ --torch_ver="2.5" --cuda_ver="12.1" + pytest $PYTEST_OPTS --forked -m 'sequential' unit/ --torch_ver="2.5" --cuda_ver="12.1" From c9fc34a4be558efce2a26d2b4e08cd8880524dc8 Mon Sep 17 00:00:00 2001 From: Masahiro Tanaka <81312776+tohtana@users.noreply.github.com> Date: Thu, 17 Oct 2024 15:15:25 -0700 Subject: [PATCH 561/754] Use file store for tests (#6632) This PR changes the `init_method` for tests to `FileStore` for robustness. --- tests/unit/common.py | 50 +++++++++++++++++++++++++++----------------- 1 file changed, 31 insertions(+), 19 deletions(-) diff --git a/tests/unit/common.py b/tests/unit/common.py index 69ba4c2708ac..685f943df2fe 100644 --- a/tests/unit/common.py +++ b/tests/unit/common.py @@ -147,16 +147,13 @@ class DistributedExec(ABC): def run(self): ... - def __call__(self, request=None): + def __call__(self, request): self._fixture_kwargs = self._get_fixture_kwargs(request, self.run) world_size = self.world_size if self.requires_cuda_env and not get_accelerator().is_available(): pytest.skip("only supported in accelerator environments.") - if isinstance(world_size, int): - world_size = [world_size] - for procs in world_size: - self._launch_procs(procs) + self._launch_with_file_store(request, world_size) def _get_fixture_kwargs(self, request, func): if not request: @@ -172,7 +169,7 @@ def _get_fixture_kwargs(self, request, func): pass # test methods can have kwargs that are not fixtures return fixture_kwargs - def _launch_daemonic_procs(self, num_procs): + def _launch_daemonic_procs(self, num_procs, init_method): # Create process pool or use cached one master_port = None @@ -198,7 +195,7 @@ def _launch_daemonic_procs(self, num_procs): master_port = get_master_port() # Run the test - args = [(local_rank, num_procs, master_port) for local_rank in range(num_procs)] + args = [(local_rank, num_procs, master_port, init_method) for local_rank in range(num_procs)] skip_msgs_async = pool.starmap_async(self._dist_run, args) try: @@ -218,7 +215,7 @@ def _launch_daemonic_procs(self, num_procs): assert len(set(skip_msgs)) == 1, "Multiple different skip messages received" pytest.skip(skip_msgs[0]) - def _launch_non_daemonic_procs(self, num_procs): + def _launch_non_daemonic_procs(self, num_procs, init_method): assert not self.reuse_dist_env, "Cannot reuse distributed environment with non-daemonic processes" master_port = get_master_port() @@ -227,7 +224,7 @@ def _launch_non_daemonic_procs(self, num_procs): prev_start_method = mp.get_start_method() mp.set_start_method('spawn', force=True) for local_rank in range(num_procs): - p = mp.Process(target=self._dist_run, args=(local_rank, num_procs, master_port, skip_msg)) + p = mp.Process(target=self._dist_run, args=(local_rank, num_procs, master_port, init_method, skip_msg)) p.start() processes.append(p) mp.set_start_method(prev_start_method, force=True) @@ -269,7 +266,7 @@ def _launch_non_daemonic_procs(self, num_procs): # add a check here to assert all exit messages are equal pytest.skip(skip_msg.get()) - def _launch_procs(self, num_procs): + def _launch_procs(self, num_procs, init_method): # Verify we have enough accelerator devices to run this test if get_accelerator().is_available() and get_accelerator().device_count() < num_procs: pytest.skip( @@ -284,11 +281,11 @@ def _launch_procs(self, num_procs): mp.set_start_method('forkserver', force=True) if self.non_daemonic_procs: - self._launch_non_daemonic_procs(num_procs) + self._launch_non_daemonic_procs(num_procs, init_method) else: - self._launch_daemonic_procs(num_procs) + self._launch_daemonic_procs(num_procs, init_method) - def _dist_run(self, local_rank, num_procs, master_port, skip_msg=""): + def _dist_run(self, local_rank, num_procs, master_port, init_method, skip_msg=""): if not dist.is_initialized(): """ Initialize deepspeed.comm and execute the user function. """ if self.set_dist_env: @@ -312,7 +309,10 @@ def _dist_run(self, local_rank, num_procs, master_port, skip_msg=""): get_accelerator().set_device(local_rank) if self.init_distributed: - deepspeed.init_distributed(dist_backend=self.backend) + deepspeed.init_distributed(dist_backend=self.backend, + init_method=init_method, + rank=local_rank, + world_size=num_procs) dist.barrier() try: @@ -328,6 +328,22 @@ def _dist_run(self, local_rank, num_procs, master_port, skip_msg=""): return skip_msg + def _launch_with_file_store(self, request, world_size): + tmpdir = request.getfixturevalue("tmpdir") + dist_file_store = tmpdir.join("dist_file_store") + assert not os.path.exists(dist_file_store) + init_method = f"file://{dist_file_store}" + + if isinstance(world_size, int): + world_size = [world_size] + for procs in world_size: + try: + self._launch_procs(procs, init_method) + finally: + if os.path.exists(dist_file_store): + os.remove(dist_file_store) + time.sleep(0.5) + def _dist_destroy(self): if (dist is not None) and dist.is_initialized(): dist.barrier() @@ -473,11 +489,7 @@ def __call__(self, request): else: world_size = self._fixture_kwargs.get("world_size", self.world_size) - if isinstance(world_size, int): - world_size = [world_size] - for procs in world_size: - self._launch_procs(procs) - time.sleep(0.5) + self._launch_with_file_store(request, world_size) def _get_current_test_func(self, request): # DistributedTest subclasses may have multiple test methods From 6eefc3d0ead2c6360eec248daab0cae66a737ea0 Mon Sep 17 00:00:00 2001 From: Joe Mayer <114769929+jomayeri@users.noreply.github.com> Date: Thu, 17 Oct 2024 19:58:06 -0700 Subject: [PATCH 562/754] Fix Memory Leak In AIO (#6630) Fixing a memory leak in AIO pinned tensor as well as an incorrect function type for gds op. --------- Co-authored-by: Masahiro Tanaka <81312776+tohtana@users.noreply.github.com> --- csrc/aio/py_lib/deepspeed_cpu_op.cpp | 5 ++++- csrc/aio/py_lib/deepspeed_pin_tensor.cpp | 2 ++ csrc/gds/py_lib/deepspeed_gds_op.cpp | 3 +-- csrc/gds/py_lib/deepspeed_gds_op.h | 2 +- csrc/gds/py_lib/deepspeed_py_gds_handle.cpp | 2 +- csrc/gds/py_lib/deepspeed_py_gds_handle.h | 2 +- 6 files changed, 10 insertions(+), 6 deletions(-) diff --git a/csrc/aio/py_lib/deepspeed_cpu_op.cpp b/csrc/aio/py_lib/deepspeed_cpu_op.cpp index da1a52d9c6e3..da2ff568d74b 100644 --- a/csrc/aio/py_lib/deepspeed_cpu_op.cpp +++ b/csrc/aio/py_lib/deepspeed_cpu_op.cpp @@ -38,7 +38,10 @@ void cpu_op_desc_t::finish() { if (_use_bounce_buffer) { if (_read_op) { - if (_buffer.is_cuda()) { _buffer.copy_(_cpu_buffer.to(torch::kCUDA)); } + if (_buffer.is_cuda()) { + _buffer.copy_(_cpu_buffer.to(torch::Device(torch::kCUDA, _buffer.get_device()), + /*non_blocking=*/true)); + } if (_buffer.is_xpu()) { _buffer.copy_(_cpu_buffer.to(torch::kXPU)); } if (_buffer.is_cpu()) { _buffer.copy_(_cpu_buffer); } #if defined(__ENABLE_CANN__) diff --git a/csrc/aio/py_lib/deepspeed_pin_tensor.cpp b/csrc/aio/py_lib/deepspeed_pin_tensor.cpp index 6d2800468e06..a97a4ac18ba8 100644 --- a/csrc/aio/py_lib/deepspeed_pin_tensor.cpp +++ b/csrc/aio/py_lib/deepspeed_pin_tensor.cpp @@ -15,6 +15,7 @@ deepspeed_pin_tensor_t::~deepspeed_pin_tensor_t() { for (auto iter = _locked_tensors.begin(); iter != _locked_tensors.end(); ++iter) { munlock(iter->first, iter->second); + std::free((void*)iter->first); } _locked_tensors.clear(); } @@ -43,6 +44,7 @@ bool deepspeed_pin_tensor_t::free(torch::Tensor& locked_tensor) auto addr = locked_tensor.data_ptr(); if (_locked_tensors.find(addr) != _locked_tensors.end()) { munlock(addr, _locked_tensors[addr]); + std::free(addr); _locked_tensors.erase(addr); return true; } diff --git a/csrc/gds/py_lib/deepspeed_gds_op.cpp b/csrc/gds/py_lib/deepspeed_gds_op.cpp index dae2eef21c6f..f49f74394374 100644 --- a/csrc/gds/py_lib/deepspeed_gds_op.cpp +++ b/csrc/gds/py_lib/deepspeed_gds_op.cpp @@ -58,7 +58,6 @@ void gds_op_desc_t::add_buffer_to_registry(const torch::Tensor& buffer) const int64_t device = buffer.get_device(); void* reg_ptr = buffer.data_ptr(); - // std::cout << "REG PTR " << reg_ptr << std::endl; // TODO: add checking to make sure pointer isn't already in set const auto it = base_ptr_registry.find(device); if (it == base_ptr_registry.end()) { @@ -94,7 +93,7 @@ gds_op_desc_t::gds_op_desc_t(const bool read_op, const torch::Tensor& buffer, const int fd, const char* filename, - const long long int file_num_bytes, + const int64_t file_num_bytes, const int intra_op_parallelism, const bool validate) : io_op_desc_t(read_op, buffer, fd, filename, file_num_bytes, intra_op_parallelism, validate) diff --git a/csrc/gds/py_lib/deepspeed_gds_op.h b/csrc/gds/py_lib/deepspeed_gds_op.h index c9d4c076f189..380bb0b9b6ae 100644 --- a/csrc/gds/py_lib/deepspeed_gds_op.h +++ b/csrc/gds/py_lib/deepspeed_gds_op.h @@ -22,7 +22,7 @@ struct gds_op_desc_t : io_op_desc_t { const torch::Tensor& buffer, const int fd, const char* filename, - const long long int file_num_bytes, + const int64_t file_num_bytes, const int intra_op_parallelism, const bool validate); diff --git a/csrc/gds/py_lib/deepspeed_py_gds_handle.cpp b/csrc/gds/py_lib/deepspeed_py_gds_handle.cpp index 43705939dc3e..c052144a0190 100644 --- a/csrc/gds/py_lib/deepspeed_py_gds_handle.cpp +++ b/csrc/gds/py_lib/deepspeed_py_gds_handle.cpp @@ -106,7 +106,7 @@ std::shared_ptr deepspeed_gds_handle_t::_create_io_op_desc( const torch::Tensor& buffer, const int fd, const char* filename, - const long long int file_num_bytes, + const int64_t file_num_bytes, const bool validate) { if (buffer.is_cuda()) { diff --git a/csrc/gds/py_lib/deepspeed_py_gds_handle.h b/csrc/gds/py_lib/deepspeed_py_gds_handle.h index a3c10a4f6467..131e83e7b838 100644 --- a/csrc/gds/py_lib/deepspeed_py_gds_handle.h +++ b/csrc/gds/py_lib/deepspeed_py_gds_handle.h @@ -41,7 +41,7 @@ struct deepspeed_gds_handle_t : deepspeed_io_handle_t { const torch::Tensor& buffer, const int fd, const char* filename, - const long long int file_num_bytes, + const int64_t file_num_bytes, const bool validate); static int s_cuFile_init; From 40bde528bcac79f765dc8f15d6d1512b3415199f Mon Sep 17 00:00:00 2001 From: Liangliang Ma Date: Mon, 21 Oct 2024 20:25:11 +0800 Subject: [PATCH 563/754] [XPU] upgrade xpu max1100 CI workflow to pytorch2.3 (#6646) With intel-extension-for-pytorch=2.3.110 released last month, max1100 CI workflow can be updated too. Software versions aligned with #6570 . Increased CI tests scope for torch/ipex2.3 will be in later PR. This workflow passed in my cloned repo self-hosted runner. --- .github/workflows/xpu-max1100.yml | 13 ++++++------- 1 file changed, 6 insertions(+), 7 deletions(-) diff --git a/.github/workflows/xpu-max1100.yml b/.github/workflows/xpu-max1100.yml index adeeb0acade2..d19e73aeef1c 100644 --- a/.github/workflows/xpu-max1100.yml +++ b/.github/workflows/xpu-max1100.yml @@ -36,7 +36,7 @@ jobs: unit-tests: runs-on: [self-hosted, intel, xpu] container: - image: intel/oneapi-basekit:2024.1.1-devel-ubuntu22.04 + image: intel/oneapi-basekit:2024.2.1-0-devel-ubuntu22.04 ports: - 80 options: --privileged -it --rm --device /dev/dri:/dev/dri -v /dev/dri/by-path:/dev/dri/by-path --ipc=host --cap-add=ALL @@ -47,12 +47,11 @@ jobs: run: | apt-get update apt-get install clinfo libaio-dev python3-pip -y - pip install torch==2.1.0.post2 -f https://developer.intel.com/ipex-whl-stable-xpu - pip install intel-extension-for-pytorch==2.1.30+xpu -f https://developer.intel.com/ipex-whl-stable-xpu - pip install intel-extension-for-pytorch-deepspeed==2.1.30 -f https://developer.intel.com/ipex-whl-stable-xpu - pip install oneccl_bind_pt==2.1.300+xpu -f https://developer.intel.com/ipex-whl-stable-xpu - pip install torchvision==0.16.0.post2 -f https://developer.intel.com/ipex-whl-stable-xpu - pip install py-cpuinfo numpy==1.26 + pip install torch==2.3.1 -f https://pytorch-extension.intel.com/release-whl/stable/xpu/us/torch/ + pip install intel-extension-for-pytorch==2.3.110+xpu -f https://pytorch-extension.intel.com/release-whl/stable/xpu/us/intel-extension-for-pytorch/ + pip install oneccl_bind_pt==2.3.100+xpu -f https://pytorch-extension.intel.com/release-whl/stable/xpu/us/oneccl-bind-pt/ + pip install torchvision==0.18.1 -f https://pytorch-extension.intel.com/release-whl/stable/xpu/us/torchvision/ + pip install py-cpuinfo numpy pip install .[dev,autotuning] - name: Check container state From 11bbf45af53c47f0fae46fa14041af4edb2f5d85 Mon Sep 17 00:00:00 2001 From: Yizhou Wang Date: Tue, 22 Oct 2024 14:53:15 +0800 Subject: [PATCH 564/754] [XPU] host timer check version from Torch 2.5 to Torch 2.6 (#6633) Elapsed time would be supported in Torch 2.6. Co-authored-by: Masahiro Tanaka <81312776+tohtana@users.noreply.github.com> --- accelerator/xpu_accelerator.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/accelerator/xpu_accelerator.py b/accelerator/xpu_accelerator.py index 6da48000dafa..ad8a10710bf2 100644 --- a/accelerator/xpu_accelerator.py +++ b/accelerator/xpu_accelerator.py @@ -26,8 +26,8 @@ def is_synchronized_device(self): return False def use_host_timers(self): - # WA XPU event will be consolidated in 2.5 - if ipex.__version__ < '2.5': + # WA XPU event will be consolidated in 2.6 + if ipex.__version__ < '2.6': return True else: return self.is_synchronized_device() From a24cdd6b67a0e761474d2074d39ac73f4968caf7 Mon Sep 17 00:00:00 2001 From: Liangliang Ma Date: Tue, 22 Oct 2024 22:45:05 +0800 Subject: [PATCH 565/754] [XPU] [DeepNVMe] use same cpu_op_desc_t with cuda (#6645) We have found that #6592 uses `_pinned_tensor_mgr` to create cpu bounce buffer, which is same with what our xpu accelerator currently doing. So no need to use xpu device specific cpu_op_desc_t. In this PR: 1. remove custom csrc/xpu/aio/deepspeed_cpu_op.cpp 2. modify xpu async_io opbuilder. This issue cannot be easily done with revert #6532 , for we added some source file as last time GDS feature going in DS. So file this new PR :) --- csrc/xpu/aio/deepspeed_cpu_op.cpp | 51 ------------------------------- op_builder/xpu/async_io.py | 2 +- 2 files changed, 1 insertion(+), 52 deletions(-) delete mode 100644 csrc/xpu/aio/deepspeed_cpu_op.cpp diff --git a/csrc/xpu/aio/deepspeed_cpu_op.cpp b/csrc/xpu/aio/deepspeed_cpu_op.cpp deleted file mode 100644 index ee98c2d5cac2..000000000000 --- a/csrc/xpu/aio/deepspeed_cpu_op.cpp +++ /dev/null @@ -1,51 +0,0 @@ -// Copyright (c) Microsoft Corporation. -// SPDX-License-Identifier: Apache-2.0 - -// DeepSpeed Team - -#include "deepspeed_cpu_op.h" - -using namespace std; - -cpu_op_desc_t::cpu_op_desc_t(const bool read_op, - const torch::Tensor& buffer, - const int fd, - const char* filename, - const long long int file_num_bytes, - const int num_threads, - const bool validate) - : io_op_desc_t(read_op, buffer, fd, filename, file_num_bytes, num_threads, validate), - _cpu_buffer(buffer) -{ - // XPU don't handle buffer here. See XPU Accelerator pin_memory. - _contiguous_buffer = _cpu_buffer.contiguous(); -} - -char* cpu_op_desc_t::data_ptr() const { return (char*)_contiguous_buffer.data_ptr(); } - -void cpu_op_desc_t::finish() -{ - if (_read_op && _buffer.is_xpu()) { _buffer.copy_(_cpu_buffer.to(torch::kXPU)); } -} - -void cpu_op_desc_t::validate() -{ - validate_aio_operation(_read_op, _filename.c_str(), data_ptr(), _file_num_bytes); -} - -void cpu_op_desc_t::run(const int tid, - std::unique_ptr& aio_ctxt, - deepspeed_aio_config_t* aio_config) -{ - assert(tid < _num_threads); - const auto base_offset = _num_bytes_per_thread * tid; - - std::unique_ptr xfer_ctxt( - new io_xfer_ctxt(_fd, base_offset, _num_bytes_per_thread, data_ptr())); - - if (aio_config->_overlap_events) { - do_aio_operation_overlap(_read_op, aio_ctxt, xfer_ctxt, aio_config, nullptr); - } else { - do_aio_operation_sequential(_read_op, aio_ctxt, xfer_ctxt, aio_config, nullptr); - } -} diff --git a/op_builder/xpu/async_io.py b/op_builder/xpu/async_io.py index 6a6798eaeb9c..2da963ae64aa 100644 --- a/op_builder/xpu/async_io.py +++ b/op_builder/xpu/async_io.py @@ -31,7 +31,7 @@ def sources(self): 'csrc/aio/common/deepspeed_aio_types.cpp', 'csrc/aio/py_lib/deepspeed_pin_tensor.cpp', 'csrc/aio/py_lib/deepspeed_py_io_handle.cpp', - 'csrc/xpu/aio/deepspeed_cpu_op.cpp', + 'csrc/aio/py_lib/deepspeed_cpu_op.cpp', 'csrc/aio/py_lib/deepspeed_aio_op_desc.cpp', ] From bf03f4835295bccc4765c9ae428c5d3e3ddb04fe Mon Sep 17 00:00:00 2001 From: Logan Adams <114770087+loadams@users.noreply.github.com> Date: Tue, 22 Oct 2024 14:15:45 -0700 Subject: [PATCH 566/754] Update version.txt after 0.15.3 release (#6652) **Auto-generated PR to update version.txt after a DeepSpeed release** Released version - 0.15.3 Author - @jomayeri Co-authored-by: jomayeri --- version.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/version.txt b/version.txt index 1985d91413de..7ffdfa1cad65 100644 --- a/version.txt +++ b/version.txt @@ -1 +1 @@ -0.15.3 +0.15.4 From b647fb2470f8f6fefe5cab0ea84a2d89696eb898 Mon Sep 17 00:00:00 2001 From: wyooyw Date: Wed, 23 Oct 2024 08:08:39 +0800 Subject: [PATCH 567/754] Fix expert grad scaling problem with ZeRO optimizer (#6546) Fix [#6545] work: - expert gradient average: divide edp_world_size -> divide dp_world_size - unit test: make sure model with different dp/ep has same expert gradient --------- Co-authored-by: wangyiou Co-authored-by: Masahiro Tanaka <81312776+tohtana@users.noreply.github.com> Co-authored-by: Logan Adams <114770087+loadams@users.noreply.github.com> --- deepspeed/runtime/zero/stage_1_and_2.py | 9 +- tests/unit/moe/test_moe.py | 112 ++++++++++++++++++++++++ tests/unit/simple_model.py | 8 +- 3 files changed, 119 insertions(+), 10 deletions(-) diff --git a/deepspeed/runtime/zero/stage_1_and_2.py b/deepspeed/runtime/zero/stage_1_and_2.py index df7a2f83e3bc..669826206e4b 100755 --- a/deepspeed/runtime/zero/stage_1_and_2.py +++ b/deepspeed/runtime/zero/stage_1_and_2.py @@ -1070,14 +1070,10 @@ def average_tensor(self, tensor): for i, param, param_id in self.params_in_ipg_bucket: process_group = self.dp_process_group - grad_reduc = self.get_gradient_for_reduction(param) - #Averages gradients at parameter level if ipg has a moe param - #Otherwise averaging is done at the entire buffer level at the end of the loop - # MoE param have different groups + if self.ipg_bucket_has_moe_params: process_group = self.expert_dp_process_group[param.group_name] if is_moe_param( param) else self.dp_process_group - grad_reduc.data.div_(dist.get_world_size(group=process_group) / float(self.sequence_parallel_size)) partition_ids = self.param_to_partition_ids[i][param_id] assert all([p_id < dist.get_world_size(group=process_group) for p_id in partition_ids @@ -1116,8 +1112,7 @@ def average_tensor(self, tensor): curr_size += numel prev_id, prev_process_group = partition_id, process_group - if not self.ipg_bucket_has_moe_params: - tensor.div_(dist.get_world_size(group=self.dp_process_group) / float(self.sequence_parallel_size)) + tensor.div_(dist.get_world_size(group=self.dp_process_group) / float(self.sequence_parallel_size)) buckets = {} for i, (dst, bucket_offset, numel) in enumerate(rank_and_offsets): diff --git a/tests/unit/moe/test_moe.py b/tests/unit/moe/test_moe.py index f65d5e2a03bc..9ee546437f6c 100644 --- a/tests/unit/moe/test_moe.py +++ b/tests/unit/moe/test_moe.py @@ -7,6 +7,7 @@ import deepspeed import pytest import gc +import random from unit.common import DistributedTest from unit.simple_model import SimplePRMoEModel, SimpleMoEModel, sequence_dataloader import deepspeed.comm as dist @@ -238,3 +239,114 @@ def check_equal(logits, cap, sparse_truth, res): [2, 1, 1], [2, 2, 1], [2, 3, 1], [3, 0, 0]]) position_dispatch_res = topkgating(logits2, 3, 1, min_capacity=1, drop_policy='position')[2] check_equal(logits2, 2, position_sec_sparse, position_dispatch_res) + + +class TestExpertWeightGradWithZero(DistributedTest): + world_size = 2 + + @pytest.mark.parametrize("zero_stage", [0, 1, 2]) + def test(self, zero_stage): + + if not required_torch_version(min_version=1.8): + pytest.skip("DeepSpeed MoE tests need torch 1.8 or higher to run correctly") + + def seed_everything(seed=11): + random.seed(seed) + torch.manual_seed(seed) + get_accelerator().manual_seed(seed) + get_accelerator().manual_seed_all(seed) + torch.backends.cudnn.deterministic = True + torch.backends.cudnn.benchmark = False + + def get_state_dict_ep2(state_dict): + """ + convert state_dict from EP=1 to EP=2 + """ + rank = int(deepspeed.comm.get_rank()) + ep_state_dict = dict() + dst_sub_key = f"deepspeed_moe.experts.deepspeed_experts.0" + src_sub_key = f"deepspeed_moe.experts.deepspeed_experts.{rank}" + for moe_layer in ["moe_1", "moe_2"]: + for mlp_in_moe in [0, 1]: + dst_key = f"{moe_layer}.{dst_sub_key}.{mlp_in_moe}" + src_key = f"{moe_layer}.{src_sub_key}.{mlp_in_moe}" + ep_state_dict[f"{dst_key}.weight"] = state_dict[f"{src_key}.weight"].detach().clone() + ep_state_dict[f"{dst_key}.bias"] = state_dict[f"{src_key}.bias"].detach().clone() + + for key in state_dict.keys(): + if "deepspeed_moe.experts.deepspeed_experts" not in key: + ep_state_dict[key] = state_dict[key].detach().clone() + return ep_state_dict + + def get_models(hidden_dim): + model_ep1 = SimpleMoEModel(hidden_dim=hidden_dim, num_experts=2, ep_size=1, use_rts=False) + model_ep2 = SimpleMoEModel(hidden_dim=hidden_dim, num_experts=2, ep_size=2, use_rts=False) + + state_dict_ep1 = model_ep1.state_dict() + state_dict_ep2 = get_state_dict_ep2(state_dict_ep1) + model_ep2.load_state_dict(state_dict_ep2) + + model_ep1, _, _, _ = deepspeed.initialize(config=config_dict, model=model_ep1) + model_ep2, _, _, _ = deepspeed.initialize(config=config_dict, model=model_ep2) + + return model_ep1, model_ep2 + + def extract_expert_grad(model, expert_id): + + def _get_weight_bias(experts): + return ([deepspeed.utils.safe_get_full_grad(expert[0].weight) + for expert in experts][expert_id].detach().clone(), + [deepspeed.utils.safe_get_full_grad(expert[0].bias) + for expert in experts][expert_id].detach().clone(), + [deepspeed.utils.safe_get_full_grad(expert[1].weight) + for expert in experts][expert_id].detach().clone(), + [deepspeed.utils.safe_get_full_grad(expert[1].bias) + for expert in experts][expert_id].detach().clone()) + + return (*_get_weight_bias(model.moe_1.deepspeed_moe.experts.deepspeed_experts), + *_get_weight_bias(model.moe_2.deepspeed_moe.experts.deepspeed_experts)) + + seed_everything() + + config_dict = { + "train_micro_batch_size_per_gpu": 1, + "steps_per_print": 1, + "optimizer": { + "type": "Adam", + "params": { + "lr": 0.1, + } + }, + "zero_optimization": { + "stage": zero_stage + } + } + + hidden_dim = 4 + total_samples = 2 + rank = deepspeed.comm.get_rank() + model_ep1, model_ep2 = get_models(hidden_dim) + + data_loader = sequence_dataloader(model=model_ep1, + total_samples=total_samples, + hidden_dim=hidden_dim, + device=model_ep1.device, + dtype=torch.float32) + expert_weight_grad_ep1 = [] + expert_weight_grad_ep2 = [] + for batch in data_loader: + loss_ep1 = model_ep1(batch[0], batch[1]) + loss_ep2 = model_ep2(batch[0], batch[1]) + + model_ep1.backward(loss_ep1) + model_ep2.backward(loss_ep2) + + expert_weight_grad_ep1.extend(extract_expert_grad(model_ep1, rank)) + expert_weight_grad_ep2.extend(extract_expert_grad(model_ep2, 0)) + + model_ep1.step() + model_ep2.step() + + assert len(expert_weight_grad_ep1) == len(expert_weight_grad_ep2) + for grad_from_ep1, grad_from_ep2 in zip(expert_weight_grad_ep1, expert_weight_grad_ep2): + assert torch.allclose(grad_from_ep1, grad_from_ep2, atol=0, rtol=1e-4) diff --git a/tests/unit/simple_model.py b/tests/unit/simple_model.py index 3357c200bd68..a5538a8c6e68 100644 --- a/tests/unit/simple_model.py +++ b/tests/unit/simple_model.py @@ -79,7 +79,7 @@ def forward(self, x, y, **kwargs): class SimpleMoEModel(torch.nn.Module): - def __init__(self, hidden_dim, num_experts=4, ep_size=1, use_residual=False): + def __init__(self, hidden_dim, num_experts=4, ep_size=1, use_residual=False, use_rts=True): super(SimpleMoEModel, self).__init__() self.linear1 = torch.nn.Linear(hidden_dim, hidden_dim) expert = torch.nn.Sequential(torch.nn.Linear(hidden_dim, hidden_dim), torch.nn.Linear(hidden_dim, hidden_dim)) @@ -89,7 +89,8 @@ def __init__(self, hidden_dim, num_experts=4, ep_size=1, use_residual=False): ep_size=ep_size, use_residual=use_residual, num_experts=num_experts, - k=1) + k=1, + use_rts=use_rts) # interleaving MoE modules with dense to create an opportunity # for gradients to be merged in ZeRO stage 2 average_tensor reduce bucket self.linear2 = torch.nn.Linear(hidden_dim, hidden_dim) @@ -98,7 +99,8 @@ def __init__(self, hidden_dim, num_experts=4, ep_size=1, use_residual=False): ep_size=ep_size, use_residual=use_residual, num_experts=num_experts, - k=1) + k=1, + use_rts=use_rts) self.linear3 = torch.nn.Linear(hidden_dim, hidden_dim) self.cross_entropy_loss = torch.nn.CrossEntropyLoss() From e06bb518aa7dafef1e98a1da63362e1586b2ddd5 Mon Sep 17 00:00:00 2001 From: Yejing-Lai Date: Thu, 24 Oct 2024 04:22:59 +0800 Subject: [PATCH 568/754] Add attribute check for language_model when replace last linear module (#6650) Fix module has no attribute 'language_model' issue. Co-authored-by: Masahiro Tanaka <81312776+tohtana@users.noreply.github.com> --- deepspeed/module_inject/replace_module.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/deepspeed/module_inject/replace_module.py b/deepspeed/module_inject/replace_module.py index cf70c4530c82..dece5a2c4ecf 100644 --- a/deepspeed/module_inject/replace_module.py +++ b/deepspeed/module_inject/replace_module.py @@ -345,7 +345,7 @@ def set_lm_head(module): "weight") and not module.embed_out.weight.is_meta and isinstance( module.embed_out, torch.nn.Linear): module = replace_wo_policy(module, ("embed_out", ), 0, "embed_out") - elif hasattr(module.language_model, "lm_head"): + elif hasattr(module, "language_model") and hasattr(module.language_model, "lm_head"): module = replace_wo_policy(module.language_model, ("lm_head", ), 0, "lm_head") return module From 6e6563d3c8d7527713cc48d4a3adce51f22e83a2 Mon Sep 17 00:00:00 2001 From: Lzhang-hub <57925599+Lzhang-hub@users.noreply.github.com> Date: Thu, 24 Oct 2024 04:29:30 +0800 Subject: [PATCH 569/754] fix init_device_mesh for torch 2.4 (#6614) Start torch 2.4, in [`init_device_mesh()`](https://github.com/pytorch/pytorch/blob/de4c2a3b4e89d96334dc678d1c3f2ae51a6630a0/torch/distributed/device_mesh.py#L915) ,device type with a GPU index, such as "cuda:0", is not allowed. ![image](https://github.com/user-attachments/assets/1ddb61bf-8a15-4e0a-9115-a3681d7f19ff) --------- Co-authored-by: Olatunji Ruwase Co-authored-by: Logan Adams <114770087+loadams@users.noreply.github.com> Co-authored-by: Masahiro Tanaka <81312776+tohtana@users.noreply.github.com> Co-authored-by: Masahiro Tanaka --- deepspeed/comm/torch.py | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/deepspeed/comm/torch.py b/deepspeed/comm/torch.py index ed2645d415c4..988b74232bb9 100755 --- a/deepspeed/comm/torch.py +++ b/deepspeed/comm/torch.py @@ -390,9 +390,14 @@ def init_device_mesh(self, mesh_shape, mesh_dim_names): if not required_torch_version(min_version=2.2): raise RuntimeError(f"Current torch version does not have device mesh" f"api (torch.__version__: {torch.__version__})") - return torch.distributed.device_mesh.init_device_mesh(get_accelerator().current_device_name(), - mesh_shape, - mesh_dim_names=mesh_dim_names) + if not required_torch_version(max_version=2.4): + return torch.distributed.device_mesh.init_device_mesh(get_accelerator().device_name(), + mesh_shape, + mesh_dim_names=mesh_dim_names) + else: + return torch.distributed.device_mesh.init_device_mesh(get_accelerator().current_device_name(), + mesh_shape, + mesh_dim_names=mesh_dim_names) # This will become a light-weight wrapper around torch.distributed functions From 3d5cf739ead7c78f518a518ccaa15a323bd5c8da Mon Sep 17 00:00:00 2001 From: Yichen Yan Date: Fri, 25 Oct 2024 08:17:30 +0800 Subject: [PATCH 570/754] Fix dynamo issue (#6527) Dynamo use faketensor to trace tensor ops. In some case, the mechanism break compiling with deepspeed. An example could be found at https://gist.github.com/oraluben/9b8240c2fe482eb4382453d6c97a5f76, to see issues, install deepspeed==0.14.4 instead of my fork without this PR, llama cannot be compiled. Detailed explanation: 1. `ZeROOrderedDict` dynamo use deepcopy to copy tensors, which will call `object.__reduce__`. When copying `ZeROOrderedDict`, the default implementation do not copy its `_parent_module` and will lead to failure. 2. `param` maybe faketensor and do not have `ds_status` yet, but during tracing it's ok to just skip the `register_external_parameter`, it should be done ways before. --------- Co-authored-by: Olatunji Ruwase Co-authored-by: Logan Adams <114770087+loadams@users.noreply.github.com> Co-authored-by: Masahiro Tanaka <81312776+tohtana@users.noreply.github.com> --- deepspeed/runtime/zero/parameter_offload.py | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/deepspeed/runtime/zero/parameter_offload.py b/deepspeed/runtime/zero/parameter_offload.py index 1ce2414a1e17..90afaf03550a 100644 --- a/deepspeed/runtime/zero/parameter_offload.py +++ b/deepspeed/runtime/zero/parameter_offload.py @@ -38,7 +38,7 @@ def _apply_forward_and_backward_to_tensors_only(module, forward_function, backwa class ZeROOrderedDict(OrderedDict): - def __init__(self, parent_module=None, *args, **kwargs): + def __init__(self, parent_module, *args, **kwargs): """A replacement for ``collections.OrderedDict`` to detect external ZeRO params. Args: @@ -49,6 +49,10 @@ def __init__(self, parent_module=None, *args, **kwargs): self._parent_module = parent_module self._in_forward = False + def __reduce__(self): + r0, _, *r2 = super().__reduce__() + return (r0, (self._parent_module, )) + r2 + def __getitem__(self, key): param = super().__getitem__(key) @@ -56,6 +60,7 @@ def __getitem__(self, key): if param is None: return param + # TODO: only weaken this check during compilation if hasattr(param, "ds_status") and param.ds_status == ZeroParamStatus.NOT_AVAILABLE: if self._parent_module._parameters._in_forward: register_external_parameter(FWD_MODULE_STACK[-1], param) From 5fb71c0a189408151c3a8968a7025fb61d94950b Mon Sep 17 00:00:00 2001 From: inkcherry Date: Sat, 26 Oct 2024 02:26:47 +0800 Subject: [PATCH 571/754] sequence parallel for uneven heads (#6392) In sequence_parallel (Ulysses), the sequence parallel size is constrained by the requirement to be divisible by the number of heads, which prevents some models/workloads from setting a specific sequence parallel size. This PR implements uneven all-to-all heads splitting. - both support batch first (b,s,...) and seq_len first(s,b..) layout. - Added unit tests with numerical checks. Locally also tested with **7 heads with sp=4** and **20 heads with sp=8**, and it passed. --------- Co-authored-by: Logan Adams <114770087+loadams@users.noreply.github.com> Co-authored-by: Olatunji Ruwase Co-authored-by: Ma, Guokai Co-authored-by: Masahiro Tanaka <81312776+tohtana@users.noreply.github.com> --- deepspeed/module_inject/tp_shard.py | 4 +- deepspeed/sequence/layer.py | 126 ++++++++++++++++++ deepspeed/utils/groups.py | 2 + .../unit/sequence_parallelism/test_ulysses.py | 84 +++++++++++- 4 files changed, 214 insertions(+), 2 deletions(-) diff --git a/deepspeed/module_inject/tp_shard.py b/deepspeed/module_inject/tp_shard.py index 6758c7a657f6..57be0c793856 100644 --- a/deepspeed/module_inject/tp_shard.py +++ b/deepspeed/module_inject/tp_shard.py @@ -24,7 +24,9 @@ def set_n_embd(num): def get_num_kv_heads(): global num_kv_heads - return num_kv_heads + if 'num_kv_heads' in globals(): + return num_kv_heads + return None def get_num_attention_heads(): diff --git a/deepspeed/sequence/layer.py b/deepspeed/sequence/layer.py index e809fe1118b5..8fd3ca918433 100644 --- a/deepspeed/sequence/layer.py +++ b/deepspeed/sequence/layer.py @@ -10,6 +10,8 @@ import deepspeed.comm as dist from deepspeed.accelerator import get_accelerator +from deepspeed.module_inject.tp_shard import get_shard_size_list, set_num_kv_heads, get_num_kv_heads +from deepspeed.utils import groups def post_all2all(scatter_idx, batch_dim_idx, seq_world_size, bs, seq_len, num_head, head_dim): @@ -38,8 +40,132 @@ def post_func(input): return post_func +def uneven_heads_all2all(input, scatter_idx, gather_idx, batch_dim_idx, group): + seq_world_size = dist.get_world_size(group) + inp_shape = list(input.shape) + assert batch_dim_idx in [0, 1], "batch_dim_idx must be either 0 or 1" + + if not (scatter_idx < 2): + input_splits = get_shard_size_list(inp_shape[scatter_idx], seq_world_size) + input = input.transpose(0, scatter_idx).contiguous() + local_heads = input_splits[groups._get_sequence_parallel_rank()] + output_splits = [local_heads] * seq_world_size + + output_buffer_shape = [seq_world_size * local_heads] + list(input.shape[1:]) + output = torch.empty(output_buffer_shape, device=input.device, dtype=input.dtype) + dist.all_to_all_single(output,input,output_split_sizes=output_splits,\ + input_split_sizes=input_splits,group=group) + ###[seq_ws*local_heads, ...] to [seq_ws, local_heads, ...] + output = output.view(seq_world_size, local_heads, *output.shape[1:]) + ###[seq_ws,local_heads,b,seq_len,...] to [seq_ws,seq_len,b,local_heads,...] + + ### batch_dim_idx=0 [seq_ws,local_heads,seq_len,b,...] to [b, seq_ws, seq_len, local_heads ...] + ### batch_dim_idx=1 [seq_ws,local_heads,b,seq_len,...] to [seq_ws,seq_len,b,local_heads,...] + if batch_dim_idx == 0: + order = [3, 0, 2, 1] + list(range(4, len(output.shape))) + output = output.permute(order).contiguous() + ###[b, seq_ws*local_seq_len, local_heads,...] + output = output.view(output.shape[0], inp_shape[gather_idx] * seq_world_size, + *output.shape[3:]).contiguous() + elif batch_dim_idx == 1: + output = output.transpose(1, 3).contiguous() + ###[seq_ws*local_seq_len, b, local_heads,...] + output = output.view(inp_shape[gather_idx] * seq_world_size, *output.shape[2:]).contiguous() + else: + # The compatibility handling of 4D and 3D tensors, standardizing to 3D. + input = input.reshape(input.shape[0], input.shape[1], -1) + + if batch_dim_idx == 0: #b,s,h + input = input.permute(1, 2, 0).contiguous() #s,h,b + elif batch_dim_idx == 1: #s,b,h + input = input.transpose(1, 2).contiguous() #s,h,b + seq_len, h, batch_size = input.shape + num_local_heads_list = get_shard_size_list(get_num_kv_heads(), seq_world_size) + local_heads = num_local_heads_list[groups._get_sequence_parallel_rank()] + h_dim = h // local_heads + local_seq_len = seq_len // seq_world_size + + input = input.view(seq_len * h, batch_size) + local_seq_len_with_heads = int(input.shape[0] / seq_world_size) # dim size of local_seq_len*local_heads*hdim + input_splits = [local_seq_len_with_heads] * seq_world_size + coeff = local_seq_len_with_heads // local_heads #per head: dim size of local_seq_len*hdim + + #uneven seq_world_size coeff, total_heads/local_heads. + heads_scale_coeff = get_num_kv_heads() / local_heads + + output_splits = [num_local_heads * coeff for num_local_heads in num_local_heads_list] + output_buff_d1_size = int(heads_scale_coeff * local_seq_len_with_heads) + total_h = int(inp_shape[gather_idx] * heads_scale_coeff) + output = torch.empty(output_buff_d1_size, input.shape[1], device=input.device, dtype=input.dtype) + dist.all_to_all_single(output,input,output_split_sizes=output_splits, \ + input_split_sizes=input_splits,group=group) + ################## + #suppose 7 heads divide into 4 ranks [2,2,2,1] + #chunk_num_heads_small=floor(7/4)=1 + #chunk_num_heads_large=ceil(7/4)=2 + #num_chunk_heads_large=len([2,2,2])=3, all2all_buffer_counts + #num_chunk_heads_small=len([1])=1, all2all_buffer_counts + #total_num_large_heads=sum([2,2,2])=7 + #total_num_small_heads=sum([1])=1 + + chunk_num_heads_small = get_num_kv_heads() // seq_world_size # even heads compatible + chunk_num_heads_large = chunk_num_heads_small + 1 + num_chunk_heads_large = get_num_kv_heads() % seq_world_size + num_chunk_heads_small = seq_world_size - num_chunk_heads_large + total_num_large_heads = num_chunk_heads_large * chunk_num_heads_large + total_num_small_heads = num_chunk_heads_small * chunk_num_heads_small + + heads_large_combine_size = coeff * total_num_large_heads + heads_small_combine_size = coeff * total_num_small_heads + heads_large_chunk, heads_small_chunk = output.split([heads_large_combine_size, heads_small_combine_size], + dim=0) + heads_large_chunk = heads_large_chunk.view(num_chunk_heads_large, local_seq_len, chunk_num_heads_large, h_dim, + batch_size) + heads_small_chunk = heads_small_chunk.view(num_chunk_heads_small, local_seq_len, chunk_num_heads_small, h_dim, + batch_size) + if batch_dim_idx == 0: + #[all2all_buffer_counts, local_seq_len, n_heads,dim,batch]->[batch,local_seq_len,all2all_buffer_counts*n_heads,dim] + order = [4, 1, 0, 2, 3] + heads_large_chunk = heads_large_chunk.permute(order).contiguous().view(batch_size, local_seq_len, + total_num_large_heads, h_dim) + heads_small_chunk = heads_small_chunk.permute(order).contiguous().view(batch_size, local_seq_len, + total_num_small_heads, h_dim) + elif batch_dim_idx == 1: + #[all2all_buffer_counts, local_seq_len, n_heads,dim,batch]->[local_seq_len,batch,all2all_buffer_counts*n_heads,dim] + order = [1, 4, 0, 2, 3] + heads_large_chunk = heads_large_chunk.permute(order).contiguous().view(local_seq_len, batch_size, + total_num_large_heads, h_dim) + heads_small_chunk = heads_small_chunk.permute(order).contiguous().view(local_seq_len, batch_size, + total_num_small_heads, h_dim) + + output = torch.cat([heads_large_chunk, heads_small_chunk], dim=2).contiguous() + + inp_shape[scatter_idx] = inp_shape[scatter_idx] // seq_world_size + output_shape= inp_shape[: gather_idx] + \ + [total_h,] + \ + inp_shape[gather_idx + 1:] + + output = output.view(output_shape) + + return output + + def single_all_to_all(input, scatter_idx, gather_idx, batch_dim_idx, group, async_op=False, handle=None, type=None): seq_world_size = dist.get_world_size(group) + # we only need num_heads once + num_heads = input.shape[2] + + if get_num_kv_heads() is not None or num_heads % seq_world_size != 0: + # Assuming here that the number of heads for q is consistent with kv + # If not, additional logic is required for cases like GQA + if get_num_kv_heads() is None: + assert num_heads > seq_world_size, f"Number of heads ({num_heads}) must be larger than sequence parallel size ({seq_world_size})" + # set heads at first call by num_total_heads. + # then use ``get_num_kv_heads() is not None`` to re-entry uneven path. + set_num_kv_heads(num_heads) + assert async_op == False, "uneven head sp does not support async op" + return uneven_heads_all2all(input, scatter_idx, gather_idx, batch_dim_idx, group) + if batch_dim_idx == 0: # b, s, n, h if scatter_idx < 2: diff --git a/deepspeed/utils/groups.py b/deepspeed/utils/groups.py index 9dd288ef46db..e9550a0ec25a 100755 --- a/deepspeed/utils/groups.py +++ b/deepspeed/utils/groups.py @@ -484,6 +484,8 @@ def _get_sequence_parallel_rank(): global mpu if mpu is not None and hasattr(mpu, 'get_sequence_parallel_rank'): return mpu.get_sequence_parallel_rank() + if mesh_device is not None: + return dist.get_rank(mesh_device.get_group(mesh_dim="sequence_parallel")) return 0 diff --git a/tests/unit/sequence_parallelism/test_ulysses.py b/tests/unit/sequence_parallelism/test_ulysses.py index 915c89e0b00a..d9ed54322d5c 100644 --- a/tests/unit/sequence_parallelism/test_ulysses.py +++ b/tests/unit/sequence_parallelism/test_ulysses.py @@ -11,9 +11,12 @@ from unit.common import DistributedTest from deepspeed.sequence.layer import _SeqAllToAll from unit.util import skip_on_arch +from unit.simple_model import * +from deepspeed.utils import groups +from deepspeed.module_inject.tp_shard import get_shard_size_list +#Use mesh device to create data and sequence parallel group -#Use mesh device to create data and sequence parallel group class TestUlyssesUtils(DistributedTest): world_size = 4 @@ -75,3 +78,82 @@ def test_alltoall_output_consistency(self, d0: int, d1: int, head_dim: int, num_ # Check outputs are the same as input for i in range(1, len(outputs)): assert torch.allclose(input_tensor, outputs[i]), f"Outputs differ for sequence dim {seq_dims[i]}" + + +@pytest.mark.parametrize("d0", [2, 4]) #batch or sequence dimension +@pytest.mark.parametrize("d1", [4, 8]) #batch or sequence dimension +@pytest.mark.parametrize("num_heads", [3, 7]) +@pytest.mark.parametrize("head_dim", [16]) +class TestUlyssesAll2All_odd(DistributedTest): + world_size = 4 + + def test_alltoall_output_consistency(self, d0: int, d1: int, head_dim: int, num_heads: int) -> None: + + data_parallel_size = 2 + seq_parallel_size = self.world_size // data_parallel_size + skip_on_arch(min_arch=8) + + def seq_batch_heads_hash(d0, d1, h, offset_d0=0, offset_d1=0, offset_h=0): + d0 += offset_d0 + d1 += offset_d1 + h += offset_h + return d0 * 10 + h + d1 * 0.1 + + hidden_dim = 10 + model = SimpleModel(hidden_dim) + ds_engine, _, _, _ = initialize(model=model, + config_params={"train_batch_size": 8}, + mesh_param=(data_parallel_size, seq_parallel_size)) + + scatter_idx = 2 + outputs = [] + inputs = [] + batch_dims = [0, 1] + seq_dims = [1, 0] + + for idx, seq_dim in enumerate(seq_dims): + gather_idx = seq_dim + batch_dim_idx = batch_dims[idx] + + #4D tensor : b,s,h,d or s,b,h,d + #create a hash tensor from pos_id, head_id, and batch_id + d0_indices = torch.arange(d0).reshape(-1, 1, 1, 1) + d1_indices = torch.arange(d1).reshape(1, -1, 1, 1) + h_indices = torch.arange(num_heads).reshape(1, 1, -1, 1) + input_tensor = torch.randn(d0, d1, num_heads, head_dim, device=ds_engine.device) + if batch_dim_idx == 1: #seq_len_dim : 0(d0) + input_tensor[:] = seq_batch_heads_hash(d0_indices, d1_indices, h_indices, + d0 * groups._get_sequence_parallel_rank(), 0) + elif batch_dim_idx == 0: #seq_len_dim : 1(d1) + input_tensor[:] = seq_batch_heads_hash(d0_indices, d1_indices, h_indices, 0, + d1 * groups._get_sequence_parallel_rank()) + inputs.append(input_tensor) + + ### first all2all: sequence parallel to head parallel + s2h_tensor = _SeqAllToAll.apply(ds_engine.seq_parallel_group, input_tensor, scatter_idx, gather_idx, + batch_dim_idx) + + # s2h_tensor check for the first all2all: compare with the expected ground truth + d0_indices = torch.arange(s2h_tensor.shape[0]).reshape(-1, 1, 1, 1) + d1_indices = torch.arange(s2h_tensor.shape[1]).reshape(1, -1, 1, 1) + h_indices = torch.arange(s2h_tensor.shape[2]).reshape(1, 1, -1, 1) + shard_list = get_shard_size_list(num_heads, groups._get_sequence_parallel_world_size()) + head_offset = sum(shard_list[:groups._get_sequence_parallel_rank()]) + s2h_truth = torch.zeros_like(s2h_tensor) + s2h_truth[:] = seq_batch_heads_hash(d0_indices, d1_indices, h_indices, 0, 0, head_offset) + + assert torch.allclose(s2h_truth, + s2h_tensor), f"s2h_tensor differs from the expected for sequence dim: {seq_dim}" + #No op + ### second all2all: head parallel to sequence parallel + h2s_tensor = _SeqAllToAll.apply(ds_engine.seq_parallel_group, s2h_tensor, gather_idx, scatter_idx, + batch_dim_idx) + print( + f'[{dist.get_rank()}] s={seq_dim} input: {input_tensor.shape} s2h: {s2h_tensor.shape} h2s_tensor: {h2s_tensor.shape}' + ) + outputs.append(h2s_tensor) + + # Check outputs for the second all2all + for i in range(0, len(outputs)): + assert torch.allclose(inputs[i], + outputs[i]), f"[{dist.get_rank()}]Outputs differ for sequence dim {seq_dims[i]}" From 24285d6c73d3e505262a42c91a9d1ba1d9ece154 Mon Sep 17 00:00:00 2001 From: Masahiro Tanaka <81312776+tohtana@users.noreply.github.com> Date: Fri, 25 Oct 2024 13:47:22 -0700 Subject: [PATCH 572/754] Add fallback for is_compiling (#6663) Importing `torch.compiler.is_compiling` causes an error with an older version of PyTorch. This PR adds a fallback for `is_compiling` to use an equivalent function of older PyTorch versions. This will resolve #6656. Co-authored-by: Logan Adams <114770087+loadams@users.noreply.github.com> --- deepspeed/runtime/compiler.py | 13 +++++++++++++ deepspeed/utils/logging.py | 7 +++---- 2 files changed, 16 insertions(+), 4 deletions(-) diff --git a/deepspeed/runtime/compiler.py b/deepspeed/runtime/compiler.py index 879c0a1a2cc9..fa9220f4fcd0 100644 --- a/deepspeed/runtime/compiler.py +++ b/deepspeed/runtime/compiler.py @@ -5,6 +5,15 @@ import torch +try: + from torch.compiler import is_compiling as torch_is_compiling +except ImportError: + try: + from torch._dynamo.external_utils import is_compiling as torch_is_compiling + except ImportError: + # Torch does not have compiler support + torch_is_compiling = lambda: False + def is_compile_supported(): return hasattr(torch, "compiler") and hasattr(torch.nn.Module, "compile") @@ -14,3 +23,7 @@ def disable(func): if is_compile_supported(): return torch.compiler.disable(func) return func + + +def is_compiling(): + return torch_is_compiling() diff --git a/deepspeed/utils/logging.py b/deepspeed/utils/logging.py index 55fb72f6c9fb..d5db29485db3 100644 --- a/deepspeed/utils/logging.py +++ b/deepspeed/utils/logging.py @@ -7,8 +7,7 @@ import logging import sys import os -import torch -from deepspeed.runtime.compiler import is_compile_supported +from deepspeed.runtime.compiler import is_compile_supported, is_compiling log_levels = { "debug": logging.DEBUG, @@ -26,7 +25,7 @@ def create_warning_filter(logger): def warn_once(record): nonlocal warn - if is_compile_supported() and torch.compiler.is_compiling() and not warn: + if is_compile_supported() and is_compiling() and not warn: warn = True logger.warning("To avoid graph breaks caused by logger in compile-mode, it is recommended to" " disable logging by setting env var DISABLE_LOGS_WHILE_COMPILING=1") @@ -39,7 +38,7 @@ def logging_decorator(func): @functools.wraps(func) def wrapper(*args, **kwargs): - if torch.compiler.is_compiling(): + if is_compiling(): return else: return func(*args, **kwargs) From 54903e09eb131bb7b69bfc154e3970d4958131b9 Mon Sep 17 00:00:00 2001 From: Logan Adams <114770087+loadams@users.noreply.github.com> Date: Fri, 25 Oct 2024 15:14:26 -0700 Subject: [PATCH 573/754] Update profiler registration check (#6668) Resolves #5432. --- deepspeed/profiling/flops_profiler/profiler.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/deepspeed/profiling/flops_profiler/profiler.py b/deepspeed/profiling/flops_profiler/profiler.py index 96306184e42c..f87f1beb7e4e 100644 --- a/deepspeed/profiling/flops_profiler/profiler.py +++ b/deepspeed/profiling/flops_profiler/profiler.py @@ -115,7 +115,7 @@ def start_time_hook(module, input): get_accelerator().synchronize() module.__start_time__ = time.time() - if not hasattr(module, "__start_time_hook_handle"): + if not hasattr(module, "__start_time_hook_handle__"): module.__start_time_hook_handle__ = module.register_forward_pre_hook(start_time_hook) def end_time_hook(module, input, output): From 229960a5e9995643ce0ce957a57d847effdc41dc Mon Sep 17 00:00:00 2001 From: Logan Adams <114770087+loadams@users.noreply.github.com> Date: Sun, 27 Oct 2024 20:39:51 -0700 Subject: [PATCH 574/754] Add support for H100/sm_90 arch compilation (#6669) Resolves: #6549 --- 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 1609bc9005f4..461281d4a569 100644 --- a/op_builder/builder.py +++ b/op_builder/builder.py @@ -67,7 +67,7 @@ def get_default_compute_capabilities(): # Special treatment of CUDA 11.0 because compute_86 is not supported. compute_caps += ";8.0" else: - compute_caps += ";8.0;8.6" + compute_caps += ";8.0;8.6;9.0" return compute_caps From b3e959460b9ba255660b9bde3a295c2fb70d3e05 Mon Sep 17 00:00:00 2001 From: Logan Adams <114770087+loadams@users.noreply.github.com> Date: Mon, 28 Oct 2024 09:57:53 -0700 Subject: [PATCH 575/754] Update Gaudi2 docker image (#6677) --- .github/workflows/hpu-gaudi2.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/hpu-gaudi2.yml b/.github/workflows/hpu-gaudi2.yml index 4e9ceb32b6b1..fdd270b89a21 100644 --- a/.github/workflows/hpu-gaudi2.yml +++ b/.github/workflows/hpu-gaudi2.yml @@ -39,7 +39,7 @@ jobs: # The type of runner that the job will run on runs-on: [self-hosted, intel, gaudi2] container: - image: vault.habana.ai/gaudi-docker/1.17.0/ubuntu22.04/habanalabs/pytorch-installer-2.3.1:latest + image: vault.habana.ai/gaudi-docker/1.17.1/ubuntu22.04/habanalabs/pytorch-installer-2.3.1:latest ports: - 80 options: --runtime=habana -e HABANA_VISIBLE_DEVICES=all -e OMPI_MCA_btl_vader_single_copy_mechanism=none --cap-add=sys_nice From e6357c28cd5cfaecab2e541c81e6d633b518e56e Mon Sep 17 00:00:00 2001 From: Raza Sikander Date: Tue, 29 Oct 2024 01:28:25 +0530 Subject: [PATCH 576/754] Update gaudi2 docker version to latest release (1.18) (#6648) Updated docker version to 1.18.0-latest Note: for this update the firmware on the Gaudi2 node had to be updated to use firmware version 1.18. Co-authored-by: Logan Adams <114770087+loadams@users.noreply.github.com> --- .github/workflows/hpu-gaudi2.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/hpu-gaudi2.yml b/.github/workflows/hpu-gaudi2.yml index fdd270b89a21..9f1a9d973ca2 100644 --- a/.github/workflows/hpu-gaudi2.yml +++ b/.github/workflows/hpu-gaudi2.yml @@ -39,7 +39,7 @@ jobs: # The type of runner that the job will run on runs-on: [self-hosted, intel, gaudi2] container: - image: vault.habana.ai/gaudi-docker/1.17.1/ubuntu22.04/habanalabs/pytorch-installer-2.3.1:latest + image: vault.habana.ai/gaudi-docker/1.18.0/ubuntu22.04/habanalabs/pytorch-installer-2.4.0:latest ports: - 80 options: --runtime=habana -e HABANA_VISIBLE_DEVICES=all -e OMPI_MCA_btl_vader_single_copy_mechanism=none --cap-add=sys_nice From 0e11b081be237f9b1867a3af88479a23de11345f Mon Sep 17 00:00:00 2001 From: Logan Adams <114770087+loadams@users.noreply.github.com> Date: Mon, 28 Oct 2024 16:06:02 -0700 Subject: [PATCH 577/754] Update base docker image for A6000 GPU tests (#6681) Update to a [container (24.03)](https://docs.nvidia.com/deeplearning/frameworks/pytorch-release-notes/rel-24-03.html) with python 3.10 as transformers dropped support for python 3.8 in their latest release. Note: nv-human-eval.yml was never completed and isn't used, it is just updated for any potential future support. Resolves: #6672 --- .github/workflows/nv-a6000.yml | 6 +++--- .github/workflows/nv-human-eval.yml | 4 ++-- .github/workflows/nv-sd.yml | 4 ++-- 3 files changed, 7 insertions(+), 7 deletions(-) diff --git a/.github/workflows/nv-a6000.yml b/.github/workflows/nv-a6000.yml index 484948b28e34..f094c880c8b6 100644 --- a/.github/workflows/nv-a6000.yml +++ b/.github/workflows/nv-a6000.yml @@ -23,7 +23,7 @@ jobs: unit-tests: runs-on: [self-hosted, nvidia, a6000] container: - image: nvcr.io/nvidia/pytorch:23.03-py3 + image: nvcr.io/nvidia/pytorch:24.03-py3 ports: - 80 options: --gpus all --shm-size "8G" @@ -58,8 +58,8 @@ jobs: run: | unset TORCH_CUDA_ARCH_LIST # only jit compile for current arch cd tests - python -m pytest --color=yes --durations=0 --verbose -rF -m 'inference_v2' unit/ --torch_ver="2.0" --cuda_ver="12" - python -m pytest --color=yes --durations=0 --verbose -rF -m 'inference_v2_ops' unit/ --torch_ver="2.0" --cuda_ver="12" + python -m pytest --color=yes --durations=0 --verbose -rF -m 'inference_v2' unit/ --torch_ver="2.3" --cuda_ver="12" + python -m pytest --color=yes --durations=0 --verbose -rF -m 'inference_v2_ops' unit/ --torch_ver="2.3" --cuda_ver="12" - name: MII unit tests run: | BRANCH="main" diff --git a/.github/workflows/nv-human-eval.yml b/.github/workflows/nv-human-eval.yml index 3de878547d6e..2ecdf218b96a 100644 --- a/.github/workflows/nv-human-eval.yml +++ b/.github/workflows/nv-human-eval.yml @@ -11,7 +11,7 @@ jobs: unit-tests: runs-on: [self-hosted, nvidia, a6000] container: - image: nvcr.io/nvidia/pytorch:23.03-py3 + image: nvcr.io/nvidia/pytorch:24.03-py3 ports: - 80 options: --gpus all --shm-size "8G" @@ -50,4 +50,4 @@ jobs: run: | unset TORCH_CUDA_ARCH_LIST # only jit compile for current arch cd tests - python -m pytest --color=yes --durations=0 --verbose -rF -m 'evaluation' -k "test_human_eval" unit/ --torch_ver="2.0" --cuda_ver="12" + python -m pytest --color=yes --durations=0 --verbose -rF -m 'evaluation' -k "test_human_eval" unit/ --torch_ver="2.3" --cuda_ver="12" diff --git a/.github/workflows/nv-sd.yml b/.github/workflows/nv-sd.yml index 0344c80451a6..5699b6055782 100644 --- a/.github/workflows/nv-sd.yml +++ b/.github/workflows/nv-sd.yml @@ -27,7 +27,7 @@ jobs: sd-tests: runs-on: [self-hosted, nvidia, a6000] container: - image: nvcr.io/nvidia/pytorch:23.03-py3 + image: nvcr.io/nvidia/pytorch:24.03-py3 ports: - 80 options: --gpus all --shm-size "8G" @@ -64,7 +64,7 @@ jobs: run: | unset TORCH_CUDA_ARCH_LIST # only jit compile for current arch cd tests - python -m pytest --color=yes --durations=0 --verbose -rF -m 'stable_diffusion' -k "TestStableDiffusion" unit/ --torch_ver="2.0" --cuda_ver="12" + python -m pytest --color=yes --durations=0 --verbose -rF -m 'stable_diffusion' -k "TestStableDiffusion" unit/ --torch_ver="2.3" --cuda_ver="12" - name: Open GitHub issue if weekly CI fails if: ${{ failure() && (github.event_name == 'schedule') }} From 07cac9e0217f14fde1a12a3c89ebe367fcee311a Mon Sep 17 00:00:00 2001 From: Logan Adams <114770087+loadams@users.noreply.github.com> Date: Mon, 28 Oct 2024 21:12:29 -0700 Subject: [PATCH 578/754] Remove packages that no longer need to be updated in the latest container (#6682) --- .github/workflows/nv-a6000.yml | 2 -- .github/workflows/nv-sd.yml | 2 -- 2 files changed, 4 deletions(-) diff --git a/.github/workflows/nv-a6000.yml b/.github/workflows/nv-a6000.yml index f094c880c8b6..639f27498dd9 100644 --- a/.github/workflows/nv-a6000.yml +++ b/.github/workflows/nv-a6000.yml @@ -47,8 +47,6 @@ jobs: - name: Install deepspeed run: | python -m pip install docutils==0.18.1 jinja2==3.0 urllib3==1.26.11 ninja - # Update packages included in the container that do not support pydantic 2+ to versions that do - python -m pip install thinc spacy confection --upgrade python -m pip install .[dev,1bit,autotuning,inf] ds_report - name: Python environment diff --git a/.github/workflows/nv-sd.yml b/.github/workflows/nv-sd.yml index 5699b6055782..af406075b868 100644 --- a/.github/workflows/nv-sd.yml +++ b/.github/workflows/nv-sd.yml @@ -53,8 +53,6 @@ jobs: pip install image-similarity-measures python -m pip install opencv-python==4.6.* --force-reinstall python -m pip install docutils==0.18.1 jinja2==3.0 urllib3==1.26.11 ninja - # Update packages included in the container that do not support pydantic 2+ to versions that do - python -m pip install thinc spacy confection --upgrade python -m pip install .[dev,1bit,autotuning,sd] ds_report - name: Python environment From e4a247ed133c230db58a625d8008cb60c7ae0f41 Mon Sep 17 00:00:00 2001 From: xuanhua Date: Wed, 30 Oct 2024 00:04:35 +0800 Subject: [PATCH 579/754] Fix training of pipeline based peft's lora model (#5477) Hi, guys I find there is an assert failure when I train huggingface's lora based model in pipeline style. Here is the whole steps that I created my model: 1) Load the pre-trained chatglm-6b model from huggingface, as Model_A 2) Use huggingface's peft's `get_peft_model(...)` and my `LoraConfig(...)` from Model_A to create the lora model, as Model_B 3) Create my own pipeline based model Model_C from Model_B And I run Model_C under 2 3090ti GPUs. And the assertion failure looks like this: ```text Traceback (most recent call last): File "/home/ubuntu/proj/chatglm-finetuning/train_pipeline.py", line 372, in main() File "/home/ubuntu/proj/chatglm-finetuning/train_pipeline.py", line 351, in main loss = engine.train_batch(data_iter=train_dataloader) File "/home/ubuntu/anaconda3/lib/python3.9/site-packages/deepspeed/runtime/pipe/engine.py", line 375, in train_batch self._exec_schedule(sched) File "/home/ubuntu/anaconda3/lib/python3.9/site-packages/deepspeed/runtime/pipe/engine.py", line 1375, in _exec_schedule self._exec_instr(**cmd.kwargs) File "/home/ubuntu/anaconda3/lib/python3.9/site-packages/deepspeed/runtime/pipe/engine.py", line 276, in _exec_reduce_tied_grads dist.all_reduce(grad, group=group) File "/home/ubuntu/anaconda3/lib/python3.9/site-packages/deepspeed/comm/comm.py", line 117, in log_wrapper return func(*args, **kwargs) File "/home/ubuntu/anaconda3/lib/python3.9/site-packages/deepspeed/comm/comm.py", line 496, in all_reduce return cdb.all_reduce(tensor, op, group, async_op) File "/home/ubuntu/anaconda3/lib/python3.9/site-packages/deepspeed/comm/torch.py", line 159, in all_reduce return torch.distributed.all_reduce(tensor=tensor, op=op, group=group, async_op=async_op) File "/home/ubuntu/anaconda3/lib/python3.9/site-packages/torch/distributed/distributed_c10d.py", line 1520, in all_reduce _check_single_tensor(tensor, "tensor") File "/home/ubuntu/anaconda3/lib/python3.9/site-packages/torch/distributed/distributed_c10d.py", line 463, in _check_single_tensor raise RuntimeError( RuntimeError: Invalid function argument. Expected parameter `tensor` to be of type torch.Tensor. ``` After some debugging, I find out the root cause is that my configuration of lora (in below) only add extra lora layer(part) in qkv related layers but not the embedding layer. So the whole embedding layer's parameters are freezed. ```python lora_config = LoraConfig(r=8, # copied from finetuning_lora.py lora_alpha=32, target_modules=["query_key_value"], lora_dropout=0.1, bias="none", task_type="CAUSAL_LM", inference_mode=False, ) ``` And in my implementation of pipeline based model, I declared the embeding layer as a tied-layer. So the whole thing is that there are no gradients at all for embedding layer, but embedding layer as the tied layer needs to be synced between two gpus. The value of gradient is None but is still passed to `all_reduce` operation. Current, my fix is simple and add a check if this `grad` is None. --------- Co-authored-by: Logan Adams <114770087+loadams@users.noreply.github.com> Co-authored-by: Heyang Qin Co-authored-by: Masahiro Tanaka <81312776+tohtana@users.noreply.github.com> --- deepspeed/runtime/pipe/engine.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/deepspeed/runtime/pipe/engine.py b/deepspeed/runtime/pipe/engine.py index 7ebf5487cf9e..b75270cbd306 100644 --- a/deepspeed/runtime/pipe/engine.py +++ b/deepspeed/runtime/pipe/engine.py @@ -287,7 +287,8 @@ def _exec_reduce_tied_grads(self): weight_group_list = self.module.get_tied_weights_and_groups() for weight, group in weight_group_list: grad = weight._hp_grad if self.using_bf16_optimizer else weight.grad - dist.all_reduce(grad, group=group) + if grad is not None: + dist.all_reduce(grad, group=group) def _exec_reduce_grads(self): self._force_grad_boundary = True From 9b547313c6c213bf6bff5227d0c9689ba1bd618a Mon Sep 17 00:00:00 2001 From: Logan Adams <114770087+loadams@users.noreply.github.com> Date: Wed, 30 Oct 2024 10:36:53 -0700 Subject: [PATCH 580/754] Update checkout action to latest version (#5021) Latest checkout uses latest (non-deprecated) version of node (16 -> 20). More information [here](https://github.blog/changelog/2023-09-22-github-actions-transitioning-from-node-16-to-node-20/): ``` Node.js 16 actions are deprecated. Please update the following actions to use Node.js 20: actions/checkout@v3. For more information see: https://github.blog/changelog/2023-09-22-github-actions-transitioning-from-node-16-to-node-20/. ``` Checkout action: https://github.com/actions/checkout Node 20 requires a minimum of Ubuntu 20.04, so workflows currently using 18.04 are failing/will fail. --- .github/workflows/cpu-inference.yml | 2 +- .github/workflows/nv-lightning-v100.yml | 2 +- .github/workflows/nv-torch110-p40.yml | 2 +- .github/workflows/nv-torch110-v100.yml | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/.github/workflows/cpu-inference.yml b/.github/workflows/cpu-inference.yml index fc0dac5de9a2..007313964f4a 100644 --- a/.github/workflows/cpu-inference.yml +++ b/.github/workflows/cpu-inference.yml @@ -27,7 +27,7 @@ jobs: env: {ACTIONS_ALLOW_USE_UNSECURE_NODE_VERSION: true} # Allow using Node16 actions steps: - - uses: actions/checkout@v3 + - uses: actions/checkout@v4 - id: setup-venv uses: ./.github/workflows/setup-venv diff --git a/.github/workflows/nv-lightning-v100.yml b/.github/workflows/nv-lightning-v100.yml index 044c282ba119..f92aa7edfdd5 100644 --- a/.github/workflows/nv-lightning-v100.yml +++ b/.github/workflows/nv-lightning-v100.yml @@ -22,7 +22,7 @@ jobs: runs-on: [self-hosted, nvidia, cu121, v100] steps: - - uses: actions/checkout@v3 + - uses: actions/checkout@v4 - id: setup-venv uses: ./.github/workflows/setup-venv diff --git a/.github/workflows/nv-torch110-p40.yml b/.github/workflows/nv-torch110-p40.yml index ed639aeb3b62..31d7805db7bb 100644 --- a/.github/workflows/nv-torch110-p40.yml +++ b/.github/workflows/nv-torch110-p40.yml @@ -20,7 +20,7 @@ jobs: env: {ACTIONS_ALLOW_USE_UNSECURE_NODE_VERSION: true} # Allow using Node16 actions steps: - - uses: actions/checkout@v3 + - uses: actions/checkout@v4 - id: setup-venv uses: ./.github/workflows/setup-venv diff --git a/.github/workflows/nv-torch110-v100.yml b/.github/workflows/nv-torch110-v100.yml index 4b9f278448ab..bb1bc987379c 100644 --- a/.github/workflows/nv-torch110-v100.yml +++ b/.github/workflows/nv-torch110-v100.yml @@ -20,7 +20,7 @@ jobs: env: {ACTIONS_ALLOW_USE_UNSECURE_NODE_VERSION: true} # Allow using Node16 actions steps: - - uses: actions/checkout@v3 + - uses: actions/checkout@v4 - id: setup-venv uses: ./.github/workflows/setup-venv From c7f58c899f6f099a35d968bdad973f24b842c8c6 Mon Sep 17 00:00:00 2001 From: Yejing-Lai Date: Thu, 31 Oct 2024 08:48:52 +0800 Subject: [PATCH 581/754] Add attribute check to support git-base autotp (#6688) Git-base model is an image-text model. After supporting the llama3.2 vision model, we set num_kv_heads dynamically. Git-base only includes vision_config, so we need to add an attribute check for vision_config/text_config when setting num_kv_heads. Co-authored-by: Logan Adams <114770087+loadams@users.noreply.github.com> --- deepspeed/module_inject/replace_module.py | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/deepspeed/module_inject/replace_module.py b/deepspeed/module_inject/replace_module.py index dece5a2c4ecf..8b1455f20c69 100644 --- a/deepspeed/module_inject/replace_module.py +++ b/deepspeed/module_inject/replace_module.py @@ -277,8 +277,10 @@ def replace_wo_policy(module, all_reduce_linears, prefix="", state_dict=None): if hasattr(model_config, "vision_config"): if "MllamaVisionEncoderLayer" in str(module): num_kv_heads = _autotp.get_model_num_kv_heads(model_config.vision_config) - else: + elif hasattr(model_config, "text_config"): num_kv_heads = _autotp.get_model_num_kv_heads(model_config.text_config) + else: + num_kv_heads = _autotp.get_model_num_kv_heads(model_config) else: num_kv_heads = _autotp.get_model_num_kv_heads(model_config) From ff1c54351f087da06f76243ae562504bb166d979 Mon Sep 17 00:00:00 2001 From: Xinyu Lian Date: Thu, 31 Oct 2024 12:56:09 -0500 Subject: [PATCH 582/754] fix memcpy issue on backward for zero-infinity (#6670) This PR is similar to [PR#5301](https://github.com/microsoft/DeepSpeed/pull/5301), that optimizes the D2H time use pinned memory. Previously, the D2H memcpy will be the bottleneck during the final backward pass of each iteration for ZeRO-Infinity(offload), as shown in Trace-1. The new version can eliminate the bottleneck, as shown in Trace-2. _Trace-1_ image _Trace-2_ image cc @tjruwase --------- Co-authored-by: Logan Adams <114770087+loadams@users.noreply.github.com> Co-authored-by: Olatunji Ruwase --- deepspeed/runtime/zero/stage3.py | 13 +++++++++++-- 1 file changed, 11 insertions(+), 2 deletions(-) diff --git a/deepspeed/runtime/zero/stage3.py b/deepspeed/runtime/zero/stage3.py index e2c273fd913f..65460eb72a2f 100644 --- a/deepspeed/runtime/zero/stage3.py +++ b/deepspeed/runtime/zero/stage3.py @@ -538,10 +538,15 @@ def _setup_for_real_optimizer(self): self.grad_partitions_flat_buffer = get_accelerator().pin_memory(self.grad_partitions_flat_buffer) offset = 0 + max_partition_numel = 0 for param in all_params: self.__param_id_to_grad_partition[param.ds_id] = self.grad_partitions_flat_buffer.narrow( 0, offset, param.partition_numel()) offset += param.partition_numel() + max_partition_numel = max(max_partition_numel, param.partition_numel()) + if self.offload_optimizer: + self.pinned_grad_buffer: Tensor = get_accelerator().pin_memory( + torch.empty(max_partition_numel, device=self.device)) def _link_all_hp_params(self): for p in self.module.parameters(): @@ -1498,9 +1503,13 @@ def partition_grads(self, params_to_release: List[Parameter], grad_partitions: L offload_fp32_gradients[i].append(grad_buffer.float()) offload_fp32_offsets[i].append(dest_offset) else: + buffer_numel = grad_buffer.numel() fp32_grad_tensor = self.fp32_partitioned_groups_flat[i].grad.narrow( - 0, dest_offset, grad_buffer.numel()) - fp32_grad_tensor.copy_(grad_buffer) + 0, dest_offset, buffer_numel) + self.pinned_grad_buffer[:buffer_numel].copy_( + grad_buffer.to(dtype=torch.float32, non_blocking=True)) + get_accelerator().synchronize() + fp32_grad_tensor.copy_(self.pinned_grad_buffer[:buffer_numel], non_blocking=True) # free the gradient if not get_accelerator().is_synchronized_device(): From 95ea95fcd642488519bb599e4618507f10f88494 Mon Sep 17 00:00:00 2001 From: Masahiro Tanaka <81312776+tohtana@users.noreply.github.com> Date: Thu, 31 Oct 2024 11:51:11 -0700 Subject: [PATCH 583/754] Free memory in universal checkpointing tests (#6693) Tests in universal checkpointing were not freeing the engine after use when `reuse_dist_env` was set to `True`, leading to memory leaks. This PR ensure freeing the engine in the tests and enables `reuse_dist_env`. Co-authored-by: Logan Adams <114770087+loadams@users.noreply.github.com> --- tests/unit/checkpoint/test_universal_checkpoint.py | 5 +++-- tests/unit/common.py | 9 --------- 2 files changed, 3 insertions(+), 11 deletions(-) diff --git a/tests/unit/checkpoint/test_universal_checkpoint.py b/tests/unit/checkpoint/test_universal_checkpoint.py index f2692ecba3a6..27ddf0cdef39 100644 --- a/tests/unit/checkpoint/test_universal_checkpoint.py +++ b/tests/unit/checkpoint/test_universal_checkpoint.py @@ -131,8 +131,7 @@ def train_save_convert(ds_config, hidden_dim, load_optim, use_torch_adam, dtype, torch.save((model_state, optimizer_state), os.path.join(tmpdir, "baseline_state.pt")) dist.barrier() - - return model, sd + model.destroy() @pytest.fixture @@ -213,6 +212,8 @@ def _run_test(self, tmpdir, dtype, ds_config, load_optim, use_torch_adam): univ_model.backward(loss) univ_model.step() + univ_model.destroy() + @pytest.mark.world_size(2) def test_dp_world_size_2to2(self, baseline_ws2, tmpdir, dtype, ds_config, load_optim, use_torch_adam): self._run_test(tmpdir, dtype, ds_config, load_optim, use_torch_adam) diff --git a/tests/unit/common.py b/tests/unit/common.py index 685f943df2fe..f46ac666f27b 100644 --- a/tests/unit/common.py +++ b/tests/unit/common.py @@ -25,8 +25,6 @@ # Worker timeout for tests that hang DEEPSPEED_TEST_TIMEOUT = int(os.environ.get('DS_UNITTEST_TIMEOUT', '600')) -warn_reuse_dist_env = False - def is_rocm_pytorch(): return hasattr(torch.version, 'hip') and torch.version.hip is not None @@ -178,13 +176,6 @@ def _launch_daemonic_procs(self, num_procs, init_method): print("Ignoring reuse_dist_env for hpu") self.reuse_dist_env = False - global warn_reuse_dist_env - if self.reuse_dist_env and not warn_reuse_dist_env: - # Currently we see memory leak for tests that reuse distributed environment - print("Ignoring reuse_dist_env and forcibly setting it to False") - warn_reuse_dist_env = True - self.reuse_dist_env = False - if self.reuse_dist_env: if num_procs not in self._pool_cache: self._pool_cache[num_procs] = mp.Pool(processes=num_procs) From b24dfa9d0822d36b35d9fa214ce432cef5daf1b6 Mon Sep 17 00:00:00 2001 From: Masahiro Tanaka <81312776+tohtana@users.noreply.github.com> Date: Fri, 1 Nov 2024 05:57:47 -0700 Subject: [PATCH 584/754] Explictly set device when reusing dist env (#6696) A rank of a process can change when reusing the environment. This PR explicitly sets the device when reusing the environment. --- tests/unit/common.py | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/tests/unit/common.py b/tests/unit/common.py index f46ac666f27b..1498b0400ee1 100644 --- a/tests/unit/common.py +++ b/tests/unit/common.py @@ -277,7 +277,11 @@ def _launch_procs(self, num_procs, init_method): self._launch_daemonic_procs(num_procs, init_method) def _dist_run(self, local_rank, num_procs, master_port, init_method, skip_msg=""): - if not dist.is_initialized(): + if dist.is_initialized(): + if get_accelerator().is_available(): + # local_rank might not match the rank in the previous run if you are reusing the environment + get_accelerator().set_device(dist.get_rank()) + else: """ Initialize deepspeed.comm and execute the user function. """ if self.set_dist_env: os.environ['MASTER_ADDR'] = '127.0.0.1' From 9068acb6fbbdbaae5429bb89e507977128496bc5 Mon Sep 17 00:00:00 2001 From: jiahao su Date: Tue, 5 Nov 2024 01:49:21 +0800 Subject: [PATCH 585/754] Update URL in README Pipeline Status for Huawei Ascend NPU (#6706) --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index b302e32dfd9c..31051297d10c 100755 --- a/README.md +++ b/README.md @@ -142,7 +142,7 @@ DeepSpeed has been integrated with several different popular open-source DL fram | PyTorch Nightly | [![nv-torch-nightly-v100](https://github.com/microsoft/DeepSpeed/actions/workflows/nv-torch-nightly-v100.yml/badge.svg?branch=master)](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?branch=master)](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?branch=master)](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?branch=master)](https://github.com/microsoft/DeepSpeed/actions/workflows/nv-accelerate-v100.yml) [![nv-mii](https://github.com/microsoft/DeepSpeed/actions/workflows/nv-mii.yml/badge.svg?branch=master)](https://github.com/microsoft/DeepSpeed/actions/workflows/nv-mii.yml) [![nv-ds-chat](https://github.com/microsoft/DeepSpeed/actions/workflows/nv-ds-chat.yml/badge.svg?branch=master)](https://github.com/microsoft/DeepSpeed/actions/workflows/nv-ds-chat.yml) [![nv-sd](https://github.com/microsoft/DeepSpeed/actions/workflows/nv-sd.yml/badge.svg)](https://github.com/microsoft/DeepSpeed/actions/workflows/nv-sd.yml) | | Misc | [![Formatting](https://github.com/microsoft/DeepSpeed/actions/workflows/formatting.yml/badge.svg?branch=master)](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)[![python](https://github.com/microsoft/DeepSpeed/actions/workflows/python.yml/badge.svg?branch=master)](https://github.com/microsoft/DeepSpeed/actions/workflows/python.yml) | -| Huawei Ascend NPU | [![Huawei Ascend NPU](https://github.com/cosdt/DeepSpeed/actions/workflows/huawei-ascend-npu.yml/badge.svg?branch=master)](https://github.com/cosdt/DeepSpeed/actions/workflows/huawei-ascend-npu.yml) | +| Huawei Ascend NPU | [![Huawei Ascend NPU](https://github.com/Ascend/Ascend-CI/actions/workflows/deepspeed.yaml/badge.svg?branch=main)](https://github.com/Ascend/Ascend-CI/actions/workflows/deepspeed.yaml) | # Installation From 6c08b7f932bc1c7acaec142c720f6f9a82e9e5c8 Mon Sep 17 00:00:00 2001 From: Logan Adams <114770087+loadams@users.noreply.github.com> Date: Mon, 4 Nov 2024 12:51:01 -0800 Subject: [PATCH 586/754] Pin transformers to 4.45.2 in nv-ds-chat workflow (#6710) This commit causes breaking changes we need to fix, for now we will pin the version but we will fix shortly https://github.com/huggingface/transformers/pull/33325 --- .github/workflows/nv-ds-chat.yml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/.github/workflows/nv-ds-chat.yml b/.github/workflows/nv-ds-chat.yml index 2ad336cac4ed..329a1060f5eb 100644 --- a/.github/workflows/nv-ds-chat.yml +++ b/.github/workflows/nv-ds-chat.yml @@ -12,6 +12,7 @@ on: type: string pull_request: paths: + - ".github/workflows/nv-ds-chat.yml" - "deepspeed/runtime/zero/stage_1_and_2.py" - "deepspeed/runtime/zero/stage3.py" - "deepspeed/runtime/hybrid_engine.py" @@ -42,6 +43,7 @@ jobs: - name: Install deepspeed run: | + pip install transformers==4.45.2 pip install .[dev] ds_report From 2b41d6212c160a3645691b77b210ba7dd957c23f Mon Sep 17 00:00:00 2001 From: Jagadish Krishnamoorthy Date: Mon, 4 Nov 2024 13:51:27 -0800 Subject: [PATCH 587/754] [Bug Fix] Support threads_per_head < 64 for wavefront size of 64 (#6622) When launching apply_rotary_pos_half kernel, only threads_per_head of 64 is supported for wavefront size of 64. This change adds support for threads_per_head < 64 such as 4, 8, 16. Fixes the issue introduced in https://github.com/microsoft/DeepSpeed/pull/5402 --------- Signed-off-by: Jagadish Krishnamoorthy Co-authored-by: Logan Adams <114770087+loadams@users.noreply.github.com> Co-authored-by: Logan Adams --- .../inference/csrc/apply_rotary_pos_emb.cu | 10 ++++- .../ops/transformer/inference/test_rope.py | 38 +++++++++++++++++++ 2 files changed, 47 insertions(+), 1 deletion(-) create mode 100644 tests/unit/ops/transformer/inference/test_rope.py diff --git a/csrc/transformer/inference/csrc/apply_rotary_pos_emb.cu b/csrc/transformer/inference/csrc/apply_rotary_pos_emb.cu index 25a494111c54..bbb8a7f00b1f 100644 --- a/csrc/transformer/inference/csrc/apply_rotary_pos_emb.cu +++ b/csrc/transformer/inference/csrc/apply_rotary_pos_emb.cu @@ -101,7 +101,15 @@ __global__ void apply_rotary_pos_half(T* mixed_query, #if defined(__HIP_PLATFORM_AMD__) and ROCM_WAVEFRONT_SIZE == 64 #define LAUNCH_FOR_ALIGNMENT(ALIGNMENT) \ - if (threads_per_head == 64) { \ + if (threads_per_head == 4) { \ + LAUNCH_ROT_POS_EMB_HALF(4, ALIGNMENT); \ + } else if (threads_per_head == 8) { \ + LAUNCH_ROT_POS_EMB_HALF(8, ALIGNMENT); \ + } else if (threads_per_head == 16) { \ + LAUNCH_ROT_POS_EMB_HALF(16, ALIGNMENT); \ + } else if (threads_per_head == 32) { \ + LAUNCH_ROT_POS_EMB_HALF(32, ALIGNMENT); \ + } else if (threads_per_head == 64) { \ LAUNCH_ROT_POS_EMB_HALF(64, ALIGNMENT); \ } else { \ assert(false); \ diff --git a/tests/unit/ops/transformer/inference/test_rope.py b/tests/unit/ops/transformer/inference/test_rope.py new file mode 100644 index 000000000000..1f0ca0578e04 --- /dev/null +++ b/tests/unit/ops/transformer/inference/test_rope.py @@ -0,0 +1,38 @@ +# Copyright (c) Microsoft Corporation. +# SPDX-License-Identifier: Apache-2.0 + +# DeepSpeed Team + +import pytest +import torch +import deepspeed +from deepspeed.ops.op_builder import InferenceBuilder +from deepspeed.accelerator import get_accelerator + +if not deepspeed.ops.__compatible_ops__[InferenceBuilder.NAME]: + pytest.skip("Inference ops are not available on this system", allow_module_level=True) + + +@pytest.mark.inference_ops +@pytest.mark.parametrize("num_heads", [64, 32, 16, 8]) +def test_rope_warp_size_alignment(num_heads): + if get_accelerator().device_name() != "cuda": + pytest.skip("This test runs only on GPU") + + batch = 1 + head = 8 + seq_len = 1024 + head_dim = 32 + rotary_dim = 32 + offset = 8 + rotate_half = False + rope_theta = 2 + + cuda0 = torch.device('cuda:0') + query = torch.randn(batch, head, seq_len, head_dim, device=cuda0) + key = torch.randn(batch, head, seq_len, head_dim, device=cuda0) + + inference = InferenceBuilder().load() + # For num_heads values of 64, 32, 16, 8 + # corresponding threads_per_head (defined in apply_rotary_pos_emb.cu) values are 4, 8, 16, 32 + inference.apply_rotary_pos_emb(query, key, rotary_dim, offset, num_heads, rotate_half, rope_theta) From 351569dd4a00dea0e00040a816cbc44b1e38a214 Mon Sep 17 00:00:00 2001 From: Masahiro Tanaka <81312776+tohtana@users.noreply.github.com> Date: Tue, 5 Nov 2024 14:53:01 -0800 Subject: [PATCH 588/754] Use one param coordinator for both train/inference scenarios (#6662) The parameter coordinator in ZeRO3 throws a "backward pass is invalid for module in evaluation mode" error when the training mode is unexpected, as it expects all modules to be in training mode during the backward pass. This is an unnecessarily strict restriction. This PR relaxes the restriction by using a single parameter coordinator (instead of separate ones for training and evaluation modes) and resetting the prefetch state before starting a forward pass. Use of `is_compiling` needs to be fixed after #6663 is merged. --------- Co-authored-by: Olatunji Ruwase Co-authored-by: Logan Adams <114770087+loadams@users.noreply.github.com> --- deepspeed/runtime/zero/parameter_offload.py | 57 +++++++++---------- .../zero/partitioned_param_coordinator.py | 12 +++- deepspeed/runtime/zero/stage3.py | 8 +-- tests/unit/runtime/zero/test_zero.py | 45 +++++++++++++++ 4 files changed, 85 insertions(+), 37 deletions(-) diff --git a/deepspeed/runtime/zero/parameter_offload.py b/deepspeed/runtime/zero/parameter_offload.py index 90afaf03550a..4b0ddb7679a9 100644 --- a/deepspeed/runtime/zero/parameter_offload.py +++ b/deepspeed/runtime/zero/parameter_offload.py @@ -133,7 +133,6 @@ def __init__( 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) self._max_reuse_distance_in_numel = int(max_reuse_distance) self._max_available_parameters_in_numel = int(max_live_parameters) @@ -141,12 +140,21 @@ def __init__( ) if overlap_comm else get_accelerator().default_stream() if not hasattr(module, "ds_inflight_param_registry"): - module.ds_inflight_param_registry = dict() - # we need two registries, one for training and one for eval. They will be used when creating PartitionedParameterCoordinator - module.ds_inflight_param_registry[True] = InflightParamRegistry() - module.ds_inflight_param_registry[False] = InflightParamRegistry() + module.ds_inflight_param_registry = InflightParamRegistry() self.__inflight_param_registry = module.ds_inflight_param_registry + self.param_coordinator = PartitionedParameterCoordinator( + prefetch_bucket_sz=self._prefetch_bucket_sz, + max_reuse_distance_in_numel=self._max_reuse_distance_in_numel, + max_available_parameters_in_numel=self._max_available_parameters_in_numel, + allgather_stream=self.__allgather_stream, + inflight_param_registry=self.__inflight_param_registry, + prefetch_nvme=self.offload_device == OffloadDeviceEnum.nvme, + timers=self.timers, + zero_quantized_weights=self.zero_quantized_weights, + zero_quantized_nontrainable_weights=self.zero_quantized_nontrainable_weights, + ) + self.forward_hooks = [] self.backward_hooks = [] self.setup_zero_stage3_hooks() @@ -161,26 +169,13 @@ def partition_all_parameters(self): """Partitioning Parameters that were not partitioned usually if parameters of modules whose input parameters do not require grad computation do not trigger post call and will therefore will remain unpartitioned""" - self.get_param_coordinator(training=self.module.training).release_and_reset_all(self.module) + self.get_param_coordinator().release_and_reset_all(self.module) for param in iter_params(self.module, recurse=True): if param.ds_status != ZeroParamStatus.NOT_AVAILABLE: raise RuntimeError(f"{param.ds_summary()} expected to be released") - def get_param_coordinator(self, training): - if not training in self.param_coordinators: - self.param_coordinators[training] = PartitionedParameterCoordinator( - prefetch_bucket_sz=self._prefetch_bucket_sz, - max_reuse_distance_in_numel=self._max_reuse_distance_in_numel, - max_available_parameters_in_numel=self._max_available_parameters_in_numel, - allgather_stream=self.__allgather_stream, - inflight_param_registry=self.__inflight_param_registry[training], - prefetch_nvme=self.offload_device == OffloadDeviceEnum.nvme, - timers=self.timers, - zero_quantized_weights=self.zero_quantized_weights, - zero_quantized_nontrainable_weights=self.zero_quantized_nontrainable_weights, - ) - - return self.param_coordinators[training] + def get_param_coordinator(self): + return self.param_coordinator def empty_partition_cache(self): self.partition_all_parameters() @@ -228,14 +223,14 @@ def setup_zero_stage3_hooks(self): #reset step if in inference mode @instrument_w_nvtx - def _end_of_forward_hook(module, *args): + def _start_of_forward_hook(module, *args): + + self.get_param_coordinator().reset_step() - if not torch._C.is_grad_enabled(): - self.get_param_coordinator(training=False).reset_step() + self.module.register_forward_pre_hook(_start_of_forward_hook) #likely one of them should be enough but just to be safe self._register_hooks_recursively(self.module) - self.module.register_forward_hook(_end_of_forward_hook) # Add top module to stack trace global FWD_MODULE_STACK @@ -447,7 +442,7 @@ def pre_sub_module_forward_function(self, sub_module): global FWD_MODULE_STACK FWD_MODULE_STACK.append(sub_module) - param_coordinator = self.get_param_coordinator(training=sub_module.training) + param_coordinator = self.get_param_coordinator() param_coordinator.trace_prologue(sub_module) if param_coordinator.is_record_trace(): param_coordinator.record_module(sub_module) @@ -460,7 +455,7 @@ def post_sub_module_forward_function(self, sub_module): see_memory_usage(f"After sub module function {sub_module.__class__.__name__} {sub_module.id} before release", force=False) - param_coordinator = self.get_param_coordinator(training=sub_module.training) + param_coordinator = self.get_param_coordinator() param_coordinator.release_sub_module(sub_module) see_memory_usage(f"After sub module function {sub_module.__class__.__name__} {sub_module.id} after release", @@ -468,8 +463,8 @@ def post_sub_module_forward_function(self, sub_module): @torch.no_grad() def pre_sub_module_backward_function(self, sub_module): - assert sub_module.training, "backward pass is invalid for module in evaluation mode" - param_coordinator = self.get_param_coordinator(training=True) + # assert sub_module.training, "backward pass is invalid for module in evaluation mode" + param_coordinator = self.get_param_coordinator() param_coordinator.trace_prologue(sub_module) if param_coordinator.is_record_trace(): param_coordinator.record_module(sub_module) @@ -477,12 +472,12 @@ def pre_sub_module_backward_function(self, sub_module): @torch.no_grad() def post_sub_module_backward_function(self, sub_module): - assert sub_module.training, "backward pass is invalid for module in evaluation mode" + # assert sub_module.training, "backward pass is invalid for module in evaluation mode" see_memory_usage( f"After sub module backward function {sub_module.__class__.__name__} {sub_module.id} before release", force=False) - self.get_param_coordinator(training=True).release_sub_module(sub_module) + self.get_param_coordinator().release_sub_module(sub_module) see_memory_usage( f"After sub module backward function {sub_module.__class__.__name__} {sub_module.id} after release", diff --git a/deepspeed/runtime/zero/partitioned_param_coordinator.py b/deepspeed/runtime/zero/partitioned_param_coordinator.py index 5780b2afd6de..49f477cc4a1b 100644 --- a/deepspeed/runtime/zero/partitioned_param_coordinator.py +++ b/deepspeed/runtime/zero/partitioned_param_coordinator.py @@ -18,6 +18,7 @@ from deepspeed.utils.debug import debug_module2name_id, debug_param2name_id from deepspeed.accelerator import get_accelerator import deepspeed.runtime.compiler as compiler +from deepspeed.runtime.compiler import is_compiling import logging @@ -92,7 +93,7 @@ def __init__( # keeps track of the number of submodules invoked so far. self.__step_id: int = 0 # network tracing mode - self.__trace_mode: ZeRoTraceMode = ZeRoTraceMode.RECORD + self.__trace_mode: ZeRoTraceMode = ZeRoTraceMode.INVALID # sequence of submodules/parameters in forward pass + backward pass self.__submodule_order: Iterable[Module] = [] self.__param_order: Iterable[__class__.__ParamInTrace] = [] @@ -188,6 +189,9 @@ def trace_prologue(self, sub_module: Module) -> None: @compiler.disable def record_module(self, sub_module: Module) -> None: """adds sub module to trace""" + if is_compiling(): + return + if not self.is_record_trace(): raise RuntimeError(f"attempted to record trace when status = {self.__trace_mode}") @@ -195,6 +199,8 @@ def record_module(self, sub_module: Module) -> None: self.__step_id_module_fetched_for[sub_module.id].append(self.__step_id) def record_parameters(self, sub_module: Module) -> None: + if is_compiling(): + return """adds sub module to trace""" if not self.is_record_trace(): raise RuntimeError(f"attempted to record trace when status = {self.__trace_mode}") @@ -209,8 +215,12 @@ def construct_parameter_trace_from_module_trace(self): for sub_module in self.__submodule_order: self.record_parameters(sub_module) + @compiler.disable def reset_step(self) -> None: """indicate that we have completed one fwd+bwd for the model""" + if is_compiling(): + return + self._clean_inflight_param_registry() if not self.is_complete_trace(): # not self.trace_complete: diff --git a/deepspeed/runtime/zero/stage3.py b/deepspeed/runtime/zero/stage3.py index 65460eb72a2f..2c0c9d498d13 100644 --- a/deepspeed/runtime/zero/stage3.py +++ b/deepspeed/runtime/zero/stage3.py @@ -593,8 +593,8 @@ def defragment(tensors: List[Tensor]) -> Tensor: return device_buffer - def _get_param_coordinator(self, training): - return self.parameter_offload.get_param_coordinator(training) + def _get_param_coordinator(self): + return self.parameter_offload.get_param_coordinator() def _configure_offloading(self, offload_optimizer_config, offload_param_config): ###################### offload optimizer setup ################################## @@ -1874,7 +1874,7 @@ def _pre_step(self): see_memory_usage(f"In step before checking overflow", force=False) print_rank_0("Finished Tracing at Beginning of Step") - self._get_param_coordinator(training=True).hierarchy = 0 + self._get_param_coordinator().hierarchy = 0 print_rank_0("Finished Tracing at Beginning of Step") @@ -2258,8 +2258,6 @@ def backward(self, loss, retain_graph=False): else: self.loss_scaler.backward(loss.float(), retain_graph=retain_graph) - self._get_param_coordinator(training=True).reset_step() - if self.swap_optimizer: self.optimizer_swapper.post_backward() diff --git a/tests/unit/runtime/zero/test_zero.py b/tests/unit/runtime/zero/test_zero.py index 7262a1b2c998..5dffd70aab68 100644 --- a/tests/unit/runtime/zero/test_zero.py +++ b/tests/unit/runtime/zero/test_zero.py @@ -1628,3 +1628,48 @@ def test_empty_param_groups(self, dtype, use_client_optimizer, empty_weight_grou optimizer=optimizer, config=config_dict, ) + + +class TestZero3SwitchModes(DistributedTest): + world_size = 2 + + @pytest.mark.parametrize("prefetch_ratio", [0.0, 0.5, 1.0]) + def test(self, prefetch_ratio, zero_stage=3): + + hidden_dim = 10 + model = SimpleModel(hidden_dim) + + prefetch_bucket_size = int(sum([p.numel() for p in model.parameters(recurse=True)]) * prefetch_ratio) + config_dict = { + "train_micro_batch_size_per_gpu": 2, + "gradient_accumulation_steps": 2, + "zero_optimization": { + "stage": zero_stage, + "stage3_prefetch_bucket_size": prefetch_bucket_size + }, + "optimizer": { + "type": "Adam", + "params": { + "lr": 1e-3 + } + }, + "fp16": { + "enabled": True, + "initial_scale_power": 8 + } + } + + model, _, _, _ = deepspeed.initialize(config=config_dict, model=model, model_parameters=model.parameters()) + data_loader = random_dataloader(model=model, total_samples=16, hidden_dim=hidden_dim, device=model.device) + + for _ in range(3): + model.train() + for batch in data_loader: + loss = model(batch[0], batch[1]) + model.backward(loss) + model.step() + + model.eval() + with torch.no_grad(): + for batch in data_loader: + loss = model(batch[0], batch[1]) From d2a4718946b544ab5d4f334f05a4ace9670e3ddd Mon Sep 17 00:00:00 2001 From: Logan Adams <114770087+loadams@users.noreply.github.com> Date: Wed, 6 Nov 2024 10:57:12 -0800 Subject: [PATCH 589/754] Update yapf version (#6721) This update is needed to support eventually running on ubuntu-24.04 from GitHub, specifically because the python version is updated to 3.12 and results in the following error: `ModuleNotFoundError: No module named 'lib2to3'` since that package is deprecated. --- .pre-commit-config.yaml | 2 +- deepspeed/__init__.py | 4 ++-- deepspeed/autotuning/autotuner.py | 12 ++++++------ deepspeed/elasticity/elastic_agent.py | 4 ++-- deepspeed/module_inject/replace_module.py | 7 ++++--- deepspeed/runtime/config.py | 4 ++-- deepspeed/runtime/eigenvalue.py | 4 ++-- deepspeed/runtime/pipe/engine.py | 7 ++++--- deepspeed/runtime/utils.py | 4 ++-- tests/unit/runtime/zero/test_zero_context.py | 6 +++--- 10 files changed, 28 insertions(+), 26 deletions(-) diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index b89c872eefe5..e249411e4868 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -23,7 +23,7 @@ repos: - id: trailing-whitespace - repo: https://github.com/google/yapf - rev: v0.32.0 + rev: v0.40.0 hooks: - id: yapf diff --git a/deepspeed/__init__.py b/deepspeed/__init__.py index d8655299282f..de405dc40edb 100755 --- a/deepspeed/__init__.py +++ b/deepspeed/__init__.py @@ -165,8 +165,8 @@ def initialize(args=None, if hasattr(args, "deepscale_config") and args.deepscale_config is not None: logger.warning("************ --deepscale_config is deprecated, please use --deepspeed_config ************") if hasattr(args, "deepspeed_config"): - assert (args.deepspeed_config is - None), "Not sure how to proceed, we were given both a deepscale_config and deepspeed_config" + assert (args.deepspeed_config + is None), "Not sure how to proceed, we were given both a deepscale_config and deepspeed_config" args.deepspeed_config = args.deepscale_config args.deepscale_config = None diff --git a/deepspeed/autotuning/autotuner.py b/deepspeed/autotuning/autotuner.py index dfd195bc37eb..a72b3c951e97 100755 --- a/deepspeed/autotuning/autotuner.py +++ b/deepspeed/autotuning/autotuner.py @@ -248,8 +248,8 @@ def mp_size(self): return self.autotuning_config.mp_size def max_train_micro_batch_size_per_gpu(self): - if self.max_train_batch_size( - ) and self.max_train_batch_size() > 0: # if the user specifies a max_train_batch_size + if self.max_train_batch_size() and self.max_train_batch_size( + ) > 0: # if the user specifies a max_train_batch_size max_train_micro_batch_size = self.max_train_batch_size() * self.mp_size() // ( self.exp_num_gpus * self.exp_num_nodes) # gradient accumulation steps >=1 return min(self.autotuning_config.max_train_micro_batch_size_per_gpu, max_train_micro_batch_size) @@ -964,8 +964,8 @@ def get_min_max_micro_batch_size(self, stage, min_micro_batch_size, calculated_m low = mid + 1 self.update_records(tuning_space_name, exp, metric_val, 1) used_micro_batch_sizes.append(mid) - if prev_metric_val and ( - (metric_val - prev_metric_val) / prev_metric_val) < METRIC_PERCENT_DIFF_CONST: + if prev_metric_val and ((metric_val - prev_metric_val) / + prev_metric_val) < METRIC_PERCENT_DIFF_CONST: logger.info(f"performance plateaus at mbs = {low}") break prev_metric_val = metric_val @@ -1026,8 +1026,8 @@ def get_tuning_micro_batch_size_list(self, min_micro_batch_size, max_micro_batch # NUM_GPUS=$(( ${NUM_WORKERS} * ${NUM_GPUS_PER_WORKER} )) # DP_SIZE=$(( ${NUM_GPUS} / (${PP_SIZE} * ${MP_SIZE}) )) # GRAD_ACC_STEPS=$(( ${TARGET_GLOBAL_BATCH_SIZE} / (${BATCH_SIZE} * ${DP_SIZE}) )) - if self.max_train_batch_size( - ) and self.max_train_batch_size() > 0: # if the user specifies a max_train_batch_size + if self.max_train_batch_size() and self.max_train_batch_size( + ) > 0: # if the user specifies a max_train_batch_size max_train_batch_size_per_gpu = self.max_train_batch_size() * self.mp_size() // (self.exp_num_gpus * self.exp_num_nodes) else: diff --git a/deepspeed/elasticity/elastic_agent.py b/deepspeed/elasticity/elastic_agent.py index c6a69dd2a49f..8fd4293d312c 100644 --- a/deepspeed/elasticity/elastic_agent.py +++ b/deepspeed/elasticity/elastic_agent.py @@ -160,8 +160,8 @@ def _invoke_run(self, role: str = "default") -> RunResult: 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): + 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;" diff --git a/deepspeed/module_inject/replace_module.py b/deepspeed/module_inject/replace_module.py index 8b1455f20c69..1c5745dcf168 100644 --- a/deepspeed/module_inject/replace_module.py +++ b/deepspeed/module_inject/replace_module.py @@ -496,9 +496,10 @@ def conv2d_parallel_shard_weights(model, rank, 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'{config.save_mp_checkpoint_path}/{non_tp_ckpt_name}') + OrderedDict({ + k: v + for k, v in dict(replaced_module.state_dict()).items() if transformer_name not in k + }), f'{config.save_mp_checkpoint_path}/{non_tp_ckpt_name}') dtype_reprs = { torch.float32: 'float32', diff --git a/deepspeed/runtime/config.py b/deepspeed/runtime/config.py index 8be2f7ac4055..fb786f29722d 100755 --- a/deepspeed/runtime/config.py +++ b/deepspeed/runtime/config.py @@ -1012,8 +1012,8 @@ def _do_error_check(self): self.gradient_accumulation_steps), "DeepSpeedConfig: {} is not defined".format(GRADIENT_ACCUMULATION_STEPS) if self.zero_enabled: - assert (self.zero_optimization_stage <= - ZeroStageEnum.max_stage), "DeepSpeedConfig: Maximum supported ZeRO stage is {}".format( + assert (self.zero_optimization_stage + <= ZeroStageEnum.max_stage), "DeepSpeedConfig: Maximum supported ZeRO stage is {}".format( ZeroStageEnum.max_stage) if self.fp16_master_weights_and_gradients: diff --git a/deepspeed/runtime/eigenvalue.py b/deepspeed/runtime/eigenvalue.py index 36300eb904dd..a82d8b1d5c7a 100755 --- a/deepspeed/runtime/eigenvalue.py +++ b/deepspeed/runtime/eigenvalue.py @@ -114,8 +114,8 @@ def compute_eigenvalue(self, module, device=None, scale=1.0): eigenvalue_current, eigenvalue_previous = 1., 0. while (i < self.max_iter) and abs(eigenvalue_current) > 0 and (abs( - (eigenvalue_current - eigenvalue_previous) / eigenvalue_current) >= - self.tol): # test convergence criteria + (eigenvalue_current - eigenvalue_previous) / eigenvalue_current) + >= self.tol): # test convergence criteria eigenvalue_previous = eigenvalue_current Hv = torch.autograd.grad(grads, params, grad_outputs=v, only_inputs=True, retain_graph=True) diff --git a/deepspeed/runtime/pipe/engine.py b/deepspeed/runtime/pipe/engine.py index b75270cbd306..deb44c2e71eb 100644 --- a/deepspeed/runtime/pipe/engine.py +++ b/deepspeed/runtime/pipe/engine.py @@ -640,9 +640,10 @@ def _aggregate_total_loss(self): self.dp_group_loss = losses[0].clone().detach() agg_loss = losses[1].clone().detach() if additional_losses is not None: - self.agg_additional_losses = OrderedDict( - {name: losses[2 + i].clone().detach() - for i, name in enumerate(additional_losses.keys())}) + self.agg_additional_losses = OrderedDict({ + name: losses[2 + i].clone().detach() + for i, name in enumerate(additional_losses.keys()) + }) return agg_loss def set_dataloader(self, loader): diff --git a/deepspeed/runtime/utils.py b/deepspeed/runtime/utils.py index b9617d3e632f..f48adb58c9bf 100755 --- a/deepspeed/runtime/utils.py +++ b/deepspeed/runtime/utils.py @@ -257,8 +257,8 @@ def has_overflow(self, params, has_moe_params=None): elif self.mpu is not None: if self.deepspeed is not None: using_pipeline = hasattr(self.deepspeed, 'pipeline_enable_backward_allreduce') - if (using_pipeline and self.deepspeed.pipeline_enable_backward_allreduce is False) or ( - not using_pipeline and self.deepspeed.enable_backward_allreduce is False): + if (using_pipeline and self.deepspeed.pipeline_enable_backward_allreduce + is False) or (not using_pipeline and self.deepspeed.enable_backward_allreduce is False): dist.all_reduce(overflow_gpu, op=dist.ReduceOp.MAX, group=self.mpu.get_data_parallel_group()) dist.all_reduce(overflow_gpu, op=dist.ReduceOp.MAX, group=self.mpu.get_model_parallel_group()) elif self.deepspeed is not None and self.deepspeed.enable_backward_allreduce is False: diff --git a/tests/unit/runtime/zero/test_zero_context.py b/tests/unit/runtime/zero/test_zero_context.py index ec9e9e94aeaf..1d4fcd60022c 100644 --- a/tests/unit/runtime/zero/test_zero_context.py +++ b/tests/unit/runtime/zero/test_zero_context.py @@ -218,9 +218,9 @@ def test_throughput_calculation(self): engine.tput_timer.stop(global_step=global_step) duration = engine.tput_timer.end_time - engine.tput_timer.start_time # step elapsed time is reset after gradient accumulation steps - assert engine.tput_timer.step_elapsed_time == ( - 0 if engine.tput_timer.global_step_count != engine.tput_timer.start_step else current_duration + - duration) + assert engine.tput_timer.step_elapsed_time == (0 if engine.tput_timer.global_step_count + != engine.tput_timer.start_step else current_duration + + duration) assert engine.tput_timer.total_elapsed_time == total_duration + duration def test_ext_param_getattr(self): From 3beda32e94854e61a138c985e99bde2b3288b1d7 Mon Sep 17 00:00:00 2001 From: Logan Adams <114770087+loadams@users.noreply.github.com> Date: Wed, 6 Nov 2024 15:17:48 -0800 Subject: [PATCH 590/754] Update flake8 version (#6722) This PR is useful for updating the flake8 checks we run, but is mostly needed to update flake8 so that it can run on newer versions of python which are included in newer ubuntu-latest versions from GitHub that we update to in #6717 --- .pre-commit-config.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index e249411e4868..b5d8afa8e0b4 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -65,7 +65,7 @@ repos: ] - repo: https://github.com/pycqa/flake8 - rev: 4.0.1 + rev: 5.0.4 hooks: - id: flake8 args: ['--config=.flake8'] From a1b0c35a1def4bfc20fc3eeb89d6f5831fbc4ae8 Mon Sep 17 00:00:00 2001 From: Logan Adams <114770087+loadams@users.noreply.github.com> Date: Wed, 6 Nov 2024 20:37:52 -0800 Subject: [PATCH 591/754] Switch what versions of python are supported (#5676) Add support for testing compilation with python 3.11/3.12. Also add the dockerfiles used to build those images. --------- Co-authored-by: Michael Wyatt --- .github/workflows/python.yml | 4 +-- docker/gh-builder/Dockerfile.py311 | 35 +++++++++++++++++++++ docker/gh-builder/Dockerfile.py312 | 35 +++++++++++++++++++++ docker/{Dockerfile.rocm => rocm/Dockerfile} | 0 4 files changed, 72 insertions(+), 2 deletions(-) create mode 100644 docker/gh-builder/Dockerfile.py311 create mode 100644 docker/gh-builder/Dockerfile.py312 rename docker/{Dockerfile.rocm => rocm/Dockerfile} (100%) diff --git a/.github/workflows/python.yml b/.github/workflows/python.yml index 3103e3f36e84..37b68f1dbe80 100644 --- a/.github/workflows/python.yml +++ b/.github/workflows/python.yml @@ -21,10 +21,10 @@ jobs: unit-tests: strategy: matrix: - pyVersion: ["3.7", "3.8", "3.9", "3.10"] + pyVersion: ["3.8", "3.9", "3.10", "3.11", "3.12"] fail-fast: false - runs-on: ubuntu-22.04 + runs-on: ubuntu-24.04 container: image: deepspeed/gh-builder:py${{ matrix.pyVersion }} diff --git a/docker/gh-builder/Dockerfile.py311 b/docker/gh-builder/Dockerfile.py311 new file mode 100644 index 000000000000..603fb614314f --- /dev/null +++ b/docker/gh-builder/Dockerfile.py311 @@ -0,0 +1,35 @@ +# Start with NGC container +FROM nvcr.io/nvidia/pytorch:24.03-py3 + +# Set noninteractive mode for apt-get +ARG DEBIAN_FRONTEND=noninteractive + +# Install necessary dependencies for building Python +RUN apt-get update && apt-get install -y \ + wget \ + build-essential \ + libssl-dev \ + zlib1g-dev \ + libbz2-dev \ + libreadline-dev \ + libsqlite3-dev \ + curl \ + libncursesw5-dev \ + libgdbm-dev \ + libc6-dev \ + libffi-dev \ + tk-dev \ + && rm -rf /var/lib/apt/lists/* + +# Download and install Python 3.11 +RUN wget https://www.python.org/ftp/python/3.11.9/Python-3.11.9.tgz \ + && tar xzf Python-3.11.9.tgz \ + && cd Python-3.11.9 \ + && ./configure --enable-optimizations \ + && make altinstall \ + && cd .. \ + && rm -rf Python-3.11.9 Python-3.11.9.tgz + +# Set Python 3.11 as the default Python version +RUN update-alternatives --install /usr/bin/python python /usr/local/bin/python3.11 1 \ + && update-alternatives --install /usr/bin/python3 python3 /usr/local/bin/python3.11 1 diff --git a/docker/gh-builder/Dockerfile.py312 b/docker/gh-builder/Dockerfile.py312 new file mode 100644 index 000000000000..a0a7193201d4 --- /dev/null +++ b/docker/gh-builder/Dockerfile.py312 @@ -0,0 +1,35 @@ +# Start with NGC container +FROM nvcr.io/nvidia/pytorch:24.03-py3 + +# Set noninteractive mode for apt-get +ARG DEBIAN_FRONTEND=noninteractive + +# Install necessary dependencies for building Python +RUN apt-get update && apt-get install -y \ + wget \ + build-essential \ + libssl-dev \ + zlib1g-dev \ + libbz2-dev \ + libreadline-dev \ + libsqlite3-dev \ + curl \ + libncursesw5-dev \ + libgdbm-dev \ + libc6-dev \ + libffi-dev \ + tk-dev \ + && rm -rf /var/lib/apt/lists/* + +# Download and install Python 3.12 +RUN wget https://www.python.org/ftp/python/3.12.5/Python-3.12.5.tgz \ + && tar xzf Python-3.12.5.tgz \ + && cd Python-3.12.5 \ + && ./configure --enable-optimizations \ + && make altinstall \ + && cd .. \ + && rm -rf Python-3.12.5 Python-3.12.5.tgz + +# Set Python 3.12 as the default Python version +RUN update-alternatives --install /usr/bin/python python /usr/local/bin/python3.12 1 \ + && update-alternatives --install /usr/bin/python3 python3 /usr/local/bin/python3.12 1 diff --git a/docker/Dockerfile.rocm b/docker/rocm/Dockerfile similarity index 100% rename from docker/Dockerfile.rocm rename to docker/rocm/Dockerfile From 057d25be6775105f4b9e1d41e6c21981a157c849 Mon Sep 17 00:00:00 2001 From: Logan Adams <114770087+loadams@users.noreply.github.com> Date: Fri, 8 Nov 2024 08:34:20 -0800 Subject: [PATCH 592/754] Update version.txt after 0.15.4 release (#6731) **Auto-generated PR to update version.txt after a DeepSpeed release** Released version - 0.15.4 Author - @loadams Co-authored-by: loadams --- version.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/version.txt b/version.txt index 7ffdfa1cad65..1282fff53bfa 100644 --- a/version.txt +++ b/version.txt @@ -1 +1 @@ -0.15.4 +0.15.5 From 08555662282f624f1258d45617aefef1577a4dd3 Mon Sep 17 00:00:00 2001 From: Logan Adams <114770087+loadams@users.noreply.github.com> Date: Mon, 11 Nov 2024 06:22:08 -0800 Subject: [PATCH 593/754] Update GH hosted workflows to 24.04 (#6717) `ubuntu-latset` is moving to be 24.04, so we should test updating as well to ensure it doesn't break any of our workflows. --- .github/workflows/cpu-torch-latest.yml | 2 +- .github/workflows/no-torch.yml | 3 ++- .github/workflows/nv-pre-compile-ops.yml | 2 +- .github/workflows/release.yml | 2 +- 4 files changed, 5 insertions(+), 4 deletions(-) diff --git a/.github/workflows/cpu-torch-latest.yml b/.github/workflows/cpu-torch-latest.yml index 0de6832b37c1..0125fa50bc14 100644 --- a/.github/workflows/cpu-torch-latest.yml +++ b/.github/workflows/cpu-torch-latest.yml @@ -19,7 +19,7 @@ concurrency: jobs: unit-tests: - runs-on: ubuntu-22.04 + runs-on: ubuntu-24.04 steps: - uses: actions/checkout@v4 diff --git a/.github/workflows/no-torch.yml b/.github/workflows/no-torch.yml index eb3ac9b03161..1a13c0f3f4f1 100644 --- a/.github/workflows/no-torch.yml +++ b/.github/workflows/no-torch.yml @@ -19,7 +19,7 @@ permissions: jobs: unit-tests: - runs-on: ubuntu-22.04 + runs-on: ubuntu-24.04 steps: - uses: actions/checkout@v4 @@ -30,6 +30,7 @@ jobs: - name: Python environment run: | pip uninstall torch --yes + pip install setuptools pip list - name: Build deepspeed diff --git a/.github/workflows/nv-pre-compile-ops.yml b/.github/workflows/nv-pre-compile-ops.yml index 72ba8abbd95d..fc810bc190d0 100644 --- a/.github/workflows/nv-pre-compile-ops.yml +++ b/.github/workflows/nv-pre-compile-ops.yml @@ -21,7 +21,7 @@ concurrency: jobs: unit-tests: - runs-on: ubuntu-22.04 + runs-on: ubuntu-24.04 container: image: deepspeed/gh-builder:ubuntu1804-py38-torch1131-cu116 diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 02881ef12f39..eb763792f0c4 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -7,7 +7,7 @@ on: jobs: deploy: - runs-on: ubuntu-22.04 + runs-on: ubuntu-24.04 environment: release-env steps: From b7e2ff50807975934c3b181457a95df424d115c3 Mon Sep 17 00:00:00 2001 From: Olatunji Ruwase Date: Mon, 11 Nov 2024 14:51:10 -0500 Subject: [PATCH 594/754] Add COMMITTER file (#6741) Add COMMITTER file --- COMMITTERS.md | 9 +++++++++ 1 file changed, 9 insertions(+) create mode 100644 COMMITTERS.md diff --git a/COMMITTERS.md b/COMMITTERS.md new file mode 100644 index 000000000000..bcb8579bf1f7 --- /dev/null +++ b/COMMITTERS.md @@ -0,0 +1,9 @@ +# DeepSpeed TSC Committers # + +| Name | GitHub ID | Affiliation +|--- | ---- | --- | +| Olatunji Ruwase | [tjruwase](https://github.com/tjruwase) | Microsoft | +| Logan Adams | [loadams](https://github.com/loadams) | Microsoft | +| Masahiro Tanaka | [tohtana](https://github.com/tohtana) | Microsoft | +| Jeff Rasley | [jeffra](https://github.com/jeffra) | SnowFlake | +| Minjia Zhang | [minjiazhang](https://github.com/minjiazhang) | UIUC | From b45ca2635495997bb294f4b9b9dbcb23db0dcac6 Mon Sep 17 00:00:00 2001 From: Logan Adams <114770087+loadams@users.noreply.github.com> Date: Mon, 11 Nov 2024 13:26:41 -0800 Subject: [PATCH 595/754] Update AMD apex version (#6739) --- .github/workflows/amd-mi200.yml | 2 -- 1 file changed, 2 deletions(-) diff --git a/.github/workflows/amd-mi200.yml b/.github/workflows/amd-mi200.yml index ea8d2f5f806f..6e8d5847835d 100644 --- a/.github/workflows/amd-mi200.yml +++ b/.github/workflows/amd-mi200.yml @@ -48,8 +48,6 @@ jobs: - name: Install (ROCm) apex run: | git clone https://github.com/ROCmSoftwarePlatform/apex.git - cd apex - git checkout torch_2.1_higher CURRENT_VER=$(git rev-parse HEAD) INSTALLED_VER=$(cat /blob/amd-apex/.venv_installed_version) if [[ "$CURRENT_VER" != "$INSTALLED_VER" ]]; then From 99e9cbed1663b13bbc240d79946913bfe430ffb5 Mon Sep 17 00:00:00 2001 From: Xinyu Lian Date: Mon, 11 Nov 2024 17:31:45 -0600 Subject: [PATCH 596/754] Fix Type Name Inconsistency & Typo in cpu_adam (#6732) There is a typing error & inconsistency in cpu-adam code, while not affecting functionality, impacts code readability. Specifically, the type name `ds_params_percision_t` contains a typo ('percision'), whereas the related type name `ds_state_precision_t` is spelled correctly. I think it is beneficial to fix this typo&inconsistency to improve code readability, maintainability and further development. I have tested the corrected version of cpu_adam, and it compiles and runs successfully. Compilation Log: image Co-authored-by: Logan Adams <114770087+loadams@users.noreply.github.com> Co-authored-by: Olatunji Ruwase --- csrc/adagrad/cpu_adagrad.cpp | 30 +++++++++++++++--------------- csrc/adam/cpu_adam_impl.cpp | 30 +++++++++++++++--------------- csrc/includes/cpu_adagrad.h | 20 ++++++++++---------- csrc/includes/cpu_adam.h | 20 ++++++++++---------- csrc/includes/cpu_lion.h | 20 ++++++++++---------- csrc/lion/cpu_lion_impl.cpp | 30 +++++++++++++++--------------- 6 files changed, 75 insertions(+), 75 deletions(-) diff --git a/csrc/adagrad/cpu_adagrad.cpp b/csrc/adagrad/cpu_adagrad.cpp index 5790e79e2bc2..e276ad0856dd 100644 --- a/csrc/adagrad/cpu_adagrad.cpp +++ b/csrc/adagrad/cpu_adagrad.cpp @@ -17,9 +17,9 @@ static std::unordered_map> s_optimizers; // C++ interface -template -void Adagrad_Optimizer::Step_1(ds_params_percision_t* _params, - ds_params_percision_t* grads, +template +void Adagrad_Optimizer::Step_1(ds_params_precision_t* _params, + ds_params_precision_t* grads, ds_state_precision_t* _exp_avg_sq, size_t _param_size) { @@ -56,9 +56,9 @@ void Adagrad_Optimizer::Step_1(ds_params_percision_t* _params, } } -template -void Adagrad_Optimizer::Step_4(ds_params_percision_t* _params, - ds_params_percision_t* grads, +template +void Adagrad_Optimizer::Step_4(ds_params_precision_t* _params, + ds_params_precision_t* grads, ds_state_precision_t* _exp_avg_sq, size_t _param_size) { @@ -104,9 +104,9 @@ int create_adagrad_optimizer(int optimizer_id, return 0; } -template -void Adagrad_Optimizer::Step_8(ds_params_percision_t* _params, - ds_params_percision_t* grads, +template +void Adagrad_Optimizer::Step_8(ds_params_precision_t* _params, + ds_params_precision_t* grads, ds_state_precision_t* _exp_avg_sq, size_t _param_size) { @@ -121,15 +121,15 @@ void Adagrad_Optimizer::Step_8(ds_params_percision_t* _params, (_param_size - rounded_size)); } -template +template void step_invoker(std::shared_ptr opt, void* _params, void* grads, void* _exp_avg_sq, size_t _param_size) { - opt->Step_8((ds_params_percision_t*)(_params), - (ds_params_percision_t*)(grads), + opt->Step_8((ds_params_precision_t*)(_params), + (ds_params_precision_t*)(grads), (ds_state_precision_t*)(_exp_avg_sq), _param_size); } @@ -139,12 +139,12 @@ std::map, invokers; // Fill map with template functions for each type -template +template void create_invoker() { - invokers[std::tuple(c10::CppTypeToScalarType(), + invokers[std::tuple(c10::CppTypeToScalarType(), c10::CppTypeToScalarType())] = - step_invoker; + step_invoker; } struct InvokerInitializer { InvokerInitializer() diff --git a/csrc/adam/cpu_adam_impl.cpp b/csrc/adam/cpu_adam_impl.cpp index 15d4e74d69d5..465aae7b9a34 100644 --- a/csrc/adam/cpu_adam_impl.cpp +++ b/csrc/adam/cpu_adam_impl.cpp @@ -18,9 +18,9 @@ static std::unordered_map> s_optimizers; // C++ interface -template -void Adam_Optimizer::Step_1(ds_params_percision_t* _params, - ds_params_percision_t* grads, +template +void Adam_Optimizer::Step_1(ds_params_precision_t* _params, + ds_params_precision_t* grads, ds_state_precision_t* _exp_avg, ds_state_precision_t* _exp_avg_sq, size_t _param_size) @@ -67,9 +67,9 @@ void Adam_Optimizer::Step_1(ds_params_percision_t* _params, } } -template -void Adam_Optimizer::Step_4(ds_params_percision_t* _params, - ds_params_percision_t* grads, +template +void Adam_Optimizer::Step_4(ds_params_precision_t* _params, + ds_params_precision_t* grads, ds_state_precision_t* _exp_avg, ds_state_precision_t* _exp_avg_sq, size_t _param_size) @@ -126,9 +126,9 @@ int create_adam_optimizer(int optimizer_id, return 0; } -template -void Adam_Optimizer::Step_8(ds_params_percision_t* _params, - ds_params_percision_t* grads, +template +void Adam_Optimizer::Step_8(ds_params_precision_t* _params, + ds_params_precision_t* grads, ds_state_precision_t* _exp_avg, ds_state_precision_t* _exp_avg_sq, size_t _param_size) @@ -145,7 +145,7 @@ void Adam_Optimizer::Step_8(ds_params_percision_t* _params, (_param_size - rounded_size)); } -template +template void step_invoker(std::shared_ptr opt, void* _params, void* grads, @@ -153,8 +153,8 @@ void step_invoker(std::shared_ptr opt, void* _exp_avg_sq, size_t _param_size) { - opt->Step_8((ds_params_percision_t*)(_params), - (ds_params_percision_t*)(grads), + opt->Step_8((ds_params_precision_t*)(_params), + (ds_params_precision_t*)(grads), (ds_state_precision_t*)(_exp_avg), (ds_state_precision_t*)(_exp_avg_sq), _param_size); @@ -165,12 +165,12 @@ std::map, invokers; // Fill map with template functions for each type -template +template void create_invoker() { - invokers[std::tuple(c10::CppTypeToScalarType(), + invokers[std::tuple(c10::CppTypeToScalarType(), c10::CppTypeToScalarType())] = - step_invoker; + step_invoker; } struct InvokerInitializer { InvokerInitializer() diff --git a/csrc/includes/cpu_adagrad.h b/csrc/includes/cpu_adagrad.h index c06d3a6b35e9..6f500250f033 100644 --- a/csrc/includes/cpu_adagrad.h +++ b/csrc/includes/cpu_adagrad.h @@ -14,9 +14,9 @@ #include "simd.h" #define STEP(SPAN) \ - template \ - void Step_##SPAN(ds_params_percision_t* _params, \ - ds_params_percision_t* grads, \ + template \ + void Step_##SPAN(ds_params_precision_t* _params, \ + ds_params_precision_t* grads, \ ds_state_precision_t* _exp_avg_sq, \ size_t _param_size); @@ -28,10 +28,10 @@ class Adagrad_Optimizer { } ~Adagrad_Optimizer() {} #if defined(__AVX512__) or defined(__AVX256__) - template + template void Step_AVX(size_t* rounded_size, - ds_params_percision_t* _params, - ds_params_percision_t* grads, + ds_params_precision_t* _params, + ds_params_precision_t* grads, ds_state_precision_t* _exp_avg_sq, size_t param_size); #endif @@ -61,15 +61,15 @@ class Adagrad_Optimizer { }; #if defined(__AVX512__) or defined(__AVX256__) -template +template void Adagrad_Optimizer::Step_AVX(size_t* rounded_size, - ds_params_percision_t* _params, - ds_params_percision_t* grads, + ds_params_precision_t* _params, + ds_params_precision_t* grads, ds_state_precision_t* _exp_avg_sq, size_t _param_size) { #if !defined(__AVX512__) - if (std::is_same_v || + if (std::is_same_v || std::is_same_v) { return; } diff --git a/csrc/includes/cpu_adam.h b/csrc/includes/cpu_adam.h index faf99020aee5..a7db6fda3705 100644 --- a/csrc/includes/cpu_adam.h +++ b/csrc/includes/cpu_adam.h @@ -14,9 +14,9 @@ #include "simd.h" #define STEP(SPAN) \ - template \ - void Step_##SPAN(ds_params_percision_t* _params, \ - ds_params_percision_t* grads, \ + template \ + void Step_##SPAN(ds_params_precision_t* _params, \ + ds_params_precision_t* grads, \ ds_state_precision_t* _exp_avg, \ ds_state_precision_t* _exp_avg_sq, \ size_t _param_size); @@ -43,10 +43,10 @@ class Adam_Optimizer { ~Adam_Optimizer() {} #if defined(__AVX512__) or defined(__AVX256__) - template + template void Step_AVX(size_t* rounded_size, - ds_params_percision_t* _params, - ds_params_percision_t* grads, + ds_params_precision_t* _params, + ds_params_precision_t* grads, ds_state_precision_t* _exp_avg, ds_state_precision_t* _exp_avg_sq, size_t param_size); @@ -106,16 +106,16 @@ class Adam_Optimizer { }; #if defined(__AVX512__) or defined(__AVX256__) -template +template void Adam_Optimizer::Step_AVX(size_t* rounded_size, - ds_params_percision_t* _params, - ds_params_percision_t* grads, + ds_params_precision_t* _params, + ds_params_precision_t* grads, ds_state_precision_t* _exp_avg, ds_state_precision_t* _exp_avg_sq, size_t _param_size) { #if !defined(__AVX512__) - if (std::is_same_v || + if (std::is_same_v || std::is_same_v) { return; } diff --git a/csrc/includes/cpu_lion.h b/csrc/includes/cpu_lion.h index 62b304923222..beaf357a3211 100644 --- a/csrc/includes/cpu_lion.h +++ b/csrc/includes/cpu_lion.h @@ -14,9 +14,9 @@ #include "simd.h" #define STEP(SPAN) \ - template \ - void Step_##SPAN(ds_params_percision_t* _params, \ - ds_params_percision_t* grads, \ + template \ + void Step_##SPAN(ds_params_precision_t* _params, \ + ds_params_precision_t* grads, \ ds_state_precision_t* _exp_avg, \ size_t _param_size); @@ -32,10 +32,10 @@ class Lion_Optimizer { ~Lion_Optimizer() {} #if defined(__AVX512__) or defined(__AVX256__) - template + template void Step_AVX(size_t* rounded_size, - ds_params_percision_t* _params, - ds_params_percision_t* grads, + ds_params_precision_t* _params, + ds_params_precision_t* grads, ds_state_precision_t* _exp_avg, size_t param_size); #endif @@ -67,15 +67,15 @@ class Lion_Optimizer { }; #if defined(__AVX512__) or defined(__AVX256__) -template +template void Lion_Optimizer::Step_AVX(size_t* rounded_size, - ds_params_percision_t* _params, - ds_params_percision_t* grads, + ds_params_precision_t* _params, + ds_params_precision_t* grads, ds_state_precision_t* _exp_avg, size_t _param_size) { #if !defined(__AVX512__) - if (std::is_same_v || + if (std::is_same_v || std::is_same_v) { return; } diff --git a/csrc/lion/cpu_lion_impl.cpp b/csrc/lion/cpu_lion_impl.cpp index 85896ba86e19..6a98162314f9 100644 --- a/csrc/lion/cpu_lion_impl.cpp +++ b/csrc/lion/cpu_lion_impl.cpp @@ -19,9 +19,9 @@ static std::unordered_map> s_optimizers; // C++ interface -template -void Lion_Optimizer::Step_1(ds_params_percision_t* _params, - ds_params_percision_t* grads, +template +void Lion_Optimizer::Step_1(ds_params_precision_t* _params, + ds_params_precision_t* grads, ds_state_precision_t* _exp_avg, size_t _param_size) { @@ -64,9 +64,9 @@ void Lion_Optimizer::Step_1(ds_params_percision_t* _params, } } -template -void Lion_Optimizer::Step_4(ds_params_percision_t* _params, - ds_params_percision_t* grads, +template +void Lion_Optimizer::Step_4(ds_params_precision_t* _params, + ds_params_precision_t* grads, ds_state_precision_t* _exp_avg, size_t _param_size) { @@ -117,9 +117,9 @@ int create_lion_optimizer(int optimizer_id, return 0; } -template -void Lion_Optimizer::Step_8(ds_params_percision_t* _params, - ds_params_percision_t* grads, +template +void Lion_Optimizer::Step_8(ds_params_precision_t* _params, + ds_params_precision_t* grads, ds_state_precision_t* _exp_avg, size_t _param_size) { @@ -134,15 +134,15 @@ void Lion_Optimizer::Step_8(ds_params_percision_t* _params, (_param_size - rounded_size)); } -template +template void step_invoker(std::shared_ptr opt, void* _params, void* grads, void* _exp_avg, size_t _param_size) { - opt->Step_8((ds_params_percision_t*)(_params), - (ds_params_percision_t*)(grads), + opt->Step_8((ds_params_precision_t*)(_params), + (ds_params_precision_t*)(grads), (ds_state_precision_t*)(_exp_avg), _param_size); } @@ -152,12 +152,12 @@ std::map, invokers; // Fill map with template functions for each type -template +template void create_invoker() { - invokers[std::tuple(c10::CppTypeToScalarType(), + invokers[std::tuple(c10::CppTypeToScalarType(), c10::CppTypeToScalarType())] = - step_invoker; + step_invoker; } struct InvokerInitializer { InvokerInitializer() From fabab197f747a4ab3ac9c2a7bdd97b6aaa1db698 Mon Sep 17 00:00:00 2001 From: Chengming Zhang Date: Mon, 11 Nov 2024 17:55:09 -0600 Subject: [PATCH 597/754] Add Domino code (#6733) add domino code Co-authored-by: Logan Adams <114770087+loadams@users.noreply.github.com> --- deepspeed/__init__.py | 2 +- deepspeed/runtime/domino/__init__.py | 4 + deepspeed/runtime/domino/transformer.py | 518 ++++++++++++++++++++++++ 3 files changed, 523 insertions(+), 1 deletion(-) create mode 100644 deepspeed/runtime/domino/__init__.py create mode 100644 deepspeed/runtime/domino/transformer.py diff --git a/deepspeed/__init__.py b/deepspeed/__init__.py index de405dc40edb..a8d15cd5332b 100755 --- a/deepspeed/__init__.py +++ b/deepspeed/__init__.py @@ -42,7 +42,7 @@ from .utils import log_dist, OnDevice, logger from .comm.comm import init_distributed -from .runtime import zero +from .runtime import zero, domino from .runtime.compiler import is_compile_supported from .pipe import PipelineModule diff --git a/deepspeed/runtime/domino/__init__.py b/deepspeed/runtime/domino/__init__.py new file mode 100644 index 000000000000..208299fb8c50 --- /dev/null +++ b/deepspeed/runtime/domino/__init__.py @@ -0,0 +1,4 @@ +# Copyright (c) Microsoft Corporation. +# SPDX-License-Identifier: Apache-2.0 + +# DeepSpeed Team diff --git a/deepspeed/runtime/domino/transformer.py b/deepspeed/runtime/domino/transformer.py new file mode 100644 index 000000000000..8eb95e49c29d --- /dev/null +++ b/deepspeed/runtime/domino/transformer.py @@ -0,0 +1,518 @@ +# Copyright (c) Microsoft Corporation. +# SPDX-License-Identifier: Apache-2.0 + +# DeepSpeed Team + +import torch +import torch.nn.functional as F +from torch.nn.parameter import Parameter +import deepspeed +from deepspeed import comm as dist +from deepspeed.accelerator import get_accelerator + + +def is_rank_0(): + if dist.get_rank() == 0: + return True + + +class DominoModule(torch.nn.Module): + """extensions of torch Module.""" + + def __init__(self, ): + super(DominoModule, self).__init__() + + +import enum + + +class LayerType(enum.Enum): + encoder = 1 + decoder = 2 + + +class AttnType(enum.Enum): + self_attn = 1 + cross_attn = 2 + + +class AttnMaskType(enum.Enum): + padding = 1 + causal = 2 + + +class ModelType(enum.Enum): + encoder_or_decoder = 1 + encoder_and_decoder = 2 + + +handle_dic = {} + + +def no_oper(input_, dic_, h_id): + return NoOper.apply(input_, dic_, h_id) + + +class NoOper(torch.autograd.Function): + + @staticmethod + def symbolic(graph, input_, handle_dic, h_id): + return input_ + + @staticmethod + def forward(ctx, input_, handle_dic, h_id): + ctx.handle_dic = handle_dic + ctx.h_id = h_id + return input_ + + @staticmethod + def backward(ctx, grad_output): + handle = ctx.handle_dic[ctx.h_id] + handle.wait() + return grad_output, None, None + + +def copy_to_tensor_model_parallel_region_a(mpu, input_, dic_, h_id): + return _CopyToModelParallelRegionA.apply(mpu, input_, dic_, h_id) + + +class _CopyToModelParallelRegionA(torch.autograd.Function): + """Pass the input to the model parallel region.""" + + @staticmethod + def symbolic(graph, mpu, input_, handle_dic, h_id): + return input_ + + @staticmethod + def forward(ctx, mpu, input_, handle_dic, h_id): + ctx.mpu = mpu + ctx.handle_dic = handle_dic + ctx.h_id = h_id + return input_ + + @staticmethod + def backward(ctx, grad_output): + # Bypass the function if we are using only 1 GPU. + if ctx.mpu.get_tensor_model_parallel_world_size() == 1: + return grad_output + + # Async All-reduce. + handle = deepspeed.comm.all_reduce(grad_output, group=ctx.mpu.get_tensor_model_parallel_group(), async_op=True) + ctx.handle_dic[ctx.h_id] = handle + return None, grad_output, None, None + + +class CoreAttention(DominoModule): + + def __init__(self, config, layer_number, mpu, attn_mask_type=AttnMaskType.causal): + super(CoreAttention, self).__init__() + + self.layer_number = max(1, layer_number) + self.att_dropout_p = config.attention_dropout + self.is_causal = True + projection_size = config.kv_channels * config.num_attention_heads + world_size = mpu.get_tensor_model_parallel_world_size() + self.hidden_size_per_partition = projection_size // world_size + + def forward(self, query_layer, key_layer, value_layer, attention_mask): + # attn_mask is None when is_causal=True + context_layer = torch.nn.functional.scaled_dot_product_attention(query_layer, + key_layer, + value_layer, + attn_mask=None, + dropout_p=self.att_dropout_p, + is_causal=True, + scale=None) + + # [b, np, sq, hn] --> [sq, b, np, hn] + context_layer = context_layer.permute(2, 0, 1, 3).contiguous() + + # [sq, b, np, hn] --> [sq, b, hp] + new_context_layer_shape = context_layer.size()[:-2] + \ + (self.hidden_size_per_partition,) + context_layer = context_layer.view(*new_context_layer_shape) + + return context_layer + + +class ShardedAttention(DominoModule): + """Sharded self-attention layer class. + Only support self attention and causal attention mask + """ + + def __init__(self, + config, + layer_number, + mpu, + ColumnParallelLinear, + RowParallelLinearNoComm, + apply_rotary_pos_emb, + attention_type=AttnType.self_attn, + attn_mask_type=AttnMaskType.causal): + super(ShardedAttention, self).__init__() + self.layer_number = max(1, layer_number) + self.attention_type = attention_type + self.attn_mask_type = attn_mask_type + self.params_dtype = config.params_dtype + self.apply_rotary_pos_emb = apply_rotary_pos_emb + + query_projection_size = config.kv_channels * config.num_attention_heads + kv_projection_size = config.kv_channels * config.num_attention_heads + + # Per attention head and per partition values. + world_size = mpu.get_tensor_model_parallel_world_size() + self.hidden_size_per_attention_head = query_projection_size // config.num_attention_heads + self.num_attention_heads_per_partition = config.num_attention_heads // world_size + + self.query_key_value = ColumnParallelLinear(config.hidden_size, + query_projection_size + 2 * kv_projection_size, + config=config, + init_method=config.init_method, + bias=config.add_bias_linear, + gather_output=False) + + self.core_attention = CoreAttention(config, self.layer_number, mpu, self.attn_mask_type) + + self.dense = RowParallelLinearNoComm(query_projection_size, + config.hidden_size, + config=config, + init_method=config.output_layer_init_method, + bias=config.add_bias_linear, + input_is_parallel=True, + skip_bias_add=True) + + def forward(self, hidden_states, attention_mask, rotary_pos_emb=None): + # hidden_states: [s, b, h] + + # Query, Key, and Value + # Attention heads [s, b, h] --> [s, b, np * 3 * hn)] + mixed_x_layer, _ = self.query_key_value(hidden_states) + + # [s, b, np * 3 * hn] --> [s, b, np, 3 * hn] + new_tensor_shape = mixed_x_layer.size()[:-1] + ( + self.num_attention_heads_per_partition, + 3 * self.hidden_size_per_attention_head, + ) + mixed_x_layer = mixed_x_layer.view(*new_tensor_shape) + + # [s, b, np, 3 * hn] -> [b, np, s, 3*hn] + mixed_x_layer = mixed_x_layer.permute(1, 2, 0, 3).contiguous() + + # [s, b, np, 3 * hn] --> [s, b, np, hn], [s, b, np, hn], [s, b, np, hn] + (query_layer, key_layer, value_layer) = torch.split(mixed_x_layer, [ + self.hidden_size_per_attention_head, self.hidden_size_per_attention_head, + self.hidden_size_per_attention_head + ], + dim=3) + # [s, b, np, np * hn] -> [s, b, np, hn] + query_layer = query_layer.view(query_layer.size(0), query_layer.size(1), -1, + self.hidden_size_per_attention_head) + + # apply rotary embedding + if rotary_pos_emb is not None: + if isinstance(rotary_pos_emb, tuple): + rotary_pos_emb = rotary_pos_emb + else: + rotary_pos_emb = ((rotary_pos_emb, ) * 2) + q_pos_emb, k_pos_emb = rotary_pos_emb + query_layer = self.apply_rotary_pos_emb(query_layer, q_pos_emb) + key_layer = self.apply_rotary_pos_emb(key_layer, k_pos_emb) + + context_layer = self.core_attention(query_layer, key_layer, value_layer, attention_mask) + + # Output. [s, b, h] + output, bias = self.dense(context_layer) + + return output, bias + + +class DominoTransformerLayer(DominoModule): + """A domino single transformer layer. + [s, b, h] -> [s, b, h] + """ + + def __init__(self, + config, + layer_number, + mpu, + fused_layer_norm, + _initialize_affine_weight_gpu, + ColumnParallelLinear, + RowParallelLinearNoComm, + apply_rotary_pos_emb, + bias_dropout_add_fused_train, + bias_dropout_add_fused_inference, + skip_bias_add=True, + layer_type=LayerType.encoder, + self_attn_mask_type=AttnMaskType.causal, + drop_path_rate=0., + output_bias=None): + super(DominoTransformerLayer, self).__init__() + + self.llama_model = config.llama_model + self.layer_number = layer_number + self.layer_type = layer_type + self.apply_residual_connection_post_layernorm = config.apply_residual_connection_post_layernorm + self.bias_dropout_add_fused_train = bias_dropout_add_fused_train + self.bias_dropout_add_fused_inference = bias_dropout_add_fused_inference + self.mpu = mpu + self.output_bias = output_bias + + # Layernorm on the input data. + self.input_layernorm = fused_layer_norm(config.hidden_size, + eps=config.layernorm_epsilon, + no_persist_layer_norm=config.no_persist_layer_norm) + + # Self attention. + self.self_attention = ShardedAttention(config, + layer_number, + mpu, + ColumnParallelLinear, + RowParallelLinearNoComm, + apply_rotary_pos_emb, + attention_type=AttnType.self_attn, + attn_mask_type=self_attn_mask_type) + + self.hidden_dropout = config.hidden_dropout + + # Layernorm on the attention output + self.post_attention_layernorm = fused_layer_norm(config.hidden_size, + eps=config.layernorm_epsilon, + no_persist_layer_norm=config.no_persist_layer_norm) + + # ------------ init mlp start ------------ + init_method = config.init_method + output_layer_init_method = config.output_layer_init_method + self.add_bias = config.add_bias_linear + self.skip_bias_add = skip_bias_add + + ffn_hidden_size = config.ffn_hidden_size + if config.gated_linear_unit: + ffn_hidden_size *= 2 + self.output_size_c = config.ffn_hidden_size + self.input_size_c = config.hidden_size + self.input_size_r = config.ffn_hidden_size + self.output_size_r = self.input_size_c + + world_size = mpu.get_tensor_model_parallel_world_size() + self.output_size_per_partition = self.output_size_c // world_size + self.input_size_per_partition = self.input_size_r // world_size + + # Initialize weight. + self.weight_c = Parameter( + torch.empty(self.output_size_per_partition, + self.input_size_c, + device=get_accelerator().current_device_name(), + dtype=config.params_dtype)) + self.weight_r = Parameter( + torch.empty(self.output_size_r, + self.input_size_per_partition, + device=get_accelerator().current_device_name(), + dtype=config.params_dtype)) + + if config.perform_initialization: + _initialize_affine_weight_gpu(self.weight_c, init_method, partition_dim=0, stride=1) + + _initialize_affine_weight_gpu(self.weight_r, output_layer_init_method, partition_dim=1, stride=1) + + if self.add_bias: + self.bias_c = Parameter( + torch.empty(self.output_size_per_partition, + device=get_accelerator().current_device_name(), + dtype=config.params_dtype)) + self.bias_r = Parameter( + torch.empty(self.output_size_r, + device=get_accelerator().current_device_name(), + dtype=config.params_dtype)) + if config.perform_initialization: + with torch.no_grad(): + self.bias_c.zero_() + self.bias_r.zero_() + else: + self.register_parameter('bias_c', None) + self.register_parameter('bias_r', None) + + if config.swiglu: + + def swiglu(x): + x = torch.chunk(x, 2, dim=-1) + return F.silu(x[0]) * x[1] + + self.mlp_activation_func = swiglu + else: + self.mlp_activation_func = F.gelu + # ------------ init mlp end ------------ + + def forward(self, hidden_states, attention_mask, rotary_pos_emb=None): + # hidden_states: [s, b, h] + hidden_states0, hidden_states1 = hidden_states + + layernorm_output0 = self.input_layernorm(hidden_states0) + layernorm_output1 = self.input_layernorm(hidden_states1) + + if not self.llama_model: + rotary_pos_emb = None + + attention_output0, attention_bias0 = \ + self.self_attention( + layernorm_output0, + attention_mask, + rotary_pos_emb=rotary_pos_emb) + handle0 = deepspeed.comm.all_reduce(attention_output0, + group=self.mpu.get_tensor_model_parallel_group(), + async_op=True) + + attention_output1, attention_bias1 = \ + self.self_attention( + layernorm_output1, + attention_mask, + rotary_pos_emb=rotary_pos_emb) + handle1 = deepspeed.comm.all_reduce(attention_output1, + group=self.mpu.get_tensor_model_parallel_group(), + async_op=True) + handle0.wait() + + # Residual0 connection. + if self.apply_residual_connection_post_layernorm: + residual0 = layernorm_output0 + else: + residual0 = hidden_states0 + + if self.training: + bias_dropout_add_func = self.bias_dropout_add_fused_train + else: + bias_dropout_add_func = self.bias_dropout_add_fused_inference + if attention_bias0 is not None: + attention_bias0 = attention_bias0.expand_as(residual0) + layernorm_input0 = bias_dropout_add_func(attention_output0, attention_bias0, residual0, self.hidden_dropout) + + layernorm_output0 = self.post_attention_layernorm(layernorm_input0) + layernorm_output0 = no_oper(layernorm_output0, handle_dic, f'{self.layer_number}_0') + + # Residual1 connection. + if self.apply_residual_connection_post_layernorm: + residual1 = layernorm_output1 + else: + residual1 = hidden_states1 + + if attention_bias1 is not None: + attention_bias1 = attention_bias1.expand_as(residual1) + layernorm_input1 = bias_dropout_add_func(attention_output1, attention_bias1, residual1, self.hidden_dropout) + + layernorm_output1 = self.post_attention_layernorm(layernorm_input1) + layernorm_output1 = no_oper(layernorm_output1, handle_dic, f'{self.layer_number}_1') + + # ------------ explicit mlp start ------------ + bias_c = self.bias_c if not self.skip_bias_add else None + + input0 = copy_to_tensor_model_parallel_region_a(self.mpu, layernorm_output0, handle_dic, + f'{self.layer_number}_0') + # Batch0 Matrix multiply. + output0 = torch.matmul(input0, self.weight_c.t()) + if bias_c is not None: + output0 = output0 + bias_c + output0 = self.mlp_activation_func(output0) + output0 = torch.matmul(output0, self.weight_r.t()) + handle2 = deepspeed.comm.all_reduce(output0, group=self.mpu.get_tensor_model_parallel_group(), async_op=True) + + handle1.wait() + + input1 = copy_to_tensor_model_parallel_region_a(self.mpu, layernorm_output1, handle_dic, + f'{self.layer_number}_1') + # Batch1 Matrix multiply. + output1 = torch.matmul(input1, self.weight_c.t()) + output1 = self.mlp_activation_func(output1) + if bias_c is not None: + output1 = output1 + bias_c + output1 = torch.matmul(output1, self.weight_r.t()) + deepspeed.comm.all_reduce(output1, group=self.mpu.get_tensor_model_parallel_group()) + + handle2.wait() + + output0 = output0 + self.bias_r if self.bias_r is not None else output0 + output1 = output1 + self.bias_r if self.bias_r is not None else output1 + output_bias = self.output_bias + mlp_output0, mlp_output1, mlp_bias0, mlp_bias1 = output0, output1, output_bias, output_bias + # ------------ explicit mlp end ------------ + + if self.apply_residual_connection_post_layernorm: + residual0 = layernorm_output0 + residual1 = layernorm_output1 + else: + residual0 = layernorm_input0 + residual1 = layernorm_input1 + + if mlp_bias0 is not None: + mlp_bias0 = mlp_bias0.expand_as(residual0) + mlp_bias1 = mlp_bias1.expand_as(residual1) + output0 = bias_dropout_add_func(mlp_output0, mlp_bias0, residual0, self.hidden_dropout) + output1 = bias_dropout_add_func(mlp_output1, mlp_bias1, residual1, self.hidden_dropout) + + return output0, output1 + + +class DominoTransformer(DominoModule): + """Transformer class.""" + + def __init__(self, + config, + model_type, + mpu, + fused_layer_norm, + _initialize_affine_weight_gpu, + ColumnParallelLinear, + RowParallelLinearNoComm, + apply_rotary_pos_emb, + bias_dropout_add_fused_train, + bias_dropout_add_fused_inference, + layer_type=LayerType.encoder, + self_attn_mask_type=AttnMaskType.causal, + pre_process=True, + post_process=True, + post_layer_norm=True, + drop_path_rate=0.0): + super(DominoTransformer, self).__init__() + + self.layer_type = layer_type + self.model_type = model_type + self.post_process = post_process + self.post_layer_norm = post_layer_norm + self.num_layers = config.num_layers + self.drop_path_rate = drop_path_rate + self.drop_path_rates = [rate.item() for rate in torch.linspace(0, self.drop_path_rate, config.num_layers)] + + def build_layer(layer_number): + return DominoTransformerLayer(config, + layer_number, + mpu, + fused_layer_norm, + _initialize_affine_weight_gpu, + ColumnParallelLinear, + RowParallelLinearNoComm, + apply_rotary_pos_emb, + bias_dropout_add_fused_train, + bias_dropout_add_fused_inference, + layer_type=layer_type, + self_attn_mask_type=self_attn_mask_type, + drop_path_rate=self.drop_path_rates[layer_number - 1]) + + self.layers = torch.nn.ModuleList([build_layer(i + 1) for i in range(self.num_layers)]) + + if self.post_process and self.post_layer_norm: + self.final_layernorm = fused_layer_norm(config.hidden_size, + eps=config.layernorm_epsilon, + no_persist_layer_norm=config.no_persist_layer_norm) + + def forward(self, hidden_states, attention_mask, rotary_pos_emb=None): + # hidden_states: [s, b, h] + + for index in range(self.num_layers): + layer = self.layers[index] + hidden_states = layer(hidden_states, attention_mask, rotary_pos_emb) + + hidden_states0, hidden_states1 = hidden_states + if self.post_process and self.post_layer_norm: + hidden_states0 = self.final_layernorm(hidden_states0) + hidden_states1 = self.final_layernorm(hidden_states1) + + return hidden_states0, hidden_states1 From 73d974ee640a95a594be95bb68af00fd77e44409 Mon Sep 17 00:00:00 2001 From: Hongwei Chen <33092912+hwchen2017@users.noreply.github.com> Date: Tue, 12 Nov 2024 05:01:31 -0800 Subject: [PATCH 598/754] Add data type check for bf16 (#6742) Add data type check for bf16 to fix #6723 --- deepspeed/runtime/engine.py | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/deepspeed/runtime/engine.py b/deepspeed/runtime/engine.py index 05bb23e8ddd9..b639ef6a1456 100755 --- a/deepspeed/runtime/engine.py +++ b/deepspeed/runtime/engine.py @@ -1077,7 +1077,10 @@ def _supported_optims(self): # Validate configuration based on command line arguments def _do_sanity_check(self): if self.fp16_enabled() and not get_accelerator().is_fp16_supported(): - raise ValueError("Type fp16 is not supported.") + raise ValueError("Type fp16 is not supported on your device.") + + if self.bfloat16_enabled() and not get_accelerator().is_bf16_supported(): + raise ValueError("Type bf16 is not supported on your device.") expected_optim_types = self._supported_optims() expected_optim_types += [type(None), Callable] From 7af3a4beb5bf99517bb2d51b450861ca54bed8d3 Mon Sep 17 00:00:00 2001 From: inkcherry Date: Tue, 12 Nov 2024 22:25:33 +0800 Subject: [PATCH 599/754] add zero3 ```module_granularity_threshold ``` to zero optimization. (#6649) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit This PR adds Z3 coalesced fetch to zero optimization. Currently, some logic can be reused, but it's difficult to realize that as optimization choice(I only discovered these logic when trying to implement it). The benefit of this approach is reducing host overhead(reduce many hooks) and during the process of recursive fetching parameters (especially in fine-grained models, such as those with a large number of moe experts). This is particularly helpful for host-sensitive devices (such as hpu), where it achieved a 40% performance improvement in our customer workloads. FYI @delock @deepcharm --------- Co-authored-by: Ma, Guokai Co-authored-by: Logan Adams <114770087+loadams@users.noreply.github.com> Co-authored-by: Olatunji Ruwase --- deepspeed/runtime/engine.py | 5 + deepspeed/runtime/zero/config.py | 9 ++ deepspeed/runtime/zero/parameter_offload.py | 91 ++++++++++++- deepspeed/runtime/zero/stage3.py | 8 +- deepspeed/utils/__init__.py | 2 +- deepspeed/utils/z3_leaf_module.py | 27 ++-- docs/_pages/config-json.md | 5 + .../runtime/zero/test_zero_leaf_module.py | 121 +++++++++++++++++- 8 files changed, 252 insertions(+), 16 deletions(-) diff --git a/deepspeed/runtime/engine.py b/deepspeed/runtime/engine.py index b639ef6a1456..e1e745d2b112 100755 --- a/deepspeed/runtime/engine.py +++ b/deepspeed/runtime/engine.py @@ -811,6 +811,9 @@ def zero_max_reuse_distance(self): def zero_prefetch_bucket_size(self): return self._config.zero_config.prefetch_bucket_size + def zero_module_granularity_threshold(self): + return self._config.zero_config.module_granularity_threshold + def zero_param_persistence_threshold(self): return self._config.zero_config.param_persistence_threshold @@ -1614,6 +1617,7 @@ def _configure_zero_optimizer(self, optimizer): zero_param_parallel_group=zero_param_parallel_group, zero_quantized_weights=self.zero_quantized_weights(), zero_quantized_nontrainable_weights=self.zero_quantized_nontrainable_weights(), + zero_module_granularity_threshold=self.zero_module_granularity_threshold(), ) else: log_dist( @@ -1660,6 +1664,7 @@ def _configure_zero_optimizer(self, optimizer): zero_hpz_partition_size=self.zero_hpz_partition_size(), zero_quantized_weights=self.zero_quantized_weights(), zero_quantized_nontrainable_weights=self.zero_quantized_nontrainable_weights(), + zero_module_granularity_threshold=self.zero_module_granularity_threshold(), ) else: diff --git a/deepspeed/runtime/zero/config.py b/deepspeed/runtime/zero/config.py index 1cfcd784e2ce..7cac7e3c1ce7 100644 --- a/deepspeed/runtime/zero/config.py +++ b/deepspeed/runtime/zero/config.py @@ -21,6 +21,7 @@ "stage3_max_live_parameters" : 1000000000, "stage3_max_reuse_distance" : 1000000000, "stage3_use_all_reduce_for_fetch_params": [true|false], + "stage3_module_granularity_threshold": 0, "allgather_partitions": [true|false], "use_multi_rank_bucket_allreduce": [true|false], "allgather_bucket_size": 500000000, @@ -245,6 +246,14 @@ class DeepSpeedZeroConfig(DeepSpeedConfigModel): this option is enabled and then saves the fp16 model weights. """ + module_granularity_threshold: int = Field(pp_int(0), alias="stage3_module_granularity_threshold") + """ + The granularity of a module is determined by the ratio of "parameter_count / (1 + descendant count)". + ZeRO3 classifies modules with a granularity below the threshold as fine-grained, + which are treated as integral units during parameter fetching. This reduces host overhead + and the separate allgather overhead introduced by hooks for fine-grained layers when fetching parameters. + """ + use_all_reduce_for_fetch_params: bool = Field(False, alias="stage3_use_all_reduce_for_fetch_params") """ Use all_reduce op when fetching module parameters at stage3. This improves performance by reducing diff --git a/deepspeed/runtime/zero/parameter_offload.py b/deepspeed/runtime/zero/parameter_offload.py index 4b0ddb7679a9..082d7e874e4d 100644 --- a/deepspeed/runtime/zero/parameter_offload.py +++ b/deepspeed/runtime/zero/parameter_offload.py @@ -6,7 +6,7 @@ import sys import torch from collections import OrderedDict -from deepspeed.utils import z3_leaf_module +from deepspeed.utils import z3_leaf_module, set_z3_leaf_module from deepspeed.runtime.utils import see_memory_usage from deepspeed.runtime.zero.utils import apply_to_tensors_only, is_zero_param from deepspeed.runtime.zero.offload_config import OffloadDeviceEnum @@ -14,6 +14,7 @@ from deepspeed.runtime.zero.partition_parameters import * from deepspeed.runtime.zero.partitioned_param_coordinator import PartitionedParameterCoordinator, InflightParamRegistry, iter_params from deepspeed.accelerator import get_accelerator +from deepspeed import utils FWD_MODULE_STACK = list() @@ -101,6 +102,7 @@ def __init__( zero_param_parallel_group=None, zero_quantized_weights=False, zero_quantized_nontrainable_weights=False, + zero_module_granularity_threshold=0, ): see_memory_usage("DeepSpeedZeRoOffload initialize [begin]", force=True) @@ -155,8 +157,16 @@ def __init__( zero_quantized_nontrainable_weights=self.zero_quantized_nontrainable_weights, ) + if zero_module_granularity_threshold > 0: + self.min_granularity_value = sys.maxsize + self.min_granularity_layer = None + self.granularity_info = set() + self.z3_leaf_layers = [] + self._set_z3_leaf_modules_by_threshold(module, zero_module_granularity_threshold) + self.forward_hooks = [] self.backward_hooks = [] + self.setup_zero_stage3_hooks() print_rank_0( f'Created module hooks: forward = {len(self.forward_hooks)}, backward = {len(self.backward_hooks)}', @@ -482,3 +492,82 @@ def post_sub_module_backward_function(self, sub_module): see_memory_usage( f"After sub module backward function {sub_module.__class__.__name__} {sub_module.id} after release", force=False) + + def _set_z3_leaf_modules_by_threshold(self, module, zero_module_granularity_threshold): + + self._get_granularity_recursively(module) + print_rank_0(f"{'MODULE NAME'.ljust(30)}|{'GRANULARITY VALUE'.rjust(20)}", force=True) + for granularity in self.granularity_info: + print_rank_0(granularity, force=True) + + if self.min_granularity_value <= zero_module_granularity_threshold: + self._set_leaf_by_threshold_preorder(module, zero_module_granularity_threshold) + utils.logger.info( + f"z3_leaf_module was set by stage3_module_granularity_threshold:{zero_module_granularity_threshold}") + for layer in self.z3_leaf_layers: + print_rank_0(f"{layer.__class__.__name__}:{layer.ds_model_granularity}", force=True) + else: + utils.logger.warning( + f"The smallest module granularity is [{self.min_granularity_layer}:{self.min_granularity_value}]. "\ + f"To make stage3_module_granularity_threshold effective, you need to set stage3_module_granularity_threshold >= {self.min_granularity_value}. "\ + f"Current Value:{zero_module_granularity_threshold}" + ) + + def _get_granularity_recursively(self, module): + """This function is used to recursively obtain the granularity of each module.""" + + # avoid setting as leaf for particularly large models, even if the granularity is very small + # an oversized leaf module increases the number of live parameters, introducing memory overhead + Z3_MAX_LEAF_SIZE = 1e9 + + if not list(module.parameters()): + # skip Modules without parameters, such as GELU, etc. + module.ds_model_granularity = sys.maxsize + return 0, 0 + + num_layers = 0 + num_params = 0 + num_params += sum(p.ds_numel for p in module.parameters(recurse=False)) + if not any(module.children()): + # torch leaf module + module.ds_model_granularity = sys.maxsize + return 1, num_params + + for child in module.children(): + layers_in_child, params_in_child = self._get_granularity_recursively(child) + num_layers += layers_in_child + num_params += params_in_child + + if module.__class__.__name__ in torch.nn.modules.container.__all__: + # Do not set container modules like ModuleList as leaf modules + # as this will prevent hooks from being set on their children + # and they may do not invoke the forward method + module.ds_model_granularity = sys.maxsize + return num_layers, num_params + + num_layers += 1 + ds_model_granularity = (num_params // num_layers) if num_params <= Z3_MAX_LEAF_SIZE else sys.maxsize + module.ds_model_granularity = ds_model_granularity + # module.ds_model_num_layers = num_layers + # module.ds_model_num_params = num_params + if self.min_granularity_value > ds_model_granularity: + self.min_granularity_value = ds_model_granularity + self.min_granularity_layer = module.__class__.__name__ + self.granularity_info.add(f"{module.__class__.__name__.ljust(30)}|{str(ds_model_granularity).rjust(20)}") + + return num_layers, num_params + + def _set_leaf_by_threshold_preorder(self, module, granularity_treshhold): + '''Set modules as leaf modules based on the threshold, prioritizing parent nodes.''' + + num_params = sum(p.ds_numel for p in module.parameters()) + if num_params == 0: + # skip Modules without parameters, such as GELU, etc. + return + if module.ds_model_granularity <= granularity_treshhold: + set_z3_leaf_module(module, True) + self.z3_leaf_layers.append(module) + return + + for sub_module in module.children(): + self._set_leaf_by_threshold_preorder(sub_module, granularity_treshhold) diff --git a/deepspeed/runtime/zero/stage3.py b/deepspeed/runtime/zero/stage3.py index 2c0c9d498d13..04d52319ae8c 100644 --- a/deepspeed/runtime/zero/stage3.py +++ b/deepspeed/runtime/zero/stage3.py @@ -157,6 +157,7 @@ def __init__( zero_hpz_partition_size=1, zero_quantized_weights=False, zero_quantized_nontrainable_weights=False, + zero_module_granularity_threshold=0, ): see_memory_usage("Stage 3 initialize beginning", force=True) @@ -227,7 +228,8 @@ def __init__( mpu=mpu, zero_param_parallel_group=zero_param_parallel_group, zero_quantized_weights=zero_quantized_weights, - zero_quantized_nontrainable_weights=zero_quantized_nontrainable_weights) + zero_quantized_nontrainable_weights=zero_quantized_nontrainable_weights, + zero_module_granularity_threshold=zero_module_granularity_threshold) self.persistent_parameters = self.parameter_offload.persistent_parameters self._configure_offloading(offload_optimizer_config, offload_param_config) @@ -458,6 +460,7 @@ def initialize_ds_offload( zero_param_parallel_group, zero_quantized_weights, zero_quantized_nontrainable_weights, + zero_module_granularity_threshold, ): return DeepSpeedZeRoOffload(module=module, timers=timers, @@ -473,7 +476,8 @@ def initialize_ds_offload( mpu=mpu, zero_param_parallel_group=zero_param_parallel_group, zero_quantized_weights=zero_quantized_weights, - zero_quantized_nontrainable_weights=zero_quantized_nontrainable_weights) + zero_quantized_nontrainable_weights=zero_quantized_nontrainable_weights, + zero_module_granularity_threshold=zero_module_granularity_threshold) def _get_trainable_parameter_groups(self): param_groups = [] diff --git a/deepspeed/utils/__init__.py b/deepspeed/utils/__init__.py index c6a202d485eb..983e64642c69 100644 --- a/deepspeed/utils/__init__.py +++ b/deepspeed/utils/__init__.py @@ -16,7 +16,7 @@ from .tensor_fragment import safe_set_full_fp32_param, safe_set_full_optimizer_state, safe_set_full_grad from .tensor_fragment import safe_get_local_fp32_param, safe_get_local_grad, safe_get_local_optimizer_state from .tensor_fragment import safe_set_local_fp32_param, safe_set_local_grad, safe_set_local_optimizer_state -from .z3_leaf_module import set_z3_leaf_modules, unset_z3_leaf_modules, get_z3_leaf_modules, z3_leaf_module, z3_leaf_parameter +from .z3_leaf_module import set_z3_leaf_modules, unset_z3_leaf_modules, get_z3_leaf_modules, z3_leaf_module, z3_leaf_parameter, set_z3_leaf_module from .mixed_precision_linkage import link_hp_params, lazy_init_hp_params_optimizer_state from deepspeed.runtime.dataloader import RepeatingLoader from .numa import get_numactl_cmd diff --git a/deepspeed/utils/z3_leaf_module.py b/deepspeed/utils/z3_leaf_module.py index 47d9ff698f1f..14e8ae2d2823 100644 --- a/deepspeed/utils/z3_leaf_module.py +++ b/deepspeed/utils/z3_leaf_module.py @@ -4,7 +4,7 @@ # DeepSpeed Team import torch -from typing import List, Type +from typing import List, Type, Union def z3_leaf_module(model: torch.nn.Module) -> bool: @@ -40,18 +40,24 @@ def get_z3_leaf_modules(model: torch.nn.Module) -> List[torch.nn.Module]: return [module for module in model.modules() if z3_leaf_module(module)] -def _do_set_z3_leaf_modules(model: torch.nn.Module, leaf_module_classes: List[Type], +def set_z3_leaf_module(model: torch.nn.Module, flag: bool): + model._z3_leaf = flag + + +def _do_set_z3_leaf_modules(model: torch.nn.Module, leaf_module_classes: Union[List[Type], List[str]], flag: bool) -> List[torch.nn.Module]: - assert all(isinstance(module_class, type) for module_class in leaf_module_classes), \ - f'leaf_module_classes must be a list of types, got {leaf_module_classes}' + assert all(isinstance(module_class, (type, str) ) for module_class in leaf_module_classes), \ + f'leaf_module_classes must be a list of types or names, got {leaf_module_classes}' leaf_modules = [] def _set_z3_leaf_flag(model: torch.nn.Module): nonlocal leaf_modules - if model.__class__ in leaf_module_classes: - model._z3_leaf = flag - leaf_modules.append(model) + for module in leaf_module_classes: + if (isinstance(module, type) and model.__class__ == module) or \ + (isinstance(module, str) and model.__class__.__name__ == module): + model._z3_leaf = flag + leaf_modules.append(model) model.apply(_set_z3_leaf_flag) @@ -61,13 +67,14 @@ def _set_z3_leaf_flag(model: torch.nn.Module): return leaf_modules -def set_z3_leaf_modules(model: torch.nn.Module, leaf_module_classes: List[Type]) -> List[torch.nn.Module]: +def set_z3_leaf_modules(model: torch.nn.Module, leaf_module_classes: Union[List[Type], + List[str]]) -> List[torch.nn.Module]: """Sets a flag within a module in `model` to instruct ZeRO3 to stop setting hooks recursively when it encounters a module class listed in `leaf_module_classes`. This is particularly useful in the context of Mixture of Experts (MoE) models. In MoE models, the computation order of experts varies across forward passes. This variability can disrupt ZeRO3's functionality, as ZeRO3 relies on tracking the computation order of modules to prefetch parameters efficiently. By designating a module as a 'leaf' node, ZeRO3 will prefetch parameters for all child modules upon entering the module. Another scenario where this functionality is beneficial is in models with excessively fine-grained nested modules, where it helps to avoid the overhead associated with hooks. Args: model (torch.nn.Module): The model to which the leaf module flag will be applied. - leaf_module_classes (List[Type]): A list of module classes that should be flagged as 'leaf' modules. + leaf_module_classes (Union[List[Type], List[str]]): A list of module classes that should be flagged as 'leaf' modules. Returns: List[torch.nn.Module]: A list of modules that match the module classes in `leaf_module_classes`. """ @@ -79,7 +86,7 @@ def unset_z3_leaf_modules(model: torch.nn.Module, leaf_module_classes: List[Type See `set_z3_leaf_modules` for more details. Args: model (torch.nn.Module): The model to which the leaf module flag will be applied. - leaf_module_classes (List[Type]): A list of module classes that should be flagged as 'leaf' modules. + leaf_module_classes (Union[List[Type], List[str]]): A list of module classes that should be flagged as 'leaf' modules. Returns: List[torch.nn.Module]: A list of modules that match the module classes in `leaf_module_classes`. """ diff --git a/docs/_pages/config-json.md b/docs/_pages/config-json.md index adb2f1679ea0..51e3bbd6eaaa 100755 --- a/docs/_pages/config-json.md +++ b/docs/_pages/config-json.md @@ -489,6 +489,11 @@ Enabling and configuring ZeRO memory optimizations |--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| ------- | | Consolidate the weights before saving the model by `save_16bit_model()`. Since the weights are partitioned across GPUs, they aren't part of `state_dict`, so this function automatically gathers the weights when this option is enabled and then saves the fp16 model weights. | `False` | +***stage3_module_granularity_threshold***: [integer] +| Description | Default | +|--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| ------- | +| The granularity of a module is determined by the ratio of `parameter_count` / `(1 + descendant_count)`. ZeRO3 classifies modules with a granularity below the threshold as fine-grained, treating them as integral units during parameter fetching. This reduces host and communication overhead from separate hooks. | `0` | + ***zero_hpz_partition_size***: [integer] | Description | Default | diff --git a/tests/unit/runtime/zero/test_zero_leaf_module.py b/tests/unit/runtime/zero/test_zero_leaf_module.py index 1d3b88a04a4e..74c709883645 100644 --- a/tests/unit/runtime/zero/test_zero_leaf_module.py +++ b/tests/unit/runtime/zero/test_zero_leaf_module.py @@ -3,6 +3,7 @@ # DeepSpeed Team +import pytest import deepspeed.comm as dist import torch @@ -12,6 +13,8 @@ import deepspeed from deepspeed.utils import set_z3_leaf_modules, unset_z3_leaf_modules, get_z3_leaf_modules, z3_leaf_module from deepspeed.accelerator import get_accelerator +from torch import nn +import time class ChooseModuleByCounter(torch.nn.Module): @@ -53,6 +56,49 @@ def forward(self, x, y): return x, loss +class MLPBlock(nn.Module): + + def __init__(self, hidden_dim): + super(MLPBlock, self).__init__() + self.gate_proj = nn.Linear(hidden_dim, hidden_dim, bias=False) + self.up_proj = nn.Linear(hidden_dim, hidden_dim, bias=False) + self.down_proj = nn.Linear(hidden_dim, hidden_dim, bias=False) + self.act_fn = nn.GELU() + + def forward(self, x): + return self.down_proj(self.act_fn(self.gate_proj(x)) * self.up_proj(x)) + + +class FineGrainedBlock(nn.Module): + + def __init__(self, hidden_dim, num_block): + super(FineGrainedBlock, self).__init__() + self.num_block = num_block + self.mlp_layers = torch.nn.ModuleList([MLPBlock(hidden_dim=hidden_dim) for _ in range(self.num_block)]) + + def forward(self, x): + for i in range(self.num_block): + x = self.mlp_layers[i](x) + return x + + +class modelWithFineGrainedBlock(nn.Module): + + def __init__(self, hidden_dim, num_block): + super(modelWithFineGrainedBlock, self).__init__() + self.coarse_grained_layer1 = nn.Linear(hidden_dim, 8 * hidden_dim) + self.coarse_grained_layer2 = nn.Linear(8 * hidden_dim, hidden_dim) + self.fine_grained_layer = FineGrainedBlock(hidden_dim, num_block) + self.cel = torch.nn.CrossEntropyLoss() + + def forward(self, x, y): + x = self.coarse_grained_layer1(x) + x = self.coarse_grained_layer2(x) + x = self.fine_grained_layer(x) + loss = self.cel(x, y) + return x, loss + + def run_model(model, config_dict, hidden_dim, dtype, requires_grad): model, _, _, _ = deepspeed.initialize(model=model, model_parameters=model.parameters(), config=config_dict) data_loader = random_dataloader(model=model, @@ -97,9 +143,9 @@ def _test_set_z3_leaf_modules(self, cls, requires_grad): "stage3_max_reuse_distance": 0, } } - if get_accelerator().is_fp16_supported(): + if preferred_dtype() is torch.float16: config_dict["fp16"] = {"enabled": True} - elif get_accelerator().is_bf16_supported(): + elif preferred_dtype() is torch.bfloat16: config_dict["bf16"] = {"enabled": True} model = cls(hidden_dim) @@ -143,3 +189,74 @@ def test_set_no_match_class(self): raise AssertionError("Expected error that no module is set as a leaf module") except ValueError as e: pass + + +@pytest.mark.parametrize("module_granularity_threshold", [0, 100, 12100, 10000000]) +class TestZ3LeafOptimization(DistributedTest): + world_size = 2 + reuse_dist_env = True + + def test_finegrained_optimization(self, module_granularity_threshold: int): + hidden_dim = 128 + num_block = 16 + config_dict = { + "train_micro_batch_size_per_gpu": 1, + "steps_per_print": 1, + "optimizer": { + "type": "Adam", + "params": { + "lr": 1e-6 + } + }, + "zero_optimization": { + "stage": 3, + "stage3_prefetch_bucket_size": hidden_dim**2, + "stage3_param_persistence_threshold": 0, + "stage3_max_reuse_distance": 0, + } + } + if preferred_dtype() is torch.float16: + config_dict["fp16"] = {"enabled": True} + elif preferred_dtype() is torch.bfloat16: + config_dict["bf16"] = {"enabled": True} + + def bench_loss_and_time(config): + warm_up_step = 10 + model = modelWithFineGrainedBlock(hidden_dim, num_block) + model, _, _, _ = deepspeed.initialize(model=model, model_parameters=model.parameters(), config=config) + data_loader = random_dataloader(model=model, + total_samples=20, + hidden_dim=hidden_dim, + device=model.device, + dtype=preferred_dtype()) + dist.barrier() + loss_list = [] + + for i, batch in enumerate(data_loader): + if i == warm_up_step: + dist.barrier() + get_accelerator().synchronize() + start_time = time.time() + batch[0].requires_grad = True + loss = model(batch[0], batch[1]) + loss = loss[1] + loss_list.append(loss) + model.backward(loss) + model.step() + get_accelerator().synchronize() + end_time = time.time() + duration = end_time - start_time + model.destroy() + return loss_list, duration + + baseline_loss_list, baseline_exec_time = bench_loss_and_time(config_dict) + + config_dict["zero_optimization"]["stage3_module_granularity_threshold"] = module_granularity_threshold + loss, duration = bench_loss_and_time(config_dict) + + if dist.get_rank() == 0: + print(f"baseline exec time:", baseline_exec_time) + print( + f"finegrained optimziation exec time: {duration},granularity threshold:{module_granularity_threshold} " + ) + assert baseline_loss_list == loss, f"incorrect loss value with threshold:{module_granularity_threshold}" From b692cdea479fba8201584054d654f639e925a265 Mon Sep 17 00:00:00 2001 From: Joe Mayer <114769929+jomayeri@users.noreply.github.com> Date: Tue, 12 Nov 2024 08:34:17 -0800 Subject: [PATCH 600/754] AIO File Offsets (#6641) Adding the option for a file offset to the read/write functions of AIO & GDS ops. --------- Co-authored-by: jomayeri Co-authored-by: Masahiro Tanaka <81312776+tohtana@users.noreply.github.com> Co-authored-by: Olatunji Ruwase Co-authored-by: Logan Adams <114770087+loadams@users.noreply.github.com> --- accelerator/cpu_accelerator.py | 2 + csrc/aio/common/deepspeed_aio_utils.cpp | 18 ++-- csrc/aio/common/deepspeed_aio_utils.h | 4 +- csrc/aio/py_lib/deepspeed_aio_op_desc.cpp | 6 +- csrc/aio/py_lib/deepspeed_aio_op_desc.h | 4 +- csrc/aio/py_lib/deepspeed_cpu_op.cpp | 19 ++-- csrc/aio/py_lib/deepspeed_cpu_op.h | 3 +- csrc/aio/py_lib/deepspeed_py_aio.cpp | 7 +- csrc/aio/py_lib/deepspeed_py_io_handle.cpp | 65 +++++++++----- csrc/aio/py_lib/deepspeed_py_io_handle.h | 27 ++++-- csrc/aio/py_lib/py_ds_aio.cpp | 24 +++-- csrc/aio/py_test/ds_aio_handle.py | 2 +- csrc/gds/py_lib/deepspeed_gds_op.cpp | 24 +++-- csrc/gds/py_lib/deepspeed_gds_op.h | 3 +- csrc/gds/py_lib/deepspeed_py_gds_handle.cpp | 15 +++- csrc/gds/py_lib/deepspeed_py_gds_handle.h | 3 +- csrc/gds/py_lib/py_ds_gds.cpp | 24 +++-- deepspeed/runtime/swap_tensor/utils.py | 4 +- deepspeed/utils/numa.py | 5 +- tests/unit/ops/aio/test_aio.py | 97 +++++++++++++++++++-- tests/unit/ops/aio/test_gds.py | 87 ++++++++++++++++-- 21 files changed, 342 insertions(+), 101 deletions(-) diff --git a/accelerator/cpu_accelerator.py b/accelerator/cpu_accelerator.py index 1e4335b19292..0e49bd9f6458 100644 --- a/accelerator/cpu_accelerator.py +++ b/accelerator/cpu_accelerator.py @@ -71,6 +71,8 @@ def device_count(self): # In flat mode, HBM is in separate NUMA node with no cores on this node. # Ignore these NUMA nodes with no cores. numa_core_lists = get_numa_cores() + if not numa_core_lists: + return 1 numa_count = 0 prev_core_list = [] for core_list in numa_core_lists: diff --git a/csrc/aio/common/deepspeed_aio_utils.cpp b/csrc/aio/common/deepspeed_aio_utils.cpp index 0536ff6a362e..fb269b58315f 100644 --- a/csrc/aio/common/deepspeed_aio_utils.cpp +++ b/csrc/aio/common/deepspeed_aio_utils.cpp @@ -19,9 +19,14 @@ const int c_io_queue_depth = 8; io_xfer_ctxt::io_xfer_ctxt(const int fd, const int64_t file_offset, + const int64_t buffer_offset, const int64_t num_bytes, const void* buffer) - : _fd(fd), _base_offset(file_offset), _mem_buffer(buffer), _num_bytes(num_bytes) + : _fd(fd), + _file_base_offset(file_offset), + _buffer_base_offset(buffer_offset), + _mem_buffer(buffer), + _num_bytes(num_bytes) { } @@ -41,9 +46,10 @@ void io_prep_context::prep_iocbs(const int n_iocbs, assert(static_cast(n_iocbs) <= _iocbs->size()); for (auto i = 0; i < n_iocbs; ++i) { const auto shift = i * _block_size; - const auto xfer_buffer = (char*)start_buffer + _xfer_ctxt->_base_offset + shift; - const auto xfer_offset = _xfer_ctxt->_base_offset + start_offset + shift; + const auto xfer_buffer = (char*)start_buffer + _xfer_ctxt->_buffer_base_offset + shift; + const auto xfer_offset = _xfer_ctxt->_file_base_offset + start_offset + shift; auto byte_count = _block_size; + if ((shift + _block_size) > num_bytes) { byte_count = num_bytes - shift; } if (_read_op) { @@ -79,10 +85,10 @@ int io_prep_generator::prep_iocbs(const int n_iocbs, std::vector* auto actual_n_iocbs = min(static_cast(n_iocbs), _remaining_io_blocks); for (auto i = 0; i < actual_n_iocbs; ++i, ++_next_iocb_index) { - const auto xfer_offset = _xfer_ctxt->_base_offset + (_next_iocb_index * _block_size); - const auto xfer_buffer = (char*)_xfer_ctxt->_mem_buffer + xfer_offset; + const auto xfer_buffer = (char*)_xfer_ctxt->_mem_buffer + _xfer_ctxt->_buffer_base_offset + + (_next_iocb_index * _block_size); + const auto xfer_offset = _xfer_ctxt->_file_base_offset + (_next_iocb_index * _block_size); const auto num_bytes = min(static_cast(_block_size), _remaining_bytes); - if (_read_op) { io_prep_pread(iocbs->at(i), _xfer_ctxt->_fd, xfer_buffer, num_bytes, xfer_offset); } else { diff --git a/csrc/aio/common/deepspeed_aio_utils.h b/csrc/aio/common/deepspeed_aio_utils.h index 20e81fe8eebd..6b7599acecb4 100644 --- a/csrc/aio/common/deepspeed_aio_utils.h +++ b/csrc/aio/common/deepspeed_aio_utils.h @@ -30,12 +30,14 @@ Functionality for swapping optimizer tensors to/from (NVMe) storage devices. struct io_xfer_ctxt { const int _fd; - const int64_t _base_offset; + const int64_t _file_base_offset; + const int64_t _buffer_base_offset; const void* _mem_buffer; const int64_t _num_bytes; io_xfer_ctxt(const int fd, const int64_t file_offset, + const int64_t buffer_offset, const int64_t num_bytes, const void* buffer); }; diff --git a/csrc/aio/py_lib/deepspeed_aio_op_desc.cpp b/csrc/aio/py_lib/deepspeed_aio_op_desc.cpp index 6f311c5400c7..945251397225 100644 --- a/csrc/aio/py_lib/deepspeed_aio_op_desc.cpp +++ b/csrc/aio/py_lib/deepspeed_aio_op_desc.cpp @@ -13,14 +13,16 @@ io_op_desc_t::io_op_desc_t(const bool read_op, const char* filename, const int64_t file_num_bytes, const int intra_op_parallelism, - const bool validate) + const bool validate, + const int64_t file_offset) : _read_op(read_op), _buffer(buffer), _fd(fd), _filename(filename), _file_num_bytes(file_num_bytes), + _file_offset(file_offset), _intra_op_parallelism(intra_op_parallelism), - _num_bytes_per_thread(file_num_bytes / intra_op_parallelism), + _num_bytes_per_thread(static_cast(buffer.nbytes()) / intra_op_parallelism), _validate(validate) { } diff --git a/csrc/aio/py_lib/deepspeed_aio_op_desc.h b/csrc/aio/py_lib/deepspeed_aio_op_desc.h index f841b8ce520a..ac1cdf90f78b 100644 --- a/csrc/aio/py_lib/deepspeed_aio_op_desc.h +++ b/csrc/aio/py_lib/deepspeed_aio_op_desc.h @@ -19,6 +19,7 @@ struct io_op_desc_t { const int64_t _num_bytes_per_thread; torch::Tensor _contiguous_buffer; const bool _validate; + const int64_t _file_offset; io_op_desc_t(const bool read_op, const torch::Tensor& buffer, @@ -26,7 +27,8 @@ struct io_op_desc_t { const char* filename, const int64_t file_num_bytes, const int intra_op_parallelism, - const bool validate); + const bool validate, + const int64_t file_offset); virtual void run(const int tid, std::unique_ptr& aio_ctxt, diff --git a/csrc/aio/py_lib/deepspeed_cpu_op.cpp b/csrc/aio/py_lib/deepspeed_cpu_op.cpp index da2ff568d74b..56fb33fb1886 100644 --- a/csrc/aio/py_lib/deepspeed_cpu_op.cpp +++ b/csrc/aio/py_lib/deepspeed_cpu_op.cpp @@ -16,8 +16,16 @@ cpu_op_desc_t::cpu_op_desc_t( const char* filename, const int64_t file_num_bytes, const int intra_op_parallelism, - const bool validate) - : io_op_desc_t(read_op, buffer, fd, filename, file_num_bytes, intra_op_parallelism, validate), + const bool validate, + const int64_t file_offset) + : io_op_desc_t(read_op, + buffer, + fd, + filename, + file_num_bytes, + intra_op_parallelism, + validate, + file_offset), _cpu_buffer(buffer), _pinned_tensor_mgr(pinned_tensor_mgr), _is_managed_bounce_buffer(false) @@ -66,10 +74,11 @@ void cpu_op_desc_t::run(const int tid, deepspeed_aio_config_t* aio_config) { assert(tid < _intra_op_parallelism); - const auto base_offset = _num_bytes_per_thread * tid; + const auto buffer_base_offset = _num_bytes_per_thread * tid; + const auto file_base_offset = _file_offset + (_num_bytes_per_thread * tid); - std::unique_ptr xfer_ctxt( - new io_xfer_ctxt(_fd, base_offset, _num_bytes_per_thread, data_ptr())); + std::unique_ptr xfer_ctxt(new io_xfer_ctxt( + _fd, file_base_offset, buffer_base_offset, _num_bytes_per_thread, data_ptr())); if (aio_config->_overlap_events) { do_aio_operation_overlap(_read_op, aio_ctxt, xfer_ctxt, aio_config, nullptr); diff --git a/csrc/aio/py_lib/deepspeed_cpu_op.h b/csrc/aio/py_lib/deepspeed_cpu_op.h index 9de2fa254048..debaf4a90731 100644 --- a/csrc/aio/py_lib/deepspeed_cpu_op.h +++ b/csrc/aio/py_lib/deepspeed_cpu_op.h @@ -20,7 +20,8 @@ struct cpu_op_desc_t : io_op_desc_t { const char* filename, const int64_t file_num_bytes, const int intra_op_parallelism, - const bool validate); + const bool validate, + const int64_t file_offset); void run(const int tid, std::unique_ptr& aio_ctxt, diff --git a/csrc/aio/py_lib/deepspeed_py_aio.cpp b/csrc/aio/py_lib/deepspeed_py_aio.cpp index 02b04057d1ac..1ff0397043fa 100644 --- a/csrc/aio/py_lib/deepspeed_py_aio.cpp +++ b/csrc/aio/py_lib/deepspeed_py_aio.cpp @@ -52,7 +52,9 @@ int deepspeed_py_aio_write(const torch::Tensor& buffer, auto write_buffer = (char*)buffer.data_ptr(); const auto num_write_bytes = static_cast(buffer.nbytes()); - std::unique_ptr xfer_ctxt(new io_xfer_ctxt(fd, 0, num_write_bytes, write_buffer)); + + std::unique_ptr xfer_ctxt( + new io_xfer_ctxt(fd, 0, 0, num_write_bytes, write_buffer)); std::unique_ptr aio_ctxt(new aio_context(config._block_size, config._queue_depth)); if (config._overlap_events) { @@ -97,7 +99,8 @@ int deepspeed_py_aio_read(torch::Tensor& buffer, auto read_buffer = (char*)buffer.data_ptr(); assert(static_cast(buffer.nbytes()) == num_file_bytes); - std::unique_ptr xfer_ctxt(new io_xfer_ctxt(fd, 0, num_file_bytes, read_buffer)); + std::unique_ptr xfer_ctxt( + new io_xfer_ctxt(fd, 0, 0, num_file_bytes, read_buffer)); std::unique_ptr aio_ctxt(new aio_context(config._block_size, config._queue_depth)); if (config._overlap_events) { diff --git a/csrc/aio/py_lib/deepspeed_py_io_handle.cpp b/csrc/aio/py_lib/deepspeed_py_io_handle.cpp index 48ea8a1339d4..64d7c2e0541e 100644 --- a/csrc/aio/py_lib/deepspeed_py_io_handle.cpp +++ b/csrc/aio/py_lib/deepspeed_py_io_handle.cpp @@ -58,7 +58,10 @@ const bool deepspeed_io_handle_t::get_overlap_events() const { return _overlap_e const int deepspeed_io_handle_t::get_intra_op_parallelism() const { return _intra_op_parallelism; } -int deepspeed_io_handle_t::read(torch::Tensor& buffer, const char* filename, const bool validate) +int deepspeed_io_handle_t::read(torch::Tensor& buffer, + const char* filename, + const bool validate, + const int64_t file_offset) { const auto start_time = std::chrono::high_resolution_clock::now(); @@ -76,7 +79,8 @@ int deepspeed_io_handle_t::read(torch::Tensor& buffer, const char* filename, con if (fd == -1) { return -1; } auto read_buffer = (char*)buffer.data_ptr(); - std::unique_ptr xfer_ctxt(new io_xfer_ctxt(fd, 0, num_file_bytes, read_buffer)); + std::unique_ptr xfer_ctxt( + new io_xfer_ctxt(fd, file_offset, 0, num_file_bytes, read_buffer)); if (_aio_config._overlap_events) { do_aio_operation_overlap(true, _aio_ctxt, xfer_ctxt, &_aio_config, nullptr); @@ -98,7 +102,8 @@ int deepspeed_io_handle_t::read(torch::Tensor& buffer, const char* filename, con int deepspeed_io_handle_t::write(const torch::Tensor& buffer, const char* filename, - const bool validate) + const bool validate, + const int64_t file_offset) { assert(_aio_ctxt); @@ -109,7 +114,8 @@ int deepspeed_io_handle_t::write(const torch::Tensor& buffer, auto write_buffer = (char*)buffer.data_ptr(); const auto num_write_bytes = static_cast(buffer.nbytes()); - std::unique_ptr xfer_ctxt(new io_xfer_ctxt(fd, 0, num_write_bytes, write_buffer)); + std::unique_ptr xfer_ctxt( + new io_xfer_ctxt(fd, file_offset, 0, num_write_bytes, write_buffer)); if (_aio_config._overlap_events) { do_aio_operation_overlap(false, _aio_ctxt, xfer_ctxt, &_aio_config, nullptr); @@ -206,7 +212,8 @@ std::shared_ptr deepspeed_io_handle_t::_create_io_op_desc( const int fd, const char* filename, const int64_t file_num_bytes, - const bool validate) + const bool validate, + const int64_t file_offset) { return std::make_shared(read_op, buffer, @@ -215,13 +222,15 @@ std::shared_ptr deepspeed_io_handle_t::_create_io_op_desc( filename, file_num_bytes, _intra_op_parallelism, - validate); + validate, + file_offset); } int deepspeed_io_handle_t::pread(const torch::Tensor& buffer, const char* filename, const bool validate, - const bool async) + const bool async, + const int64_t file_offset) { int64_t num_file_bytes; if (-1 == get_file_size(filename, num_file_bytes)) { @@ -229,20 +238,18 @@ int deepspeed_io_handle_t::pread(const torch::Tensor& buffer, report_file_error(filename, " fstat for read", error_code); return -1; } + + // buffer can exceed file size to enable 4k alignment const auto buffer_bytes = static_cast(buffer.nbytes()); - if (buffer_bytes != num_file_bytes) { - std::cout << filename << ": buffer nbytes != file bytes " << buffer_bytes - << " != " << num_file_bytes << std::endl; - } - assert(buffer_bytes == num_file_bytes); assert((num_file_bytes % _intra_op_parallelism) == 0); - if (!_is_valid_parallel_aio_op(true, num_file_bytes)) { return -1; } + if (!_is_valid_parallel_aio_op(true, buffer_bytes)) { return -1; } const auto fd = open_file(filename, true); if (fd == -1) { return -1; } - auto scheduled_op = _create_io_op_desc(true, buffer, fd, filename, num_file_bytes, validate); + auto scheduled_op = + _create_io_op_desc(true, buffer, fd, filename, num_file_bytes, validate, file_offset); _schedule_aio_work(scheduled_op); @@ -254,7 +261,8 @@ int deepspeed_io_handle_t::pread(const torch::Tensor& buffer, int deepspeed_io_handle_t::pwrite(const torch::Tensor& buffer, const char* filename, const bool validate, - const bool async) + const bool async, + const int64_t file_offset) { const auto num_write_bytes = static_cast(buffer.nbytes()); assert((num_write_bytes % _intra_op_parallelism) == 0); @@ -264,7 +272,8 @@ int deepspeed_io_handle_t::pwrite(const torch::Tensor& buffer, const auto fd = open_file(filename, false); if (fd == -1) { return -1; } - auto scheduled_op = _create_io_op_desc(false, buffer, fd, filename, num_write_bytes, validate); + auto scheduled_op = + _create_io_op_desc(false, buffer, fd, filename, num_write_bytes, validate, file_offset); _schedule_aio_work(scheduled_op); @@ -273,24 +282,32 @@ int deepspeed_io_handle_t::pwrite(const torch::Tensor& buffer, return wait(); } -int deepspeed_io_handle_t::sync_pread(torch::Tensor& buffer, const char* filename) +int deepspeed_io_handle_t::sync_pread(torch::Tensor& buffer, + const char* filename, + const int64_t file_offset) { - return pread(buffer, filename, false, false); + return pread(buffer, filename, false, false, file_offset); } -int deepspeed_io_handle_t::sync_pwrite(const torch::Tensor& buffer, const char* filename) +int deepspeed_io_handle_t::sync_pwrite(const torch::Tensor& buffer, + const char* filename, + const int64_t file_offset) { - return pwrite(buffer, filename, false, false); + return pwrite(buffer, filename, false, false, file_offset); } -int deepspeed_io_handle_t::async_pread(torch::Tensor& buffer, const char* filename) +int deepspeed_io_handle_t::async_pread(torch::Tensor& buffer, + const char* filename, + const int64_t file_offset) { - return pread(buffer, filename, false, true); + return pread(buffer, filename, false, true, file_offset); } -int deepspeed_io_handle_t::async_pwrite(const torch::Tensor& buffer, const char* filename) +int deepspeed_io_handle_t::async_pwrite(const torch::Tensor& buffer, + const char* filename, + const int64_t file_offset) { - return pwrite(buffer, filename, false, true); + return pwrite(buffer, filename, false, true, file_offset); } at::Tensor deepspeed_io_handle_t::new_cpu_locked_tensor(const int64_t num_elem, diff --git a/csrc/aio/py_lib/deepspeed_py_io_handle.h b/csrc/aio/py_lib/deepspeed_py_io_handle.h index 4fedf8080818..dfcb4125ab9a 100644 --- a/csrc/aio/py_lib/deepspeed_py_io_handle.h +++ b/csrc/aio/py_lib/deepspeed_py_io_handle.h @@ -38,27 +38,35 @@ struct deepspeed_io_handle_t { const bool get_overlap_events() const; const int get_intra_op_parallelism() const; - int read(torch::Tensor& buffer, const char* filename, const bool validate); + int read(torch::Tensor& buffer, + const char* filename, + const bool validate, + const int64_t file_offset); - int write(const torch::Tensor& buffer, const char* filename, const bool validate); + int write(const torch::Tensor& buffer, + const char* filename, + const bool validate, + const int64_t file_offset); int pread(const torch::Tensor& buffer, const char* filename, const bool validate, - const bool async); + const bool async, + const int64_t file_offset); int pwrite(const torch::Tensor& buffer, const char* filename, const bool validate, - const bool async); + const bool async, + const int64_t file_offset); - int sync_pread(torch::Tensor& buffer, const char* filename); + int sync_pread(torch::Tensor& buffer, const char* filename, const int64_t file_offset); - int sync_pwrite(const torch::Tensor& buffer, const char* filename); + int sync_pwrite(const torch::Tensor& buffer, const char* filename, const int64_t file_offset); - int async_pread(torch::Tensor& buffer, const char* filename); + int async_pread(torch::Tensor& buffer, const char* filename, const int64_t file_offset); - int async_pwrite(const torch::Tensor& buffer, const char* filename); + int async_pwrite(const torch::Tensor& buffer, const char* filename, const int64_t file_offset); // TODO: Make API's args to be shape and dtype. torch::Tensor new_cpu_locked_tensor(const int64_t num_elem, @@ -81,5 +89,6 @@ struct deepspeed_io_handle_t { const int fd, const char* filename, const int64_t file_num_bytes, - const bool validate); + const bool validate, + const int64_t file_offset); }; diff --git a/csrc/aio/py_lib/py_ds_aio.cpp b/csrc/aio/py_lib/py_ds_aio.cpp index b80fa2d6c8e6..bf298b691b81 100644 --- a/csrc/aio/py_lib/py_ds_aio.cpp +++ b/csrc/aio/py_lib/py_ds_aio.cpp @@ -40,14 +40,16 @@ PYBIND11_MODULE(TORCH_EXTENSION_NAME, m) "Synchronous and non-parallel file read. Returns count of completed read ops", "buffer"_a, "filename"_a, - "validate"_a) + "validate"_a, + "file_offset"_a = 0) .def("write", &deepspeed_aio_handle_t::write, "Synchronous and non-parallel file write. Returns count of completed write ops", "buffer"_a, "filename"_a, - "validate"_a) + "validate"_a, + "file_offset"_a = 0) .def("pread", &deepspeed_aio_handle_t::pread, @@ -55,7 +57,8 @@ PYBIND11_MODULE(TORCH_EXTENSION_NAME, m) "buffer"_a, "filename"_a, "validate"_a, - "async"_a) + "async"_a, + "file_offset"_a = 0) .def("pwrite", &deepspeed_aio_handle_t::pwrite, @@ -63,33 +66,38 @@ PYBIND11_MODULE(TORCH_EXTENSION_NAME, m) "buffer"_a, "filename"_a, "validate"_a, - "async"_a) + "async"_a, + "file_offset"_a = 0) .def("sync_pread", &deepspeed_aio_handle_t::sync_pread, "Synchrononous parallel file read. Returns count of completed read ops", "buffer"_a, - "filename"_a) + "filename"_a, + "file_offset"_a = 0) .def("sync_pwrite", &deepspeed_aio_handle_t::sync_pwrite, "Synchronous parallel file write. Returns count of completed write ops", "buffer"_a, - "filename"_a) + "filename"_a, + "file_offset"_a = 0) .def("async_pread", &deepspeed_aio_handle_t::async_pread, "Asynchronous parallel file read. Returns 0 on success. Returns 0 on success, and " "following wait() returns count of completed ops.", "buffer"_a, - "filename"_a) + "filename"_a, + "file_offset"_a = 0) .def("async_pwrite", &deepspeed_aio_handle_t::async_pwrite, "Asynchronous parallel file write. Returns 0 on success, and following wait() returns " "count of completed ops.", "buffer"_a, - "filename"_a) + "filename"_a, + "file_offset"_a = 0) .def("new_cpu_locked_tensor", &deepspeed_aio_handle_t::new_cpu_locked_tensor, diff --git a/csrc/aio/py_test/ds_aio_handle.py b/csrc/aio/py_test/ds_aio_handle.py index f4a179deb9ec..6913e9090bf5 100755 --- a/csrc/aio/py_test/ds_aio_handle.py +++ b/csrc/aio/py_test/ds_aio_handle.py @@ -92,7 +92,7 @@ def main_parallel_read(pool_params): start_time = time.time() dest_buffer = BOUNCE_BUFFER if ctxt[BOUNCE_BUFFER] is not None else BUFFER - ret = handle.pread(ctxt[dest_buffer], ctxt['file'], args.validate, True) + ret = handle.pread(ctxt[dest_buffer], ctxt['file'], args.validate, 0, True) assert ret != -1 handle.wait() if dest_buffer == BOUNCE_BUFFER: diff --git a/csrc/gds/py_lib/deepspeed_gds_op.cpp b/csrc/gds/py_lib/deepspeed_gds_op.cpp index f49f74394374..b7055c8cc72b 100644 --- a/csrc/gds/py_lib/deepspeed_gds_op.cpp +++ b/csrc/gds/py_lib/deepspeed_gds_op.cpp @@ -95,8 +95,16 @@ gds_op_desc_t::gds_op_desc_t(const bool read_op, const char* filename, const int64_t file_num_bytes, const int intra_op_parallelism, - const bool validate) - : io_op_desc_t(read_op, buffer, fd, filename, file_num_bytes, intra_op_parallelism, validate) + const bool validate, + const int64_t file_offset) + : io_op_desc_t(read_op, + buffer, + fd, + filename, + file_num_bytes, + intra_op_parallelism, + validate, + file_offset) { _contiguous_buffer = _buffer.contiguous(); const int64_t device = _buffer.get_device(); @@ -124,17 +132,17 @@ void gds_op_desc_t::run(const int tid, { assert(tid < _intra_op_parallelism); check_cudaruntimecall(cudaSetDevice(_buffer.get_device())); - int64_t buf_offset = data_ptr() + (_num_bytes_per_thread * tid) - (char*)_base_ptr; - const auto file_offset = _num_bytes_per_thread * tid; + const auto buf_offset = data_ptr() + (_num_bytes_per_thread * tid) - (char*)_base_ptr; + const auto tid_file_offset = _file_offset + (_num_bytes_per_thread * tid); if (_read_op) { auto ret = - cuFileRead(_cf_handle, _base_ptr, _num_bytes_per_thread, file_offset, buf_offset); - if (ret < 0) { _report_error(ret, errno, buf_offset); } + cuFileRead(_cf_handle, _base_ptr, _num_bytes_per_thread, tid_file_offset, buf_offset); + if (ret < 0) { _report_error(ret, errno, tid_file_offset); } } else { auto ret = - cuFileWrite(_cf_handle, _base_ptr, _num_bytes_per_thread, file_offset, buf_offset); - if (ret < 0) { _report_error(ret, errno, buf_offset); } + cuFileWrite(_cf_handle, _base_ptr, _num_bytes_per_thread, tid_file_offset, buf_offset); + if (ret < 0) { _report_error(ret, errno, tid_file_offset); } } } diff --git a/csrc/gds/py_lib/deepspeed_gds_op.h b/csrc/gds/py_lib/deepspeed_gds_op.h index 380bb0b9b6ae..d955527b1ba3 100644 --- a/csrc/gds/py_lib/deepspeed_gds_op.h +++ b/csrc/gds/py_lib/deepspeed_gds_op.h @@ -24,7 +24,8 @@ struct gds_op_desc_t : io_op_desc_t { const char* filename, const int64_t file_num_bytes, const int intra_op_parallelism, - const bool validate); + const bool validate, + const int64_t file_offset); void run(const int tid, std::unique_ptr& aio_ctxt, diff --git a/csrc/gds/py_lib/deepspeed_py_gds_handle.cpp b/csrc/gds/py_lib/deepspeed_py_gds_handle.cpp index c052144a0190..f11245c75a5e 100644 --- a/csrc/gds/py_lib/deepspeed_py_gds_handle.cpp +++ b/csrc/gds/py_lib/deepspeed_py_gds_handle.cpp @@ -107,12 +107,19 @@ std::shared_ptr deepspeed_gds_handle_t::_create_io_op_desc( const int fd, const char* filename, const int64_t file_num_bytes, - const bool validate) + const bool validate, + const int64_t file_offset) { if (buffer.is_cuda()) { - return std::make_shared( - read_op, buffer, fd, filename, file_num_bytes, _intra_op_parallelism, validate); + return std::make_shared(read_op, + buffer, + fd, + filename, + file_num_bytes, + _intra_op_parallelism, + validate, + file_offset); } return deepspeed_io_handle_t::_create_io_op_desc( - read_op, buffer, fd, filename, file_num_bytes, validate); + read_op, buffer, fd, filename, file_num_bytes, validate, file_offset); } diff --git a/csrc/gds/py_lib/deepspeed_py_gds_handle.h b/csrc/gds/py_lib/deepspeed_py_gds_handle.h index 131e83e7b838..25f68e177b2c 100644 --- a/csrc/gds/py_lib/deepspeed_py_gds_handle.h +++ b/csrc/gds/py_lib/deepspeed_py_gds_handle.h @@ -42,7 +42,8 @@ struct deepspeed_gds_handle_t : deepspeed_io_handle_t { const int fd, const char* filename, const int64_t file_num_bytes, - const bool validate); + const bool validate, + const int64_t file_offset); static int s_cuFile_init; }; diff --git a/csrc/gds/py_lib/py_ds_gds.cpp b/csrc/gds/py_lib/py_ds_gds.cpp index 57bf8d2207c4..2f165ee2c32a 100644 --- a/csrc/gds/py_lib/py_ds_gds.cpp +++ b/csrc/gds/py_lib/py_ds_gds.cpp @@ -33,14 +33,16 @@ PYBIND11_MODULE(TORCH_EXTENSION_NAME, m) "Synchronous and non-parallel file read. Returns count of completed read ops", "buffer"_a, "filename"_a, - "validate"_a) + "validate"_a, + "file_offset"_a = 0) .def("write", &deepspeed_gds_handle_t::write, "Synchronous and non-parallel file write. Returns count of completed write ops", "buffer"_a, "filename"_a, - "validate"_a) + "validate"_a, + "file_offset"_a = 0) .def("pread", &deepspeed_gds_handle_t::pread, @@ -48,7 +50,8 @@ PYBIND11_MODULE(TORCH_EXTENSION_NAME, m) "buffer"_a, "filename"_a, "validate"_a, - "async"_a) + "async"_a, + "file_offset"_a = 0) .def("pwrite", &deepspeed_gds_handle_t::pwrite, @@ -56,33 +59,38 @@ PYBIND11_MODULE(TORCH_EXTENSION_NAME, m) "buffer"_a, "filename"_a, "validate"_a, - "async"_a) + "async"_a, + "file_offset"_a = 0) .def("sync_pread", &deepspeed_gds_handle_t::sync_pread, "Synchrononous parallel file read. Returns count of completed read ops", "buffer"_a, - "filename"_a) + "filename"_a, + "file_offset"_a = 0) .def("sync_pwrite", &deepspeed_gds_handle_t::sync_pwrite, "Synchronous parallel file write. Returns count of completed write ops", "buffer"_a, - "filename"_a) + "filename"_a, + "file_offset"_a = 0) .def("async_pread", &deepspeed_gds_handle_t::async_pread, "Asynchronous parallel file read. Returns 0 on success. Returns 0 on success, and " "following wait() returns count of completed ops.", "buffer"_a, - "filename"_a) + "filename"_a, + "file_offset"_a = 0) .def("async_pwrite", &deepspeed_gds_handle_t::async_pwrite, "Asynchronous parallel file write. Returns 0 on success, and following wait() returns " "count of completed ops.", "buffer"_a, - "filename"_a) + "filename"_a, + "file_offset"_a = 0) .def("new_cpu_locked_tensor", &deepspeed_gds_handle_t::new_cpu_locked_tensor, diff --git a/deepspeed/runtime/swap_tensor/utils.py b/deepspeed/runtime/swap_tensor/utils.py index 90b2d9b8bd31..1f9825c34638 100644 --- a/deepspeed/runtime/swap_tensor/utils.py +++ b/deepspeed/runtime/swap_tensor/utils.py @@ -18,12 +18,12 @@ def swap_in_tensors(swap_handle, tensor_buffers, swap_paths): for buffer, path in zip(tensor_buffers, swap_paths): - assert (swap_handle.async_pread(buffer, path) == 0) + assert (swap_handle.async_pread(buffer, path, 0) == 0) def swap_out_tensors(swap_handle, tensor_buffers, swap_paths): for buffer, path in zip(tensor_buffers, swap_paths): - assert (swap_handle.async_pwrite(buffer, path) == 0) + assert (swap_handle.async_pwrite(buffer, path, 0) == 0) def print_object(obj, name, exclude_list=[]): diff --git a/deepspeed/utils/numa.py b/deepspeed/utils/numa.py index 4fe7cbba90ae..aba3b5179d41 100644 --- a/deepspeed/utils/numa.py +++ b/deepspeed/utils/numa.py @@ -23,7 +23,10 @@ # ] def get_numa_cores(): ret = [] - output = subprocess.check_output(['numactl', '--hardware']).decode("utf-8") + try: + output = subprocess.check_output(['numactl', '--hardware']).decode("utf-8") + except: + return [] lines = output.split('\n') for line in lines: if line.startswith('available:'): diff --git a/tests/unit/ops/aio/test_aio.py b/tests/unit/ops/aio/test_aio.py index a074cfca317f..1aa5f647a8aa 100644 --- a/tests/unit/ops/aio/test_aio.py +++ b/tests/unit/ops/aio/test_aio.py @@ -35,16 +35,21 @@ def _get_local_rank(): return 0 -def _do_ref_write(tmpdir, index=0): +def _do_ref_write(tmpdir, index=0, file_size=IO_SIZE): file_suffix = f'{_get_local_rank()}_{index}' ref_file = os.path.join(tmpdir, f'_py_random_{file_suffix}.pt') - ref_buffer = os.urandom(IO_SIZE) + ref_buffer = os.urandom(file_size) with open(ref_file, 'wb') as f: f.write(ref_buffer) return ref_file, ref_buffer +def _get_file_path(tmpdir, file_prefix, index=0): + file_suffix = f'{_get_local_rank()}_{index}' + return os.path.join(tmpdir, f'{file_prefix}_{file_suffix}.pt') + + def _get_test_write_file(tmpdir, index): file_suffix = f'{_get_local_rank()}_{index}' return os.path.join(tmpdir, f'_aio_write_random_{file_suffix}.pt') @@ -103,7 +108,7 @@ def test_parallel_read(self, tmpdir, use_cuda_pinned_tensor, single_submit, over _validate_handle_state(h, single_submit, overlap_events) ref_file, _ = _do_ref_write(tmpdir) - read_status = h.sync_pread(aio_buffer, ref_file) + read_status = h.sync_pread(aio_buffer, ref_file, 0) assert read_status == 1 with open(ref_file, 'rb') as f: @@ -131,7 +136,7 @@ def test_async_read(self, tmpdir, use_cuda_pinned_tensor, single_submit, overlap _validate_handle_state(h, single_submit, overlap_events) ref_file, _ = _do_ref_write(tmpdir) - read_status = h.async_pread(aio_buffer, ref_file) + read_status = h.async_pread(aio_buffer, ref_file, 0) assert read_status == 0 wait_status = h.wait() @@ -172,7 +177,7 @@ def test_parallel_write(self, tmpdir, use_cuda_pinned_tensor, single_submit, ove _validate_handle_state(h, single_submit, overlap_events) - write_status = h.sync_pwrite(aio_buffer, aio_file) + write_status = h.sync_pwrite(aio_buffer, aio_file, 0) assert write_status == 1 if not use_cuda_pinned_tensor: @@ -201,7 +206,7 @@ def test_async_write(self, tmpdir, use_cuda_pinned_tensor, single_submit, overla _validate_handle_state(h, single_submit, overlap_events) - write_status = h.async_pwrite(aio_buffer, aio_file) + write_status = h.async_pwrite(aio_buffer, aio_file, 0) assert write_status == 0 wait_status = h.wait() @@ -258,7 +263,7 @@ def test_read(self, tmpdir, async_queue, use_cuda_pinned_tensor, use_unpinned_te _validate_handle_state(h, single_submit, overlap_events) for i in range(async_queue): - read_status = h.async_pread(aio_buffers[i], ref_files[i]) + read_status = h.async_pread(aio_buffers[i], ref_files[i], 0) assert read_status == 0 wait_status = h.wait() @@ -305,7 +310,7 @@ def test_write(self, tmpdir, use_cuda_pinned_tensor, async_queue, use_unpinned_t _validate_handle_state(h, single_submit, overlap_events) for i in range(async_queue): - read_status = h.async_pwrite(aio_buffers[i], aio_files[i]) + read_status = h.async_pwrite(aio_buffers[i], aio_files[i], 0) assert read_status == 0 wait_status = h.wait() @@ -320,3 +325,79 @@ def test_write(self, tmpdir, use_cuda_pinned_tensor, async_queue, use_unpinned_t filecmp.clear_cache() assert filecmp.cmp(ref_files[i], aio_files[i], shallow=False) + + +@pytest.mark.parametrize("use_cuda_pinned_tensor", [True, False]) +@pytest.mark.parametrize('file_partitions', [[1, 1, 1], [1, 1, 2], [1, 2, 1], [2, 1, 1]]) +class TestAsyncFileOffset(DistributedTest): + world_size = 1 + + def test_offset_write(self, tmpdir, file_partitions, use_cuda_pinned_tensor): + + _skip_for_invalid_environment(use_cuda_pinned_tensor=use_cuda_pinned_tensor) + ref_file = _get_file_path(tmpdir, '_py_random') + aio_file = _get_file_path(tmpdir, '_aio_random') + partition_unit_size = BLOCK_SIZE + file_size = sum(file_partitions) * partition_unit_size + + h = AsyncIOBuilder().load().aio_handle(BLOCK_SIZE, QUEUE_DEPTH, True, True, IO_PARALLEL) + + if use_cuda_pinned_tensor: + data_buffer = torch.ByteTensor(list(os.urandom(file_size))).pin_memory() + else: + data_buffer = h.new_cpu_locked_tensor(file_size, torch.empty(0, dtype=torch.uint8)) + + file_offsets = [] + next_offset = 0 + for i in range(len(file_partitions)): + file_offsets.append(next_offset) + next_offset += file_partitions[i] * partition_unit_size + + ref_fd = open(ref_file, 'wb') + for i in range(len(file_partitions)): + src_buffer = torch.narrow(data_buffer, 0, file_offsets[i], file_partitions[i] * partition_unit_size) + + ref_fd.write(src_buffer.numpy().tobytes()) + ref_fd.flush() + + assert 1 == h.sync_pwrite(buffer=src_buffer, filename=aio_file, file_offset=file_offsets[i]) + + filecmp.clear_cache() + assert filecmp.cmp(ref_file, aio_file, shallow=False) + + ref_fd.close() + + if not use_cuda_pinned_tensor: + h.free_cpu_locked_tensor(data_buffer) + + def test_offset_read(self, tmpdir, file_partitions, use_cuda_pinned_tensor): + + _skip_for_invalid_environment(use_cuda_pinned_tensor=use_cuda_pinned_tensor) + partition_unit_size = BLOCK_SIZE + file_size = sum(file_partitions) * partition_unit_size + ref_file, _ = _do_ref_write(tmpdir, 0, file_size) + h = AsyncIOBuilder().load().aio_handle(BLOCK_SIZE, QUEUE_DEPTH, True, True, IO_PARALLEL) + + if use_cuda_pinned_tensor: + data_buffer = torch.zeros(file_size, dtype=torch.uint8, device='cpu').pin_memory() + else: + data_buffer = h.new_cpu_locked_tensor(file_size, torch.empty(0, dtype=torch.uint8)) + + file_offsets = [] + next_offset = 0 + for i in range(len(file_partitions)): + file_offsets.append(next_offset) + next_offset += file_partitions[i] * partition_unit_size + + with open(ref_file, 'rb') as ref_fd: + for i in range(len(file_partitions)): + ref_fd.seek(file_offsets[i]) + bytes_to_read = file_partitions[i] * partition_unit_size + ref_buf = list(ref_fd.read(bytes_to_read)) + + dst_tensor = torch.narrow(data_buffer, 0, 0, bytes_to_read) + assert 1 == h.sync_pread(dst_tensor, ref_file, file_offsets[i]) + assert dst_tensor.tolist() == ref_buf + + if not use_cuda_pinned_tensor: + h.free_cpu_locked_tensor(data_buffer) diff --git a/tests/unit/ops/aio/test_gds.py b/tests/unit/ops/aio/test_gds.py index e94d42cd22af..d97eff452eb5 100644 --- a/tests/unit/ops/aio/test_gds.py +++ b/tests/unit/ops/aio/test_gds.py @@ -29,16 +29,21 @@ def _get_local_rank(): return 0 -def _do_ref_write(tmpdir, index=0): +def _do_ref_write(tmpdir, index=0, file_size=IO_SIZE): file_suffix = f'{_get_local_rank()}_{index}' ref_file = os.path.join(tmpdir, f'_py_random_{file_suffix}.pt') - ref_buffer = os.urandom(IO_SIZE) + ref_buffer = os.urandom(file_size) with open(ref_file, 'wb') as f: f.write(ref_buffer) return ref_file, ref_buffer +def _get_file_path(tmpdir, file_prefix, index=0): + file_suffix = f'{_get_local_rank()}_{index}' + return os.path.join(tmpdir, f'{file_prefix}_{file_suffix}.pt') + + def _get_test_write_file(tmpdir, index): file_suffix = f'{_get_local_rank()}_{index}' return os.path.join(tmpdir, f'_gds_write_random_{file_suffix}.pt') @@ -78,7 +83,7 @@ def test_parallel_read(self, tmpdir, single_submit, overlap_events): _validate_handle_state(h, single_submit, overlap_events) ref_file, _ = _do_ref_write(tmpdir) - read_status = h.sync_pread(gds_buffer, ref_file) + read_status = h.sync_pread(gds_buffer, ref_file, 0) assert read_status == 1 with open(ref_file, 'rb') as f: @@ -97,7 +102,7 @@ def test_async_read(self, tmpdir, single_submit, overlap_events): _validate_handle_state(h, single_submit, overlap_events) ref_file, _ = _do_ref_write(tmpdir) - read_status = h.async_pread(gds_buffer, ref_file) + read_status = h.async_pread(gds_buffer, ref_file, 0) assert read_status == 0 wait_status = h.wait() @@ -128,7 +133,7 @@ def test_parallel_write(self, tmpdir, single_submit, overlap_events): _validate_handle_state(h, single_submit, overlap_events) - write_status = h.sync_pwrite(gds_buffer, gds_file) + write_status = h.sync_pwrite(gds_buffer, gds_file, 0) assert write_status == 1 h.unpin_device_tensor(gds_buffer) @@ -146,7 +151,7 @@ def test_async_write(self, tmpdir, single_submit, overlap_events): _validate_handle_state(h, single_submit, overlap_events) - write_status = h.async_pwrite(gds_buffer, gds_file) + write_status = h.async_pwrite(gds_buffer, gds_file, 0) assert write_status == 0 wait_status = h.wait() @@ -188,7 +193,7 @@ def test_read(self, tmpdir, async_queue): _validate_handle_state(h, single_submit, overlap_events) for i in range(async_queue): - read_status = h.async_pread(gds_buffers[i], ref_files[i]) + read_status = h.async_pread(gds_buffers[i], ref_files[i], 0) assert read_status == 0 wait_status = h.wait() @@ -225,7 +230,7 @@ def test_write(self, tmpdir, async_queue): _validate_handle_state(h, single_submit, overlap_events) for i in range(async_queue): - read_status = h.async_pwrite(gds_buffers[i], gds_files[i]) + read_status = h.async_pwrite(gds_buffers[i], gds_files[i], 0) assert read_status == 0 wait_status = h.wait() @@ -268,3 +273,69 @@ def test_pin_device_tensor(self, use_new_api): h.free_pinned_device_tensor(pinned_buffer) else: h.unpin_device_tensor(pinned_buffer) + + +@pytest.mark.parametrize('file_partitions', [[1, 1, 1], [1, 1, 2], [1, 2, 1], [2, 1, 1]]) +class TestAsyncFileOffset(DistributedTest): + world_size = 1 + + def test_offset_write(self, tmpdir, file_partitions): + ref_file = _get_file_path(tmpdir, '_py_random') + aio_file = _get_file_path(tmpdir, '_aio_random') + partition_unit_size = IO_SIZE + file_size = sum(file_partitions) * partition_unit_size + + h = GDSBuilder().load().gds_handle(BLOCK_SIZE, QUEUE_DEPTH, True, True, IO_PARALLEL) + + gds_buffer = torch.empty(file_size, dtype=torch.uint8, device=get_accelerator().device_name()) + h.pin_device_tensor(gds_buffer) + + file_offsets = [] + next_offset = 0 + for i in range(len(file_partitions)): + file_offsets.append(next_offset) + next_offset += file_partitions[i] * partition_unit_size + + ref_fd = open(ref_file, 'wb') + for i in range(len(file_partitions)): + src_buffer = torch.narrow(gds_buffer, 0, file_offsets[i], + file_partitions[i] * partition_unit_size).to(device='cpu') + + ref_fd.write(src_buffer.numpy().tobytes()) + ref_fd.flush() + + assert 1 == h.sync_pwrite(buffer=src_buffer, filename=aio_file, file_offset=file_offsets[i]) + + filecmp.clear_cache() + assert filecmp.cmp(ref_file, aio_file, shallow=False) + + ref_fd.close() + + h.unpin_device_tensor(gds_buffer) + + def test_offset_read(self, tmpdir, file_partitions): + partition_unit_size = BLOCK_SIZE + file_size = sum(file_partitions) * partition_unit_size + ref_file, _ = _do_ref_write(tmpdir, 0, file_size) + h = GDSBuilder().load().gds_handle(BLOCK_SIZE, QUEUE_DEPTH, True, True, IO_PARALLEL) + + gds_buffer = torch.empty(file_size, dtype=torch.uint8, device=get_accelerator().device_name()) + h.pin_device_tensor(gds_buffer) + + file_offsets = [] + next_offset = 0 + for i in range(len(file_partitions)): + file_offsets.append(next_offset) + next_offset += file_partitions[i] * partition_unit_size + + with open(ref_file, 'rb') as ref_fd: + for i in range(len(file_partitions)): + ref_fd.seek(file_offsets[i]) + bytes_to_read = file_partitions[i] * partition_unit_size + ref_buf = list(ref_fd.read(bytes_to_read)) + + dst_tensor = torch.narrow(gds_buffer, 0, 0, bytes_to_read) + assert 1 == h.sync_pread(dst_tensor, ref_file, file_offsets[i]) + assert dst_tensor.tolist() == ref_buf + + h.unpin_device_tensor(gds_buffer) From 877aa0dba673c2aa2157029c28363b804d6ee03d Mon Sep 17 00:00:00 2001 From: Logan Adams <114770087+loadams@users.noreply.github.com> Date: Tue, 12 Nov 2024 10:50:02 -0800 Subject: [PATCH 601/754] Update path for BingBertSquad from DeepSpeedExamples (#6746) In https://github.com/microsoft/DeepSpeedExamples/pull/245, the DeepSpeedExamples directory structure was refactored, this updates the DeepSpeed examples from those changes. --- docs/_tutorials/bert-finetuning.md | 4 ++-- docs/_tutorials/onebit-adam.md | 4 ++-- tests/model/BingBertSquad/run_BingBertSquad.sh | 2 +- tests/model/BingBertSquad/run_BingBertSquad_sanity.sh | 2 +- tests/model/BingBertSquad/run_tests.sh | 2 +- tests/model/BingBertSquad/test_e2e_squad.py | 4 ++-- 6 files changed, 9 insertions(+), 9 deletions(-) diff --git a/docs/_tutorials/bert-finetuning.md b/docs/_tutorials/bert-finetuning.md index 3014be18d682..f833acebde9a 100755 --- a/docs/_tutorials/bert-finetuning.md +++ b/docs/_tutorials/bert-finetuning.md @@ -10,14 +10,14 @@ In this tutorial we will be adding DeepSpeed to the BingBert model for the SQuAD If you don't already have a copy of the DeepSpeed repository, please clone in now and checkout the DeepSpeedExamples submodule the contains the BingBertSquad -example (DeepSpeedExamples/BingBertSquad) we will be going over in the rest of +example (DeepSpeedExamples/training/BingBertSquad) we will be going over in the rest of this tutorial. ```shell git clone https://github.com/microsoft/DeepSpeed cd DeepSpeed git submodule update --init --recursive -cd DeepSpeedExamples/BingBertSquad +cd DeepSpeedExamples/training/BingBertSquad ``` ### Pre-requisites diff --git a/docs/_tutorials/onebit-adam.md b/docs/_tutorials/onebit-adam.md index b1a8b5369761..e66bba3f818b 100644 --- a/docs/_tutorials/onebit-adam.md +++ b/docs/_tutorials/onebit-adam.md @@ -136,7 +136,7 @@ You can also use a pre-trained BERT model checkpoint from either DeepSpeed, [Hug ### 2.1 Running BingBertSQuAD with DeepSpeed and 1-bit Adam -We provide example scripts under [DeepSpeedExamples/BingBertSquad/1-bit_adam/](https://github.com/microsoft/DeepSpeedExamples/tree/master/BingBertSquad/1-bit_adam). There are 3 sets of scripts corresponding to NCCL-based implementation, MPI-based implementation on Ethernet systems, and MPI-based implementation on InfiniBand systems. For MPI-based implementation, we provide both example scripts when launching with deepspeed or mpirun. +We provide example scripts under [DeepSpeedExamples/training/BingBertSquad/1-bit_adam/](https://github.com/microsoft/DeepSpeedExamples/tree/master/training/BingBertSquad/1-bit_adam). There are 3 sets of scripts corresponding to NCCL-based implementation, MPI-based implementation on Ethernet systems, and MPI-based implementation on InfiniBand systems. For MPI-based implementation, we provide both example scripts when launching with deepspeed or mpirun. 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�o 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 gr(e{{s`#!?l;HQEl4V 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%0AmHszP|KI@5LIYVfDwGsa0a^6jM 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

Jw50 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

l<;50 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

IVdZW_LNA0R`Tk79a< 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 Qg-JiXbL0 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%0Au{pJn_?~w?`&W$B(EC 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 I+Vs}{0oquYb^rhX literal 0 HcmV?d00001 diff --git a/blogs/deepspeed-domino/images/domino-logo.png b/blogs/deepspeed-domino/images/domino-logo.png new file mode 100644 index 0000000000000000000000000000000000000000..58be0990b944854dac045383403ca14460ab4c04 GIT binary patch literal 5528 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 literal 0 HcmV?d00001 diff --git a/blogs/deepspeed-domino/images/implement-bwd.png b/blogs/deepspeed-domino/images/implement-bwd.png new file mode 100644 index 0000000000000000000000000000000000000000..4b115222f387199cc02aa74a6d0833c5e7806645 GIT binary patch literal 71201 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 literal 0 HcmV?d00001 diff --git a/blogs/deepspeed-domino/images/tp-ar.png b/blogs/deepspeed-domino/images/tp-ar.png new file mode 100644 index 0000000000000000000000000000000000000000..6dd01ccceed8cbd8d3a137ebcb7e227345b43577 GIT binary patch literal 6500 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 literal 0 HcmV?d00001 diff --git a/blogs/deepspeed-domino/images/tp-comm-overhead.png b/blogs/deepspeed-domino/images/tp-comm-overhead.png new file mode 100644 index 0000000000000000000000000000000000000000..947473ff5261c966414ea34d5f75ff16fb3d1dc9 GIT binary patch literal 37583 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 literal 0 HcmV?d00001 From 03845dbc85e222263db4db9dc8e9753a39984301 Mon Sep 17 00:00:00 2001 From: Logan Adams <114770087+loadams@users.noreply.github.com> Date: Mon, 25 Nov 2024 12:06:06 -0800 Subject: [PATCH 621/754] Update version.txt before release (#6784) --- version.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/version.txt b/version.txt index 1282fff53bfa..04a373efe6ba 100644 --- a/version.txt +++ b/version.txt @@ -1 +1 @@ -0.15.5 +0.16.0 From e5570b10eed781c96f266e4dc827d22506c606bc Mon Sep 17 00:00:00 2001 From: Logan Adams <114770087+loadams@users.noreply.github.com> Date: Mon, 25 Nov 2024 12:10:05 -0800 Subject: [PATCH 622/754] Revert release workflow (#6785) --- .github/workflows/release.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index eb763792f0c4..02881ef12f39 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -7,7 +7,7 @@ on: jobs: deploy: - runs-on: ubuntu-24.04 + runs-on: ubuntu-22.04 environment: release-env steps: From f743feca033515fdded50a98093da5a48eb41e74 Mon Sep 17 00:00:00 2001 From: Logan Adams <114770087+loadams@users.noreply.github.com> Date: Mon, 25 Nov 2024 12:12:44 -0800 Subject: [PATCH 623/754] Update version.txt after 0.16.0 release (#6786) **Auto-generated PR to update version.txt after a DeepSpeed release** Released version - 0.16.0 Author - @loadams Co-authored-by: loadams --- version.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/version.txt b/version.txt index 04a373efe6ba..2a0970ca757c 100644 --- a/version.txt +++ b/version.txt @@ -1 +1 @@ -0.16.0 +0.16.1 From 0c6c98110947300636937d45d6b3392c84996130 Mon Sep 17 00:00:00 2001 From: Guanhua Wang Date: Tue, 3 Dec 2024 08:12:21 -0800 Subject: [PATCH 624/754] Domino news update on readme.md (#6815) --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 5f5452ce232d..8bfc344a4edc 100755 --- a/README.md +++ b/README.md @@ -16,7 +16,7 @@ ## Latest News DeepSpeed empowers ChatGPT-like model training with a single click, offering 15x speedup over SOTA RLHF systems with unprecedented cost reduction at all scales; [learn how](https://github.com/microsoft/DeepSpeed/tree/master/blogs/deepspeed-chat). - +* [2024/12] [DeepSpeed-Domino: Communication-Free LLM Training Engine](https://github.com/microsoft/DeepSpeed/blob/master/blogs/deepspeed-domino/README.md) * [2024/08] [DeepSpeed on Windows](https://github.com/microsoft/DeepSpeed/tree/master/blogs/windows/08-2024/README.md) [[日本語](https://github.com/microsoft/DeepSpeed/tree/master/blogs/windows/08-2024/japanese/README.md)] * [2024/08] [DeepNVMe: Improving DL Applications through I/O Optimizations](https://github.com/microsoft/DeepSpeed/tree/master/blogs/deepspeed-gds/README.md) [[日本語](https://github.com/microsoft/DeepSpeed/tree/master/blogs/deepspeed-gds/japanese/README.md)] * [2024/07] [DeepSpeed Universal Checkpointing: Efficient and Flexible Checkpointing for Large Scale Distributed Training](https://github.com/microsoft/DeepSpeed/tree/master/blogs/deepspeed-ucp/README.md) [[中文](https://github.com/microsoft/DeepSpeed/tree/master/blogs/deepspeed-ucp/chinese/README.md)] [[日本語](https://github.com/microsoft/DeepSpeed/tree/master/blogs/deepspeed-ucp/japanese/README.md)] From fc230070ef3d12bbacfca5205506e648cc4165bc Mon Sep 17 00:00:00 2001 From: Xu Song Date: Thu, 5 Dec 2024 02:16:56 +0800 Subject: [PATCH 625/754] Fix zero checkpoint (#6792) Fix #6791 --------- Co-authored-by: Logan Adams <114770087+loadams@users.noreply.github.com> --- deepspeed/utils/zero_to_fp32.py | 16 +++++++++------- 1 file changed, 9 insertions(+), 7 deletions(-) diff --git a/deepspeed/utils/zero_to_fp32.py b/deepspeed/utils/zero_to_fp32.py index e93cb1c95f15..0e759146cadd 100755 --- a/deepspeed/utils/zero_to_fp32.py +++ b/deepspeed/utils/zero_to_fp32.py @@ -514,19 +514,20 @@ def to_torch_tensor(state_dict, return_empty_tensor=False): """ Convert state_dict of GatheredTensor to torch tensor """ + torch_state_dict = {} converted_tensors = {} for name, tensor in state_dict.items(): tensor_id = id(tensor) - if tensor_id in converted_tensors: - shared_tensor = state_dict[converted_tensors[tensor_id]] - state_dict[name] = shared_tensor + if tensor_id in converted_tensors: # shared tensors + shared_tensor = torch_state_dict[converted_tensors[tensor_id]] + torch_state_dict[name] = shared_tensor else: converted_tensors[tensor_id] = name if return_empty_tensor: - state_dict[name] = torch.empty(tensor.shape, dtype=tensor.dtype) + torch_state_dict[name] = torch.empty(tensor.shape, dtype=tensor.dtype) else: - state_dict[name] = tensor.contiguous() - return state_dict + torch_state_dict[name] = tensor.contiguous() + return torch_state_dict def get_fp32_state_dict_from_zero_checkpoint(checkpoint_dir, @@ -660,8 +661,9 @@ def convert_zero_checkpoint_to_fp32_state_dict(checkpoint_dir, else: torch.save(shard_state_dict, output_path) # release the memory of current shard - for tensor_name in shard_state_dict: + for tensor_name in list(shard_state_dict.keys()): del state_dict[tensor_name] + del shard_state_dict[tensor_name] del shard_state_dict gc.collect() From ed7d183bed94d5b48b270586274a76cf6de8902c Mon Sep 17 00:00:00 2001 From: Logan Adams <114770087+loadams@users.noreply.github.com> Date: Wed, 4 Dec 2024 12:39:45 -0800 Subject: [PATCH 626/754] Update python version but now we need to include setuptools on our own (#6787) TODO: - [x] determine if this means we should technically add setuptools to the requirements.txt --- .github/workflows/release.yml | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 02881ef12f39..b2ccca69dfda 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -7,7 +7,7 @@ on: jobs: deploy: - runs-on: ubuntu-22.04 + runs-on: ubuntu-24.04 environment: release-env steps: @@ -25,6 +25,7 @@ jobs: python release/check_release_version.py --release_version ${{ env.RELEASE_VERSION }} - name: Build DeepSpeed run: | + pip install setuptools DS_BUILD_STRING=" " python setup.py sdist - name: Publish to PyPI uses: pypa/gh-action-pypi-publish@release/v1 From 60a1b57b98c61c322cc76f1936eaec4f18a77b06 Mon Sep 17 00:00:00 2001 From: Jinghan Yao Date: Wed, 4 Dec 2024 18:29:45 -0500 Subject: [PATCH 627/754] Adding the new feature of FPDT (#6462) [FPDT](https://arxiv.org/abs/2408.16978) can only be used with [this version](https://github.com/microsoft/Megatron-DeepSpeed/pull/441) of Megatron-DeepSpeed. --------- Co-authored-by: Jinghan Yao Co-authored-by: Sam Ade Jacobs Co-authored-by: Jinghan Yao Co-authored-by: Logan Adams Co-authored-by: Olatunji Ruwase Co-authored-by: Jinghan Yao Co-authored-by: Logan Adams <114770087+loadams@users.noreply.github.com> Co-authored-by: Masahiro Tanaka <81312776+tohtana@users.noreply.github.com> Co-authored-by: Masahiro Tanaka --- .github/workflows/nv-flash-attn.yml | 64 + .../activation_checkpointing/checkpointing.py | 4 +- deepspeed/sequence/fpdt_layer.py | 1225 +++++++++++++++++ deepspeed/sequence/layer.py | 42 +- requirements/requirements.txt | 1 + .../unit/sequence_parallelism/test_ulysses.py | 98 ++ 6 files changed, 1432 insertions(+), 2 deletions(-) create mode 100644 .github/workflows/nv-flash-attn.yml create mode 100644 deepspeed/sequence/fpdt_layer.py diff --git a/.github/workflows/nv-flash-attn.yml b/.github/workflows/nv-flash-attn.yml new file mode 100644 index 000000000000..310972323043 --- /dev/null +++ b/.github/workflows/nv-flash-attn.yml @@ -0,0 +1,64 @@ +name: nv-flash-attn + +on: + workflow_dispatch: + pull_request: + paths: + - 'deepspeed/sequence/**' + - 'tests/unit/sequence_parallelism/**' + - '.github/workflows/nv-flash-attn.yml' + schedule: + - cron: "0 0 * * *" + +concurrency: + group: ${{ github.workflow }}-${{ github.ref }} + cancel-in-progress: true + +jobs: + unit-tests: + runs-on: [self-hosted, nvidia, a6000] + container: + image: nvcr.io/nvidia/pytorch:24.03-py3 + ports: + - 80 + options: --gpus all --shm-size "8G" + + steps: + - uses: actions/checkout@v4 + + - name: Check container state + run: | + ldd --version + nvcc --version + nvidia-smi + python -c "import torch; print('torch:', torch.__version__, torch)" + python -c "import torch; print('CUDA available:', torch.cuda.is_available())" + - name: Install transformers + run: | + git clone --depth=1 https://github.com/huggingface/transformers + cd transformers + git rev-parse --short HEAD + python -m pip install . + - name: Install deepspeed + run: | + python -m pip install .[dev] + ds_report + - name: Install FlashAttention + run: | + python -m pip install flash-attn + - name: Python environment + run: | + python -m pip list + - name: Unit tests + run: | + unset TORCH_CUDA_ARCH_LIST # only jit compile for current arch + cd tests + python -m pytest --color=yes --durations=0 --verbose -rF unit/sequence_parallelism/test_ulysses.py --torch_ver="2.3" --cuda_ver="12" + - name: Open GitHub issue if nightly CI fails + if: ${{ failure() && (github.event_name == 'schedule') }} + uses: JasonEtco/create-an-issue@v2 + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + with: + filename: .github/ISSUE_TEMPLATE/ci_failure_report.md + update_existing: true diff --git a/deepspeed/runtime/activation_checkpointing/checkpointing.py b/deepspeed/runtime/activation_checkpointing/checkpointing.py index d65126999199..08c4b81937f9 100644 --- a/deepspeed/runtime/activation_checkpointing/checkpointing.py +++ b/deepspeed/runtime/activation_checkpointing/checkpointing.py @@ -369,7 +369,9 @@ def is_activation_to_checkpoint(item): Is an activation to be checkpointed """ global mp_size - return torch.is_tensor(item) and item.is_floating_point() and item.numel() >= mp_size + extra_flag = (not hasattr(item, 'no_checkpointing')) or (hasattr(item, 'no_checkpointing') + and item.no_checkpointing == False) + return torch.is_tensor(item) and item.is_floating_point() and item.numel() >= mp_size and extra_flag def partition_activations(args, cpu_checkpoint, contiguous_checkpoint): diff --git a/deepspeed/sequence/fpdt_layer.py b/deepspeed/sequence/fpdt_layer.py new file mode 100644 index 000000000000..4fab768ce63c --- /dev/null +++ b/deepspeed/sequence/fpdt_layer.py @@ -0,0 +1,1225 @@ +# Copyright (c) Microsoft Corporation. +# SPDX-License-Identifier: Apache-2.0 + +# DeepSpeed Team + +import torch + +from typing import Optional, Any, Tuple +from torch import Tensor +from packaging import version +import deepspeed.comm as dist +from deepspeed.accelerator import get_accelerator + +try: + import flash_attn + from flash_attn.flash_attn_interface import _flash_attn_forward, _flash_attn_backward + flash_attn_version = version.parse(flash_attn.__version__) +except ImportError: + _flash_attn_forward = None + _flash_attn_backward = None + +from einops import rearrange +from .layer import single_all_to_all, apply_rotary_pos_emb + + +def _rotate_half_backward(x): + x = rearrange(x, '... (j d) -> ... j d', j=2) + x1, x2 = x.unbind(dim=-2) + return torch.cat((x2, -x1), dim=-1) + + +def apply_rotary_pos_emb_backward(grad_output, freqs_cos, freqs_sin): + rot_dim = freqs_cos.shape[-1] + grad, grad_pass = grad_output[..., :rot_dim], grad_output[..., rot_dim:] + grad_t = (grad * freqs_cos) + (_rotate_half_backward(grad * freqs_sin)) + grad = grad_t if grad_pass.shape[-1] == 0 else torch.cat((grad_t, grad_pass), dim=-1) + return grad + + +def _update_out_and_lse( + out: torch.Tensor, + lse: torch.Tensor, + block_out: torch.Tensor, + block_lse: torch.Tensor, +) -> Tuple[torch.Tensor, torch.Tensor]: + + block_out = block_out.to(torch.float32) + block_lse = block_lse.transpose(-2, -1).unsqueeze(dim=-1) + + new_lse = lse + torch.log(1 + torch.exp(block_lse - lse)) + + out = torch.exp(lse - new_lse) * out + torch.exp(block_lse - new_lse) * block_out + + lse = new_lse + return out, lse + + +def update_out_and_lse( + out: Optional[torch.Tensor], + lse: Optional[torch.Tensor], + block_out: torch.Tensor, + block_lse: torch.Tensor, + slice_=None, +) -> Tuple[torch.Tensor, torch.Tensor]: + if out is None: + if slice_ is not None: + raise RuntimeError("first update_out_and_lse should not pass slice_ args") + out = block_out.to(torch.float32) + lse = block_lse.permute(0, 2, 1).contiguous().unsqueeze(dim=-1).contiguous() + elif slice_ is not None: + slice_out, slice_lse = out[slice_], lse[slice_] + slice_out, slice_lse = _update_out_and_lse(slice_out, slice_lse, block_out, block_lse) + out[slice_], lse[slice_] = slice_out, slice_lse + else: + out, lse = _update_out_and_lse(out, lse, block_out, block_lse) + return out, lse + + +class FPDT_InputConstruct(torch.nn.Module): + + def __init__(self, tokens, labels, loss_mask, attention_mask, position_ids, args, sp_size, sp_rank) -> None: + + super(FPDT_InputConstruct, self).__init__() + self.tokens = tokens + self.labels = labels + self.loss_mask = loss_mask + self.attention_mask = attention_mask + self.position_ids = position_ids + global_seq_len = tokens.shape[1] + batch_size = tokens.shape[0] + assert global_seq_len % sp_size == 0 + assert global_seq_len % args.ds_sequence_parallel_fpdt_chunk_size == 0 + num_chunk_per_gpu = global_seq_len // args.ds_sequence_parallel_fpdt_chunk_size + local_seq_len = global_seq_len // sp_size + assert local_seq_len % num_chunk_per_gpu == 0 + + self.num_chunk_per_gpu = num_chunk_per_gpu + self.chunk_size = local_seq_len // num_chunk_per_gpu + self.sp_size = sp_size + self.sp_rank = sp_rank + self.global_seq_len = global_seq_len + self.local_seq_len = local_seq_len + self.batch_size = batch_size + self.device = tokens.device + + def generate(self): + device = self.device + totalChunks = self.global_seq_len // self.chunk_size + token_chunk_idx = torch.arange(self.global_seq_len, device=device, dtype=torch.int) // self.chunk_size + chunk_to_gpu = torch.arange(totalChunks, device=device, dtype=torch.int) + chunk_to_gpu = chunk_to_gpu.reshape(self.num_chunk_per_gpu, -1).t().contiguous() + + gather_chunk = chunk_to_gpu.flatten().unsqueeze(1).contiguous() + mask = gather_chunk == token_chunk_idx + + indices = mask.nonzero(as_tuple=False) + gather_indices = indices[:, 0] + token_chunk_indices = indices[:, 1] + indices = torch.cat([token_chunk_indices[gather_indices == i] for i in range(gather_chunk.shape[0])]) + load_balanced_loss_mask = self.loss_mask[:, indices] if self.loss_mask is not None else self.loss_mask + + indices = indices.reshape(-1, self.chunk_size)[self.num_chunk_per_gpu * self.sp_rank:self.num_chunk_per_gpu * + (self.sp_rank + 1)].flatten().contiguous() + load_balanced_tokens = self.tokens[:, indices] + load_balanced_labels = self.labels[:, indices] if self.labels is not None else self.labels + + load_balanced_attention_mask = self.attention_mask if self.attention_mask is not None else self.attention_mask + load_balanced_position_ids = self.position_ids[:, + indices] if self.position_ids is not None else self.position_ids + + return load_balanced_tokens, load_balanced_labels, load_balanced_loss_mask, load_balanced_attention_mask, load_balanced_position_ids + + +class _FPDTGPUAttentionImpl_(torch.autograd.Function): + generate_vmap_rule = False + + @staticmethod + def forward(ctx: Any, + layernorm_output, + attention_mask, + inference_params, + rotary_pos_emb, + spg, + scatter_idx, + gather_idx, + hidden_size, + projection_size, + hidden_size_per_attention_head, + kv_projection_size, + qkv_linear_weight, + qkv_linear_bias, + dropout, + num_chunks=8, + cpu_offloading=True): + + do_save = layernorm_output.requires_grad + + if rotary_pos_emb is not None: + pos_emb_cos, pos_emb_sin = rotary_pos_emb[0].permute(1, 0, 2, 3), rotary_pos_emb[1].permute(1, 0, 2, 3) + ctx.pos_emb_cos = pos_emb_cos + ctx.pos_emb_sin = pos_emb_sin + else: + ctx.pos_emb_cos = None + ctx.pos_emb_sin = None + + with torch.no_grad(): + per_gpu_seq_len = layernorm_output.shape[0] + chunk_size = per_gpu_seq_len // num_chunks + assert chunk_size * num_chunks == per_gpu_seq_len + assert attention_mask is None + ctx.num_chunks = num_chunks + ctx.cpu_offloading = cpu_offloading + ctx.spg = spg + ctx.scatter_idx = scatter_idx + ctx.gather_idx = gather_idx + + device = get_accelerator().current_device_name() + ctx.device = device + ctx.dtype = layernorm_output.dtype + ctx.projection_size = projection_size + ctx.kv_projection_size = kv_projection_size + + global_q = [] + global_k = [] + global_v = [] + + ctx.softmax_scale = hidden_size_per_attention_head**(-0.5) + + ctx.dropout_p = dropout + ctx.window_size = (-1, -1) + ctx.alibi_slopes = None + + batch_size = layernorm_output.shape[1] + + global_o = [None for _ in range(num_chunks)] + global_lse = [None for _ in range(num_chunks)] + + for i in range(num_chunks): + + st = chunk_size * i + ed = st + chunk_size + + qkv_chunk = torch.matmul(layernorm_output[st:ed], qkv_linear_weight.t()) + qkv_linear_bias + + q_chunk = qkv_chunk[:, :, :projection_size].contiguous().reshape( + qkv_chunk.shape[0], qkv_chunk.shape[1], -1, + hidden_size_per_attention_head).permute(1, 0, 2, 3).contiguous() # b, l, nh, hd + q_chunk = single_all_to_all(q_chunk, scatter_idx, gather_idx, 0, spg) + global_q_chunk_len = q_chunk.shape[1] + if rotary_pos_emb is not None: + q_chunk = apply_rotary_pos_emb(q_chunk, + pos_emb_cos[:, global_q_chunk_len * i:global_q_chunk_len * (i + 1)], + pos_emb_sin[:, global_q_chunk_len * i:global_q_chunk_len * (i + 1)]) + global_q.append(q_chunk) + + k_chunk = qkv_chunk[:, :, projection_size:projection_size + kv_projection_size].contiguous().reshape( + qkv_chunk.shape[0], qkv_chunk.shape[1], -1, + hidden_size_per_attention_head).permute(1, 0, 2, 3).contiguous() # b, l, nh, hd + k_chunk = single_all_to_all(k_chunk, scatter_idx, gather_idx, 0, spg) + if rotary_pos_emb is not None: + k_chunk = apply_rotary_pos_emb(k_chunk, + pos_emb_cos[:, global_q_chunk_len * i:global_q_chunk_len * (i + 1)], + pos_emb_sin[:, global_q_chunk_len * i:global_q_chunk_len * (i + 1)]) + global_k.append(k_chunk) + + v_chunk = qkv_chunk[:, :, projection_size + kv_projection_size:].contiguous().reshape( + qkv_chunk.shape[0], qkv_chunk.shape[1], -1, + hidden_size_per_attention_head).permute(1, 0, 2, 3).contiguous() # b, l, nh, hd + v_chunk = single_all_to_all(v_chunk, scatter_idx, gather_idx, 0, spg) + global_v.append(v_chunk) + + for k_i in range(len(global_k)): + causal_chunk = i == k_i + if flash_attn_version >= version.parse("2.6.0"): + block_out, _, _, _, _, block_lse, _, _ = _flash_attn_forward(global_q[i], + global_k[k_i], + global_v[k_i], + ctx.dropout_p, + ctx.softmax_scale, + causal=causal_chunk, + window_size=ctx.window_size, + softcap=0.0, + alibi_slopes=ctx.alibi_slopes, + return_softmax=False) + else: + block_out, _, _, _, _, block_lse, _, _ = _flash_attn_forward(global_q[i], + global_k[k_i], + global_v[k_i], + ctx.dropout_p, + ctx.softmax_scale, + causal=causal_chunk, + window_size=ctx.window_size, + alibi_slopes=ctx.alibi_slopes, + return_softmax=False) + + global_o[i], global_lse[i] = update_out_and_lse(global_o[i], global_lse[i], block_out, block_lse) + + global_o[i] = global_o[i].to(q_chunk.dtype) + + output = [None for i in range(num_chunks)] + + for i in range(num_chunks): + global_lse[i] = global_lse[i][:, :, :, 0].permute(0, 2, 1).contiguous() + output[i] = single_all_to_all(global_o[i].to(ctx.dtype).contiguous(), gather_idx, scatter_idx, 0, spg) + output = torch.cat(output, dim=1) + + head_dim = output.shape[-1] + + if do_save: + ctx.save_for_backward(layernorm_output) + ctx.global_q = global_q + ctx.global_k = global_k + ctx.global_v = global_v + ctx.attn_output = global_o + ctx.attn_lse = global_lse + ctx.head_dim = head_dim + ctx.batch_size = batch_size + + ctx.qkv_linear_weight = qkv_linear_weight + ctx.qkv_linear_bias = qkv_linear_bias + + return output + + @staticmethod + def backward(ctx, grad_output): + + num_chunks = ctx.num_chunks + device = ctx.device + dtype = ctx.dtype + spg = ctx.spg + scatter_idx = ctx.scatter_idx + gather_idx = ctx.gather_idx + softmax_scale = ctx.softmax_scale + dropout_p = ctx.dropout_p + window_size = ctx.window_size + alibi_slopes = ctx.alibi_slopes + + projection_size = ctx.projection_size + kv_projection_size = ctx.kv_projection_size + + layernorm_output = ctx.saved_tensors[0] + + global_q = ctx.global_q + global_k = ctx.global_k + global_v = ctx.global_v + attn_output = ctx.attn_output + lse = ctx.attn_lse + + qkv_linear_weight = ctx.qkv_linear_weight + qkv_linear_bias = ctx.qkv_linear_bias + + input_chunk_size = layernorm_output.shape[0] // num_chunks + grad_layernorm_output = [ + torch.zeros((input_chunk_size, layernorm_output.shape[1], layernorm_output.shape[2]), + device=device, + dtype=dtype) for _ in range(num_chunks) + ] + + grad_global_attn_output = [] + chunk_size = grad_output.shape[1] // num_chunks + + for i in range(num_chunks): + st = chunk_size * i + ed = st + chunk_size + grad_global_attn_output.append( + single_all_to_all(grad_output[:, st:ed].contiguous(), scatter_idx, gather_idx, 0, spg)) + + del grad_output + + dq = [torch.zeros(global_q[0].shape, dtype=torch.float, device=device) for _ in range(num_chunks)] + dk = [torch.zeros(global_q[0].shape, dtype=torch.float, device=device) for _ in range(num_chunks)] + dv = [torch.zeros(global_q[0].shape, dtype=torch.float, device=device) for _ in range(num_chunks)] + + grad_qkv_linear_weight = torch.zeros(qkv_linear_weight.shape, + device=qkv_linear_weight.device, + dtype=torch.float) + grad_qkv_linear_bias = torch.zeros(qkv_linear_bias.shape, device=qkv_linear_weight.device, dtype=torch.float) + + for i in range(num_chunks): + k_chunk = global_k[i] + v_chunk = global_v[i] + + for q_i in range(num_chunks): + no_computation = q_i < i + if no_computation: + continue + + causal_chunk = q_i == i + + q_chunk = global_q[q_i] + attn_output_chunk = attn_output[q_i] + lse_chunk = lse[q_i] + d_out = grad_global_attn_output[q_i] + + dq_this = torch.zeros(global_q[0].shape, dtype=dtype, device=device) + dk_this = torch.zeros(global_k[0].shape, dtype=dtype, device=device) + dv_this = torch.zeros(global_v[0].shape, dtype=dtype, device=device) + + if flash_attn_version >= version.parse("2.6.0"): + _flash_attn_backward(d_out, + q_chunk, + k_chunk, + v_chunk, + attn_output_chunk, + lse_chunk, + dq_this, + dk_this, + dv_this, + dropout_p, + softmax_scale, + causal_chunk, + window_size, + softcap=0.0, + alibi_slopes=alibi_slopes, + deterministic=False, + rng_state=None) + else: + _flash_attn_backward(d_out, + q_chunk, + k_chunk, + v_chunk, + attn_output_chunk, + lse_chunk, + dq_this, + dk_this, + dv_this, + dropout_p, + softmax_scale, + causal_chunk, + window_size, + alibi_slopes=alibi_slopes, + deterministic=False, + rng_state=None) + + dq[q_i].add_(dq_this.to(torch.float)) + dk[i].add_(dk_this.to(torch.float)) + dv[i].add_(dv_this.to(torch.float)) + + dk_seq_len = dk[i].shape[1] + + if ctx.pos_emb_cos is not None: + dk[i] = apply_rotary_pos_emb_backward(dk[i].to(dtype), + ctx.pos_emb_cos[:, dk_seq_len * i:dk_seq_len * (i + 1)], + ctx.pos_emb_sin[:, dk_seq_len * i:dk_seq_len * (i + 1)]) + else: + dk[i] = dk[i].to(dtype) + dv[i] = dv[i].to(dtype) + dk[i] = single_all_to_all(dk[i].contiguous(), gather_idx, scatter_idx, 0, spg) + dv[i] = single_all_to_all(dv[i].contiguous(), gather_idx, scatter_idx, 0, spg) + + input_st = i * input_chunk_size + input_ed = input_st + input_chunk_size + + input_chunk = layernorm_output[input_st:input_ed].reshape(-1, layernorm_output.shape[-1]) + + dk[i] = dk[i].flatten(2).permute(1, 0, 2) + dv[i] = dv[i].flatten(2).permute(1, 0, 2) + l, b = dk[i].shape[0], dk[i].shape[1] + grad_qkv_linear_weight[projection_size:projection_size + kv_projection_size].add_( + torch.matmul(dk[i].reshape(l * b, -1).t(), input_chunk)) + grad_qkv_linear_weight[projection_size + kv_projection_size:].add_( + torch.matmul(dv[i].reshape(l * b, -1).t(), input_chunk)) + grad_qkv_linear_bias[projection_size:projection_size + kv_projection_size].add_(dk[i].sum(0).sum(0)) + grad_qkv_linear_bias[projection_size + kv_projection_size:].add_(dv[i].sum(0).sum(0)) + + grad_layernorm_output[i].add_( + torch.matmul(dk[i], qkv_linear_weight[projection_size:projection_size + kv_projection_size])) + grad_layernorm_output[i].add_(torch.matmul(dv[i], + qkv_linear_weight[projection_size + kv_projection_size:])) + + dk[i] = None + dv[i] = None + + for i in range(num_chunks): + dq_seq_len = dq[i].shape[1] + if ctx.pos_emb_cos is not None: + dq[i] = apply_rotary_pos_emb_backward(dq[i].to(dtype), + ctx.pos_emb_cos[:, dq_seq_len * i:dq_seq_len * (i + 1)], + ctx.pos_emb_sin[:, dq_seq_len * i:dq_seq_len * (i + 1)]) + else: + dq[i] = dq[i].to(dtype) + dq[i] = single_all_to_all(dq[i].to(dtype).contiguous(), gather_idx, scatter_idx, 0, spg) + + input_chunk = layernorm_output[:input_chunk_size].reshape(-1, layernorm_output.shape[-1]) + layernorm_output = layernorm_output[input_chunk_size:] + + dq[i] = dq[i].flatten(2).permute(1, 0, 2) + l, b = dq[i].shape[0], dq[i].shape[1] + grad_qkv_linear_weight[:projection_size].add_(torch.matmul(dq[i].reshape(l * b, -1).t(), input_chunk)) + grad_qkv_linear_bias[:projection_size].add_(dq[i].sum(0).sum(0)) + + grad_layernorm_output[i].add_(torch.matmul(dq[i], qkv_linear_weight[:projection_size])) + + dq[i] = None + + return torch.cat( + grad_layernorm_output, + dim=0).to(dtype), None, None, None, None, None, None, None, None, None, None, grad_qkv_linear_weight.to( + dtype), grad_qkv_linear_bias.to(dtype), None, None, None + + +class SequenceChunk: + + def __init__(self, chunk: torch.Tensor, device=None, is_in_use=False): + + self.chunk_shape = chunk.shape + self.chunk_dtype = chunk.dtype + self.device = chunk.device if device is None else device + + cpu_chunk = torch.empty(chunk.shape, dtype=chunk.dtype, device='cpu', pin_memory=True) + + if get_accelerator().on_accelerator(chunk): + cpu_chunk.copy_(chunk, non_blocking=True) + else: + cpu_chunk = chunk + + self.cpu_chunk = cpu_chunk + + self.gpu_chunk = chunk if is_in_use else None + + def load_to_gpu(self): + assert self.gpu_chunk is None + if self.gpu_chunk is not None: + pass + else: + gpu_chunk = torch.empty(self.chunk_shape, device=self.device, dtype=self.chunk_dtype) + gpu_chunk.copy_(self.cpu_chunk, non_blocking=True) + self.gpu_chunk = gpu_chunk + + def get_gpu_chunk(self): + assert self.gpu_chunk is not None and self.gpu_chunk.device == self.device + return self.gpu_chunk + + def check_gpu_chunk(self, ): + assert (self.gpu_chunk is not None) and ( + self.gpu_chunk.device == self.device + ), f"gpu_chunk {self.gpu_chunk is not None} shound be on {self.device}, but it is now on {self.gpu_chunk.device}" + return True + + def offload(self): + assert self.gpu_chunk is not None and self.gpu_chunk.device == self.device + del self.gpu_chunk + self.gpu_chunk = None + + def overwrite_to_cpu(self): + assert self.gpu_chunk is not None and self.gpu_chunk.device == self.device + self.cpu_chunk.copy_(self.gpu_chunk, non_blocking=True) + + +class _FPDTGPUOffloadingAttentionImpl_(torch.autograd.Function): + generate_vmap_rule = False + + @staticmethod + def forward(ctx: Any, + layernorm_output, + attention_mask, + inference_params, + rotary_pos_emb, + spg, + scatter_idx, + gather_idx, + hidden_size, + projection_size, + hidden_size_per_attention_head, + kv_projection_size, + qkv_linear_weight, + qkv_linear_bias, + dropout, + num_chunks=8, + cpu_offloading=True): + + do_save = layernorm_output.requires_grad + + if rotary_pos_emb is not None: + pos_emb_cos, pos_emb_sin = rotary_pos_emb[0].permute(1, 0, 2, 3), rotary_pos_emb[1].permute(1, 0, 2, 3) + ctx.pos_emb_cos = pos_emb_cos + ctx.pos_emb_sin = pos_emb_sin + else: + ctx.pos_emb_cos = None + ctx.pos_emb_sin = None + with torch.no_grad(): + per_gpu_seq_len = layernorm_output.shape[0] + chunk_size = per_gpu_seq_len // num_chunks + assert chunk_size * num_chunks == per_gpu_seq_len + assert attention_mask is None + ctx.num_chunks = num_chunks + ctx.cpu_offloading = cpu_offloading + ctx.spg = spg + ctx.scatter_idx = scatter_idx + ctx.gather_idx = gather_idx + + ctx.chunk_size = chunk_size + device = get_accelerator().current_device_name() + ctx.device = device + ctx.dtype = layernorm_output.dtype + ctx.projection_size = projection_size + ctx.kv_projection_size = kv_projection_size + + global_q = [] + global_k = [] + global_v = [] + + ctx.softmax_scale = hidden_size_per_attention_head**(-0.5) + + ctx.dropout_p = dropout + ctx.window_size = (-1, -1) + ctx.alibi_slopes = None + + batch_size = layernorm_output.shape[1] + + global_o = [] + global_lse = [] + + layernorm_output_cpu = [] + final_output = [] + + offload_stream = get_accelerator().Stream() + general_offload_stream = get_accelerator().Stream() + compute_stream = get_accelerator().default_stream() + + q_compute_chunk_idx = 0 + kv_compute_chunk_idx = 0 + for i in range(num_chunks): + + qkv_chunk = torch.matmul(layernorm_output[:chunk_size], + qkv_linear_weight.t()) + qkv_linear_bias # torch.Size([18126, 1, 12288]) + + with get_accelerator().stream(general_offload_stream): + layernorm_output_cpu.append(SequenceChunk(layernorm_output[:chunk_size])) + + layernorm_output = layernorm_output[chunk_size:] + + q_chunk = qkv_chunk[:, :, :projection_size].contiguous().reshape( + qkv_chunk.shape[0], qkv_chunk.shape[1], -1, + hidden_size_per_attention_head).permute(1, 0, 2, 3).contiguous() # b, l, nh, hd + q_chunk = single_all_to_all(q_chunk, scatter_idx, gather_idx, 0, spg) + global_q_chunk_len = q_chunk.shape[1] + + k_chunk = qkv_chunk[:, :, projection_size:projection_size + kv_projection_size].contiguous().reshape( + qkv_chunk.shape[0], qkv_chunk.shape[1], -1, + hidden_size_per_attention_head).permute(1, 0, 2, 3).contiguous() # b, l, nh, hd + k_chunk = single_all_to_all(k_chunk, scatter_idx, gather_idx, 0, spg) + + v_chunk = qkv_chunk[:, :, projection_size + kv_projection_size:].contiguous().reshape( + qkv_chunk.shape[0], qkv_chunk.shape[1], -1, + hidden_size_per_attention_head).permute(1, 0, 2, 3).contiguous() # b, l, nh, hd + v_chunk = single_all_to_all(v_chunk, scatter_idx, gather_idx, 0, spg) + + dist.barrier() + + if ctx.pos_emb_cos is not None: + pos_emb_cos_chunk = pos_emb_cos[:, global_q_chunk_len * i:global_q_chunk_len * (i + 1)] + pos_emb_sin_chunk = pos_emb_sin[:, global_q_chunk_len * i:global_q_chunk_len * (i + 1)] + + q_chunk = apply_rotary_pos_emb(q_chunk, pos_emb_cos_chunk, pos_emb_sin_chunk) + k_chunk = apply_rotary_pos_emb(k_chunk, pos_emb_cos_chunk, pos_emb_sin_chunk) + + compute_stream.wait_stream(offload_stream) + compute_stream.synchronize() + with get_accelerator().stream(offload_stream): + global_q.append(SequenceChunk(q_chunk, is_in_use=True)) + global_k.append(SequenceChunk(k_chunk, is_in_use=True)) + global_v.append(SequenceChunk(v_chunk, is_in_use=True)) + + del qkv_chunk + + cur_attn_output = None + cur_attn_lse = None + for k_i in range(len(global_k)): + causal_chunk = i == k_i + with get_accelerator().stream(compute_stream): + if flash_attn_version >= version.parse("2.6.0"): + block_out, _, _, _, _, block_lse, _, _ = _flash_attn_forward( + global_q[q_compute_chunk_idx].get_gpu_chunk(), + global_k[kv_compute_chunk_idx].get_gpu_chunk(), + global_v[kv_compute_chunk_idx].get_gpu_chunk(), + ctx.dropout_p, + ctx.softmax_scale, + causal=causal_chunk, + window_size=ctx.window_size, + softcap=0.0, + alibi_slopes=ctx.alibi_slopes, + return_softmax=False) + else: + block_out, _, _, _, _, block_lse, _, _ = _flash_attn_forward( + global_q[q_compute_chunk_idx].get_gpu_chunk(), + global_k[kv_compute_chunk_idx].get_gpu_chunk(), + global_v[kv_compute_chunk_idx].get_gpu_chunk(), + ctx.dropout_p, + ctx.softmax_scale, + causal=causal_chunk, + window_size=ctx.window_size, + alibi_slopes=ctx.alibi_slopes, + return_softmax=False) + cur_attn_output, cur_attn_lse = update_out_and_lse(cur_attn_output, cur_attn_lse, block_out, + block_lse) + + can_offload_kv = True + if k_i != (len(global_k) - 1) or i != (num_chunks - 1): + if k_i != (len(global_k) - 1): + next_kv_compute_chunk_idx = k_i + 1 + else: + next_kv_compute_chunk_idx = 0 + + if next_kv_compute_chunk_idx == kv_compute_chunk_idx: + can_offload_kv = False + else: + if next_kv_compute_chunk_idx != (len(global_k) - 1): + with get_accelerator().stream(offload_stream): + global_k[next_kv_compute_chunk_idx].load_to_gpu() + global_v[next_kv_compute_chunk_idx].load_to_gpu() + + if i == num_chunks - 1 and k_i == num_chunks - 1: + with get_accelerator().stream(offload_stream): + global_q[0].load_to_gpu() + global_k[0].load_to_gpu() + global_v[0].load_to_gpu() + global_o[0].load_to_gpu() + global_lse[0].load_to_gpu() + + compute_stream.wait_stream(offload_stream) + compute_stream.synchronize() + + if can_offload_kv: + global_k[kv_compute_chunk_idx].offload() + global_v[kv_compute_chunk_idx].offload() + kv_compute_chunk_idx = next_kv_compute_chunk_idx + + global_q[q_compute_chunk_idx].offload() + q_compute_chunk_idx += 1 + + all2all_output = single_all_to_all( + cur_attn_output.to(ctx.dtype).contiguous(), gather_idx, scatter_idx, 0, spg) + final_output.append(all2all_output) + with get_accelerator().stream(general_offload_stream): + global_o.append(SequenceChunk(cur_attn_output.to(ctx.dtype))) + global_lse.append(SequenceChunk(cur_attn_lse[:, :, :, 0].permute(0, 2, 1).contiguous())) + + compute_stream.wait_stream(general_offload_stream) + compute_stream.synchronize() + + final_output = torch.cat(final_output, dim=1) + + head_dim = final_output.shape[-1] + + if do_save: + ctx.layernorm_output = layernorm_output_cpu + ctx.global_q = global_q + ctx.global_k = global_k + ctx.global_v = global_v + ctx.attn_output = global_o + ctx.attn_lse = global_lse + ctx.head_dim = head_dim + ctx.batch_size = batch_size + + ctx.qkv_linear_weight = qkv_linear_weight + ctx.qkv_linear_bias = qkv_linear_bias + + return final_output + + @staticmethod + def backward(ctx, grad_output): + num_chunks = ctx.num_chunks + device = grad_output.device + dtype = ctx.dtype + spg = ctx.spg + scatter_idx = ctx.scatter_idx + gather_idx = ctx.gather_idx + softmax_scale = ctx.softmax_scale + dropout_p = ctx.dropout_p + window_size = ctx.window_size + alibi_slopes = ctx.alibi_slopes + + projection_size = ctx.projection_size + kv_projection_size = ctx.kv_projection_size + + layernorm_output = ctx.layernorm_output + + global_q = ctx.global_q + global_k = ctx.global_k + global_v = ctx.global_v + attn_output = ctx.attn_output + lse = ctx.attn_lse + + qkv_linear_weight = ctx.qkv_linear_weight + qkv_linear_bias = ctx.qkv_linear_bias + + offload_stream = get_accelerator().Stream() + general_offload_stream = get_accelerator().Stream() + compute_stream = get_accelerator().default_stream() + + chunk_size = grad_output.shape[1] // num_chunks + assert chunk_size == layernorm_output[0].cpu_chunk.shape[0] + + grad_layernorm_output = [ + torch.zeros(layernorm_output[0].chunk_shape, device=device, dtype=dtype) for _ in range(num_chunks) + ] + + grad_global_attn_output = [None for _ in range(num_chunks)] + + q_compute_chunk_idx = 0 + kv_compute_chunk_idx = 0 + last_q_accum_idx = 0 + + with get_accelerator().stream(general_offload_stream): + layernorm_output[0].load_to_gpu() + grad_qkv_linear_weight = torch.zeros(qkv_linear_weight.shape, + device=qkv_linear_weight.device, + dtype=torch.float) + grad_qkv_linear_bias = torch.zeros(qkv_linear_bias.shape, + device=qkv_linear_weight.device, + dtype=torch.float) + + grad_global_attn_output_chunk = single_all_to_all(grad_output[:, :chunk_size].contiguous(), scatter_idx, + gather_idx, 0, spg) + get_accelerator().synchronize() + grad_output = grad_output[:, chunk_size:] + + with get_accelerator().stream(offload_stream): + grad_global_attn_output[0] = SequenceChunk(grad_global_attn_output_chunk, is_in_use=True) + dq = [ + SequenceChunk(torch.zeros(global_q[0].chunk_shape, dtype=torch.float, device=device), is_in_use=True) + ] + [ + SequenceChunk(torch.zeros(global_q[0].chunk_shape, dtype=torch.float, device='cpu', pin_memory=True), + device) for _ in range(num_chunks - 1) + ] + dk_accum = torch.zeros(global_k[0].chunk_shape, dtype=torch.float, device=device) + dv_accum = torch.zeros(global_v[0].chunk_shape, dtype=torch.float, device=device) + + for i in range(num_chunks): + for q_i in range(num_chunks): + no_computation = q_i < i + if no_computation: + continue + + causal_chunk = q_i == i + + dq_this = torch.zeros(global_q[0].chunk_shape, dtype=dtype, device=device) + dk_this = torch.zeros(global_k[0].chunk_shape, dtype=dtype, device=device) + dv_this = torch.zeros(global_v[0].chunk_shape, dtype=dtype, device=device) + + with get_accelerator().stream(compute_stream): + if flash_attn_version >= version.parse("2.6.0"): + _flash_attn_backward(grad_global_attn_output[q_compute_chunk_idx].get_gpu_chunk(), + global_q[q_compute_chunk_idx].get_gpu_chunk(), + global_k[kv_compute_chunk_idx].get_gpu_chunk(), + global_v[kv_compute_chunk_idx].get_gpu_chunk(), + attn_output[q_compute_chunk_idx].get_gpu_chunk(), + lse[q_compute_chunk_idx].get_gpu_chunk(), + dq_this, + dk_this, + dv_this, + dropout_p, + softmax_scale, + causal_chunk, + window_size, + softcap=0.0, + alibi_slopes=alibi_slopes, + deterministic=False, + rng_state=None) + else: + _flash_attn_backward(grad_global_attn_output[q_compute_chunk_idx].get_gpu_chunk(), + global_q[q_compute_chunk_idx].get_gpu_chunk(), + global_k[kv_compute_chunk_idx].get_gpu_chunk(), + global_v[kv_compute_chunk_idx].get_gpu_chunk(), + attn_output[q_compute_chunk_idx].get_gpu_chunk(), + lse[q_compute_chunk_idx].get_gpu_chunk(), + dq_this, + dk_this, + dv_this, + dropout_p, + softmax_scale, + causal_chunk, + window_size, + alibi_slopes=alibi_slopes, + deterministic=False, + rng_state=None) + + if i != (len(global_k) - 1): + if q_i != (len(global_q) - 1): + next_q_compute_chunk_idx = q_i + 1 + else: + next_q_compute_chunk_idx = i + 1 + + can_offload_q = True + + if next_q_compute_chunk_idx == q_compute_chunk_idx: + can_offload_q = False + else: + with get_accelerator().stream(offload_stream): + if i > 0 or q_i > 0: + if can_offload_q and last_q_accum_idx != i: # the first q chunk calculate in the loop will be sent out, therefore we do not offload it + dq[last_q_accum_idx].offload() + dq[next_q_compute_chunk_idx].load_to_gpu() + global_q[next_q_compute_chunk_idx].load_to_gpu() + attn_output[next_q_compute_chunk_idx].load_to_gpu() + lse[next_q_compute_chunk_idx].load_to_gpu() + if grad_global_attn_output[next_q_compute_chunk_idx] is not None: + grad_global_attn_output[next_q_compute_chunk_idx].load_to_gpu() + + if grad_global_attn_output[next_q_compute_chunk_idx] is None: + grad_global_attn_output_chunk = single_all_to_all(grad_output[:, :chunk_size].contiguous(), + scatter_idx, gather_idx, 0, spg) + dist.barrier() + grad_output = grad_output[:, chunk_size:] + grad_global_attn_output[next_q_compute_chunk_idx] = SequenceChunk( + grad_global_attn_output_chunk, is_in_use=True) + + compute_stream.wait_stream(offload_stream) + compute_stream.synchronize() + + with get_accelerator().stream(compute_stream): + dq[q_compute_chunk_idx].check_gpu_chunk() + dq[q_compute_chunk_idx].gpu_chunk.add_(dq_this) + dk_accum.add_(dk_this) + dv_accum.add_(dv_this) + + offload_stream.wait_stream(compute_stream) + with get_accelerator().stream(offload_stream): + dq[q_compute_chunk_idx].overwrite_to_cpu() + + if can_offload_q: + global_q[q_compute_chunk_idx].offload() + attn_output[q_compute_chunk_idx].offload() + lse[q_compute_chunk_idx].offload() + grad_global_attn_output[q_compute_chunk_idx].offload() + + last_q_accum_idx = q_compute_chunk_idx + q_compute_chunk_idx = next_q_compute_chunk_idx + + compute_stream.wait_stream(offload_stream) + compute_stream.synchronize() + + dk_seq_len = dk_accum.shape[1] + + if ctx.pos_emb_cos is not None: + dq_accum = apply_rotary_pos_emb_backward(dq[kv_compute_chunk_idx].get_gpu_chunk().to(dtype), + ctx.pos_emb_cos[:, dk_seq_len * i:dk_seq_len * (i + 1)], + ctx.pos_emb_sin[:, dk_seq_len * i:dk_seq_len * (i + 1)]) + dk_accum = apply_rotary_pos_emb_backward(dk_accum.to(dtype), + ctx.pos_emb_cos[:, dk_seq_len * i:dk_seq_len * (i + 1)], + ctx.pos_emb_sin[:, dk_seq_len * i:dk_seq_len * (i + 1)]) + else: + dq_accum = dq[kv_compute_chunk_idx].get_gpu_chunk().to(dtype) + dk_accum = dk_accum.to(dtype) + dv_accum = dv_accum.to(dtype) + + dq_accum = single_all_to_all(dq_accum.contiguous(), gather_idx, scatter_idx, 0, spg) + dk_accum = single_all_to_all(dk_accum.contiguous(), gather_idx, scatter_idx, 0, spg) + dv_accum = single_all_to_all(dv_accum.contiguous(), gather_idx, scatter_idx, 0, spg) + + general_offload_stream.synchronize() + compute_stream.wait_stream(general_offload_stream) + dist.barrier() + + with get_accelerator().stream(compute_stream): + input_chunk = layernorm_output[i].get_gpu_chunk().reshape(-1, layernorm_output[i].chunk_shape[-1]) + + dq_accum = dq_accum.flatten(2).permute(1, 0, 2) + dk_accum = dk_accum.flatten(2).permute(1, 0, 2) + dv_accum = dv_accum.flatten(2).permute(1, 0, 2) + + l, b = dk_accum.shape[0], dk_accum.shape[1] + + grad_qkv_linear_weight[:projection_size].add_( + torch.matmul(dq_accum.reshape(l * b, -1).t(), input_chunk)) + grad_qkv_linear_weight[projection_size:projection_size + kv_projection_size].add_( + torch.matmul(dk_accum.reshape(l * b, -1).t(), input_chunk)) + grad_qkv_linear_weight[projection_size + kv_projection_size:].add_( + torch.matmul(dv_accum.reshape(l * b, -1).t(), input_chunk)) + + grad_qkv_linear_bias[:projection_size].add_(dq_accum.sum(0).sum(0)) + grad_qkv_linear_bias[projection_size:projection_size + kv_projection_size].add_(dk_accum.sum(0).sum(0)) + grad_qkv_linear_bias[projection_size + kv_projection_size:].add_(dv_accum.sum(0).sum(0)) + + grad_layernorm_output[i].add_(torch.matmul(dq_accum, qkv_linear_weight[:projection_size])) + grad_layernorm_output[i].add_( + torch.matmul(dk_accum, qkv_linear_weight[projection_size:projection_size + kv_projection_size])) + grad_layernorm_output[i].add_( + torch.matmul(dv_accum, qkv_linear_weight[projection_size + kv_projection_size:])) + + del dq_accum, dk_accum, dv_accum + dk_accum = torch.zeros(global_k[i].chunk_shape, dtype=torch.float, device=device) + dv_accum = torch.zeros(global_v[i].chunk_shape, dtype=torch.float, device=device) + dq[kv_compute_chunk_idx].offload() + dq[kv_compute_chunk_idx] = None + + if i != (len(global_k) - 1): + next_kv_compute_chunk_idx = kv_compute_chunk_idx + 1 + with get_accelerator().stream(offload_stream): + global_k[next_kv_compute_chunk_idx].load_to_gpu() + global_v[next_kv_compute_chunk_idx].load_to_gpu() + + with get_accelerator().stream(general_offload_stream): + layernorm_output[next_kv_compute_chunk_idx].load_to_gpu() + + compute_stream.wait_stream(offload_stream) + compute_stream.synchronize() + + layernorm_output[kv_compute_chunk_idx].offload() + global_k[kv_compute_chunk_idx].offload() + global_v[kv_compute_chunk_idx].offload() + kv_compute_chunk_idx = next_kv_compute_chunk_idx + + return torch.cat( + grad_layernorm_output, + dim=0).to(dtype), None, None, None, None, None, None, None, None, None, None, grad_qkv_linear_weight.to( + dtype), grad_qkv_linear_bias.to(dtype), None, None, None + + +class FPDT_Attention(torch.nn.Module): + + def __init__(self, + config, + first_weight, + first_bias, + second_weight, + second_bias, + sequence_process_group, + gather_idx: int = 0, + scatter_idx: int = 2, + return_bias=True, + chunk_size=65536, + enable_offloading=True) -> None: + + super(FPDT_Attention, self).__init__() + if _flash_attn_forward is None or _flash_attn_backward is None: + raise ImportError( + "DeepSpeed FPDT requires flash-attn 2.6.3. Please install it with `pip install flash-attn --no-build-isolation`." + ) + + self.spg = sequence_process_group + self.scatter_idx = scatter_idx + self.gather_idx = gather_idx + self.config = config + + self.projection_size = config.kv_channels * config.num_attention_heads + self.hidden_size_per_attention_head = self.projection_size // config.num_attention_heads + self.kv_projection_size = config.kv_channels * config.num_key_value_heads + self.hidden_size = config.hidden_size + + self.qkv_linear_weight = first_weight + self.qkv_linear_bias = first_bias + self.qkv_dense_weight = second_weight + self.qkv_dense_bias = second_bias + + self.reture_bias = return_bias + self.dropout = config.attention_dropout + + self.chunk_size = chunk_size + self.double_buffer = enable_offloading + + def forward(self, + layernorm_output, + attention_mask, + inference_params, + rotary_pos_emb, + cpu_offloading=True) -> Tensor: + self.num_chunks_attn = layernorm_output.shape[0] * dist.get_world_size(self.spg) // self.chunk_size + + if not cpu_offloading or self.num_chunks_attn == 1: + output = _FPDTGPUAttentionImpl_.apply(layernorm_output, attention_mask, inference_params, rotary_pos_emb, + self.spg, self.scatter_idx, self.gather_idx, self.hidden_size, + self.projection_size, self.hidden_size_per_attention_head, + self.kv_projection_size, self.qkv_linear_weight, + self.qkv_linear_bias, self.dropout, self.num_chunks_attn, + cpu_offloading) + else: + output = _FPDTGPUOffloadingAttentionImpl_.apply( + layernorm_output, attention_mask, inference_params, rotary_pos_emb, self.spg, self.scatter_idx, + self.gather_idx, self.hidden_size, self.projection_size, self.hidden_size_per_attention_head, + self.kv_projection_size, self.qkv_linear_weight, self.qkv_linear_bias, self.dropout, + self.num_chunks_attn, cpu_offloading) + + output = output.flatten(2).permute(1, 0, 2).contiguous() + + output = torch.matmul(output, self.qkv_dense_weight.t()) + if not self.reture_bias: + output += self.qkv_dense_bias + return output, self.qkv_dense_bias if self.reture_bias else None + + +@torch.jit.script +def bias_gelu(x): + return x * 0.5 * (1.0 + torch.tanh(0.79788456 * x * (1 + 0.044715 * x * x))) + + +@torch.jit.script +def bias_gelu_back(g, x): + tanh_out = torch.tanh(0.79788456 * x * (1 + 0.044715 * x * x)) + # sqrt(2/pi) * 3 * 0.044715 -> 0.1070322243 + ff = 0.5 * x * ((1 - tanh_out * tanh_out) * (0.79788456 + 0.1070322243 * x * x)) + 0.5 * (1 + tanh_out) + return ff * g + + +class FPDT_FFN(torch.autograd.Function): + generate_vmap_rule = False + + @staticmethod + def forward(ctx: Any, x, w1, b1, w2, b2, add_bias, chunk_size): + do_save = x.requires_grad + ctx.add_bias = add_bias + device = x.device + + with torch.no_grad(): + num_chunk = x.shape[0] // chunk_size + ctx.num_chunk = num_chunk + result = torch.empty(x.shape, device=device, dtype=x.dtype) + assert chunk_size * num_chunk == x.shape[0] + for i in range(num_chunk): + st = i * chunk_size + ed = st + chunk_size + x_ = torch.matmul(x[st:ed], w1.t()) + b1 + x_ = bias_gelu(x_) + if add_bias: + result[st:ed] = torch.matmul(x_, w2.t()) + b2 + else: + result[st:ed] = torch.matmul(x_, w2.t()) + + del x_ + + if do_save: + ctx.device = device + ctx.dtype = x.dtype + ctx.save_for_backward(x, w1, b1, w2, b2) + ctx.grad_x_shape = x.shape + return result.to(x.dtype), b2 if not add_bias else None + + @staticmethod + def backward(ctx, grad_output, grad_bias): + x, w1, b1, w2, b2 = ctx.saved_tensors + device = ctx.device + dtype = ctx.dtype + add_bias = ctx.add_bias + + num_chunk = ctx.num_chunk + chunk_size = x.shape[0] // num_chunk + assert chunk_size * num_chunk == grad_output.shape[0] + + grad_w2 = torch.zeros(w2.shape, device=device, dtype=torch.float) + grad_b2 = torch.zeros(b2.shape, device=device, dtype=torch.float) + grad_w1 = torch.zeros(w1.shape, device=device, dtype=torch.float) + grad_b1 = torch.zeros(b1.shape, device=device, dtype=torch.float) + + for i in range(num_chunk): + st = i * chunk_size + ed = st + chunk_size + x_chunk = x[st:ed] + + before_act = (torch.matmul(x_chunk, w1.t()) + b1) + before_act_2 = before_act**2 + tanh_out = torch.tanh(0.79788456 * before_act * (1 + 0.044715 * before_act_2)) + ff = 0.5 * before_act * ((1 - tanh_out * tanh_out) * + (0.79788456 + 0.1070322243 * before_act_2)) + 0.5 * (1 + tanh_out) + grad_w2.add_( + torch.matmul(grad_output[st:ed].reshape(-1, grad_output.shape[2]).t(), + (before_act * 0.5 * (1 + tanh_out)).reshape(-1, before_act.shape[2]))) + del before_act, before_act_2, tanh_out + + grad_inter = torch.matmul(grad_output[st:ed], w2) * ff + del ff + + grad_w1.add_(torch.matmul( + grad_inter.reshape(-1, grad_inter.shape[2]).t(), x_chunk.reshape(-1, x.shape[2]))) + grad_b1.add_(grad_inter.sum(0).sum(0)) + + x[st:ed].copy_(torch.matmul(grad_inter, w1)) + + del grad_inter + + if add_bias: + grad_b2.add_(grad_output[st:ed].sum(0).sum(0)) + + return x, grad_w1.to(dtype), grad_b1.to(dtype), grad_w2.to(dtype), grad_b2.to(dtype), None, None + + +class FPDT_LogitsLoss(torch.autograd.Function): + generate_vmap_rule = False + + @staticmethod + def forward(ctx: Any, lm_output, labels, logit_weights, rank, spg_size, spg, num_chunk): + labels = labels.t() + chunk_size = lm_output.shape[0] // num_chunk + assert chunk_size * num_chunk == lm_output.shape[0] + batch_size, local_seq_len = lm_output.shape[1], lm_output.shape[0] + loss = torch.empty((batch_size, local_seq_len), dtype=torch.float, device=lm_output.device) + + ctx.num_chunk = num_chunk + ctx.chunk_size = chunk_size + ctx.device = lm_output.device + ctx.dtype = lm_output.dtype + + ctx.rank = rank + ctx.local_seq_len = local_seq_len + with torch.no_grad(): + for i in range(num_chunk): + st = i * chunk_size + ed = st + chunk_size + logits_chunk = torch.matmul(lm_output[st:ed], logit_weights.t()).float() + + vocab_size = logits_chunk.size(2) + # nll + softmax = torch.nn.functional.softmax(logits_chunk, dim=-1) + loss_chunk = torch.nn.functional.nll_loss(softmax.log().reshape(-1, vocab_size).contiguous(), + labels[st:ed, :].reshape(-1).contiguous(), + reduction='none') + loss[:, st:ed] = loss_chunk.reshape(chunk_size, batch_size).t() + + del logits_chunk + ctx.save_for_backward(lm_output.to('cpu'), labels) + ctx.logit_weights = logit_weights + + seqlen = local_seq_len * spg_size + batch_size = loss.size(0) + loss = loss.t().contiguous() + loss_all = torch.empty(seqlen, batch_size, dtype=loss.dtype, device=loss.device).contiguous() + + dist.allgather_fn(loss_all, loss, group=spg) + + return loss_all + + @staticmethod + def backward(ctx, grad_output): + lm_output, labels = ctx.saved_tensors + logit_weights = ctx.logit_weights + device = ctx.device + dtype = ctx.dtype + num_chunk = ctx.num_chunk + chunk_size = ctx.chunk_size + + rank = ctx.rank + local_seq_len = ctx.local_seq_len + + grad_output = grad_output[rank * local_seq_len:(rank + 1) * local_seq_len] + grad_lm_output = [None for _ in range(num_chunk)] + grad_logit_weights = torch.zeros(logit_weights.shape, device=grad_output.device, dtype=torch.float) + for i in range(num_chunk): + st = i * chunk_size + ed = st + chunk_size + lm_output_chunk = lm_output[st:ed].to(device) + logits_chunk = torch.matmul(lm_output_chunk, logit_weights.t()).float() + + # nll + softmax = torch.nn.functional.softmax(logits_chunk, dim=-1) + vocab_size = logits_chunk.size(2) + + grad_input = softmax + grad_2d = grad_input.reshape(-1, vocab_size).contiguous() + arange_1d = torch.arange(start=0, end=grad_2d.size()[0], device=device) + + grad_2d[arange_1d, labels[st:ed, :].reshape(-1).contiguous()] -= 1 + grad_input.mul_(grad_output[:chunk_size, :].unsqueeze(dim=-1)) + grad_input = grad_input.to(dtype) + + grad_output = grad_output[chunk_size:].contiguous() + + grad_lm_output_chunk = torch.matmul(grad_input, logit_weights) + grad_lm_output[i] = grad_lm_output_chunk + + grad_logit_weights.add_( + torch.matmul( + grad_input.reshape(-1, grad_input.shape[2]).t(), + lm_output_chunk.reshape(-1, lm_output_chunk.shape[2]))) + + return torch.cat(grad_lm_output, dim=0).to(dtype), None, grad_logit_weights.to(dtype), None, None, None, None diff --git a/deepspeed/sequence/layer.py b/deepspeed/sequence/layer.py index 8fd3ca918433..3dfe149057e9 100644 --- a/deepspeed/sequence/layer.py +++ b/deepspeed/sequence/layer.py @@ -8,12 +8,41 @@ from torch import Tensor from torch.nn import Module +from einops import rearrange + import deepspeed.comm as dist from deepspeed.accelerator import get_accelerator from deepspeed.module_inject.tp_shard import get_shard_size_list, set_num_kv_heads, get_num_kv_heads from deepspeed.utils import groups +def _rotate_half(x): + """ + change sign so the last dimension becomes [-odd, +even] + """ + x = rearrange(x, '... (j d) -> ... j d', j=2) + x1, x2 = x.unbind(dim=-2) + return torch.cat((-x2, x1), dim=-1) + + +def apply_rotary_pos_emb(t, freqs_cos, freqs_sin): + """ + input tensor t is of shape [seq_length, ..., dim] + rotary positional embeding tensor freqs is of shape [seq_length, ..., dim] + check https://kexue.fm/archives/8265 for detailed formulas + """ + rot_dim = freqs_cos.shape[-1] + # ideally t_pass is empty so rotary pos embedding is applied to all tensor t + t, t_pass = t[..., :rot_dim], t[..., rot_dim:] + + # first part is cosine component + # second part is sine component, need to change signs with _rotate_half method + t = (t * freqs_cos) + (_rotate_half(t) * freqs_sin) + + res = t if t_pass.shape[-1] == 0 else torch.cat((t, t_pass), dim=-1) + return res + + def post_all2all(scatter_idx, batch_dim_idx, seq_world_size, bs, seq_len, num_head, head_dim): def post_func(input): @@ -304,7 +333,14 @@ def layer_sync(self, layer): if self.sp_overlap_comm and hasattr(layer, 'done_event'): self.dafult_stream.wait_event(layer.done_event) - def forward(self, query: Tensor, key: Tensor, value: Tensor, batch_dim_idx: int, *args: Any, **kwargs) -> Tensor: + def forward(self, + query: Tensor, + key: Tensor, + value: Tensor, + batch_dim_idx: int, + rotary_pos_emb=None, + *args: Any, + **kwargs) -> Tensor: """ forward Arguments: @@ -359,6 +395,10 @@ def pre_hook_fun(grad): grad_fn_k.register_prehook(bwd_hook(layer_type='k')) #out shape : e.g., [s:h/p:] + if rotary_pos_emb is not None: + pos_emb_cos, pos_emb_sin = rotary_pos_emb[0].permute(1, 0, 2, 3), rotary_pos_emb[1].permute(1, 0, 2, 3) + query_layer = apply_rotary_pos_emb(query_layer, pos_emb_cos, pos_emb_sin) + key_layer = apply_rotary_pos_emb(key_layer, pos_emb_cos, pos_emb_sin) context_layer = self.local_attn(query_layer, key_layer, value_layer, *args, **kwargs) diff --git a/requirements/requirements.txt b/requirements/requirements.txt index 296398f680cc..1af4c69c5807 100755 --- a/requirements/requirements.txt +++ b/requirements/requirements.txt @@ -1,3 +1,4 @@ +einops hjson msgpack ninja diff --git a/tests/unit/sequence_parallelism/test_ulysses.py b/tests/unit/sequence_parallelism/test_ulysses.py index d9ed54322d5c..821847c44265 100644 --- a/tests/unit/sequence_parallelism/test_ulysses.py +++ b/tests/unit/sequence_parallelism/test_ulysses.py @@ -5,11 +5,13 @@ import pytest import torch +import torch.nn.functional as F import deepspeed.comm as dist from deepspeed import initialize from transformers import AutoModel from unit.common import DistributedTest from deepspeed.sequence.layer import _SeqAllToAll +from deepspeed.sequence.fpdt_layer import _FPDTGPUOffloadingAttentionImpl_, FPDT_InputConstruct from unit.util import skip_on_arch from unit.simple_model import * from deepspeed.utils import groups @@ -157,3 +159,99 @@ def seq_batch_heads_hash(d0, d1, h, offset_d0=0, offset_d1=0, offset_h=0): for i in range(0, len(outputs)): assert torch.allclose(inputs[i], outputs[i]), f"[{dist.get_rank()}]Outputs differ for sequence dim {seq_dims[i]}" + + +@pytest.mark.parametrize("d0", [4, 1]) #batch dimension +@pytest.mark.parametrize("d1", [2048, 8192]) #sequence dimension +@pytest.mark.parametrize("chunk_size", [128, 256]) #size of chunk +@pytest.mark.parametrize("num_heads", [8, 4]) +@pytest.mark.parametrize("head_dim", [32]) +class TestFPDTAttention(DistributedTest): + + def test_FPDT_attention_offloading_output_consistency(self, d0: int, d1: int, chunk_size: int, head_dim: int, + num_heads: int) -> None: + skip_on_arch(min_arch=8) + world_size = 2 + + try: + from flash_attn.flash_attn_interface import _flash_attn_forward, _flash_attn_backward + except ImportError: + _flash_attn_forward = None + _flash_attn_backward = None + + if _flash_attn_forward is None or _flash_attn_backward is None: + pytest.skip("Flash Attention is not available.") + + model = AutoModel.from_pretrained('bert-base-uncased') + ds_engine, _, _, _ = initialize( + model=model, + config_params={ + "train_batch_size": 8, + "data_parallel_size": 1, + "sequence_parallel_size": world_size + }, + ) + #3D tensor : l, b, d + dim = head_dim * num_heads + + seed = 42 + torch.manual_seed(seed) + get_accelerator().manual_seed_all(seed) + + input_tensor = torch.randn(d1, d0, dim, device=ds_engine.device, dtype=torch.half) # l, b, d + spg = ds_engine.seq_parallel_group + + dist.broadcast(input_tensor, src=0, group=spg) + + class args: + + def __init__(self): + self.ds_sequence_parallel_fpdt_chunk_size = chunk_size + + fpdt_input_tensor = FPDT_InputConstruct(input_tensor.permute(1, 0, 2), None, None, None, None, args(), + world_size, dist.get_rank()).generate()[0].permute(1, 0, 2) + + if dist.get_rank() == 0: + qkv_linear_weight = torch.nn.Parameter( + torch.empty(dim + 2 * dim, dim, device=dist.get_rank(), dtype=torch.half)) + torch.nn.init.normal_(qkv_linear_weight, mean=0.0, std=0.02) + + qkv_linear_bias = torch.nn.Parameter(torch.empty(dim + 2 * dim, device=dist.get_rank(), dtype=torch.half)) + torch.nn.init.normal_(qkv_linear_bias, mean=0.0, std=0.02) + else: + qkv_linear_weight = torch.nn.Parameter( + torch.empty(dim + 2 * dim, dim, device=dist.get_rank(), dtype=torch.half)) + qkv_linear_bias = torch.nn.Parameter(torch.empty(dim + 2 * dim, device=dist.get_rank(), dtype=torch.half)) + + dist.broadcast(qkv_linear_weight, src=0, group=spg) + dist.broadcast(qkv_linear_bias, src=0, group=spg) + + num_chunks_attn = fpdt_input_tensor.shape[0] * dist.get_world_size(spg) // chunk_size + fpdt_output = _FPDTGPUOffloadingAttentionImpl_.apply(fpdt_input_tensor, None, None, None, spg, 2, 0, dim, dim, + head_dim, dim, qkv_linear_weight, qkv_linear_bias, 0, + num_chunks_attn, True) + + # baseline + qkv = torch.matmul(input_tensor, qkv_linear_weight.t()) + qkv_linear_bias + q = qkv[:, :, :dim].contiguous().reshape(qkv.shape[0], qkv.shape[1], -1, head_dim).permute(1, 2, 0, + 3).contiguous() + k = qkv[:, :, dim:dim * 2].contiguous().reshape(qkv.shape[0], qkv.shape[1], -1, + head_dim).permute(1, 2, 0, 3).contiguous() + v = qkv[:, :, dim * 2:dim * 3].contiguous().reshape(qkv.shape[0], qkv.shape[1], -1, + head_dim).permute(1, 2, 0, + 3).contiguous() # b, nhead, l, d + + scores = torch.matmul(q, k.transpose(-2, -1)) / torch.sqrt(torch.tensor(dim, dtype=torch.half)) + + causal_mask = torch.triu(torch.ones(d1, d1, device=ds_engine.device), diagonal=1).bool() + causal_mask = causal_mask.unsqueeze(0).unsqueeze(0) + scores = scores.masked_fill(causal_mask, float('-inf')) + attn_weights = F.softmax(scores, dim=-1) + output = torch.matmul(attn_weights, v).permute(0, 2, 1, 3) + + baseline_output_shuffled = FPDT_InputConstruct(output, None, None, None, None, args(), world_size, + dist.get_rank()).generate()[0] # b, l, n, d + + assert torch.allclose( + fpdt_output, baseline_output_shuffled, rtol=0.01, atol=0.1 + ), f"rank {dist.get_rank()}, sp size: {dist.get_world_size(spg)}, input_tensor: {input_tensor.shape}, fpdt_input_tensor: {fpdt_input_tensor.shape}, fpdt_output: {fpdt_output.shape}, baseline_output_shuffled: {baseline_output_shuffled.shape},{torch.max(torch.abs(fpdt_output - baseline_output_shuffled))}" From b966e1f97f537a46474582143c2a4e3398adc66d Mon Sep 17 00:00:00 2001 From: Logan Adams <114770087+loadams@users.noreply.github.com> Date: Thu, 5 Dec 2024 08:38:01 -0800 Subject: [PATCH 628/754] Pin transformers to avoid errors with latest version (#6820) --- .github/workflows/nv-torch-latest-v100.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/nv-torch-latest-v100.yml b/.github/workflows/nv-torch-latest-v100.yml index 0b8f504d8b5a..2d69d0b94cb5 100644 --- a/.github/workflows/nv-torch-latest-v100.yml +++ b/.github/workflows/nv-torch-latest-v100.yml @@ -38,7 +38,7 @@ jobs: git clone https://github.com/huggingface/transformers cd transformers # if needed switch to the last known good SHA until transformers@master is fixed - # git checkout 1cc453d33 + git checkout 6c3f168b3 git rev-parse --short HEAD pip install . From 0b0fef3d41feeb550845ef4349b36c7f2dd7e840 Mon Sep 17 00:00:00 2001 From: Sam Ade Jacobs Date: Thu, 5 Dec 2024 08:39:44 -0800 Subject: [PATCH 629/754] Ulyssess offload blog (#6814) Ulysses-Offload (FPDT) blog, please see corresponding tutorial page at [link](https://github.com/microsoft/DeepSpeed/pull/6813). --------- Co-authored-by: Logan Adams <114770087+loadams@users.noreply.github.com> Co-authored-by: Logan Adams --- blogs/ulysses-offload/README.md | 263 +++++++++++++++++++++++++ blogs/ulysses-offload/media/image1.png | Bin 0 -> 1314185 bytes blogs/ulysses-offload/media/image2.png | Bin 0 -> 134983 bytes blogs/ulysses-offload/media/image3.png | Bin 0 -> 187041 bytes blogs/ulysses-offload/media/image4.png | Bin 0 -> 319690 bytes blogs/ulysses-offload/media/image5.png | Bin 0 -> 91541 bytes 6 files changed, 263 insertions(+) create mode 100644 blogs/ulysses-offload/README.md create mode 100644 blogs/ulysses-offload/media/image1.png create mode 100644 blogs/ulysses-offload/media/image2.png create mode 100644 blogs/ulysses-offload/media/image3.png create mode 100644 blogs/ulysses-offload/media/image4.png create mode 100644 blogs/ulysses-offload/media/image5.png diff --git a/blogs/ulysses-offload/README.md b/blogs/ulysses-offload/README.md new file mode 100644 index 000000000000..740c07229d9f --- /dev/null +++ b/blogs/ulysses-offload/README.md @@ -0,0 +1,263 @@ +# Ulysses-Offload: Democratizing Long Context LLM Training + + + +Figure 1: Ulysses-Offload supports 16x longer sequence lengths at 55% +Model FLOPs Utilization (MFU) than NVIDIA Megatron-SP and DeepSpeed Ulysses. + + +To cite and for more technical in depth of this release, please see +our [arxiv report](https://arxiv.org/abs/2408.16978): + +@article{yao2024ulysses, + +title={ Training Ultra Long Context Language Model with Fully Pipelined +Distributed Transformer}, + +author={Jinghan Yao and Sam Ade Jacobs and Masahiro Tanaka and Olatunji +Ruwase and Aamir Shafi and Hari Subramoni and Dhabaleswar K. (DK) Panda +}, + +journal={https://arxiv.org/abs/2408.16978}, + +year={2024} + +} + +## Introduction + +In the rapidly evolving field of generative AI and scientific ML, the +ability to train large (language) models with ultra-long context +capabilities is becoming increasingly important. These models are +essential for a variety of complex tasks, such as understanding +lengthy documents, generating images and videos, and processing extensive +sequences in computational biology. However, training such models +efficiently poses significant challenges due to the enormous GPU +memory required. + +Building DeepSpeed Ulysses, our previous project, which developed +system optimizations for training extremely long sequence transformer +models, we are excited to present Ulysses-Offload, in this release. Ulysses-Offload +is an innovative, resource-efficient technique that offers comparable +benefits to DeepSpeed Ulysses and other previous long-context +optimization methods, but with a lower hardware budget. Ulysses-Offload makes +ultra long-context large language models (LLM) training and finetuning +accessible to everyone, including those with limited GPU resources. Ulysses-Offload enables +training with context lengths of up to 2 million tokens using just 4 +NVIDIA A100-40GB GPUs. Ulysses-Offload supports 16x longer sequence lengths at 55% +Model FLOPs Utilization (MFU) than NVIDIA Megatron-SP and DeepSpeed Ulysses +(see Figure 1). The next section highlights the key innovations of Ulysses-Offload, +and subsequent sections provide additional details on the design and +usability of Ulysses-Offload, followed by experimental results. + +## Key Innovations + +### 1. Fully Pipelined Distributed Transformer (FPDT) + +The core innovation of our work is the Fully Pipelined Distributed +Transformer (FPDT). This approach leverages a pipelined sequence +chunking, which allows for the training of LLMs with sequence lengths up +to 2 million tokens on just 4 A100-40GB GPUs. By breaking down the +sequence into manageable chunks and processing them in a pipelined +manner, Ulysses-Offload significantly reduces the memory footprint while +maintaining high computational efficiency. This method ensures that the +GPUs are utilized effectively, even when dealing with extremely long +sequences. + +### 2. Memory Optimization + +One of the critical aspects of our approach is the comprehensive +analysis and optimization of the memory footprint during LLM training. +We target the reduction of redundant intermediate buffers in both the +forward and backward passes of the training process. By optimizing the +use of GPU and host CPU memory, we can train larger models with longer +sequences without running into GPU memory limitations. This optimization +is crucial for enabling the training of ultra-long context models on a +limited number of GPUs. It is worth noting that Ulysses-Offload memory optimization +is orthogonal and complementary to model- parameter-focused memory +optimization techniques used by DeepSpeed ZeRO and PyTorch FSDP. Ulysses-Offload optimizes memory footprint of activations associated with long sequences while ZeRO and FSDP optimize memory footprint of model parameters. + +### 3. Compatibility and Flexibility + +Ulysses-Offload is designed to be agnostic to existing training techniques and +works efficiently across different LLM models, including popular +architecture like GPT and Llama. This flexibility ensures that our +approach can be easily integrated into various training workflows. +Additionally, Ulysses-Offload is compatible with advanced memory optimization +techniques such as DeepSpeed ZeRO and PyTorch FSDP, further enhancing +its usability and performance. + +## Core Design of Ulysses-Offload + +Figure 2 illustrates the core structure of Ulysses-Offload. Ulysses-Offload leverages multiple +memory hierarchies in modern GPU clusters, thus boosting hardware +efficiency and cost-effectiveness while achieving very high model FLOP +utilization (MFU). The design of Ulysses-Offload centers around pipelining, +scheduling, and memory management. These well-known optimization +techniques are essential for scaling LLM context length to a million +scale with a few GPUs and will be discussed in the subsequent +subsections. + + + +Figure 2: Core design + +### + +### Pipelining and Scheduling + +Ulysses-Offload employs sequence chunking and pipelined computation design to manage the memory +and computational load efficiently. In traditional Transformer model, +input (hidden state) tensor is projected to q, k, v tensors. Each of these tensors can be denoted *\[B, S, H, D\]*, where *B* is batch +size, *S* is sequence length, *H* is number of heads and *D* is hidden +dimension per head. With sequence parallelism such as DeepSpeed Ulysses, +input tensor is partitioned along sequence dimension across sequence +parallel group P, that is *\[B, S/P, H, D\]* prior to alltoall collective +communication. The alltoall collective communication gathers partitioned tensors +along sequence dimension and scatter them along head dimension essentially +transforming tensor from *\[B, S/P, H, D\]* to *\[B, S, H/P, D\]*. Post attention computation, a second alltoall communication transforms *\[B, S, H/P, D\]* back to *\[B, S/P, H, D\]* + +In our Ulysses-Offload design, input sequence are partitioned at a much finer granularity than DeepSpeed Ulysses. In other words, we made changes to sequence partitioning such that we further subdivide per GPU *S/P* sequence into smaller *u* +chunks. Thus, the input tensors are now represented as \[*B, S/uP, H, +D*\]. We denote these chunks as *Ti*, +where$\ i\ \in \ 0,1,\ldots,\ u - 1.$ As shown in Figure 1, +*Ti* is projected to query *qi*, key +*ki*, and value *vi*. Then, similar to DeepSpeed Ulysses, an alltoall collective communication gathers partitioned tensor +along sequence dimension and scatter them along head dimension. In our chunk +design, the sequence length for each chunk is reduced by a factor of *u* +compared to Ulysses. Please note that our Ulysses-Offload chunking procedure is generally applicable to other sequence parallelism techniques. + + + +Figure 3: Core design with offload description + +Figure 3 gives an example of how to perform the computation of chunk +*Tm*. After the alltoall collective communication, +*GPUj* receives +$\widehat{q}m,\ \widehat{k}m,\ and\ \widehat{v}m$*.* We then fetch the +previous sequence chunk by chunk from the host memory to +GPUj, and perform online attention with the current +$\widehat{q}m$ and update the output chunk accordingly. Note that, in a +strict manner, at any given time, only one set of chunks +$\widehat{k}i,\ and\ \widehat{v}i$ is placed on GPU's HBM, reducing the +memory footprint to $\frac{1}{u}$ compared to the non-offloading version +without double buffering. With double buffering, memory footprint is +reduced by *2/u*. + +### Memory Management + +Ulysses-Offload optimizes memory usage by carefully managing the allocation and +deallocation of buffers during training. This involves: + +1. Double Buffering: + + - Two sets of buffers are maintained to overlap computation with + data transfer. + + - While one set of buffers is used for computation, the other set is + preloaded with the next chunk of data. + +2. Hierarchical Memory Utilization: + + - GPU High Bandwidth Memory (HBM) is used for active computation. + + - Host memory is used to store intermediate results that are not + immediately needed, reducing the pressure on GPU memory. + +## Integration with Existing Frameworks + +Ulysses-Offload is designed to integrate seamlessly with popular deep learning +frameworks such as PyTorch. Ulysses-Offload provides user-friendly APIs that +abstract the complexities of pipelined training and memory management. +Users can adopt Ulysses-Offload with minimal changes to existing codebases. + +## Experimental Results + + + +Figure 4: Supported sequence lengths and corresponding Model FLOPs +Utilization (MFU) using Megatron-SP, Ulysses, and our proposed Ulysses-Offload (FPDT). OOM +denotes the point where increasing sequence length will cause memory +issues. We show Ulysses-Offload's performance when the sequence length is larger +than 128K, as shorter sequences can be properly handled by existing +strategies. + +### Extended Sequence Lengths + +In our experimental setup, we compare Ulysses-Offload with two existing methods: +Microsoft DeepSpeed Ulysses and NVIDIA Megatron-SP. Both DeepSpeed +Ulysses and Megatron-SP employ similar approaches to sequence +parallelism but differ in the collective communication used for +gathering sequences before the attention block. The former utilizes +alltoall communication, whereas the latter employs allgather. Ulysses-Offload +builds upon the DeepSpeed Ulysses approach. The primary advantage of +Ulysses-Offload is its capability to support the training of large language models +(LLMs) with ultra-long sequence lengths using fewer GPUs. As shown in +Figure 4, our method enables the training of 8B parameter models with +sequence lengths of 2 million tokens using only 4 GPUs. For even larger +models, such as GPT-30B and Llama-70B parameter models, Ulysses-Offload supports +sequence lengths up to 3 million and 4 million tokens using 16 GPUs and +32 GPUs respectively. This represents a 16x increase in sequence length +compared to current state-of-the-art solutions (see Figure 5), making +Ulysses-Offload a game-changer for tasks that require processing long sequences. + +### High Hardware Efficiency + +As shown in Figure 4 with different model sizes ranging from GPT-2.7B to +Llama-80B parameters, Ulysses-Offload achieves over 55% Model FLOPs Utilization +(MFU), ensuring that the hardware resources are utilized effectively. +This high level of efficiency is maintained even when dealing with +extremely long sequences (up to 4 million context length), making Ulysses-Offload +an ideal solution for training large-scale LLMs. By maximizing the use +of available hardware, Ulysses-Offload reduces the overall cost and complexity of +training long-context models. Our [technical report](https://arxiv.org/abs/2408.16978) offers +further insights into optimizing sequence chunks to balance the +trade-off between memory usage and MFU. + + + +Figure 5: A comprehensive analysis on long-context LLM training with +different training techniques: tensor parallelism (TP), activation +checkpoint (AC), activation checkpoint with CPU offloading (OC), Ulysses +(UL), and our approach Ulysses-Offload (FPDT). + +## Implementation and Usability + +Ulysses-Offload is designed to be easily integrated with popular deep learning +frameworks such as DeepSpeed, Megatron-DeepSpeed and PyTorch. Users can +adopt our approach with minimal changes to their existing training +pipeline, making it accessible to a broad audience. The integration +process involves setting up the sequence chunk pipeline and configuring +the memory optimization techniques, both of which are straightforward +and well-documented (see tutorial). + +Our pipeline design and memory optimization techniques are +straightforward to implement, making Ulysses-Offload accessible to researchers and +practitioners aiming to train long-context LLMs efficiently. We provide +detailed [technical report](https://arxiv.org/abs/2408.16978), +documentation and examples to guide users through the setup process, +ensuring a smooth transition to using Ulysses-Offload. Additionally, Ulysses-Offload, in the +tradition of DeepSpeed provides user-friendly API which abstracts the +complexities of mixed precision training and memory optimization, +allowing users to focus on their research and development tasks. + +## General Availability of DeepSpeed Ulysses-Offload + +We are excited to release Ulysses-Offload. Ulysses-Offload has been +fully integrated with Megatron-DeepSpeed and accessible through both +DeepSpeed and Megatron-DeepSpeed GitHub repos. Click here for detailed +[tutorial](https://www.deepspeed.ai/tutorials/fpdt/) on usage. + +We invite the community to explore our implementation, contribute to +further advancements, and join us in pushing the boundaries of what is +possible in LLM and AI. This release is part of the bigger DeepSpeed +ecosystem of large-scale AI training, finetuning and inference. For more +details on all DeepSpeed technologies and innovations, please visit our +[website]((https://www.deepspeed.ai/)) and follow us +on X, formerly Twitter, ([English](https://twitter.com/MSFTDeepSpeed), +[Japanese](https://twitter.com/MSFTDeepSpeedJP)) and +[Chinese Zhihu](https://www.zhihu.com/people/deepspeed). diff --git a/blogs/ulysses-offload/media/image1.png b/blogs/ulysses-offload/media/image1.png new file mode 100644 index 0000000000000000000000000000000000000000..df63ef8197633bc1b1055af3b905793538a7be7a GIT binary patch literal 1314185 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

_Hwc`D<*OJ=McGq(FEvrpQs- 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

|Ndd%~twizH@4r^H(8{Gu+@UdLNN>n- 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�_RJ{fbo&DuG{o%32E=WC!KBk!wMNTvpw% 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

  • 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�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 4^%82_ z^%9n7wZlp=0j7TDn-&2g;NJOeKW84?lB0|d8G;Vji<6J8RC4Q1>GDp1{{1T8h^#U)d5Mt>w zFZ~|9QWmYCA`lXr0b!y*NtY&-;I}*zpgDUn zBfMS|9k(r}K^%Z3jpPJ^>4_3Gpb;CUi8S1R!;j?VBJG#TI%cBUHOSP)B%z2AsaM`7!U1M& z?QYHjsi2A{=Cf5%Jw}}x7o5OE6qQ;cd^gy=<%9`2tA~)Nhi4JHwJcyY@R{MqbR~hY z`zQOGWgoBW2vWnzlWh{rFYsxOLW%~G!Z|nzGzQkvkh;|?e)!9xtqeG3h@S$tJFRBA zR0LFw$k9`z3RopS{(d7z-eJ!46QJ@iK}@;VrE@ru5fS~(M7ygnZA`UXiCGjZWfe-+^K6TdX>NXI(b#kvegKhjbro6d z?o`HWOZU`ci}627_%#@3rk_#~V!`WJ7Fg3mt={_1zoC3-5vcGdF|hyT8~Ga#^GETs zi9%G(+|RDp{RYczh(e}dWgBk0`tmMhhJq6kXlhstb~ZN3-{Z(TzuHc?4l@(gHXSqn z(KTPRPeBDluq3MAqfZASGcmQ?Tl_OxgR&FS2*;Ct(i>1f*feGe$-w=%_+ZB=4#dBdYk%+hx1rzp8e zQ!=g_Tu)W)zOE;W@6b|QAyd4!G97^NS~7#xdWDr~QkjzXaq8n$-flvc^|M0q@_lK# zH}F_9dU1I<&yktWY+q%#@ctjmIOo6am*qY8_T@h4kURM%Xxs?Vyn)VY^G{H$Zt2kD z$bKs8XPopdWv)aNR=6X)nqT-8=CBds0i~sJrFN;gD>&s^GW)ixp}s>WIN5#%AVo%t zuLpWggmk|A6eE6Cqp)LCtbKlYp?Mbk3624zlrGqw4l*Xp&^MaqD-EF2oK`G)=SDw* zkYqlPkz5PB5w;h22%ShH9c~a(o*)xNUexFy4ah_mGNAz0PL4{(Y(#jVuCa))>&28$ z&3afow6t3RvZN%=ZlcgfN24NO*%po6Co)=n$tT0Z~KhbNA=y8RP~iN`!vy|{}MVS6yXGWlw^Wxe4irUGhS{RO!Y-Lyy-dX&`%!&aRjDMFCcy> z+dp9@ak}O}`Aqj6IV#3<4}~x`?^aH1J4my}xHq3Ex505qm>J1R=Qly4EkAsD9(dic z5X{X?RQ}9GPIOH&!xn$_P()R#+o=&mYJ@3K2Z1a-Qip0$ zHE@7)`OS0o>k-J52Yl*GD4+3q?n~|gR>bK_zL3}7HM!T_5be27RKjYAuWCsoa{ThW z!5oMo)x*+4Yrm<=hIJEbcnAj5i=eGg8gfN%4J@|xlb*a4lI02)C)?36QsA+)A|JF$ zR?z!zA1?bNI51O-;A2nxH>-cSCBZB|k-FvnDk1SpWWWtcKvUtyMv9s+NeP6dAk?^) zLjXo0xM=#;X(SZPYIt9pPjX!(#87>dm}=CiyetS7#W^ousFdqVu^!f2Fjf~2NzM}E zO^$GRexa$ab0J2|M5MIgcZYSW>xKu^k=C$QD->D7pFWN)Bm?uJGTI2c0oa7z+D2_+-~0L; zf6p_Q1$94EBez98-?!|bE}6Aa&i*hoa)MJYM!o68r|DUj`f9vta?TdO@ux_zNIjWn zzdLxY%v()q{vVel=m=N7_}UBH;PKM;9#40g|Q9_TLq6?Th@n}-yvUxQhs~Q^q>J!2LSbPJ5 z!>E=&vj~y5^u4{k|8T{nQU^Llo+4olK27y&&>Uhd5@cU<0Vtdv;}4j2N@Z)4_7>AC z8RfPeSeQVD#~6~wZ)^iU^?WolVM@!(SCyS*XBmI|p;!a!K>lwpK)gy?rvdTpdf!7w z79jvwhL}5a-S)RBUC>6oc?JJVCPE8^RFI-6`hdPd^!wdq{<2hSbN#RWp6votvolQ4 zf03T=zZxYq8w#?m6XkzOzX|)mutW< zTgV0h_lEW^%?izlTOd>9=h;%)QJB9p+KtEI11C($!qdV;C=me;WqQ~MdAKuWIDL`r zc_F!ccqVUyiI(odEUf26lx(y6>FF;dN5(r43fcMR8wJqQiP(-kP&i9O8v2Aj05>{9 z(2HA5Nh!dxsuj98%LP9Kg}Af$Ymm~W&x^I4V|vE*$T%{I<&Pg|X$}I9TY*kxU<=#- zE)s$5YrxptFD@)Zu=CywlS_^reYH9Q!L11G$syU(vMj$5z#t}|a~}#J+R#zeSKW<* zPC9^V=GTG5uY!;2ikRD*|MEcgGO@%0y2j;~_;C|^%Q~wpK(OWC`dz=~XQ&JAT(~G% z(?k;_an|!Mj*pAE>UF}v^-3ddNmQT5K4SQ-#7*jviZ4-FF$pZHtF6$?!|CwmjncoS z*YDdN{;lHwFSF^i_rJZ(gZIznte`%_h^$vLamI+D%Qe5|?4OKYHR0tSW|$$ecOs-h zi}Qvz*`6Qjqxa{vsqkesxEeQyIeGTy=tl|R1oFtHI(GGEg{j(uW38D6PXr3hz%=#n(qi3cgZe}GFh$b8G!ZfJ1w~>lwS=qc zY=(V1RKpI)R77l;h4~cbWn`lM-xu5}?KjA7iscgB}|E$yOUwDcU;lyc^sh zjNm@hm{hm>=GE&Ja{K^Ns5(j^MW=Bd(tt=GE|7a6h@bKZP2bv^eu0BSXdY9BhGyW3 zw>J`+y@5S{Ac>Ln3rwIFJ}>QRd2V0SPE4#ocR3OptV@{&epyibhSjTEZ+t3q0VaQ5 zom7_-{>K2=U*AAa4&Qeo-3`^~5}}+lMp=ZiqMiO<4zDiHwFQwHb=_)}iUpvt#F%IENYV++sll5Smw+;-CGWZvm+XrD3 z(U8|!vaomF!>+K?f&T@gkSCR*A`Ue8tOu)ktKTPZA-rD40met0E$x;dSfQyA;lA00 zK#0^{dtmz!IekI+D_+zVOEW-KAtXSk4|S=D=vxa`2p+nT3Lz`e?Bvr|2XWaDVL!!G zs6eT_=y{Fjy-S1h4Z$=CKU7B*p+q*Ub1uE$Z9F)UYe7}IC_QB+@%)Q z2puiBt?zMI7?dKiQCa1r)zkH#k14j5NB;CD#qB?Kg!xY^)$v{;#F^39NY_V9v(E?yR(rDJoQ5l^(vQvY`#aI zJ;w7osPVaP2c`k8hfb?WhL;&nBBhKUB#Nu`3S_b9!B~1t*4p=di`$a2n3y*5WBDy! zI6gmy5e*?d z+;eU04w^A9lY^UG%-l{3oTioD8T0q&%oBDwB0Wyn`WW%(p&NYG9lFQBjjqNTSs7kJ z-$e!Nrz3MnJI|csBcSv%*Fh5u1GyMdh>0j^7MD>s{+C>iilU-#<6499ySt;M+A%CK zT!Ut33k5RC{#n_JSzQm%bJ)as+9Fz7TC-)))h3yfHd!@aa(Rq6RmI#UgDw#U`Q;K)Kn5I9%22vst|{&|vc!}Dh3bL5j;E<>{O zzj(;^dH|p2(++mRoTe4j_{5hahaS{_Uz3BoT3knY$n8qk$Gfs*D03>MoZ;E+~S+VtG=gE{FQ< zhnV=xCJ7jq5fTrKpLM))y^HO<_cGu266J%YA-Y5aUd~vK+B!GAjP&Y%gYvmjTA^1f z@4}4&yaychwc8(&cWr4P9$gNu-THa_;a+#)_}v(~(l{4ep$lKM+i#TbEMGHTcs8G6 zBr4)1yY3&_qvLp{GL^PSW*(~!+ez(_3O@AQ_p$7uFM+>*^tbM=*`ET>GqL^6K8yT& zd;|{whxWrK9G$cIF(bSy+(RU~O<>^>@`v?t<=qVl!_Yrt8YGHI?%zA#mkU#{NJG+O zpJoWKkNKxLE%1WR46~Q>PQ*tZxqAPGo3|a)2h#sYr8Y!cDA&OMf{HP+l<7L~^wyLU zr13rbclz*!X4APCr6q5ixHA0HQ2725c%frLWrX6LSP0V;bDCVl!(Z~<2%yD!x6ePeAAt~@rp4&F8@*EK|gqoFkEwq zro5rnVXK}sOexb5KP8)^8F4!DWVFtGXvWn{3!|AII{K#KRa)WxlnWXDo}YIQmL@nh z>AVb@-8112cGvW~1Hi*&Cg9M|fG4>SDYPYeJp)haU#f*KI&Nt~j6`1g-9_cKQGmyg zKwaBjObLhT*3s2p33||NnyS!dbOEe zo!kiBh8|+fGNF0I=1?Ds*JU&Tm(r{JF)f#)wR5__Tjk0MhHu-$zs%GBF~M*q@d2O9 z@tuufUGv3x-#JvdlW>9%VeG31l&%+hfFdQfkJ}+gWpXsIBj?%N>yCkm-pCQhVKd84PH9Pql^Mml;;#U?Mh|Q%)Yykp{74px6L>~ z7nKgHeLp6gB%2#U*&~Hj8C|JyD+S8&nU1PW#2V+X1yPc}fnka6i{i!*RQfkj5xVMj zVtnDp4=VYEU_P7Bm&(W;bopw-2#jHZj7=#}I!u}@Zb)UOqvlNHZdR)n9Sa(f5~95d zY%rVnd}!kPW+IBJ)X+6$jo<=$*Jw?mzhJefUej^(z7R%8(|*ofx(qc)Kbl68CaZG~- z*>nz@4L9olLl4+n0I$a0C*}%ds0_8nU!B|t^s*}NstR0#-Tke)kGG||4|tBm;dHV!nt@pdnvlV%tXQpBvOe`duA z6~=wAu&}86O^MvVSR{BA^I?E!c(zmzYK9v23^^n{TM5CUZY0T5@{Z< z(}IH9dl~3*B;`v}BwIq65}gDE20541sBX@X=|oT??RP?neK;!*DWCmePT{PhiTGAV z=65au&jww7yU(G)6M%Z0WG^+>rb)GjpS(5(YtbQ3>jth23=9nXc=E%!2IF~&0yC_; z#TbDnpB{TD30flDy>%17Kyu9*TBl*S&hAvYm2K7y`UUsbesX153`Zx4+1+l@lar&x zhDyr}z54KhqX#iN+`jH2X1i)1{rP?U(kB!+w!uh)dZ~g#^@(aL`w`hG;4EuY=I+7R zl6+CI9oL?0dW!SwA`Qd@Z{U`(HVPN^W0tM}vf$k%55`VPm<^d0U*J%-hN`K3ih9`BoD(3CU zW|wmx-_W&_^F52l``M`$rf;+2bwd_vz;WZ67d3I{YBjz~o)ab$-TKOvdraVNPI>mc ziEr`l5Z{-if*z0OXu7NC-;@xG!j_vKVt%{4K>H92Hv;6G1C*WO^Q<2ajbgerid}d>D$uo4#EY# zu7M1&n~YOnce!bL>JXu+pR9^obC9oO<7icDGBeEADt1Gv*F*3*0xsH4zvdAfV=5G! z(9heprz;b>@def+M%_+_By!P^P38#b8ABX|;L_`Cabq0~JK$~|6geM{9C+ip<4+{FJZ2jzDy}u@fwRP}~BF~j*L(>x55TR z*tIhf@WxE8d;kfKY&cD7V)<*hF!#Glwf+Cu@&6N$1!A*6*MDNU&c#MiHMN1$PsZ~% zcvfi6M8rHW~~tbn}vu$(@~~6O28AZEzKwQ8700Bpm~N+|&Ma2?{X(-i}F6 z53UlGjo4_2+o3{&wRomyr=`P|@^Nkx)Ku-Co)`-ESvRTDcY+k|?(Xg+DJ%q+U_lFa3GVLh65QRPE9dL;(D(N1eq8m{9(&C>#y`MG zjFcyHYPHB)04N&jBJq)NEMrn;>Oy6Cdu4zX{->T^)cf*&&PKdEWi6^9!@tD{?H*Ey z%FPYf7YE|>a~ybtKjEo~!%ZKk9!))>;Cd#x7-i+fH8k|?(k3OKSKq@BTAy8c#9J5> z0W@QsH$&wQ>rNx89EMTcU)10`Wp`B*lDP7`EmwSBY<6@{Lg7ARhtQO!{vGOi9~UOx zeY5vgL?x?<_3#+;{%t})Y-|b^MJ!523jq%oqws81f3~Y;vNlQOrPv@BCGT;o!J_T5 zO)s{w?NZ8ai{SQ!!a8ag=7`+K-5yAY?QRX#KXF9gOgbg0l6R6RsD!gZ&km;2VH_O~ zL~Ve$eIov-)^3v(Ll}kFicaMHqoM@6MVVpg5ZhxzkZ`byy0GG0D57eoQM8O%WhtOP5w z=e!h^+i7(q1hen^;lqVx5)J-r$l3DMFI&k{yGnWKfVbHl_UF)dM4j8ywGOV3^xJIX z-P(>Y-c?3_$s{#cLpVkBTOESV3sPi_aj{2AWX?E9?m!WaqeiS+HSF}alOikHQnqSejW#I6G8PvI_z6_sJu-;*HENX3w<#ko2{Q0**15<@n;*Fq(zFJA%4D zcQJeO&$xgN=|+_b*|*KzUmC?I;i@P^1BpqLOl2lBrWpBblrn8UK9M!UW7CosP&r}l ziz$+MoKxkup%gH4o9d{bA=}b}j1xgk!MpLB_t)gCl&W(42!5_#mf4skKME-J1n;Tl z+5k<*%x@K7>A8cAi(v&tFmim{;0nxKRRqLBMOg`a6=0Xayj>>;fbrs?K}PyQeD-)# zcBe5F+>zrIRSL&}hi-ASv2p1p>R{2zQYI?}y6#7ZU8tYN#ge!MlmLd`>bZ!NDax*h?hrK3l1ybJ!M;xfmO7 zD#Y>M^KvabKXdO~co570?WPq^d6qLlTW2Y`glZu^2}amfDCYfO(N6;#K^EHKuCCic zI|AL!>slL>WfR4!za_6+>A1bJoCF{%_6QCuujom}XQnw`ub_?NdVU5m4v(pjYp9Q0$4~UIm>&x?Ox>q5*;H)X*+1>`VZt{81|69 z-6dfMV(`Kx(&nshXy8$Ch!HJ3Eu#wtE?g1TMU`?b3rE@hc{3Dqb>Ym0o^vPB--NsQ#N<$heO3c?r6Ljp7G$>Kjscj#fE?c-8VVG6r9(33rZ~G!U#1wT68}W zCzKmB^M4Pfe=tv76rtPgu0Z*D*x7YB+a=dLtxUwdb~!dC4ThtuJ)>tXgiWm3Afz|L z92{4pfjJO(%S>d{32Zst{1c354Uti?$8`m?7k--02fFxMTJ!vLbXM7-{I|8JiDw=u z36Q!1xYyS?`QThaQ_S-VTH$rVpISYKYfkTSfyb4c*zuO#?(^f+SM z%#pY{;PE(^<-%x)enc?lg~!U`b{Mtc29>XYekhkqq8j#u4*cF6*oo^*OZp8D#RxV{ zN76ya`w2e>dUeX?p501Lic+PpB{;p7 zEKmXBkZIgtdCz%me`E( zl|nQ;5zIZ{P-=mRU({4NI1qmp_Ts9;@5xi9PJ$JMJkKX_j*1b88zL^>)Rl^LSgEl! zsI1abg;+^sGS4D9puTYtHr@BHE!Hhl=NPG{Y$ef{Th(udp6{CUGlWt3o$UMDxgp|< z=*RUr*&HCH{-~!1ji6_GN|Do!j`#0*^=Ln&XwIHB{4l`myfHH$eLZ4(P!JZ6;ECsq z>kfC6tae{eesS2hgkvDLb@5N1#M@ka5#w`sAp8q%b=u%p6!}Ao+bh~wHjwU&Xe>X8 zhThylfalOmZ#xvhdK6Zor-IJ1a`^2h9v8+q& z?PVgU$qf3qupCmoBTndLj)f4%9LCz{Jn=AL47Hg8jS+ zY(BJo(R%^VzS3*rBO}RBv+-MTf3eT{K0st@h=jBO?6MhGl~G#gnL{dIsBFt_&lCR{Bf9wW4v&1gAr>_eDd-Nf&^lXhfx!s8Usg;{bskW_y0$GE*EwzyxHug|It{0_cLYj8T4 z%-t4V(uioKd!1Yu;!tbz+de%%)Fo!6!y_HxW5(l0236|RO1~tW$F{Q-aVJg^%q^?a z1P|sLrWMb)o$f757dKbhLrPp==nLc@LmZVi18evfetGi0CLatfcRuCIb9CM#O@vkOlTTj&hV9Mg=dih1z!ce*TD{(WuUqT6CRK*`KgD$BRD0}03h21t2}B)PhS z>#07-6A%zYRqw!Q;9ZnXsP^I4vYc|Yzhp*+jXC(Um;+E;$jcoiA zP0;MltHNWZQ0W+>v1#IeO_BdSp#1(XmDrYx_5Qgx=uSU(7Q_yG2?G9rMAU=Qw>$dZ zQs5p&APfizs79kUtc*tdo@}yCuRuORnP1uHV+mJx#T1f$z!O!Kv>3V1i$vG+>bJHq+O5iaJXJV5|(Ew+F z-6kZKHVd|Xa#c7Tb@<8pqBh`8;>Tj$sc4y?rO^6p^R91y#p2ONA44NboyHOj z16*;@*)f7JMd%dGMb|s&v9u;!M_(d6RvQA@4c8ms$->D>5|N2Og`2~hyJgQnyi}xOWdX zPJF3V-Nb#?bjObsSp`=UH~C1a>p&;(c zjFpZjr99+}CUAuIS2Ox+p6msqh-bj}Tsp z#ZWv7i{I2oGQjz*+PuMWgjhkXp57gloMC}v5rW>RIPTxg?0Qi3})QZIpliUBi9*Q+2M#d*@`7$g*q~-&|pORaAj)pqwHLx<{~9+1;nAbCS_w`jIU4 z?XAH&Kp;NT<))gVRnj+`7aLOzZY6DLJ_OwnL+Bj03bKlRVZm+%A;lGnWVBIt0ppB{ zn!*|ACvzyOou+WgpE``4LvrxL%IIu(!Nkv`Kf+yUabODVE?;dJH$HKmb#YX53O~G6 z0Wr~b_M_?g#PrTo)oBhOHDx{2aY7&OqGzgs&V@7HvV|a-Il53zIN(!ve>4&GQ;18c z`8)xDIGfw+Odoo)P@oaw1RNTGLYG2yb zyv)kdzgN$snF*ij{qeFeVhp5J@SI!=bPiSVJ<5J~RSvdbymd{+(!y8LpeSniRAHxF z<@sghmwawrqgbQ2LE245upZ-1YsX%?o%8$a{e9hchVw5nx%FR|eu!-;%kL-yj1c0E zu0N3~x{jZBS0u-V2GE{v)+>XGVIP0hcwd^juq0aT`i```wQoQ2(%v5`K*$xsbAqWI z$jG;9F7wKLoHGqLQ2R?%;J?c{LG3H_pSr_|U)F0mvtqVacmGs&j2^D=8ODWZ?>r0m zNY~UCbod8hivDLMdi_BEYK5<8}IbUzoC{I?DLDl5}6 z_V3lX*?9>S2E2?}F|U^oXKYb-qdWM9;<%nYirfH%^_fM zbk=u9iML>vxajI+bIl!BZ3p8E{K1`tXwlpQF2QXP*jvEEgSgQETC1p8Vb_X$JJ;5g zan8z;h1Pn)i|X?)pLM+rj>Ct(w*LQ#0{jn|!|$I*%a@wEy^%=ko8oyzZ|NOlA_|zv z@t19?U+}at-mqj&A}HPgT~+9zr`-G505xm`UH>sbEcLC=zgQ;?x&Y>HO>h;B*hW2c zso{$#mxJ#2lgy9N@5>tWsoq>%hB+swI(M7c^3@58oO}i3v;xbOwh&v4`A*CnmTmyN=5#i>iA)UYGGFC`K;% zou;Y(JP3U34X(XsJZJPfub;mUuv|d(P!dUEH}mHtVhKOg1#h(A80^FJ9t{Z77)w zLC0D=joW(1hP~v3;zOJ_o=~+z78(yzC!DHUy3W>Py2T{4ZH~J50^11f^>=u!RZeu< zzG@8fKp^fBv_8M7P&=Ok6$-2zMH-yDiFhM7bPX*oYFj*Ch0&YUNh~cUH5 z=`Ou1ca*JOICa6Xliv=Jl4k)iQd8A#uy+pL$knofj01`iuaFF*wlFbt1Ss|E6Uvs+ zh+3`=@`Z|Nz6XJ^Bo?VKf>d8UjB7odxB`tDXjT^hx7hjurR%w@f})|As`ssWMnYvS z&_izP6KZ+6u=kCg!(vAx5^@_9&x$0sYB3GldmZKYD}euG8Z&wwso`BXTIu}&-}(69 z5I)t_5?Q`KiRxQ8waU}qcl*8?8I&m^j7~08Xki!{V`Fm*)b^{=p~>M;n0{r(69g$e zR8F6o4|*;NDc3jT6iobP>yD>PM=09Q1kmon((DLJVI5KP^jlj%oE|4LChp> zt%iCNxfycz3=?P~#1a)-d}GOcDC!m_719sl+%S{tBJMhR4rW(!Qb=>y?K}yvkmU{C zA~U?a2IZ>N)|Y!Ov)k)aLaiId{uGf2m;xNJv2Y@=_-oz>`)i(E4LH&_gQOO=pw(;B z%|Xp4F?l-BBFL;m9h;b#_f&ER1=iyCu=8ptBXIWp8Kxk7{$DuxBKX)j6(^NJ(D)cG z)H3-IVyJ+F-QkCC^m~8az~~01nFaf?ubvNCa&&&j{1lccaJpeWGBdJeK~8K`V~(8K zL9pX{LC}5yzo5`up#VR)#c}3>QJ}jR^turAJ@|VXxWD9SXfypEJW%|RamF05Yy1#5 zT#5#lJ{E~0Yi4K&v_<3~PnBs8q&N!OarB_Dr5sZFl_o+m%=6{ktme_4?Wuto{mchv zbl5U1H+>&|l#JJrG?~?iW!%-g*8iEUBZ+YHaX|E~dK8`iH4B*^i{q~d$NhX{ca4}o zhs9|~Vvmje-pU6KOb<$nvDSNto0iYJknWY2$a@cOJHE{sN3tSmQexi>}H0# z!B-e}g(O3SQ`gY|$Po;DZp6eQ)OAxICSA^S`(kh>!hCJV!vCS3!;$u;kH=~g5kY#h z)~{;p^FepK@0Z+f@UY4IU|oi5rNW~M`}Lm%`@3Ge9{XL9a_YNO&g0j?OY?xp>m^!s ziQDatu6AhzRn87-?g5PZRgT5>R|4e;MES2xE^#zDb?BWb&=*npPTyWRCjTlx3B5Il zAO2a#uel1D4)LAocsJ^T)L%bUPJ#l-{4pNL`D}$I*VkF{=CC#0YT!}vH(7%oQNdvF z6-y%;?I?opUV0iqL7zJkbJCk}sIWe%cB3PiW9y~#r5Gb8i=)u%%}jB5d6I#^LC46^ z*chQSRF-H^J5+2lLuzROrD~e3eqp*z#Up9d!U(R6PLVs`5bCI;Y+`%Rs`)W1J{S4BfYh+U#8(nIp@Z%)niIO{J*Cvd(<}kW zYO{e4nLc}IA6vY5Mm)&l8C)#YGZVXFN?cXrQ{0{prheBZd(f}&r`(NrmY3NxaQ}tC z!_c{y4qt1m5OHKN0z2Q6OH8hb#RvWs;!druo@gUDnqC8dw(FN_$v2cx)5DJh59AlZ zn|_`5!ROE$uW{0|c}-vzNqYsF|JNkDi2AuNg6 z4>>}FI7dFRCE-7z>+$N&L1r^SOeR6x>(XNWyk=$M! zq$7C3_lkSdBYukDJcOK^qKre;8BkZ9Mrs?fHM~HgF%)$2oF=CFNAI0VgQk5u_PR5> z;9M!Ot#Q!N2mem*H!=TX?fO_((1UvayW1(@~3?kl(# zUk)ZP9am6CVteM@;iMJ&%DgthRWKK?7AKsIS4!Eo5rEyHt->nNN9vW`p;01G5~v@S z*Q4jTMB$6+-$SLo~98trys)&=CxJXAdw#@M&e`1ph7lGah2jfHI>K4*-C~ur?H!T8|MRAjp7H@C^;dF z73|C{XsJzAn6_1zElTxjc)vaeG`;_EuwEkx&BX&)h?$7h`nhbU35-9gz`{g;>8-li z5;_?lzZl{>gqeH2^JFrYcxB}pD?3c-rYx5xZuNZz4p^fxMS`(Y?YC0(77>uDeT62C z+m2>%icdZRQ&5~*1;ttU$ShxKYl6zXAQ3pqv(V<2tfX#yHc*a?w9?jQy?i5JO6I4k zEBZl0oj{z48TS>aloG5o=2K<_^9_vk>FzY#f{-3e2w&PtN(HW{5k(2kW{{j}Bx%}T z(VLvoL)K&HxpaeVdO;P^y*am8-4WV}<|KtJ{!pm33M3*LJcIOo_&^uN0zSg+m3=KX*&A?ve3-QIwzf6dOE zIgBIfch4%Y!mFZIIf{+O`89#NaD0ByfflzZuV?x0$*7BiEjW+{uzUK}PCTJM&O?vrsR99m)u6btcwA(hc?8AJzeEs_DTyhSTMX<$>n#Nzk z8C6u_5EUQ{Gw#^`%9$l-jA@aao1ZTk{aA0e0P5^^JnAiRM^sNz*0d_xKn`^~vE;1m zf;IQSLE1JLdU^^ItyyDjIrw<8 zF5DylSiOEb{1OD(-rf%LfdJBKi;MYj`#A}jG|TvkwSNs$Z+H%JYa_tgVe*--TrQEs z4fGjuKOa>X2)UlwD|bN7Pxx$sAP{*z)= zL?ET36A*dqrPFb_{N9?V#iQJozvZd4cb#zVc<#6HER>zS?IVs5h#Vnq+=Zszy$hh$LjyWy1ggCAl&A9qvy z9Q7*SoYg=SXI2>}f^&8O2+smV=Tv)cpY|WNvh)yED&M;g9|4D$yl2%=i4{mz>Jj~O+>3=ziq0Xr(bObZcpzM76llM;e@wNNyu z!Ffx(8oC`KV3|>=wpuLaEg{B^ou=by9X%5t| zi>`+okHwb0IHNgEyJ88~ z$EQYZyxIl)M^68Tz7mpRJOD~~MGGq__~9?)v2{v5H@h1%a>jkaWtgrjSuUZRUjJ$l zM**0D-rOD`R^b(kNQRM@g4{S(!foM9)X;$n;`*TU*-b%GdJW@LyeB<9ZK7|h1gKK=CyEIukyj#iHY`xgsZVc>1e!24z#)_XS%%CsRO zbenLz=~J*>I~Ph9BPgauUoK~MuLCt`aq+>FB=D~9b#Y29BD@?+r#ICWmUm4f(k2Sk z_%K|egdCj1Ni5YZo0DG*RiKG^>WLP#_KKgi_y_fuDv242{KXscjEk;A5)_5TNdMj) z%ZqD|Z7aE>ls+^_0$v-)iEot3MIyG=O|o|CUEijJ8AX?*X=Y*pi>ZcL_jxfn)WR?0 zB20xu7-}DJ)w1l}YVJybG%7*u@-wcTXg{7E0qLfa#f3VvW`h^ID zKEgHm$BN`bnIE!d9-{3M64$7H_|NqC1KX95M)F6hWfES{v9?xd2uLj)gj3nu>J@}r zeMegs@Zxo_{zf}1NeC|d?Z3)J>ecmCMZly1iVuek>&!mHCkN*;IP~hs7dH`zB(;=C zl>8Ye^BFtA7BjgJN%ITN57y^uXl>#=APW2EPeAxTAF;S@$pE7WAe69FRp8g-aN+W7>M={&z8j7&Zq1R_WoYCX=6Ft%9_)HdPAebR zogMWXojVRhqDy_Fa~t?S8L3B_rMtDYaYQj;y;Cutwcgz=y z0LVdD|FSc*Pxu#Isy;AxWbAqzCv&{7CJhhic)P8Psvhy-pUHf3;^|XaS3o+0_;0W# zSYxv_N;T!ggp*BP9xl%ZGsGyoMJ%rV4xJxZaU?0yQQ-VFrL=80h9oZOU`(ty>FRs^ zSHuuz3WfpR$rIbiIJD-U39>80n^qGWe$8rFY+}w`5n3Br20^4xKdG;;{J*4YidBEy4-up{@ zTgqiys#)|tEx)q*zQ}Yyni5gMg%B(rgfGPKwfUF)fRJ7a17)Y1p}#ag(aO(Bo(M6H zjf98s&w{Yqc>13x$KOV*geC@E1I;K2iC(gm7y_HJ9hw7;@}G4*rRntkT=)0Jxs3fb_1Bt#%u{iqLok=hzPs~ zUltMN5odY=bqBx@(ZA7l;O|)dcS$7mAm7~Hf*_A~i4R?lW=p*H(yV&>rvQowWxFu? z{7DiB9_-6h1f-k<>J}HHfKGCj3r=71Ttd2$a1(^>ef{&@P&D4+%;=2HRkY1+zlJet z78bYM9=W!}qrxvjmvDp{aW;H9h1mKPw|w&z_b@^Q{weKP)auwtk6p+=e|9Y@rjWpd zBhDxl{$*hL(y-C&-5)4dFV6}dEH5uN%^kCe-i7TLdg{09R$9d)e??_F6(&EATqqnw>0Q-ja9r&EPyivw5GtTGKg(tLr4~a*`(RzO&A@|)R zt(NuV62OU+98mK^krxHav|HG~5QmAIj>y~jf3M8{kH(`xp60l-1*DUxFuFG2z}PQ8 z?is%PB{^Me5e&vKDB1$WDFx#nZLH%2=~MypJpSI_gsE5@RfX`Gvm{FTgoHK`4Lpgi zMHD7|LB*`CGQl2ixeN*p6@T-eWM)*oD=I964nH)^y~;yJ2VwP%FJ$$%SW!fhIY<<@ z;-j*>!htQb(nEa7&SvUI(l3KV5BjnkXoB%NOZH*40vpiqaDZ^ksO(I^cOGQkuZL{D z0@T)o1l?tBAQji(JR0iXvrsnKOTNidTrC&rHEtu4Xy($G0BXPIF{bM1e;3?i>FxcAO$cUmTw0m> zerxbNg(ZjdU~lPxegq56Y-7{gCdg}IRYnjI2~vgcYw}%H)E99j4TY9I)HLbG_HHl1 zQdsf&%|P5&*X^3gYbq353GUh(r}cL`wOcfuu7xxAnAH_{Gn)oNh#8FX9_R>%@=PT{ zc652NsR&%XhVh;ZWYgg(RYsm@&<^t19+R@d?;0go<{EBD>Oq0{UGX454ExvnSPQz_PDeht5U z#zc*!TU11BQI4#}!VJ~m*YebCU>ZttEUeI;H&A{H=H;=Q8rw-Bir-=Z;!r$>zFVO4 znVAdQ!a!)|+(tol=#?yUQ;1}Rx#FryaI@mGbM9NMrBSN9G0W%k|MddIba6eeOmR%D z*>7hnv{db)qnpfx8(5pZ*$CigYK2dy=Y<96sWRK9d~6A#^Q;VnmR<;?Peu>JEHjM0 zVxM7i9Vf~cmeP5kvm{(>qyq6~#TYN#5rX8+QtJUdvoocthI%l1hg#d_K}U_atMNDG zF|S*EBJay;T*Ruqcu{%vRrOHvz|G$~R-0Gs17hb|S8MYtArww4-}YqDz)8W8P+(?w zf@tC})c$Drki~UvxBzz8wo|NLUA*G&P>iLhDxA4c5%5Eg!2l=hhD0*qBMQVCd_9iLfGn2qYO15V%lOdWOgSb)>XySGHx#hrE3}S_%`0z8$OfSi2$y{9wjTTHmHE~ z94yq5Dns=Fp4dW&Llc%1@iQqsCf2+*VkQF4+z=BsGduT*?^W8gd7SAzvh8043$mFc z`}RflCvhOJ@lCgZG2ZYW#f%wm(ZsTXgT~6qar^!cq(6xEk=haY;D2qtG7AnEwloXN zWKz!BTezSmZr#PkrzMl59^DDKUt?qsK&nq;sAVVinJTHiWsf~%n!Y0a6-*<6JHPud z0>FS*`4gu&$7e(_^t7Pz%A&5jFT|wYcc;t4t8qQbg(Ql-{BmL?>c_?=(m_oh z7_VfJyr2Ex|2Op(h4c!Id_UVhqaZ`ZDXIy43A-vj4)Sw(+An?K97&u)k$3 z`T>bfPHG7K!_{lVxvJwntBzyf`Nh(&rG}ReG`QyoN|x6%&Y~->L`)@~rUsAYGN~z` z8pCMDN;LDI0vk*j7@6x|V{b^aqdE{c8oe(|g2qfB)75FJGt3%|wcNqL-jz^XAQ@Q( z&1FNQ*55~uI})e>iTFp%0y$A-U%#TirBD@PgFTRO`QTw-%|PNm9Zt1n>8SdT4v&#< z(qhgvW`2~aISDJsVt_qpQh8|XctwW`z2b(k7JYx5AajD00+85xM-JQQpLo@TK$$*1 zF?wVxR{ucVh;H4@2g%7MViElcp25|ZpkT`@PH<5dM?goftB{#_<#h zo5qSzn_0p`q#U89^XR7Wb#!3CFj$RM4947yf1%|s$GrK%@G#F05&99qYp*4@Ukg_1 zly~4y$G|Lm`SDiGLgo=W@4*m6I{)kcJ*3|B+Z^=nM3i599fvJXwrHcCe(Tgd#x%E} zVgZWZJH>7`8aegGHi~<{Ye{%7SR~{`s>vYRFE-2tQU2V;YWez_^Jz{34-Pjp;i*d^ zA=2S@(ItfQy8kZ47T?*c&eFZ8&KmxCmI{O6OW^`F*0IFS@r21nsY39!tD?R;!%<;& zEMW6TXf|GyY0%6E_tUjluT13@c9_Q|u4MjAh2dUoR#$OKB{{?qZ%wnjh)R>CmVxxjPvoMgus08{$UYkk_kpX`Z``fxb0`W_-6i6U=v;86moo_y z{fl{+G>>rWDUdkADO{)uCXo98jH01>QOf<^$(rs-X=2L;q_oEN71@3b>kS*u0#wAkTI|N3Ob@fD8E8>IS#2A>xPfy&~c8*A}YGAC_ zYN2C-UWt6~c)HE0@xoPj9u4>|1G1$*=2IKnSUbh;j9K|jEfwT4p_Hw!hcu)k^|Qw2 z<Q?%iVY%Fa9i zhMPbsqnySCNvEjq;SM=fT){Oc=pn|U_T_2?NyBxZgX8DMvi`T*5#zp|yi&cK;qpj; z4R>Lt4?0jd@gxYPlDAho&P!%;Y8o^jU;@<8{B5$0WGyAEQiejG9uIW1$oLkRM63|b zt<;N4rm(IZVbpjoo~X^fk0CV>t->!N7{Fo))I>Q*a(Gf4@qBR^_#laf=fWNNqa4NA zHBb)y&FqS677w=*hufnn)`|`^3|0YhBY?!sQ^A8nZ)tNs$wUruNW{zQ8jDcVEQlv9xalgv?WbN@(Jv8)W!U4=eMX%U{T4;dI=KY02IMO9PALYw4Z ztsR<#yo18iiFep4D}0EcokaeJZ4;13dH$Bk?pd`xzHdXC#xF5dKO<*=lUIKy73P#GG7W3otWn9pSws29;JDePm`Ojwa}f6L;a;IgGWzyU=q2UHs{T`4$$}UI%0umA&w+zz}Ap&gW zPo_9gBzJYexi%Rc?5g_YeK^1^pEk(WTPDHe%w4P%EqUxOMr2qE&fz`j!c(H8IJ5tJ~(DRfrYTF zU2WPY7GYUbXMT8LkFHVf=F?%e=^C1Myihrj{`pyOq6&*~oGUaRu81hdsF3S0|L<_{ zp?`-{Ju-1*Cw5+nI$m6ge1+>qDCpR%WWQ_SRR5WRwpV2Js;Z4_Ul+^URZt zh69M#L?C1Ml0X2SuJ{lAuPz)!P)r#`wZhk5AzS3*prxa+>mdKaD+2&ep^s>n9g2g> z!>2X}3sB!uR+o%#EJa1L6n+(B%Hzexfi49-*>?Y3jibP#lryY6qG083Dq#wGVPf4b z)}HvgV2niaL;Q>Ddx)lN8g;|IOz!Lj>$&I0Q_FzpJ$44-D4c&;Y<}Q$hT&^9AIA{u zuFl|f@@#!c$bQNHW}Ijv0i9p4Po*wMs>}xogXlwfsDB_6^kgQi{t;9|B&HHL=$4y= znwZv);qUm7{bRN|5Js4TBu`@qva&-+(FudYP1Q5EoP{9gL4Tx;C%koNy$)HG5QPx2K19ezoJZ&p14kn zNodU5kEevhHjAg$yk(SNAHla;HrJLsTF%R8rcjrtFf!@!-2QE){WPRxxF=Y&{}m0z zYb1T*Gr8^%zD;t*2BZbCVlm&DqtVBc{^f7c;s4wP|GU_BZvEQ_`^0TRPwRisA5s@` z*9LvdlX@6N%ki@k6wreu*zN$akd?TvLZuum3E1^0c z2v8_yWfUk2#8cQSTFMvy3_v9t-PzC92_qn{5F>>Cln5ogaI@8-=g!b4o7`65PPnsXqip0XujnNcSI2*mcODm844WdcWYa^tT?Nz~!J|V#7shzaMTXTK3NS7FTs8f>;JV1Uy_gBv#O@0rYdudcHF^KdPhDnksf1EU zY&gO}GK|DjZn}#kv6jg|25a|+a~ZKY$!NhXAvoLqu5X?uy8#H^OWQ{9(h4t%eDPP|`&Ov3+QS@~gWX(;71eJEPJG0Q0?)O&kkI(gq$Bm8cCm6MGh ztf~zd8v0)UzPwtaN4*nsWe^hT!nk)=f&Td^)TF{bk`XJt4(y_~0TcY@?M z9M#tP8oV#-3lQFw1QJ46s;@XQ%cHZf?ZC3il9r?&`G>?S!wC8IWRT-b=lOhFNK!m3 z+h_E?T+9m60MhZ2@~?$eX0N4w;(3D3aKWP;fUTntIpr zg1}VMILxSNE?}TtLoK;86qOqY#6yXg4(kuJEs>>+UaJ&|nonZ=NN)F4Q~!Il+l15_ zvK18|LN6r93UTBa`RG&TvMATm*^AbQa%Ua4dt=6djdD&EWS@TvkV6jfgikJ4%}9|7 zwzMLRa8&^)XGinh?Fb`c9^1&cNPV8ollXf2YtOicCwIW?V6_eQ(i@is5pB$Y%3@(k-CYim8Mhe&B_Qe&j1DG*1oz z#};MzGB(}Ek7Xu4Lil_9)nAU_Kuyrf93C1(TptBrMt%88Onp?Zw_f_5TriCJK4(kJ zEDaC5LjE3y3ObPO{cU{72mUVH8W*vusIT=zikf$Z2MCZ)d(B~7yV{T#h98NOqlHQt z<}A=AsCWDobAn5Ne%P7Og>w$>?wczCv8>j9r3hA>3)<0kh(%Ur!$Lh0LZt(0Q4j9+ zHF*u!lBUtZVmh@P(&lzD9$OtAw$vN3*hU&2B~5TUUbkiZv=i|efKu#6QU;l$r){hrarW!Gf@|6DFZ(@NZ9R|n2@G{s z^RF2jFSHP^Y;u@czfyU^4k!fu!7<$-dMM|w{X{Ue@Bqfb>dz6uh7^}8C)XH^#1AeK z&yY#4AR$EfKD5QXlEwx?7LbQi8`6Qu{}z;d2tu9ob}x(WFz`ANAy8RM`kgThMezKF z6X=+Zn2PC=)px6k2*H=IAV$ko#j(0vsOjnJ%|aNw;vdkCK+zkNl|)BqfzNbj%`~9?Yaon)i(tN1*XjZ%DT^sqtRa6!EGd;`uv(M+;8W! z1O-?#Kve`PLVBUA2b-Zpzj57GF?!8+Qb=z9jqh8fcegVKBdi)_ThlsI(Pqshg~9l~ zYd|-3Eya>I4s7QNS|+Os0PVGCdhoQqm`s|hr{y0XqCYh*$+nzCbv~c6QT3yDGtcUf zlfQ@#)mL8mrp0;3%q(8P1PUZEkO*bBBxf)KcLOiF5Xnjt?Li~eWZ*ZVox7(62TK+yak=*$WU%XanHZFFP+6&is&qrgD3l)@070))+ zARJn8$2QF5F{{iB14EnM=w-GuLiQ~(teD&&c!_QyuPoO0d-!RvhF^xuLSd41w2bj0 zqc}Kp226ZWKtz|GHEprMM?qKrNe7S5*0d)~XS&=%SDo$n(`5_8BE0E&WG5JyWX z71ZC(^5VQhqD^rq4TC@IKt{l&*jJ{kRe-jd1#yw~OB~0Tg3jT&I zbPrQSQeX@vij<^_$*9?pB3VD_)%&IOaZ7>&D35HXXb2UZO%_;|2{2S9T?iAY5ky;P)^cz_&eySNOS4U~d7)F)D)c(6w)?_N72- z@&~AeAxyo}uloErROxy1Z%$JrnZfCS(nnQo9grGcKVl8S&3xwl$=O*y8=qrejwfjm zSy&+x;sLb2ftZ%~7<5b^Q?>V3zB_w#s+B6UkxM;nP4;7b80taXcB#A>UOcxG!?1dl zRg~6tvJ^am?M^TdxhN}uhH-H0GoVoOeDqsGy1EoC``Y=n|M!)ef`$5lzN=5q6LW~T zxH@UCtYp`0m69gufZmx2{3y!126@Hw%Dm9)7=Tq7C=jMI<7?;+YT`{*YOiL>!94DF zC5eg@RX`EBJvKPHSUxtSS(QjyBSrz806DX@>Bto&FY8R%;cVejh-% z`)hO`n5F}7JcQmlj9bx0nqP#G<9j9d+bF{!PWTFO?Y`r_x$M#R)Yhms8xm&@d(M8w z!gd`sy}E*u?`47^Yv{jYL>i~Iy`bSS<`sv&MNwdhCv+Vbeq?;^c-wc zv-am)pCAv7UH1^mmA!H-YT551OaFq3T%U)R#(!m)C==~@UP7Ytp3wg=C&S`39VFU` ze~VrGK4LCjs!<&b;hnDCG|H8$q`rPlPs?01YCj9|xeOxlOd7f7=3@KWPOFl`oTH)q zI;)hhY;8E)NVWoA@*NCh{wztW%IHIp$9V-oh@GtyhXLlEkaA1$Yu|xv)Peo40`LiY zLb&$#XRB2Fh{vZz;%R4?d|?`k*ISSt5E0RbZVdU?O#dL%rEMXCSwI|I;;r^#t39iG z(qoJ@7Nvy~Cf&s4zmsk^+191mMRAg|;byCfyE_kS$HO;BSmx+&t8_os7 z{;9*R?CTn77OdwpuKR!SAoe(IGP~*-rPn2()q1)^do*l2YmE6g-$w$c6uVwNk6+&WbsA-P`Fq2{2AOWwh7Q;M ziK#rQ=cQh)Q`+>mdvx!N>oD)~|D@M|!nvE{t$%wB)-_ZCJZDQ>Vl#BwBmNRf-!NJv z#oI*$0>NI}PQCpyZx-YN9y{rsE{p6xivOqt|8p1R&S^UuMY0@+T25fmsas(2iUQHC zw;$hOi&K4ln8mTx}L&_O|}J|EPSA(r-Q71PB1?R@veuNsz#ez z983cvowq0Cta+1(_R#>}v}217XTxTmUPZ^dQE(HzilAy4a_LVH|ZV4?;p#{a1et}Z$ zRV}APB|NZ(Kl42oJy|h;S*|hu#etg|ewn8N9VI4+-7VPzNoYd?rOU~v?Uj@*w7QF( zwZ1~F>6%huv4~q+1LzF&gYVZgBl6{YQt-EsNU9podU8n`!L#hn`p$T3eAa@r+L~0@ zahnM#vgKzBaR9yke(K__q+xmJFm-!w6T+r|W7(BjTWVb`6lkeW$@beJI2IdENYhvi z)H*GebZ<+mp{kODE5qJxt^UGgBfQ(7~~5b=Vb5$Gg>lbYB&@ zV&~l7yYBE*KFrl)08MC$a-9WiESZC`C$Ri&MR;G=Jthepu-GZ_sCfFthms!o-@=8A z?{18HU)LoZw{;U}H$^IS5$dRBa@`n;4Bt3P8e#)p>d_Dyw7U`05J`}Mr>6sZDWbT4 zVQ5*8B*FC23^cns+%}{($RLdTU^(T4vLyWcb|iXYRUP6$Y;`bln%;o{s6oqKtB&g# z_(_A%HYMB{+)h|j(OYMiC#k2E-W7a}qB=+U**s5isooZ6sj*6$YAFl~q{{6A>E{}g zGBGI(%LF^49>0@!Q*=&;_$hf~H+_t=S}w8szVRf)$bPy*bpTk1>8f$N;nuTq zXh*(|p2JshO32Lz#AHO3ms z)&}4xO1lnlU=|kU!pMpu5%Js-#1qU5Dt^Ifj4(Mp9bD3fqbq1+)v2|M)b(ja41bz|Vrx_npp>o?TQS^7D%jP$tM=Hs&TMww*)4E14#)M0Fxf;j?D_RKPTtAhh$Y;z#G z!$o8!WBRhmx36!U6vH#I2MT;8EW5VwJW57-dut3KBrQSqh8V^eKp#$#MyY3gggtWh z`vCO|sASEs$T`*#wb62kS43&8m zx;Y?H8on|7^*!<~yT}>S8iefG==fQ_0z-r`%4F0zGJrh|go%D=MTJ+^F8rOq8tA|V@;*Er^dmfr5dg`X?z3_#@$NH1$9FqiW;brGedTwPpb$Vn%4)U?`pCVs{W5-4_MFdWN;XuwdE zP;$}|n(H3_(6R(&-s`QzO@9?Rwtv`C&aHlg#xsk4lWLn(mgiQaK<6hj1r2zHb*Emm z4S{%lr90nE-=XF%lu?%B`*h^Onl^;zMcNR-L!q9Z|ClaB!lXC-r0&rgN8s1Bbn(N4 zobAJ?%``oi)2g>y1d$DxLa7y^SbT6&5P$B8_Vv$jH@ol0A`3%Y%rjb0HFBLA?$Hhz}w?S)40WB z*J*F5>addAQ`oH&XVo>s^Hlx3A&Nt|z*h^QksLh5!CzFB%oX|)2l~&!%eS218yJcQ zal@#?=9I}1*D#cBNWtaTxu5M&rRjX$NJSq=J}FKgXC?kp`TvaG_@%Y{ckKT8dQ2+$a@=EabXPhBqtsWauUEvEbm>Kb z-=34DlXHM4{-;Pcqzf@vwd2yWJ2>Ejpb+uW7(&5@3aM*7M{#YI=u8iEWLrAYBFc<2 zl(Jtyd&3YV3||rh5g)ieg>c9mPvyrP+gZQRE3Fees2Au1t4h#+sRkAH!-W!@Od8ul z_o1-l*_5SAq$C z9?$J{t`Y$^GyuQ>3Inapr|`?j^DicQ-^%iJt52a6XT!}is;QiD;X!!^MS+~1zc2BG z+b#K8>?pxjgcS5WmKJ{p(|K+Ix7H$(gs~DLHA~Y27+KwjJWI>_Ca6i2s&ucH7b}YCQGHm$@ zyL2iM(Bu9wAxCqXuyxJ59zOP@va~lkrKW1Q>Q^{Bra*|)%K|6p_=QFF(c`ujOZdee zhXvtjHuBJCSyHYd^0?C=D81NvVusRA2vjM83@ne%qti#!;K4*CBou3hqAmuMk;f~O zz_u;g7o-GL+kg0JLr<%waQq&%d%i+2*r1KQ&^aG&QiiB?V=~-^DXYX5Q8r+_=&Ykg z)(wbd0yH7F0NcX(-o4q%onTY!#kFy9zs#8)HP7d{Y@Pg+EKQz6Px>=vV?DnBPwbK2 zv_GPUbzCmdqX=dvlrEtJO^cP7?hr||tu<5lAtIU272UNjG})q!<~ZOY1iq)$5)zDy z5-~o5XM}1{(8n@ir6a450|~rc$N}>%NTzgyQewK^PRzSCYphH|zn@x9z(tAP%f|Eb zXj6aS*j->~2V%*h@R+^?f~8u9&_9n{rFN4WYW^`}|1hGURiA3;EhnCqg+mya1kOlw z4zPwab2Z&eDIl~q3m5Jep{A8$A2M{4vi%^#_6Px)A%8KX+|+b#2NXJ#fnjY#@0-Vw zF8HG+vYfQBWL+CU+1BIHX{@G z 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ⅇdI_w^R~LO>h{tIR5{&t!3%P2A?~R@*K0_E@)EGyp;{^G90$a{ zx7_z^Ns~*;^mvL<3eQujA-eoE+gaB){=+x^^G}l}zwNf+;j`E7owadq;J0$0>$jG_ zjV1YwlhXeKbZh?&-P$w7kay^pVKS4Ixi(QK^#l8Ovz8wpaS=InKg;2S2OrfRQj5wQ33OJ@><0ghS@xEGI0cP`Hb@n>hDod5FN={?UGQU;5VF9o6adRBzPU@4R}} zcZ#@y!9)1VbL{7ngw5!=h?BuZs8{wX^ITS#0bKq_ta4cRB(_Op!H>t#AOl(G6-V1>jszk55eQ}r*bIV(kF-fgV8 z@=iY;_RBHygt!`VuPh|I_$pjI0WHHo<@slAp(UB>_X#2Kòak(YEvYas?Q0 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 I7i_}+57Y!R7XSbN literal 0 HcmV?d00001 diff --git a/blogs/ulysses-offload/media/image2.png b/blogs/ulysses-offload/media/image2.png new file mode 100644 index 0000000000000000000000000000000000000000..fee5ad05d3133138f133f1110171de351952d108 GIT binary patch literal 134983 zcmeFZhhI}&w=N3OREnL@K~Ye8htP|Fm7*xpQ97Xrp%_{OL{zFGBE3lwg-GuNR0u7E z9!TgVp@jf}1PFwSzTe(w?|sg_=MT6a%w)|ZYp!3`7;}y><};p=wB{=}mXBY&a(Z&x`Tl)6vE%+pIwtz_ zbPRt^IsT`k=b>Zz+oz+uL(lu4{Ri~d|8>p@I=W~#I>vvUV|jf1^EYw)I3E44BSQ}T z|GHw%iT^m8DLIGXKl&#!{tV;Wyq$i0IQ9IN1(=TR^2nbDJ!3{yCLNtN-R+w?W-sX1 zGFj?G^s57)S6!~Yd&OPh$jE3acg5M%wD&Y~FMaPhh84wW@ps%N7a4GLC&g|@T)pP< zS|aD=$tzt{m|_-ANq+}mlm>R5I#idQtQPm%Sy@>rJKW)>O&`TXX`g)c@AhvA{96M5 zmcakJ1cp!cnu9w4CoZ4;pDkbL2c1985NS!8UYm}dF!};%VjB2mz~QT9l|Y3HFNg6` zJ*LyctjybWg&6;7VvK1l&ez1t&YlcE`x$hqccyoge{uXUGbk|6YT&-BL`~bbtmd4a+hYd*_boIC;6zW@$~eyOHk{FDK8!Dg}2|_ z0USjT)fHS@a|VB#NFnA*_!axwy`j&*g7ggc({mQZivpNhdc@e`X_@x;Z@sMBg2}f)9k8NQ?d^+ zKou{E%-fW!GxD~$_}syUtj*DJI*p3&+WS0yrtN~}|IH4^vW5o^ykl)2Sdv=dzNeJv zudsg=b2_fWx^;Npeg~R_Jn3kB<^;2zw|+IqvZ)xco8*cHGa?gY^G_dWcWE3A%R)dX0 zFVn`JGdk`w49j?UC$th3rI4~Dn_(&J8njv>!|$&&T7RG8>d_0C3rhZ^cRYLSpPiae zdyNC+uAlB~pSduA9VlN)cjZ@zoiv_>J`&r#guHq5)^+hmsLeN%pF;bH{-2?D6YS{W zoFx`xDH^cF+26+j~5m+!#VWgN9x-fI{QBvqg!@`Gz#t%7B77 z*n5InO>}wt^(N(gcDd{PRIL+te^4K9OAbpHdz6;#IeTS4RHs1NLU8+QlE~H7${-V~ z%m|kF;%U`ytDk9#!!iiID(`uVK0(W=*s$oS2qoQLW5U-DJhmAepZCvf|G*`9Q1eiE zIyhy9HmF{lWOrXtf0%1($GAiAWeC!LIS8>KP8!=_Y{*))2}|ftMlTAsn14O@cm4IJ zXv0%7TiCz+vtnDTn1-YE5hI}4B{F2}Q>Hx{0$DEXhPs|#4$V?e0Ax2wVN z&_B)SrCi%1pH}C(2*IfEqnw@djtsQ)tn!~SbXz^ZM=$ZZ+6*)5jb-9JSxz2YRBS7r z5GNfZa>>&jjTfX`&Q5~q-_5J{w=V6i=YOY}z{Zi#ey|BP_PZFgp2)s8Pvd>R#v%)M z_G017*51DsX~uU0+;!IJp~AnGKJL_sYAw-JQ6qIx?mu^OLEB!$GmKyI6^9`>((~tS zt}oj$dAJ_*(?}~YL-f}Wj z%0v{@(y#q; z+om!$eZ2nM_?aWfYiJIusl>l-N;gMeNN15VcJ1}CI$BlE%9w1*E@WF|4HRhr6swuy zTK4vbGh^5IRo=ujDvHkAYs3%id|%n3xVo41U?SxAnK6E4YL#F8b(uf1oZ8TQ?Mpig zUb)^#OgKR_q~>BK`e7CfnqiY`cAUQj?zKX*mSQ@gMve-jJBnZEi^jG^XXI-GP|GBX zNheLw%t)3!JfH#dS&DXTX^H0A#L$i0<29ivGzjpIs|0(X*E<`Tj@0@ucji>!8plH` zDKwHG%E?)La!T<<(-~Et-^*hg&_M|GmTLM}ot#zvA3a)%L7BFHV#HQ!1EHjK>i`|F z>apq^uFPcXx6o&ry0yQIpcgz^BW*5myE2!I-^&m*4D(z()kp>#wZN;9v!Zp`327 zV$O-5ljw}3fORYPDT$ec6Kb(r!^FHPP$Igh3jQ(vOVPFPo~51m;)Bgr>h9@bCz`xG zNmqNEL^)h~w7&fV{(&OC&FaVAz_J%#sS>0hC)BKH$vDzG10x!n=f$`)8HDs9&Ja7b zIF53QPhGcKQ#u-w!|xPWEtA)0uNrv(`52m~7A^HF)owF}C~w0UG#>)99Ar5EE<>5y zjOWd=uJ!}(9Sf&QXy$H7%xA5gWdfz^=wc9WkfazOw~jV_p`SDWxaT*hY*{BeN;n z+;4$9t<;-J`KQLH9!r;=ge(orrFt>a^rKON`b92f+gJ|AC-y^e#Be)?#k|8 zSB2&G-rhX~(L=ukpONddmWN&sWet*FNjnotEII6q3?@?}D8bV5#U4403iz3U-bp95 z+s5kju!m(MzrlUy{y6I#(eN@rWLENrzpE828?F-xW(L}9htP39FHW`F?k#rueH<0Y zc%D>G&MGrmF4g%+PI-R+{m$5U!EHz0KT;aXXg%153Rc}gKz6Ueb>>oX%3k_D9HA5l z_YVyi^SC%Qinj2J(>fL#F(2+fyJ!XfSjLoWIAB)tuWdQd0-g3oOQll|u6kojfH*be7BL!n4JDLMkSbV%rhYn>v{bROQ;O6dN|pk9{zD^6=lxjIR&Z#4MewZVCs38x&f?tXEt^@6 zg`N8Ian2H^rS1ZTWbw-g0{hYfKgqPyxINy34OH!2wUg0yvP5gg7Xm1Kt((5Q9Zk;F z+SQ(ZlL-X!p&(-r5#8I0a`gm?l|>4?W$PFN9F4Q!KfP^veD`^*;bjI(=5Q}Vqy|Qj zc4O--=>X)h-Q`(WyrhiV4ctsekZGWGa5lg^_RW0{x)U~(0?Ou# z1abUAb^qy3!Rm}8X+7n$o+ zCIGt%W+fO59E)GbP#($J^!qx*7uh$E6^YWAz7I11ihhudew|r6ivooNjQ?6ZksZqDI*!d&YbqYM+&Hw83^_1s2&|H{n>0$HL;3PyT z>9u6=e0Hr}yjv1(3h++JCFa=Wmg&n_R5G~2o~}kXi_rE-z6|FcL zecUjv@i|ja2%zX~D6Iz)y8kI9=U2aSVw*6E6t~n>T=npI2qPpbUzWP-zOdJ;jr_Sn zTtn#=@G!uqa4p;hO_2=M28Xy5gpEr>z3(~5^#1gsn{|6+e`Da<B%%nRgn5PJyAu|;plF2Fezr=aQE!T<=#&xUU%mWC&`kKkW>zaps+w5bQFLB5dCC zt$}3dy~huYQN{+)pXW&$w*(3xAynC7NT%Jp09|?03m#7cYk)^~F>Kaj}n4!9D=7s`$F zw>Mo_?jFZ$JM@jCuW<9d3yWjUJac_th%^-p z{IFW$3K`bq>>3YWOdq#Rh&QlJw{U$z;({4k388v`W|hRse(ojk(mjQ=@_GLtam=M; zGMJAg*=TSSa=}-<7KumDIw23h)=j51_>nhzayn=~``VYDFYG+$;OSWVMZTqEduCkX zox-?vl#v1XDB%{CshJzNjwSP-x6OX?Uv>(uS1*hu%-45b-!TqR%X@lkY<458Yg{lX zW_COvT+Fl5zS7-B&bu}9x--yzo8rgt9(+urG?viL*~OA7U1qZryhjN!5kERLI@;a% z1boin2(-7quB~>3@O0^{nfU5lH(+~EApVz-UTL4`rgW6%J9VSddszGlT@luNTW6ZF zNuyWgkzOa@Y=_6x%1u|Xibb+scp5+S%al-un6aaSNKX!%;^+>lH{Viqa0fmd zCHzGx#G5OfIN8qnZ|38cQz^wmBU*rgY;CCE4;wru!&&CD%;l&D#iKou$FtH5utk&MSJZ|7!H|Afa_Z2>v&k4&W!J_ zajci~y$9!?eA6xGv~Sz3VjPT$kA`H2T}npC66EVs2=|=Pr1isQu@9n+YNn70@r~+i zByZAsgOc%8m?u%hv<59rsP?n2^$b0a&Z}52-L26{xEa~kgEl4W7f)BdzM?mt_c5SF zoa%~^-Lh2RT=n;!y#EUYQly}z1)JprZ@g48>b~(bb zs|$dA$ZsQiz7{X85=doasoBOHN;)~j?_5c>)qdEW`czkwB&3T8+IrM$8rTZ)Ik){_ zxDP~LfhUMhMPg&ztmG$mj^jarXnFf8dwVi4%AIWTY z)B9$N2Zux7p0VMyK5u}T-z?UDEncj0QYrxBtfmNlUk3=fFA4sQe@19}Ow%YmBzvX6 zZ3>%-F?DFYFrvPcbV5`X0NjXmbG*e3?j!)U)&c70$2vUJY8{gQI2l;nMZ}E4M&~LVvg^@CEwsv`wS(i z6ilq8!7SK1$c_zkpC1t)GyD|!(ggXqZBKFAsLHHVyB$BVb#oiM9eXEic}2B`R&*tj zDLpw^bx>_K&>H!DAwe|#bs*$(8Q3jFUdV}Vj=vKaVnPZFIla$>;YCIVS)iZnizajG z3F^{{E3d4$F#Cq|?au4M>tS|QI5ls`^jON^LZ!*FM?t1T!`9)`B5{;RjZU@8qUkRC zk`nI8SB->BI1*%qw#G<3Tn|q8MEK~GR`p#Vn!^yK7unmB@MR)pAj?%98Q>D2@PeH- z9k9T@(vlR>$E&Dhizc6W#)J}IPrKnfAzi~ha^#Y%3oHw93-`JrGTebc+pRuq@ z;)A~))r%aHzp?GF(5bksxi5wRjNpVP&Qv(v0#aH4l5hAT3wBgd6&{0sC&*LA5S4$y zJsk$EOg&MZo^H%eqt`R@?=}7i5%ql!P{ZkRjw&_V2QIhauFaAuMfQ7`fcduIF;jD+p) zy}Y_3wyrUGDYhx22^925K!zyMJvm|;AbBvqnQvf7N?KR4hsf{{_}rpX46_YjI)}JO zjT-;JbM%_VSWuqzif^`~ZS(0HDs zz{}U6W&6LfbX>DN56k5BpZ(Q^%SjcB|Imfe3`}A6M0Jh5o&OpV<<$n*2Lx34tJ8!B z?staOy?ny10q}fvC-{6k;4;Id0&YI@X4_{-!MGhOm5JN=h`7R8`qirJV5v9omVs9|1@n0m9nde=?wVfcb+uETxZu^}`>L#bpLa{jeP@P| zj4~wGE5IF98U2~=rES?}<9OJ8HA>MRy~*j@IXk6jrPbzh8jS=Gg4#OtO&X{QNbS44 znD8(xluUcyls?YkAf5XIZP&=j|5{3?&uuC@SUA#Jv2vQ_@@loGf(Ld7Q2{@ntQDiQ z72<_ZlZ?51ML$>}l?7!4mAI2sBV^ScyD3NwTOC!U8McJXj3LcuLf~`^@}GAbkAs z!@>z-ARjRtr@4{33-aUhgQ8hna$YfU}mCEWG6VL4UoKckphzHhc@)Kh3SaBf` z{iRF6PPki^0p13S@>maIiuYyw1r$ndDiWp7TzWS>{8!iuBnVgO1+(mULu9Mz10qSk zs9Ocaz{j2vNg6kB{t%#h$FFN^M|3tybKo!tx382KQWd4sH*Xu0MhG7Y?2!V&K@fg{ zX!6aNI9E{3-`M{c*8SUV+_cx)pS$aKH&Ud*V?tJXZkKCM<1Q%%?yD{tSIalx7jhj`qb)j);jd0q7&8%Fu$7c(XE?j!xcMq z730r5sg)fh^@=B$OU+KddS9!3TH-|7mX}7+kV&c0d}UeNo59hxP4VH6;Ro$2HXh{XUT{(Kv+tFXWjehw5-W!KNRuNFBzFa|Qr6?OE#XgK1I|lq!(RF0(CJ&LI80-!|AF+YCYNn2 z5uQ_cJnqc&dhyrQ0PbNWM9)a^*CCHmar`3_H|AO??fc`-tNx+FC6n28E=Sm(_s210 zmyhGE5m5x~{nKXO=Ii_gysXlZcRTAClKo-7@Q|u;iTe$nQ))J(pDb9Wm_tgURDug; zW-TF+bl+`Cnwn>6R~mf2#D;aE60b=DA%^jv18k-7hfEuL)*qjiuD{)7Z;Fj>&Mx3uq?O?k{NY0^_mH`~1a9P^+WoW)5$IU4vN_F`@3{#g)(8 zXGn*Olw!BW=42gkwnRq@pHqW?sz7y*64g%d#?X(zRgJaK$=v|^Bj4d+x0*g1Z_nh) zCems|arwxY>;`t&%{v=?vBV?u0@evj)e?az;m5sK{gEvA54D^nq6=<|vpK-z7ggTevBE|~;A#I!j z%MBR!JxX6d6`O_0wXCYG*uI4h-Ql+|t&JSxbBRo$*QlwQhHlEhuUmzAgY++16uEpiAfl_IbPHb6CoXuzI`+;10x|5$L7R*N#4<9aE$yHzwDay6v z4@C$u_}bv|c2vy1Nh7L{XAf&jg1bLQn_VNVPVh(ESbCKEj@^d#*XZ>oE_8EpP|BPY zF1KB9qt4`zsf3?cxeJP^E8J=vtA{o}5knr)jSuv3PDUxzC* z^ZP4`d$P1UB#YH?sk;ILrps`##q@pXRaEego(ySs2ixhMMzPtz_p~#^d`087aWKx_ zw!@bYI2*5-ZKNt77pFofov%S3F7LeHZ76y$Ei|BJip-!I=@J|ismy^PuT@$=&N&qz zj>hmNe^9c)tW|<)N^YSYa&&WUSDFy2k|t+^6~0k<%XA>PjJ&oBpaCv9-S>LqPBD@! zo+zU+pRW$fjDXGtv~|<=cgv1#OW-WjzrbkTcj|z>WJH7e=)wIqSuaXa7=gITcmGV@R^4^iQ6na$n043Me0$HORNSQM-;m{`B?>#p zEechqWF8T3F79EbjfL>BHC@|=#S-4UC|AJuHE8(*R6y8UcM>9gw=oMkeGP_|pW4fb zi9sA3Z-RybOCn7nVTGA^caeP9AC1Een%C3M_zn9TK~9&9ud9GabqF=Ok-kzlL|{?6 zi8)kj_+qcpAFLX8m0on=pK00p`}{`K^Y6Hx=bqsW3bf|_d&5r5N*o5$denULyvcr} zB~)=wL)JO6Q@@Z!sVAgv3@WfMp?Wg(VtxPSHEd4T%~Vz~0G~2NrPY5S^i;j8l&46% z^v+5Q~kqi*%M_iqTz~mF>!~oNf+wHK`uFjV~g>Z@_T8RY=H2IPEsL(u1XTC@| zuBt}r6a1~0+g|tNh39-Ws<(M1xX8A$G6$Xu8e>k(z3vp)+Naf$S8((mrF(V25%pa( zvC*jD_s*_n9NSO7R0l#&amPrDChy3);zTB{?of55p_Vwt zqs>x_-B29Re5ca?#>ShxL^u4GL9bRH%Vj>j2GCmU4)8|4aL{%SgtQ$W!tjpuI38bJ z-{Iq~DJ|QIznzU#B<)t07r{YgYg@HgVuRPGppdsafCXk-nPGr9#y(0?l;Ito#ui`l5NZxZtM*jb416!?!BLY_Z0CsMmIIhuytY zSYB612e>Z!v%|*f5;=O|Abb950LVI{=+hDW*%=J>wHd+oV>yCUXG2z#3-M0)L-c6< zC?a$24Dv?k&t>aBAi}+eCz!cu50)EQzcmlYF3r0JDlk+dQ~V=qq$D(7wS-$|WW>?p zMX=63ttg?$cb?#Ks0CJ*o|-b`ESX~}uwurCPca(QR8}tDElLO7Rc(4vFyu1Z_+`$! zu}s*MwflQ4v^hYB4A8b|vX;rT`Utz0fLNaMtME|csJgRgFQs&NrNX&(?!ZlwA)6jX zP}?ee7c8k-;a(ume5LV(`Tfn{G1*(Qd?PjOw~h_KCm;BHSA&u_xAo@dhiz<4TxMm> zE=QcliJTi$&;I_GKPR1--55%(9vw7WyL?zaK=(A&HfJf4GCF>xZO(zedNMl+3})A;gIU;^~EnHT5k!SLtolVQ*_7{v!!kHcqkt z7VQLe9A&BEpOhzb*~?{bRf6|2}IL?+J1qE*D!wAe?H|FD;U$Jz!4}Ow*2I=lLAZRGBQ=F~&aKme#*<|E`r$14 z!R4|5{hC6U?5CVZ|iOJpk2h8H`cARKTdK9V8(x3;Q67=wJ zO1|^K6l+$*Vb)^bOR{qJWbCL|cQC9pdV)hWWlDEE44h4x5(?*d7uO|~PiE?z3C6ND zmA;b_^x?SrKdtPyd$*QPWR=@apz$`vha89RTeUQ4VlXP%k>?DJQsP zOcQhyU3tj9uhPJHzowo}z%N&JDwM>-#xt=srX1kcs@?IkGpgTD0T9;{=obPwaIeCJ z_S=pHeZM3g*VSh~E`+;MFaAUJ*5T7`_2{39O5`2BD&6c3qpL@$otpzn#I~aR{Qeic zOoSRl1F^~JWv=tL8TB8ZWOGn2D|ohBz+p=WM9!=kobstKp+o`Sl77b}p{gyqOsEk> zhe&l|F4u`@uN_JZ5yh}g9S9KKU{J`^FM@Gw8QiW4GS(P3l|F4|D-0!H$B6+nYQs<( zbw`Z}k?~?Z`EV(vCHjPIOqd8FjB*#Qw7_)UpfO=iBVA|<|gAVn;o6_{(xJ!K4KrrK^9xuoWMbirEsf> zdM3IgfPK&*)~k&k%_0R5ewKQ8DZWXA8(e{S_t%mYpBxr=p6`A=`A=@qUO@DR9DdrC zuhxg_7MHZzyVqphY@OAFyaB@p_(fO4D(U@GY4^bN2en=5_CDXYdaAEbb-K#h8)9Bz zbZ2#vi=O{%G#I6kb+1b|>Uu}XzfAM__uwem)b^p!B ze>uxVWa;_hr^<5b&zAd!L2C+`-IUOd(kJQ9PfQED5xbTMOD7i0&-}vN6FX4$rPoTu z&5^Q`AgyyxeyLO3W9ZZ6xm3^L`~92dE_P&Wt6cE^ZrD#2qQ3+8a%V}}&m5LPm)cp` z?5QO_P5k04Fm1mnR5F6DRSLRej^iVvPaMq;T!ZhEqhISFqiX1@>qqzutMNC{dzLM1 z@k&n7ZU|N8s-h2>cU}6*{9M&S!e(n_#ZZT0A@;Yq}Zv5X9GN#iEerGACG51w7vKsQzu* zNY=7uj8<$*g5z4qAc}3BV?WXxR#P}9-(n8scTjxYyb`N~Dqlyh{*#v!Kk28@ihq~X zbNjCdubzAIXaNBiAWSJo;HcWASI#n5A6ynkoZp`#?` zfX7j;MRif;j4Z&LS%XCppsz^!_VsCt+}CQ;eQODx9~o@&LhC=vo$>Qc6~}9ui24Xh zxR&4`Q^Y2*Pn!*uf79jMFRO7YxLS^NK14OG6Ep*PksZc+zd)MEc0Jf`v=_#hDQLj! zr^Kb$38<)cFm}lXXHYDF(JDu5s_Pn1gabN3ddhtM+`*;__@~!m4qQ*|5=-`N4E{4} zcq>ey)m4LV&+%+A|3~bHZJuM?b+q}5pU7lNYurbbGb1#)?(%vTRgSoT_$M(9#=43m zfh|?zK$2$Zrp3jhU(qV{wr#gy4}pSBY||~Bc&ii}{nx~=%DGAX!~u>a`Qq3MyADQs z>;3BUJ@%9zsNF@kU@!UXZ`Y(z0}#*Kfy^>TgQE0H^x6ftj$_RXVG~UWoVBsQFiM&~;i&es}d-NR)#U07A!qf&z&`PeHMXwXxpvH&gs~gqRAm_v|@e-zw-U#T)t*kmO zo3|K$Wl@_-s?R5|5h>R0+k>b5_!`viQx!7~#cMXuBJ&C{5Gj+s;K9mhg|j{hUW+c14CsmD7(o-=)nsrW|TwAd)D9G}Y>g)|DRZ1pyn z!2-4q7>KZA`sAG0R}QSTl2*zG21eeh_8~sO^3?PH&VYkRBk+yD$zPFGYLB`z^bA9s ztC6jX;wIc?N-svFf)(9XYmvdbip3!Uy!}+YMtgGf75k0N5Ai&GX9V?E{T3*`@Xx)W zCg_kCS0Ph(hbFz|7^S{tylNXJn4tGk9tlL{ALMq+wIm#jXMQ5IwvY_nXm92ZcbvD6 z5lgXYmyjYpzxb`G5~P2f3yTrpc~Jsn+Gs((1vM)wfd#G}+*z&IX-FZN6)dgc+jH9X zEDv}8dbOXY*yIL`Ux@m?{5$On8Lbc2qq8srM;A5)vG0|?W0`(_dkt>cB%ClHqN>cO+6hMLN;z_sS{5Y5W| zoh9idPRAeLkZtzCo~BX3WPh2nKH+Z#YBV76J8vrj)%|M#G_cI? zgjtV%zY&U?FU|m``L;B^=&f%H0jQlKJOHLnZj?r`t&`>O7Wl|^u_)(R@p@RCabH1Z z%)EI)<*nc&NR!T*?P-YjXm4Pt|8d%DH`$&29yr@0grh0PS3qqJ%gJxk1+r#NvWv>N z`%fmt>6GJ#w2BlF{^O+RX9h;LA5*|qA3#BGP^bQYc)xD30-%ZIG5|UMv}FeVW3d19 zZr1C*Z^t*SoK#mt;2MXgd!m6o`OZ@A9p`6Cs(}_QQNTpj>FHcvRgRS_Xuw{y`Ie3P z2#wGDG4ls^+?DQZe|rA|eZ6?a)Rr?AWjz6+^Y#3xTJ2ijguPYk zn?*$P)J));p{Jd?@ylJiwD4}hyFMD78IcXRX_iZT`gtI0$(vU3rS)y<2)zLT*P-|e zTjQG-wjq9u4X2YmnmShV(U-I3ZFDHqE~=O+3zA(VdOEi@ry%CSF>c9WXxE1|F`L2_4kkJ`mO z0Y6)-3_m3@b7ezg zsg)y?`>1UR&>8ik?e^;Mnz#zoriZHl#Z=8&lU6ST36pgA?ectp$$IanH@SZ4PN3Lm z^-1Oa1y-V8HDYK}I@j>Ak@jOj1Dm!CyZ3>51zBYl{Io|KaQ=~qpl@?W5||Tl9Zd$5 z$6^gRYyNT83&R~rtQ~=Qp(e=DpL-mRK%|32mcPJT=t3<4CnU z^=gw5vx{i=LY3%NLke#1MYADDEAJTr^P-H|#XbB-Kn#9GY}!C(Mv2ZD>R9RN>50U`Tby+9}G* zyi>$hlY$GG0dF`IgW{Ds#S<1y-BRXcUD{2;}orykq$qY z%Yo+b_?ct2n*0Xz91sB`}9HA{@Iv(6#dcqk@!@V z>knTo$*>jZL-A3W@TuCo?U>`-)N4PaoEXCjC%a+0ueLO8JypjRm|E`elfBuEPbf+=xdj-lu#%n8@y zRAZj+=4((*CIaexQ~XeLFXyP`^GDAxb_;_-Tj_*a?qeFgOg&5e7$`jkrF;eU9=$Qp zDLX9T)#MeOi_fn%#eTZBX;F1)pQAxwoPvCh4rMh{8(^Z|@ zdV;=^uvk7Fp`>%c4K%Rppvp1xte`eZwlrf~u9wuEwJ zS_lnPac3EEoV>IRxdcHA!3I>9-Y=aU?tMsJyuPsOjn%zM)?XEd&Fgmt+lvHA28or7 zpLw43py#umW_@?90z>1Jcx_xK$(nH-O3WNcv(`$e(Gv&6z32_RLM(vgv%aS!qWz7x zuT-&#Ay3IQnB73Rl~StvnkNqEvYya@Ya6HnURqJ1gq$M0dn~P5MYmj= zix9$(RrVjc0;^bpx;iz}S;pbFLQjvZvuE4Yn8x3o7G&px#e}`0z0F9-D6)-G(zd}V zQXnR2o(iZJSa66{Ww>gJbTSS8~>F8rtqg%0(F@!d4(Bd)~<5+p# zlIMTbxg3WBh1bImm(WK>iL{%I>Fh72)J)gQ?r5={_O^8U1=wd0Uo;Gsav6MFU*{$` zD)j6^&U#>MV6AusT)AYV{vtdkRfq8O;(=I6_2P+I&g)PW+K`yP*Dp%&!ridaW?M}= zGQV1!j`)UEq)u=l;TPMp!6tu{*fy zWt%k1cW*k#jp3To+tzO}2yP_JqRNz98k$iCR!D4o-e~VM4OTxlvcE&Sv)AF&TC*x3 zj@=h<0(gj3>`c)viS?w?gjSqjS1XlJXw1qYcxwNoWe%e4PwJ*Rz;-&{HfhH-fcD_4 zw@fg#u%FQ*`)+zOZZSL2`+13T^ZHXD-z#^D#rWuJl`_3+YWQr?k5N|3lH>48$vf`L z=Cv#JjhYRd$xfc$XQxm_8K}aF7OjKrpqeBNcdIvPeR0eRJ@fI3p;De+k<7CA@O)Fk z=f2XzUKf0O@%JO|5b4#25XG&-w({?weMsmEhD_l12NC@D*6@f#biQ-K?>*7sM^J^Z z>FLq${A|-#mZ1Hv7{!^Xo!BD|NHq`@ygw5^zgK1|KMjDtb`L!`Ps30h8#5PgWel1^ zv;X9hdNvO8^Sw&7;)otA)&r(Qz1_d$SQ*4Awyh6}2(?s>zurbc=$Pw#wn}YFKkQ1c z{zPzp+kF4-Ue%_EpMOG)lrT#Fw-By}Y^H3tM9~Y&l>Z+3{&Y#o8Y)^8AE0L_FVg7i ziu@IJ%?}Ly7ue@%Oi@Rprcad*m__fX2}C#TryklBUSHrk2%TNMQ+D%p+h9$m!B5cg zXTDM!J$(e}TE3@!#0rGpQSFW7{ak&P8!Fn|#PZrJ(2LxqllS!*PO{`s4X~XT%P5BX z&M#p-d@0BFt#ZhxyU2OU&`_A+`Gw<}1r+}eA7cHo7c<=vYcnTOcm64Je^^9T6dMMK zBzqe5?QM3*W_$s+7A1lsjBmK~-ILpDxq;lI77qeHkZrMoaf{qUHOz#2 zw9hkdL#W^!V?x1N&%mPI@a=)WvAExf#W~+WwM2%$g&KT9GSeyoLv(Yf{;Z`-uADp_ z?xg2PbQMHRjXCmAcd@VoxIn(y4QD&dHP%S*KkJJ{J^rFi1$~g}XznXr<+Abg-}5Z` zga>Favo2C372a@n`fZYJ6>jAaUvxL~vh!#+Bv!x-m_Gt;Dt^nn`*2+7I zQsaHYw-+|-`rj+ZVg*0yLZvQd?f5t*!%dx`=k!47lfZnJ?fIF zBkB4*z6Q(g5#;(F?3*27gD&l{Q$jx~>+udntkw<)(QA)Oy~B)-1f;;fuKF|^W=A*G z{K7byz0gplW0zz3L%*{l7bzK{L!6q+zrc#N-1ymd_1@~>rIL)%&F(U|*s^z*pak`u zooDz2H%(ENy#dgr?qtOEp^K1P+@Xqq0vqe^0ob&3GuQhG6E)*VPtgGS>-eU6aKrhl%&_?8IE1UdlKn zS2@?x1akYJF|P~^k5bRxw9}*HhLMd=hj8r0)+Vs#4F+wlb+2w=1I%qxp#8M%Z^Xt= zsPL4$Fs%#)aCgj&)x&|XS`qHQq1;z}p`_vA27%@K$6&?6*$w^CnK{?q*7SyxiuA&E z`yo&HM%N2|B3)zoaAk_q_+Uqq2mUBfG@#35WMFMREOC ziaoQ2ESB<*E4I=jKQFdK^yv|As^wlY!5&m}YKE}$zbn(RMAxkWZtb)CQ*KHLDC;lQ zkBOoX(vH?u$pnZ-%bSHwu__iz`jL(#Cj$O!r>c~C5Ba%&T3f!dP(rmdhAX*Ejk=Pz z`mobCUKZ81YTi=o7f1h&tN>`o3KOp(%(3gjPwlIxBbsfBK-1toO-sS#&_Idx*p^5M z^yfnef5Qnv)F=H{^gqjo_5j+H;9(m zRQ@FQNhQX6G3gO~*cA$c-v*>Kokw%9%Q2 z;RcPD@x?VZcjrFTmW}GO=GQ2a z3c-s9oxuA;#KQ+!m6SH2CQlS~ObP3pj+DjFHmBf;%y#iDZ?eJz4CNESL0#w29^my4 zBZBY2`KUx4*g1W{AGVY)q#!NOnDoONW5iSutd)tU=8}0WaKdLzo&6X&WAse;baU}Z zt0FaYg{NlPU|QciN2gbI+h^Nl+qUYIC0jKT{2mSKKN89&U~VtTnQe{pOs}|dmZYM$ z;+CFN31YZ_0vKGzvX5p|ybifdiGNEa#q~da3!rv!FId{o0^Rr&wyKq;irhq~!ZCfQ zfw#wa`2`H~aq-3leC~YWJ=&`(jQolgFbSNXjOhNG{Z~EpQ93S@Dd}$sA^2SQ9uT0& zLs~?)zmZOHP-L*Gj!N-ttP|Yky8AGIp^8avxAL@a7{w`s(|0ydq=9GrXy7yJdqRJW ztEVH?{4#(l#UZ6nh@!m62k1tCs<4`26_+;F7I^ zWhILD3O3;BqJP8r%n0ir$*hBAKFdH3-$~Bg3^ZbOq5j3exBkUW2isU?iw&vUK&p63 zb^o2tdAm4A2df&07Eerle+V0fUgI<*)Y_~*$M@VsOAYBg+13YJW9yJ(Q&s~vK?3JM z35x>l%zZ2V5{S=u+e&VgK)nQmp38_LN`?c;Z-Hxthqt0)%Ba&mqRCq~>QlQcX1*+tc%bD3+T;bXbvVE1dI=>?@+VQg^Y-C-Y+7HU$z#_`F zs;R$0{oVrPhB4w`hF-&ZLWKtmELfF!&DD=(`$ZMGlU~YYbt0I@H>4U>fR<&Mo%ElQ zt3(kt@B02kuHxl?2`V3Bz}5Gv(gzAUDd+Hk_yipoyZ$$vVv3Gi2C(^mrRWE{jatYu%gL({}Dd=PTk>vRUHq^ zx`KbYG~p`eo;dcK^~L$i?x+xa??YuEOrLHtFby*w94)VS0DUcw>HVySthPO@Gq zo|xilIIPsu%*{U*;QTi&`Va2-e|WYJx*+q$Q+t}=x;AUJFD$n-@hSWekpGvG((7{~ zKXV560x|S2`rsdz{a@SX2u5;_F;P1#6?$n)`q_c*L={#mr_nTJub={|@i@&+(au~o ziQ~Ty`mYx_?th+Q3@D-!q+_vE8nus>bhX(-TJF%L2eUH)XDbc=3-tVNCGLNCw0|4; z9R1NTa+fD}-2(#!>B6Vs~e_&+EJC4eEwpt_P(cf6XyN}zy9xH=!kxK zRQc08AMdB&V!wB9;V7qiPmq!7ErYsAONgD6CUEdcYtzmg{NKI}cX%dH@aS*>13=_& z@*7#j^g6}*{wdA;|7gOD2R$1p`I{#tj$Q>k*8gvO&HpCtzk;jJX!XjN{#s1dnp&l_ zZ|w|IFP0oqd+Pp)UGXOurp>azYv8{C|NoHm$?*E@*7F&24+qLz{S_`qMq}EZG4v|u z^A0#Iu`K|)0eOG5eh+x!l$de--47i9#~&i;Enqyz-jGaSQ;>ekshxK8s|A_^&rdh` z&(hn!2>1Uk;(x#MZwdTc0{@o4|9>T5KXp}Rx(R{-uKrK6{z4{PB3__Z`0Iau07*Hv z)cYc?BEHZYReY8_8s{fpPQ`iY{a?HTB%^f*c+@y>xC9kfWuM-<{!dl>fAK#gg>WX^ zawV!O`j~upOgB`ZKf2-^HhkdJ3m;du2e5{Jy=8Bsy7+=naiO!WT3nv?pI_-;ozLbc z6=Dt`iy`2wf1KI{WBW%Ovs#yb05Rvei$N{xO=*X$1A+q90D>(Uzce}P%a&e=r@q19-y~T!P=u^B2gS8Fr#7EgrLUL} z1?`8k+>y+i_*w&?xpBz-lrMKmH#PAG_mq&BmWl*e|JVl>P(hS@BNIxl!2{3bhk8~~ zqRs4=*zS2ZiKBZHKpRI7wqYV4sgFoeBZ+wqZ2JIPLpG&}FPyFIe{VkXpytC)@x{Xa z$6fMpnmbQSGIVinbco~SDdV;|9pV*MWLM;_@^~}5Iv=0hSPyqn-4%@qCzzyGd=9Aj zS5H3Ajxp?1EFdT8gJiGaxdxL16Q`^~g4oR^op`>1cBg&w++*BS3&t>w%F;W$(@ZiO zFF5Ym+V3orx(mHsnSl2FC4rgxB?rr{2Onxv8v6m-W_(gXj-^gB8uNr{>MtRZpF2p6 zJ}<6s@`u0A}6gk}=8t;8-+DBAVm_RY$TSAwLo% zbS3?lS+3jS8T3;)pj0qMBv|5Xz8;#zR81Y-g(8TzcX=6be*_BZ+pNlqt>_sOo3t!3 z>Rhd%g=>>s{>U8fvK zw78U19_z>X9zT3<=^qsWZSDj+x?|Gwe8Xw3bPZf@|Km5{Ij;I|Y)V$@_Nj6;S??NC z=ns#@iyvNoThW$4fFO+pNUKo(4RDk5N&;Tk#gko; zXyu@iS!cDa`VWSdw9nzN#q)0qkfENvM49K;VSvAw2UL1zIsa?+->_dk3KH(OTNpyG zkJT^zlviR7Ww7WT>$(4(VhjzzyMC2O@>_8GgjMJUJ?97g(!PW|#)(M&tN_Wllvdbm;?so>uy%;MZ#k+>Nhu>kQo)u_fRW~CknEal(P_O&-xBR?_ z-OKv7fX6`X4~@m5B)4U?V?(WjS>t;$NVYY-*5B!oZI6m-$xJJ)@QK;{BFz#;wUZ6y3|Wi z;!$|`1C2zd##;@#<*Y7}JHd2Kj%N$b)#LC0^G*)kImwn82YdT-*?Mw5h##*g3U&N_ za*5gKDlBXRz9^7c_8!SwysN+25)>MIY5cKw4{|V3 zFuACh8TklAbU^h~29!=Tb~Hy*c1L^_}^#<0j+ih|%uBw9-*hde$ ztsb+`U|YZ8*S5cIrtjVu*PeEY5>iK2N*65@pWP&@^XKM{KPYXB%6_&raa6^ z-a3B;ayC)D{*kS&YADKqHojfhalTU|3dw)bjw(3L>m@dN*MF8~Zhkogn5;P4JhUO& zfQk_!P>o{R(?&(iy&DPmnsi;vEMP^xhE*mGr#KG3=!s;OWulP_WL^KF1aC1=fiWx5 zPBOVtxpF{vLQwXlu3G@_jj&&^b*aVQ9!eHVHHXo);OXXKUpZbY($1hEKbpJK0}Z;E zI`Ap_8zI%)lUyDIz0HIB*8H!Jl{QdE;P2arHalZn$#TUYAV)#m!+0xtG9SxKmBq*- zodi&V@#PD?OwrLxzksp=1qfO~%rbLTN5i9})Lwz{7Vja~#vk7$WhSzpm^6!<9bO~! zH%DPX(ROgIqc@534jRbL0MBXU&%Ie-lhq1Y8f`(;`eXIVVdhLKs~S0d3CaM9T$L!y%IS zmA-3+r^cb;=^#fY+)f-l9plZK%yY*L>d%ex;fva&_k_1Bc8jHs61gLj{u4hmM!kOe zlAQX@-R@jCS2n<2P1sb8vzOZE!Vahv_0Kxsh!U@CabbAHRlcRVxmcY$$L?;^zDWpX zhZ9heP~JO_LQM}Eua-|+!2iI9_SZ2nxzjfb~1TGs#3nsu##Z=lx=eoPj3XY5q{0{Ga zWf5KQFQj-@{j@gaM+Qa1rskj%ibo1x$)Ep}|EAxc`AAZqkssYnn74`UaHkK@u{1j8 zMgEH+6!V2DOaM%NWj6tZQpH5mFC538Zn-&+ge=O!n5kCZ&HxYT?zjdoX&~;HoKcRC zY`fwu3NXxo5nwA%z*EuEB%L%t$B^a@ALbi6SiF|r(T4!c&&n_=1u+}Dj`hjUHYOW7 ze3k|c=hm!E*t?eegZJdf&C|d-)+Wl^Bjp?6Kbai&*>;6Y$e8tl^D;}kdDohU&>dF^Y)kj{x!te;Osxq|B`+}CN`)3{p|iB$2(!5} z6#o)`D$er$`!SY{pn$P99-BWcRR}P`52GzJh|+_<1R%LboOgIczwFVS&H zR4QBS^_kzyxUq8Ro`!o?kO5i|?9yh2ZgEJ?-*{c&Rqp)Zl~{jK$^z=B>_C3d=BVT| z-<6BHQC1$C%u!e8Z*fP`Z!T>DFn!Y@#c?pagn>J&HRoYy<#_5Vwj21W0nPKnlH&1^ZMi02Uec`su=hTkw_wk0$EL6{i;NQ|^ zM{0G!!DV8Ic@v5Mq@C> zMeB=k=hAxHCp)yygR9PN0GsLZf-oX$y(S&?o2dNuo&%y+Rptw-I=8tgOK6@Mfe7I4 zcat*{)f>&ku85{H7WNWx+5v>Rs{@)!5&0_M*@6Oq_M>qmm-KB=%vN9I?GKS78HJYt znFpwf2Kb1lg7Y)oGf^c1D{@CtDu5;vZakI5a~|aMl{;riJMKe)#$7=4f@ECl9^|C@ z!e-;e46qY1=WVj)oc{WX;KN~|yrS%r zB_Y{N$)bImqsPD!gVP5LAd>4S(D@XBvZ`Q{fF$68vkg0kwC?L!T<6TD(0cfjdo~`} zc<9};kU3H)dI71obiZjlhzQu^a$IR_1k74uHjc~us9)gPyKf3mSm!@Z2W_$+Q-3*> zJMaP{_)jFMI`ZH3dw=?tXMBmy=d7UO?}Rw{llo7QVpt{89|(7&Ciz=d?ns#uhyw6# z@O=m4C)roeb@=$NL`!-V~>*qD)uk6OcRAurxA>+OB;rR3IQjn zyg8_8u8w@S= z`syu4SBz}!fY6Fnt!ohHc=B(o0XpiMEP(bgc`^3DL~9~j5u>CjFOfWmi@-7C+< zeJOpp^fPNm=OQc2x0wdrgM?4nE10_)17F=Fo4s*Qkc4>AE~``dyqUt}6>qvKNKNQ@ z38x<)ZN&Lq&M*^Ue;iEe`zUy&cor_FS-kK7<{N?3EcywkW2R=BH+Rqk z;sUs#->&l6HQL_R1!F%{TAvhecxJ!x=kf@;W;k7#s)spj?uwf%N{eJAgWX0i`2w&Y z=?r&V^WJ%H)RCV^vBBHrD3*B5e%fq2U+hqKaVtE(co45X->#^wR)&!Z8xT)gtODgk zjun z*b~Iihm9^EFFTHnP2c{k6u)m=SjwhG!#=1zyz|WL(obi8JX61m!+bL)t3usWH=%E1T=%#ZArahk)}Xp9Wsy0~ zTS#WV+2oC&s3I3zPOh@IzFfH4oRfmR2po=8Xat#6A&LjD;FmWo!NhzffZ$X(d-9#S z-Z%g`I%n|wQ8>Z8)<{8qjMs6QF|f_ObHb>Rh~ zr@H6C&wb9VwdPKm4GJ1Z8C_r7rFVQjH%Cq-_S}derS;%iB5?$B9!P_42(pgk#yS5; z3>e`Em-m;r%yV)yyl&^M-fp&sZ828LTjstsfSZ?4`K$HAskG;AxH>U3U;#9N&r>a{ z`mDu@4no(RON^G!P88Or()wKa?9v@Cxx0_9?J~z>#~B6!G%GtKXdl_no1 zIo{Jn@jYXG@)CTRd7yLR+gUTjw0eK&AGMc8&3rWh(EkUu`jQcH@*x)heDmeic%$6) z(NjhEowfgI?mrOK*C6yDmGta^WkEzMu)=R2^?*om&T&a+QmBPPEi0W|w#B4b-t z0L^pZ!J__d`{AU7nu88-r>1Nl8kw79&68*KX7!$c4JJ&t;ojirOs|o~@3_GCacagO zIeP@Dr#{!w{#PaU-W1Dub0R>poE3S?V8eSLVd_=`+sJabb8f9E`+@WxgVr2BqF=k^ z)9Q(zg4gL5T{uaxe4>Wu(=`f!dnVE z{#`QGhkM1FHfUNXlOa*f`{Q;b5tcZT!Omh~m};A21}J$Yxm17_SGuCTD^lf&5#`{d zG$X#ZIN+WoYW<~euE346WWW8mkcL2b9!XKb&f4Wv6n7QtF5gyuhlxvI?6n|dVHi8? zx6(UL80I8*Tb%!!sZdA3=<+S!hBwtMn;YjjgBFm*Wwep|c%_z>W!?QgJ{q7f7d8xR zOZ!gMO}Fl?vA{Cj1p<~S^AGNy)s?UFrg7prE8c?h%Mr+F_R8!4HI3!}x(+>>&9q-BZ_ZoAiY2&hFc7pCGdtdn{c2Rpw z3q#|D^D9LyBuuaBtnV-#?7aBL*xAW3xn5LW5B%_?h|OA_oajm zkr+|R0cH97@UP~F5piL`J;8xYzQyZz{PCL&i7F8YG za75I^9XArj{!^XCp~pd{JCpY#v`@-Hs1u05B*?uyYVUv7yTwsV;sQ@ro>ateN!OgP ztoHuGSd5aJ?qr>R!7o?iszg!F57k=yF48E^^+!l19#ph2&c|B)6i7Dh$PYE(T3oz2 zq!rDdl2lxb%r_bE)SCw^Ue!JtIpXhm)34Z1?&r^8xOeTfqgx7rim2n)Z>RJM<6j}< zE!6F5M{8ubly{g;97N&OM2jUd$;n0Iid-ocI>zAg{hJGQ(fx*uCG4~^Dg?Fp7 zCFGQ8!q65byF;a1m0&q`NdK1gKuB#X{?ORnE&7H8Jb&9tAa#_^rOKNkm#k z^yih6_}=!>K%_k`v*1+U?{RKdc(&@pKub_6l0*_v|5UVNb8oRB=%BNy{fN%HRr4#N zrQ%pn30{1cDQj<#bJV*5P*oNqh`s_z@?YEY1U6`caxLTKwl3=4yk5PBj#I5mf`Gz{ zjhr~~5@nl)U_`e5j@6Zjmy^S@1yzbrPb3p0Y1P_Lve(SNE8zX<-H`%U*7ekjJ&;;4 zFww7nAu=6QE(ary!!X0ZoNM zh7CtlyC9`_Zs9n|fHd%f#OG{5Fgi?ZVr0T^P-?I&A?9J~u=nKs2E)qPUTdZCc;JMS zjf_P?A1~}{Pg2Wh+G<1&RP^;gJSaJ69de@~eK-av$_`s6AB22tr#8T3`6i?8Yj)d0 z&NfPR9&`oq#LvnO2VZ#yg4exY3oM__&DJmMb<%p|=x2E07uS!vuC|<063w+dGYVY< zZDKr1`omG2Ea*M+Mk>dtyfoI)46^<7ZpSr8jtbfB_Z6zBD<;TY5)Rc|XM|SEVY0 z1GU9;^Y2Z!nbK+Rueb*dZ8FR6^(@O)hV9a6q)W!REL(|e_e*)@cnX+8SXmI+sH{C=Y{hS{+*t6eLyZux?&6RmTZHT)!cJ_z*b|_b1C>d31rU-jaA2> zb}pqt*>U~uMC8v@?bo53W{Pe7z)~rB+dzZbN^OA|-gHfR!6luM7WnpZq9@UzQY))R zQ0;fUIej8AzZ&lb38B;qEVRw9x7QpjwgIENG+tabNp%9G{M2al3h>5bQA6DMZhv)^ zV&I#ryyCBo8PF60zSCVF%ZqqFbpf_l!KI9;MZl&Me$7Cs(g)Thot81EN1I5ce~@3C zUB{vDCbY@IPx95eVc|u{yTHs!`=zU4-ceX?WUhS1d+*p#=P1YuIAYp$3a@a8+_bD6 zb(d&X$F?)yA3Tbyi^8s6hKv4q;ua<@Xfh>DQj*`7OE9YUjzK3!<&nOLyq(o8@TVr~YsiKG50zt@8aiGDRN zouyCP<=GBi=rWb3gjs#`QV?oN!n19Qws;y^#l8)7C2|R9nQO4EWL#DKoR6{2S$#f!5Q8 zbDD~f=hdi1&tImG^Qlv3<>U;XdnNoUwh`P2CArsd3(lq*irq>j|2axw_T*))gH0(> zavC(1gv;(X0kb(uqtepgw=5rQbNphO z<|se0vAod)kSb?T-RliB&3JJdRn<&jYS4rC5d?%$SRleJJu~0ySKB@P&nC1e`!HXD zoa=UekN81AZbs0o`VZM9OjGB^tU`%%o?Z0YxBj^Ldmt>i_ZIOX89b zxCmJM!;!8$H462A{nK>wn?%MAbuGfe1CTRdBq+-obwsk8iP%99RV+fW zJ|O(qWR2d3BYfs+i9X#{S{7B% zilzJz`O18i9y)f$Zb~wN79T4mL^>9kE29~lHpWcd>w)-5^vpw5TrYnUp~tNvsNPX4 zyR2`7png8?#(K`sK^b6@Z`P`sD%>DFZv?LD_>)_=ex6hAtEg>IyUS|*D~p_cgK-4> zV|$utSB47udhn9X1qd|LHaS$LWz7$>SwPWkHc1VSa_8B!v}c-cQrHT=YQxQwga>84W+3 zUN_c4q0bTU>7N0HswgVQ!!`4RDXK37LCKnVUmd%ZRkk;@X3!1psWGJ$gaD&C!^Ea? zQ)%OhL`v?&&=(tnrS*;}`^Q0lc7$0riAj3SCq5{C+(;KyND(0MSi!Hp|vHZDqcpmUEs$ zOXh_|!CM^vaknRBqj;$r{MluQq=2KR!NA;NbD-Ec7P8YCvJQf$+!AM04po6*Svate z+wysOLBO?VthdFq;LDY>uovOj78grq9dVJBk7M+C@@cJC;$Jm%0JdZ!ifYMo%w}th z8gN*$lD@rsZgF*V5-J&E(3A4y!ZNk#>tU;ZMEXx4m?bS~80(y+I1KyG13BFGzPZ~& zi`_4?7N_1Ws&PSXRA+l(S?poLuR^>if6K3TP)2!#53sjI2Rt zmdL%SS^LWH&2B&0FcPoj6* zp6p}jtrJ(IUxat$#V{mFycH>v{8U@dT5{5VKzt=f(WH2GL)UosvHcl~hyyY{D`9wy z&xfnUk_d;WtPVh;Rl*@y&~mA0ZHO)$nipAWx=v~B<0eeJ?@ zp+_#T@L2_|n%b0q!a#sFgbH`p9W$iy^~|GTf2$b15P*J4DQAwGD6{wCvurWWsvez! ztX*9q1Z7ot61Stn9j%1`GRzk&ALwy_wfDx9XYf<{Vk6@|7IzqpauK0R64;^@>;15Yb3!<<0ca~t zI`8Ywlto}6+y-+Mkd}Qvxr<-FYjsdGe9fPDSeYKuNjXsa^2O?l-SC7R< z$JY#G-G5ve)`->^uvP7-qZLe9w()x~pC#ld{P>yhl5>`ple$ml*b~*($fN64)Z$~> z*|SQWfnL1&1KVq*8RG`em+g2&G7d4s08;HylDSxxYMN~kox0MBrrt3nrYpwEGq`}_ zc<4hRf_%f`v&xM}T+maNMv#w)X~feScwOsPL_ z6HxFB4_P8hZpaO;ja1R6+uzkj^1Q88jtPmztV;8nCkd*49u=L~`d(3{Y>(nEQHjDF ze4&&AFMri8D9%KPH0&u}GnGH9Q14tf)k}D#mArOXO}|fcCgo7|tVL9HyL(Nk9#K`z zg&$%H-hOzwA%4e~E5bhF1IbaVgnlTscr^bMKL%}!3k*06kh^bSU7_n`@BQZDoMP;x z4)-p)W1^047ijI4uHCSU0 z_5@)KdSq3FaGJiyF1~|RR-+nXgG+?ErJ!VUVKX!gYr_IH%Il(sZk5M-n6j4wL1s`I)=`P|StnV0;u2t&k-iu#VL zwIFs4P3l(?C$tNAqqe$~^k*M+7;azdN51E}i2)StQR~EM;4d(JwNQ-L%3#$9$p+&Z zuF_#rk*~Mg6s^s}yYG)?6E$zpuPJ&Z%1cLrYbuseSuNbyzC;wKu*2(_TTg_Jo~Hj` z9ufEyfcNKqGfL9D&BWrlGMIV67O<{lP%jn4G_ppo;N7|uSZGU^x#+B@coxUts0dEH zR^~yOx^J`Ih)wpQOWM5w*t+FBuXWUYn#Hs8Fx5Of)sQ*MLZfAaRgn-xVfi*xJ@=6~ zt&UC*&=oB+c*SN$pd3E*G|%$~oxOjObuF4A&ZY!#dU5UzG$h|cA|lZChRFfP(N;8m zJfeDKC?Yq41mw39puH#p#UGxHE$3h0FSL;a(;e_nFE+l}mYuYgu`$ovq~-s9{Avp9 zXA(0q52%xsZy8mZ>R{N@M>u}!^|A^yWQmlFn#FTq>9~w?rdz7~-ApwsK|ivgPD8Mn zmbx`9p?Wnf4bQL4IM-JmNl5l|vWeUIJuCP$y%Y=Fw`DuPc++qY&GQmhZw_!Lka1_} zFcB+YROgxvewG#&vr+T(oNB6jTZ=Cot~m=WqnZzYM2_uj9ZtgpjZk7;J>C*J z-4-wBqvCG229xx9PG@Z@I8+7IVQFPve3OQU-}*_c9@xBCta?}_qOLe`oG^}kLs9kA zo68YW8B@-Nu>}!o>&+g)_ z_QVtTK_u(Q>rJ01ZLg0aeB%|}fQ6kK<4&GzwJ#0_fm_m0O>q;wNjN(_QrEE29MkbP zVOej#ZQ1ii7SW(L6e-oMgH(T#t%>Op1QCfY+y79ZQ&>7scWl)tN-B2W;$khbq&REj|-Fb8&UG5YsXO$%&z*@4N%`U z)XF^-C#?hMm7Z94eC;2d+C;V4eW^cxfdauIXs{60)LUvYcKlGpl58Scx^h?j3D(Hi zHg*TcC56~;s-PAZH((CNfdEyE|Oa+Hplqlv5SbwCjK=0(5LDs%2{$ z;)J_Y=`!}Vx+ns!%`fGDs7VoN#zpa}J6>`=_hUCHUEQAwxlP8^@?f}2P;Cl}J9@HB zKpVO|H{GJKmrR-cqbu563NDvMz@Ra|bTy>BgcVFkQMQj_590MtN=@&%IQFgiqGI^% zF02whQ+vqinp3{_ezT-qy4YUH`OOkqTle7vEpA5T2yE?HbDMfGD}t*xvuBykh%D?w z@tN8@!bA$D8Y(T6^E|p+uG%p4EnYHExLwmUu*PC1!_HWFT%c>1dv-v;GqZ|S^PrQ6 zFoXc|bqDA}vu%hdSL`qEWG!>b!_L+jU67~fPb+e7H(oQ4y84!FM)VRtvOM&;sJBPe zoiM3bGF~6?=iC`=T z?LGFKD78}6=y`T!c_0z3&19}p+ptovA`*83a7;$M3C#!2qBB^Z&~O#y=qc$$w<=n@ z9%ukWvIeaoPaplhQ{3)oW};paw}wjB!4>%-**Tk1q31|Sp99B@uM6YHs#S@VX14IC zjtl9?yMcB=*eQMFCqDrrEO5O9Dy)04nr=JjicK8tN8ZHGcQ+mcE0`l8m1;{ckDwj! z#LWe&IKEns!o*^+f1h2#7y)w%G;z0GI?0;vq}*REsp2H`mn)+&3VW{~q}D@X7d+n~ zWOK#0<_s~MZjA1^Iew)}ofZP3yTdn*hOhBXxUw~wOz}eTgD`iaHw>LZgh5xy(WhoF zRFJ9WxA^98S;l$TO%>^Y~G)6RVdPSg)&$eGrFBhR31+1-sh zWKW7nQaKxqWT@`dc?9(HEJzi>X`1GP*4uZ;DLTe3lWs#vUG)y$SlflS+g6D}4bOu# z?umnOMaO5hu+B!fb<_A7*1k==8oCa8=4|J|LAl*LaG*tgCH;GxZ4`N%>K4G5(IE=I zDVDRoF6-0_{CJpJ0J@5W`jP0-#$hbce%O1vf$f7bb?2T{Rq?~U2JIr$HFs+6uDtjZ zp2yev2wT)eF{1h~E3_ORGp;Qa&P%}1>xwL0j`ekVGRwa+H_Uj?>JVXT)O7o#eK<@G033OZR?JjsQ8urOQloL6ziJF=EEeF zSV*k20j;wtilx(ZcEDa}*89a3(ggGN9A@(I4H&b+IMDPj)ayZtvC%#CoA;c>>@~}k zpJ^E(hJfT`&168|+ygRykz=m;eMOj3?oQ-64s;ZgSCv&kzLeObS|HPNv|iw{mHLRLa0Nd z6y$=KR{hN!{*WH=hhbH12aXlj2fiZI)V=&3nzB^1A+m)7Xe% zU}~Jl^M4Lbswd-{%C!nm3^816-7J{~EGQ4CX4#xYbGKWip<5e}WBtCh&2X3^&P zJ@=5XO7t$dGgAKqtD(`PJS@8Y*30sn+XZ#<2f-;ytv#7s*5u_?zn8sg#hAno02|Z1 zT+v?yB&)W~SPy96RWiP8lD+PG4NR4>bImT{Gut<{zcDuibWvJEf`qQ0{3i4xQNCca zdQFv;n`KNU2GD&ZQVLWq0duMBj3pB59IMPe6hSC&w%3FLJ&0MEPrM@+4# zw=H_2>hm(4yw%U!(MwAoZ!m0N(3$Axdrg1Z39Z?WDTcDo%A72Hu}hB1b^_en@!kM+O6 ziLIg&x{=->`E+2;Kom|@uQ!+dlK|pf`z{xr(8VIIWs-6H3=+^mCwL%sEmMC;?qh`V z7WmE63@CS6%zK{8E}gLJF!&Nj$bKj9-y_$VDGVz7yE%^ z040CmtE2v#_O{v?0;ZJ2hJe%yv5hlp&hvUD;VBQ8#97AGhti?IR^U(1x^~nL-vlNz z_K6B39DCmh=M-5D-*iRjVGqBiIgKuIf=E21SDZ{^nHd2_Itm=A%N;T9Z(MYkb#dN_#Y6~HHJb2@zU+h3 zm-DK&E~OUsnOnxjOo{jXiB6LI+W$#S8XT-MwZStFz3BLILElByn=Wm_Y87l@31#NE zNW1|r3$VGB? zg3!xBX$8HgW775I3c$Uxus}`#DorI^{R#gs7r@0&MK983gN~&D;(iw=U58l|C)v2m&tIxN8cfs<|aagv+KRr^CJH#g*iG_%NYB` zW^QP?UP^s^K29GQ2K-`K5D@yT?_fYXAYt5+~beFd^OR!}zuQM}GowBt@b27z_0 z49(lpaW{$`|3XNz;PE@o;gqNpf0jUDZArrrAP9Y9!g16S#wSW|fRj#Fu&19>SsIM<>#Z)t19 zDIYMv=XQ@`p+S6kh`vTZ;=$^vNDZo)C+1ZTNA)usY4S{uXSJ`7Rm}&3|6@{u&tEE- zwe|2!z=qDG0L4njnl9ot9}LxsmHKue(OneX->ZTM!bat!ByH1nIAhKzWge2*j&X3} zi$296YdlkoT|*QkFK(A2tTeUc~k)zARg|3*IGq2O9`;;A@AyJk7OwZTiiv&Z6vl?D>phG37uU zu_X1~muqJ!5??@&dGZfWSJr`2s>Zvo-8sic3El7RL~wE<*+G)-*u`h|*3IM|KT1=w zN8*0AAMmPE9)BB3NIYH-O!?bn6!H=mYM6v183O>Di)F70T}yQPMuz}^+;;M zdko{@l9Zq{7itHL6B3FJ`dPB!hEj`}J~FYCbw|OF7K$LW69PYiKW@yw@lu5vn%w(U zJ>Bd6^X{9ZK2b(E7ZR<)d!sn?(~Nq_A2g0g)=ugt{|{E)f@?Sw$n{rt<+GBo(u2Ix0t{ABX|XnRcgG*;q9)0Iqc*1~+Y5)EYwj zrzYey5y}R6mt>+3sg)*1``jaI+GGTKrm+*_5SrIhTi&|gdgL8iCoUS@T8cj%H!$(7 z{PdG3MFPD!@Bg4j|J!JS{9uC&9i>A|I@{9~5HXl17l-P_pZ-%cRikpglakEM#Rfl? z($2m+xpdR7vCn*70>HpE;;!MZ-=di9e@>%tGoK2Lz6b4a6I_gl0a6`3zlUTGU$~lj zhT4Z24|StKBED}Y6KD%=cs;jW*FdPKWF3`(_||T z3@~Cyo(oP$v?jJ4z4;_3uc2D|H;VmV-|>%;){(LzcYF%;iV)7P0^a~ej`9#Y^L`Bu zx3qeZ9(V_A8$=X}n8AL+C0f>R#8UUxLw2pzZ~IjYz{A{|S=ti7;gSeoUEa9qf0E4q z`XXP<2J{H0B9)wnuDr<1@6L12OJi@fMz3&Zs#DjArXJ6RPqBu`7;_UU2%lGLwg3rt zSp;OrT>LY$#@slXQg^GHqz{^(!h6pedm@D|WL5GBYDsg)&rIp9SAZ+HR-T2qQ;X+P<6@Gw0B@Xu9gBSD;>(g?!Gu68k`@;V^AsQ$5)r>x$Ar3DO}BSc75@^i?-w zm1p!MuN1R8Zy|SY$YHM~1QCYP&az~+J>_4UCX~PZO%DH?wj)s0Y9Hdhh`TN3U{hL` zk0?*Ycv^SklCuvac{$3rCeynz2oHU3yFIzQbJs-kC z{Aho_<_E=mmppx4#lv8f7(YUr1UB9<0I2*L*u+{O$DRGwZIv;kM|kk-i$?x(ZyJrB zGXpy;pjvo4xum88w6P#UPx}yId3#yAs69x_Xfjy^5$t^J7)&hPn6^;*TVL7hi`$EW z4ET>-C3iCB2WwpxC7pBm!B&kfrCZ@);*2qcrH@l?=Ood|Al1#{`zFmmd}RJ`#CawS zXx-WQ1o_*H|Jxz{|2V+*OI&doezg#e+)&_!i;y^OS7>f8X7$rS?i222vbji(Y0BYr zX?mQMxQ8sU)ni-{~7!iH#5=A56{ zTKDJ^XD$Xww3D!G{qVa{e*i-_nwQDW@vfmS7~I(Q(R<=as<=thx?b-=`{P`1!natp zLZ;uaLr4a#Fu?iU>U=ANMB$yF!Web6=_n~X?nD>>c70?Mnx?7RP)l>RRl@W97-Q03pO7sq_}_?7DG zZF!{4=Ovk~S5gmOq?y0f22hsDoGBD8p~i>alh^esL&)x#d%i)M!bV&x?fh@V-@(2{ z1c%QJH8DIQNuxHQeip50G#EGf8 AzV9Y>+(|CJ;IHvrz3+f|=c60+g-hs2rfu)k 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

    E9GrS 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 hxxzsqz|H!T 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%0A&8}tsG9AEqT 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 literal 0 HcmV?d00001 From 7b9fc8c74dd989ab2910dc26538623237f267b47 Mon Sep 17 00:00:00 2001 From: Sam Ade Jacobs Date: Thu, 5 Dec 2024 08:44:00 -0800 Subject: [PATCH 630/754] add FPDT tutorial (#6813) Tutorial page for Ulysses-Offload (FPDT), blog page to follow. --------- Co-authored-by: Jinghan Yao Co-authored-by: Logan Adams <114770087+loadams@users.noreply.github.com> Co-authored-by: Logan Adams --- docs/_tutorials/ulysses-offload.md | 68 ++++++++++++++++++++++++++++++ 1 file changed, 68 insertions(+) create mode 100644 docs/_tutorials/ulysses-offload.md diff --git a/docs/_tutorials/ulysses-offload.md b/docs/_tutorials/ulysses-offload.md new file mode 100644 index 000000000000..311d523788ac --- /dev/null +++ b/docs/_tutorials/ulysses-offload.md @@ -0,0 +1,68 @@ +--- +title: "DeepSpeed Ulysses-Offload" +tags: training ultra long context language model with fully pipelined distributed transformer +--- + +DeepSpeed Ulysses-Offload is a system of chunking and offloading long-context transformer model training scheme built on top of [ZeRO](/tutorials/zero/) and [DeepSpeed Ulysses](https://github.com/microsoft/DeepSpeed/blob/master/blogs/deepspeed-ulysses/README.md). It adopts Fully Pipeliend Distributed Transformer (FPDT) which enables 2M context size training on 8B models with only 4 GPUs, and 4M context size training on 70B models with 32 GPUs. Read our [Ulysses-Offload blog](https://github.com/microsoft/DeepSpeed/blob/master/blogs/ulysses-offload/README.md) and [paper](https://arxiv.org/pdf/2408.16978) to learn more! + +We recommend that you read the tutorials on [Getting Started](/getting-started/), [ZeRO](/tutorials/zero/) and [Megatron-DeepSpeed](/tutorials/megatron/) before stepping through this tutorial. + + +## Design of Ulysses-Offload +Ulysses-Offload is a chunking and offloading-based transformer implementation, which retain the full precision of the vanilla transformer, while significantly reduce the activation memory required during long-context model training. FPDT breaks long sequence input into smaller chunks, moving them among host and GPU memory to achieve the superior memory efficiency while reaching over 50% of MFU. FPDT adopts a double-buffer design, which overlaps the fetching/offloading with the attention computation. FPDT also allows uUsers to configure the chunk size to match the expected memory budget. + +Ulysses-Offload supports ZeRO, which shards the model and tensors among GPU memory, further pushing the limit of long-context model training with state-of-the-art hardware efficiency. + + +## Training Environment + +For this tutorial, Flash Attention (CUDA) is required. We will configure a 8 billion parameter LLaMA model using the DeepSpeed [Megatron-DeepSpeed](https://github.com/microsoft/Megatron-DeepSpeed/tree/master/) code. We will use 1 nodes of 4x [NVIDIA Tesla A100-SXM4 Tensor Core GPU](https://www.nvidia.com/en-us/data-center/a100/). + + +## Training a 6.7B parameter GPT with Ulysses-Offload +Users can set the context size at the beginning of the script, for this exercise, we will use 256K context and mini batch of one. +``` +### Main configs +seq_len=262144 # need to be power of 2 +``` + +For 6.7B model, we will enable ZeRO-3, Ulysses, activation checkpointing with CPU offloading first reach a decent GPU memory efficiency, then users can configure the following arguments: + + - ds_sequence_parallel_fpdt: Boolean indicating whether to use FPDT, default is false. + - ds_sequence_parallel_fpdt_chunk_size: Integer indicating the chunk size in FPDT, default is 65536, meaning no matter how long the sequence is, FPDT will always process chunks of 65536 tokens until the entire sequence is all processed. + - ds_sequence_parallel_fpdt_offloading: Boolean indicating whether to use host memory to offload chunks, default is false. + + +### Megatron-DeepSpeed Configuration Changes + +1. An example snippet of megatron-deepspeed configurations with all Ulysses-Offload features enable is shown below: + ``` + megatron_options="\ + --ds-sequence-parallel-fpdt \ + --ds-sequence-parallel-fpdt-chunk-size 65536 \ + --ds-sequence-parallel-fpdt-offloading \ + --ds-sequence-parallel-size 4" + ``` + +2. FPDT requires Flash Attention, and also supports Rotary Position Embedding (RoPE): + ``` + --use-flash-attn-v2 \ + --use-rotary-position-embeddings \ + --rotary-percent 0.25 \ + --rotary-position-embeddings-theta 100000000 \ + ``` + +3. We also enable CPU checkpointing to reduce activation memory footprints: + ``` + if [ "${activation_checkpoint}" = "true" ]; then + deepspeed_options="${deepspeed_options} \ + --deepspeed-activation-checkpointing \ + --checkpoint-in-cpu" + fi + ``` + +You can find the full script [here](https://github.com/microsoft/Megatron-DeepSpeed/tree/main/examples_deepspeed/sequence_parallel/ds_pretrain_gpt_6.7B_fpdt_32k.sh). + +See more details on Megatron-DeepSpeed [tutorial](/tutorials/megatron/) examples on how to launch a Megatron-DeepSpeed job. + +Congratulations! You have completed the Ulysses-Offload tutorial. From 0e92f9b41f864c034aea0a7eec7267f48bb70f80 Mon Sep 17 00:00:00 2001 From: Sam Ade Jacobs Date: Thu, 5 Dec 2024 11:31:52 -0800 Subject: [PATCH 631/754] Update README.md (#6824) Fix broken tutorial link --- blogs/ulysses-offload/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/blogs/ulysses-offload/README.md b/blogs/ulysses-offload/README.md index 740c07229d9f..283b5142e274 100644 --- a/blogs/ulysses-offload/README.md +++ b/blogs/ulysses-offload/README.md @@ -250,7 +250,7 @@ allowing users to focus on their research and development tasks. We are excited to release Ulysses-Offload. Ulysses-Offload has been fully integrated with Megatron-DeepSpeed and accessible through both DeepSpeed and Megatron-DeepSpeed GitHub repos. Click here for detailed -[tutorial](https://www.deepspeed.ai/tutorials/fpdt/) on usage. +[tutorial](https://www.deepspeed.ai/tutorials/ulysses-offload/) on usage. We invite the community to explore our implementation, contribute to further advancements, and join us in pushing the boundaries of what is From 2ea181f0c33206bd8362aadcbd732d5b1314adc7 Mon Sep 17 00:00:00 2001 From: Sam Ade Jacobs Date: Thu, 5 Dec 2024 11:32:36 -0800 Subject: [PATCH 632/754] Update README.md (#6825) Add Ulysses-offload to News page Co-authored-by: Logan Adams <114770087+loadams@users.noreply.github.com> --- README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/README.md b/README.md index 8bfc344a4edc..2334fd366ae4 100755 --- a/README.md +++ b/README.md @@ -16,6 +16,7 @@ ## Latest News DeepSpeed empowers ChatGPT-like model training with a single click, offering 15x speedup over SOTA RLHF systems with unprecedented cost reduction at all scales; [learn how](https://github.com/microsoft/DeepSpeed/tree/master/blogs/deepspeed-chat). +* [2024/12] [Ulysses-Offload: Democratizing Long Context LLM Training ](https://github.com/microsoft/DeepSpeed/blob/master/blogs/ulysses-offload/README.md) * [2024/12] [DeepSpeed-Domino: Communication-Free LLM Training Engine](https://github.com/microsoft/DeepSpeed/blob/master/blogs/deepspeed-domino/README.md) * [2024/08] [DeepSpeed on Windows](https://github.com/microsoft/DeepSpeed/tree/master/blogs/windows/08-2024/README.md) [[日本語](https://github.com/microsoft/DeepSpeed/tree/master/blogs/windows/08-2024/japanese/README.md)] * [2024/08] [DeepNVMe: Improving DL Applications through I/O Optimizations](https://github.com/microsoft/DeepSpeed/tree/master/blogs/deepspeed-gds/README.md) [[日本語](https://github.com/microsoft/DeepSpeed/tree/master/blogs/deepspeed-gds/japanese/README.md)] From 95ead2a055afe0387b18eb7af1c1b973304b7553 Mon Sep 17 00:00:00 2001 From: Logan Adams <114770087+loadams@users.noreply.github.com> Date: Thu, 5 Dec 2024 12:16:46 -0800 Subject: [PATCH 633/754] Pin transformers version in cpu-torch-latest due to multiprocessing error. (#6823) This is a copy of https://github.com/microsoft/DeepSpeed/pull/6820 for the cpu-torch-latest tests. This PR will revert/fix these: https://github.com/microsoft/DeepSpeed/pull/6822 --- .github/workflows/cpu-torch-latest.yml | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/.github/workflows/cpu-torch-latest.yml b/.github/workflows/cpu-torch-latest.yml index 0125fa50bc14..51bc60c2c2ae 100644 --- a/.github/workflows/cpu-torch-latest.yml +++ b/.github/workflows/cpu-torch-latest.yml @@ -37,6 +37,15 @@ jobs: python -c "import torch; print('torch:', torch.__version__, torch)" python -c "import torch; print('CUDA available:', torch.cuda.is_available())" + - name: Install transformers + run: | + git clone https://github.com/huggingface/transformers + cd transformers + # if needed switch to the last known good SHA until transformers@master is fixed + git checkout 6c3f168b3 + git rev-parse --short HEAD + pip install . + - name: Install deepspeed run: | pip install .[dev,autotuning] From 177832ed45c0174673cfeef978afb3ebfce1c2bc Mon Sep 17 00:00:00 2001 From: Logan Adams <114770087+loadams@users.noreply.github.com> Date: Thu, 5 Dec 2024 13:51:05 -0800 Subject: [PATCH 634/754] Update pre-commit version (#6821) --- .pre-commit-config.yaml | 2 +- requirements/requirements-dev.txt | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index b5d8afa8e0b4..9a7bb1c9b371 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -5,7 +5,7 @@ repos: - id: check-useless-excludes - repo: https://github.com/pre-commit/pre-commit-hooks - rev: v4.0.1 + rev: v5.0.0 hooks: - id: check-case-conflict - id: check-json diff --git a/requirements/requirements-dev.txt b/requirements/requirements-dev.txt index 2e2c880fbeb0..71ad3f0b262b 100644 --- a/requirements/requirements-dev.txt +++ b/requirements/requirements-dev.txt @@ -6,7 +6,7 @@ docutils<0.18 future importlib-metadata>=4 mup -pre-commit>=2.20.0 +pre-commit>=3.2.0 pytest>=7.2.0 pytest-forked pytest-randomly From a4499668fe98d609534e5b629b69e8891f885e42 Mon Sep 17 00:00:00 2001 From: Logan Adams <114770087+loadams@users.noreply.github.com> Date: Thu, 5 Dec 2024 14:21:53 -0800 Subject: [PATCH 635/754] Update version.txt after 0.16.1 release (#6826) **Auto-generated PR to update version.txt after a DeepSpeed release** Released version - 0.16.1 Author - @loadams Co-authored-by: loadams --- version.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/version.txt b/version.txt index 2a0970ca757c..201a22c8fa5c 100644 --- a/version.txt +++ b/version.txt @@ -1 +1 @@ -0.16.1 +0.16.2 From 9ca60160179aacc1efe87121e1ec259ce8d0a476 Mon Sep 17 00:00:00 2001 From: Logan Adams <114770087+loadams@users.noreply.github.com> Date: Fri, 6 Dec 2024 14:29:00 -0800 Subject: [PATCH 636/754] Pin HPU tests (#6831) HPU tests are impacted by the same issue as other tests that use transformers latest. This PR pins to a version of transformers before the fix. --- .github/workflows/hpu-gaudi2.yml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/.github/workflows/hpu-gaudi2.yml b/.github/workflows/hpu-gaudi2.yml index 9f1a9d973ca2..a06f871b7c56 100644 --- a/.github/workflows/hpu-gaudi2.yml +++ b/.github/workflows/hpu-gaudi2.yml @@ -111,6 +111,8 @@ jobs: run: | git clone https://github.com/huggingface/transformers cd transformers + # if needed switch to the last known good SHA until transformers@master is fixed + git checkout 6c3f168b3 git rev-parse --short HEAD pip install . From 9a41ccaf446cc2026a30040bc55a21df1256cb64 Mon Sep 17 00:00:00 2001 From: Hoa La <87745938+lvhoaa@users.noreply.github.com> Date: Mon, 9 Dec 2024 12:56:54 -0500 Subject: [PATCH 637/754] Flops profiler support einops.einsum (#6755) - Added support for FlopsProfiler to include einops.einsum operation - Added _patch_miscellaneous_operations() and _reload_miscellaneous_operations() to include this operation and potentially include other miscellaneous operations in the future - Added _einops_einsum_flops_compute() that mimic already-existed _einsum_flops_compute() --------- Co-authored-by: Logan Adams <114770087+loadams@users.noreply.github.com> --- .../profiling/flops_profiler/profiler.py | 34 +++++++++++++++++++ 1 file changed, 34 insertions(+) diff --git a/deepspeed/profiling/flops_profiler/profiler.py b/deepspeed/profiling/flops_profiler/profiler.py index f87f1beb7e4e..c6b607aad813 100644 --- a/deepspeed/profiling/flops_profiler/profiler.py +++ b/deepspeed/profiling/flops_profiler/profiler.py @@ -16,6 +16,7 @@ from deepspeed.moe.layer import MoE from deepspeed.utils.timer import FORWARD_GLOBAL_TIMER, BACKWARD_GLOBAL_TIMER, STEP_GLOBAL_TIMER from deepspeed.utils.torch import required_torch_version +import einops Tensor = torch.Tensor @@ -82,6 +83,7 @@ def start_profile(self, ignore_list=None): self.reset_profile() _patch_functionals() _patch_tensor_methods() + _patch_miscellaneous_operations() def register_module_hooks(module, ignore_list): if ignore_list and type(module) in ignore_list: @@ -137,6 +139,7 @@ def stop_profile(self): if self.started and self.func_patched: _reload_functionals() _reload_tensor_methods() + _reload_miscellaneous_operations() self.func_patched = False def remove_profile_attrs(module): @@ -787,6 +790,29 @@ def _einsum_flops_compute(equation, *operands): raise NotImplementedError("Unsupported einsum operation.") +def _einops_einsum_flops_compute(*args): + """ + Count flops for the einops.einsum operation. + """ + *operands, equation = args + input_shapes = [o.shape for o in operands] + + # Re-map equation so that same equation with different alphabet + # representations will look the same. + letter_order = OrderedDict((k, 0) for k in equation if k.isalpha()).keys() + mapping = {ord(x): 97 + i for i, x in enumerate(letter_order)} + equation = equation.translate(mapping) + + np_arrs = [np.zeros(s) for s in input_shapes] + optim = np.einsum_path(equation, *np_arrs, optimize="optimal")[1] + for line in optim.split("\n"): + if "optimized flop" in line.lower(): + flop = int(float(line.split(":")[-1])) + return flop, 0 + + raise NotImplementedError("Unsupported einops.einsum operation.") + + def _tensor_addmm_flops_compute(self, mat1, mat2, *, beta=1, alpha=1, out=None): """ Count flops for the tensor addmm operation. @@ -937,6 +963,10 @@ def _patch_tensor_methods(): torch.baddbmm = wrapFunc(torch.baddbmm, _tensor_addmm_flops_compute) +def _patch_miscellaneous_operations(): + einops.einsum = wrapFunc(einops.einsum, _einops_einsum_flops_compute) + + def _reload_functionals(): # torch.nn.functional does not support importlib.reload() F.linear = old_functions[F.linear.__str__] @@ -995,6 +1025,10 @@ def _reload_tensor_methods(): torch.baddbmm = old_functions[torch.baddbmm.__str__] +def _reload_miscellaneous_operations(): + einops.einsum = old_functions[einops.einsum.__str__] + + def _rnn_flops(flops, rnn_module, w_ih, w_hh, input_size): gates_size = w_ih.shape[0] # matrix matrix mult ih state and internal state From 08b907a226c64fbadace5dba71ed45bbe22bc0ef Mon Sep 17 00:00:00 2001 From: Logan Adams <114770087+loadams@users.noreply.github.com> Date: Mon, 9 Dec 2024 12:24:33 -0800 Subject: [PATCH 638/754] Pin pytest-subtests version for accelerate tests (#6842) --- .github/workflows/nv-accelerate-v100.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/nv-accelerate-v100.yml b/.github/workflows/nv-accelerate-v100.yml index 346055e2685f..56b1b1ab12d2 100644 --- a/.github/workflows/nv-accelerate-v100.yml +++ b/.github/workflows/nv-accelerate-v100.yml @@ -52,7 +52,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" + # force pytest-subtests version due to issues + pip install pytest-subtests==0.13.1 pip list pytest $PYTEST_OPTS --color=yes --durations=0 --verbose tests/deepspeed From 0c92c39dd0a870abffb61e3dc219f12539917c14 Mon Sep 17 00:00:00 2001 From: Raza Sikander Date: Tue, 10 Dec 2024 05:45:42 +0530 Subject: [PATCH 639/754] Inference UTs check for trition support from accelerator (#6782) Instead of checking if installed or not check for support. Skip if not supported. Co-authored-by: Logan Adams <114770087+loadams@users.noreply.github.com> --- .../unit/ops/transformer/inference/test_attention.py | 4 ++-- tests/unit/ops/transformer/inference/test_gelu.py | 4 ++-- .../ops/transformer/inference/test_layer_norm.py | 12 ++++++------ tests/unit/ops/transformer/inference/test_matmul.py | 4 ++-- .../ops/transformer/inference/test_residual_add.py | 4 ++-- tests/unit/ops/transformer/inference/test_softmax.py | 4 ++-- 6 files changed, 16 insertions(+), 16 deletions(-) diff --git a/tests/unit/ops/transformer/inference/test_attention.py b/tests/unit/ops/transformer/inference/test_attention.py index 0521245bcdf3..ecf681542ff6 100644 --- a/tests/unit/ops/transformer/inference/test_attention.py +++ b/tests/unit/ops/transformer/inference/test_attention.py @@ -27,8 +27,8 @@ def ref_torch_attention(q, k, v, mask, sm_scale): @pytest.mark.parametrize("causal", [True, False]) @pytest.mark.parametrize("use_flash", [True, False]) def test_attention(BATCH, H, N_CTX, D_HEAD, causal, use_flash, dtype=torch.float16): - if not deepspeed.HAS_TRITON: - pytest.skip("triton has to be installed for the test") + if not deepspeed.get_accelerator().is_triton_supported(): + pytest.skip("triton is not supported on this system") minus_inf = -65504.0 dev = deepspeed.accelerator.get_accelerator().device_name() diff --git a/tests/unit/ops/transformer/inference/test_gelu.py b/tests/unit/ops/transformer/inference/test_gelu.py index beb74d09ab30..5f820ef3b579 100644 --- a/tests/unit/ops/transformer/inference/test_gelu.py +++ b/tests/unit/ops/transformer/inference/test_gelu.py @@ -61,8 +61,8 @@ def test_gelu(batch, sequence, channels, dtype, use_triton_ops): activations_ds = torch.randn((batch, sequence, channels), dtype=dtype, device=device) activations_ref = activations_ds.clone().detach() - if not deepspeed.HAS_TRITON and use_triton_ops: - pytest.skip("triton has to be installed for the test") + if not deepspeed.get_accelerator().is_triton_supported(): + pytest.skip("triton is not supported on this system") ds_out = run_gelu_ds(activations_ds, use_triton_ops) ref_out = run_gelu_reference(activations_ref) assert (allclose(ds_out, ref_out)) diff --git a/tests/unit/ops/transformer/inference/test_layer_norm.py b/tests/unit/ops/transformer/inference/test_layer_norm.py index 2912807e9f43..7711daf0d887 100644 --- a/tests/unit/ops/transformer/inference/test_layer_norm.py +++ b/tests/unit/ops/transformer/inference/test_layer_norm.py @@ -45,8 +45,8 @@ def ds_triton_implementation(vals, gamma, beta, epsilon): @pytest.mark.parametrize("dtype", get_dtypes()) @pytest.mark.parametrize("use_triton_ops", [False, True]) def test_layer_norm(batch, seq_len, channels, dtype, use_triton_ops): - if not deepspeed.HAS_TRITON and use_triton_ops: - pytest.skip("triton has to be installed for the test") + if not deepspeed.get_accelerator().is_triton_supported(): + pytest.skip("triton is not supported on this system") vals = torch.randn((batch, seq_len, channels), dtype=dtype, device=get_accelerator().current_device_name()) gamma = torch.randn((channels), dtype=dtype, device=get_accelerator().current_device_name()) @@ -93,8 +93,8 @@ def residual_ds_triton_implementation(vals, bias, res, gamma, beta, epsilon): @pytest.mark.parametrize("dtype", get_dtypes()) @pytest.mark.parametrize("use_triton_ops", [False, True]) def test_layer_norm_residual(batch, seq_len, channels, dtype, use_triton_ops): - if not deepspeed.HAS_TRITON and use_triton_ops: - pytest.skip("triton has to be installed for the test") + if not deepspeed.get_accelerator().is_triton_supported(): + pytest.skip("triton is not supported on this system") vals = torch.randn((batch, seq_len, channels), dtype=dtype, device=get_accelerator().current_device_name()) residual = torch.randn((batch, seq_len, channels), dtype=dtype, device=get_accelerator().current_device_name()) @@ -163,8 +163,8 @@ def test_layer_norm_residual_store_pre_ln_res(batch, seq_len, channels, dtype): @pytest.mark.parametrize("residual", [True, False]) @pytest.mark.parametrize("input_bias", [True, False]) def test_triton_layer_norm(M, N, dtype, residual, input_bias, eps=1e-5, device='cuda'): - if not deepspeed.HAS_TRITON: - pytest.skip("triton has to be installed for the test") + if not deepspeed.get_accelerator().is_triton_supported(): + pytest.skip("triton is not supported on this system") dev = get_accelerator().device_name() torch.manual_seed(0) # create data diff --git a/tests/unit/ops/transformer/inference/test_matmul.py b/tests/unit/ops/transformer/inference/test_matmul.py index 804a85750a3a..559aa2c60afe 100644 --- a/tests/unit/ops/transformer/inference/test_matmul.py +++ b/tests/unit/ops/transformer/inference/test_matmul.py @@ -42,8 +42,8 @@ def run_matmul_ds(a, b, use_triton_ops=False): @pytest.mark.parametrize("dtype", [torch.float16]) @pytest.mark.parametrize("use_triton_ops", [True]) def test_matmul_4d(B, H, M, K, N, dtype, use_triton_ops): - if not deepspeed.HAS_TRITON and use_triton_ops: - pytest.skip("triton has to be installed for the test") + if not deepspeed.get_accelerator().is_triton_supported(): + pytest.skip("triton is not supported on this system") # skip autotune in testing from deepspeed.ops.transformer.inference.triton.matmul_ext import fp16_matmul diff --git a/tests/unit/ops/transformer/inference/test_residual_add.py b/tests/unit/ops/transformer/inference/test_residual_add.py index 807da4904341..cab64d1d0555 100644 --- a/tests/unit/ops/transformer/inference/test_residual_add.py +++ b/tests/unit/ops/transformer/inference/test_residual_add.py @@ -74,8 +74,8 @@ def run_residual_add_reference(hidden_state, residual, attn_output, attn_bias, f @pytest.mark.parametrize("use_triton_ops", [True, False]) def test_residual_add(batch, sequence, hidden_dim, dtype, mlp_after_attn, add_bias, mp_size, pre_attn_norm, use_triton_ops): - if not deepspeed.HAS_TRITON and use_triton_ops: - pytest.skip("triton has to be installed for the test") + if not deepspeed.get_accelerator().is_triton_supported(): + pytest.skip("triton is not supported on this system") ds_out = torch.randn((batch, sequence, hidden_dim), dtype=dtype, device=get_accelerator().device_name()) residual = torch.randn((batch, sequence, hidden_dim), dtype=dtype, device=get_accelerator().device_name()) attn_output = torch.randn((batch, sequence, hidden_dim), dtype=dtype, device=get_accelerator().device_name()) diff --git a/tests/unit/ops/transformer/inference/test_softmax.py b/tests/unit/ops/transformer/inference/test_softmax.py index 4f6d69160aa7..e582be1b926a 100644 --- a/tests/unit/ops/transformer/inference/test_softmax.py +++ b/tests/unit/ops/transformer/inference/test_softmax.py @@ -40,8 +40,8 @@ def run_softmax_ds(input, use_triton_ops=False): @pytest.mark.parametrize("dtype", [torch.float16, torch.float32]) @pytest.mark.parametrize("use_triton_ops", [True]) def test_softmax(batch, sequence, channels, dtype, use_triton_ops): - if not deepspeed.HAS_TRITON and use_triton_ops: - pytest.skip("triton has to be installed for the test") + if not deepspeed.get_accelerator().is_triton_supported(): + pytest.skip("triton is not supported on this system") device = deepspeed.accelerator.get_accelerator().device_name() input_ds = torch.randn((batch, sequence, channels), dtype=dtype, device=device) From 06f1d3609e46420cbcee606a64c60af1a6fae111 Mon Sep 17 00:00:00 2001 From: Logan Adams <114770087+loadams@users.noreply.github.com> Date: Mon, 9 Dec 2024 22:14:59 -0800 Subject: [PATCH 640/754] Unpin pytest-subtests now that 0.14.1 is released (#6844) The issue we encountered was covered here: https://github.com/pytest-dev/pytest-subtests/issues/173 And is resolved with the latest changes from this PR: https://github.com/pytest-dev/pytest-subtests/issues/174, and is published in the latest version 0.14.1. --- .github/workflows/nv-accelerate-v100.yml | 2 -- 1 file changed, 2 deletions(-) diff --git a/.github/workflows/nv-accelerate-v100.yml b/.github/workflows/nv-accelerate-v100.yml index 56b1b1ab12d2..0792e4e09cb2 100644 --- a/.github/workflows/nv-accelerate-v100.yml +++ b/.github/workflows/nv-accelerate-v100.yml @@ -52,7 +52,5 @@ jobs: pip install .[testing] # force protobuf version due to issues pip install "protobuf<4.21.0" - # force pytest-subtests version due to issues - pip install pytest-subtests==0.13.1 pip list pytest $PYTEST_OPTS --color=yes --durations=0 --verbose tests/deepspeed From 1b58ba5ec04493a112fae10d9cc9c824dfbd40ca Mon Sep 17 00:00:00 2001 From: xyxie Date: Wed, 11 Dec 2024 02:31:11 +0800 Subject: [PATCH 641/754] Merge LoCo with Zero++ (#6730) ### Integration of LoCo Method into ZeRO++ #### Overview This PR introduces the integration of the **LoCo** method, as outlined in [this paper](https://arxiv.org/abs/2407.04480), into the ZeRO++ framework of DeepSpeed. The key enhancement involves applying error feedback compensation to 4-bit gradients before communication. This approach ***improves pre-training loss outcomes without additional time overhead***, though it requires extra GPU memory. The extent of this memory increase depends on model size and training configuration. #### Experimental Results We conducted pre-training experiments using the Llama2 architecture, adjusting the number of layers and hidden size. The experiments included: - **A smaller-scale model with 0.8B parameters trained on 30B tokens**. - **A larger-scale model with 8B parameters trained on 5B tokens**. The training data was sampled from **Redpajama-V2**.

    **Findings**: - **Smaller Models (0.8B parameters)**: Significant gains were observed when applying the LoCo method. - **Larger Models (8B parameters)**: The gains were present but less pronounced. This could be due to: 1. Relatively smaller data volume. 2. Lower pre-training loss for larger models, making significant improvements harder to achieve. However, even a smaller pre-training loss gap in larger models can translate to meaningful gains in downstream tasks. #### Example Script For reference, the [run.sh](https://github.com/user-attachments/files/17679552/zeroplus-7b3.zip) script used for the 8B parameter, 5B tokens experiment is attached. The experiment was conducted using the **DeepSpeed-Megatron** platform. #### Acknowledgments Special thanks to cc @GuanhuaWang for ongoing communication and guidance throughout this work. --- We appreciate your consideration of this PR and welcome any feedback or questions! --------- Co-authored-by: ChuanxinTang Co-authored-by: root Co-authored-by: Logan Adams <114770087+loadams@users.noreply.github.com> Co-authored-by: Logan Adams Co-authored-by: Hongwei Chen <33092912+hwchen2017@users.noreply.github.com> --- csrc/includes/quantization.h | 30 ++ csrc/includes/quantization_utils.h | 1 + csrc/quantization/pt_binding.cpp | 106 +++++++ csrc/quantization/quant_reduce.cu | 294 ++++++++++++++++++ csrc/quantization/swizzled_quantize.cu | 231 ++++++++++++++ .../runtime/comm/coalesced_collectives.py | 79 ++++- deepspeed/runtime/engine.py | 7 +- deepspeed/runtime/zero/config.py | 13 +- deepspeed/runtime/zero/stage3.py | 32 +- .../comm/test_coalesced_collectives.py | 63 ++++ 10 files changed, 851 insertions(+), 5 deletions(-) diff --git a/csrc/includes/quantization.h b/csrc/includes/quantization.h index 45828832d8d2..5bdc96061a31 100644 --- a/csrc/includes/quantization.h +++ b/csrc/includes/quantization.h @@ -52,6 +52,36 @@ void launch_swizzled_quant(int8_t* q_data, int devices_per_node, cudaStream_t stream); +void launch_loco_swizzled_quant(int8_t* quantized_data, + float* quantized_scales, + const __half* uncompressed_data, + __half* error_feedback, + const float err_beta, + int num_bits, + quantize::Type quant_type, + int groups, + int elems_per_group, + int pipelining, + int nodes, + int devices_per_node, + cudaStream_t stream); + +void launch_loco_dequant_reduce(int8_t* reduced_data, + float* reduced_scales, + const int8_t* input_data, + const float* input_scales, + int num_gpus, + int num_bits, + quantize::Type quant_type, + int out_groups, + int elems_per_out_group, + int elems_per_in_tensor, + int groups_per_in_tensor, + int elems_per_in_group, + __half2* error_feedback, + const float err_beta, + cudaStream_t stream); + void launch_dequant_reduce(int8_t* reduced_data, float* reduced_scales, const int8_t* input_data, diff --git a/csrc/includes/quantization_utils.h b/csrc/includes/quantization_utils.h index 26db86ec1e0b..61630d0aae57 100644 --- a/csrc/includes/quantization_utils.h +++ b/csrc/includes/quantization_utils.h @@ -24,6 +24,7 @@ constexpr int max_threads = 1024; Class to hold the quantization parameters for a given tensor. Holds the implementation of the quantization operation. */ + template class Params { public: diff --git a/csrc/quantization/pt_binding.cpp b/csrc/quantization/pt_binding.cpp index e74c541699d7..b48eaacd0881 100644 --- a/csrc/quantization/pt_binding.cpp +++ b/csrc/quantization/pt_binding.cpp @@ -176,6 +176,53 @@ at::Tensor dequantize_int8_to_half_experimental(at::Tensor& data_in, return output; } +std::vector ds_loco_swizzle_quant(at::Tensor& input_vals, + at::Tensor& error_feedback, + float err_beta, + int groups, + int num_bits, + quantize::Type quant_type, + int pipeline_size, + int nodes, + int devices_per_node) +{ + auto scales_options = at::TensorOptions() + .dtype(at::kFloat) + .layout(at::kStrided) + .device(at::kCUDA) + .requires_grad(false); + const int scales_elems = (quantize::requires_offset(quant_type)) ? 2 : 1; + auto scales = torch::empty({groups, scales_elems}, scales_options); + + auto output_options = at::TensorOptions() + .dtype(at::kChar) + .layout(at::kStrided) + .device(at::kCUDA) + .requires_grad(false); + + const int quantization_scalar = 8 / num_bits; + const int compressed_vals = at::numel(input_vals) / quantization_scalar; + + auto output = torch::empty({compressed_vals}, output_options); + const int elems_per_group = at::numel(input_vals) / groups; + + launch_loco_swizzled_quant(reinterpret_cast(output.data_ptr()), + reinterpret_cast(scales.data_ptr()), + reinterpret_cast(input_vals.data_ptr()), + reinterpret_cast<__half*>(error_feedback.data_ptr()), + err_beta, + num_bits, + quant_type, + groups, + elems_per_group, + pipeline_size, + nodes, + devices_per_node, + at::cuda::getCurrentCUDAStream()); + + return {output, scales}; +} + std::vector ds_swizzle_quant(at::Tensor& input_vals, int groups, int num_bits, @@ -265,6 +312,61 @@ std::vector quantized_reduction(at::Tensor& input_vals, return {output, scales}; } +std::vector loco_quantized_reduction(at::Tensor& input_vals, + at::Tensor& input_scales, + at::Tensor& error_feedback, + float err_beta, + int in_groups, + int out_groups, + int num_bits, + quantize::Type quant_type, + int devices_per_node) +{ + auto scales_options = at::TensorOptions() + .dtype(at::kFloat) + .layout(at::kStrided) + .device(at::kCUDA) + .requires_grad(false); + + const int scales_elems = (quantize::requires_offset(quant_type)) ? 2 : 1; + + auto scales = torch::empty({out_groups, scales_elems}, scales_options); + + auto output_options = at::TensorOptions() + .dtype(at::kChar) + .layout(at::kStrided) + .device(at::kCUDA) + .requires_grad(false); + + std::vector sz(input_vals.sizes().begin(), input_vals.sizes().end()); + sz[sz.size() - 1] = sz.back() / devices_per_node; + + const int elems_per_in_tensor = at::numel(input_vals) / devices_per_node; + + auto output = torch::empty(sz, output_options); + + const int elems_per_in_group = elems_per_in_tensor / (in_groups / devices_per_node); + const int elems_per_out_group = elems_per_in_tensor / out_groups; + + launch_loco_dequant_reduce((int8_t*)output.data_ptr(), + (float*)scales.data_ptr(), + (const int8_t*)input_vals.data_ptr(), + (const float*)input_scales.data_ptr(), + devices_per_node, + num_bits, + quant_type, + out_groups, + elems_per_out_group, + elems_per_in_tensor, + in_groups / devices_per_node, + elems_per_in_group, + (__half2*)error_feedback.data_ptr(), + err_beta, + at::cuda::getCurrentCUDAStream()); + + return {output, scales}; +} + PYBIND11_MODULE(TORCH_EXTENSION_NAME, m) { m.def("ds_quantize_fp32", &ds_quantize, "DeepSpeed Quantize with fp32 (CUDA)"); @@ -295,4 +397,8 @@ PYBIND11_MODULE(TORCH_EXTENSION_NAME, m) "Dequantize int8 to half (experimental)"); m.def("swizzle_quant", &ds_swizzle_quant); m.def("quantized_reduction", &quantized_reduction); + m.def("loco_swizzle_quant", &ds_loco_swizzle_quant, "LoCo Swizzled Quantization Kernel"); + m.def("loco_quantized_reduction", + &loco_quantized_reduction, + "LoCo Quantization and Reduction Kernel"); } diff --git a/csrc/quantization/quant_reduce.cu b/csrc/quantization/quant_reduce.cu index 26db1118c831..4100c5174b80 100644 --- a/csrc/quantization/quant_reduce.cu +++ b/csrc/quantization/quant_reduce.cu @@ -261,3 +261,297 @@ void launch_dequant_reduce(int8_t* reduced_data, } } } + +/* +Modified loco_dequant_reduce function that performs dequantization and reduction, +and incorporates error-feedback by updating the error_feedback tensor in-place. +*/ + +template +__global__ void __launch_bounds__(1024) loco_dequant_reduce(int8_t* reduced_data, + float* reduced_scales, + const int8_t* input_data, + const float* input_scales, + int elems_per_out_group, + int elems_per_in_tensor, + int groups_per_in_tensor, + int elems_per_in_group, + int num_tensors, + __half2* error_feedback, + const float err_beta) +{ + cg::thread_block tb = cg::this_thread_block(); + cg::thread_block_tile warp = cg::tiled_partition(tb); + + constexpr int mem_granularity = (numBits == 8) ? 8 : 4; + constexpr int elems_per_load = mem_granularity / sizeof(int8_t); + constexpr int storage_values = 16 / sizeof(__half2); + + const int block_offset = tb.group_index().x * elems_per_out_group; + const int elem_offset = tb.thread_index().x * elems_per_load; + const int base_offset = block_offset + elem_offset; + const int stride = tb.group_dim().x * elems_per_load; + + constexpr int scaling_factor = elems_per_load / storage_values; + const int block_offset_err = block_offset / scaling_factor; + const int elem_offset_err = tb.thread_index().x * storage_values; + const int base_offset_err = block_offset_err + elem_offset_err; + const int stride_err = tb.group_dim().x * storage_values; + + __half2 local_buffer[totalChunks * storage_values]; + __half2 err_buffer[totalChunks * storage_values]; + + quantize::GroupStats stats; + +#pragma unroll + for (int i = 0; i < totalChunks; i++) { + __half2* iteration_buffer = local_buffer + i * storage_values; + __half2* iter_err_buffer = err_buffer + i * storage_values; + +#pragma unroll + for (int j = 0; j < storage_values; j++) { + iteration_buffer[j] = reduce::init(); + } + + const int iter_offset = i * stride + base_offset; + const int iter_offset_err = i * stride_err + base_offset_err; + const int iter_scale_idx = iter_offset / elems_per_in_group; + bool do_loads = i * stride + elem_offset < elems_per_out_group; + + if (numTensors > 0) { +#pragma unroll + for (int j = 0; j < numTensors; j++) { + if (do_loads) { + int8_t load_buffer[elems_per_load]; + + mem_access::load_global( + load_buffer, input_data + j * elems_per_in_tensor + iter_offset); + + quantize::Params params( + input_scales + j * groups_per_in_tensor, iter_scale_idx); + + __half2 dequant_buffer[storage_values]; + dequantize::chunk(dequant_buffer, load_buffer, params); + +#pragma unroll + for (int k = 0; k < storage_values; k++) { + iteration_buffer[k] = + reduce::element(iteration_buffer[k], dequant_buffer[k]); + } + } + } + } else { +#pragma unroll 4 + for (int j = 0; j < num_tensors; j++) { + if (do_loads) { + int8_t load_buffer[elems_per_load]; + + mem_access::load_global( + load_buffer, input_data + j * elems_per_in_tensor + iter_offset); + + quantize::Params params( + input_scales + j * groups_per_in_tensor, iter_scale_idx); + + __half2 dequant_buffer[storage_values]; + dequantize::chunk(dequant_buffer, load_buffer, params); + +#pragma unroll + for (int k = 0; k < storage_values; k++) { + iteration_buffer[k] = + reduce::element(iteration_buffer[k], dequant_buffer[k]); + } + } + } + } + mem_access::load_global( + iter_err_buffer, error_feedback + iter_offset_err, do_loads); +#pragma unroll + for (int k = 0; k < storage_values; k++) { + iteration_buffer[k] = __hadd2(iteration_buffer[k], iter_err_buffer[k]); + stats.update(iteration_buffer[k]); + } + } + + auto params = stats.template get_params(tb, warp); + + // Initialize dequantization parameters based on params + auto de_params = params; + de_params.scale = 1.0f / params.scale; + if constexpr (quantType == quantize::Type::Asymmetric) { de_params.offset = params.offset; } + + if (tb.thread_index().x == 0) { params.store(reduced_scales, tb.group_index().x); } + +#pragma unroll + for (int i = 0; i < totalChunks; i++) { + const int iter_offset = i * stride + base_offset; + const int iter_offset_err = i * stride_err + base_offset_err; + __half2* iteration_buffer = local_buffer + i * storage_values; + __half2* iter_err_buffer = err_buffer + i * storage_values; + + if (i * stride + elem_offset < elems_per_out_group) { + // ----------- Begin Error-Feedback Modification ----------- + int8_t local_output[elems_per_load]; + quantize::_chunk(local_output, iteration_buffer, params); + mem_access::store_global(reduced_data + iter_offset, local_output); + + // Dequantize the quantized output to compute the dequantized value + __half2 dequant_buffer[storage_values]; + dequantize::chunk(dequant_buffer, local_output, de_params); + +#pragma unroll + for (int k = 0; k < storage_values; k++) { + // __half2 to float2 + float2 iter_buf_f = __half22float2(iteration_buffer[k]); + float2 dequant_buf_f = __half22float2(dequant_buffer[k]); + + // Update within float precision + float2 new_error_f; + new_error_f.x = iter_buf_f.x - dequant_buf_f.x; + new_error_f.y = iter_buf_f.y - dequant_buf_f.y; + + float2 iter_err_buf_f = __half22float2(iter_err_buffer[k]); + + iter_err_buf_f.x = err_beta * iter_err_buf_f.x + (1.0f - err_beta) * new_error_f.x; + iter_err_buf_f.y = err_beta * iter_err_buf_f.y + (1.0f - err_beta) * new_error_f.y; + + // float2 back to __half2 + iter_err_buffer[k] = __float22half2_rn(iter_err_buf_f); + } + mem_access::store_global(error_feedback + iter_offset_err, + iter_err_buffer); + } + } +} + +#define LAUNCH_LOCO_DEQUANT_REDUCE(num_chunks) \ + loco_dequant_reduce \ + <<>>(reduced_data, \ + reduced_scales, \ + input_data, \ + input_scales, \ + elems_per_out_group, \ + elems_per_in_tensor, \ + groups_per_in_tensor, \ + elems_per_in_group, \ + num_tensors, \ + error_feedback, \ + err_beta); + +template +void launch_loco_dequant_reduce_impl(int8_t* reduced_data, + float* reduced_scales, + const int8_t* input_data, + const float* input_scales, + int out_groups, + int elems_per_out_group, + int elems_per_in_tensor, + int groups_per_in_tensor, + int elems_per_in_group, + int num_tensors, + __half2* error_feedback, + const float err_beta, + cudaStream_t stream) +{ + constexpr int elems_per_thread = numBits; + const int one_step_threads = + next_pow2((elems_per_out_group + elems_per_thread - 1) / (elems_per_thread)); + const int threads = (one_step_threads < 1024) ? one_step_threads : 1024; + + dim3 block(threads); + dim3 grid(out_groups); + + const int elems_per_step = threads * elems_per_thread; + const int unroll_raw = (elems_per_out_group + elems_per_step - 1) / elems_per_step; + + const int unroll = (unroll_raw >= 4) ? pow2_round<1>(unroll_raw) : unroll_raw; + + if (unroll == 1) { + LAUNCH_LOCO_DEQUANT_REDUCE(1); + } else if (unroll == 2) { + LAUNCH_LOCO_DEQUANT_REDUCE(2); + } else if (unroll == 3) { + LAUNCH_LOCO_DEQUANT_REDUCE(3); + } else if (unroll == 4) { + LAUNCH_LOCO_DEQUANT_REDUCE(4); + } else if (unroll == 6) { + LAUNCH_LOCO_DEQUANT_REDUCE(6); + } else if (unroll == 8) { + LAUNCH_LOCO_DEQUANT_REDUCE(8); + } else if (unroll == 10) { + LAUNCH_LOCO_DEQUANT_REDUCE(10); + } else if (unroll == 12) { + LAUNCH_LOCO_DEQUANT_REDUCE(12); + } else { + assert(false); + } +} + +#define LAUNCH_LOCO_DEQUANT_REDUCE_IMPL(NUM_BITS, NUM_GPUS, QUANT_TYPE) \ + launch_loco_dequant_reduce_impl(reduced_data, \ + reduced_scales, \ + input_data, \ + input_scales, \ + out_groups, \ + elems_per_out_group, \ + elems_per_in_tensor, \ + groups_per_in_tensor, \ + elems_per_in_group, \ + num_gpus, \ + error_feedback, \ + err_beta, \ + stream); + +void launch_loco_dequant_reduce(int8_t* reduced_data, + float* reduced_scales, + const int8_t* input_data, + const float* input_scales, + int num_gpus, + int num_bits, + quantize::Type quant_type, + int out_groups, + int elems_per_out_group, + int elems_per_in_tensor, + int groups_per_in_tensor, + int elems_per_in_group, + __half2* error_feedback, + const float err_beta, + cudaStream_t stream) +{ + if (quant_type == quantize::Type::Symmetric) { + if (num_bits == 4) { + if (num_gpus == 8) { + LAUNCH_LOCO_DEQUANT_REDUCE_IMPL(4, 8, quantize::Type::Symmetric); + } else if (num_gpus == 16) { + LAUNCH_LOCO_DEQUANT_REDUCE_IMPL(4, 16, quantize::Type::Symmetric); + } else { + LAUNCH_LOCO_DEQUANT_REDUCE_IMPL(4, -1, quantize::Type::Symmetric); + } + } else if (num_bits == 8) { + if (num_gpus == 8) { + LAUNCH_LOCO_DEQUANT_REDUCE_IMPL(8, 8, quantize::Type::Symmetric); + } else if (num_gpus == 16) { + LAUNCH_LOCO_DEQUANT_REDUCE_IMPL(8, 16, quantize::Type::Symmetric); + } else { + LAUNCH_LOCO_DEQUANT_REDUCE_IMPL(8, -1, quantize::Type::Symmetric); + } + } + } else if (quant_type == quantize::Type::Asymmetric) { + if (num_bits == 4) { + if (num_gpus == 8) { + LAUNCH_LOCO_DEQUANT_REDUCE_IMPL(4, 8, quantize::Type::Asymmetric); + } else if (num_gpus == 16) { + LAUNCH_LOCO_DEQUANT_REDUCE_IMPL(4, 16, quantize::Type::Asymmetric); + } else { + LAUNCH_LOCO_DEQUANT_REDUCE_IMPL(4, -1, quantize::Type::Asymmetric); + } + } else if (num_bits == 8) { + if (num_gpus == 8) { + LAUNCH_LOCO_DEQUANT_REDUCE_IMPL(8, 8, quantize::Type::Asymmetric); + } else if (num_gpus == 16) { + LAUNCH_LOCO_DEQUANT_REDUCE_IMPL(8, 16, quantize::Type::Asymmetric); + } else { + LAUNCH_LOCO_DEQUANT_REDUCE_IMPL(8, -1, quantize::Type::Asymmetric); + } + } + } +} diff --git a/csrc/quantization/swizzled_quantize.cu b/csrc/quantization/swizzled_quantize.cu index 5a02a0ae8120..a4b6096c81af 100644 --- a/csrc/quantization/swizzled_quantize.cu +++ b/csrc/quantization/swizzled_quantize.cu @@ -3,6 +3,7 @@ // DeepSpeed Team +#include "dequantization_utils.h" #include "memory_access_utils.h" #include "quantization_utils.h" #include "reduction_utils.h" @@ -194,3 +195,233 @@ void launch_swizzled_quant(int8_t* q_data, } } } + +template +__global__ void loco_swizzled_quant_kernel(int8_t* quantized_data, + float* quantized_scales, + const __half* uncompressed_data, + __half* error_feedback, + const float err_beta, + int groups, + int elems_per_group, + int pipelining, + int nodes, + int devices_per_node) +{ + cg::thread_block tb = cg::this_thread_block(); + cg::thread_block_tile warp = cg::tiled_partition(tb); + + // Indexing offsets, same as normal quantization for in-case + const int block_rank_data = + blockIdx.x + blockIdx.y * gridDim.x + blockIdx.z * gridDim.x * gridDim.y; + const int block_offset_data = block_rank_data * elems_per_group; + const int elem_offset = tb.thread_index().x * quantize::h_per_load; + const int base_offset_data = block_offset_data + elem_offset; + const int stride = tb.size() * quantize::h_per_load; + const __half* uncompressed_data_base = uncompressed_data + base_offset_data; + + const int partition_id = blockIdx.z; + const int partition_offset = partition_id / devices_per_node; + const int partition_base = (partition_id % devices_per_node) * nodes; + const int pipelining_offset = blockIdx.y * (devices_per_node * nodes); + const int output_partition = (pipelining_offset + partition_base + partition_offset); + const int block_rank_err = output_partition * gridDim.x + blockIdx.x; + + const int block_offset_err = block_rank_err * elems_per_group; + const int base_offset_err = block_offset_err + elem_offset; + __half* error_feedback_base = error_feedback + base_offset_err; + + __half2 local_buffer[totalChunks * quantize::h2_per_load]; + __half2 err_buffer[totalChunks * quantize::h2_per_load]; + + quantize::GroupStats stats; + +#pragma unroll + for (int i = 0; i < totalChunks; i++) { + __half2* iteration_buffer = local_buffer + i * quantize::h2_per_load; + __half2* iter_err_buffer = err_buffer + i * quantize::h2_per_load; + const int i_stride = i * stride; + bool do_loads = (elem_offset + i_stride) < elems_per_group; + + mem_access::load_global( + iteration_buffer, uncompressed_data_base + i_stride, do_loads); + + mem_access::load_global( + iter_err_buffer, error_feedback_base + i_stride, do_loads); + +#pragma unroll + for (int j = 0; j < quantize::h2_per_load; j++) { + iteration_buffer[j] = __hadd2(iteration_buffer[j], iter_err_buffer[j]); + stats.update(iteration_buffer[j]); + } + } + + auto params = stats.template get_params(tb, warp); + + // Initialize dequantization parameters based on params + auto de_params = params; + de_params.scale = 1.0f / params.scale; + if constexpr (quantType == quantize::Type::Asymmetric) { de_params.offset = params.offset; } + + if (threadIdx.x == 0) { params.store(quantized_scales, block_rank_err); } + + constexpr int out_scalar_effect = 8 / numBits; + const int out_block_offset = block_rank_err * elems_per_group / out_scalar_effect; + const int out_base_offset = out_block_offset + elem_offset / out_scalar_effect; + int8_t* out_base = quantized_data + out_base_offset; + + const int out_stride = stride / out_scalar_effect; + constexpr int num_int8_out = quantize::h_per_load / out_scalar_effect; + +#pragma unroll + for (int i = 0; i < totalChunks; i++) { + const int i_stride = i * stride; + __half2* iteration_buffer = local_buffer + i * quantize::h2_per_load; + __half2* iter_err_buffer = err_buffer + i * quantize::h2_per_load; + + if (i_stride + elem_offset < elems_per_group) { + int8_t local_output[quantize::h_per_load / out_scalar_effect]; + quantize::_chunk(local_output, iteration_buffer, params); + mem_access::store_global(out_base + i * out_stride, local_output); + + // Dequantize the quantized output to compute the dequantized value + __half2 dequant_buffer[quantize::h2_per_load]; + dequantize::chunk(dequant_buffer, local_output, de_params); + +// Compute new error: sum - dequant_buffer +#pragma unroll + for (int k = 0; k < quantize::h2_per_load; k++) { + // __half2 to float2 + float2 iter_buf_f = __half22float2(iteration_buffer[k]); + float2 dequant_buf_f = __half22float2(dequant_buffer[k]); + + // Update within float precision + float2 new_error_f; + new_error_f.x = iter_buf_f.x - dequant_buf_f.x; + new_error_f.y = iter_buf_f.y - dequant_buf_f.y; + + float2 iter_err_buf_f = __half22float2(iter_err_buffer[k]); + + iter_err_buf_f.x = err_beta * iter_err_buf_f.x + (1.0f - err_beta) * new_error_f.x; + iter_err_buf_f.y = err_beta * iter_err_buf_f.y + (1.0f - err_beta) * new_error_f.y; + + // float2 back to __half2 + iter_err_buffer[k] = __float22half2_rn(iter_err_buf_f); + } + __half2* error_feedback_base_h2 = reinterpret_cast<__half2*>(error_feedback_base); + mem_access::store_global(error_feedback_base_h2 + i_stride / 2, + iter_err_buffer); + } + } +} + +#define LAUNCH_LOCO_SWIZZLE_QUANT(total_chunks, threads) \ + loco_swizzled_quant_kernel \ + <<>>(output_data, \ + params, \ + input_data, \ + error_feedback, \ + err_beta, \ + groups, \ + elems_per_group, \ + pipelining, \ + nodes, \ + devices_per_node); + +template +void launch_loco_swizzled_quant_impl(int8_t* output_data, + float* params, + const __half* input_data, + __half* error_feedback, + const float err_beta, + int groups, + int elems_per_group, + int pipelining, + int nodes, + int devices_per_node, + cudaStream_t stream) +{ + const int one_step_threads = + next_pow2((elems_per_group + swiz_quant::h_per_step - 1) / swiz_quant::h_per_step); + const int max_threads = (one_step_threads < swiz_quant::max_threads) ? one_step_threads + : swiz_quant::max_threads; + const int threads = (max_threads < swiz_quant::min_threads) ? swiz_quant::min_threads + : max_threads; + + dim3 block(threads); + const int groups_per_partition = groups / (nodes * devices_per_node); + assert(groups_per_partition % pipelining == 0); + const int contiguous_groups = groups_per_partition / pipelining; + const int partitions = nodes * devices_per_node; + dim3 grid(contiguous_groups, pipelining, partitions); + + const int elems_per_step = threads * swiz_quant::h_per_step; + const int external_unroll = ((elems_per_group + elems_per_step - 1) / elems_per_step); + const int total_unroll = external_unroll * swiz_quant::step_granularity; + + assert(total_unroll % 2 == 0); + + if (threads == 32) { + LAUNCH_LOCO_SWIZZLE_QUANT(2, 32); + } else if (threads == 64) { + LAUNCH_LOCO_SWIZZLE_QUANT(2, 64); + } else if (threads == 128) { + LAUNCH_LOCO_SWIZZLE_QUANT(2, 128); + } else if (threads == 256) { + LAUNCH_LOCO_SWIZZLE_QUANT(2, 256); + } else if (threads == 512) { + if (total_unroll == 2) { + LAUNCH_LOCO_SWIZZLE_QUANT(2, 512); + } else if (total_unroll == 4) { + LAUNCH_LOCO_SWIZZLE_QUANT(4, 512); + } else if (total_unroll == 6) { + LAUNCH_LOCO_SWIZZLE_QUANT(6, 512); + } else if (total_unroll == 8) { + LAUNCH_LOCO_SWIZZLE_QUANT(8, 512); + } else if (total_unroll == 10) { + LAUNCH_LOCO_SWIZZLE_QUANT(10, 512); + } + } +} + +#define DISPATCH_LOCO_SWIZZLE_QUANT(num_bits, qtype) \ + launch_loco_swizzled_quant_impl(output_data, \ + params, \ + input_data, \ + error_feedback, \ + err_beta, \ + groups, \ + elems_per_group, \ + pipelining, \ + nodes, \ + devices_per_node, \ + stream); + +void launch_loco_swizzled_quant(int8_t* output_data, + float* params, + const __half* input_data, + __half* error_feedback, + const float err_beta, + int num_bits, + quantize::Type q_type, + int groups, + int elems_per_group, + int pipelining, + int nodes, + int devices_per_node, + cudaStream_t stream) +{ + if (num_bits == 4) { + if (q_type == quantize::Type::Asymmetric) { + DISPATCH_LOCO_SWIZZLE_QUANT(4, quantize::Type::Asymmetric); + } else if (q_type == quantize::Type::Symmetric) { + DISPATCH_LOCO_SWIZZLE_QUANT(4, quantize::Type::Symmetric); + } + } else if (num_bits == 8) { + if (q_type == quantize::Type::Asymmetric) { + DISPATCH_LOCO_SWIZZLE_QUANT(8, quantize::Type::Asymmetric); + } else if (q_type == quantize::Type::Symmetric) { + DISPATCH_LOCO_SWIZZLE_QUANT(8, quantize::Type::Symmetric); + } + } +} diff --git a/deepspeed/runtime/comm/coalesced_collectives.py b/deepspeed/runtime/comm/coalesced_collectives.py index 543795126fab..c2fa907d7dbb 100644 --- a/deepspeed/runtime/comm/coalesced_collectives.py +++ b/deepspeed/runtime/comm/coalesced_collectives.py @@ -8,7 +8,7 @@ """ import math -from typing import List +from typing import List, Any import torch from torch import Tensor from deepspeed import comm as dist @@ -76,6 +76,83 @@ def all_to_all_quant_reduce(tensors: List[Tensor], groups: {}) -> List[Tensor]: return output_lst +@instrument_w_nvtx +@torch.no_grad() +def all_to_all_loco_quant_reduce( + params: List[Tensor], + groups: {}, + loco_param: Any = None, +) -> List[Tensor]: + global quantizer_module + global loco_idx + if quantizer_module is None: + quantizer_module = op_builder.QuantizerBuilder().load() + local_world_size = get_accelerator().device_count() + global_world_size = dist.get_world_size() + num_nodes = global_world_size // local_world_size + this_rank = dist.get_rank() + intra_idx = int(this_rank / local_world_size) + inter_idx = this_rank % local_world_size + output_lst: List[Tensor] = [None] * len(params) + for idx, p in enumerate(params): + tensor = p.grad + if tensor.dim() == 1: + output_lst[idx] = reduce_scatter_coalesced([tensor])[0] + elif tensor.numel() % (2 * global_world_size) != 0: + # Due to the constraint of 2-stage all-to-all, the input tensor must be divisible by 2 * global_world_size + # Otherwise, all-to-all cannot be performed because of shape mismatch. + # See more at https://github.com/microsoft/DeepSpeed/pull/5056 + logger.warning( + f"qgZ falls back to reduce_scatter because tensor size = {tensor.numel()} is not divisible by (2 * global_world_size) = {2 * global_world_size}. Please consider allocating a new world to enable qgZ" + ) + output_lst[idx] = reduce_scatter_coalesced([tensor])[0] + else: + err_beta = loco_param['err_beta'] + reset_T = loco_param['reset_T'] + if not hasattr(p, 'intra_ef_buf') or loco_idx > reset_T: + loco_idx = 0 + intra_err = torch.zeros_like(p.grad) + inter_err = torch.zeros(tensor.numel() // local_world_size, device=tensor.device, dtype=tensor.dtype) + else: + intra_err = quantizer_module.dequantize(p.intra_ef_buf[0], p.intra_ef_buf[1], + p.intra_ef_buf[1].numel(), 8, quantizer_module.Symmetric) + inter_err = quantizer_module.dequantize(p.inter_ef_buf[0], p.inter_ef_buf[1], + p.inter_ef_buf[1].numel(), 8, quantizer_module.Symmetric) + + intra_quant_group = max(tensor.shape[0], tensor.shape[1], global_world_size) + inter_quant_group = intra_quant_group // local_world_size + intra_quant_int4, intra_q_scales = quantizer_module.loco_swizzle_quant(tensor, intra_err, err_beta, + intra_quant_group, 4, + quantizer_module.Symmetric, 1, + num_nodes, local_world_size) + local_output = torch.empty_like(intra_quant_int4) + scale_output = torch.empty_like(intra_q_scales) + all_to_all_single(local_output, intra_quant_int4, group=groups[f'local_{intra_idx}']) + all_to_all_single(scale_output, intra_q_scales, group=groups[f'local_{intra_idx}']) + + p.intra_ef_buf = quantizer_module.quantize(intra_err, intra_quant_group, 8, quantizer_module.Symmetric) + + global_input_tensor, global_scales = quantizer_module.loco_quantized_reduction( + local_output, scale_output, inter_err, err_beta, intra_quant_group, inter_quant_group, 4, + quantizer_module.Symmetric, local_world_size) + + global_output = torch.empty_like(global_input_tensor) + global_scale_output = torch.empty_like(global_scales) + all_to_all_single(global_output, global_input_tensor, group=groups[f'global_{inter_idx}']) + all_to_all_single(global_scale_output, global_scales, group=groups[f'global_{inter_idx}']) + + p.inter_ef_buf = quantizer_module.quantize(inter_err, inter_quant_group, 8, quantizer_module.Symmetric) + + final_output = quantizer_module.dequantize(global_output, global_scale_output, global_scale_output.numel(), + 4, quantizer_module.Symmetric) + assert final_output.numel( + ) % num_nodes == 0, f"final_output.numel()={final_output.numel()} is not divisible by num_nodes={num_nodes}" + output_lst[idx] = (sum(list(final_output.chunk(num_nodes))) / num_nodes).view(-1) + loco_idx += 1 + + return output_lst + + @instrument_w_nvtx @torch.no_grad() def reduce_scatter_coalesced( diff --git a/deepspeed/runtime/engine.py b/deepspeed/runtime/engine.py index 8c5da36e5a78..0aad018528d3 100755 --- a/deepspeed/runtime/engine.py +++ b/deepspeed/runtime/engine.py @@ -912,6 +912,9 @@ def zero_quantized_nontrainable_weights(self): def zero_quantized_gradients(self): return self._config.zero_config.zero_quantized_gradients + def zeropp_loco_param(self): + return self._config.zero_config.zeropp_loco_param + def dump_state(self): return self._config.dump_state @@ -1191,7 +1194,8 @@ def _configure_distributed_model(self, model): # Query the groups module to get information about various parallel groups self.local_all_to_all_group = None if self.zero_quantized_gradients(): - log_dist("Using quantized gradients", ranks=[0]) + message = "Using LoCo quantized gradients" if self.zeropp_loco_param() else "Using quantized gradients" + log_dist(message, ranks=[0]) self.local_all_to_all_group = groups._get_local_all_to_all_group() self.data_parallel_group = groups._get_data_parallel_group() self.dp_world_size = groups._get_data_parallel_world_size() @@ -1667,6 +1671,7 @@ def _configure_zero_optimizer(self, optimizer): zero_quantized_weights=self.zero_quantized_weights(), zero_quantized_nontrainable_weights=self.zero_quantized_nontrainable_weights(), zero_module_granularity_threshold=self.zero_module_granularity_threshold(), + zeropp_loco_param=self.zeropp_loco_param(), ) else: diff --git a/deepspeed/runtime/zero/config.py b/deepspeed/runtime/zero/config.py index 19b272ce9e92..cbc6a15c2057 100644 --- a/deepspeed/runtime/zero/config.py +++ b/deepspeed/runtime/zero/config.py @@ -4,7 +4,7 @@ # DeepSpeed Team import sys -from typing import Optional +from typing import Optional, Dict, Any from enum import Enum from pydantic import Field, model_validator from deepspeed.runtime.config_utils import get_scalar_param, pp_int, DeepSpeedConfigModel @@ -44,6 +44,7 @@ "zero_quantized_gradients": [true|false], "memory_efficient_linear": [true|false], "override_module_apply": [true|false], + "zeropp_loco_param": {...}, } } """ @@ -310,6 +311,16 @@ class DeepSpeedZeroConfig(DeepSpeedConfigModel): Boolean indicating whether to use quantized zero gradients for efficient all_2_all_reduce comm """ + zeropp_loco_param: Optional[Dict[str, Any]] = None + """ + This dictionary contains parameters for using LoCo-Zero++, with two key parameters: + - `err_beta`: A coefficient for the moving average of quantization errors before and after gradient computation. + It ranges between 0 and 1, with a default value of 0.8. + - `reset_T`: The number of steps after which the moving-average error buffer is cleared. The default value is 1024. + These parameters can be adjusted based on performance needs. Example configuration in ds config: + "zeropp_loco_param": { "err_beta": 0.8, "reset_T": 1024 }. + See LoCo paper for more details: (https://arxiv.org/abs/2407.04480). + """ mics_shard_size: int = Field(-1, json_schema_extra={"new_param": "mics_shard_size"}) diff --git a/deepspeed/runtime/zero/stage3.py b/deepspeed/runtime/zero/stage3.py index 99a5ecf41a2f..459cffce52c8 100644 --- a/deepspeed/runtime/zero/stage3.py +++ b/deepspeed/runtime/zero/stage3.py @@ -17,7 +17,7 @@ from deepspeed.runtime.base_optimizer import ZeROOptimizer from deepspeed.utils import logger from deepspeed.runtime.fp16.loss_scaler import CreateLossScaler -from deepspeed.runtime.comm.coalesced_collectives import reduce_scatter_coalesced, all_to_all_quant_reduce +from deepspeed.runtime.comm.coalesced_collectives import reduce_scatter_coalesced, all_to_all_quant_reduce, all_to_all_loco_quant_reduce from deepspeed.runtime.utils import inf, is_model_parallel_parameter, get_only_unique_item from deepspeed.runtime.zero.partition_parameters import * from deepspeed.runtime.zero.config import ZeroStageEnum @@ -158,6 +158,7 @@ def __init__( zero_quantized_weights=False, zero_quantized_nontrainable_weights=False, zero_module_granularity_threshold=0, + zeropp_loco_param=None, ): see_memory_usage("Stage 3 initialize beginning", force=True) @@ -284,6 +285,8 @@ def __init__( self.partition_count = dist.get_world_size(group=self.dp_process_group) + self.zeropp_loco_param = zeropp_loco_param + if mpu is None: self.model_parallel_group = None self.model_parallel_rank = 0 @@ -1383,7 +1386,10 @@ def __avg_scatter_grads(self, params_to_reduce: List[Parameter]) -> List[Tensor] global_world_size = dist.get_world_size() num_nodes = global_world_size // local_world_size if self.all2all_process_group is not None and num_nodes > 1: - grad_partitions_for_rank = all_to_all_quant_reduce(full_grads_for_rank, self.all2all_process_group) + grad_partitions_for_rank = (all_to_all_loco_quant_reduce(params_to_reduce, self.all2all_process_group, + self.zeropp_loco_param) + if self.zeropp_loco_param is not None else all_to_all_quant_reduce( + full_grads_for_rank, self.all2all_process_group)) else: grad_partitions_for_rank = reduce_scatter_coalesced(full_grads_for_rank, self.dp_process_group) @@ -2009,6 +2015,25 @@ def _overflow_clean_up(self, prev_scale): see_memory_usage('After overflow after clearing gradients', force=False) + def _loco_err_buf_update(self, overflow: bool, scale=1.0): + """ + Loco Error Buffer update. + """ + if not overflow and scale == 1.0: return + if dist.get_rank() == 0: + logger.info(f"update loco-zero++ error buffer with overflow: {overflow}") + # FP32 grad should never exist. + # For speed, set model fp16 grad to None by default + for group in self.fp16_groups: + for p in group: + if hasattr(p, 'intra_ef_buf'): + if overflow: + del p.intra_ef_buf + del p.inter_ef_buf + else: + p.intra_ef_buf[1] *= scale + p.inter_ef_buf[1] *= scale + @instrument_w_nvtx def _overflow_check_and_loss_scale_update(self): @@ -2023,6 +2048,9 @@ def _overflow_check_and_loss_scale_update(self): if self.overflow: self._overflow_clean_up(prev_scale) + #update loco error buf + self._loco_err_buf_update(self.overflow, self.loss_scale / prev_scale) + return self.overflow @instrument_w_nvtx diff --git a/tests/unit/runtime/comm/test_coalesced_collectives.py b/tests/unit/runtime/comm/test_coalesced_collectives.py index 17b2ffbb9d29..2d5db192f2ca 100644 --- a/tests/unit/runtime/comm/test_coalesced_collectives.py +++ b/tests/unit/runtime/comm/test_coalesced_collectives.py @@ -96,3 +96,66 @@ def test_non_divisible(self): elif dist.get_rank() == 1: assert output.shape == (24, ) assert torch.allclose(output, torch.zeros_like(output)) + + +class TestLocoQuantized(DistributedTest): + + world_size = 1 + + @pytest.mark.parametrize("num_bits", [4, 8]) + @pytest.mark.parametrize("tensor_size", [(16, 16), (64, 64)]) + @pytest.mark.parametrize("devices_per_node", [4, 8]) + def test_loco_quantized_reduction(self, num_bits, tensor_size, devices_per_node): + from deepspeed.ops.op_builder import QuantizerBuilder + if not deepspeed.ops.__compatible_ops__[QuantizerBuilder.NAME]: + pytest.skip("QuantizerBuilder is not implemented") + + quantizer_module = QuantizerBuilder().load() + + tensor = torch.randn(tensor_size, device='cuda', dtype=torch.half) + + num_nodes = 2 # Fake world size + total_elements = tensor.numel() + total_devices = devices_per_node * num_nodes + num_groups = max(tensor.shape[0], tensor.shape[1], total_devices) + + # Initialize error_feedback tensor + error_feedback = torch.randn(tensor_size, device=tensor.device, dtype=tensor.dtype) + error_feedback_ori = error_feedback.clone() + # Swizzle the original tensor + tensor_reshaped = tensor.reshape(num_nodes, devices_per_node, total_elements // total_devices) + swizzled_tensor = tensor_reshaped.permute(1, 0, 2).reshape(tensor.size()) + + # Perform loco_swizzle_quant + output, scales = quantizer_module.loco_swizzle_quant(tensor, error_feedback, 0.0, num_groups, num_bits, + quantizer_module.Symmetric, 1, num_nodes, + devices_per_node) + + # Compare swizzled_tensor with the output of loco_swizzle_quant + dequantized = quantizer_module.dequantize(output, scales, scales.numel(), num_bits, + quantizer_module.Symmetric).view(tensor.size()) + + assert torch.allclose(swizzled_tensor + error_feedback_ori, dequantized + error_feedback) + + # Calculate elements per group and groups per partition + elements_per_group = total_elements // num_groups + groups_per_partition = num_groups // devices_per_node + + # Reshape dequantized data to match the grouping in loco_quantized_reduction + dequantized_reshaped = dequantized.view(devices_per_node, groups_per_partition, elements_per_group) + + # Perform reduction across devices_per_node dimension + reduced_dequantized = dequantized_reshaped.cumsum(dim=0)[-1] + # Initialize error_feedback tensor + error_feedback = torch.randn(reduced_dequantized.shape, device=tensor.device, dtype=dequantized.dtype) + error_feedback_ori = error_feedback.clone() + + # perform loco_quantized_reduction + output, scales = quantizer_module.loco_quantized_reduction(output, scales, error_feedback, 0.0, num_groups, + num_groups // devices_per_node, num_bits, + quantizer_module.Symmetric, devices_per_node) + + dequantized_reduced = quantizer_module.dequantize(output, scales, scales.numel(), num_bits, + quantizer_module.Symmetric).view(error_feedback.size()) + + assert torch.allclose(reduced_dequantized + error_feedback_ori, dequantized_reduced + error_feedback) From 9e3125281f992a15486ca083f1acfa5f61931497 Mon Sep 17 00:00:00 2001 From: Yichen Yan Date: Wed, 11 Dec 2024 04:12:42 +0800 Subject: [PATCH 642/754] Fix type error in `ZeROOrderedDict` (#6794) As @keskival pointed in https://github.com/microsoft/DeepSpeed/commit/3d5cf739ead7c78f518a518ccaa15a323bd5c8da#r149582004, I've confirmed there's a type error, which this PR fixes. I didn't run into this because our internal version still use `*r2`. Co-authored-by: Tero Keski-Valkama Co-authored-by: Logan Adams <114770087+loadams@users.noreply.github.com> --- deepspeed/runtime/zero/parameter_offload.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/deepspeed/runtime/zero/parameter_offload.py b/deepspeed/runtime/zero/parameter_offload.py index f945f5166190..0be88a1e1ba6 100644 --- a/deepspeed/runtime/zero/parameter_offload.py +++ b/deepspeed/runtime/zero/parameter_offload.py @@ -52,7 +52,7 @@ def __init__(self, parent_module, *args, **kwargs): def __reduce__(self): r0, _, *r2 = super().__reduce__() - return (r0, (self._parent_module, )) + r2 + return (r0, (self._parent_module, )) + tuple(r2) def __getitem__(self, key): param = super().__getitem__(key) From ecb4bf32614fa8d6d4433ea579ca867008d34140 Mon Sep 17 00:00:00 2001 From: Eugene29 <52263376+Eugene29@users.noreply.github.com> Date: Tue, 10 Dec 2024 17:58:25 -0600 Subject: [PATCH 643/754] Fix uneven head sequence parallelism bug (#6774) (#6797) Here `gather_idx < 2` represents `is_first_all2all`. During the first all2all, `uneven_head_all2all` will be called if either `num_heads % seq_world_size != 0` or `get_num_kv_heads() is None`. During the second all2all, it'll return return `uneven_head_all2all` if and only if `get_num_kv_heads() is None` which is always set during the first uneven all2all. This means that there will no longer be issue where `uneven_head_all2all ` is returned for the second all2all because of `num_heads % seq_world_size != 0`. Fixes: #6774 --------- Co-authored-by: Logan Adams <114770087+loadams@users.noreply.github.com> --- deepspeed/sequence/layer.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/deepspeed/sequence/layer.py b/deepspeed/sequence/layer.py index 3dfe149057e9..ccc43fdf7164 100644 --- a/deepspeed/sequence/layer.py +++ b/deepspeed/sequence/layer.py @@ -184,7 +184,7 @@ def single_all_to_all(input, scatter_idx, gather_idx, batch_dim_idx, group, asyn # we only need num_heads once num_heads = input.shape[2] - if get_num_kv_heads() is not None or num_heads % seq_world_size != 0: + if get_num_kv_heads() is not None or (num_heads % seq_world_size != 0 and not scatter_idx < 2): # Assuming here that the number of heads for q is consistent with kv # If not, additional logic is required for cases like GQA if get_num_kv_heads() is None: From 074d5c69c3eeffdf34b406153b9ece971ae7f115 Mon Sep 17 00:00:00 2001 From: Logan Adams <114770087+loadams@users.noreply.github.com> Date: Wed, 11 Dec 2024 10:34:31 -0800 Subject: [PATCH 644/754] Fix nv-torch-nightly test by pinning transformers (#6849) --- .github/workflows/nv-torch-nightly-v100.yml | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/.github/workflows/nv-torch-nightly-v100.yml b/.github/workflows/nv-torch-nightly-v100.yml index 74495812add5..c2d10a454f94 100644 --- a/.github/workflows/nv-torch-nightly-v100.yml +++ b/.github/workflows/nv-torch-nightly-v100.yml @@ -2,6 +2,9 @@ name: nv-torch-nightly-v100 on: workflow_dispatch: + pull_request: + paths: + - '.github/workflows/nv-torch-nightly-v100.yml' schedule: - cron: "0 0 * * *" @@ -34,7 +37,7 @@ jobs: git clone https://github.com/huggingface/transformers cd transformers # if needed switch to the last known good SHA until transformers@master is fixed - # git checkout 1cc453d33 + git checkout 6c3f168b3 git rev-parse --short HEAD pip install . From bd6fd50e9f49a81d71284a49b8449c334bf11074 Mon Sep 17 00:00:00 2001 From: kaiksi-bb <122809228+kaiksi-bb@users.noreply.github.com> Date: Thu, 12 Dec 2024 01:48:18 +0100 Subject: [PATCH 645/754] Remove broken links to non-active site (#6854) The site referenced in various places on the README is no longer active: https://deepspeed4science.ai ![image](https://github.com/user-attachments/assets/8ec47313-2abf-40d6-b1f8-9a9234c15e2f) Co-authored-by: Logan Adams <114770087+loadams@users.noreply.github.com> --- README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 2334fd366ae4..9f06af022853 100755 --- a/README.md +++ b/README.md @@ -27,7 +27,7 @@ * [2023/11] [DeepSpeed ZeRO-Offload++: 6x Higher Training Throughput via Collaborative CPU/GPU Twin-Flow](https://github.com/microsoft/DeepSpeed/tree/master/blogs/deepspeed-offloadpp) * [2023/11] [DeepSpeed-FastGen: High-throughput Text Generation for LLMs via MII and DeepSpeed-Inference](https://github.com/microsoft/DeepSpeed/tree/master/blogs/deepspeed-fastgen) [[English](https://github.com/microsoft/DeepSpeed/tree/master/blogs/deepspeed-fastgen)] [[中文](https://github.com/microsoft/DeepSpeed/tree/master/blogs/deepspeed-fastgen/chinese/README.md)] [[日本語](https://github.com/microsoft/DeepSpeed/tree/master/blogs/deepspeed-fastgen/japanese/README.md)] * [2023/10] [DeepSpeed-VisualChat: Improve Your Chat Experience with Multi-Round Multi-Image Inputs](https://github.com/microsoft/DeepSpeed/tree/master/blogs/deepspeed-visualchat/10-03-2023/README.md) [[English](https://github.com/microsoft/DeepSpeed/tree/master/blogs/deepspeed-visualchat/10-03-2023/README.md)] [[中文](https://github.com/microsoft/DeepSpeed/blob/master/blogs/deepspeed-visualchat/10-03-2023/README-Chinese.md)] [[日本語](https://github.com/microsoft/DeepSpeed/blob/master/blogs/deepspeed-visualchat/10-03-2023/README-Japanese.md)] -* [2023/09] Announcing the DeepSpeed4Science Initiative: Enabling large-scale scientific discovery through sophisticated AI system technologies [[DeepSpeed4Science website](https://deepspeed4science.ai/)] [[Tutorials](https://www.deepspeed.ai/deepspeed4science/)] [[White paper](https://arxiv.org/abs/2310.04610)] [[Blog](https://www.microsoft.com/en-us/research/blog/announcing-the-deepspeed4science-initiative-enabling-large-scale-scientific-discovery-through-sophisticated-ai-system-technologies/)] [[中文](https://github.com/microsoft/DeepSpeed/blob/master/blogs/deepspeed4science/chinese/README.md)] [[日本語](https://github.com/microsoft/DeepSpeed/blob/master/blogs/deepspeed4science/japanese/README.md)] +* [2023/09] Announcing the DeepSpeed4Science Initiative: Enabling large-scale scientific discovery through sophisticated AI system technologies [[Tutorials](https://www.deepspeed.ai/deepspeed4science/)] [[White paper](https://arxiv.org/abs/2310.04610)] [[Blog](https://www.microsoft.com/en-us/research/blog/announcing-the-deepspeed4science-initiative-enabling-large-scale-scientific-discovery-through-sophisticated-ai-system-technologies/)] [[中文](https://github.com/microsoft/DeepSpeed/blob/master/blogs/deepspeed4science/chinese/README.md)] [[日本語](https://github.com/microsoft/DeepSpeed/blob/master/blogs/deepspeed4science/japanese/README.md)] @@ -78,7 +78,7 @@ To further increase the inference efficiency, DeepSpeed offers easy-to-use and f ## DeepSpeed4Science -In line with Microsoft's mission to solve humanity's most pressing challenges, the DeepSpeed team at Microsoft is responding to this opportunity by launching a new initiative called *DeepSpeed4Science*, aiming to build unique capabilities through AI system technology innovations to help domain experts to unlock today's biggest science mysteries. Learn more: [DeepSpeed4Science website](https://deepspeed4science.ai/) and [tutorials](https://www.deepspeed.ai/deepspeed4science/) +In line with Microsoft's mission to solve humanity's most pressing challenges, the DeepSpeed team at Microsoft is responding to this opportunity by launching a new initiative called *DeepSpeed4Science*, aiming to build unique capabilities through AI system technology innovations to help domain experts to unlock today's biggest science mysteries. Learn more: [tutorials](https://www.deepspeed.ai/deepspeed4science/) --- From 91829476a8fd4d0d9268c03c1d56795d20a51c12 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E2=84=8D=F0=9D=95=A0=F0=9D=95=9D=F0=9D=95=9D=F0=9D=95=A0?= =?UTF-8?q?=F0=9D=95=A8=20=F0=9D=95=84=F0=9D=95=92=F0=9D=95=9F?= Date: Thu, 12 Dec 2024 22:48:32 +0200 Subject: [PATCH 646/754] Avoid poisoning process with CUDA calls as soon as importing (#6810) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Call `torch.cuda.device_count() > 0` before `torch.cuda.is_available()`, to give priority to nvml based availability, so that we can try not to poison process with CUDA calls as soon as we execute `import deepspeed`. https://github.com/pytorch/pytorch/blob/v2.5.1/torch/cuda/__init__.py#L120-L124 There are 2 reasons to make this change: Firstly, if we accidentally import deepspeed, since the CUDA runtime initializes when the first CUDA API call is made and caches the device list, changing the CUDA_VISIBLE_DEVICES within the same process after initialization won't have any effect on the visible devices. The specific case: https://github.com/OpenRLHF/OpenRLHF/pull/524#issuecomment-2501505023 A demo for reproduction before the fix is applied: ```python import torch import os os.environ["CUDA_VISIBLE_DEVICES"] = "" import deepspeed os.environ["CUDA_VISIBLE_DEVICES"] = "0,1,2,3" torch.cuda.set_device('cuda:0') ``` Secondly, https://pytorch.org/docs/stable/notes/cuda.html When assessing the availability of CUDA in a given environment (is_available()), PyTorch’s default behavior is to call the CUDA Runtime API method cudaGetDeviceCount. Because this call in turn initializes the CUDA Driver API (via cuInit) if it is not already initialized, subsequent forks of a process that has run is_available() will fail with a CUDA initialization error. Signed-off-by: Hollow Man Co-authored-by: Logan Adams <114770087+loadams@users.noreply.github.com> --- accelerator/real_accelerator.py | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/accelerator/real_accelerator.py b/accelerator/real_accelerator.py index 69e96d285bb8..a6173ac70abd 100644 --- a/accelerator/real_accelerator.py +++ b/accelerator/real_accelerator.py @@ -167,7 +167,12 @@ def get_accelerator(): import torch # Determine if we are on a GPU or x86 CPU with torch. - if torch.cuda.is_available(): #ignore-cuda + # "torch.cuda.is_available()" provides a stronger guarantee, #ignore-cuda + # ensuring that we are free from CUDA initialization errors. + # While "torch.cuda.device_count() > 0" check ensures that #ignore-cuda + # we won't try to do any CUDA calls when no device is available + # For reference: https://github.com/microsoft/DeepSpeed/pull/6810 + if torch.cuda.device_count() > 0 and torch.cuda.is_available(): #ignore-cuda accelerator_name = "cuda" else: if accel_logger is not None: From 853a97648b9ba3acbb990018eab1dd928a08c390 Mon Sep 17 00:00:00 2001 From: Liangliang Ma Date: Sat, 14 Dec 2024 03:29:48 +0800 Subject: [PATCH 647/754] Fix xpu tests workflow failure by changing pip index url (#6864) Update xpu-max1100.yml and xpu-compile.yml --- .github/workflows/xpu-compile.yml | 8 ++++---- .github/workflows/xpu-max1100.yml | 8 ++++---- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/.github/workflows/xpu-compile.yml b/.github/workflows/xpu-compile.yml index e095e089fc30..9e8bd9d792fb 100644 --- a/.github/workflows/xpu-compile.yml +++ b/.github/workflows/xpu-compile.yml @@ -31,10 +31,10 @@ jobs: run: | apt-get update apt-get install clinfo libaio-dev python3-pip -y - pip install torch==2.3.1 -f https://pytorch-extension.intel.com/release-whl/stable/xpu/us/torch/ - pip install intel-extension-for-pytorch==2.3.110+xpu -f https://pytorch-extension.intel.com/release-whl/stable/xpu/us/intel-extension-for-pytorch/ - pip install oneccl_bind_pt==2.3.100+xpu -f https://pytorch-extension.intel.com/release-whl/stable/xpu/us/oneccl-bind-pt/ - pip install torchvision==0.18.1 -f https://pytorch-extension.intel.com/release-whl/stable/xpu/us/torchvision/ + pip install torch==2.3.1 -f https://pytorch-extension.intel.com/release-whl/stable/xpu/cn/torch/ + pip install intel-extension-for-pytorch==2.3.110+xpu -f https://pytorch-extension.intel.com/release-whl/stable/xpu/cn/intel-extension-for-pytorch/ + pip install oneccl_bind_pt==2.3.100+xpu -f https://pytorch-extension.intel.com/release-whl/stable/xpu/cn/oneccl-bind-pt/ + pip install torchvision==0.18.1 -f https://pytorch-extension.intel.com/release-whl/stable/xpu/cn/torchvision/ pip install https://github.com/intel/intel-xpu-backend-for-triton/releases/download/v3.0.0b2/triton_xpu-3.0.0b2-cp310-cp310-linux_x86_64.whl pip install py-cpuinfo numpy pip install .[dev,autotuning] diff --git a/.github/workflows/xpu-max1100.yml b/.github/workflows/xpu-max1100.yml index d19e73aeef1c..56bff4a88ba9 100644 --- a/.github/workflows/xpu-max1100.yml +++ b/.github/workflows/xpu-max1100.yml @@ -47,10 +47,10 @@ jobs: run: | apt-get update apt-get install clinfo libaio-dev python3-pip -y - pip install torch==2.3.1 -f https://pytorch-extension.intel.com/release-whl/stable/xpu/us/torch/ - pip install intel-extension-for-pytorch==2.3.110+xpu -f https://pytorch-extension.intel.com/release-whl/stable/xpu/us/intel-extension-for-pytorch/ - pip install oneccl_bind_pt==2.3.100+xpu -f https://pytorch-extension.intel.com/release-whl/stable/xpu/us/oneccl-bind-pt/ - pip install torchvision==0.18.1 -f https://pytorch-extension.intel.com/release-whl/stable/xpu/us/torchvision/ + pip install torch==2.3.1 -f https://pytorch-extension.intel.com/release-whl/stable/xpu/cn/torch/ + pip install intel-extension-for-pytorch==2.3.110+xpu -f https://pytorch-extension.intel.com/release-whl/stable/xpu/cn/intel-extension-for-pytorch/ + pip install oneccl_bind_pt==2.3.100+xpu -f https://pytorch-extension.intel.com/release-whl/stable/xpu/cn/oneccl-bind-pt/ + pip install torchvision==0.18.1 -f https://pytorch-extension.intel.com/release-whl/stable/xpu/cn/torchvision/ pip install py-cpuinfo numpy pip install .[dev,autotuning] From d7750c34291b9dcd892de4a795ecd0e35b28f6ee Mon Sep 17 00:00:00 2001 From: Guanhua Wang Date: Fri, 13 Dec 2024 11:40:41 -0800 Subject: [PATCH 648/754] Domino updates (#6861) Updating our website for Domino --------- Co-authored-by: Logan Adams <114770087+loadams@users.noreply.github.com> --- docs/_tutorials/domino.md | 6 ++++++ docs/index.md | 6 +++--- 2 files changed, 9 insertions(+), 3 deletions(-) create mode 100644 docs/_tutorials/domino.md diff --git a/docs/_tutorials/domino.md b/docs/_tutorials/domino.md new file mode 100644 index 000000000000..6b116cb87463 --- /dev/null +++ b/docs/_tutorials/domino.md @@ -0,0 +1,6 @@ +--- +title: "Domino" +tags: training +--- + +Domino achieves near-complete communication hiding behind computation for tensor parallel training. Please find our [Domino-tutorial](https://github.com/microsoft/DeepSpeedExamples/blob/master/training/DeepSpeed-Domino/README.md) in DeepSpeedExample repo. diff --git a/docs/index.md b/docs/index.md index 3279682b42d4..3d5f290f2bde 100755 --- a/docs/index.md +++ b/docs/index.md @@ -7,25 +7,25 @@ title: "Latest News" --- DeepSpeed empowers ChatGPT-like model training with a single click, offering 15x speedup over SOTA RLHF systems with unprecedented cost reduction at all scales; [learn how](https://github.com/microsoft/DeepSpeed/tree/master/blogs/deepspeed-chat). +* [2024/12] [DeepSpeed Domino: Communication-Free LLM Training Engine](https://github.com/microsoft/DeepSpeed/blob/master/blogs/deepspeed-domino/README.md) + * [2024/08] [DeepSpeed on Windows](https://github.com/microsoft/DeepSpeed/blob/master/blogs/windows/08-2024/README.md)[[日本語](https://github.com/microsoft/DeepSpeed/blob/master/blogs/windows/08-2024/japanese/README.md)] [[中文](https://github.com/microsoft/DeepSpeed/blob/master/blogs/windows/08-2024/chinese/README.md)] * [2024/08] [DeepNVMe: Improving DL Applications through I/O Optimizations](https://github.com/microsoft/DeepSpeed/blob/master/blogs/deepspeed-gds/README.md)[[日本語](https://github.com/microsoft/DeepSpeed/blob/master/blogs/deepspeed-gds/japanese/README.md)] [[中文](https://github.com/microsoft/DeepSpeed/blob/master/blogs/deepspeed-gds/chinese/README.md)] * [2024/07] [DeepSpeed Universal Checkpointing: Efficient and Flexible Checkpointing for Large Scale Distributed Training](https://github.com/microsoft/DeepSpeed/tree/master/blogs/deepspeed-ucp/README.md)[[日本語](https://github.com/microsoft/DeepSpeed/tree/master/blogs/deepspeed-ucp/japanese/README.md)] * [2024/03] [DeepSpeed-FP6: The Power of FP6-Centric Serving for Large Language Models](https://github.com/microsoft/DeepSpeed/tree/master/blogs/deepspeed-fp6/03-05-2024/README.md) [[English](https://github.com/microsoft/DeepSpeed/tree/master/blogs/deepspeed-fp6/03-05-2024/README.md)] [[中文](https://github.com/microsoft/DeepSpeed/tree/master/blogs/deepspeed-fp6/03-05-2024/README-Chinese.md)] -* [2024/01] [DeepSpeed-FastGen: Introducting Mixtral, Phi-2, and Falcon support with major performance and feature enhancements.](https://github.com/microsoft/DeepSpeed/tree/master/blogs/deepspeed-fastgen/2024-01-19) From b5e3fac6a599f80a7db1899e47ea6993131bb51b Mon Sep 17 00:00:00 2001 From: Guanhua Wang Date: Fri, 13 Dec 2024 12:59:08 -0800 Subject: [PATCH 649/754] add domino navigation (#6866) add domino item into navigation list --- docs/_data/navigation.yml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/docs/_data/navigation.yml b/docs/_data/navigation.yml index b17685b8dc4d..c3ebad4f86af 100755 --- a/docs/_data/navigation.yml +++ b/docs/_data/navigation.yml @@ -75,6 +75,8 @@ lnav: url: /tutorials/data-efficiency/ - title: 'DeepNVMe' url: /tutorials/deepnvme/ + - title: 'Domino' + url: /tutorials/domino/ - title: 'DS4Sci_EvoformerAttention' url: /tutorials/ds4sci_evoformerattention/ - title: 'Flops Profiler' From 8efbcc495c3c7c072d10bfd672932807fb9eb8e5 Mon Sep 17 00:00:00 2001 From: Olatunji Ruwase Date: Fri, 13 Dec 2024 16:49:08 -0500 Subject: [PATCH 650/754] Update TSC (#6867) --- COMMITTERS.md | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/COMMITTERS.md b/COMMITTERS.md index bcb8579bf1f7..8418bdf8629d 100644 --- a/COMMITTERS.md +++ b/COMMITTERS.md @@ -5,5 +5,7 @@ | Olatunji Ruwase | [tjruwase](https://github.com/tjruwase) | Microsoft | | Logan Adams | [loadams](https://github.com/loadams) | Microsoft | | Masahiro Tanaka | [tohtana](https://github.com/tohtana) | Microsoft | -| Jeff Rasley | [jeffra](https://github.com/jeffra) | SnowFlake | -| Minjia Zhang | [minjiazhang](https://github.com/minjiazhang) | UIUC | +| Jeff Rasley | [jeffra](https://github.com/jeffra) | SnowFlake | +| Minjia Zhang | [minjiazhang](https://github.com/minjiazhang) | UIUC | +| Ashwin Aji | [ashwinma](https://github.com/ashwinma) | AMD | +| Sam Foreman | [saforem2](https://github.com/saforem2) | Argonne National Laboratory | From 6e3e13cb280b684ebedb5c2aecb36efb545ebfce Mon Sep 17 00:00:00 2001 From: Logan Adams <114770087+loadams@users.noreply.github.com> Date: Fri, 13 Dec 2024 15:35:12 -0800 Subject: [PATCH 651/754] Remove warnings from autodoc and sphinx (#6788) Co-authored-by: Olatunji Ruwase --- deepspeed/runtime/fp16/onebit/zoadam.py | 4 +++- deepspeed/runtime/lr_schedules.py | 4 ++-- docs/code-docs/source/monitor.rst | 18 +++++++++--------- 3 files changed, 14 insertions(+), 12 deletions(-) diff --git a/deepspeed/runtime/fp16/onebit/zoadam.py b/deepspeed/runtime/fp16/onebit/zoadam.py index 803bd929742d..70282ec41714 100644 --- a/deepspeed/runtime/fp16/onebit/zoadam.py +++ b/deepspeed/runtime/fp16/onebit/zoadam.py @@ -12,9 +12,11 @@ class ZeroOneAdam(torch.optim.Optimizer): - """Implements the 0/1 Adam algorithm. Currently GPU-only. + """ + Implements the 0/1 Adam algorithm. Currently GPU-only. For usage example please see https://www.deepspeed.ai/tutorials/zero-one-adam/ For technical details please read https://arxiv.org/abs/2202.06009 + Arguments: params (iterable): iterable of parameters to optimize or dicts defining parameter groups. diff --git a/deepspeed/runtime/lr_schedules.py b/deepspeed/runtime/lr_schedules.py index f25a19e8e499..899358e2c5ef 100755 --- a/deepspeed/runtime/lr_schedules.py +++ b/deepspeed/runtime/lr_schedules.py @@ -274,7 +274,7 @@ class LRRangeTest(object): """Sets the learning rate of each parameter group according to learning rate range test (LRRT) policy. The policy increases learning rate starting from a base value with a constant frequency, as detailed in - the paper `A disciplined approach to neural network hyper-parameters: Part1`_. + the paper `A disciplined approach to neural network hyper-parameters: Part 1 `_ LRRT policy is used for finding maximum LR that trains a model without divergence, and can be used to configure the LR boundaries for Cyclic LR schedules. @@ -379,7 +379,7 @@ class OneCycle(object): 1CLR policy changes the learning rate after every batch. `step` should be called after a batch has been used for training. - This implementation was adapted from the github repo: `pytorch/pytorch`_ + This implementation was adapted from the github repo: `PyTorch `_. Args: optimizer (Optimizer): Wrapped optimizer. diff --git a/docs/code-docs/source/monitor.rst b/docs/code-docs/source/monitor.rst index 694c72b9b870..b185ed433c1c 100644 --- a/docs/code-docs/source/monitor.rst +++ b/docs/code-docs/source/monitor.rst @@ -9,15 +9,15 @@ overview of what DeepSpeed will log automatically. :header: "Field", "Description", "Condition" :widths: 20, 20, 10 - `Train/Samples/train_loss`,The training loss.,None - `Train/Samples/lr`,The learning rate during training.,None - `Train/Samples/loss_scale`,The loss scale when training using `fp16`.,`fp16` must be enabled. - `Train/Eigenvalues/ModelBlockParam_{i}`,Eigen values per param block.,`eigenvalue` must be enabled. - `Train/Samples/elapsed_time_ms_forward`,The global duration of the forward pass.,`flops_profiler.enabled` or `wall_clock_breakdown`. - `Train/Samples/elapsed_time_ms_backward`,The global duration of the forward pass.,`flops_profiler.enabled` or `wall_clock_breakdown`. - `Train/Samples/elapsed_time_ms_backward_inner`,The backward time that does not include the gradient reduction time. Only in cases where the gradient reduction is not overlapped, if it is overlapped then the inner time should be about the same as the entire backward time.,`flops_profiler.enabled` or `wall_clock_breakdown`. - `Train/Samples/elapsed_time_ms_backward_allreduce`,The global duration of the allreduce operation.,`flops_profiler.enabled` or `wall_clock_breakdown`. - `Train/Samples/elapsed_time_ms_step`,The optimizer step time,`flops_profiler.enabled` or `wall_clock_breakdown`. + `Train/Samples/train_loss`,"The training loss.",None + `Train/Samples/lr`,"The learning rate during training.",None + `Train/Samples/loss_scale`,"The loss scale when training using `fp16`.",`fp16` must be enabled. + `Train/Eigenvalues/ModelBlockParam_{i}`,"Eigen values per param block.",`eigenvalue` must be enabled. + `Train/Samples/elapsed_time_ms_forward`,"The global duration of the forward pass.",`flops_profiler.enabled` or `wall_clock_breakdown`. + `Train/Samples/elapsed_time_ms_backward`,"The global duration of the forward pass.",`flops_profiler.enabled` or `wall_clock_breakdown`. + `Train/Samples/elapsed_time_ms_backward_inner`,"The backward time that does not include the gradient reduction time. Only in cases where the gradient reduction is not overlapped, if it is overlapped then the inner time should be about the same as the entire backward time.",`flops_profiler.enabled` or `wall_clock_breakdown`. + `Train/Samples/elapsed_time_ms_backward_allreduce`,"The global duration of the allreduce operation.",`flops_profiler.enabled` or `wall_clock_breakdown`. + `Train/Samples/elapsed_time_ms_step`,"The optimizer step time.",`flops_profiler.enabled` or `wall_clock_breakdown`. TensorBoard ----------- From fc7c07007fe341bf6d78a9126d0cb5a914ce28fd Mon Sep 17 00:00:00 2001 From: keiwoo Date: Sat, 14 Dec 2024 08:41:43 +0800 Subject: [PATCH 652/754] Update real_accelerator.py (#6845) ### Comment out or delete `accelerate_name="cpu"` when `xpu` is not detected. When `xpu `is not detected it just pass at lines from 68 to 74 if `DS_ACCELERATOR` is set. However, `cpu` is assigned to `accelerate_name` if it cannot import `intel_extension_for_pytorch` or find` xpu`, namely, at line from 125 to 133 when`DS_ACCELERATOR` is not set. I found this problem yesterday and spent whole afternoon figuring it out. I got `intel_extension_for_pytorch `installed with other package which I do not use actually and have no idea about this. Then I found that it `cpu` is assigned to accelerate_name directly if it cannot find `xpu` and it affects `cuda` detection. In fact, `cpu` will be assigned finally if `cuda` is even not detected at line from 170 to 177. --------- Co-authored-by: Olatunji Ruwase Co-authored-by: Logan Adams Co-authored-by: Logan Adams <114770087+loadams@users.noreply.github.com> --- accelerator/real_accelerator.py | 18 ++++++++---------- 1 file changed, 8 insertions(+), 10 deletions(-) diff --git a/accelerator/real_accelerator.py b/accelerator/real_accelerator.py index a6173ac70abd..ced9218d7aca 100644 --- a/accelerator/real_accelerator.py +++ b/accelerator/real_accelerator.py @@ -125,10 +125,9 @@ def get_accelerator(): if accelerator_name is None: try: import intel_extension_for_pytorch as ipex + if ipex._C._has_xpu(): accelerator_name = "xpu" - else: - accelerator_name = "cpu" except ImportError as e: pass if accelerator_name is None: @@ -162,7 +161,6 @@ def get_accelerator(): except ImportError as e: pass if accelerator_name is None: - # borrow this log from PR#5084 try: import torch @@ -174,16 +172,16 @@ def get_accelerator(): # For reference: https://github.com/microsoft/DeepSpeed/pull/6810 if torch.cuda.device_count() > 0 and torch.cuda.is_available(): #ignore-cuda accelerator_name = "cuda" - else: - if accel_logger is not None: - accel_logger.warn( - "Setting accelerator to CPU. If you have GPU or other accelerator, we were unable to detect it." - ) - accelerator_name = "cpu" except (RuntimeError, ImportError) as e: # TODO need a more decent way to detect which accelerator to use, consider using nvidia-smi command for detection - accelerator_name = "cuda" pass + if accelerator_name is None: + # borrow this log from PR#5084 + if accel_logger is not None: + accel_logger.warn( + "Setting accelerator to CPU. If you have GPU or other accelerator, we were unable to detect it.") + # cpu added as catch-all when accelerator detection fails + accelerator_name = "cpu" ds_set_method = "auto detect" From db98cc3ad1e0a20807e0c2513f0eee40f626860e Mon Sep 17 00:00:00 2001 From: Masahiro Tanaka <81312776+tohtana@users.noreply.github.com> Date: Mon, 16 Dec 2024 11:05:55 -0800 Subject: [PATCH 653/754] Fix assertion for offloading states (#6855) This PR fixes the assertions in `offload_states` method mentioned in #6833. Co-authored-by: Logan Adams <114770087+loadams@users.noreply.github.com> --- deepspeed/runtime/engine.py | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/deepspeed/runtime/engine.py b/deepspeed/runtime/engine.py index 0aad018528d3..5f023d87f375 100755 --- a/deepspeed/runtime/engine.py +++ b/deepspeed/runtime/engine.py @@ -3738,6 +3738,11 @@ def offload_states(self, assert self.zero_optimization_stage( ) == ZeroStageEnum.weights, "Moving buffers across devices is supported only for ZeRO stage 3." + opt_offload_config = self.zero_offload_optimizer() + assert opt_offload_config is None or opt_offload_config.device == OffloadDeviceEnum.none, "Moving states across devices is not supported for offloaded optimizer states." + param_offload_config = self.zero_offload_param() + assert param_offload_config is None or param_offload_config.device == OffloadDeviceEnum.none, "Moving states across devices is not supported for offloaded parameters." + assert not self.zero_offload_param(), "Moving states across devices is not supported for offloaded parameters." if device == OffloadDeviceEnum.none: From 87c650681eb285ab34a69a011b520f756f42d4b9 Mon Sep 17 00:00:00 2001 From: Logan Adams <114770087+loadams@users.noreply.github.com> Date: Mon, 16 Dec 2024 11:21:51 -0800 Subject: [PATCH 654/754] Remove pin from transformers version and fix Processing/Threading issues in tests (#6822) Changes from https://github.com/huggingface/transformers/pull/34966 caused the `nv-torch-latest-v100` tests to fail with the following error: ``` File "/tmp/azureml/cr/j/e4bfd57a509846d6bbc4914639ad248d/exe/wd/actions-runner/_work/DeepSpeed/DeepSpeed/unit-test-venv/lib/python3.10/site-packages/transformers/modeling_utils.py", line 3941, in from_pretrained raise EnvironmentError( OSError: Can't load the model for 'hf-internal-testing/tiny-random-VisionEncoderDecoderModel-vit-gpt2'. If you were trying to load it from 'https://huggingface.co/models', make sure you don't have a local directory with the same name. Otherwise, make sure 'hf-internal-testing/tiny-random-VisionEncoderDecoderModel-vit-gpt2' is the correct path to a directory containing a file named pytorch_model.bin, tf_model.h5, model.ckpt or flax_model.msgpack. ``` Sample failure here: https://github.com/microsoft/DeepSpeed/actions/runs/12169422174/job/33942348835?pr=6794#step:8:3506 This was resolved on the Transformers side here: https://github.com/huggingface/transformers/pull/35236 --- .github/workflows/cpu-torch-latest.yml | 2 +- .github/workflows/nv-torch-latest-v100.yml | 2 +- .github/workflows/nv-torch-nightly-v100.yml | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/.github/workflows/cpu-torch-latest.yml b/.github/workflows/cpu-torch-latest.yml index 51bc60c2c2ae..78a51905834b 100644 --- a/.github/workflows/cpu-torch-latest.yml +++ b/.github/workflows/cpu-torch-latest.yml @@ -42,7 +42,7 @@ jobs: git clone https://github.com/huggingface/transformers cd transformers # if needed switch to the last known good SHA until transformers@master is fixed - git checkout 6c3f168b3 + # git checkout 6c3f168b3 git rev-parse --short HEAD pip install . diff --git a/.github/workflows/nv-torch-latest-v100.yml b/.github/workflows/nv-torch-latest-v100.yml index 2d69d0b94cb5..a1ba4937d164 100644 --- a/.github/workflows/nv-torch-latest-v100.yml +++ b/.github/workflows/nv-torch-latest-v100.yml @@ -38,7 +38,7 @@ jobs: git clone https://github.com/huggingface/transformers cd transformers # if needed switch to the last known good SHA until transformers@master is fixed - git checkout 6c3f168b3 + # git checkout 6c3f168b3 git rev-parse --short HEAD pip install . diff --git a/.github/workflows/nv-torch-nightly-v100.yml b/.github/workflows/nv-torch-nightly-v100.yml index c2d10a454f94..0a9570a1ceaa 100644 --- a/.github/workflows/nv-torch-nightly-v100.yml +++ b/.github/workflows/nv-torch-nightly-v100.yml @@ -37,7 +37,7 @@ jobs: git clone https://github.com/huggingface/transformers cd transformers # if needed switch to the last known good SHA until transformers@master is fixed - git checkout 6c3f168b3 + # git checkout 6c3f168b3 git rev-parse --short HEAD pip install . From da771ed42e41a44d5047813ca4672f1cfe9d1731 Mon Sep 17 00:00:00 2001 From: Yejing-Lai Date: Tue, 17 Dec 2024 06:14:53 +0800 Subject: [PATCH 655/754] Add MLP/lm_head tp grain size setting. (#6828) This PR aims to add MLP/lm_head tp size granularity setting to deepspeed.init_inference() API. It will be more flexible to set the MLP/lm_head sharding grain size. DNN library favors tensor size in granularity of power of 2, we pick 64 as a default size. We aim to be able to set the MLP/lm_head tp grain size flexibly. This is a preliminary solution. If there is a better solution, we can discuss it together. Thanks~ --------- Co-authored-by: Logan Adams <114770087+loadams@users.noreply.github.com> Co-authored-by: Olatunji Ruwase --- deepspeed/inference/config.py | 3 +++ deepspeed/module_inject/replace_module.py | 5 ++++- deepspeed/module_inject/tp_shard.py | 11 ++++++++--- 3 files changed, 15 insertions(+), 4 deletions(-) diff --git a/deepspeed/inference/config.py b/deepspeed/inference/config.py index c7c7684fff79..42ffebbc4386 100644 --- a/deepspeed/inference/config.py +++ b/deepspeed/inference/config.py @@ -40,6 +40,9 @@ class DeepSpeedTPConfig(DeepSpeedConfigModel): tp_size: int = 1 """ Number of devices to split the model across using tensor parallelism. """ + tp_grain_size: int = 64 + "Desired MLP/lm_head tp size granularity. DNN library favors tensor size in granularity of power of 2, we pick 64 as a default size." + mpu: object = None """ A model parallelism unit object that implements diff --git a/deepspeed/module_inject/replace_module.py b/deepspeed/module_inject/replace_module.py index 7afe6ca903fb..e59f84bc8453 100644 --- a/deepspeed/module_inject/replace_module.py +++ b/deepspeed/module_inject/replace_module.py @@ -17,7 +17,7 @@ from .layers import TensorParallelOcShardConv2d, TensorParallelIcShardConv2d from deepspeed import comm as dist -from deepspeed.module_inject.tp_shard import set_num_kv_heads, set_n_embd, set_num_attention_heads +from deepspeed.module_inject.tp_shard import set_num_kv_heads, set_n_embd, set_num_attention_heads, set_tp_grain_size from .load_checkpoint import load_model_with_checkpoint import time @@ -303,6 +303,9 @@ def replace_wo_policy(module, all_reduce_linears, prefix="", state_dict=None): if hasattr(model_config, 'num_attention_heads'): set_num_attention_heads(getattr(model_config, 'num_attention_heads')) + # 4.4 set tp_grain_size + set_tp_grain_size(config.tensor_parallel.tp_grain_size) + # 5. Set linear policies _autotp.update_linear_policies() diff --git a/deepspeed/module_inject/tp_shard.py b/deepspeed/module_inject/tp_shard.py index 57be0c793856..3e6fc2b63ef1 100644 --- a/deepspeed/module_inject/tp_shard.py +++ b/deepspeed/module_inject/tp_shard.py @@ -22,6 +22,11 @@ def set_n_embd(num): n_embd = num +def set_tp_grain_size(num): + global tp_grain_size + tp_grain_size = num + + def get_num_kv_heads(): global num_kv_heads if 'num_kv_heads' in globals(): @@ -45,9 +50,9 @@ def get_shard_size(total_size, mp_size, name=None, rank=None): my_slices = (num_kv_heads // mp_size) + (1 if rank < (num_kv_heads % mp_size) else 0) return total_size * my_slices // num_kv_heads else: - if total_size >= 64: - grain_size = total_size // 64 - return (grain_size // mp_size + (1 if rank < (grain_size % mp_size) else 0)) * 64 + if total_size >= tp_grain_size: + grain_size = total_size // tp_grain_size + return (grain_size // mp_size + (1 if rank < (grain_size % mp_size) else 0)) * tp_grain_size else: return total_size // mp_size + (1 if rank < (total_size % mp_size) else 0) From a964e435532699908e5750abdb027ae583ff793d Mon Sep 17 00:00:00 2001 From: Aviv Keshet Date: Tue, 17 Dec 2024 09:33:09 -0800 Subject: [PATCH 656/754] Fix --enable_each_rank_log when used with PDSH multi-node runner (#6863) This PR addresses fixes https://github.com/microsoft/DeepSpeed/issues/6859 by threading this argument into the deepspeed launcher command build by PDSHRunner. --------- Co-authored-by: Logan Adams <114770087+loadams@users.noreply.github.com> --- deepspeed/launcher/multinode_runner.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/deepspeed/launcher/multinode_runner.py b/deepspeed/launcher/multinode_runner.py index 74d20a6d53e5..fe2fa1b476be 100644 --- a/deepspeed/launcher/multinode_runner.py +++ b/deepspeed/launcher/multinode_runner.py @@ -104,6 +104,8 @@ 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.enable_each_rank_log: + deepspeed_launch.append(f"--enable_each_rank_log={self.args.enable_each_rank_log}") if self.args.elastic_training: deepspeed_launch.append("--enable_elastic_training") deepspeed_launch.append(f"--max_elastic_nodes={self.args.max_elastic_nodes}") From 2f32966b1cd874aa4373177c8f8c4214ad57d020 Mon Sep 17 00:00:00 2001 From: Logan Adams <114770087+loadams@users.noreply.github.com> Date: Tue, 17 Dec 2024 11:53:47 -0800 Subject: [PATCH 657/754] Update transformers ops unit tests to use `requried_torch_version` (#6884) --- .../ops/transformer/inference/test_bias_geglu.py | 2 -- .../ops/transformer/inference/test_bias_gelu.py | 2 -- .../ops/transformer/inference/test_bias_relu.py | 2 -- tests/unit/ops/transformer/inference/test_gelu.py | 14 +++++--------- .../unit/ops/transformer/inference/test_matmul.py | 1 - .../unit/ops/transformer/inference/test_softmax.py | 2 -- 6 files changed, 5 insertions(+), 18 deletions(-) diff --git a/tests/unit/ops/transformer/inference/test_bias_geglu.py b/tests/unit/ops/transformer/inference/test_bias_geglu.py index 05de4fbb4cf8..c995d2a8c46d 100644 --- a/tests/unit/ops/transformer/inference/test_bias_geglu.py +++ b/tests/unit/ops/transformer/inference/test_bias_geglu.py @@ -15,8 +15,6 @@ if not deepspeed.ops.__compatible_ops__[InferenceBuilder.NAME]: pytest.skip("Inference ops are not available on this system", allow_module_level=True) -torch_minor_version = None - def run_bias_geglu_reference(activations, bias): # Expected behavior is that of casting to float32 internally diff --git a/tests/unit/ops/transformer/inference/test_bias_gelu.py b/tests/unit/ops/transformer/inference/test_bias_gelu.py index b69030e87ace..e3a3bad63961 100644 --- a/tests/unit/ops/transformer/inference/test_bias_gelu.py +++ b/tests/unit/ops/transformer/inference/test_bias_gelu.py @@ -16,8 +16,6 @@ if not deepspeed.ops.__compatible_ops__[InferenceBuilder.NAME]: pytest.skip("Inference ops are not available on this system", allow_module_level=True) -torch_minor_version = None - def run_bias_gelu_reference(activations, bias): # Expected behavior is that of casting to float32 internally and using the tanh approximation diff --git a/tests/unit/ops/transformer/inference/test_bias_relu.py b/tests/unit/ops/transformer/inference/test_bias_relu.py index 57134665b241..69078f9f7646 100644 --- a/tests/unit/ops/transformer/inference/test_bias_relu.py +++ b/tests/unit/ops/transformer/inference/test_bias_relu.py @@ -15,8 +15,6 @@ if not deepspeed.ops.__compatible_ops__[InferenceBuilder.NAME]: pytest.skip("Inference ops are not available on this system", allow_module_level=True) -torch_minor_version = None - def run_bias_relu_reference(activations, bias): # Expected behavior is that of casting to float32 internally diff --git a/tests/unit/ops/transformer/inference/test_gelu.py b/tests/unit/ops/transformer/inference/test_gelu.py index 5f820ef3b579..a58abfdb100c 100644 --- a/tests/unit/ops/transformer/inference/test_gelu.py +++ b/tests/unit/ops/transformer/inference/test_gelu.py @@ -9,12 +9,11 @@ from deepspeed.ops.op_builder import InferenceBuilder from deepspeed.ops.transformer import DeepSpeedInferenceConfig from deepspeed.ops.transformer.inference.op_binding.bias_gelu import BiasGeluOp +from deepspeed.utils.torch import required_torch_version if not deepspeed.ops.__compatible_ops__[InferenceBuilder.NAME]: pytest.skip("Inference ops are not available on this system", allow_module_level=True) -torch_minor_version = None - def allclose(x, y): assert x.dtype == y.dtype @@ -23,14 +22,11 @@ def allclose(x, y): def version_appropriate_gelu(activations): - global torch_minor_version - if torch_minor_version is None: - torch_minor_version = int(torch.__version__.split('.')[1]) - # If torch version = 1.12 - if torch_minor_version < 12: - return torch.nn.functional.gelu(activations) - else: + # gelu behavior changes (correctly) in torch 1.12 + if required_torch_version(min_version=1.12): return torch.nn.functional.gelu(activations, approximate='tanh') + else: + return torch.nn.functional.gelu(activations) def run_gelu_reference(activations): diff --git a/tests/unit/ops/transformer/inference/test_matmul.py b/tests/unit/ops/transformer/inference/test_matmul.py index 559aa2c60afe..2ab195ee0115 100644 --- a/tests/unit/ops/transformer/inference/test_matmul.py +++ b/tests/unit/ops/transformer/inference/test_matmul.py @@ -12,7 +12,6 @@ pytest.skip("Inference ops are not available on this system", allow_module_level=True) inference_module = None -torch_minor_version = None def allclose(x, y): diff --git a/tests/unit/ops/transformer/inference/test_softmax.py b/tests/unit/ops/transformer/inference/test_softmax.py index e582be1b926a..83785ac38ebb 100644 --- a/tests/unit/ops/transformer/inference/test_softmax.py +++ b/tests/unit/ops/transformer/inference/test_softmax.py @@ -11,8 +11,6 @@ if not deepspeed.ops.__compatible_ops__[InferenceBuilder.NAME]: pytest.skip("Inference ops are not available on this system", allow_module_level=True) -torch_minor_version = None - def allclose(x, y): assert x.dtype == y.dtype From 4cd1d97460b677563d57f07a293724bdc02e0ef5 Mon Sep 17 00:00:00 2001 From: Logan Adams <114770087+loadams@users.noreply.github.com> Date: Tue, 17 Dec 2024 17:30:52 -0800 Subject: [PATCH 658/754] Don't error out when cpu accelerator doesn't have torch (as default for whl building) (#6886) This fixes a bug introduced in #6845, which breaks the `no-torch` workflow that we require in order to do releases where we do not require torch to be in the environment when building an sdist. This adds the same logic to the cpuaccelerator that the cudaaccelerator had where we don't require torch to be installed to build the whl. --- .github/workflows/no-torch.yml | 1 + accelerator/cpu_accelerator.py | 8 +++++++- 2 files changed, 8 insertions(+), 1 deletion(-) diff --git a/.github/workflows/no-torch.yml b/.github/workflows/no-torch.yml index 1a13c0f3f4f1..5b89a6f36787 100644 --- a/.github/workflows/no-torch.yml +++ b/.github/workflows/no-torch.yml @@ -4,6 +4,7 @@ on: workflow_dispatch: pull_request: paths: + - 'accelerator/**' - '.github/workflows/no-torch.yml' - 'op_builder/**' schedule: diff --git a/accelerator/cpu_accelerator.py b/accelerator/cpu_accelerator.py index 0e49bd9f6458..de711f73144e 100644 --- a/accelerator/cpu_accelerator.py +++ b/accelerator/cpu_accelerator.py @@ -3,9 +3,15 @@ # DeepSpeed Team -import torch from .abstract_accelerator import DeepSpeedAccelerator +# During setup stage torch may not be installed, pass on no torch will +# allow op builder related API to be executed. +try: + import torch +except ImportError as e: + pass + try: import oneccl_bindings_for_pytorch # noqa: F401 # type: ignore oneccl_imported_p = True From 0b25630abe8f7dd4e64c277ff92f5f7e36a27284 Mon Sep 17 00:00:00 2001 From: Daniel Huang Date: Wed, 18 Dec 2024 08:09:31 -0800 Subject: [PATCH 659/754] Add arctic model support by adding w2 to all_reduce (#6856) As title says. Default behavior of arctic model produces shape issues with AutoTP due to the MLP layer performing `w2 * act(w1*w3)`. However, method provided to fix Mixtral-7x8b in #5257 does not work since the MLP for Arctic is also used within a ModuleList for the MoE. This results in MLP weights hiding behind individual experts as layers `#.w#`, which is not caught by the fix in #5257. This adds the check directly within replace, where it can check for actual layer names for the `w2` key in the model to patch with `all_reduce`. --------- Signed-off-by: Daniel Huang Co-authored-by: Olatunji Ruwase Co-authored-by: Logan Adams <114770087+loadams@users.noreply.github.com> --- deepspeed/module_inject/auto_tp.py | 6 +++++- docs/_tutorials/automatic-tensor-parallelism.md | 1 + 2 files changed, 6 insertions(+), 1 deletion(-) diff --git a/deepspeed/module_inject/auto_tp.py b/deepspeed/module_inject/auto_tp.py index 221d490a37d2..5441000e581d 100755 --- a/deepspeed/module_inject/auto_tp.py +++ b/deepspeed/module_inject/auto_tp.py @@ -346,11 +346,15 @@ def _replace(self, child, name, conv_linear_layer): weight, bias = shard_value_with_share_qk(child.weight.data, child.bias, dist.get_rank(), dist.get_world_size(), False) return LinearAllreduce(weight, bias, self.mp_group) + # For Arctic model, bypass to all_reduce replacement for w2 weights + arctic_w2_all_reduce_linear = False + if 'Arctic' in str(self.module) and 'w2' in name: + arctic_w2_all_reduce_linear = True # For MLP including chunk layer. if 'gate_up_proj' in name or ('dense_h_to_4h' in name and 'GLM' in str(self.module)): weight, bias = shard_chunk_mlp(child.weight.data, child.bias, dist.get_rank(), dist.get_world_size()) return LinearLayer(weight=weight, bias=bias) - if name in self.all_reduce_linears: + if name in self.all_reduce_linears or arctic_w2_all_reduce_linear: # if conv_linear_layer [weight_shape[1], weight_shape[0] // mp_size] # else [weight_shape[0], weight_shape[1] // mp_size] diff --git a/docs/_tutorials/automatic-tensor-parallelism.md b/docs/_tutorials/automatic-tensor-parallelism.md index d5a08b27bf4d..6488f9b718fe 100755 --- a/docs/_tutorials/automatic-tensor-parallelism.md +++ b/docs/_tutorials/automatic-tensor-parallelism.md @@ -121,6 +121,7 @@ The following results were collected using V100 SXM2 32GB GPUs. The following model families have been successfully tested with automatic tensor parallelism. Other models may work but have not been tested yet. - albert +- arctic - baichuan - bert - bigbird_pegasus From b344c04df0fdf058617004924a7aaa15055dccce Mon Sep 17 00:00:00 2001 From: Olatunji Ruwase Date: Wed, 18 Dec 2024 11:49:28 -0500 Subject: [PATCH 660/754] Update code owners (#6890) Co-authored-by: Logan Adams <114770087+loadams@users.noreply.github.com> --- CODEOWNERS | 45 ++++++++++++++++++++++++--------------------- 1 file changed, 24 insertions(+), 21 deletions(-) diff --git a/CODEOWNERS b/CODEOWNERS index c0fc85cb8b89..b0d3b8b0d77b 100644 --- a/CODEOWNERS +++ b/CODEOWNERS @@ -8,49 +8,52 @@ # top-level repo folders /.github/ @loadams -/azure/ @awan-10 -/benchmarks/ @awan-10 @tjruwase +/azure/ @loadams +/benchmarks/ @guanhuawang @tjruwase /bin/ @loadams -/csrc/ @awan-10 +/csrc/ @tjruwase /deepspeed/ @loadams @tjruwase -/docker/ @awan-10 +/docker/ @loadams @guanhuawang /docs/ @loadams @tjruwase -/examples/ @awan-10 @tohtana +/examples/ @jomayeri @tohtana /op_builder/ @loadams @tjruwase @jomayeri -/release/ @loadams +/release/ @loadams @jomayeri /requirements/ @loadams -/scripts/ @awan-10 +/scripts/ @loadams @tjruwase /tests/ @tjruwase @loadams @tohtana # deepspeed /deepspeed/autotuning/ @loadams /deepspeed/checkpoint/ @tjruwase -/deepspeed/comm/ @awan-10 +/deepspeed/comm/ @guanhuawang /deepspeed/compression/ @tjruwase -/deepspeed/elasticity/ @awan-10 +/deepspeed/elasticity/ @tjruwase /deepspeed/launcher/ @loadams -/deepspeed/module_inject/ @awan-10 +/deepspeed/module_inject/ @hwchen2017 @loadams /deepspeed/moe/ @tohtana -/deepspeed/monitor/ @awan-10 +/deepspeed/monitor/ @tjruwase /deepspeed/nebula/ @tjruwase +/deepspeed/nvme/ @tjruwase @jomayeri /deepspeed/ops/ @tohtana /deepspeed/pipe/ @tohtana @loadams /deepspeed/profiling/ @loadams -/deepspeed/utils/ @tjruwase @awan-10 +/deepspeed/sequence/ @tohtana +/deepspeed/utils/ @tjruwase @tohtana # inference -/deepspeed/inference/ @awan-10 -/deepspeed/model_implementations/ @awan-10 +/deepspeed/inference/ @hwchen2017 @tohtana +/deepspeed/model_implementations/@tohtana @loadams # training /deepspeed/runtime/ @tjruwase @tohtana /deepspeed/runtime/activation_checkpointing/ @tjruwase /deepspeed/runtime/checkpoint_engine/ @tjruwase -/deepspeed/runtime/comm/ @awan-10 -/deepspeed/runtime/compression/ @awan-10 +/deepspeed/runtime/comm/ @guanhuawang +/deepspeed/runtime/compression/ @tjruwase /deepspeed/runtime/data_pipeline/ @tjruwase -/deepspeed/runtime/fp16/ @tjruwase -/deepspeed/runtime/fp16/onebit/ @awan-10 -/deepspeed/runtime/pipe/ @loadams -/deepspeed/runtime/swap_tensor/ @tjruwase -/deepspeed/runtime/zero/ @tjruwase +/deepspeed/runtime/domino/ @guanhuawang @hwchen2017 +/deepspeed/runtime/fp16/ @tjruwase @tohtana +/deepspeed/runtime/fp16/onebit/ @tjruwase +/deepspeed/runtime/pipe/ @loadams @tohtana +/deepspeed/runtime/swap_tensor/ @tjruwase @jomayeri +/deepspeed/runtime/zero/ @tjruwase @tohtana From f9e158a0f5cfa08b475cc1f086accffd8a77b92f Mon Sep 17 00:00:00 2001 From: Logan Adams <114770087+loadams@users.noreply.github.com> Date: Wed, 18 Dec 2024 09:53:17 -0800 Subject: [PATCH 661/754] Update version.txt after 0.16.2 release (#6893) **Auto-generated PR to update version.txt after a DeepSpeed release** Released version - 0.16.2 Author - @loadams Co-authored-by: loadams --- version.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/version.txt b/version.txt index 201a22c8fa5c..7eb3095a3295 100644 --- a/version.txt +++ b/version.txt @@ -1 +1 @@ -0.16.2 +0.16.3 From 4fd79205c6b85b47e00810143c69d342ce874ede Mon Sep 17 00:00:00 2001 From: Nir Sonnenschein Date: Thu, 19 Dec 2024 19:26:50 +0200 Subject: [PATCH 662/754] Allow to compile collective for PT>2.3 (#6899) Allow to compile collective for PT>2.3 commit re-uploaded due to github CI issue originally uploaded by @nelyahu --- deepspeed/comm/torch.py | 50 +++++++++++++++++++++++------------------ 1 file changed, 28 insertions(+), 22 deletions(-) diff --git a/deepspeed/comm/torch.py b/deepspeed/comm/torch.py index 988b74232bb9..5461ae18d1f0 100755 --- a/deepspeed/comm/torch.py +++ b/deepspeed/comm/torch.py @@ -20,6 +20,12 @@ DS_COMM_REDUCE_OFF = False +def disable_compiler_collective(func): + if required_torch_version(min_version=2.3): + return func + return compiler.disable(func) + + def build_shm_op(): builder = get_accelerator().create_op_builder("ShareMemCommBuilder") if builder is None or not deepspeed.ops.__compatible_ops__[builder.NAME]: @@ -114,7 +120,7 @@ def __init__(self, backend, timeout, init_method, rank=-1, world_size=-1, name=' self.shm_comm_op.initialize(self.get_world_size(), self.get_rank()) @classmethod - @compiler.disable + @disable_compiler_collective def get_all_gather_function(self): if hasattr(torch.distributed, "all_gather_into_tensor"): return torch.distributed.all_gather_into_tensor @@ -123,7 +129,7 @@ def get_all_gather_function(self): return None @classmethod - @compiler.disable + @disable_compiler_collective def get_reduce_scatter_function(self): if hasattr(torch.distributed, "reduce_scatter_tensor"): return torch.distributed.reduce_scatter_tensor @@ -146,7 +152,7 @@ def init_process_group(self, backend, timeout, init_method, rank, world_size): world_size=world_size) self.using_mpi = torch.distributed.get_backend() == 'mpi' - @compiler.disable + @disable_compiler_collective def all_reduce(self, tensor, op=torch.distributed.ReduceOp.SUM, group=None, async_op=False): op = self._reduce_op(op) return torch.distributed.all_reduce(tensor=tensor, op=op, group=group, async_op=async_op) @@ -158,7 +164,7 @@ def inference_all_reduce(self, tensor, op, group=None): else: return torch.ops.deepspeed.inference_all_reduce_(tensor) - @compiler.disable + @disable_compiler_collective def all_reduce_coalesced(self, tensors, op=torch.distributed.ReduceOp.SUM, group=None, async_op=False): """ proxy func to torch.distributed.all_reduce_coalesced, which is included in PyTorch 1.13 and above @@ -169,7 +175,7 @@ def all_reduce_coalesced(self, tensors, op=torch.distributed.ReduceOp.SUM, group op = self._reduce_op(op) return torch.distributed.all_reduce_coalesced(tensors=tensors, op=op, group=group, async_op=async_op) - @compiler.disable + @disable_compiler_collective def reduce(self, tensor, dst, op=ReduceOp.SUM, group=None, async_op=False): if DS_COMM_REDUCE_OFF: if int(os.getenv('RANK', '0')) == 0: @@ -177,7 +183,7 @@ def reduce(self, tensor, dst, op=ReduceOp.SUM, group=None, async_op=False): return Noop() return torch.distributed.reduce(tensor=tensor, dst=dst, op=self._reduce_op(op), group=group, async_op=async_op) - @compiler.disable + @disable_compiler_collective def reduce_scatter(self, output, input_list, op=ReduceOp.SUM, group=None, async_op=False): if DS_COMM_REDUCE_SCATTER_OFF: if int(os.getenv('RANK', '0')) == 0: @@ -190,7 +196,7 @@ def reduce_scatter(self, output, input_list, op=ReduceOp.SUM, group=None, async_ group=group, async_op=async_op) - @compiler.disable + @disable_compiler_collective def broadcast(self, tensor, src, group=None, async_op=False): if DS_COMM_BROADCAST_OFF: if int(os.getenv('RANK', '0')) == 0: @@ -199,7 +205,7 @@ def broadcast(self, tensor, src, group=None, async_op=False): else: return torch.distributed.broadcast(tensor=tensor, src=src, group=group, async_op=async_op) - @compiler.disable + @disable_compiler_collective def all_gather(self, tensor_list, tensor, group=None, async_op=False): if DS_COMM_ALL_GATHER_OFF: if int(os.getenv('RANK', '0')) == 0: @@ -208,7 +214,7 @@ def all_gather(self, tensor_list, tensor, group=None, async_op=False): else: return torch.distributed.all_gather(tensor_list=tensor_list, tensor=tensor, group=group, async_op=async_op) - @compiler.disable + @disable_compiler_collective def all_gather_into_tensor(self, output_tensor, input_tensor, group=None, async_op=False): if self.has_all_gather_into_tensor(): return self.all_gather_function(output_tensor=output_tensor, @@ -216,7 +222,7 @@ def all_gather_into_tensor(self, output_tensor, input_tensor, group=None, async_ group=group, async_op=async_op) - @compiler.disable + @disable_compiler_collective def all_gather_base(self, output_tensor, input_tensor, group=None, async_op=False): if DS_COMM_ALL_GATHER_OFF: if int(os.getenv('RANK', '0')) == 0: @@ -234,7 +240,7 @@ def all_gather_base(self, output_tensor, input_tensor, group=None, async_op=Fals "please consider upgrading your pytorch installation.") pass - @compiler.disable + @disable_compiler_collective def all_gather_coalesced(self, output_tensors, input_tensors, group=None, async_op=False): """""" assert len(output_tensors) == len(input_tensors), "" @@ -258,7 +264,7 @@ def all_gather_coalesced(self, output_tensors, input_tensors, group=None, async_ else: reqs[-1].wait() - @compiler.disable + @disable_compiler_collective def reduce_scatter_tensor(self, output_tensor, input_tensor, op=ReduceOp.SUM, group=None, async_op=False): if self.has_reduce_scatter_tensor(): return self.reduce_scatter_function(output_tensor, @@ -272,7 +278,7 @@ def reduce_scatter_tensor(self, output_tensor, input_tensor, op=ReduceOp.SUM, gr "please consider upgrading your pytorch installation.") pass - @compiler.disable + @disable_compiler_collective def all_to_all_single(self, output, input, @@ -287,27 +293,27 @@ def all_to_all_single(self, group=group, async_op=async_op) - @compiler.disable + @disable_compiler_collective def all_to_all(self, output_tensor_list, input_tensor_list, group=None, async_op=False): return torch.distributed.all_to_all(output_tensor_list, input_tensor_list, group=group, async_op=async_op) - @compiler.disable + @disable_compiler_collective def send(self, tensor, dst, group=None, tag=0): return torch.distributed.send(tensor=tensor, dst=dst, group=group, tag=tag) - @compiler.disable + @disable_compiler_collective def recv(self, tensor, src=None, group=None, tag=0): return torch.distributed.recv(tensor=tensor, src=src, group=group, tag=tag) - @compiler.disable + @disable_compiler_collective def isend(self, tensor, dst, group=None, tag=0): return torch.distributed.isend(tensor=tensor, dst=dst, group=group, tag=tag) - @compiler.disable + @disable_compiler_collective def irecv(self, tensor, src=None, group=None, tag=0): return torch.distributed.irecv(tensor=tensor, src=src, group=group, tag=tag) - @compiler.disable + @disable_compiler_collective def gather(self, tensor, gather_list=None, dst=0, group=None, async_op=False): return torch.distributed.gather(tensor=tensor, gather_list=gather_list, @@ -315,7 +321,7 @@ def gather(self, tensor, gather_list=None, dst=0, group=None, async_op=False): group=group, async_op=async_op) - @compiler.disable + @disable_compiler_collective def scatter(self, tensor, scatter_list=None, src=0, group=None, async_op=False): return torch.distributed.scatter(tensor=tensor, scatter_list=scatter_list, @@ -323,13 +329,13 @@ def scatter(self, tensor, scatter_list=None, src=0, group=None, async_op=False): group=group, async_op=async_op) - @compiler.disable + @disable_compiler_collective def barrier(self, group=torch.distributed.GroupMember.WORLD, async_op=False, device_ids=None): if group is None: group = torch.distributed.GroupMember.WORLD return torch.distributed.barrier(group=group, async_op=async_op, device_ids=device_ids) - @compiler.disable + @disable_compiler_collective def monitored_barrier(self, group=torch.distributed.GroupMember.WORLD, timeout=None, wait_all_ranks=False): if group is None: group = torch.distributed.GroupMember.WORLD From 00ea0c46c2296db158d10497602f9832c4445d84 Mon Sep 17 00:00:00 2001 From: Nadav Elyahu <88962733+nelyahu@users.noreply.github.com> Date: Fri, 20 Dec 2024 02:54:45 +0200 Subject: [PATCH 663/754] Zero2: avoid graph breaks in torch.compile by using param_idx (#6803) inside reduce_independent_p_g_buckets_and_remove_grads and in reduce_ipg_grads which are being executed during the BWD hook in zero2, the model param is being stored inside params_in_ipg_bucket. torch.compile has hard time tracing parameters. By using the param's static index inside the group the same logic can be maintain with less complexity. --------- Co-authored-by: Olatunji Ruwase Co-authored-by: Logan Adams <114770087+loadams@users.noreply.github.com> Co-authored-by: Logan Adams --- deepspeed/runtime/zero/stage_1_and_2.py | 9 ++++++--- tests/unit/moe/test_moe.py | 3 ++- 2 files changed, 8 insertions(+), 4 deletions(-) diff --git a/deepspeed/runtime/zero/stage_1_and_2.py b/deepspeed/runtime/zero/stage_1_and_2.py index 7ac89a233808..ecb2a527f870 100755 --- a/deepspeed/runtime/zero/stage_1_and_2.py +++ b/deepspeed/runtime/zero/stage_1_and_2.py @@ -310,6 +310,7 @@ def __init__(self, for param in param_group['params']: if param.requires_grad: param.grad_accum = None + param.param_idx_in_group = len(trainable_parameters) trainable_parameters.append(param) self.bit16_groups.append(trainable_parameters) @@ -961,7 +962,7 @@ def reduce_independent_p_g_buckets_and_remove_grads(self, param, i): assert grad_reduc is not None, f"rank {dist.get_rank()} - Invalid to reduce Param {param_id} with None gradient" self.grads_in_ipg_bucket.append(grad_reduc) - self.params_in_ipg_bucket.append((i, param, param_id)) + self.params_in_ipg_bucket.append((i, param.param_idx_in_group, param_id)) #make sure the average tensor function knows how to average the gradients if is_moe_param(param): @@ -1067,7 +1068,8 @@ def average_tensor(self, tensor): process_group = self.dp_process_group # count = 0 - for i, param, param_id in self.params_in_ipg_bucket: + for i, param_idx_in_group, param_id in self.params_in_ipg_bucket: + param = self.bit16_groups[i][param_idx_in_group] process_group = self.dp_process_group @@ -1383,7 +1385,8 @@ def reduce_ipg_grads(self): stream = get_accelerator().current_stream() with get_accelerator().stream(stream): - for _, param, param_id in self.params_in_ipg_bucket: + for group_idx, param_idx_in_group, param_id in self.params_in_ipg_bucket: + param = self.bit16_groups[group_idx][param_idx_in_group] assert self.params_already_reduced[param_id] == False, \ f"The parameter {param_id} has already been reduced. \ diff --git a/tests/unit/moe/test_moe.py b/tests/unit/moe/test_moe.py index 9ee546437f6c..c67a907c6785 100644 --- a/tests/unit/moe/test_moe.py +++ b/tests/unit/moe/test_moe.py @@ -93,7 +93,8 @@ def strict_average_tensor(tensor): process_group = optimizer.dp_process_group curr_size = 0 pg_offsets = [] - for i, param, param_id in optimizer.params_in_ipg_bucket: + for i, param_idx, param_id in optimizer.params_in_ipg_bucket: + param = optimizer.bit16_groups[i][param_idx] process_group = optimizer.dp_process_group if optimizer.ipg_bucket_has_moe_params: process_group = optimizer.expert_dp_process_group[param.group_name] if is_moe_param( From eea5304807c6a04d0f2c55cb935ec295235d9b54 Mon Sep 17 00:00:00 2001 From: Nadav Elyahu <88962733+nelyahu@users.noreply.github.com> Date: Fri, 20 Dec 2024 07:13:46 +0200 Subject: [PATCH 664/754] hpu_accelerator: use torch.use_deterministic_algorithms (#6897) formal API instead of hpu.setDeterministic --- accelerator/hpu_accelerator.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/accelerator/hpu_accelerator.py b/accelerator/hpu_accelerator.py index 723a66e4c6fb..b46351f8ca43 100644 --- a/accelerator/hpu_accelerator.py +++ b/accelerator/hpu_accelerator.py @@ -21,8 +21,8 @@ def __init__(self): self.apply_hpu_workarounds() try: import habana_frameworks.torch.hpu as hpu - hpu.setDeterministic(True) self.hpu = hpu + torch.use_deterministic_algorithms(True) except ImportError as e: raise ValueError( f"HPU_Accelerator requires habana_frameworks.torch.hpu, which is not installed on this system.") From 85cc5f9bb3f0175a2d13ea1ed65bf7d202b7f0d9 Mon Sep 17 00:00:00 2001 From: Hongwei Chen <33092912+hwchen2017@users.noreply.github.com> Date: Thu, 26 Dec 2024 09:12:04 -0800 Subject: [PATCH 665/754] Fix error caused by all_reduce call in domino (#6880) Fix #6851 Initialize communication backend to fix error caused by all_reduce call in the Domino transformer layer. Verified correctness in local test. --------- Co-authored-by: Olatunji Ruwase Co-authored-by: Logan Adams <114770087+loadams@users.noreply.github.com> --- deepspeed/runtime/domino/transformer.py | 21 ++++++++++----------- 1 file changed, 10 insertions(+), 11 deletions(-) diff --git a/deepspeed/runtime/domino/transformer.py b/deepspeed/runtime/domino/transformer.py index 8eb95e49c29d..88c5494c8147 100644 --- a/deepspeed/runtime/domino/transformer.py +++ b/deepspeed/runtime/domino/transformer.py @@ -6,8 +6,7 @@ import torch import torch.nn.functional as F from torch.nn.parameter import Parameter -import deepspeed -from deepspeed import comm as dist +import deepspeed.comm as dist from deepspeed.accelerator import get_accelerator @@ -97,7 +96,7 @@ def backward(ctx, grad_output): return grad_output # Async All-reduce. - handle = deepspeed.comm.all_reduce(grad_output, group=ctx.mpu.get_tensor_model_parallel_group(), async_op=True) + handle = dist.all_reduce(grad_output, group=ctx.mpu.get_tensor_model_parallel_group(), async_op=True) ctx.handle_dic[ctx.h_id] = handle return None, grad_output, None, None @@ -249,6 +248,10 @@ def __init__(self, output_bias=None): super(DominoTransformerLayer, self).__init__() + if not dist.is_initialized(): + dist.init_distributed() + assert dist.is_initialized(), "deepspeed.comm is not initialized!" + self.llama_model = config.llama_model self.layer_number = layer_number self.layer_type = layer_type @@ -358,18 +361,14 @@ def forward(self, hidden_states, attention_mask, rotary_pos_emb=None): layernorm_output0, attention_mask, rotary_pos_emb=rotary_pos_emb) - handle0 = deepspeed.comm.all_reduce(attention_output0, - group=self.mpu.get_tensor_model_parallel_group(), - async_op=True) + handle0 = dist.all_reduce(attention_output0, group=self.mpu.get_tensor_model_parallel_group(), async_op=True) attention_output1, attention_bias1 = \ self.self_attention( layernorm_output1, attention_mask, rotary_pos_emb=rotary_pos_emb) - handle1 = deepspeed.comm.all_reduce(attention_output1, - group=self.mpu.get_tensor_model_parallel_group(), - async_op=True) + handle1 = dist.all_reduce(attention_output1, group=self.mpu.get_tensor_model_parallel_group(), async_op=True) handle0.wait() # Residual0 connection. @@ -413,7 +412,7 @@ def forward(self, hidden_states, attention_mask, rotary_pos_emb=None): output0 = output0 + bias_c output0 = self.mlp_activation_func(output0) output0 = torch.matmul(output0, self.weight_r.t()) - handle2 = deepspeed.comm.all_reduce(output0, group=self.mpu.get_tensor_model_parallel_group(), async_op=True) + handle2 = dist.all_reduce(output0, group=self.mpu.get_tensor_model_parallel_group(), async_op=True) handle1.wait() @@ -425,7 +424,7 @@ def forward(self, hidden_states, attention_mask, rotary_pos_emb=None): if bias_c is not None: output1 = output1 + bias_c output1 = torch.matmul(output1, self.weight_r.t()) - deepspeed.comm.all_reduce(output1, group=self.mpu.get_tensor_model_parallel_group()) + dist.all_reduce(output1, group=self.mpu.get_tensor_model_parallel_group()) handle2.wait() From cc03c76d57f41752d8cfb84c2e45b8e0da8083da Mon Sep 17 00:00:00 2001 From: Raza Sikander Date: Fri, 27 Dec 2024 01:37:28 +0530 Subject: [PATCH 666/754] Update Gaudi2 jobs to latest 1.19 build (#6905) Co-authored-by: Logan Adams <114770087+loadams@users.noreply.github.com> --- .github/workflows/hpu-gaudi2-nightly.yml | 2 +- .github/workflows/hpu-gaudi2.yml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/hpu-gaudi2-nightly.yml b/.github/workflows/hpu-gaudi2-nightly.yml index 5c5caff1ebb0..c0576360cd61 100644 --- a/.github/workflows/hpu-gaudi2-nightly.yml +++ b/.github/workflows/hpu-gaudi2-nightly.yml @@ -21,7 +21,7 @@ jobs: # The type of runner that the job will run on runs-on: [self-hosted, intel, gaudi2] container: - image: vault.habana.ai/gaudi-docker/1.18.0/ubuntu22.04/habanalabs/pytorch-installer-2.4.0:latest + image: vault.habana.ai/gaudi-docker/1.19.0/ubuntu22.04/habanalabs/pytorch-installer-2.5.1:latest ports: - 80 options: --runtime=habana -e HABANA_VISIBLE_DEVICES=all -e OMPI_MCA_btl_vader_single_copy_mechanism=none --cap-add=sys_nice diff --git a/.github/workflows/hpu-gaudi2.yml b/.github/workflows/hpu-gaudi2.yml index a06f871b7c56..b8b6f3cb5502 100644 --- a/.github/workflows/hpu-gaudi2.yml +++ b/.github/workflows/hpu-gaudi2.yml @@ -39,7 +39,7 @@ jobs: # The type of runner that the job will run on runs-on: [self-hosted, intel, gaudi2] container: - image: vault.habana.ai/gaudi-docker/1.18.0/ubuntu22.04/habanalabs/pytorch-installer-2.4.0:latest + image: vault.habana.ai/gaudi-docker/1.19.0/ubuntu22.04/habanalabs/pytorch-installer-2.5.1:latest ports: - 80 options: --runtime=habana -e HABANA_VISIBLE_DEVICES=all -e OMPI_MCA_btl_vader_single_copy_mechanism=none --cap-add=sys_nice From 3573858e7ce2c723b8c43231c6c6b0cf97dca2fc Mon Sep 17 00:00:00 2001 From: Nir Sonnenschein Date: Mon, 30 Dec 2024 20:53:41 +0200 Subject: [PATCH 667/754] Change compile for pipeline module torch.compile (#6478) We have encountered and issue with torch.compile and the pipeline module. modifying a member of the module (micro_offset) during the forward function will cause torch compile to restart the analysis and treat the module as dynamic. In order to bypass this issue without significantly changing the way the pipeline module works we propose to compile only the layers in the pipeline module instead of the forward function of pipeline module. this will bypass the issue and should still give most of the benefit of torch compiling the pipeline module while avoiding the issue. --------- Co-authored-by: Logan Adams <114770087+loadams@users.noreply.github.com> --- deepspeed/runtime/pipe/module.py | 8 ++++++++ tests/unit/pipe/test_pipe_module.py | 8 ++++++-- 2 files changed, 14 insertions(+), 2 deletions(-) diff --git a/deepspeed/runtime/pipe/module.py b/deepspeed/runtime/pipe/module.py index 31fec30be788..9fbd91f750a9 100644 --- a/deepspeed/runtime/pipe/module.py +++ b/deepspeed/runtime/pipe/module.py @@ -662,3 +662,11 @@ def get_additional_losses(self): Return a dictionary of {"loss name": loss_value} or None if no additional losses. """ return None + + def compile(self, *args, **kwargs): + for idx, layer in enumerate(self.forward_funcs): + if isinstance(layer, nn.Module): + layer.compile(*args, **kwargs) + else: + new_layer = torch.compile(layer, *args, **kwargs) + self.forward_funcs[idx] = new_layer diff --git a/tests/unit/pipe/test_pipe_module.py b/tests/unit/pipe/test_pipe_module.py index 05c6a82ef55a..2a8a4b9b7d82 100644 --- a/tests/unit/pipe/test_pipe_module.py +++ b/tests/unit/pipe/test_pipe_module.py @@ -60,9 +60,12 @@ def batch_input(): class TestPipeModuleSequential(DistributedTest): world_size = 2 + # needs to be set for torch.compile: running torch.compile with daemonic process causes an error + non_daemonic_procs = True @pytest.mark.parametrize("activation_checkpoints", [False, True]) - def test(self, sequential_model, simple_config, batch_input, activation_checkpoints): + @pytest.mark.parametrize("use_compile", [False, True]) + def test(self, sequential_model, simple_config, batch_input, activation_checkpoints, use_compile): base_model = copy.deepcopy(sequential_model) base_input = batch_input.clone().detach() base_output = base_model(base_input) @@ -71,7 +74,8 @@ def test(self, sequential_model, simple_config, batch_input, activation_checkpoi pipe_model = copy.deepcopy(sequential_model) pipe_model = PipelineModule(layers=pipe_model, num_stages=2) - + if (use_compile): + pipe_model.compile() # Ensure all parameters are accounted for. my_params = sum(p.numel() for p in pipe_model.parameters()) total_pipe_params = torch.LongTensor([my_params]).to(get_accelerator().device_name()) From 456c9ac67975da698e44dfd4f90c4f7b867d08bd Mon Sep 17 00:00:00 2001 From: Max Kovalenko Date: Fri, 3 Jan 2025 17:48:24 +0200 Subject: [PATCH 668/754] Stage3: Use new torch grad accumulation hooks API (#6773) * This commit addresses a Deepspeed issue [#6718](https://github.com/microsoft/DeepSpeed/issues/6718) * The existing code has been using the grad_acc node hook to reduce params grads. The constructs such as `param.data = replicated_tensor.data` used in `allgather_params(..)` are compiled into `param.set()` causing the hook assigned to the grad_acc node not being called. * Starting from PyTorch 2.1 there is a new and robust hook API on a param itself: `param.register_post_accumulate_grad_hook(..)` * This commit will make use of the proper API depending on the PyTorch version * It will also disable compile for PyTorch versions < 2.1 --------- Co-authored-by: Logan Adams <114770087+loadams@users.noreply.github.com> Co-authored-by: Masahiro Tanaka <81312776+tohtana@users.noreply.github.com> --- deepspeed/runtime/compiler.py | 3 ++- deepspeed/runtime/zero/stage3.py | 7 ++----- deepspeed/utils/torch.py | 9 +++++++++ 3 files changed, 13 insertions(+), 6 deletions(-) diff --git a/deepspeed/runtime/compiler.py b/deepspeed/runtime/compiler.py index fa9220f4fcd0..be778b83f8bb 100644 --- a/deepspeed/runtime/compiler.py +++ b/deepspeed/runtime/compiler.py @@ -4,6 +4,7 @@ # DeepSpeed Team import torch +from deepspeed.utils.torch import required_torch_version try: from torch.compiler import is_compiling as torch_is_compiling @@ -16,7 +17,7 @@ def is_compile_supported(): - return hasattr(torch, "compiler") and hasattr(torch.nn.Module, "compile") + return required_torch_version(min_version=2.1) def disable(func): diff --git a/deepspeed/runtime/zero/stage3.py b/deepspeed/runtime/zero/stage3.py index 459cffce52c8..28f91cb9b3ab 100644 --- a/deepspeed/runtime/zero/stage3.py +++ b/deepspeed/runtime/zero/stage3.py @@ -16,6 +16,7 @@ from torch._utils import _flatten_dense_tensors, _unflatten_dense_tensors from deepspeed.runtime.base_optimizer import ZeROOptimizer from deepspeed.utils import logger +from deepspeed.utils.torch import register_grad_hook from deepspeed.runtime.fp16.loss_scaler import CreateLossScaler from deepspeed.runtime.comm.coalesced_collectives import reduce_scatter_coalesced, all_to_all_quant_reduce, all_to_all_loco_quant_reduce from deepspeed.runtime.utils import inf, is_model_parallel_parameter, get_only_unique_item @@ -1159,7 +1160,6 @@ def overlapping_partition_gradients_reduce_epilogue(self): def create_reduce_and_remove_grad_hooks(self): print_rank_0(f'[Begin] Create gradient reduction hooks') - self.grad_accs = [] self.leaf_parameters = defaultdict(list) for i, param_group in enumerate(self.fp16_groups): for param in param_group: @@ -1172,15 +1172,12 @@ def create_reduce_and_remove_grad_hooks(self): #print(f"After all gather {param.device}, {param.shape}") def wrapper(param): - param_tmp = param.expand_as(param) - grad_acc = param_tmp.grad_fn.next_functions[0][0] @instrument_w_nvtx def reduce_partition_and_remove_grads(*notneeded): self.reduce_ready_partitions_and_remove_grads(param) - self._grad_acc_hooks.append(grad_acc.register_hook(reduce_partition_and_remove_grads)) - self.grad_accs.append(grad_acc) + self._grad_acc_hooks.append(register_grad_hook(param, reduce_partition_and_remove_grads)) #print(f"param grad fn {param.expand_as(param).grad_fn}") if z3_leaf_parameter(param): diff --git a/deepspeed/utils/torch.py b/deepspeed/utils/torch.py index eb22d3561035..1d32775fe64a 100644 --- a/deepspeed/utils/torch.py +++ b/deepspeed/utils/torch.py @@ -20,3 +20,12 @@ def required_torch_version(min_version=None, max_version=None): return False return True + + +def register_grad_hook(param, hook): + if required_torch_version(min_version=2.1): + return param.register_post_accumulate_grad_hook(hook) + else: + param_tmp = param.expand_as(param) + grad_acc = param_tmp.grad_fn.next_functions[0][0] + return grad_acc.register_hook(hook) From a8ede3a9df556a5d6beb22a4bf38fa9852b3bada Mon Sep 17 00:00:00 2001 From: Logan Adams <114770087+loadams@users.noreply.github.com> Date: Fri, 3 Jan 2025 08:25:50 -0800 Subject: [PATCH 669/754] Cleanup ops/transformer/inference tests (#6830) --- tests/unit/ops/transformer/inference/test_bias_add.py | 2 -- tests/unit/ops/transformer/inference/test_bias_gelu.py | 4 ++-- tests/unit/ops/transformer/inference/test_matmul.py | 2 -- 3 files changed, 2 insertions(+), 6 deletions(-) diff --git a/tests/unit/ops/transformer/inference/test_bias_add.py b/tests/unit/ops/transformer/inference/test_bias_add.py index f25bbc1be692..eb283924f73c 100644 --- a/tests/unit/ops/transformer/inference/test_bias_add.py +++ b/tests/unit/ops/transformer/inference/test_bias_add.py @@ -15,8 +15,6 @@ if not deepspeed.ops.__compatible_ops__[InferenceBuilder.NAME]: pytest.skip("Inference ops are not available on this system", allow_module_level=True) -torch_minor_version = None - def run_bias_add_reference(activations, bias): return activations + bias diff --git a/tests/unit/ops/transformer/inference/test_bias_gelu.py b/tests/unit/ops/transformer/inference/test_bias_gelu.py index e3a3bad63961..f0a09245e890 100644 --- a/tests/unit/ops/transformer/inference/test_bias_gelu.py +++ b/tests/unit/ops/transformer/inference/test_bias_gelu.py @@ -10,8 +10,8 @@ from deepspeed.ops.op_builder import InferenceBuilder from deepspeed.ops.transformer import DeepSpeedInferenceConfig from deepspeed.ops.transformer.inference.op_binding.bias_gelu import BiasGeluOp +from deepspeed.utils.torch import required_torch_version from .inference_test_utils import allclose, get_dtypes -from packaging import version as pkg_version if not deepspeed.ops.__compatible_ops__[InferenceBuilder.NAME]: pytest.skip("Inference ops are not available on this system", allow_module_level=True) @@ -34,7 +34,7 @@ def run_bias_gelu_ds(activations, bias): @pytest.mark.parametrize("channels", [512, 1232, 4096]) @pytest.mark.parametrize("dtype", get_dtypes()) def test_bias_gelu(batch, sequence, channels, dtype): - if pkg_version.parse(torch.__version__) < pkg_version.parse("1.12"): + if not required_torch_version(min_version=1.12): pytest.skip("gelu implementation matches only after torch 1.12") activations_ds = torch.randn((batch, sequence, channels), dtype=dtype, device=get_accelerator().device_name()) diff --git a/tests/unit/ops/transformer/inference/test_matmul.py b/tests/unit/ops/transformer/inference/test_matmul.py index 2ab195ee0115..6f5173bbc827 100644 --- a/tests/unit/ops/transformer/inference/test_matmul.py +++ b/tests/unit/ops/transformer/inference/test_matmul.py @@ -11,8 +11,6 @@ if not deepspeed.ops.__compatible_ops__[InferenceBuilder.NAME]: pytest.skip("Inference ops are not available on this system", allow_module_level=True) -inference_module = None - def allclose(x, y): assert x.dtype == y.dtype From 0dbbb70b99f7f251996128115a53c1c8397efa8f Mon Sep 17 00:00:00 2001 From: Quentin Anthony Date: Fri, 3 Jan 2025 21:57:49 -0800 Subject: [PATCH 670/754] Fix `checkpointable_layers` Logic (#6881) **Problem** There's an edge-case in DeepSpeed, where if all three of the following are true: 1. Deepspeed activation checkpointing is applied 2. The user passes `checkpointable_layers` (e.g. https://github.com/EleutherAI/gpt-neox/blob/f5325805678c2b9e35aae4528283e0132c5f5bbc/megatron/model/gpt2_model.py#L175) 3. The user's model class contains `GPT2ModelPipe` or GPTModelPipe` Then the `checkpointable_layers` will not be activation checkpointed. **Reason** This is because in the current logic, `_is_checkpointable` will short-circuit to just return layers matching `ParallelTransformerLayerPipe` in the case of `self.__class__.__name__ in ('GPTModelPipe', 'GPT2ModelPipe')`. See https://github.com/microsoft/DeepSpeed/blob/da771ed42e41a44d5047813ca4672f1cfe9d1731/deepspeed/runtime/pipe/module.py#L653 **Proposed Fixes** I think that `checkpointable_layers` should always be checked for, and added logic to this effect. I also found the documentation for `checkpointable_layers` confusing and contradictory, so I updated the docstring. Lastly, I added a unit test for `checkpointable_layers`. --------- Co-authored-by: Logan Adams <114770087+loadams@users.noreply.github.com> --- deepspeed/runtime/pipe/module.py | 14 +++++- .../test_activation_checkpointing.py | 50 +++++++++++++++++++ 2 files changed, 62 insertions(+), 2 deletions(-) diff --git a/deepspeed/runtime/pipe/module.py b/deepspeed/runtime/pipe/module.py index 9fbd91f750a9..49fa2807c355 100644 --- a/deepspeed/runtime/pipe/module.py +++ b/deepspeed/runtime/pipe/module.py @@ -116,7 +116,9 @@ def forward(self, inputs): partition_method (str, optional): The method upon which the layers are partitioned. Defaults to 'parameters'. activation_checkpoint_interval (int, optional): The granularity activation checkpointing in terms of number of layers. 0 disables activation checkpointing. activation_checkpoint_func (callable, optional): The function to use for activation checkpointing. Defaults to ``deepspeed.checkpointing.checkpoint``. - checkpointable_layers(list, optional): Checkpointable layers may not be checkpointed. Defaults to None which does not additional filtering. + checkpointable_layers (list[str], optional): List of layer class names that are eligible for checkpointing. For GPT models, + ParallelTransformerLayerPipe is always checkpointed regardless of this list. If None, all layers with parameters are + considered checkpointable. Defaults to None. dynamic_shape: Allows dynamic shapes of inputs. This might have a performance impact. """ @@ -650,9 +652,17 @@ def _is_checkpointable(self, funcs): # because only non_reentrant_checkpoint can accept inputs with requires_grad=False # otherwise, the backward of the embedding layer won't receive gradients. if self.__class__.__name__ in ('GPTModelPipe', 'GPT2ModelPipe'): - return all('ParallelTransformerLayerPipe' in f.__class__.__name__ for f in funcs) + # For GPT models, checkpoint both transformer layers and any additional + # layers specified in checkpointable_layers (if provided) + return all('ParallelTransformerLayerPipe' in f.__class__.__name__ or ( + self.checkpointable_layers is not None and f.__class__.__name__ in self.checkpointable_layers) + for f in funcs) + if self.checkpointable_layers is not None: + # For non-GPT models, only checkpoint layers specified in checkpointable_layers return all(f.__class__.__name__ in self.checkpointable_layers for f in funcs) + + # Default behavior: checkpoint any layer that has parameters params = [f.parameters() for f in funcs if isinstance(f, torch.nn.Module)] return any(len(list(p)) > 0 for p in params) diff --git a/tests/unit/runtime/activation_checkpointing/test_activation_checkpointing.py b/tests/unit/runtime/activation_checkpointing/test_activation_checkpointing.py index 22a61003b31e..dd3bcd7fb6bd 100644 --- a/tests/unit/runtime/activation_checkpointing/test_activation_checkpointing.py +++ b/tests/unit/runtime/activation_checkpointing/test_activation_checkpointing.py @@ -8,6 +8,7 @@ import pytest import torch import deepspeed +from deepspeed.pipe import PipelineModule, LayerSpec from deepspeed.accelerator import get_accelerator from copy import deepcopy from unit.common import DistributedTest @@ -259,3 +260,52 @@ def test_ckpt_non_tensor_output_ordering(self, non_tensor_output): else: ordering += [torch.is_tensor(non_tensor_output)] _test_activation_checkpoint_ordering(module, ordering, inputs) + + +class TestCheckpointableLayersConfig(DistributedTest): + world_size = 1 + + def test_gpt2_checkpointable_layers(self): + if get_accelerator().device_name() == "cpu": + pytest.skip("CPU accelerator does not support this test yet") + + # Create a simple topology for testing + from deepspeed.runtime.pipe.topology import PipeModelDataParallelTopology + topo = PipeModelDataParallelTopology(num_pp=1, num_mp=1, num_dp=1) + + # Create test classes that we want to checkpoint + class TestTransformerLayer(torch.nn.Module): + + def forward(self, x): + return x + + class ParallelTransformerLayerPipe(TestTransformerLayer): + pass + + class GMLPBlock(TestTransformerLayer): + pass + + # Create a mock GPT2 model with different layer types + class TestGPT2ModelPipe(PipelineModule): + + def __init__(self): + self.layers_spec = [ + LayerSpec(ParallelTransformerLayerPipe), + LayerSpec(GMLPBlock), + LayerSpec(torch.nn.Linear, 10, 10), # Should not be checkpointed + ] + + super().__init__(layers=self.layers_spec, + topology=topo, + checkpointable_layers=["GMLPBlock", "ParallelTransformerLayerPipe"]) + + model = TestGPT2ModelPipe() + model.to(get_accelerator().device_name()) + + # Build layers manually for testing + layers = [spec.build() for spec in model.layers_spec] + + # Test that _is_checkpointable returns correct values + assert model._is_checkpointable([layers[0]]) == True # ParallelTransformerLayerPipe + assert model._is_checkpointable([layers[1]]) == True # GMLPBlock + assert model._is_checkpointable([layers[2]]) == False # Linear layer From f8c9f314ffe7eddfbd3645a94143301e610f68de Mon Sep 17 00:00:00 2001 From: hj-wei Date: Tue, 7 Jan 2025 01:38:19 +0800 Subject: [PATCH 671/754] [BUG FIX]:fix get torch.version.cuda error when cuda is None in rocm (#6909) HI, I found some error when using deepspeed with rocm-torch ``` torch_cuda_version = ".".join(torch.version.cuda.split('.')[:2]) ``` will raise an AttributeError when torch.version.cuda is None. This occurs because the CUDA version in rocm-torch/version.py is set to always be None, leading to potential runtime errors in environments where ROCm is being used. --------- Co-authored-by: Logan Adams <114770087+loadams@users.noreply.github.com> --- op_builder/builder.py | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/op_builder/builder.py b/op_builder/builder.py index 461281d4a569..ab26054bda7d 100644 --- a/op_builder/builder.py +++ b/op_builder/builder.py @@ -415,10 +415,11 @@ def cpu_arch(self): return '-mcpu=native' return '-march=native' - def is_cuda_enable(self): + def get_cuda_compile_flag(self): try: - assert_no_cuda_mismatch(self.name) - return '-D__ENABLE_CUDA__' + if not self.is_rocm_pytorch(): + assert_no_cuda_mismatch(self.name) + return "-D__ENABLE_CUDA__" except MissingCUDAException: print(f"{WARNING} {self.name} cuda is missing or is incompatible with installed torch, " "only cpu ops can be compiled!") @@ -839,7 +840,7 @@ def cxx_args(self): CPU_ARCH = self.cpu_arch() SIMD_WIDTH = self.simd_width() - CUDA_ENABLE = self.is_cuda_enable() + CUDA_ENABLE = self.get_cuda_compile_flag() args += [ CPU_ARCH, '-fopenmp', From c5e48f49d8368216b4f99ef4023d2855f1ce3983 Mon Sep 17 00:00:00 2001 From: Omar Elayan <142979319+oelayan7@users.noreply.github.com> Date: Mon, 6 Jan 2025 20:54:57 +0200 Subject: [PATCH 672/754] Add fp8_gemm fallback for non-triton systems (#6916) - Removed try/except from __init__ file in fp_quantizer and added a single entry point instead - Renamed file fp8_gemm to fp8_gemm_triton, and the function matmul_fp8 to matmul_fp8_triton - Added a new entry point fp8_gemm with matmul_fp8 inside, and if the system supports triton it calls the triton implementation and if not it calls the fallback Co-authored-by: Logan Adams <114770087+loadams@users.noreply.github.com> --- deepspeed/ops/fp_quantizer/__init__.py | 7 +- deepspeed/ops/fp_quantizer/fp8_gemm.py | 163 +---------------- deepspeed/ops/fp_quantizer/fp8_gemm_triton.py | 171 ++++++++++++++++++ tests/unit/ops/fp_quantizer/test_fp8_gemm.py | 16 +- 4 files changed, 189 insertions(+), 168 deletions(-) create mode 100644 deepspeed/ops/fp_quantizer/fp8_gemm_triton.py diff --git a/deepspeed/ops/fp_quantizer/__init__.py b/deepspeed/ops/fp_quantizer/__init__.py index 51377bc6092c..f9cf23373c26 100644 --- a/deepspeed/ops/fp_quantizer/__init__.py +++ b/deepspeed/ops/fp_quantizer/__init__.py @@ -4,9 +4,4 @@ # DeepSpeed Team from .quantize import FP_Quantize, Quantizer - -try: - import triton - from .fp8_gemm import matmul_fp8 -except ImportError: - pass +from .fp8_gemm import matmul_fp8 diff --git a/deepspeed/ops/fp_quantizer/fp8_gemm.py b/deepspeed/ops/fp_quantizer/fp8_gemm.py index 55504e3af8c9..db4fa5ae2c92 100644 --- a/deepspeed/ops/fp_quantizer/fp8_gemm.py +++ b/deepspeed/ops/fp_quantizer/fp8_gemm.py @@ -11,161 +11,18 @@ ################################### import torch -import triton -import triton.language as tl -@triton.jit -def matmul_kernel_fp8_bf16(inp_ptr, weight_ptr, out_ptr, scale_ptr, M, N, K, stride_am, stride_ak, stride_bk, - stride_bn, stride_cm, stride_cn, BLOCK_SIZE_M: tl.constexpr, BLOCK_SIZE_N: tl.constexpr, - BLOCK_SIZE_K: tl.constexpr, GROUP_SIZE_M: tl.constexpr, - quantization_group_size: tl.constexpr): - pid = tl.program_id(axis=0) - num_pid_m = tl.cdiv(M, BLOCK_SIZE_M) - num_pid_n = tl.cdiv(N, BLOCK_SIZE_N) - num_pid_in_group = GROUP_SIZE_M * num_pid_n - group_id = pid // num_pid_in_group - first_pid_m = group_id * GROUP_SIZE_M - group_size_m = min(num_pid_m - first_pid_m, GROUP_SIZE_M) - pid_m = first_pid_m + ((pid % num_pid_in_group) % group_size_m) - pid_n = (pid % num_pid_in_group) // group_size_m +def matmul_fp8(inp, weight, scale, quantization_group_size, quantizer): + from deepspeed import get_accelerator - offs_am = (pid_m * BLOCK_SIZE_M + tl.arange(0, BLOCK_SIZE_M)) % M - offs_bn = (pid_n * BLOCK_SIZE_N + tl.arange(0, BLOCK_SIZE_N)) % N - offs_k = tl.arange(0, BLOCK_SIZE_K) + if not get_accelerator().is_triton_supported(): + return matmul_fp8_fallback(inp, weight, scale, quantization_group_size, quantizer) + else: + # Import dynamically to prevent failures on systems without triton. + from .fp8_gemm_triton import matmul_fp8_triton + return matmul_fp8_triton(inp, weight, scale, quantization_group_size) - inp_data = inp_ptr + (offs_am[:, None] * stride_am + offs_k[None, :] * stride_ak) - weight_data = weight_ptr + (offs_k[:, None] * stride_bk + offs_bn[None, :] * stride_bn) - weight_ptrs_offset = offs_k[:, None] * (stride_bk // quantization_group_size) + ( - (pid_n * BLOCK_SIZE_N) // quantization_group_size) - weight = tl.load(weight_data, mask=offs_k[:, None] < K, other=0.0) - scale = tl.load(scale_ptr + weight_ptrs_offset) - - accumulator = tl.zeros((BLOCK_SIZE_M, BLOCK_SIZE_N), dtype=tl.float32) - for k in range(0, tl.cdiv(K, BLOCK_SIZE_K)): - inp = tl.load(inp_data, mask=offs_k[None, :] < K - k * BLOCK_SIZE_K, other=0.0) - # Dequantize weight (fp8 -> bf16) - w = (((weight & 0x80) << 8) | ((weight & 0x7f) << 4)).to(tl.uint16) - w = (w + 0x3C00).to(tl.uint16) - w = (w.to(tl.bfloat16, bitcast=True) * scale).to(tl.bfloat16) - - inp_data += BLOCK_SIZE_K * stride_ak - weight_data += BLOCK_SIZE_K * stride_bk - weight_mask = offs_k[:, None] < K - (k + 1) * BLOCK_SIZE_K - weight = tl.load(weight_data, mask=weight_mask, other=0.0) - scale = tl.load(scale_ptr + (weight_ptrs_offset + - (((k + 1) * BLOCK_SIZE_K * stride_bk) // quantization_group_size)), - mask=weight_mask, - other=0.0) - - accumulator += tl.dot(inp, w) - - out = accumulator.to(tl.bfloat16) - - offs_cm = pid_m * BLOCK_SIZE_M + tl.arange(0, BLOCK_SIZE_M) - offs_cn = pid_n * BLOCK_SIZE_N + tl.arange(0, BLOCK_SIZE_N) - out_data = out_ptr + stride_cm * offs_cm[:, None] + stride_cn * offs_cn[None, :] - tl.store(out_data, out, mask=(offs_cm[:, None] < M) & (offs_cn[None, :] < N)) - - -@triton.jit -def matmul_kernel_fp8_fp16(inp_ptr, weight_ptr, out_ptr, scale_ptr, M, N, K, stride_am, stride_ak, stride_bk, - stride_bn, stride_cm, stride_cn, BLOCK_SIZE_M: tl.constexpr, BLOCK_SIZE_N: tl.constexpr, - BLOCK_SIZE_K: tl.constexpr, GROUP_SIZE_M: tl.constexpr, - quantization_group_size: tl.constexpr): - pid = tl.program_id(axis=0) - num_pid_m = tl.cdiv(M, BLOCK_SIZE_M) - num_pid_n = tl.cdiv(N, BLOCK_SIZE_N) - num_pid_in_group = GROUP_SIZE_M * num_pid_n - group_id = pid // num_pid_in_group - first_pid_m = group_id * GROUP_SIZE_M - group_size_m = min(num_pid_m - first_pid_m, GROUP_SIZE_M) - pid_m = first_pid_m + ((pid % num_pid_in_group) % group_size_m) - pid_n = (pid % num_pid_in_group) // group_size_m - - offs_am = (pid_m * BLOCK_SIZE_M + tl.arange(0, BLOCK_SIZE_M)) % M - offs_bn = (pid_n * BLOCK_SIZE_N + tl.arange(0, BLOCK_SIZE_N)) % N - offs_k = tl.arange(0, BLOCK_SIZE_K) - - inp_data = inp_ptr + (offs_am[:, None] * stride_am + offs_k[None, :] * stride_ak) - weight_data = weight_ptr + (offs_k[:, None] * stride_bk + offs_bn[None, :] * stride_bn) - weight_ptrs_offset = offs_k[:, None] * (stride_bk // quantization_group_size) + ( - (pid_n * BLOCK_SIZE_N) // quantization_group_size) - - weight = tl.load(weight_data, mask=offs_k[:, None] < K, other=0.0) - scale = tl.load(scale_ptr + weight_ptrs_offset) - - accumulator = tl.zeros((BLOCK_SIZE_M, BLOCK_SIZE_N), dtype=tl.float32) - for k in range(0, tl.cdiv(K, BLOCK_SIZE_K)): - inp = tl.load(inp_data, mask=offs_k[None, :] < K - k * BLOCK_SIZE_K, other=0.0) - # Dequantize weight (fp8 -> fp16) - w = (((weight & 0x80) << 8) | ((weight & 0x7f) << 7)).to(tl.uint16) - w = (w + 0x2000).to(tl.uint16) - w = (w.to(tl.float16, bitcast=True) * scale).to(tl.float16) - - inp_data += BLOCK_SIZE_K * stride_ak - weight_data += BLOCK_SIZE_K * stride_bk - - weight = tl.load(weight_data, mask=offs_k[:, None] < K - (k + 1) * BLOCK_SIZE_K, other=0.0) - scale = tl.load(scale_ptr + (weight_ptrs_offset + - (((k + 1) * BLOCK_SIZE_K * stride_bk) // quantization_group_size))) - - accumulator += tl.dot(inp, w) - - out = accumulator.to(tl.float16) - - offs_cm = pid_m * BLOCK_SIZE_M + tl.arange(0, BLOCK_SIZE_M) - offs_cn = pid_n * BLOCK_SIZE_N + tl.arange(0, BLOCK_SIZE_N) - out_data = out_ptr + stride_cm * offs_cm[:, None] + stride_cn * offs_cn[None, :] - tl.store(out_data, out, mask=(offs_cm[:, None] < M) & (offs_cn[None, :] < N)) - - -def matmul_fp8(inp, weight, scale, quantization_group_size): - - assert inp.shape[1] == weight.shape[0], \ - f"Incompatible dimensions (input: {inp.shape}, weight: {weight.shape})" - - M, K = inp.shape - K, N = weight.shape - - out = torch.empty((M, N), device=inp.device, dtype=inp.dtype) - - # GEMM tuning parameters! - # TODO: Add a more configurable tuning for selecting the best GeMM - BLOCK_SIZE_M = 16 if M <= 16 else 32 if M <= 32 else 64 if M <= 64 else 128 - BLOCK_SIZE_N = 64 - BLOCK_SIZE_K = max(64, quantization_group_size) - GROUP_SIZE_M = 8 - num_stages = 4 - num_warps = 4 - if M >= 256: - BLOCK_SIZE_M = 256 - BLOCK_SIZE_N = 128 - BLOCK_SIZE_K = max(128, quantization_group_size) - num_stages = 3 - num_warps = 8 - - grid = lambda META: (triton.cdiv(M, META['BLOCK_SIZE_M']) * triton.cdiv(N, META['BLOCK_SIZE_N']), ) - kernel = matmul_kernel_fp8_bf16 if inp.dtype == torch.bfloat16 else matmul_kernel_fp8_fp16 - kernel[grid](inp, - weight, - out, - scale, - M, - N, - K, - inp.stride(0), - inp.stride(1), - weight.stride(0), - weight.stride(1), - out.stride(0), - out.stride(1), - quantization_group_size=quantization_group_size, - BLOCK_SIZE_M=BLOCK_SIZE_M, - BLOCK_SIZE_N=BLOCK_SIZE_N, - BLOCK_SIZE_K=BLOCK_SIZE_K, - GROUP_SIZE_M=GROUP_SIZE_M, - num_stages=num_stages, - num_warps=num_warps) - return out +def matmul_fp8_fallback(inp, weight, scale, quantization_group_size, quantizer): + return torch.matmul(inp, quantizer.dequantize(weight, scale=scale)) diff --git a/deepspeed/ops/fp_quantizer/fp8_gemm_triton.py b/deepspeed/ops/fp_quantizer/fp8_gemm_triton.py new file mode 100644 index 000000000000..746e217d4194 --- /dev/null +++ b/deepspeed/ops/fp_quantizer/fp8_gemm_triton.py @@ -0,0 +1,171 @@ +# Copyright (c) Microsoft Corporation. +# SPDX-License-Identifier: Apache-2.0 + +# DeepSpeed Team + +######## Fused MoE kernel ######### +# These kernels are implemented for +# fusing GeMM with dequantization of +# fp8 weight data when using bit-16 +# activation. +################################### + +import torch +import triton +import triton.language as tl + + +@triton.jit +def matmul_kernel_fp8_bf16(inp_ptr, weight_ptr, out_ptr, scale_ptr, M, N, K, stride_am, stride_ak, stride_bk, + stride_bn, stride_cm, stride_cn, BLOCK_SIZE_M: tl.constexpr, BLOCK_SIZE_N: tl.constexpr, + BLOCK_SIZE_K: tl.constexpr, GROUP_SIZE_M: tl.constexpr, + quantization_group_size: tl.constexpr): + pid = tl.program_id(axis=0) + num_pid_m = tl.cdiv(M, BLOCK_SIZE_M) + num_pid_n = tl.cdiv(N, BLOCK_SIZE_N) + num_pid_in_group = GROUP_SIZE_M * num_pid_n + group_id = pid // num_pid_in_group + first_pid_m = group_id * GROUP_SIZE_M + group_size_m = min(num_pid_m - first_pid_m, GROUP_SIZE_M) + pid_m = first_pid_m + ((pid % num_pid_in_group) % group_size_m) + pid_n = (pid % num_pid_in_group) // group_size_m + + offs_am = (pid_m * BLOCK_SIZE_M + tl.arange(0, BLOCK_SIZE_M)) % M + offs_bn = (pid_n * BLOCK_SIZE_N + tl.arange(0, BLOCK_SIZE_N)) % N + offs_k = tl.arange(0, BLOCK_SIZE_K) + + inp_data = inp_ptr + (offs_am[:, None] * stride_am + offs_k[None, :] * stride_ak) + weight_data = weight_ptr + (offs_k[:, None] * stride_bk + offs_bn[None, :] * stride_bn) + weight_ptrs_offset = offs_k[:, None] * (stride_bk // quantization_group_size) + ( + (pid_n * BLOCK_SIZE_N) // quantization_group_size) + + weight = tl.load(weight_data, mask=offs_k[:, None] < K, other=0.0) + scale = tl.load(scale_ptr + weight_ptrs_offset) + + accumulator = tl.zeros((BLOCK_SIZE_M, BLOCK_SIZE_N), dtype=tl.float32) + for k in range(0, tl.cdiv(K, BLOCK_SIZE_K)): + inp = tl.load(inp_data, mask=offs_k[None, :] < K - k * BLOCK_SIZE_K, other=0.0) + # Dequantize weight (fp8 -> bf16) + w = (((weight & 0x80) << 8) | ((weight & 0x7f) << 4)).to(tl.uint16) + w = (w + 0x3C00).to(tl.uint16) + w = (w.to(tl.bfloat16, bitcast=True) * scale).to(tl.bfloat16) + + inp_data += BLOCK_SIZE_K * stride_ak + weight_data += BLOCK_SIZE_K * stride_bk + weight_mask = offs_k[:, None] < K - (k + 1) * BLOCK_SIZE_K + weight = tl.load(weight_data, mask=weight_mask, other=0.0) + scale = tl.load(scale_ptr + (weight_ptrs_offset + + (((k + 1) * BLOCK_SIZE_K * stride_bk) // quantization_group_size)), + mask=weight_mask, + other=0.0) + + accumulator += tl.dot(inp, w) + + out = accumulator.to(tl.bfloat16) + + offs_cm = pid_m * BLOCK_SIZE_M + tl.arange(0, BLOCK_SIZE_M) + offs_cn = pid_n * BLOCK_SIZE_N + tl.arange(0, BLOCK_SIZE_N) + out_data = out_ptr + stride_cm * offs_cm[:, None] + stride_cn * offs_cn[None, :] + tl.store(out_data, out, mask=(offs_cm[:, None] < M) & (offs_cn[None, :] < N)) + + +@triton.jit +def matmul_kernel_fp8_fp16(inp_ptr, weight_ptr, out_ptr, scale_ptr, M, N, K, stride_am, stride_ak, stride_bk, + stride_bn, stride_cm, stride_cn, BLOCK_SIZE_M: tl.constexpr, BLOCK_SIZE_N: tl.constexpr, + BLOCK_SIZE_K: tl.constexpr, GROUP_SIZE_M: tl.constexpr, + quantization_group_size: tl.constexpr): + pid = tl.program_id(axis=0) + num_pid_m = tl.cdiv(M, BLOCK_SIZE_M) + num_pid_n = tl.cdiv(N, BLOCK_SIZE_N) + num_pid_in_group = GROUP_SIZE_M * num_pid_n + group_id = pid // num_pid_in_group + first_pid_m = group_id * GROUP_SIZE_M + group_size_m = min(num_pid_m - first_pid_m, GROUP_SIZE_M) + pid_m = first_pid_m + ((pid % num_pid_in_group) % group_size_m) + pid_n = (pid % num_pid_in_group) // group_size_m + + offs_am = (pid_m * BLOCK_SIZE_M + tl.arange(0, BLOCK_SIZE_M)) % M + offs_bn = (pid_n * BLOCK_SIZE_N + tl.arange(0, BLOCK_SIZE_N)) % N + offs_k = tl.arange(0, BLOCK_SIZE_K) + + inp_data = inp_ptr + (offs_am[:, None] * stride_am + offs_k[None, :] * stride_ak) + weight_data = weight_ptr + (offs_k[:, None] * stride_bk + offs_bn[None, :] * stride_bn) + weight_ptrs_offset = offs_k[:, None] * (stride_bk // quantization_group_size) + ( + (pid_n * BLOCK_SIZE_N) // quantization_group_size) + + weight = tl.load(weight_data, mask=offs_k[:, None] < K, other=0.0) + scale = tl.load(scale_ptr + weight_ptrs_offset) + + accumulator = tl.zeros((BLOCK_SIZE_M, BLOCK_SIZE_N), dtype=tl.float32) + for k in range(0, tl.cdiv(K, BLOCK_SIZE_K)): + inp = tl.load(inp_data, mask=offs_k[None, :] < K - k * BLOCK_SIZE_K, other=0.0) + # Dequantize weight (fp8 -> fp16) + w = (((weight & 0x80) << 8) | ((weight & 0x7f) << 7)).to(tl.uint16) + w = (w + 0x2000).to(tl.uint16) + w = (w.to(tl.float16, bitcast=True) * scale).to(tl.float16) + + inp_data += BLOCK_SIZE_K * stride_ak + weight_data += BLOCK_SIZE_K * stride_bk + + weight = tl.load(weight_data, mask=offs_k[:, None] < K - (k + 1) * BLOCK_SIZE_K, other=0.0) + scale = tl.load(scale_ptr + (weight_ptrs_offset + + (((k + 1) * BLOCK_SIZE_K * stride_bk) // quantization_group_size))) + + accumulator += tl.dot(inp, w) + + out = accumulator.to(tl.float16) + + offs_cm = pid_m * BLOCK_SIZE_M + tl.arange(0, BLOCK_SIZE_M) + offs_cn = pid_n * BLOCK_SIZE_N + tl.arange(0, BLOCK_SIZE_N) + out_data = out_ptr + stride_cm * offs_cm[:, None] + stride_cn * offs_cn[None, :] + tl.store(out_data, out, mask=(offs_cm[:, None] < M) & (offs_cn[None, :] < N)) + + +def matmul_fp8_triton(inp, weight, scale, quantization_group_size): + + assert inp.shape[1] == weight.shape[0], \ + f"Incompatible dimensions (input: {inp.shape}, weight: {weight.shape})" + + M, K = inp.shape + K, N = weight.shape + + out = torch.empty((M, N), device=inp.device, dtype=inp.dtype) + + # GEMM tuning parameters! + # TODO: Add a more configurable tuning for selecting the best GeMM + BLOCK_SIZE_M = 16 if M <= 16 else 32 if M <= 32 else 64 if M <= 64 else 128 + BLOCK_SIZE_N = 64 + BLOCK_SIZE_K = max(64, quantization_group_size) + GROUP_SIZE_M = 8 + num_stages = 4 + num_warps = 4 + if M >= 256: + BLOCK_SIZE_M = 256 + BLOCK_SIZE_N = 128 + BLOCK_SIZE_K = max(128, quantization_group_size) + num_stages = 3 + num_warps = 8 + + grid = lambda META: (triton.cdiv(M, META['BLOCK_SIZE_M']) * triton.cdiv(N, META['BLOCK_SIZE_N']), ) + kernel = matmul_kernel_fp8_bf16 if inp.dtype == torch.bfloat16 else matmul_kernel_fp8_fp16 + kernel[grid](inp, + weight, + out, + scale, + M, + N, + K, + inp.stride(0), + inp.stride(1), + weight.stride(0), + weight.stride(1), + out.stride(0), + out.stride(1), + quantization_group_size=quantization_group_size, + BLOCK_SIZE_M=BLOCK_SIZE_M, + BLOCK_SIZE_N=BLOCK_SIZE_N, + BLOCK_SIZE_K=BLOCK_SIZE_K, + GROUP_SIZE_M=GROUP_SIZE_M, + num_stages=num_stages, + num_warps=num_warps) + return out diff --git a/tests/unit/ops/fp_quantizer/test_fp8_gemm.py b/tests/unit/ops/fp_quantizer/test_fp8_gemm.py index d66f7c8cb4cc..a4cf579f5943 100644 --- a/tests/unit/ops/fp_quantizer/test_fp8_gemm.py +++ b/tests/unit/ops/fp_quantizer/test_fp8_gemm.py @@ -14,6 +14,8 @@ from deepspeed.ops.fp_quantizer import FP_Quantize, matmul_fp8 +from deepspeed import get_accelerator + @pytest.mark.parametrize("dtype", [torch.bfloat16], ids=["bf16"]) @pytest.mark.parametrize("q_bits", [8], ids=[ @@ -21,23 +23,19 @@ ]) @pytest.mark.parametrize("M", [1, 2, 4, 8, 32, 64, 128, 256, 512, 1024, 2048]) def test_fp_quant(dtype, q_bits, M): + device_name = get_accelerator().device_name() quantization_group_size = 128 fpq = FP_Quantize(group_size=quantization_group_size) N = 8192 H = 4096 - x = torch.randn(M, H, dtype=dtype, device='cuda') - weight_bf16 = torch.randn(H, N, dtype=dtype, device='cuda') + x = torch.randn(M, H, dtype=dtype, device=device_name) + weight_bf16 = torch.randn(H, N, dtype=dtype, device=device_name) - weight, _ = fpq.quantize(weight_bf16.data, q_bits=8, return_meta_tensor=True) + weight, _ = fpq.quantize(weight_bf16.data, q_bits=q_bits, return_meta_tensor=True) scale = fpq.get_scales() - out = matmul_fp8( - x, - weight, - scale, - quantization_group_size, - ) + out = matmul_fp8(x, weight, scale, quantization_group_size, fpq) out_q = torch.matmul(x, fpq.dequantize(weight, scale=fpq.scale)) From b0040b6ca4799c34ebb7543e4edf6658505d9dc6 Mon Sep 17 00:00:00 2001 From: inkcherry Date: Tue, 7 Jan 2025 04:06:06 +0800 Subject: [PATCH 673/754] Reduce the device bubble introduced by heavy loop synchronization in coalesced fetch/release(z3_leaf_module) (#6694) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit depend on https://github.com/microsoft/DeepSpeed/pull/6649 When performing fetch/release operations on Z3 leaf modules, the loop time is excessively long in fine-grained module. Compared to non-leaf modules, Z3 leaf modules may include a larger number of parameters. Although each loop unit does not consume much time, the overall loop length can be significant. ![image](https://github.com/user-attachments/assets/9891835a-2620-47f3-aba6-ea22b8905d1c) **The fetch time is impacted by:** Post-allgather operations (narrow, slice ,cat, difficult to avoid) Memory pressure(record_stream/fetch event create&sync) **The release time is impacted by:** slice Free parameter record_stream Considering the fine-grained leaf modules, where each parameter is relatively small, we can treat the parameters within each leaf module as a unified entity to handle memory pressure. This approach can approximately halve the CPU time required for fetch/release operations. --------- Co-authored-by: Ma, Guokai Co-authored-by: Logan Adams <114770087+loadams@users.noreply.github.com> Co-authored-by: Olatunji Ruwase --- deepspeed/runtime/zero/mics.py | 2 +- deepspeed/runtime/zero/parameter_offload.py | 19 ++++--- .../runtime/zero/partition_parameters.py | 39 +++++++++------ .../zero/partitioned_param_coordinator.py | 50 ++++++++++++------- 4 files changed, 69 insertions(+), 41 deletions(-) diff --git a/deepspeed/runtime/zero/mics.py b/deepspeed/runtime/zero/mics.py index c9ae58a121de..628bf86a61da 100755 --- a/deepspeed/runtime/zero/mics.py +++ b/deepspeed/runtime/zero/mics.py @@ -38,7 +38,7 @@ class MiCS_AllGatherCoalescedHandle(AllGatherCoalescedHandle): def __init__(self, allgather_handle, params: List[Parameter], partitions: List[Tensor], world_size: int) -> None: super().__init__(allgather_handle, params, partitions, world_size) - def wait(self) -> None: + def wait(self, **kwargs) -> None: """ """ # let the current stream to op diff --git a/deepspeed/runtime/zero/parameter_offload.py b/deepspeed/runtime/zero/parameter_offload.py index 0be88a1e1ba6..d5b7bac55146 100644 --- a/deepspeed/runtime/zero/parameter_offload.py +++ b/deepspeed/runtime/zero/parameter_offload.py @@ -145,6 +145,16 @@ def __init__( module.ds_inflight_param_registry = InflightParamRegistry() self.__inflight_param_registry = module.ds_inflight_param_registry + self.fast_sharding_for_leaf_module = False + + if zero_module_granularity_threshold > 0: + self.min_granularity_value = sys.maxsize + self.min_granularity_layer = None + self.granularity_info = set() + self.z3_leaf_layers = [] + self._set_z3_leaf_modules_by_threshold(module, zero_module_granularity_threshold) + self.fast_sharding_for_leaf_module = True + self.param_coordinator = PartitionedParameterCoordinator( prefetch_bucket_sz=self._prefetch_bucket_sz, max_reuse_distance_in_numel=self._max_reuse_distance_in_numel, @@ -155,14 +165,7 @@ def __init__( timers=self.timers, zero_quantized_weights=self.zero_quantized_weights, zero_quantized_nontrainable_weights=self.zero_quantized_nontrainable_weights, - ) - - if zero_module_granularity_threshold > 0: - self.min_granularity_value = sys.maxsize - self.min_granularity_layer = None - self.granularity_info = set() - self.z3_leaf_layers = [] - self._set_z3_leaf_modules_by_threshold(module, zero_module_granularity_threshold) + fast_sharding_for_leaf_module=self.fast_sharding_for_leaf_module) self.forward_hooks = [] self.backward_hooks = [] diff --git a/deepspeed/runtime/zero/partition_parameters.py b/deepspeed/runtime/zero/partition_parameters.py index cb0cd7c8017d..e8cb797b8a5b 100755 --- a/deepspeed/runtime/zero/partition_parameters.py +++ b/deepspeed/runtime/zero/partition_parameters.py @@ -55,7 +55,7 @@ def __init__(self, param: Parameter) -> None: non_blocking=True).view(param.ds_shape) self.__param = param - def wait(self) -> None: + def wait(self, **kwargs) -> None: if not get_accelerator().resolves_data_dependency(): get_accelerator().current_stream().synchronize() self.__param.ds_status = ZeroParamStatus.AVAILABLE @@ -78,7 +78,7 @@ def __init__(self, params: List[Parameter]) -> None: non_blocking=True).view(param.ds_shape) @instrument_w_nvtx - def wait(self) -> None: + def wait(self, **kwargs) -> None: if self.__complete: return @@ -639,7 +639,7 @@ def __init__(self, handle, param: Parameter, quantization=None) -> None: self.__param = param self.__quantization = quantization - def wait(self) -> None: + def wait(self, handle_dependency=True) -> None: instrument_w_nvtx(self.__handle.wait)() if self.__quantization: instrument_w_nvtx(self.__quantization.quant_handle.wait)() @@ -650,6 +650,8 @@ def wait(self) -> None: class AllGatherCoalescedHandle: + data_buffer = [] + def __init__( self, allgather_handle, @@ -672,7 +674,7 @@ def __init__( raise RuntimeError(f"expected param {param.ds_summary()} to not be available") @instrument_w_nvtx - def wait(self) -> None: + def wait(self, handle_dependency=True) -> None: if self.complete: return @@ -704,14 +706,20 @@ def wait(self) -> None: partitions.append(part_to_copy) param.data = instrument_w_nvtx(torch.cat)(partitions).view(param.ds_shape) param.ds_status = ZeroParamStatus.AVAILABLE - - for part_to_copy in partitions: - if not get_accelerator().is_synchronized_device(): + if not get_accelerator().is_synchronized_device() and handle_dependency: + for part_to_copy in partitions: part_to_copy.record_stream(get_accelerator().current_stream()) param_offset += ds_tensor_numel self.complete = True + if not get_accelerator().is_synchronized_device() and not handle_dependency: + # if the device needs to handle dependencies and opts for explicit processing outside the function. + AllGatherCoalescedHandle.data_buffer.append(partitions) + + @staticmethod + def free_buffer(): + AllGatherCoalescedHandle.data_buffer = [] class MultipleAllGatherHandles: @@ -719,9 +727,9 @@ class MultipleAllGatherHandles: def __init__(self, handles: List[AllGatherCoalescedHandle]): self.handles = handles - def wait(self) -> None: + def wait(self, handle_dependency=True) -> None: for handle in self.handles: - handle.wait() + handle.wait(handle_dependency) class AllReduceCoalescedHandle: @@ -1377,13 +1385,13 @@ def all_gather_coalesced(params: Iterable[Parameter], quantization=quant_info, ) - def partition(param_list=None, hierarchy=0, has_been_updated=False): + def partition(param_list=None, hierarchy=0, has_been_updated=False, free_data=True): cls = param print_rank_0(f"{'--'*hierarchy}----Partitioning param {debug_param2name_id_shape_device(cls)}", force=False) if param_list is None: param_list = [cls] - self._partition(param_list, has_been_updated=has_been_updated) + self._partition(param_list, has_been_updated=has_been_updated, free_data=True) def reduce_gradients_at_owner(param_list=None, hierarchy=0): cls = param @@ -1527,12 +1535,12 @@ def _all_gather(self, param_list, async_op=False, hierarchy=None): return handles - def _partition(self, param_list, force=False, has_been_updated=False): + def _partition(self, param_list, force=False, has_been_updated=False, free_data=True): for param in param_list: print_rank_0(f"Before Partitioning Param {param.ds_id}", force=False) if self.zero_param_process_group is not None: self._partition_param_sec(param) - self._partition_param(param, has_been_updated=has_been_updated) + self._partition_param(param, has_been_updated=has_been_updated, free_data=True) param.ds_status = ZeroParamStatus.NOT_AVAILABLE # if param.ds_tensor is not None: @@ -1540,7 +1548,7 @@ def _partition(self, param_list, force=False, has_been_updated=False): # "After the parameters are initially partitioned, make sure we are not recreating the partition." #print_rank_0(f"After Partitioning Param {param.ds_id} {param.ds_tensor.size()} {param.ds_tensor}",force=False) @instrument_w_nvtx - def _partition_param(self, param, buffer=None, has_been_updated=False): + def _partition_param(self, param, buffer=None, has_been_updated=False, free_data=True): assert param.ds_status is not ZeroParamStatus.INFLIGHT, f" {param} Cannot partition a param in flight" global reuse_buffers print_rank_0(f"Param id {param.ds_id} status is {param.ds_status}", force=False) @@ -1565,7 +1573,8 @@ def _partition_param(self, param, buffer=None, has_been_updated=False): see_memory_usage(f'Before partitioning param {param.ds_id} {param.shape}', force=False) # param.data does not store anything meaningful in partitioned state - free_param(param) + if free_data: + free_param(param) see_memory_usage(f'After partitioning param {param.ds_id} {param.shape}', force=False) if param.ds_tensor.final_location == OffloadDeviceEnum.nvme: diff --git a/deepspeed/runtime/zero/partitioned_param_coordinator.py b/deepspeed/runtime/zero/partitioned_param_coordinator.py index 596d0e9c20f9..08cb6c0de54f 100644 --- a/deepspeed/runtime/zero/partitioned_param_coordinator.py +++ b/deepspeed/runtime/zero/partitioned_param_coordinator.py @@ -76,18 +76,17 @@ class __ParamInTrace: param: Parameter step_id_last_used_at: int - def __init__( - self, - prefetch_bucket_sz: int, - max_reuse_distance_in_numel: int, - max_available_parameters_in_numel: int, - allgather_stream: get_accelerator().Stream, - inflight_param_registry: InflightParamRegistry, - prefetch_nvme: bool = False, - timers=None, - zero_quantized_weights=False, - zero_quantized_nontrainable_weights=False, - ) -> None: + def __init__(self, + prefetch_bucket_sz: int, + max_reuse_distance_in_numel: int, + max_available_parameters_in_numel: int, + allgather_stream: get_accelerator().Stream, + inflight_param_registry: InflightParamRegistry, + prefetch_nvme: bool = False, + timers=None, + zero_quantized_weights=False, + zero_quantized_nontrainable_weights=False, + fast_sharding_for_leaf_module=False) -> None: # mapping of param -> handle for each param that is currently in flight self.__inflight_param_registry = inflight_param_registry # keeps track of the number of submodules invoked so far. @@ -130,6 +129,10 @@ def __init__( self.__max_ongoing_fetch_events: int = 2 self.__profiler = PartitionedParameterProfiler(timers if ENABLE_PROFILER else None) + # whether to enable fast fetch for the z3 leaf module. + # this will improve fetch speed but will not break down leaf module parameters to alleviate memory pressure. + self.fast_sharding_for_leaf_module = fast_sharding_for_leaf_module + """Tracing and Tracking TODO. consider performing trace before initializing PartitionedParameterCoordinator and passing trace results into constructor. This way all the code in here can @@ -308,6 +311,7 @@ def fetch_sub_module(self, current_submodule: Module, forward: bool) -> None: wait_numel = 0 wait_event_name = __class__.FORWARD_FETCH_WAIT if forward else __class__.BACKWARD_FETCH_WAIT self.__profiler.start_event(wait_event_name) + fast_fetch = self.fast_sharding_for_leaf_module and z3_leaf_module(current_submodule) # wait for parameters in the immediately needed submodule to become available for param in params_to_fetch: param.ds_active_sub_modules.add(current_submodule.id) @@ -321,9 +325,9 @@ def fetch_sub_module(self, current_submodule: Module, forward: bool) -> None: if len(self.__ongoing_fetch_events) > self.__max_ongoing_fetch_events: self.__ongoing_fetch_events.popleft().synchronize() - self.__inflight_param_registry.pop(param).wait() + self.__inflight_param_registry.pop(param).wait(handle_dependency=not fast_fetch) - if not get_accelerator().handles_memory_backpressure(): + if not get_accelerator().handles_memory_backpressure() and not fast_fetch: event = get_accelerator().Event() event.record() self.__ongoing_fetch_events.append(event) @@ -331,6 +335,8 @@ def fetch_sub_module(self, current_submodule: Module, forward: bool) -> None: assert param.ds_status == ZeroParamStatus.AVAILABLE, param.ds_summary() if not get_accelerator().resolves_data_dependency(): get_accelerator().current_stream().wait_stream(self.__allgather_stream) + if fast_fetch: + AllGatherCoalescedHandle.free_buffer() self.__profiler.stop_event(wait_event_name, wait_numel) # kick off parameter prefetches for upcoming modules @@ -412,10 +418,20 @@ def release_sub_module(self, submodule: Module) -> None: be released.""" params_to_release = (self.__params_to_release(submodule, self.__step_id) if self.is_complete_trace() else set( p.ds_id for p in iter_params(submodule, recurse=z3_leaf_module(submodule)))) + + free_data = not z3_leaf_module(submodule) or not self.fast_sharding_for_leaf_module + if not free_data: + # wait for the computation to finish and launch as early as possible. + empty_buffer = torch.empty(1, device=get_accelerator().current_device()) + for param in iter_params(submodule, recurse=z3_leaf_module(submodule)): param.ds_active_sub_modules.discard(submodule.id) if param.ds_id in params_to_release and not param.is_external_param: - self.__release_param(param) + self.__release_param(param, free_data) + if not free_data: + if param.ds_id in params_to_release and not param.is_external_param: + # empty buffer ensures that all computations are complete + param.data = empty_buffer @instrument_w_nvtx @torch.no_grad() @@ -490,11 +506,11 @@ def __all_gather_params_(self, params: Set[Parameter], forward: bool, quantize: @compiler.disable @instrument_w_nvtx - def __release_param(self, param: Parameter) -> None: + def __release_param(self, param: Parameter, free_data: bool = True) -> None: if param.ds_status == ZeroParamStatus.AVAILABLE and not param.ds_active_sub_modules: if logger.isEnabledFor(logging.DEBUG): debug_rank0(f"-release: {param.ds_summary()}") - param.partition() + param.partition(free_data=free_data) self.__n_available_params -= param.ds_numel @instrument_w_nvtx From c348c5b11a4fd3f70a53f5c9445f260472de47a8 Mon Sep 17 00:00:00 2001 From: Logan Adams <114770087+loadams@users.noreply.github.com> Date: Mon, 6 Jan 2025 14:35:50 -0800 Subject: [PATCH 674/754] Cleanup ops/transformer/inference tests (#6925) --- .../inference/inference_test_utils.py | 42 +++++++------------ .../transformer/inference/test_attention.py | 4 +- .../transformer/inference/test_layer_norm.py | 4 +- 3 files changed, 18 insertions(+), 32 deletions(-) diff --git a/tests/unit/ops/transformer/inference/inference_test_utils.py b/tests/unit/ops/transformer/inference/inference_test_utils.py index 9cfcae809f09..d63c51267e51 100644 --- a/tests/unit/ops/transformer/inference/inference_test_utils.py +++ b/tests/unit/ops/transformer/inference/inference_test_utils.py @@ -3,6 +3,8 @@ # DeepSpeed Team +from typing import Tuple + import torch from deepspeed.accelerator import get_accelerator @@ -23,38 +25,22 @@ def get_tolerances(): DTYPES = None -def get_dtypes(): +def get_dtypes(include_float=True): global DTYPES if DTYPES is None: - DTYPES = get_accelerator().supported_dtypes() + DTYPES = [torch.float16, torch.float32] if include_float else [torch.float16] + try: + if get_accelerator().is_bf16_supported(): + DTYPES.append(torch.bfloat16) + except (AssertionError, AttributeError): + pass return DTYPES -def allclose(x, y): +def allclose(x, y, tolerances: Tuple[int, int] = None): assert x.dtype == y.dtype - rtol, atol = get_tolerances()[x.dtype] + if tolerances is None: + rtol, atol = get_tolerances()[x.dtype] + else: + rtol, atol = tolerances return torch.allclose(x, y, rtol=rtol, atol=atol) - - -def assert_almost_equal(x, y, decimal=2, err_msg=''): - import numpy.testing as npt - if isinstance(x, torch.Tensor): - if x.dtype == torch.bfloat16: - x = x.float() - x = x.cpu().detach().numpy() - if isinstance(y, torch.Tensor): - if y.dtype == torch.bfloat16: - y = y.float() - y = y.cpu().detach().numpy() - npt.assert_array_almost_equal(x, y, err_msg=err_msg, decimal=decimal) - - -def max_diff(a, b): - a = a.to(torch.float32).flatten() - b = b.to(torch.float32).flatten() - diff = torch.abs(a - b) - max_diff_indices = torch.argsort(diff)[-1] - print("Max difference indices:", max_diff_indices) - print("Max difference values:", diff[max_diff_indices]) - print(f"{a[max_diff_indices]} vs {b[max_diff_indices]}") - return max_diff_indices diff --git a/tests/unit/ops/transformer/inference/test_attention.py b/tests/unit/ops/transformer/inference/test_attention.py index ecf681542ff6..cae201d747a3 100644 --- a/tests/unit/ops/transformer/inference/test_attention.py +++ b/tests/unit/ops/transformer/inference/test_attention.py @@ -7,7 +7,7 @@ import torch import deepspeed from deepspeed.accelerator import get_accelerator -from .inference_test_utils import assert_almost_equal +from .inference_test_utils import allclose # reference timplementation @@ -88,4 +88,4 @@ def test_attention(BATCH, H, N_CTX, D_HEAD, causal, use_flash, dtype=torch.float use_triton_flash=False, use_ds_attention=False) tri_out = tri_out.reshape((BATCH, N_CTX, H, D_HEAD)).permute(0, 2, 1, 3) - assert_almost_equal(ref_out, tri_out) + assert (allclose(ref_out, tri_out)) diff --git a/tests/unit/ops/transformer/inference/test_layer_norm.py b/tests/unit/ops/transformer/inference/test_layer_norm.py index 7711daf0d887..4a84add16046 100644 --- a/tests/unit/ops/transformer/inference/test_layer_norm.py +++ b/tests/unit/ops/transformer/inference/test_layer_norm.py @@ -9,7 +9,7 @@ from deepspeed.accelerator import get_accelerator from deepspeed.ops.op_builder import InferenceBuilder from deepspeed.ops.transformer.inference.op_binding.layer_norm import LayerNormOp -from .inference_test_utils import allclose, get_dtypes, assert_almost_equal +from .inference_test_utils import allclose, get_dtypes try: import triton # noqa: F401 # type: ignore from deepspeed.ops.transformer.inference.triton import ( @@ -188,4 +188,4 @@ def test_triton_layer_norm(M, N, dtype, residual, input_bias, eps=1e-5, device=' y_ref = torch.nn.functional.layer_norm(x + res + (x_bias if input_bias else 0), w_shape, weight, bias, eps).to(dtype) # compare - assert_almost_equal(y_tri, y_ref) + assert (allclose(y_tri, y_ref)) From f2cc80909b8bdd399a029acf3ed0c894279974b6 Mon Sep 17 00:00:00 2001 From: Lev Kurilenko <113481193+lekurile@users.noreply.github.com> Date: Mon, 6 Jan 2025 17:13:35 -0800 Subject: [PATCH 675/754] Check transformers version in BLOOM for inference v1 (#6766) This PR checks that the `transformers` version is `<= 4.43.4` in the BLOOM container for inference v1, due to breaking changes in `transformers > 4.43.4`. --------- Co-authored-by: Logan Adams <114770087+loadams@users.noreply.github.com> --- deepspeed/module_inject/containers/bloom.py | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/deepspeed/module_inject/containers/bloom.py b/deepspeed/module_inject/containers/bloom.py index a78ac8120346..7a9b9ca2065b 100644 --- a/deepspeed/module_inject/containers/bloom.py +++ b/deepspeed/module_inject/containers/bloom.py @@ -19,6 +19,18 @@ class DS_BloomContainer(MetaTensorContainer, HybridEngineContainer, BaseTransformerContainer): def __init__(self, **kwargs): + # Check transformers version, error if > 4.43.4 (breaks at 4.44.0) + from importlib.metadata import version + v_transformers = version('transformers') + vers = v_transformers.split('.') + major = int(vers[0]) + minor = int(vers[1]) + if major > 4 or (major == 4 and minor > 43): + import sys + sys.exit( + f"Transformers version {v_transformers} exceeds version 4.43.4! After transformers version 4.43.4, BLOOM inference with DeepSpeed is no longer supported." + ) + super().__init__(**kwargs) # All model specific things should be defined here instead of the base class. From c7f30322fd7db165307ffd3a4f322fa18ab9bae0 Mon Sep 17 00:00:00 2001 From: Nadav Elyahu <88962733+nelyahu@users.noreply.github.com> Date: Tue, 7 Jan 2025 20:10:24 +0200 Subject: [PATCH 676/754] inference: remove unused _validate_args function (#5505) Co-authored-by: Olatunji Ruwase Co-authored-by: Logan Adams <114770087+loadams@users.noreply.github.com> --- deepspeed/inference/engine.py | 24 ------------------------ 1 file changed, 24 deletions(-) diff --git a/deepspeed/inference/engine.py b/deepspeed/inference/engine.py index cfca1ff4fe4c..131dce07d22d 100755 --- a/deepspeed/inference/engine.py +++ b/deepspeed/inference/engine.py @@ -80,7 +80,6 @@ def __init__(self, model, config): self.mp_group = config.tensor_parallel.tp_group self.mpu = config.tensor_parallel.mpu - #self._validate_args(self.mpu, config.replace_with_kernel_inject) self.quantize_merge_count = 1 self.quantization_scales = None @@ -300,29 +299,6 @@ def _init_quantization_setting(self, quantization_setting): f"mlp_extra_grouping = {self.mlp_extra_grouping}, " f"quantize_groups = {self.quantize_groups}", [0]) - # TODO: remove this function and add this functionality to pydantic config checking - def _validate_args(self, mpu, replace_with_kernel_inject): - # TODO: to support SD pipeline we need to avoid this check for now - if replace_with_kernel_inject and not isinstance(self.module, Module): - raise ValueError(f"model must be a torch.nn.Module, got {type(self.module)}") - if not isinstance(self._config.tensor_parallel.tp_size, int) or self._config.tensor_parallel.tp_size < 1: - raise ValueError(f"mp_size must be an int >= 1, got {self._config.tensor_parallel.tp_size}") - - if mpu: - methods = ["get_model_parallel_group", "get_data_parallel_group"] - for method in methods: - if not hasattr(mpu, method): - raise ValueError(f"mpu is missing {method}") - if self._config.checkpoint is not None and not isinstance(self._config.checkpoint, (str, dict)): - raise ValueError(f"checkpoint must be None, str or dict, got {type(self._config.checkpoint)}") - - supported_dtypes = [None, torch.half, torch.int8, torch.float, torch.bfloat16] - if self._config.dtype not in supported_dtypes: - raise ValueError(f"{self._config.dtype} not supported, valid dtype: {supported_dtypes}") - - if self.injection_dict is not None and not isinstance(self.injection_dict, dict): - raise ValueError(f"injection_dict must be None or a dict, got: {self.injection_dict}") - def load_model_with_checkpoint(self, r_module): self.mp_replace = ReplaceWithTensorSlicing( mp_group=self.mp_group, mp_size=self._config.tensor_parallel.tp_size) #, out_dim=0, in_dim=1) From c41b0c2855b24618870399cbbf22a63551b3fc52 Mon Sep 17 00:00:00 2001 From: Sergii Dymchenko Date: Tue, 7 Jan 2025 17:27:30 -0800 Subject: [PATCH 677/754] Use `torch.log1p` (#6930) This function provides greater precision than `log(1 + x)` for small values of `x`. Found with TorchFix https://github.com/pytorch-labs/torchfix/ --- deepspeed/sequence/fpdt_layer.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/deepspeed/sequence/fpdt_layer.py b/deepspeed/sequence/fpdt_layer.py index 4fab768ce63c..4fa2cc988a19 100644 --- a/deepspeed/sequence/fpdt_layer.py +++ b/deepspeed/sequence/fpdt_layer.py @@ -47,7 +47,7 @@ def _update_out_and_lse( block_out = block_out.to(torch.float32) block_lse = block_lse.transpose(-2, -1).unsqueeze(dim=-1) - new_lse = lse + torch.log(1 + torch.exp(block_lse - lse)) + new_lse = lse + torch.log1p(torch.exp(block_lse - lse)) out = torch.exp(lse - new_lse) * out + torch.exp(block_lse - new_lse) * block_out From 6628127a379e3c3fd70e48534c4b5952c5c23a72 Mon Sep 17 00:00:00 2001 From: Logan Adams <114770087+loadams@users.noreply.github.com> Date: Wed, 8 Jan 2025 10:43:06 -0800 Subject: [PATCH 678/754] Update python version classifiers (#6933) Update python version classifiers in setup.py to reflect python versions currently supported. --- setup.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/setup.py b/setup.py index c0452f867b31..cc5eb4a3500c 100755 --- a/setup.py +++ b/setup.py @@ -321,9 +321,9 @@ def op_enabled(op_name): include_package_data=True, scripts=scripts, classifiers=[ - 'Programming Language :: Python :: 3.6', 'Programming Language :: Python :: 3.7', 'Programming Language :: Python :: 3.8', 'Programming Language :: Python :: 3.9', - 'Programming Language :: Python :: 3.10' + 'Programming Language :: Python :: 3.10', 'Programming Language :: Python :: 3.11', + 'Programming Language :: Python :: 3.12' ], license='Apache Software License 2.0', ext_modules=ext_modules, From b62c84d88db26f6ce8c8f9caeef132638599a74d Mon Sep 17 00:00:00 2001 From: woctordho Date: Thu, 9 Jan 2025 02:59:41 +0800 Subject: [PATCH 679/754] Fix building on Windows with presence of Triton (#6749) This fixes some errors when installing DeepSpeed on Windows with the presence of Triton. I guess we can assume we don't need the warning about NFS on Windows for now. I did not try how to detect NFS path on Windows, but we can detect UNC path starting with `\\` if needed. `os.rename` does not allow overwriting the file on Windows, and `os.replace` is more cross-platform. Co-authored-by: Logan Adams <114770087+loadams@users.noreply.github.com> --- deepspeed/ops/transformer/inference/triton/matmul_ext.py | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/deepspeed/ops/transformer/inference/triton/matmul_ext.py b/deepspeed/ops/transformer/inference/triton/matmul_ext.py index 412c8740a216..9be4b0098c37 100644 --- a/deepspeed/ops/transformer/inference/triton/matmul_ext.py +++ b/deepspeed/ops/transformer/inference/triton/matmul_ext.py @@ -19,6 +19,9 @@ # ----------------------------------------------------------------------------- # util class/functions for triton def is_nfs_path(path): + if os.name == 'nt': + return False + # Normalize the path to get the absolute path path = os.path.abspath(path) @@ -99,7 +102,7 @@ def put(self, table): with FileLock(self.lock_path): with open(self.file_path + ".tmp", 'wb') as handle: pickle.dump(table, handle) - os.rename(self.file_path + ".tmp", self.file_path) + os.replace(self.file_path + ".tmp", self.file_path) def load(self): if os.path.exists(self.file_path): From 53fb5795a10ed25a824f134dd44cb625d8ad23ac Mon Sep 17 00:00:00 2001 From: Logan Adams <114770087+loadams@users.noreply.github.com> Date: Wed, 8 Jan 2025 12:54:19 -0800 Subject: [PATCH 680/754] Fix windows blog examples (#6934) --- blogs/windows/08-2024/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/blogs/windows/08-2024/README.md b/blogs/windows/08-2024/README.md index 34e11bd47792..8a23372a1d64 100644 --- a/blogs/windows/08-2024/README.md +++ b/blogs/windows/08-2024/README.md @@ -48,7 +48,7 @@ Regardless of the installation choice, you can check that the installation was s We use an image classification model, CIFAR10, and a language model, BERT, to demonstrate pretraining on Windows with DeepSpeed. ## Pretraining CIFAR10 -The scripts and codes required for CIFAR10 pretraining example are available in the following path: DeepSpeedExamples\training\cifar. You can launch the CIFAR10 pretraining experiment using the following command: `deepspeed cifar10_deepspeed.py –deepspeed`. The final output should look something like this: +The scripts and codes required for CIFAR10 pretraining example are available in the following path: DeepSpeedExamples\training\cifar. You can launch the CIFAR10 pretraining experiment using the following command: `deepspeed cifar10_deepspeed.py --deepspeed`. The final output should look something like this:
    From 45fce45c95c78c3adf72b7332fe6d0051be553b0 Mon Sep 17 00:00:00 2001 From: Yejing-Lai Date: Fri, 10 Jan 2025 02:11:32 +0800 Subject: [PATCH 681/754] Add deepseek autotp (#6937) Deepseek including Multi-Head Latent Attention(MLA) and MoE. For MLA TP, we need to skip two low-rank layers("q_a_proj" and "kv_a_proj_with_mqa) For Deepseek MoE, tp_parse gets this moe layer name is layer_idx.down_proj, it is hard to add the policy, so we set the down_proj layer to all_reduce_linears default. --- deepspeed/module_inject/auto_tp.py | 15 ++++++++++----- deepspeed/module_inject/tp_shard.py | 7 ++++++- 2 files changed, 16 insertions(+), 6 deletions(-) diff --git a/deepspeed/module_inject/auto_tp.py b/deepspeed/module_inject/auto_tp.py index 5441000e581d..66d7c2659359 100755 --- a/deepspeed/module_inject/auto_tp.py +++ b/deepspeed/module_inject/auto_tp.py @@ -134,7 +134,8 @@ def is_load_module(module): load_layer_names = [ "LPLayerNorm", "SharedEmbedding", "OPTLearnedPositionalEmbedding", "LlamaRMSNorm", "FalconLinear", "MistralRMSNorm", "T5LayerNorm", "MixtralRMSNorm", "Phi3RotaryEmbedding", "Phi3SuScaledRotaryEmbedding", - "Phi3RMSNorm", "YuanRMSNorm", "YuanRotaryEmbedding", "Phi3LongRoPEScaledRotaryEmbedding", "Qwen2RMSNorm" + "Phi3RMSNorm", "YuanRMSNorm", "YuanRotaryEmbedding", "Phi3LongRoPEScaledRotaryEmbedding", "Qwen2RMSNorm", + "DeepseekV2RMSNorm", "DeepseekV2YarnRotaryEmbedding", "MoEGate" ] return module.__class__ in load_layers or module._get_name() in load_layer_names @@ -332,9 +333,9 @@ def _replace(self, child, name, conv_linear_layer): return weight_shape = child.weight.shape mp_replace = ReplaceWithTensorSlicing(mp_group=self.mp_group) - # For mixtral-7x8b, need to skip MoE gate linear replace. - if name == "block_sparse_moe.gate" or (('mlp.shared_expert_gate' == name or 'mlp.gate' == name) - and 'qwen2_moe' in str(type(self.module))): + # For TP layer skip, e.g., MoE gate, deepseek low rank layer skip + if "q_a_proj" in name or "kv_a_proj_with_mqa" in name or name == "block_sparse_moe.gate" or ( + ('mlp.shared_expert_gate' == name or 'mlp.gate' == name) and 'qwen2_moe' in str(type(self.module))): return child # For Yuan model if 'Yuan' in str(self.module): @@ -350,11 +351,15 @@ def _replace(self, child, name, conv_linear_layer): arctic_w2_all_reduce_linear = False if 'Arctic' in str(self.module) and 'w2' in name: arctic_w2_all_reduce_linear = True + # For MoE MLP model, e.g., deepseek and jamba + down_proj = False + if 'down_proj' in name: + down_proj = True # For MLP including chunk layer. if 'gate_up_proj' in name or ('dense_h_to_4h' in name and 'GLM' in str(self.module)): weight, bias = shard_chunk_mlp(child.weight.data, child.bias, dist.get_rank(), dist.get_world_size()) return LinearLayer(weight=weight, bias=bias) - if name in self.all_reduce_linears or arctic_w2_all_reduce_linear: + if name in self.all_reduce_linears or arctic_w2_all_reduce_linear or down_proj: # if conv_linear_layer [weight_shape[1], weight_shape[0] // mp_size] # else [weight_shape[0], weight_shape[1] // mp_size] diff --git a/deepspeed/module_inject/tp_shard.py b/deepspeed/module_inject/tp_shard.py index 3e6fc2b63ef1..ded262edcf61 100644 --- a/deepspeed/module_inject/tp_shard.py +++ b/deepspeed/module_inject/tp_shard.py @@ -42,11 +42,16 @@ def get_num_attention_heads(): def get_shard_size(total_size, mp_size, name=None, rank=None): global num_kv_heads last_linear = ["lm_head", "embed_out"] + # MoE MLP layer use near even division will get better perf. + moe_mlp_layer = ["gate_proj", "up_proj", "down_proj", "w1", "w2", "w3"] + not_moe_mlp_layer = True + if name != None and any(s in str(name) for s in moe_mlp_layer): + not_moe_mlp_layer = False # When we have num_kv_heads defined, uneven division is possible, otherwise enforce near even division if rank == None: rank = dist.get_rank() if num_kv_heads != None and total_size % num_kv_heads == 0 and "mlp" not in str(name) and str( - name) not in last_linear: + name) not in last_linear and not_moe_mlp_layer: my_slices = (num_kv_heads // mp_size) + (1 if rank < (num_kv_heads % mp_size) else 0) return total_size * my_slices // num_kv_heads else: From 0fc3daade7b982884c60a6ac08c7a71f19cd0a5d Mon Sep 17 00:00:00 2001 From: Lev Kurilenko <113481193+lekurile@users.noreply.github.com> Date: Thu, 9 Jan 2025 12:11:35 -0800 Subject: [PATCH 682/754] Add position_ids arg to OPTEmbedding forward function (#6939) This PR updates the DeepSpeed `OPTEmbedding` forward function to include a new `positions_ids` argument. --------- Co-authored-by: Logan Adams --- .github/workflows/nv-ds-chat.yml | 2 +- deepspeed/module_inject/layers.py | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/nv-ds-chat.yml b/.github/workflows/nv-ds-chat.yml index 329a1060f5eb..7e209cbe4397 100644 --- a/.github/workflows/nv-ds-chat.yml +++ b/.github/workflows/nv-ds-chat.yml @@ -43,7 +43,7 @@ jobs: - name: Install deepspeed run: | - pip install transformers==4.45.2 + pip install transformers pip install .[dev] ds_report diff --git a/deepspeed/module_inject/layers.py b/deepspeed/module_inject/layers.py index 22d24820d404..722ba413a671 100644 --- a/deepspeed/module_inject/layers.py +++ b/deepspeed/module_inject/layers.py @@ -191,7 +191,7 @@ def __init__(self, weight_shape=None, weight=None, bias=None): self.offset = 2 super().__init__(weight_shape, weight=weight) - def forward(self, attention_mask: torch.LongTensor, past_key_values_length: int = 0): + def forward(self, attention_mask: torch.LongTensor, past_key_values_length: int = 0, position_ids: int = 0): """`input_ids_shape` is expected to be [bsz x seqlen].""" attention_mask = attention_mask.long() From 1d15ef0acfcbbd0efb90458fe08c234a21328e77 Mon Sep 17 00:00:00 2001 From: Logan Adams <114770087+loadams@users.noreply.github.com> Date: Thu, 9 Jan 2025 15:56:54 -0800 Subject: [PATCH 683/754] Add information on security expectations with this software (#6941) Inspired by the link vllm [includes](https://github.com/vllm-project/vllm/blob/main/SECURITY.md), this starts to give users insight into the security expectations they should have from using DeepSpeed. --- SECURITY.md | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/SECURITY.md b/SECURITY.md index 9e9391ee0bac..3061748e610b 100644 --- a/SECURITY.md +++ b/SECURITY.md @@ -39,3 +39,7 @@ We prefer all communications to be in English. Microsoft follows the principle of [Coordinated Vulnerability Disclosure](https://www.microsoft.com/en-us/msrc/cvd). + +--- + +Please see [PyTorch's Security Policy](https://github.com/pytorch/pytorch/blob/main/SECURITY.md) for more information and recommendations on how to securely interact with models. From fa8db5cf2f9cf724fd2703353d40e3b37a8e7310 Mon Sep 17 00:00:00 2001 From: Yejing-Lai Date: Sat, 11 Jan 2025 06:18:01 +0800 Subject: [PATCH 684/754] Support pure meta model lm_head tp (#6812) Add lm_head tp support when checkpoint not provided to deepspeed.init_inference(). --------- Co-authored-by: Logan Adams <114770087+loadams@users.noreply.github.com> Co-authored-by: Ma, Guokai --- deepspeed/module_inject/replace_module.py | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/deepspeed/module_inject/replace_module.py b/deepspeed/module_inject/replace_module.py index e59f84bc8453..00b22aac81d8 100644 --- a/deepspeed/module_inject/replace_module.py +++ b/deepspeed/module_inject/replace_module.py @@ -342,13 +342,11 @@ def set_lm_head(module): module.lm_head, "weight") and module.lm_head.weight.is_meta: module.lm_head.weight = embedding_weight # enable tensor parallel for the last linear - if hasattr(module, "lm_head") and hasattr(module.lm_head, - "weight") and not module.lm_head.weight.is_meta and isinstance( - module.lm_head, torch.nn.Linear): + if hasattr(module, "lm_head") and hasattr(module.lm_head, "weight") and isinstance( + module.lm_head, torch.nn.Linear): module = replace_wo_policy(module, ("lm_head", ), 0, "lm_head") - elif hasattr(module, "embed_out") and hasattr(module.embed_out, - "weight") and not module.embed_out.weight.is_meta and isinstance( - module.embed_out, torch.nn.Linear): + elif hasattr(module, "embed_out") and hasattr(module.embed_out, "weight") and isinstance( + module.embed_out, torch.nn.Linear): module = replace_wo_policy(module, ("embed_out", ), 0, "embed_out") elif hasattr(module, "language_model") and hasattr(module.language_model, "lm_head"): module = replace_wo_policy(module.language_model, ("lm_head", ), 0, "lm_head") @@ -389,7 +387,6 @@ def conv2d_parallel_shard_weights(model, rank, world_size): checkpoint=checkpoint_file) pbar.update(1) gc.collect() - replaced_module = set_lm_head(replaced_module) # conv2d tp module replace # Now is for yuan model. Add model list and conv policy to decide whether to replace conv. if 'Yuan' in str(replaced_module): @@ -399,6 +396,9 @@ def conv2d_parallel_shard_weights(model, rank, world_size): orig_class=orig_layer_impl, replace_fn=replace_fn, _replace_policy=config.injection_policy_tuple) + # AutoTP default set lm_head tp + if not config.replace_with_kernel_inject: + replaced_module = set_lm_head(replaced_module) quantizer = GroupQuantizer(q_int8=quantize) world_size = dist.get_world_size() if dist.is_initialized() else 1 From 396f8db793b37db9b11847df8245f85bc57eeaa3 Mon Sep 17 00:00:00 2001 From: Nir Sonnenschein Date: Mon, 13 Jan 2025 18:50:22 +0200 Subject: [PATCH 685/754] Remove op compilation flags due to perf issue (#6944) in some scenarios some of the optimization flags for the ops compiler for HPU can cause a significant performance degradation. remove the flags until the issue is resolved --- op_builder/hpu/builder.py | 3 --- 1 file changed, 3 deletions(-) diff --git a/op_builder/hpu/builder.py b/op_builder/hpu/builder.py index c176a586ba49..11e710a8ee48 100644 --- a/op_builder/hpu/builder.py +++ b/op_builder/hpu/builder.py @@ -32,9 +32,6 @@ def builder(self): def cxx_args(self): args = ['-O3', '-g', '-Wno-reorder'] - CPU_ARCH = self.cpu_arch() - SIMD_WIDTH = self.simd_width() - args += [CPU_ARCH, '-fopenmp', SIMD_WIDTH] return args def libraries_args(self): From 66d3d3e94dbdfbbf6535cab66256c238983fc7c3 Mon Sep 17 00:00:00 2001 From: Logan Adams <114770087+loadams@users.noreply.github.com> Date: Mon, 13 Jan 2025 10:34:15 -0800 Subject: [PATCH 686/754] Pin nv-a6000 workflow (#6938) Breaking change in transformers is https://github.com/huggingface/transformers/pull/35235. Need to make changes to unpin nv-a6000 workflow. --- .github/workflows/nv-a6000.yml | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/.github/workflows/nv-a6000.yml b/.github/workflows/nv-a6000.yml index 639f27498dd9..0547431e3099 100644 --- a/.github/workflows/nv-a6000.yml +++ b/.github/workflows/nv-a6000.yml @@ -40,8 +40,9 @@ jobs: python -c "import torch; print('CUDA available:', torch.cuda.is_available())" - name: Install transformers run: | - git clone --depth=1 https://github.com/huggingface/transformers + git clone https://github.com/huggingface/transformers cd transformers + git checkout v4.47.1 git rev-parse --short HEAD python -m pip install . - name: Install deepspeed From fae714d6bdf45ab0f6b98554d542a0f4e04a0eb9 Mon Sep 17 00:00:00 2001 From: Omar Elayan <142979319+oelayan7@users.noreply.github.com> Date: Wed, 15 Jan 2025 21:25:29 +0200 Subject: [PATCH 687/754] [inf] Add config var to enable keeping module on host (#6846) Using keep_module_on_host config var will let us control if the loaded checkpoints to model parameters will be moved to the device or stay on host --------- Co-authored-by: Olatunji Ruwase Co-authored-by: Logan Adams <114770087+loadams@users.noreply.github.com> --- deepspeed/inference/config.py | 9 +++++++ deepspeed/inference/engine.py | 2 +- deepspeed/module_inject/auto_tp.py | 33 +++++++++++++++-------- deepspeed/module_inject/replace_module.py | 3 ++- tests/unit/inference/test_inference.py | 21 +++++++++++++-- 5 files changed, 53 insertions(+), 15 deletions(-) diff --git a/deepspeed/inference/config.py b/deepspeed/inference/config.py index 42ffebbc4386..6df61f7c8841 100644 --- a/deepspeed/inference/config.py +++ b/deepspeed/inference/config.py @@ -174,6 +174,15 @@ class DeepSpeedInferenceConfig(DeepSpeedConfigModel): values for :any:`DeepSpeedMoEConfig`. """ + keep_module_on_host: bool = False + """ + When loading checkpoints to model parameters, they are moved to the device. In very large models + this might fill the device and cause OOM. Setting this flag to true, will keep checkpoints on + host and not move them directly to the device (giving an option to quantize checkpoint data before + moving it to the device for example). + Set only for models with injection policies and auto TP. + """ + quant: QuantizationConfig = {} """ NOTE: only works for int8 dtype. diff --git a/deepspeed/inference/engine.py b/deepspeed/inference/engine.py index 131dce07d22d..be6336d02a19 100755 --- a/deepspeed/inference/engine.py +++ b/deepspeed/inference/engine.py @@ -169,7 +169,7 @@ def __init__(self, model, config): is_meta_device = hasattr(self.module, "device") and self.module.device.type == 'meta' if is_meta_device: self.module.to_empty(device=device) - else: + elif not config.keep_module_on_host: self.module.to(device) if config.tensor_parallel.tp_size > 1: diff --git a/deepspeed/module_inject/auto_tp.py b/deepspeed/module_inject/auto_tp.py index 66d7c2659359..8bdcf6faa053 100755 --- a/deepspeed/module_inject/auto_tp.py +++ b/deepspeed/module_inject/auto_tp.py @@ -17,14 +17,14 @@ from deepspeed.module_inject.tp_shard import get_shard_size, get_shard_size_list -def move(tensor, device): +def move(tensor, device, copy=True): if tensor.is_meta: return torch.empty_like(tensor, device=device) else: # Using new tensors help in freeing memory (after split for example) was done before by calling clone(). # Using copy=True instead of clone() will help in case of cpu --> cpu. # Otherwise to() will not create a new copy for the view of the full tensor, and it will not be de-referenced. - return tensor.to(device, copy=True) + return tensor.to(device, copy=copy) class ReplaceWithTensorSlicing: @@ -189,7 +189,14 @@ def load(module, state_dict, prefix, mp_group=None): class AutoTP(): - def __init__(self, module, all_reduce_linears, prefix, state_dict, linear_layer_setting, orig_layer_impl): + def __init__(self, + module, + all_reduce_linears, + prefix, + state_dict, + linear_layer_setting, + orig_layer_impl, + keep_module_on_host=False): self.module = module self.all_reduce_linears = all_reduce_linears self.prefix = prefix @@ -201,6 +208,7 @@ def __init__(self, module, all_reduce_linears, prefix, state_dict, linear_layer_ self.orig_layer_impl = orig_layer_impl self.linear_policies = None self.conv_linear_layer = False + self.keep_module_on_host = keep_module_on_host def in_module_list(module, module_list): for item in module_list: @@ -331,6 +339,10 @@ def set_tensor_parallel_config(self, mp_size, mp_group): def _replace(self, child, name, conv_linear_layer): if getattr(child, "replaced", False) == True: return + device_name = 'cpu' if self.keep_module_on_host else get_accelerator().current_device_name() + # keep_module_on_host is used to keep the module on the host. Checkpoints are loaded to the host first (in some + # cases it can be done from the disk even to prevent filling host's memory), thus no need to create a new copy. + return_new_copy = not self.keep_module_on_host weight_shape = child.weight.shape mp_replace = ReplaceWithTensorSlicing(mp_group=self.mp_group) # For TP layer skip, e.g., MoE gate, deepseek low rank layer skip @@ -368,7 +380,7 @@ def _replace(self, child, name, conv_linear_layer): data = child.weight.data.split(get_shard_size_list( weight_shape[0] if self.conv_linear_layer else weight_shape[1], self.mp_size, name), dim=1) - data_dc = move(data[mp_replace.gpu_index], get_accelerator().current_device_name()).detach() + data_dc = move(data[mp_replace.gpu_index], device_name, return_new_copy).detach() del data setattr(child, "replaced", True) @@ -376,10 +388,9 @@ def _replace(self, child, name, conv_linear_layer): return LmHeadLinearAllreduce( torch.nn.parameter.Parameter(data_dc, requires_grad=False), dist.get_rank(), dist.get_world_size(), child.bias if child.bias is None else torch.nn.parameter.Parameter( - move(child.bias, - get_accelerator().current_device_name())), self.mp_group) + move(child.bias, device_name, return_new_copy)), self.mp_group) return LinearAllreduce(torch.nn.parameter.Parameter(data_dc, requires_grad=False), child.bias if child.bias is None else \ - torch.nn.parameter.Parameter(move(child.bias, get_accelerator().current_device_name())), self.mp_group) + torch.nn.parameter.Parameter(move(child.bias, device_name, return_new_copy)), self.mp_group) else: # if conv_linear_layer [weight_shape[1], weight_shape[0] // mp_size] @@ -392,22 +403,22 @@ def _replace(self, child, name, conv_linear_layer): #The copy is a regular copy, The shape of dst and src is the same data_dc = move( prepare_tp_fused_qkvw(self.module, child.weight.data, self.mp_size, mp_replace.gpu_index), - get_accelerator().current_device_name()) + device_name, return_new_copy) bias_data_dc = None if child.bias is None else move( prepare_tp_fused_qkvw(self.module, child.bias.data, self.mp_size, mp_replace.gpu_index), - get_accelerator().current_device_name()) + device_name, return_new_copy) else: data = child.weight.data.split(get_shard_size_list(weight_shape[0], self.mp_size, name), dim=1 if self.conv_linear_layer else 0) - data_dc = move(data[mp_replace.gpu_index], get_accelerator().current_device_name()).detach() + data_dc = move(data[mp_replace.gpu_index], device_name, return_new_copy).detach() del data if child.bias is not None: bias_data = child.bias.data.split(get_shard_size_list( weight_shape[1] if self.conv_linear_layer else weight_shape[0], self.mp_size, name), dim=0) - bias_data = move(bias_data[mp_replace.gpu_index], get_accelerator().current_device_name()) + bias_data = move(bias_data[mp_replace.gpu_index], device_name, return_new_copy) bias_data_dc = torch.nn.parameter.Parameter(bias_data, requires_grad=False) del bias_data else: diff --git a/deepspeed/module_inject/replace_module.py b/deepspeed/module_inject/replace_module.py index 00b22aac81d8..32c88549c821 100644 --- a/deepspeed/module_inject/replace_module.py +++ b/deepspeed/module_inject/replace_module.py @@ -268,7 +268,8 @@ def replace_wo_policy(module, all_reduce_linears, prefix="", state_dict=None): #mp_replace = ReplaceWithTensorSlicing(mp_group=config.tensor_parallel.tp_group) # 1. Create AutoTP object - _autotp = AutoTP(module, all_reduce_linears, prefix, state_dict, linear_layer_setting, orig_layer_impl) + _autotp = AutoTP(module, all_reduce_linears, prefix, state_dict, linear_layer_setting, orig_layer_impl, + config.keep_module_on_host) # 2. Set the tensor parallelism config _autotp.set_tensor_parallel_config(config.tensor_parallel.tp_size, config.tensor_parallel.tp_group) diff --git a/tests/unit/inference/test_inference.py b/tests/unit/inference/test_inference.py index 9b563523dbeb..df85ed232a2e 100644 --- a/tests/unit/inference/test_inference.py +++ b/tests/unit/inference/test_inference.py @@ -554,6 +554,7 @@ def test(self, model_w_task, injection_policy, query, inf_kwargs, assert_fn, dty @pytest.mark.seq_inference +@pytest.mark.parametrize('keep_module_on_host', [True, False]) @pytest.mark.parametrize( "model_w_task", [("Helsinki-NLP/opus-mt-en-de", "translation"), ("Salesforce/codegen-350M-mono", "text-generation")], @@ -570,6 +571,7 @@ def test( inf_kwargs, assert_fn, dtype, + keep_module_on_host, ): invalid_test_msg = validate_test(model_w_task, dtype, enable_cuda_graph=False, enable_triton=False) if invalid_test_msg: @@ -592,13 +594,20 @@ def test( framework="pt") bs_output = pipe(query, **inf_kwargs) - pipe.model = deepspeed.init_inference(pipe.model, mp_size=world_size, dtype=dtype) + pipe.model = deepspeed.init_inference(pipe.model, + mp_size=world_size, + dtype=dtype, + keep_module_on_host=keep_module_on_host) ds_output = pipe(query, **inf_kwargs) print(local_rank, "baseline", bs_output) print(local_rank, "deepspeed", ds_output) assert assert_fn(bs_output, ds_output) + if keep_module_on_host: + for name, param in model.named_parameters(): + assert param.device == torch.device('cpu'), f"keep_module_on_host is on but param {name} is not on cpu" + @pytest.mark.world_size(3) def test_odd_world_size( self, @@ -607,6 +616,7 @@ def test_odd_world_size( inf_kwargs, assert_fn, dtype, + keep_module_on_host, ): invalid_test_msg = validate_test(model_w_task, dtype, enable_cuda_graph=False, enable_triton=False) if invalid_test_msg: @@ -624,13 +634,20 @@ def test_odd_world_size( framework="pt") bs_output = pipe(query, **inf_kwargs) - pipe.model = deepspeed.init_inference(pipe.model, mp_size=world_size, dtype=dtype) + pipe.model = deepspeed.init_inference(pipe.model, + mp_size=world_size, + dtype=dtype, + keep_module_on_host=keep_module_on_host) ds_output = pipe(query, **inf_kwargs) print(local_rank, "baseline", bs_output) print(local_rank, "deepspeed", ds_output) assert assert_fn(bs_output, ds_output) + if keep_module_on_host: + for name, param in model.named_parameters(): + assert param.device == torch.device('cpu'), f"keep_module_on_host is on but param {name} is not on cpu" + @pytest.mark.nightly @pytest.mark.parametrize( From 05eaf3d1cab0f42f130a153802c7b94d86ecc872 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Quentin=20Gallou=C3=A9dec?= <45557362+qgallouedec@users.noreply.github.com> Date: Wed, 15 Jan 2025 23:08:56 +0100 Subject: [PATCH 688/754] `warn` to `warning` (#6952) `warn` is deprecated, see https://docs.python.org/3/library/logging.html#logging.Logger.warning ```DeprecationWarning: The 'warn' method is deprecated, use 'warning' instead``` --- accelerator/real_accelerator.py | 2 +- deepspeed/runtime/base_optimizer.py | 2 +- deepspeed/runtime/engine.py | 4 ++-- deepspeed/runtime/lr_schedules.py | 2 +- deepspeed/runtime/zero/stage_1_and_2.py | 2 +- 5 files changed, 6 insertions(+), 6 deletions(-) diff --git a/accelerator/real_accelerator.py b/accelerator/real_accelerator.py index ced9218d7aca..eb4e17850882 100644 --- a/accelerator/real_accelerator.py +++ b/accelerator/real_accelerator.py @@ -178,7 +178,7 @@ def get_accelerator(): if accelerator_name is None: # borrow this log from PR#5084 if accel_logger is not None: - accel_logger.warn( + accel_logger.warning( "Setting accelerator to CPU. If you have GPU or other accelerator, we were unable to detect it.") # cpu added as catch-all when accelerator detection fails accelerator_name = "cpu" diff --git a/deepspeed/runtime/base_optimizer.py b/deepspeed/runtime/base_optimizer.py index b8df7499450d..d2c54155da89 100644 --- a/deepspeed/runtime/base_optimizer.py +++ b/deepspeed/runtime/base_optimizer.py @@ -28,7 +28,7 @@ def load_hp_checkpoint_state_from_checkpoint_dir(self, lp_groups_name: str, chec tp_rank = bwc_tensor_model_parallel_rank(mpu=self.mpu) if self.mpu is None: - logger.warn("MPU is not provided, setting tp size to 1 in checkpoint loading.") + logger.warning("MPU is not provided, setting tp size to 1 in checkpoint loading.") tp_world_size = 1 else: tp_world_size = self.mpu.get_slice_parallel_world_size() if hasattr(self.mpu, "get_slice_parallel_world_size") \ diff --git a/deepspeed/runtime/engine.py b/deepspeed/runtime/engine.py index 5f023d87f375..9b9a2e509d61 100755 --- a/deepspeed/runtime/engine.py +++ b/deepspeed/runtime/engine.py @@ -3120,7 +3120,7 @@ def _get_all_zero_checkpoints(self, load_dir, tag): if bf16_mode is not self.bfloat16_enabled(): checkpoint_bit16 = BFLOAT16 if bf16_mode else FP16 engine_bit16 = BFLOAT16 if self.bfloat16_enabled() else FP16 - logger.warn(f'Loading {checkpoint_bit16} zero checkpoints into {engine_bit16} training engine') + logger.warning(f'Loading {checkpoint_bit16} zero checkpoints into {engine_bit16} training engine') return self._get_all_zero_checkpoint_state_dicts(zero_ckpt_names) return None @@ -3276,7 +3276,7 @@ def _save_moe_checkpoint(self, save_dir, tag, client_state={}, exclude_frozen_pa local_expert_id = None if not m: - logger.warn(f'No expert found in key {key}.') + logger.warning(f'No expert found in key {key}.') else: local_expert_id = m.group(1) diff --git a/deepspeed/runtime/lr_schedules.py b/deepspeed/runtime/lr_schedules.py index 899358e2c5ef..2ffd0bf9f036 100755 --- a/deepspeed/runtime/lr_schedules.py +++ b/deepspeed/runtime/lr_schedules.py @@ -508,7 +508,7 @@ def _initialize_lr(self, optimizer, cycle_min_lr, cycle_max_lr, decay_lr_rate, l def _initialize_momentum(self, optimizer, cycle_min_mom, cycle_max_mom, decay_mom_rate, last_batch_iteration): if 'betas' not in optimizer.defaults: optimizer_name = type(optimizer).__name__ - logger.warn( + logger.warning( f"cycle_momentum is disabled because optimizer {optimizer_name} does not support momentum, no betas attribute in defaults" ) self.cycle_momentum = False diff --git a/deepspeed/runtime/zero/stage_1_and_2.py b/deepspeed/runtime/zero/stage_1_and_2.py index ecb2a527f870..0508766f8896 100755 --- a/deepspeed/runtime/zero/stage_1_and_2.py +++ b/deepspeed/runtime/zero/stage_1_and_2.py @@ -614,7 +614,7 @@ def _configure_moe_settings(self): assert self.contiguous_gradients, "Contiguous Gradients in ZeRO Stage 2 must be set to True for MoE. Other code paths are not tested with MoE" # NOTE: To run ZeRO stage 1 with MoE, we need to set self.contiguous_gradients to True or ignore the assertion if not self.partition_gradients and not self.contiguous_gradients: - logger.warn( + logger.warning( "ZeRO Stage 1 has not been thoroughly tested with MoE. This configuration is still experimental.") assert self.reduce_scatter, "Reduce Scatter in ZeRO Stage 2 must be set to True for MoE. Other code paths are not tested with MoE" From 018ece5af2d89a11a4a235f81f94496c78b4f990 Mon Sep 17 00:00:00 2001 From: Xia Weiwen Date: Thu, 16 Jan 2025 10:11:07 -0800 Subject: [PATCH 689/754] Add extra_repr to Linear classes for debugging purpose (#6954) **Summary** This PR adds `extra_repr` method to some Linear classes so that additional info is printed when printing such modules. It is useful for debugging. Affected modules: - LinearLayer - LinearAllreduce - LmHeadLinearAllreduce The `extra_repr` method gives the following info: - in_features - out_features - bias (true or false) - dtype **Example** Print llama-2-7b model on rank 0 after `init_inference` with world size = 2. Previously we only got class names of these modules: ``` InferenceEngine( (module): LlamaForCausalLM( (model): LlamaModel( (embed_tokens): Embedding(32000, 4096) (layers): ModuleList( (0-31): 32 x LlamaDecoderLayer( (self_attn): LlamaSdpaAttention( (q_proj): LinearLayer() (k_proj): LinearLayer() (v_proj): LinearLayer() (o_proj): LinearAllreduce() (rotary_emb): LlamaRotaryEmbedding() ) (mlp): LlamaMLP( (gate_proj): LinearLayer() (up_proj): LinearLayer() (down_proj): LinearAllreduce() (act_fn): SiLU() ) (input_layernorm): LlamaRMSNorm((4096,), eps=1e-05) (post_attention_layernorm): LlamaRMSNorm((4096,), eps=1e-05) ) ) (norm): LlamaRMSNorm((4096,), eps=1e-05) (rotary_emb): LlamaRotaryEmbedding() ) (lm_head): LmHeadLinearAllreduce() ) ) ``` Now we get more useful info: ``` InferenceEngine( (module): LlamaForCausalLM( (model): LlamaModel( (embed_tokens): Embedding(32000, 4096) (layers): ModuleList( (0-31): 32 x LlamaDecoderLayer( (self_attn): LlamaSdpaAttention( (q_proj): LinearLayer(in_features=4096, out_features=2048, bias=False, dtype=torch.bfloat16) (k_proj): LinearLayer(in_features=4096, out_features=2048, bias=False, dtype=torch.bfloat16) (v_proj): LinearLayer(in_features=4096, out_features=2048, bias=False, dtype=torch.bfloat16) (o_proj): LinearAllreduce(in_features=2048, out_features=4096, bias=False, dtype=torch.bfloat16) (rotary_emb): LlamaRotaryEmbedding() ) (mlp): LlamaMLP( (gate_proj): LinearLayer(in_features=4096, out_features=5504, bias=False, dtype=torch.bfloat16) (up_proj): LinearLayer(in_features=4096, out_features=5504, bias=False, dtype=torch.bfloat16) (down_proj): LinearAllreduce(in_features=5504, out_features=4096, bias=False, dtype=torch.bfloat16) (act_fn): SiLU() ) (input_layernorm): LlamaRMSNorm((4096,), eps=1e-05) (post_attention_layernorm): LlamaRMSNorm((4096,), eps=1e-05) ) ) (norm): LlamaRMSNorm((4096,), eps=1e-05) (rotary_emb): LlamaRotaryEmbedding() ) (lm_head): LmHeadLinearAllreduce(in_features=2048, out_features=32000, bias=False, dtype=torch.bfloat16) ) ) ``` --- deepspeed/module_inject/layers.py | 21 +++++++++++++++++++++ 1 file changed, 21 insertions(+) diff --git a/deepspeed/module_inject/layers.py b/deepspeed/module_inject/layers.py index 722ba413a671..2f884ba4fb09 100644 --- a/deepspeed/module_inject/layers.py +++ b/deepspeed/module_inject/layers.py @@ -91,6 +91,13 @@ def forward(self, input): output += self.bias return output + def extra_repr(self): + out_features, in_features = self.weight.shape if self.weight is not None else (None, None) + dtype = self.weight.dtype if self.weight is not None else None + extra_repr_str = "in_features={}, out_features={}, bias={}, dtype={}".format( + in_features, out_features, self.bias is not None, dtype) + return extra_repr_str + class LmHeadLinearAllreduce(nn.Module): @@ -120,6 +127,13 @@ def forward(self, input): output += self.bias return output + def extra_repr(self): + out_features, in_features = self.weight.shape if self.weight is not None else (None, None) + dtype = self.weight.dtype if self.weight is not None else None + extra_repr_str = "in_features={}, out_features={}, bias={}, dtype={}".format( + in_features, out_features, self.bias is not None, dtype) + return extra_repr_str + class LinearLayer(nn.Module): @@ -144,6 +158,13 @@ def forward(self, input): output += self.bias return output + def extra_repr(self): + out_features, in_features = self.weight.shape + dtype = self.weight.dtype + extra_repr_str = "in_features={}, out_features={}, bias={}, dtype={}".format( + in_features, out_features, self.bias is not None, dtype) + return extra_repr_str + class Normalize(nn.Module): From f97f0885cf942aab1559d0f6a060d4801bff3a61 Mon Sep 17 00:00:00 2001 From: Logan Adams <114770087+loadams@users.noreply.github.com> Date: Fri, 17 Jan 2025 09:43:51 -0800 Subject: [PATCH 690/754] Update import for torchvision.transformers (#6958) Fixes import - found via [torchfix](https://github.com/pytorch-labs/torchfix). --- tests/unit/alexnet_model.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/unit/alexnet_model.py b/tests/unit/alexnet_model.py index 51e80e7f9e62..6fe84edf4eda 100644 --- a/tests/unit/alexnet_model.py +++ b/tests/unit/alexnet_model.py @@ -84,7 +84,7 @@ def cast_to_half(x): def cifar_trainset(fp16=False): torchvision = pytest.importorskip("torchvision", minversion="0.5.0") - import torchvision.transforms as transforms + from torchvision import transforms transform_list = [ transforms.ToTensor(), From 7f3d669b40f8d29010efd9578d4a2cdd0f16b20e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Hyogeun=20Oh=20=28=EC=98=A4=ED=9A=A8=EA=B7=BC=29?= Date: Sat, 18 Jan 2025 02:44:49 +0900 Subject: [PATCH 691/754] Remove Duplicate Declaration of pandas in `Dockerfile` (#6959) ### Description This pull request removes the redundant installation of `pandas` from the `Dockerfile`. It was previously declared twice, and this update eliminates the duplicate entry, improving the clarity and maintainability of the `Dockerfile`. https://github.com/microsoft/DeepSpeed/blob/018ece5af2d89a11a4a235f81f94496c78b4f990/docker/Dockerfile#L124 https://github.com/microsoft/DeepSpeed/blob/018ece5af2d89a11a4a235f81f94496c78b4f990/docker/Dockerfile#L135 ### Changes Removed the duplicate pandas installation line from the `RUN pip install` command. --- docker/Dockerfile | 1 - 1 file changed, 1 deletion(-) diff --git a/docker/Dockerfile b/docker/Dockerfile index 035a094d0051..5a62a5a01aba 100755 --- a/docker/Dockerfile +++ b/docker/Dockerfile @@ -132,7 +132,6 @@ RUN pip install psutil \ sentencepiece \ msgpack \ requests \ - pandas \ sphinx \ sphinx_rtd_theme \ scipy \ From bc76b04e2800d7761c4e1b99dd9a4049bb94f569 Mon Sep 17 00:00:00 2001 From: inkcherry Date: Wed, 22 Jan 2025 00:49:06 +0800 Subject: [PATCH 692/754] Add the missing view operations from sequence parallel(async). (#6750) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit FYI @loadams a view operation was missing in some updates compared to the original version https://github.com/microsoft/DeepSpeed/blob/17ed7c77c58611a923a6c8d2a3d21d359cd046e8/deepspeed/sequence/layer.py#L56 add missing view operation. The shape required for the view cannot be easily obtained in the current function, so refactor layout params code. --------- Co-authored-by: Logan Adams <114770087+loadams@users.noreply.github.com> Co-authored-by: Masahiro Tanaka <81312776+tohtana@users.noreply.github.com> --- deepspeed/sequence/layer.py | 129 +++++++++++++++++++----------------- 1 file changed, 70 insertions(+), 59 deletions(-) diff --git a/deepspeed/sequence/layer.py b/deepspeed/sequence/layer.py index ccc43fdf7164..ba5e596e0d6d 100644 --- a/deepspeed/sequence/layer.py +++ b/deepspeed/sequence/layer.py @@ -16,6 +16,71 @@ from deepspeed.utils import groups +def _generate_layout_params(scatter_idx, batch_dim_idx, seq_world_size, input): + """ + This function generates the parameters required for `permute` and `reshape` operations, + which are used to process data before and after `all2all` communication. + """ + if batch_dim_idx == 0: + if scatter_idx < 2: + bs, global_seq_len, num_local_head, head_dim = input.shape + pre_all2all_inp_shape = [bs, seq_world_size, global_seq_len // seq_world_size, num_local_head, head_dim] + pre_all2all_permute_idx = (1, 0, 2, 3, 4) + + post_all2all_permute_idx = (1, 2, 0, 3, 4) + post_all2all_res_shape = [bs, global_seq_len // seq_world_size, seq_world_size * num_local_head, head_dim] + else: + bs, local_seq_len, num_total_head, head_dim = input.shape + assert num_total_head % seq_world_size == 0, f"Number of heads ({num_total_head}) must be divisible by the sequence parallel size ({seq_world_size})!" + pre_all2all_inp_shape = [bs, local_seq_len, seq_world_size, num_total_head // seq_world_size, head_dim] + pre_all2all_permute_idx = (2, 0, 1, 3, 4) + + post_all2all_permute_idx = (1, 0, 2, 3, 4) + post_all2all_res_shape = [bs, seq_world_size * local_seq_len, num_total_head // seq_world_size, head_dim] + else: + if scatter_idx < 2: + global_seq_len, bs, num_local_head, head_dim = input.shape + pre_all2all_inp_shape = [seq_world_size, global_seq_len // seq_world_size, bs, num_local_head, head_dim] + pre_all2all_permute_idx = None + + post_all2all_permute_idx = (1, 2, 0, 3, 4) + post_all2all_res_shape = [bs, seq_world_size * global_seq_len, num_local_head // seq_world_size, head_dim] + else: + local_seq_len, bs, num_total_head, head_dim = input.shape + assert num_total_head % seq_world_size == 0, f"Number of heads ({num_total_head}) must be divisible by the sequence parallel size ({seq_world_size})!" + pre_all2all_inp_shape = [local_seq_len, bs, seq_world_size, num_total_head // seq_world_size, head_dim] + pre_all2all_permute_idx = (2, 0, 1, 3, 4) + post_all2all_permute_idx = None + post_all2all_res_shape = [local_seq_len * seq_world_size, bs, num_total_head // seq_world_size, head_dim] + + return pre_all2all_permute_idx, pre_all2all_inp_shape, post_all2all_permute_idx, post_all2all_res_shape + + +def post_all2all(permute_idx, res_shape): + """ + Post-processing function for `all2all` communication. + """ + + def post_func(input): + if permute_idx is not None: + input = input.permute(permute_idx).contiguous() + output = input.reshape(res_shape).contiguous() + + return output + + return post_func + + +def pre_all2all_fun(permute_idx, inp_shape, input): + """ + Pre-processing function for `all2all` communication. + """ + input_t = input.reshape(inp_shape).contiguous() + if permute_idx is not None: + input_t = input_t.permute(permute_idx).contiguous() + return input_t + + def _rotate_half(x): """ change sign so the last dimension becomes [-odd, +even] @@ -43,32 +108,6 @@ def apply_rotary_pos_emb(t, freqs_cos, freqs_sin): return res -def post_all2all(scatter_idx, batch_dim_idx, seq_world_size, bs, seq_len, num_head, head_dim): - - def post_func(input): - if batch_dim_idx == 0: - # b, s, n, h - if scatter_idx < 2: - output = input.permute(1, 2, 0, 3, 4).contiguous() - output = output.reshape(bs, seq_len // seq_world_size, seq_world_size * num_head, - head_dim).contiguous() - else: - output = input.permute(1, 0, 2, 3, 4).contiguous() - output = output.reshape(bs, seq_world_size * seq_len, num_head // seq_world_size, - head_dim).contiguous() - else: - # s, b, n, h - if scatter_idx < 2: - output = input.permute(1, 2, 0, 3, 4).contiguous() - output = output.reshape(seq_len // seq_world_size, bs, seq_world_size * num_head, - head_dim).contiguous() - else: - output = input.reshape(seq_len * seq_world_size, bs, num_head // seq_world_size, head_dim).contiguous() - return output - - return post_func - - def uneven_heads_all2all(input, scatter_idx, gather_idx, batch_dim_idx, group): seq_world_size = dist.get_world_size(group) inp_shape = list(input.shape) @@ -195,39 +234,12 @@ def single_all_to_all(input, scatter_idx, gather_idx, batch_dim_idx, group, asyn assert async_op == False, "uneven head sp does not support async op" return uneven_heads_all2all(input, scatter_idx, gather_idx, batch_dim_idx, group) - if batch_dim_idx == 0: - # b, s, n, h - if scatter_idx < 2: - bs, global_seq_len, num_local_head, head_dim = input.shape - input_t = input.reshape([bs, seq_world_size, global_seq_len // seq_world_size, num_local_head, - head_dim]).contiguous() - input_t = input_t.permute(1, 0, 2, 3, 4).contiguous() - else: - bs, local_seq_len, num_total_head, head_dim = input.shape - assert num_total_head % seq_world_size == 0, f"Number of heads ({num_total_head}) must be divisible by the sequence parallel size ({seq_world_size})!" - input_t = input.reshape([bs, local_seq_len, seq_world_size, num_total_head // seq_world_size, - head_dim]).contiguous() - input_t = input_t.permute(2, 0, 1, 3, 4).contiguous() - else: - # s, b, n, h - if scatter_idx < 2: - global_seq_len, bs, num_local_head, head_dim = input.shape - input_t = input.reshape([seq_world_size, global_seq_len // seq_world_size, bs, num_local_head, - head_dim]).contiguous() - else: - local_seq_len, bs, num_total_head, head_dim = input.shape - assert num_total_head % seq_world_size == 0, f"Number of heads ({num_total_head}) must be divisible by the sequence parallel size ({seq_world_size})!" - input_t = input.reshape([local_seq_len, bs, seq_world_size, num_total_head // seq_world_size, - head_dim]).contiguous() - input_t = input_t.permute(2, 0, 1, 3, 4).contiguous() + pre_all2all_permute_idx, pre_all2all_inp_shape, post_all2all_permute_idx, post_all2all_res_shape = _generate_layout_params( + scatter_idx, batch_dim_idx, seq_world_size, input) - if scatter_idx < 2: - post_all2all_fun = post_all2all(scatter_idx, batch_dim_idx, seq_world_size, bs, global_seq_len, num_local_head, - head_dim) - else: - post_all2all_fun = post_all2all(scatter_idx, batch_dim_idx, seq_world_size, bs, local_seq_len, num_total_head, - head_dim) + input_t = pre_all2all_fun(pre_all2all_permute_idx, pre_all2all_inp_shape, input) + post_all2all_fun = post_all2all(post_all2all_permute_idx, post_all2all_res_shape) output = torch.empty_like(input_t) work = dist.all_to_all_single(output, input_t, group=group, async_op=async_op) @@ -236,7 +248,7 @@ def single_all_to_all(input, scatter_idx, gather_idx, batch_dim_idx, group, asyn handle[type + '_work'] = work handle[type + '_grad'] = output handle[type + '_post_all2all_func'] = post_all2all_fun - return output + return output.view(post_all2all_res_shape) res = post_all2all_fun(output) return res @@ -271,7 +283,6 @@ def forward(ctx: Any, assert ctx.stream != None res = single_all_to_all(input, scatter_idx, gather_idx, batch_dim_idx, group, False) get_accelerator().current_stream().wait_stream(ctx.stream) - del ctx.stream.activation_buffer_list # The computation of d o_weight can overlap with the communication of d o_input elif not is_fwd and type in ('q', 'k'): From 8d1bc0a042cfa2a739719f88f91ffc6f86c8711a Mon Sep 17 00:00:00 2001 From: Logan Adams <114770087+loadams@users.noreply.github.com> Date: Tue, 21 Jan 2025 08:49:58 -0800 Subject: [PATCH 693/754] Update `torch.norm` to `torch.linalg.norm` and `torch.linalg.vector_norm` (#6931) - [x] Update PR since `torch.norm` and `torch.linalg.norm` have [different function signatures](https://pytorch.org/docs/stable/generated/torch.linalg.norm.html#torch.linalg.norm). - [x] Check if there are any numeric differences between the functions. - [x] Determine why there appear to be performance differences from others [here](https://github.com/pytorch/pytorch/issues/136360). - [x] Update to `torch.linalg.vectornorm` Follow up PR handles these in the comm folder: #6960 --- deepspeed/runtime/comm/compressed.py | 2 +- deepspeed/runtime/comm/hccl.py | 2 +- deepspeed/runtime/fp16/onebit/lamb.py | 2 +- deepspeed/runtime/zero/stage3.py | 2 +- deepspeed/runtime/zero/stage_1_and_2.py | 5 +++-- 5 files changed, 7 insertions(+), 6 deletions(-) diff --git a/deepspeed/runtime/comm/compressed.py b/deepspeed/runtime/comm/compressed.py index 7f8c7395451d..2c5482eb1ad7 100644 --- a/deepspeed/runtime/comm/compressed.py +++ b/deepspeed/runtime/comm/compressed.py @@ -96,7 +96,7 @@ def compressed_allreduce(self, buffer_m: torch.tensor, worker_error, server_erro compensated_server_m.add_(server_error) - server_scale = torch.norm(compensated_server_m) / np.sqrt(compensated_server_m.numel()) + server_scale = torch.linalg.norm(compensated_server_m) / np.sqrt(compensated_server_m.numel()) server_error.set_(compensated_server_m - server_scale * compensated_server_m.sign().add_(1).bool().float().add_(-0.5).mul_(2.0)) diff --git a/deepspeed/runtime/comm/hccl.py b/deepspeed/runtime/comm/hccl.py index 09fb11a731b8..b8639c7da4c9 100644 --- a/deepspeed/runtime/comm/hccl.py +++ b/deepspeed/runtime/comm/hccl.py @@ -83,7 +83,7 @@ def compressed_allreduce(self, buffer_m: torch.tensor, worker_error, server_erro compensated_server_m.add_(server_error) - server_scale = torch.norm(compensated_server_m) / np.sqrt(compensated_server_m.numel()) + server_scale = torch.linalg.norm(compensated_server_m) / np.sqrt(compensated_server_m.numel()) server_error.set_(compensated_server_m - server_scale * compensated_server_m.sign().add_(1).bool().float().add_(-0.5).mul_(2.0)) diff --git a/deepspeed/runtime/fp16/onebit/lamb.py b/deepspeed/runtime/fp16/onebit/lamb.py index 89b6f40a308c..9e7bae816ecd 100644 --- a/deepspeed/runtime/fp16/onebit/lamb.py +++ b/deepspeed/runtime/fp16/onebit/lamb.py @@ -177,7 +177,7 @@ def step(self, closure=None, grads=None): # This is used to reduce compression error during compression stage. momentum_scales = [] for group in self.param_groups: - momentum_scales.append([(torch.linalg.norm(self.state[p]['exp_avg']) / + momentum_scales.append([(torch.linalg.vector_norm(self.state[p]['exp_avg']) / np.sqrt(torch.numel(self.state[p]['exp_avg']))).item() for p in group['params']]) united_scale = sum([sum(x) for x in momentum_scales]) / sum([len(x) for x in momentum_scales]) diff --git a/deepspeed/runtime/zero/stage3.py b/deepspeed/runtime/zero/stage3.py index 28f91cb9b3ab..9c06567ed100 100644 --- a/deepspeed/runtime/zero/stage3.py +++ b/deepspeed/runtime/zero/stage3.py @@ -2101,7 +2101,7 @@ def step(self, closure=None): return norm_groups = self._get_norm_groups() - scaled_global_grad_norm = torch.linalg.norm(torch.stack(norm_groups)) + scaled_global_grad_norm = torch.linalg.vector_norm(torch.stack(norm_groups)) # Stash unscaled gradient norm self._global_grad_norm = scaled_global_grad_norm / self.loss_scale diff --git a/deepspeed/runtime/zero/stage_1_and_2.py b/deepspeed/runtime/zero/stage_1_and_2.py index 0508766f8896..ed3425167944 100755 --- a/deepspeed/runtime/zero/stage_1_and_2.py +++ b/deepspeed/runtime/zero/stage_1_and_2.py @@ -1691,7 +1691,8 @@ def get_grad_norm_direct(self, gradients, params, norm_type=2): continue if is_model_parallel_parameter(p) or (self.model_parallel_rank == 0): all_norms.append( - torch.norm(g.data.double().detach(), norm_type).to(get_accelerator().current_device_name())) + torch.linalg.vector_norm(g.data.double().detach(), + ord=norm_type).to(get_accelerator().current_device_name())) if len(all_norms) > 0: total_norm = torch.stack(all_norms).square().sum().float() else: @@ -1795,7 +1796,7 @@ def scaled_global_norm(self, norm_type=2): self._average_expert_grad_norms(norm_groups) # calculating L2 norm - return torch.norm(torch.stack(norm_groups), p=norm_type) + return torch.linalg.vector_norm(torch.stack(norm_groups), ord=norm_type) def get_bit16_param_group(self, group_no): bit16_partitions = self.parallel_partitioned_bit16_groups[group_no] From c17dc33c04a65606d770705a2c9d4ae3e0ae5a9b Mon Sep 17 00:00:00 2001 From: Xinyu Lian Date: Tue, 21 Jan 2025 12:48:38 -0600 Subject: [PATCH 694/754] Using explicit GPU upcast for ZeRO-Offload (#6962) Following discussion in [PR-6670](https://github.com/microsoft/DeepSpeed/pull/6670), the explict upcast is much more efficient than implicit upcast, this PR is to replace implicit upcast with explict one. The results on 3B model are shown below: | Option | BWD (ms) | Speed up | |------------|-----|------| | Before PR-6670 | 25603.30 | 1x | | After PR-6670 | 1174.31 | 21.8X | | After this PR| 309.2 | 82.8X | --- deepspeed/runtime/zero/stage3.py | 13 ++----------- 1 file changed, 2 insertions(+), 11 deletions(-) diff --git a/deepspeed/runtime/zero/stage3.py b/deepspeed/runtime/zero/stage3.py index 9c06567ed100..a5c0c3340019 100644 --- a/deepspeed/runtime/zero/stage3.py +++ b/deepspeed/runtime/zero/stage3.py @@ -546,15 +546,10 @@ def _setup_for_real_optimizer(self): self.grad_partitions_flat_buffer = get_accelerator().pin_memory(self.grad_partitions_flat_buffer) offset = 0 - max_partition_numel = 0 for param in all_params: self.__param_id_to_grad_partition[param.ds_id] = self.grad_partitions_flat_buffer.narrow( 0, offset, param.partition_numel()) offset += param.partition_numel() - max_partition_numel = max(max_partition_numel, param.partition_numel()) - if self.offload_optimizer: - self.pinned_grad_buffer: Tensor = get_accelerator().pin_memory( - torch.empty(max_partition_numel, device=self.device)) def _link_all_hp_params(self): for p in self.module.parameters(): @@ -1510,13 +1505,9 @@ def partition_grads(self, params_to_release: List[Parameter], grad_partitions: L offload_fp32_gradients[i].append(grad_buffer.float()) offload_fp32_offsets[i].append(dest_offset) else: - buffer_numel = grad_buffer.numel() fp32_grad_tensor = self.fp32_partitioned_groups_flat[i].grad.narrow( - 0, dest_offset, buffer_numel) - self.pinned_grad_buffer[:buffer_numel].copy_( - grad_buffer.to(dtype=torch.float32, non_blocking=True)) - get_accelerator().synchronize() - fp32_grad_tensor.copy_(self.pinned_grad_buffer[:buffer_numel], non_blocking=True) + 0, dest_offset, grad_buffer.numel()) + fp32_grad_tensor.copy_(grad_buffer.float()) # free the gradient if not get_accelerator().is_synchronized_device(): From de4596bedc61100db9385b5d99efd9025db13a7d Mon Sep 17 00:00:00 2001 From: Logan Adams <114770087+loadams@users.noreply.github.com> Date: Tue, 21 Jan 2025 14:34:26 -0800 Subject: [PATCH 695/754] Update version.txt after 0.16.3 release (#6965) **Auto-generated PR to update version.txt after a DeepSpeed release** Released version - 0.16.3 Author - @loadams Co-authored-by: loadams --- version.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/version.txt b/version.txt index 7eb3095a3295..5f2491c5adca 100644 --- a/version.txt +++ b/version.txt @@ -1 +1 @@ -0.16.3 +0.16.4 From 470dd6dcebf712d620b95c9112fafb19dc94ba44 Mon Sep 17 00:00:00 2001 From: Olatunji Ruwase Date: Thu, 23 Jan 2025 11:42:06 -0500 Subject: [PATCH 696/754] Precisely track nvme optimizer offload (#6963) Fix #4998 --- deepspeed/runtime/engine.py | 10 ++++------ deepspeed/runtime/swap_tensor/optimizer_utils.py | 5 +++++ deepspeed/runtime/zero/stage3.py | 12 ++++-------- tests/unit/runtime/zero/test_nvme_checkpointing.py | 4 +++- 4 files changed, 16 insertions(+), 15 deletions(-) diff --git a/deepspeed/runtime/engine.py b/deepspeed/runtime/engine.py index 9b9a2e509d61..97d2afb8b723 100755 --- a/deepspeed/runtime/engine.py +++ b/deepspeed/runtime/engine.py @@ -799,10 +799,8 @@ def zero_load_from_fp32_weights(self): def zero_elastic_checkpoint(self): return self._config.zero_config.elastic_checkpoint - def zero_has_nvme_offload(self): - if not hasattr(self.optimizer, "swap_optimizer"): - return False - return self.optimizer.swap_optimizer or self.optimizer.params_in_nvme_and_cpu + def zero_nvme_offload_optimizer(self): + return getattr(self.optimizer, "swap_optimizer", False) def zero_max_live_parameters(self): return self._config.zero_config.max_live_parameters @@ -2865,7 +2863,7 @@ def load_checkpoint(self, if not success: self.optimizer._restore_from_bit16_weights() - if self.zero_has_nvme_offload(): + if self.zero_nvme_offload_optimizer(): from shutil import copytree, disk_usage offload_dir = self.optimizer.optimizer_swapper.swap_folder offload_ckpt_dir = os.path.join(load_dir, tag, "offloaded_tensors") @@ -3205,7 +3203,7 @@ def save_checkpoint(self, save_dir, tag=None, client_state={}, save_latest=True, self._create_zero_checkpoint_files(save_dir, tag) self._save_zero_checkpoint(save_dir, tag) - if self.zero_has_nvme_offload(): + if self.zero_nvme_offload_optimizer(): from shutil import copytree, disk_usage offload_dir = self.optimizer.optimizer_swapper.swap_folder offload_ckpt_dir = os.path.join(save_dir, tag, "offloaded_tensors") diff --git a/deepspeed/runtime/swap_tensor/optimizer_utils.py b/deepspeed/runtime/swap_tensor/optimizer_utils.py index 389ad6ae1076..5d837e386a95 100644 --- a/deepspeed/runtime/swap_tensor/optimizer_utils.py +++ b/deepspeed/runtime/swap_tensor/optimizer_utils.py @@ -153,6 +153,11 @@ def __init__(self, swap_config, aio_config, base_folder, optimizer, largest_nume 'timer_names', ] + def purge_state(self): + for swap_info in self.swap_params_info.values(): + swap_info.tensors = [swap_info.tensors[0]] + swap_info.has_state_tensors = False + def swappable_tensor(self, param=None, numel=None): assert param is not None or numel is not None, "Either param or numel must be provided" if param is not None: diff --git a/deepspeed/runtime/zero/stage3.py b/deepspeed/runtime/zero/stage3.py index a5c0c3340019..3195c973a179 100644 --- a/deepspeed/runtime/zero/stage3.py +++ b/deepspeed/runtime/zero/stage3.py @@ -2652,11 +2652,9 @@ def _rigid_load_state_dict(self, state_dict, load_optimizer_states=True): self.optimizer.load_state_dict(state_dict[OPTIMIZER_STATE_DICT]) self._clear_fp32_optimizer_param_groups() - if self.swap_optimizer or self.params_in_nvme_and_cpu: + if self.swap_optimizer: # Purge the swapped optimizer state, it was initialized to the freshly created model and not the checkpoint - for swap_info in self.optimizer_swapper.swap_params_info.values(): - swap_info.tensors = [swap_info.tensors[0]] - swap_info.has_state_tensors = False + self.optimizer_swapper.purge_state() if self.swap_optimizer: # Touch all parameters to synchronize all buffers @@ -2773,11 +2771,9 @@ def load_hp_checkpoint_state_from_checkpoint_dir_stage3(self, checkpoint_dir, pa else: optim_sd[OPTIMIZER_STATE_DICT]['state'][0][key] = key_tensor - if self.swap_optimizer or self.params_in_nvme_and_cpu: + if self.swap_optimizer: # Purge the swapped optimizer state, it was initialized to the freshly created model and not the checkpoint - for swap_info in self.optimizer_swapper.swap_params_info.values(): - swap_info.tensors = [swap_info.tensors[0]] - swap_info.has_state_tensors = False + self.optimizer_swapper.purge_state() if self.swap_optimizer: # Touch all parameters to synchronize all buffers diff --git a/tests/unit/runtime/zero/test_nvme_checkpointing.py b/tests/unit/runtime/zero/test_nvme_checkpointing.py index 850c8eb3e349..01a75aa64b4e 100644 --- a/tests/unit/runtime/zero/test_nvme_checkpointing.py +++ b/tests/unit/runtime/zero/test_nvme_checkpointing.py @@ -22,8 +22,10 @@ class TestNVMeCheckpointing(DistributedTest): world_size = 1 @pytest.mark.parametrize('param_offload_device, optim_offload_device', - [(OffloadDeviceEnum.cpu, OffloadDeviceEnum.cpu), + [(OffloadDeviceEnum.none, OffloadDeviceEnum.nvme), (OffloadDeviceEnum.cpu, OffloadDeviceEnum.nvme), + (OffloadDeviceEnum.nvme, OffloadDeviceEnum.none), + (OffloadDeviceEnum.nvme, OffloadDeviceEnum.cpu), (OffloadDeviceEnum.nvme, OffloadDeviceEnum.nvme)]) def test_nvme_checkpointing(self, tmpdir, param_offload_device, optim_offload_device): zero_dir, ckpt_dir = os.path.join(tmpdir, "zero"), os.path.join(tmpdir, "checkpoint") From 1640f6df4f6576636c472ba47ce76a507e3b4373 Mon Sep 17 00:00:00 2001 From: Logan Adams <114770087+loadams@users.noreply.github.com> Date: Fri, 24 Jan 2025 13:58:43 -0800 Subject: [PATCH 697/754] Update build_win.bat script to exclue GDS op as it lacks Windows support. (#6971) Nvidia GDS [does not support Windows](https://developer.nvidia.com/gpudirect-storage). --- build_win.bat | 1 + 1 file changed, 1 insertion(+) diff --git a/build_win.bat b/build_win.bat index 9c326aae552d..81387471983a 100644 --- a/build_win.bat +++ b/build_win.bat @@ -7,6 +7,7 @@ set DS_BUILD_AIO=0 set DS_BUILD_CUTLASS_OPS=0 set DS_BUILD_EVOFORMER_ATTN=0 set DS_BUILD_FP_QUANTIZER=0 +set DS_BUILD_GDS=0 set DS_BUILD_RAGGED_DEVICE_OPS=0 set DS_BUILD_SPARSE_ATTN=0 From 46c6c9e6ce9ede0eeb8a909958a4fecd2fbd942e Mon Sep 17 00:00:00 2001 From: Logan Adams <114770087+loadams@users.noreply.github.com> Date: Mon, 27 Jan 2025 16:15:47 -0800 Subject: [PATCH 698/754] Add CUDA 12.8 support and comment on CUDA 12.7 (#6975) --- op_builder/builder.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/op_builder/builder.py b/op_builder/builder.py index ab26054bda7d..cdd11f00cabf 100644 --- a/op_builder/builder.py +++ b/op_builder/builder.py @@ -76,7 +76,8 @@ def get_default_compute_capabilities(): cuda_minor_mismatch_ok = { 10: ["10.0", "10.1", "10.2"], 11: ["11.0", "11.1", "11.2", "11.3", "11.4", "11.5", "11.6", "11.7", "11.8"], - 12: ["12.0", "12.1", "12.2", "12.3", "12.4", "12.5", "12.6"], + 12: ["12.0", "12.1", "12.2", "12.3", "12.4", "12.5", "12.6", + "12.8"], # There does not appear to be a CUDA Toolkit 12.7 } From 8ad487254c486163177f1947becf8b35287c6d05 Mon Sep 17 00:00:00 2001 From: Logan Adams <114770087+loadams@users.noreply.github.com> Date: Tue, 28 Jan 2025 16:12:58 -0800 Subject: [PATCH 699/754] Update torch versions to support 2.6 (#6977) --- .github/workflows/cpu-torch-latest.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/cpu-torch-latest.yml b/.github/workflows/cpu-torch-latest.yml index 78a51905834b..43ac3d1c30e2 100644 --- a/.github/workflows/cpu-torch-latest.yml +++ b/.github/workflows/cpu-torch-latest.yml @@ -59,5 +59,5 @@ jobs: run: | unset TORCH_CUDA_ARCH_LIST # only jit compile for current arch cd tests - HF_HOME=/tmp/hf_home/ pytest $PYTEST_OPTS -n 4 unit/ --torch_ver="2.5" - HF_HOME=/tmp/hf_home/ pytest $PYTEST_OPTS -m 'sequential' unit/ --torch_ver="2.5" + HF_HOME=/tmp/hf_home/ pytest $PYTEST_OPTS -n 4 unit/ --torch_ver="2.6" + HF_HOME=/tmp/hf_home/ pytest $PYTEST_OPTS -m 'sequential' unit/ --torch_ver="2.6" From 593de925cf32d7042e56e19ad9c91d94709915d1 Mon Sep 17 00:00:00 2001 From: Omar Elayan <142979319+oelayan7@users.noreply.github.com> Date: Wed, 29 Jan 2025 19:35:11 +0200 Subject: [PATCH 700/754] generalize deepspeed linear and implement it for non cuda systems (#6932) Co-authored-by: Olatunji Ruwase Co-authored-by: Logan Adams <114770087+loadams@users.noreply.github.com> --- csrc/fp_quantizer/fp_quantize.cpp | 2 + deepspeed/linear/config.py | 9 +- deepspeed/linear/quantization.py | 8 +- deepspeed/ops/fp_quantizer/quantize.py | 61 +++++++++----- op_builder/fp_quantizer.py | 17 ++++ op_builder/hpu/fp_quantizer.py | 86 ++++++++++++++++++++ tests/unit/linear/test_linear.py | 9 +- tests/unit/linear/test_quant_param.py | 6 +- tests/unit/ops/fp_quantizer/test_fp8_gemm.py | 5 +- tests/unit/ops/fp_quantizer/test_fp_quant.py | 51 +++++++----- 10 files changed, 199 insertions(+), 55 deletions(-) create mode 100644 op_builder/hpu/fp_quantizer.py diff --git a/csrc/fp_quantizer/fp_quantize.cpp b/csrc/fp_quantizer/fp_quantize.cpp index 1a887b50e1a3..903d84270d32 100644 --- a/csrc/fp_quantizer/fp_quantize.cpp +++ b/csrc/fp_quantizer/fp_quantize.cpp @@ -24,6 +24,7 @@ at::Tensor quantize(torch::Tensor& out, torch::Tensor& val, + torch::Tensor& scale, int group_size, int stochastic_rounding, int q_bits, @@ -59,6 +60,7 @@ at::Tensor quantize(torch::Tensor& out, void dequantize(torch::Tensor& val, torch::Tensor& val_q, + torch::Tensor& scale, int group_size, int q_mantisa_bits, int q_exponent_bits) diff --git a/deepspeed/linear/config.py b/deepspeed/linear/config.py index 2632ce7de9c4..1459704a32c5 100644 --- a/deepspeed/linear/config.py +++ b/deepspeed/linear/config.py @@ -6,6 +6,8 @@ from dataclasses import dataclass, field from typing import List +import torch + @dataclass class LoRAConfig: @@ -13,7 +15,7 @@ class LoRAConfig: Configuration settings for LoRAOptimizedLinear. Attributes: - lora_r (int): LoRA attention dimension, also know as the rank. Defaults is 64. + lora_r (int): LoRA attention dimension, also known as the rank. Defaults is 64. lora_alpha (float): LoRA scaling factor, default is 16. base_weight_sharding (int): The degree to which the base weights are sharded, should typically be set to the data-parallel world size to maximize the memory @@ -42,8 +44,11 @@ class QuantizationConfig: Attributes: q_bits (int): The number of bits used for quantization. Default is 8. mantissa_bits (int): The number of bits reserved for the mantissa in fixed-point quantization. Default is 3. - group_size (int): The size of the group used for quantization. Default is 512. + group_size (int): The number of elements used for quantization. Default is 512. + q_dtype (torch.dtype): The data type to quantize to. Default is uint8. (in CUDA, buffers are allocated as + uint8, but inside the kernels the quantization is done to fp8) """ q_bits: int = 8 mantissa_bits: int = 3 group_size: int = 512 + q_dtype: torch.dtype = torch.uint8 diff --git a/deepspeed/linear/quantization.py b/deepspeed/linear/quantization.py index 70fabea845ba..2023601be281 100644 --- a/deepspeed/linear/quantization.py +++ b/deepspeed/linear/quantization.py @@ -51,24 +51,24 @@ def __new__( self.quantizer = quantizer else: # if FPQuantizerBuilder is not compatible in this env this init will fail - self.quantizer = FP_Quantize(group_size=self.quantization_config.group_size) + self.quantizer = FP_Quantize(quantization_config=self.quantization_config) self._ensure_quantized(self) return self def _ensure_quantized(self, tensor: torch.Tensor): # If the tensor is on the accelerator and is not quantized, then quantize it in-place. - if get_accelerator().on_accelerator(tensor) and tensor.dtype != torch.uint8: + if get_accelerator().on_accelerator(tensor) and tensor.dtype != self.quantization_config.q_dtype: with get_accelerator().stream(get_accelerator().current_stream(tensor.device)): tensor.data = self.quantizer.quantize(tensor.data, q_bits=self.quantization_config.q_bits, q_mantisa_bits=self.quantization_config.mantissa_bits) - assert tensor.dtype == torch.uint8 + assert tensor.dtype == self.quantization_config.q_dtype def dequantized(self) -> torch.Tensor: """ Return a tensor containing the dequantized weights of this parameter. """ - if get_accelerator().on_accelerator(self.data) and self.data.dtype == torch.uint8: + if get_accelerator().on_accelerator(self.data) and self.data.dtype == self.quantization_config.q_dtype: with get_accelerator().stream(get_accelerator().current_stream(self.data.device)): return self.quantizer.dequantize(self.data, q_bits=self.quantization_config.q_bits, diff --git a/deepspeed/ops/fp_quantizer/quantize.py b/deepspeed/ops/fp_quantizer/quantize.py index edd4ef57302c..69c21eaf693b 100644 --- a/deepspeed/ops/fp_quantizer/quantize.py +++ b/deepspeed/ops/fp_quantizer/quantize.py @@ -16,7 +16,7 @@ class Quantizer(ABC): """ - Abstract Quantizer class that implmenents quantize/dequantize methods. + Abstract Quantizer class that implements quantize/dequantize methods. Arguments: group_size (int, optional): number of values or elements that are grouped @@ -42,12 +42,18 @@ def dequantize(self, input_q, fp_out=None, q_bits=8, q_mantisa_bits=3, scale=Non class FP_Quantize(Quantizer): - def __init__(self, group_size=512) -> None: + def __init__(self, quantization_config) -> None: global fp_quant_module - super().__init__(group_size=group_size) + super().__init__(group_size=quantization_config.group_size) if fp_quant_module is None: fp_quant_module = FPQuantizerBuilder().load() + self.cuda_impl = getattr(fp_quant_module, "CUDA_IMPL", True) + self.q_config = quantization_config + self.orig_dtype = None + self.num_groups = None + self.input_q = None + self.scale = None def quantize(self, input, @@ -73,15 +79,27 @@ def quantize(self, else: assert (0), \ f"Missing {q_bits}-quantization, please add the template arguments for the kernel to support this precision!" - self.num_groups = input.numel() // self.group_size - self.input_q = torch.ones(self.num_groups, - int(self.group_size * q_bits) // 8 + 4, - dtype=torch.uint8, - device=input.device) - out = fp_quant_module.quantize(self.input_q, input, self.group_size, stochastic_mode, q_bits, q_mantisa_bits) + + # Adding (group_size - 1) is for padding + self.num_groups = (input.numel() + self.q_config.group_size - 1) // self.q_config.group_size + # group_size should be the minimal number between the defined group size and number of elements in tensor. + group_size = int(min(self.q_config.group_size, input.numel()) * q_bits) // 8 + # CUDA quantization kernel saves the scale as (fp32) inside the quantized tensor for each group + if self.cuda_impl: + group_size += 4 + # CUDA quantization kernel allocates tensors as uint8, but handles them as fp8 inside the kernel. + self.input_q = torch.ones(self.num_groups, group_size, dtype=self.q_config.q_dtype, device=input.device) + # CUDA quantization kernel attaches scales to quantized result, in python implementation it can't be done + # because they are of different types. + self.scale = torch.ones(self.num_groups, 1, device=input.device) + out = fp_quant_module.quantize(self.input_q, input, self.scale, group_size, stochastic_mode, q_bits, + q_mantisa_bits) if return_meta_tensor: - data, self.scale = out.split(self.group_size, dim=-1) - data = data.contiguous().reshape(input.shape) + if self.cuda_impl: + data, self.scale = out.split(group_size, dim=-1) + data = data.contiguous().reshape(input.shape) + else: + data = out.contiguous().reshape(input.shape) self.scale = self.scale.contiguous() del self.input_q del out @@ -93,9 +111,9 @@ def quantize(self, def to(self, *args, **kwargs): # Intermediate tensors may need to be moved to different devices - if hasattr(self, 'input_q'): + if hasattr(self, 'input_q') and self.input_q is not None: self.input_q = self.input_q.to(*args, **kwargs) - if hasattr(self, 'scale'): + if hasattr(self, 'scale') and self.scale is not None: self.scale = self.scale.to(*args, **kwargs) def get_scales(self): @@ -118,11 +136,16 @@ def dequantize(self, input_q, fp_out=None, q_bits=8, q_mantisa_bits=3, scale=Non assert (0), \ f"Missing {q_bits}-dequantization, please add the template arguments for the kernel to support this precision!" - if scale is not None: + if scale is not None and self.cuda_impl: assert input_q.numel() == fp_out.numel(), \ f'[De-quantization Error]: quantized data should have the same size as original tensor when scale is not None!' - input_q = torch.cat([input_q.reshape(-1, self.group_size), scale], dim=-1).contiguous() - fp_quant_module.dequantize(fp_out, input_q, self.group_size, q_mantisa_bits, q_bits - q_mantisa_bits - 1) + input_q = torch.cat([input_q.reshape(-1, self.q_config.group_size), scale], dim=-1).contiguous() + elif scale is not None and not self.cuda_impl: + group_size = int(min(self.q_config.group_size, input_q.numel()) * q_bits) // 8 + input_q = input_q.reshape(-1, group_size) + + fp_quant_module.dequantize(fp_out, input_q, self.scale, self.q_config.group_size, q_mantisa_bits, + q_bits - q_mantisa_bits - 1) return fp_out def selective_dequantize(self, @@ -151,11 +174,11 @@ def selective_dequantize(self, assert (0), \ f"Missing {q_bits}-dequantization, please add the template arguments for the kernel to support this precision!" - if scale is not None: + if scale is not None and self.cuda_impl: assert input_q.numel() == fp_out.numel(), \ f'[De-quantization Error]: quantized data should have the same size as original tensor when scale is not None!' - input_q = torch.cat([input_q.reshape(-1, self.group_size), scale], dim=-1).contiguous() + input_q = torch.cat([input_q.reshape(-1, self.q_config.group_size), scale], dim=-1).contiguous() - fp_quant_module.selective_dequantize(fp_out, input_q, indexes, self.group_size, q_mantisa_bits, + fp_quant_module.selective_dequantize(fp_out, input_q, indexes, self.q_config.group_size, q_mantisa_bits, q_bits - q_mantisa_bits - 1) return fp_out diff --git a/op_builder/fp_quantizer.py b/op_builder/fp_quantizer.py index 75ee54c09bf6..daa41a8148f5 100644 --- a/op_builder/fp_quantizer.py +++ b/op_builder/fp_quantizer.py @@ -98,3 +98,20 @@ def extra_ldflags(self): def include_paths(self): return ['csrc/fp_quantizer/includes', 'csrc/includes'] + + @staticmethod + def get_default_quant_dtype(): + import torch + return torch.uint8 + + @staticmethod + def get_quant_range(q_bits=None): + if q_bits == 8: + return 480 + elif q_bits == 6: + return 28. + elif q_bits == 12: + return 510. + else: + assert (0), \ + "Please specify the right quantization range for the selected precision!" diff --git a/op_builder/hpu/fp_quantizer.py b/op_builder/hpu/fp_quantizer.py new file mode 100644 index 000000000000..c74affb55045 --- /dev/null +++ b/op_builder/hpu/fp_quantizer.py @@ -0,0 +1,86 @@ +# Copyright (c) 2024 Habana Labs, Ltd. an Intel Company +# Copyright (c) Microsoft Corporation. +# SPDX-License-Identifier: Apache-2.0 + +# DeepSpeed Team + +import torch +try: + # is op_builder from deepspeed or a 3p version? this should only succeed if it's deepspeed + # if successful this also means we're doing a local install and not JIT compile path + from op_builder import __deepspeed__ # noqa: F401 # type: ignore + from op_builder.builder import OpBuilder +except ImportError: + from deepspeed.ops.op_builder.builder import OpBuilder + + +class FPQuantizerBuilder(OpBuilder): + BUILD_VAR = "DS_BUILD_FP_QUANTIZER" + NAME = "fp_quantizer" + + def __init__(self, name=None): + name = self.NAME if name is None else name + super().__init__(name=name) + + def absolute_name(self): + return f'deepspeed.ops.fp_quantizer.{self.NAME}_op' + + def sources(self): + return [] + + def load(self, verbose=True): + return FPQuantizer + + @staticmethod + def get_default_quant_dtype(): + return torch.float8_e4m3fn + + @staticmethod + def get_quant_range(q_bits=None): + import habana_frameworks.torch.utils.experimental as htexp + if htexp._get_device_type() == htexp.synDeviceType.synDeviceGaudi2: + dtype = torch.float8_e4m3fnuz + else: + dtype = torch.float8_e4m3fn + return torch.finfo(dtype).max + + +class FPQuantizer: + CUDA_IMPL = False + + @classmethod + def selective_dequantize(cls, val_q, scales, indexes, group_size, q_mantisa_bits, q_exponent_bits): + assert False, "Selective dequantize isn't implemented for HPU!" + + @classmethod + def dequantize(cls, fp_out, input_q, scale, group_size, q_mantisa_bits, q_exponent_bits): + orig_shape = fp_out.shape + orig_dtype = fp_out.dtype + dequant_out = torch.ops.hpu.cast_from_fp8(input_q, (1.0 / scale), orig_dtype).view(orig_shape) + fp_out.copy_(dequant_out) + return fp_out + + @classmethod + def quantize(cls, out, val, scale, group_size, stochastic_rounding, q_bits, q_mantisa_bits): + assert q_bits == 8, "Quantize on HPU only supports quantization to FP8" + assert q_mantisa_bits == 3, "Quantize on HPU only supports q_mantissa_bits = 3" + assert out.dtype.is_floating_point, "Quantization on HPU is only to float dtypes" + + num_groups, group_size = out.shape + + # Reshape the tensor + val_reshaped = val.view(num_groups, group_size).float() + # Calculate the scale + max_vals = val_reshaped.abs().max(dim=1, keepdim=True)[0] + q_range = torch.finfo(out.dtype).max + tmp_scale = q_range / max_vals + scale.copy_(tmp_scale) + # Copy quantized + quant, _ = torch.ops.hpu.cast_to_fp8_v2(val_reshaped, scale, stochastic_rounding, dtype=out.dtype) + out.copy_(quant) + + return out + + @classmethod + def get_scales(cls, out, num_groups): + return out diff --git a/tests/unit/linear/test_linear.py b/tests/unit/linear/test_linear.py index ccd26b4cd726..2058791dba4a 100644 --- a/tests/unit/linear/test_linear.py +++ b/tests/unit/linear/test_linear.py @@ -46,7 +46,6 @@ class TestLoRALinear(DistributedTest): def test(self, base_weight_sharding): rank = dist.get_rank() - lora_config = None quantization_config = None input_features = 64 # Number of input features @@ -77,15 +76,13 @@ class TestQuantLinear(DistributedTest): world_size = 2 def test(self, q_bits): - rank = dist.get_rank() - lora_config = None - input_features = 64 # Number of input features output_features = 64 # Number of output features batch_size = 5 # Number of samples in a batch lora_config = None quantization_config = QuantizationConfig(q_bits=q_bits) + quantization_config.q_dtype = FPQuantizerBuilder.get_default_quant_dtype() linear_layer = OptimizedLinear(input_dim=input_features, output_dim=output_features, @@ -106,15 +103,13 @@ class TestOptimizedLinear(DistributedTest): world_size = 2 def test(self, base_weight_sharding, q_bits): - rank = dist.get_rank() - lora_config = None - input_features = 64 # Number of input features output_features = 64 # Number of output features batch_size = 5 # Number of samples in a batch lora_config = LoRAConfig(lora_r=16, lora_alpha=16, base_weight_sharding=base_weight_sharding) quantization_config = QuantizationConfig(q_bits=q_bits) + quantization_config.q_dtype = FPQuantizerBuilder.get_default_quant_dtype() linear_layer = OptimizedLinear(input_dim=input_features, output_dim=output_features, diff --git a/tests/unit/linear/test_quant_param.py b/tests/unit/linear/test_quant_param.py index 84a9f766ef74..283d81b4bf36 100644 --- a/tests/unit/linear/test_quant_param.py +++ b/tests/unit/linear/test_quant_param.py @@ -38,11 +38,13 @@ def test_requires_grad(self): def test_move_to_accelerator(self): device = get_accelerator().current_device() data = torch.rand(5, 5, device='cpu', dtype=torch.bfloat16) - qp = QuantizedParameter(data) + quantization_config = QuantizationConfig() + quantization_config.q_dtype = FPQuantizerBuilder.get_default_quant_dtype() + qp = QuantizedParameter(data, quantization_config=quantization_config) assert qp.device == torch.device('cpu') qp = qp.to(get_accelerator().current_device_name()) assert qp.device == torch.device(device) - assert qp.dtype == torch.uint8 + assert qp.dtype == quantization_config.q_dtype def test_hf_clone(self): device = get_accelerator().current_device_name() diff --git a/tests/unit/ops/fp_quantizer/test_fp8_gemm.py b/tests/unit/ops/fp_quantizer/test_fp8_gemm.py index a4cf579f5943..d068a05b77bb 100644 --- a/tests/unit/ops/fp_quantizer/test_fp8_gemm.py +++ b/tests/unit/ops/fp_quantizer/test_fp8_gemm.py @@ -15,6 +15,7 @@ from deepspeed.ops.fp_quantizer import FP_Quantize, matmul_fp8 from deepspeed import get_accelerator +from deepspeed.linear import QuantizationConfig @pytest.mark.parametrize("dtype", [torch.bfloat16], ids=["bf16"]) @@ -25,7 +26,9 @@ def test_fp_quant(dtype, q_bits, M): device_name = get_accelerator().device_name() quantization_group_size = 128 - fpq = FP_Quantize(group_size=quantization_group_size) + quant_config = QuantizationConfig(q_dtype=FPQuantizerBuilder.get_default_quant_dtype(), + group_size=quantization_group_size) + fpq = FP_Quantize(quantization_config=quant_config) N = 8192 H = 4096 diff --git a/tests/unit/ops/fp_quantizer/test_fp_quant.py b/tests/unit/ops/fp_quantizer/test_fp_quant.py index bed8bd7e3bcc..e9baf016310e 100644 --- a/tests/unit/ops/fp_quantizer/test_fp_quant.py +++ b/tests/unit/ops/fp_quantizer/test_fp_quant.py @@ -5,10 +5,13 @@ import pytest import torch +from deepspeed.linear import QuantizationConfig + import deepspeed from deepspeed.ops.fp_quantizer import FP_Quantize from deepspeed.ops.op_builder import FPQuantizerBuilder +from deepspeed.accelerator import get_accelerator if not deepspeed.ops.__compatible_ops__[FPQuantizerBuilder.NAME]: pytest.skip("FPQuantizer op is not available on this system", allow_module_level=True) @@ -24,33 +27,31 @@ def qtorch_quantize(input, exp_bits=4, man_bits=3, rounding="nearest", group_siz input = input.view(-1, last_dim) q_bits = exp_bits + man_bits + 1 + q_range = FPQuantizerBuilder.get_quant_range(q_bits) input_to_float = input.float() - if q_bits == 8: - q_range = 480. - elif q_bits == 6: - q_range = 28. - elif q_bits == 12: - q_range = 510. - else: - assert (0), \ - "Please specify the right quantization range for the selected precision!" input_max = input_to_float.abs().amax(dim=-1, keepdim=True) + return ((float_quantize(input_to_float / input_max * q_range, exp_bits, man_bits, rounding=rounding) * \ input_max / q_range).to(ori_dt)).reshape(ori_shape) @pytest.mark.parametrize("dtype", [torch.bfloat16], ids=["bf16"]) def test_fp_quant_meta(dtype): + device_name = get_accelerator().device_name() group_size = 128 q_bits = 8 exp_bits = 4 man_bits = 3 - fpq = FP_Quantize(group_size=group_size) + quant_config = QuantizationConfig() + quant_config.q_dtype = FPQuantizerBuilder.get_default_quant_dtype() + quant_config.group_size = group_size + fpq = FP_Quantize(quantization_config=quant_config) + for i in range(10): - x = torch.rand(4, 1024, dtype=dtype, device='cuda') + x = torch.rand(4, 1024, dtype=dtype) - ds_x = x.clone() + ds_x = x.clone().to(device_name) x_quantized, meta_tensor = fpq.quantize(ds_x, q_bits=q_bits, return_meta_tensor=True) x_dequantized = fpq.dequantize(x_quantized, q_bits=q_bits, scale=meta_tensor) @@ -68,12 +69,18 @@ def test_fp_quant_selective(dtype): exp_bits = 4 man_bits = 3 - fpq = FP_Quantize(group_size=group_size) - indexes = torch.zeros(2, dtype=torch.int32, device='cuda') + device_name = get_accelerator().device_name() + + quant_config = QuantizationConfig() + quant_config.q_dtype = FPQuantizerBuilder.get_default_quant_dtype() + quant_config.group_size = group_size + fpq = FP_Quantize(quantization_config=quant_config) + + indexes = torch.zeros(2, dtype=torch.int32, device=device_name) indexes[0] = 1 indexes[1] = 3 for i in range(10): - x = torch.rand(4, 1024, dtype=dtype, device='cuda') + x = torch.rand(4, 1024, dtype=dtype, device=device_name) x = x.reshape(4, 1, x.shape[-1]) ds_x = x.clone() @@ -93,13 +100,17 @@ def test_fp_quant_selective(dtype): @pytest.mark.parametrize("dtype", [torch.bfloat16], ids=["bf16"]) @pytest.mark.parametrize("q_bits", [8, 6, 12], ids=["qbits8", "qbits6", "qbits12"]) def test_fp_quant(dtype, q_bits): - group_size = 128 - fpq = FP_Quantize(group_size=group_size) + device_name = get_accelerator().device_name() + + quant_config = QuantizationConfig() + quant_config.q_dtype = FPQuantizerBuilder.get_default_quant_dtype() + quant_config.group_size = 128 + fpq = FP_Quantize(quantization_config=quant_config) for i in range(10): - x = torch.rand(4, 1024, dtype=dtype, device='cuda') + x = torch.rand(4, 1024, dtype=dtype) - ds_x = x.clone() + ds_x = x.clone().to(device_name) x_quantized = fpq.quantize(ds_x, q_bits=q_bits) x_dequantized = fpq.dequantize(x_quantized, q_bits=q_bits) @@ -115,7 +126,7 @@ def test_fp_quant(dtype, q_bits): else: raise ValueError(f"unknown {q_bits=}") - qtorch_out = qtorch_quantize(x, exp_bits=exp_bits, man_bits=man_bits, group_size=group_size) + qtorch_out = qtorch_quantize(x, exp_bits=exp_bits, man_bits=man_bits, group_size=quant_config.group_size) qtorch_error = (qtorch_out - x).abs().sum() / x.numel() ds_error = (x_dequantized - x).abs().sum() / x.numel() From 8bb4d442ad9849ebb8b1340d2106da7c9fce8d5b Mon Sep 17 00:00:00 2001 From: Logan Adams <114770087+loadams@users.noreply.github.com> Date: Wed, 29 Jan 2025 20:53:16 -0800 Subject: [PATCH 701/754] Update recommended Windows whl building versions (#6983) --- README.md | 10 +++++----- setup.py | 4 ++-- 2 files changed, 7 insertions(+), 7 deletions(-) diff --git a/README.md b/README.md index 9f06af022853..03aba73cfa04 100755 --- a/README.md +++ b/README.md @@ -192,11 +192,11 @@ of JIT compiling) or install pre-compiled ops via PyPI please see our [advanced installation instructions](https://www.deepspeed.ai/tutorials/advanced-install/). ## 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 -4. Run `python setup.py bdist_wheel` to build wheel in `dist` folder +Many DeepSpeed features are supported on Windows for both training and inference. You can read more about this in the original blog post [here](https://github.com/microsoft/DeepSpeed/tree/master/blogs/windows/08-2024/README.md). Among features that are currently not supported are async io (AIO) and GDS (which does not support Windows). +1. Install PyTorch, such as pytorch 2.3+cu121. +2. Install Visual C++ build tools, such as VS2022 C++ x64/x86 build tools. +3. Launch Cmd console with Administrator permissions for creating required symlink folders and ensure MSVC tools are added to your PATH or launch the Developer Command Prompt for Visual Studio 2022 with administrator permissions. +4. Run `build_win.bat` to build wheel in `dist` folder. # Features diff --git a/setup.py b/setup.py index cc5eb4a3500c..ec2e9a754d30 100755 --- a/setup.py +++ b/setup.py @@ -5,8 +5,8 @@ """ DeepSpeed library -To build wheel on Windows: -1. Install pytorch, such as pytorch 1.12 + cuda 11.6. +To build wheels on Windows: +1. Install pytorch, such as pytorch 2.3 + cuda 12.1. 2. Install visual cpp build tool. 3. Include cuda toolkit. 4. Launch cmd console with Administrator privilege for creating required symlink folders. From 065ca8a61d1c071c3ae0354abf25914aff04e789 Mon Sep 17 00:00:00 2001 From: Fabio Geraci <118277438+fabiosanger@users.noreply.github.com> Date: Thu, 30 Jan 2025 13:31:11 +0000 Subject: [PATCH 702/754] Title: Fix setup_env_ranks to Properly Set Environment Variables Instead of Raising Error (#6979) This pull request addresses an issue in setup_env_ranks where, under certain conditions, the function raises an error instead of setting the necessary MPI-related environment variables (LOCAL_RANK, RANK, and WORLD_SIZE). The intended behavior is to properly map Open MPI variables (OMPI_COMM_WORLD_*) to the variables expected by DeepSpeed/PyTorch, but the code currently raises an EnvironmentError if these Open MPI variables are not found. With this fix, setup_env_ranks will: - Correctly detect and map the required Open MPI environment variables. - Only raise an error if there is genuinely no valid way to obtain rank information from the environment (e.g., both Open MPI variables and any fallback mechanism are unavailable). Fix #6895 Co-authored-by: Logan Adams <114770087+loadams@users.noreply.github.com> Co-authored-by: Olatunji Ruwase --- deepspeed/launcher/multinode_runner.py | 19 ++++++ tests/unit/launcher/test_multinode_runner.py | 71 ++++++++++++++++++-- 2 files changed, 85 insertions(+), 5 deletions(-) diff --git a/deepspeed/launcher/multinode_runner.py b/deepspeed/launcher/multinode_runner.py index fe2fa1b476be..3e0c9d8a1652 100644 --- a/deepspeed/launcher/multinode_runner.py +++ b/deepspeed/launcher/multinode_runner.py @@ -134,12 +134,31 @@ def name(self): def validate_args(self): super().validate_args() + + # Validate and set MPI environment variables + self._setup_mpi_environment() + #TODO: Allow for include/exclude at node-level but not gpu-level if self.args.include != "" or self.args.exclude != "": raise ValueError(f"{self.name} backend does not support worker include/exclusion") if self.args.num_nodes != -1 or self.args.num_gpus != -1: raise ValueError(f"{self.name} backend does not support limiting num nodes/gpus") + def _setup_mpi_environment(self): + """Sets up MPI-related environment variables or raises an error if they're missing.""" + + required_vars = ['OMPI_COMM_WORLD_LOCAL_RANK', 'OMPI_COMM_WORLD_RANK', 'OMPI_COMM_WORLD_SIZE'] + + # Check if all these are present + if not all(var in os.environ for var in required_vars): + raise EnvironmentError("MPI environment variables are not set. " + "Ensure you are running the script with an MPI-compatible launcher.") + + # Now safe to read all + os.environ['LOCAL_RANK'] = os.environ['OMPI_COMM_WORLD_LOCAL_RANK'] + os.environ['RANK'] = os.environ['OMPI_COMM_WORLD_RANK'] + os.environ['WORLD_SIZE'] = os.environ['OMPI_COMM_WORLD_SIZE'] + def get_cmd(self, environment, active_resources): total_process_count = sum(self.resource_pool.values()) diff --git a/tests/unit/launcher/test_multinode_runner.py b/tests/unit/launcher/test_multinode_runner.py index a3b50a4c90ab..801d4223afce 100644 --- a/tests/unit/launcher/test_multinode_runner.py +++ b/tests/unit/launcher/test_multinode_runner.py @@ -19,6 +19,14 @@ def runner_info(): return env, hosts, world_info, args +@pytest.fixture +def mock_mpi_env(monkeypatch): + # Provide the 3 required MPI variables: + monkeypatch.setenv('OMPI_COMM_WORLD_LOCAL_RANK', '0') + monkeypatch.setenv('OMPI_COMM_WORLD_RANK', '0') + monkeypatch.setenv('OMPI_COMM_WORLD_SIZE', '1') + + def test_pdsh_runner(runner_info): env, resource_pool, world_info, args = runner_info runner = mnrunner.PDSHRunner(args, world_info) @@ -27,7 +35,7 @@ def test_pdsh_runner(runner_info): assert env['PDSH_RCMD_TYPE'] == 'ssh' -def test_openmpi_runner(runner_info): +def test_openmpi_runner(runner_info, mock_mpi_env): env, resource_pool, world_info, args = runner_info runner = mnrunner.OpenMPIRunner(args, world_info, resource_pool) cmd = runner.get_cmd(env, resource_pool) @@ -35,26 +43,79 @@ def test_openmpi_runner(runner_info): assert 'eth0' in cmd -def test_btl_nic_openmpi_runner(runner_info): +def test_btl_nic_openmpi_runner(runner_info, mock_mpi_env): env, resource_pool, world_info, _ = runner_info args = parse_args(['--launcher_arg', '-mca btl_tcp_if_include eth1', 'test_launcher.py']) - runner = mnrunner.OpenMPIRunner(args, world_info, resource_pool) cmd = runner.get_cmd(env, resource_pool) assert 'eth0' not in cmd assert 'eth1' in cmd -def test_btl_nic_two_dashes_openmpi_runner(runner_info): +def test_btl_nic_two_dashes_openmpi_runner(runner_info, mock_mpi_env): env, resource_pool, world_info, _ = runner_info args = parse_args(['--launcher_arg', '--mca btl_tcp_if_include eth1', 'test_launcher.py']) - runner = mnrunner.OpenMPIRunner(args, world_info, resource_pool) cmd = runner.get_cmd(env, resource_pool) assert 'eth0' not in cmd assert 'eth1' in cmd +def test_setup_mpi_environment_success(): + """Test that _setup_mpi_environment correctly sets environment variables when MPI variables exist.""" + os.environ['OMPI_COMM_WORLD_LOCAL_RANK'] = '0' + os.environ['OMPI_COMM_WORLD_RANK'] = '1' + os.environ['OMPI_COMM_WORLD_SIZE'] = '2' + + args = parse_args(['--launcher_arg', '--mca btl_tcp_if_include eth1', 'test_launcher.py']) + + runner = mnrunner.OpenMPIRunner(args, None, None) + # Set up the MPI environment + runner._setup_mpi_environment() + + assert os.environ['LOCAL_RANK'] == '0' + assert os.environ['RANK'] == '1' + assert os.environ['WORLD_SIZE'] == '2' + + # Clean up environment + del os.environ['OMPI_COMM_WORLD_LOCAL_RANK'] + del os.environ['OMPI_COMM_WORLD_RANK'] + del os.environ['OMPI_COMM_WORLD_SIZE'] + del os.environ['LOCAL_RANK'] + del os.environ['RANK'] + del os.environ['WORLD_SIZE'] + + +def test_setup_mpi_environment_missing_variables(): + """Test that _setup_mpi_environment raises an EnvironmentError when MPI variables are missing.""" + + # Clear relevant environment variables + os.environ.pop('OMPI_COMM_WORLD_LOCAL_RANK', None) + os.environ.pop('OMPI_COMM_WORLD_RANK', None) + os.environ.pop('OMPI_COMM_WORLD_SIZE', None) + + args = parse_args(['--launcher_arg', '--mca btl_tcp_if_include eth1', 'test_launcher.py']) + + with pytest.raises(EnvironmentError, match="MPI environment variables are not set"): + mnrunner.OpenMPIRunner(args, None, None) + + +def test_setup_mpi_environment_fail(): + """Test that _setup_mpi_environment fails if only partial MPI variables are provided.""" + os.environ['OMPI_COMM_WORLD_LOCAL_RANK'] = '0' + os.environ.pop('OMPI_COMM_WORLD_RANK', None) # missing variable + os.environ['OMPI_COMM_WORLD_SIZE'] = '2' + + args = parse_args(['--launcher_arg', '--mca btl_tcp_if_include eth1', 'test_launcher.py']) + + with pytest.raises(EnvironmentError, match="MPI environment variables are not set"): + runner = mnrunner.OpenMPIRunner(args, None, None) + + # Clean up environment + del os.environ['OMPI_COMM_WORLD_LOCAL_RANK'] + del os.environ['OMPI_COMM_WORLD_SIZE'] + + def test_mpich_runner(runner_info): env, resource_pool, world_info, args = runner_info runner = mnrunner.MPICHRunner(args, world_info, resource_pool) From c963c21f5d93759725f77c4926b38714c2f00650 Mon Sep 17 00:00:00 2001 From: Logan Adams <114770087+loadams@users.noreply.github.com> Date: Thu, 30 Jan 2025 12:03:14 -0800 Subject: [PATCH 703/754] Specify torchvision in nv-ds-chat workflow (prevents errors with torch 2.6) (#6982) Fixes #6984. The workflow was pulling the updated torch 2.6, which caused CI failures. This keeps us on torch 2.5 for now, since installing torchvision as a dependency later on was pulling torch 2.6 with it which was unintended. This PR also unsets NCCL_DEBUG to avoid a large print out in the case of any errors. --- .github/workflows/nv-ds-chat.yml | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/.github/workflows/nv-ds-chat.yml b/.github/workflows/nv-ds-chat.yml index 7e209cbe4397..5d47519fe204 100644 --- a/.github/workflows/nv-ds-chat.yml +++ b/.github/workflows/nv-ds-chat.yml @@ -37,7 +37,7 @@ jobs: - name: Install pytorch run: | - pip3 install -U --cache-dir $TORCH_CACHE torch --index-url https://download.pytorch.org/whl/cu121 + pip install -U --cache-dir $TORCH_CACHE torch torchvision --index-url https://download.pytorch.org/whl/cu121 python -c "import torch; print('torch:', torch.__version__, torch)" python -c "import torch; print('CUDA available:', torch.cuda.is_available())" @@ -67,6 +67,7 @@ jobs: run: | cd DeepSpeedExamples/applications/DeepSpeed-Chat unset TORCH_CUDA_ARCH_LIST # only jit compile for current arch + unset NCCL_DEBUG cd tests pytest $PYTEST_OPTS ./ From 4fea41f4068f601b4d320ebe4bec7321472804b6 Mon Sep 17 00:00:00 2001 From: Xinyu Lian Date: Thu, 30 Jan 2025 18:53:50 -0600 Subject: [PATCH 704/754] Remove assumption that padding only occurs on last rank (#6974) As discussed in [PR-6918](https://github.com/microsoft/DeepSpeed/pull/6918), padding can occur on multiple ranks with large DP degrees. For example, with: - Flattened tensor size: 266240 - DP degree: 768 - Alignment: 1536 - Required padding: 1024 (1536 * 174 - 266240) - Per-rank partition size: 348 (1536 * 174 / 768) - The padding occurs on last three ranks. This PR removes the single-rank padding assumption for more general cases. --------- Co-authored-by: Sam Foreman Co-authored-by: Logan Adams <114770087+loadams@users.noreply.github.com> Co-authored-by: Olatunji Ruwase --- deepspeed/runtime/zero/stage_1_and_2.py | 19 ++++++++++++------- 1 file changed, 12 insertions(+), 7 deletions(-) diff --git a/deepspeed/runtime/zero/stage_1_and_2.py b/deepspeed/runtime/zero/stage_1_and_2.py index ed3425167944..2bece09bffc4 100755 --- a/deepspeed/runtime/zero/stage_1_and_2.py +++ b/deepspeed/runtime/zero/stage_1_and_2.py @@ -366,13 +366,6 @@ def __init__(self, see_memory_usage(f"After flattening and moving param group {i} to GPU", force=False) - # Record padding required for alignment - if partition_id == dist.get_world_size(group=self.real_dp_process_group[i]) - 1: - padding = self.bit16_groups_flat[i].numel() - orig_group_numel - else: - padding = 0 - self.groups_padding.append(padding) - if dist.get_rank(group=self.real_dp_process_group[i]) == 0: see_memory_usage(f"After Flattening and after emptying param group {i} cache", force=False) @@ -384,6 +377,18 @@ def __init__(self, data_parallel_partitions = self.get_data_parallel_partitions(self.bit16_groups_flat[i], i) self.parallel_partitioned_bit16_groups.append(data_parallel_partitions) + # Record padding required for alignment + left_boundary = sum([t.numel() for t in data_parallel_partitions[:partition_id]]) + curr_partition_size = data_parallel_partitions[partition_id].numel() + + if orig_group_numel <= left_boundary: + padding = curr_partition_size + elif orig_group_numel < left_boundary + curr_partition_size: + padding = left_boundary + curr_partition_size - orig_group_numel + else: + padding = 0 + self.groups_padding.append(padding) + # verify that data partition start locations are 4-byte aligned for partitioned_data in data_parallel_partitions: assert (partitioned_data.data_ptr() % (2 * self.nccl_start_alignment_factor) == 0) From 029e0a33d6d41220cdaab0eec6a06044a24425f9 Mon Sep 17 00:00:00 2001 From: Olatunji Ruwase Date: Fri, 31 Jan 2025 08:29:30 -0500 Subject: [PATCH 705/754] Use ds-specific module id to avoid conflicts (#6847) Fix #6772 --------- Co-authored-by: Logan Adams <114770087+loadams@users.noreply.github.com> --- deepspeed/runtime/zero/parameter_offload.py | 24 +++++++------ .../zero/partitioned_param_coordinator.py | 24 ++++++------- deepspeed/runtime/zero/stage3.py | 2 +- tests/unit/runtime/zero/test_zero.py | 34 +++++++++++++++++++ 4 files changed, 60 insertions(+), 24 deletions(-) diff --git a/deepspeed/runtime/zero/parameter_offload.py b/deepspeed/runtime/zero/parameter_offload.py index d5b7bac55146..b5a75fce32fe 100644 --- a/deepspeed/runtime/zero/parameter_offload.py +++ b/deepspeed/runtime/zero/parameter_offload.py @@ -243,7 +243,7 @@ def _start_of_forward_hook(module, *args): self.module.register_forward_pre_hook(_start_of_forward_hook) #likely one of them should be enough but just to be safe - self._register_hooks_recursively(self.module) + self._register_deepspeed_module(self.module) # Add top module to stack trace global FWD_MODULE_STACK @@ -269,11 +269,11 @@ def mark_persistent_parameters(self, param_threshold, model_threshold): return persistent_params - def _register_hooks_recursively(self, module, count=[0]): + def _register_deepspeed_module(self, module, count=[0]): my_count = count[0] - module.id = my_count + module.ds_id = my_count - #print(f"{module.__class__} : {module.id}") + #print(f"{module.__class__} : {module.ds_id}") if z3_leaf_module(module): for param in module.parameters(): @@ -281,7 +281,7 @@ def _register_hooks_recursively(self, module, count=[0]): else: for child in module.children(): count[0] = count[0] + 1 - self._register_hooks_recursively(child, count=count) + self._register_deepspeed_module(child, count=count) @instrument_w_nvtx def _pre_forward_module_hook(module, *args): @@ -466,14 +466,16 @@ def pre_sub_module_forward_function(self, sub_module): @torch.no_grad() def post_sub_module_forward_function(self, sub_module): - see_memory_usage(f"After sub module function {sub_module.__class__.__name__} {sub_module.id} before release", - force=False) + see_memory_usage( + f"After sub module function {sub_module.__class__.__name__} {sub_module.ds_id} before release", + force=False) param_coordinator = self.get_param_coordinator() param_coordinator.release_sub_module(sub_module) - see_memory_usage(f"After sub module function {sub_module.__class__.__name__} {sub_module.id} after release", - force=False) + see_memory_usage( + f"After sub module function {sub_module.__class__.__name__} {sub_module.ds_id} after release", + force=False) @torch.no_grad() def pre_sub_module_backward_function(self, sub_module): @@ -488,13 +490,13 @@ def pre_sub_module_backward_function(self, sub_module): def post_sub_module_backward_function(self, sub_module): # assert sub_module.training, "backward pass is invalid for module in evaluation mode" see_memory_usage( - f"After sub module backward function {sub_module.__class__.__name__} {sub_module.id} before release", + f"After sub module backward function {sub_module.__class__.__name__} {sub_module.ds_id} before release", force=False) self.get_param_coordinator().release_sub_module(sub_module) see_memory_usage( - f"After sub module backward function {sub_module.__class__.__name__} {sub_module.id} after release", + f"After sub module backward function {sub_module.__class__.__name__} {sub_module.ds_id} after release", force=False) def _set_z3_leaf_modules_by_threshold(self, module, zero_module_granularity_threshold): diff --git a/deepspeed/runtime/zero/partitioned_param_coordinator.py b/deepspeed/runtime/zero/partitioned_param_coordinator.py index 08cb6c0de54f..415afd8d7026 100644 --- a/deepspeed/runtime/zero/partitioned_param_coordinator.py +++ b/deepspeed/runtime/zero/partitioned_param_coordinator.py @@ -175,17 +175,17 @@ def trace_prologue(self, sub_module: Module) -> None: # sub_module must match expectation else invalidate trace cache if len(self.__submodule_order) <= self.__step_id: print_rank_0( - f"Invalidate trace cache @ step {self.__step_id} and module {sub_module.id}: " + f"Invalidate trace cache @ step {self.__step_id} and module {sub_module.ds_id}: " f"cache has only {len(self.__submodule_order)} modules", force=True) self._invalidate_trace() return if sub_module != self.__submodule_order[self.__step_id]: - expected_module_id = self.__submodule_order[self.__step_id].id + expected_module_id = self.__submodule_order[self.__step_id].ds_id print_rank_0( f"Invalidate trace cache @ step {self.__step_id}: " - f"expected module {expected_module_id}, but got module {sub_module.id}", + f"expected module {expected_module_id}, but got module {sub_module.ds_id}", force=True) self._invalidate_trace() @@ -199,7 +199,7 @@ def record_module(self, sub_module: Module) -> None: raise RuntimeError(f"attempted to record trace when status = {self.__trace_mode}") self.__submodule_order.append(sub_module) - self.__step_id_module_fetched_for[sub_module.id].append(self.__step_id) + self.__step_id_module_fetched_for[sub_module.ds_id].append(self.__step_id) def record_parameters(self, sub_module: Module) -> None: if is_compiling(): @@ -208,7 +208,7 @@ def record_parameters(self, sub_module: Module) -> None: if not self.is_record_trace(): raise RuntimeError(f"attempted to record trace when status = {self.__trace_mode}") - step_id = self.__step_id_module_fetched_for[sub_module.id].popleft() + step_id = self.__step_id_module_fetched_for[sub_module.ds_id].popleft() for param in sorted(set(iter_params(sub_module, recurse=z3_leaf_module(sub_module))), key=lambda p: p.ds_id): self.__param_order.append(__class__.__ParamInTrace(param=param, step_id_last_used_at=step_id)) @@ -228,7 +228,7 @@ def reset_step(self) -> None: if not self.is_complete_trace(): # not self.trace_complete: # Make sure that recorded submodule orders are identical across ranks - assert_ints_same_as_other_ranks([m.id for m in self.__submodule_order]) + assert_ints_same_as_other_ranks([m.ds_id for m in self.__submodule_order]) if self.is_record_trace(): # Successfully recorded a trace @@ -241,7 +241,7 @@ def reset_step(self) -> None: self.__param_order = tuple(self.__param_order) # freeze self.__trace_mode = ZeRoTraceMode.COMPLETE print_rank_0( - f"completed record trace of {len(self.__submodule_order)} sub modules: {[m.id for m in self.__submodule_order]}", + f"completed record trace of {len(self.__submodule_order)} sub modules: {[m.ds_id for m in self.__submodule_order]}", force=False) else: # Enable trace recording for next forward/backward pass @@ -284,7 +284,7 @@ def fetch_sub_module(self, current_submodule: Module, forward: bool) -> None: """ if logger.isEnabledFor(logging.DEBUG): debug_rank0( - f"{self.__step_id}: M{current_submodule.id}({type(current_submodule).__name__}) P{[p.ds_id for p in iter_params(current_submodule, recurse=z3_leaf_module(current_submodule))]} " + f"{self.__step_id}: M{current_submodule.ds_id}({type(current_submodule).__name__}) P{[p.ds_id for p in iter_params(current_submodule, recurse=z3_leaf_module(current_submodule))]} " + str({ "avail": f"{self.__n_available_params:.1e}", "queue_sz": f"{len(self.__param_queue or [])}", @@ -297,7 +297,7 @@ def fetch_sub_module(self, current_submodule: Module, forward: bool) -> None: if fetch_numel > 0: event_name = __class__.FORWARD_FETCH_SUBMIT if forward else __class__.BACKWARD_FETCH_SUBMIT - self._dump_param_ids(event_name, current_submodule.id, + self._dump_param_ids(event_name, current_submodule.ds_id, [p.ds_id for p in params_to_fetch if p.ds_status == ZeroParamStatus.NOT_AVAILABLE]) self.__profiler.start_event(event_name) # kick off all gather for params in the immediately required submodule @@ -314,7 +314,7 @@ def fetch_sub_module(self, current_submodule: Module, forward: bool) -> None: fast_fetch = self.fast_sharding_for_leaf_module and z3_leaf_module(current_submodule) # wait for parameters in the immediately needed submodule to become available for param in params_to_fetch: - param.ds_active_sub_modules.add(current_submodule.id) + param.ds_active_sub_modules.add(current_submodule.ds_id) if logger.isEnabledFor(logging.DEBUG): debug_rank0(f"-wait: {param.ds_summary()}") if param in self.__inflight_param_registry: @@ -358,7 +358,7 @@ def fetch_sub_module(self, current_submodule: Module, forward: bool) -> None: if discarded_from_prefetch_queue != params_not_already_fetched: raise RuntimeError( f"tracing error at step {self.__step_id}: \n" - f"module id: {current_submodule.id}, training: {current_submodule.training}\n" + f"module id: {current_submodule.ds_id}, training: {current_submodule.training}\n" f"expected the next {len(params_not_already_fetched)} parameters in the " f"parameter fetch queue to be {tuple(p.ds_summary(use_debug_name=True) for p in params_not_already_fetched)} \n" f"but got \n {tuple(p.ds_summary(use_debug_name=True) for p in discarded_from_prefetch_queue)}.") @@ -425,7 +425,7 @@ def release_sub_module(self, submodule: Module) -> None: empty_buffer = torch.empty(1, device=get_accelerator().current_device()) for param in iter_params(submodule, recurse=z3_leaf_module(submodule)): - param.ds_active_sub_modules.discard(submodule.id) + param.ds_active_sub_modules.discard(submodule.ds_id) if param.ds_id in params_to_release and not param.is_external_param: self.__release_param(param, free_data) if not free_data: diff --git a/deepspeed/runtime/zero/stage3.py b/deepspeed/runtime/zero/stage3.py index 3195c973a179..697cb294d1f3 100644 --- a/deepspeed/runtime/zero/stage3.py +++ b/deepspeed/runtime/zero/stage3.py @@ -102,7 +102,7 @@ def unwrap_model_for_generation(model): optimizer_offload = model.optimizer.parameter_offload elif model.optimizer is not None: optimizer_offload = model.optimizer - optimizer_offload._register_hooks_recursively(optimizer_offload.module) + optimizer_offload._register_deepspeed_module(optimizer_offload.module) return diff --git a/tests/unit/runtime/zero/test_zero.py b/tests/unit/runtime/zero/test_zero.py index 5dffd70aab68..d39953f40f07 100644 --- a/tests/unit/runtime/zero/test_zero.py +++ b/tests/unit/runtime/zero/test_zero.py @@ -1673,3 +1673,37 @@ def test(self, prefetch_ratio, zero_stage=3): with torch.no_grad(): for batch in data_loader: loss = model(batch[0], batch[1]) + + +# Avoid overwriting client module id +# https://github.com/microsoft/DeepSpeed/issues/6772 +class TestZero3ClientModuleID(DistributedTest): + world_size = 2 + + def test_client_module_id(self): + config_dict = { + "train_micro_batch_size_per_gpu": 1, + "steps_per_print": 1, + "optimizer": { + "type": "Adam", + }, + "zero_optimization": { + "stage": 3 + }, + } + + class MyModel(torch.nn.Module): + + def __init__(self): + super().__init__() + self.id = 3 # ID arbitrary client usage, e.g. GPU placement + self.fc = Linear(128, 128) + + def forward(self, x): + return self.fc(x) + + model = MyModel() + pre_init_m_id = model.id + model, _, _, _ = deepspeed.initialize(model=model, model_parameters=model.parameters(), config=config_dict) + post_init_m_id = model.id + assert pre_init_m_id == post_init_m_id From 241bffded38fb81da533b5c4902c933270ba042a Mon Sep 17 00:00:00 2001 From: Logan Adams <114770087+loadams@users.noreply.github.com> Date: Fri, 31 Jan 2025 15:07:12 -0800 Subject: [PATCH 706/754] Update A6000 workflows to use newer docker container - 24.09 vs 24.03 (#6967) - Issues with nv-sd updates, will follow up with a subsequent PR --- .github/workflows/nv-a6000.yml | 6 +++--- .github/workflows/nv-flash-attn.yml | 4 ++-- .github/workflows/nv-human-eval.yml | 4 ++-- 3 files changed, 7 insertions(+), 7 deletions(-) diff --git a/.github/workflows/nv-a6000.yml b/.github/workflows/nv-a6000.yml index 0547431e3099..e48d9a7fffa2 100644 --- a/.github/workflows/nv-a6000.yml +++ b/.github/workflows/nv-a6000.yml @@ -23,7 +23,7 @@ jobs: unit-tests: runs-on: [self-hosted, nvidia, a6000] container: - image: nvcr.io/nvidia/pytorch:24.03-py3 + image: nvcr.io/nvidia/pytorch:24.09-py3 ports: - 80 options: --gpus all --shm-size "8G" @@ -57,8 +57,8 @@ jobs: run: | unset TORCH_CUDA_ARCH_LIST # only jit compile for current arch cd tests - python -m pytest --color=yes --durations=0 --verbose -rF -m 'inference_v2' unit/ --torch_ver="2.3" --cuda_ver="12" - python -m pytest --color=yes --durations=0 --verbose -rF -m 'inference_v2_ops' unit/ --torch_ver="2.3" --cuda_ver="12" + python -m pytest --color=yes --durations=0 --verbose -rF -m 'inference_v2' unit/ --torch_ver="2.5" --cuda_ver="12" + python -m pytest --color=yes --durations=0 --verbose -rF -m 'inference_v2_ops' unit/ --torch_ver="2.5" --cuda_ver="12" - name: MII unit tests run: | BRANCH="main" diff --git a/.github/workflows/nv-flash-attn.yml b/.github/workflows/nv-flash-attn.yml index 310972323043..591969fbd986 100644 --- a/.github/workflows/nv-flash-attn.yml +++ b/.github/workflows/nv-flash-attn.yml @@ -18,7 +18,7 @@ jobs: unit-tests: runs-on: [self-hosted, nvidia, a6000] container: - image: nvcr.io/nvidia/pytorch:24.03-py3 + image: nvcr.io/nvidia/pytorch:24.09-py3 ports: - 80 options: --gpus all --shm-size "8G" @@ -53,7 +53,7 @@ jobs: run: | unset TORCH_CUDA_ARCH_LIST # only jit compile for current arch cd tests - python -m pytest --color=yes --durations=0 --verbose -rF unit/sequence_parallelism/test_ulysses.py --torch_ver="2.3" --cuda_ver="12" + python -m pytest --color=yes --durations=0 --verbose -rF unit/sequence_parallelism/test_ulysses.py --torch_ver="2.5" --cuda_ver="12" - name: Open GitHub issue if nightly CI fails if: ${{ failure() && (github.event_name == 'schedule') }} uses: JasonEtco/create-an-issue@v2 diff --git a/.github/workflows/nv-human-eval.yml b/.github/workflows/nv-human-eval.yml index 2ecdf218b96a..3f59c42f697e 100644 --- a/.github/workflows/nv-human-eval.yml +++ b/.github/workflows/nv-human-eval.yml @@ -11,7 +11,7 @@ jobs: unit-tests: runs-on: [self-hosted, nvidia, a6000] container: - image: nvcr.io/nvidia/pytorch:24.03-py3 + image: nvcr.io/nvidia/pytorch:24.09-py3 ports: - 80 options: --gpus all --shm-size "8G" @@ -50,4 +50,4 @@ jobs: run: | unset TORCH_CUDA_ARCH_LIST # only jit compile for current arch cd tests - python -m pytest --color=yes --durations=0 --verbose -rF -m 'evaluation' -k "test_human_eval" unit/ --torch_ver="2.3" --cuda_ver="12" + python -m pytest --color=yes --durations=0 --verbose -rF -m 'evaluation' -k "test_human_eval" unit/ --torch_ver="2.5" --cuda_ver="12" From f4caed6d4f05e8b30e968fb51f46e885cdee796d Mon Sep 17 00:00:00 2001 From: Fabien Dupont Date: Tue, 4 Feb 2025 18:47:44 +0100 Subject: [PATCH 707/754] Allow NVIDIA Blackwell (#6991) NVIDIA Blackwell GPU generation has number 10. The SM code and architecture should be `100`, but the current code generates `1.`, because it expects a 2 characters string. This change modifies the logic to consider it as a string that contains a `.`, hence splits the string and uses the array of strings. Signed-off-by: Fabien Dupont --- op_builder/builder.py | 10 +++++----- op_builder/fp_quantizer.py | 2 +- op_builder/inference_core_ops.py | 2 +- op_builder/inference_cutlass_builder.py | 2 +- op_builder/ragged_ops.py | 2 +- op_builder/ragged_utils.py | 2 +- op_builder/transformer_inference.py | 2 +- 7 files changed, 11 insertions(+), 11 deletions(-) diff --git a/op_builder/builder.py b/op_builder/builder.py index cdd11f00cabf..ac850775cb11 100644 --- a/op_builder/builder.py +++ b/op_builder/builder.py @@ -612,8 +612,8 @@ def compute_capability_args(self, cross_compile_archs=None): - `TORCH_CUDA_ARCH_LIST` may use ; or whitespace separators. Examples: - TORCH_CUDA_ARCH_LIST="6.1;7.5;8.6" pip install ... - TORCH_CUDA_ARCH_LIST="6.0 6.1 7.0 7.5 8.0 8.6+PTX" pip install ... + TORCH_CUDA_ARCH_LIST="6.1;7.5;8.6;9.0;10.0" pip install ... + TORCH_CUDA_ARCH_LIST="6.0 6.1 7.0 7.5 8.0 8.6 9.0 10.0+PTX" pip install ... - `cross_compile_archs` uses ; separator. @@ -651,9 +651,9 @@ def compute_capability_args(self, cross_compile_archs=None): args = [] self.enable_bf16 = True for cc in ccs: - num = cc[0] + cc[2] + num = cc[0] + cc[1].split('+')[0] args.append(f'-gencode=arch=compute_{num},code=sm_{num}') - if cc.endswith('+PTX'): + if cc[1].endswith('+PTX'): args.append(f'-gencode=arch=compute_{num},code=compute_{num}') if int(cc[0]) <= 7: @@ -666,7 +666,7 @@ def filter_ccs(self, ccs: List[str]): Prune any compute capabilities that are not compatible with the builder. Should log which CCs have been pruned. """ - return ccs + return [cc.split('.') for cc in ccs] def version_dependent_macros(self): # Fix from apex that might be relevant for us as well, related to https://github.com/NVIDIA/apex/issues/456 diff --git a/op_builder/fp_quantizer.py b/op_builder/fp_quantizer.py index daa41a8148f5..e42927bd065d 100644 --- a/op_builder/fp_quantizer.py +++ b/op_builder/fp_quantizer.py @@ -78,7 +78,7 @@ def is_compatible(self, verbose=False): def filter_ccs(self, ccs): ccs_retained = [] ccs_pruned = [] - for cc in ccs: + for cc in [cc.split('.') for cc in ccs]: if int(cc[0]) >= 8: ccs_retained.append(cc) else: diff --git a/op_builder/inference_core_ops.py b/op_builder/inference_core_ops.py index f7c0b47f92c6..b6665ebb7618 100755 --- a/op_builder/inference_core_ops.py +++ b/op_builder/inference_core_ops.py @@ -46,7 +46,7 @@ def is_compatible(self, verbose=False): def filter_ccs(self, ccs): ccs_retained = [] ccs_pruned = [] - for cc in ccs: + for cc in [cc.split('.') for cc in ccs]: if int(cc[0]) >= 6: ccs_retained.append(cc) else: diff --git a/op_builder/inference_cutlass_builder.py b/op_builder/inference_cutlass_builder.py index aa5294b1cbda..a4a607288ca8 100644 --- a/op_builder/inference_cutlass_builder.py +++ b/op_builder/inference_cutlass_builder.py @@ -45,7 +45,7 @@ def is_compatible(self, verbose=False): def filter_ccs(self, ccs): ccs_retained = [] ccs_pruned = [] - for cc in ccs: + for cc in [cc.split('.') for cc in ccs]: if int(cc[0]) >= 8: # Only support Ampere and newer ccs_retained.append(cc) diff --git a/op_builder/ragged_ops.py b/op_builder/ragged_ops.py index 10afb193c738..0df28cc2282a 100644 --- a/op_builder/ragged_ops.py +++ b/op_builder/ragged_ops.py @@ -46,7 +46,7 @@ def is_compatible(self, verbose=False): def filter_ccs(self, ccs): ccs_retained = [] ccs_pruned = [] - for cc in ccs: + for cc in [cc.split('.') for cc in ccs]: if int(cc[0]) >= 8: # Blocked flash has a dependency on Ampere + newer ccs_retained.append(cc) diff --git a/op_builder/ragged_utils.py b/op_builder/ragged_utils.py index 654ba07e0879..208c9f833ebe 100755 --- a/op_builder/ragged_utils.py +++ b/op_builder/ragged_utils.py @@ -46,7 +46,7 @@ def is_compatible(self, verbose=False): def filter_ccs(self, ccs): ccs_retained = [] ccs_pruned = [] - for cc in ccs: + for cc in [cc.split('.') for cc in ccs]: if int(cc[0]) >= 6: ccs_retained.append(cc) else: diff --git a/op_builder/transformer_inference.py b/op_builder/transformer_inference.py index 1b056ecef3ed..642aed56a192 100755 --- a/op_builder/transformer_inference.py +++ b/op_builder/transformer_inference.py @@ -44,7 +44,7 @@ def is_compatible(self, verbose=False): def filter_ccs(self, ccs): ccs_retained = [] ccs_pruned = [] - for cc in ccs: + for cc in [cc.split('.') for cc in ccs]: if int(cc[0]) >= 6: ccs_retained.append(cc) else: From fd405169232dd83bdc7883df1c7d707d482e1be6 Mon Sep 17 00:00:00 2001 From: Olatunji Ruwase Date: Tue, 4 Feb 2025 19:56:50 -0500 Subject: [PATCH 708/754] Update GH org references (#6998) Signed-off-by: Olatunji Ruwase Signed-off-by: Logan Adams Signed-off-by: Fabien Dupont Co-authored-by: Fabien Dupont --- .../deepspeed_chat_bug_report.md | 2 +- .../ISSUE_TEMPLATE/inference_bug_report.md | 2 +- .github/workflows/nv-a6000.yml | 2 +- .github/workflows/nv-ds-chat.yml | 2 +- .github/workflows/nv-mii.yml | 2 +- CONTRIBUTING.md | 8 +- README.md | 68 +++++++-------- accelerator/real_accelerator.py | 2 +- benchmarks/README.md | 4 +- blogs/deepspeed-chat/README.md | 12 +-- blogs/deepspeed-chat/chinese/README.md | 14 +-- .../ds-chat-release-8-31/README.md | 86 +++++++++---------- blogs/deepspeed-chat/japanese/README.md | 12 +-- blogs/deepspeed-domino/README.md | 2 +- blogs/deepspeed-fastgen/2024-01-19/README.md | 36 ++++---- blogs/deepspeed-fastgen/README.md | 20 ++--- blogs/deepspeed-fastgen/chinese/README.md | 20 ++--- blogs/deepspeed-fastgen/japanese/README.md | 22 ++--- .../03-05-2024/README-Chinese.md | 6 +- blogs/deepspeed-fp6/03-05-2024/README.md | 6 +- blogs/deepspeed-gds/README.md | 2 +- blogs/deepspeed-gds/japanese/README.md | 2 +- blogs/deepspeed-offloadpp/README.md | 2 +- blogs/deepspeed-triton/README.md | 6 +- blogs/deepspeed-ucp/README.md | 4 +- blogs/deepspeed-ulysses/README.md | 2 +- blogs/deepspeed-ulysses/japanese/README.md | 2 +- .../10-03-2023/README-Chinese.md | 12 +-- .../10-03-2023/README-Japanese.md | 12 +-- .../deepspeed-visualchat/10-03-2023/README.md | 12 +-- blogs/deepspeed4science/chinese/README.md | 4 +- blogs/deepspeed4science/japanese/README.md | 4 +- blogs/intel-inference/README.md | 6 +- blogs/windows/08-2024/README.md | 2 +- blogs/windows/08-2024/japanese/README.md | 2 +- blogs/zeropp/japanese/README.md | 2 +- deepspeed/autotuning/README.md | 6 +- deepspeed/inference/engine.py | 2 +- deepspeed/inference/v2/engine_factory.py | 2 +- .../containers/features/meta_tensor.py | 2 +- deepspeed/module_inject/replace_module.py | 2 +- deepspeed/moe/sharded_moe.py | 2 +- .../bert_sparse_self_attention.py | 2 +- deepspeed/profiling/flops_profiler/README.md | 2 +- .../runtime/comm/coalesced_collectives.py | 4 +- deepspeed/runtime/zero/stage3.py | 2 +- docker/Dockerfile | 2 +- docs/_data/navigation.yml | 2 +- docs/_pages/deepspeed4science.md | 4 +- docs/_pages/inference.md | 4 +- docs/_posts/2020-05-19-bert-record.md | 2 +- .../2020-05-28-fastest-bert-training.md | 2 +- .../2020-09-08-sparse-attention-news.md | 2 +- docs/_posts/2020-09-09-ZeRO-Offload.md | 2 +- docs/_posts/2020-09-09-onebit-adam-news.md | 2 +- .../_posts/2020-09-09-pipeline-parallelism.md | 2 +- docs/_posts/2020-09-09-sparse-attention.md | 2 +- ...0-10-28-progressive-layer-dropping-news.md | 2 +- docs/_posts/2021-11-15-autotuning.md | 6 +- docs/_posts/2021-12-09-deepspeed-moe-nlg.md | 4 +- docs/_posts/2022-07-26-deepspeed-azure.md | 12 +-- docs/_posts/2022-09-10-zero-inference.md | 2 +- docs/_posts/2022-10-11-mii.md | 6 +- docs/_posts/2022-12-12-data-efficiency.md | 2 +- docs/_posts/2023-03-31-multi-modal.md | 2 +- .../2023-04-24-deepspeed-chat-chinese.md | 2 +- .../2023-04-24-deepspeed-chat-japanese.md | 2 +- docs/_posts/2023-04-24-deepspeed-chat.md | 2 +- docs/_posts/2023-06-22-zeropp-chinese.md | 2 +- docs/_posts/2023-06-22-zeropp-japanese.md | 2 +- docs/_posts/2023-08-24-ulysses-chinese.md | 2 +- docs/_posts/2023-08-24-ulysses-japanese.md | 2 +- docs/_posts/2023-08-24-ulysses.md | 2 +- docs/_posts/2023-09-12-ZeRO-Inference.md | 2 +- .../2023-09-19-deepspeed4science-chinese.md | 2 +- .../2023-09-19-deepspeed4science-japanese.md | 2 +- ...2023-10-04-deepspeed-visualchat-chinese.md | 2 +- ...023-10-04-deepspeed-visualchat-japanese.md | 2 +- .../_posts/2023-10-04-deepspeed-visualchat.md | 2 +- .../2023-11-06-deepspeed-fastgen-chinese.md | 2 +- .../2023-11-06-deepspeed-fastgen-japanese.md | 2 +- docs/_posts/2023-11-06-deepspeed-fastgen.md | 2 +- .../accelerator-abstraction-interface.md | 4 +- docs/_tutorials/accelerator-setup-guide.md | 2 +- docs/_tutorials/advanced-install.md | 4 +- .../automatic-tensor-parallelism.md | 2 +- docs/_tutorials/autotuning.md | 10 +-- docs/_tutorials/azure.md | 4 +- docs/_tutorials/bert-finetuning.md | 2 +- docs/_tutorials/bert-pretraining.md | 6 +- docs/_tutorials/cifar-10.md | 2 +- docs/_tutorials/comms-logging.md | 2 +- docs/_tutorials/curriculum-learning.md | 10 +-- docs/_tutorials/data-efficiency.md | 12 +-- docs/_tutorials/deepnvme.md | 18 ++-- docs/_tutorials/domino.md | 2 +- docs/_tutorials/ds-sequence.md | 6 +- docs/_tutorials/flops-profiler.md | 2 +- docs/_tutorials/gan.md | 2 +- docs/_tutorials/inference-tutorial.md | 6 +- docs/_tutorials/large-models-w-deepspeed.md | 2 +- docs/_tutorials/megatron.md | 2 +- docs/_tutorials/mixed_precision_zeropp.md | 4 +- .../mixture-of-experts-inference.md | 2 +- docs/_tutorials/mixture-of-experts-nlg.md | 8 +- docs/_tutorials/mixture-of-experts.md | 8 +- docs/_tutorials/model-compression.md | 34 ++++---- docs/_tutorials/monitor.md | 2 +- docs/_tutorials/onebit-adam.md | 8 +- docs/_tutorials/onebit-lamb.md | 6 +- docs/_tutorials/sparse-attention.md | 16 ++-- docs/_tutorials/ulysses-offload.md | 6 +- docs/_tutorials/universal-checkpointing.md | 6 +- docs/_tutorials/zero-offload.md | 4 +- docs/_tutorials/zero-one-adam.md | 8 +- docs/_tutorials/zero.md | 4 +- docs/_tutorials/zeropp.md | 2 +- docs/code-docs/source/model-checkpointing.rst | 2 +- docs/contributing.md | 6 +- docs/index.md | 36 ++++---- examples/README.md | 4 +- op_builder/sparse_attn.py | 2 +- setup.py | 2 +- tests/unit/runtime/zero/test_zero.py | 10 +-- .../zero/test_zero_context_ancestry.py | 2 +- .../unit/sequence_parallelism/test_ulysses.py | 2 +- 126 files changed, 405 insertions(+), 405 deletions(-) diff --git a/.github/ISSUE_TEMPLATE/deepspeed_chat_bug_report.md b/.github/ISSUE_TEMPLATE/deepspeed_chat_bug_report.md index bf997775fe32..f27b1c6303eb 100644 --- a/.github/ISSUE_TEMPLATE/deepspeed_chat_bug_report.md +++ b/.github/ISSUE_TEMPLATE/deepspeed_chat_bug_report.md @@ -32,7 +32,7 @@ If applicable, add screenshots to help explain your problem. **System info (please complete the following information):** - OS: [e.g. Ubuntu 18.04] - GPU count and types [e.g. two machines with x8 A100s each] - - (if applicable) what [DeepSpeed-MII](https://github.com/microsoft/deepspeed-mii) version are you using + - (if applicable) what [DeepSpeed-MII](https://github.com/deepspeedai/deepspeed-mii) version are you using - (if applicable) Hugging Face Transformers/Accelerate/etc. versions - Python version - Any other relevant info about your setup diff --git a/.github/ISSUE_TEMPLATE/inference_bug_report.md b/.github/ISSUE_TEMPLATE/inference_bug_report.md index bc5df17258b0..8a4144ce049a 100644 --- a/.github/ISSUE_TEMPLATE/inference_bug_report.md +++ b/.github/ISSUE_TEMPLATE/inference_bug_report.md @@ -29,7 +29,7 @@ If applicable, add screenshots to help explain your problem. **System info (please complete the following information):** - OS: [e.g. Ubuntu 18.04] - GPU count and types [e.g. two machines with x8 A100s each] - - (if applicable) what [DeepSpeed-MII](https://github.com/microsoft/deepspeed-mii) version are you using + - (if applicable) what [DeepSpeed-MII](https://github.com/deepspeedai/deepspeed-mii) version are you using - (if applicable) Hugging Face Transformers/Accelerate/etc. versions - Python version - Any other relevant info about your setup diff --git a/.github/workflows/nv-a6000.yml b/.github/workflows/nv-a6000.yml index e48d9a7fffa2..5631d318d027 100644 --- a/.github/workflows/nv-a6000.yml +++ b/.github/workflows/nv-a6000.yml @@ -66,7 +66,7 @@ jobs: BRANCH="${{ github.event.inputs.mii_branch }}" fi echo "Cloning DeepSpeed-MII branch: $BRANCH" - git clone -b $BRANCH --depth=1 https://github.com/microsoft/DeepSpeed-MII.git + git clone -b $BRANCH --depth=1 https://github.com/deepspeedai/DeepSpeed-MII.git cd DeepSpeed-MII pip install .[dev] cd tests diff --git a/.github/workflows/nv-ds-chat.yml b/.github/workflows/nv-ds-chat.yml index 5d47519fe204..ec9b99b2c2db 100644 --- a/.github/workflows/nv-ds-chat.yml +++ b/.github/workflows/nv-ds-chat.yml @@ -54,7 +54,7 @@ jobs: BRANCH="${{ github.event.inputs.dse_branch }}" fi echo "DeepSpeedExamples Branch: $BRANCH" - git clone -b $BRANCH https://github.com/microsoft/DeepSpeedExamples.git + git clone -b $BRANCH https://github.com/deepspeedai/DeepSpeedExamples.git cd DeepSpeedExamples/applications/DeepSpeed-Chat pip install -r requirements.txt pip install -e . diff --git a/.github/workflows/nv-mii.yml b/.github/workflows/nv-mii.yml index a576e5933b08..a2397f347799 100644 --- a/.github/workflows/nv-mii.yml +++ b/.github/workflows/nv-mii.yml @@ -66,7 +66,7 @@ jobs: BRANCH="${{ github.event.inputs.mii_branch }}" fi echo "Cloning DeepSpeed-MII branch: $BRANCH" - git clone -b $BRANCH --depth=1 https://github.com/microsoft/DeepSpeed-MII.git + git clone -b $BRANCH --depth=1 https://github.com/deepspeedai/DeepSpeed-MII.git cd DeepSpeed-MII pip install .[dev] unset TORCH_CUDA_ARCH_LIST # only jit compile for current arch diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index f6e5f39869eb..e8e160269695 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -23,7 +23,7 @@ and then repeat the previous `git commit` command. ## Testing DeepSpeed tracks two types of tests: unit tests and more costly model convergence tests. The model convergence tests train -[DeepSpeedExamples](https://github.com/microsoft/DeepSpeedExamples/) and measure +[DeepSpeedExamples](https://github.com/deepspeedai/DeepSpeedExamples/) and measure end-to-end convergence and related metrics. Unit tests are found in `tests/unit/` and the model convergence tests are found in `tests/model/`. @@ -40,7 +40,7 @@ tests. Note that [pytest-forked](https://github.com/pytest-dev/pytest-forked) an ### Model Tests To execute model tests, first [install DeepSpeed](#installation). The -[DeepSpeedExamples](https://github.com/microsoft/DeepSpeedExamples/) repository is cloned +[DeepSpeedExamples](https://github.com/deepspeedai/DeepSpeedExamples/) repository is cloned as part of this process. Next, execute the model test driver: ```bash cd tests/model/ @@ -85,8 +85,8 @@ Based on the issue we shall discuss the merit of the new feature and decide whet ### Step 2: implementation and verification Contributor will go ahead and implement the feature, and the DeepSpeed team will provide guidance/helps as needed. The required deliverables include: -* A PR to [microsoft/DeepSpeed](https://github.com/microsoft/DeepSpeed) including (1) the feature implementation (2) unit tests (3) documentation (4) tutorial -* A PR to [microsoft/DeepSpeedExamples](https://github.com/microsoft/DeepSpeedExamples) or [microsoft/Megatron-DeepSpeed](https://github.com/microsoft/Megatron-DeepSpeed) including the examples of how to use the feature (this is related to the planned testing experiments in proposal) +* A PR to [deepspeedai/DeepSpeed](https://github.com/deepspeedai/DeepSpeed) including (1) the feature implementation (2) unit tests (3) documentation (4) tutorial +* A PR to [deepspeedai/DeepSpeedExamples](https://github.com/deepspeedai/DeepSpeedExamples) or [deepspeedai/Megatron-DeepSpeed](https://github.com/deepspeedai/Megatron-DeepSpeed) including the examples of how to use the feature (this is related to the planned testing experiments in proposal) * In the implementation (code, documentation, tutorial), we require the feature author to record their GitHub username as a contact method for future questions/maintenance. After receiving the PRs, we will review them and merge them after necessary tests/fixes. diff --git a/README.md b/README.md index 03aba73cfa04..9f071c3f0a65 100755 --- a/README.md +++ b/README.md @@ -1,4 +1,4 @@ -[![License Apache 2.0](https://badgen.net/badge/license/apache2.0/blue)](https://github.com/Microsoft/DeepSpeed/blob/master/LICENSE) +[![License Apache 2.0](https://badgen.net/badge/license/apache2.0/blue)](https://github.com/deepspeedai/DeepSpeed/blob/master/LICENSE) [![PyPI version](https://badge.fury.io/py/deepspeed.svg)](https://pypi.org/project/deepspeed/) [![Downloads](https://static.pepy.tech/badge/deepspeed)](https://pepy.tech/project/deepspeed) [![Build](https://badgen.net/badge/build/check-status/blue)](#build-pipeline-status) @@ -14,33 +14,33 @@ ## Latest News - DeepSpeed empowers ChatGPT-like model training with a single click, offering 15x speedup over SOTA RLHF systems with unprecedented cost reduction at all scales; [learn how](https://github.com/microsoft/DeepSpeed/tree/master/blogs/deepspeed-chat). - -* [2024/12] [Ulysses-Offload: Democratizing Long Context LLM Training ](https://github.com/microsoft/DeepSpeed/blob/master/blogs/ulysses-offload/README.md) -* [2024/12] [DeepSpeed-Domino: Communication-Free LLM Training Engine](https://github.com/microsoft/DeepSpeed/blob/master/blogs/deepspeed-domino/README.md) -* [2024/08] [DeepSpeed on Windows](https://github.com/microsoft/DeepSpeed/tree/master/blogs/windows/08-2024/README.md) [[日本語](https://github.com/microsoft/DeepSpeed/tree/master/blogs/windows/08-2024/japanese/README.md)] -* [2024/08] [DeepNVMe: Improving DL Applications through I/O Optimizations](https://github.com/microsoft/DeepSpeed/tree/master/blogs/deepspeed-gds/README.md) [[日本語](https://github.com/microsoft/DeepSpeed/tree/master/blogs/deepspeed-gds/japanese/README.md)] -* [2024/07] [DeepSpeed Universal Checkpointing: Efficient and Flexible Checkpointing for Large Scale Distributed Training](https://github.com/microsoft/DeepSpeed/tree/master/blogs/deepspeed-ucp/README.md) [[中文](https://github.com/microsoft/DeepSpeed/tree/master/blogs/deepspeed-ucp/chinese/README.md)] [[日本語](https://github.com/microsoft/DeepSpeed/tree/master/blogs/deepspeed-ucp/japanese/README.md)] -* [2024/03] [DeepSpeed-FP6:The power of FP6-Centric Serving for Large Language Models](https://github.com/microsoft/DeepSpeed/tree/master/blogs/deepspeed-fp6/03-05-2024) [[English](https://github.com/microsoft/DeepSpeed/tree/master/blogs/deepspeed-fp6/03-05-2024/README.md)] [[中文](https://github.com/microsoft/DeepSpeed/tree/master/blogs/deepspeed-fp6/03-05-2024/README-Chinese.md)] -* [2024/01] [DeepSpeed-FastGen: Introducing Mixtral, Phi-2, and Falcon support with major performance and feature enhancements.](https://github.com/microsoft/DeepSpeed/tree/master/blogs/deepspeed-fastgen/2024-01-19) -* [2023/11] [Llama 2 Inference on 4th Gen Intel® Xeon® Scalable Processor with DeepSpeed](https://github.com/microsoft/DeepSpeed/tree/master/blogs/intel-inference) [[Intel version]](https://www.intel.com/content/www/us/en/developer/articles/technical/xllama-2-on-xeon-scalable-processor-with-deepspeed.html) -* [2023/11] [DeepSpeed ZeRO-Offload++: 6x Higher Training Throughput via Collaborative CPU/GPU Twin-Flow](https://github.com/microsoft/DeepSpeed/tree/master/blogs/deepspeed-offloadpp) -* [2023/11] [DeepSpeed-FastGen: High-throughput Text Generation for LLMs via MII and DeepSpeed-Inference](https://github.com/microsoft/DeepSpeed/tree/master/blogs/deepspeed-fastgen) [[English](https://github.com/microsoft/DeepSpeed/tree/master/blogs/deepspeed-fastgen)] [[中文](https://github.com/microsoft/DeepSpeed/tree/master/blogs/deepspeed-fastgen/chinese/README.md)] [[日本語](https://github.com/microsoft/DeepSpeed/tree/master/blogs/deepspeed-fastgen/japanese/README.md)] -* [2023/10] [DeepSpeed-VisualChat: Improve Your Chat Experience with Multi-Round Multi-Image Inputs](https://github.com/microsoft/DeepSpeed/tree/master/blogs/deepspeed-visualchat/10-03-2023/README.md) [[English](https://github.com/microsoft/DeepSpeed/tree/master/blogs/deepspeed-visualchat/10-03-2023/README.md)] [[中文](https://github.com/microsoft/DeepSpeed/blob/master/blogs/deepspeed-visualchat/10-03-2023/README-Chinese.md)] [[日本語](https://github.com/microsoft/DeepSpeed/blob/master/blogs/deepspeed-visualchat/10-03-2023/README-Japanese.md)] -* [2023/09] Announcing the DeepSpeed4Science Initiative: Enabling large-scale scientific discovery through sophisticated AI system technologies [[Tutorials](https://www.deepspeed.ai/deepspeed4science/)] [[White paper](https://arxiv.org/abs/2310.04610)] [[Blog](https://www.microsoft.com/en-us/research/blog/announcing-the-deepspeed4science-initiative-enabling-large-scale-scientific-discovery-through-sophisticated-ai-system-technologies/)] [[中文](https://github.com/microsoft/DeepSpeed/blob/master/blogs/deepspeed4science/chinese/README.md)] [[日本語](https://github.com/microsoft/DeepSpeed/blob/master/blogs/deepspeed4science/japanese/README.md)] + DeepSpeed empowers ChatGPT-like model training with a single click, offering 15x speedup over SOTA RLHF systems with unprecedented cost reduction at all scales; [learn how](https://github.com/deepspeedai/DeepSpeed/tree/master/blogs/deepspeed-chat). + +* [2024/12] [Ulysses-Offload: Democratizing Long Context LLM Training ](https://github.com/deepspeedai/DeepSpeed/blob/master/blogs/ulysses-offload/README.md) +* [2024/12] [DeepSpeed-Domino: Communication-Free LLM Training Engine](https://github.com/deepspeedai/DeepSpeed/blob/master/blogs/deepspeed-domino/README.md) +* [2024/08] [DeepSpeed on Windows](https://github.com/deepspeedai/DeepSpeed/tree/master/blogs/windows/08-2024/README.md) [[日本語](https://github.com/deepspeedai/DeepSpeed/tree/master/blogs/windows/08-2024/japanese/README.md)] +* [2024/08] [DeepNVMe: Improving DL Applications through I/O Optimizations](https://github.com/deepspeedai/DeepSpeed/tree/master/blogs/deepspeed-gds/README.md) [[日本語](https://github.com/deepspeedai/DeepSpeed/tree/master/blogs/deepspeed-gds/japanese/README.md)] +* [2024/07] [DeepSpeed Universal Checkpointing: Efficient and Flexible Checkpointing for Large Scale Distributed Training](https://github.com/deepspeedai/DeepSpeed/tree/master/blogs/deepspeed-ucp/README.md) [[中文](https://github.com/deepspeedai/DeepSpeed/tree/master/blogs/deepspeed-ucp/chinese/README.md)] [[日本語](https://github.com/deepspeedai/DeepSpeed/tree/master/blogs/deepspeed-ucp/japanese/README.md)] +* [2024/03] [DeepSpeed-FP6:The power of FP6-Centric Serving for Large Language Models](https://github.com/deepspeedai/DeepSpeed/tree/master/blogs/deepspeed-fp6/03-05-2024) [[English](https://github.com/deepspeedai/DeepSpeed/tree/master/blogs/deepspeed-fp6/03-05-2024/README.md)] [[中文](https://github.com/deepspeedai/DeepSpeed/tree/master/blogs/deepspeed-fp6/03-05-2024/README-Chinese.md)] +* [2024/01] [DeepSpeed-FastGen: Introducing Mixtral, Phi-2, and Falcon support with major performance and feature enhancements.](https://github.com/deepspeedai/DeepSpeed/tree/master/blogs/deepspeed-fastgen/2024-01-19) +* [2023/11] [Llama 2 Inference on 4th Gen Intel® Xeon® Scalable Processor with DeepSpeed](https://github.com/deepspeedai/DeepSpeed/tree/master/blogs/intel-inference) [[Intel version]](https://www.intel.com/content/www/us/en/developer/articles/technical/xllama-2-on-xeon-scalable-processor-with-deepspeed.html) +* [2023/11] [DeepSpeed ZeRO-Offload++: 6x Higher Training Throughput via Collaborative CPU/GPU Twin-Flow](https://github.com/deepspeedai/DeepSpeed/tree/master/blogs/deepspeed-offloadpp) +* [2023/11] [DeepSpeed-FastGen: High-throughput Text Generation for LLMs via MII and DeepSpeed-Inference](https://github.com/deepspeedai/DeepSpeed/tree/master/blogs/deepspeed-fastgen) [[English](https://github.com/deepspeedai/DeepSpeed/tree/master/blogs/deepspeed-fastgen)] [[中文](https://github.com/deepspeedai/DeepSpeed/tree/master/blogs/deepspeed-fastgen/chinese/README.md)] [[日本語](https://github.com/deepspeedai/DeepSpeed/tree/master/blogs/deepspeed-fastgen/japanese/README.md)] +* [2023/10] [DeepSpeed-VisualChat: Improve Your Chat Experience with Multi-Round Multi-Image Inputs](https://github.com/deepspeedai/DeepSpeed/tree/master/blogs/deepspeed-visualchat/10-03-2023/README.md) [[English](https://github.com/deepspeedai/DeepSpeed/tree/master/blogs/deepspeed-visualchat/10-03-2023/README.md)] [[中文](https://github.com/deepspeedai/DeepSpeed/blob/master/blogs/deepspeed-visualchat/10-03-2023/README-Chinese.md)] [[日本語](https://github.com/deepspeedai/DeepSpeed/blob/master/blogs/deepspeed-visualchat/10-03-2023/README-Japanese.md)] +* [2023/09] Announcing the DeepSpeed4Science Initiative: Enabling large-scale scientific discovery through sophisticated AI system technologies [[Tutorials](https://www.deepspeed.ai/deepspeed4science/)] [[White paper](https://arxiv.org/abs/2310.04610)] [[Blog](https://www.microsoft.com/en-us/research/blog/announcing-the-deepspeed4science-initiative-enabling-large-scale-scientific-discovery-through-sophisticated-ai-system-technologies/)] [[中文](https://github.com/deepspeedai/DeepSpeed/blob/master/blogs/deepspeed4science/chinese/README.md)] [[日本語](https://github.com/deepspeedai/DeepSpeed/blob/master/blogs/deepspeed4science/japanese/README.md)]
    More news
    @@ -48,7 +48,7 @@ # Extreme Speed and Scale for DL Training and Inference -***[DeepSpeed](https://www.deepspeed.ai/) enables world's most powerful language models like [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/) and [BLOOM](https://huggingface.co/blog/bloom-megatron-deepspeed)***. It is an easy-to-use deep learning optimization software suite that powers unprecedented scale and speed for both training and inference. With DeepSpeed you can: +***[DeepSpeed](https://www.deepspeed.ai/) enabled the world's most powerful language models (at the time of this writing) such as [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/) and [BLOOM](https://huggingface.co/blog/bloom-megatron-deepspeed)***. It is an easy-to-use deep learning optimization software suite that powers unprecedented scale and speed for both 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 @@ -86,21 +86,21 @@ In line with Microsoft's mission to solve humanity's most pressing challenges, t ## 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, inference 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)). + The [DeepSpeed](https://github.com/deepspeedai/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, inference 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. + [Model Implementations for Inference (MII)](https://github.com/deepspeedai/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/v1/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_deepspeed/azureml). For more details on how to use DeepSpeed on Azure, please follow the [Azure tutorial](https://www.deepspeed.ai/tutorials/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/v1/python-sdk/workflows/train/deepspeed). The job submission and data preparation scripts have been made available [here](https://github.com/deepspeedai/Megatron-DeepSpeed/tree/main/examples_deepspeed/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 +DeepSpeed was an important part of Microsoft’s [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). @@ -135,14 +135,14 @@ DeepSpeed has been integrated with several different popular open-source DL fram | Description | Status | | ----------- | ------ | -| NVIDIA | [![nv-torch110-p40](https://github.com/microsoft/DeepSpeed/actions/workflows/nv-torch110-p40.yml/badge.svg?branch=master)](https://github.com/microsoft/DeepSpeed/actions/workflows/nv-torch110-p40.yml) [![nv-torch110-v100](https://github.com/microsoft/DeepSpeed/actions/workflows/nv-torch110-v100.yml/badge.svg?branch=master)](https://github.com/microsoft/DeepSpeed/actions/workflows/nv-torch110-v100.yml) [![nv-torch-latest-v100](https://github.com/microsoft/DeepSpeed/actions/workflows/nv-torch-latest-v100.yml/badge.svg?branch=master)](https://github.com/microsoft/DeepSpeed/actions/workflows/nv-torch-latest-v100.yml) [![nv-h100](https://github.com/microsoft/DeepSpeed/actions/workflows/nv-h100.yml/badge.svg?branch=master)](https://github.com/microsoft/DeepSpeed/actions/workflows/nv-h100.yml) [![nv-inference](https://github.com/microsoft/DeepSpeed/actions/workflows/nv-inference.yml/badge.svg?branch=master)](https://github.com/microsoft/DeepSpeed/actions/workflows/nv-inference.yml) [![nv-nightly](https://github.com/microsoft/DeepSpeed/actions/workflows/nv-nightly.yml/badge.svg?branch=master)](https://github.com/microsoft/DeepSpeed/actions/workflows/nv-nightly.yml) | -| AMD | [![amd-mi200](https://github.com/microsoft/DeepSpeed/actions/workflows/amd-mi200.yml/badge.svg?branch=master)](https://github.com/microsoft/DeepSpeed/actions/workflows/amd-mi200.yml) | -| CPU | [![torch-latest-cpu](https://github.com/microsoft/DeepSpeed/actions/workflows/cpu-torch-latest.yml/badge.svg?branch=master)](https://github.com/microsoft/DeepSpeed/actions/workflows/cpu-torch-latest.yml) [![cpu-inference](https://github.com/microsoft/DeepSpeed/actions/workflows/cpu-inference.yml/badge.svg?branch=master)](https://github.com/microsoft/DeepSpeed/actions/workflows/cpu-inference.yml) | -| Intel Gaudi | [![hpu-gaudi2](https://github.com/microsoft/DeepSpeed/actions/workflows/hpu-gaudi2.yml/badge.svg?branch=master)](https://github.com/microsoft/DeepSpeed/actions/workflows/hpu-gaudi2.yml) | -| Intel XPU | [![xpu-max1100](https://github.com/microsoft/DeepSpeed/actions/workflows/xpu-max1100.yml/badge.svg?branch=master)](https://github.com/microsoft/DeepSpeed/actions/workflows/xpu-max1100.yml) | -| PyTorch Nightly | [![nv-torch-nightly-v100](https://github.com/microsoft/DeepSpeed/actions/workflows/nv-torch-nightly-v100.yml/badge.svg?branch=master)](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?branch=master)](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?branch=master)](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?branch=master)](https://github.com/microsoft/DeepSpeed/actions/workflows/nv-accelerate-v100.yml) [![nv-mii](https://github.com/microsoft/DeepSpeed/actions/workflows/nv-mii.yml/badge.svg?branch=master)](https://github.com/microsoft/DeepSpeed/actions/workflows/nv-mii.yml) [![nv-ds-chat](https://github.com/microsoft/DeepSpeed/actions/workflows/nv-ds-chat.yml/badge.svg?branch=master)](https://github.com/microsoft/DeepSpeed/actions/workflows/nv-ds-chat.yml) [![nv-sd](https://github.com/microsoft/DeepSpeed/actions/workflows/nv-sd.yml/badge.svg)](https://github.com/microsoft/DeepSpeed/actions/workflows/nv-sd.yml) | -| Misc | [![Formatting](https://github.com/microsoft/DeepSpeed/actions/workflows/formatting.yml/badge.svg?branch=master)](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)[![python](https://github.com/microsoft/DeepSpeed/actions/workflows/python.yml/badge.svg?branch=master)](https://github.com/microsoft/DeepSpeed/actions/workflows/python.yml) | +| NVIDIA | [![nv-torch110-p40](https://github.com/deepspeedai/DeepSpeed/actions/workflows/nv-torch110-p40.yml/badge.svg?branch=master)](https://github.com/deepspeedai/DeepSpeed/actions/workflows/nv-torch110-p40.yml) [![nv-torch110-v100](https://github.com/deepspeedai/DeepSpeed/actions/workflows/nv-torch110-v100.yml/badge.svg?branch=master)](https://github.com/deepspeedai/DeepSpeed/actions/workflows/nv-torch110-v100.yml) [![nv-torch-latest-v100](https://github.com/deepspeedai/DeepSpeed/actions/workflows/nv-torch-latest-v100.yml/badge.svg?branch=master)](https://github.com/deepspeedai/DeepSpeed/actions/workflows/nv-torch-latest-v100.yml) [![nv-h100](https://github.com/deepspeedai/DeepSpeed/actions/workflows/nv-h100.yml/badge.svg?branch=master)](https://github.com/deepspeedai/DeepSpeed/actions/workflows/nv-h100.yml) [![nv-inference](https://github.com/deepspeedai/DeepSpeed/actions/workflows/nv-inference.yml/badge.svg?branch=master)](https://github.com/deepspeedai/DeepSpeed/actions/workflows/nv-inference.yml) [![nv-nightly](https://github.com/deepspeedai/DeepSpeed/actions/workflows/nv-nightly.yml/badge.svg?branch=master)](https://github.com/deepspeedai/DeepSpeed/actions/workflows/nv-nightly.yml) | +| AMD | [![amd-mi200](https://github.com/deepspeedai/DeepSpeed/actions/workflows/amd-mi200.yml/badge.svg?branch=master)](https://github.com/deepspeedai/DeepSpeed/actions/workflows/amd-mi200.yml) | +| CPU | [![torch-latest-cpu](https://github.com/deepspeedai/DeepSpeed/actions/workflows/cpu-torch-latest.yml/badge.svg?branch=master)](https://github.com/deepspeedai/DeepSpeed/actions/workflows/cpu-torch-latest.yml) [![cpu-inference](https://github.com/deepspeedai/DeepSpeed/actions/workflows/cpu-inference.yml/badge.svg?branch=master)](https://github.com/deepspeedai/DeepSpeed/actions/workflows/cpu-inference.yml) | +| Intel Gaudi | [![hpu-gaudi2](https://github.com/deepspeedai/DeepSpeed/actions/workflows/hpu-gaudi2.yml/badge.svg?branch=master)](https://github.com/deepspeedai/DeepSpeed/actions/workflows/hpu-gaudi2.yml) | +| Intel XPU | [![xpu-max1100](https://github.com/deepspeedai/DeepSpeed/actions/workflows/xpu-max1100.yml/badge.svg?branch=master)](https://github.com/deepspeedai/DeepSpeed/actions/workflows/xpu-max1100.yml) | +| PyTorch Nightly | [![nv-torch-nightly-v100](https://github.com/deepspeedai/DeepSpeed/actions/workflows/nv-torch-nightly-v100.yml/badge.svg?branch=master)](https://github.com/deepspeedai/DeepSpeed/actions/workflows/nv-torch-nightly-v100.yml) | +| Integrations | [![nv-transformers-v100](https://github.com/deepspeedai/DeepSpeed/actions/workflows/nv-transformers-v100.yml/badge.svg?branch=master)](https://github.com/deepspeedai/DeepSpeed/actions/workflows/nv-transformers-v100.yml) [![nv-lightning-v100](https://github.com/deepspeedai/DeepSpeed/actions/workflows/nv-lightning-v100.yml/badge.svg?branch=master)](https://github.com/deepspeedai/DeepSpeed/actions/workflows/nv-lightning-v100.yml) [![nv-accelerate-v100](https://github.com/deepspeedai/DeepSpeed/actions/workflows/nv-accelerate-v100.yml/badge.svg?branch=master)](https://github.com/deepspeedai/DeepSpeed/actions/workflows/nv-accelerate-v100.yml) [![nv-mii](https://github.com/deepspeedai/DeepSpeed/actions/workflows/nv-mii.yml/badge.svg?branch=master)](https://github.com/deepspeedai/DeepSpeed/actions/workflows/nv-mii.yml) [![nv-ds-chat](https://github.com/deepspeedai/DeepSpeed/actions/workflows/nv-ds-chat.yml/badge.svg?branch=master)](https://github.com/deepspeedai/DeepSpeed/actions/workflows/nv-ds-chat.yml) [![nv-sd](https://github.com/deepspeedai/DeepSpeed/actions/workflows/nv-sd.yml/badge.svg)](https://github.com/deepspeedai/DeepSpeed/actions/workflows/nv-sd.yml) | +| Misc | [![Formatting](https://github.com/deepspeedai/DeepSpeed/actions/workflows/formatting.yml/badge.svg?branch=master)](https://github.com/deepspeedai/DeepSpeed/actions/workflows/formatting.yml) [![pages-build-deployment](https://github.com/deepspeedai/DeepSpeed/actions/workflows/pages/pages-build-deployment/badge.svg)](https://github.com/deepspeedai/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)[![python](https://github.com/deepspeedai/DeepSpeed/actions/workflows/python.yml/badge.svg?branch=master)](https://github.com/deepspeedai/DeepSpeed/actions/workflows/python.yml) | | Huawei Ascend NPU | [![Huawei Ascend NPU](https://github.com/Ascend/Ascend-CI/actions/workflows/deepspeed.yaml/badge.svg?branch=main)](https://github.com/Ascend/Ascend-CI/actions/workflows/deepspeed.yaml) | # Installation @@ -192,7 +192,7 @@ of JIT compiling) or install pre-compiled ops via PyPI please see our [advanced installation instructions](https://www.deepspeed.ai/tutorials/advanced-install/). ## Windows -Many DeepSpeed features are supported on Windows for both training and inference. You can read more about this in the original blog post [here](https://github.com/microsoft/DeepSpeed/tree/master/blogs/windows/08-2024/README.md). Among features that are currently not supported are async io (AIO) and GDS (which does not support Windows). +Many DeepSpeed features are supported on Windows for both training and inference. You can read more about this in the original blog post [here](https://github.com/deepspeedai/DeepSpeed/tree/master/blogs/windows/08-2024/README.md). Among features that are currently not supported are async io (AIO) and GDS (which does not support Windows). 1. Install PyTorch, such as pytorch 2.3+cu121. 2. Install Visual C++ build tools, such as VS2022 C++ x64/x86 build tools. 3. Launch Cmd console with Administrator permissions for creating required symlink folders and ensure MSVC tools are added to your PATH or launch the Developer Command Prompt for Visual Studio 2022 with administrator permissions. @@ -222,7 +222,7 @@ DeepSpeed welcomes your contributions! Please see our etc.
    Thanks so much to all of our amazing contributors! - + diff --git a/accelerator/real_accelerator.py b/accelerator/real_accelerator.py index eb4e17850882..ac17fe2c67e5 100644 --- a/accelerator/real_accelerator.py +++ b/accelerator/real_accelerator.py @@ -169,7 +169,7 @@ def get_accelerator(): # ensuring that we are free from CUDA initialization errors. # While "torch.cuda.device_count() > 0" check ensures that #ignore-cuda # we won't try to do any CUDA calls when no device is available - # For reference: https://github.com/microsoft/DeepSpeed/pull/6810 + # For reference: https://github.com/deepspeedai/DeepSpeed/pull/6810 if torch.cuda.device_count() > 0 and torch.cuda.is_available(): #ignore-cuda accelerator_name = "cuda" except (RuntimeError, ImportError) as e: diff --git a/benchmarks/README.md b/benchmarks/README.md index 4c88b2dd091c..a2b332732042 100644 --- a/benchmarks/README.md +++ b/benchmarks/README.md @@ -2,5 +2,5 @@ If you are looking for DeepSpeed benchmarks, please see the following resources: -1. [Communication Benchmarking Suite](https://github.com/microsoft/DeepSpeedExamples/tree/master/benchmarks/communication) -2. [Inference Benchmarks](https://github.com/microsoft/DeepSpeedExamples/tree/master/benchmarks/inference) +1. [Communication Benchmarking Suite](https://github.com/deepspeedai/DeepSpeedExamples/tree/master/benchmarks/communication) +2. [Inference Benchmarks](https://github.com/deepspeedai/DeepSpeedExamples/tree/master/benchmarks/inference) diff --git a/blogs/deepspeed-chat/README.md b/blogs/deepspeed-chat/README.md index 75b0841231a4..3ed8b284940a 100644 --- a/blogs/deepspeed-chat/README.md +++ b/blogs/deepspeed-chat/README.md @@ -65,7 +65,7 @@ DeepSpeed-RLHF system is capable of unparalleled efficiency at scale, making com *Table 2. Multi-Node 64x A100-80GB: Training Time and Corresponding Approximate Cost on Azure.* -> ***Very Important Details***: The numbers in both tables above are for Step 3 of the training and are based on actual measured training throughput on DeepSpeed-RLHF curated dataset and training recipe which trains for one epoch on a total of 135M tokens. We have in total 67.5M query tokens (131.9k queries with sequence length 256) and 67.5M generated tokens (131.9k answers with sequence length 256), and a maximum global batch size per step of 0.5M tokens (1024 query-answer pairs). We urge readers to pay attention to these specifications before making any cost and e2e time comparisons with DeepSpeed-RLHF. See our [benchmark settings](https://github.com/microsoft/DeepSpeedExamples/tree/master/applications/DeepSpeed-Chat/training/step3_rlhf_finetuning/BenckmarkSetting.md) page for more details. +> ***Very Important Details***: The numbers in both tables above are for Step 3 of the training and are based on actual measured training throughput on DeepSpeed-RLHF curated dataset and training recipe which trains for one epoch on a total of 135M tokens. We have in total 67.5M query tokens (131.9k queries with sequence length 256) and 67.5M generated tokens (131.9k answers with sequence length 256), and a maximum global batch size per step of 0.5M tokens (1024 query-answer pairs). We urge readers to pay attention to these specifications before making any cost and e2e time comparisons with DeepSpeed-RLHF. See our [benchmark settings](https://github.com/deepspeedai/DeepSpeedExamples/tree/master/applications/DeepSpeed-Chat/training/step3_rlhf_finetuning/BenckmarkSetting.md) page for more details. ***Democratizing RLHF Training***: With just a single GPU, DeepSpeed-HE supports training models with over 13 billion parameters, enabling data scientists without access to multi-GPU systems to create not just toy RLHF models but large and powerful ones that can be used in real-world scenarios. @@ -95,7 +95,7 @@ We use an example of pretrained OPT-13B as the actor model and OPT-350M as the r ```python pip install deepspeed>=0.9.0 -git clone https://github.com/microsoft/DeepSpeedExamples.git +git clone https://github.com/deepspeedai/DeepSpeedExamples.git cd DeepSpeedExamples/applications/DeepSpeed-Chat/ pip install -r requirements.txt @@ -285,7 +285,7 @@ This improvement in efficiency stems from DeepSpeed-HE’s ability to accelerate ## Effective Throughput and Scalability Analysis -***(I) Effective Throughput Analysis.*** The effective throughput of DeepSpeed-HE during Stage 3 of the RLHF training depends on the throughput that it achieves during the generation and RL training phases. In our RLHF pipeline, the generation phase comprises approximately 20% of the total computation while the RL training phase comprises of remaining 80% (see [benchmark settings](https://github.com/microsoft/DeepSpeedExamples/tree/master/applications/DeepSpeed-Chat/training/step3_rlhf_finetuning/BenckmarkSetting.md) page for details). However, despite having a small proportion, the former can take a large portion of the e2e time as it requires running the actor model once for each of the 256 generated tokens with an initial prompt of 256 tokens, making it memory bandwidth bound and difficult to achieve high throughput. In contrast, the RL training phase is compute bound running the reference actor model with just a couple of forward and backward passes with full 512 tokens from both prompt and generation per sample and can achieve good throughput. +***(I) Effective Throughput Analysis.*** The effective throughput of DeepSpeed-HE during Stage 3 of the RLHF training depends on the throughput that it achieves during the generation and RL training phases. In our RLHF pipeline, the generation phase comprises approximately 20% of the total computation while the RL training phase comprises of remaining 80% (see [benchmark settings](https://github.com/deepspeedai/DeepSpeedExamples/tree/master/applications/DeepSpeed-Chat/training/step3_rlhf_finetuning/BenckmarkSetting.md) page for details). However, despite having a small proportion, the former can take a large portion of the e2e time as it requires running the actor model once for each of the 256 generated tokens with an initial prompt of 256 tokens, making it memory bandwidth bound and difficult to achieve high throughput. In contrast, the RL training phase is compute bound running the reference actor model with just a couple of forward and backward passes with full 512 tokens from both prompt and generation per sample and can achieve good throughput.
    @@ -320,13 +320,13 @@ As a result, for a given max global batch size, DeepSpeed-HE achieves the best t We are very excited to share that DeepSpeed-Chat is now open-sourced and available to the AI community. -* To get started, please visit our github page for DeepSpeed-Chat: [GitHub Landing Page](https://github.com/microsoft/DeepSpeedExamples/tree/master/applications/DeepSpeed-Chat) +* To get started, please visit our github page for DeepSpeed-Chat: [GitHub Landing Page](https://github.com/deepspeedai/DeepSpeedExamples/tree/master/applications/DeepSpeed-Chat) -* We will continue to improve DeepSpeed-Chat with your feedback and support. Our [roadmap](https://github.com/microsoft/DeepSpeedExamples/tree/master/applications/DeepSpeed-Chat/README.md#-deepspeed-chats-roadmap-) shows currently supported features as well as ones that are planned for the future. +* We will continue to improve DeepSpeed-Chat with your feedback and support. Our [roadmap](https://github.com/deepspeedai/DeepSpeedExamples/tree/master/applications/DeepSpeed-Chat/README.md#-deepspeed-chats-roadmap-) shows currently supported features as well as ones that are planned for the future. DeepSpeed-Chat is part of the bigger DeepSpeed ecosystem comprising a multitude of Deep Learning systems and modeling technologies. To learn more, * Please visit our [website](https://www.deepspeed.ai/) for detailed blog posts, tutorials, and helpful documentation. * You can also follow us on our [English Twitter](https://twitter.com/MSFTDeepSpeed), [Japanese Twitter](https://twitter.com/MSFTDeepSpeedJP), and [Chinese Zhihu](https://www.zhihu.com/people/deepspeed) for latest news on DeepSpeed. -DeepSpeed welcomes your contributions! We encourage you to report issues, contribute PRs, and join discussions on the [DeepSpeed GitHub](https://github.com/microsoft/DeepSpeed/) page. Please see our [contributing guide](https://github.com/microsoft/DeepSpeed/blob/master/CONTRIBUTING.md) for more details. We are open to collaborations with universities, research labs, companies, such as those working together on deep learning research, applying DeepSpeed to empower real-world AI models and applications, and so on. For such requests (and other requests unsuitable for GitHub), please directly email to deepspeed-info@microsoft.com. +DeepSpeed welcomes your contributions! We encourage you to report issues, contribute PRs, and join discussions on the [DeepSpeed GitHub](https://github.com/deepspeedai/DeepSpeed/) page. Please see our [contributing guide](https://github.com/deepspeedai/DeepSpeed/blob/master/CONTRIBUTING.md) for more details. We are open to collaborations with universities, research labs, companies, such as those working together on deep learning research, applying DeepSpeed to empower real-world AI models and applications, and so on. For such requests (and other requests unsuitable for GitHub), please directly email to deepspeed-info@microsoft.com. diff --git a/blogs/deepspeed-chat/chinese/README.md b/blogs/deepspeed-chat/chinese/README.md index 7a45735b3f09..4ec29c6811e5 100644 --- a/blogs/deepspeed-chat/chinese/README.md +++ b/blogs/deepspeed-chat/chinese/README.md @@ -63,7 +63,7 @@ DeepSpeed-RLHF 系统在大规模训练中具有无与伦比的效率,使复 *表 2. 多节点 64x A100-80GB:训练时长及预估的 Azure 费用。*
    -> ***非常重要的细节***: 上述两个表格(即表一和表二)中的数据均针对 RLHF 训练的第 3 步,基于实际数据集和 DeepSpeed-RLHF 训练吞吐量的测试。该训练在总共 1.35 亿(135M)个字符(token)上进行一个时期(epoch)的训练。我们总共有 6750 万个查询(query)字符(131.9k 个 query,每个序列长度为 256)和 6750 万个生成/回答字符(131.9k 个答案,每个序列长度为 256),每步的最大全局字符批量大小约为 500 万个字符(1024 个查询-答案对)。在与 DeepSpeed-RLHF 进行任何成本和端到端时间比较之前,我们建议读者注意这些设定。想要了解更多详细信息,请参阅我们的页面 [benchmark setting](https://github.com/microsoft/DeepSpeedExamples-internal/blob/staging-deepspeed-chat-v2/applications/DeepSpeed-Chat/training/step3_rlhf_finetuning/BenckmarkSetting.md)。 +> ***非常重要的细节***: 上述两个表格(即表一和表二)中的数据均针对 RLHF 训练的第 3 步,基于实际数据集和 DeepSpeed-RLHF 训练吞吐量的测试。该训练在总共 1.35 亿(135M)个字符(token)上进行一个时期(epoch)的训练。我们总共有 6750 万个查询(query)字符(131.9k 个 query,每个序列长度为 256)和 6750 万个生成/回答字符(131.9k 个答案,每个序列长度为 256),每步的最大全局字符批量大小约为 500 万个字符(1024 个查询-答案对)。在与 DeepSpeed-RLHF 进行任何成本和端到端时间比较之前,我们建议读者注意这些设定。想要了解更多详细信息,请参阅我们的页面 [benchmark setting](https://github.com/deepspeedai/DeepSpeedExamples-internal/blob/staging-deepspeed-chat-v2/applications/DeepSpeed-Chat/training/step3_rlhf_finetuning/BenckmarkSetting.md)。 ***实现 RLHF 训练的普及化***:仅凭单个 GPU,DeepSpeed-HE 就能支持训练超过 130 亿参数的模型。这使得那些无法使用多 GPU 系统的数据科学家和研究者不仅能够轻松创建轻量级的 RLHF 模型,还能创建大型且功能强大的模型,以应对不同的使用场景。 @@ -91,7 +91,7 @@ DeepSpeed-RLHF 系统在大规模训练中具有无与伦比的效率,使复 ``` pip install deepspeed>=0.9.0 -git clone https://github.com/microsoft/DeepSpeedExamples.git +git clone https://github.com/deepspeedai/DeepSpeedExamples.git cd DeepSpeedExamples/applications/DeepSpeed-Chat/ pip install -r requirements.txt @@ -274,7 +274,7 @@ DeepSpeed-HE可以在训练和推理之间无缝更改模型分区,以支持 ## 有效吞吐量和可扩展性分析 -***(I) 有效吞吐量分析。*** 在 RLHF 训练的第 3 阶段,DeepSpeed-HE 的有效吞吐量取决于它在生成和 RL 训练阶段所实现的吞吐量。在我们的 RLHF (详见 [benchmarking setting](https://github.com/microsoft/DeepSpeedExamples/blob/master/applications/DeepSpeed-Chat/training/step3_rlhf_finetuning/BenckmarkSetting.md))中,生成阶段占总计算的约 20%,而 RL 训练阶段占剩余的 80%。然而,尽管比例较小,前者可能会占用大部分的端到端时间,因为它需要为每个生成的字符运行一次 actor 模型,使其受到内存带宽限制,难以实现高吞吐量。相比之下,RL 训练阶段是计算密集型的,仅需运行参考 actor 模型进行几次前向和后向传递,每个样本都有来自提示和生成的全部 512 个字符,可以实现良好的吞吐量。 +***(I) 有效吞吐量分析。*** 在 RLHF 训练的第 3 阶段,DeepSpeed-HE 的有效吞吐量取决于它在生成和 RL 训练阶段所实现的吞吐量。在我们的 RLHF (详见 [benchmarking setting](https://github.com/deepspeedai/DeepSpeedExamples/blob/master/applications/DeepSpeed-Chat/training/step3_rlhf_finetuning/BenckmarkSetting.md))中,生成阶段占总计算的约 20%,而 RL 训练阶段占剩余的 80%。然而,尽管比例较小,前者可能会占用大部分的端到端时间,因为它需要为每个生成的字符运行一次 actor 模型,使其受到内存带宽限制,难以实现高吞吐量。相比之下,RL 训练阶段是计算密集型的,仅需运行参考 actor 模型进行几次前向和后向传递,每个样本都有来自提示和生成的全部 512 个字符,可以实现良好的吞吐量。
    @@ -308,13 +308,13 @@ DeepSpeed-HE 的核心技术基于 ZeRO,用于训练过程中将模型状态 我们非常高兴地宣布,DeepSpeed-Chat现已开源并向 AI 社区开放。 -* 如果你发现我们的成果对你有用或者喜欢我们的开源成果,请在 [DeepSpeed](https://github.com/microsoft/DeepSpeed) 和 [DeepSpeedExamples](https://github.com/microsoft/DeepSpeedExamples)上点⭐。 +* 如果你发现我们的成果对你有用或者喜欢我们的开源成果,请在 [DeepSpeed](https://github.com/deepspeedai/DeepSpeed) 和 [DeepSpeedExamples](https://github.com/deepspeedai/DeepSpeedExamples)上点⭐。 -* 请访问我们的DeepSpeed-Chat GitHub页面以开始使用:[GitHub 登陆页面](https://github.com/microsoft/DeepSpeedExamples/tree/master/applications/DeepSpeed-Chat) +* 请访问我们的DeepSpeed-Chat GitHub页面以开始使用:[GitHub 登陆页面](https://github.com/deepspeedai/DeepSpeedExamples/tree/master/applications/DeepSpeed-Chat) -* 我们将继续根据你的反馈和支持改进 DeepSpeed-Chat。我们的[计划图](https://github.com/microsoft/DeepSpeedExamples/tree/master/applications/DeepSpeed-Chat/README.md#-deepspeed-chats-roadmap-)显示了当前支持的功能以及计划在未来支持的功能。 +* 我们将继续根据你的反馈和支持改进 DeepSpeed-Chat。我们的[计划图](https://github.com/deepspeedai/DeepSpeedExamples/tree/master/applications/DeepSpeed-Chat/README.md#-deepspeed-chats-roadmap-)显示了当前支持的功能以及计划在未来支持的功能。 DeepSpeed-Chat 是更大的DeepSpeed生态系统的一部分,包括众多深度学习系统和建模技术。要了解更多信息, @@ -322,4 +322,4 @@ DeepSpeed-Chat 是更大的DeepSpeed生态系统的一部分,包括众多深 * 我们会在[知乎](https://www.zhihu.com/people/deepspeed)上发布最新中文博客及动态。你还可以关注我们的[英文 Twitter](https://twitter.com/MSFTDeepSpeed) 和[日文 Twitter](https://twitter.com/MSFTDeepSpeedJP)。 -DeepSpeed 欢迎你的贡献!我们鼓励你在 [DeepSpeed GitHub](https://github.com/microsoft/DeepSpeed/) 页面报告问题、贡献 PR 并参与讨论。请参阅我们的[贡献指南](https://github.com/microsoft/DeepSpeed/blob/master/CONTRIBUTING.md)了解更多详情。我们愿意与大学、研究实验室、公司等进行合作,共同开展深度学习研究,将 DeepSpeed 应用于赋能现实世界的 AI 模型和应用等。对于此类需求(以及其他不适合在 GitHub 上提出的需求),请直接发送电子邮件至 deepspeed-info@microsoft.com。 +DeepSpeed 欢迎你的贡献!我们鼓励你在 [DeepSpeed GitHub](https://github.com/deepspeedai/DeepSpeed/) 页面报告问题、贡献 PR 并参与讨论。请参阅我们的[贡献指南](https://github.com/deepspeedai/DeepSpeed/blob/master/CONTRIBUTING.md)了解更多详情。我们愿意与大学、研究实验室、公司等进行合作,共同开展深度学习研究,将 DeepSpeed 应用于赋能现实世界的 AI 模型和应用等。对于此类需求(以及其他不适合在 GitHub 上提出的需求),请直接发送电子邮件至 deepspeed-info@microsoft.com。 diff --git a/blogs/deepspeed-chat/ds-chat-release-8-31/README.md b/blogs/deepspeed-chat/ds-chat-release-8-31/README.md index e1d4bf952bf1..828a77aa8431 100644 --- a/blogs/deepspeed-chat/ds-chat-release-8-31/README.md +++ b/blogs/deepspeed-chat/ds-chat-release-8-31/README.md @@ -24,7 +24,7 @@ # 1. Introduction -DeepSpeed-Chat is a general system framework for RLHF training that enables easy, fast, affordable, and scalable training of ChatGPT-style models that we [publicly released on GitHub](https://github.com/microsoft/DeepSpeed/blob/master/blogs/deepspeed-chat/README.md). The detailed performance and capabilities of DeepSpeed-Chat have been published in our [blog post](https://github.com/microsoft/DeepSpeed/tree/master/blogs/deepspeed-chat) and [arXiv](https://arxiv.org/abs/2308.01320) paper. +DeepSpeed-Chat is a general system framework for RLHF training that enables easy, fast, affordable, and scalable training of ChatGPT-style models that we [publicly released on GitHub](https://github.com/deepspeedai/DeepSpeed/blob/master/blogs/deepspeed-chat/README.md). The detailed performance and capabilities of DeepSpeed-Chat have been published in our [blog post](https://github.com/deepspeedai/DeepSpeed/tree/master/blogs/deepspeed-chat) and [arXiv](https://arxiv.org/abs/2308.01320) paper. We are happy to share that today we are improving DeepSpeed-Chat along three areas: i) system support for Llama/Llama-2 family of models, ii) system features for improved efficiency and accessibility, and iii) stability and software enhancements. @@ -33,15 +33,15 @@ We are happy to share that today we are improving DeepSpeed-Chat along three are We ***introduce system support for training Llama and Llama-2 models*** in DeepSpeed-Chat enabling and leveraging various optimizations and features including the Hybrid Engine, ZeRO family of optimizations, Low-Rank Adaptation (LoRA) support, as well as full integration into the three-stage DeepSpeed-Chat RLHF pipeline. By leveraging the Hybrid-Engine, we speed up the experience generation phase for Llama-2-7B and Llama-2-13B models by **up to 7.1X**. - **New System Features for Improved Efficiency and Accessibility** - - ***Mixed Precision ZeRO++ ([MixZ++](https://github.com/microsoft/DeepSpeed/pull/3954))***. It is an extended set of optimization strategies built upon [ZeRO++](https://www.deepspeed.ai/tutorials/zeropp/) tailored to reduce memory usage and improve training/inference efficiency for RLHF training with LoRA. MixZ++ partitions model parameters across GPUs to reduce footprint and gathers them with quantized communication only when needed similar to its ZeRO and ZeRO++ siblings. Our evaluation indicates MixZ++ increases the training throughput by **up to 3.3x** for the Llama-2-70B model running on 128 V100 GPUs. + - ***Mixed Precision ZeRO++ ([MixZ++](https://github.com/deepspeedai/DeepSpeed/pull/3954))***. It is an extended set of optimization strategies built upon [ZeRO++](https://www.deepspeed.ai/tutorials/zeropp/) tailored to reduce memory usage and improve training/inference efficiency for RLHF training with LoRA. MixZ++ partitions model parameters across GPUs to reduce footprint and gathers them with quantized communication only when needed similar to its ZeRO and ZeRO++ siblings. Our evaluation indicates MixZ++ increases the training throughput by **up to 3.3x** for the Llama-2-70B model running on 128 V100 GPUs. - ***[ZeRO-Offload](https://www.microsoft.com/en-us/research/blog/zero-infinity-and-deepspeed-unlocking-unprecedented-model-scale-for-deep-learning-training/)***. It is an optimization that offloads optimizer memory and computation from the GPU to the host CPU, enabling larger models to be trained with fewer GPU resources. After training stability fixes and testing, we have enabled this feature across all three stages of the DeepSpeed-Chat RLHF training pipeline. ZeRO-Offload reduces the minimum number of GPUs required to train large models by **up to 16x**. - **Stability and Software Enhancements** - - DeepSpeed-Chat contains a rich set of features for training across many different platforms and scenarios. Composing these features in a systematic way and ensuring both system stability and decent training convergence is critical for the usability of the framework. Thus, in addition to new features in DeepSpeed-Chat, many system stability and training convergence issues have been fixed both in DeepSpeed-Chat (client code) and DeepSpeed (runtime). These improvements have been thoroughly tested using the OPT model family for end-to-end training. Furthermore, end-to-end testing, characterization scripts, and several instrumentation features like TensorBoard support are now also available. *To try out these latest features and software improvements, please use DeepSpeed release [v0.10.2](https://github.com/microsoft/DeepSpeed/tree/v0.10.2) and the latest DeepSpeed-Chat in [DeepSpeedExamples](https://github.com/microsoft/DeepSpeedExamples)*. + - DeepSpeed-Chat contains a rich set of features for training across many different platforms and scenarios. Composing these features in a systematic way and ensuring both system stability and decent training convergence is critical for the usability of the framework. Thus, in addition to new features in DeepSpeed-Chat, many system stability and training convergence issues have been fixed both in DeepSpeed-Chat (client code) and DeepSpeed (runtime). These improvements have been thoroughly tested using the OPT model family for end-to-end training. Furthermore, end-to-end testing, characterization scripts, and several instrumentation features like TensorBoard support are now also available. *To try out these latest features and software improvements, please use DeepSpeed release [v0.10.2](https://github.com/deepspeedai/DeepSpeed/tree/v0.10.2) and the latest DeepSpeed-Chat in [DeepSpeedExamples](https://github.com/deepspeedai/DeepSpeedExamples)*. - - Finally, to ensure the long-term health of the DeepSpeed-Chat training framework, [PyTests](https://github.com/microsoft/DeepSpeedExamples/blob/master/applications/DeepSpeed-Chat/training/tests/test_training.py) were added for testing Step 3 of the RLHF training pipeline and are run on a nightly basis through a newly developed [GitHub Actions workflow](https://github.com/microsoft/DeepSpeed/actions/workflows/nv-ds-chat.yml). + - Finally, to ensure the long-term health of the DeepSpeed-Chat training framework, [PyTests](https://github.com/deepspeedai/DeepSpeedExamples/blob/master/applications/DeepSpeed-Chat/training/tests/test_training.py) were added for testing Step 3 of the RLHF training pipeline and are run on a nightly basis through a newly developed [GitHub Actions workflow](https://github.com/deepspeedai/DeepSpeed/actions/workflows/nv-ds-chat.yml). We now dive into the details of our new features, training stability, and software improvements. @@ -54,19 +54,19 @@ The DeepSpeed-Chat training framework now provides system support for the Llama The following key optimizations in DeepSpeed are now fully integrated for Llama and Llama-2 models: - **DeepSpeed-Chat Integration**: Fully integrated into the complete, end-to-end three-stage DeepSpeed-Chat RLHF training framework, based on the OpenAI InstructGPT training strategy. -- **Hybrid Engine**: DeepSpeed Hybrid Engine allows for superior generation phase [acceleration](https://github.com/microsoft/DeepSpeed/blob/master/blogs/deepspeed-chat/README.md#throughput-and-model-size-scalability-comparisons-with-existing-rlhf-systems), now supported for all Llama-1 model variants, Llama-2-7B, and Llama-2-13B models. -- **ZeRO and ZeRO-Offload**: Fully supported by the [ZeRO](https://github.com/microsoft/DeepSpeed/blob/master/blogs/deepspeed-chat/README.md#throughput-and-model-size-scalability-comparisons-with-existing-rlhf-systems) family of optimizations including offload support leveraging full memory capacity of a system thus enabling training of even larger models. +- **Hybrid Engine**: DeepSpeed Hybrid Engine allows for superior generation phase [acceleration](https://github.com/deepspeedai/DeepSpeed/blob/master/blogs/deepspeed-chat/README.md#throughput-and-model-size-scalability-comparisons-with-existing-rlhf-systems), now supported for all Llama-1 model variants, Llama-2-7B, and Llama-2-13B models. +- **ZeRO and ZeRO-Offload**: Fully supported by the [ZeRO](https://github.com/deepspeedai/DeepSpeed/blob/master/blogs/deepspeed-chat/README.md#throughput-and-model-size-scalability-comparisons-with-existing-rlhf-systems) family of optimizations including offload support leveraging full memory capacity of a system thus enabling training of even larger models. - **Mixed Precision ZeRO++ (MixZ++)**: Enhanced support for larger models like Llama-2-70B through the new MixZ++ feature, improving efficiency and reducing memory usage when there are frozen or non-trainable parameters. -- **LoRA**: Fully supported by the [LoRA](https://github.com/microsoft/LoRA) feature, which vastly reduces the storage requirements for large language models by freezing original weights and learning pairs of rank-decomposition matrices. +- **LoRA**: Fully supported by the [LoRA](https://github.com/deepspeedai/LoRA) feature, which vastly reduces the storage requirements for large language models by freezing original weights and learning pairs of rank-decomposition matrices. ## Getting Started Users looking to try the new Llama and Llama-2 model support can get started by using the newly added Llama scripts. | Step Number | Scripts | | --- | --- | -| 1 | [Llama-2 Step 1 Scripts](https://github.com/microsoft/DeepSpeedExamples/tree/master/applications/DeepSpeed-Chat/training/step1_supervised_finetuning/training_scripts/llama2) | -| 2 | [Llama-2 Step 2 Scripts](https://github.com/microsoft/DeepSpeedExamples/tree/master/applications/DeepSpeed-Chat/training/step2_reward_model_finetuning/training_scripts/llama2) | -| 3 | [Llama-2 Step 3 Scripts](https://github.com/microsoft/DeepSpeedExamples/tree/master/applications/DeepSpeed-Chat/training/step3_rlhf_finetuning/training_scripts/llama2) | +| 1 | [Llama-2 Step 1 Scripts](https://github.com/deepspeedai/DeepSpeedExamples/tree/master/applications/DeepSpeed-Chat/training/step1_supervised_finetuning/training_scripts/llama2) | +| 2 | [Llama-2 Step 2 Scripts](https://github.com/deepspeedai/DeepSpeedExamples/tree/master/applications/DeepSpeed-Chat/training/step2_reward_model_finetuning/training_scripts/llama2) | +| 3 | [Llama-2 Step 3 Scripts](https://github.com/deepspeedai/DeepSpeedExamples/tree/master/applications/DeepSpeed-Chat/training/step3_rlhf_finetuning/training_scripts/llama2) | *Note*: While all the system aspects of Llama and Llama-2 support have been extensively tested, there are no guarantees about training convergence and may require hyper-parameter tuning to achieve convergence. @@ -103,11 +103,11 @@ We now dive into the details of two new features we are introducing today: 1) Mi ## 3.3x Higher Throughput with MixZ++ for LoRA -Mixed Precision ZeRO++ ([MixZ++](https://github.com/microsoft/DeepSpeed/pull/3954)) is an extended set of optimization strategies built upon [ZeRO](https://www.deepspeed.ai/tutorials/zero/) and [ZeRO++](https://www.deepspeed.ai/tutorials/zeropp/) tailored to reduce memory usage and improve training/inference efficiency for RLHF training with LoRA. +Mixed Precision ZeRO++ ([MixZ++](https://github.com/deepspeedai/DeepSpeed/pull/3954)) is an extended set of optimization strategies built upon [ZeRO](https://www.deepspeed.ai/tutorials/zero/) and [ZeRO++](https://www.deepspeed.ai/tutorials/zeropp/) tailored to reduce memory usage and improve training/inference efficiency for RLHF training with LoRA. Similar to [ZeRO](https://www.deepspeed.ai/tutorials/zero/), MixZ++ partitions model parameters across GPUs to reduce footprint and gathers them only when needed. In addition, similar to ZeRO++, MixZ++ allows for hierarchical partitioning and quantized communication. The hierarchical partitioning allows all the parameters to be stored within a node when possible so that the communication happens within a node, where communication bandwidth is significantly higher than communicating across nodes. The communication overhead is further reduced by quantizing the weights before gathering them. -Finally, unlike ZeRO++ where parameters are always stored in fp16/bf16, and quantized/dequantized before and after communication, MixZ++ can persistently store the frozen weights in [Low-Rank Adaptation (LoRA)](https://github.com/microsoft/LoRA) in lower-precision, significantly reducing the communication overhead, eliminating quantization overhead, and supporting larger batch sizes that enable better efficiency. +Finally, unlike ZeRO++ where parameters are always stored in fp16/bf16, and quantized/dequantized before and after communication, MixZ++ can persistently store the frozen weights in [Low-Rank Adaptation (LoRA)](https://github.com/deepspeedai/LoRA) in lower-precision, significantly reducing the communication overhead, eliminating quantization overhead, and supporting larger batch sizes that enable better efficiency. A comprehensive exploration of technical details can be accessed through our [ZeRO++ blog](https://www.microsoft.com/en-us/research/blog/deepspeed-zero-a-leap-in-speed-for-llm-and-chat-model-training-with-4x-less-communication/), [MixZ++ tutorial](https://www.deepspeed.ai/tutorials/mixed_precision_zeropp/), and [paper](https://arxiv.org/pdf/2306.10209.pdf). @@ -147,13 +147,13 @@ To try this feature, please refer to [MixZ++ tutorial](https://www.deepspeed.ai/
    -ZeRO-Offload was [disabled](https://github.com/microsoft/DeepSpeedExamples/pull/553) +ZeRO-Offload was [disabled](https://github.com/deepspeedai/DeepSpeedExamples/pull/553) with the initial release of DeepSpeed-Chat due to training instability that was observed when it was used with Hybrid Engine and LoRA. After improvements to Hybrid Engine and LoRA as well as extensive testing of all feature configurations for ZeRO Stage2 and ZeRO Stage 3, this feature can now be enabled across all three steps of the DeepSpeed-Chat training framework. Please note that configuring ZeRO-Offload with ZeRO Stage 2 and Hybrid Engine with LoRA disabled is currently unsupported due to observed training instability.
    - *Figure 5: Reward scores for all supported DeepSpeed-Chat configurations with ZeRO-Offload enabled. Run with 16 V100 GPUs, [AdamG012/chat-opt-1.3b-sft-deepspeed](https://huggingface.co/AdamG012/chat-opt-1.3b-sft-deepspeed) actor model, [AdamG012/chat-opt-350m-reward-deepspeed](https://huggingface.co/AdamG012/chat-opt-350m-reward-deepspeed) critic model, DS commit: [f036f00c](https://github.com/microsoft/DeepSpeed/tree/f036f00c3763694e539a9070a98130e2667e49bd), DSE commit: [81a8521f](https://github.com/microsoft/DeepSpeedExamples/tree/81a8521f05e2761eed34fcf65f19873df9f74403).* + *Figure 5: Reward scores for all supported DeepSpeed-Chat configurations with ZeRO-Offload enabled. Run with 16 V100 GPUs, [AdamG012/chat-opt-1.3b-sft-deepspeed](https://huggingface.co/AdamG012/chat-opt-1.3b-sft-deepspeed) actor model, [AdamG012/chat-opt-350m-reward-deepspeed](https://huggingface.co/AdamG012/chat-opt-350m-reward-deepspeed) critic model, DS commit: [f036f00c](https://github.com/deepspeedai/DeepSpeed/tree/f036f00c3763694e539a9070a98130e2667e49bd), DSE commit: [81a8521f](https://github.com/deepspeedai/DeepSpeedExamples/tree/81a8521f05e2761eed34fcf65f19873df9f74403).*
    @@ -164,11 +164,11 @@ A wide range of issues have been addressed in the DeepSpeed runtime and the Deep
    - *Figure 6: Step 3 Reward Scores for all supported DeepSpeed-Chat configurations. Run with 16 V100 GPUs, [AdamG012/chat-opt-1.3b-sft-deepspeed](https://huggingface.co/AdamG012/chat-opt-1.3b-sft-deepspeed) actor model, [AdamG012/chat-opt-350m-reward-deepspeed](https://huggingface.co/AdamG012/chat-opt-350m-reward-deepspeed) critic model, DS commit: [f036f00c](https://github.com/microsoft/DeepSpeed/tree/f036f00c3763694e539a9070a98130e2667e49bd), DSE commit: [81a8521f](https://github.com/microsoft/DeepSpeedExamples/tree/81a8521f05e2761eed34fcf65f19873df9f74403).* + *Figure 6: Step 3 Reward Scores for all supported DeepSpeed-Chat configurations. Run with 16 V100 GPUs, [AdamG012/chat-opt-1.3b-sft-deepspeed](https://huggingface.co/AdamG012/chat-opt-1.3b-sft-deepspeed) actor model, [AdamG012/chat-opt-350m-reward-deepspeed](https://huggingface.co/AdamG012/chat-opt-350m-reward-deepspeed) critic model, DS commit: [f036f00c](https://github.com/deepspeedai/DeepSpeed/tree/f036f00c3763694e539a9070a98130e2667e49bd), DSE commit: [81a8521f](https://github.com/deepspeedai/DeepSpeedExamples/tree/81a8521f05e2761eed34fcf65f19873df9f74403).*
    -*Figure 6* above shows the training convergence across all supported DeepSpeed-Chat configurations. This data was collected using 16 V100 NVIDIA GPUs, the [AdamG012/chat-opt-1.3b-sft-deepspeed](https://huggingface.co/AdamG012/chat-opt-1.3b-sft-deepspeed) OPT model as the actor, the [AdamG012/chat-opt-350m-reward-deepspeed](https://huggingface.co/AdamG012/chat-opt-350m-reward-deepspeed) OPT model as the critic, and the following DeepSpeed and DeepSpeedExamples repository commits: DS commit: [f036f00c](https://github.com/microsoft/DeepSpeed/tree/f036f00c3763694e539a9070a98130e2667e49bd), DSE commit: [81a8521f](https://github.com/microsoft/DeepSpeedExamples/tree/81a8521f05e2761eed34fcf65f19873df9f74403). +*Figure 6* above shows the training convergence across all supported DeepSpeed-Chat configurations. This data was collected using 16 V100 NVIDIA GPUs, the [AdamG012/chat-opt-1.3b-sft-deepspeed](https://huggingface.co/AdamG012/chat-opt-1.3b-sft-deepspeed) OPT model as the actor, the [AdamG012/chat-opt-350m-reward-deepspeed](https://huggingface.co/AdamG012/chat-opt-350m-reward-deepspeed) OPT model as the critic, and the following DeepSpeed and DeepSpeedExamples repository commits: DS commit: [f036f00c](https://github.com/deepspeedai/DeepSpeed/tree/f036f00c3763694e539a9070a98130e2667e49bd), DSE commit: [81a8521f](https://github.com/deepspeedai/DeepSpeedExamples/tree/81a8521f05e2761eed34fcf65f19873df9f74403). We now dive into the details of all the fixes across different areas. @@ -178,13 +178,13 @@ In this section we discuss the functionality and training stability fixes in the - **Training Stability:** - - [PR #620 - Make training more stable](https://github.com/microsoft/DeepSpeedExamples/pull/620) + - [PR #620 - Make training more stable](https://github.com/deepspeedai/DeepSpeedExamples/pull/620) - To improve the training stability in Step 3, several different areas of training were tuned and changed. To start, the Kullback-Liebler (KL) divergence used in the Proximal Policy Optimization (PPO) trainer was slightly tuned to reduce divergence between the new and reference policies and improve the reward score. Next, the sequence generation function in the PPO trainer (`_generate_sequence()`) removed the specification of a `min_length` in the Actor model's `generate()` call, which means generated sequences won't be artificially enlarged, allowing for the possibility of sequence generation to collapse i.e. when training convergence is extremely poor. A minor off-by-one error was also fixed in the PPO trainer's reward computation function (`compute_rewards()`). Finally, the PPO trainer's RLHF training function was updated to zero out the reward and value after the end of a conversation to prevent incorrect `advantages` and `returns`. - - [PR #633 - DS Chat Step 3 - Add separate Lora Adam optimizer group](https://github.com/microsoft/DeepSpeedExamples/pull/633) + - [PR #633 - DS Chat Step 3 - Add separate Lora Adam optimizer group](https://github.com/deepspeedai/DeepSpeedExamples/pull/633) - - The [LoRA](https://github.com/microsoft/LoRA) feature is supported across all three training steps of the DeepSpeed-Chat framework. Prior to this stability effort, there was no distinction between the overall learning rate and the LoRA learning rate i.e. the LoRA learning rate was set to whatever the overall learning rate was. This led to instability in training convergence and can be seen in *Figure 7* below showing the reward score across training steps for various Step 3 configurations: + - The [LoRA](https://github.com/deepspeedai/LoRA) feature is supported across all three training steps of the DeepSpeed-Chat framework. Prior to this stability effort, there was no distinction between the overall learning rate and the LoRA learning rate i.e. the LoRA learning rate was set to whatever the overall learning rate was. This led to instability in training convergence and can be seen in *Figure 7* below showing the reward score across training steps for various Step 3 configurations:
    @@ -204,25 +204,25 @@ In this section we discuss the functionality and training stability fixes in the The next fix details the addition of separate LoRA learning rate arguments. - - [PR ##685 Add LoRA LR for DS Chat steps 1-3](https://github.com/microsoft/DeepSpeedExamples/pull/685) + - [PR ##685 Add LoRA LR for DS Chat steps 1-3](https://github.com/deepspeedai/DeepSpeedExamples/pull/685) - A *separate* LoRA learning rate argument can now be provided in each of the three training steps, with Step 3 having individual LoRA learning rates for the Actor and Critic models. - **Bug Fixes:** - - [PR #636 - DS Chat Step 3 - Fix Zero Stage 3](https://github.com/microsoft/DeepSpeedExamples/pull/636) + - [PR #636 - DS Chat Step 3 - Fix Zero Stage 3](https://github.com/deepspeedai/DeepSpeedExamples/pull/636) - During DeepSpeed-Chat Step 3 training, we observed hangs when ZeRO Stage 3 was enabled for the actor model and when the `world_size > 1`. When observing the state of each rank, one rank would still be in the sequence generation phase `self._generate_sequence()`, while the other rank had already progressed to the `self.actor_model()` call. This ZeRO Stage 3 desynchronization, due to misaligned token generation between the GPUs, can normally be automatically detected and accounted for in the HuggingFace Transformers library via `synced_gpus`. However, due to the nature of the DeepSpeed-Chat pipeline and the lifetime of the corresponding model configuration objects, this automatic detection code was not triggered. To resolve this, when invoking the `generate()` function, the `synced_gpus` argument is explicitly passed and set to `True` when ZeRO Stage 3 is being used. - - [PR #658 - Fix only optimize lora and ack-ckpting compatible](https://github.com/microsoft/DeepSpeedExamples/pull/658) + - [PR #658 - Fix only optimize lora and ack-ckpting compatible](https://github.com/deepspeedai/DeepSpeedExamples/pull/658) - This fix allows Step 3 training to run with the combination of gradient checkpointing and *LoRA-only* parameter optimization, a previously unsupported training case. With the addition of the [enable_input_require_grads](https://github.com/huggingface/transformers/blob/f26099e7b5cf579f99a42bab6ddd371bf2c8d548/src/transformers/modeling_utils.py#L1225) model utility function in the HuggingFace Transformers library, which enables the gradients for the input embeddings, gradient checkpointing and optimization of *only* the LoRA parameters is made possible. - - [PR #576 - Fix argparse](https://github.com/microsoft/DeepSpeedExamples/pull/576) + - [PR #576 - Fix argparse](https://github.com/deepspeedai/DeepSpeedExamples/pull/576) - An external contributor helped in resolving an argument parsing issue. - - [PR #584 - Fix unused parameter bug](https://github.com/microsoft/DeepSpeedExamples/pull/584) + - [PR #584 - Fix unused parameter bug](https://github.com/deepspeedai/DeepSpeedExamples/pull/584) - An external contributor fixed the passing of an uninitialized parameter that was hardcoded earlier. @@ -230,11 +230,11 @@ In this section we discuss the functionality and training stability fixes in the ## Hybrid Engine Fixes In this section we discuss several fixes in the Hybrid Engine. -- [PR #3563 - Fix LoRA Fuse/Unfuse in Hybrid Engine](https://github.com/microsoft/DeepSpeed/pull/3563) +- [PR #3563 - Fix LoRA Fuse/Unfuse in Hybrid Engine](https://github.com/deepspeedai/DeepSpeed/pull/3563) - During Step 3 training for OPT with LoRA and Hybrid Engine enabled, an issue arose regarding a tensor size mismatch of the LoRA weights. Specifically, the LoRA QKV weights were not fused in the OPT container policy, yet they were expected to be fused by the Hybrid Engine. This challenge was effectively resolved by introducing both fused and unfused LoRA methods in the Hybrid Engine. We thank @sxjscience for providing this fix. -- [PR #3883 - Extend HE-Lora test with Z3 support + Fix/add guard in HE for Z3](https://github.com/microsoft/DeepSpeed/pull/3883) +- [PR #3883 - Extend HE-Lora test with Z3 support + Fix/add guard in HE for Z3](https://github.com/deepspeedai/DeepSpeed/pull/3883) - The Hybrid Engine was updated to properly check whether ZeRO Stage 3 was enabled when resetting the inference container parameters, along with expanding the corresponding unit tests. @@ -242,17 +242,17 @@ In this section we discuss several fixes in the Hybrid Engine. ## ZeRO Stage 3 Fixes In this section we discuss several fixes in support of the ZeRO Stage 3 feature. -- [PR #3819 - Fix racing condition in GatheredParameters](https://github.com/microsoft/DeepSpeed/pull/3819) +- [PR #3819 - Fix racing condition in GatheredParameters](https://github.com/deepspeedai/DeepSpeed/pull/3819) - A race condition in the the ZeRO `GatheredParameters` context, which resulted in various `'status': 'INFLIGHT'` issues, was fixed by removing duplicate input parameters that were being passed from the Hybrid Engine. -- [PR #3884 - Separate ZeRO3 InflightParamRegistry for train and eval](https://github.com/microsoft/DeepSpeed/pull/3884) +- [PR #3884 - Separate ZeRO3 InflightParamRegistry for train and eval](https://github.com/deepspeedai/DeepSpeed/pull/3884) - The ZeRO Stage 3 `InflightParamRegistry` was updated to use a separate `InflightParamRegistry` for training and evaluation, fixing an issue where leftover parameters in flight were causing inflight parameter errors. These fixes, along with related fixes in the Hybrid Engine, enabled the use of the ZeRO-Offload feature in the DeepSpeed-Chat training pipeline. -- [PR #3928 - Remove the param.ds_tensor from print](https://github.com/microsoft/DeepSpeed/pull/3928) +- [PR #3928 - Remove the param.ds_tensor from print](https://github.com/deepspeedai/DeepSpeed/pull/3928) - - A minor change that was necessary to address the DeepSpeed-Chat Step 3 hang issue ([PR #636](https://github.com/microsoft/DeepSpeedExamples/pull/636)) as it allowed us to progress further into execution and observe the desynchronization point. + - A minor change that was necessary to address the DeepSpeed-Chat Step 3 hang issue ([PR #636](https://github.com/deepspeedai/DeepSpeedExamples/pull/636)) as it allowed us to progress further into execution and observe the desynchronization point. # 5. Software Improvements @@ -263,9 +263,9 @@ To improve the characterization, ease of debug, and maintainability of the DeepS The DeepSpeed-Chat training framework provides a rich set of features (Hybrid Engine, ZeRO, LoRA, etc.) that can be composed in many different combinations, depending on the scenario. The interactions between the features are often complex and composing them in a systematic way for characterization is useful for understanding their behavior. To support such use cases, characterization scripts have been added to run sweeps of Steps 1, 2, and 3 training for various combinations of features. The scripts default to OPT but can be modified to run with Llama. Please see the READMEs in the following folders for more details: -- [Step 1 Sweep Scripts](https://github.com/microsoft/DeepSpeedExamples/tree/master/applications/DeepSpeed-Chat/training/step1_supervised_finetuning/training_scripts/opt/single_node/sweep) -- [Step 2 Sweep Scripts](https://github.com/microsoft/DeepSpeedExamples/tree/master/applications/DeepSpeed-Chat/training/step2_reward_model_finetuning/training_scripts/opt/single_node/sweep) -- [Step 3 Sweep Scripts](https://github.com/microsoft/DeepSpeedExamples/tree/master/applications/DeepSpeed-Chat/training/step3_rlhf_finetuning/training_scripts/opt/single_node/sweep) +- [Step 1 Sweep Scripts](https://github.com/deepspeedai/DeepSpeedExamples/tree/master/applications/DeepSpeed-Chat/training/step1_supervised_finetuning/training_scripts/opt/single_node/sweep) +- [Step 2 Sweep Scripts](https://github.com/deepspeedai/DeepSpeedExamples/tree/master/applications/DeepSpeed-Chat/training/step2_reward_model_finetuning/training_scripts/opt/single_node/sweep) +- [Step 3 Sweep Scripts](https://github.com/deepspeedai/DeepSpeedExamples/tree/master/applications/DeepSpeed-Chat/training/step3_rlhf_finetuning/training_scripts/opt/single_node/sweep) For example, the Step 3 characterization script sweeps across various training features: | Feature | Values | @@ -286,13 +286,13 @@ The training log for each combination of features will be stored in a folder wit Related PRs: -- [DS Chat Characterization Scripts (Step 1 and 3)](https://github.com/microsoft/DeepSpeedExamples/pull/638) -- [Add step 2 sweep script, clean up scripts](https://github.com/microsoft/DeepSpeedExamples/pull/664) -- [Update script location and docs for all 3 steps](https://github.com/microsoft/DeepSpeedExamples/pull/681) +- [DS Chat Characterization Scripts (Step 1 and 3)](https://github.com/deepspeedai/DeepSpeedExamples/pull/638) +- [Add step 2 sweep script, clean up scripts](https://github.com/deepspeedai/DeepSpeedExamples/pull/664) +- [Update script location and docs for all 3 steps](https://github.com/deepspeedai/DeepSpeedExamples/pull/681) ## Instrumentation -To gain better insight into DeepSpeed-Chat training, new [instrumentation features](https://github.com/microsoft/DeepSpeedExamples/pull/624) were added across all three steps of DeepSpeed-Chat and can be enabled via arguments to each step's `main.py`. +To gain better insight into DeepSpeed-Chat training, new [instrumentation features](https://github.com/deepspeedai/DeepSpeedExamples/pull/624) were added across all three steps of DeepSpeed-Chat and can be enabled via arguments to each step's `main.py`. | Argument | Description | Step(s) | | --- | --- | --- | @@ -318,11 +318,11 @@ TensorBoard logging can be enabled in each of the three training steps, with som ## Testing -As part of the DeepSpeed team's commitment to maintaining the DeepSpeed-Chat training framework, continuous integration [PyTest](https://github.com/microsoft/DeepSpeedExamples/blob/master/applications/DeepSpeed-Chat/training/tests/test_training.py) testing has been added for Step 3 RLHF training in a new [GitHub Actions workflow](https://github.com/microsoft/DeepSpeed/actions/workflows/nv-ds-chat.yml). +As part of the DeepSpeed team's commitment to maintaining the DeepSpeed-Chat training framework, continuous integration [PyTest](https://github.com/deepspeedai/DeepSpeedExamples/blob/master/applications/DeepSpeed-Chat/training/tests/test_training.py) testing has been added for Step 3 RLHF training in a new [GitHub Actions workflow](https://github.com/deepspeedai/DeepSpeed/actions/workflows/nv-ds-chat.yml). | Description | Status | | ----------- | ------ | -| Integrations | [![nv-ds-chat](https://github.com/microsoft/DeepSpeed/actions/workflows/nv-ds-chat.yml/badge.svg?branch=master)](https://github.com/microsoft/DeepSpeed/actions/workflows/nv-ds-chat.yml) | +| Integrations | [![nv-ds-chat](https://github.com/deepspeedai/DeepSpeed/actions/workflows/nv-ds-chat.yml/badge.svg?branch=master)](https://github.com/deepspeedai/DeepSpeed/actions/workflows/nv-ds-chat.yml) | The workflow is run on a **nightly** basis across a **16-case** test matrix (see table below), and uses the **facebook/opt-125m** model for both the actor and critic. @@ -338,15 +338,15 @@ Each configuration (16 total) runs through a limited number of Step 3 non-overfl # 6. Try Out DeepSpeed-Chat We are very excited to share this DeepSpeed-Chat feature and stability release. -* To get started, please visit our GitHub page for DeepSpeed-Chat: [GitHub Landing Page](https://github.com/microsoft/DeepSpeedExamples/tree/master/applications/DeepSpeed-Chat) +* To get started, please visit our GitHub page for DeepSpeed-Chat: [GitHub Landing Page](https://github.com/deepspeedai/DeepSpeedExamples/tree/master/applications/DeepSpeed-Chat) -* We will continue to improve DeepSpeed-Chat with your feedback and support. Our [roadmap](https://github.com/microsoft/DeepSpeedExamples/tree/master/applications/DeepSpeed-Chat/README.md#-deepspeed-chats-roadmap-) shows currently supported features as well as ones that are planned for future. +* We will continue to improve DeepSpeed-Chat with your feedback and support. Our [roadmap](https://github.com/deepspeedai/DeepSpeedExamples/tree/master/applications/DeepSpeed-Chat/README.md#-deepspeed-chats-roadmap-) shows currently supported features as well as ones that are planned for future. DeepSpeed-Chat is part of the bigger DeepSpeed ecosystem comprising of a multitude of Deep Learning systems and modeling technologies. To learn more, * Please visit our [website](https://www.deepspeed.ai/) for detailed blog posts, tutorials, and helpful documentation. * You can also follow us on our [English Twitter](https://twitter.com/MSFTDeepSpeed), [Japanese Twitter](https://twitter.com/MSFTDeepSpeedJP), and [Chinese Zhihu](https://www.zhihu.com/people/deepspeed) for latest news on DeepSpeed. -DeepSpeed welcomes your contributions! We encourage you to report issues, contribute PRs, and join discussions on the [DeepSpeed GitHub](https://github.com/microsoft/DeepSpeed/) page. Please see our [contributing guide](https://github.com/microsoft/DeepSpeed/blob/master/CONTRIBUTING.md) for more details. We are open to collaborations with universities, research labs, companies, such as those working together on deep learning research, applying DeepSpeed to empower real-world AI models and applications, and so on. For such requests (and other requests unsuitable for GitHub), please directly email to deepspeed-info@microsoft.com. +DeepSpeed welcomes your contributions! We encourage you to report issues, contribute PRs, and join discussions on the [DeepSpeed GitHub](https://github.com/deepspeedai/DeepSpeed/) page. Please see our [contributing guide](https://github.com/deepspeedai/DeepSpeed/blob/master/CONTRIBUTING.md) for more details. We are open to collaborations with universities, research labs, companies, such as those working together on deep learning research, applying DeepSpeed to empower real-world AI models and applications, and so on. For such requests (and other requests unsuitable for GitHub), please directly email to deepspeed-info@microsoft.com. -* "Star" our [DeepSpeed GitHub](https://github.com/microsoft/DeepSpeed/) and [DeepSpeedExamples GitHub](https://github.com/microsoft/DeepSpeedExamples/) repositories if you like our work! +* "Star" our [DeepSpeed GitHub](https://github.com/deepspeedai/DeepSpeed/) and [DeepSpeedExamples GitHub](https://github.com/deepspeedai/DeepSpeedExamples/) repositories if you like our work! diff --git a/blogs/deepspeed-chat/japanese/README.md b/blogs/deepspeed-chat/japanese/README.md index 3ec570a9ea40..7bcbb61d630c 100644 --- a/blogs/deepspeed-chat/japanese/README.md +++ b/blogs/deepspeed-chat/japanese/README.md @@ -62,7 +62,7 @@ DeepSpeed-RLHFシステムは、大規模モデルの学習において類を見 *表2. 複数ノード(64x A100-80GB)を用いた場合の訓練時間とAzureでの概算実行コスト*
    -> ***注意事項***: 上記の2つの表の数値は、訓練のステージ3のものです。DeepSpeed-RLHFが用いるデータセットと訓練の設定において、合計1.35億トークンを1エポックで訓練した際のスループットの実測値に基づいています。合計6750万のクエリートークン(配列長256の13万件のクエリー)と6750万の生成トークン(配列長256の13万件の回答)があり、ステップごとの最大グローバルバッチサイズは 50万 トークン(クエリーと回答それぞれ1024件)です。DeepSpeedRLHFを用いた場合のコストおよび実行時間の比較にあたっては、これらの詳細をよくご確認ください。さらに詳細な情報は[ベンチマーク設定](https://github.com/microsoft/DeepSpeedExamples/blob/staging-deepspeed-chat-v2/applications/DeepSpeed-Chat/training/step3_rlhf_finetuning/BenckmarkSetting.md)を参照ください。 +> ***注意事項***: 上記の2つの表の数値は、訓練のステージ3のものです。DeepSpeed-RLHFが用いるデータセットと訓練の設定において、合計1.35億トークンを1エポックで訓練した際のスループットの実測値に基づいています。合計6750万のクエリートークン(配列長256の13万件のクエリー)と6750万の生成トークン(配列長256の13万件の回答)があり、ステップごとの最大グローバルバッチサイズは 50万 トークン(クエリーと回答それぞれ1024件)です。DeepSpeedRLHFを用いた場合のコストおよび実行時間の比較にあたっては、これらの詳細をよくご確認ください。さらに詳細な情報は[ベンチマーク設定](https://github.com/deepspeedai/DeepSpeedExamples/blob/staging-deepspeed-chat-v2/applications/DeepSpeed-Chat/training/step3_rlhf_finetuning/BenckmarkSetting.md)を参照ください。 ***RLHFを誰もが利用できるように***: DeepSpeed-HEは、1台のGPUのみで130億以上のパラメーターを持つモデルの訓練を実行できます。複数のGPUを備えた高価な計算設備を持たないデータサイエンティストも、小規模なトイモデルではなく、実際のシナリオで使用できる大規模で強力なRLHFモデルを作成できます。 @@ -92,7 +92,7 @@ DeepSpeed-RLHFシステムは、大規模モデルの学習において類を見 ```python pip install deepspeed>=0.9.0 -git clone https://github.com/microsoft/DeepSpeedExamples.git +git clone https://github.com/deepspeedai/DeepSpeedExamples.git cd DeepSpeedExamples/applications/DeepSpeed-Chat/ pip install -r requirements.txt @@ -279,7 +279,7 @@ DeepSpeed-RLHFは、Colossal-AIや、ネイティブのPyTorchを用いたHuggin ## 実効スループットとスケーラビリティ -***(I) 実効スループット分析*** RLHFのステージ3におけるDeepSpeed-HEの実効スループットは、生成フェーズと強化学習の訓練フェーズの両方のスループットで決まります。我々の作成したRLHFのパイプラインでは、生成フェーズが全計算量の約20%を占め、強化学習の訓練フェーズが残りの80%を占めています(詳細は[ベンチマークのページ](https://github.com/microsoft/DeepSpeedExamples/tree/master/applications/DeepSpeed-Chat/training/step3_rlhf_finetuning/BenckmarkSetting.md)を参照)。しかし、計算量で見た割合が少ないとはいえ、前者は生成された256個のトークンのそれぞれに対して、初期プロンプトの256個のトークンに対してアクターモデルによる推論をそれぞれ1回実行する必要があるため、end-to-endの時間で見ると、その大部分を占めることになり、メモリ帯域が制限されて高いスループットを得ることが難しくなります。一方、強化学習の訓練フェーズでは、1サンプルあたりプロンプトと生成の両方から512個のトークンをフルに使用して、参照アクターモデルについて、数回のフォワードパスとバックワードパスで実行できるため、高いスループットを達成できます。 +***(I) 実効スループット分析*** RLHFのステージ3におけるDeepSpeed-HEの実効スループットは、生成フェーズと強化学習の訓練フェーズの両方のスループットで決まります。我々の作成したRLHFのパイプラインでは、生成フェーズが全計算量の約20%を占め、強化学習の訓練フェーズが残りの80%を占めています(詳細は[ベンチマークのページ](https://github.com/deepspeedai/DeepSpeedExamples/tree/master/applications/DeepSpeed-Chat/training/step3_rlhf_finetuning/BenckmarkSetting.md)を参照)。しかし、計算量で見た割合が少ないとはいえ、前者は生成された256個のトークンのそれぞれに対して、初期プロンプトの256個のトークンに対してアクターモデルによる推論をそれぞれ1回実行する必要があるため、end-to-endの時間で見ると、その大部分を占めることになり、メモリ帯域が制限されて高いスループットを得ることが難しくなります。一方、強化学習の訓練フェーズでは、1サンプルあたりプロンプトと生成の両方から512個のトークンをフルに使用して、参照アクターモデルについて、数回のフォワードパスとバックワードパスで実行できるため、高いスループットを達成できます。
    @@ -314,8 +314,8 @@ DeepSpeed-HEはトレーニングにZeROの技術を採用しているため、 DeepSpeed-ChatをオープンソースソフトウェアとしてAIコミュニティに公開できることを嬉しく思います。 -* DeepSpeed-Chatの[GitHubページ](https://github.com/microsoft/DeepSpeedExamples/tree/master/applications/DeepSpeed-Chat)を見て、早速使い始めましょう。 -* ユーザのみなさまからのフィードバックと協力で、これからも継続的に DeepSpeed-Chat を改善していく予定です。現在サポートされている機能や、将来的にサポートされている機能については、[ロードマップ](https://github.com/microsoft/DeepSpeedExamples/tree/master/applications/DeepSpeed-Chat/README.md#-deepspeed-chats-roadmap-)をご覧ください。 +* DeepSpeed-Chatの[GitHubページ](https://github.com/deepspeedai/DeepSpeedExamples/tree/master/applications/DeepSpeed-Chat)を見て、早速使い始めましょう。 +* ユーザのみなさまからのフィードバックと協力で、これからも継続的に DeepSpeed-Chat を改善していく予定です。現在サポートされている機能や、将来的にサポートされている機能については、[ロードマップ](https://github.com/deepspeedai/DeepSpeedExamples/tree/master/applications/DeepSpeed-Chat/README.md#-deepspeed-chats-roadmap-)をご覧ください。 # 7. DeepSpeedについて @@ -341,5 +341,5 @@ DeepSpeedについてのより詳しい情報は、以下をご覧ください DeepSpeedチームは、ユーザの方々からのフィードバックやご連絡を受け付けています。 -* ユーザのみなさまからのバグ報告、Pull request、さまざまな議論への参加は、[GitHub](https://github.com/microsoft/DeepSpeed/)で受け付けています。詳細については、[ガイドライン](https://github.com/microsoft/DeepSpeed/blob/master/CONTRIBUTING.md)を確認してください。 +* ユーザのみなさまからのバグ報告、Pull request、さまざまな議論への参加は、[GitHub](https://github.com/deepspeedai/DeepSpeed/)で受け付けています。詳細については、[ガイドライン](https://github.com/deepspeedai/DeepSpeed/blob/master/CONTRIBUTING.md)を確認してください。 * DeepSpeedチームでは、DeepSpeedを用いた深層学習の研究や実世界へのAIモデルやアプリケーションに関して、大学、研究所、企業との方々とのコラボレーションを行っています(日本語でコミュニケーション可能な研究員も在籍しています)。こうしたコラボレーションについてのご要望(およびGitHubには適さないその他の話題)については、deepspeed-info@microsoft.com まで直接メールをお送りください。 diff --git a/blogs/deepspeed-domino/README.md b/blogs/deepspeed-domino/README.md index 7dfdc7dac1c0..ce190ed1e459 100644 --- a/blogs/deepspeed-domino/README.md +++ b/blogs/deepspeed-domino/README.md @@ -181,7 +181,7 @@ Backward is a bit more challenging because backward computation graph is automat # Getting Started: Try out DeepSpeed-Domino -To try out DeepSpeed-Domino, please refer to [Domino tutorial](https://github.com/microsoft/DeepSpeedExamples/blob/master/training/DeepSpeed-Domino/README.md) in our DeepSpeedExample repo. +To try out DeepSpeed-Domino, please refer to [Domino tutorial](https://github.com/deepspeedai/DeepSpeedExamples/blob/master/training/DeepSpeed-Domino/README.md) in our DeepSpeedExample repo. ## Citation diff --git a/blogs/deepspeed-fastgen/2024-01-19/README.md b/blogs/deepspeed-fastgen/2024-01-19/README.md index a98c9856164c..108f3af23d45 100644 --- a/blogs/deepspeed-fastgen/2024-01-19/README.md +++ b/blogs/deepspeed-fastgen/2024-01-19/README.md @@ -20,7 +20,7 @@ # 1. Introduction -[DeepSpeed-FastGen](https://github.com/microsoft/DeepSpeed/tree/master/blogs/deepspeed-fastgen) is an inference system framework that enables easy, fast, and affordable inference for large language models (LLMs). From general chat models to document summarization, and from autonomous driving to copilots at every layer of the software stack, the demand to deploy and serve these models at scale has skyrocketed. DeepSpeed-FastGen utilizes the Dynamic SplitFuse technique to tackle the unique challenges of serving these applications and offer higher effective throughput than other state-of-the-art systems like vLLM. +[DeepSpeed-FastGen](https://github.com/deepspeedai/DeepSpeed/tree/master/blogs/deepspeed-fastgen) is an inference system framework that enables easy, fast, and affordable inference for large language models (LLMs). From general chat models to document summarization, and from autonomous driving to copilots at every layer of the software stack, the demand to deploy and serve these models at scale has skyrocketed. DeepSpeed-FastGen utilizes the Dynamic SplitFuse technique to tackle the unique challenges of serving these applications and offer higher effective throughput than other state-of-the-art systems like vLLM. Today, we are happy to share that we are improving DeepSpeed-FastGen along three areas: i) three new model families, ii) performance optimizations, and iii) feature enhancements: - **New Model Families** @@ -29,13 +29,13 @@ Today, we are happy to share that we are improving DeepSpeed-FastGen along three - **Performance Optimizations** - We drastically reduced the scheduling overhead of Dynamic SplitFuse and increased the efficiency of token sampling. As a result, we see higher throughput and lower latency, particularly when handling concurrent requests from many clients. We demonstrate the performance optimizations with benchmarks and evaluation of DeepSpeed-FastGen against vLLM for the newly added model families. The benchmark results can be seen in [Performance Evaluation](#performance-optimizations) and the benchmark code is available at [DeepSpeedExamples](https://github.com/microsoft/DeepSpeedExamples/tree/master/benchmarks/inference/mii). + We drastically reduced the scheduling overhead of Dynamic SplitFuse and increased the efficiency of token sampling. As a result, we see higher throughput and lower latency, particularly when handling concurrent requests from many clients. We demonstrate the performance optimizations with benchmarks and evaluation of DeepSpeed-FastGen against vLLM for the newly added model families. The benchmark results can be seen in [Performance Evaluation](#performance-optimizations) and the benchmark code is available at [DeepSpeedExamples](https://github.com/deepspeedai/DeepSpeedExamples/tree/master/benchmarks/inference/mii). - **Feature Enhancements** DeepSpeed-FastGen contains a rich set of features for running inference with many different model families and over 20,000 HuggingFace hosted models. We extend this feature set for all models to include a RESTful API, more generation options, and support for models using the safetensor checkpoint format. Additionally, we improve on overall stability and address bugs in our original DeepSpeed-FastGen release. -We now dive into the details of the new model families, performance optimizations, and software improvements. If you would like to get started right away please see [Try Out DeepSpeed-FastGen](#try-out-deepspeed-fastgen). This new release is available in [DeepSpeed versions >= 0.13.0](https://github.com/microsoft/DeepSpeed/tree/v0.13.0) and [DeepSpeed-MII versions >= 0.2.0](https://github.com/microsoft/DeepSpeed-MII/tree/v0.2.0). +We now dive into the details of the new model families, performance optimizations, and software improvements. If you would like to get started right away please see [Try Out DeepSpeed-FastGen](#try-out-deepspeed-fastgen). This new release is available in [DeepSpeed versions >= 0.13.0](https://github.com/deepspeedai/DeepSpeed/tree/v0.13.0) and [DeepSpeed-MII versions >= 0.2.0](https://github.com/deepspeedai/DeepSpeed-MII/tree/v0.2.0). # 2. New Model Families @@ -63,9 +63,9 @@ A closer examination of the architectural nuances within the Falcon series revea SplitFuse effectively enhances utilization by simultaneously computing prompts and decoding (generating tokens). However, we observed a significant overhead for scheduling ragged batching, especially when generating a large number of tokens from numerous concurrent requests. In this release, we've minimized this scheduling overhead for querying KV cache states. As a result, there's a notable improvement in the performance for scenarios with a large number of generation steps. -In general for long prompts and a smaller number of generated tokens, we can fully utilize the benefits of SplitFuse, which combines prompt processing and decoding (token generation) in a single forward pass. This provides a significant advantage over vLLM in these scenarios as shown in our [previous blog](https://github.com/microsoft/DeepSpeed/tree/master/blogs/deepspeed-fastgen). For short prompts and a larger number of generated tokens, where most forward passes run purely for decoding, our highly optimized engine and the efficient scheduler for ragged batching demonstrate impressive performance. +In general for long prompts and a smaller number of generated tokens, we can fully utilize the benefits of SplitFuse, which combines prompt processing and decoding (token generation) in a single forward pass. This provides a significant advantage over vLLM in these scenarios as shown in our [previous blog](https://github.com/deepspeedai/DeepSpeed/tree/master/blogs/deepspeed-fastgen). For short prompts and a larger number of generated tokens, where most forward passes run purely for decoding, our highly optimized engine and the efficient scheduler for ragged batching demonstrate impressive performance. -We follow the benchmarking methodology we presented in our [previous blog](https://github.com/microsoft/DeepSpeed/tree/master/blogs/deepspeed-fastgen#a-benchmarking-methodology). +We follow the benchmarking methodology we presented in our [previous blog](https://github.com/deepspeedai/DeepSpeed/tree/master/blogs/deepspeed-fastgen#a-benchmarking-methodology). *NOTE: All the benchmarks in this blog use the recommended DeepSpeed-FastGen persistent deployment mode.* @@ -124,54 +124,54 @@ In this section we introduce several feature enhancements that have been release ## Performance improvements We achieve a notable improvement in performance by minimizing the scheduling overhead for querying KV cache states as discussed in [Performance Optimizations](#performance-optimizations). -See [PR-4965](https://github.com/microsoft/DeepSpeed/pull/4965), [PR-377](https://github.com/microsoft/DeepSpeed-MII/pull/377) for more details. +See [PR-4965](https://github.com/deepspeedai/DeepSpeed/pull/4965), [PR-377](https://github.com/deepspeedai/DeepSpeed-MII/pull/377) for more details. ## Support for safetensor checkpoints Some HuggingFace-hosted model checkpoint weights are provided only in the safetensor format. We extend our HuggingFace checkpoint engine to work with the safetensor format to support even more models! -See [PR-4659](https://github.com/microsoft/DeepSpeed/pull/4659), [PR-296](https://github.com/microsoft/DeepSpeed-MII/pull/296) for more details. +See [PR-4659](https://github.com/deepspeedai/DeepSpeed/pull/4659), [PR-296](https://github.com/deepspeedai/DeepSpeed-MII/pull/296) for more details. ## Added RESTful API -We add the option to automatically stand up a RESTful API when creating DeepSpeed-FastGen persistent deployments in DeepSpeed-MII. This API provides a way for users to send prompts to their deployments and receive responses using HTTP POST methods and tools like `curl` or python's `request` package. The RESTful API provides the same high throughput and low latency performance as our python APIs. For more information, please see [MII RESTful API](https://github.com/microsoft/DeepSpeed-MII#restful-api). +We add the option to automatically stand up a RESTful API when creating DeepSpeed-FastGen persistent deployments in DeepSpeed-MII. This API provides a way for users to send prompts to their deployments and receive responses using HTTP POST methods and tools like `curl` or python's `request` package. The RESTful API provides the same high throughput and low latency performance as our python APIs. For more information, please see [MII RESTful API](https://github.com/deepspeedai/DeepSpeed-MII#restful-api). -See [PR-348](https://github.com/microsoft/DeepSpeed-MII/pull/348), [PR-328](https://github.com/microsoft/DeepSpeed-MII/pull/328), [PR-294](https://github.com/microsoft/DeepSpeed-MII/pull/294) for more details. +See [PR-348](https://github.com/deepspeedai/DeepSpeed-MII/pull/348), [PR-328](https://github.com/deepspeedai/DeepSpeed-MII/pull/328), [PR-294](https://github.com/deepspeedai/DeepSpeed-MII/pull/294) for more details. ## Added deployment and generate options -We extend the customizability of DeepSpeed-FastGen deployments and text-generation. Users can now specify a `device_map` when creating non-persistent pipelines and persistent deployments that controls which GPUs to use for hosting a model. Additionally, the interfaces between pipelines and deployments now match and include options for setting top-p, top-k, and temperature values. For additional information about the user-exposed options, please see [MII Pipeline](https://github.com/microsoft/DeepSpeed-MII#non-persistent-pipeline) and [MII Deployment](https://github.com/microsoft/DeepSpeed-MII#persistent-deployment). +We extend the customizability of DeepSpeed-FastGen deployments and text-generation. Users can now specify a `device_map` when creating non-persistent pipelines and persistent deployments that controls which GPUs to use for hosting a model. Additionally, the interfaces between pipelines and deployments now match and include options for setting top-p, top-k, and temperature values. For additional information about the user-exposed options, please see [MII Pipeline](https://github.com/deepspeedai/DeepSpeed-MII#non-persistent-pipeline) and [MII Deployment](https://github.com/deepspeedai/DeepSpeed-MII#persistent-deployment). -See [PR-331](https://github.com/microsoft/DeepSpeed-MII/pull/331), [PR-280](https://github.com/microsoft/DeepSpeed-MII/pull/280), [PR-275](https://github.com/microsoft/DeepSpeed-MII/pull/275), [PR-268](https://github.com/microsoft/DeepSpeed-MII/pull/268), [PR-295](https://github.com/microsoft/DeepSpeed-MII/pull/295), for more details. +See [PR-331](https://github.com/deepspeedai/DeepSpeed-MII/pull/331), [PR-280](https://github.com/deepspeedai/DeepSpeed-MII/pull/280), [PR-275](https://github.com/deepspeedai/DeepSpeed-MII/pull/275), [PR-268](https://github.com/deepspeedai/DeepSpeed-MII/pull/268), [PR-295](https://github.com/deepspeedai/DeepSpeed-MII/pull/295), for more details. ## Mitigate risk of deadlock In use cases where many prompts are sent to a deployment in a small time window, deadlock can occur in the DeepSpeed-FastGen inference engine, resulting in no text-generation progress is made on any prompts. To mitigate this, we ensure that there is a sufficient margin in the KV cache when scheduling requests. While not completely resolved, we continue to investigate a fix for these situations that arrive when the deployment is under heavy load. -See [PR-274](https://github.com/microsoft/DeepSpeed-MII/pull/274) for more details. +See [PR-274](https://github.com/deepspeedai/DeepSpeed-MII/pull/274) for more details. ## Inference Checkpoints We add the capability to create inference engine snapshots to DeepSpeed-FastGen. This reduces the loading time for large models in future deployments. -See [PR-4664](https://github.com/microsoft/DeepSpeed/pull/4664) for more details. +See [PR-4664](https://github.com/deepspeedai/DeepSpeed/pull/4664) for more details. ## General stability and bug fixes We include many bug fixes and stability improvements to DeepSpeed-FastGen. This includes fixing issues with some OPT model size variants, bugs with MII configuration options, and improved error messages. -See [PR-4938](https://github.com/microsoft/DeepSpeed/pull/4938), [PR-4920](https://github.com/microsoft/DeepSpeed/pull/4920), [PR-4739](https://github.com/microsoft/DeepSpeed/pull/4739), [PR-4694](https://github.com/microsoft/DeepSpeed/pull/4694), [PR-4634](https://github.com/microsoft/DeepSpeed/pull/4634), [PR-367](https://github.com/microsoft/DeepSpeed-MII/pull/367), [PR-350](https://github.com/microsoft/DeepSpeed-MII/pull/350), for more details. +See [PR-4938](https://github.com/deepspeedai/DeepSpeed/pull/4938), [PR-4920](https://github.com/deepspeedai/DeepSpeed/pull/4920), [PR-4739](https://github.com/deepspeedai/DeepSpeed/pull/4739), [PR-4694](https://github.com/deepspeedai/DeepSpeed/pull/4694), [PR-4634](https://github.com/deepspeedai/DeepSpeed/pull/4634), [PR-367](https://github.com/deepspeedai/DeepSpeed-MII/pull/367), [PR-350](https://github.com/deepspeedai/DeepSpeed-MII/pull/350), for more details. # 5. Community Engagement -DeepSpeed welcomes your contributions! We encourage you to report issues, contribute PRs, and join discussions on the [DeepSpeed GitHub](https://github.com/microsoft/DeepSpeed/) page. Please see our [contributing guide](https://github.com/microsoft/DeepSpeed/blob/master/CONTRIBUTING.md) for more details. We are open to collaborations with universities, research labs, and companies, such as those working together on deep learning research, applying DeepSpeed to empower real-world AI models and applications, and so on. For such requests (and other requests unsuitable for GitHub), please directly email to deepspeed-info@microsoft.com. +DeepSpeed welcomes your contributions! We encourage you to report issues, contribute PRs, and join discussions on the [DeepSpeed GitHub](https://github.com/deepspeedai/DeepSpeed/) page. Please see our [contributing guide](https://github.com/deepspeedai/DeepSpeed/blob/master/CONTRIBUTING.md) for more details. We are open to collaborations with universities, research labs, and companies, such as those working together on deep learning research, applying DeepSpeed to empower real-world AI models and applications, and so on. For such requests (and other requests unsuitable for GitHub), please directly email to deepspeed-info@microsoft.com. -*We would like to recognize the contribution from our user community in adding support for the [Qwen](https://arxiv.org/abs/2309.16609) model family to DeepSpeed-FastGen in [PR-4913](https://github.com/microsoft/DeepSpeed/pull/4913).* +*We would like to recognize the contribution from our user community in adding support for the [Qwen](https://arxiv.org/abs/2309.16609) model family to DeepSpeed-FastGen in [PR-4913](https://github.com/deepspeedai/DeepSpeed/pull/4913).* # 6. Try Out DeepSpeed-FastGen We are very excited to share this DeepSpeed-FastGen release. -* To get started, please visit our GitHub page for DeepSpeed-MII: [GitHub Landing Page](https://github.com/microsoft/DeepSpeed-MII) +* To get started, please visit our GitHub page for DeepSpeed-MII: [GitHub Landing Page](https://github.com/deepspeedai/DeepSpeed-MII) DeepSpeed-FastGen is part of the bigger DeepSpeed ecosystem comprising a multitude of Deep Learning systems and modeling technologies. To learn more, @@ -184,4 +184,4 @@ The following items are on our roadmap and we plan to engage with our community * Quantization support * New hardware backends through collaboration with partners -**"Star" our [DeepSpeed GitHub](https://github.com/microsoft/DeepSpeed/) and [DeepSpeed-MII GitHub](https://github.com/microsoft/DeepSpeed-MII/) repositories if you like our work!** +**"Star" our [DeepSpeed GitHub](https://github.com/deepspeedai/DeepSpeed/) and [DeepSpeed-MII GitHub](https://github.com/deepspeedai/DeepSpeed-MII/) repositories if you like our work!** diff --git a/blogs/deepspeed-fastgen/README.md b/blogs/deepspeed-fastgen/README.md index e287af2540ed..2a5f547fb6bd 100644 --- a/blogs/deepspeed-fastgen/README.md +++ b/blogs/deepspeed-fastgen/README.md @@ -23,11 +23,11 @@ Large language models (LLMs) like GPT-4 and LLaMA have emerged as a dominant workload in serving a wide range of applications infused with AI at every level. From general chat models to document summarization, and from autonomous driving to copilots at every layer of the software stack, the demand to deploy and serve these models at scale has skyrocketed. While frameworks like DeepSpeed, PyTorch, and several others can regularly achieve good hardware utilization during LLM training, the interactive nature of these applications and the poor arithmetic intensity of tasks like open-ended text generation have become the bottleneck for inference throughput in existing systems. -To this end, frameworks like [vLLM](https://arxiv.org/pdf/2309.06180.pdf) powered by PagedAttention and research systems like [Orca](https://www.usenix.org/system/files/osdi22-yu.pdf) have significantly improved the performance of inference for LLMs. However, these systems still struggle to provide consistent quality of service, particularly for workloads with longer prompts. These long prompt workloads are becoming increasingly important as more and more models, like [MPT-StoryWriter](https://www.mosaicml.com/blog/mpt-7b), and systems, such as [DeepSpeed Ulysses](https://github.com/microsoft/DeepSpeed/tree/master/blogs/deepspeed-ulysses), support context windows stretching to tens of thousands of tokens. To better understand the problem space, we provide detailed examples of how text generation works for LLMs in two distinct phases called prompt processing and generation. When systems treat them as distinct phases, generation will be preempted by prompt processing that risks breaking the service level agreements (SLAs). +To this end, frameworks like [vLLM](https://arxiv.org/pdf/2309.06180.pdf) powered by PagedAttention and research systems like [Orca](https://www.usenix.org/system/files/osdi22-yu.pdf) have significantly improved the performance of inference for LLMs. However, these systems still struggle to provide consistent quality of service, particularly for workloads with longer prompts. These long prompt workloads are becoming increasingly important as more and more models, like [MPT-StoryWriter](https://www.mosaicml.com/blog/mpt-7b), and systems, such as [DeepSpeed Ulysses](https://github.com/deepspeedai/DeepSpeed/tree/master/blogs/deepspeed-ulysses), support context windows stretching to tens of thousands of tokens. To better understand the problem space, we provide detailed examples of how text generation works for LLMs in two distinct phases called prompt processing and generation. When systems treat them as distinct phases, generation will be preempted by prompt processing that risks breaking the service level agreements (SLAs). Today, we are glad to present DeepSpeed-FastGen, a system that overcomes these limitations by leveraging the proposed Dynamic SplitFuse technique and offers up to 2.3x higher effective throughput compared to state-of-the-art systems like vLLM. DeepSpeed-FastGen leverages the combination of DeepSpeed-MII and DeepSpeed-Inference to provide an easy-to-use serving system. -**Quick Start:** Trying DeepSpeed-FastGen is as simple as installing the latest [DeepSpeed-MII](https://github.com/microsoft/DeepSpeed-MII) release: +**Quick Start:** Trying DeepSpeed-FastGen is as simple as installing the latest [DeepSpeed-MII](https://github.com/deepspeedai/DeepSpeed-MII) release: ```bash pip install deepspeed-mii @@ -209,7 +209,7 @@ In addition to the deep analysis on A100, we provide additional benchmarking res ## 5. DeepSpeed-FastGen: Implementation and Usage -DeepSpeed-FastGen is the synergistic composition of [DeepSpeed-MII](https://github.com/microsoft/DeepSpeed-MII) and [DeepSpeed-Inference](https://github.com/microsoft/DeepSpeed) as illustrated in the figure below. Together, both of these software packages provide various components of the system including the frontend APIs, the host and device infrastructure to schedule batches using Dynamic SplitFuse, optimized kernel implementations, and the tools to construct new model implementations. +DeepSpeed-FastGen is the synergistic composition of [DeepSpeed-MII](https://github.com/deepspeedai/DeepSpeed-MII) and [DeepSpeed-Inference](https://github.com/deepspeedai/DeepSpeed) as illustrated in the figure below. Together, both of these software packages provide various components of the system including the frontend APIs, the host and device infrastructure to schedule batches using Dynamic SplitFuse, optimized kernel implementations, and the tools to construct new model implementations.
    @@ -219,7 +219,7 @@ DeepSpeed-FastGen is the synergistic composition of [DeepSpeed-MII](https://gith The fastest way to get started with our alpha release of DeepSpeed-FastGen is: `pip install deepspeed-mii`. -Please follow our [Getting Started](https://github.com/microsoft/deepspeed-mii#getting-started-with-mii) guide for more details. For usage and reporting issues, please use the [DeepSpeed-MII Github repository](https://github.com/microsoft/DeepSpeed-MII). +Please follow our [Getting Started](https://github.com/deepspeedai/deepspeed-mii#getting-started-with-mii) guide for more details. For usage and reporting issues, please use the [DeepSpeed-MII Github repository](https://github.com/deepspeedai/DeepSpeed-MII). ### A. Supported Models @@ -238,10 +238,10 @@ We currently support the following model architectures in this alpha release of All current models leverage [HuggingFace](https://github.com/huggingface) APIs in our backend to provide both the model weights and the model's corresponding tokenizer. -We plan to add additional models in the coming weeks and months after the initial release. If there are specific model architectures you would like supported, please [file an issue](https://github.com/microsoft/DeepSpeed-MII/issues) and let us know. +We plan to add additional models in the coming weeks and months after the initial release. If there are specific model architectures you would like supported, please [file an issue](https://github.com/deepspeedai/DeepSpeed-MII/issues) and let us know. ### B. Deployment options -All of the examples below are runnable in [DeepSpeedExamples](https://github.com/microsoft/DeepSpeedExamples/tree/master/inference/mii). Once installed you have two options for deployment: an interactive non-persistent pipeline or a persistent serving deployment: +All of the examples below are runnable in [DeepSpeedExamples](https://github.com/deepspeedai/DeepSpeedExamples/tree/master/inference/mii). Once installed you have two options for deployment: an interactive non-persistent pipeline or a persistent serving deployment: #### Non-persistent pipeline @@ -280,20 +280,20 @@ client.terminate_server() ### C. Advanced Installation Information -For ease of use and a significant reduction in lengthy compile times that many projects require in this space, we distribute a pre-compiled Python wheel covering the majority of our custom kernels through a new library called [DeepSpeed-Kernels](https://github.com/microsoft/DeepSpeed-Kernels). We have found this library to be very portable across environments with NVIDIA GPUs with compute capabilities 8.0+ (Ampere+), CUDA 11.6+, and Ubuntu 20+. In most cases, you shouldn't even need to know this library exists as it is a dependency of DeepSpeed-MII and will be installed with it. However, if for whatever reason you need to compile our kernels manually please see our [advanced installation docs](https://github.com/microsoft/DeepSpeed-Kernels#source). +For ease of use and a significant reduction in lengthy compile times that many projects require in this space, we distribute a pre-compiled Python wheel covering the majority of our custom kernels through a new library called [DeepSpeed-Kernels](https://github.com/deepspeedai/DeepSpeed-Kernels). We have found this library to be very portable across environments with NVIDIA GPUs with compute capabilities 8.0+ (Ampere+), CUDA 11.6+, and Ubuntu 20+. In most cases, you shouldn't even need to know this library exists as it is a dependency of DeepSpeed-MII and will be installed with it. However, if for whatever reason you need to compile our kernels manually please see our [advanced installation docs](https://github.com/deepspeedai/DeepSpeed-Kernels#source). # 6. Try Out DeepSpeed-FastGen We are very excited to share this DeepSpeed-FastGen alpha release. -* To get started, please visit our GitHub page for DeepSpeed-MII: [GitHub Landing Page](https://github.com/microsoft/DeepSpeed-MII) +* To get started, please visit our GitHub page for DeepSpeed-MII: [GitHub Landing Page](https://github.com/deepspeedai/DeepSpeed-MII) DeepSpeed-FastGen is part of the bigger DeepSpeed ecosystem comprising a multitude of Deep Learning systems and modeling technologies. To learn more, * Please visit our [website](https://www.deepspeed.ai/) for detailed blog posts, tutorials, and helpful documentation. * You can also follow us on our [English Twitter](https://twitter.com/MSFTDeepSpeed), [Japanese Twitter](https://twitter.com/MSFTDeepSpeedJP), and [Chinese Zhihu](https://www.zhihu.com/people/deepspeed) for latest news on DeepSpeed. -DeepSpeed welcomes your contributions! We encourage you to report issues, contribute PRs, and join discussions on the [DeepSpeed GitHub](https://github.com/microsoft/DeepSpeed/) page. Please see our [contributing guide](https://github.com/microsoft/DeepSpeed/blob/master/CONTRIBUTING.md) for more details. We are open to collaborations with universities, research labs, and companies, such as those working together on deep learning research, applying DeepSpeed to empower real-world AI models and applications, and so on. For such requests (and other requests unsuitable for GitHub), please directly email to deepspeed-info@microsoft.com. +DeepSpeed welcomes your contributions! We encourage you to report issues, contribute PRs, and join discussions on the [DeepSpeed GitHub](https://github.com/deepspeedai/DeepSpeed/) page. Please see our [contributing guide](https://github.com/deepspeedai/DeepSpeed/blob/master/CONTRIBUTING.md) for more details. We are open to collaborations with universities, research labs, and companies, such as those working together on deep learning research, applying DeepSpeed to empower real-world AI models and applications, and so on. For such requests (and other requests unsuitable for GitHub), please directly email to deepspeed-info@microsoft.com. The following items are on our roadmap and we plan to engage with our community on these through our GitHub issues and PRs: @@ -302,7 +302,7 @@ The following items are on our roadmap and we plan to engage with our community - New hardware backends through collaboration with partners - Release performance benchmarks (used to generate plots in this blog) -**"Star" our [DeepSpeed GitHub](https://github.com/microsoft/DeepSpeed/) and [DeepSpeedMII GitHub](https://github.com/microsoft/DeepSpeed-MII/) repositories if you like our work!** +**"Star" our [DeepSpeed GitHub](https://github.com/deepspeedai/DeepSpeed/) and [DeepSpeedMII GitHub](https://github.com/deepspeedai/DeepSpeed-MII/) repositories if you like our work!** # 7. Acknowledgements diff --git a/blogs/deepspeed-fastgen/chinese/README.md b/blogs/deepspeed-fastgen/chinese/README.md index 1e92e4169450..357c70ca39eb 100644 --- a/blogs/deepspeed-fastgen/chinese/README.md +++ b/blogs/deepspeed-fastgen/chinese/README.md @@ -23,11 +23,11 @@ GPT-4 和 LLaMA 这样的大型语言模型(LLMs)已在各个层次上成为了集成 AI 的主流服务应用。从常规聊天模型到文档摘要,从自动驾驶到各个软件中的Copilot功能,这些模型的部署和服务需求正在迅速增加。像 DeepSpeed、PyTorch 和其他几个框架可以在 LLM 训练期间实现良好的硬件利用率。但它们在与用户互动及处理开放式文本生成等任务时,受限于这些操作的计算密集度相对较低,现有系统往往在推理吞吐量上遇到瓶颈。 -为了解决这一问题, [vLLM](https://arxiv.org/pdf/2309.06180.pdf) 这样由 PagedAttention 驱动的框架和 [Orca](https://www.usenix.org/system/files/osdi22-yu.pdf) 这样的系统显著提高了 LLM 推理的性能。然而,这些系统在面对长提示的工作负载时,依旧难以提供良好的服务质量。随着越来越多的模型(例如 [MPT-StoryWriter](https://www.mosaicml.com/blog/mpt-7b))和系统(例如[DeepSpeed Ulysses](https://github.com/microsoft/DeepSpeed/tree/master/blogs/deepspeed-ulysses))支持延伸到数万个令牌的上下文窗口,这些长提示工作负载变得越来越重要。为了更好地理解问题,我们在下文中提供了详细的示例来说明 LLM 的文本生成是如何在“提示处理”和“生成”的这两个阶段中工作的。当系统将它们视为不同的阶段时,生成阶段将被提示处理所抢占,这可能会破坏服务级别协议(SLAs)。 +为了解决这一问题, [vLLM](https://arxiv.org/pdf/2309.06180.pdf) 这样由 PagedAttention 驱动的框架和 [Orca](https://www.usenix.org/system/files/osdi22-yu.pdf) 这样的系统显著提高了 LLM 推理的性能。然而,这些系统在面对长提示的工作负载时,依旧难以提供良好的服务质量。随着越来越多的模型(例如 [MPT-StoryWriter](https://www.mosaicml.com/blog/mpt-7b))和系统(例如[DeepSpeed Ulysses](https://github.com/deepspeedai/DeepSpeed/tree/master/blogs/deepspeed-ulysses))支持延伸到数万个令牌的上下文窗口,这些长提示工作负载变得越来越重要。为了更好地理解问题,我们在下文中提供了详细的示例来说明 LLM 的文本生成是如何在“提示处理”和“生成”的这两个阶段中工作的。当系统将它们视为不同的阶段时,生成阶段将被提示处理所抢占,这可能会破坏服务级别协议(SLAs)。 今天,我们很高兴地介绍 DeepSpeed-FastGen 框架,它通过采用我们提出的动态 SplitFuse 技术,能够提供比vLLM 等先进系统高出多达 2.3 倍的有效吞吐量。DeepSpeed-FastGen 是 DeepSpeed-MII 和 DeepSpeed-Inference 的结合,提供了一个易于使用的服务系统。 -**快速开始:** 要使用 DeepSpeed-FastGen 只需安装最新的 [DeepSpeed-MII](https://github.com/microsoft/DeepSpeed-MII) 发行版: +**快速开始:** 要使用 DeepSpeed-FastGen 只需安装最新的 [DeepSpeed-MII](https://github.com/deepspeedai/DeepSpeed-MII) 发行版: ```bash pip install deepspeed-mii @@ -207,7 +207,7 @@ DeepSpeed-FastGen 提供了副本级负载均衡,可以将请求均匀分布 ## 5. DeepSpeed-FastGen:软件实现与使用指南 -DeepSpeed-FastGen 是 [DeepSpeed-MII](https://github.com/microsoft/DeepSpeed-MII) 和 [DeepSpeed-Inference](https://github.com/microsoft/DeepSpeed) 的协同组合,如下图所示。这两个软件包共同提供了系统的各个组成部分,包括前端 API、用于使用动态 SplitFuse 调度批次的主机和设备基础设施、优化的内核实现,以及构建新模型实现的工具。 +DeepSpeed-FastGen 是 [DeepSpeed-MII](https://github.com/deepspeedai/DeepSpeed-MII) 和 [DeepSpeed-Inference](https://github.com/deepspeedai/DeepSpeed) 的协同组合,如下图所示。这两个软件包共同提供了系统的各个组成部分,包括前端 API、用于使用动态 SplitFuse 调度批次的主机和设备基础设施、优化的内核实现,以及构建新模型实现的工具。
    @@ -217,7 +217,7 @@ DeepSpeed-FastGen 是 [DeepSpeed-MII](https://github.com/microsoft/DeepSpeed-MII 使用我们的 alpha 版 DeepSpeed-FastGen 最快的入门方式是:`pip install deepspeed-mii`。 -请按照我们的 [入门指南](https://github.com/microsoft/deepspeed-mii#getting-started-with-mii) 获取更多细节。如需使用和报告问题,请使用 [DeepSpeed-MII Github 仓库](https://github.com/microsoft/DeepSpeed-MII)。 +请按照我们的 [入门指南](https://github.com/deepspeedai/deepspeed-mii#getting-started-with-mii) 获取更多细节。如需使用和报告问题,请使用 [DeepSpeed-MII Github 仓库](https://github.com/deepspeedai/DeepSpeed-MII)。 ### A. 支持的模型 @@ -233,10 +233,10 @@ DeepSpeed-FastGen 是 [DeepSpeed-MII](https://github.com/microsoft/DeepSpeed-MII 所有当前模型都利用了后端的 [HuggingFace](https://github.com/huggingface) API 来提供模型权重和模型对应的分词器。 -> 我们计划在最初发布后的几周和几个月内添加更多模型。如果您希望支持特定的模型架构,请[提交问题](https://github.com/microsoft/DeepSpeed-MII/issues)来让我们知道。 +> 我们计划在最初发布后的几周和几个月内添加更多模型。如果您希望支持特定的模型架构,请[提交问题](https://github.com/deepspeedai/DeepSpeed-MII/issues)来让我们知道。 ### B. 部署选项 -以下所有示例均可在 [DeepSpeedExamples](https://github.com/microsoft/DeepSpeedExamples/tree/master/inference/mii) 中运行。安装后,您有两种部署方式:交互式非持久管道或持久化服务部署: +以下所有示例均可在 [DeepSpeedExamples](https://github.com/deepspeedai/DeepSpeedExamples/tree/master/inference/mii) 中运行。安装后,您有两种部署方式:交互式非持久管道或持久化服务部署: #### 非持久管道 @@ -274,20 +274,20 @@ client.terminate_server() ### C. 高级安装方式 -为了使用方便并显著减少许多其他框架所需的冗长编译时间,我们通过名为 [DeepSpeed-Kernels](https://github.com/microsoft/DeepSpeed-Kernels) 的新库分发了覆盖我们大部分自定义内核的预编译 Python wheel。我们发现这个库在环境中非常便携,只要这些环境具有 NVIDIA GPU 计算能力 8.0+(Ampere+)、CUDA 11.6+ 和 Ubuntu 20+。在大多数情况下,您甚至不需要知道这个库的存在,因为它是 DeepSpeed-MII 的依赖项,并将自动与之一起安装。然而,如果您因任何原因需要手动编译我们的内核,请参阅我们的[高级安装文档](https://github.com/microsoft/DeepSpeed-Kernels#source)。 +为了使用方便并显著减少许多其他框架所需的冗长编译时间,我们通过名为 [DeepSpeed-Kernels](https://github.com/deepspeedai/DeepSpeed-Kernels) 的新库分发了覆盖我们大部分自定义内核的预编译 Python wheel。我们发现这个库在环境中非常便携,只要这些环境具有 NVIDIA GPU 计算能力 8.0+(Ampere+)、CUDA 11.6+ 和 Ubuntu 20+。在大多数情况下,您甚至不需要知道这个库的存在,因为它是 DeepSpeed-MII 的依赖项,并将自动与之一起安装。然而,如果您因任何原因需要手动编译我们的内核,请参阅我们的[高级安装文档](https://github.com/deepspeedai/DeepSpeed-Kernels#source)。 # 6. 尝试 DeepSpeed-FastGen 我们非常高兴分享 DeepSpeed-FastGen 的首个 alpha 版本。 -* 要开始,请访问我们的 DeepSpeed-MII GitHub 页面: [GitHub 登陆页面](https://github.com/microsoft/DeepSpeed-MII) +* 要开始,请访问我们的 DeepSpeed-MII GitHub 页面: [GitHub 登陆页面](https://github.com/deepspeedai/DeepSpeed-MII) DeepSpeed-FastGen 是更大的 DeepSpeed 生态系统的一部分,该生态系统包含了多种深度学习系统和建模技术。要了解更多, * 请访问我们的[网站](https://www.deepspeed.ai/),详细查看博客文章、教程和有用的文档。 * 您也可以通过我们的[英文 Twitter](https://twitter.com/MSFTDeepSpeed)、[日本 Twitter](https://twitter.com/MSFTDeepSpeedJP) 和[中文知乎](https://www.zhihu.com/people/deepspeed) 关注我们,以获取 DeepSpeed 的最新消息。 -DeepSpeed 欢迎您的贡献!我们鼓励您在 [DeepSpeed GitHub](https://github.com/microsoft/DeepSpeed/) 页面上报告问题、贡献 PR,并参与讨论。有关更多详细信息,请参见我们的[贡献指南](https://github.com/microsoft/DeepSpeed/blob/master/CONTRIBUTING.md)。我们愿意与大学、研究实验室和公司合作,比如那些在深度学习研究上共同工作,应用 DeepSpeed 来赋能真实世界的 AI 模型和应用等。对于那些不适合在 GitHub 上提出的请求(以及其他请求),请直接发送电子邮件至 deepspeed-info@microsoft.com。 +DeepSpeed 欢迎您的贡献!我们鼓励您在 [DeepSpeed GitHub](https://github.com/deepspeedai/DeepSpeed/) 页面上报告问题、贡献 PR,并参与讨论。有关更多详细信息,请参见我们的[贡献指南](https://github.com/deepspeedai/DeepSpeed/blob/master/CONTRIBUTING.md)。我们愿意与大学、研究实验室和公司合作,比如那些在深度学习研究上共同工作,应用 DeepSpeed 来赋能真实世界的 AI 模型和应用等。对于那些不适合在 GitHub 上提出的请求(以及其他请求),请直接发送电子邮件至 deepspeed-info@microsoft.com。 以下项目在我们的路线图上,我们计划通过我们的 GitHub 问题和 PR 与我们的社区在这些项目上进行交流: @@ -296,7 +296,7 @@ DeepSpeed 欢迎您的贡献!我们鼓励您在 [DeepSpeed GitHub](https://git - 通过与合作伙伴的合作支持新硬件后端 - 发布性能测试套件(例如此博客中生成的图表) -如果您喜欢我们的工作,请为我们的 [DeepSpeed GitHub](https://github.com/microsoft/DeepSpeed/) 和 [DeepSpeedMII GitHub](https://github.com/microsoft/DeepSpeed-MII/) 仓库打上“星标”! +如果您喜欢我们的工作,请为我们的 [DeepSpeed GitHub](https://github.com/deepspeedai/DeepSpeed/) 和 [DeepSpeedMII GitHub](https://github.com/deepspeedai/DeepSpeed-MII/) 仓库打上“星标”! # 7. 致谢 diff --git a/blogs/deepspeed-fastgen/japanese/README.md b/blogs/deepspeed-fastgen/japanese/README.md index 9729854afcf0..5e7c59893d84 100644 --- a/blogs/deepspeed-fastgen/japanese/README.md +++ b/blogs/deepspeed-fastgen/japanese/README.md @@ -24,14 +24,14 @@ AIを様々な目的に利用する幅広いアプリケーションで、GPT-4やLLaMAのような大規模言語モデル(LLM)が、主要なワークロードになってきています。一般的なチャットモデルから、文書の要約、自動運転、ソフトウェアスタックの各層におけるプログラミングの補助まで、これらのモデルを大規模に展開・提供する需要が急増しています。DeepSpeedやPyTorchをはじめとするフレームワークは、一般に、LLMの訓練では良好なハードウェアの利用効率を達成できるものの、オープンエンドのテキスト生成などの課題では、GPUなどのハードウェア上で一度に実行される計算量が少ないことが、既存システムにおいて推論スループットのボトルネックとなっています。 PagedAttentionを搭載した [vLLM](https://arxiv.org/pdf/2309.06180.pdf) や [Orca](https://www.usenix.org/system/files/osdi22-yu.pdf) のような既存システムは、こうした課題を解決するために設計され、LLMの推論性能を大幅に向上させました。しかしこれらのシステムは依然として、特に長いプロンプトを含むワークロードにおいて、一貫したサービス品質の提供という点で課題を残しています。 -数千トークンに及ぶコンテキストウィンドウをサポートするモデルやシステム、例えば [MPT-StoryWriter](https://www.mosaicml.com/blog/mpt-7b) や [DeepSpeed Ulysses](https://github.com/microsoft/DeepSpeed/tree/master/blogs/deepspeed-ulysses) などが増えるにつれて、これらの長いプロンプトのワークロードはますます重要になってきています。 +数千トークンに及ぶコンテキストウィンドウをサポートするモデルやシステム、例えば [MPT-StoryWriter](https://www.mosaicml.com/blog/mpt-7b) や [DeepSpeed Ulysses](https://github.com/deepspeedai/DeepSpeed/tree/master/blogs/deepspeed-ulysses) などが増えるにつれて、これらの長いプロンプトのワークロードはますます重要になってきています。 これらの問題をより深く理解するために、LLMによるテキスト生成がどのように機能するか説明します。LLMによるテキスト生成は、プロンプト処理と生成と呼ばれる2つの異なるフェーズから構成されます。システムがこれらを全く独立に扱うと、生成のフェーズは、プロンプト処理によって中断されることになります。その結果、システムのレイテンシなどを定めた SLA (Service Level Agreement) に違反する可能性が高くなります。 このブログで紹介するDeepSpeed-FastGenは、新たに提案するDynamic SplitFuse技術などを活用することでこうした課題を解決し、vLLMなどの最新の既存システムと比較して最大2.3倍の実効スループットを実現するシステムです。 DeepSpeed-FastGenは、DeepSpeed-MIIとDeepSpeed-Inferenceの組み合わせにより、使いやすいテキスト生成機能を実現します。 -**クイックスタート:** 最新の[DeepSpeed-MII](https://github.com/microsoft/DeepSpeed-MII)をインストールするだけで、 DeepSpeed-FastGenを試すことができます。 +**クイックスタート:** 最新の[DeepSpeed-MII](https://github.com/deepspeedai/DeepSpeed-MII)をインストールするだけで、 DeepSpeed-FastGenを試すことができます。 ```bash @@ -218,7 +218,7 @@ A100 GPUを用いた分析に加えて、H100とA6000を使用したベンチマ ## 5. DeepSpeed-FastGen: 実装と使い方 -DeepSpeed-FastGenは、以下の図に示されているように、[DeepSpeed-MII](https://github.com/microsoft/DeepSpeed-MII)と[DeepSpeed-Inference](https://github.com/microsoft/DeepSpeed)を融合的に組み合わせたものです。これらのソフトウェアパッケージは、フロントエンドAPI、Dynamic SplitFuseを使用してバッチをスケジュールするホストおよびデバイスインフラストラクチャ、最適化されたカーネル実装、新しいモデル実装を構築するためのツールなど、システムの様々なコンポーネントを提供します。 +DeepSpeed-FastGenは、以下の図に示されているように、[DeepSpeed-MII](https://github.com/deepspeedai/DeepSpeed-MII)と[DeepSpeed-Inference](https://github.com/deepspeedai/DeepSpeed)を融合的に組み合わせたものです。これらのソフトウェアパッケージは、フロントエンドAPI、Dynamic SplitFuseを使用してバッチをスケジュールするホストおよびデバイスインフラストラクチャ、最適化されたカーネル実装、新しいモデル実装を構築するためのツールなど、システムの様々なコンポーネントを提供します。
    @@ -228,7 +228,7 @@ DeepSpeed-FastGenは、以下の図に示されているように、[DeepSpeed-M DeepSpeed-FastGenのアルファリリースを使い始める最も簡単な方法は、 ``pip install deepspeed-mii`` を実行することです。 -詳細については、[Getting Started](https://github.com/microsoft/deepspeed-mii#getting-started-with-mii)ガイドを参照してください。使用法や問題の報告には、[DeepSpeed-MII Github リポジトリ](https://github.com/microsoft/DeepSpeed-MII)を使用してください。 +詳細については、[Getting Started](https://github.com/deepspeedai/deepspeed-mii#getting-started-with-mii)ガイドを参照してください。使用法や問題の報告には、[DeepSpeed-MII Github リポジトリ](https://github.com/deepspeedai/DeepSpeed-MII)を使用してください。 ### A. 対応モデル @@ -240,11 +240,11 @@ DeepSpeed-FastGenのアルファリリースを使い始める最も簡単な方 現在のすべてのモデルは、モデルの重みとモデルに対応するトークナイザーの両方を提供するために、バックエンドで [HuggingFace](https://github.com/huggingface) を利用しています。 -初期リリース後の数週間と数ヶ月に追加のモデルを追加する予定です。サポートを希望する特定のモデルアーキテクチャがある場合は、[issue](https://github.com/microsoft/DeepSpeed-MII/issues) を登録してください。。 +初期リリース後の数週間と数ヶ月に追加のモデルを追加する予定です。サポートを希望する特定のモデルアーキテクチャがある場合は、[issue](https://github.com/deepspeedai/DeepSpeed-MII/issues) を登録してください。。 ### B. デプロイメントのオプション -以下の例はすべて [DeepSpeedExamples](https://github.com/microsoft/DeepSpeedExamples/tree/master/inference/mii) で実行可能です。インストール後、デプロイメントのオプションとして、対話型の非永続パイプラインまたは永続的なサービス提供デプロイメントの2つのオプションがあります。 +以下の例はすべて [DeepSpeedExamples](https://github.com/deepspeedai/DeepSpeedExamples/tree/master/inference/mii) で実行可能です。インストール後、デプロイメントのオプションとして、対話型の非永続パイプラインまたは永続的なサービス提供デプロイメントの2つのオプションがあります。 #### 非永続パイプライン @@ -284,21 +284,21 @@ client.terminate_server() ### C. インストールの詳細情報 類似の他のプロジェクトでは、カスタムカーネルのコンパイルに非常に時間がかかることがよくあります。 -DeepSpeed-FastGenでは、このコンパイル時間を大幅に短縮し、利便性を向上するため、主要なカスタムカーネルの大部分を事前コンパイルしたPython wheelを、[DeepSpeed-Kernels](https://github.com/microsoft/DeepSpeed-Kernels)という新しいライブラリを通じて配布しています。 +DeepSpeed-FastGenでは、このコンパイル時間を大幅に短縮し、利便性を向上するため、主要なカスタムカーネルの大部分を事前コンパイルしたPython wheelを、[DeepSpeed-Kernels](https://github.com/deepspeedai/DeepSpeed-Kernels)という新しいライブラリを通じて配布しています。 このライブラリは、NVIDIA GPUのコンピュート能力が8.0以上(Ampere+)、CUDA 11.6以上、Ubuntu 20以上の環境で非常に移植性が高いことがわかっています。 -このライブラリは、DeepSpeed-MIIの依存関係としてインストールされるため、ほとんどの場合では、このライブラリの存在を知る必要はありません。しかし、何らかの理由でカーネルを手動でコンパイルする必要がある場合は、インストールに関する[詳細ドキュメント](https://github.com/microsoft/DeepSpeed-Kernels#source)をご覧ください。 +このライブラリは、DeepSpeed-MIIの依存関係としてインストールされるため、ほとんどの場合では、このライブラリの存在を知る必要はありません。しかし、何らかの理由でカーネルを手動でコンパイルする必要がある場合は、インストールに関する[詳細ドキュメント](https://github.com/deepspeedai/DeepSpeed-Kernels#source)をご覧ください。 # 6. DeepSpeed-FastGen を使ってみる このDeepSpeed-FastGenアルファリリースをユーザの皆さんと共有できることを非常に嬉しく思います。 -* 使用を始めるにあたっては、DeepSpeed-MIIのGitHubページをご覧ください: [GitHubランディングページ](https://github.com/microsoft/DeepSpeed-MII) +* 使用を始めるにあたっては、DeepSpeed-MIIのGitHubページをご覧ください: [GitHubランディングページ](https://github.com/deepspeedai/DeepSpeed-MII) DeepSpeed-FastGenは、Deep Learningシステムやモデリングテクノロジーを数多く含む、より大きなDeepSpeedエコシステムの一部です。さらに詳しい情報が必要な方は、 [詳細なブログ記事]、チュートリアル、役立つドキュメントがある私たちの [ウェブサイト](https://www.deepspeed.ai/) をご覧ください。 DeepSpeedの最新情報については、[英語のTwitter](https://twitter.com/MSFTDeepSpeed)、[日本語のTwitter](https://twitter.com/MSFTDeepSpeedJP)、[中国語の知乎](https://www.zhihu.com/people/deepspeed)をフォローしてください。 -DeepSpeedは、皆様の開発への参加を歓迎しています。DeepSpeedのGitHubページで、バグ報告、Pull Request、ディスカッションへの参加が可能です。詳細は[ガイドライン](https://github.com/microsoft/DeepSpeed/blob/master/CONTRIBUTING.md)をご覧ください。[contributing guide](https://github.com/microsoft/DeepSpeed/blob/master/CONTRIBUTING.md) にはより詳細な情報があります。 +DeepSpeedは、皆様の開発への参加を歓迎しています。DeepSpeedのGitHubページで、バグ報告、Pull Request、ディスカッションへの参加が可能です。詳細は[ガイドライン](https://github.com/deepspeedai/DeepSpeed/blob/master/CONTRIBUTING.md)をご覧ください。[contributing guide](https://github.com/deepspeedai/DeepSpeed/blob/master/CONTRIBUTING.md) にはより詳細な情報があります。 また、深層学習の研究や、実世界のAIモデルやアプリケーションへのDeepSpeedの適用に取り組む大学、研究所、企業とのコラボレーションも行っています。こうしたコラボレーションについてのご要望(およびGitHubには適さないその他の話題)については まで直接メールをお送りください。 以下の項目は、今後のロードマップです。GitHubの問題やPRを通じてコミュニティと協力して取り組む予定です: @@ -308,7 +308,7 @@ DeepSpeedは、皆様の開発への参加を歓迎しています。DeepSpeed - パートナーとのコラボレーションによる新しいハードウェアバックエンド - ブログに掲載したプロットを生成するパフォーマンスベンチマークのリリース -このプロジェクトが気に入ったら、ぜひ [DeepSpeed GitHub](https://github.com/microsoft/DeepSpeed/) と [DeepSpeedMII GitHub](https://github.com/microsoft/DeepSpeed-MII/) のリポジトリに "スター" をつけてください。 +このプロジェクトが気に入ったら、ぜひ [DeepSpeed GitHub](https://github.com/deepspeedai/DeepSpeed/) と [DeepSpeedMII GitHub](https://github.com/deepspeedai/DeepSpeed-MII/) のリポジトリに "スター" をつけてください。 # 7. 謝辞 diff --git a/blogs/deepspeed-fp6/03-05-2024/README-Chinese.md b/blogs/deepspeed-fp6/03-05-2024/README-Chinese.md index 8273ff3a51a7..017e7c9ab4d8 100644 --- a/blogs/deepspeed-fp6/03-05-2024/README-Chinese.md +++ b/blogs/deepspeed-fp6/03-05-2024/README-Chinese.md @@ -107,7 +107,7 @@ pip install qtorch 要使用我们的DeepSpeed-FP6进行基准测试,请访问以下脚本: ```bash -https://github.com/microsoft/DeepSpeedExamples/blob/master/benchmarks/inference/mii/run_fp6.sh +https://github.com/deepspeedai/DeepSpeedExamples/blob/master/benchmarks/inference/mii/run_fp6.sh ``` 也请访问[FP6-LLM github](https://github.com/usyd-fsalab/fp6_llm) 获取FP6的独立kernel。不要忘了给仓库加星标以表达您的支持! @@ -121,9 +121,9 @@ https://github.com/microsoft/DeepSpeedExamples/blob/master/benchmarks/inference/ * 请访问我们的 [网站](https://www.deepspeed.ai/) 了解详细的博客文章、教程和文档。 * 在我们的 [英文 X(Twitter)](https://twitter.com/MSFTDeepSpeed)、[日语 X(Twitter)](https://twitter.com/MSFTDeepSpeedJP) 和 [中文知乎](https://www.zhihu.com/people/deepspeed) 上关注我们,以获取 DeepSpeed 的最新消息。 -我们欢迎您为 DeepSpeed 做出贡献!我们鼓励您报告问题、贡献 PRs、并在 [DeepSpeed GitHub](https://github.com/microsoft/DeepSpeed/) 页面上参加讨论。有关更多详细信息,请查看我们的 [贡献指南](https://github.com/microsoft/DeepSpeed/blob/master/CONTRIBUTING.md)。我们对与大学、研究实验室、公司等进行合作持开放态度,例如共同进行深度学习研究、应用 DeepSpeed 为现实世界的 AI 模型和应用提供支持等等。对于此类请求(以及其他不适合 GitHub 的请求),请直接发送电子邮件至 deepspeed-info@microsoft.com。 +我们欢迎您为 DeepSpeed 做出贡献!我们鼓励您报告问题、贡献 PRs、并在 [DeepSpeed GitHub](https://github.com/deepspeedai/DeepSpeed/) 页面上参加讨论。有关更多详细信息,请查看我们的 [贡献指南](https://github.com/deepspeedai/DeepSpeed/blob/master/CONTRIBUTING.md)。我们对与大学、研究实验室、公司等进行合作持开放态度,例如共同进行深度学习研究、应用 DeepSpeed 为现实世界的 AI 模型和应用提供支持等等。对于此类请求(以及其他不适合 GitHub 的请求),请直接发送电子邮件至 deepspeed-info@microsoft.com。 -* 如果你喜欢我们的工作,请在[DeepSpeed GitHub](https://github.com/microsoft/DeepSpeed/), [DeepSpeed-MII GitHub](https://github.com/microsoft/DeepSpeed-MII/) 和 [DeepSpeedExamples GitHub](https://github.com/microsoft/DeepSpeedExamples/)仓库“点赞”! +* 如果你喜欢我们的工作,请在[DeepSpeed GitHub](https://github.com/deepspeedai/DeepSpeed/), [DeepSpeed-MII GitHub](https://github.com/deepspeedai/DeepSpeed-MII/) 和 [DeepSpeedExamples GitHub](https://github.com/deepspeedai/DeepSpeedExamples/)仓库“点赞”! # 6. 致谢和贡献 diff --git a/blogs/deepspeed-fp6/03-05-2024/README.md b/blogs/deepspeed-fp6/03-05-2024/README.md index 0285dd79b87d..5f5b4700e403 100755 --- a/blogs/deepspeed-fp6/03-05-2024/README.md +++ b/blogs/deepspeed-fp6/03-05-2024/README.md @@ -108,7 +108,7 @@ pip install qtorch To benchmark with our DeepSpeed-FP6, please visit the following script: ```bash -https://github.com/microsoft/DeepSpeedExamples/blob/master/benchmarks/inference/mii/run_fp6.sh +https://github.com/deepspeedai/DeepSpeedExamples/blob/master/benchmarks/inference/mii/run_fp6.sh ``` Please also visit the [FP6-LLM github](https://github.com/usyd-fsalab/fp6_llm) for the standalone kernel of FP6. Don't forget to star the repo to show your support! @@ -122,9 +122,9 @@ Currently, DeepSpeed-FP6 supports only dense models with MoE models support upco * Please visit our [website](https://www.deepspeed.ai/) for detailed blog posts, tutorials, and helpful documentation. * Follow us on our [English X(Twitter)](https://twitter.com/MSFTDeepSpeed), [Japanese X(Twitter)](https://twitter.com/MSFTDeepSpeedJP), and [Chinese Zhihu](https://www.zhihu.com/people/deepspeed) for latest news on DeepSpeed. -We welcome your contributions to DeepSpeed! We encourage you to report issues, contribute PRs, and join discussions on the [DeepSpeed GitHub](https://github.com/microsoft/DeepSpeed/) page. Please see our [contributing guide](https://github.com/microsoft/DeepSpeed/blob/master/CONTRIBUTING.md) for more details. We are open to collaborations with universities, research labs, companies, such as those working together on deep learning research, applying DeepSpeed to empower real-world AI models and applications, and so on. For such requests (and other requests unsuitable for GitHub), please directly email to deepspeed-info@microsoft.com. +We welcome your contributions to DeepSpeed! We encourage you to report issues, contribute PRs, and join discussions on the [DeepSpeed GitHub](https://github.com/deepspeedai/DeepSpeed/) page. Please see our [contributing guide](https://github.com/deepspeedai/DeepSpeed/blob/master/CONTRIBUTING.md) for more details. We are open to collaborations with universities, research labs, companies, such as those working together on deep learning research, applying DeepSpeed to empower real-world AI models and applications, and so on. For such requests (and other requests unsuitable for GitHub), please directly email to deepspeed-info@microsoft.com. -* "Star" our [DeepSpeed GitHub](https://github.com/microsoft/DeepSpeed/) and [DeepSpeed-MII GitHub](https://github.com/microsoft/DeepSpeed-MII/) and [DeepSpeedExamples GitHub](https://github.com/microsoft/DeepSpeedExamples/) repositories if you like our work! +* "Star" our [DeepSpeed GitHub](https://github.com/deepspeedai/DeepSpeed/) and [DeepSpeed-MII GitHub](https://github.com/deepspeedai/DeepSpeed-MII/) and [DeepSpeedExamples GitHub](https://github.com/deepspeedai/DeepSpeedExamples/) repositories if you like our work! # 6. Acknowledgments and Contributions diff --git a/blogs/deepspeed-gds/README.md b/blogs/deepspeed-gds/README.md index 84a97cb22eab..536b6f984af0 100644 --- a/blogs/deepspeed-gds/README.md +++ b/blogs/deepspeed-gds/README.md @@ -81,7 +81,7 @@ Figure 3: Using DeepNVMe to scale LLAMA3-70B token generation performance with N # Summary -In this blog post, we introduced DeepNVMe, an I/O optimization technology created to tackle the emergence of I/O operations as key bottlenecks of Deep Learning scalability. DeepNVMe enables fast and efficient data transfers between persistent storage and DL application memory through optimizations built on popular storage technologies such as NVMe SSDs and NVIDIA GDS. We showed benefits of using DeepNVMe for LLAMA3-70B token generation on single A100-80GB GPU with NVMe offloading, for which it achieves up to 7 tokens per second in generation throughput on an Azure NC96ads\_A100\_v4 VM. DeepNVMe will be open-sourced and generally available in DeepSpeed versions >= [0.15.0](https://github.com/microsoft/DeepSpeed/releases/tag/v0.15.0). In future blogs, we will report DeepNVMe improvements for other I/O bound DL applications such as model checkpointing and data loading. +In this blog post, we introduced DeepNVMe, an I/O optimization technology created to tackle the emergence of I/O operations as key bottlenecks of Deep Learning scalability. DeepNVMe enables fast and efficient data transfers between persistent storage and DL application memory through optimizations built on popular storage technologies such as NVMe SSDs and NVIDIA GDS. We showed benefits of using DeepNVMe for LLAMA3-70B token generation on single A100-80GB GPU with NVMe offloading, for which it achieves up to 7 tokens per second in generation throughput on an Azure NC96ads\_A100\_v4 VM. DeepNVMe will be open-sourced and generally available in DeepSpeed versions >= [0.15.0](https://github.com/deepspeedai/DeepSpeed/releases/tag/v0.15.0). In future blogs, we will report DeepNVMe improvements for other I/O bound DL applications such as model checkpointing and data loading. # Acknowlegements diff --git a/blogs/deepspeed-gds/japanese/README.md b/blogs/deepspeed-gds/japanese/README.md index 8d65d5225b16..26320d00ab94 100644 --- a/blogs/deepspeed-gds/japanese/README.md +++ b/blogs/deepspeed-gds/japanese/README.md @@ -70,7 +70,7 @@ LLAMA3-70Bモデルの推論を単一のNVIDIA A100-80GBで、プロンプト長 # まとめ -このブログ記事では、深層学習のスケーラビリティにおいて主要なボトルネックとなるI/O操作を最適化する、DeepNVMeを紹介しました。DeepNVMeは、NVMe SSDやNVIDIA GDSなどのストレージ技術に基づいた最適化を通じて、永続ストレージと深層学習アプリケーションのデータ転送を高速かつ効率的に実現します。Azure NC96ads_A100_v4 VMでの単一A100-80GB GPUを使用したLLAMA3-70Bトークン生成において、DeepNVMeを使用することで、NVMeオフロードで最大7トークン/秒の生成スループットを達成しました。DeepNVMeはオープンソース化され、DeepSpeedバージョン[0.15.0](https://github.com/microsoft/DeepSpeed/releases/tag/v0.15.0).以上で利用可能です。今後のブログでは、モデルチェックポイントやデータロードなどの他のI/Oがボトルネックとなる深層学習アプリケーションに対するDeepNVMeの改善について報告します。 +このブログ記事では、深層学習のスケーラビリティにおいて主要なボトルネックとなるI/O操作を最適化する、DeepNVMeを紹介しました。DeepNVMeは、NVMe SSDやNVIDIA GDSなどのストレージ技術に基づいた最適化を通じて、永続ストレージと深層学習アプリケーションのデータ転送を高速かつ効率的に実現します。Azure NC96ads_A100_v4 VMでの単一A100-80GB GPUを使用したLLAMA3-70Bトークン生成において、DeepNVMeを使用することで、NVMeオフロードで最大7トークン/秒の生成スループットを達成しました。DeepNVMeはオープンソース化され、DeepSpeedバージョン[0.15.0](https://github.com/deepspeedai/DeepSpeed/releases/tag/v0.15.0).以上で利用可能です。今後のブログでは、モデルチェックポイントやデータロードなどの他のI/Oがボトルネックとなる深層学習アプリケーションに対するDeepNVMeの改善について報告します。 # 謝辞 diff --git a/blogs/deepspeed-offloadpp/README.md b/blogs/deepspeed-offloadpp/README.md index 62587354309c..f58173b7bc8b 100644 --- a/blogs/deepspeed-offloadpp/README.md +++ b/blogs/deepspeed-offloadpp/README.md @@ -43,7 +43,7 @@ We conduct our performance evaluations over both A100 and H100 DGX machine and t ## Tutorials -Examples and Tutorials are [here](https://github.com/microsoft/Megatron-DeepSpeed/blob/main/examples_deepspeed/offload_pp/README.md) +Examples and Tutorials are [here](https://github.com/deepspeedai/Megatron-DeepSpeed/blob/main/examples_deepspeed/offload_pp/README.md) ## Contributors: diff --git a/blogs/deepspeed-triton/README.md b/blogs/deepspeed-triton/README.md index 91803f3faf2f..57922c5e1a23 100644 --- a/blogs/deepspeed-triton/README.md +++ b/blogs/deepspeed-triton/README.md @@ -65,7 +65,7 @@ We use an example of Bert-base here. ```python pip install deepspeed[triton] -git clone https://github.com/microsoft/DeepSpeedExamples.git +git clone https://github.com/deepspeedai/DeepSpeedExamples.git cd DeepSpeedExamples/inference/huggingface/fill-mask deepspeed --num_gpus 1 test-bert.py --triton @@ -76,7 +76,7 @@ To run a performance benchmark, you can use the following command: ```python pip install deepspeed[triton] -git clone https://github.com/microsoft/DeepSpeedExamples.git +git clone https://github.com/deepspeedai/DeepSpeedExamples.git cd DeepSpeedExamples/benchmarks/inference deepspeed --num_gpus 1 triton-bert-benchmark.py --model bert-base-cased --dtype fp16 --kernel-inject --deepspeed --graphs --triton @@ -84,7 +84,7 @@ deepspeed --num_gpus 1 triton-bert-benchmark.py --model bert-base-cased --dtype # NOTE -* For more information on how to use DeepSpeed, please visit our [GitHub Page](https://github.com/microsoft/DeepSpeedExamples) and our [website](https://www.deepspeed.ai/), where you can find blog posts, tutorials, and documentation. +* For more information on how to use DeepSpeed, please visit our [GitHub Page](https://github.com/deepspeedai/DeepSpeedExamples) and our [website](https://www.deepspeed.ai/), where you can find blog posts, tutorials, and documentation. * This feature is currently only supported for BERT, Roberta and other BERT-like models, and not for text-generation models yet. diff --git a/blogs/deepspeed-ucp/README.md b/blogs/deepspeed-ucp/README.md index abd5b4ca017d..f8b5c6fb87e7 100644 --- a/blogs/deepspeed-ucp/README.md +++ b/blogs/deepspeed-ucp/README.md @@ -245,8 +245,8 @@ iteration 501 with a new Target TP=PP=DP=2. We are excited to release DeepSpeed Universal Checkpoint. DeepSpeed Universal Checkpoint is available in DeepSpeed versions >= -[0.14.4](https://github.com/microsoft/DeepSpeed/releases/tag/v0.14.4), -has been fully integrated with [Megatron-DeepSpeed](https://github.com/microsoft/Megatron-DeepSpeed) ([commit c3a13be](https://github.com/microsoft/Megatron-DeepSpeed/commit/c3a13be721da0d0de16c338d0d665b0f7d13d14f)). +[0.14.4](https://github.com/deepspeedai/DeepSpeed/releases/tag/v0.14.4), +has been fully integrated with [Megatron-DeepSpeed](https://github.com/deepspeedai/Megatron-DeepSpeed) ([commit c3a13be](https://github.com/deepspeedai/Megatron-DeepSpeed/commit/c3a13be721da0d0de16c338d0d665b0f7d13d14f)). Detailed tutorial on usage is available on [DeepSpeed tutorial page](https://www.deepspeed.ai/tutorials/universal-checkpointing/). diff --git a/blogs/deepspeed-ulysses/README.md b/blogs/deepspeed-ulysses/README.md index 375eb1190325..8ed573916ff4 100644 --- a/blogs/deepspeed-ulysses/README.md +++ b/blogs/deepspeed-ulysses/README.md @@ -367,4 +367,4 @@ on X, formerly Twitter, ([English](https://twitter.com/MSFTDeepSpeed), [Japanese We are open to collaborations with universities, research labs, and companies. For such requests (and other requests unsuitable for GitHub), please directly email to . If you like -our work, please "Star" our [repo](https://github.com/microsoft/DeepSpeed). +our work, please "Star" our [repo](https://github.com/deepspeedai/DeepSpeed). diff --git a/blogs/deepspeed-ulysses/japanese/README.md b/blogs/deepspeed-ulysses/japanese/README.md index 88a0e375ce70..1d9ed1e3a1d2 100644 --- a/blogs/deepspeed-ulysses/japanese/README.md +++ b/blogs/deepspeed-ulysses/japanese/README.md @@ -155,4 +155,4 @@ DeepSpeed-Ulyssesは、DeepSpeedのGitHubを通じてアクセス可能です。 長いコンテキストを扱う際の制約を取り除くことによって何が可能になるのか、ユーザの皆様と共に様々な可能性を探求するため、幅広い協力やコラボレーションを歓迎します。DeepSpeed-Ulyssesは、大規模なAIの訓練と推論のためのより大きなDeepSpeedエコシステムの一部です。DeepSpeedの多くの技術や革新的な機能の詳細については、[ウェブサイト](https://www.deepspeed.ai/)をご覧いただくか、X(以前のTwitter。[英語版](https://twitter.com/MSFTDeepSpeed)、[日本語版](https://twitter.com/MSFTDeepSpeedJP))や、中国の[Zhihu](https://www.zhihu.com/people/deepspeed)でフォローしてください。 -DeepSpeedは、皆様の開発への参加を歓迎しています。DeepSpeedのGitHubページで、バグ報告、Pull Request、ディスカッションへの参加が可能です。詳細は[ガイドライン](https://github.com/microsoft/DeepSpeed/blob/master/CONTRIBUTING.md)をご覧ください。また、大学、研究所、企業とのコラボレーションも行っています。こうしたコラボレーションについてのご要望(およびGitHubには適さないその他の話題)については まで直接メールをお送りください。 +DeepSpeedは、皆様の開発への参加を歓迎しています。DeepSpeedのGitHubページで、バグ報告、Pull Request、ディスカッションへの参加が可能です。詳細は[ガイドライン](https://github.com/deepspeedai/DeepSpeed/blob/master/CONTRIBUTING.md)をご覧ください。また、大学、研究所、企業とのコラボレーションも行っています。こうしたコラボレーションについてのご要望(およびGitHubには適さないその他の話題)については まで直接メールをお送りください。 diff --git a/blogs/deepspeed-visualchat/10-03-2023/README-Chinese.md b/blogs/deepspeed-visualchat/10-03-2023/README-Chinese.md index e91ff1ecd51e..d4cba8b46560 100644 --- a/blogs/deepspeed-visualchat/10-03-2023/README-Chinese.md +++ b/blogs/deepspeed-visualchat/10-03-2023/README-Chinese.md @@ -146,7 +146,7 @@ DeepSpeed-VisualChat 是一个易于使用的训练框架,具有很好的可 使用 DeepSpeed-VisualChat 训练模型是简单和方便的。这里我们给出了基于 CLIP 视觉编码器和 LLaMa-7B 模型的一个例子: ``` -git clone https://github.com/microsoft/DeepSpeedExamples.git +git clone https://github.com/deepspeedai/DeepSpeedExamples.git cd DeepSpeedExamples/applications/DeepSpeed-VisualChat/ pip install -r requirements.txt cd training @@ -161,21 +161,21 @@ bash chat_scripts/run.sh # You need to change necessary variables, e.g, ckpt pat 为了支持更大的模型推理,我们已经将 Hugging Face 大模型推理集成到我们的 DeepSpeed-VisualChat API 中。因此,用户可以根据 GPU 内存容量和模型大小选择不同数量的 GPU。 -请参考我们的 [GitHub 主页](https://github.com/microsoft/DeepSpeedExamples/tree/master/applications/DeepSpeed-VisualChat) 了解更多细节。 +请参考我们的 [GitHub 主页](https://github.com/deepspeedai/DeepSpeedExamples/tree/master/applications/DeepSpeed-VisualChat) 了解更多细节。 # 7. 发布:今天尝试 DeepSpeed-VisualChat! 我们非常兴奋地分享 DeepSpeed-VisualChat 现已开源并供 AI 社区使用。 -* 要开始使用,请访问我们的 DeepSpeed-VisualChat GitHub 页面:[GitHub 主页](https://github.com/microsoft/DeepSpeedExamples/tree/master/applications/DeepSpeed-VisualChat) +* 要开始使用,请访问我们的 DeepSpeed-VisualChat GitHub 页面:[GitHub 主页](https://github.com/deepspeedai/DeepSpeedExamples/tree/master/applications/DeepSpeed-VisualChat) -* 我们将继续在您的反馈和支持下改进 DeepSpeed-VisualChat。我们的 [路线图](https://github.com/microsoft/DeepSpeedExamples/tree/master/applications/DeepSpeed-VisualChat/README.md#-deepspeed-visualchats-roadmap-) 显示了目前支持的功能以及未来计划支持的功能。 +* 我们将继续在您的反馈和支持下改进 DeepSpeed-VisualChat。我们的 [路线图](https://github.com/deepspeedai/DeepSpeedExamples/tree/master/applications/DeepSpeed-VisualChat/README.md#-deepspeed-visualchats-roadmap-) 显示了目前支持的功能以及未来计划支持的功能。 DeepSpeed-VisualChat 是更大的 DeepSpeed 生态系统的一部分,其中包括一系列深度学习系统和建模技术。要了解更多信息, * 请访问我们的 [网站](https://www.deepspeed.ai/) 了解详细的博客文章、教程和文档。 * 在我们的 [英文 X(Twitter)](https://twitter.com/MSFTDeepSpeed)、[日语 X(Twitter)](https://twitter.com/MSFTDeepSpeedJP) 和 [中文知乎](https://www.zhihu.com/people/deepspeed) 上关注我们,以获取 DeepSpeed 的最新消息。 -我们欢迎您为 DeepSpeed 做出贡献!我们鼓励您报告问题、贡献 PRs、并在 [DeepSpeed GitHub](https://github.com/microsoft/DeepSpeed/) 页面上参加讨论。有关更多详细信息,请查看我们的 [贡献指南](https://github.com/microsoft/DeepSpeed/blob/master/CONTRIBUTING.md)。我们对与大学、研究实验室、公司等进行合作持开放态度,例如共同进行深度学习研究、应用 DeepSpeed 为现实世界的 AI 模型和应用提供支持等等。对于此类请求(以及其他不适合 GitHub 的请求),请直接发送电子邮件至 deepspeed-info@microsoft.com。 +我们欢迎您为 DeepSpeed 做出贡献!我们鼓励您报告问题、贡献 PRs、并在 [DeepSpeed GitHub](https://github.com/deepspeedai/DeepSpeed/) 页面上参加讨论。有关更多详细信息,请查看我们的 [贡献指南](https://github.com/deepspeedai/DeepSpeed/blob/master/CONTRIBUTING.md)。我们对与大学、研究实验室、公司等进行合作持开放态度,例如共同进行深度学习研究、应用 DeepSpeed 为现实世界的 AI 模型和应用提供支持等等。对于此类请求(以及其他不适合 GitHub 的请求),请直接发送电子邮件至 deepspeed-info@microsoft.com。 -* 如果你喜欢我们的工作,请在 [DeepSpeed GitHub](https://github.com/microsoft/DeepSpeed/) 和 [DeepSpeedExamples GitHub](https://github.com/microsoft/DeepSpeedExamples/) 上为我们的仓库点“星”。 +* 如果你喜欢我们的工作,请在 [DeepSpeed GitHub](https://github.com/deepspeedai/DeepSpeed/) 和 [DeepSpeedExamples GitHub](https://github.com/deepspeedai/DeepSpeedExamples/) 上为我们的仓库点“星”。 diff --git a/blogs/deepspeed-visualchat/10-03-2023/README-Japanese.md b/blogs/deepspeed-visualchat/10-03-2023/README-Japanese.md index 9aec568b501b..b6c12787778c 100755 --- a/blogs/deepspeed-visualchat/10-03-2023/README-Japanese.md +++ b/blogs/deepspeed-visualchat/10-03-2023/README-Japanese.md @@ -152,7 +152,7 @@ DeepSpeed-VisualChatは使いやすく、かつ優れたスケーラビリティ DeepSpeed-VisualChatの訓練は簡単かつ便利に実行できます。ここではCLIPビジュアルエンコーダーとLLaMa-7Bモデルを使用する例を示します: ``` -git clone https://github.com/microsoft/DeepSpeedExamples.git +git clone https://github.com/deepspeedai/DeepSpeedExamples.git cd DeepSpeedExamples/applications/DeepSpeed-VisualChat/ pip install -r requirements.txt cd training @@ -168,21 +168,21 @@ bash chat_scripts/run.sh # You need to change necessary variables, e.g, ckpt pat より大規模なモデル推論をサポートするために、我々はHugging Faceの大規模モデル推論をDeepSpeed-VisualChat APIに組み込みました。そのため、ユーザーはGPUメモリ容量とモデルサイズに基づいて、異なるGPU数を選択することができます。 -詳細は[ランディングページ](https://github.com/microsoft/DeepSpeedExamples/tree/master/applications/DeepSpeed-VisualChat)をご参照ください。 +詳細は[ランディングページ](https://github.com/deepspeedai/DeepSpeedExamples/tree/master/applications/DeepSpeed-VisualChat)をご参照ください。 # 7. 早速使ってみましょう! DeepSpeed-VisualChatがオープンソース化され、AIコミュニティで利用できるようになったことを大変嬉しく思います。 -* まずは、DeepSpeed-VisualChatのGitHubページをご覧ください: [GitHubランディングページ](https://github.com/microsoft/DeepSpeedExamples/tree/master/applications/DeepSpeed-VisualChat) +* まずは、DeepSpeed-VisualChatのGitHubページをご覧ください: [GitHubランディングページ](https://github.com/deepspeedai/DeepSpeedExamples/tree/master/applications/DeepSpeed-VisualChat) -* DeepSpeed-VisualChatは、皆様からのフィードバックとサポートにより改良を続けていきます。私たちの[ロードマップ](https://github.com/microsoft/DeepSpeedExamples/tree/master/applications/DeepSpeed-VisualChat/README.md#-deepspeed-visualchats-roadmap-)は、現在サポートされている機能と将来的に計画している機能を示しています。 +* DeepSpeed-VisualChatは、皆様からのフィードバックとサポートにより改良を続けていきます。私たちの[ロードマップ](https://github.com/deepspeedai/DeepSpeedExamples/tree/master/applications/DeepSpeed-VisualChat/README.md#-deepspeed-visualchats-roadmap-)は、現在サポートされている機能と将来的に計画している機能を示しています。 DeepSpeed-VisualChatは、さまざまなDeep Learningシステムやモデリング技術を含む、より大きなDeepSpeedエコシステムの一部です。詳細については、以下をご覧ください。 * 私たちの[ウェブサイト](https://www.deepspeed.ai/)で、詳細なブログ記事、チュートリアル、役立つドキュメントを提供しています。 * DeepSpeedの最新ニュースは、[English X(Twitter)](https://twitter.com/MSFTDeepSpeed)、[Japanese X(Twitter)](https://twitter.com/MSFTDeepSpeedJP)、[Chinese Zhihu](https://www.zhihu.com/people/deepspeed)をフォローしてください。 -DeepSpeedは、皆様の開発への参加を歓迎しています。DeepSpeedのGitHubページで、バグ報告、Pull Request、ディスカッションへの参加が可能です。詳細は[ガイドライン](https://github.com/microsoft/DeepSpeed/blob/master/CONTRIBUTING.md)をご覧ください。また、大学、研究所、企業とのコラボレーションも行っています。こうしたコラボレーションについてのご要望(およびGitHubには適さないその他の話題)については まで直接メールをお送りください。 +DeepSpeedは、皆様の開発への参加を歓迎しています。DeepSpeedのGitHubページで、バグ報告、Pull Request、ディスカッションへの参加が可能です。詳細は[ガイドライン](https://github.com/deepspeedai/DeepSpeed/blob/master/CONTRIBUTING.md)をご覧ください。また、大学、研究所、企業とのコラボレーションも行っています。こうしたコラボレーションについてのご要望(およびGitHubには適さないその他の話題)については まで直接メールをお送りください。 -* 私たちの[DeepSpeed GitHub](https://github.com/microsoft/DeepSpeed/)および[DeepSpeedExamples GitHub](https://github.com/microsoft/DeepSpeedExamples/)リポジトリが気に入ったら、ぜひスターをつけてください! +* 私たちの[DeepSpeed GitHub](https://github.com/deepspeedai/DeepSpeed/)および[DeepSpeedExamples GitHub](https://github.com/deepspeedai/DeepSpeedExamples/)リポジトリが気に入ったら、ぜひスターをつけてください! diff --git a/blogs/deepspeed-visualchat/10-03-2023/README.md b/blogs/deepspeed-visualchat/10-03-2023/README.md index 98f9f298ea5a..b2bbb08de50e 100755 --- a/blogs/deepspeed-visualchat/10-03-2023/README.md +++ b/blogs/deepspeed-visualchat/10-03-2023/README.md @@ -153,7 +153,7 @@ DeepSpeed-VisualChat is an easy-to-use training framework with great scalability The training experience of DeepSpeed-VisualChat is straightforward and convenient. Here we give an example based on the CLIP visual encoder and the LLaMa-7B model: ``` -git clone https://github.com/microsoft/DeepSpeedExamples.git +git clone https://github.com/deepspeedai/DeepSpeedExamples.git cd DeepSpeedExamples/applications/DeepSpeed-VisualChat/ pip install -r requirements.txt cd training @@ -167,15 +167,15 @@ bash chat_scripts/run.sh # You need to change necessary variables, e.g, ckpt pat ``` To support larger model inference, we have incorporated Hugging Face large model inference into our DeepSpeed-VisualChat API. Therefore, users can choose a different number of GPUs based on the GPU memory capacity and the model size. -Please refer to our [GitHub Landing Page](https://github.com/microsoft/DeepSpeedExamples/tree/master/applications/DeepSpeed-VisualChat) for more details. +Please refer to our [GitHub Landing Page](https://github.com/deepspeedai/DeepSpeedExamples/tree/master/applications/DeepSpeed-VisualChat) for more details. # 7. Release: Try DeepSpeed-VisualChat today! We are very excited to share that DeepSpeed-VisualChat is now open-sourced and available to the AI community. -* To get started, please visit our GitHub page for DeepSpeed-VisualChat: [GitHub Landing Page](https://github.com/microsoft/DeepSpeedExamples/tree/master/applications/DeepSpeed-VisualChat) +* To get started, please visit our GitHub page for DeepSpeed-VisualChat: [GitHub Landing Page](https://github.com/deepspeedai/DeepSpeedExamples/tree/master/applications/DeepSpeed-VisualChat) -* We will continue to improve DeepSpeed-VisualChat with your feedback and support. Our [roadmap](https://github.com/microsoft/DeepSpeedExamples/tree/master/applications/DeepSpeed-VisualChat/README.md#-deepspeed-visualchats-roadmap-) shows currently supported features as well as ones that are planned for the future. +* We will continue to improve DeepSpeed-VisualChat with your feedback and support. Our [roadmap](https://github.com/deepspeedai/DeepSpeedExamples/tree/master/applications/DeepSpeed-VisualChat/README.md#-deepspeed-visualchats-roadmap-) shows currently supported features as well as ones that are planned for the future. DeepSpeed-VisualChat is a component of the larger DeepSpeed ecosystem, which includes a range of Deep Learning systems and modeling technologies. To learn more, @@ -183,6 +183,6 @@ DeepSpeed-VisualChat is a component of the larger DeepSpeed ecosystem, which inc * Please visit our [website](https://www.deepspeed.ai/) for detailed blog posts, tutorials, and helpful documentation. * Follow us on our [English X(Twitter)](https://twitter.com/MSFTDeepSpeed), [Japanese X(Twitter)](https://twitter.com/MSFTDeepSpeedJP), and [Chinese Zhihu](https://www.zhihu.com/people/deepspeed) for latest news on DeepSpeed. -We welcome your contributions to DeepSpeed! We encourage you to report issues, contribute PRs, and join discussions on the [DeepSpeed GitHub](https://github.com/microsoft/DeepSpeed/) page. Please see our [contributing guide](https://github.com/microsoft/DeepSpeed/blob/master/CONTRIBUTING.md) for more details. We are open to collaborations with universities, research labs, companies, such as those working together on deep learning research, applying DeepSpeed to empower real-world AI models and applications, and so on. For such requests (and other requests unsuitable for GitHub), please directly email to deepspeed-info@microsoft.com. +We welcome your contributions to DeepSpeed! We encourage you to report issues, contribute PRs, and join discussions on the [DeepSpeed GitHub](https://github.com/deepspeedai/DeepSpeed/) page. Please see our [contributing guide](https://github.com/deepspeedai/DeepSpeed/blob/master/CONTRIBUTING.md) for more details. We are open to collaborations with universities, research labs, companies, such as those working together on deep learning research, applying DeepSpeed to empower real-world AI models and applications, and so on. For such requests (and other requests unsuitable for GitHub), please directly email to deepspeed-info@microsoft.com. -* "Star" our [DeepSpeed GitHub](https://github.com/microsoft/DeepSpeed/) and [DeepSpeedExamples GitHub](https://github.com/microsoft/DeepSpeedExamples/) repositories if you like our work! +* "Star" our [DeepSpeed GitHub](https://github.com/deepspeedai/DeepSpeed/) and [DeepSpeedExamples GitHub](https://github.com/deepspeedai/DeepSpeedExamples/) repositories if you like our work! diff --git a/blogs/deepspeed4science/chinese/README.md b/blogs/deepspeed4science/chinese/README.md index dabc4ab077f2..d3bebfec598f 100644 --- a/blogs/deepspeed4science/chinese/README.md +++ b/blogs/deepspeed4science/chinese/README.md @@ -123,11 +123,11 @@ DeepSpeed4Science的旅程始于两个开创性的基于LLM的结构生物学研 *图9:由不同框架在不同规模下支持的两个GenSLMs模型的最大序列长度。使用NVIDIA DGX,每个节点有八个40G A100 GPU。*
    -具体在系统层面,我们发布了包括[长序列支持和其他新优化](https://github.com/microsoft/Megatron-DeepSpeed/tree/main/examples_deepspeed/deepspeed4science/megatron_long_seq_support)的最新的[Megatron-DeepSpeed框架](https://github.com/microsoft/Megatron-DeepSpeed)。科学家现在可以通过我们新添加的内存优化技术(如注意力掩码异步处理和位置码分割)、张量并行、流水线并行、序列并行、基于ZeRO的数据并行和模型状态异步处理等技术的协同组合,用更长的序列训练他们的GenSLMs等大型科学模型。图9展示了我们的新版本使GenSLMs的25B和33B模型的最长序列长度分别比之前的Megatron-DeepSpeed版本增加了12倍和14倍。在支持的序列长度方面,这个新Megatron-DeepSpeed框架也显著地超过了NVIDIA的Megatron-LM(对于25B和33B模型分别高达9.8倍和9.1倍)。例如,阿贡实验室团队的GenSLMs 25B模型在64个GPU上的原始序列长度为42K,而现在可以用512K的核苷酸序列进行训练。这在不损失准确性的条件下大大提高了模型质量和科学发现的范围。对于那些更喜欢相对位置编码技术这样的算法策略的领域科学家,这个[新版本](https://deepspeed4science.ai/2023/09/18/model-showcase-genslms/)也进行了集成。 +具体在系统层面,我们发布了包括[长序列支持和其他新优化](https://github.com/deepspeedai/Megatron-DeepSpeed/tree/main/examples_deepspeed/deepspeed4science/megatron_long_seq_support)的最新的[Megatron-DeepSpeed框架](https://github.com/deepspeedai/Megatron-DeepSpeed)。科学家现在可以通过我们新添加的内存优化技术(如注意力掩码异步处理和位置码分割)、张量并行、流水线并行、序列并行、基于ZeRO的数据并行和模型状态异步处理等技术的协同组合,用更长的序列训练他们的GenSLMs等大型科学模型。图9展示了我们的新版本使GenSLMs的25B和33B模型的最长序列长度分别比之前的Megatron-DeepSpeed版本增加了12倍和14倍。在支持的序列长度方面,这个新Megatron-DeepSpeed框架也显著地超过了NVIDIA的Megatron-LM(对于25B和33B模型分别高达9.8倍和9.1倍)。例如,阿贡实验室团队的GenSLMs 25B模型在64个GPU上的原始序列长度为42K,而现在可以用512K的核苷酸序列进行训练。这在不损失准确性的条件下大大提高了模型质量和科学发现的范围。对于那些更喜欢相对位置编码技术这样的算法策略的领域科学家,这个[新版本](https://deepspeed4science.ai/2023/09/18/model-showcase-genslms/)也进行了集成。 ## 总结和路线图 -我们非常自豪和兴奋地宣布DeepSpeed4Science计划以及几个研发亮点和成果。从今天开始,我们将在[deepspeed4science.ai](https://deepspeed4science.ai/)上介绍我们的新计划,包括关于我们的外部合作者的信息,以及当前和未来的DeepSpeed4Science技术发布。我们的一个高层次目标是推广广泛解决大规模科学发现的主要系统痛点的AI系统技术。我们希望全球的科学家们能够从DeepSpeed4Science通过开源软件解锁的新功能中受益。我们期待更好地了解阻碍您的科学发现的AI系统设计挑战。我们真诚地欢迎您的参与,帮助构建一个更有前途的AI4Science未来。请给我们发送电子邮件至。我们鼓励您在我们的[DeepSpeed GitHub](https://github.com/microsoft/DeepSpeed/)上报告问题、贡献PR、参与讨论。 +我们非常自豪和兴奋地宣布DeepSpeed4Science计划以及几个研发亮点和成果。从今天开始,我们将在[deepspeed4science.ai](https://deepspeed4science.ai/)上介绍我们的新计划,包括关于我们的外部合作者的信息,以及当前和未来的DeepSpeed4Science技术发布。我们的一个高层次目标是推广广泛解决大规模科学发现的主要系统痛点的AI系统技术。我们希望全球的科学家们能够从DeepSpeed4Science通过开源软件解锁的新功能中受益。我们期待更好地了解阻碍您的科学发现的AI系统设计挑战。我们真诚地欢迎您的参与,帮助构建一个更有前途的AI4Science未来。请给我们发送电子邮件至。我们鼓励您在我们的[DeepSpeed GitHub](https://github.com/deepspeedai/DeepSpeed/)上报告问题、贡献PR、参与讨论。 ## 致谢 diff --git a/blogs/deepspeed4science/japanese/README.md b/blogs/deepspeed4science/japanese/README.md index 276528650ab5..21b56d2dd944 100644 --- a/blogs/deepspeed4science/japanese/README.md +++ b/blogs/deepspeed4science/japanese/README.md @@ -123,11 +123,11 @@ DeepSpeed4Scienceは、構造生物学研究(タンパク質構造予測や平 *図9: 異なるスケールで異なるフレームワークがサポートする2つのGenSLMsモデルの最大シーケンス長。1ノードあたり8個の40G A100 GPUを搭載したNVIDIA DGXノードを使用。*
    -システムレベルでは、非常に長いシーケンスをサポートするための最新の[Megatron-DeepSpeedフレームワーク](https://github.com/microsoft/Megatron-DeepSpeed)を、[他の新しい最適化とともにリリースします](https://github.com/microsoft/Megatron-DeepSpeed/tree/main/examples_deepspeed/deepspeed4science/megatron_long_seq_support)。科学者は、(アテンションマスクと位置の埋め込みに関する)新しく追加されたメモリ最適化手法、テンソル並列処理、パイプライン並列処理、シーケンス並列処理、ZeROスタイルのデータ並列処理、モデル状態のオフロードなどの技術を相乗的な組み合わせにより、GenSLMsのような大規模な科学モデルをはるかに長いシーケンスで訓練できるようになりました。図9は、新しいリリースにより、GenSLMsの25Bおよび33Bモデルで、以前のMegatron-DeepSpeedよりもそれぞれ最大12倍および14倍の最長シーケンス長を処理できることを示しています。サポートされているシーケンス長に関しては、この新しいMegatron-DeepSpeedは、25Bモデルと33Bモデルでそれぞれ最大9.8倍と9.1倍でNVIDIAのMegatron-LMを大幅に上回っています。たとえば、GenSLMsの25Bモデルは、64個のGPUでのアルゴンヌチームの元の42Kシーケンス長と比較して、512Kのヌクレオチド配列で訓練できるようになりました。これにより、精度を損なうことなく、モデルの品質と科学的発見の範囲が大幅に向上します。Relative position embeddingなどのアルゴリズム戦略を必要とする科学者向けの追加サポートも、[このリリース](https://deepspeed4science.ai/2023/09/18/model-showcase-genslms/)に統合されています。 +システムレベルでは、非常に長いシーケンスをサポートするための最新の[Megatron-DeepSpeedフレームワーク](https://github.com/deepspeedai/Megatron-DeepSpeed)を、[他の新しい最適化とともにリリースします](https://github.com/deepspeedai/Megatron-DeepSpeed/tree/main/examples_deepspeed/deepspeed4science/megatron_long_seq_support)。科学者は、(アテンションマスクと位置の埋め込みに関する)新しく追加されたメモリ最適化手法、テンソル並列処理、パイプライン並列処理、シーケンス並列処理、ZeROスタイルのデータ並列処理、モデル状態のオフロードなどの技術を相乗的な組み合わせにより、GenSLMsのような大規模な科学モデルをはるかに長いシーケンスで訓練できるようになりました。図9は、新しいリリースにより、GenSLMsの25Bおよび33Bモデルで、以前のMegatron-DeepSpeedよりもそれぞれ最大12倍および14倍の最長シーケンス長を処理できることを示しています。サポートされているシーケンス長に関しては、この新しいMegatron-DeepSpeedは、25Bモデルと33Bモデルでそれぞれ最大9.8倍と9.1倍でNVIDIAのMegatron-LMを大幅に上回っています。たとえば、GenSLMsの25Bモデルは、64個のGPUでのアルゴンヌチームの元の42Kシーケンス長と比較して、512Kのヌクレオチド配列で訓練できるようになりました。これにより、精度を損なうことなく、モデルの品質と科学的発見の範囲が大幅に向上します。Relative position embeddingなどのアルゴリズム戦略を必要とする科学者向けの追加サポートも、[このリリース](https://deepspeed4science.ai/2023/09/18/model-showcase-genslms/)に統合されています。 ## まとめとロードマップ -DeepSpeed4Scienceイニシアティブを、いくつかのR&Dのハイライトや成果と共に発表できることを嬉しく思います。本日から、外部の協力者に関する情報や、現在および将来のDeepSpeed4Scienceテクノロジーリリースなど、新しいイニシアティブでの活動を[deepspeed4science.ai](https://deepspeed4science.ai/)上で進めていきます。私たちの高レベルな目標の1つは、大規模な科学的発見のための主要なシステムの問題点に広く対処するAIシステムテクノロジーを一般化することです。世界中の科学者によって、オープンソースのソフトウェアを通じてDeepSpeed4Scienceによって利用可能になる新機能が活用されることを願っています。科学的発見の障害となるAIシステム設計の課題を解決していくことを楽しみにしています。AI4Scienceの有望な未来を築くために、皆様の参加を歓迎します。お問い合わせはまでお願いします。問題の報告や、PRを通じての貢献、ディスカッションへの参加は、[DeepSpeed GitHub](https://github.com/microsoft/DeepSpeed/)でお願いします。 +DeepSpeed4Scienceイニシアティブを、いくつかのR&Dのハイライトや成果と共に発表できることを嬉しく思います。本日から、外部の協力者に関する情報や、現在および将来のDeepSpeed4Scienceテクノロジーリリースなど、新しいイニシアティブでの活動を[deepspeed4science.ai](https://deepspeed4science.ai/)上で進めていきます。私たちの高レベルな目標の1つは、大規模な科学的発見のための主要なシステムの問題点に広く対処するAIシステムテクノロジーを一般化することです。世界中の科学者によって、オープンソースのソフトウェアを通じてDeepSpeed4Scienceによって利用可能になる新機能が活用されることを願っています。科学的発見の障害となるAIシステム設計の課題を解決していくことを楽しみにしています。AI4Scienceの有望な未来を築くために、皆様の参加を歓迎します。お問い合わせはまでお願いします。問題の報告や、PRを通じての貢献、ディスカッションへの参加は、[DeepSpeed GitHub](https://github.com/deepspeedai/DeepSpeed/)でお願いします。 ## 謝辞 diff --git a/blogs/intel-inference/README.md b/blogs/intel-inference/README.md index 107e46808d2e..917117523abc 100644 --- a/blogs/intel-inference/README.md +++ b/blogs/intel-inference/README.md @@ -128,15 +128,15 @@ This work was made possible through deep collaboration between software engineer [8] Intel, "Intel® Neural Compressor," [Online]. Available: https://github.com/intel/neural-compressor. -[9] Microsoft, "DeepSpeed Accelerator Abstraction Interface," [Online]. Available: https://github.com/microsoft/DeepSpeed/blob/master/docs/_tutorials/accelerator-abstraction-interface.md. +[9] Microsoft, "DeepSpeed Accelerator Abstraction Interface," [Online]. Available: https://github.com/deepspeedai/DeepSpeed/blob/master/docs/_tutorials/accelerator-abstraction-interface.md. [10] Microsoft, "Automatic Tensor Parallelism for HuggingFace Models," [Online]. Available: https://www.deepspeed.ai/tutorials/automatic-tensor-parallelism. [11] Intel, "Intel® oneCCL Bindings for PyTorch," [Online]. Available: https://github.com/intel/torch-ccl. -[12] Microsoft, "deepspeed," [Online]. Available: https://github.com/microsoft/deepspeed. +[12] Microsoft, "deepspeed," [Online]. Available: https://github.com/deepspeedai/deepspeed. -[13] Intel, "DeepSpeed Accelerator Abstraction Interface," [Online]. Available: https://github.com/microsoft/DeepSpeed/pull/3184. +[13] Intel, "DeepSpeed Accelerator Abstraction Interface," [Online]. Available: https://github.com/deepspeedai/DeepSpeed/pull/3184. [14] Intel, "Intel® Extension for PyTorch large language model example," [Online]. Available: https://github.com/intel/intel-extension-for-pytorch/tree/llm_feature_branch/examples/cpu/inference/python/llm. diff --git a/blogs/windows/08-2024/README.md b/blogs/windows/08-2024/README.md index 8a23372a1d64..335ef473504c 100644 --- a/blogs/windows/08-2024/README.md +++ b/blogs/windows/08-2024/README.md @@ -11,7 +11,7 @@ DeepSpeed is a popular open-source deep learning optimization library that makes In this blog, we are pleased to announce some early achievements on this journey: DeepSpeed can now be installed in Windows and run natively for single-GPU training, finetuning, and inferencing. Importantly, both the installation and usage experiences are identical to those on Linux. Furthermore, the finetuning and inferencing workloads demonstrate the functioning of three critical DeepSpeed features, HuggingFace Transformers integration, LoRA support, and CPU Offloading. DeepSpeed on Windows is available in DeepSpeed versions 0.14.5 and above. In the rest of this blog, we present examples to demonstrate these achievements. # Evaluation Environment -We conducted the experiments on a Surface Laptop Studio 2 running Windows 11 Version 23H2 and Build 22631.3880. The laptop is equipped with a single NVIDIA RTX A2000 GPU with 4GB VRAM. We used Pytorch version 2.3.0 and HuggingFace Transformers version 4.41.2. The example scripts used are from the [DeepSpeedExamples repo](https://github.com/microsoft/DeepSpeedExamples), therefore you need to clone the repo before running any of the following examples. +We conducted the experiments on a Surface Laptop Studio 2 running Windows 11 Version 23H2 and Build 22631.3880. The laptop is equipped with a single NVIDIA RTX A2000 GPU with 4GB VRAM. We used Pytorch version 2.3.0 and HuggingFace Transformers version 4.41.2. The example scripts used are from the [DeepSpeedExamples repo](https://github.com/deepspeedai/DeepSpeedExamples), therefore you need to clone the repo before running any of the following examples. # Installation DeepSpeed can be installed on Windows in one of two ways. The easier way is to use the pip package manager, while the other is to build from source. The prerequisites for in both cases are Python 3.x and Pytorch with CUDA support. diff --git a/blogs/windows/08-2024/japanese/README.md b/blogs/windows/08-2024/japanese/README.md index 7e437f737f58..c2f5b9ee2143 100644 --- a/blogs/windows/08-2024/japanese/README.md +++ b/blogs/windows/08-2024/japanese/README.md @@ -12,7 +12,7 @@ DeepSpeedは、分散学習と推論を簡単かつ効率的に行うための # テスト環境 -Windows 11 Version 23H2 および Build 22631.3880 を実行している Surface Laptop Studio 2 でテストを行いました。このハードウェアには、4GBのVRAMを搭載した NVIDIA RTX A2000 GPU が1つ搭載されています。また、PyTorchバージョン 2.3.0 および HuggingFace Transformersバージョン 4.41.2 を使用しました。使用したサンプルスクリプトは[DeepSpeedExamplesリポジトリ](https://github.com/microsoft/DeepSpeedExamples)から取得できます。以下の例を実行する前にリポジトリをクローンしてください。 +Windows 11 Version 23H2 および Build 22631.3880 を実行している Surface Laptop Studio 2 でテストを行いました。このハードウェアには、4GBのVRAMを搭載した NVIDIA RTX A2000 GPU が1つ搭載されています。また、PyTorchバージョン 2.3.0 および HuggingFace Transformersバージョン 4.41.2 を使用しました。使用したサンプルスクリプトは[DeepSpeedExamplesリポジトリ](https://github.com/deepspeedai/DeepSpeedExamples)から取得できます。以下の例を実行する前にリポジトリをクローンしてください。 # インストール diff --git a/blogs/zeropp/japanese/README.md b/blogs/zeropp/japanese/README.md index a4d4e68f6b02..1e5ef91a035f 100644 --- a/blogs/zeropp/japanese/README.md +++ b/blogs/zeropp/japanese/README.md @@ -176,7 +176,7 @@ DeepSpeed-ZeRO++は、DeepSpeedエコシステムの一部です。詳細につ また、[英語版Twitter](https://twitter.com/MSFTDeepSpeed)、[日本語版Twitter](https://twitter.com/MSFTDeepSpeedJP)、[中国語版Zhihuアカウント](https://www.zhihu.com/people/deepspeed)でも最新のDeepSpeedニュースを発信しています。 -DeepSpeedは、皆様の開発への参加を歓迎しています。DeepSpeedのGitHubページで、バグ報告、Pull Request、ディスカッションへの参加が可能です。詳細は[ガイドライン](https://github.com/microsoft/DeepSpeed/blob/master/CONTRIBUTING.md)をご覧ください。また、大学、研究所、企業とのコラボレーションも行っています。こうしたコラボレーションについてのご要望(およびGitHubには適さないその他の話題)については まで直接メールをお送りください。 +DeepSpeedは、皆様の開発への参加を歓迎しています。DeepSpeedのGitHubページで、バグ報告、Pull Request、ディスカッションへの参加が可能です。詳細は[ガイドライン](https://github.com/deepspeedai/DeepSpeed/blob/master/CONTRIBUTING.md)をご覧ください。また、大学、研究所、企業とのコラボレーションも行っています。こうしたコラボレーションについてのご要望(およびGitHubには適さないその他の話題)については まで直接メールをお送りください。 **Contributors:** diff --git a/deepspeed/autotuning/README.md b/deepspeed/autotuning/README.md index fc76ed1e9f8d..1a9adfede948 100755 --- a/deepspeed/autotuning/README.md +++ b/deepspeed/autotuning/README.md @@ -214,7 +214,7 @@ If `"stage"` is not defined or set as `"all"`, then the overwriting applies to a Currently, the DeepSpeed Autotuner does not tune offloading behaviors but instead uses the values defined in the offload section of the DeepSpeed configuration file. See [Parameter offloading](https://www.deepspeed.ai/docs/config-json/#parameter-offloading) and [Optimizer offloading](https://www.deepspeed.ai/docs/config-json/#optimizer-offloading) for details. -If using NVME for offloading, users can run a benchmark offline to select the optimal `aio` setup in DeepSpeed. Refer to [profiling NVMe and configuring aio param section](https://github.com/microsoft/DeepSpeed/issues/998). +If using NVME for offloading, users can run a benchmark offline to select the optimal `aio` setup in DeepSpeed. Refer to [profiling NVMe and configuring aio param section](https://github.com/deepspeedai/DeepSpeed/issues/998). ## Autotuning Output @@ -342,7 +342,7 @@ In DeepSpeed Autotuning, if the user-provided DeepSpeed configuration file has " ## GPT2-large Example -This section shows an example of using DeepSpeed autotuning. For more examples, refer to [autotuning](https://github.com/microsoft/DeepSpeedExamples/tree/master/autotuning) in the DeepSpeedExamples repo. +This section shows an example of using DeepSpeed autotuning. For more examples, refer to [autotuning](https://github.com/deepspeedai/DeepSpeedExamples/tree/master/autotuning) in the DeepSpeedExamples repo. Example training script: @@ -412,4 +412,4 @@ Notation: Hugging Face (HF), DeepSpeed (DS), ZeRO stage (z), gradient accumulati | ---------- | -------------------- | ------------------------ | ------------------------------ | | GPT2-large | 27.874 (mbs = 1) | 56.797 (z = 1, mbs = 2), | 69.061 (z = 1, mbs = 3) | -As we can see the DeepSpeed Autotuner can select a better than hand-tuned configuration with a reasonable number of experiments. Examples in [Autotuning Hugging Face Examples](https://github.com/microsoft/DeepSpeedExamples/tree/master/autotuning/hf#autotuning-hugging-face-examples) would demonstrate the effectiveness of autotuning across different models. +As we can see the DeepSpeed Autotuner can select a better than hand-tuned configuration with a reasonable number of experiments. Examples in [Autotuning Hugging Face Examples](https://github.com/deepspeedai/DeepSpeedExamples/tree/master/autotuning/hf#autotuning-hugging-face-examples) would demonstrate the effectiveness of autotuning across different models. diff --git a/deepspeed/inference/engine.py b/deepspeed/inference/engine.py index be6336d02a19..3089d0c557a4 100755 --- a/deepspeed/inference/engine.py +++ b/deepspeed/inference/engine.py @@ -594,7 +594,7 @@ def _generate(self, *inputs, **kwargs): if num_beams > 1: raise NotImplementedError("DeepSpeed does not support `num_beams` > 1, if this is important to you please " - "add your request to: https://github.com/microsoft/DeepSpeed/issues/2506") + "add your request to: https://github.com/deepspeedai/DeepSpeed/issues/2506") if ("input_ids" in kwargs) and (kwargs["input_ids"].dim() == 2): for input_tensor in kwargs["input_ids"]: diff --git a/deepspeed/inference/v2/engine_factory.py b/deepspeed/inference/v2/engine_factory.py index 314f7f2f0485..9c3188dfebb8 100644 --- a/deepspeed/inference/v2/engine_factory.py +++ b/deepspeed/inference/v2/engine_factory.py @@ -100,7 +100,7 @@ def build_hf_engine(path: str, if model_config.model_type == "opt": if not model_config.do_layer_norm_before: raise ValueError( - "Detected OPT-350m model. This model is not currently supported. If this is not the 350m model, please open an issue: https://github.com/microsoft/DeepSpeed-MII/issues" + "Detected OPT-350m model. This model is not currently supported. If this is not the 350m model, please open an issue: https://github.com/deepspeedai/DeepSpeed-MII/issues" ) policy = OPTPolicy(model_config, checkpoint_engine=checkpoint_engine) elif model_config.model_type == "llama": diff --git a/deepspeed/module_inject/containers/features/meta_tensor.py b/deepspeed/module_inject/containers/features/meta_tensor.py index 5fb55bc74339..57b136663be3 100644 --- a/deepspeed/module_inject/containers/features/meta_tensor.py +++ b/deepspeed/module_inject/containers/features/meta_tensor.py @@ -60,7 +60,7 @@ def load_params(self, module, sd, weight_quantizer, mp_replace, prefix): layer of the model for searching the parameter's name in a checkpoint file. For more information of how this is used please see - https://github.com/microsoft/DeepSpeed/blob/master/deepspeed/module_inject/load_checkpoint.py + https://github.com/deepspeedai/DeepSpeed/blob/master/deepspeed/module_inject/load_checkpoint.py 2. `split_qkv` (Default: True): we use this flag when splitting the qkv parameter into heads. If it is False, it means the heads of q, k, and v are stored together and needs to split in the diff --git a/deepspeed/module_inject/replace_module.py b/deepspeed/module_inject/replace_module.py index 32c88549c821..26d242d33e2f 100644 --- a/deepspeed/module_inject/replace_module.py +++ b/deepspeed/module_inject/replace_module.py @@ -644,7 +644,7 @@ def replace_module(model, orig_class, replace_fn, _replace_policy, checkpoint=No policy.update({plcy._orig_layer_class: (replace_fn, plcy)}) assert len(policy.items()) > 0,\ "No default policy found! Please specify your policy injection_policy (like {BertLayer:HFBEertLayerPolicy})." +\ - "You can find some samples here: https://github.com/microsoft/DeepSpeed/blob/master/deepspeed/module_inject/replace_policy.py" + "You can find some samples here: https://github.com/deepspeedai/DeepSpeed/blob/master/deepspeed/module_inject/replace_policy.py" replaced_module, _ = _replace_module(model, policy, state_dict=sd) return replaced_module diff --git a/deepspeed/moe/sharded_moe.py b/deepspeed/moe/sharded_moe.py index 340bc82de508..a00d694fbc14 100644 --- a/deepspeed/moe/sharded_moe.py +++ b/deepspeed/moe/sharded_moe.py @@ -43,7 +43,7 @@ try: # To enable Tutel MoE optimizations: - # python3 -m pip install --user --upgrade git+https://github.com/microsoft/tutel@v0.1.x + # python3 -m pip install --user --upgrade git+https://github.com/deepspeedai/tutel@v0.1.x from tutel import moe as tutel_moe TUTEL_INSTALLED = True except: diff --git a/deepspeed/ops/sparse_attention/bert_sparse_self_attention.py b/deepspeed/ops/sparse_attention/bert_sparse_self_attention.py index e25621bd0977..37f065e48631 100755 --- a/deepspeed/ops/sparse_attention/bert_sparse_self_attention.py +++ b/deepspeed/ops/sparse_attention/bert_sparse_self_attention.py @@ -8,7 +8,7 @@ class BertSparseSelfAttention(nn.Module): - """Implements Sparse Self Attention layer of Bert model based on https://github.com/microsoft/DeepSpeedExamples/blob/master/bing_bert/nvidia/modelingpreln.py#L373 + """Implements Sparse Self Attention layer of Bert model based on https://github.com/deepspeedai/DeepSpeedExamples/blob/master/bing_bert/nvidia/modelingpreln.py#L373 For more information please see, TODO DeepSpeed Sparse Transformer. diff --git a/deepspeed/profiling/flops_profiler/README.md b/deepspeed/profiling/flops_profiler/README.md index 82011eb68568..68ac3dc285c7 100644 --- a/deepspeed/profiling/flops_profiler/README.md +++ b/deepspeed/profiling/flops_profiler/README.md @@ -178,7 +178,7 @@ When using DeepSpeed for model training, the profiler can be configured in the d #### Example: Megatron-LM -For information on running Megatron-LM with DeepSpeed, please refer to our tutorial [Megatron-LM](https://github.com/microsoft/DeepSpeedExamples/tree/master/Megatron-LM). +For information on running Megatron-LM with DeepSpeed, please refer to our tutorial [Megatron-LM](https://github.com/deepspeedai/DeepSpeedExamples/tree/master/Megatron-LM). An example output of 12-layer Megatron-LM model (`hidden_size = 8192, num_attention_heads = 32, batch_size = 1024, seq_length = 1024`) is shown below. diff --git a/deepspeed/runtime/comm/coalesced_collectives.py b/deepspeed/runtime/comm/coalesced_collectives.py index c2fa907d7dbb..2fadce52222c 100644 --- a/deepspeed/runtime/comm/coalesced_collectives.py +++ b/deepspeed/runtime/comm/coalesced_collectives.py @@ -45,7 +45,7 @@ def all_to_all_quant_reduce(tensors: List[Tensor], groups: {}) -> List[Tensor]: elif tensor.numel() % (2 * global_world_size) != 0: # Due to the constraint of 2-stage all-to-all, the input tensor must be divisible by 2 * global_world_size # Otherwise, all-to-all cannot be performed because of shape mismatch. - # See more at https://github.com/microsoft/DeepSpeed/pull/5056 + # See more at https://github.com/deepspeedai/DeepSpeed/pull/5056 logger.warning( f"qgZ falls back to reduce_scatter because tensor size = {tensor.numel()} is not divisible by (2 * global_world_size) = {2 * global_world_size}. Please consider allocating a new world to enable qgZ" ) @@ -101,7 +101,7 @@ def all_to_all_loco_quant_reduce( elif tensor.numel() % (2 * global_world_size) != 0: # Due to the constraint of 2-stage all-to-all, the input tensor must be divisible by 2 * global_world_size # Otherwise, all-to-all cannot be performed because of shape mismatch. - # See more at https://github.com/microsoft/DeepSpeed/pull/5056 + # See more at https://github.com/deepspeedai/DeepSpeed/pull/5056 logger.warning( f"qgZ falls back to reduce_scatter because tensor size = {tensor.numel()} is not divisible by (2 * global_world_size) = {2 * global_world_size}. Please consider allocating a new world to enable qgZ" ) diff --git a/deepspeed/runtime/zero/stage3.py b/deepspeed/runtime/zero/stage3.py index 697cb294d1f3..3627d4675a71 100644 --- a/deepspeed/runtime/zero/stage3.py +++ b/deepspeed/runtime/zero/stage3.py @@ -1793,7 +1793,7 @@ def get_grad_norm_direct(self, gradients, params, norm_type=2): # Sum across all model parallel GPUs. if len(grad_norms) == 0: - # FIX https://github.com/microsoft/DeepSpeed/issues/3564 + # FIX https://github.com/deepspeedai/DeepSpeed/issues/3564 total_norm_cuda = torch.tensor(0, dtype=gradients[0].dtype).to(get_accelerator().device_name()).double() else: diff --git a/docker/Dockerfile b/docker/Dockerfile index 5a62a5a01aba..263a30be27c5 100755 --- a/docker/Dockerfile +++ b/docker/Dockerfile @@ -174,7 +174,7 @@ USER deepspeed ############################################################################## # DeepSpeed ############################################################################## -RUN git clone https://github.com/microsoft/DeepSpeed.git ${STAGE_DIR}/DeepSpeed +RUN git clone https://github.com/deepspeedai/DeepSpeed.git ${STAGE_DIR}/DeepSpeed RUN cd ${STAGE_DIR}/DeepSpeed && \ git checkout . && \ git checkout master && \ diff --git a/docs/_data/navigation.yml b/docs/_data/navigation.yml index c3ebad4f86af..46875d75059b 100755 --- a/docs/_data/navigation.yml +++ b/docs/_data/navigation.yml @@ -8,7 +8,7 @@ main: - title: 'Documentation' url: https://deepspeed.readthedocs.io/ - title: 'GitHub' - url: https://github.com/microsoft/DeepSpeed + url: https://github.com/deepspeedai/DeepSpeed lnav: - title: 'Training' diff --git a/docs/_pages/deepspeed4science.md b/docs/_pages/deepspeed4science.md index b35351838f22..b1aa706ad180 100755 --- a/docs/_pages/deepspeed4science.md +++ b/docs/_pages/deepspeed4science.md @@ -24,14 +24,14 @@ To cite DeepSpeed4Science, please cite our [white paper](https://arxiv.org/abs/2 ## New Megatron-DeepSpeed for Large-Scale AI4Science Model Training -We are proud to introduce [new Megatron-DeepSpeed](https://github.com/microsoft/Megatron-DeepSpeed), which is an updated framework for large-scale model training. We rebased and enabled DeepSpeed with the newest Megatron-LM for long sequence support and many other capabilities. With the new Megatron-DeepSpeed, users can now train their large AI4Science models like GenSLMs with much longer sequences via a synergetic combination of ZeRO-style data parallelism, tensor parallelism, sequence parallelism, pipeline parallelism, model state offloading, and several newly added memory optimization techniques such as attention mask offloading and position embedding partitioning. +We are proud to introduce [new Megatron-DeepSpeed](https://github.com/deepspeedai/Megatron-DeepSpeed), which is an updated framework for large-scale model training. We rebased and enabled DeepSpeed with the newest Megatron-LM for long sequence support and many other capabilities. With the new Megatron-DeepSpeed, users can now train their large AI4Science models like GenSLMs with much longer sequences via a synergetic combination of ZeRO-style data parallelism, tensor parallelism, sequence parallelism, pipeline parallelism, model state offloading, and several newly added memory optimization techniques such as attention mask offloading and position embedding partitioning. ![new Megatron-DeepSpeed](/assets/images/new-megatron-ds.png){: .align-center}

    The figure depicts system capability in terms of enabling long sequence lengths for training a 33B parameter GPT-like model using our new Megatron-DeepSpeed framework. The results show that the new Megatron-DeepSpeed enables 9x longer sequence lengths than NVIDIA's Megatron-LM without triggering out-of-memory error.

    -To see how the new Megatron-DeepSpeed helps enabling new system capabilities, such as training models with massive sequences length, please read our [tutorial](https://github.com/microsoft/Megatron-DeepSpeed/tree/main/examples_deepspeed/deepspeed4science/megatron_long_seq_support). +To see how the new Megatron-DeepSpeed helps enabling new system capabilities, such as training models with massive sequences length, please read our [tutorial](https://github.com/deepspeedai/Megatron-DeepSpeed/tree/main/examples_deepspeed/deepspeed4science/megatron_long_seq_support). Meanwhile, our new Megatron-DeepSpeed has been applied to genome-scale foundation model [GenSLMs](https://github.com/ramanathanlab/genslm), which is a 2022 [ACM Gordon Bell award](https://www.acm.org/media-center/2022/november/gordon-bell-special-prize-covid-research-2022) winning genome-scale language model from Argonne National Lab. To achieve their scientific goal, GenSLMs and similar models require very long sequence support for both training and inference that is beyond generic LLM's long-sequence strategies. By leveraging DeepSpeed4Science's new Megatron-DeepSpeed, GenSLMs team is able to train their 25B model with 512K sequence length, much longer than their original 42K sequence length. Detailed information about the methodology can be found at [our website](https://deepspeed4science.ai/2023/09/18/model-showcase-genslms/). GenSLMs team also hosts an [example](https://github.com/ramanathanlab/genslm/tree/main/examples/long-sequences) about how to use DeepSpeed4Science in the GenSLMs repo. diff --git a/docs/_pages/inference.md b/docs/_pages/inference.md index f44d0b94ceec..fb3534872439 100755 --- a/docs/_pages/inference.md +++ b/docs/_pages/inference.md @@ -6,10 +6,10 @@ toc: true toc_label: "Contents" --- ->**DeepSpeed-Inference v2 is here and it's called DeepSpeed-FastGen! For the best performance, latest features, and newest model support please see our [DeepSpeed-FastGen release blog](https://github.com/microsoft/DeepSpeed/tree/master/blogs/deepspeed-fastgen)!** +>**DeepSpeed-Inference v2 is here and it's called DeepSpeed-FastGen! For the best performance, latest features, and newest model support please see our [DeepSpeed-FastGen release blog](https://github.com/deepspeedai/DeepSpeed/tree/master/blogs/deepspeed-fastgen)!** 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). +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/deepspeedai/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/_posts/2020-05-19-bert-record.md b/docs/_posts/2020-05-19-bert-record.md index b47ad0b0beaf..67d00280348e 100644 --- a/docs/_posts/2020-05-19-bert-record.md +++ b/docs/_posts/2020-05-19-bert-record.md @@ -19,4 +19,4 @@ the same number and generation of GPUs. * Brief overview, see our [press release](https://www.microsoft.com/en-us/research/blog/ZeRO-2-deepspeed-shattering-barriers-of-deep-learning-speed-scale/). * Detailed technology deep dive, see our [blog post](https://www.deepspeed.ai/2020/05/27/fastest-bert-training.html). * Tutorial on how to reproduce our results, see our [BERT pre-training tutorial](https://www.deepspeed.ai/tutorials/bert-pretraining/). -* The source code for our transformer kernels can be found in the [DeepSpeed repo](https://github.com/microsoft/deepspeed) and BERT pre-training code can be found in the [DeepSpeedExamples repo](https://github.com/microsoft/deepspeedexamples). +* The source code for our transformer kernels can be found in the [DeepSpeed repo](https://github.com/deepspeedai/deepspeed) and BERT pre-training code can be found in the [DeepSpeedExamples repo](https://github.com/deepspeedai/deepspeedexamples). diff --git a/docs/_posts/2020-05-28-fastest-bert-training.md b/docs/_posts/2020-05-28-fastest-bert-training.md index 62be6c1bffce..2154c36fe279 100644 --- a/docs/_posts/2020-05-28-fastest-bert-training.md +++ b/docs/_posts/2020-05-28-fastest-bert-training.md @@ -284,7 +284,7 @@ and faster convergence. To try out these optimizations and training recipe, please check out our [BERT training tutorial](https://www.deepspeed.ai/tutorials/bert-pretraining/) and source code at the [DeepSpeed GitHub -repo](https://github.com/microsoft/deepspeed). +repo](https://github.com/deepspeedai/deepspeed). ### References diff --git a/docs/_posts/2020-09-08-sparse-attention-news.md b/docs/_posts/2020-09-08-sparse-attention-news.md index 79de33a82e3a..b9a0aeb88d9b 100644 --- a/docs/_posts/2020-09-08-sparse-attention-news.md +++ b/docs/_posts/2020-09-08-sparse-attention-news.md @@ -11,4 +11,4 @@ DeepSpeed offers sparse attention kernels, an instrumental technology to support * Brief overview, see our [press release]({{ site.press_release_v3 }}). * Detailed technology deep dive, see our [blog post](https://www.deepspeed.ai/2020/09/08/sparse-attention.html). * Tutorial on how to use sparse attention, see our [Sparse attention tutorial](https://www.deepspeed.ai/tutorials/sparse-attention/). -* The source code for our sparse attention kernels can be found in the [DeepSpeed repo](https://github.com/microsoft/deepspeed) and BERT pre-training code using sparse attention can be found in the [DeepSpeedExamples repo](https://github.com/microsoft/deepspeedexamples). +* The source code for our sparse attention kernels can be found in the [DeepSpeed repo](https://github.com/deepspeedai/deepspeed) and BERT pre-training code using sparse attention can be found in the [DeepSpeedExamples repo](https://github.com/deepspeedai/deepspeedexamples). diff --git a/docs/_posts/2020-09-09-ZeRO-Offload.md b/docs/_posts/2020-09-09-ZeRO-Offload.md index 8e2e8423fd55..e0626f791a4e 100755 --- a/docs/_posts/2020-09-09-ZeRO-Offload.md +++ b/docs/_posts/2020-09-09-ZeRO-Offload.md @@ -10,4 +10,4 @@ We introduce a new technology called ZeRO-Offload to enable **10X bigger model t * For more information on ZeRO-Offload, see our [press release]( {{ site.press_release_v3 }} ). * For more information on how to use ZeRO-Offload, see our [ZeRO-Offload tutorial](https://www.deepspeed.ai/tutorials/ZeRO-offload/). -* The source code for ZeRO-Offload can be found in the [DeepSpeed repo](https://github.com/microsoft/deepspeed). +* The source code for ZeRO-Offload can be found in the [DeepSpeed repo](https://github.com/deepspeedai/deepspeed). diff --git a/docs/_posts/2020-09-09-onebit-adam-news.md b/docs/_posts/2020-09-09-onebit-adam-news.md index d0adcb09987f..1fd8ef89edce 100644 --- a/docs/_posts/2020-09-09-onebit-adam-news.md +++ b/docs/_posts/2020-09-09-onebit-adam-news.md @@ -17,4 +17,4 @@ its efficient implementation in DeepSpeed. 1-bit Adam offers the ***same converg * Brief overview, see our [press release]({{ site.press_release_v3 }}). * Detailed technology deep dive, see our [blog post](https://www.deepspeed.ai/2020/09/08/onebit-adam-blog-post.html). * Tutorial on how to reproduce our results, see our [1-bit Adam tutorial](/tutorials/onebit-adam/). -* The source code for 1-bit Adam can be found in the [DeepSpeed repo](https://github.com/microsoft/deepspeed). The implementation of 1-bit Adam is in [onebit_adam.py](https://github.com/microsoft/DeepSpeed/blob/master/deepspeed/runtime/fp16/onebit_adam.py) and CUDA-Aware communication for 1-bit Adam is in [custom_collectives.py](https://github.com/microsoft/DeepSpeed/blob/master/deepspeed/runtime/custom_collectives.py). Example codes to try this feature can be found in the [DeepSpeedExamples repo](https://github.com/microsoft/deepspeedexamples) as shown in the [tutorial](/tutorials/onebit-adam/). +* The source code for 1-bit Adam can be found in the [DeepSpeed repo](https://github.com/deepspeedai/deepspeed). The implementation of 1-bit Adam is in [onebit_adam.py](https://github.com/deepspeedai/DeepSpeed/blob/master/deepspeed/runtime/fp16/onebit_adam.py) and CUDA-Aware communication for 1-bit Adam is in [custom_collectives.py](https://github.com/deepspeedai/DeepSpeed/blob/master/deepspeed/runtime/custom_collectives.py). Example codes to try this feature can be found in the [DeepSpeedExamples repo](https://github.com/deepspeedai/deepspeedexamples) as shown in the [tutorial](/tutorials/onebit-adam/). diff --git a/docs/_posts/2020-09-09-pipeline-parallelism.md b/docs/_posts/2020-09-09-pipeline-parallelism.md index 48343ebd8d1e..fe708bc4d50d 100644 --- a/docs/_posts/2020-09-09-pipeline-parallelism.md +++ b/docs/_posts/2020-09-09-pipeline-parallelism.md @@ -14,5 +14,5 @@ low-bandwidth network by up to 7x. * For a brief overview and results including trillion-parameter capabilities, see our [press release]({{ site.press_release_v3 }}). * To get started with pipeline parallel training in DeepSpeed, we recommend our [tutorial](/tutorials/pipeline/). -* See our AlexNet example in [DeepSpeedExamples](https://github.com/microsoft/DeepSpeedExamples). +* See our AlexNet example in [DeepSpeedExamples](https://github.com/deepspeedai/DeepSpeedExamples). * Read our API documentation on [readthedocs](https://deepspeed.readthedocs.io/en/latest/pipeline.html). diff --git a/docs/_posts/2020-09-09-sparse-attention.md b/docs/_posts/2020-09-09-sparse-attention.md index 9675ef1058dd..1ab827d6fc8e 100644 --- a/docs/_posts/2020-09-09-sparse-attention.md +++ b/docs/_posts/2020-09-09-sparse-attention.md @@ -28,7 +28,7 @@ In a pre-training experiment, we ran BERT model under three settings: dense, den ![Maximum sequence runnable on BERT](/assets/images/sa_maximum_sequence_runnable_on_bert.png){: .align-center} * **Up to 6.3x faster computation** -We continued the pre-training experiment for different batch sizes and sequence lengths, using [BERT base/large](https://github.com/microsoft/DeepSpeedExamples/tree/master/bing_bert) and [Megatron GPT2](https://github.com/microsoft/DeepSpeedExamples/tree/master/Megatron-LM). In this experiment we let the training to continue for 100 iteration and recorded the average time per last 30 iterations. SA reduces total computation comparing with dense and improves training speed: the boost is higher with increased sequence length and it is up to 6.3x faster for BERT base, 5.3x for BERT large, and 6.1x for GPT2. Following charts show these results. +We continued the pre-training experiment for different batch sizes and sequence lengths, using [BERT base/large](https://github.com/deepspeedai/DeepSpeedExamples/tree/master/bing_bert) and [Megatron GPT2](https://github.com/deepspeedai/DeepSpeedExamples/tree/master/Megatron-LM). In this experiment we let the training to continue for 100 iteration and recorded the average time per last 30 iterations. SA reduces total computation comparing with dense and improves training speed: the boost is higher with increased sequence length and it is up to 6.3x faster for BERT base, 5.3x for BERT large, and 6.1x for GPT2. Following charts show these results. ![Training time for BERT base with varying sequence length](/assets/images/sa_bert_base_time_result.png){: .align-center} diff --git a/docs/_posts/2020-10-28-progressive-layer-dropping-news.md b/docs/_posts/2020-10-28-progressive-layer-dropping-news.md index ee518f53f012..da07edd7b922 100755 --- a/docs/_posts/2020-10-28-progressive-layer-dropping-news.md +++ b/docs/_posts/2020-10-28-progressive-layer-dropping-news.md @@ -10,4 +10,4 @@ We introduce a new technology called progressive layer dropping (PLD) to speedup * For detailed technology deep dive, see our [technical report](https://arxiv.org/pdf/2010.13369.pdf). * For more information on how to use PLD, see our [Progressive layer dropping tutorial](https://www.deepspeed.ai/tutorials/progressive_layer_dropping/). - * The source code for PLD is now available at the [DeepSpeed repo](https://github.com/microsoft/deepspeed). + * The source code for PLD is now available at the [DeepSpeed repo](https://github.com/deepspeedai/deepspeed). diff --git a/docs/_posts/2021-11-15-autotuning.md b/docs/_posts/2021-11-15-autotuning.md index 71acf54438ea..410e32c878a3 100644 --- a/docs/_posts/2021-11-15-autotuning.md +++ b/docs/_posts/2021-11-15-autotuning.md @@ -8,8 +8,8 @@ toc: false We introduce a new feature called Autotuning to automatically discover the optimal DeepSpeed configuration that delivers good training speed. One pain point in model training is to figure out good performance-relevant configurations such as micro-batch size to fully utilize the hardware and achieve a high throughput number. This configuration exploring process is commonly done manually but is important since model training is repeated many times and benefits from using a good configuration. Not only is the hand-tuning process time-consuming, but the outcome is hardware-dependent. This means that a good configuration on one hardware might not be the best on another different hardware. The user thus has to hand tune the configuration again. With DeepSpeed, there are more configuration parameters that could potentially affect the training speed, thus making it more tedious to manually tune the configuration. -The DeepSpeed Autotuner mitigates this pain point and automatically discovers the optimal DeepSpeed configuration that delivers good training speed. It not only reduces the time and resources users spend on tuning, but also can discover configurations better than hand-tuned methods. [DeepSpeedExamples](https://github.com/microsoft/DeepSpeedExamples/tree/master/autotuning) would demonstrate the effectiveness of autotuning across different models. +The DeepSpeed Autotuner mitigates this pain point and automatically discovers the optimal DeepSpeed configuration that delivers good training speed. It not only reduces the time and resources users spend on tuning, but also can discover configurations better than hand-tuned methods. [DeepSpeedExamples](https://github.com/deepspeedai/DeepSpeedExamples/tree/master/autotuning) would demonstrate the effectiveness of autotuning across different models. * For a brief overview, see the [Autotuning tutorial](https://www.deepspeed.ai/tutorials/autotuning/). -* For more information on how to use Autotuning, see the [Autotuning README](https://github.com/microsoft/DeepSpeed/tree/master/deepspeed/autotuning#deepspeed-autotuning). -* The source code can be found in the [DeepSpeed repo](https://github.com/microsoft/deepspeed). +* For more information on how to use Autotuning, see the [Autotuning README](https://github.com/deepspeedai/DeepSpeed/tree/master/deepspeed/autotuning#deepspeed-autotuning). +* The source code can be found in the [DeepSpeed repo](https://github.com/deepspeedai/deepspeed). diff --git a/docs/_posts/2021-12-09-deepspeed-moe-nlg.md b/docs/_posts/2021-12-09-deepspeed-moe-nlg.md index 99a62fbe00ea..69fef131d3c0 100644 --- a/docs/_posts/2021-12-09-deepspeed-moe-nlg.md +++ b/docs/_posts/2021-12-09-deepspeed-moe-nlg.md @@ -170,9 +170,9 @@ high quality language models accessible to a broad audience, even with limited compute resources. To this end we are releasing our [end-to-end pipeline for training MoE based -NLG models](https://github.com/microsoft/Megatron-DeepSpeed/tree/moe-training), +NLG models](https://github.com/deepspeedai/Megatron-DeepSpeed/tree/moe-training), along with [specific example -scripts](https://github.com/microsoft/Megatron-DeepSpeed/tree/moe-training/examples_deepspeed/MoE) +scripts](https://github.com/deepspeedai/Megatron-DeepSpeed/tree/moe-training/examples_deepspeed/MoE) and [tutorial](/tutorials/mixture-of-experts-nlg) to help get started with our pipeline. We look forward to the application and the innovations that this may bring to the deep learning community. diff --git a/docs/_posts/2022-07-26-deepspeed-azure.md b/docs/_posts/2022-07-26-deepspeed-azure.md index 749be582d9a0..540f74d4be1b 100644 --- a/docs/_posts/2022-07-26-deepspeed-azure.md +++ b/docs/_posts/2022-07-26-deepspeed-azure.md @@ -19,7 +19,7 @@ In this extended post, we share the details of how DeepSpeed users can train tri ## 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_deepspeed) 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_deepspeed/azureml). +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/deepspeedai/Megatron-DeepSpeed/tree/main/examples_deepspeed) 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/deepspeedai/Megatron-DeepSpeed/tree/main/examples_deepspeed/azureml). ![Workflow](/assets/images/old-vs-new-azure.png){: .align-center} @@ -29,7 +29,7 @@ We compare the existing manual and error-prone workflow with our proposed easy-t 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_deepspeed/azure) to launch training. +- 2) Use the Azure VMSS [recipes](https://github.com/deepspeedai/Megatron-DeepSpeed/tree/main/examples_deepspeed/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). @@ -48,7 +48,7 @@ We share the details of our experimental setup and some of the best practices we 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_deepspeed/azureml) to run experiments without any additional setup. This is the easiest and recommended way of running experiments on Azure. +Users can directly use the AzureML studio and use our published [recipes](https://github.com/deepspeedai/Megatron-DeepSpeed/tree/main/examples_deepspeed/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 @@ -59,7 +59,7 @@ A cluster is created using Azure Virtual Machine Scale Sets (VMSS) to provision | ------------------------------: | :----------------: | | 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) | +| Megatron-LM | [https://github.com/deepspeedai/Megatron-DeepSpeed](https://github.com/deepspeedai/Megatron-DeepSpeed) | | Apex | 0.1 | | NCCL | 2.12.10 | | CUDNN | 8.2.4.15 | @@ -122,9 +122,9 @@ The 2T parameter model consists of 160 layers, 32k hidden dimension, and 128 att 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_deepspeed/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. +> 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/deepspeedai/Megatron-DeepSpeed/tree/main/examples_deepspeed/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_deepspeed/azure) for the 175B and the 1T model. The recipes can easily be modified to train other model configurations. +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/deepspeedai/Megatron-DeepSpeed/tree/main/examples_deepspeed/azure) for the 175B and the 1T model. The recipes can easily be modified to train other model configurations. ## Acknowledgement diff --git a/docs/_posts/2022-09-10-zero-inference.md b/docs/_posts/2022-09-10-zero-inference.md index 59a3e3bf15fa..3c588e39c1dc 100644 --- a/docs/_posts/2022-09-10-zero-inference.md +++ b/docs/_posts/2022-09-10-zero-inference.md @@ -83,7 +83,7 @@ Next, we measure the impact on generation throughput using four V100-32GB GPUs. We briefly discuss how users can determine when ZeRO-Inference is suitable for their application and how to enable ZeRO-Inference in DeepSpeed. ### When to use ZeRO-Inference -ZeRO-Inference is designed for inference applications that require GPU acceleration but lack sufficient GPU memory to host the model. Also, ZeRO-Inference is optimized for inference applications that are **throughput-oriented** and allow **large batch sizes**. Alternative techniques, such as [Accelerate](https://github.com/huggingface/accelerate), [DeepSpeed-Inference](https://www.deepspeed.ai/inference/), and [DeepSpeed-MII](https://github.com/microsoft/deepspeed-mii) that fit the entire model into GPU memory, possibly using multiple GPUs, are more suitable for inference applications that are latency sensitive or have small batch sizes. +ZeRO-Inference is designed for inference applications that require GPU acceleration but lack sufficient GPU memory to host the model. Also, ZeRO-Inference is optimized for inference applications that are **throughput-oriented** and allow **large batch sizes**. Alternative techniques, such as [Accelerate](https://github.com/huggingface/accelerate), [DeepSpeed-Inference](https://www.deepspeed.ai/inference/), and [DeepSpeed-MII](https://github.com/deepspeedai/deepspeed-mii) that fit the entire model into GPU memory, possibly using multiple GPUs, are more suitable for inference applications that are latency sensitive or have small batch sizes. ### How to use ZeRO-Inference ZeRO-Inference is available in the DeepSpeed library versions >= 0.6.6. Integrating ZeRO-Inference into token generation pipelines, such as [Hugging Face generate](https://huggingface.co/docs/transformers/main_classes/text_generation), requires updating the DeepSpeed configuration to set [ZeRO optimization](https://www.deepspeed.ai/docs/config-json/#zero-optimizations-for-fp16-training) to stage 3 and [parameter offloading](https://www.deepspeed.ai/docs/config-json/#parameter-offloading) to CPU or NVMe. diff --git a/docs/_posts/2022-10-11-mii.md b/docs/_posts/2022-10-11-mii.md index e0b43f51b1e0..324b7ffbad33 100644 --- a/docs/_posts/2022-10-11-mii.md +++ b/docs/_posts/2022-10-11-mii.md @@ -11,7 +11,7 @@ The Deep Learning (DL) open-source community has seen tremendous growth in the l There has been significant progress in system optimizations for DL model inference that can drastically reduce both latency and cost, but those are not easily accessible. The main reason for this limited accessibility is that the DL model inference landscape is diverse with models varying in size, architecture, system performance characteristics, hardware requirements, etc. Identifying the appropriate set of system optimizations applicable to a given model and applying them correctly is often beyond the scope of most data scientists, making low latency and low-cost inference mostly inaccessible. -[DeepSpeed Model Implementations for Inference (MII)](https://github.com/microsoft/DeepSpeed-MII) is a new open-source python library from DeepSpeed, aimed towards making low-latency, low-cost inference of powerful models not only feasible but also easily accessible. +[DeepSpeed Model Implementations for Inference (MII)](https://github.com/deepspeedai/DeepSpeed-MII) is a new open-source python library from DeepSpeed, aimed towards making low-latency, low-cost inference of powerful models not only feasible but also easily accessible. * MII offers access to highly optimized implementations of **thousands of widely used DL models.** * MII supported models achieve significantly lower latency and cost compared to their original implementation. @@ -33,7 +33,7 @@ Under-the-hood MII is powered by [DeepSpeed-Inference](https://arxiv.org/abs/220 MII supports a growing list of tasks such as text generation, question-answering, text classification, etc, across thousands of transformer models available through multiple open-sourced model repositories such as Hugging Face, FairSeq, EluetherAI, etc. It supports dense models based on BERT, RoBERTa, GPT, OPT, and BLOOM architectures ranging from a few hundred million parameters in size to hundreds of billions of parameters in size. At the same time, it supports recent image generation models such as Stable Diffusion. -See the MII GitHub repo for an up-to-date list of [models and tasks supported by MII](https://github.com/microsoft/deepspeed-mii#supported-models-and-tasks). +See the MII GitHub repo for an up-to-date list of [models and tasks supported by MII](https://github.com/deepspeedai/deepspeed-mii#supported-models-and-tasks). # Inference Optimizations with MII @@ -133,7 +133,7 @@ mii.deploy(task="text-to-image", deployment_type=DeploymentType.AML) ``` -To learn more about these deployment options and get started with MII, please the [MII getting started guide](https://github.com/microsoft/deepspeed-mii#getting-started-with-mii). +To learn more about these deployment options and get started with MII, please the [MII getting started guide](https://github.com/deepspeedai/deepspeed-mii#getting-started-with-mii). # Concluding Remarks diff --git a/docs/_posts/2022-12-12-data-efficiency.md b/docs/_posts/2022-12-12-data-efficiency.md index 52148707b767..82931a30e167 100644 --- a/docs/_posts/2022-12-12-data-efficiency.md +++ b/docs/_posts/2022-12-12-data-efficiency.md @@ -141,4 +141,4 @@ The composed DeepSpeed Data Efficiency solution leverages both data efficiency t # Concluding Remarks -We are very excited to share DeepSpeed Data Efficiency library with the community and improve it with your feedback. Please find the code, tutorial, and documents at the [DeepSpeed GitHub](https://github.com/microsoft/DeepSpeed), and [website](/tutorials/data-efficiency/). And for more technical details please read our [Random-LTD paper](https://arxiv.org/abs/2211.11586) and [DeepSpeed Data Efficiency paper](https://arxiv.org/abs/2212.03597). We believe that our composable library and novel data efficiency techniques will help users reduce training cost while maintaining model quality or achieve better quality under similar cost. And we hope DeepSpeed Data Efficiency could become a platform that motivates and accelerates future research on deep learning data efficiency. +We are very excited to share DeepSpeed Data Efficiency library with the community and improve it with your feedback. Please find the code, tutorial, and documents at the [DeepSpeed GitHub](https://github.com/deepspeedai/DeepSpeed), and [website](/tutorials/data-efficiency/). And for more technical details please read our [Random-LTD paper](https://arxiv.org/abs/2211.11586) and [DeepSpeed Data Efficiency paper](https://arxiv.org/abs/2212.03597). We believe that our composable library and novel data efficiency techniques will help users reduce training cost while maintaining model quality or achieve better quality under similar cost. And we hope DeepSpeed Data Efficiency could become a platform that motivates and accelerates future research on deep learning data efficiency. diff --git a/docs/_posts/2023-03-31-multi-modal.md b/docs/_posts/2023-03-31-multi-modal.md index aaef9cfbfd2a..63ea2f94f850 100644 --- a/docs/_posts/2023-03-31-multi-modal.md +++ b/docs/_posts/2023-03-31-multi-modal.md @@ -34,4 +34,4 @@ Specifically, we incorporate the MoE structure into the classical single-tower m A sophisticated MoE model design requires a highly efficient and scalable training system that can support multi-dimensional parallelism and efficient memory management. [DeepSpeed MoE](https://www.microsoft.com/en-us/research/blog/deepspeed-advancing-moe-inference-and-training-to-power-next-generation-ai-scale/) training system offers such advanced capabilities including easy-to-use APIs enabling flexible combinations of data, tensor, and expert parallelism. Furthermore, DeepSpeed MoE enables larger model scale than state-of-the-art systems by exploiting expert parallelism and [ZeRO optimizations](https://arxiv.org/abs/1910.02054) together. By leveraging the DeepSpeed MoE system, VL-MoE Base with 32 experts achieves similar model quality as VLMO-dense Large with about 2.5x training speedup. -[DeepSpeed MoE](https://www.microsoft.com/en-us/research/blog/deepspeed-advancing-moe-inference-and-training-to-power-next-generation-ai-scale/) system is already open-sourced and can be easily used as plug-and-play component to achieve high-performance low-cost training for any large-scale MoE models. The tutorial of how to use DeepSpeed MoE is available [here](https://www.deepspeed.ai/tutorials/mixture-of-experts/). VL-MoE is currently in the process of being integrated as a model example of [DeepSpeed Examples](https://github.com/microsoft/DeepSpeedExamples). Please stay tuned for our upcoming updates on this thread. +[DeepSpeed MoE](https://www.microsoft.com/en-us/research/blog/deepspeed-advancing-moe-inference-and-training-to-power-next-generation-ai-scale/) system is already open-sourced and can be easily used as plug-and-play component to achieve high-performance low-cost training for any large-scale MoE models. The tutorial of how to use DeepSpeed MoE is available [here](https://www.deepspeed.ai/tutorials/mixture-of-experts/). VL-MoE is currently in the process of being integrated as a model example of [DeepSpeed Examples](https://github.com/deepspeedai/DeepSpeedExamples). Please stay tuned for our upcoming updates on this thread. diff --git a/docs/_posts/2023-04-24-deepspeed-chat-chinese.md b/docs/_posts/2023-04-24-deepspeed-chat-chinese.md index 2fd962327b54..57a77caab32d 100644 --- a/docs/_posts/2023-04-24-deepspeed-chat-chinese.md +++ b/docs/_posts/2023-04-24-deepspeed-chat-chinese.md @@ -1,7 +1,7 @@ --- title: "DeepSpeed Chat: 一键式RLHF训练,让你的类ChatGPT千亿大模型提速省钱15倍" excerpt: "" -link: https://github.com/microsoft/DeepSpeed/blob/master/blogs/deepspeed-chat/chinese/README.md +link: https://github.com/deepspeedai/DeepSpeed/blob/master/blogs/deepspeed-chat/chinese/README.md date: 2023-04-24 00:00:00 tags: training ZeRO RLHF Chinese --- diff --git a/docs/_posts/2023-04-24-deepspeed-chat-japanese.md b/docs/_posts/2023-04-24-deepspeed-chat-japanese.md index 63200846ab65..ee3c8dca00fa 100644 --- a/docs/_posts/2023-04-24-deepspeed-chat-japanese.md +++ b/docs/_posts/2023-04-24-deepspeed-chat-japanese.md @@ -1,7 +1,7 @@ --- title: "DeepSpeed Chat: ChatGPTライクなモデルを簡単・高速・低コストに、あらゆるスケールで学習" excerpt: "" -link: https://github.com/microsoft/DeepSpeed/blob/master/blogs/deepspeed-chat/japanese/README.md +link: https://github.com/deepspeedai/DeepSpeed/blob/master/blogs/deepspeed-chat/japanese/README.md date: 2023-04-24 00:00:00 tags: training ZeRO RLHF Japanese --- diff --git a/docs/_posts/2023-04-24-deepspeed-chat.md b/docs/_posts/2023-04-24-deepspeed-chat.md index 70b627b951ee..f6cad798ca99 100644 --- a/docs/_posts/2023-04-24-deepspeed-chat.md +++ b/docs/_posts/2023-04-24-deepspeed-chat.md @@ -1,7 +1,7 @@ --- title: "DeepSpeed Chat: Easy, Fast and Affordable RLHF Training of ChatGPT-like Models at All Scales" excerpt: "" -link: https://github.com/microsoft/DeepSpeed/blob/master/blogs/deepspeed-chat/README.md +link: https://github.com/deepspeedai/DeepSpeed/blob/master/blogs/deepspeed-chat/README.md date: 2023-04-24 00:00:00 tags: training ZeRO RLHF English --- diff --git a/docs/_posts/2023-06-22-zeropp-chinese.md b/docs/_posts/2023-06-22-zeropp-chinese.md index ca52dd5f59ab..71dc2d51cb70 100644 --- a/docs/_posts/2023-06-22-zeropp-chinese.md +++ b/docs/_posts/2023-06-22-zeropp-chinese.md @@ -1,7 +1,7 @@ --- title: "DeepSpeed ZeRO++:降低4倍网络通信,显著提高大模型及类ChatGPT模型训练效率" excerpt: "" -link: https://github.com/microsoft/DeepSpeed/blob/master/blogs/zeropp/chinese/README.md +link: https://github.com/deepspeedai/DeepSpeed/blob/master/blogs/zeropp/chinese/README.md date: 2023-06-22 00:00:00 tags: training ZeRO RLHF Chinese --- diff --git a/docs/_posts/2023-06-22-zeropp-japanese.md b/docs/_posts/2023-06-22-zeropp-japanese.md index 745fcac41d97..e81013d11aba 100644 --- a/docs/_posts/2023-06-22-zeropp-japanese.md +++ b/docs/_posts/2023-06-22-zeropp-japanese.md @@ -1,7 +1,7 @@ --- title: "DeepSpeed ZeRO++: LLMやチャットモデルの訓練を劇的に高速化 – 通信オーバヘッドを1/4に大幅削減 -" excerpt: "" -link: https://github.com/microsoft/DeepSpeed/blob/master/blogs/zeropp/japanese/README.md +link: https://github.com/deepspeedai/DeepSpeed/blob/master/blogs/zeropp/japanese/README.md date: 2023-06-22 00:00:00 tags: training ZeRO RLHF Japanese --- diff --git a/docs/_posts/2023-08-24-ulysses-chinese.md b/docs/_posts/2023-08-24-ulysses-chinese.md index 613af2fe7583..f8d269217b7a 100644 --- a/docs/_posts/2023-08-24-ulysses-chinese.md +++ b/docs/_posts/2023-08-24-ulysses-chinese.md @@ -1,7 +1,7 @@ --- title: "DeepSpeed Ulysses: 训练极长序列Transformer模型的系统优化" excerpt: "" -link: https://github.com/microsoft/DeepSpeed/blob/master/blogs/deepspeed-ulysses/chinese/README.md +link: https://github.com/deepspeedai/DeepSpeed/blob/master/blogs/deepspeed-ulysses/chinese/README.md date: 2023-08-24 00:00:00 tags: training ZeRO Chinese --- diff --git a/docs/_posts/2023-08-24-ulysses-japanese.md b/docs/_posts/2023-08-24-ulysses-japanese.md index 921c7c28739d..291407a5523e 100644 --- a/docs/_posts/2023-08-24-ulysses-japanese.md +++ b/docs/_posts/2023-08-24-ulysses-japanese.md @@ -1,7 +1,7 @@ --- title: "DeepSpeed Ulysses: Transformerモデルを非常に長いシーケンスで訓練するための最適化" excerpt: "" -link: https://github.com/microsoft/DeepSpeed/blob/master/blogs/deepspeed-ulysses/japanese/README.md +link: https://github.com/deepspeedai/DeepSpeed/blob/master/blogs/deepspeed-ulysses/japanese/README.md date: 2023-08-24 00:00:00 tags: training ZeRO Japanese --- diff --git a/docs/_posts/2023-08-24-ulysses.md b/docs/_posts/2023-08-24-ulysses.md index a88a0d66080a..c10b2d599f02 100644 --- a/docs/_posts/2023-08-24-ulysses.md +++ b/docs/_posts/2023-08-24-ulysses.md @@ -1,7 +1,7 @@ --- title: "DeepSpeed Ulysses: System Optimizations for Enabling Training of Extreme Long Sequence Transformer Models" excerpt: "" -link: https://github.com/microsoft/DeepSpeed/blob/master/blogs/deepspeed-ulysses/README.md +link: https://github.com/deepspeedai/DeepSpeed/blob/master/blogs/deepspeed-ulysses/README.md date: 2023-08-24 00:00:00 tags: training ZeRO English --- diff --git a/docs/_posts/2023-09-12-ZeRO-Inference.md b/docs/_posts/2023-09-12-ZeRO-Inference.md index 7b9852dc160b..04a6347bec59 100644 --- a/docs/_posts/2023-09-12-ZeRO-Inference.md +++ b/docs/_posts/2023-09-12-ZeRO-Inference.md @@ -1,6 +1,6 @@ title: "ZeRO-Inference: 20X faster inference through weight quantization and KV cache offloading" excerpt: "" -link: https://github.com/microsoft/DeepSpeedExamples/blob/master/inference/huggingface/zero_inference/README.md +link: https://github.com/deepspeedai/DeepSpeedExamples/blob/master/inference/huggingface/zero_inference/README.md date: 2023-09-12 00:09:00 tags: inference ZeRO quantization English --- diff --git a/docs/_posts/2023-09-19-deepspeed4science-chinese.md b/docs/_posts/2023-09-19-deepspeed4science-chinese.md index 7b0ccf00aa61..651d61a3b79c 100644 --- a/docs/_posts/2023-09-19-deepspeed4science-chinese.md +++ b/docs/_posts/2023-09-19-deepspeed4science-chinese.md @@ -1,7 +1,7 @@ --- title: "DeepSpeed4Science:利用先进的AI系统优化技术实现科学发现" excerpt: "" -link: https://github.com/microsoft/DeepSpeed/blob/master/blogs/deepspeed4science/chinese/README.md +link: https://github.com/deepspeedai/DeepSpeed/blob/master/blogs/deepspeed4science/chinese/README.md date: 2023-09-19 00:00:00 tags: training inference science Chinese --- diff --git a/docs/_posts/2023-09-19-deepspeed4science-japanese.md b/docs/_posts/2023-09-19-deepspeed4science-japanese.md index 8c0a1b6d0082..20d83c8e0b5a 100644 --- a/docs/_posts/2023-09-19-deepspeed4science-japanese.md +++ b/docs/_posts/2023-09-19-deepspeed4science-japanese.md @@ -1,7 +1,7 @@ --- title: "DeepSpeed4Scienceイニシアティブ: 洗練されたAIシステムのテクノロジーにより大規模な科学的発見を可能に" excerpt: "" -link: https://github.com/microsoft/DeepSpeed/blob/master/blogs/deepspeed4science/japanese/README.md +link: https://github.com/deepspeedai/DeepSpeed/blob/master/blogs/deepspeed4science/japanese/README.md date: 2023-09-19 00:00:00 tags: training inference science Japanese --- diff --git a/docs/_posts/2023-10-04-deepspeed-visualchat-chinese.md b/docs/_posts/2023-10-04-deepspeed-visualchat-chinese.md index 290b8b4b8ba4..1e0ef0bed34b 100644 --- a/docs/_posts/2023-10-04-deepspeed-visualchat-chinese.md +++ b/docs/_posts/2023-10-04-deepspeed-visualchat-chinese.md @@ -1,7 +1,7 @@ --- title: "DeepSpeed-VisualChat:多轮图像+文字,为你展现不一样的AI聊天魅力" excerpt: "" -link: https://github.com/microsoft/DeepSpeed/blob/master/blogs/deepspeed-visualchat/10-03-2023/README-Chinese.md +link: https://github.com/deepspeedai/DeepSpeed/blob/master/blogs/deepspeed-visualchat/10-03-2023/README-Chinese.md date: 2023-10-04 00:00:00 tags: training Chinese --- diff --git a/docs/_posts/2023-10-04-deepspeed-visualchat-japanese.md b/docs/_posts/2023-10-04-deepspeed-visualchat-japanese.md index f8b7e20cc2cf..745e9052358e 100644 --- a/docs/_posts/2023-10-04-deepspeed-visualchat-japanese.md +++ b/docs/_posts/2023-10-04-deepspeed-visualchat-japanese.md @@ -1,7 +1,7 @@ --- title: "DeepSpeed-VisualChat: 複数ラウンド・複数画像の入力が可能なAIチャット体験を実現" excerpt: "" -link: https://github.com/microsoft/DeepSpeed/blob/master/blogs/deepspeed-visualchat/10-03-2023/README-Japanese.md +link: https://github.com/deepspeedai/DeepSpeed/blob/master/blogs/deepspeed-visualchat/10-03-2023/README-Japanese.md date: 2023-10-04 00:00:00 tags: training Japanese --- diff --git a/docs/_posts/2023-10-04-deepspeed-visualchat.md b/docs/_posts/2023-10-04-deepspeed-visualchat.md index 74a1eb66fd5c..8226597290b2 100644 --- a/docs/_posts/2023-10-04-deepspeed-visualchat.md +++ b/docs/_posts/2023-10-04-deepspeed-visualchat.md @@ -1,7 +1,7 @@ --- title: "DeepSpeed-VisualChat: Improve Your Chat Experience with Multi-Round Multi-Image Inputs" excerpt: "" -link: https://github.com/microsoft/DeepSpeed/tree/master/blogs/deepspeed-visualchat/10-03-2023/README.md +link: https://github.com/deepspeedai/DeepSpeed/tree/master/blogs/deepspeed-visualchat/10-03-2023/README.md date: 2023-10-04 00:00:00 tags: training English --- diff --git a/docs/_posts/2023-11-06-deepspeed-fastgen-chinese.md b/docs/_posts/2023-11-06-deepspeed-fastgen-chinese.md index cc259c20361a..ec936bb6d79e 100644 --- a/docs/_posts/2023-11-06-deepspeed-fastgen-chinese.md +++ b/docs/_posts/2023-11-06-deepspeed-fastgen-chinese.md @@ -1,7 +1,7 @@ --- title: "DeepSpeed-FastGen:通过 MII 和 DeepSpeed-Inference 实现 LLM 高吞吐量文本生成" excerpt: "" -link: https://github.com/microsoft/DeepSpeed/tree/master/blogs/deepspeed-fastgen/chinese/README.md +link: https://github.com/deepspeedai/DeepSpeed/tree/master/blogs/deepspeed-fastgen/chinese/README.md date: 2023-11-06 00:00:00 tags: inference Chinese --- diff --git a/docs/_posts/2023-11-06-deepspeed-fastgen-japanese.md b/docs/_posts/2023-11-06-deepspeed-fastgen-japanese.md index a4bb8237783a..a64b29c88163 100644 --- a/docs/_posts/2023-11-06-deepspeed-fastgen-japanese.md +++ b/docs/_posts/2023-11-06-deepspeed-fastgen-japanese.md @@ -1,7 +1,7 @@ --- title: "DeepSpeed-FastGen: MIIとDeepSpeed-InferenceによるLLMのための高速なテキスト生成" excerpt: "" -link: https://github.com/microsoft/DeepSpeed/tree/master/blogs/deepspeed-fastgen/japanese/README.md +link: https://github.com/deepspeedai/DeepSpeed/tree/master/blogs/deepspeed-fastgen/japanese/README.md date: 2023-11-06 00:00:00 tags: inference Japanese --- diff --git a/docs/_posts/2023-11-06-deepspeed-fastgen.md b/docs/_posts/2023-11-06-deepspeed-fastgen.md index 2af103e81f15..d9062ce56da3 100644 --- a/docs/_posts/2023-11-06-deepspeed-fastgen.md +++ b/docs/_posts/2023-11-06-deepspeed-fastgen.md @@ -1,7 +1,7 @@ --- title: "DeepSpeed-FastGen: High-throughput Text Generation for LLMs via MII and DeepSpeed-Inference" excerpt: "" -link: https://github.com/microsoft/DeepSpeed/tree/master/blogs/deepspeed-fastgen +link: https://github.com/deepspeedai/DeepSpeed/tree/master/blogs/deepspeed-fastgen date: 2023-11-06 00:00:00 tags: inference English --- diff --git a/docs/_tutorials/accelerator-abstraction-interface.md b/docs/_tutorials/accelerator-abstraction-interface.md index a1aa38725970..30a362b82d25 100644 --- a/docs/_tutorials/accelerator-abstraction-interface.md +++ b/docs/_tutorials/accelerator-abstraction-interface.md @@ -90,8 +90,8 @@ This class implements `class DeepSpeedAccelerator` and will be returned by `get_ 2. Op builders following https://github.com/intel/intel-extension-for-deepspeed/tree/main/intel_extension_for_deepspeed/op_builder. All op builders needs to inherit `deepspeed.ops.op_builder.builder.OpBuilder` directly or indirectly. A common practice is to implement a base op builder (SYCLOpBuilder in the case of Intel Extension for DeepSpeed) and inherit this base op builder instead. 3. Op kernels as in the following [link](https://github.com/intel/intel-extension-for-deepspeed/tree/main/intel_extension_for_deepspeed/op_builder/csrc). -Note that an extension does not have to implement all op builders under https://github.com/microsoft/DeepSpeed/tree/master/op_builder all at a time. A missing op builder usually means certain DeepSpeed functionality cannot be used for that Accelerator, but models that does not use that functionality can still run. +Note that an extension does not have to implement all op builders under https://github.com/deepspeedai/DeepSpeed/tree/master/op_builder all at a time. A missing op builder usually means certain DeepSpeed functionality cannot be used for that Accelerator, but models that does not use that functionality can still run. When implementing op builder for an accelerator extension, one thing needs to be noted is that the op builder native code is being built by DeepSpeed jit load mechanism. This mean the native source file being built needs to be in DeepSpeed installation directory. However these files are defined in accelerator extension installation directory, which cannot be built by DeepSpeed directly. To solve this, follow the example in https://github.com/intel/intel-extension-for-deepspeed/blob/main/intel_extension_for_deepspeed/op_builder/cpu_adam.py to use 'sycl_kernel_path' and 'sycl_kernel_include' (User can change 'sycl' to other prefix in their own accelerator extension) to allow native code be built during DeepSpeed jit load. -When accelerator extension is installed in the environment, it can be used by either explicit call deepspeed.accelerator.set_accelerator(XYZ_Accelerator()) following the example in https://github.com/microsoft/DeepSpeed/blob/master/accelerator/real_accelerator.py, or add an implicit detection code in get_accelerator in the same file above. +When accelerator extension is installed in the environment, it can be used by either explicit call deepspeed.accelerator.set_accelerator(XYZ_Accelerator()) following the example in https://github.com/deepspeedai/DeepSpeed/blob/master/accelerator/real_accelerator.py, or add an implicit detection code in get_accelerator in the same file above. diff --git a/docs/_tutorials/accelerator-setup-guide.md b/docs/_tutorials/accelerator-setup-guide.md index 75c20134b5b7..ecb77f475375 100644 --- a/docs/_tutorials/accelerator-setup-guide.md +++ b/docs/_tutorials/accelerator-setup-guide.md @@ -246,7 +246,7 @@ accelerator: npu ## Multi-card parallel training using Huawei Ascend NPU -To perform model training across multiple Huawei Ascend NPU cards using DeepSpeed, see the examples provided in [DeepSpeed Examples](https://github.com/microsoft/DeepSpeedExamples/blob/master/training/cifar/cifar10_deepspeed.py). +To perform model training across multiple Huawei Ascend NPU cards using DeepSpeed, see the examples provided in [DeepSpeed Examples](https://github.com/deepspeedai/DeepSpeedExamples/blob/master/training/cifar/cifar10_deepspeed.py). # Intel Gaudi PyTorch models can be run on Intel® Gaudi® AI accelerator using DeepSpeed. Refer to the following user guides to start using DeepSpeed with Intel Gaudi: diff --git a/docs/_tutorials/advanced-install.md b/docs/_tutorials/advanced-install.md index d27ecf021421..d01378484172 100755 --- a/docs/_tutorials/advanced-install.md +++ b/docs/_tutorials/advanced-install.md @@ -106,7 +106,7 @@ pip install . For installs spanning multiple nodes we find it useful to install DeepSpeed using the -[install.sh](https://github.com/microsoft/DeepSpeed/blob/master/install.sh) +[install.sh](https://github.com/deepspeedai/DeepSpeed/blob/master/install.sh) script in the repo. This will build a Python wheel locally and copy it to all the nodes listed in your hostfile (either given via `--hostfile`, or defaults to `/job/hostfile`). @@ -195,7 +195,7 @@ DS_SKIP_CUDA_CHECK=1 Some DeepSpeed features require specific dependencies outside the general dependencies of DeepSpeed. * Python package dependencies per feature/op please -see our [requirements directory](https://github.com/microsoft/DeepSpeed/tree/master/requirements). +see our [requirements directory](https://github.com/deepspeedai/DeepSpeed/tree/master/requirements). * We attempt to keep the system level dependencies to a minimum, however some features do require special system-level packages. Please see our `ds_report` tool output to see if you are missing any system-level packages for a given feature. diff --git a/docs/_tutorials/automatic-tensor-parallelism.md b/docs/_tutorials/automatic-tensor-parallelism.md index 6488f9b718fe..a7de4721a5ce 100755 --- a/docs/_tutorials/automatic-tensor-parallelism.md +++ b/docs/_tutorials/automatic-tensor-parallelism.md @@ -66,7 +66,7 @@ With automatic tensor parallelism, we do not need to provide the injection polic # Example Script -We can observe performance improvement with automatic tensor parallelism using the [inference test suite](https://github.com/microsoft/DeepSpeedExamples/blob/master/inference/huggingface/text-generation/inference-test.py). This script is for testing text-generation models and includes per token latency, bandwidth, throughput and memory checks for comparison. See the [README](https://github.com/microsoft/DeepSpeedExamples/tree/master/inference/huggingface/text-generation#deepspeed-huggingface-text-generation-examples) for more information. +We can observe performance improvement with automatic tensor parallelism using the [inference test suite](https://github.com/deepspeedai/DeepSpeedExamples/blob/master/inference/huggingface/text-generation/inference-test.py). This script is for testing text-generation models and includes per token latency, bandwidth, throughput and memory checks for comparison. See the [README](https://github.com/deepspeedai/DeepSpeedExamples/tree/master/inference/huggingface/text-generation#deepspeed-huggingface-text-generation-examples) for more information. ## Launching diff --git a/docs/_tutorials/autotuning.md b/docs/_tutorials/autotuning.md index 38648daa89f2..2935f38946ac 100644 --- a/docs/_tutorials/autotuning.md +++ b/docs/_tutorials/autotuning.md @@ -8,23 +8,23 @@ Make sure you've read the DeepSpeed tutorials on [Getting Started](https://www.d One pain point in model training is to figure out good performance-relevant configurations such as micro-batch size to fully utilize the hardware and achieve a high throughput number. This configuration exploring process is commonly done manually but is important since model training is repeated many times and benefits from using a good configuration. Not only is the hand-tuning process time-consuming, but the outcome is hardware-dependent. This means that a good configuration on one hardware might not be the best on another different hardware. The user thus has to hand tune the configuration again. With DeepSpeed, there are more configuration parameters that could potentially affect the training speed, thus making it more tedious to manually tune the configuration. -The DeepSpeed Autotuner mitigates this pain point and automatically discovers the optimal DeepSpeed configuration that delivers good training speed. It not only reduces the time and resources users spend on tuning, but also can discover configurations better than hand-tuned methods. In this tutorial, we showcase the usage and benefits of the autotuning feature in DeepSpeed. For more details, please see the [README.md](https://github.com/microsoft/DeepSpeed/tree/master/deepspeed/autotuning). +The DeepSpeed Autotuner mitigates this pain point and automatically discovers the optimal DeepSpeed configuration that delivers good training speed. It not only reduces the time and resources users spend on tuning, but also can discover configurations better than hand-tuned methods. In this tutorial, we showcase the usage and benefits of the autotuning feature in DeepSpeed. For more details, please see the [README.md](https://github.com/deepspeedai/DeepSpeed/tree/master/deepspeed/autotuning). ## Tuning scope and strategy The DeepSpeed Autotuner uses model information, system information, and heuristics to efficiently tune system knobs that affect compute and memory efficiencies, such as ZeRO optimization stages, micro-batch sizes, and many other ZeRO optimization configurations. Currently, the DeepSpeed Autotuner tunes ZeRO stages, micro-batch size per GPU, and ZeRO configurations (offloading is not yet supported) on top of other configurations such as optimizer, scheduler, fp16 defined by the user in the DeepSpeed configuration file. -Note that ZeRO stages, micro-batch sizes, and other ZeRO configurations to tune are also configurable and can be overwritten by the user through the DeepSpeed configuration file. See [Configuring Tuning Scope](https://github.com/microsoft/DeepSpeed/tree/master/deepspeed/autotuning#configuring-tuning-scope) for details. +Note that ZeRO stages, micro-batch sizes, and other ZeRO configurations to tune are also configurable and can be overwritten by the user through the DeepSpeed configuration file. See [Configuring Tuning Scope](https://github.com/deepspeedai/DeepSpeed/tree/master/deepspeed/autotuning#configuring-tuning-scope) for details. ## Ease of use DeepSpeed Autotuning is easy to use, requiring no code change from DeepSpeed users. -Compared to the original training script (`deepspeed your_program.py --deepspeed ds_config.json`), invoking the autotuning feature in DeepSpeed only requires setting an `autotuning` flag after the DeepSpeed launcher (see [Usage](https://github.com/microsoft/DeepSpeed/tree/master/deepspeed/autotuning#usage) for details), and adding `" autotuning": {"enabled": true}` to the DeepSpeed configuration file. Users can further tailor the autotuning process by changing the autotuning configuration in the DeepSpeed configuration JSON file (See [Autotuning Configuration](https://github.com/microsoft/DeepSpeed/tree/master/deepspeed/autotuning#autotuning-configuration) for details). +Compared to the original training script (`deepspeed your_program.py --deepspeed ds_config.json`), invoking the autotuning feature in DeepSpeed only requires setting an `autotuning` flag after the DeepSpeed launcher (see [Usage](https://github.com/deepspeedai/DeepSpeed/tree/master/deepspeed/autotuning#usage) for details), and adding `" autotuning": {"enabled": true}` to the DeepSpeed configuration file. Users can further tailor the autotuning process by changing the autotuning configuration in the DeepSpeed configuration JSON file (See [Autotuning Configuration](https://github.com/deepspeedai/DeepSpeed/tree/master/deepspeed/autotuning#autotuning-configuration) for details). ## Example -We demonstrate the usage and benefit of autotuning using the training of a 0.77 billion parameter [GPT2-large model](https://huggingface.co/gpt2-large) from Hugging Face on 16 Nvidia V100 GPUs. For more examples, refer to [autotuning](https://github.com/microsoft/DeepSpeedExamples/tree/master/autotuning) in the DeepSpeedExamples repo. Note that autotuning works with any DeepSpeed-accelerated model training, not limited to Hugging Face models. +We demonstrate the usage and benefit of autotuning using the training of a 0.77 billion parameter [GPT2-large model](https://huggingface.co/gpt2-large) from Hugging Face on 16 Nvidia V100 GPUs. For more examples, refer to [autotuning](https://github.com/deepspeedai/DeepSpeedExamples/tree/master/autotuning) in the DeepSpeedExamples repo. Note that autotuning works with any DeepSpeed-accelerated model training, not limited to Hugging Face models. The model has: @@ -119,7 +119,7 @@ Note that the performance metric used in autotuning is calculated using the timi Tuning completed in 0:27:33.988447. Total number of experiments: 13. -As we can see the DeepSpeed Autotuner can select a better than hand-tuned configuration with a reasonable number of experiments. Examples in [Autotuning Hugging Face Examples](https://github.com/microsoft/DeepSpeedExamples/tree/master/autotuning/hf#autotuning-hugging-face-examples) would demonstrate the effectiveness of autotuning across different models. +As we can see the DeepSpeed Autotuner can select a better than hand-tuned configuration with a reasonable number of experiments. Examples in [Autotuning Hugging Face Examples](https://github.com/deepspeedai/DeepSpeedExamples/tree/master/autotuning/hf#autotuning-hugging-face-examples) would demonstrate the effectiveness of autotuning across different models. ### DeepSpeed Autotuning with AzureML diff --git a/docs/_tutorials/azure.md b/docs/_tutorials/azure.md index 38af70b3f4b0..1bbfb687d812 100644 --- a/docs/_tutorials/azure.md +++ b/docs/_tutorials/azure.md @@ -13,10 +13,10 @@ The recommended and simplest method to try DeepSpeed on Azure is through [AzureM For AzureML v1 examples, 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/v1/python-sdk/workflows/train/deepspeed). -> 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_deepspeed/azureml) for end-to-end training on AzureML. +> Our [Megatron-DeepSpeed](https://github.com/deepspeedai/megatron-deepspeed) contains the most up to date [recipe](https://github.com/deepspeedai/Megatron-DeepSpeed/tree/main/examples_deepspeed/azureml) for end-to-end training on AzureML. # DeepSpeed on Azure VMs 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. -If you already have a cluster setup, you can use the [azure recipes](https://github.com/microsoft/Megatron-DeepSpeed/tree/main/examples_deepspeed/azure) that can easily be modified to train various model configurations. +If you already have a cluster setup, you can use the [azure recipes](https://github.com/deepspeedai/Megatron-DeepSpeed/tree/main/examples_deepspeed/azure) that can easily be modified to train various model configurations. diff --git a/docs/_tutorials/bert-finetuning.md b/docs/_tutorials/bert-finetuning.md index f833acebde9a..efb8fa268e29 100755 --- a/docs/_tutorials/bert-finetuning.md +++ b/docs/_tutorials/bert-finetuning.md @@ -14,7 +14,7 @@ example (DeepSpeedExamples/training/BingBertSquad) we will be going over in the this tutorial. ```shell -git clone https://github.com/microsoft/DeepSpeed +git clone https://github.com/deepspeedai/DeepSpeed cd DeepSpeed git submodule update --init --recursive cd DeepSpeedExamples/training/BingBertSquad diff --git a/docs/_tutorials/bert-pretraining.md b/docs/_tutorials/bert-pretraining.md index 14789d3fda96..342918de958d 100755 --- a/docs/_tutorials/bert-pretraining.md +++ b/docs/_tutorials/bert-pretraining.md @@ -5,7 +5,7 @@ tags: training pre-training --- **Note:** -On 08/15/2022 we have added another BERT pre-training/fine-tuning example at [github.com/microsoft/Megatron-DeepSpeed/tree/main/examples_deepspeed/bert_with_pile](https://github.com/microsoft/Megatron-DeepSpeed/tree/main/examples_deepspeed/bert_with_pile), which includes a README.md that describes how to use it. Compared to the example described below, the new example in Megatron-DeepSpeed adds supports of ZeRO and tensor-slicing model parallelism (thus support larger model scale), uses a public and richer [Pile dataset](https://github.com/EleutherAI/the-pile) (user can also use their own data), together with some changes to the model architecture and training hyperparameters as described in [this paper](https://arxiv.org/abs/1909.08053). As a result, the BERT models trained by the new example is able to provide better MNLI results than original BERT, but with a slightly different model architecture and larger computation requirements. If you want to train a larger-scale or better quality BERT-style model, we recommend to follow the new example in Megatron-DeepSpeed. If your goal is to strictly reproduce the original BERT model, we recommend to follow the example under DeepSpeedExamples/bing_bert as described below. On the other hand, the tutorial below helps explaining how to integrate DeepSpeed into a pre-training codebase, regardless of which BERT example you use. +On 08/15/2022 we have added another BERT pre-training/fine-tuning example at [github.com/deepspeedai/Megatron-DeepSpeed/tree/main/examples_deepspeed/bert_with_pile](https://github.com/deepspeedai/Megatron-DeepSpeed/tree/main/examples_deepspeed/bert_with_pile), which includes a README.md that describes how to use it. Compared to the example described below, the new example in Megatron-DeepSpeed adds supports of ZeRO and tensor-slicing model parallelism (thus support larger model scale), uses a public and richer [Pile dataset](https://github.com/EleutherAI/the-pile) (user can also use their own data), together with some changes to the model architecture and training hyperparameters as described in [this paper](https://arxiv.org/abs/1909.08053). As a result, the BERT models trained by the new example is able to provide better MNLI results than original BERT, but with a slightly different model architecture and larger computation requirements. If you want to train a larger-scale or better quality BERT-style model, we recommend to follow the new example in Megatron-DeepSpeed. If your goal is to strictly reproduce the original BERT model, we recommend to follow the example under DeepSpeedExamples/bing_bert as described below. On the other hand, the tutorial below helps explaining how to integrate DeepSpeed into a pre-training codebase, regardless of which BERT example you use. {: .notice--info} In this tutorial we will apply DeepSpeed to pre-train the BERT @@ -26,7 +26,7 @@ We work from adaptations of [huggingface/transformers](https://github.com/huggingface/transformers) and [NVIDIA/DeepLearningExamples](https://github.com/NVIDIA/DeepLearningExamples). We have forked this repo under -[DeepSpeedExamples/bing_bert](https://github.com/microsoft/DeepSpeedExamples/tree/master/bing_bert) +[DeepSpeedExamples/bing_bert](https://github.com/deepspeedai/DeepSpeedExamples/tree/master/bing_bert) and made several modifications in their script: * We adopted the modeling code from NVIDIA's BERT under `bing_bert/nvidia/`. @@ -360,7 +360,7 @@ the scripts/json configs in our DeepSpeedExamples repo. Below is a table contain summary of the configurations. Specifically see the `ds_train_bert_bsz64k_seq128.sh` and `ds_train_bert_bsz32k_seq512.sh` scripts for more details in -[DeepSpeedExamples](https://github.com/microsoft/DeepSpeedExamples/tree/master/bing_bert). +[DeepSpeedExamples](https://github.com/deepspeedai/DeepSpeedExamples/tree/master/bing_bert). | Parameters | 128 Sequence | 512 Sequence | diff --git a/docs/_tutorials/cifar-10.md b/docs/_tutorials/cifar-10.md index 8b4990d0431e..2bd06abf0e89 100644 --- a/docs/_tutorials/cifar-10.md +++ b/docs/_tutorials/cifar-10.md @@ -16,7 +16,7 @@ First we will go over how to run the original CIFAR-10 model. Then we will proce ## Running Original CIFAR-10 -Original model code from the [CIFAR-10 Tutorial](https://github.com/pytorch/tutorials/blob/main/beginner_source/blitz/cifar10_tutorial.py), We've copied this repo under [DeepSpeedExamples/training/cifar/](https://github.com/microsoft/DeepSpeedExamples/tree/master/training/cifar) and made it available as a submodule. To download, execute: +Original model code from the [CIFAR-10 Tutorial](https://github.com/pytorch/tutorials/blob/main/beginner_source/blitz/cifar10_tutorial.py), We've copied this repo under [DeepSpeedExamples/training/cifar/](https://github.com/deepspeedai/DeepSpeedExamples/tree/master/training/cifar) and made it available as a submodule. To download, execute: ```bash git submodule update --init --recursive diff --git a/docs/_tutorials/comms-logging.md b/docs/_tutorials/comms-logging.md index 2719f08ad200..c4f6141a5b6c 100644 --- a/docs/_tutorials/comms-logging.md +++ b/docs/_tutorials/comms-logging.md @@ -64,7 +64,7 @@ The steps to add DeepSpeed communication log summaries are as follows: 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: +For example usage, see the following modified [DeepSpeedExamples/cifar](https://github.com/deepspeedai/DeepSpeedExamples/tree/master/cifar) example: ```python # Step 2: (Optional) Import deepspeed.comm diff --git a/docs/_tutorials/curriculum-learning.md b/docs/_tutorials/curriculum-learning.md index 29f9417363f0..0b74945d3715 100644 --- a/docs/_tutorials/curriculum-learning.md +++ b/docs/_tutorials/curriculum-learning.md @@ -8,7 +8,7 @@ On 12/12/2022, we released DeepSpeed Data Efficiency Library which provides a mo {: .notice--warning} **Note:** -This tutorial was updated on 10/29/2021. Changes include: 1) A more detailed tuning strategy. 2) Pipeline parallelism support. 3) Token-based learning rate decay. 4) A new GPT-2 example at [github.com/microsoft/Megatron-DeepSpeed](https://github.com/microsoft/Megatron-DeepSpeed). See details below. +This tutorial was updated on 10/29/2021. Changes include: 1) A more detailed tuning strategy. 2) Pipeline parallelism support. 3) Token-based learning rate decay. 4) A new GPT-2 example at [github.com/deepspeedai/Megatron-DeepSpeed](https://github.com/deepspeedai/Megatron-DeepSpeed). See details below. {: .notice--info} In this tutorial, we introduce DeepSpeed's curriculum learning-based data pipeline, which presents easier or simpler examples earlier during training. By enabling stable training with 8x/4x larger batch size/learning rate (whereas the baseline approach struggles with training divergence), we observe that curriculum learning (based on sequence length) provides stable and 3.3x faster GPT-2 pre-training (tested on 117M and 1.5B parameters), together with better token-wise convergence speed and zero-shot WikiText-103/LAMBADA evaluation results. In addition, since curriculum learning only affects the data pipeline, its benefit is complementary to many DeepSpeed features and other system optimization techniques. For example, curriculum learning is compatible with DeepSpeed's [ZeRO Redundancy Optimizer](/tutorials/zero/), [ZeRO-Offload](/tutorials/zero-offload/), and [3D Parallelism](/tutorials/pipeline/). @@ -114,17 +114,17 @@ After the update on 10/29/2021, now there are two curriculum learning examples f We provide two curriculum learning examples for Megatron-LM GPT-2 pre-training: -The first one is at [Megatron-DeepSpeed/tree/main/examples_deepspeed/curriculum_learning](https://github.com/microsoft/Megatron-DeepSpeed/tree/main/examples_deepspeed/curriculum_learning). This integration is based on a newer Megatron-LM fork, and only this curriculum learning example supports pipeline parallelism. However, as of 10/29/2021, we haven't verified ZeRO-2 and ZeRO-3 on this fork. Overall, we highly recommend you to use this example if your model does not require ZeRO-2/3. +The first one is at [Megatron-DeepSpeed/tree/main/examples_deepspeed/curriculum_learning](https://github.com/deepspeedai/Megatron-DeepSpeed/tree/main/examples_deepspeed/curriculum_learning). This integration is based on a newer Megatron-LM fork, and only this curriculum learning example supports pipeline parallelism. However, as of 10/29/2021, we haven't verified ZeRO-2 and ZeRO-3 on this fork. Overall, we highly recommend you to use this example if your model does not require ZeRO-2/3. -The second one is at [DeepSpeedExamples/Megatron-LM-v1.1.5-ZeRO3/curriculum_learning/](https://github.com/microsoft/DeepSpeedExamples/tree/master/Megatron-LM-v1.1.5-ZeRO3/curriculum_learning). This integration is based on an older Megatron-LM hard copy that we will eventually deprecate and this curriculum learning example does not support pipeline parallelism. We recommend you to ONLY use this example if your model requires ZeRO-2/3. +The second one is at [DeepSpeedExamples/Megatron-LM-v1.1.5-ZeRO3/curriculum_learning/](https://github.com/deepspeedai/DeepSpeedExamples/tree/master/Megatron-LM-v1.1.5-ZeRO3/curriculum_learning). This integration is based on an older Megatron-LM hard copy that we will eventually deprecate and this curriculum learning example does not support pipeline parallelism. We recommend you to ONLY use this example if your model requires ZeRO-2/3. Besides the DeepSpeed curriculum learning json configurations described above, there are some other necessary changes on the user side to integrate curriculum learning: ### 2.1 Training data truncation -To enable `seqlen`-based curriculum learning, we need to add the functionality of training data truncation based on the given curriculum sequence length. For the case without pipeline parallelism, it is necessary to add a `curriculum_seqlen` argument in the model's forward pass and use it to perform training data sequence length truncation. For Megatron-LM GPT-2 pre-training, we implement this in `forward()` in [megatron/model/gpt2_model.py](https://github.com/microsoft/DeepSpeedExamples/blob/master/Megatron-LM-v1.1.5-ZeRO3/megatron/model/gpt2_model.py) and in `forward_step()` in [pretrain_gpt2.py](https://github.com/microsoft/DeepSpeedExamples/blob/master/Megatron-LM-v1.1.5-ZeRO3/pretrain_gpt2.py). +To enable `seqlen`-based curriculum learning, we need to add the functionality of training data truncation based on the given curriculum sequence length. For the case without pipeline parallelism, it is necessary to add a `curriculum_seqlen` argument in the model's forward pass and use it to perform training data sequence length truncation. For Megatron-LM GPT-2 pre-training, we implement this in `forward()` in [megatron/model/gpt2_model.py](https://github.com/deepspeedai/DeepSpeedExamples/blob/master/Megatron-LM-v1.1.5-ZeRO3/megatron/model/gpt2_model.py) and in `forward_step()` in [pretrain_gpt2.py](https://github.com/deepspeedai/DeepSpeedExamples/blob/master/Megatron-LM-v1.1.5-ZeRO3/pretrain_gpt2.py). -For the case with pipeline parallelism, due to DeepSpeed engine limitations we cannot inject the `curriculum_seqlen` argument in the forward pass. Instead, we create a duplicate of `deepspeed.runtime.data_pipeline.curriculum_scheduler` on the user side, and use it to retrieve the `curriculum_seqlen`. This implementation can be found in [megatron/training.py](https://github.com/microsoft/Megatron-DeepSpeed/blob/main/megatron/training.py). +For the case with pipeline parallelism, due to DeepSpeed engine limitations we cannot inject the `curriculum_seqlen` argument in the forward pass. Instead, we create a duplicate of `deepspeed.runtime.data_pipeline.curriculum_scheduler` on the user side, and use it to retrieve the `curriculum_seqlen`. This implementation can be found in [megatron/training.py](https://github.com/deepspeedai/Megatron-DeepSpeed/blob/main/megatron/training.py). ### 2.2 Disable batch size warmup (`--rampup-batch-size`) In our [paper](https://arxiv.org/abs/2108.06084) section 5.4 we demonstrate that curriculum learning (`seqlen`-based) provides much better training stability than the batch size warmup technique introduced by Open AI GPT-3. So when using curriculum learning you need to remove the `--rampup-batch-size` config in your training script. It's not recommended using both curriculum learning and batch size warmup, because both of them reduce the number of tokens in a batch. Another related change you might want is to increase your micro batch size, since without batch size warmup your batch size will be fixed now. diff --git a/docs/_tutorials/data-efficiency.md b/docs/_tutorials/data-efficiency.md index 9ea3a33dab92..b49974f1fa78 100644 --- a/docs/_tutorials/data-efficiency.md +++ b/docs/_tutorials/data-efficiency.md @@ -20,7 +20,7 @@ Curriculum learning has been successfully applied to various training tasks (see ### 1.3 How to use Curriculum Learning #### 1.3.1 GPT-3 and BERT pretraining -The `examples_deepspeed/data_efficiency` directory in our [Megatron-DeepSpeed repo](https://github.com/microsoft/Megatron-DeepSpeed) includes our examples of how to apply curriculum learning to GPT-3 and BERT pretraining. There are 3 steps: data analysis, pretraining, and eval/finetuning. +The `examples_deepspeed/data_efficiency` directory in our [Megatron-DeepSpeed repo](https://github.com/deepspeedai/Megatron-DeepSpeed) includes our examples of how to apply curriculum learning to GPT-3 and BERT pretraining. There are 3 steps: data analysis, pretraining, and eval/finetuning. **Data analysis:** Curriculum learning requires a data analysis before pretraining that calculate the difficulty of each data sample (based on the metric provided by user), and build an index that map difficulty value to corresponding data samples. (There are exceptions: for example the truncation-based sequence length metric can be achieved by data postprocessing without data analysis.) We provide a data analyzer to perform the offline CPU-only data analysis. @@ -31,7 +31,7 @@ The `examples_deepspeed/data_efficiency` directory in our [Megatron-DeepSpeed re **Eval/finetuning** `examples_deepspeed/data_efficiency/gpt/eval/` and `examples_deepspeed/data_efficiency/bert/finetune` include the example scripts for GPT-3 model's zero-/few-shot evaluation and BERT model's finetuning. Our [paper](https://arxiv.org/abs/2212.03597) includes the reference eval/finetune results if you follow our example scripts to perform the pretraining/eval/finetuning. #### 1.3.2 GPT-2 finetuning -The `data_efficiency/gpt_finetuning` directory in our [DeepSpeedExamples repo](https://github.com/microsoft/DeepSpeedExamples) includes our examples of how to apply curriculum learning to GPT-2 finetuning. `data_efficiency/gpt_finetuning/finetune/ds_finetune_gpt2_run.sh` is the example finetuning script. For CL metrics that require data analysis (e.g., the vocabulary rarity metric), you need to first use ```data_efficiency/gpt_finetuning/finetune/ds_analyze_gpt_data_*``` to analyze and index the dataset, similar to the GPT-3 pre-training case described above in 1.3.1. +The `data_efficiency/gpt_finetuning` directory in our [DeepSpeedExamples repo](https://github.com/deepspeedai/DeepSpeedExamples) includes our examples of how to apply curriculum learning to GPT-2 finetuning. `data_efficiency/gpt_finetuning/finetune/ds_finetune_gpt2_run.sh` is the example finetuning script. For CL metrics that require data analysis (e.g., the vocabulary rarity metric), you need to first use ```data_efficiency/gpt_finetuning/finetune/ds_analyze_gpt_data_*``` to analyze and index the dataset, similar to the GPT-3 pre-training case described above in 1.3.1. ## 2. Random layerwise token dropping (random-LTD) @@ -44,14 +44,14 @@ When you want to pretrain/fine-tune a transformer-based model, it is always a go ### 2.3 How to use random-LTD #### 2.3.1 GPT-3 and BERT pretraining -The `examples_deepspeed/data_efficiency` directory in our [Megatron-DeepSpeed repo](https://github.com/microsoft/Megatron-DeepSpeed) includes our examples of how to apply random-LTD to GPT-3 and BERT pretraining. +The `examples_deepspeed/data_efficiency` directory in our [Megatron-DeepSpeed repo](https://github.com/deepspeedai/Megatron-DeepSpeed) includes our examples of how to apply random-LTD to GPT-3 and BERT pretraining. `examples_deepspeed/data_efficiency/gpt/pretrain` and `examples_deepspeed/data_efficiency/bert/pretrain` include the example pretraining scripts with random-LTD feature. Several changes are needed to enable random-LTD during pretraining: (1) User need to provide a DeepSpeed json config file which includes configurations for random-LTD (see [list of configuration](/docs/config-json/#data-efficiency) for details). We provide tested example configurations in `examples_deepspeed/data_efficiency/gpt/pretrain/ds_pretrain_gpt_1.3B_dense_run.sh` and `examples_deepspeed/data_efficiency/bert/pretrain/ds_pretrain_bert_336M_run.sh`. (2) After initializing the DeepSpeed engine via `deepspeed.initialize`, user needs to use the `convert_to_random_ltd` API to convert and wrap the model layers in order to enable the random-LTD feature. We provide an example implementation of this change in `megatron/training.py` function `setup_model_and_optimizer`. (3) In order for random-LTD to understand the input argument mapping of the forward function, user need to change all the input arguments (except the hidden_states input) into keyword/named argument. For example, in `megatron/model/transformer.py` we changed the forward function from `def forward(self, hidden_states, attention_mask, encoder_output=None, enc_dec_attn_mask=None, layer_past=None, get_key_value=False):` to `def forward(self, hidden_states, attention_mask=None, encoder_output=None, enc_dec_attn_mask=None, layer_past=None, get_key_value=False):`. (4) When saving model checkpoints, (especially if the state dictionary has non-traditional structure) user needs to use the `remove_random_ltd_state_dict` API to convert the random-LTD-wrapped layers back to original model layers. We provide an example implementation of this change in `megatron/model/language_model.py`. For eval/finetuning of the pretrained model, see [previous section](#131-gpt-3-and-bert-pretraining) about how to use our example scripts. #### 2.3.2 GPT-2 and ViT finetuning -The `data_efficiency` directory in our [DeepSpeedExamples repo](https://github.com/microsoft/DeepSpeedExamples) includes our examples of how to apply random-LTD to GPT-2 and ViT finetuning. +The `data_efficiency` directory in our [DeepSpeedExamples repo](https://github.com/deepspeedai/DeepSpeedExamples) includes our examples of how to apply random-LTD to GPT-2 and ViT finetuning. Just like pretraining case, similar changes are required to enable random-LTD for finetuning: (1) DeepSpeed json config file. (2) Use the `convert_to_random_ltd` API to convert and wrap the model layers. (3) When saving model checkpoints, use the `remove_random_ltd_state_dict` API to convert the random-LTD-wrapped layers back to original model layers. @@ -92,9 +92,9 @@ iter 5474 | LR [0.0001]| val_acc 97.97000122070312 | layer_token 305784192 ## 3. Composing curriculum learning and random-LTD to achieve more ### 3.1 GPT-3 and BERT pretraining -The `examples_deepspeed/data_efficiency` directory in our [Megatron-DeepSpeed repo](https://github.com/microsoft/Megatron-DeepSpeed) includes our examples of how to compose curriculum learning random-LTD, and apply both of them to GPT-3 and BERT pretraining. +The `examples_deepspeed/data_efficiency` directory in our [Megatron-DeepSpeed repo](https://github.com/deepspeedai/Megatron-DeepSpeed) includes our examples of how to compose curriculum learning random-LTD, and apply both of them to GPT-3 and BERT pretraining. The changes needed are the same as described in previous two sections, since DeepSpeed Data Efficiency already handles the complexity when composing the two techniques. However, one thing to note is that since both random-LTD and some of the curriculum learning metrics will change the sequence length, it could require some extra code to calculate the effective sequence length at each step. We provide an example implementation of this change in `megatron/training.py` function `train` where we calculate the `actual_seq_length`. #### 3.2 GPT-2 finetuning -The `data_efficiency/gpt_finetuning` directory in our [DeepSpeedExamples repo](https://github.com/microsoft/DeepSpeedExamples) includes our examples of how to compose curriculum learning random-LTD for GPT-2 finetuning. `data_efficiency/gpt_finetuning/finetune/ds_finetune_gpt2_run.sh` is the example finetuning script. +The `data_efficiency/gpt_finetuning` directory in our [DeepSpeedExamples repo](https://github.com/deepspeedai/DeepSpeedExamples) includes our examples of how to compose curriculum learning random-LTD for GPT-2 finetuning. `data_efficiency/gpt_finetuning/finetune/ds_finetune_gpt2_run.sh` is the example finetuning script. diff --git a/docs/_tutorials/deepnvme.md b/docs/_tutorials/deepnvme.md index 4ed528412eae..a6d4545815dc 100644 --- a/docs/_tutorials/deepnvme.md +++ b/docs/_tutorials/deepnvme.md @@ -2,10 +2,10 @@ title: "DeepNVMe" tags: training inference IO large-model --- -This tutorial will show how to use [DeepNVMe](https://github.com/microsoft/DeepSpeed/blob/master/blogs/deepspeed-gds/README.md) for data transfers between persistent storage and tensors residing in host or device memory. DeepNVMe improves the performance and efficiency of I/O operations in Deep Learning applications through powerful optimizations built on Non-Volatile Memory Express (NVMe) Solid State Drives (SSDs), Linux Asynchronous I/O (`libaio`), and NVIDIA Magnum IOTM GPUDirect® Storage (GDS). +This tutorial will show how to use [DeepNVMe](https://github.com/deepspeedai/DeepSpeed/blob/master/blogs/deepspeed-gds/README.md) for data transfers between persistent storage and tensors residing in host or device memory. DeepNVMe improves the performance and efficiency of I/O operations in Deep Learning applications through powerful optimizations built on Non-Volatile Memory Express (NVMe) Solid State Drives (SSDs), Linux Asynchronous I/O (`libaio`), and NVIDIA Magnum IOTM GPUDirect® Storage (GDS). ## Requirements -Ensure your environment is properly configured to use DeepNVMe. First, you need to install DeepSpeed version >= [0.15.0](https://github.com/microsoft/DeepSpeed/releases/tag/v0.15.0). Next, ensure that the DeepNVMe operators are available in the DeepSpeed installation. The `async_io` operator is required for any DeepNVMe functionality, while the `gds` operator is required only for GDS functionality. You can confirm availability of each operator by inspecting the output of `ds_report` to check that compatible status is [OKAY]. Below is a snippet of `ds_report` output confirming the availability of both `async_io` and `gds` operators. +Ensure your environment is properly configured to use DeepNVMe. First, you need to install DeepSpeed version >= [0.15.0](https://github.com/deepspeedai/DeepSpeed/releases/tag/v0.15.0). Next, ensure that the DeepNVMe operators are available in the DeepSpeed installation. The `async_io` operator is required for any DeepNVMe functionality, while the `gds` operator is required only for GDS functionality. You can confirm availability of each operator by inspecting the output of `ds_report` to check that compatible status is [OKAY]. Below is a snippet of `ds_report` output confirming the availability of both `async_io` and `gds` operators. ![deepnvme_ops_report](/assets/images/deepnvme_ops_report.png) @@ -171,15 +171,15 @@ True ## Putting it together We hope that the above material helps you to get started with DeepNVMe. You can also use the following links to see DeepNVMe usage in real-world Deep Learning applications. -1. [Parameter swapper](https://github.com/microsoft/DeepSpeed/blob/9b7fc5452471392b0f58844219fcfdd14a9cdc77/deepspeed/runtime/swap_tensor/partitioned_param_swapper.py#L111-L117) in [ZeRO-Inference](https://github.com/microsoft/DeepSpeedExamples/blob/master/inference/huggingface/zero_inference/README.md) and [ZeRO-Infinity](https://www.microsoft.com/en-us/research/blog/zero-infinity-and-deepspeed-unlocking-unprecedented-model-scale-for-deep-learning-training/). -2. [Optimizer swapper](https://github.com/microsoft/DeepSpeed/blob/9b7fc5452471392b0f58844219fcfdd14a9cdc77/deepspeed/runtime/swap_tensor/partitioned_optimizer_swapper.py#L36-L38) in [ZeRO-Infinity](https://www.microsoft.com/en-us/research/blog/zero-infinity-and-deepspeed-unlocking-unprecedented-model-scale-for-deep-learning-training/). -3. [Gradient swapper](https://github.com/microsoft/DeepSpeed/blob/9b7fc5452471392b0f58844219fcfdd14a9cdc77/deepspeed/runtime/swap_tensor/partitioned_optimizer_swapper.py#L41-L43) in [ZeRO-Infinity](https://www.microsoft.com/en-us/research/blog/zero-infinity-and-deepspeed-unlocking-unprecedented-model-scale-for-deep-learning-training/). -4. Simple file read and write [operations](https://github.com/microsoft/DeepSpeedExamples/blob/master/deepnvme/file_access/README.md). +1. [Parameter swapper](https://github.com/deepspeedai/DeepSpeed/blob/9b7fc5452471392b0f58844219fcfdd14a9cdc77/deepspeed/runtime/swap_tensor/partitioned_param_swapper.py#L111-L117) in [ZeRO-Inference](https://github.com/deepspeedai/DeepSpeedExamples/blob/master/inference/huggingface/zero_inference/README.md) and [ZeRO-Infinity](https://www.microsoft.com/en-us/research/blog/zero-infinity-and-deepspeed-unlocking-unprecedented-model-scale-for-deep-learning-training/). +2. [Optimizer swapper](https://github.com/deepspeedai/DeepSpeed/blob/9b7fc5452471392b0f58844219fcfdd14a9cdc77/deepspeed/runtime/swap_tensor/partitioned_optimizer_swapper.py#L36-L38) in [ZeRO-Infinity](https://www.microsoft.com/en-us/research/blog/zero-infinity-and-deepspeed-unlocking-unprecedented-model-scale-for-deep-learning-training/). +3. [Gradient swapper](https://github.com/deepspeedai/DeepSpeed/blob/9b7fc5452471392b0f58844219fcfdd14a9cdc77/deepspeed/runtime/swap_tensor/partitioned_optimizer_swapper.py#L41-L43) in [ZeRO-Infinity](https://www.microsoft.com/en-us/research/blog/zero-infinity-and-deepspeed-unlocking-unprecedented-model-scale-for-deep-learning-training/). +4. Simple file read and write [operations](https://github.com/deepspeedai/DeepSpeedExamples/blob/master/deepnvme/file_access/README.md). - +2. [ZeRO-Infinity](https://www.microsoft.com/en-us/research/blog/zero-infinity-and-deepspeed-unlocking-unprecedented-model-scale-for-deep-learning-training/): used for offloading [parameters](https://github.com/deepspeedai/DeepSpeed/blob/9b7fc5452471392b0f58844219fcfdd14a9cdc77/deepspeed/runtime/swap_tensor/partitioned_param_swapper.py#L111-L117), [gradients](https://github.com/deepspeedai/DeepSpeed/blob/9b7fc5452471392b0f58844219fcfdd14a9cdc77/deepspeed/runtime/swap_tensor/partitioned_optimizer_swapper.py#L41-L43), and [optimizer](https://github.com/deepspeedai/DeepSpeed/blob/9b7fc5452471392b0f58844219fcfdd14a9cdc77/deepspeed/runtime/swap_tensor/partitioned_optimizer_swapper.py#L36-L38). +3. Simple file read and write [operations](https://github.com/deepspeedai/DeepSpeedExamples/blob/master/deepnvme/file_access/README.md). --> ## Acknowledgements diff --git a/docs/_tutorials/domino.md b/docs/_tutorials/domino.md index 6b116cb87463..e1cb704fc229 100644 --- a/docs/_tutorials/domino.md +++ b/docs/_tutorials/domino.md @@ -3,4 +3,4 @@ title: "Domino" tags: training --- -Domino achieves near-complete communication hiding behind computation for tensor parallel training. Please find our [Domino-tutorial](https://github.com/microsoft/DeepSpeedExamples/blob/master/training/DeepSpeed-Domino/README.md) in DeepSpeedExample repo. +Domino achieves near-complete communication hiding behind computation for tensor parallel training. Please find our [Domino-tutorial](https://github.com/deepspeedai/DeepSpeedExamples/blob/master/training/DeepSpeed-Domino/README.md) in DeepSpeedExample repo. diff --git a/docs/_tutorials/ds-sequence.md b/docs/_tutorials/ds-sequence.md index 815b99d6de35..ffcb94946e6a 100755 --- a/docs/_tutorials/ds-sequence.md +++ b/docs/_tutorials/ds-sequence.md @@ -3,7 +3,7 @@ title: "Getting Started with DeepSpeed-Ulysses for Training Transformer Models w tags: training --- -In this tutorial we describe how to enable DeepSpeed-Ulysses. DeepSpeed-Ulysses is a simple but highly communication and memory efficient mechanism sequence parallelism approach for training of large transformer models with massive sequence lengths. It partitions input tensors along the sequence dimension and uses a communication-efficient all-2-all collective for distributed attention computations. Additionally, DeepSpeed-Ulysses incorporates advanced modeling and system optimizations, such as Flash attention, sparse attention, and ZeRO optimizer, to optimize both computational efficiency and memory usage. Training with DeepSpeed sequence parallelism allows both model size and sequence length to scale near indefinitely unbounded by single GPU memory limitation and at a high fraction of peak compute performance. Currently, DeepSpeed-Ulysses can handle sequences up to 1 million in length (10 times the size of a complete Harry Potter book!) on 64 A100 GPUs. Please read our [DeepSpeed-Ulysses blog](https://github.com/microsoft/DeepSpeed/tree/master/blogs/deepspeed-ulysses) to learn more! +In this tutorial we describe how to enable DeepSpeed-Ulysses. DeepSpeed-Ulysses is a simple but highly communication and memory efficient mechanism sequence parallelism approach for training of large transformer models with massive sequence lengths. It partitions input tensors along the sequence dimension and uses a communication-efficient all-2-all collective for distributed attention computations. Additionally, DeepSpeed-Ulysses incorporates advanced modeling and system optimizations, such as Flash attention, sparse attention, and ZeRO optimizer, to optimize both computational efficiency and memory usage. Training with DeepSpeed sequence parallelism allows both model size and sequence length to scale near indefinitely unbounded by single GPU memory limitation and at a high fraction of peak compute performance. Currently, DeepSpeed-Ulysses can handle sequences up to 1 million in length (10 times the size of a complete Harry Potter book!) on 64 A100 GPUs. Please read our [DeepSpeed-Ulysses blog](https://github.com/deepspeedai/DeepSpeed/tree/master/blogs/deepspeed-ulysses) to learn more! ## 1. Installation @@ -12,10 +12,10 @@ You will need to install DeepSpeed v0.10.2 or higher to use the DeepSpeed Sequen ## 2. How to use DeepSpeed-Ulysses in your application? -Integrating DS-Seq into your training code is easy, and in this section we describe how to integrate DeepSpeed-Ulysses through our [Megatron-DeepSpeed](https://github.com/microsoft/Megatron-DeepSpeed) code repo. +Integrating DS-Seq into your training code is easy, and in this section we describe how to integrate DeepSpeed-Ulysses through our [Megatron-DeepSpeed](https://github.com/deepspeedai/Megatron-DeepSpeed) code repo. -* **Replace attention module**: First, you need to update your attention module with DeepSpeed-Ulysses DistributedAttention. Here, we use the attention from [Megatron-DeepSpeed ](https://github.com/microsoft/Megatron-DeepSpeed/blob/main/megatron/model/transformer.py) which is the causal attention used in GPT-3 like model training. Rewrite the attention block: +* **Replace attention module**: First, you need to update your attention module with DeepSpeed-Ulysses DistributedAttention. Here, we use the attention from [Megatron-DeepSpeed ](https://github.com/deepspeedai/Megatron-DeepSpeed/blob/main/megatron/model/transformer.py) which is the causal attention used in GPT-3 like model training. Rewrite the attention block: ```python def __init__(): diff --git a/docs/_tutorials/flops-profiler.md b/docs/_tutorials/flops-profiler.md index 24efc238615a..d4a7496405b9 100644 --- a/docs/_tutorials/flops-profiler.md +++ b/docs/_tutorials/flops-profiler.md @@ -184,7 +184,7 @@ When using DeepSpeed for model training, the profiler can be configured in the d #### Example: Megatron-LM -For information on running Megatron-LM with DeepSpeed, please refer to our tutorial [Megatron-LM](https://github.com/microsoft/DeepSpeedExamples/tree/master/megatron/Megatron-LM). +For information on running Megatron-LM with DeepSpeed, please refer to our tutorial [Megatron-LM](https://github.com/deepspeedai/DeepSpeedExamples/tree/master/megatron/Megatron-LM). An example output of 12-layer Megatron-LM model (`hidden_size = 8192, num_attention_heads = 32, batch_size = 1024, seq_length = 1024`) is shown below. diff --git a/docs/_tutorials/gan.md b/docs/_tutorials/gan.md index 09572a439eb0..db3734fb3b96 100755 --- a/docs/_tutorials/gan.md +++ b/docs/_tutorials/gan.md @@ -16,7 +16,7 @@ Please go through the [original tutorial](https://pytorch.org/tutorials/beginner ## Enabling DeepSpeed -The codes may be obtained [here](https://github.com/microsoft/DeepSpeedExamples/tree/master/gan). +The codes may be obtained [here](https://github.com/deepspeedai/DeepSpeedExamples/tree/master/gan). ### Argument Parsing diff --git a/docs/_tutorials/inference-tutorial.md b/docs/_tutorials/inference-tutorial.md index 29c904da9820..1d5899204f53 100644 --- a/docs/_tutorials/inference-tutorial.md +++ b/docs/_tutorials/inference-tutorial.md @@ -3,17 +3,17 @@ title: "Getting Started with DeepSpeed for Inferencing Transformer based Models" tags: inference --- ->**DeepSpeed-Inference v2 is here and it's called DeepSpeed-FastGen! For the best performance, latest features, and newest model support please see our [DeepSpeed-FastGen release blog](https://github.com/microsoft/DeepSpeed/tree/master/blogs/deepspeed-fastgen)!** +>**DeepSpeed-Inference v2 is here and it's called DeepSpeed-FastGen! For the best performance, latest features, and newest model support please see our [DeepSpeed-FastGen release blog](https://github.com/deepspeedai/DeepSpeed/tree/master/blogs/deepspeed-fastgen)!** 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). +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/deepspeedai/DeepSpeed/blob/master/deepspeed/module_inject/replace_policy.py). ## Initializing for Inference For inference with DeepSpeed, use `init_inference` API to load the model for inference. Here, you can specify the MP degree, and if the model has not been loaded with the appropriate checkpoint, you can also provide the checkpoint description using a `json` file or the checkpoint path. -To inject the high-performance kernels, you need to set the `replace_with_kernel_inject` to True for the compatible models. For models not supported by DeepSpeed, the users can submit a PR that defines a new policy in [replace_policy class](https://github.com/microsoft/DeepSpeed/blob/master/deepspeed/module_inject/replace_policy.py) that specifies the different parameters of a Transformer layer, such as attention and feed-forward parts. The policy classes in DeepSpeed create a mapping between the parameters of the original user-supplied layer implementation with DeepSpeed's inference-optimized Transformer layer. +To inject the high-performance kernels, you need to set the `replace_with_kernel_inject` to True for the compatible models. For models not supported by DeepSpeed, the users can submit a PR that defines a new policy in [replace_policy class](https://github.com/deepspeedai/DeepSpeed/blob/master/deepspeed/module_inject/replace_policy.py) that specifies the different parameters of a Transformer layer, such as attention and feed-forward parts. The policy classes in DeepSpeed create a mapping between the parameters of the original user-supplied layer implementation with DeepSpeed's inference-optimized Transformer layer. ```python # create the model diff --git a/docs/_tutorials/large-models-w-deepspeed.md b/docs/_tutorials/large-models-w-deepspeed.md index 8e09cccee1fe..3d0bae0144b4 100644 --- a/docs/_tutorials/large-models-w-deepspeed.md +++ b/docs/_tutorials/large-models-w-deepspeed.md @@ -28,7 +28,7 @@ Since, ZeRO is a replacement to data parallelism, it offers a seamless integrati ## Deciding which technology to use -**3D Parallelism for GPT-2/GPT-3 like models**: If you are attempting to train a model whose architecture resembles very closely with GPT-2 or GPT-3, then we have already done the hard work of porting 3D parallelism to a GPT-2/GPT-3 architecture-based model and have created a training pipeline that you can use to efficiently train models with hundreds of billion or even trillions of parameters. Both Megatron-Turing NLG 530B and Big Science use a variation of this code base to scale the model training. You can find the code and tutorial to get started in the [DeepSpeed-Megatron GPT-3](https://github.com/microsoft/megatron-deepspeed) repo. For more information on 3D parallelism please checkout the resources below: +**3D Parallelism for GPT-2/GPT-3 like models**: If you are attempting to train a model whose architecture resembles very closely with GPT-2 or GPT-3, then we have already done the hard work of porting 3D parallelism to a GPT-2/GPT-3 architecture-based model and have created a training pipeline that you can use to efficiently train models with hundreds of billion or even trillions of parameters. Both Megatron-Turing NLG 530B and Big Science use a variation of this code base to scale the model training. You can find the code and tutorial to get started in the [DeepSpeed-Megatron GPT-3](https://github.com/deepspeedai/megatron-deepspeed) repo. For more information on 3D parallelism please checkout the resources below: [3D Parallelism Tutorial](https://www.deepspeed.ai/tutorials/pipeline/) A generic tutorial on how to port your model to use DeepSpeed 3D parallelism diff --git a/docs/_tutorials/megatron.md b/docs/_tutorials/megatron.md index 5242c8184db8..286a9a36a926 100644 --- a/docs/_tutorials/megatron.md +++ b/docs/_tutorials/megatron.md @@ -19,7 +19,7 @@ reduction_** from using DeepSpeed. ## Training GPT-2 with the Original Megatron-LM -We've copied the original model code from [Megatron-LM](https://github.com/NVIDIA/Megatron-LM) into DeepSpeed [Megatron-LM](https://github.com/microsoft/Megatron-DeepSpeed) and made it available as a submodule. To download, execute: +We've copied the original model code from [Megatron-LM](https://github.com/NVIDIA/Megatron-LM) into DeepSpeed [Megatron-LM](https://github.com/deepspeedai/Megatron-DeepSpeed) and made it available as a submodule. To download, execute: ```bash git submodule update --init --recursive ``` diff --git a/docs/_tutorials/mixed_precision_zeropp.md b/docs/_tutorials/mixed_precision_zeropp.md index 12ad3556abde..9429b75bac10 100644 --- a/docs/_tutorials/mixed_precision_zeropp.md +++ b/docs/_tutorials/mixed_precision_zeropp.md @@ -3,7 +3,7 @@ title: "Mixed Precision ZeRO++" tags: training ZeRO communication-efficiency large-model --- -Mixed Precision ZeRO++ (MixZ++) is a set of optimization strategies based on [ZeRO](/tutorials/zero/) and [ZeRO++](/tutorials/zeropp/) to improve the efficiency and reduce memory usage for large model training and inference when users use [Low-Rank Adaptation (LoRA)]([/tutorials/zero/](https://arxiv.org/abs/2106.09685)) training. MixZ++ partitions model parameters across GPUs to reduce footprint and gathers them with quantized communication only when needed similar to its ZeRO and ZeRO++ siblings. Our evaluation indicates MixZ++ increases the training throughput by up to [3.3x](https://github.com/microsoft/DeepSpeed/tree/master/blogs/deepspeed-chat/ds-chat-release-8-31) for the Llama-2-70B model running on 128 V100 GPUs. Read our [DeepSpeed Chat Blog](https://github.com/microsoft/DeepSpeed/tree/master/blogs/deepspeed-chat/ds-chat-release-8-31), [ZeRO++ blog](https://www.microsoft.com/en-us/research/blog/deepspeed-zero-a-leap-in-speed-for-llm-and-chat-model-training-with-4x-less-communication/) and [paper](https://arxiv.org/pdf/2306.10209.pdf) to learn more! +Mixed Precision ZeRO++ (MixZ++) is a set of optimization strategies based on [ZeRO](/tutorials/zero/) and [ZeRO++](/tutorials/zeropp/) to improve the efficiency and reduce memory usage for large model training and inference when users use [Low-Rank Adaptation (LoRA)]([/tutorials/zero/](https://arxiv.org/abs/2106.09685)) training. MixZ++ partitions model parameters across GPUs to reduce footprint and gathers them with quantized communication only when needed similar to its ZeRO and ZeRO++ siblings. Our evaluation indicates MixZ++ increases the training throughput by up to [3.3x](https://github.com/deepspeedai/DeepSpeed/tree/master/blogs/deepspeed-chat/ds-chat-release-8-31) for the Llama-2-70B model running on 128 V100 GPUs. Read our [DeepSpeed Chat Blog](https://github.com/deepspeedai/DeepSpeed/tree/master/blogs/deepspeed-chat/ds-chat-release-8-31), [ZeRO++ blog](https://www.microsoft.com/en-us/research/blog/deepspeed-zero-a-leap-in-speed-for-llm-and-chat-model-training-with-4x-less-communication/) and [paper](https://arxiv.org/pdf/2306.10209.pdf) to learn more! We recommend that you read the tutorials on [Getting Started](/getting-started/), [ZeRO](/tutorials/zero/) and [Megatron-DeepSpeed](/tutorials/megatron/) before stepping through this tutorial. @@ -16,7 +16,7 @@ Collectively, the optimizations bring better scalability and efficiency to LoRA ## Enabling Mixed Precision ZeRO++ (MixZ++) -A ready to go MixZ++ example has been prepared at [MixZ++ example script](https://github.com/microsoft/DeepSpeedExamples/blob/master/applications/DeepSpeed-Chat/training/step3_rlhf_finetuning/training_scripts/llama2/run_llama2_7b_mixz.sh). If you prefer to manually enable MixZ++ in your pipeline, please refer to the instructions below. +A ready to go MixZ++ example has been prepared at [MixZ++ example script](https://github.com/deepspeedai/DeepSpeedExamples/blob/master/applications/DeepSpeed-Chat/training/step3_rlhf_finetuning/training_scripts/llama2/run_llama2_7b_mixz.sh). If you prefer to manually enable MixZ++ in your pipeline, please refer to the instructions below. ### DeepSpeed Configuration Changes An example snippet of deepspeed configurations with all MixZ++ optimization enabled is shown below: diff --git a/docs/_tutorials/mixture-of-experts-inference.md b/docs/_tutorials/mixture-of-experts-inference.md index 882ad7aefd1f..675815dd5d57 100644 --- a/docs/_tutorials/mixture-of-experts-inference.md +++ b/docs/_tutorials/mixture-of-experts-inference.md @@ -54,7 +54,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/main/examples_deepspeed/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/deepspeedai/Megatron-DeepSpeed/blob/main/examples_deepspeed/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 6fc7022ba1fb..c4fb072dd82d 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 under the MoE folder. +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/deepspeedai/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_deepspeed/MoE](https://github.com/microsoft/Megatron-DeepSpeed/tree/main/examples_deepspeed/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_deepspeed/MoE](https://github.com/deepspeedai/Megatron-DeepSpeed/tree/main/examples_deepspeed/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_deepspeed/MoE](https://githu ### 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_deepspeed/MoE](https://github.com/microsoft/Megatron-DeepSpeed/tree/main/examples_deepspeed/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_deepspeed/MoE](https://github.com/deepspeedai/Megatron-DeepSpeed/tree/main/examples_deepspeed/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_deepspeed/MoE](https://github.com/microsoft/Megatron-DeepSpeed/tree/main/examples_deepspeed/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_deepspeed/MoE](https://github.com/deepspeedai/Megatron-DeepSpeed/tree/main/examples_deepspeed/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). diff --git a/docs/_tutorials/mixture-of-experts.md b/docs/_tutorials/mixture-of-experts.md index a2260d98e49e..d4604b929ff4 100644 --- a/docs/_tutorials/mixture-of-experts.md +++ b/docs/_tutorials/mixture-of-experts.md @@ -13,7 +13,7 @@ For more details on results and further discussion, please see our press release {: .notice--info} As a simple starting point we will show how to apply DeepSpeed MoE to a cifar10 example. Please refer to -our [cifar10 example](https://github.com/microsoft/DeepSpeedExamples/tree/master/cifar) going forward. +our [cifar10 example](https://github.com/deepspeedai/DeepSpeedExamples/tree/master/cifar) going forward. If you are adding MoE to an existing model you can use the snippet below to help guide you: @@ -104,11 +104,11 @@ fc4 = torch.nn.Linear(84, 10) ``` -For a runnable end-to-end example that covers both the standard MoE architecture as well as the PR-MoE model , please look at the [cifar10 example](https://github.com/microsoft/DeepSpeedExamples/tree/master/cifar). In addition, see the advanced usage section of this tutorial that links to a more comprehensive example for NLG models. +For a runnable end-to-end example that covers both the standard MoE architecture as well as the PR-MoE model , please look at the [cifar10 example](https://github.com/deepspeedai/DeepSpeedExamples/tree/master/cifar). In addition, see the advanced usage section of this tutorial that links to a more comprehensive example for NLG models. ### Combining ZeRO-Offload and DeepSpeed MoE for very large models -To use MoE Layers in DeepSpeed, we rely on two parameter groups that are passed to an optimizer. A concrete example to create such groups is available from the [cifar10 example](https://github.com/microsoft/DeepSpeedExamples/tree/master/cifar). +To use MoE Layers in DeepSpeed, we rely on two parameter groups that are passed to an optimizer. A concrete example to create such groups is available from the [cifar10 example](https://github.com/deepspeedai/DeepSpeedExamples/tree/master/cifar). The relevant function that creates these param groups is as follows. @@ -134,7 +134,7 @@ model_engine, optimizer, trainloader, __ = deepspeed.initialize( We are working on automating this functionality in the DeepSpeed ZeRO optimizer so the model training code can be simplified further. -To run the [cifar10 example](https://github.com/microsoft/DeepSpeedExamples/tree/master/cifar) with ZeRO-Offload (stage 2) and MoE, please set the ds_config flags +To run the [cifar10 example](https://github.com/deepspeedai/DeepSpeedExamples/tree/master/cifar) with ZeRO-Offload (stage 2) and MoE, please set the ds_config flags ```json "zero_optimization": { diff --git a/docs/_tutorials/model-compression.md b/docs/_tutorials/model-compression.md index c8713cb1f616..d11eadc3d726 100644 --- a/docs/_tutorials/model-compression.md +++ b/docs/_tutorials/model-compression.md @@ -25,7 +25,7 @@ If the model is very deep, you may consider using this method. It works much bet Layer reduction can be enabled and configured using the DeepSpeed config JSON file ([configuration details](/docs/config-json/#layer-reduction)). Users have the freedom to select any depth by `keep_number_layer` and any subset of the network layers by `teacher_layer`. In addition, users also can choose whether to reinitialize the input/output layers from the given model (teacher model) by `other_module_name`. -To apply layer reduction for task-specific compression, we provide an example on how to do so for BERT fine-tuning. Layer reduction is about resetting the depth of network architecture and reinitialization of weight parameters, which happens before the training process. The example includes the following changes to the client code (`compression/bert/run_glue_no_trainer.py` in [DeepSpeedExamples](https://github.com/microsoft/DeepSpeedExamples)): +To apply layer reduction for task-specific compression, we provide an example on how to do so for BERT fine-tuning. Layer reduction is about resetting the depth of network architecture and reinitialization of weight parameters, which happens before the training process. The example includes the following changes to the client code (`compression/bert/run_glue_no_trainer.py` in [DeepSpeedExamples](https://github.com/deepspeedai/DeepSpeedExamples)): (1) When initial the model, the number of layers in the model config should be the same as `keep_number_layer` in DeepSpeed config JSON file. For Hugging Face BERT example, set `config.num_hidden_layers = ds_config["compression_training"]["layer_reduction"]["keep_number_layer"]`. @@ -33,7 +33,7 @@ To apply layer reduction for task-specific compression, we provide an example on (3) During training, if KD is not used, nothing needs to be done. Otherwise, one needs to consider applying KD with the `teacher_layer` JSON configuration when calculating the difference between teacher’s and student’s output. -One can run our layer reduction example in [DeepSpeedExamples](https://github.com/microsoft/DeepSpeedExamples) by: +One can run our layer reduction example in [DeepSpeedExamples](https://github.com/deepspeedai/DeepSpeedExamples) by: ```shell DeepSpeedExamples/compression/bert$ pip install -r requirements.txt @@ -49,7 +49,7 @@ Clean the best model, and the accuracy of the clean model is acc/mm-acc:0.834029 To apply layer reduction for task-agnostic compression, we provide an example on how to do so in the GPT pre-training stage. -Step 1: Obtain the latest version of the [Megatron-DeepSpeed](https://github.com/microsoft/Megatron-DeepSpeed). +Step 1: Obtain the latest version of the [Megatron-DeepSpeed](https://github.com/deepspeedai/Megatron-DeepSpeed). Step 2: Enter `Megatron-DeepSpeed/examples_deepspeed/compression` directory. @@ -97,13 +97,13 @@ Weight quantization can be enabled and configured using the DeepSpeed config JSO (4)`start_bit` and `target_bit`, to simplify the first experiment we suggest to set them the same such that we apply quantization to the target bit once the iteration reaches `schedule_offset`. -There are two changes to the client code (`compression/bert/run_glue_no_trainer.py` in [DeepSpeedExamples](https://github.com/microsoft/DeepSpeedExamples)): +There are two changes to the client code (`compression/bert/run_glue_no_trainer.py` in [DeepSpeedExamples](https://github.com/deepspeedai/DeepSpeedExamples)): (1) After initialization of the model, apply `init_compression` function to the model with DeepSpeed JSON configurations. (2) After training, apply `redundancy_clean` function to save the quantized weight. -One can run our weight quantization example in [DeepSpeedExamples](https://github.com/microsoft/DeepSpeedExamples) by: +One can run our weight quantization example in [DeepSpeedExamples](https://github.com/deepspeedai/DeepSpeedExamples) by: ```shell DeepSpeedExamples/compression/bert$ pip install -r requirements.txt @@ -130,13 +130,13 @@ It can improve computation efficiency similar to [weight quantization](#12-weigh Activation quantization can be enabled and configured using the DeepSpeed config JSON file ([configuration details](/docs/config-json/#activation-quantization)). Some of the components are same as weight quantization, such as `schedule_offset` and `quantization_type`. The key configurations we would like to point out are: -(1)`range_calibration`, user has option to set dynamic or static. When using “dynamic”, the activation quantization groups will be automatically set to be token-wise (for Transformer-based models) and image-wise (for CNN-based models). See more in [our ZeroQuant paper](https://arxiv.org/abs/2206.01861) and the code (`deepspeed/compression/basic_layer.py` in [DeepSpeed](https://github.com/microsoft/DeepSpeed)). +(1)`range_calibration`, user has option to set dynamic or static. When using “dynamic”, the activation quantization groups will be automatically set to be token-wise (for Transformer-based models) and image-wise (for CNN-based models). See more in [our ZeroQuant paper](https://arxiv.org/abs/2206.01861) and the code (`deepspeed/compression/basic_layer.py` in [DeepSpeed](https://github.com/deepspeedai/DeepSpeed)). (2)`aq1`/`aq2`, users can expand more groups such as `aq3`, `aq4`, etc. The client code change is the same as [weight quantization](#12-weight-quantization). -One can run our activation quantization example in [DeepSpeedExamples](https://github.com/microsoft/DeepSpeedExamples) by: +One can run our activation quantization example in [DeepSpeedExamples](https://github.com/deepspeedai/DeepSpeedExamples) by: ```shell DeepSpeedExamples/compression/bert$ pip install -r requirements.txt @@ -188,7 +188,7 @@ Sparse pruning can be enabled and configured using the DeepSpeed config JSON fil The client code change is the same as [weight quantization](#12-weight-quantization). -One can run our sparse pruning example in [DeepSpeedExamples](https://github.com/microsoft/DeepSpeedExamples) by: +One can run our sparse pruning example in [DeepSpeedExamples](https://github.com/deepspeedai/DeepSpeedExamples) by: ```shell DeepSpeedExamples/compression/bert$ pip install -r requirements.txt @@ -223,7 +223,7 @@ Row pruning can be enabled and configured using the DeepSpeed config JSON file ( The client code change is the same as [weight quantization](#12-weight-quantization). -One can run our row pruning example in [DeepSpeedExamples](https://github.com/microsoft/DeepSpeedExamples) by: +One can run our row pruning example in [DeepSpeedExamples](https://github.com/deepspeedai/DeepSpeedExamples) by: ```shell DeepSpeedExamples/compression/bert$ pip install -r requirements.txt @@ -260,7 +260,7 @@ Head pruning can be enabled and configured using the DeepSpeed config JSON file The client code change is the same as [weight quantization](#12-weight-quantization). -One can run our head pruning example in [DeepSpeedExamples](https://github.com/microsoft/DeepSpeedExamples) by: +One can run our head pruning example in [DeepSpeedExamples](https://github.com/deepspeedai/DeepSpeedExamples) by: ```shell DeepSpeedExamples/compression/bert$ pip install -r requirements.txt @@ -286,7 +286,7 @@ Channel pruning is a feature designed for two back-to-back CONV2d layers (e.g., Channel pruning can be enabled and configured using the DeepSpeed config JSON file ([configuration details](/docs/config-json/#channel-pruning)). -One can run our channel pruning example in [DeepSpeedExamples](https://github.com/microsoft/DeepSpeedExamples) by: +One can run our channel pruning example in [DeepSpeedExamples](https://github.com/deepspeedai/DeepSpeedExamples) by: ```shell pip install torch torchvision @@ -315,7 +315,7 @@ When you want to quantize the transformer-based model to INT8 or INT4/INT8 forma **How to use ZeroQuant** -One can run our BERT example in [DeepSpeedExamples](https://github.com/microsoft/DeepSpeedExamples) by: +One can run our BERT example in [DeepSpeedExamples](https://github.com/deepspeedai/DeepSpeedExamples) by: ```shell DeepSpeedExamples/compression/bert$ pip install -r requirements.txt @@ -363,7 +363,7 @@ If you want to significantly compress your models while retaining competitive pe **How to use XTC** -**Installation:** Examples of XTC extreme compression for BERT models are at `compression/bert/bash_script/XTC` in [DeepSpeedExamples](https://github.com/microsoft/DeepSpeedExamples). You will need to install the requirements by: +**Installation:** Examples of XTC extreme compression for BERT models are at `compression/bert/bash_script/XTC` in [DeepSpeedExamples](https://github.com/deepspeedai/DeepSpeedExamples). You will need to install the requirements by: ```shell DeepSpeedExamples/compression/bert$ pip install -r requirements.txt @@ -373,7 +373,7 @@ DeepSpeedExamples/compression/bert$ pip install -r requirements.txt To accommodate users who do not have a fine-tuned model or task-specific model for compression, with the arg `--model_name_or_path yoshitomo-matsubara/bert-base-uncased-${TASK_NAME}` our python script `run_glue_no_trainer.py` automatically downloads the models from Hugging Face. Users can also use their own models with better accuracy as the teacher and the student model initialization. ### 3.1 One-bit or Two-bit BERT-base (12-layer) with 8-bit activation quantization -For the configurations, see `compression/bert/config/XTC/ds_config_W1A8_Qgroup1_fp32.json` in [DeepSpeedExamples](https://github.com/microsoft/DeepSpeedExamples). In our paper, we used FP32 (`"fp16": {"enabled": false}`) to perform training, while directly applying 8-bit quantization (`"bits": 8`) to the activations and 1-bit quantization (`"start_bits": 1, "target_bits": 1`) to the attention (query, key, val) and feedforward weight matrices (`"modules": ["attention.self", "intermediate", "output.dense"]`) at the beginning of the training (`"schedule_offset": 0`). In addition, we also apply 1-bit quantization to `word_embeddings` as weight quantization. +For the configurations, see `compression/bert/config/XTC/ds_config_W1A8_Qgroup1_fp32.json` in [DeepSpeedExamples](https://github.com/deepspeedai/DeepSpeedExamples). In our paper, we used FP32 (`"fp16": {"enabled": false}`) to perform training, while directly applying 8-bit quantization (`"bits": 8`) to the activations and 1-bit quantization (`"start_bits": 1, "target_bits": 1`) to the attention (query, key, val) and feedforward weight matrices (`"modules": ["attention.self", "intermediate", "output.dense"]`) at the beginning of the training (`"schedule_offset": 0`). In addition, we also apply 1-bit quantization to `word_embeddings` as weight quantization. One can run this example by: @@ -387,7 +387,7 @@ And the final result is: Clean the best model, and the accuracy of the clean model is acc/mm-acc:0.8293428425878757/0.8396053702196908 ``` -The other important feature we would like to mention is the `quantize_groups` inside `weight_quantization`, which is set to be 1 here to match our XTC paper's FP32 training setup. We find that under FP16 training, smaller number of quantization group (e.g., 1 or 2) could lead to unstable training. Thus, we recommend using larger number of groups (e.g., 64) under FP16. `compression/bert/config/ds_config_W1A8_Qgroup64_fp16.json` in [DeepSpeedExamples](https://github.com/microsoft/DeepSpeedExamples) is the FP16 example configurations, where `"fp16": {"enabled": true}` and `"weight_quantization": {"shared_parameters": {"quantize_weight_in_forward": false}}` are different from FP32 case. +The other important feature we would like to mention is the `quantize_groups` inside `weight_quantization`, which is set to be 1 here to match our XTC paper's FP32 training setup. We find that under FP16 training, smaller number of quantization group (e.g., 1 or 2) could lead to unstable training. Thus, we recommend using larger number of groups (e.g., 64) under FP16. `compression/bert/config/ds_config_W1A8_Qgroup64_fp16.json` in [DeepSpeedExamples](https://github.com/deepspeedai/DeepSpeedExamples) is the FP16 example configurations, where `"fp16": {"enabled": true}` and `"weight_quantization": {"shared_parameters": {"quantize_weight_in_forward": false}}` are different from FP32 case. With this config, we quantize the existing fined-tuned models downloaded from Hugging Face. For 2-bit weight quantization, user needs to update the ds_config JSON file. To give a sense of the compression performance of downloaded models compared to our paper, we collect the results (1/2-bit BERT on MNLI and QQP with 18 training epochs) in table below. The difference between this tutorial and paper is because they use different checkpoints. Data augmentation introduces in [TinyBERT](https://github.com/huawei-noah/Pretrained-Language-Model/tree/master/TinyBERT) will help significantly for smaller tasks (such as mrpc, rte, sst-b and cola). See more details in [our paper](https://arxiv.org/abs/2206.01859). @@ -399,7 +399,7 @@ This section consists of two parts: (a) we first perform a light-weight layer re **3.2.1 Light-weight Layer Reduction** -`compression/bert/config/XTC/ds_config_layer_reduction_fp16.json` in [DeepSpeedExamples](https://github.com/microsoft/DeepSpeedExamples) is the example configuration for reducing the 12-layer BERT-base to a 6-layer one. The student’s layers are initialized from i-layer of the teacher with i= [1, 3 ,5 ,7 ,9 ,11] (note that the layer starts from 0), which is called `Skip-BERT_5` in our XTC paper. In addition, student’s modules including embedding, pooler and classifier are also initialized from teacher. For 5-layer layer reduction, one needs to change the configs in `ds_config_layer_reduction_fp16.json` to `"keep_number_layer": 5`, `"teacher_layer": [2, 4 ,6, 8, 10]`(like in `compression/bert/config/ds_config_TEMPLATE.json`). +`compression/bert/config/XTC/ds_config_layer_reduction_fp16.json` in [DeepSpeedExamples](https://github.com/deepspeedai/DeepSpeedExamples) is the example configuration for reducing the 12-layer BERT-base to a 6-layer one. The student’s layers are initialized from i-layer of the teacher with i= [1, 3 ,5 ,7 ,9 ,11] (note that the layer starts from 0), which is called `Skip-BERT_5` in our XTC paper. In addition, student’s modules including embedding, pooler and classifier are also initialized from teacher. For 5-layer layer reduction, one needs to change the configs in `ds_config_layer_reduction_fp16.json` to `"keep_number_layer": 5`, `"teacher_layer": [2, 4 ,6, 8, 10]`(like in `compression/bert/config/ds_config_TEMPLATE.json`). One can run this example by: @@ -421,7 +421,7 @@ For mnli/qqp, we set `--num_train_epochs 36`, `--learning_rate 5e-5`, and with t **3.2.2 One-bit or Two-bit quantization for 6-layer (5-layer) BERT** -Given the above layer-reduced models ready, we now continue to compress the model with 1/2-bit quantization. `compression/bert/config/XTC/ds_config_layer_reduction_W1Q8_fp32.json` in [DeepSpeedExamples](https://github.com/microsoft/DeepSpeedExamples) is the example configuration where we set the layer reduction to be true on top of `compression/bert/config/XTC/ds_config_W1A8_Qgroup1_fp32.json`. In addition to the configuration, we need to update the path for the student model using `--pretrained_dir_student` in the script `compression/bert/bash_script/XTC/layer_reduction_1bit.sh`. User can train with a different teacher model by adding `--pretrained_dir_teacher`. +Given the above layer-reduced models ready, we now continue to compress the model with 1/2-bit quantization. `compression/bert/config/XTC/ds_config_layer_reduction_W1Q8_fp32.json` in [DeepSpeedExamples](https://github.com/deepspeedai/DeepSpeedExamples) is the example configuration where we set the layer reduction to be true on top of `compression/bert/config/XTC/ds_config_W1A8_Qgroup1_fp32.json`. In addition to the configuration, we need to update the path for the student model using `--pretrained_dir_student` in the script `compression/bert/bash_script/XTC/layer_reduction_1bit.sh`. User can train with a different teacher model by adding `--pretrained_dir_teacher`. One can run this example by: diff --git a/docs/_tutorials/monitor.md b/docs/_tutorials/monitor.md index 572e3f4558a7..5e7a6fc4e834 100644 --- a/docs/_tutorials/monitor.md +++ b/docs/_tutorials/monitor.md @@ -81,7 +81,7 @@ The steps to create a custom monitor are as follows: \* Note - Some Monitor backends don't support mixed sample values. Be sure to use your DeepSpeed engine object's `global_samples` attribute in each 3-tuple -For example usage, see the following modified [DeepSpeedExamples/cifar](https://github.com/microsoft/DeepSpeedExamples/tree/master/cifar) example: +For example usage, see the following modified [DeepSpeedExamples/cifar](https://github.com/deepspeedai/DeepSpeedExamples/tree/master/cifar) example: ```python # Step 1: Import monitor (and DeepSpeed config, if needed) diff --git a/docs/_tutorials/onebit-adam.md b/docs/_tutorials/onebit-adam.md index e66bba3f818b..e24dc8f86554 100644 --- a/docs/_tutorials/onebit-adam.md +++ b/docs/_tutorials/onebit-adam.md @@ -33,7 +33,7 @@ If you don't already have a copy of the DeepSpeed repository, please clone it now and checkout the DeepSpeedExamples submodule that contains the BingBertSQuAD and BERT Pre-training examples. ```shell -git clone https://github.com/microsoft/DeepSpeed +git clone https://github.com/deepspeedai/DeepSpeed cd DeepSpeed git submodule update --init --recursive cd DeepSpeedExamples/ @@ -115,7 +115,7 @@ Please note three new parameters `freeze_step`, `cuda_aware`, and `comm_backend_ (New in v2) `comm_backend_name` is used to indicate which backend implementation to use. You can choose between NCCL, MPI-based and compressed implementations by setting `comm_backend_name` to "nccl", "mpi" or "compressed". When using NCCL-based implementation, there is no need to set `cuda_aware`. #### 1.4.1 (New in v2) Momentum masks for parameters with constant zero gradients -Because 1-bit compression cannot represent exact zero, the compression error would keep accumulating in the momentum if a parameter have constant zero gradients during training. For example, for BERT pre-training seq length 128, `bert.embeddings.position_embeddings.weight` has constant zeros in its gradient and momentum for row 129 to 512, because it only learns up to seq length 128 while the model supports up to seq length 512. Thus in 1-bit Adam v2 we added support of a momentum mask for users to specify those params that have constant exact zeros in their gradients. See [example script](https://github.com/microsoft/DeepSpeedExamples/blob/master/bing_bert/deepspeed_train.py) for how to configure this momentum mask. One thing to note is that we don't use momentum mask saved in checkpoints since this mask could change during training (e.g., BERT seqlen 128 and 512 require different masks). So you have to provide this mask every time in your training script. +Because 1-bit compression cannot represent exact zero, the compression error would keep accumulating in the momentum if a parameter have constant zero gradients during training. For example, for BERT pre-training seq length 128, `bert.embeddings.position_embeddings.weight` has constant zeros in its gradient and momentum for row 129 to 512, because it only learns up to seq length 128 while the model supports up to seq length 512. Thus in 1-bit Adam v2 we added support of a momentum mask for users to specify those params that have constant exact zeros in their gradients. See [example script](https://github.com/deepspeedai/DeepSpeedExamples/blob/master/bing_bert/deepspeed_train.py) for how to configure this momentum mask. One thing to note is that we don't use momentum mask saved in checkpoints since this mask could change during training (e.g., BERT seqlen 128 and 512 require different masks). So you have to provide this mask every time in your training script. **Watch out!** 1-bit Adam relies on an compression error compensation mechanism to maintain the convergence speed at compression stage. When loading checkpoints, we actually reset the compression errors for 3 reasons: 1) The worker and server error at each GPU are distinct, so in current implementation only rank 0's errors are saved in the checkpoint. Thus we have to reset the errors. If we want to save them correctly we need O(num_gpu*model_size) memory in order to gather all the error, which is a very large memory requirement. It's possible to save them in a distributed way, but it will make the checkpoint saving/loading much more complicated. 2) Even if we are able to save the compression errors correctly, you need to have the exact same number of GPUs in order to load them correctly. 3) We verified on BERT pre-training that occasionally resetting the compression error at checkpoint loading does not affect the convergence. However, please avoid frequent checkpoint loading which could break the error compensation mechanism thus affect the convergence. @@ -136,7 +136,7 @@ You can also use a pre-trained BERT model checkpoint from either DeepSpeed, [Hug ### 2.1 Running BingBertSQuAD with DeepSpeed and 1-bit Adam -We provide example scripts under [DeepSpeedExamples/training/BingBertSquad/1-bit_adam/](https://github.com/microsoft/DeepSpeedExamples/tree/master/training/BingBertSquad/1-bit_adam). There are 3 sets of scripts corresponding to NCCL-based implementation, MPI-based implementation on Ethernet systems, and MPI-based implementation on InfiniBand systems. For MPI-based implementation, we provide both example scripts when launching with deepspeed or mpirun. +We provide example scripts under [DeepSpeedExamples/training/BingBertSquad/1-bit_adam/](https://github.com/deepspeedai/DeepSpeedExamples/tree/master/training/BingBertSquad/1-bit_adam). There are 3 sets of scripts corresponding to NCCL-based implementation, MPI-based implementation on Ethernet systems, and MPI-based implementation on InfiniBand systems. For MPI-based implementation, we provide both example scripts when launching with deepspeed or mpirun.
    More news @@ -66,15 +66,15 @@ In line with Microsoft's mission to solve humanity's most pressing challenges, t ## 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 an easy composition of a multitude of features within a single training, inference 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)). + The [DeepSpeed](https://github.com/deepspeedai/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 an easy composition of a multitude of features within a single training, inference 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. + [Model Implementations for Inference (MII)](https://github.com/deepspeedai/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 trying 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_deepspeed/azureml). For more details on how to use DeepSpeed on Azure, please follow the [Azure tutorial](https://www.deepspeed.ai/tutorials/azure/). + DeepSpeed users are diverse and have access to different environments. We recommend trying 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/deepspeedai/Megatron-DeepSpeed/tree/main/examples_deepspeed/azureml). For more details on how to use DeepSpeed on Azure, please follow the [Azure tutorial](https://www.deepspeed.ai/tutorials/azure/). # DeepSpeed Adoption @@ -131,15 +131,15 @@ comments. 3. Minjia Zhang, Yuxiong He. (2020) Accelerating Training of Transformer-Based Language Models with Progressive Layer Dropping. [arXiv:2010.13369](https://arxiv.org/abs/2010.13369) and [NeurIPS 2020](https://proceedings.neurips.cc/paper/2020/hash/a1140a3d0df1c81e24ae954d935e8926-Abstract.html). 4. Jie Ren, Samyam Rajbhandari, Reza Yazdani Aminabadi, Olatunji Ruwase, Shuangyan Yang, Minjia Zhang, Dong Li, Yuxiong He. (2021) ZeRO-Offload: Democratizing Billion-Scale Model Training. [arXiv:2101.06840](https://arxiv.org/abs/2101.06840) and [USENIX ATC 2021](https://www.usenix.org/conference/atc21/presentation/ren-jie). [[paper]](https://arxiv.org/abs/2101.06840) [[slides]](https://www.usenix.org/system/files/atc21_slides_ren-jie.pdf) [[blog]](https://www.microsoft.com/en-us/research/blog/deepspeed-extreme-scale-model-training-for-everyone/) 5. Hanlin Tang, Shaoduo Gan, Ammar Ahmad Awan, Samyam Rajbhandari, Conglong Li, Xiangru Lian, Ji Liu, Ce Zhang, Yuxiong He. (2021) 1-bit Adam: Communication Efficient Large-Scale Training with Adam's Convergence Speed. [arXiv:2102.02888](https://arxiv.org/abs/2102.02888) and [ICML 2021](http://proceedings.mlr.press/v139/tang21a.html). -6. Samyam Rajbhandari, Olatunji Ruwase, Jeff Rasley, Shaden Smith, Yuxiong He. (2021) ZeRO-Infinity: Breaking the GPU Memory Wall for Extreme Scale Deep Learning. [arXiv:2104.07857](https://arxiv.org/abs/2104.07857) and [SC 2021](https://dl.acm.org/doi/abs/10.1145/3458817.3476205). [[paper]](https://arxiv.org/abs/2104.07857) [[slides]](https://github.com/microsoft/DeepSpeed/blob/master/docs/assets/files/SC21-ZeRO-Infinity.pdf) [[blog]](https://www.microsoft.com/en-us/research/blog/zero-infinity-and-deepspeed-unlocking-unprecedented-model-scale-for-deep-learning-training/) +6. Samyam Rajbhandari, Olatunji Ruwase, Jeff Rasley, Shaden Smith, Yuxiong He. (2021) ZeRO-Infinity: Breaking the GPU Memory Wall for Extreme Scale Deep Learning. [arXiv:2104.07857](https://arxiv.org/abs/2104.07857) and [SC 2021](https://dl.acm.org/doi/abs/10.1145/3458817.3476205). [[paper]](https://arxiv.org/abs/2104.07857) [[slides]](https://github.com/deepspeedai/DeepSpeed/blob/master/docs/assets/files/SC21-ZeRO-Infinity.pdf) [[blog]](https://www.microsoft.com/en-us/research/blog/zero-infinity-and-deepspeed-unlocking-unprecedented-model-scale-for-deep-learning-training/) 7. Conglong Li, Ammar Ahmad Awan, Hanlin Tang, Samyam Rajbhandari, Yuxiong He. (2021) 1-bit LAMB: Communication Efficient Large-Scale Large-Batch Training with LAMB's Convergence Speed. [arXiv:2104.06069](https://arxiv.org/abs/2104.06069) and [HiPC 2022](https://hipc.org/advance-program/). 8. Conglong Li, Minjia Zhang, Yuxiong He. (2021) The Stability-Efficiency Dilemma: Investigating Sequence Length Warmup for Training GPT Models. [arXiv:2108.06084](https://arxiv.org/abs/2108.06084) and [NeurIPS 2022](https://openreview.net/forum?id=JpZ5du_Kdh). 9. Yucheng Lu, Conglong Li, Minjia Zhang, Christopher De Sa, Yuxiong He. (2022) Maximizing Communication Efficiency for Large-scale Training via 0/1 Adam. [arXiv:2202.06009](https://arxiv.org/abs/2202.06009). -10. Samyam Rajbhandari, Conglong Li, Zhewei Yao, Minjia Zhang, Reza Yazdani Aminabadi, Ammar Ahmad Awan, Jeff Rasley, Yuxiong He. (2022) DeepSpeed-MoE: Advancing Mixture-of-Experts Inference and Training to Power Next-Generation AI Scale [arXiv:2201.05596](https://arxiv.org/abs/2201.05596) and [ICML 2022](https://proceedings.mlr.press/v162/rajbhandari22a.html). [[pdf]](https://arxiv.org/abs/2201.05596) [[slides]](https://github.com/microsoft/DeepSpeed/blob/master/docs/assets/files/ICML-5mins.pdf) [[blog]](https://www.microsoft.com/en-us/research/blog/deepspeed-advancing-moe-inference-and-training-to-power-next-generation-ai-scale/) +10. Samyam Rajbhandari, Conglong Li, Zhewei Yao, Minjia Zhang, Reza Yazdani Aminabadi, Ammar Ahmad Awan, Jeff Rasley, Yuxiong He. (2022) DeepSpeed-MoE: Advancing Mixture-of-Experts Inference and Training to Power Next-Generation AI Scale [arXiv:2201.05596](https://arxiv.org/abs/2201.05596) and [ICML 2022](https://proceedings.mlr.press/v162/rajbhandari22a.html). [[pdf]](https://arxiv.org/abs/2201.05596) [[slides]](https://github.com/deepspeedai/DeepSpeed/blob/master/docs/assets/files/ICML-5mins.pdf) [[blog]](https://www.microsoft.com/en-us/research/blog/deepspeed-advancing-moe-inference-and-training-to-power-next-generation-ai-scale/) 11. Shaden Smith, Mostofa Patwary, Brandon Norick, Patrick LeGresley, Samyam Rajbhandari, Jared Casper, Zhun Liu, Shrimai Prabhumoye, George Zerveas, Vijay Korthikanti, Elton Zhang, Rewon Child, Reza Yazdani Aminabadi, Julie Bernauer, Xia Song, Mohammad Shoeybi, Yuxiong He, Michael Houston, Saurabh Tiwary, Bryan Catanzaro. (2022) Using DeepSpeed and Megatron to Train Megatron-Turing NLG 530B, A Large-Scale Generative Language Model [arXiv:2201.11990](https://arxiv.org/abs/2201.11990). 12. Xiaoxia Wu, Zhewei Yao, Minjia Zhang, Conglong Li, Yuxiong He. (2022) Extreme Compression for Pre-trained Transformers Made Simple and Efficient. [arXiv:2206.01859](https://arxiv.org/abs/2206.01859) and [NeurIPS 2022](https://openreview.net/forum?id=xNeAhc2CNAl). -13. Zhewei Yao, Reza Yazdani Aminabadi, Minjia Zhang, Xiaoxia Wu, Conglong Li, Yuxiong He. (2022) ZeroQuant: Efficient and Affordable Post-Training Quantization for Large-Scale Transformers. [arXiv:2206.01861](https://arxiv.org/abs/2206.01861) and [NeurIPS 2022](https://openreview.net/forum?id=f-fVCElZ-G1) [[slides]](https://github.com/microsoft/DeepSpeed/blob/master/docs/assets/files/zeroquant_series.pdf) [[blog]](https://www.microsoft.com/en-us/research/blog/deepspeed-compression-a-composable-library-for-extreme-compression-and-zero-cost-quantization/) -14. Reza Yazdani Aminabadi, Samyam Rajbhandari, Minjia Zhang, Ammar Ahmad Awan, Cheng Li, Du Li, Elton Zheng, Jeff Rasley, Shaden Smith, Olatunji Ruwase, Yuxiong He. (2022) DeepSpeed Inference: Enabling Efficient Inference of Transformer Models at Unprecedented Scale. [arXiv:2207.00032](https://arxiv.org/abs/2207.00032) and [SC 2022](https://dl.acm.org/doi/abs/10.5555/3571885.3571946). [[paper]](https://arxiv.org/abs/2207.00032) [[slides]](https://github.com/microsoft/DeepSpeed/blob/master/docs/assets/files/sc22-ds-inference.pdf) [[blog]](https://www.microsoft.com/en-us/research/blog/deepspeed-accelerating-large-scale-model-inference-and-training-via-system-optimizations-and-compression/) +13. Zhewei Yao, Reza Yazdani Aminabadi, Minjia Zhang, Xiaoxia Wu, Conglong Li, Yuxiong He. (2022) ZeroQuant: Efficient and Affordable Post-Training Quantization for Large-Scale Transformers. [arXiv:2206.01861](https://arxiv.org/abs/2206.01861) and [NeurIPS 2022](https://openreview.net/forum?id=f-fVCElZ-G1) [[slides]](https://github.com/deepspeedai/DeepSpeed/blob/master/docs/assets/files/zeroquant_series.pdf) [[blog]](https://www.microsoft.com/en-us/research/blog/deepspeed-compression-a-composable-library-for-extreme-compression-and-zero-cost-quantization/) +14. Reza Yazdani Aminabadi, Samyam Rajbhandari, Minjia Zhang, Ammar Ahmad Awan, Cheng Li, Du Li, Elton Zheng, Jeff Rasley, Shaden Smith, Olatunji Ruwase, Yuxiong He. (2022) DeepSpeed Inference: Enabling Efficient Inference of Transformer Models at Unprecedented Scale. [arXiv:2207.00032](https://arxiv.org/abs/2207.00032) and [SC 2022](https://dl.acm.org/doi/abs/10.5555/3571885.3571946). [[paper]](https://arxiv.org/abs/2207.00032) [[slides]](https://github.com/deepspeedai/DeepSpeed/blob/master/docs/assets/files/sc22-ds-inference.pdf) [[blog]](https://www.microsoft.com/en-us/research/blog/deepspeed-accelerating-large-scale-model-inference-and-training-via-system-optimizations-and-compression/) 15. Zhewei Yao, Xiaoxia Wu, Conglong Li, Connor Holmes, Minjia Zhang, Cheng Li, Yuxiong He. (2022) Random-LTD: Random and Layerwise Token Dropping Brings Efficient Training for Large-scale Transformers. [arXiv:2211.11586](https://arxiv.org/abs/2211.11586). 16. Conglong Li, Zhewei Yao, Xiaoxia Wu, Minjia Zhang, Yuxiong He. (2022) DeepSpeed Data Efficiency: Improving Deep Learning Model Quality and Training Efficiency via Efficient Data Sampling and Routing. [arXiv:2212.03597](https://arxiv.org/abs/2212.03597) [ENLSP2023 Workshop at NeurIPS2023](https://neurips2023-enlsp.github.io/) 17. Xiaoxia Wu, Cheng Li, Reza Yazdani Aminabadi, Zhewei Yao, Yuxiong He. (2023) Understanding INT4 Quantization for Transformer Models: Latency Speedup, Composability, and Failure Cases. [arXiv:2301.12017](https://arxiv.org/abs/2301.12017) and [ICML2023](https://icml.cc/Conferences/2023). @@ -148,10 +148,10 @@ comments. 20. Quentin Anthony, Ammar Ahmad Awan, Jeff Rasley, Yuxiong He, Aamir Shafi, Mustafa Abduljabbar, Hari Subramoni, Dhabaleswar Panda. (2023) MCR-DL: Mix-and-Match Communication Runtime for Deep Learning [arXiv:2303.08374](https://arxiv.org/abs/2303.08374) and will appear at IPDPS 2023. 21. Siddharth Singh, Olatunji Ruwase, Ammar Ahmad Awan, Samyam Rajbhandari, Yuxiong He, Abhinav Bhatele. (2023) A Hybrid Tensor-Expert-Data Parallelism Approach to Optimize Mixture-of-Experts Training [arXiv:2303.06318](https://arxiv.org/abs/2303.06318) and will appear at ICS 2023. 22. Guanhua Wang, Heyang Qin, Sam Ade Jacobs, Xiaoxia Wu, Connor Holmes, Zhewei Yao, Samyam Rajbhandari, Olatunji Ruwase, Feng Yan, Lei Yang, Yuxiong He. (2023) ZeRO++: Extremely Efficient Collective Communication for Giant Model Training [arXiv:2306.10209](https://arxiv.org/abs/2306.10209) and [ML for Sys Workshop at NeurIPS2023](http://mlforsystems.org/) [[blog]](https://www.microsoft.com/en-us/research/blog/deepspeed-zero-a-leap-in-speed-for-llm-and-chat-model-training-with-4x-less-communication/) -23. Zhewei Yao, Xiaoxia Wu, Cheng Li, Stephen Youn, Yuxiong He. (2023) ZeroQuant-V2: Exploring Post-training Quantization in LLMs from Comprehensive Study to Low Rank Compensation [arXiv:2303.08302](https://arxiv.org/abs/2303.08302) and [ENLSP2023 Workshop at NeurIPS2023](https://neurips2023-enlsp.github.io/) [[slides]](https://github.com/microsoft/DeepSpeed/blob/master/docs/assets/files/zeroquant_series.pdf) +23. Zhewei Yao, Xiaoxia Wu, Cheng Li, Stephen Youn, Yuxiong He. (2023) ZeroQuant-V2: Exploring Post-training Quantization in LLMs from Comprehensive Study to Low Rank Compensation [arXiv:2303.08302](https://arxiv.org/abs/2303.08302) and [ENLSP2023 Workshop at NeurIPS2023](https://neurips2023-enlsp.github.io/) [[slides]](https://github.com/deepspeedai/DeepSpeed/blob/master/docs/assets/files/zeroquant_series.pdf) 24. Pareesa Ameneh Golnari, Zhewei Yao, Yuxiong He. (2023) Selective Guidance: Are All the Denoising Steps of Guided Diffusion Important? [arXiv:2305.09847](https://arxiv.org/abs/2305.09847) 25. Zhewei Yao, Reza Yazdani Aminabadi, Olatunji Ruwase, Samyam Rajbhandari, Xiaoxia Wu, Ammar Ahmad Awan, Jeff Rasley, Minjia Zhang, Conglong Li, Connor Holmes, Zhongzhu Zhou, Michael Wyatt, Molly Smith, Lev Kurilenko, Heyang Qin, Masahiro Tanaka, Shuai Che, Shuaiwen Leon Song, Yuxiong He. (2023) DeepSpeed-Chat: Easy, Fast and Affordable RLHF Training of ChatGPT-like Models at All Scales [arXiv:2308.01320](https://arxiv.org/abs/2308.01320). -26. Xiaoxia Wu, Zhewei Yao, Yuxiong He. (2023) ZeroQuant-FP: A Leap Forward in LLMs Post-Training W4A8 Quantization Using Floating-Point Formats [arXiv:2307.09782](https://arxiv.org/abs/2307.09782) and [ENLSP2023 Workshop at NeurIPS2023](https://neurips2023-enlsp.github.io/) [[slides]](https://github.com/microsoft/DeepSpeed/blob/master/docs/assets/files/zeroquant_series.pdf) +26. Xiaoxia Wu, Zhewei Yao, Yuxiong He. (2023) ZeroQuant-FP: A Leap Forward in LLMs Post-Training W4A8 Quantization Using Floating-Point Formats [arXiv:2307.09782](https://arxiv.org/abs/2307.09782) and [ENLSP2023 Workshop at NeurIPS2023](https://neurips2023-enlsp.github.io/) [[slides]](https://github.com/deepspeedai/DeepSpeed/blob/master/docs/assets/files/zeroquant_series.pdf) 27. Zhewei Yao, Xiaoxia Wu, Conglong Li, Minjia Zhang, Heyang Qin, Olatunji Ruwase, Ammar Ahmad Awan, Samyam Rajbhandari, Yuxiong He. (2023) DeepSpeed-VisualChat: Multi-Round Multi-Image Interleave Chat via Multi-Modal Causal Attention [arXiv:2309.14327](https://arxiv.org/pdf/2309.14327.pdf) 28. Shuaiwen Leon Song, Bonnie Kruft, Minjia Zhang, Conglong Li, Shiyang Chen, Chengming Zhang, Masahiro Tanaka, Xiaoxia Wu, Jeff Rasley, Ammar Ahmad Awan, Connor Holmes, Martin Cai, Adam Ghanem, Zhongzhu Zhou, Yuxiong He, et al. (2023) DeepSpeed4Science Initiative: Enabling Large-Scale Scientific Discovery through Sophisticated AI System Technologies [arXiv:2310.04610](https://arxiv.org/abs/2310.04610) [[blog]](https://www.microsoft.com/en-us/research/blog/announcing-the-deepspeed4science-initiative-enabling-large-scale-scientific-discovery-through-sophisticated-ai-system-technologies/) 29. Zhewei Yao, Reza Yazdani Aminabadi, Stephen Youn, Xiaoxia Wu, Elton Zheng, Yuxiong He. (2023) ZeroQuant-HERO: Hardware-Enhanced Robust Optimized Post-Training Quantization Framework for W8A8 Transformers [arXiv:2310.17723](https://arxiv.org/abs/2310.17723) diff --git a/examples/README.md b/examples/README.md index 14393ef4545d..c7ff01dcd2d4 100644 --- a/examples/README.md +++ b/examples/README.md @@ -2,8 +2,8 @@ If you are looking for examples using DeepSpeed please see the following resources: -1. [DeepSpeedExamples](https://github.com/microsoft/DeepSpeedExamples) -2. [Megatron-DeepSpeed](https://github.com/microsoft/Megatron-DeepSpeed) +1. [DeepSpeedExamples](https://github.com/deepspeedai/DeepSpeedExamples) +2. [Megatron-DeepSpeed](https://github.com/deepspeedai/Megatron-DeepSpeed) 3. [DeepSpeed + AzureML](https://github.com/Azure/azureml-examples/tree/main/v1/python-sdk/workflows/train/deepspeed) 4. [DeepSpeed + Hugging Face Transformers Integration](https://huggingface.co/docs/transformers/deepspeed) 5. [DeepSpeed + PyTorch Lightning](https://lightning.ai/docs/pytorch/stable/api/lightning.pytorch.utilities.deepspeed.html) diff --git a/op_builder/sparse_attn.py b/op_builder/sparse_attn.py index 66f748ee8f7a..b8e5e8a6fd9a 100644 --- a/op_builder/sparse_attn.py +++ b/op_builder/sparse_attn.py @@ -68,7 +68,7 @@ def is_compatible(self, verbose=False): import triton except ImportError: # auto-install of triton is broken on some systems, reverting to manual install for now - # see this issue: https://github.com/microsoft/DeepSpeed/issues/1710 + # see this issue: https://github.com/deepspeedai/DeepSpeed/issues/1710 if verbose: self.warning(f"please install triton==1.0.0 if you want to use sparse attention") return False diff --git a/setup.py b/setup.py index ec2e9a754d30..20afc651a142 100755 --- a/setup.py +++ b/setup.py @@ -313,7 +313,7 @@ def op_enabled(op_name): url='http://deepspeed.ai', project_urls={ 'Documentation': 'https://deepspeed.readthedocs.io', - 'Source': 'https://github.com/microsoft/DeepSpeed', + 'Source': 'https://github.com/deepspeedai/DeepSpeed', }, install_requires=install_requires, extras_require=extras_require, diff --git a/tests/unit/runtime/zero/test_zero.py b/tests/unit/runtime/zero/test_zero.py index d39953f40f07..2ae2755086f8 100644 --- a/tests/unit/runtime/zero/test_zero.py +++ b/tests/unit/runtime/zero/test_zero.py @@ -85,7 +85,7 @@ def test(self, zero_stage): run_unbalanced_gradients(model, data_loader) -# testing the fix https://github.com/microsoft/DeepSpeed/pull/1227 +# testing the fix https://github.com/deepspeedai/DeepSpeed/pull/1227 @pytest.mark.parametrize("mics_enabled", [True, False]) class TestZero3RepeatForwardLoop(DistributedTest): world_size = 1 @@ -144,8 +144,8 @@ def forward(self, x, y): model.step() -# testing the fix https://github.com/microsoft/DeepSpeed/pull/1227 -# also reproduces the https://github.com/microsoft/DeepSpeed/pull/1372 +# testing the fix https://github.com/deepspeedai/DeepSpeed/pull/1227 +# also reproduces the https://github.com/deepspeedai/DeepSpeed/pull/1372 @pytest.mark.parametrize("zero_stage", [2, 3]) @pytest.mark.parametrize("freeze_params", [True, False]) class TestZeroToFP32(DistributedTest): @@ -178,7 +178,7 @@ class MyModel(torch.nn.Module): def __init__(self, hidden_dim, n_layers, freeze_params): super().__init__() - # to reproduce https://github.com/microsoft/DeepSpeed/pull/1372 it is important that + # to reproduce https://github.com/deepspeedai/DeepSpeed/pull/1372 it is important that # the number of total elements is uneven: # (1) 4 layers of 3*(3+1)=12 elements each, 48 in total self.ll = torch.nn.ModuleList(torch.nn.Linear(hidden_dim, hidden_dim) for i in range(n_layers)) @@ -1676,7 +1676,7 @@ def test(self, prefetch_ratio, zero_stage=3): # Avoid overwriting client module id -# https://github.com/microsoft/DeepSpeed/issues/6772 +# https://github.com/deepspeedai/DeepSpeed/issues/6772 class TestZero3ClientModuleID(DistributedTest): world_size = 2 diff --git a/tests/unit/runtime/zero/test_zero_context_ancestry.py b/tests/unit/runtime/zero/test_zero_context_ancestry.py index 21955f5df152..77a8744ab5bc 100644 --- a/tests/unit/runtime/zero/test_zero_context_ancestry.py +++ b/tests/unit/runtime/zero/test_zero_context_ancestry.py @@ -32,7 +32,7 @@ # test that sub-classes get params that aren't prematurely partitioned and thus requiring gathering -# fixed by https://github.com/microsoft/DeepSpeed/pull/1202 +# fixed by https://github.com/deepspeedai/DeepSpeed/pull/1202 class GrandPa(torch.nn.Module): def __init__(self, *args): diff --git a/tests/unit/sequence_parallelism/test_ulysses.py b/tests/unit/sequence_parallelism/test_ulysses.py index 821847c44265..bd20900a3d1e 100644 --- a/tests/unit/sequence_parallelism/test_ulysses.py +++ b/tests/unit/sequence_parallelism/test_ulysses.py @@ -61,7 +61,7 @@ def test_alltoall_output_consistency(self, d0: int, d1: int, head_dim: int, num_ outputs = [] seq_dims = [0] #seq first API #TODO: Add support for batch first (that seq_dims=[0,1]) after PR for bs>1 issue with batch first is fixed - ## See discussion in : https://github.com/microsoft/DeepSpeed/issues/5808 + ## See discussion in : https://github.com/deepspeedai/DeepSpeed/issues/5808 for seq_dim in seq_dims: gather_idx = seq_dim #first all2all: sequence parallel to head parallel From a1df4b4c0a5ce62d905ba98c9dcdd84ac865bd4f Mon Sep 17 00:00:00 2001 From: Logan Adams <114770087+loadams@users.noreply.github.com> Date: Wed, 5 Feb 2025 11:48:14 -0800 Subject: [PATCH 709/754] Update CNAME --- docs/CNAME | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/CNAME b/docs/CNAME index 72033bc5f7fe..47cf5e28f3ea 100644 --- a/docs/CNAME +++ b/docs/CNAME @@ -1 +1 @@ -www.deepspeed.ai +deepspeed.ai \ No newline at end of file From bee641dd706d45bef9eaf38bf45fae6960cccec2 Mon Sep 17 00:00:00 2001 From: Logan Adams <114770087+loadams@users.noreply.github.com> Date: Wed, 5 Feb 2025 12:16:37 -0800 Subject: [PATCH 710/754] Update CNAME --- docs/CNAME | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/CNAME b/docs/CNAME index 47cf5e28f3ea..47f170e64eeb 100644 --- a/docs/CNAME +++ b/docs/CNAME @@ -1 +1 @@ -deepspeed.ai \ No newline at end of file +www.deepspeed.ai \ No newline at end of file From e7fc5986522cae760d005c18d6907e2068da8f4c Mon Sep 17 00:00:00 2001 From: Liangliang Ma <1906710196@qq.com> Date: Thu, 6 Feb 2025 04:17:56 +0800 Subject: [PATCH 711/754] [XPU] max1100 workflow update for docker and softwares (#7003) 1. update intel oneAPI basekit to 2025.0 2. update torch/ipex/oneccl to 2.5 --- .github/workflows/xpu-max1100.yml | 19 +++++++++++++------ 1 file changed, 13 insertions(+), 6 deletions(-) diff --git a/.github/workflows/xpu-max1100.yml b/.github/workflows/xpu-max1100.yml index 56bff4a88ba9..2d84f8f60571 100644 --- a/.github/workflows/xpu-max1100.yml +++ b/.github/workflows/xpu-max1100.yml @@ -36,7 +36,7 @@ jobs: unit-tests: runs-on: [self-hosted, intel, xpu] container: - image: intel/oneapi-basekit:2024.2.1-0-devel-ubuntu22.04 + image: intel/oneapi-basekit:2025.0.1-0-devel-ubuntu24.04 ports: - 80 options: --privileged -it --rm --device /dev/dri:/dev/dri -v /dev/dri/by-path:/dev/dri/by-path --ipc=host --cap-add=ALL @@ -44,18 +44,23 @@ jobs: steps: - uses: actions/checkout@v4 - name: Install prerequisite + shell: bash run: | apt-get update - apt-get install clinfo libaio-dev python3-pip -y - pip install torch==2.3.1 -f https://pytorch-extension.intel.com/release-whl/stable/xpu/cn/torch/ - pip install intel-extension-for-pytorch==2.3.110+xpu -f https://pytorch-extension.intel.com/release-whl/stable/xpu/cn/intel-extension-for-pytorch/ - pip install oneccl_bind_pt==2.3.100+xpu -f https://pytorch-extension.intel.com/release-whl/stable/xpu/cn/oneccl-bind-pt/ - pip install torchvision==0.18.1 -f https://pytorch-extension.intel.com/release-whl/stable/xpu/cn/torchvision/ + apt-get install clinfo libaio-dev python3-pip python3.12-venv -y + python3 -m venv ~/ds_env + source ~/ds_env/bin/activate + pip install torch==2.5.1 -f https://pytorch-extension.intel.com/release-whl/stable/xpu/cn/torch/ + pip install intel-extension-for-pytorch==2.5.10+xpu -f https://pytorch-extension.intel.com/release-whl/stable/xpu/cn/intel-extension-for-pytorch/ + pip install oneccl_bind_pt==2.5.0+xpu -f https://pytorch-extension.intel.com/release-whl/stable/xpu/cn/oneccl-bind-pt/ + pip install torchvision==0.20.1 -f https://pytorch-extension.intel.com/release-whl/stable/xpu/cn/torchvision/ pip install py-cpuinfo numpy pip install .[dev,autotuning] - name: Check container state + shell: bash run: | + source ~/ds_env/bin/activate ldd --version ds_report python3 -c "import torch; print('torch:', torch.__version__, torch)" @@ -64,7 +69,9 @@ jobs: pip list - name: Unit tests + shell: bash run: | + source ~/ds_env/bin/activate cd tests/unit pytest --verbose accelerator/* pytest --verbose autotuning/* From f04649d278e6d4b59b3e60881ed000b24b6e2bae Mon Sep 17 00:00:00 2001 From: inkcherry Date: Thu, 6 Feb 2025 02:39:34 +0800 Subject: [PATCH 712/754] autotp training(fix dco) (#7004) Same as [this PR](https://github.com/deepspeedai/DeepSpeed/pull/6922). [affeb88](https://github.com/deepspeedai/DeepSpeed/pull/6922/commits/affeb884576936b3a0efc5ce86435da37db1d87e) I noticed the CI updated the DCO check recently. Using the suggested rebase method for sign-off would reintroduce many conflicts, so I opted for a squash merge with sign-off instead. thanks: ) Signed-off-by: inkcherry --- deepspeed/__init__.py | 33 +- deepspeed/comm/comm.py | 6 + deepspeed/comm/torch.py | 4 + deepspeed/inference/engine.py | 1 - deepspeed/module_inject/__init__.py | 2 +- deepspeed/module_inject/auto_tp.py | 89 +-- deepspeed/module_inject/layers.py | 661 +++++++++++++++--- deepspeed/module_inject/load_checkpoint.py | 6 +- deepspeed/module_inject/replace_module.py | 6 +- deepspeed/runtime/config.py | 2 + deepspeed/runtime/engine.py | 120 +++- deepspeed/runtime/tensor_parallel/__init__.py | 7 + deepspeed/runtime/tensor_parallel/config.py | 81 +++ .../runtime/tensor_parallel/tp_manager.py | 66 ++ deepspeed/runtime/utils.py | 45 +- deepspeed/utils/groups.py | 123 +++- .../model_parallelism/test_autotp_training.py | 574 +++++++++++++++ 17 files changed, 1662 insertions(+), 164 deletions(-) create mode 100644 deepspeed/runtime/tensor_parallel/__init__.py create mode 100644 deepspeed/runtime/tensor_parallel/config.py create mode 100644 deepspeed/runtime/tensor_parallel/tp_manager.py create mode 100644 tests/unit/model_parallelism/test_autotp_training.py diff --git a/deepspeed/__init__.py b/deepspeed/__init__.py index a8d15cd5332b..fd1f421b8954 100755 --- a/deepspeed/__init__.py +++ b/deepspeed/__init__.py @@ -37,7 +37,7 @@ from .runtime.config import DeepSpeedConfig, DeepSpeedConfigError from .runtime.activation_checkpointing import checkpointing from .ops.transformer import DeepSpeedTransformerLayer, DeepSpeedTransformerConfig -from .module_inject import replace_transformer_layer, revert_transformer_layer +from .module_inject import replace_transformer_layer, revert_transformer_layer, set_autotp_mode from .utils import log_dist, OnDevice, logger from .comm.comm import init_distributed @@ -364,3 +364,34 @@ def init_inference(model, config=None, **kwargs): engine = InferenceEngine(model, config=ds_inference_config) return engine + + +def tp_model_init(model, tp_size, dtype): + """ + Initialize the model for tensor parallelism. + + Args: + model (torch.nn.Module): The model to be initialized. + tp_size (int): The tensor parallelism size. + dtype (torch.dtype): The data type to be used for the model. + + Returns: + torch.nn.Module: The initialized model with tensor parallelism. + """ + # avoid re-entry + assert not hasattr( + model, 'ds_autotp_parsed'), "ds_autotp_parsed' attribute already exists in the model, re-entry is not allowed." + + set_autotp_mode(training=True) + + from deepspeed.runtime.tensor_parallel import TpTrainingManager + # The expected usage here is for it to be invoked by transformers package. + + #TODO: We should provide a custom TP mapping solution without using autoTP + #as modifying the autoTP logic may be more difficult for users compared to configuring it + + model = TpTrainingManager(model=model, tp_size=tp_size, dtype=dtype).module + + setattr(model, 'ds_autotp_parsed', True) + + return model diff --git a/deepspeed/comm/comm.py b/deepspeed/comm/comm.py index df8e8022081d..1aa9b135115b 100755 --- a/deepspeed/comm/comm.py +++ b/deepspeed/comm/comm.py @@ -224,6 +224,12 @@ def broadcast(tensor, src, group=None, async_op=False, prof=False, log_name='bro return cdb.broadcast(tensor=tensor, src=src, group=group, async_op=async_op) +@timed_op +def broadcast_object_list(object_list, src, group=None, device=None): + global cdb + return cdb.broadcast_object_list(object_list=object_list, src=src, group=group, device=device) + + @timed_op def all_gather(tensor_list, tensor, diff --git a/deepspeed/comm/torch.py b/deepspeed/comm/torch.py index 5461ae18d1f0..efa0640fb87b 100755 --- a/deepspeed/comm/torch.py +++ b/deepspeed/comm/torch.py @@ -205,6 +205,10 @@ def broadcast(self, tensor, src, group=None, async_op=False): else: return torch.distributed.broadcast(tensor=tensor, src=src, group=group, async_op=async_op) + @disable_compiler_collective + def broadcast_object_list(self, object_list, src, group=None, device=None): + return torch.distributed.broadcast_object_list(object_list=object_list, src=src, group=group, device=device) + @disable_compiler_collective def all_gather(self, tensor_list, tensor, group=None, async_op=False): if DS_COMM_ALL_GATHER_OFF: diff --git a/deepspeed/inference/engine.py b/deepspeed/inference/engine.py index 3089d0c557a4..a529d9343228 100755 --- a/deepspeed/inference/engine.py +++ b/deepspeed/inference/engine.py @@ -15,7 +15,6 @@ from deepspeed.runtime.checkpoint_engine.torch_checkpoint_engine import TorchCheckpointEngine from deepspeed.utils.timer import SynchronizedWallClockTimer from deepspeed.runtime.compiler import is_compile_supported - from ..runtime.state_dict_factory import SDLoaderFactory from ..runtime.weight_quantizer import WeightQuantization from ..module_inject import replace_transformer_layer, generic_injection diff --git a/deepspeed/module_inject/__init__.py b/deepspeed/module_inject/__init__.py index 4bdabf383b26..9fc2f979a04b 100755 --- a/deepspeed/module_inject/__init__.py +++ b/deepspeed/module_inject/__init__.py @@ -6,5 +6,5 @@ from .replace_module import replace_transformer_layer, revert_transformer_layer, ReplaceWithTensorSlicing, GroupQuantizer, generic_injection from .module_quantize import quantize_transformer_layer from .replace_policy import HFBertLayerPolicy -from .layers import LinearAllreduce, LinearLayer, EmbeddingLayer, Normalize +from .layers import LinearAllreduce, LinearLayer, EmbeddingLayer, Normalize, set_autotp_mode from .policy import DSPolicy diff --git a/deepspeed/module_inject/auto_tp.py b/deepspeed/module_inject/auto_tp.py index 8bdcf6faa053..d148c26968b3 100755 --- a/deepspeed/module_inject/auto_tp.py +++ b/deepspeed/module_inject/auto_tp.py @@ -11,10 +11,12 @@ from typing import Optional import torch from deepspeed import comm as dist -from .layers import LinearAllreduce, LinearLayer, LmHeadLinearAllreduce +from .layers import LinearAllreduce, LinearLayer, LmHeadLinearAllreduce, Yuan_LinearAllreduce, Yuan_LinearLayer, GateUpPack_LinearLayer, Conv_LinearALlreduce, fused_LinearLayer, conv_LinearLayer from deepspeed.accelerator import get_accelerator -from .fusedqkv_utils import require_tp_fused_qkvw, prepare_tp_fused_qkvw, shard_value_with_share_qk, shard_chunk_mlp +from .fusedqkv_utils import require_tp_fused_qkvw from deepspeed.module_inject.tp_shard import get_shard_size, get_shard_size_list +from deepspeed.utils import groups +from deepspeed.module_inject.layers import is_autotp_training_mode def move(tensor, device, copy=True): @@ -333,10 +335,18 @@ def tp_parser(model): return policy_list def set_tensor_parallel_config(self, mp_size, mp_group): + + if is_autotp_training_mode(): + self.mp_group = groups.get_tensor_model_parallel_group() + self.mp_size = groups.get_tensor_model_parallel_world_size() + return + self.mp_size = mp_size self.mp_group = mp_group def _replace(self, child, name, conv_linear_layer): + # This function should clearly define the routing rules for specific layers + # and avoid any complex shard-related logic. if getattr(child, "replaced", False) == True: return device_name = 'cpu' if self.keep_module_on_host else get_accelerator().current_device_name() @@ -352,14 +362,15 @@ def _replace(self, child, name, conv_linear_layer): # For Yuan model if 'Yuan' in str(self.module): if 'v_proj' in name: - weight, bias = shard_value_with_share_qk(child.weight.data, child.bias, dist.get_rank(), - dist.get_world_size(), True) - return LinearLayer(weight=weight, bias=bias) + return Yuan_LinearLayer(child, self.mp_group) + elif 'o_proj' in name: - weight, bias = shard_value_with_share_qk(child.weight.data, child.bias, dist.get_rank(), - dist.get_world_size(), False) - return LinearAllreduce(weight, bias, self.mp_group) - # For Arctic model, bypass to all_reduce replacement for w2 weights + return Yuan_LinearAllreduce(child, self.mp_group) + + # For MLP including chunk layer. + if 'gate_up_proj' in name or ('dense_h_to_4h' in name and 'GLM' in str(self.module)): + return GateUpPack_LinearLayer(child, self.mp_group) + # For Arctic model, bypass to all_reduce replacement for w2 weights arctic_w2_all_reduce_linear = False if 'Arctic' in str(self.module) and 'w2' in name: arctic_w2_all_reduce_linear = True @@ -367,65 +378,25 @@ def _replace(self, child, name, conv_linear_layer): down_proj = False if 'down_proj' in name: down_proj = True - # For MLP including chunk layer. - if 'gate_up_proj' in name or ('dense_h_to_4h' in name and 'GLM' in str(self.module)): - weight, bias = shard_chunk_mlp(child.weight.data, child.bias, dist.get_rank(), dist.get_world_size()) - return LinearLayer(weight=weight, bias=bias) if name in self.all_reduce_linears or arctic_w2_all_reduce_linear or down_proj: - # if conv_linear_layer [weight_shape[1], weight_shape[0] // mp_size] - # else [weight_shape[0], weight_shape[1] // mp_size] + setattr(child, "replaced", True) if self.conv_linear_layer: - child.weight.data = child.weight.data.transpose(-1, -2).contiguous() - data = child.weight.data.split(get_shard_size_list( - weight_shape[0] if self.conv_linear_layer else weight_shape[1], self.mp_size, name), - dim=1) - data_dc = move(data[mp_replace.gpu_index], device_name, return_new_copy).detach() - del data + return Conv_LinearALlreduce(child, self.mp_group, name=name) + elif name == "lm_head" or name == 'embed_out': + return LmHeadLinearAllreduce(child, self.mp_group) - setattr(child, "replaced", True) - if name == "lm_head" or name == 'embed_out': - return LmHeadLinearAllreduce( - torch.nn.parameter.Parameter(data_dc, requires_grad=False), dist.get_rank(), dist.get_world_size(), - child.bias if child.bias is None else torch.nn.parameter.Parameter( - move(child.bias, device_name, return_new_copy)), self.mp_group) - return LinearAllreduce(torch.nn.parameter.Parameter(data_dc, requires_grad=False), child.bias if child.bias is None else \ - torch.nn.parameter.Parameter(move(child.bias, device_name, return_new_copy)), self.mp_group) + return LinearAllreduce(child, self.mp_group, name=name) else: - # if conv_linear_layer [weight_shape[1], weight_shape[0] // mp_size] - # else [weight_shape[0] // mp_size, weight_shape[1]] + setattr(child, "replaced", True) if self.conv_linear_layer: - child.weight.data = child.weight.data.transpose(-1, -2).contiguous() - - if require_tp_fused_qkvw(name, self.mp_size): + conv_LinearLayer(child, self.mp_group) + elif require_tp_fused_qkvw(name, self.mp_size): #Check and handle fused qkv for TP - #The copy is a regular copy, The shape of dst and src is the same - data_dc = move( - prepare_tp_fused_qkvw(self.module, child.weight.data, self.mp_size, mp_replace.gpu_index), - device_name, return_new_copy) - - bias_data_dc = None if child.bias is None else move( - prepare_tp_fused_qkvw(self.module, child.bias.data, self.mp_size, mp_replace.gpu_index), - device_name, return_new_copy) - else: - data = child.weight.data.split(get_shard_size_list(weight_shape[0], self.mp_size, name), - dim=1 if self.conv_linear_layer else 0) - data_dc = move(data[mp_replace.gpu_index], device_name, return_new_copy).detach() - del data - - if child.bias is not None: - bias_data = child.bias.data.split(get_shard_size_list( - weight_shape[1] if self.conv_linear_layer else weight_shape[0], self.mp_size, name), - dim=0) - bias_data = move(bias_data[mp_replace.gpu_index], device_name, return_new_copy) - bias_data_dc = torch.nn.parameter.Parameter(bias_data, requires_grad=False) - del bias_data - else: - bias_data_dc = None + return fused_LinearLayer(child, self.mp_group, fused_module=self.module) - setattr(child, "replaced", True) - return LinearLayer(weight=torch.nn.parameter.Parameter(data_dc, requires_grad=False), bias=bias_data_dc) + return LinearLayer(child, self.mp_group, name=name) def _slice_embedding(self, child, name, conv_linear_layer): if getattr(child, "replaced", False) == True: diff --git a/deepspeed/module_inject/layers.py b/deepspeed/module_inject/layers.py index 2f884ba4fb09..c410bf900c31 100644 --- a/deepspeed/module_inject/layers.py +++ b/deepspeed/module_inject/layers.py @@ -7,10 +7,578 @@ from deepspeed import comm as dist from torch import nn from torch.nn import functional as F - from torch.nn.parameter import Parameter from deepspeed.accelerator import get_accelerator from deepspeed.module_inject.tp_shard import get_shard_size, get_shard_size_list +from abc import ABC, abstractmethod +from typing import Iterable, Any, Optional, List, Tuple +from .fusedqkv_utils import shard_value_with_share_qk, shard_chunk_mlp, prepare_tp_fused_qkvw +from deepspeed.runtime.tensor_parallel import AUTOTP_MODE +from copy import deepcopy +from typing import Union + +DEEPSPEED_AUTOTP_MODE = AUTOTP_MODE.INFERENCE +DS_IS_REPLACED_MODULE = 'ds_is_replaced_module' +DS_TENSOR_MODEL_PARALLEL = 'tensor_model_parallel' + + +def get_auto_tp_mode(): + global DEEPSPEED_AUTOTP_MODE + return DEEPSPEED_AUTOTP_MODE + + +def is_autotp_training_mode(): + global DEEPSPEED_AUTOTP_MODE + return DEEPSPEED_AUTOTP_MODE == AUTOTP_MODE.TRAINING + + +def set_autotp_mode(training=False): + """ + Set the DEEPSPEED_AUTOTP_MODE based on the training flag + """ + global DEEPSPEED_AUTOTP_MODE + if training: + DEEPSPEED_AUTOTP_MODE = AUTOTP_MODE.TRAINING + else: + DEEPSPEED_AUTOTP_MODE = AUTOTP_MODE.INFERENCE + + +def move(tensor, device): + # TODO: consider the timing of deletion + # to save host resources when DP > 1。 + + if tensor.is_meta: + return torch.empty_like(tensor, device=device) + else: + # Using new tensors help in freeing memory (after split for example) was done before by calling clone(). + # Using copy=True instead of clone() will help in case of cpu --> cpu. + # Otherwise to() will not create a new copy for the view of the full tensor, and it will not be de-referenced. + cloned_tensor = tensor.to(device, copy=True) + + # free the memory of the original tensor to reduce memory peak + # Equivalent to directly deleting the tensor reference outside the function. + # see https://github.com/microsoft/DeepSpeed/pull/4353 + tensor.data = torch.empty(0, device=tensor.device) + return cloned_tensor + + +class RowParallel(torch.autograd.Function): + """ + A custom autograd function for performing row-wise parallelism. + """ + + @staticmethod + def symbolic(graph, input): + """Symbolic function for tracing.""" + return input + + @staticmethod + def forward(ctx: Any, group: dist.ProcessGroup, input: torch.Tensor, is_inference_mode: bool) -> torch.Tensor: + """ + Forward pass. + """ + ctx.group = group + if group == None: + return input + if is_inference_mode: + dist.inference_all_reduce(input, group=group) + else: + dist.all_reduce(input.contiguous(), group=group) + return input + + @staticmethod + def backward(ctx: Any, grad_output: torch.Tensor) -> Tuple[None, torch.Tensor, None]: + """ + Backward pass. + """ + return None, grad_output, None + + +class ColumnParallel(torch.autograd.Function): + """ + Custom autograd function for column-wise parallelism. + """ + + @staticmethod + def symbolic(graph, input): + """Symbolic function for tracing.""" + return dist.all_reduce(input.contiguous(), dist.get_tensor_model_parallel_group()) + + @staticmethod + def forward(ctx: Any, group: dist.ProcessGroup, input: torch.Tensor) -> torch.Tensor: + """ + Forward pass. + """ + ctx.group = group + return input + + @staticmethod + def backward(ctx: Any, grad_output: torch.Tensor) -> Tuple[None, torch.Tensor]: + """ + Backward pass. + """ + if ctx.group == None: + return None, grad_output + + dist.all_reduce(grad_output.contiguous(), group=ctx.group) + return None, grad_output + + +class Replaced_Layer(nn.Module, ABC): + """ + A base class for model layers with tensor parallelism support. + This class is designed to be extended by specific layers that require distributed + operations and parameter gather/partitioning during inference or training. + + Attributes: + mode (str): The mode of operation[INFERENCE or TRAINING], default is "INFERENCE". + mp_group (Optional[dist.ProcessGroup]): The process group used for model parallelism. + tp_world_size (int): The world size of tensor parallelism, i.e., the number of parallel workers. + tp_index (int): The rank (ID) of the current worker in tensor parallelism. + support_training (bool): Flag indicating whether the layer supports training (default: False). + name (Optional[str]): The name of the layer, if provided. + """ + + def __init__(self, mp_group: Optional[dist.ProcessGroup], **kwargs: Any): + """ + Initializes the Replaced_Layer with optional model parallelism group and layer name. + + Args: + mp_group (Optional[dist.ProcessGroup]): The process group for model parallelism. + If None, no model parallelism is set. + """ + super().__init__() + self.support_training: bool = False + if mp_group is not None: + self.mp_group = mp_group + self.tp_world_size: int = dist.get_world_size(self.mp_group) + self.tp_index: int = dist.get_rank(mp_group) + + # backward compatibility + self.world_size = self.tp_world_size + self.rank = self.tp_index + + self.name = getattr(self, 'name', None) + if kwargs.get('name') is not None: + self.name = kwargs.get('name') # Set the layer name if provided. + + @abstractmethod + def forward(self, input): + """ + Forward pass method. Must be implemented by subclasses to define layer-specific operations. + """ + pass + + @abstractmethod + def gather_params(self, params_list): + """ + Gathers parameters across devices for distributed training. Must be implemented by subclasses in "TRAINING" mode. + """ + pass + + @abstractmethod + def partition(self, params_list: List[torch.Tensor]): + """ + Partitions the parameters for tensor parallelism. + It is necessary to ensure that this function only involves the logic of params partitioning. + """ + pass + + def config_tp_params(self, weight): + """ + Configures the weight tensor for training with tensor parallelism. This includes enabling gradients + and associating necessary methods for parameter gathering and partitioning. + + Args: + weight (Optional[torch.Tensor]): The weight tensor to configure for tensor parallelism. + If None, no action is taken. + """ + # # The RNG states have already been synchronized in init_inference. + if self.is_training_mode(): + assert self.support_training, "No implementation of backward." + if weight is not None: + if self.is_training_mode(): + if weight.requires_grad is None: + weight.requires_grad = True + else: + weight.requires_grad = False + setattr(weight, DS_TENSOR_MODEL_PARALLEL, True) + setattr(weight, DS_IS_REPLACED_MODULE, True) + weight.gather_params = self.gather_params + weight.partition = self.partition + + def is_training_mode(self): + global DEEPSPEED_AUTOTP_MODE + return DEEPSPEED_AUTOTP_MODE == AUTOTP_MODE.TRAINING + + def __deepcopy__(self, memo): + # This function is designed for + # 'mp_group' (a 'ProcessGroup') cannot be pickled during deepcopy in some usage. + cls = self.__class__ + new_obj = cls.__new__(cls) + + for key, value in vars(self).items(): + if key == 'mp_group': + new_obj.mp_group = self.mp_group + else: + setattr(new_obj, key, deepcopy(value, memo)) + + memo[id(self)] = new_obj + return new_obj + + def extra_repr(self): + if self.weight is not None: + out_features, in_features = self.weight.shape if self.weight is not None else (None, None) + dtype = self.weight.dtype if self.weight is not None else None + extra_repr_str = "in_features={}, out_features={}, bias={}, dtype={}".format( + in_features, out_features, self.bias is not None, dtype) + return extra_repr_str + + +class GatherReplacedLayerParams: + """ + A context manager for gathering parameters of a replaced layer, enabling partitioning and gathering functionality + based on the configuration of the model. + """ + + def __init__(self, + params: Union[Iterable[torch.Tensor], torch.Tensor], + module: torch.nn.Module, + enabled: bool = True): + """ + Initialize the context manager to handle parameter gathering and partitioning for a replaced layer. + + Args: + params (Iterable or torch.Tensor): A collection or single parameter to manage. + module (torch.nn.Module): The module that these parameters belong to. + enabled (bool): Flag indicating whether the parameter management is enabled (default: True). + """ + self.enabled = enabled + self.module = module + if not enabled: + return + + # Ensure params is a list, whether it's a single param or iterable (e.g., model.parameters()) + if isinstance(params, Iterable) and not isinstance(params, torch.Tensor): + self.params: List[torch.Tensor] = list(params) # Convert generators to a list for multiple iterations + else: + self.params: List[torch.Tensor] = [params] # Wrap single parameter in a list for uniform processing + + # Check if the parameters belong to a replaced layer (indicated by a specific attribute) + if not any(self._is_replaced_module_weight(p) for p in params): + self.enabled = False + return + + def _is_replaced_module_weight(self, param: torch.Tensor) -> bool: + """ + Helper function to determine if a parameter belongs to a replaced module. + + Args: + param (torch.Tensor): The parameter to check. + + Returns: + bool: True if the parameter belongs to a replaced module, False otherwise. + """ + return getattr(param, DS_IS_REPLACED_MODULE, False) + + def __enter__(self) -> None: + """ + Enter the context manager. If enabled, gather parameters for the replaced module. + """ + if self.enabled: + self.params[0].gather_params(self.params) + + def __exit__(self, exc_type, exc_value, traceback) -> None: + """ + Exit the context manager. If enabled, partition the parameters for the replaced module. + """ + #TODO : Check whether there are any missing attributes. + if self.enabled: + self.params[0].partition(self.params) + + +class LinearAllreduce(Replaced_Layer): + + def __init__(self, module, mp_group, **kwargs): + super(LinearAllreduce, self).__init__(mp_group, **kwargs) + self.weight = module.weight + self.bias = module.bias + + self.partition([self.weight, self.bias]) + self.support_training = True + self.config_tp_params(self.weight) + if self.bias is not None: + self.config_tp_params(self.bias) + + def forward(self, input): + output = torch.matmul(input, self.weight.transpose(-1, -2)) + output = RowParallel.apply(self.mp_group, output, not self.is_training_mode()) + if self.bias is not None: + output += self.bias + return output + + @torch.no_grad() + def gather_params(self, params_list): + + for idx, param in enumerate(params_list): + if param is None or idx > 0: + # don't gather bias + return + params_list[idx].data_partition = param.data + param = param.transpose(0, 1).contiguous() + output_param = torch.empty(self.tp_world_size * param.shape[0], + param.shape[1], + dtype=param.dtype, + device=param.device) + dist.all_gather_into_tensor(output_param, param, group=self.mp_group) + params_list[idx].data = output_param.transpose(0, 1).contiguous() + return + + @torch.no_grad() + def partition(self, params_list): + + if not self.is_training_mode(): + self.uneven_partition(params_list) + return + + else: + for idx, param in enumerate(params_list): + if param is None or idx > 0: + # don't slipt bias + return + _partition = torch.chunk(param, self.tp_world_size, dim=-1)[self.tp_index] + + _partition = move(_partition, get_accelerator().current_device_name()).detach() + + params_list[idx].data = _partition + + def uneven_partition(self, params_list): + for idx, param in enumerate(params_list): + if param is None or idx > 0: + # don't slipt bias + return + assert self.name is not None, "The module name must be provided in the initialization." + _partition = params_list[idx].split(get_shard_size_list(params_list[idx].shape[1], self.tp_world_size, + self.name), + dim=1)[self.tp_index] + + _partition = move(_partition, get_accelerator().current_device_name()).detach() + params_list[idx].data = _partition + + +#remove kwargs from partition. +class LinearLayer(Replaced_Layer): + + def __init__(self, module, mp_group, skip_partition=False, **kwargs): + super(LinearLayer, self).__init__(mp_group, **kwargs) + self.weight = module.weight + self.bias = module.bias + if not skip_partition: + self.partition([self.weight, self.bias]) + self.support_training = True + self.config_tp_params(self.weight) + if self.bias is not None: + self.config_tp_params(self.bias) + + def forward(self, input): + input = ColumnParallel.apply(self.mp_group, input) + output = torch.matmul(input, self.weight.transpose(-1, -2)) + if self.bias is not None: + output += self.bias + return output + + @torch.no_grad() + def gather_params(self, params_list): + # Does not support uneven shard. + for idx, param in enumerate(params_list): + + params_list[idx].data_partition = param.data + output_param = torch.empty(self.tp_world_size * param.shape[0], + param.shape[1], + dtype=param.dtype, + device=param.device) + dist.all_gather_into_tensor(output_param, param, group=self.mp_group) + params_list[idx].data = output_param.contiguous() + + @torch.no_grad() + def partition(self, params_list): + + if not self.is_training_mode(): + self.uneven_partition(params_list) + return + for idx, param in enumerate(params_list): + if param is None: + return + #split bias if provide + _partition = torch.chunk(param, self.tp_world_size, dim=0)[self.tp_index] + + _partition = move(_partition, get_accelerator().current_device_name()).detach() + + params_list[idx].data = _partition + + def uneven_partition(self, params_list): + + for idx, param in enumerate(params_list): + if param is None: + #split bias if provide + return + assert self.name is not None, "The module name must be provided in the initialization." + _partition = params_list[idx].split(get_shard_size_list(params_list[idx].shape[0], self.tp_world_size, + self.name), + dim=0)[self.tp_index] + + _partition = move(_partition, get_accelerator().current_device_name()).detach() + + params_list[idx].data = _partition + + # for bwc + @classmethod + def from_weights(cls, weight_shape=None, dtype=torch.half, weight=None, bias=None): + if weight is not None: + in_features = weight.shape[1] + out_features = weight.shape[0] + linear = nn.Linear(in_features, out_features, bias=(bias is not None)) + linear.weight.data = weight + if bias is not None: + linear.bias.data = bias + else: + in_features = weight_shape[1] + out_features = weight_shape[0] + linear = nn.Linear(in_features, out_features, bias=(bias is not None)) + return cls(linear, skip_partition=True) + + +class FusedModuleWrapper: + + def __init__(self, fused_module: nn.Module): + self.fused_module = fused_module + + def __getattr__(self, module): + return self.fused_module + + +class fused_LinearLayer(LinearLayer): + + def __init__(self, module, mp_group, skip_partition=False, **kwargs): + assert kwargs.get('fused_module') is not None, "'fused_module' is required but not provided" + # Use the warp class to avoid module circular references. + self.fused_module = FusedModuleWrapper(kwargs.get('fused_module')) + super().__init__(module, mp_group, skip_partition, **kwargs) + + @torch.no_grad() + def partition(self, params_list): + for idx, param in enumerate(params_list): + if param is None: + return + + _partition = prepare_tp_fused_qkvw(self.fused_module.module, param, self.tp_world_size, self.tp_index) + + _partition = move(_partition, get_accelerator().current_device_name()).detach() + + params_list[idx].data = _partition + + +class conv_LinearLayer(LinearLayer): + + @torch.no_grad() + def partition(self, params_list): + weight = None + bias = None + if len(params_list) == 1: + weight = params_list[0] + elif len(params_list) == 2: + weight, bias = params_list[0], params_list[1] + _partition = weight.data.split(get_shard_size_list(weight.shape[0], self.tp_world_size, self.name), + dim=1)[self.tp_index] + _partition = move(_partition, get_accelerator().current_device_name()).detach() + weight.data = _partition + + if bias is not None: + _partition = bias.data.split(get_shard_size_list(weight.shape[1], self.tp_world_size, self.name), + dim=0)[self.tp_index] + _partition = move(_partition, get_accelerator().current_device_name()).detach() + + bias.data = _partition + + +#override the subclasses related to weight splitting. +class Yuan_LinearAllreduce(LinearAllreduce): + + #Yuan2 + @torch.no_grad() + def partition(self, params_list): + weight, bias = shard_value_with_share_qk(params_list[0].data, params_list[1], self.tp_index, + self.tp_world_size, False) + params_list[0].data = weight + if bias is not None: + params_list[1].data = bias + + +class Yuan_LinearLayer(LinearLayer): + #Yuan2 + @torch.no_grad() + def partition(self, params_list): + weight, bias = shard_value_with_share_qk(params_list[0].data, params_list[1], self.tp_index, + self.tp_world_size, True) + params_list[0].data = move(weight, get_accelerator().current_device_name()).detach() + if bias is not None: + params_list[1].data = move(bias, get_accelerator().current_device_name()).detach() + + +class GateUpPack_LinearLayer(LinearLayer): + # chatGLM2, chatGLM2 + @torch.no_grad() + def partition(self, params_list): + weight, bias = shard_chunk_mlp(params_list[0].data, params_list[1], self.tp_index, self.tp_world_size) + params_list[0].data = move(weight, device=get_accelerator().current_device_name()).detach() + if bias is not None: + params_list[1].data = move(bias, device=get_accelerator().current_device_name()).detach() + + +class Conv_LinearALlreduce(LinearAllreduce): + + @torch.no_grad() + def partition(self, params_list): + for idx, param in enumerate(params_list): + if param is None: + return + param.data = param.data.transpose(-1, -2).contiguous() + + _partition = param.split(get_shard_size_list(param.shape[0], self.tp_world_size, self.name), + dim=1)[self.tp_index] + + _partition = move(_partition, get_accelerator().current_device_name()).detach() + + params_list[idx].data = _partition + + +#override the subclasses related to fwd/bwd. +class LmHeadLinearAllreduce(LinearAllreduce): + + def __init__(self, module, mp_group, **kwargs): + # set the fixed name before partition + self.name = "lm_head" + + # In some tied_embedding cases, only the lm head is sharded, while the word embedding is not. + # Reinitialization is used to decouple them and prevent the word embedding from being sharded. + # This should also be effective for cases where both are sharded in tied_embedding scenarios. + + # TODO: Training scenario-related tests, is it necessary to re-implement the vocab parallel module? + module.weight = nn.Parameter(module.weight.clone().detach()) + if hasattr(module, 'bias') and module.bias is not None: + module.bias = nn.Parameter(module.bias.clone().detach()) + super().__init__(module, mp_group, **kwargs) + + def forward(self, input): + input_shard_size = get_shard_size(input.shape[-1], self.tp_world_size, "lm_head") + input_shard_offset = sum(get_shard_size_list(input.shape[-1], self.tp_world_size, "lm_head")[0:self.tp_index]) + output = torch.matmul(input[:, :, input_shard_offset:input_shard_offset + input_shard_size], + self.weight.transpose(-1, -2)) + if self.mp_group is not None: + dist.inference_all_reduce(output, group=self.mp_group) + if self.bias is not None: + output += self.bias + return output class TensorParallelConv2d(nn.Module): @@ -75,97 +643,6 @@ def forward(self, input: torch.Tensor) -> torch.Tensor: return out -class LinearAllreduce(nn.Module): - - def __init__(self, weight, bias=None, mp_group=None): - super(LinearAllreduce, self).__init__() - self.weight = weight - self.bias = bias - self.mp_group = mp_group - - def forward(self, input): - output = torch.matmul(input, self.weight.transpose(-1, -2)) - if self.mp_group is not None: - dist.inference_all_reduce(output, group=self.mp_group) - if self.bias is not None: - output += self.bias - return output - - def extra_repr(self): - out_features, in_features = self.weight.shape if self.weight is not None else (None, None) - dtype = self.weight.dtype if self.weight is not None else None - extra_repr_str = "in_features={}, out_features={}, bias={}, dtype={}".format( - in_features, out_features, self.bias is not None, dtype) - return extra_repr_str - - -class LmHeadLinearAllreduce(nn.Module): - - def __init__( - self, - weight, - rank, - world_size, - bias=None, - mp_group=None, - ): - super(LmHeadLinearAllreduce, self).__init__() - self.weight = weight - self.bias = bias - self.mp_group = mp_group - self.rank = rank - self.world_size = world_size - - def forward(self, input): - input_shard_size = get_shard_size(input.shape[-1], self.world_size, "lm_head") - input_shard_offset = sum(get_shard_size_list(input.shape[-1], self.world_size, "lm_head")[0:self.rank]) - output = torch.matmul(input[:, :, input_shard_offset:input_shard_offset + input_shard_size], - self.weight.transpose(-1, -2)) - if self.mp_group is not None: - dist.inference_all_reduce(output, group=self.mp_group) - if self.bias is not None: - output += self.bias - return output - - def extra_repr(self): - out_features, in_features = self.weight.shape if self.weight is not None else (None, None) - dtype = self.weight.dtype if self.weight is not None else None - extra_repr_str = "in_features={}, out_features={}, bias={}, dtype={}".format( - in_features, out_features, self.bias is not None, dtype) - return extra_repr_str - - -class LinearLayer(nn.Module): - - def __init__(self, weight_shape=None, dtype=torch.half, weight=None, bias=None): - super(LinearLayer, self).__init__() - if weight is not None: - self.weight = weight - self.bias = bias - else: - self.weight = Parameter( - torch.empty(weight_shape, dtype=dtype, device=get_accelerator().current_device_name())) - - self.bias = Parameter( - torch.empty(weight_shape[0], - dtype=dtype, - device=get_accelerator().current_device_name())) \ - if bias is not None else None - - def forward(self, input): - output = torch.matmul(input, self.weight.transpose(-1, -2)) - if self.bias is not None: - output += self.bias - return output - - def extra_repr(self): - out_features, in_features = self.weight.shape - dtype = self.weight.dtype - extra_repr_str = "in_features={}, out_features={}, bias={}, dtype={}".format( - in_features, out_features, self.bias is not None, dtype) - return extra_repr_str - - class Normalize(nn.Module): def __init__(self, dim=None, dtype=torch.float, eps=1e-5, weight=None, bias=None): diff --git a/deepspeed/module_inject/load_checkpoint.py b/deepspeed/module_inject/load_checkpoint.py index 4d01fdc69869..862628fa7b4b 100644 --- a/deepspeed/module_inject/load_checkpoint.py +++ b/deepspeed/module_inject/load_checkpoint.py @@ -236,7 +236,7 @@ def load_module_recursive(module, prefix='', level=0): child.weight.ds_id in all_ds_ids): prefix1 = all_ds_ids[child.weight.ds_id] if child.__class__ is nn.Linear: - child = LinearLayer(weight=all_ds_ids[child.weight.ds_id]) + child = LinearLayer.from_weights(weight=all_ds_ids[child.weight.ds_id]) setattr(module, name, child) continue child_params = list(child.parameters()) @@ -249,7 +249,9 @@ def load_module_recursive(module, prefix='', level=0): child = Normalize(dim=ds_shape[-1], dtype=child.weight.dtype, eps=child.eps) setattr(module, name, child) elif child.__class__ in [nn.Linear, ColumnParallelLinear, RowParallelLinear]: - child = LinearLayer(weight_shape=child.weight.shape, dtype=child.weight.dtype, bias=child.bias) + child = LinearLayer.from_weights(weight_shape=child.weight.shape, + dtype=child.weight.dtype, + bias=child.bias) setattr(module, name, child) elif child.__class__ is OPTLearnedPositionalEmbedding: child = OPTEmbedding(weight_shape=ds_shape) diff --git a/deepspeed/module_inject/replace_module.py b/deepspeed/module_inject/replace_module.py index 26d242d33e2f..9510f96b89c6 100644 --- a/deepspeed/module_inject/replace_module.py +++ b/deepspeed/module_inject/replace_module.py @@ -15,7 +15,7 @@ from .replace_policy import replace_policies, generic_policies from .auto_tp import AutoTP, ReplaceWithTensorSlicing, Loading from .layers import TensorParallelOcShardConv2d, TensorParallelIcShardConv2d - +from deepspeed.module_inject.layers import is_autotp_training_mode from deepspeed import comm as dist from deepspeed.module_inject.tp_shard import set_num_kv_heads, set_n_embd, set_num_attention_heads, set_tp_grain_size @@ -323,7 +323,7 @@ def replace_fn(child, _policy, layer_id=0, prefix="", state_dict=None): else: # copy relevant state from child -> new module - if config.replace_with_kernel_inject: + if not is_autotp_training_mode() and config.replace_with_kernel_inject: new_module = replace_with_policy(child, _policy, config.triangular_masking, @@ -475,7 +475,7 @@ def conv2d_parallel_shard_weights(model, rank, world_size): set_lm_head(replaced_module) print(f"checkpoint loading time at rank {rank}: {time.time()-start_time} sec") - if config.save_mp_checkpoint_path is not None: + if not is_autotp_training_mode() and config.save_mp_checkpoint_path is not None: from collections import OrderedDict import json num_partitions = 8 diff --git a/deepspeed/runtime/config.py b/deepspeed/runtime/config.py index fb786f29722d..b6dabc161e8c 100755 --- a/deepspeed/runtime/config.py +++ b/deepspeed/runtime/config.py @@ -62,6 +62,7 @@ from ..compression.constants import * from .swap_tensor.aio_config import get_aio_config +from .tensor_parallel import get_tensor_parallel_config from .data_pipeline.config import get_data_efficiency_enabled, get_data_efficiency_config, get_curriculum_enabled_legacy, get_curriculum_params_legacy from .data_pipeline.constants import * @@ -913,6 +914,7 @@ def _initialize_params(self, param_dict): **param_dict['weight_quantization']) if 'weight_quantization' in param_dict else None self.timers_config = get_timers_config(param_dict) + self.tensor_parallel_config = get_tensor_parallel_config(param_dict) def _batch_assertion(self): diff --git a/deepspeed/runtime/engine.py b/deepspeed/runtime/engine.py index 97d2afb8b723..986b68dc1bb1 100755 --- a/deepspeed/runtime/engine.py +++ b/deepspeed/runtime/engine.py @@ -37,6 +37,7 @@ from deepspeed.runtime.bf16_optimizer import BF16_Optimizer from deepspeed.linear.optimized_linear import LoRAOptimizedLinear +from deepspeed.module_inject.layers import GatherReplacedLayerParams from deepspeed.runtime.config import DEEPSPEED_OPTIMIZERS, \ ADAGRAD_OPTIMIZER, ADAM_OPTIMIZER, ADAMW_OPTIMIZER, LAMB_OPTIMIZER, ONEBIT_ADAM_OPTIMIZER, ONEBIT_LAMB_OPTIMIZER, \ @@ -75,7 +76,7 @@ from deepspeed.utils.debug import debug_extract_module_and_param_names, debug_clear_module_and_param_names from deepspeed.monitor.monitor import MonitorMaster from deepspeed.runtime.progressive_layer_drop import ProgressiveLayerDrop -from deepspeed.runtime.utils import clip_grad_norm_ +from deepspeed.runtime.utils import clip_grad_norm_, compare_tensors_in_structures from deepspeed.runtime.eigenvalue import Eigenvalue from deepspeed.runtime.data_pipeline.constants import DATA_SAMPLING, \ DATA_ROUTING, DATA_SAMPLING_ENABLED, CURRICULUM_LEARNING, \ @@ -230,7 +231,6 @@ def __init__(self, self._step_applied = False self._global_grad_norm = None self.use_ds_comm = False # False --> Use torch.dist, True --> Use ds.comm backend. - self.checkpoint_engine = None self._is_gradient_accumulation_boundary = None @@ -247,6 +247,8 @@ def __init__(self, self._do_args_sanity_check(args) self._configure_with_arguments(args, mpu) self._do_sanity_check() + if self.autotp_size() > 1: + self._configure_tensor_parallel_states(model) see_memory_usage(f"DeepSpeed Engine: After args sanity test", force=self.memory_breakdown()) if mpu is not None: if self.elasticity_enabled(): @@ -411,6 +413,71 @@ def _optimized_linear_offload_setup(self): else: p.ds_offload = False + def _configure_tensor_parallel_states(self, model): + """ + Configures the tensor parallel states for the model. + This includes setting up the tensor parallel groups, initializing the TP mesh, + and registering a pre-hook to ensure that the Dataloader inputs are consistent across ranks. + """ + self._set_client_model(model) + + # sanity check + # currently, the compatibility between 'autotp' and 'zero > 1' has not been validated + assert self.zero_optimization_stage( + ) <= 1, "Currently, the compatibility between 'autotp' and 'zero_stage > 1' has not been validated" + + self.mpu = groups + self.mpu._init_tp_mesh_device(tensor_model_parallel_size=self.autotp_size()) + + self.first_dataloader_check = None + + def check_dataloader_inputs_same_across_ranks(module, args, kwargs): + + def broadcast_and_check(args, bcast_rank, bcast_group): + if isinstance(args, tuple): + args = list(args) + if len(args) > 0: + if self.mpu.get_tensor_model_parallel_rank() == 0: + _src_args = [args] + dist.broadcast_object_list(object_list=_src_args, + src=bcast_rank, + group=bcast_group, + device=get_accelerator().current_device()) + # Rank 0 does not need to compare with itself + is_equal = True + else: + _src_args = [None] + dist.broadcast_object_list(object_list=_src_args, + src=bcast_rank, + group=bcast_group, + device=get_accelerator().current_device()) + + is_equal = compare_tensors_in_structures(args, _src_args[0]) + + equal_tensor = torch.tensor(is_equal, + dtype=self.communication_data_type, + device=get_accelerator().current_device()) + dist.all_reduce(equal_tensor, group=bcast_group) + assert torch.equal( + equal_tensor, + torch.tensor(groups.get_tensor_model_parallel_world_size(), + dtype=self.communication_data_type, + device=get_accelerator().current_device()) + ), "Data inconsistency within the TP group. Please check the Dataloader implementation to ensure consistency." + + bcast_rank = self.mpu.get_tensor_model_parallel_src_rank() + bcast_group = self.mpu.get_tensor_model_parallel_group() + + broadcast_and_check(args, bcast_rank, bcast_group) + broadcast_and_check(kwargs, bcast_rank, bcast_group) + + logger.info(f":The Dataloader has passed the TP group consistency check.") + self.first_dataloader_check.remove() + + self.first_dataloader_check = self.module.register_forward_pre_hook(check_dataloader_inputs_same_across_ranks, + prepend=True, + with_kwargs=True) + def destroy(self): if self.optimizer is not None and hasattr(self.optimizer, 'destroy'): self.optimizer.destroy() @@ -832,6 +899,9 @@ def zero_legacy_stage1(self): def zero_ignore_unused_parameters(self): return self._config.zero_config.ignore_unused_parameters + def autotp_size(self): + return self._config.tensor_parallel_config.autotp_size + def graph_harvesting(self): return self._config.graph_harvesting @@ -3569,6 +3639,52 @@ def _save_zero_checkpoint(self, save_path, tag): ckpt_type = 'zero' if self.zero_optimization() else 'bf16_zero' logger.info(f'{ckpt_type} checkpoint saved {zero_checkpoint_name}') + def _replace_module_consolidated_state_dict(self): + """ + Get a full non-partitioned state_dict with fp16 weights on cpu. + Important: this function must be called on all ranks and not just rank 0. + This is similar to nn.Module.state_dict (modelled after _save_to_state_dict) + This method is used for tensor parallel training. + + Returns: + OrderedDict: The consolidated state dictionary if the current process rank is 0, otherwise None. + """ + #TODO: If we use both Zero3 and tensor parallel simultaneously + # we need to consolidate the gather mechanisms of both. + state_dict = OrderedDict() if dist.get_rank() == 0 else None + + def get_layer_state_dict(module, prefix=""): + with GatherReplacedLayerParams(list(module.parameters(recurse=False)), module, enabled=True): + for name, param in module.named_parameters(recurse=False): + if param is None: + continue + key = prefix + name + if (dist.get_rank() == 0): + state_dict[key] = param.detach().cpu() + # print(key,module, param.detach().cpu().shape) + + for name, child in module.named_children(): + if child is not None: + get_layer_state_dict(child, prefix + name + ".") + + get_layer_state_dict(self.module, prefix="") + + # ensure that all GPU communication tasks are completed before the process exits + get_accelerator().synchronize() + return state_dict + + def _consolidated_16bit_state_dict(self, exclude_frozen_parameters=False): + """ + Consolidate the 16-bit state dictionary. + """ + if self.zero_optimization_stage() == ZeroStageEnum.weights: + return self._zero3_consolidated_16bit_state_dict(exclude_frozen_parameters) + elif self.autotp_size() > 1: + return self._replace_module_consolidated_state_dict() + + raise ValueError("consolidated_16bit_state_dict is only applicable to cases where weights are partitioned, " + "including Zero Stage 3 and tensor parallelism.") + def _zero3_consolidated_16bit_state_dict(self, exclude_frozen_parameters=False): """ Get a full non-partitioned state_dict with fp16 weights on cpu. diff --git a/deepspeed/runtime/tensor_parallel/__init__.py b/deepspeed/runtime/tensor_parallel/__init__.py new file mode 100644 index 000000000000..388239345351 --- /dev/null +++ b/deepspeed/runtime/tensor_parallel/__init__.py @@ -0,0 +1,7 @@ +# Copyright (c) Microsoft Corporation. +# SPDX-License-Identifier: Apache-2.0 + +# DeepSpeed Team + +from .config import AUTOTP_MODE, get_tensor_parallel_config +from .tp_manager import TpTrainingManager diff --git a/deepspeed/runtime/tensor_parallel/config.py b/deepspeed/runtime/tensor_parallel/config.py new file mode 100644 index 000000000000..1300bf9323cd --- /dev/null +++ b/deepspeed/runtime/tensor_parallel/config.py @@ -0,0 +1,81 @@ +# Copyright (c) Microsoft Corporation. +# SPDX-License-Identifier: Apache-2.0 + +# DeepSpeed Team + +from enum import Enum +from deepspeed.runtime.config_utils import DeepSpeedConfigModel +import torch +from pydantic import Field +from typing import Optional + + +class AUTOTP_MODE(Enum): + TRAINING = "TRAINING" + INFERENCE = "INFERENCE" + + +class TPConfig(DeepSpeedConfigModel): + """ Configure tensor parallelism settings """ + + tp_size: int = 1 + """ Number of devices to split the model across using tensor parallelism. """ + + tp_grain_size: int = 1 + "The variable required by the autoTP parser has not been activated in training yet" + "as it depends on the gather logic that supports uneven partitioning. " + "Desired MLP/lm_head tp size granularity. DNN library favors tensor size in granularity of power of 2, we pick 64 as a default size." + + mpu: object = None + """ + A model parallelism unit object that implements + ``get_{model,data}_parallel_{rank,group,world_size}()``. + """ + + tp_group: object = None + + +class TPTrainingConfig(DeepSpeedConfigModel): + + dtype: torch.dtype = torch.float16 + """ + Desired model data type, will convert model to this type. + """ + + autotp_size: int = 0 + """ + In automatic tensor-parallelism training, 'tensor_parallel_size' + When set to 0, indicates that it is disabled. + """ + tensor_parallel: TPConfig = Field({}, alias="tp") + """ + Configuration for tensor parallelism used to split the model across several + GPUs. Expects a dictionary containing values for :any:`DeepSpeedTPConfig`. + """ + + injection_policy_tuple: Optional[tuple] = None + #The following parameters are required by autoTP parser. + ######################################## + keep_module_on_host: bool = False + """ + When loading checkpoints to model parameters, they are moved to the device. In very large models + this might fill the device and cause OOM. Setting this flag to true, will keep checkpoints on + host and not move them directly to the device (giving an option to quantize checkpoint data before + moving it to the device for example). + """ + + replace_with_kernel_inject: bool = Field(False, alias="kernel_inject") + """ + Set to true to inject inference kernels for models such as, Bert, GPT2, + GPT-Neo and GPT-J. Otherwise, the injection_dict provides the names of two + linear layers as a tuple: + `(attention_output projection, transformer output projection)` + """ + ######################################## + + +def get_tensor_parallel_config(ds_config): + + if 'tensor_parallel' in ds_config: + return TPTrainingConfig(**ds_config['tensor_parallel']) + return TPTrainingConfig() diff --git a/deepspeed/runtime/tensor_parallel/tp_manager.py b/deepspeed/runtime/tensor_parallel/tp_manager.py new file mode 100644 index 000000000000..cf0b5a75c92a --- /dev/null +++ b/deepspeed/runtime/tensor_parallel/tp_manager.py @@ -0,0 +1,66 @@ +# Copyright (c) Microsoft Corporation. +# SPDX-License-Identifier: Apache-2.0 + +# DeepSpeed Team + +import torch +from .config import TPTrainingConfig, TPConfig +from deepspeed.utils import groups +import deepspeed.comm as dist + + +class TpTrainingManager(): + + def __init__(self, model, tp_size, dtype): + self.module = model + self.config = self._initialize_config(dtype) + + from deepspeed.module_inject.auto_tp import AutoTP + from deepspeed import get_accelerator + + # Parse model configuration + parser_dict = AutoTP.tp_parser(model) + print("AutoTP: ", parser_dict) + + # Initialize TP configuration and model + self._initialize_tp_config(tp_size) + self._get_model_config_generate() + + # Synchronize random number generator state across devices + _rng_state = get_accelerator().get_rng_state().to(get_accelerator().current_device_name()) + dist.broadcast(_rng_state, groups.get_tensor_model_parallel_src_rank(), self.tp_config.tp_group) + get_accelerator().set_rng_state(_rng_state.cpu()) + + # Apply injection policies + self._apply_policies(parser_dict) + + def _initialize_config(self, dtype): + """Initialize and return the DeepSpeed TP training configuration.""" + config = TPTrainingConfig() + config.dtype = dtype + return config + + def _apply_policies(self, parser_dict): + """Apply injection policies to the parsed modules.""" + for client_module, injection_policy in parser_dict: + self.config.injection_policy_tuple = injection_policy + self._apply_injection_policy(self.config, client_module) + + def _apply_injection_policy(self, config, client_module=None): + from deepspeed.module_inject import replace_transformer_layer + """Apply the given injection policy to a client module.""" + if isinstance(self.module, torch.nn.Module): + replace_transformer_layer(client_module, self.module, None, self.config, self.model_config) + + def _initialize_tp_config(self, tp_size): + """Perform TP configuration initialization.""" + self.tp_config = TPConfig() + self.tp_config.tp_size = tp_size + + groups._init_tp_mesh_device(tp_size) + self.tp_config.tp_group = groups.get_tensor_model_parallel_group() + self.config.tensor_parallel = self.tp_config + + def _get_model_config_generate(self): + """Generate and apply HF model configuration.""" + self.model_config = getattr(self.module, 'config', None) diff --git a/deepspeed/runtime/utils.py b/deepspeed/runtime/utils.py index f48adb58c9bf..91fe7cbdcc96 100755 --- a/deepspeed/runtime/utils.py +++ b/deepspeed/runtime/utils.py @@ -22,7 +22,7 @@ from torch._six import inf except ModuleNotFoundError: from torch import inf - +from typing import Union, List, Dict from deepspeed import comm as dist from deepspeed.moe.utils import is_moe_param from deepspeed.utils import groups, logger @@ -1101,3 +1101,46 @@ def move_back_key(state, key): move_back_key(state, "exp_avg") if "exp_avg_sq" in state: move_back_key(state, "exp_avg_sq") + + +def compare_tensors_in_structures(inputs1: Union[List, Dict], inputs2: Union[List, Dict]) -> bool: + """ + Compare two lists or dictionaries for equality, including any tensors they may contain. + + Args: + inputs1: First input, either a list or a dictionary. + inputs2: Second input, either a list or a dictionary. + + Returns: + True if inputs1 and inputs2 are equal; False otherwise. + """ + if type(inputs1) != type(inputs2): # Ensure types match + return False + + if isinstance(inputs1, list) and isinstance(inputs2, list): + if len(inputs1) != len(inputs2): + return False + for val1, val2 in zip(inputs1, inputs2): + if isinstance(val1, torch.Tensor) and isinstance(val2, torch.Tensor): + val1 = val1.to(get_accelerator().current_device()) + val2 = val2.to(get_accelerator().current_device()) + if not torch.equal(val1, val2): + return False + elif val1 != val2: + return False + return True + + elif isinstance(inputs1, dict) and isinstance(inputs2, dict): + if inputs1.keys() != inputs2.keys(): + return False + for key in inputs1: + val1 = inputs1[key].to(get_accelerator().current_device()) + val2 = inputs2[key].to(get_accelerator().current_device()) + if isinstance(val1, torch.Tensor) and isinstance(val2, torch.Tensor): + if not torch.equal(val1, val2): + return False + elif val1 != val2: + return False + return True + + return False diff --git a/deepspeed/utils/groups.py b/deepspeed/utils/groups.py index e9550a0ec25a..6dc750035061 100755 --- a/deepspeed/utils/groups.py +++ b/deepspeed/utils/groups.py @@ -46,8 +46,6 @@ # All to All quantized graident communication groups _ALL_TO_ALL_GROUP = {} -_DATA_PARALLEL_GROUP = None - mesh_device = None @@ -64,6 +62,127 @@ def _ensure_divisibility(numerator, denominator): assert numerator % denominator == 0, '{} is not divisible by {}'.format(numerator, denominator) +# ======== Start: Tensor Parallel Group Attributes ======== + +# Intra-layer model parallel group that the current rank belongs to. +_TENSOR_MODEL_PARALLEL_GROUP = None + +# Model parallel group (both intra- and pipeline) that the current rank belongs to. +_MODEL_PARALLEL_GROUP = None +# Data parallel group that the current rank belongs to. +_DATA_PARALLEL_GROUP = None + +# These values enable us to change the mpu sizes on the fly. +_MPU_TENSOR_MODEL_PARALLEL_WORLD_SIZE = None +_MPU_TENSOR_MODEL_PARALLEL_RANK = None + + +def _init_tp_mesh_device(tensor_model_parallel_size=1, data_parallel_size=None): + """Initialize model data parallel groups.""" + + global _DATA_PARALLEL_GROUP + global _MODEL_PARALLEL_GROUP + global _TENSOR_MODEL_PARALLEL_GROUP + + if _TENSOR_MODEL_PARALLEL_GROUP is not None: + return + + if data_parallel_size is None: + data_parallel_size = dist.get_world_size() // tensor_model_parallel_size + + mesh_device = dist.initialize_mesh_device((data_parallel_size, tensor_model_parallel_size), + ("data_parallel", "tensor_parallel")) + _TENSOR_MODEL_PARALLEL_GROUP = mesh_device.get_group(mesh_dim="tensor_parallel") + _DATA_PARALLEL_GROUP = mesh_device.get_group(mesh_dim="data_parallel") + + # They are always equal only in 2D (DP + TP) parallelism. + # _MODEL_PARALLEL_GROUP is assigned the same value as _TENSOR_MODEL_PARALLEL_GROUP + # to allow for future potential changes. + _MODEL_PARALLEL_GROUP = _TENSOR_MODEL_PARALLEL_GROUP + + return _DATA_PARALLEL_GROUP, _MODEL_PARALLEL_GROUP + + +def get_tensor_model_parallel_group(): + """Get the tensor model parallel group the caller rank belongs to.""" + + assert _TENSOR_MODEL_PARALLEL_GROUP is not None, \ + 'intra_layer_model parallel group is not initialized' + return _TENSOR_MODEL_PARALLEL_GROUP + + +def get_model_parallel_group(): + """Get the model parallel group the caller rank belongs to.""" + + assert _MODEL_PARALLEL_GROUP is not None, \ + 'model parallel group is not initialized' + return _MODEL_PARALLEL_GROUP + + +def get_data_parallel_group(): + """Get the data parallel group the caller rank belongs to.""" + assert _DATA_PARALLEL_GROUP is not None, \ + 'data parallel group is not initialized' + return _DATA_PARALLEL_GROUP + + +def set_tensor_model_parallel_world_size(world_size): + """Set the tensor model parallel size""" + global _MPU_TENSOR_MODEL_PARALLEL_WORLD_SIZE + _MPU_TENSOR_MODEL_PARALLEL_WORLD_SIZE = world_size + + +def get_tensor_model_parallel_world_size(): + """Return world size for the tensor model parallel group.""" + global _MPU_TENSOR_MODEL_PARALLEL_WORLD_SIZE + if _MPU_TENSOR_MODEL_PARALLEL_WORLD_SIZE is not None: + return _MPU_TENSOR_MODEL_PARALLEL_WORLD_SIZE + return dist.get_world_size(group=get_tensor_model_parallel_group()) + + +def get_model_parallel_world_size(): + return get_tensor_model_parallel_world_size() + + +def set_tensor_model_parallel_rank(rank): + """Set tensor model parallel rank.""" + global _MPU_TENSOR_MODEL_PARALLEL_RANK + _MPU_TENSOR_MODEL_PARALLEL_RANK = rank + + +def get_tensor_model_parallel_rank(): + """Return my rank for the tensor model parallel group.""" + global _MPU_TENSOR_MODEL_PARALLEL_RANK + if _MPU_TENSOR_MODEL_PARALLEL_RANK is not None: + return _MPU_TENSOR_MODEL_PARALLEL_RANK + return dist.get_rank(group=get_tensor_model_parallel_group()) + + +def get_model_parallel_rank(): + return get_tensor_model_parallel_rank() + + +def get_tensor_model_parallel_src_rank(): + """Calculate the global rank corresponding to the first local rank + in the tensor model parallel group.""" + global_rank = dist.get_rank() + local_world_size = get_tensor_model_parallel_world_size() + return (global_rank // local_world_size) * local_world_size + + +def get_data_parallel_world_size(): + """Return world size for the data parallel group.""" + return dist.get_world_size(group=get_data_parallel_group()) + + +def get_data_parallel_rank(): + """Return my rank for the data parallel group.""" + return dist.get_rank(group=get_data_parallel_group()) + + +# ======== End: Tensor Parallel Group Attributes ======== + + # Not currently used. Helper function to create a model (tensor) parallel group. def _create_model_parallel(model_parallel_size_): """ diff --git a/tests/unit/model_parallelism/test_autotp_training.py b/tests/unit/model_parallelism/test_autotp_training.py new file mode 100644 index 000000000000..fc1f0624ec87 --- /dev/null +++ b/tests/unit/model_parallelism/test_autotp_training.py @@ -0,0 +1,574 @@ +# Copyright (c) Microsoft Corporation. +# SPDX-License-Identifier: Apache-2.0 + +# DeepSpeed Team + +import pytest +import deepspeed.comm as dist +import torch +import math +from copy import deepcopy + +from unit.common import DistributedTest, preferred_dtype +import deepspeed +from deepspeed.accelerator import get_accelerator +from unit.simple_model import SimpleModel, random_dataloader +from deepspeed.utils import groups +from contextlib import contextmanager +from torch import nn +from deepspeed.module_inject.layers import LinearAllreduce, LinearLayer, set_autotp_mode +from unit.checkpoint.common import compare_lr_scheduler_states, compare_optimizer_states +import os + + +def skip_on_device(): + if get_accelerator().device_name() == 'xpu': + pytest.skip(f"XPU requires a higher version for test") + + +class SequentialLinearModel(torch.nn.Module): + + def __init__(self, hidden_dim, empty_grad=False, nlayers=1): + super(SequentialLinearModel, self).__init__() + self.linears = torch.nn.ModuleList( + [torch.nn.Linear(hidden_dim, hidden_dim, bias=None) for i in range(nlayers)]) + if empty_grad: + self.linear2 = torch.nn.Linear(hidden_dim, hidden_dim, bias=None) + self.cross_entropy_loss = torch.nn.CrossEntropyLoss() + self.empty_grad = empty_grad + + def forward(self, x, y): + if len(self.linears) == 1: + x = self.linears[0](x) + else: + for i, l in enumerate(self.linears): + x = self.linears[i](x) + return self.cross_entropy_loss(x, y) + + +@contextmanager +def should_assert_with_msg(expected_message): + try: + yield + except AssertionError as e: + if dist.get_rank() == 0: + print(expected_message) + print(str(e)) + if str(e) == expected_message: + pass + else: + raise e + + +@pytest.mark.parametrize("tp_size", [2, 4]) +class TestTpParallelStates(DistributedTest): + world_size = 4 + + def test(self, tp_size: int): + skip_on_device() + set_autotp_mode(training=True) + + dp_size = 4 / tp_size + hidden_dim = 128 + config_dict = { + "train_micro_batch_size_per_gpu": 1, + "tensor_parallel": { + "autotp_size": tp_size + }, + "zero_optimization": { + "stage": 0 + } + } + model = SimpleModel(hidden_dim=hidden_dim) + model, _, _, _ = deepspeed.initialize(model=model, model_parameters=model.parameters(), config=config_dict) + assert groups.get_tensor_model_parallel_world_size() == tp_size + assert groups.get_data_parallel_world_size() == dp_size + + +@pytest.mark.parametrize("tp_size", [2, 4]) +class TestTpDataloaderCorrectness(DistributedTest): + world_size = 4 + reuse_dist_env = True + + def test(self, tp_size: int): + skip_on_device() + hidden_dim = 128 + set_autotp_mode(training=True) + config_dict = { + "train_micro_batch_size_per_gpu": 1, + "steps_per_print": 1, + "optimizer": { + "type": "Adam", + "params": { + "lr": 1e-6 + } + }, + "tensor_parallel": { + "autotp_size": tp_size + }, + "zero_optimization": { + "stage": 0, + } + } + if preferred_dtype() is torch.float16: + config_dict["fp16"] = {"enabled": True} + elif preferred_dtype() is torch.bfloat16: + config_dict["bf16"] = {"enabled": True} + + model = SimpleModel(hidden_dim=hidden_dim) + model, _, _, _ = deepspeed.initialize(model=model, model_parameters=model.parameters(), config=config_dict) + data_loader = random_dataloader(model=model, + total_samples=3, + hidden_dim=hidden_dim, + device=model.device, + dtype=preferred_dtype()) + dist.barrier() + with should_assert_with_msg( + "Data inconsistency within the TP group. Please check the Dataloader implementation to ensure consistency." + ): + for batch in data_loader: + # batch[0].requires_grad = requires_grad + batch[0] += dist.get_rank() + model(batch[0], batch[1]) + + model = SimpleModel(hidden_dim=hidden_dim) + model, _, _, _ = deepspeed.initialize(model=model, model_parameters=model.parameters(), config=config_dict) + data_loader = random_dataloader(model=model, + total_samples=3, + hidden_dim=hidden_dim, + device=model.device, + dtype=preferred_dtype()) + for batch in data_loader: + dist.broadcast(batch[0], + src=groups.get_tensor_model_parallel_src_rank(), + group=groups.get_tensor_model_parallel_group()) + dist.broadcast(batch[1], + src=groups.get_tensor_model_parallel_src_rank(), + group=groups.get_tensor_model_parallel_group()) + model(batch[0], batch[1]) + + +def process_linear_layer(hidden_dim, input): + torch.manual_seed(42) + torch_linear = nn.Linear(hidden_dim, + hidden_dim, + dtype=preferred_dtype(), + device=get_accelerator().current_device(), + bias=None) + torch_out = torch_linear(input) + torch_loss = torch_out.sum() + torch_loss.backward() + return torch_linear, torch_out + + +@pytest.mark.sequential +@pytest.mark.parametrize("tp_size", [2, 4]) +class TestTpLayerFwdBwd(DistributedTest): + world_size = 4 + reuse_dist_env = True + + def testRowParallel(self, tp_size: int): + skip_on_device() + hidden_dim = 128 + batch_size_per_device = 1 + set_autotp_mode(training=True) + config_dict = { + "train_micro_batch_size_per_gpu": 1, + "steps_per_print": 1, + "optimizer": { + "type": "Adam", + "params": { + "lr": 1e-6 + } + }, + "tensor_parallel": { + "autotp_size": tp_size + }, + "zero_optimization": { + "stage": 0, + } + } + if preferred_dtype() is torch.float16: + config_dict["fp16"] = {"enabled": True} + elif preferred_dtype() is torch.bfloat16: + config_dict["bf16"] = {"enabled": True} + model = SequentialLinearModel(hidden_dim=hidden_dim) + model, _, _, _ = deepspeed.initialize(model=model, model_parameters=model.parameters(), config=config_dict) + input = torch.randn(batch_size_per_device, + hidden_dim, + dtype=preferred_dtype(), + requires_grad=True, + device=get_accelerator().current_device()) + + dist.broadcast(input, + groups.get_tensor_model_parallel_src_rank(), + group=groups.get_tensor_model_parallel_group()) + + torch_linear, torch_out = process_linear_layer(hidden_dim, input) + linear = LinearAllreduce(deepcopy(torch_linear), groups.get_tensor_model_parallel_group()) + + input_ = torch.chunk(input, tp_size, dim=-1)[groups.get_tensor_model_parallel_rank()] + out = linear(input_.to(get_accelerator().current_device())) + loss = out.sum() + loss.backward() + + torch_grad = torch.chunk(torch_linear.weight.grad, tp_size, dim=1)[groups.get_tensor_model_parallel_rank()] + assert torch.allclose(linear.weight.grad, torch_grad.to(get_accelerator().current_device()), atol=1e-3) + assert torch.allclose(out, torch_out.to(get_accelerator().current_device()), atol=1e-3) + + def testColumnParallel(self, tp_size: int): + skip_on_device() + hidden_dim = 128 + batch_size_per_device = 1 + set_autotp_mode(training=True) + config_dict = { + "train_micro_batch_size_per_gpu": 1, + "steps_per_print": 1, + "optimizer": { + "type": "Adam", + "params": { + "lr": 1e-6 + } + }, + "tensor_parallel": { + "autotp_size": tp_size + }, + "zero_optimization": { + "stage": 0, + } + } + if preferred_dtype() is torch.float16: + config_dict["fp16"] = {"enabled": True} + elif preferred_dtype() is torch.bfloat16: + config_dict["bf16"] = {"enabled": True} + + model = SequentialLinearModel(hidden_dim=hidden_dim) + model, _, _, _ = deepspeed.initialize(model=model, model_parameters=model.parameters(), config=config_dict) + input = torch.randn(batch_size_per_device, + hidden_dim, + dtype=preferred_dtype(), + requires_grad=True, + device=get_accelerator().current_device()) + dist.broadcast(input, + groups.get_tensor_model_parallel_src_rank(), + group=groups.get_tensor_model_parallel_group()) + + torch_linear, torch_out = process_linear_layer(hidden_dim, input) + + linear = LinearLayer(deepcopy(torch_linear), groups.get_tensor_model_parallel_group()) + + out = linear(input.to(get_accelerator().current_device())) + loss = out.sum() + loss.backward() + + cur_device_out = torch.chunk(torch_out, tp_size, dim=-1)[groups.get_tensor_model_parallel_rank()] + torch_grad = torch.chunk(torch_linear.weight.grad, tp_size, dim=0)[groups.get_tensor_model_parallel_rank()] + assert torch.allclose(linear.weight.grad, torch_grad.to(get_accelerator().current_device()), atol=1e-3) + assert torch.allclose(cur_device_out.to(get_accelerator().current_device()).contiguous(), + out.contiguous(), + atol=1e-3) + + +@pytest.mark.sequential +class TestParamsGather(DistributedTest): + world_size = 4 + reuse_dist_env = True + + @pytest.mark.parametrize("layer_type", ["linear", "linearallreduce"]) + def test(self, layer_type): + skip_on_device() + tp_size = 4 + hidden_dim = 128 + set_autotp_mode(training=True) + config_dict = { + "train_micro_batch_size_per_gpu": 1, + "optimizer": { + "type": "Adam", + "params": { + "lr": 1e-6 + } + }, + "tensor_parallel": { + "autotp_size": tp_size + }, + "zero_optimization": { + "stage": 0, + } + } + if preferred_dtype() is torch.float16: + config_dict["fp16"] = {"enabled": True} + elif preferred_dtype() is torch.bfloat16: + config_dict["bf16"] = {"enabled": True} + + torch.manual_seed(42) + model = SequentialLinearModel(hidden_dim=hidden_dim) + model, _, _, _ = deepspeed.initialize(model=model, model_parameters=model.parameters(), config=config_dict) + + torch_linear = nn.Linear(hidden_dim, hidden_dim, dtype=preferred_dtype(), device="cpu", bias=None) + total_params = sum(p.numel() for p in torch_linear.parameters()) + + tp_layer = None + if layer_type == "linear": + tp_layer = LinearLayer(torch_linear, groups.get_tensor_model_parallel_group()) + elif layer_type == "linearallreduce": + tp_layer = LinearAllreduce(torch_linear, groups.get_tensor_model_parallel_group()) + else: + raise ValueError(f"Invalid linear type: {config_dict['linear_type']}") + + tp_params = sum(p.numel() for p in tp_layer.parameters()) + + assert total_params // tp_size == tp_params + for name, param in tp_layer.named_parameters(recurse=False): + param.gather_params([param]) + + is_same_weights = all( + torch.equal(param1, param2) for param1, param2 in zip(tp_layer.parameters(), torch_linear.parameters())) + + assert is_same_weights + + params1 = sum(p.numel() for p in tp_layer.parameters()) + assert total_params == params1 + + for name, param in tp_layer.named_parameters(recurse=False): + param.partition([param]) + + tp_params2 = sum(p.numel() for p in tp_layer.parameters()) + + assert total_params // tp_size == tp_params2 + + +def dummy_init_engine(config): + # This is a dummy initialization function for the DeepSpeed engine. + # We only need to use the config to initialize the distributed settings for the test. + model = SequentialLinearModel(hidden_dim=8) + model, _, _, _ = deepspeed.initialize(model=model, model_parameters=model.parameters(), config=config) + + +def prepare_tp_model(hidden_dim, nlayers, linear_indices, allreduce_indices, group, return_global_copy=False): + model = SequentialLinearModel(hidden_dim=hidden_dim, nlayers=nlayers).to(preferred_dtype()) + base_model = None + if return_global_copy: + base_model = deepcopy(model) + for i in linear_indices: + layer = LinearLayer(model.linears[i], group) + model.linears[i] = layer + + for i in allreduce_indices: + layer = LinearAllreduce(model.linears[i], group) + model.linears[i] = layer + + return model, base_model + + +@pytest.mark.parametrize("zero_stage", [0, 1]) +@pytest.mark.parametrize("tp_size", [2, 4]) +class TestSave(DistributedTest): + + world_size = 4 + reuse_dist_env = True + + def test_save_original_weight(self, tp_size: int, zero_stage: int): + skip_on_device() + hidden_dim = 64 + set_autotp_mode(training=True) + config_dict = { + "train_micro_batch_size_per_gpu": 1, + "steps_per_print": 1, + "optimizer": { + "type": "Adam", + "params": { + "lr": 1e-6 + } + }, + "tensor_parallel": { + "autotp_size": tp_size + }, + "zero_optimization": { + "stage": zero_stage, + } + } + if preferred_dtype() is torch.float16: + config_dict["fp16"] = {"enabled": True} + elif preferred_dtype() is torch.bfloat16: + config_dict["bf16"] = {"enabled": True} + dummy_init_engine(config_dict) + torch.manual_seed(42) + + model, base_model = prepare_tp_model(hidden_dim, + 8, [2, 5], [3, 6], + groups.get_tensor_model_parallel_group(), + return_global_copy=True) + model, _, _, _ = deepspeed.initialize(model=model, model_parameters=model.parameters(), config=config_dict) + + cur_params_numel = sum(p.numel() for p in model.parameters()) + base_params_numel = sum(p.numel() for p in base_model.parameters()) + assert cur_params_numel < base_params_numel + + tp_state_dict = model._consolidated_16bit_state_dict() + + def compare_state_dicts(state_dict1, state_dict2): + if state_dict1.keys() != state_dict2.keys(): + print("The state_dicts have different keys!") + return False + + for key in state_dict1: + if not torch.allclose(state_dict1[key], state_dict2[key], atol=1e-3): + assert state_dict1[key].device == "cpu" + print(f"Parameters for {key} are different!") + return False + + return True + + base_state_dict = base_model.state_dict() + if dist.get_rank() == 0: + # we should consider the case when zero3 is used in the future. + assert compare_state_dicts(base_state_dict, tp_state_dict), f"State_dict is not the same!" + else: + assert tp_state_dict is None, f"noly rank0 should have the state_dict" + + def test_ckpt_save(self, tmpdir, tp_size: int, zero_stage: int): + skip_on_device() + hidden_dim = 64 + set_autotp_mode(training=True) + config_dict = { + "train_micro_batch_size_per_gpu": 1, + "steps_per_print": 1, + "optimizer": { + "type": "Adam", + "params": { + "lr": 1e-3 + } + }, + "zero_optimization": { + "stage": zero_stage, + }, + "tensor_parallel": { + "autotp_size": tp_size + }, + "scheduler": { + "type": "WarmupLR", + "params": { + "warmup_min_lr": 0, + "warmup_max_lr": 0.001, + "warmup_num_steps": 1000 + } + } + } + + if preferred_dtype() is torch.float16: + config_dict["fp16"] = {"enabled": True} + elif preferred_dtype() is torch.bfloat16: + config_dict["bf16"] = {"enabled": True} + + dummy_init_engine(config_dict) + + trained_model, _ = prepare_tp_model(hidden_dim, 8, [2, 5], [3, 6], groups.get_tensor_model_parallel_group()) + loaded_model, _ = prepare_tp_model(hidden_dim, 8, [2, 5], [3, 6], groups.get_tensor_model_parallel_group()) + + trained_model, _, _, _ = deepspeed.initialize(model=trained_model, + model_parameters=trained_model.parameters(), + config=config_dict) + torch.manual_seed(42) + + data_loader = random_dataloader(model=trained_model, + total_samples=3, + hidden_dim=hidden_dim, + device=trained_model.device, + dtype=preferred_dtype()) + ckpt_path = os.path.join(tmpdir, 'tp_saved_checkpoint') + for i, batch in enumerate(data_loader): + batch[0].requires_grad = True + loss = trained_model(batch[0], batch[1]) + loss = loss + trained_model.backward(loss) + trained_model.step() + trained_model.save_checkpoint(ckpt_path) + + loaded_model, _, _, _ = deepspeed.initialize(model=loaded_model, + model_parameters=loaded_model.parameters(), + config=config_dict) + loaded_model.load_checkpoint(ckpt_path, load_optimizer_states=True, load_lr_scheduler_states=True) + compare_optimizer_states(trained_model, loaded_model, hidden_dim, fp16=(preferred_dtype() == torch.float16)) + compare_lr_scheduler_states(trained_model, loaded_model) + + +@pytest.mark.parametrize("zero_stage", [0, 1]) +@pytest.mark.parametrize("tp_size", [2, 4]) +class TestTpGradNorm(DistributedTest): + + world_size = 4 + reuse_dist_env = True + + def test(self, tp_size: int, zero_stage: int): + skip_on_device() + hidden_dim = 64 + set_autotp_mode(training=True) + config_dict = { + "train_micro_batch_size_per_gpu": 1, + "steps_per_print": 1, + "optimizer": { + "type": "Adam", + "params": { + "lr": 1e-6 + } + }, + "tensor_parallel": { + "autotp_size": tp_size + }, + "zero_optimization": { + "stage": zero_stage, + } + } + if preferred_dtype() is torch.float16: + config_dict["fp16"] = {"enabled": True} + elif preferred_dtype() is torch.bfloat16: + if zero_stage == 0: + pytest.skip( + "This test has an overflow data and needs to implement an overflow skip mechanism in BF16_optimizer" + ) + config_dict["bf16"] = {"enabled": True} + + torch.manual_seed(42) + + dummy_init_engine(config=config_dict) + tp_model, base_model = prepare_tp_model(hidden_dim, + 8, [2, 5], [3, 6], + groups.get_tensor_model_parallel_group(), + return_global_copy=True) + + base_model, base_optimizer, _, _ = deepspeed.initialize(model=base_model, + model_parameters=base_model.parameters(), + config=config_dict) + data_loader = random_dataloader(model=base_model, + total_samples=20, + hidden_dim=hidden_dim, + device=base_model.device, + dtype=preferred_dtype()) + + for i, batch in enumerate(data_loader): + batch[0].requires_grad = True + loss = base_model(batch[0], batch[1]) + loss = loss + base_model.backward(loss) + base_model.step() + + base_norm = base_optimizer._global_grad_norm + + base_model.destroy() + + tp_model, tp_optimizer, _, _ = deepspeed.initialize(model=tp_model, + model_parameters=tp_model.parameters(), + config=config_dict) + for i, batch in enumerate(data_loader): + batch[0].requires_grad = True + loss = tp_model(batch[0], batch[1]) + loss = loss + tp_model.backward(loss) + tp_model.step() + + tp_norm = tp_optimizer._global_grad_norm + + assert math.isclose(base_norm, tp_norm, abs_tol=1e-3) + tp_params_numel = sum(p.numel() for p in tp_model.parameters()) + base_params_numel = sum(p.numel() for p in base_model.parameters()) + assert tp_params_numel < base_params_numel From 301bc2885b8d38cf62e6ec6f86f82d59e8ace945 Mon Sep 17 00:00:00 2001 From: Omar Elayan <142979319+oelayan7@users.noreply.github.com> Date: Fri, 7 Feb 2025 00:05:31 +0200 Subject: [PATCH 713/754] import triton files when triton is supported and installed (#6989) Those files have code that gets run when importing them, so in systems that doesn't support triton but have triton installed this causes issues. In general, I think it is better to import triton when it is installed and supported. Signed-off-by: Omar Elayan --- deepspeed/model_implementations/transformers/ds_transformer.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/deepspeed/model_implementations/transformers/ds_transformer.py b/deepspeed/model_implementations/transformers/ds_transformer.py index 360113b78a3d..7e3c81b714c0 100644 --- a/deepspeed/model_implementations/transformers/ds_transformer.py +++ b/deepspeed/model_implementations/transformers/ds_transformer.py @@ -14,7 +14,7 @@ from deepspeed.ops.transformer.inference.op_binding.workspace import WorkspaceOp from deepspeed.accelerator import get_accelerator import deepspeed -if deepspeed.HAS_TRITON: +if deepspeed.HAS_TRITON and get_accelerator().is_triton_supported(): from deepspeed.ops.transformer.inference.triton.mlp import TritonMLP from deepspeed.ops.transformer.inference.triton.attention import TritonSelfAttention From a83ab17d3dd20987dcfc9e04395db8ddcf93df08 Mon Sep 17 00:00:00 2001 From: Logan Adams <114770087+loadams@users.noreply.github.com> Date: Fri, 7 Feb 2025 16:26:02 -0800 Subject: [PATCH 714/754] Update A6000 tests transformers version (#7016) Signed-off-by: Logan Adams Co-authored-by: Stas Bekman --- .github/workflows/nv-a6000.yml | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/.github/workflows/nv-a6000.yml b/.github/workflows/nv-a6000.yml index 5631d318d027..502b29b44c13 100644 --- a/.github/workflows/nv-a6000.yml +++ b/.github/workflows/nv-a6000.yml @@ -42,7 +42,8 @@ jobs: run: | git clone https://github.com/huggingface/transformers cd transformers - git checkout v4.47.1 + # if you need to use an older transformers version temporarily in case of breakage + # git checkout v4.47.1 git rev-parse --short HEAD python -m pip install . - name: Install deepspeed From 22d7fdc0f444571131d77ab13be858b5118770ef Mon Sep 17 00:00:00 2001 From: Olatunji Ruwase Date: Mon, 10 Feb 2025 15:55:20 -0500 Subject: [PATCH 715/754] Fix ds-chat CI regression (#7015) Fix #7014 Avoid naming collision on `partition()` --------- Signed-off-by: Olatunji Ruwase --- deepspeed/module_inject/layers.py | 39 ++++++++++--------- deepspeed/runtime/hybrid_engine.py | 9 ++++- .../model_parallelism/test_autotp_training.py | 2 +- 3 files changed, 28 insertions(+), 22 deletions(-) diff --git a/deepspeed/module_inject/layers.py b/deepspeed/module_inject/layers.py index c410bf900c31..2a24c2920466 100644 --- a/deepspeed/module_inject/layers.py +++ b/deepspeed/module_inject/layers.py @@ -124,7 +124,7 @@ def backward(ctx: Any, grad_output: torch.Tensor) -> Tuple[None, torch.Tensor]: return None, grad_output -class Replaced_Layer(nn.Module, ABC): +class TensorParallel_Layer(nn.Module, ABC): """ A base class for model layers with tensor parallelism support. This class is designed to be extended by specific layers that require distributed @@ -141,7 +141,7 @@ class Replaced_Layer(nn.Module, ABC): def __init__(self, mp_group: Optional[dist.ProcessGroup], **kwargs: Any): """ - Initializes the Replaced_Layer with optional model parallelism group and layer name. + Initializes the TensorParallel_Layer with optional model parallelism group and layer name. Args: mp_group (Optional[dist.ProcessGroup]): The process group for model parallelism. @@ -177,7 +177,7 @@ def gather_params(self, params_list): pass @abstractmethod - def partition(self, params_list: List[torch.Tensor]): + def _tp_partition(self, params_list: List[torch.Tensor]): """ Partitions the parameters for tensor parallelism. It is necessary to ensure that this function only involves the logic of params partitioning. @@ -205,7 +205,7 @@ def config_tp_params(self, weight): setattr(weight, DS_TENSOR_MODEL_PARALLEL, True) setattr(weight, DS_IS_REPLACED_MODULE, True) weight.gather_params = self.gather_params - weight.partition = self.partition + weight._tp_partition = self._tp_partition def is_training_mode(self): global DEEPSPEED_AUTOTP_MODE @@ -294,17 +294,17 @@ def __exit__(self, exc_type, exc_value, traceback) -> None: """ #TODO : Check whether there are any missing attributes. if self.enabled: - self.params[0].partition(self.params) + self.params[0]._tp_partition(self.params) -class LinearAllreduce(Replaced_Layer): +class LinearAllreduce(TensorParallel_Layer): def __init__(self, module, mp_group, **kwargs): super(LinearAllreduce, self).__init__(mp_group, **kwargs) self.weight = module.weight self.bias = module.bias - self.partition([self.weight, self.bias]) + self._tp_partition([self.weight, self.bias]) self.support_training = True self.config_tp_params(self.weight) if self.bias is not None: @@ -335,7 +335,7 @@ def gather_params(self, params_list): return @torch.no_grad() - def partition(self, params_list): + def _tp_partition(self, params_list): if not self.is_training_mode(): self.uneven_partition(params_list) @@ -367,21 +367,22 @@ def uneven_partition(self, params_list): #remove kwargs from partition. -class LinearLayer(Replaced_Layer): +class LinearLayer(TensorParallel_Layer): - def __init__(self, module, mp_group, skip_partition=False, **kwargs): + def __init__(self, module, mp_group=None, skip_partition=False, **kwargs): super(LinearLayer, self).__init__(mp_group, **kwargs) self.weight = module.weight self.bias = module.bias if not skip_partition: - self.partition([self.weight, self.bias]) + self._tp_partition([self.weight, self.bias]) self.support_training = True self.config_tp_params(self.weight) if self.bias is not None: self.config_tp_params(self.bias) def forward(self, input): - input = ColumnParallel.apply(self.mp_group, input) + if getattr(self, 'mp_group', None) is not None: + input = ColumnParallel.apply(self.mp_group, input) output = torch.matmul(input, self.weight.transpose(-1, -2)) if self.bias is not None: output += self.bias @@ -401,7 +402,7 @@ def gather_params(self, params_list): params_list[idx].data = output_param.contiguous() @torch.no_grad() - def partition(self, params_list): + def _tp_partition(self, params_list): if not self.is_training_mode(): self.uneven_partition(params_list) @@ -466,7 +467,7 @@ def __init__(self, module, mp_group, skip_partition=False, **kwargs): super().__init__(module, mp_group, skip_partition, **kwargs) @torch.no_grad() - def partition(self, params_list): + def _tp_partition(self, params_list): for idx, param in enumerate(params_list): if param is None: return @@ -481,7 +482,7 @@ def partition(self, params_list): class conv_LinearLayer(LinearLayer): @torch.no_grad() - def partition(self, params_list): + def _tp_partition(self, params_list): weight = None bias = None if len(params_list) == 1: @@ -506,7 +507,7 @@ class Yuan_LinearAllreduce(LinearAllreduce): #Yuan2 @torch.no_grad() - def partition(self, params_list): + def _tp_partition(self, params_list): weight, bias = shard_value_with_share_qk(params_list[0].data, params_list[1], self.tp_index, self.tp_world_size, False) params_list[0].data = weight @@ -517,7 +518,7 @@ def partition(self, params_list): class Yuan_LinearLayer(LinearLayer): #Yuan2 @torch.no_grad() - def partition(self, params_list): + def _tp_partition(self, params_list): weight, bias = shard_value_with_share_qk(params_list[0].data, params_list[1], self.tp_index, self.tp_world_size, True) params_list[0].data = move(weight, get_accelerator().current_device_name()).detach() @@ -528,7 +529,7 @@ def partition(self, params_list): class GateUpPack_LinearLayer(LinearLayer): # chatGLM2, chatGLM2 @torch.no_grad() - def partition(self, params_list): + def _tp_partition(self, params_list): weight, bias = shard_chunk_mlp(params_list[0].data, params_list[1], self.tp_index, self.tp_world_size) params_list[0].data = move(weight, device=get_accelerator().current_device_name()).detach() if bias is not None: @@ -538,7 +539,7 @@ def partition(self, params_list): class Conv_LinearALlreduce(LinearAllreduce): @torch.no_grad() - def partition(self, params_list): + def _tp_partition(self, params_list): for idx, param in enumerate(params_list): if param is None: return diff --git a/deepspeed/runtime/hybrid_engine.py b/deepspeed/runtime/hybrid_engine.py index 8a6311bb6e83..b6e417fd4764 100644 --- a/deepspeed/runtime/hybrid_engine.py +++ b/deepspeed/runtime/hybrid_engine.py @@ -290,8 +290,13 @@ def create_inference_containers(self, module, layer_id=0): layer_id += 1 else: - self._other_layers.append(self.inference_policies[child.__class__][0]( - weight=child.weight, bias=child.bias if hasattr(child, 'bias') else None)) + if self.inference_policies[child.__class__][0] == LinearLayer: + self._other_layers.append(self.inference_policies[child.__class__][0](module=child, + mp_group=None, + skip_partition=True)) + else: + self._other_layers.append(self.inference_policies[child.__class__][0]( + weight=child.weight, bias=child.bias if hasattr(child, 'bias') else None)) self._orig_modules_others.append(child) self._orig_fwds_others.append(child.forward) else: diff --git a/tests/unit/model_parallelism/test_autotp_training.py b/tests/unit/model_parallelism/test_autotp_training.py index fc1f0624ec87..73e61b1d3398 100644 --- a/tests/unit/model_parallelism/test_autotp_training.py +++ b/tests/unit/model_parallelism/test_autotp_training.py @@ -330,7 +330,7 @@ def test(self, layer_type): assert total_params == params1 for name, param in tp_layer.named_parameters(recurse=False): - param.partition([param]) + param._tp_partition([param]) tp_params2 = sum(p.numel() for p in tp_layer.parameters()) From a5b63953d2584e06855192dc68c6849589d60aa5 Mon Sep 17 00:00:00 2001 From: Stas Bekman Date: Tue, 11 Feb 2025 15:39:07 -0800 Subject: [PATCH 716/754] [Ulysses tutorial] typos (#7024) Fix typos --- docs/_tutorials/ds-sequence.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/docs/_tutorials/ds-sequence.md b/docs/_tutorials/ds-sequence.md index ffcb94946e6a..7a6041f393f9 100755 --- a/docs/_tutorials/ds-sequence.md +++ b/docs/_tutorials/ds-sequence.md @@ -49,7 +49,7 @@ def forward(): ``` -* **Add sequence parallel communication group**: Note that DistributedAttention takes `local_attn` and `sequence_parallel_group` as the parameters, where local_attn can be your original attention block. You also need to build the sequence parallel nication group and pass that the DistributedAttention. One way to do this is to build the sequence parallel group at the model initialization stage. +* **Add sequence parallel communication group**: Note that DistributedAttention takes `local_attn` and `sequence_parallel_group` as the parameters, where local_attn can be your original attention block. You also need to build the sequence parallel communication group and pass that the DistributedAttention. One way to do this is to build the sequence parallel group at the model initialization stage. ```python @@ -94,7 +94,7 @@ DeepSpeed's sequence parallelism can be combined with different types of attenti `FlashAttention`: the implementation from [FlashAttention: Fast and Memory-Efficient Exact Attention with IO-Awareness](https://arxiv.org/abs/2205.14135). Enabled by `--use-flash-attn`. -`FlashAttention + Triton`: a of FlashAttention in Triton (tested with triton==2.0.0.dev20221202). Enabled by `--use-flash-attn-triton`. +`FlashAttention + Triton`: FlashAttention in Triton (tested with triton==2.0.0.dev20221202). Enabled by `--use-flash-attn-triton`. For the best performance, we recommend using FlashAttention + Triton. Below are the installation steps. Note that FlashAttention is compatible only with NVIDIA Turing, Ampere, Ada, or Hopper GPUs. @@ -114,4 +114,4 @@ cd flash-attention python setup.py install ``` -You may also want to ensure your model configuration is compliant with FlashAttention's requirements. For instance, to achieve optimal performance, the head size should be divisible by 8. Refer to the document of FlashAttention for more details. +You may also want to ensure your model configuration is compliant with FlashAttention's requirements. For instance, to achieve optimal performance, the head size should be divisible by 8. Refer to the FlashAttention documentation for more details. From 549e11d2cf9164c3b4604db7ca5ed59a5d4039a1 Mon Sep 17 00:00:00 2001 From: Roman Fitzjalen Date: Wed, 12 Feb 2025 19:17:23 +0100 Subject: [PATCH 717/754] fix hostname -I for macOS #6497 (#6990) BUGFIX for Apple Silicon hostname https://github.com/microsoft/DeepSpeed/issues/6497 --------- Signed-off-by: Fabien Dupont Signed-off-by: Olatunji Ruwase Signed-off-by: Logan Adams Signed-off-by: inkcherry Signed-off-by: Roman Fitzjalen Co-authored-by: Logan Adams <114770087+loadams@users.noreply.github.com> Co-authored-by: Fabien Dupont Co-authored-by: Olatunji Ruwase Co-authored-by: Liangliang Ma <1906710196@qq.com> Co-authored-by: inkcherry --- deepspeed/comm/comm.py | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/deepspeed/comm/comm.py b/deepspeed/comm/comm.py index 1aa9b135115b..800bc6078c3a 100755 --- a/deepspeed/comm/comm.py +++ b/deepspeed/comm/comm.py @@ -704,9 +704,13 @@ def mpi_discovery(distributed_port=TORCH_DISTRIBUTED_DEFAULT_PORT, verbose=True) master_addr = None if rank == 0: import shlex - hostname_cmd = shlex.split("hostname -I") - result = subprocess.check_output(hostname_cmd) - master_addr = result.decode('utf-8').split()[0] + try: + hostname_cmd = shlex.split("hostname -I") + result = subprocess.check_output(hostname_cmd) + master_addr = result.decode('utf-8').split()[0] + except subprocess.CalledProcessError: # hostname -I not available (e.g. on macOS) + import socket + master_addr = socket.gethostbyname(socket.gethostname()) master_addr = comm.bcast(master_addr, root=0) # Determine local rank by assuming hostnames are unique From 079de6bdff85213fe6af42544426310f8ed3ece6 Mon Sep 17 00:00:00 2001 From: Logan Adams <114770087+loadams@users.noreply.github.com> Date: Wed, 12 Feb 2025 15:25:41 -0800 Subject: [PATCH 718/754] Update workflows to cuda 12.4 (#7000) - Update existing workflows that use cu121 to cu124. Note, this means that where we download torch latest, we will now be getting torch 2.6 rather than the torch latest 2.5 provided with cuda 12.1. - Note, nv-nightly is failing in master currently due to unrelated errors, so this could be ignored in this PR (nv-nightly tested locally, where it passes with 12.1 and it also passes with 12.4). --------- Signed-off-by: Fabien Dupont Signed-off-by: Logan Adams Signed-off-by: Olatunji Ruwase Signed-off-by: inkcherry Signed-off-by: Omar Elayan Co-authored-by: Fabien Dupont Co-authored-by: Olatunji Ruwase Co-authored-by: Liangliang Ma <1906710196@qq.com> Co-authored-by: inkcherry Co-authored-by: Omar Elayan <142979319+oelayan7@users.noreply.github.com> --- .github/workflows/nv-accelerate-v100.yml | 4 ++-- .github/workflows/nv-ds-chat.yml | 4 ++-- .github/workflows/nv-inference.yml | 10 +++++----- .github/workflows/nv-lightning-v100.yml | 4 ++-- .github/workflows/nv-mii.yml | 4 ++-- .github/workflows/nv-nightly.yml | 6 +++--- .github/workflows/nv-torch-latest-v100.yml | 8 ++++---- .github/workflows/nv-torch-nightly-v100.yml | 4 ++-- .github/workflows/nv-transformers-v100.yml | 4 ++-- 9 files changed, 24 insertions(+), 24 deletions(-) diff --git a/.github/workflows/nv-accelerate-v100.yml b/.github/workflows/nv-accelerate-v100.yml index 0792e4e09cb2..c9caf697b5b3 100644 --- a/.github/workflows/nv-accelerate-v100.yml +++ b/.github/workflows/nv-accelerate-v100.yml @@ -19,7 +19,7 @@ concurrency: jobs: unit-tests: - runs-on: [self-hosted, nvidia, cu121, v100] + runs-on: [self-hosted, nvidia, cu124, v100] steps: - uses: actions/checkout@v4 @@ -29,7 +29,7 @@ jobs: - name: Install pytorch run: | - pip install -U --cache-dir $TORCH_CACHE torch torchvision --index-url https://download.pytorch.org/whl/cu121 + pip install -U --cache-dir $TORCH_CACHE torch torchvision --index-url https://download.pytorch.org/whl/cu124 python -c "import torch; print('torch:', torch.__version__, torch)" python -c "import torch; print('CUDA available:', torch.cuda.is_available())" diff --git a/.github/workflows/nv-ds-chat.yml b/.github/workflows/nv-ds-chat.yml index ec9b99b2c2db..10fcb9911899 100644 --- a/.github/workflows/nv-ds-chat.yml +++ b/.github/workflows/nv-ds-chat.yml @@ -27,7 +27,7 @@ permissions: jobs: unit-tests: - runs-on: [self-hosted, nvidia, cu121, v100] + runs-on: [self-hosted, nvidia, cu124, v100] steps: - uses: actions/checkout@v4 @@ -37,7 +37,7 @@ jobs: - name: Install pytorch run: | - pip install -U --cache-dir $TORCH_CACHE torch torchvision --index-url https://download.pytorch.org/whl/cu121 + pip install -U --cache-dir $TORCH_CACHE torch torchvision --index-url https://download.pytorch.org/whl/cu124 python -c "import torch; print('torch:', torch.__version__, torch)" python -c "import torch; print('CUDA available:', torch.cuda.is_available())" diff --git a/.github/workflows/nv-inference.yml b/.github/workflows/nv-inference.yml index c0a4275bd2b6..8906130bc1af 100644 --- a/.github/workflows/nv-inference.yml +++ b/.github/workflows/nv-inference.yml @@ -22,7 +22,7 @@ concurrency: jobs: unit-tests: - runs-on: [self-hosted, nvidia, cu121, v100] + runs-on: [self-hosted, nvidia, cu124, v100] steps: - uses: actions/checkout@v4 @@ -32,7 +32,7 @@ jobs: - name: Install pytorch run: | - pip install -U --cache-dir $TORCH_CACHE torch==2.1.2 torchvision==0.16.2 --index-url https://download.pytorch.org/whl/cu121 + pip install -U --cache-dir $TORCH_CACHE torch==2.1.2 torchvision==0.16.2 --index-url https://download.pytorch.org/whl/cu124 python -c "import torch; print('torch:', torch.__version__, torch)" python -c "import torch; print('CUDA available:', torch.cuda.is_available())" @@ -58,8 +58,8 @@ jobs: run: | unset TORCH_CUDA_ARCH_LIST # only jit compile for current arch cd tests - #pytest $PYTEST_OPTS -m 'seq_inference' unit/ --torch_ver="2.1" --cuda_ver="12.1" - pytest $PYTEST_OPTS -m 'inference_ops' unit/ --torch_ver="2.1" --cuda_ver="12.1" - pytest $PYTEST_OPTS --forked -n 4 -m 'inference' unit/ --torch_ver="2.1" --cuda_ver="12.1" + #pytest $PYTEST_OPTS -m 'seq_inference' unit/ --torch_ver="2.1" --cuda_ver="12.4" + pytest $PYTEST_OPTS -m 'inference_ops' unit/ --torch_ver="2.1" --cuda_ver="12.4" + pytest $PYTEST_OPTS --forked -n 4 -m 'inference' unit/ --torch_ver="2.1" --cuda_ver="12.4" # run ds_report again to check updated op list ds_report diff --git a/.github/workflows/nv-lightning-v100.yml b/.github/workflows/nv-lightning-v100.yml index f92aa7edfdd5..d31ae5569848 100644 --- a/.github/workflows/nv-lightning-v100.yml +++ b/.github/workflows/nv-lightning-v100.yml @@ -19,7 +19,7 @@ concurrency: jobs: unit-tests: - runs-on: [self-hosted, nvidia, cu121, v100] + runs-on: [self-hosted, nvidia, cu124, v100] steps: - uses: actions/checkout@v4 @@ -29,7 +29,7 @@ jobs: - name: Install pytorch run: | - pip install -U --cache-dir $TORCH_CACHE torch torchvision --index-url https://download.pytorch.org/whl/cu121 + pip install -U --cache-dir $TORCH_CACHE torch torchvision --index-url https://download.pytorch.org/whl/cu124 python -c "import torch; print('torch:', torch.__version__, torch)" python -c "import torch; print('CUDA available:', torch.cuda.is_available())" diff --git a/.github/workflows/nv-mii.yml b/.github/workflows/nv-mii.yml index a2397f347799..aff0c8a548c1 100644 --- a/.github/workflows/nv-mii.yml +++ b/.github/workflows/nv-mii.yml @@ -27,7 +27,7 @@ concurrency: jobs: unit-tests: - runs-on: [self-hosted, nvidia, cu121, v100] + runs-on: [self-hosted, nvidia, cu124, v100] steps: - uses: actions/checkout@v4 @@ -37,7 +37,7 @@ jobs: - name: Install pytorch run: | - pip3 install -U --cache-dir $TORCH_CACHE torch torchvision --index-url https://download.pytorch.org/whl/cu121 + pip3 install -U --cache-dir $TORCH_CACHE torch torchvision --index-url https://download.pytorch.org/whl/cu124 python -c "import torch; print('torch:', torch.__version__, torch)" python -c "import torch; print('CUDA available:', torch.cuda.is_available())" diff --git a/.github/workflows/nv-nightly.yml b/.github/workflows/nv-nightly.yml index 8c56d0445c9c..7f81484c7646 100644 --- a/.github/workflows/nv-nightly.yml +++ b/.github/workflows/nv-nightly.yml @@ -18,7 +18,7 @@ permissions: jobs: unit-tests: - runs-on: [self-hosted, nvidia, cu121, v100] + runs-on: [self-hosted, nvidia, cu124, v100] steps: - uses: actions/checkout@v4 @@ -28,7 +28,7 @@ jobs: - name: Install pytorch run: | - pip install -U --cache-dir $TORCH_CACHE torch torchvision --index-url https://download.pytorch.org/whl/cu121 + pip install -U --cache-dir $TORCH_CACHE torch torchvision --index-url https://download.pytorch.org/whl/cu124 python -c "import torch; print('torch:', torch.__version__, torch)" python -c "import torch; print('CUDA available:', torch.cuda.is_available())" @@ -58,7 +58,7 @@ jobs: run: | unset TORCH_CUDA_ARCH_LIST # only jit compile for current arch cd tests - pytest $PYTEST_OPTS --forked -m 'nightly' unit/ --torch_ver="2.5" --cuda_ver="12.1" + pytest $PYTEST_OPTS --forked -m 'nightly' unit/ --torch_ver="2.6" --cuda_ver="12.4" - name: Open GitHub issue if nightly CI fails if: ${{ failure() && (github.event_name == 'schedule') }} diff --git a/.github/workflows/nv-torch-latest-v100.yml b/.github/workflows/nv-torch-latest-v100.yml index a1ba4937d164..3884663d9e55 100644 --- a/.github/workflows/nv-torch-latest-v100.yml +++ b/.github/workflows/nv-torch-latest-v100.yml @@ -19,7 +19,7 @@ concurrency: jobs: unit-tests: - runs-on: [self-hosted, nvidia, cu121, v100] + runs-on: [self-hosted, nvidia, cu124, v100] steps: - uses: actions/checkout@v4 @@ -29,7 +29,7 @@ jobs: - name: Install pytorch run: | - pip install -U --cache-dir $TORCH_CACHE torch torchvision --index-url https://download.pytorch.org/whl/cu121 + pip install -U --cache-dir $TORCH_CACHE torch torchvision --index-url https://download.pytorch.org/whl/cu124 python -c "import torch; print('torch:', torch.__version__, torch)" python -c "import torch; print('CUDA available:', torch.cuda.is_available())" @@ -55,5 +55,5 @@ jobs: run: | unset TORCH_CUDA_ARCH_LIST # only jit compile for current arch cd tests - pytest $PYTEST_OPTS --forked -n 4 unit/ --torch_ver="2.5" --cuda_ver="12.1" - pytest $PYTEST_OPTS --forked -m 'sequential' unit/ --torch_ver="2.5" --cuda_ver="12.1" + pytest $PYTEST_OPTS --forked -n 4 unit/ --torch_ver="2.6" --cuda_ver="12.4" + pytest $PYTEST_OPTS --forked -m 'sequential' unit/ --torch_ver="2.6" --cuda_ver="12.4" diff --git a/.github/workflows/nv-torch-nightly-v100.yml b/.github/workflows/nv-torch-nightly-v100.yml index 0a9570a1ceaa..cb8c15f0d709 100644 --- a/.github/workflows/nv-torch-nightly-v100.yml +++ b/.github/workflows/nv-torch-nightly-v100.yml @@ -18,7 +18,7 @@ permissions: jobs: unit-tests: - runs-on: [self-hosted, nvidia, cu121, v100] + runs-on: [self-hosted, nvidia, cu124, v100] steps: - uses: actions/checkout@v4 @@ -28,7 +28,7 @@ jobs: - name: Install pytorch run: | - pip install --pre torch torchvision --index-url https://download.pytorch.org/whl/nightly/cu121 + pip install --pre torch torchvision --index-url https://download.pytorch.org/whl/nightly/cu124 python -c "import torch; print('torch:', torch.__version__, torch)" python -c "import torch; print('CUDA available:', torch.cuda.is_available())" diff --git a/.github/workflows/nv-transformers-v100.yml b/.github/workflows/nv-transformers-v100.yml index 18c5e2c98bc6..9d1253fd77ca 100644 --- a/.github/workflows/nv-transformers-v100.yml +++ b/.github/workflows/nv-transformers-v100.yml @@ -18,7 +18,7 @@ concurrency: jobs: unit-tests: - runs-on: [self-hosted, nvidia, cu121, v100] + runs-on: [self-hosted, nvidia, cu124, v100] steps: - uses: actions/checkout@v4 @@ -29,7 +29,7 @@ jobs: - name: Install pytorch run: | # use the same pytorch version as transformers CI - pip install -U --cache-dir $TORCH_CACHE torch==2.0.1+cu121 --index-url https://download.pytorch.org/whl/cu121 + pip install -U --cache-dir $TORCH_CACHE torch==2.0.1+cu124 --index-url https://download.pytorch.org/whl/cu124 python -c "import torch; print('torch:', torch.__version__, torch)" python -c "import torch; print('CUDA available:', torch.cuda.is_available())" From 5a361e11eca5fdf6ec339e5a010d01d7a84e3346 Mon Sep 17 00:00:00 2001 From: Ramya Ramineni <62723901+rraminen@users.noreply.github.com> Date: Thu, 13 Feb 2025 10:51:06 -0600 Subject: [PATCH 719/754] [ROCm] Enable fp_quantizer on ROCm (#7027) This change is required to successfully build fp_quantizer extension on ROCm. --------- Co-authored-by: Logan Adams <114770087+loadams@users.noreply.github.com> --- op_builder/fp_quantizer.py | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/op_builder/fp_quantizer.py b/op_builder/fp_quantizer.py index e42927bd065d..df4d967ea09a 100644 --- a/op_builder/fp_quantizer.py +++ b/op_builder/fp_quantizer.py @@ -94,7 +94,10 @@ def sources(self): ] def extra_ldflags(self): - return ['-lcurand'] + if not self.is_rocm_pytorch(): + return ['-lcurand'] + else: + return [] def include_paths(self): return ['csrc/fp_quantizer/includes', 'csrc/includes'] From 83f5deed419090eb9674c557f7ba2a424b53b750 Mon Sep 17 00:00:00 2001 From: Guanhua Wang Date: Thu, 13 Feb 2025 11:38:36 -0800 Subject: [PATCH 720/754] add gds chinese blog (#7034) cc @tjruwase @jomayeri --------- Co-authored-by: root --- blogs/deepspeed-gds/chinese/README.md | 77 +++++++++++++++++++++++++++ 1 file changed, 77 insertions(+) create mode 100644 blogs/deepspeed-gds/chinese/README.md diff --git a/blogs/deepspeed-gds/chinese/README.md b/blogs/deepspeed-gds/chinese/README.md new file mode 100644 index 000000000000..9fa9d7150c42 --- /dev/null +++ b/blogs/deepspeed-gds/chinese/README.md @@ -0,0 +1,77 @@ +
    + +# DeepNVMe: 通过I/O优化提高深度学习应用性能 + +
    + +# 引言 + +深度学习(DL)在语言、语音、视频和多模态应用等重要人工智能领域不断推动着前所未有的进展。这些进展的关键因素是模型大小、序列长度和硬件并行性等多个维度上的显著可扩展性。从系统角度来看,深度学习的可扩展性给计算、内存、通信和存储等关键子系统带来了巨大的压力。然而,现有的深度学习优化工作大多忽略了存储子系统,使得数据加载、模型检查点和卸载等I/O操作成为大规模深度学习中的主要瓶颈。为了解决这个问题,DeepSpeed开发了一整套I/O优化技术,统称为DeepNVMe。 + +DeepNVMe通过加速I/O操作和减少硬件需求,提高了I/O受限的深度学习应用的性能和效率。它通过利用存储创新,如非易失性内存快速通道(NVMe)固态硬盘(SSD)和NVIDIA Magnum IOTM GPUDirect®存储(GDS)实现这一目标。在本文中,我们通过微基准测试和推理应用来展示DeepNVMe的优势。在对Azure NC96ads\_A100\_v4虚拟机进行的实验中,我们观察到DeepNVMe能充分利用可用的NVMe带宽进行GPU或CPU内存的数据传输,读取速度达到10GB/秒,写入速度达到5GB/秒。 + +# 背景 + +高性能访问持久存储是许多计算领域(包括深度学习)中的一个常见挑战。因此,已经提出了大量的硬件和软件解决方案。DeepNVMe基于三种解决方案: (1) NVMe SSDs,(2) NVIDIA GDS,(3) Linux异步I/O(libaio)。我们将简要介绍每项技术。 + +NVMe SSDs是基于闪存的存储设备,正在取代传统的硬盘驱动器(HDD),成为现代服务器的主要持久存储。例如,Azure NC96ads\_A100\_v4虚拟机配备了四个NVMe SSD,每个SSD可提供3.25GB/秒的读取速度,并且可以组合成RAID-0配置,理论上的总读取带宽为13GB/秒。NVIDIA GDS可以实现NVMe和GPU内存之间的直接数据传输,从而避免了传统使用中间CPU内存(缓冲区)方法的低效。NVIDIA GDS在CUDA 11.4及以上版本中可用。最后,libaio是Linux引入的异步I/O栈,它比传统的I/O栈更有效地提取NVMe SSD等高速存储设备的原始性能。 + +# DeepNVMe: 深度学习I/O优化模块 + +DeepNVMe是一个Python模块,我们开发时遵循了两个关键设计原则。首先,它利用上述存储技术,实现了强大的优化,如非阻塞I/O操作、批处理I/O操作提交、单个I/O操作的并行化以及轻量级运行时。其次,它通过一个简单的POSIX-like接口让用户使用I/O优化,便于深度学习应用集成,同时避免了底层技术的复杂性。 + +# 评估 + +我们的实验在Azure NC96ads\_A100\_v4虚拟机上进行,实验设置的详细信息见表1。对于多设备实验,SSD是以RAID-0配置组合使用的。 + + + +
    +表1: 实验设置详细信息 +
    + +## 微基准性能测试 + +我们使用了三种基准测试工具进行评估。第一个是fio,这是一个用C语言编写的流行I/O基准测试工具。第二个是来自NVIDIA的gdsio,用于基准测试GDS性能。第三个是ds\_io,这是我们创建的Python工具,便于与DeepNVMe集成,并且更能代表常见的基于Python的深度学习应用。 + +## 通过NVMe扩展CPU缓冲区,从而提高I/O性能 + +我们的第一组微基准评估使用fio和ds\_io,测量1GB数据在NVMe和CPU内存之间的传输性能。我们配置fio使用libaio后端进行这些实验。结果总结在图1中,我们可以得出两个结论。首先,DeepNVMe表现出高性能,尽管它更能代表深度学习应用,但其性能与fio大致相当。其次,DeepNVMe的I/O性能几乎与可用的NVMe带宽成线性扩展,达到了10GB/秒的读取速度和5GB/秒的写入速度。 + + + +
    +图1: 使用DeepNVMe扩展NVMe与CPU缓冲区之间的数据传输 +
    + +## 通过NVMe扩展GPU缓冲区,从而提高I/O性能 + +我们的第二组微基准评估使用gdsio和ds\_io,测量1GB数据在NVMe和GPU内存之间的传输性能。在此实验中,我们配置ds\_io同时使用传统的缓冲区方法和更高效的GDS方法。结果总结在图2中,我们可以得出三个结论。首先,我们看到GDS提高了DeepNVMe的性能,相比传统缓冲区方法,速度提高了最多37%。其次,DeepNVMe表现出高性能,尽管它更能代表深度学习应用,但其性能与gdsio相匹配(有时甚至超过)。第三,我们看到DeepNVMe,无论是否使用GDS,都能根据可用的NVMe带宽扩展I/O性能。使用GDS时,DeepNVMe的读取速度最高达到9.6GB/秒,写入速度为5GB/秒;不使用GDS时,读取速度为7GB/秒,写入速度为4GB/秒。 + + + +
    +图2: 使用DeepNVMe扩展NVMe与GPU内存之间的数据传输 +
    + +## ZeRO-Inference: 生成式AI性能 + +ZeRO-Inference是一项AI普及技术,通过使用DeepNVMe将模型权重卸载(Offload)到CPU或NVMe内存,降低了推理大规模模型的硬件成本。ZeRO-Inference非常适合于面向吞吐量的应用,如离线推理,和硬件预算有限的场景。我们使用token生成工作负载来评估DeepNVMe在NVMe卸载下的性能。 + +## 通过NVMe扩展的高性能卸载(Offload) + +我们测量了在单个NVIDIA A100-80GB上推理LLAMA3-70B模型的生成吞吐量,使用512的提示长度、32的生成长度和96的批量大小。我们将NVMe SSD的数量从1扩展到4,并呈现了ZeRO-Inference在有GDS和没有GDS的情况下的结果,如图3所示。我们从这些结果中得出两个结论。首先,GDS始终提供比传统缓冲区方法更好的性能,token生成速度提高了10-18%。其次,DeepNVMe,无论是否使用GDS,都能根据可用的NVMe带宽扩展生成性能。在四个NVMe SSD的情况下,DeepNVMe的生成吞吐量分别为每秒7个token(使用GDS)和每秒6个token(不使用GDS)。我们的分析结果表明,DeepNVMe将在更多的NVMe带宽下继续扩展,是提升生成应用性能的经济选择。 + + + +
    +图3: 使用DeepNVMe通过NVMe卸载(offload)扩展LLAMA3-70B的token生成性能 +
    + +# 总结 + +在本文中,我们介绍了DeepNVMe,一项为了解决I/O操作成为深度学习可扩展性关键瓶颈而创建的I/O优化技术。DeepNVMe通过基于流行存储技术(如NVMe SSD和NVIDIA GDS)的优化,实现了持久存储与深度学习应用内存之间的快速高效数据传输。我们展示了在Azure NC96ads\_A100\_v4虚拟机上,DeepNVMe通过NVMe卸载支持LLAMA3-70B的token生成,最高达到每秒7个token的生成吞吐量。DeepNVMe将在DeepSpeed版本>= 0.15.0中开源,并广泛发布。在未来的博客中,我们将报告DeepNVMe在其他I/O受限的深度学习应用中的改进,如模型检查点和数据加载。 + +# 致谢 + +这项工作是微软和NVIDIA之间深入合作的结果。贡献者包括微软的Joe Mayer、Martin Cai和Olatunji Ruwase;NVIDIA的Kiran Modukuri、Vahid Noormofidi、Sourab Gupta和Sandeep Joshi。 From e637677766e0a2063adc61ddd67b58abef74753e Mon Sep 17 00:00:00 2001 From: Hongwei Chen <33092912+hwchen2017@users.noreply.github.com> Date: Thu, 13 Feb 2025 17:10:30 -0800 Subject: [PATCH 721/754] Add chinese blog for deepspeed windows, and fix format (#7035) Fix #7029 - Add Chinese blog for deepspeed windows - Fix format in README.md Co-authored-by: Logan Adams <114770087+loadams@users.noreply.github.com> --- README.md | 2 +- blogs/windows/08-2024/README.md | 8 +- blogs/windows/08-2024/chinese/README.md | 103 ++++++++++++++++++++++++ 3 files changed, 108 insertions(+), 5 deletions(-) create mode 100644 blogs/windows/08-2024/chinese/README.md diff --git a/README.md b/README.md index 9f071c3f0a65..db77d419cce7 100755 --- a/README.md +++ b/README.md @@ -18,7 +18,7 @@ * [2024/12] [Ulysses-Offload: Democratizing Long Context LLM Training ](https://github.com/deepspeedai/DeepSpeed/blob/master/blogs/ulysses-offload/README.md) * [2024/12] [DeepSpeed-Domino: Communication-Free LLM Training Engine](https://github.com/deepspeedai/DeepSpeed/blob/master/blogs/deepspeed-domino/README.md) -* [2024/08] [DeepSpeed on Windows](https://github.com/deepspeedai/DeepSpeed/tree/master/blogs/windows/08-2024/README.md) [[日本語](https://github.com/deepspeedai/DeepSpeed/tree/master/blogs/windows/08-2024/japanese/README.md)] +* [2024/08] [DeepSpeed on Windows](https://github.com/deepspeedai/DeepSpeed/tree/master/blogs/windows/08-2024/README.md) [[日本語](https://github.com/deepspeedai/DeepSpeed/tree/master/blogs/windows/08-2024/japanese/README.md)] [[中文](https://github.com/deepspeedai/DeepSpeed/tree/master/blogs/windows/08-2024/chinese/README.md)] * [2024/08] [DeepNVMe: Improving DL Applications through I/O Optimizations](https://github.com/deepspeedai/DeepSpeed/tree/master/blogs/deepspeed-gds/README.md) [[日本語](https://github.com/deepspeedai/DeepSpeed/tree/master/blogs/deepspeed-gds/japanese/README.md)] * [2024/07] [DeepSpeed Universal Checkpointing: Efficient and Flexible Checkpointing for Large Scale Distributed Training](https://github.com/deepspeedai/DeepSpeed/tree/master/blogs/deepspeed-ucp/README.md) [[中文](https://github.com/deepspeedai/DeepSpeed/tree/master/blogs/deepspeed-ucp/chinese/README.md)] [[日本語](https://github.com/deepspeedai/DeepSpeed/tree/master/blogs/deepspeed-ucp/japanese/README.md)] * [2024/03] [DeepSpeed-FP6:The power of FP6-Centric Serving for Large Language Models](https://github.com/deepspeedai/DeepSpeed/tree/master/blogs/deepspeed-fp6/03-05-2024) [[English](https://github.com/deepspeedai/DeepSpeed/tree/master/blogs/deepspeed-fp6/03-05-2024/README.md)] [[中文](https://github.com/deepspeedai/DeepSpeed/tree/master/blogs/deepspeed-fp6/03-05-2024/README-Chinese.md)] diff --git a/blogs/windows/08-2024/README.md b/blogs/windows/08-2024/README.md index 335ef473504c..5148fa80d122 100644 --- a/blogs/windows/08-2024/README.md +++ b/blogs/windows/08-2024/README.md @@ -69,8 +69,8 @@ The scripts and codes for the BERT pretraining example are available in the foll
    # Fine Tuning Example -We demonstrate fine tuning capability by using the supervised fine tuning (SFT) step of DeepSpeed-Chat application. We conduct SFT of the HuggingFace facebook/opt-125m model while enabling LoRA and CPU offloading memory optimizations. The command line for running this example is as follows: -deepspeed training\step1_supervised_finetuning\main.py --model_name_or_path facebook/opt-125m --gradient_accumulation_steps 8 --lora_dim 128 --only_optimize_lora --print_loss --zero_stage 2 --deepspeed --dtype bf16 --offload --output_dir output +We demonstrate fine tuning capability by using the supervised fine tuning (SFT) step of DeepSpeed-Chat application. We conduct SFT of the HuggingFace facebook/opt-125m model while enabling LoRA and CPU offloading memory optimizations. The command line for running this example is as follows:\ +`deepspeed training\step1_supervised_finetuning\main.py --model_name_or_path facebook/opt-125m --gradient_accumulation_steps 8 --lora_dim 128 --only_optimize_lora --print_loss --zero_stage 2 --deepspeed --dtype bf16 --offload --output_dir output`.\ The output should look like this:
    @@ -82,8 +82,8 @@ The output should look like this:
    # Inference Example -We demonstrate inference capability by using ZeRO-Inference for token generation. ZeRO-Inference reduces hardware cost of inferencing by offloading to CPU or NVMe memories. We use the example scripts here to run token generation using Llama-2-7B model from HuggingFace. We offload the model weights to CPU memory since the 4GB VRAM is insufficient to host both the model and the generation working set. We use the following command line to generate 32 tokens from a prompt of 8 tokens: -deepspeed run_model.py --model meta-llama/Llama-2-7b-hf --batch-size 64 --prompt-len 8 --gen-len 32 --cpu-offload +We demonstrate inference capability by using ZeRO-Inference for token generation. ZeRO-Inference reduces hardware cost of inferencing by offloading to CPU or NVMe memories. We use the example scripts here to run token generation using Llama-2-7B model from HuggingFace. We offload the model weights to CPU memory since the 4GB VRAM is insufficient to host both the model and the generation working set. We use the following command line to generate 32 tokens from a prompt of 8 tokens:\ +`deepspeed run_model.py --model meta-llama/Llama-2-7b-hf --batch-size 64 --prompt-len 8 --gen-len 32 --cpu-offload`.\ The output will look something like this:
    diff --git a/blogs/windows/08-2024/chinese/README.md b/blogs/windows/08-2024/chinese/README.md new file mode 100644 index 000000000000..5d62705df3ae --- /dev/null +++ b/blogs/windows/08-2024/chinese/README.md @@ -0,0 +1,103 @@ +
    + +# 在Windows系统上使用DeepSpeed + +
    + +# 简介 + +DeepSpeed是一个广受欢迎的开源深度学习优化库,它使得分布式训练和推理变得简单、高效且有效。凭借其众多复杂的优化技术(如ZeRO、3D并行、MoE等),DeepSpeed已被成功应用于包括Phi-3、Megatron-Turing-530B、BLOOM-176B和Arctic在内的多种前沿模型的训练。然而,由于缺乏对主流操作系统微软 Windows的原生支持,许多AI开发者与用户无法充分利用DeepSpeed的创新。为此,我们致力于让DeepSpeed在Windows上实现原生全功能运行,并保持与Linux相同的易用性。 + +在这篇博客中,我们很高兴地宣布我们开发工作中的一些早期成果:DeepSpeed 现在可以在 Windows 上安装并原生支持单 GPU 的训练、微调和推理。重要的是,安装和使用体验与 Linux 上完全相同。此外,微调和推理工作展示了 DeepSpeed 的三个关键特性:HuggingFace Transformers 的集成、LoRA 的支持和 CPU offload。DeepSpeed 在 Windows 上的支持从 DeepSpeed 0.14.5 开始。接下来,我们将通过一些例子展示这些成就。 + +# 测试环境 + +我们在一台运行 Windows 11 23H2 版本号 22631.3880 的 Surface Laptop Studio 2 上进行了测试。该笔记本配备了一块 4GB 显存的 NVIDIA RTX A2000 GPU。我们使用了 Pytorch 2.3.0 和 HuggingFace Transformers 4.41.2。测试所用的脚本来自 [DeepSpeedExamples](https://github.com/deepspeedai/DeepSpeedExamples) 代码仓库,因此在运行以下任何示例前,你需要克隆该仓库。 + +# 安装指南 +DeepSpeed可以通过两种方式在Windows系统上安装。较为简单的方式是使用pip包管理器安装,另一种方法是从源代码安装。两种安装方式的前提条件都是系统已经安装了Python 3.x 和支持CUDA的Pytorch. + +## 通过pip安装 +要安装 DeepSpeed,只需运行:`pip install deepspeed`。它将安装最新版本的 DeepSpeed(目前为 0.14.5)。与 Linux 版本不同的是,Windows 版本已经预先编译了内部的自定义算子,因此不需要安装 CUDA 或 C++ 编译器。 + +
    + +
    + +
    + 通过pip在Windows上安装Deepspeed. +
    + + +## 通过源代码安装 +克隆DeepSpeed代码仓库后,运行build_win.bat脚本进行编译安装。 + + +## 验证安装 +无论选择哪种安装方式,你都可以通过运行 ds_report 来检查安装是否成功。输出应该如下所示: + + +
    + +
    + +
    + ds_report的输出结果,用于验证安装是否成功. +
    + +# 预训练(Pretraining) +我们使用图像分类模型 CIFAR10 和语言模型 BERT 来演示在 Windows 上使用 DeepSpeed 进行预训练。 + +## CIFAR10模型预训练 +用于 CIFAR10 预训练的脚本和代码可以在以下路径找到:`DeepSpeedExamples\training\cifar`。你可以运行以下命令启动 CIFAR10 预训练实验:`deepspeed cifar10_deepspeed.py --deepspeed`。最终输出应类似于: +
    + +
    + +
    + 在 Windows 上使用 Deepspeed 进行 CIFAR10 模型预训练 +
    + +## BERT模型预训练 +用于 BERT 预训练的脚本和代码可以在以下路径找到:`DeepSpeedExamples\training\HelloDeepSpeed`。你可以使用以下命令启动 BERT 预训练实验:`deepspeed train_bert_ds.py --checkpoint_dir experiment_deepspeed`。最终输出应如下所示: + +
    + +
    + +
    + 在 Windows 上使用 Deepspeed 进行 BERT 模型预训练 +
    + +# 微调(Fine Tuning) +我们使用 DeepSpeed-Chat 应用的监督微调(SFT)步骤来演示微调能力。我们对 HuggingFace 的 facebook/opt-125m 模型进行监督微调,同时启用 LoRA 和 CPU offload进行内存优化。运行命令行如下:\ +`deepspeed training\step1_supervised_finetuning\main.py --model_name_or_path facebook/opt-125m --gradient_accumulation_steps 8 --lora_dim 128 --only_optimize_lora --print_loss --zero_stage 2 --deepspeed --dtype bf16 --offload --output_dir output`\ +输出应如下所示: + +
    + +
    + +
    + 在 Windows 上使用 DeepSpeed 对 facebook/opt-125m 监督微调 +
    + +# 推理 +我们使用 ZeRO-Inference 的token生成来演示推理能力。ZeRO-Inference 通过转移存储到 CPU 内存或 NVMe 硬盘内存来减少推理的硬件成本。我们使用以下脚本运行 HuggingFace 的 Llama-2-7B 模型来进行 token 生成。由于 4GB 显存无法容纳模型和生成所需的内存,我们将模型权重转移到 CPU 内存。我们使用以下命令行从 8个token的提示词中生成 32 个token:\ +`deepspeed run_model.py --model meta-llama/Llama-2-7b-hf --batch-size 64 --prompt-len 8 --gen-len 32 --cpu-offload`\ +输出应类似于: + +
    + +
    + +
    + 在 Windows 上使用 ZeRO-Inference 进行 LLAMA2-7B 模型的token生成 +
    + +# 总结 + +使得DeepSpeed,一个流行的深度学习框架,能够原生运行在最流行的操作系统 Windows 上,是让每个人和组织从当前的人工智能革命中受益的重要一步。在这篇博客中,我们分享了我们为实现这一目标所取得的早期成果。尽管 DeepSpeed 对 Windows 的支持仍在继续开发中,我们希望上述结果已经能够对我们的用户有实用价值,并且鼓舞他们。我们接下来的工作计划涵盖多GPU支持、权重量化以及性能优化。 + +# 致谢 +这给项目的完成得益于现任和前任 DeepSpeed 成员的大力合作,包括 Costin Eseanu、Logan Adams、Elton Zheng、Reza Yazdani Aminabadi、Martin Cai 和 Olatunji Ruwase。我们还要感谢那些及时提出此项需求、提供关键的临时解决方法、部分解决方案和建设性反馈的 DeepSpeed 用户,最重要的是,他们始终与我们同行. From 14b3cce4aaedac69120d386953e2b4cae8c2cf2c Mon Sep 17 00:00:00 2001 From: Joe Mayer <114769929+jomayeri@users.noreply.github.com> Date: Fri, 14 Feb 2025 09:17:08 -0800 Subject: [PATCH 722/754] AIO on ROCM (#7023) Adding compile support for AIO library on AMD GPUs. --------- Co-authored-by: Olatunji Ruwase Co-authored-by: Logan Adams <114770087+loadams@users.noreply.github.com> --- op_builder/async_io.py | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/op_builder/async_io.py b/op_builder/async_io.py index 0f9e34106487..f29f88531a98 100644 --- a/op_builder/async_io.py +++ b/op_builder/async_io.py @@ -65,8 +65,11 @@ def extra_ldflags(self): import torch.utils.cpp_extension CUDA_HOME = torch.utils.cpp_extension.CUDA_HOME - CUDA_LIB64 = os.path.join(CUDA_HOME, "lib64") - ldflags = [f'-L{CUDA_HOME}', f'-L{CUDA_LIB64}', '-laio', '-lcuda', '-lcudart'] + if CUDA_HOME is None: + ldflags = ['-laio'] # the ROCM case + else: + CUDA_LIB64 = os.path.join(CUDA_HOME, "lib64") + ldflags = [f'-L{CUDA_HOME}', f'-L{CUDA_LIB64}', '-laio', '-lcuda', '-lcudart'] return ldflags def check_for_libaio_pkg(self): From ee3f19bf6679884f51edb8a89e3b75ff2193cd56 Mon Sep 17 00:00:00 2001 From: Olatunji Ruwase Date: Tue, 18 Feb 2025 14:16:17 -0500 Subject: [PATCH 723/754] Control trace cache warnings (#7039) Make trace cache warnings configurable, and disabled by default. Fix #6985, #4081, #5033, #5006, #5662 --------- Signed-off-by: Olatunji Ruwase --- deepspeed/runtime/engine.py | 5 +++ deepspeed/runtime/zero/config.py | 6 ++++ deepspeed/runtime/zero/parameter_offload.py | 6 +++- .../zero/partitioned_param_coordinator.py | 32 +++++++++++-------- deepspeed/runtime/zero/stage3.py | 9 ++++-- docs/_pages/config-json.md | 17 +++++++--- 6 files changed, 54 insertions(+), 21 deletions(-) diff --git a/deepspeed/runtime/engine.py b/deepspeed/runtime/engine.py index 986b68dc1bb1..8575df9d1d5d 100755 --- a/deepspeed/runtime/engine.py +++ b/deepspeed/runtime/engine.py @@ -983,6 +983,9 @@ def zero_quantized_gradients(self): def zeropp_loco_param(self): return self._config.zero_config.zeropp_loco_param + def zero_log_trace_cache_warnings(self): + return self._config.zero_config.log_trace_cache_warnings + def dump_state(self): return self._config.dump_state @@ -1692,6 +1695,7 @@ def _configure_zero_optimizer(self, optimizer): zero_quantized_weights=self.zero_quantized_weights(), zero_quantized_nontrainable_weights=self.zero_quantized_nontrainable_weights(), zero_module_granularity_threshold=self.zero_module_granularity_threshold(), + log_trace_cache_warnings=self.zero_log_trace_cache_warnings(), ) else: log_dist( @@ -1740,6 +1744,7 @@ def _configure_zero_optimizer(self, optimizer): zero_quantized_nontrainable_weights=self.zero_quantized_nontrainable_weights(), zero_module_granularity_threshold=self.zero_module_granularity_threshold(), zeropp_loco_param=self.zeropp_loco_param(), + log_trace_cache_warnings=self.zero_log_trace_cache_warnings(), ) else: diff --git a/deepspeed/runtime/zero/config.py b/deepspeed/runtime/zero/config.py index cbc6a15c2057..19ee9b51702e 100644 --- a/deepspeed/runtime/zero/config.py +++ b/deepspeed/runtime/zero/config.py @@ -45,6 +45,7 @@ "memory_efficient_linear": [true|false], "override_module_apply": [true|false], "zeropp_loco_param": {...}, + "log_trace_cache_warnings" : [true|false], } } """ @@ -340,6 +341,11 @@ class DeepSpeedZeroConfig(DeepSpeedConfigModel): Override nn.Module apply function, for Stage 3. """ + log_trace_cache_warnings: bool = False + """ + Whether to log warnings from trace cache, such as invalidation events. + """ + # Validators @model_validator(mode="after") def overlap_comm_valid(self): diff --git a/deepspeed/runtime/zero/parameter_offload.py b/deepspeed/runtime/zero/parameter_offload.py index b5a75fce32fe..09de21502c27 100644 --- a/deepspeed/runtime/zero/parameter_offload.py +++ b/deepspeed/runtime/zero/parameter_offload.py @@ -103,6 +103,7 @@ def __init__( zero_quantized_weights=False, zero_quantized_nontrainable_weights=False, zero_module_granularity_threshold=0, + log_trace_cache_warnings=False, ): see_memory_usage("DeepSpeedZeRoOffload initialize [begin]", force=True) @@ -118,6 +119,7 @@ def __init__( self.zero_param_parallel_group = zero_param_parallel_group self.zero_quantized_weights = zero_quantized_weights self.zero_quantized_nontrainable_weights = zero_quantized_nontrainable_weights + self.log_trace_cache_warnings = log_trace_cache_warnings if offload_param_config is not None and offload_param_config.device != OffloadDeviceEnum.none: self.offload_device = offload_param_config.device @@ -165,7 +167,9 @@ def __init__( timers=self.timers, zero_quantized_weights=self.zero_quantized_weights, zero_quantized_nontrainable_weights=self.zero_quantized_nontrainable_weights, - fast_sharding_for_leaf_module=self.fast_sharding_for_leaf_module) + fast_sharding_for_leaf_module=self.fast_sharding_for_leaf_module, + log_trace_cache_warnings=self.log_trace_cache_warnings, + ) self.forward_hooks = [] self.backward_hooks = [] diff --git a/deepspeed/runtime/zero/partitioned_param_coordinator.py b/deepspeed/runtime/zero/partitioned_param_coordinator.py index 415afd8d7026..d5b5db859e31 100644 --- a/deepspeed/runtime/zero/partitioned_param_coordinator.py +++ b/deepspeed/runtime/zero/partitioned_param_coordinator.py @@ -76,17 +76,20 @@ class __ParamInTrace: param: Parameter step_id_last_used_at: int - def __init__(self, - prefetch_bucket_sz: int, - max_reuse_distance_in_numel: int, - max_available_parameters_in_numel: int, - allgather_stream: get_accelerator().Stream, - inflight_param_registry: InflightParamRegistry, - prefetch_nvme: bool = False, - timers=None, - zero_quantized_weights=False, - zero_quantized_nontrainable_weights=False, - fast_sharding_for_leaf_module=False) -> None: + def __init__( + self, + prefetch_bucket_sz: int, + max_reuse_distance_in_numel: int, + max_available_parameters_in_numel: int, + allgather_stream: get_accelerator().Stream, + inflight_param_registry: InflightParamRegistry, + prefetch_nvme: bool = False, + timers=None, + zero_quantized_weights=False, + zero_quantized_nontrainable_weights=False, + fast_sharding_for_leaf_module=False, + log_trace_cache_warnings=False, + ) -> None: # mapping of param -> handle for each param that is currently in flight self.__inflight_param_registry = inflight_param_registry # keeps track of the number of submodules invoked so far. @@ -129,6 +132,9 @@ def __init__(self, self.__max_ongoing_fetch_events: int = 2 self.__profiler = PartitionedParameterProfiler(timers if ENABLE_PROFILER else None) + # Whether to log trace cache warnings, e.g. invalidation events + self.__log_trace_cache_warnings = log_trace_cache_warnings + # whether to enable fast fetch for the z3 leaf module. # this will improve fetch speed but will not break down leaf module parameters to alleviate memory pressure. self.fast_sharding_for_leaf_module = fast_sharding_for_leaf_module @@ -177,7 +183,7 @@ def trace_prologue(self, sub_module: Module) -> None: print_rank_0( f"Invalidate trace cache @ step {self.__step_id} and module {sub_module.ds_id}: " f"cache has only {len(self.__submodule_order)} modules", - force=True) + force=self.__log_trace_cache_warnings) self._invalidate_trace() return @@ -186,7 +192,7 @@ def trace_prologue(self, sub_module: Module) -> None: print_rank_0( f"Invalidate trace cache @ step {self.__step_id}: " f"expected module {expected_module_id}, but got module {sub_module.ds_id}", - force=True) + force=self.__log_trace_cache_warnings) self._invalidate_trace() @compiler.disable diff --git a/deepspeed/runtime/zero/stage3.py b/deepspeed/runtime/zero/stage3.py index 3627d4675a71..9cc58fdbac01 100644 --- a/deepspeed/runtime/zero/stage3.py +++ b/deepspeed/runtime/zero/stage3.py @@ -160,6 +160,7 @@ def __init__( zero_quantized_nontrainable_weights=False, zero_module_granularity_threshold=0, zeropp_loco_param=None, + log_trace_cache_warnings=False, ): see_memory_usage("Stage 3 initialize beginning", force=True) @@ -231,7 +232,9 @@ def __init__( zero_param_parallel_group=zero_param_parallel_group, zero_quantized_weights=zero_quantized_weights, zero_quantized_nontrainable_weights=zero_quantized_nontrainable_weights, - zero_module_granularity_threshold=zero_module_granularity_threshold) + zero_module_granularity_threshold=zero_module_granularity_threshold, + log_trace_cache_warnings=log_trace_cache_warnings, + ) self.persistent_parameters = self.parameter_offload.persistent_parameters self._configure_offloading(offload_optimizer_config, offload_param_config) @@ -465,6 +468,7 @@ def initialize_ds_offload( zero_quantized_weights, zero_quantized_nontrainable_weights, zero_module_granularity_threshold, + log_trace_cache_warnings, ): return DeepSpeedZeRoOffload(module=module, timers=timers, @@ -481,7 +485,8 @@ def initialize_ds_offload( zero_param_parallel_group=zero_param_parallel_group, zero_quantized_weights=zero_quantized_weights, zero_quantized_nontrainable_weights=zero_quantized_nontrainable_weights, - zero_module_granularity_threshold=zero_module_granularity_threshold) + zero_module_granularity_threshold=zero_module_granularity_threshold, + log_trace_cache_warnings=log_trace_cache_warnings) def _get_trainable_parameter_groups(self): param_groups = [] diff --git a/docs/_pages/config-json.md b/docs/_pages/config-json.md index 51e3bbd6eaaa..43de95b5210b 100755 --- a/docs/_pages/config-json.md +++ b/docs/_pages/config-json.md @@ -371,11 +371,12 @@ Enabling and configuring ZeRO memory optimizations "sub_group_size" : 1e12, "elastic_checkpoint" : [true|false], "stage3_gather_16bit_weights_on_model_save": [true|false], - "ignore_unused_parameters": [true|false] - "round_robin_gradients": [true|false] - "zero_hpz_partition_size": 1 - "zero_quantized_weights": [true|false] - "zero_quantized_gradients": [true|false] + "ignore_unused_parameters": [true|false], + "round_robin_gradients": [true|false], + "zero_hpz_partition_size": 1, + "zero_quantized_weights": [true|false], + "zero_quantized_gradients": [true|false], + "log_trace_cache_warnings": [true|false], } ``` @@ -512,6 +513,12 @@ Enabling and configuring ZeRO memory optimizations | ----------------------------------------------------------------------------------------------------------------------------------- | ------- | |Boolean indicating whether to enable communication efficient quantized gradients of ZeRO++. | `False` | +**log_trace_cache_warnings**: [boolean] + +| Description | Default | +| ------------------------------------------------------------------------------------------------------------------- | ------- | +| Log warnings from trace cache optimization of parameter sharding, such as cache invalidation events. | `False` | + ***cpu_offload***: [boolean] **Deprecated:** **cpu_offload** is deprecated and will be removed in future, please use `offload_optimizer` instead. From 2735cf41dc42141b6565af681275b303729d94f7 Mon Sep 17 00:00:00 2001 From: Hongwei Chen <33092912+hwchen2017@users.noreply.github.com> Date: Tue, 18 Feb 2025 12:13:58 -0800 Subject: [PATCH 724/754] Update CUDA compute capability to support Blackwell (#7047) Update CUDA compute capability for cross compile according to wiki page. https://en.wikipedia.org/wiki/CUDA#GPUs_supported --------- Signed-off-by: Hongwei --- op_builder/builder.py | 17 ++++++++++++----- 1 file changed, 12 insertions(+), 5 deletions(-) diff --git a/op_builder/builder.py b/op_builder/builder.py index ac850775cb11..41c0a154186f 100644 --- a/op_builder/builder.py +++ b/op_builder/builder.py @@ -61,13 +61,20 @@ def installed_cuda_version(name=""): def get_default_compute_capabilities(): compute_caps = DEFAULT_COMPUTE_CAPABILITIES + # Update compute capability according to: https://en.wikipedia.org/wiki/CUDA#GPUs_supported import torch.utils.cpp_extension - if torch.utils.cpp_extension.CUDA_HOME is not None and installed_cuda_version()[0] >= 11: - if installed_cuda_version()[0] == 11 and installed_cuda_version()[1] == 0: - # Special treatment of CUDA 11.0 because compute_86 is not supported. - compute_caps += ";8.0" - else: + if torch.utils.cpp_extension.CUDA_HOME is not None: + if installed_cuda_version()[0] == 11: + if installed_cuda_version()[1] >= 0: + compute_caps += ";8.0" + if installed_cuda_version()[1] >= 1: + compute_caps += ";8.6" + if installed_cuda_version()[1] >= 8: + compute_caps += ";9.0" + elif installed_cuda_version()[0] == 12: compute_caps += ";8.0;8.6;9.0" + if installed_cuda_version()[1] >= 8: + compute_caps += ";10.0;12.0" return compute_caps From 7288e6198eaee4b32d0056f5a2fcb5a38e607475 Mon Sep 17 00:00:00 2001 From: Logan Adams <114770087+loadams@users.noreply.github.com> Date: Tue, 18 Feb 2025 16:51:34 -0800 Subject: [PATCH 725/754] Update setup.py handling of ROCm cupy (#7051) --- setup.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/setup.py b/setup.py index 20afc651a142..6dc9afb8fbc2 100755 --- a/setup.py +++ b/setup.py @@ -102,8 +102,8 @@ def get_env_if_set(key, default: typing.Any = ""): cupy = None if is_rocm_pytorch: rocm_major, rocm_minor = rocm_version - # XXX cupy support for rocm 5 is not available yet. - if rocm_major <= 4: + # cupy support for rocm>5.0 is not available yet. + if (rocm_major == 5 and rocm_minor == 0) or rocm_major <= 4: cupy = f"cupy-rocm-{rocm_major}-{rocm_minor}" else: cuda_major_ver, cuda_minor_ver = installed_cuda_version() From 33dd2e2165adab1b098e29e40267468c2804acd8 Mon Sep 17 00:00:00 2001 From: Logan Adams <114770087+loadams@users.noreply.github.com> Date: Wed, 19 Feb 2025 07:48:41 -0800 Subject: [PATCH 726/754] nv-ds-chat breaks with latest transformers (#7052) Signed-off-by: Logan Adams --- .github/workflows/nv-ds-chat.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/nv-ds-chat.yml b/.github/workflows/nv-ds-chat.yml index 10fcb9911899..faef9f180c77 100644 --- a/.github/workflows/nv-ds-chat.yml +++ b/.github/workflows/nv-ds-chat.yml @@ -43,7 +43,7 @@ jobs: - name: Install deepspeed run: | - pip install transformers + pip install transformers==4.48.3 pip install .[dev] ds_report From c9da4892a5ea8025e14e97e8414a372e132037af Mon Sep 17 00:00:00 2001 From: Olatunji Ruwase Date: Wed, 19 Feb 2025 16:38:54 -0500 Subject: [PATCH 727/754] Rename aio_thread_count to intra_op_parallelism (#7056) Propagate API change. Signed-off-by: Olatunji Ruwase --- deepspeed/runtime/swap_tensor/aio_config.py | 20 ++++++++++++------- deepspeed/runtime/swap_tensor/constants.py | 6 +++--- .../runtime/swap_tensor/optimizer_utils.py | 2 +- .../partitioned_optimizer_swapper.py | 8 +++++--- .../swap_tensor/partitioned_param_swapper.py | 20 +++++++++++-------- .../pipelined_optimizer_swapper.py | 18 ++++++++++------- 6 files changed, 45 insertions(+), 29 deletions(-) diff --git a/deepspeed/runtime/swap_tensor/aio_config.py b/deepspeed/runtime/swap_tensor/aio_config.py index 46c3f2a0c954..be6c7d93c86a 100644 --- a/deepspeed/runtime/swap_tensor/aio_config.py +++ b/deepspeed/runtime/swap_tensor/aio_config.py @@ -10,7 +10,7 @@ AIO_DEFAULT_DICT = { AIO_BLOCK_SIZE: AIO_BLOCK_SIZE_DEFAULT, AIO_QUEUE_DEPTH: AIO_QUEUE_DEPTH_DEFAULT, - AIO_THREAD_COUNT: AIO_THREAD_COUNT_DEFAULT, + AIO_INTRA_OP_PARALLELISM: AIO_INTRA_OP_PARALLELISM_DEFAULT, AIO_SINGLE_SUBMIT: AIO_SINGLE_SUBMIT_DEFAULT, AIO_OVERLAP_EVENTS: AIO_OVERLAP_EVENTS_DEFAULT, AIO_USE_GDS: AIO_USE_GDS_DEFAULT @@ -21,12 +21,18 @@ def get_aio_config(param_dict): if AIO in param_dict.keys() and param_dict[AIO] is not None: aio_dict = param_dict[AIO] aio_config = { - AIO_BLOCK_SIZE: get_scalar_param(aio_dict, AIO_BLOCK_SIZE, AIO_BLOCK_SIZE_DEFAULT), - AIO_QUEUE_DEPTH: get_scalar_param(aio_dict, AIO_QUEUE_DEPTH, AIO_QUEUE_DEPTH_DEFAULT), - AIO_THREAD_COUNT: get_scalar_param(aio_dict, AIO_THREAD_COUNT, AIO_THREAD_COUNT_DEFAULT), - AIO_SINGLE_SUBMIT: get_scalar_param(aio_dict, AIO_SINGLE_SUBMIT, AIO_SINGLE_SUBMIT_DEFAULT), - AIO_OVERLAP_EVENTS: get_scalar_param(aio_dict, AIO_OVERLAP_EVENTS, AIO_OVERLAP_EVENTS_DEFAULT), - AIO_USE_GDS: get_scalar_param(aio_dict, AIO_USE_GDS, AIO_USE_GDS_DEFAULT) + AIO_BLOCK_SIZE: + get_scalar_param(aio_dict, AIO_BLOCK_SIZE, AIO_BLOCK_SIZE_DEFAULT), + AIO_QUEUE_DEPTH: + get_scalar_param(aio_dict, AIO_QUEUE_DEPTH, AIO_QUEUE_DEPTH_DEFAULT), + AIO_INTRA_OP_PARALLELISM: + get_scalar_param(aio_dict, AIO_INTRA_OP_PARALLELISM, AIO_INTRA_OP_PARALLELISM_DEFAULT), + AIO_SINGLE_SUBMIT: + get_scalar_param(aio_dict, AIO_SINGLE_SUBMIT, AIO_SINGLE_SUBMIT_DEFAULT), + AIO_OVERLAP_EVENTS: + get_scalar_param(aio_dict, AIO_OVERLAP_EVENTS, AIO_OVERLAP_EVENTS_DEFAULT), + AIO_USE_GDS: + get_scalar_param(aio_dict, AIO_USE_GDS, AIO_USE_GDS_DEFAULT) } if aio_config[AIO_USE_GDS]: diff --git a/deepspeed/runtime/swap_tensor/constants.py b/deepspeed/runtime/swap_tensor/constants.py index cee20ac7b78c..c1207749eac6 100644 --- a/deepspeed/runtime/swap_tensor/constants.py +++ b/deepspeed/runtime/swap_tensor/constants.py @@ -9,7 +9,7 @@ "aio": { "block_size": 1048576, "queue_depth": 8, - "thread_count": 1, + "intra_op_parallelism": 1, "single_submit": false, "overlap_events": true, "use_gds": false @@ -20,8 +20,8 @@ AIO_BLOCK_SIZE_DEFAULT = 1048576 AIO_QUEUE_DEPTH = "queue_depth" AIO_QUEUE_DEPTH_DEFAULT = 8 -AIO_THREAD_COUNT = "thread_count" -AIO_THREAD_COUNT_DEFAULT = 1 +AIO_INTRA_OP_PARALLELISM = "intra_op_parallelism" +AIO_INTRA_OP_PARALLELISM_DEFAULT = 1 AIO_SINGLE_SUBMIT = "single_submit" AIO_SINGLE_SUBMIT_DEFAULT = False AIO_OVERLAP_EVENTS = "overlap_events" diff --git a/deepspeed/runtime/swap_tensor/optimizer_utils.py b/deepspeed/runtime/swap_tensor/optimizer_utils.py index 5d837e386a95..d7b0ea9634b2 100644 --- a/deepspeed/runtime/swap_tensor/optimizer_utils.py +++ b/deepspeed/runtime/swap_tensor/optimizer_utils.py @@ -130,7 +130,7 @@ def __init__(self, swap_config, aio_config, base_folder, optimizer, largest_nume # Read/Write alignment for each thread during Intra-request parallelism self.min_aio_bytes = max(MIN_AIO_BYTES, aio_config[AIO_BLOCK_SIZE]) - self.aligned_bytes = AIO_ALIGNED_BYTES * aio_config[AIO_THREAD_COUNT] + self.aligned_bytes = AIO_ALIGNED_BYTES * aio_config[AIO_INTRA_OP_PARALLELISM] self.numel_alignment = self.aligned_bytes // self.swap_element_size # Swap buffer management diff --git a/deepspeed/runtime/swap_tensor/partitioned_optimizer_swapper.py b/deepspeed/runtime/swap_tensor/partitioned_optimizer_swapper.py index e53a280befe4..8b6cbe8fbb51 100644 --- a/deepspeed/runtime/swap_tensor/partitioned_optimizer_swapper.py +++ b/deepspeed/runtime/swap_tensor/partitioned_optimizer_swapper.py @@ -33,9 +33,11 @@ def __init__(self, swap_config, aio_config, base_folder, optimizer, largest_nume largest_numel, device, dtype, timers) aio_op = AsyncIOBuilder().load() - self.aio_handle = aio_op.aio_handle(aio_config[AIO_BLOCK_SIZE], aio_config[AIO_QUEUE_DEPTH], - aio_config[AIO_SINGLE_SUBMIT], aio_config[AIO_OVERLAP_EVENTS], - aio_config[AIO_THREAD_COUNT]) + self.aio_handle = aio_op.aio_handle(block_size=aio_config[AIO_BLOCK_SIZE], + queue_depth=aio_config[AIO_QUEUE_DEPTH], + single_submit=aio_config[AIO_SINGLE_SUBMIT], + overlap_events=aio_config[AIO_OVERLAP_EVENTS], + intra_op_parallelism=aio_config[AIO_INTRA_OP_PARALLELISM]) # Overlap swapping out self.gradient_swapper = AsyncTensorSwapper(aio_handle=self.aio_handle, diff --git a/deepspeed/runtime/swap_tensor/partitioned_param_swapper.py b/deepspeed/runtime/swap_tensor/partitioned_param_swapper.py index 26fbf6164d54..f80fe1501c00 100644 --- a/deepspeed/runtime/swap_tensor/partitioned_param_swapper.py +++ b/deepspeed/runtime/swap_tensor/partitioned_param_swapper.py @@ -98,7 +98,7 @@ def _configure_aio(self, ds_config): # Read/Write alignment for each thread during Intra-request parallelism self.min_aio_bytes = max(MIN_AIO_BYTES, self.aio_config[AIO_BLOCK_SIZE]) - self.aligned_bytes = AIO_ALIGNED_BYTES * self.aio_config[AIO_THREAD_COUNT] + self.aligned_bytes = AIO_ALIGNED_BYTES * self.aio_config[AIO_INTRA_OP_PARALLELISM] self.numel_alignment = self.aligned_bytes // self.swap_element_size self.elements_per_buffer = self.swap_config.buffer_size @@ -108,13 +108,17 @@ def _configure_aio(self, ds_config): self.available_buffer_ids = [i for i in range(self.param_buffer_count)] self.reserved_buffer_ids = [] - self.aio_read_handle = self.aio_handle(self.aio_config[AIO_BLOCK_SIZE], self.aio_config[AIO_QUEUE_DEPTH], - self.aio_config[AIO_SINGLE_SUBMIT], self.aio_config[AIO_OVERLAP_EVENTS], - self.aio_config[AIO_THREAD_COUNT]) - - self.aio_write_handle = self.aio_handle(self.aio_config[AIO_BLOCK_SIZE], self.aio_config[AIO_QUEUE_DEPTH], - self.aio_config[AIO_SINGLE_SUBMIT], - self.aio_config[AIO_OVERLAP_EVENTS], self.aio_config[AIO_THREAD_COUNT]) + self.aio_read_handle = self.aio_handle(block_size=self.aio_config[AIO_BLOCK_SIZE], + queue_depth=self.aio_config[AIO_QUEUE_DEPTH], + single_submit=self.aio_config[AIO_SINGLE_SUBMIT], + overlap_events=self.aio_config[AIO_OVERLAP_EVENTS], + intra_op_parallelism=self.aio_config[AIO_INTRA_OP_PARALLELISM]) + + self.aio_write_handle = self.aio_handle(block_size=self.aio_config[AIO_BLOCK_SIZE], + queue_depth=self.aio_config[AIO_QUEUE_DEPTH], + single_submit=self.aio_config[AIO_SINGLE_SUBMIT], + overlap_events=self.aio_config[AIO_OVERLAP_EVENTS], + intra_op_parallelism=self.aio_config[AIO_INTRA_OP_PARALLELISM]) if self.use_gds: self.buffers = torch.empty(int(self.aligned_elements_per_buffer * self.param_buffer_count), diff --git a/deepspeed/runtime/swap_tensor/pipelined_optimizer_swapper.py b/deepspeed/runtime/swap_tensor/pipelined_optimizer_swapper.py index 66a372877d38..8f6d72e35f63 100644 --- a/deepspeed/runtime/swap_tensor/pipelined_optimizer_swapper.py +++ b/deepspeed/runtime/swap_tensor/pipelined_optimizer_swapper.py @@ -56,13 +56,17 @@ def __init__(self, swap_config, aio_config, base_folder, optimizer, largest_nume device, dtype, timers) aio_op = AsyncIOBuilder().load() - self.write_aio_handle = aio_op.aio_handle(aio_config[AIO_BLOCK_SIZE], aio_config[AIO_QUEUE_DEPTH], - aio_config[AIO_SINGLE_SUBMIT], aio_config[AIO_OVERLAP_EVENTS], - aio_config[AIO_THREAD_COUNT]) - - self.read_aio_handle = aio_op.aio_handle(aio_config[AIO_BLOCK_SIZE], aio_config[AIO_QUEUE_DEPTH], - aio_config[AIO_SINGLE_SUBMIT], aio_config[AIO_OVERLAP_EVENTS], - aio_config[AIO_THREAD_COUNT]) + self.write_aio_handle = aio_op.aio_handle(block_size=aio_config[AIO_BLOCK_SIZE], + queue_depth=aio_config[AIO_QUEUE_DEPTH], + single_submit=aio_config[AIO_SINGLE_SUBMIT], + overlap_events=aio_config[AIO_OVERLAP_EVENTS], + intra_op_parallelism=aio_config[AIO_INTRA_OP_PARALLELISM]) + + self.read_aio_handle = aio_op.aio_handle(block_size=aio_config[AIO_BLOCK_SIZE], + queue_depth=aio_config[AIO_QUEUE_DEPTH], + single_submit=aio_config[AIO_SINGLE_SUBMIT], + overlap_events=aio_config[AIO_OVERLAP_EVENTS], + intra_op_parallelism=aio_config[AIO_INTRA_OP_PARALLELISM]) # Overlap gradient swap out self.gradient_swapper = AsyncTensorSwapper(aio_handle=self.write_aio_handle, From d98204b9f303e0938463334a435f871ce03f99e9 Mon Sep 17 00:00:00 2001 From: inkcherry Date: Thu, 20 Feb 2025 06:15:03 +0800 Subject: [PATCH 728/754] add autoTP training zero2 tests (#7049) - add zero2 test - minor fix with transformer version update & ds master merge. Signed-off-by: inkcherry Co-authored-by: Olatunji Ruwase --- deepspeed/module_inject/replace_module.py | 4 ++++ deepspeed/runtime/engine.py | 2 +- deepspeed/runtime/utils.py | 5 +++-- tests/unit/model_parallelism/test_autotp_training.py | 4 ++-- 4 files changed, 10 insertions(+), 5 deletions(-) diff --git a/deepspeed/module_inject/replace_module.py b/deepspeed/module_inject/replace_module.py index 9510f96b89c6..ed94a5021fee 100644 --- a/deepspeed/module_inject/replace_module.py +++ b/deepspeed/module_inject/replace_module.py @@ -335,6 +335,10 @@ def replace_fn(child, _policy, layer_id=0, prefix="", state_dict=None): return new_module def set_lm_head(module): + if is_autotp_training_mode(): + # we need to handle autoTP training mode separately. + return + embedding_weight = None for n, p in module.named_parameters(): if "word_embeddings." in n or "embed_tokens." in n or "wte." in n: diff --git a/deepspeed/runtime/engine.py b/deepspeed/runtime/engine.py index 8575df9d1d5d..4d932f8d5046 100755 --- a/deepspeed/runtime/engine.py +++ b/deepspeed/runtime/engine.py @@ -424,7 +424,7 @@ def _configure_tensor_parallel_states(self, model): # sanity check # currently, the compatibility between 'autotp' and 'zero > 1' has not been validated assert self.zero_optimization_stage( - ) <= 1, "Currently, the compatibility between 'autotp' and 'zero_stage > 1' has not been validated" + ) <= 2, "Currently, the compatibility between 'autotp' and 'zero_stage = 3' has not been validated" self.mpu = groups self.mpu._init_tp_mesh_device(tensor_model_parallel_size=self.autotp_size()) diff --git a/deepspeed/runtime/utils.py b/deepspeed/runtime/utils.py index 91fe7cbdcc96..9fd7a65a53ba 100755 --- a/deepspeed/runtime/utils.py +++ b/deepspeed/runtime/utils.py @@ -1134,9 +1134,10 @@ def compare_tensors_in_structures(inputs1: Union[List, Dict], inputs2: Union[Lis if inputs1.keys() != inputs2.keys(): return False for key in inputs1: - val1 = inputs1[key].to(get_accelerator().current_device()) - val2 = inputs2[key].to(get_accelerator().current_device()) + val1, val2 = inputs1[key], inputs2[key] if isinstance(val1, torch.Tensor) and isinstance(val2, torch.Tensor): + val1 = val1.to(get_accelerator().current_device()) + val2 = val2.to(get_accelerator().current_device()) if not torch.equal(val1, val2): return False elif val1 != val2: diff --git a/tests/unit/model_parallelism/test_autotp_training.py b/tests/unit/model_parallelism/test_autotp_training.py index 73e61b1d3398..7680b28ce6b5 100644 --- a/tests/unit/model_parallelism/test_autotp_training.py +++ b/tests/unit/model_parallelism/test_autotp_training.py @@ -360,7 +360,7 @@ def prepare_tp_model(hidden_dim, nlayers, linear_indices, allreduce_indices, gro return model, base_model -@pytest.mark.parametrize("zero_stage", [0, 1]) +@pytest.mark.parametrize("zero_stage", [0, 1, 2]) @pytest.mark.parametrize("tp_size", [2, 4]) class TestSave(DistributedTest): @@ -492,7 +492,7 @@ def test_ckpt_save(self, tmpdir, tp_size: int, zero_stage: int): compare_lr_scheduler_states(trained_model, loaded_model) -@pytest.mark.parametrize("zero_stage", [0, 1]) +@pytest.mark.parametrize("zero_stage", [0, 1, 2]) @pytest.mark.parametrize("tp_size", [2, 4]) class TestTpGradNorm(DistributedTest): From e2dc3eeb1923073e32739596a4fd051417d4ff92 Mon Sep 17 00:00:00 2001 From: wukong1992 Date: Thu, 20 Feb 2025 21:36:17 +0800 Subject: [PATCH 729/754] Fix, bf16 optimizer remove dup loop (#7054) bf16 with moe refresh optimizer state from bf16 ckpt will raise IndexError: list index out of range Signed-off-by: shaomin Co-authored-by: shaomin Co-authored-by: Hongwei Chen <33092912+hwchen2017@users.noreply.github.com> --- deepspeed/runtime/bf16_optimizer.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/deepspeed/runtime/bf16_optimizer.py b/deepspeed/runtime/bf16_optimizer.py index 6b63efbb23f7..78895e70df03 100644 --- a/deepspeed/runtime/bf16_optimizer.py +++ b/deepspeed/runtime/bf16_optimizer.py @@ -472,10 +472,10 @@ def state_dict(self): # Restore base optimizer fp32 weights bfloat16 weights def _restore_from_bit16_weights(self): - for i, group in enumerate(self.bf16_groups): + for i, (bf16_partitions, + fp32_partition) in enumerate(zip(self.bf16_partitioned_groups, self.fp32_groups_flat_partition)): partition_id = dist.get_rank(group=self.real_dp_process_group[i]) - for bf16_partitions, fp32_partition in zip(self.bf16_partitioned_groups, self.fp32_groups_flat_partition): - fp32_partition.data.copy_(bf16_partitions[partition_id].data) + fp32_partition.data.copy_(bf16_partitions[partition_id].data) def refresh_fp32_params(self): self._restore_from_bit16_weights() From fa8967e209ee909de556fc7d363eeae1c8ee3b04 Mon Sep 17 00:00:00 2001 From: Logan Adams <114770087+loadams@users.noreply.github.com> Date: Thu, 20 Feb 2025 07:27:28 -0800 Subject: [PATCH 730/754] Update version.txt after 0.16.4 release (#7063) **Auto-generated PR to update version.txt after a DeepSpeed release** Released version - 0.16.4 Author - @loadams Co-authored-by: loadams --- version.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/version.txt b/version.txt index 5f2491c5adca..19270385eaf7 100644 --- a/version.txt +++ b/version.txt @@ -1 +1 @@ -0.16.4 +0.16.5 From 461d641f00a04e96f2d3c58af55ff6af4b50fc92 Mon Sep 17 00:00:00 2001 From: Stas Bekman Date: Thu, 20 Feb 2025 07:27:54 -0800 Subject: [PATCH 731/754] fix an outdated doc wrt CUDA_VISIBLE_DEVICES (#7058) @jeffra and I fixed this many years ago, so bringing this doc to a correct state. --------- Signed-off-by: Stas Bekman --- docs/_tutorials/getting-started.md | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/docs/_tutorials/getting-started.md b/docs/_tutorials/getting-started.md index 36dcdf41d9d0..2c6e27d1319d 100644 --- a/docs/_tutorials/getting-started.md +++ b/docs/_tutorials/getting-started.md @@ -316,10 +316,14 @@ local machine to discover the number of slots available. The `--include` and `--exclude` arguments work as normal, but the user should specify 'localhost' as the hostname. -Also note that `CUDA_VISIBLE_DEVICES` can't be used with DeepSpeed to control -which devices should be used. For example, to use only gpu1 of the current -node, do: +Also note that `CUDA_VISIBLE_DEVICES` can be used with `deepspeed` to control +which devices should be used on a single node. So either of these would work +to launch just on devices 0 and 1 of the current node: ```bash -deepspeed --include localhost:1 ... +deepspeed --include localhost:0,1 ... +``` + +```bash +CUDA_VISIBLE_DEVICES=0,1 deepspeed ... ``` From cb20d44978f70a177f7f5a07f8881976ed314428 Mon Sep 17 00:00:00 2001 From: siqi654321 Date: Fri, 21 Feb 2025 04:46:21 +0800 Subject: [PATCH 732/754] Tecorigin sdaa accelerator (#6903) Description This PR includes Tecorigin SDAA accelerator support. With this PR, DeepSpeed supports SDAA as backend for training tasks. --------- Signed-off-by: siqi Co-authored-by: siqi Co-authored-by: Olatunji Ruwase Co-authored-by: Logan Adams <114770087+loadams@users.noreply.github.com> --- accelerator/real_accelerator.py | 19 +- accelerator/sdaa_accelerator.py | 328 ++++++++++++++++++++++++++++++++ op_builder/sdaa/__init__.py | 36 ++++ op_builder/sdaa/builder.py | 60 ++++++ op_builder/sdaa/cpu_adam.py | 53 ++++++ op_builder/sdaa/fused_adam.py | 67 +++++++ op_builder/sdaa/no_impl.py | 59 ++++++ 7 files changed, 621 insertions(+), 1 deletion(-) create mode 100755 accelerator/sdaa_accelerator.py create mode 100755 op_builder/sdaa/__init__.py create mode 100755 op_builder/sdaa/builder.py create mode 100755 op_builder/sdaa/cpu_adam.py create mode 100755 op_builder/sdaa/fused_adam.py create mode 100755 op_builder/sdaa/no_impl.py diff --git a/accelerator/real_accelerator.py b/accelerator/real_accelerator.py index ac17fe2c67e5..9c1713ca4c6c 100644 --- a/accelerator/real_accelerator.py +++ b/accelerator/real_accelerator.py @@ -20,7 +20,7 @@ except ImportError as e: dsa2 = None -SUPPORTED_ACCELERATOR_LIST = ['cuda', 'cpu', 'xpu', 'xpu.external', 'npu', 'mps', 'hpu', 'mlu'] +SUPPORTED_ACCELERATOR_LIST = ['cuda', 'cpu', 'xpu', 'xpu.external', 'npu', 'mps', 'hpu', 'mlu', 'sdaa'] ds_accelerator = None @@ -80,6 +80,12 @@ def get_accelerator(): except ImportError as e: raise ValueError(f"NPU_Accelerator requires torch_npu, which is not installed on this system.") pass + elif accelerator_name == "sdaa": + try: + import torch_sdaa # noqa: F401 # type: ignore + except ImportError as e: + raise ValueError(f"SDAA_Accelerator requires torch_sdaa, which is not installed on this system.") + pass elif accelerator_name == "mps": try: import torch.mps @@ -137,6 +143,13 @@ def get_accelerator(): accelerator_name = "npu" except ImportError as e: pass + if accelerator_name is None: + try: + import torch_sdaa # noqa: F401,F811 # type: ignore + + accelerator_name = "sdaa" + except ImportError as e: + pass if accelerator_name is None: try: import torch.mps @@ -205,6 +218,10 @@ def get_accelerator(): from .npu_accelerator import NPU_Accelerator ds_accelerator = NPU_Accelerator() + elif accelerator_name == "sdaa": + from .sdaa_accelerator import SDAA_Accelerator + + ds_accelerator = SDAA_Accelerator() elif accelerator_name == "mps": from .mps_accelerator import MPS_Accelerator diff --git a/accelerator/sdaa_accelerator.py b/accelerator/sdaa_accelerator.py new file mode 100755 index 000000000000..26113d38dd15 --- /dev/null +++ b/accelerator/sdaa_accelerator.py @@ -0,0 +1,328 @@ +# Copyright (c) Microsoft Corporation. +# SPDX-License-Identifier: Apache-2.0 + +# BSD 3- Clause License Copyright (c) 2023, Tecorigin Co., Ltd. All rights +# reserved. +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions are met: +# Redistributions of source code must retain the above copyright notice, +# this list of conditions and the following disclaimer. +# Redistributions in binary form must reproduce the above copyright notice, +# this list of conditions and the following disclaimer in the documentation +# and/or other materials provided with the distribution. +# Neither the name of the copyright holder nor the names of its contributors +# may be used to endorse or promote products derived from this software +# without specific prior written permission. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE +# LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +# INTERRUPTION) +# HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, +# STRICT LIABILITY,OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY +# WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY +# OF SUCH DAMAGE. + +# DeepSpeed Team + +import importlib +import inspect +import functools + +from .abstract_accelerator import DeepSpeedAccelerator +# During setup stage torch may not be installed, pass on no torch will +# allow op builder related API to be executed. +try: + import torch.sdaa +except ImportError: + pass + + +class SDAA_Accelerator(DeepSpeedAccelerator): + + def __init__(self): + self._name = 'sdaa' + self._communication_backend_name = 'tccl' + self._compile_backend = "inductor" + self.class_dict = None + + def is_synchronized_device(self): + return False + + def use_host_timers(self): + return self.is_synchronized_device() + + def resolves_data_dependency(self): + return self.is_synchronized_device() + + def handles_memory_backpressure(self): + return self.is_synchronized_device() + + # Device APIs + def device_name(self, device_index=None): + if device_index is None: + return 'sdaa' + return 'sdaa:{}'.format(device_index) + + def device(self, device_index=None): + return torch.sdaa.device(device_index) + + def set_device(self, device_index): + torch.sdaa.set_device(device_index) + + def current_device(self): + return torch.sdaa.current_device() + + def current_device_name(self): + return 'sdaa:{}'.format(torch.sdaa.current_device()) + + def device_count(self): + return torch.sdaa.device_count() + + def synchronize(self, device_index=None): + return torch.sdaa.synchronize(device_index) + + # RNG APIs + def random(self): + return torch.random + + def set_rng_state(self, new_state, device_index=None): + if device_index is None: + return torch.sdaa.set_rng_state(new_state) + + return torch.sdaa.set_rng_state(new_state, device_index) + + def get_rng_state(self, device_index=None): + if device_index is None: + return torch.sdaa.get_rng_state() + + return torch.sdaa.get_rng_state(device_index) + + def manual_seed(self, seed): + return torch.sdaa.manual_seed(seed) + + def manual_seed_all(self, seed): + return torch.sdaa.manual_seed_all(seed) + + def initial_seed(self): + return torch.sdaa.initial_seed() + + def default_generator(self, device_index): + return torch.sdaa.default_generators[device_index] + + # Streams/Events + @property + def Stream(self): + return torch.sdaa.Stream + + def stream(self, stream): + return torch.sdaa.stream(stream) + + def current_stream(self, device_index=None): + return torch.sdaa.current_stream(device_index) + + def default_stream(self, device_index=None): + return torch.sdaa.default_stream(device_index) + + @property + def Event(self): + return torch.sdaa.Event + + # Memory management + def empty_cache(self): + return torch.sdaa.empty_cache() + + def memory_allocated(self, device_index=None): + return torch.sdaa.memory_allocated(device_index) + + def max_memory_allocated(self, device_index=None): + return torch.sdaa.max_memory_allocated(device_index) + + def reset_max_memory_allocated(self, device_index=None): + return torch.sdaa.reset_max_memory_allocated(device_index) + + def memory_cached(self, device_index=None): + return torch.sdaa.memory_cached(device_index) + + def max_memory_cached(self, device_index=None): + return torch.sdaa.max_memory_cached(device_index) + + def reset_max_memory_cached(self, device_index=None): + return torch.sdaa.reset_max_memory_cached(device_index) + + def memory_stats(self, device_index=None): + if hasattr(torch.sdaa, 'memory_stats'): + return torch.sdaa.memory_stats(device_index) + + def reset_peak_memory_stats(self, device_index=None): + if hasattr(torch.sdaa, 'reset_peak_memory_stats'): + return torch.sdaa.reset_peak_memory_stats(device_index) + + def memory_reserved(self, device_index=None): + if hasattr(torch.sdaa, 'memory_reserved'): + return torch.sdaa.memory_reserved(device_index) + + def max_memory_reserved(self, device_index=None): + if hasattr(torch.sdaa, 'max_memory_reserved'): + return torch.sdaa.max_memory_reserved(device_index) + + def total_memory(self, device_index=None): + return torch.sdaa.get_device_properties(device_index).total_memory + + def available_memory(self, device_index=None): + return self.total_memory(device_index) - self.memory_allocated(device_index) + + # Data types + def is_bf16_supported(self): + return torch.sdaa.is_bf16_supported() + + def is_fp16_supported(self): + return True + + def supported_dtypes(self): + supported_dtypes = [torch.float] + if self.is_fp16_supported(): + supported_dtypes.append(torch.half) + if self.is_bf16_supported(): + supported_dtypes.append(torch.bfloat16) + return supported_dtypes + + # Misc + def amp(self): + if hasattr(torch.sdaa, 'amp'): + return torch.sdaa.amp + return None + + def is_available(self): + return torch.sdaa.is_available() + + def range_push(self, msg): + return + + def range_pop(self): + return + + def lazy_call(self, callback): + return torch.sdaa._lazy_call(callback) + + def communication_backend_name(self): + return self._communication_backend_name + + def is_triton_supported(self): + return False + + # Graph operations + def create_graph(self): + return None + + def capture_to_graph(self, graph, pool=None, stream=None): + from deepspeed.runtime.utils import noop_context + return noop_context() + + def replay_graph(self, graph): + return + + # Tensor operations + + @property + def BFloat16Tensor(self): + return functools.partial(torch.tensor, dtype=torch.bfloat16, device='sdaa') + + @property + def ByteTensor(self): + return functools.partial(torch.tensor, dtype=torch.uint8, device='sdaa') + + @property + def DoubleTensor(self): + return functools.partial(torch.tensor, dtype=torch.double, device='sdaa') + + @property + def FloatTensor(self): + return functools.partial(torch.tensor, dtype=torch.float, device='sdaa') + + @property + def HalfTensor(self): + return functools.partial(torch.tensor, dtype=torch.half, device='sdaa') + + @property + def IntTensor(self): + return functools.partial(torch.tensor, dtype=torch.int, device='sdaa') + + @property + def LongTensor(self): + return functools.partial(torch.tensor, dtype=torch.long, device='sdaa') + + def pin_memory(self, tensor, align_bytes=1): + return tensor.pin_memory() + + def is_pinned(self, tensor): + return tensor.is_pinned() + + def on_accelerator(self, tensor): + device_str = str(tensor.device) + if device_str.startswith('sdaa:'): + return True + else: + return False + + def op_builder_dir(self): + try: + # is op_builder from deepspeed or a 3p version? this should only succeed if it's deepspeed + # if successful this also means we're doing a local install and not JIT compile path + from op_builder import __deepspeed__ # noqa: F401 # type: ignore + return "op_builder.sdaa" + except ImportError: + return "deepspeed.ops.op_builder.sdaa" + + def _lazy_init_class_dict(self): + if self.class_dict: + return + + op_builder_module = importlib.import_module(self.op_builder_dir()) + + # get op builder class from op_builder/sdaa/__init__.py + self.class_dict = {} + for class_name, class_obj in inspect.getmembers(op_builder_module, inspect.isclass): + self.class_dict[class_name] = class_obj + + # create an instance of op builder and return, name specified by class_name + def create_op_builder(self, class_name): + builder_class = self.get_op_builder(class_name) + return builder_class() + + # return an op builder class, name specified by class_name + def get_op_builder(self, class_name): + self._lazy_init_class_dict() + if class_name in self.class_dict: + return self.class_dict[class_name] + else: + return self.class_dict['NotImplementedBuilder'] + + def build_extension(self): + from torch.utils.cpp_extension import BuildExtension + return BuildExtension + + def export_envs(self): + return ['NCCL', 'LD_LIBRARY', 'PATH'] + + def visible_devices_envs(self): + return ['SDAA_VISIBLE_DEVICES'] + + def set_visible_devices_envs(self, current_env, local_accelerator_ids): + for env in self.visible_devices_envs(): + current_env[env] = ",".join(map(str, local_accelerator_ids)) + + def get_compile_backend(self): + return self._compile_backend + + def set_compile_backend(self, backend): + supported_backends = torch._dynamo.list_backends(exclude_tags=()) + if backend in supported_backends: + self._compile_backend = backend + else: + raise ValueError( + f"{backend} not supported by {self.device_name()}. Supported Backends are {supported_backends}") diff --git a/op_builder/sdaa/__init__.py b/op_builder/sdaa/__init__.py new file mode 100755 index 000000000000..2a6eb8bbfa2c --- /dev/null +++ b/op_builder/sdaa/__init__.py @@ -0,0 +1,36 @@ +# Copyright (c) Microsoft Corporation. + +# SPDX-License-Identifier: Apache-2.0 + +# BSD 3- Clause License Copyright (c) 2023, Tecorigin Co., Ltd. All rights +# reserved. +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions are met: +# Redistributions of source code must retain the above copyright notice, +# this list of conditions and the following disclaimer. +# Redistributions in binary form must reproduce the above copyright notice, +# this list of conditions and the following disclaimer in the documentation +# and/or other materials provided with the distribution. +# Neither the name of the copyright holder nor the names of its contributors +# may be used to endorse or promote products derived from this software +# without specific prior written permission. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE +# LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +# INTERRUPTION) +# HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, +# STRICT LIABILITY,OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY +# WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY +# OF SUCH DAMAGE. + +# DeepSpeed Team +'''Copyright The Microsoft DeepSpeed Team''' + +from .no_impl import NotImplementedBuilder +from .cpu_adam import CPUAdamBuilder +from .fused_adam import FusedAdamBuilder diff --git a/op_builder/sdaa/builder.py b/op_builder/sdaa/builder.py new file mode 100755 index 000000000000..81f0e98c0768 --- /dev/null +++ b/op_builder/sdaa/builder.py @@ -0,0 +1,60 @@ +# Copyright (c) Microsoft Corporation. +# SPDX-License-Identifier: Apache-2.0 + +# BSD 3- Clause License Copyright (c) 2023, Tecorigin Co., Ltd. All rights +# reserved. +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions are met: +# Redistributions of source code must retain the above copyright notice, +# this list of conditions and the following disclaimer. +# Redistributions in binary form must reproduce the above copyright notice, +# this list of conditions and the following disclaimer in the documentation +# and/or other materials provided with the distribution. +# Neither the name of the copyright holder nor the names of its contributors +# may be used to endorse or promote products derived from this software +# without specific prior written permission. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE +# LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +# INTERRUPTION) +# HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, +# STRICT LIABILITY,OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY +# WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY +# OF SUCH DAMAGE. + +# DeepSpeed Team + +try: + # is op_builder from deepspeed or a 3p version? this should only succeed if it's deepspeed + # if successful this also means we're doing a local install and not JIT compile path + from op_builder import __deepspeed__ # noqa: F401 # type: ignore + from op_builder.builder import OpBuilder +except ImportError: + from deepspeed.ops.op_builder.builder import OpBuilder + + +class SDAAOpBuilder(OpBuilder): + + def builder(self): + from torch.utils.cpp_extension import CppExtension as ExtensionBuilder + + compile_args = {'cxx': self.strip_empty_entries(self.cxx_args())} + + cpp_ext = ExtensionBuilder(name=self.absolute_name(), + sources=self.strip_empty_entries(self.sources()), + include_dirs=self.strip_empty_entries(self.include_paths()), + libraries=self.strip_empty_entries(self.libraries_args()), + extra_compile_args=compile_args) + + return cpp_ext + + def cxx_args(self): + return ['-O3', '-g', '-Wno-reorder'] + + def libraries_args(self): + return [] diff --git a/op_builder/sdaa/cpu_adam.py b/op_builder/sdaa/cpu_adam.py new file mode 100755 index 000000000000..b38a71a6275d --- /dev/null +++ b/op_builder/sdaa/cpu_adam.py @@ -0,0 +1,53 @@ +# Copyright (c) Microsoft Corporation. +# SPDX-License-Identifier: Apache-2.0 + +# BSD 3- Clause License Copyright (c) 2023, Tecorigin Co., Ltd. All rights +# reserved. +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions are met: +# Redistributions of source code must retain the above copyright notice, +# this list of conditions and the following disclaimer. +# Redistributions in binary form must reproduce the above copyright notice, +# this list of conditions and the following disclaimer in the documentation +# and/or other materials provided with the distribution. +# Neither the name of the copyright holder nor the names of its contributors +# may be used to endorse or promote products derived from this software +# without specific prior written permission. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE +# LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +# INTERRUPTION) +# HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, +# STRICT LIABILITY,OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY +# WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY +# OF SUCH DAMAGE. + +# DeepSpeed Team + +from .builder import SDAAOpBuilder + + +class CPUAdamBuilder(SDAAOpBuilder): + BUILD_VAR = "DS_BUILD_CPU_ADAM" + NAME = "cpu_adam" + + def __init__(self): + super().__init__(name=self.NAME) + + def absolute_name(self): + return f'deepspeed.ops.adam.{self.NAME}_op' + + def sources(self): + return ['csrc/adam/cpu_adam.cpp', 'csrc/adam/cpu_adam_impl.cpp'] + + def libraries_args(self): + args = super().libraries_args() + return args + + def include_paths(self): + return ['csrc/includes'] diff --git a/op_builder/sdaa/fused_adam.py b/op_builder/sdaa/fused_adam.py new file mode 100755 index 000000000000..73a2dff41459 --- /dev/null +++ b/op_builder/sdaa/fused_adam.py @@ -0,0 +1,67 @@ +# Copyright (c) Microsoft Corporation. +# SPDX-License-Identifier: Apache-2.0 + +# BSD 3- Clause License Copyright (c) 2023, Tecorigin Co., Ltd. All rights +# reserved. +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions are met: +# Redistributions of source code must retain the above copyright notice, +# this list of conditions and the following disclaimer. +# Redistributions in binary form must reproduce the above copyright notice, +# this list of conditions and the following disclaimer in the documentation +# and/or other materials provided with the distribution. +# Neither the name of the copyright holder nor the names of its contributors +# may be used to endorse or promote products derived from this software +# without specific prior written permission. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE +# LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +# INTERRUPTION) +# HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, +# STRICT LIABILITY,OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY +# WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY +# OF SUCH DAMAGE. + +# DeepSpeed Team + +from .builder import SDAAOpBuilder + +try: + import torch +except ImportError as e: + pass + + +class SDAAFusedAdam: + + @staticmethod + def multi_tensor_adam(chunk_size, noop_flag_buffer, tensor_lists, lr, beta1, beta2, epsilon, step, adam_w_mode, + bias_correction, weight_decay, *args): + g_tensor_lis, p_tensor_lis, m_tensor_lis, v_tensor_lis = tensor_lists + torch.ops.sdaa.fused_adam(g_tensor_lis, p_tensor_lis, m_tensor_lis, v_tensor_lis, [], beta1, beta2, epsilon, + lr, weight_decay, adam_w_mode, step, bias_correction) + + +class FusedAdamBuilder(SDAAOpBuilder): + BUILD_VAR = "DS_BUILD_FUSED_ADAM" + NAME = "fused_adam" + + def __init__(self): + super().__init__(name=self.NAME) + + def absolute_name(self): + return f'deepspeed.ops.adam.{self.NAME}_op' + + def sources(self): + return [] + + def include_paths(self): + return [] + + def load(self, verbose=True): + return SDAAFusedAdam diff --git a/op_builder/sdaa/no_impl.py b/op_builder/sdaa/no_impl.py new file mode 100755 index 000000000000..10a8b8f48652 --- /dev/null +++ b/op_builder/sdaa/no_impl.py @@ -0,0 +1,59 @@ +# Copyright (c) Microsoft Corporation. +# SPDX-License-Identifier: Apache-2.0 + +# BSD 3- Clause License Copyright (c) 2023, Tecorigin Co., Ltd. All rights +# reserved. +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions are met: +# Redistributions of source code must retain the above copyright notice, +# this list of conditions and the following disclaimer. +# Redistributions in binary form must reproduce the above copyright notice, +# this list of conditions and the following disclaimer in the documentation +# and/or other materials provided with the distribution. +# Neither the name of the copyright holder nor the names of its contributors +# may be used to endorse or promote products derived from this software +# without specific prior written permission. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE +# LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +# INTERRUPTION) +# HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, +# STRICT LIABILITY,OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY +# WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY +# OF SUCH DAMAGE. + +# DeepSpeed Team + +from .builder import SDAAOpBuilder + + +class NotImplementedBuilder(SDAAOpBuilder): + BUILD_VAR = "DS_BUILD_NOT_IMPLEMENTED" + NAME = "deepspeed_not_implemented" + + def __init__(self, name=None): + name = self.NAME if name is None else name + super().__init__(name=name) + + def absolute_name(self): + return f'deepspeed.ops.comm.{self.NAME}_op' + + def load(self, verbose=True): + raise ValueError("This op had not been implemented on SDAA backend.") + + def sources(self): + return [] + + def cxx_args(self): + return [] + + def extra_ldflags(self): + return [] + + def include_paths(self): + return [] From 8577bd244903f454e319953a6ae1c3838558ac69 Mon Sep 17 00:00:00 2001 From: Logan Adams <114770087+loadams@users.noreply.github.com> Date: Thu, 20 Feb 2025 14:33:18 -0800 Subject: [PATCH 733/754] Handle special case of libuv for Windows (#7064) More information on libuv in pytorch: https://pytorch.org/tutorials/intermediate/TCPStore_libuv_backend.html Issue tracking the prevalence of the error on Windows (unresolved at the time of this PR): https://github.com/pytorch/pytorch/issues/139990 LibUV github: https://github.com/libuv/libuv Windows error: ``` File "C:\hostedtoolcache\windows\Python\3.12.7\x64\Lib\site-packages\torch\distributed\rendezvous.py", line 189, in _create_c10d_store return TCPStore( ^^^^^^^^^ RuntimeError: use_libuv was requested but PyTorch was build without libuv support ``` use_libuv isn't well supported on Windows in pytorch <2.4, so we need to guard around this case. --------- Signed-off-by: Logan Adams --- deepspeed/comm/torch.py | 21 ++++++++++++++++----- 1 file changed, 16 insertions(+), 5 deletions(-) diff --git a/deepspeed/comm/torch.py b/deepspeed/comm/torch.py index efa0640fb87b..1146832d7655 100755 --- a/deepspeed/comm/torch.py +++ b/deepspeed/comm/torch.py @@ -145,11 +145,22 @@ def has_reduce_scatter_tensor(self): def init_process_group(self, backend, timeout, init_method, rank, world_size): if not torch.distributed.is_initialized(): - torch.distributed.init_process_group(backend, - timeout=timeout, - init_method=init_method, - rank=rank, - world_size=world_size) + if not required_torch_version(min_version=2.4): + # Windows torch builds do not come with lib_uv by default. + # More information here: https://pytorch.org/tutorials/intermediate/TCPStore_libuv_backend.html + use_libuv = False if os.name == "nt" else True + torch.distributed.init_process_group(backend, + timeout=timeout, + init_method=init_method, + rank=rank, + world_size=world_size, + use_libuv=use_libuv) + else: + torch.distributed.init_process_group(backend, + timeout=timeout, + init_method=init_method, + rank=rank, + world_size=world_size) self.using_mpi = torch.distributed.get_backend() == 'mpi' @disable_compiler_collective From 9f20148a77c1e986204d62437ea7541c9e918b08 Mon Sep 17 00:00:00 2001 From: Logan Adams <114770087+loadams@users.noreply.github.com> Date: Fri, 21 Feb 2025 04:05:29 -0800 Subject: [PATCH 734/754] Update README with info on newest accelerator (#7065) Signed-off-by: Logan Adams --- README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/README.md b/README.md index db77d419cce7..7cd3f4088abf 100755 --- a/README.md +++ b/README.md @@ -172,6 +172,7 @@ dynamically link them at runtime. | Intel | Intel(R) Gaudi(R) 2 AI accelerator | hpu | Yes | Yes | | Intel | Intel(R) Xeon(R) Processors | cpu | Yes | Yes | | Intel | Intel(R) Data Center GPU Max series | xpu | Yes | Yes | +| Tecorigin | Scalable Data Analytics Accelerator | sdaa | Yes | No | ## PyPI We regularly push releases to [PyPI](https://pypi.org/project/deepspeed/) and encourage users to install from there in most cases. From 38327e07f6cd39b63418f60cedd1651b0be3e7c3 Mon Sep 17 00:00:00 2001 From: Wei Wu <45323446+U-rara@users.noreply.github.com> Date: Fri, 21 Feb 2025 20:05:41 +0800 Subject: [PATCH 735/754] Bug Fix for offload_states API (#7050) @fukun07 and I discovered a bug when using the `offload_states` and `reload_states` APIs of the Zero3 optimizer. When using grouped parameters (for example, in weight decay or grouped lr scenarios), the order of the parameters mapping in `reload_states` ([here](https://github.com/deepspeedai/DeepSpeed/blob/14b3cce4aaedac69120d386953e2b4cae8c2cf2c/deepspeed/runtime/zero/stage3.py#L2953)) does not correspond with the initialization of `self.lp_param_buffer` ([here](https://github.com/deepspeedai/DeepSpeed/blob/14b3cce4aaedac69120d386953e2b4cae8c2cf2c/deepspeed/runtime/zero/stage3.py#L731)), which leads to misaligned parameter loading. This issue was overlooked by the corresponding unit tests ([here](https://github.com/deepspeedai/DeepSpeed/blob/master/tests/unit/runtime/zero/test_offload_states.py)), so we fixed the bug in our PR and added the corresponding unit tests. --------- Signed-off-by: Wei Wu Co-authored-by: Masahiro Tanaka <81312776+tohtana@users.noreply.github.com> --- deepspeed/runtime/zero/stage3.py | 12 ++++++------ tests/unit/runtime/zero/test_offload_states.py | 13 ++++++++++--- 2 files changed, 16 insertions(+), 9 deletions(-) diff --git a/deepspeed/runtime/zero/stage3.py b/deepspeed/runtime/zero/stage3.py index 9cc58fdbac01..ee97b6278d9e 100644 --- a/deepspeed/runtime/zero/stage3.py +++ b/deepspeed/runtime/zero/stage3.py @@ -732,10 +732,7 @@ def _create_fp16_partitions_with_defragmentation(self, fp16_param_groups): # move parameters to flattened buffer if not self.offload_param: # partitioned params remain in GPU during training # move parameter partitions into a single contiguous flat buffer - parameter_partitions: List[Tensor] = [] - for sub_group in self.fp16_groups: - for param in sub_group: - parameter_partitions.append(param.ds_tensor) + parameter_partitions = self._get_parameter_partitions() # We need to keep the reference to this buffer to make sure you can free it in `offload_states` self.lp_param_buffer = __class__.defragment(parameter_partitions) @@ -786,6 +783,9 @@ def _create_fp16_partitions_with_defragmentation(self, fp16_param_groups): assert len(largest_partition_numel) > 0, f'Unexpected that largest partition is empty' self.fp16_groups[0][0].nvme_swapper.reserve_partitioned_swap_space(largest_partition_numel) + def _get_parameter_partitions(self) -> List[Tensor]: + return [param.ds_tensor for sub_group in self.fp16_groups for param in sub_group] + def _swap_in_sub_group_to_flat_buffer(self, flat_buffer, sub_group_id): offset = 0 elements_in_sub_group = sum([t.ds_numel for t in self.fp16_partitioned_groups[sub_group_id]]) @@ -2954,8 +2954,8 @@ def reload_states(self, non_blocking: bool = False): self.lp_param_buffer.data = cpu_buffer.data.to(device, non_blocking=non_blocking) self._set_fp16_partitioned_groups_flat() - for tensor, offset, tensor_numel in get_mapping_to_flat_buffer( - [p.ds_tensor for p in self.module.parameters()]): + parameter_partitions = self._get_parameter_partitions() + for tensor, offset, tensor_numel in get_mapping_to_flat_buffer(parameter_partitions): tensor.data = self.lp_param_buffer.narrow(0, offset, tensor_numel) self.offloaded_states.remove(OffloadStateTypeEnum.lp_params) diff --git a/tests/unit/runtime/zero/test_offload_states.py b/tests/unit/runtime/zero/test_offload_states.py index 9105a54661fa..44bff480e27b 100644 --- a/tests/unit/runtime/zero/test_offload_states.py +++ b/tests/unit/runtime/zero/test_offload_states.py @@ -33,11 +33,11 @@ def compare_device(state) -> bool: assert compare_device(state), f"State {state} is not on device {device}" -def run_model(model, config_dict, hidden_dim, dtype, include, pin_memory, non_blocking): +def run_model(model, param_groups, config_dict, hidden_dim, dtype, include, pin_memory, non_blocking): # Currently we only support OffloadDeviceEnum.cpu offload_device = OffloadDeviceEnum.cpu - model, _, _, _ = deepspeed.initialize(model=model, model_parameters=model.parameters(), config=config_dict) + model, _, _, _ = deepspeed.initialize(model=model, model_parameters=param_groups, config=config_dict) data_loader = random_dataloader(model=model, total_samples=10, hidden_dim=hidden_dim, @@ -124,5 +124,12 @@ def test_offload_states(self, included_state, pin_memory, non_blocking): with deepspeed.zero.Init(config_dict_or_path=config_dict): model = SimpleModel(hidden_dim, nlayers=4) + param_groups = [{ + "params": [p for n, p in model.named_parameters() if not 'bias' in n], + "weight_decay": 0.1 + }, { + "params": [p for n, p in model.named_parameters() if 'bias' in n], + "weight_decay": 0.0 + }] include = None if included_state is None else [included_state] - run_model(model, config_dict, hidden_dim, torch.bfloat16, include, pin_memory, non_blocking) + run_model(model, param_groups, config_dict, hidden_dim, torch.bfloat16, include, pin_memory, non_blocking) From 9d820e4c053160af0136a9cfc3a3a55d4297a023 Mon Sep 17 00:00:00 2001 From: Logan Adams <114770087+loadams@users.noreply.github.com> Date: Sun, 23 Feb 2025 22:01:06 -0800 Subject: [PATCH 736/754] Fix TOCTOU issues, switch to fstat (#7067) Signed-off-by: Logan Adams --- csrc/aio/common/deepspeed_aio_common.cpp | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/csrc/aio/common/deepspeed_aio_common.cpp b/csrc/aio/common/deepspeed_aio_common.cpp index 81c315e9a558..9d7ff5093017 100644 --- a/csrc/aio/common/deepspeed_aio_common.cpp +++ b/csrc/aio/common/deepspeed_aio_common.cpp @@ -284,12 +284,13 @@ int open_file(const char* filename, const bool read_op) int regular_read(const char* filename, std::vector& buffer) { - int64_t num_bytes; - const auto f_size = get_file_size(filename, num_bytes); - assert(f_size != -1); - buffer.resize(num_bytes); const auto fd = open(filename, O_RDONLY, 0600); assert(fd != -1); + struct stat fs; + const auto result = fstat(fd, &fs); + assert(result != -1); + int64_t num_bytes = fs.st_size; + buffer.resize(num_bytes); int64_t read_bytes = 0; auto r = 0; do { From e1903f0d0a666f2e1b901f50c76f252f87a001c5 Mon Sep 17 00:00:00 2001 From: Shelly Nahir <73890534+ShellyNR@users.noreply.github.com> Date: Mon, 24 Feb 2025 16:50:09 +0200 Subject: [PATCH 737/754] config torch to avoid graph breaks caused by logger (#6999) Following changes in Pytorch trace rules , my previous PR to avoid graph breaks caused by logger is no longer relevant. So instead I've added this functionality to torch dynamo - https://github.com/pytorch/pytorch/commit/16ea0ddcdbe49f5560bfbbc6ab331c3422e27b2e This commit allows the user to config torch to ignore logger methods and avoid associated graph breaks. To enable ignore logger methods - os.environ["DISABLE_LOGS_WHILE_COMPILING"] = "1" To ignore logger methods except for a specific method / methods (for example, info and isEnabledFor) - os.environ["DISABLE_LOGS_WHILE_COMPILING"] = "1" and os.environ["LOGGER_METHODS_TO_EXCLUDE_FROM_DISABLE"] = "info, isEnabledFor" Signed-off-by: ShellyNR Co-authored-by: snahir --- deepspeed/utils/logging.py | 41 ++++++++++---------------------------- 1 file changed, 10 insertions(+), 31 deletions(-) diff --git a/deepspeed/utils/logging.py b/deepspeed/utils/logging.py index d5db29485db3..77173f2839ca 100644 --- a/deepspeed/utils/logging.py +++ b/deepspeed/utils/logging.py @@ -7,7 +7,8 @@ import logging import sys import os -from deepspeed.runtime.compiler import is_compile_supported, is_compiling +import torch +from deepspeed.utils.torch import required_torch_version log_levels = { "debug": logging.DEBUG, @@ -20,31 +21,6 @@ class LoggerFactory: - def create_warning_filter(logger): - warn = False - - def warn_once(record): - nonlocal warn - if is_compile_supported() and is_compiling() and not warn: - warn = True - logger.warning("To avoid graph breaks caused by logger in compile-mode, it is recommended to" - " disable logging by setting env var DISABLE_LOGS_WHILE_COMPILING=1") - return True - - return warn_once - - @staticmethod - def logging_decorator(func): - - @functools.wraps(func) - def wrapper(*args, **kwargs): - if is_compiling(): - return - else: - return func(*args, **kwargs) - - return wrapper - @staticmethod def create_logger(name=None, level=logging.INFO): """create a logger @@ -70,12 +46,15 @@ def create_logger(name=None, level=logging.INFO): ch.setLevel(level) ch.setFormatter(formatter) logger_.addHandler(ch) - if os.getenv("DISABLE_LOGS_WHILE_COMPILING", "0") == "1": - for method in ['info', 'debug', 'error', 'warning', 'critical', 'exception']: + if required_torch_version(min_version=2.6) and os.getenv("DISABLE_LOGS_WHILE_COMPILING", "0") == "1": + excluded_set = { + item.strip() + for item in os.getenv("LOGGER_METHODS_TO_EXCLUDE_FROM_DISABLE", "").split(",") + } + ignore_set = {'info', 'debug', 'error', 'warning', 'critical', 'exception', 'isEnabledFor'} - excluded_set + for method in ignore_set: original_logger = getattr(logger_, method) - setattr(logger_, method, LoggerFactory.logging_decorator(original_logger)) - else: - logger_.addFilter(LoggerFactory.create_warning_filter(logger_)) + torch._dynamo.config.ignore_logger_methods.add(original_logger) return logger_ From 4b7e2c909fb9c6b161ed9e62c647dea49b486e41 Mon Sep 17 00:00:00 2001 From: Yejing-Lai Date: Tue, 25 Feb 2025 00:57:26 +0800 Subject: [PATCH 738/754] Fix meta load tensor imcompatible issue (#7073) The partition tensor doesn't need to move to the current device when meta load is used. Signed-off-by: Lai, Yejing Co-authored-by: Olatunji Ruwase --- deepspeed/module_inject/layers.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/deepspeed/module_inject/layers.py b/deepspeed/module_inject/layers.py index 2a24c2920466..5087d71a3d62 100644 --- a/deepspeed/module_inject/layers.py +++ b/deepspeed/module_inject/layers.py @@ -48,7 +48,8 @@ def move(tensor, device): # to save host resources when DP > 1。 if tensor.is_meta: - return torch.empty_like(tensor, device=device) + # Keep tensor in meta device if tensor is meta. + return tensor else: # Using new tensors help in freeing memory (after split for example) was done before by calling clone(). # Using copy=True instead of clone() will help in case of cpu --> cpu. From 1d30b58cba83ea03c1e81d20c8c077467983d769 Mon Sep 17 00:00:00 2001 From: Logan Adams <114770087+loadams@users.noreply.github.com> Date: Mon, 24 Feb 2025 12:40:24 -0800 Subject: [PATCH 739/754] Replace calls to `python setup.py sdist` with `python -m build --sdist` (#7069) With future changes coming to pip/python/etc, we need to modify to no longer call `python setup.py ...` and replace it instead: https://packaging.python.org/en/latest/guides/modernize-setup-py-project/#should-setup-py-be-deleted ![image](https://github.com/user-attachments/assets/ea39ef7b-3cbe-4916-86f0-bc46a5fce96d) This means we need to install the build package which is added here as well. Additionally, we pass the `--sdist` flag to only build the sdist rather than the wheel as well here. --------- Signed-off-by: Logan Adams --- .github/workflows/no-torch.yml | 3 ++- .github/workflows/release.yml | 3 ++- build_win.bat | 2 +- docs/_tutorials/advanced-install.md | 2 +- docs/_tutorials/ds-sequence.md | 2 +- install.sh | 2 +- release/release.sh | 2 +- setup.py | 2 +- 8 files changed, 10 insertions(+), 8 deletions(-) diff --git a/.github/workflows/no-torch.yml b/.github/workflows/no-torch.yml index 5b89a6f36787..75c4ecb850c9 100644 --- a/.github/workflows/no-torch.yml +++ b/.github/workflows/no-torch.yml @@ -32,11 +32,12 @@ jobs: run: | pip uninstall torch --yes pip install setuptools + pip install build pip list - name: Build deepspeed run: | - DS_BUILD_STRING=" " python setup.py sdist + DS_BUILD_STRING=" " python -m build --sdist - name: Open GitHub issue if nightly CI fails if: ${{ failure() && (github.event_name == 'schedule') }} diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index b2ccca69dfda..4bddbc26be4a 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -26,7 +26,8 @@ jobs: - name: Build DeepSpeed run: | pip install setuptools - DS_BUILD_STRING=" " python setup.py sdist + pip install build + DS_BUILD_STRING=" " python -m build --sdist - name: Publish to PyPI uses: pypa/gh-action-pypi-publish@release/v1 with: diff --git a/build_win.bat b/build_win.bat index 81387471983a..627694dbe8a0 100644 --- a/build_win.bat +++ b/build_win.bat @@ -11,6 +11,6 @@ set DS_BUILD_GDS=0 set DS_BUILD_RAGGED_DEVICE_OPS=0 set DS_BUILD_SPARSE_ATTN=0 -python setup.py bdist_wheel +python -m build --wheel --no-isolation :end diff --git a/docs/_tutorials/advanced-install.md b/docs/_tutorials/advanced-install.md index d01378484172..b251485f8988 100755 --- a/docs/_tutorials/advanced-install.md +++ b/docs/_tutorials/advanced-install.md @@ -84,7 +84,7 @@ This should complete the full build 2-3 times faster. You can adjust `-j` to spe You can also build a binary wheel and install it on multiple machines that have the same type of GPUs and the same software environment (CUDA toolkit, PyTorch, Python, etc.) ```bash -DS_BUILD_OPS=1 python setup.py build_ext -j8 bdist_wheel +DS_BUILD_OPS=1 python -m build --wheel --no-isolation --config-setting="--build-option=build_ext" --config-setting="--build-option=-j8" ``` This will create a pypi binary wheel under `dist`, e.g., ``dist/deepspeed-0.3.13+8cd046f-cp38-cp38-linux_x86_64.whl`` and then you can install it directly on multiple machines, in our example: diff --git a/docs/_tutorials/ds-sequence.md b/docs/_tutorials/ds-sequence.md index 7a6041f393f9..41a76b784782 100755 --- a/docs/_tutorials/ds-sequence.md +++ b/docs/_tutorials/ds-sequence.md @@ -111,7 +111,7 @@ pip install . cd ${WORK_DIR} git clone -b v1.0.4 https://github.com/HazyResearch/flash-attention cd flash-attention -python setup.py install +python -m pip install . ``` You may also want to ensure your model configuration is compliant with FlashAttention's requirements. For instance, to achieve optimal performance, the head size should be divisible by 8. Refer to the FlashAttention documentation for more details. diff --git a/install.sh b/install.sh index 8d56afe40493..8be574c6ec1f 100755 --- a/install.sh +++ b/install.sh @@ -152,7 +152,7 @@ if [ ! -f $hostfile ]; then fi echo "Building deepspeed wheel" -python setup.py $VERBOSE bdist_wheel +python -m build $VERBOSE --wheel --no-isolation if [ "$local_only" == "1" ]; then echo "Installing deepspeed" diff --git a/release/release.sh b/release/release.sh index a83fafcb9b1f..cc3ee2feae62 100644 --- a/release/release.sh +++ b/release/release.sh @@ -38,7 +38,7 @@ if [ $? != 0 ]; then exit 1 fi -DS_BUILD_STRING="" python setup.py sdist +DS_BUILD_STRING="" python -m build --sdist if [ ! -f dist/deepspeed-${version}.tar.gz ]; then echo "prepared version does not match version given ($version), bump version first?" diff --git a/setup.py b/setup.py index 6dc9afb8fbc2..0ad54bb99403 100755 --- a/setup.py +++ b/setup.py @@ -233,7 +233,7 @@ def op_enabled(op_name): version_str = open('version.txt', 'r').read().strip() # Build specifiers like .devX can be added at install time. Otherwise, add the git hash. -# Example: DS_BUILD_STRING=".dev20201022" python setup.py sdist bdist_wheel. +# Example: `DS_BUILD_STRING=".dev20201022" python -m build --no-isolation`. # Building wheel for distribution, update version file. if is_env_set('DS_BUILD_STRING'): From 729dfafca366961b82daddb6dea6294aecfa74bc Mon Sep 17 00:00:00 2001 From: Logan Adams <114770087+loadams@users.noreply.github.com> Date: Mon, 24 Feb 2025 18:45:11 -0800 Subject: [PATCH 740/754] Revert "Handle special case of libuv for Windows (#7064)" (#7076) This reverts commit 8577bd244903f454e319953a6ae1c3838558ac69. Fixes: #7072 --- deepspeed/comm/torch.py | 21 +++++---------------- 1 file changed, 5 insertions(+), 16 deletions(-) diff --git a/deepspeed/comm/torch.py b/deepspeed/comm/torch.py index 1146832d7655..efa0640fb87b 100755 --- a/deepspeed/comm/torch.py +++ b/deepspeed/comm/torch.py @@ -145,22 +145,11 @@ def has_reduce_scatter_tensor(self): def init_process_group(self, backend, timeout, init_method, rank, world_size): if not torch.distributed.is_initialized(): - if not required_torch_version(min_version=2.4): - # Windows torch builds do not come with lib_uv by default. - # More information here: https://pytorch.org/tutorials/intermediate/TCPStore_libuv_backend.html - use_libuv = False if os.name == "nt" else True - torch.distributed.init_process_group(backend, - timeout=timeout, - init_method=init_method, - rank=rank, - world_size=world_size, - use_libuv=use_libuv) - else: - torch.distributed.init_process_group(backend, - timeout=timeout, - init_method=init_method, - rank=rank, - world_size=world_size) + torch.distributed.init_process_group(backend, + timeout=timeout, + init_method=init_method, + rank=rank, + world_size=world_size) self.using_mpi = torch.distributed.get_backend() == 'mpi' @disable_compiler_collective From f0401ade2afc160ad5db43d191797b0d903fbe67 Mon Sep 17 00:00:00 2001 From: Yejing-Lai Date: Wed, 26 Feb 2025 22:03:46 +0800 Subject: [PATCH 741/754] Add DeepseekV3 AutoTP. (#7045) Add deepseekv3 autotp. Signed-off-by: Lai, Yejing --- deepspeed/module_inject/auto_tp.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/deepspeed/module_inject/auto_tp.py b/deepspeed/module_inject/auto_tp.py index d148c26968b3..b089ec420d47 100755 --- a/deepspeed/module_inject/auto_tp.py +++ b/deepspeed/module_inject/auto_tp.py @@ -137,7 +137,8 @@ def is_load_module(module): "LPLayerNorm", "SharedEmbedding", "OPTLearnedPositionalEmbedding", "LlamaRMSNorm", "FalconLinear", "MistralRMSNorm", "T5LayerNorm", "MixtralRMSNorm", "Phi3RotaryEmbedding", "Phi3SuScaledRotaryEmbedding", "Phi3RMSNorm", "YuanRMSNorm", "YuanRotaryEmbedding", "Phi3LongRoPEScaledRotaryEmbedding", "Qwen2RMSNorm", - "DeepseekV2RMSNorm", "DeepseekV2YarnRotaryEmbedding", "MoEGate" + "DeepseekV2RMSNorm", "DeepseekV3RMSNorm", "DeepseekV2YarnRotaryEmbedding", "DeepseekV3YarnRotaryEmbedding", + "MoEGate" ] return module.__class__ in load_layers or module._get_name() in load_layer_names From c07b635c45aa0611b252108c2c20d4f7fb3f8755 Mon Sep 17 00:00:00 2001 From: Logan Adams <114770087+loadams@users.noreply.github.com> Date: Wed, 26 Feb 2025 15:56:05 -0800 Subject: [PATCH 742/754] Improve inference tutorial docs (#7083) Fixes: #7082 --------- Signed-off-by: Logan Adams --- docs/_tutorials/inference-tutorial.md | 14 +++++++++----- 1 file changed, 9 insertions(+), 5 deletions(-) diff --git a/docs/_tutorials/inference-tutorial.md b/docs/_tutorials/inference-tutorial.md index 1d5899204f53..ddf287f24b96 100644 --- a/docs/_tutorials/inference-tutorial.md +++ b/docs/_tutorials/inference-tutorial.md @@ -21,18 +21,22 @@ if args.pre_load_checkpoint: model = model_class.from_pretrained(args.model_name_or_path) else: model = model_class() + +# create the tokenizer +tokenizer = model_class.from_pretrained(args.model_name_or_path) ... import deepspeed # Initialize the DeepSpeed-Inference engine ds_engine = deepspeed.init_inference(model, - tensor_parallel={"tp_size": 2}, - dtype=torch.half, - checkpoint=None if args.pre_load_checkpoint else args.checkpoint_json, - replace_with_kernel_inject=True) + tensor_parallel={"tp_size": world_size}, + dtype=torch.half, + checkpoint=None if args.pre_load_checkpoint else args.checkpoint_json, + replace_with_kernel_inject=True) model = ds_engine.module -output = model('Input String') +pipe = pipeline("text-generation", model=model, tokenizer=tokenizer) +output = pipe('Input String') ``` To run inference with only model-parallelism for the models that we don't support kernels, you can pass an injection policy that shows the two specific linear layers on a Transformer Encoder/Decoder layer: 1) the attention output GeMM and 2) layer output GeMM. We need these part of the layer to add the required all-reduce communication between GPUs to merge the partial results across model-parallel ranks. Below, we bring an example that shows how you can use deepspeed-inference with a T5 model: From f8d34295d0400fef8f50c3cf53651e48b2fe46ae Mon Sep 17 00:00:00 2001 From: Logan Adams <114770087+loadams@users.noreply.github.com> Date: Thu, 27 Feb 2025 08:15:11 -0800 Subject: [PATCH 743/754] Pin transformers version on tests that use latest. (#7085) Latest transformers causes failures when cpu-torch-latest test, so we pin it for now to unblock other PRs. --------- Signed-off-by: Logan Adams --- .github/workflows/cpu-torch-latest.yml | 2 +- .github/workflows/hpu-gaudi2.yml | 2 +- .github/workflows/nv-a6000.yml | 2 +- .github/workflows/nv-torch-latest-v100.yml | 2 +- .github/workflows/nv-torch-nightly-v100.yml | 8 ++++---- 5 files changed, 8 insertions(+), 8 deletions(-) diff --git a/.github/workflows/cpu-torch-latest.yml b/.github/workflows/cpu-torch-latest.yml index 43ac3d1c30e2..6496d7e35065 100644 --- a/.github/workflows/cpu-torch-latest.yml +++ b/.github/workflows/cpu-torch-latest.yml @@ -42,7 +42,7 @@ jobs: git clone https://github.com/huggingface/transformers cd transformers # if needed switch to the last known good SHA until transformers@master is fixed - # git checkout 6c3f168b3 + git checkout 981c276 git rev-parse --short HEAD pip install . diff --git a/.github/workflows/hpu-gaudi2.yml b/.github/workflows/hpu-gaudi2.yml index b8b6f3cb5502..48730442686c 100644 --- a/.github/workflows/hpu-gaudi2.yml +++ b/.github/workflows/hpu-gaudi2.yml @@ -112,7 +112,7 @@ jobs: git clone https://github.com/huggingface/transformers cd transformers # if needed switch to the last known good SHA until transformers@master is fixed - git checkout 6c3f168b3 + git checkout 981c276 git rev-parse --short HEAD pip install . diff --git a/.github/workflows/nv-a6000.yml b/.github/workflows/nv-a6000.yml index 502b29b44c13..77a2661d08a6 100644 --- a/.github/workflows/nv-a6000.yml +++ b/.github/workflows/nv-a6000.yml @@ -43,7 +43,7 @@ jobs: git clone https://github.com/huggingface/transformers cd transformers # if you need to use an older transformers version temporarily in case of breakage - # git checkout v4.47.1 + git checkout 981c276 git rev-parse --short HEAD python -m pip install . - name: Install deepspeed diff --git a/.github/workflows/nv-torch-latest-v100.yml b/.github/workflows/nv-torch-latest-v100.yml index 3884663d9e55..19f59c950c31 100644 --- a/.github/workflows/nv-torch-latest-v100.yml +++ b/.github/workflows/nv-torch-latest-v100.yml @@ -38,7 +38,7 @@ jobs: git clone https://github.com/huggingface/transformers cd transformers # if needed switch to the last known good SHA until transformers@master is fixed - # git checkout 6c3f168b3 + git checkout 981c276 git rev-parse --short HEAD pip install . diff --git a/.github/workflows/nv-torch-nightly-v100.yml b/.github/workflows/nv-torch-nightly-v100.yml index cb8c15f0d709..ff09808f75ca 100644 --- a/.github/workflows/nv-torch-nightly-v100.yml +++ b/.github/workflows/nv-torch-nightly-v100.yml @@ -2,11 +2,11 @@ name: nv-torch-nightly-v100 on: workflow_dispatch: - pull_request: - paths: - - '.github/workflows/nv-torch-nightly-v100.yml' schedule: - cron: "0 0 * * *" + pull_request: + paths: + - '.github/workflows/nv-torch-nightly-v100.yml' concurrency: group: ${{ github.workflow }}-${{ github.ref }} @@ -37,7 +37,7 @@ jobs: git clone https://github.com/huggingface/transformers cd transformers # if needed switch to the last known good SHA until transformers@master is fixed - # git checkout 6c3f168b3 + git checkout 981c276 git rev-parse --short HEAD pip install . From 5320d4c9bcf5a120400d31a3dd5c39fca39ae826 Mon Sep 17 00:00:00 2001 From: Siddharth Singh Date: Thu, 27 Feb 2025 12:47:38 -0500 Subject: [PATCH 744/754] Update README.md with ICS '23 MoE paper link (#7087) Co-authored-by: Logan Adams <114770087+loadams@users.noreply.github.com> --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 7cd3f4088abf..a812779f0fcc 100755 --- a/README.md +++ b/README.md @@ -265,7 +265,7 @@ Conduct](https://opensource.microsoft.com/codeofconduct/). For more information 18. Syed Zawad, Cheng Li, Zhewei Yao, Elton Zheng, Yuxiong He, Feng Yan. (2023) DySR: Adaptive Super-Resolution via Algorithm and System Co-design. [ICLR:2023](https://openreview.net/forum?id=Pgtn4l6eKjv). 19. Sheng Shen, Zhewei Yao, Chunyuan Li, Trevor Darrell, Kurt Keutzer, Yuxiong He. (2023) Scaling Vision-Language Models with Sparse Mixture of Experts. [arXiv:2303.07226](https://arxiv.org/abs/2303.07226) and [Finding at EMNLP2023](https://2023.emnlp.org/). 20. Quentin Anthony, Ammar Ahmad Awan, Jeff Rasley, Yuxiong He, Aamir Shafi, Mustafa Abduljabbar, Hari Subramoni, Dhabaleswar Panda. (2023) MCR-DL: Mix-and-Match Communication Runtime for Deep Learning [arXiv:2303.08374](https://arxiv.org/abs/2303.08374) and will appear at IPDPS 2023. -21. Siddharth Singh, Olatunji Ruwase, Ammar Ahmad Awan, Samyam Rajbhandari, Yuxiong He, Abhinav Bhatele. (2023) A Hybrid Tensor-Expert-Data Parallelism Approach to Optimize Mixture-of-Experts Training [arXiv:2303.06318](https://arxiv.org/abs/2303.06318) and will appear at ICS 2023. +21. Siddharth Singh, Olatunji Ruwase, Ammar Ahmad Awan, Samyam Rajbhandari, Yuxiong He, Abhinav Bhatele. (2023) A Hybrid Tensor-Expert-Data Parallelism Approach to Optimize Mixture-of-Experts Training [arXiv:2303.06318](https://arxiv.org/abs/2303.06318) and [ICS 2023](https://dl.acm.org/doi/10.1145/3577193.3593704). 22. Guanhua Wang, Heyang Qin, Sam Ade Jacobs, Xiaoxia Wu, Connor Holmes, Zhewei Yao, Samyam Rajbhandari, Olatunji Ruwase, Feng Yan, Lei Yang, Yuxiong He. (2023) ZeRO++: Extremely Efficient Collective Communication for Giant Model Training [arXiv:2306.10209](https://arxiv.org/abs/2306.10209) and [ML for Sys Workshop at NeurIPS2023](http://mlforsystems.org/) [[blog]](https://www.microsoft.com/en-us/research/blog/deepspeed-zero-a-leap-in-speed-for-llm-and-chat-model-training-with-4x-less-communication/) 23. Zhewei Yao, Xiaoxia Wu, Cheng Li, Stephen Youn, Yuxiong He. (2023) ZeroQuant-V2: Exploring Post-training Quantization in LLMs from Comprehensive Study to Low Rank Compensation [arXiv:2303.08302](https://arxiv.org/abs/2303.08302) and [ENLSP2023 Workshop at NeurIPS2023](https://neurips2023-enlsp.github.io/) [[slides]](docs/assets/files/zeroquant_series.pdf) 24. Pareesa Ameneh Golnari, Zhewei Yao, Yuxiong He. (2023) Selective Guidance: Are All the Denoising Steps of Guided Diffusion Important? [arXiv:2305.09847](https://arxiv.org/abs/2305.09847) From f2ed2531a73fec10061b93bf5edc8b3a056664ec Mon Sep 17 00:00:00 2001 From: Logan Adams <114770087+loadams@users.noreply.github.com> Date: Thu, 27 Feb 2025 10:47:49 -0800 Subject: [PATCH 745/754] Update parallelism for nv-torch-latest/nightly tests due to more GPUs/runner (#7086) Signed-off-by: Logan Adams Co-authored-by: Olatunji Ruwase --- .github/workflows/nv-torch-latest-v100.yml | 2 +- .github/workflows/nv-torch-nightly-v100.yml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/nv-torch-latest-v100.yml b/.github/workflows/nv-torch-latest-v100.yml index 19f59c950c31..eba35ba7210a 100644 --- a/.github/workflows/nv-torch-latest-v100.yml +++ b/.github/workflows/nv-torch-latest-v100.yml @@ -55,5 +55,5 @@ jobs: run: | unset TORCH_CUDA_ARCH_LIST # only jit compile for current arch cd tests - pytest $PYTEST_OPTS --forked -n 4 unit/ --torch_ver="2.6" --cuda_ver="12.4" + pytest $PYTEST_OPTS --forked -n 8 unit/ --torch_ver="2.6" --cuda_ver="12.4" pytest $PYTEST_OPTS --forked -m 'sequential' unit/ --torch_ver="2.6" --cuda_ver="12.4" diff --git a/.github/workflows/nv-torch-nightly-v100.yml b/.github/workflows/nv-torch-nightly-v100.yml index ff09808f75ca..0013ed3f276f 100644 --- a/.github/workflows/nv-torch-nightly-v100.yml +++ b/.github/workflows/nv-torch-nightly-v100.yml @@ -54,7 +54,7 @@ jobs: run: | unset TORCH_CUDA_ARCH_LIST # only jit compile for current arch cd tests - pytest $PYTEST_OPTS --forked -n 4 unit/ + pytest $PYTEST_OPTS --forked -n 8 unit/ pytest $PYTEST_OPTS --forked -m 'sequential' unit/ - name: Open GitHub issue if nightly CI fails From 02bbf501090cde1decf7dbd2058203d89a1dee86 Mon Sep 17 00:00:00 2001 From: Logan Adams <114770087+loadams@users.noreply.github.com> Date: Thu, 27 Feb 2025 17:33:01 -0800 Subject: [PATCH 746/754] Remove workflows for very old torch versions (#7090) These jobs haven't been run in a long time and were originally used when compatibility with torch <2 was more important. Signed-off-by: Logan Adams --- .github/workflows/nv-torch110-p40.yml | 65 ------------------------- .github/workflows/nv-torch110-v100.yml | 66 -------------------------- 2 files changed, 131 deletions(-) delete mode 100644 .github/workflows/nv-torch110-p40.yml delete mode 100644 .github/workflows/nv-torch110-v100.yml diff --git a/.github/workflows/nv-torch110-p40.yml b/.github/workflows/nv-torch110-p40.yml deleted file mode 100644 index 31d7805db7bb..000000000000 --- a/.github/workflows/nv-torch110-p40.yml +++ /dev/null @@ -1,65 +0,0 @@ -name: nv-torch110-p40 - -on: - workflow_dispatch: - schedule: - - cron: "0 0 * * *" - -concurrency: - group: ${{ github.workflow }}-${{ github.ref }} - cancel-in-progress: true - -permissions: - contents: read - issues: write - -jobs: - unit-tests: - runs-on: [self-hosted, nvidia, cu111, p40] - - env: {ACTIONS_ALLOW_USE_UNSECURE_NODE_VERSION: true} # Allow using Node16 actions - - steps: - - uses: actions/checkout@v4 - - - id: setup-venv - uses: ./.github/workflows/setup-venv - - - name: Install pytorch - run: | - pip install -U --cache-dir $TORCH_CACHE torch==1.10.0+cu111 torchvision==0.11.0+cu111 -f https://download.pytorch.org/whl/torch_stable.html - python -c "import torch; print('torch:', torch.__version__, torch)" - python -c "import torch; print('CUDA available:', torch.cuda.is_available())" - - - name: Install transformers - run: | - git clone https://github.com/huggingface/transformers - cd transformers - # if needed switch to the last known good SHA until transformers@master is fixed - # git checkout 1cc453d33 - git rev-parse --short HEAD - pip install . - - - name: Install deepspeed - run: | - pip install .[dev,1bit,autotuning] --no-build-isolation - ds_report - - - name: Python environment - run: | - pip list - - - name: Unit tests - run: | - unset TORCH_CUDA_ARCH_LIST # only jit compile for current arch - cd tests - DS_ALLOW_DEPRECATED_FP16=1 pytest $PYTEST_OPTS --forked -n 4 unit/ --torch_ver="1.10" --cuda_ver="11.1" - - - name: Open GitHub issue if nightly CI fails - if: ${{ failure() && (github.event_name == 'schedule') }} - uses: JasonEtco/create-an-issue@v2 - env: - GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} - with: - filename: .github/ISSUE_TEMPLATE/ci_failure_report.md - update_existing: true diff --git a/.github/workflows/nv-torch110-v100.yml b/.github/workflows/nv-torch110-v100.yml deleted file mode 100644 index bb1bc987379c..000000000000 --- a/.github/workflows/nv-torch110-v100.yml +++ /dev/null @@ -1,66 +0,0 @@ -name: nv-torch110-v100 - -on: - workflow_dispatch: - schedule: - - cron: "0 0 * * *" - -concurrency: - group: ${{ github.workflow }}-${{ github.ref }} - cancel-in-progress: true - -permissions: - contents: read - issues: write - -jobs: - unit-tests: - runs-on: [self-hosted, nvidia, cu111, v100] - - env: {ACTIONS_ALLOW_USE_UNSECURE_NODE_VERSION: true} # Allow using Node16 actions - - steps: - - uses: actions/checkout@v4 - - - id: setup-venv - uses: ./.github/workflows/setup-venv - - - name: Install pytorch - run: | - pip install -U --cache-dir $TORCH_CACHE torch==1.10.0+cu111 torchvision==0.11.0+cu111 -f https://download.pytorch.org/whl/torch_stable.html - python -c "import torch; print('torch:', torch.__version__, torch)" - python -c "import torch; print('CUDA available:', torch.cuda.is_available())" - - - name: Install transformers - run: | - git clone https://github.com/huggingface/transformers - cd transformers - # if needed switch to the last known good SHA until transformers@master is fixed - # git checkout 1cc453d33 - git rev-parse --short HEAD - pip install . - - - name: Install deepspeed - run: | - pip install .[dev,1bit,autotuning] --no-build-isolation - ds_report - - - name: Python environment - run: | - pip list - - - name: Unit tests - run: | - unset TORCH_CUDA_ARCH_LIST # only jit compile for current arch - cd tests - pytest $PYTEST_OPTS --forked -n 4 unit/ --torch_ver="1.10" --cuda_ver="11" - pytest $PYTEST_OPTS --forked -m 'sequential' unit/ --torch_ver="1.10" --cuda_ver="11" - - - name: Open GitHub issue if nightly CI fails - if: ${{ failure() && (github.event_name == 'schedule') }} - uses: JasonEtco/create-an-issue@v2 - env: - GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} - with: - filename: .github/ISSUE_TEMPLATE/ci_failure_report.md - update_existing: true From b4177e45f9c9e1c49dc2efb88f85ad40e629d04e Mon Sep 17 00:00:00 2001 From: Olatunji Ruwase Date: Mon, 3 Mar 2025 12:50:24 -0500 Subject: [PATCH 747/754] Use new dlpack api; Formatting fixes (#7101) Fix CI issues by using new dlpack [api](https://pytorch.org/docs/stable/_modules/torch/utils/dlpack.html#from_dlpack) Minor pre-commit fixes. Signed-off-by: Olatunji Ruwase --- deepspeed/autotuning/autotuner.py | 4 ++-- deepspeed/inference/engine.py | 2 +- deepspeed/launcher/runner.py | 2 +- deepspeed/runtime/compression/cupy.py | 4 ++-- deepspeed/runtime/engine.py | 2 +- deepspeed/runtime/zero/partition_parameters.py | 3 +-- deepspeed/utils/logging.py | 2 +- op_builder/builder.py | 10 +++++----- 8 files changed, 14 insertions(+), 15 deletions(-) diff --git a/deepspeed/autotuning/autotuner.py b/deepspeed/autotuning/autotuner.py index a72b3c951e97..419e92bd44ae 100755 --- a/deepspeed/autotuning/autotuner.py +++ b/deepspeed/autotuning/autotuner.py @@ -71,7 +71,7 @@ def __init__(self, args, active_resources): logger.info(f"Created autotuning experiments directory: {self.exps_dir}") except: logger.error( - f"Failed to create {self.exps_dir}, please check `exps_dir` in the autotuning config file is accessible by all the nodes in the job." + f"Failed to create {self.exps_dir}, please check exps_dir in the autotuning config file is accessible by all the nodes in the job." ) exit(-1) @@ -84,7 +84,7 @@ def __init__(self, args, active_resources): logger.info(f"Created autotuning results directory: {self.exps_dir}") except: logger.error( - f"Failed to create {self.results_dir}, please check `results_dir` in the autotuning config file is accessible by all the nodes in the job." + f"Failed to create {self.results_dir}, please check results_dir in the autotuning config file is accessible by all the nodes in the job." ) exit(-1) diff --git a/deepspeed/inference/engine.py b/deepspeed/inference/engine.py index a529d9343228..0a74d19e91f5 100755 --- a/deepspeed/inference/engine.py +++ b/deepspeed/inference/engine.py @@ -600,7 +600,7 @@ def _generate(self, *inputs, **kwargs): tensor_length = input_tensor.shape[-1] if tensor_length > self._config.max_out_tokens: raise RuntimeError( - f"Input with size {tensor_length} exceeds maximum length of {self._config.max_out_tokens}. Please increase `max_tokens` in the DeepSpeed Inference Config." + f"Input with size {tensor_length} exceeds maximum length of {self._config.max_out_tokens}. Please increase max_tokens in the DeepSpeed Inference Config." ) return self.module.generate(*inputs, **kwargs) diff --git a/deepspeed/launcher/runner.py b/deepspeed/launcher/runner.py index 5f926834dda2..bea1e14fa51f 100755 --- a/deepspeed/launcher/runner.py +++ b/deepspeed/launcher/runner.py @@ -491,7 +491,7 @@ def main(args=None): args.master_addr = result.decode('utf-8').split()[0] if not args.master_addr: raise RuntimeError( - f"Unable to detect suitable master address via `hostname -I`, please manually specify one via --master_addr" + "Unable to detect suitable master address via `hostname -I`, please manually specify one via --master_addr" ) logger.info(f"Using IP address of {args.master_addr} for node {first_host}") diff --git a/deepspeed/runtime/compression/cupy.py b/deepspeed/runtime/compression/cupy.py index b959a9c20372..7133ac04ed2b 100644 --- a/deepspeed/runtime/compression/cupy.py +++ b/deepspeed/runtime/compression/cupy.py @@ -14,10 +14,10 @@ def __init__(self): pass def torch2cupy(self, tensor): - return cupy.fromDlpack(to_dlpack(tensor)) + return cupy.from_dlpack(to_dlpack(tensor)) def cupy2torch(self, cupy_tensor): - return from_dlpack(cupy_tensor.toDlpack()) + return from_dlpack(cupy_tensor) def compress_by_chunk(self, cupy_bool_tensor, num_chunks): packed_sign = cupy.packbits(cupy_bool_tensor) diff --git a/deepspeed/runtime/engine.py b/deepspeed/runtime/engine.py index 4d932f8d5046..df6d286494de 100755 --- a/deepspeed/runtime/engine.py +++ b/deepspeed/runtime/engine.py @@ -3790,7 +3790,7 @@ def save_16bit_model(self, save_dir, save_filename="pytorch_model.bin", exclude_ else: # the model will be bogus if not consolidated so don't confuse the user by saving it logger.info( - f"Did not save the model {path} because `stage3_gather_16bit_weights_on_model_save` is False") + f"Did not save the model {path} because stage3_gather_16bit_weights_on_model_save is False") return False else: state_dict = self.module_state_dict(exclude_frozen_parameters=exclude_frozen_parameters) diff --git a/deepspeed/runtime/zero/partition_parameters.py b/deepspeed/runtime/zero/partition_parameters.py index e8cb797b8a5b..db03a4b86134 100755 --- a/deepspeed/runtime/zero/partition_parameters.py +++ b/deepspeed/runtime/zero/partition_parameters.py @@ -944,8 +944,7 @@ def __init__(self, """ if config is not None: config_dict_or_path = config - logger.warning( - f'zero.Init: the `config` argument is deprecated. Please use `config_dict_or_path` instead.') + logger.warning('zero.Init: the `config` argument is deprecated. Please use `config_dict_or_path` instead.') _ds_config = deepspeed.runtime.config.DeepSpeedConfig(config_dict_or_path, mpu) if config_dict_or_path is not None else None if _ds_config is not None: diff --git a/deepspeed/utils/logging.py b/deepspeed/utils/logging.py index 77173f2839ca..ed691e3985e1 100644 --- a/deepspeed/utils/logging.py +++ b/deepspeed/utils/logging.py @@ -158,6 +158,6 @@ def should_log_le(max_log_level_str): max_log_level_str = max_log_level_str.lower() if max_log_level_str not in log_levels: - raise ValueError(f"{max_log_level_str} is not one of the `logging` levels") + raise ValueError(f"{max_log_level_str} is not one of the logging levels") return get_current_level() <= log_levels[max_log_level_str] diff --git a/op_builder/builder.py b/op_builder/builder.py index 41c0a154186f..9b721e110fcc 100644 --- a/op_builder/builder.py +++ b/op_builder/builder.py @@ -412,8 +412,8 @@ def cpu_arch(self): try: cpu_info = get_cpu_info() except Exception as e: - self.warning(f"{self.name} attempted to use `py-cpuinfo` but failed (exception type: {type(e)}, {e}), " - "falling back to `lscpu` to get this information.") + self.warning(f"{self.name} attempted to use py-cpuinfo but failed (exception type: {type(e)}, {e}), " + "falling back to lscpu to get this information.") cpu_info = self._backup_cpuinfo() if cpu_info is None: return "-march=native" @@ -471,8 +471,8 @@ def simd_width(self): try: cpu_info = get_cpu_info() except Exception as e: - self.warning(f"{self.name} attempted to use `py-cpuinfo` but failed (exception type: {type(e)}, {e}), " - "falling back to `lscpu` to get this information.") + self.warning(f"{self.name} attempted to use py-cpuinfo but failed (exception type: {type(e)}, {e}), " + "falling back to lscpu to get this information.") cpu_info = self._backup_cpuinfo() if cpu_info is None: return '-D__SCALAR__' @@ -642,7 +642,7 @@ def compute_capability_args(self, cross_compile_archs=None): if cross_compile_archs_env is not None: if cross_compile_archs is not None: print( - f"{WARNING} env var `TORCH_CUDA_ARCH_LIST={cross_compile_archs_env}` overrides `cross_compile_archs={cross_compile_archs}`" + f"{WARNING} env var TORCH_CUDA_ARCH_LIST={cross_compile_archs_env} overrides cross_compile_archs={cross_compile_archs}" ) cross_compile_archs = cross_compile_archs_env.replace(' ', ';') else: From a88f56a045a41d8b546238c34fb39d47cb3daed2 Mon Sep 17 00:00:00 2001 From: Max Kovalenko Date: Tue, 4 Mar 2025 00:54:08 +0200 Subject: [PATCH 748/754] Avoid graph breaks by disabling sourceless calls in instrument_w_nvtx (#7081) This PR is a continuation of the efforts to improve Deepspeed performance when using PyTorch compile. The `instrument_w_nvtx` decorator is used to instrument code with NVIDIA Tools Extension (NVTX) markers for profiling and visualizing code execution on GPUs. Along with executing the function itself, `instrument_w_nvtx` makes calls to `nvtx.range_push` and `nvtx.range_pop` which can't be traced by Dynamo. That's why this decorator causes a graph break. The impact on performance can be significant due to numerous uses of the decorator throughout the code. We propose a simple solution: Don't invoke the sourceless functions when torch is compiling. --------- Signed-off-by: Max Kovalenko Co-authored-by: Logan Adams <114770087+loadams@users.noreply.github.com> --- deepspeed/utils/nvtx.py | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/deepspeed/utils/nvtx.py b/deepspeed/utils/nvtx.py index 7c566480a86a..72d7c863a33f 100644 --- a/deepspeed/utils/nvtx.py +++ b/deepspeed/utils/nvtx.py @@ -4,19 +4,21 @@ # DeepSpeed Team from deepspeed.accelerator import get_accelerator +from deepspeed.runtime.compiler import is_compiling enable_nvtx = True def instrument_w_nvtx(func): - """decorator that causes an NVTX range to be recorded for the duration of the - function call.""" + """Decorator that records an NVTX range for the duration of the function call. + Skips NVTX instrumentation when torch.compile is active to avoid graph breaks. + """ def wrapped_fn(*args, **kwargs): - if enable_nvtx: + if enable_nvtx and not is_compiling(): get_accelerator().range_push(func.__qualname__) ret_val = func(*args, **kwargs) - if enable_nvtx: + if enable_nvtx and not is_compiling(): get_accelerator().range_pop() return ret_val From 776822fe2186b199b4cc402ea8d6c84884c8b42c Mon Sep 17 00:00:00 2001 From: Max Kovalenko Date: Tue, 4 Mar 2025 02:41:51 +0200 Subject: [PATCH 749/754] Avoid graph breaks in torch.compile caused by inner classes in the backward hooks (#7062) This PR is part of the effort to improve Deepspeed performance when using PyTorch compile. There is a known [bug](https://github.com/pytorch/pytorch/issues/128942) in torch.compile which causes a graph break when an inner class is defined within a method that is being compiled. The following would then appear in the log: `[__graph_breaks] torch._dynamo.exc.Unsupported: missing: LOAD_BUILD_CLASS` This is the case with the inner classes `PreBackwardFunctionForModule` and `PostBackwardFunctionModule`. While there is an open PyTorch [PR#133805 ](https://github.com/pytorch/pytorch/pull/133805) for this, we can solve the issue by moving the inner classes into the initialization code. No graph breaks and the corresponding logs are produced anymore. --------- Signed-off-by: Max Kovalenko Signed-off-by: Olatunji Ruwase Signed-off-by: inkcherry Signed-off-by: shaomin Signed-off-by: Stas Bekman Signed-off-by: siqi Signed-off-by: Logan Adams Signed-off-by: Wei Wu Signed-off-by: ShellyNR Signed-off-by: Lai, Yejing Co-authored-by: Olatunji Ruwase Co-authored-by: inkcherry Co-authored-by: wukong1992 Co-authored-by: shaomin Co-authored-by: Hongwei Chen <33092912+hwchen2017@users.noreply.github.com> Co-authored-by: Logan Adams <114770087+loadams@users.noreply.github.com> Co-authored-by: loadams Co-authored-by: Stas Bekman Co-authored-by: siqi654321 Co-authored-by: siqi Co-authored-by: Wei Wu <45323446+U-rara@users.noreply.github.com> Co-authored-by: Masahiro Tanaka <81312776+tohtana@users.noreply.github.com> Co-authored-by: Shelly Nahir <73890534+ShellyNR@users.noreply.github.com> Co-authored-by: snahir Co-authored-by: Yejing-Lai --- deepspeed/runtime/zero/parameter_offload.py | 136 ++++++++++---------- 1 file changed, 68 insertions(+), 68 deletions(-) diff --git a/deepspeed/runtime/zero/parameter_offload.py b/deepspeed/runtime/zero/parameter_offload.py index 09de21502c27..2706d4474515 100644 --- a/deepspeed/runtime/zero/parameter_offload.py +++ b/deepspeed/runtime/zero/parameter_offload.py @@ -341,39 +341,6 @@ def _bwd_hook_unexpected_inputs_msg(value): def _pre_backward_module_hook(module, inputs, output): - if not hasattr(module, "pre_bwd_fn"): - - @instrument_w_nvtx - def _run_before_backward_function(sub_module): - # some models (e.g. Albert) may run multiple forwards on the same layer in a loop - # before doing backwards, so each backward will need a pre-fetch - using reference - # counting to support this scenario - #print(f"COUNTER before: {sub_module.applied_pre_backward_ref_cnt}") - if sub_module.applied_pre_backward_ref_cnt > 0: - self.pre_sub_module_backward_function(sub_module) - sub_module.applied_pre_backward_ref_cnt -= 1 - #print(f"COUNTER after: {sub_module.applied_pre_backward_ref_cnt}") - - class PreBackwardFunctionForModule(torch.autograd.Function): - - @staticmethod - def forward(ctx, outputs): - # Capture `module` and _run_before_backward_function - ctx.module = module - ctx.pre_backward_function = _run_before_backward_function - if not hasattr(ctx.module, "applied_pre_backward_ref_cnt"): - ctx.module.applied_pre_backward_ref_cnt = 0 - ctx.module.applied_pre_backward_ref_cnt += 1 - outputs = outputs.detach() - return outputs - - @staticmethod - def backward(ctx, *args): - ctx.pre_backward_function(ctx.module) - return args - - module.pre_bwd_fn = PreBackwardFunctionForModule - return apply_to_tensors_only(module.pre_bwd_fn.apply, output, warning_msg_fn=_bwd_hook_unexpected_inputs_msg) @@ -402,41 +369,6 @@ def _post_backward_module_hook(module, inputs): if not hasattr(module, "ds_grads_remaining"): module.ds_grads_remaining = 0 - if not hasattr(module, "post_bwd_fn"): - - @instrument_w_nvtx - def _run_after_backward_function(sub_module): - if sub_module.ds_grads_remaining == 0: - self.post_sub_module_backward_function(sub_module) - - class PostBackwardFunctionModule(torch.autograd.Function): - - @staticmethod - def forward(ctx, output): - ctx.module = module - if output.requires_grad: - #TODO SOME TIMES post backward does not seem to be triggered debug in detail - #Should only cause increase in memory not correctness issue - #if output.grad_fn.__class__.__name__ == 'ViewBackward': - # ctx.view=True - # print(f"Warning view tensor for input to module : {module.__class__.__name__}. Backward hooks may not trigger properly") - #assert len(module.parameters(recurse=False)), "The input tensor to the module is a view, and autograd Function or register_hook is not triggered with view tensors." - #if module.ds_grads_remaining == 0: - # print(f"Before Forward: {ctx.module.__class__.__name__}") - module.ds_grads_remaining += 1 - ctx.post_backward_function = _run_after_backward_function - output = output.detach() - return output - - @staticmethod - def backward(ctx, *args): - ctx.module.ds_grads_remaining = ctx.module.ds_grads_remaining - 1 - if ctx.module.ds_grads_remaining == 0: - ctx.post_backward_function(ctx.module) - return args - - module.post_bwd_fn = PostBackwardFunctionModule - return apply_to_tensors_only(module.post_bwd_fn.apply, inputs, warning_msg_fn=_bwd_hook_unexpected_inputs_msg) @@ -448,9 +380,77 @@ def backward(ctx, *args): self.forward_hooks.append(module.register_forward_hook(_post_forward_module_hook)) # Pre backward hook + if not hasattr(module, "pre_bwd_fn"): + + @instrument_w_nvtx + def _run_before_backward_function(sub_module): + # some models (e.g. Albert) may run multiple forwards on the same layer in a loop + # before doing backwards, so each backward will need a pre-fetch - using reference + # counting to support this scenario + #print(f"COUNTER before: {sub_module.applied_pre_backward_ref_cnt}") + if sub_module.applied_pre_backward_ref_cnt > 0: + self.pre_sub_module_backward_function(sub_module) + sub_module.applied_pre_backward_ref_cnt -= 1 + #print(f"COUNTER after: {sub_module.applied_pre_backward_ref_cnt}") + + class PreBackwardFunctionForModule(torch.autograd.Function): + + @staticmethod + def forward(ctx, outputs): + # Capture `module` and _run_before_backward_function + ctx.module = module + ctx.pre_backward_function = _run_before_backward_function + if not hasattr(ctx.module, "applied_pre_backward_ref_cnt"): + ctx.module.applied_pre_backward_ref_cnt = 0 + ctx.module.applied_pre_backward_ref_cnt += 1 + outputs = outputs.detach() + return outputs + + @staticmethod + def backward(ctx, *args): + ctx.pre_backward_function(ctx.module) + return args + + module.pre_bwd_fn = PreBackwardFunctionForModule + self.backward_hooks.append(module.register_forward_hook(_pre_backward_module_hook)) # post backward hook + if not hasattr(module, "post_bwd_fn"): + + @instrument_w_nvtx + def _run_after_backward_function(sub_module): + if sub_module.ds_grads_remaining == 0: + self.post_sub_module_backward_function(sub_module) + + class PostBackwardFunctionModule(torch.autograd.Function): + + @staticmethod + def forward(ctx, output): + ctx.module = module + if output.requires_grad: + #TODO SOME TIMES post backward does not seem to be triggered debug in detail + #Should only cause increase in memory not correctness issue + #if output.grad_fn.__class__.__name__ == 'ViewBackward': + # ctx.view=True + # print(f"Warning view tensor for input to module : {module.__class__.__name__}. Backward hooks may not trigger properly") + #assert len(module.parameters(recurse=False)), "The input tensor to the module is a view, and autograd Function or register_hook is not triggered with view tensors." + #if module.ds_grads_remaining == 0: + # print(f"Before Forward: {ctx.module.__class__.__name__}") + module.ds_grads_remaining += 1 + ctx.post_backward_function = _run_after_backward_function + output = output.detach() + return output + + @staticmethod + def backward(ctx, *args): + ctx.module.ds_grads_remaining = ctx.module.ds_grads_remaining - 1 + if ctx.module.ds_grads_remaining == 0: + ctx.post_backward_function(ctx.module) + return args + + module.post_bwd_fn = PostBackwardFunctionModule + self.backward_hooks.append(module.register_forward_pre_hook(_post_backward_module_hook)) @torch.no_grad() From e4c7931a4e3657baea4aed8f76565da1d0e9392b Mon Sep 17 00:00:00 2001 From: Hongwei Chen <33092912+hwchen2017@users.noreply.github.com> Date: Tue, 4 Mar 2025 08:15:03 -0800 Subject: [PATCH 750/754] Only run pre-commit on the changes (#7106) Run pre-commit on all files may change files that are not part of the current branch. The updated script will only run pre-commit on the files that have been changed in the current branch. Signed-off-by: Hongwei --- CONTRIBUTING.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index e8e160269695..bfc22afb5359 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -13,7 +13,7 @@ pre-commit install Afterwards, our suite of formatting tests run automatically before each `git commit`. You can also run these manually: ```bash -pre-commit run --all-files +pre-commit run --files $(git diff --name-only master) ``` If a formatting test fails, it will fix the modified code in place and abort the `git commit`. After looking over the changes, you can `git add ` From 17c6595442527945e39a2e8a9505982d544eb96d Mon Sep 17 00:00:00 2001 From: Max Kovalenko Date: Tue, 4 Mar 2025 19:16:21 +0200 Subject: [PATCH 751/754] Avoid graph break due to unsupported frozenset (#7105) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit This PR is a continuation of the efforts to improve Deepspeed performance when using PyTorch compile. The `fetch_sub_module()` routine makes use of the `frozenset` which is problematic because: 1. `iter_params` returns an iterable over model parameters 2. `frozenset` wraps this iterable, making it unmodifiable 3. PyTorch’s compilation process cannot infer how `frozenset` interacts with tensors, leading to a graph break. If we replace the `frozenset` with a modifiable `set`, then there is no longer such graph break. Signed-off-by: Max Kovalenko Co-authored-by: Masahiro Tanaka <81312776+tohtana@users.noreply.github.com> Co-authored-by: Olatunji Ruwase --- deepspeed/runtime/zero/partitioned_param_coordinator.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/deepspeed/runtime/zero/partitioned_param_coordinator.py b/deepspeed/runtime/zero/partitioned_param_coordinator.py index d5b5db859e31..3417080b1bea 100644 --- a/deepspeed/runtime/zero/partitioned_param_coordinator.py +++ b/deepspeed/runtime/zero/partitioned_param_coordinator.py @@ -297,7 +297,7 @@ def fetch_sub_module(self, current_submodule: Module, forward: bool) -> None: "inflight": [p.ds_id for p in self.__inflight_param_registry], })) - params_to_fetch = frozenset(iter_params(current_submodule, recurse=z3_leaf_module(current_submodule))) + params_to_fetch = set(iter_params(current_submodule, recurse=z3_leaf_module(current_submodule))) fetch_numel = sum( [p.partition_numel() for p in params_to_fetch if p.ds_status == ZeroParamStatus.NOT_AVAILABLE]) From 71807bceba29736a7e385e958087dc24ebf97b14 Mon Sep 17 00:00:00 2001 From: Yejing-Lai Date: Wed, 5 Mar 2025 05:17:12 +0800 Subject: [PATCH 752/754] Fix fused_qkv print model ValueError (#7109) Suppose qkv_linear_weight_shape = [in_features, out_features]. The qkv linear weight shape is [3, in_features, out_features] if using fued_qkv gemm optimization. It will cause "ValueError: too many values to unpack (expected 2)" issue when printing the model. Solution: Take the last two weight dimensions shapes as in_features and out_features. Signed-off-by: Lai, Yejing Co-authored-by: Hongwei Chen <33092912+hwchen2017@users.noreply.github.com> Co-authored-by: Logan Adams <114770087+loadams@users.noreply.github.com> --- deepspeed/module_inject/layers.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/deepspeed/module_inject/layers.py b/deepspeed/module_inject/layers.py index 5087d71a3d62..0c673225a732 100644 --- a/deepspeed/module_inject/layers.py +++ b/deepspeed/module_inject/layers.py @@ -229,7 +229,7 @@ def __deepcopy__(self, memo): def extra_repr(self): if self.weight is not None: - out_features, in_features = self.weight.shape if self.weight is not None else (None, None) + out_features, in_features = self.weight.shape[-2:] if self.weight is not None else (None, None) dtype = self.weight.dtype if self.weight is not None else None extra_repr_str = "in_features={}, out_features={}, bias={}, dtype={}".format( in_features, out_features, self.bias is not None, dtype) From c2c81993948fc28385542196c8544fb442017987 Mon Sep 17 00:00:00 2001 From: Logan Adams <114770087+loadams@users.noreply.github.com> Date: Tue, 4 Mar 2025 15:22:38 -0800 Subject: [PATCH 753/754] Update references to new X/Twitter handle (#7110) As a part of joining the Linux Foundation AI&Data it makes sense to rename the X/Twitter accounts associated with DeepSpeed. --------- Signed-off-by: Logan Adams --- README.md | 4 ++-- blogs/deepspeed-chat/README.md | 2 +- blogs/deepspeed-chat/chinese/README.md | 2 +- blogs/deepspeed-chat/ds-chat-release-8-31/README.md | 2 +- blogs/deepspeed-chat/japanese/README.md | 2 +- blogs/deepspeed-fastgen/2024-01-19/README.md | 2 +- blogs/deepspeed-fastgen/README.md | 2 +- blogs/deepspeed-fastgen/chinese/README.md | 2 +- blogs/deepspeed-fastgen/japanese/README.md | 2 +- blogs/deepspeed-fp6/03-05-2024/README-Chinese.md | 2 +- blogs/deepspeed-fp6/03-05-2024/README.md | 2 +- blogs/deepspeed-ucp/README.md | 4 ++-- blogs/deepspeed-ucp/chinese/README.md | 2 +- blogs/deepspeed-ucp/japanese/README.md | 2 +- blogs/deepspeed-ulysses/README.md | 2 +- blogs/deepspeed-ulysses/chinese/README.md | 2 +- blogs/deepspeed-ulysses/japanese/README.md | 2 +- blogs/deepspeed-visualchat/10-03-2023/README-Chinese.md | 2 +- blogs/deepspeed-visualchat/10-03-2023/README-Japanese.md | 2 +- blogs/deepspeed-visualchat/10-03-2023/README.md | 2 +- blogs/ulysses-offload/README.md | 4 ++-- blogs/zeropp/chinese/README.md | 2 +- blogs/zeropp/japanese/README.md | 2 +- 23 files changed, 26 insertions(+), 26 deletions(-) diff --git a/README.md b/README.md index a812779f0fcc..6922e55b4144 100755 --- a/README.md +++ b/README.md @@ -3,8 +3,8 @@ [![Downloads](https://static.pepy.tech/badge/deepspeed)](https://pepy.tech/project/deepspeed) [![Build](https://badgen.net/badge/build/check-status/blue)](#build-pipeline-status) [![OpenSSF Best Practices](https://www.bestpractices.dev/projects/9530/badge)](https://www.bestpractices.dev/projects/9530) -[![Twitter](https://img.shields.io/twitter/follow/MSFTDeepSpeed)](https://twitter.com/intent/follow?screen_name=MSFTDeepSpeed) -[![Japanese Twitter](https://img.shields.io/badge/%E6%97%A5%E6%9C%AC%E8%AA%9ETwitter-%40MSFTDeepSpeedJP-blue)](https://twitter.com/MSFTDeepSpeedJP) +[![Twitter](https://img.shields.io/twitter/follow/DeepSpeedAI)](https://twitter.com/intent/follow?screen_name=DeepSpeedAI) +[![Japanese Twitter](https://img.shields.io/badge/%E6%97%A5%E6%9C%AC%E8%AA%9ETwitter-%40DeepSpeedAI_JP-blue)](https://twitter.com/DeepSpeedAI_JP) [![Chinese Zhihu](https://img.shields.io/badge/%E7%9F%A5%E4%B9%8E-%E5%BE%AE%E8%BD%AFDeepSpeed-blue)](https://www.zhihu.com/people/deepspeed) diff --git a/blogs/deepspeed-chat/README.md b/blogs/deepspeed-chat/README.md index 3ed8b284940a..66fa9930b299 100644 --- a/blogs/deepspeed-chat/README.md +++ b/blogs/deepspeed-chat/README.md @@ -327,6 +327,6 @@ We are very excited to share that DeepSpeed-Chat is now open-sourced and availab DeepSpeed-Chat is part of the bigger DeepSpeed ecosystem comprising a multitude of Deep Learning systems and modeling technologies. To learn more, * Please visit our [website](https://www.deepspeed.ai/) for detailed blog posts, tutorials, and helpful documentation. -* You can also follow us on our [English Twitter](https://twitter.com/MSFTDeepSpeed), [Japanese Twitter](https://twitter.com/MSFTDeepSpeedJP), and [Chinese Zhihu](https://www.zhihu.com/people/deepspeed) for latest news on DeepSpeed. +* You can also follow us on our [English Twitter](https://twitter.com/DeepSpeedAI), [Japanese Twitter](https://twitter.com/DeepSpeedAI_JP), and [Chinese Zhihu](https://www.zhihu.com/people/deepspeed) for latest news on DeepSpeed. DeepSpeed welcomes your contributions! We encourage you to report issues, contribute PRs, and join discussions on the [DeepSpeed GitHub](https://github.com/deepspeedai/DeepSpeed/) page. Please see our [contributing guide](https://github.com/deepspeedai/DeepSpeed/blob/master/CONTRIBUTING.md) for more details. We are open to collaborations with universities, research labs, companies, such as those working together on deep learning research, applying DeepSpeed to empower real-world AI models and applications, and so on. For such requests (and other requests unsuitable for GitHub), please directly email to deepspeed-info@microsoft.com. diff --git a/blogs/deepspeed-chat/chinese/README.md b/blogs/deepspeed-chat/chinese/README.md index 4ec29c6811e5..64c7822e021d 100644 --- a/blogs/deepspeed-chat/chinese/README.md +++ b/blogs/deepspeed-chat/chinese/README.md @@ -319,7 +319,7 @@ DeepSpeed-HE 的核心技术基于 ZeRO,用于训练过程中将模型状态 DeepSpeed-Chat 是更大的DeepSpeed生态系统的一部分,包括众多深度学习系统和建模技术。要了解更多信息, * 请访问我们的[网站](https://www.deepspeed.ai/),了解详细的博客文章、教程和有用的文档。 -* 我们会在[知乎](https://www.zhihu.com/people/deepspeed)上发布最新中文博客及动态。你还可以关注我们的[英文 Twitter](https://twitter.com/MSFTDeepSpeed) 和[日文 Twitter](https://twitter.com/MSFTDeepSpeedJP)。 +* 我们会在[知乎](https://www.zhihu.com/people/deepspeed)上发布最新中文博客及动态。你还可以关注我们的[英文 Twitter](https://twitter.com/DeepSpeedAI) 和[日文 Twitter](https://twitter.com/DeepSpeedAI_JP)。 DeepSpeed 欢迎你的贡献!我们鼓励你在 [DeepSpeed GitHub](https://github.com/deepspeedai/DeepSpeed/) 页面报告问题、贡献 PR 并参与讨论。请参阅我们的[贡献指南](https://github.com/deepspeedai/DeepSpeed/blob/master/CONTRIBUTING.md)了解更多详情。我们愿意与大学、研究实验室、公司等进行合作,共同开展深度学习研究,将 DeepSpeed 应用于赋能现实世界的 AI 模型和应用等。对于此类需求(以及其他不适合在 GitHub 上提出的需求),请直接发送电子邮件至 deepspeed-info@microsoft.com。 diff --git a/blogs/deepspeed-chat/ds-chat-release-8-31/README.md b/blogs/deepspeed-chat/ds-chat-release-8-31/README.md index 828a77aa8431..2b1ffbe73ae3 100644 --- a/blogs/deepspeed-chat/ds-chat-release-8-31/README.md +++ b/blogs/deepspeed-chat/ds-chat-release-8-31/README.md @@ -345,7 +345,7 @@ We are very excited to share this DeepSpeed-Chat feature and stability release. DeepSpeed-Chat is part of the bigger DeepSpeed ecosystem comprising of a multitude of Deep Learning systems and modeling technologies. To learn more, * Please visit our [website](https://www.deepspeed.ai/) for detailed blog posts, tutorials, and helpful documentation. -* You can also follow us on our [English Twitter](https://twitter.com/MSFTDeepSpeed), [Japanese Twitter](https://twitter.com/MSFTDeepSpeedJP), and [Chinese Zhihu](https://www.zhihu.com/people/deepspeed) for latest news on DeepSpeed. +* You can also follow us on our [English Twitter](https://twitter.com/DeepSpeedAI), [Japanese Twitter](https://twitter.com/DeepSpeedAI_JP), and [Chinese Zhihu](https://www.zhihu.com/people/deepspeed) for latest news on DeepSpeed. DeepSpeed welcomes your contributions! We encourage you to report issues, contribute PRs, and join discussions on the [DeepSpeed GitHub](https://github.com/deepspeedai/DeepSpeed/) page. Please see our [contributing guide](https://github.com/deepspeedai/DeepSpeed/blob/master/CONTRIBUTING.md) for more details. We are open to collaborations with universities, research labs, companies, such as those working together on deep learning research, applying DeepSpeed to empower real-world AI models and applications, and so on. For such requests (and other requests unsuitable for GitHub), please directly email to deepspeed-info@microsoft.com. diff --git a/blogs/deepspeed-chat/japanese/README.md b/blogs/deepspeed-chat/japanese/README.md index 7bcbb61d630c..daa9b387de28 100644 --- a/blogs/deepspeed-chat/japanese/README.md +++ b/blogs/deepspeed-chat/japanese/README.md @@ -337,7 +337,7 @@ DeepSpeedは、Microsoftの[AI at Scale initiative](https://www.microsoft.com/en DeepSpeedについてのより詳しい情報は、以下をご覧ください。 * [DeepSpeedのWebサイト](https://www.deepspeed.ai/) には、DeepSpeedの技術に関する詳細なブログ記事、チュートリアル、ドキュメントなどが掲載されています。 -* [DeepSpeedのTwitterアカウント (英語)](https://twitter.com/MSFTDeepSpeed) では、DeepSpeedの最新情報を発信していますので、ぜひフォローください。[日本語版のTwitterアカウント](https://twitter.com/MSFTDeepSpeedJP)もあり、最新の情報を日本語で発信しています。 +* [DeepSpeedのTwitterアカウント (英語)](https://twitter.com/DeepSpeedAI) では、DeepSpeedの最新情報を発信していますので、ぜひフォローください。[日本語版のTwitterアカウント](https://twitter.com/DeepSpeedAI_JP)もあり、最新の情報を日本語で発信しています。 DeepSpeedチームは、ユーザの方々からのフィードバックやご連絡を受け付けています。 diff --git a/blogs/deepspeed-fastgen/2024-01-19/README.md b/blogs/deepspeed-fastgen/2024-01-19/README.md index 108f3af23d45..06650d8473a1 100644 --- a/blogs/deepspeed-fastgen/2024-01-19/README.md +++ b/blogs/deepspeed-fastgen/2024-01-19/README.md @@ -176,7 +176,7 @@ We are very excited to share this DeepSpeed-FastGen release. DeepSpeed-FastGen is part of the bigger DeepSpeed ecosystem comprising a multitude of Deep Learning systems and modeling technologies. To learn more, * Please visit our [website](https://www.deepspeed.ai/) for detailed blog posts, tutorials, and helpful documentation. -* You can also follow us on our [English Twitter](https://twitter.com/MSFTDeepSpeed), [Japanese Twitter](https://twitter.com/MSFTDeepSpeedJP), and [Chinese Zhihu](https://www.zhihu.com/people/deepspeed) for latest news on DeepSpeed. +* You can also follow us on our [English Twitter](https://twitter.com/DeepSpeedAI), [Japanese Twitter](https://twitter.com/DeepSpeedAI_JP), and [Chinese Zhihu](https://www.zhihu.com/people/deepspeed) for latest news on DeepSpeed. The following items are on our roadmap and we plan to engage with our community on these through our GitHub issues and PRs: diff --git a/blogs/deepspeed-fastgen/README.md b/blogs/deepspeed-fastgen/README.md index 2a5f547fb6bd..4217e5d4a996 100644 --- a/blogs/deepspeed-fastgen/README.md +++ b/blogs/deepspeed-fastgen/README.md @@ -291,7 +291,7 @@ We are very excited to share this DeepSpeed-FastGen alpha release. DeepSpeed-FastGen is part of the bigger DeepSpeed ecosystem comprising a multitude of Deep Learning systems and modeling technologies. To learn more, * Please visit our [website](https://www.deepspeed.ai/) for detailed blog posts, tutorials, and helpful documentation. -* You can also follow us on our [English Twitter](https://twitter.com/MSFTDeepSpeed), [Japanese Twitter](https://twitter.com/MSFTDeepSpeedJP), and [Chinese Zhihu](https://www.zhihu.com/people/deepspeed) for latest news on DeepSpeed. +* You can also follow us on our [English Twitter](https://twitter.com/DeepSpeedAI), [Japanese Twitter](https://twitter.com/DeepSpeedAI_JP), and [Chinese Zhihu](https://www.zhihu.com/people/deepspeed) for latest news on DeepSpeed. DeepSpeed welcomes your contributions! We encourage you to report issues, contribute PRs, and join discussions on the [DeepSpeed GitHub](https://github.com/deepspeedai/DeepSpeed/) page. Please see our [contributing guide](https://github.com/deepspeedai/DeepSpeed/blob/master/CONTRIBUTING.md) for more details. We are open to collaborations with universities, research labs, and companies, such as those working together on deep learning research, applying DeepSpeed to empower real-world AI models and applications, and so on. For such requests (and other requests unsuitable for GitHub), please directly email to deepspeed-info@microsoft.com. diff --git a/blogs/deepspeed-fastgen/chinese/README.md b/blogs/deepspeed-fastgen/chinese/README.md index 357c70ca39eb..2885799912ae 100644 --- a/blogs/deepspeed-fastgen/chinese/README.md +++ b/blogs/deepspeed-fastgen/chinese/README.md @@ -285,7 +285,7 @@ client.terminate_server() DeepSpeed-FastGen 是更大的 DeepSpeed 生态系统的一部分,该生态系统包含了多种深度学习系统和建模技术。要了解更多, * 请访问我们的[网站](https://www.deepspeed.ai/),详细查看博客文章、教程和有用的文档。 -* 您也可以通过我们的[英文 Twitter](https://twitter.com/MSFTDeepSpeed)、[日本 Twitter](https://twitter.com/MSFTDeepSpeedJP) 和[中文知乎](https://www.zhihu.com/people/deepspeed) 关注我们,以获取 DeepSpeed 的最新消息。 +* 您也可以通过我们的[英文 Twitter](https://twitter.com/DeepSpeedAI)、[日本 Twitter](https://twitter.com/DeepSpeedAI_JP) 和[中文知乎](https://www.zhihu.com/people/deepspeed) 关注我们,以获取 DeepSpeed 的最新消息。 DeepSpeed 欢迎您的贡献!我们鼓励您在 [DeepSpeed GitHub](https://github.com/deepspeedai/DeepSpeed/) 页面上报告问题、贡献 PR,并参与讨论。有关更多详细信息,请参见我们的[贡献指南](https://github.com/deepspeedai/DeepSpeed/blob/master/CONTRIBUTING.md)。我们愿意与大学、研究实验室和公司合作,比如那些在深度学习研究上共同工作,应用 DeepSpeed 来赋能真实世界的 AI 模型和应用等。对于那些不适合在 GitHub 上提出的请求(以及其他请求),请直接发送电子邮件至 deepspeed-info@microsoft.com。 diff --git a/blogs/deepspeed-fastgen/japanese/README.md b/blogs/deepspeed-fastgen/japanese/README.md index 5e7c59893d84..2ce25e62c551 100644 --- a/blogs/deepspeed-fastgen/japanese/README.md +++ b/blogs/deepspeed-fastgen/japanese/README.md @@ -296,7 +296,7 @@ DeepSpeed-FastGenでは、このコンパイル時間を大幅に短縮し、利 DeepSpeed-FastGenは、Deep Learningシステムやモデリングテクノロジーを数多く含む、より大きなDeepSpeedエコシステムの一部です。さらに詳しい情報が必要な方は、 [詳細なブログ記事]、チュートリアル、役立つドキュメントがある私たちの [ウェブサイト](https://www.deepspeed.ai/) をご覧ください。 -DeepSpeedの最新情報については、[英語のTwitter](https://twitter.com/MSFTDeepSpeed)、[日本語のTwitter](https://twitter.com/MSFTDeepSpeedJP)、[中国語の知乎](https://www.zhihu.com/people/deepspeed)をフォローしてください。 +DeepSpeedの最新情報については、[英語のTwitter](https://twitter.com/DeepSpeedAI)、[日本語のTwitter](https://twitter.com/DeepSpeedAI_JP)、[中国語の知乎](https://www.zhihu.com/people/deepspeed)をフォローしてください。 DeepSpeedは、皆様の開発への参加を歓迎しています。DeepSpeedのGitHubページで、バグ報告、Pull Request、ディスカッションへの参加が可能です。詳細は[ガイドライン](https://github.com/deepspeedai/DeepSpeed/blob/master/CONTRIBUTING.md)をご覧ください。[contributing guide](https://github.com/deepspeedai/DeepSpeed/blob/master/CONTRIBUTING.md) にはより詳細な情報があります。 また、深層学習の研究や、実世界のAIモデルやアプリケーションへのDeepSpeedの適用に取り組む大学、研究所、企業とのコラボレーションも行っています。こうしたコラボレーションについてのご要望(およびGitHubには適さないその他の話題)については まで直接メールをお送りください。 diff --git a/blogs/deepspeed-fp6/03-05-2024/README-Chinese.md b/blogs/deepspeed-fp6/03-05-2024/README-Chinese.md index 017e7c9ab4d8..a880836ea2e2 100644 --- a/blogs/deepspeed-fp6/03-05-2024/README-Chinese.md +++ b/blogs/deepspeed-fp6/03-05-2024/README-Chinese.md @@ -119,7 +119,7 @@ https://github.com/deepspeedai/DeepSpeedExamples/blob/master/benchmarks/inferenc 我们的DeepSpeed-FP6目前仅支持线性GEMM。我们期待未来能够支持MoE GEMM。我们将继续根据您的反馈和支持改进DeepSpeed-FP6。DeepSpeed-FP6是更大DeepSpeed生态系统的一部分,包括一系列深度学习系统和建模技术。要了解更多, * 请访问我们的 [网站](https://www.deepspeed.ai/) 了解详细的博客文章、教程和文档。 -* 在我们的 [英文 X(Twitter)](https://twitter.com/MSFTDeepSpeed)、[日语 X(Twitter)](https://twitter.com/MSFTDeepSpeedJP) 和 [中文知乎](https://www.zhihu.com/people/deepspeed) 上关注我们,以获取 DeepSpeed 的最新消息。 +* 在我们的 [英文 X(Twitter)](https://twitter.com/DeepSpeedAI)、[日语 X(Twitter)](https://twitter.com/DeepSpeedAI_JP) 和 [中文知乎](https://www.zhihu.com/people/deepspeed) 上关注我们,以获取 DeepSpeed 的最新消息。 我们欢迎您为 DeepSpeed 做出贡献!我们鼓励您报告问题、贡献 PRs、并在 [DeepSpeed GitHub](https://github.com/deepspeedai/DeepSpeed/) 页面上参加讨论。有关更多详细信息,请查看我们的 [贡献指南](https://github.com/deepspeedai/DeepSpeed/blob/master/CONTRIBUTING.md)。我们对与大学、研究实验室、公司等进行合作持开放态度,例如共同进行深度学习研究、应用 DeepSpeed 为现实世界的 AI 模型和应用提供支持等等。对于此类请求(以及其他不适合 GitHub 的请求),请直接发送电子邮件至 deepspeed-info@microsoft.com。 diff --git a/blogs/deepspeed-fp6/03-05-2024/README.md b/blogs/deepspeed-fp6/03-05-2024/README.md index 5f5b4700e403..9455938d38fc 100755 --- a/blogs/deepspeed-fp6/03-05-2024/README.md +++ b/blogs/deepspeed-fp6/03-05-2024/README.md @@ -120,7 +120,7 @@ Please also visit the [FP6-LLM github](https://github.com/usyd-fsalab/fp6_llm) f Currently, DeepSpeed-FP6 supports only dense models with MoE models support upcoming. We will continue to improve DeepSpeed-FP6 with your feedback and support. DeepSpeed-FP6 is a component of the larger DeepSpeed ecosystem, which includes a range of Deep Learning systems and modeling technologies. To learn more, * Please visit our [website](https://www.deepspeed.ai/) for detailed blog posts, tutorials, and helpful documentation. -* Follow us on our [English X(Twitter)](https://twitter.com/MSFTDeepSpeed), [Japanese X(Twitter)](https://twitter.com/MSFTDeepSpeedJP), and [Chinese Zhihu](https://www.zhihu.com/people/deepspeed) for latest news on DeepSpeed. +* Follow us on our [English X(Twitter)](https://twitter.com/DeepSpeedAI), [Japanese X(Twitter)](https://twitter.com/DeepSpeedAI_JP), and [Chinese Zhihu](https://www.zhihu.com/people/deepspeed) for latest news on DeepSpeed. We welcome your contributions to DeepSpeed! We encourage you to report issues, contribute PRs, and join discussions on the [DeepSpeed GitHub](https://github.com/deepspeedai/DeepSpeed/) page. Please see our [contributing guide](https://github.com/deepspeedai/DeepSpeed/blob/master/CONTRIBUTING.md) for more details. We are open to collaborations with universities, research labs, companies, such as those working together on deep learning research, applying DeepSpeed to empower real-world AI models and applications, and so on. For such requests (and other requests unsuitable for GitHub), please directly email to deepspeed-info@microsoft.com. diff --git a/blogs/deepspeed-ucp/README.md b/blogs/deepspeed-ucp/README.md index f8b5c6fb87e7..3420e72c238e 100644 --- a/blogs/deepspeed-ucp/README.md +++ b/blogs/deepspeed-ucp/README.md @@ -255,8 +255,8 @@ community. DeepSpeed Universal Checkpoint is part of the bigger DeepSpeed ecosystem of large-scale AI training and inference. For more details on all DeepSpeed technologies and innovations, please visit our [website]((https://www.deepspeed.ai/)) and follow us -on X, formerly Twitter, ([English](https://twitter.com/MSFTDeepSpeed), -[Japanese](https://twitter.com/MSFTDeepSpeedJP)) +on X, formerly Twitter, ([English](https://twitter.com/DeepSpeedAI), +[Japanese](https://twitter.com/DeepSpeedAI_JP)) and [Chinese Zhihu](https://www.zhihu.com/people/deepspeed). # Acknowledgements and Contributions diff --git a/blogs/deepspeed-ucp/chinese/README.md b/blogs/deepspeed-ucp/chinese/README.md index 062063de92df..4260595671dc 100644 --- a/blogs/deepspeed-ucp/chinese/README.md +++ b/blogs/deepspeed-ucp/chinese/README.md @@ -109,7 +109,7 @@ alt="A graph of training step Description automatically generated" /> 我们很高兴发布DeepSpeed通用检查点。DeepSpeed通用检查点已与Megatron-DeepSpeed的重构版本完全集成,并可通过DeepSpeed和Megatron-DeepSpeed的GitHub仓库访问。详细的使用教程可在[DeepSpeed教程页面](https://www.deepspeed.ai/tutorials/universal-checkpointing/)上找到。 -我们欢迎来自更广泛开源社区的贡献和合作。DeepSpeed通用检查点是大规模AI训练和推理DeepSpeed生态系统的一部分。有关所有DeepSpeed技术和创新的更多详细信息,请访问我们的[网站](https://www.deepspeed.ai/)并在X(前Twitter)([英文](https://twitter.com/MSFTDeepSpeed),[日文](https://twitter.com/MSFTDeepSpeedJP))和[中文知乎](https://www.zhihu.com/people/deepspeed)上关注我们。 +我们欢迎来自更广泛开源社区的贡献和合作。DeepSpeed通用检查点是大规模AI训练和推理DeepSpeed生态系统的一部分。有关所有DeepSpeed技术和创新的更多详细信息,请访问我们的[网站](https://www.deepspeed.ai/)并在X(前Twitter)([英文](https://twitter.com/DeepSpeedAI),[日文](https://twitter.com/DeepSpeedAI_JP))和[中文知乎](https://www.zhihu.com/people/deepspeed)上关注我们。 # 致谢和贡献 我们感谢伊利诺伊大学厄巴纳-香槟分校、Statosphere和英特尔Habana的合作。 diff --git a/blogs/deepspeed-ucp/japanese/README.md b/blogs/deepspeed-ucp/japanese/README.md index 7e3c3161a1b5..24da72298dd8 100644 --- a/blogs/deepspeed-ucp/japanese/README.md +++ b/blogs/deepspeed-ucp/japanese/README.md @@ -100,7 +100,7 @@ DeepSpeed *UCP*における中心的な考え方は、チェックポイント DeepSpeed Universal Checkpointは、リベースされたMegatron-DeepSpeedバージョンに完全に統合されており、DeepSpeedおよびMegatron-DeepSpeedのGitHubリポジトリを通じてアクセスできます。使用に関する詳細なチュートリアルは、[DeepSpeedチュートリアルページ](https://www.deepspeed.ai/tutorials/universal-checkpointing/)にあります。 -DeepSpeedでは、広範なオープンソースコミュニティからの貢献とコラボレーションを受け入れています。DeepSpeed Universal Checkpointは、大規模AIトレーニングおよび推論のためのDeepSpeedエコシステムの一部です。すべてのDeepSpeed技術とイノベーションについての詳細は、[ウェブサイト](https://www.deepspeed.ai/)をご覧いただき、X(旧Twitter)での[英語](https://twitter.com/MSFTDeepSpeed)、[日本語](https://twitter.com/MSFTDeepSpeedJP)、および[中国のZhihu](https://www.zhihu.com/people/deepspeed)をフォローしてください。 +DeepSpeedでは、広範なオープンソースコミュニティからの貢献とコラボレーションを受け入れています。DeepSpeed Universal Checkpointは、大規模AIトレーニングおよび推論のためのDeepSpeedエコシステムの一部です。すべてのDeepSpeed技術とイノベーションについての詳細は、[ウェブサイト](https://www.deepspeed.ai/)をご覧いただき、X(旧Twitter)での[英語](https://twitter.com/DeepSpeedAI)、[日本語](https://twitter.com/DeepSpeedAI_JP)、および[中国のZhihu](https://www.zhihu.com/people/deepspeed)をフォローしてください。 # 謝辞と貢献 diff --git a/blogs/deepspeed-ulysses/README.md b/blogs/deepspeed-ulysses/README.md index 8ed573916ff4..ed377fec1039 100644 --- a/blogs/deepspeed-ulysses/README.md +++ b/blogs/deepspeed-ulysses/README.md @@ -362,7 +362,7 @@ on what is possible when long context window is no longer a limitation. DeepSpeed-Ulysses is part of the bigger DeepSpeed ecosystem of large-scale AI training and inference. For more details on all DeepSpeed technologies and innovations, please visit our [website]((https://www.deepspeed.ai/)) and follow us -on X, formerly Twitter, ([English](https://twitter.com/MSFTDeepSpeed), [Japanese](https://twitter.com/MSFTDeepSpeedJP)) and [Chinese Zhihu](https://www.zhihu.com/people/deepspeed). +on X, formerly Twitter, ([English](https://twitter.com/DeepSpeedAI), [Japanese](https://twitter.com/DeepSpeedAI_JP)) and [Chinese Zhihu](https://www.zhihu.com/people/deepspeed). We are open to collaborations with universities, research labs, and companies. For such requests (and other requests unsuitable for GitHub), diff --git a/blogs/deepspeed-ulysses/chinese/README.md b/blogs/deepspeed-ulysses/chinese/README.md index 20af8b91fbea..7ba941214cf4 100644 --- a/blogs/deepspeed-ulysses/chinese/README.md +++ b/blogs/deepspeed-ulysses/chinese/README.md @@ -150,6 +150,6 @@ DeepSpeed-Ulysses已经完全与Megatron-DeepSpeed代码库集成并经过测试 我们很高兴宣布推出DeepSpeed-Ulysses,您可以通过DeepSpeed GitHub获取代码。详细的使用教程在[DeepSpeed教程页面](https://www.deepspeed.ai/tutorials/ds-sequence/)上提供。 -我们欢迎各种形式的贡献和合作,以共同推动当长上下文窗口不再是限制时的各种创新。DeepSpeed-Ulysses是大规模AI训练和推理的更大DeepSpeed生态系统的一部分。有关所有DeepSpeed技术和创新的更多细节,请访问我们的[网站]((https://www.deepspeed.ai/)),并关注我们在X(Twitter)上的帐号([英文](https://twitter.com/MSFTDeepSpeed),[日文](https://twitter.com/MSFTDeepSpeedJP))和[中文知乎](https://www.zhihu.com/people/deepspeed)。 +我们欢迎各种形式的贡献和合作,以共同推动当长上下文窗口不再是限制时的各种创新。DeepSpeed-Ulysses是大规模AI训练和推理的更大DeepSpeed生态系统的一部分。有关所有DeepSpeed技术和创新的更多细节,请访问我们的[网站]((https://www.deepspeed.ai/)),并关注我们在X(Twitter)上的帐号([英文](https://twitter.com/DeepSpeedAI),[日文](https://twitter.com/DeepSpeedAI_JP))和[中文知乎](https://www.zhihu.com/people/deepspeed)。 我们愿意与大学、研究实验室和公司合作。有关此类请求(以及不适合在GitHub上提出的其他请求),请直接发送电子邮件至。 diff --git a/blogs/deepspeed-ulysses/japanese/README.md b/blogs/deepspeed-ulysses/japanese/README.md index 1d9ed1e3a1d2..ca847cd07ada 100644 --- a/blogs/deepspeed-ulysses/japanese/README.md +++ b/blogs/deepspeed-ulysses/japanese/README.md @@ -153,6 +153,6 @@ dist_attn = DistributedAttention(attn, get_sequence_parallel_group()) DeepSpeed-Ulyssesは、DeepSpeedのGitHubを通じてアクセス可能です。使用方法に関する詳しいチュートリアルは、[DeepSpeedのチュートリアルページ ](https://www.deepspeed.ai/tutorials/ds-sequence/)にあります。 -長いコンテキストを扱う際の制約を取り除くことによって何が可能になるのか、ユーザの皆様と共に様々な可能性を探求するため、幅広い協力やコラボレーションを歓迎します。DeepSpeed-Ulyssesは、大規模なAIの訓練と推論のためのより大きなDeepSpeedエコシステムの一部です。DeepSpeedの多くの技術や革新的な機能の詳細については、[ウェブサイト](https://www.deepspeed.ai/)をご覧いただくか、X(以前のTwitter。[英語版](https://twitter.com/MSFTDeepSpeed)、[日本語版](https://twitter.com/MSFTDeepSpeedJP))や、中国の[Zhihu](https://www.zhihu.com/people/deepspeed)でフォローしてください。 +長いコンテキストを扱う際の制約を取り除くことによって何が可能になるのか、ユーザの皆様と共に様々な可能性を探求するため、幅広い協力やコラボレーションを歓迎します。DeepSpeed-Ulyssesは、大規模なAIの訓練と推論のためのより大きなDeepSpeedエコシステムの一部です。DeepSpeedの多くの技術や革新的な機能の詳細については、[ウェブサイト](https://www.deepspeed.ai/)をご覧いただくか、X(以前のTwitter。[英語版](https://twitter.com/DeepSpeedAI)、[日本語版](https://twitter.com/DeepSpeedAI_JP))や、中国の[Zhihu](https://www.zhihu.com/people/deepspeed)でフォローしてください。 DeepSpeedは、皆様の開発への参加を歓迎しています。DeepSpeedのGitHubページで、バグ報告、Pull Request、ディスカッションへの参加が可能です。詳細は[ガイドライン](https://github.com/deepspeedai/DeepSpeed/blob/master/CONTRIBUTING.md)をご覧ください。また、大学、研究所、企業とのコラボレーションも行っています。こうしたコラボレーションについてのご要望(およびGitHubには適さないその他の話題)については まで直接メールをお送りください。 diff --git a/blogs/deepspeed-visualchat/10-03-2023/README-Chinese.md b/blogs/deepspeed-visualchat/10-03-2023/README-Chinese.md index d4cba8b46560..d4cc268fbe89 100644 --- a/blogs/deepspeed-visualchat/10-03-2023/README-Chinese.md +++ b/blogs/deepspeed-visualchat/10-03-2023/README-Chinese.md @@ -174,7 +174,7 @@ bash chat_scripts/run.sh # You need to change necessary variables, e.g, ckpt pat DeepSpeed-VisualChat 是更大的 DeepSpeed 生态系统的一部分,其中包括一系列深度学习系统和建模技术。要了解更多信息, * 请访问我们的 [网站](https://www.deepspeed.ai/) 了解详细的博客文章、教程和文档。 -* 在我们的 [英文 X(Twitter)](https://twitter.com/MSFTDeepSpeed)、[日语 X(Twitter)](https://twitter.com/MSFTDeepSpeedJP) 和 [中文知乎](https://www.zhihu.com/people/deepspeed) 上关注我们,以获取 DeepSpeed 的最新消息。 +* 在我们的 [英文 X(Twitter)](https://twitter.com/DeepSpeedAI)、[日语 X(Twitter)](https://twitter.com/DeepSpeedAI_JP) 和 [中文知乎](https://www.zhihu.com/people/deepspeed) 上关注我们,以获取 DeepSpeed 的最新消息。 我们欢迎您为 DeepSpeed 做出贡献!我们鼓励您报告问题、贡献 PRs、并在 [DeepSpeed GitHub](https://github.com/deepspeedai/DeepSpeed/) 页面上参加讨论。有关更多详细信息,请查看我们的 [贡献指南](https://github.com/deepspeedai/DeepSpeed/blob/master/CONTRIBUTING.md)。我们对与大学、研究实验室、公司等进行合作持开放态度,例如共同进行深度学习研究、应用 DeepSpeed 为现实世界的 AI 模型和应用提供支持等等。对于此类请求(以及其他不适合 GitHub 的请求),请直接发送电子邮件至 deepspeed-info@microsoft.com。 diff --git a/blogs/deepspeed-visualchat/10-03-2023/README-Japanese.md b/blogs/deepspeed-visualchat/10-03-2023/README-Japanese.md index b6c12787778c..4697c15f2bb3 100755 --- a/blogs/deepspeed-visualchat/10-03-2023/README-Japanese.md +++ b/blogs/deepspeed-visualchat/10-03-2023/README-Japanese.md @@ -181,7 +181,7 @@ DeepSpeed-VisualChatがオープンソース化され、AIコミュニティで DeepSpeed-VisualChatは、さまざまなDeep Learningシステムやモデリング技術を含む、より大きなDeepSpeedエコシステムの一部です。詳細については、以下をご覧ください。 * 私たちの[ウェブサイト](https://www.deepspeed.ai/)で、詳細なブログ記事、チュートリアル、役立つドキュメントを提供しています。 -* DeepSpeedの最新ニュースは、[English X(Twitter)](https://twitter.com/MSFTDeepSpeed)、[Japanese X(Twitter)](https://twitter.com/MSFTDeepSpeedJP)、[Chinese Zhihu](https://www.zhihu.com/people/deepspeed)をフォローしてください。 +* DeepSpeedの最新ニュースは、[English X(Twitter)](https://twitter.com/DeepSpeedAI)、[Japanese X(Twitter)](https://twitter.com/DeepSpeedAI_JP)、[Chinese Zhihu](https://www.zhihu.com/people/deepspeed)をフォローしてください。 DeepSpeedは、皆様の開発への参加を歓迎しています。DeepSpeedのGitHubページで、バグ報告、Pull Request、ディスカッションへの参加が可能です。詳細は[ガイドライン](https://github.com/deepspeedai/DeepSpeed/blob/master/CONTRIBUTING.md)をご覧ください。また、大学、研究所、企業とのコラボレーションも行っています。こうしたコラボレーションについてのご要望(およびGitHubには適さないその他の話題)については まで直接メールをお送りください。 diff --git a/blogs/deepspeed-visualchat/10-03-2023/README.md b/blogs/deepspeed-visualchat/10-03-2023/README.md index b2bbb08de50e..ce354fd10812 100755 --- a/blogs/deepspeed-visualchat/10-03-2023/README.md +++ b/blogs/deepspeed-visualchat/10-03-2023/README.md @@ -181,7 +181,7 @@ We are very excited to share that DeepSpeed-VisualChat is now open-sourced and a DeepSpeed-VisualChat is a component of the larger DeepSpeed ecosystem, which includes a range of Deep Learning systems and modeling technologies. To learn more, * Please visit our [website](https://www.deepspeed.ai/) for detailed blog posts, tutorials, and helpful documentation. -* Follow us on our [English X(Twitter)](https://twitter.com/MSFTDeepSpeed), [Japanese X(Twitter)](https://twitter.com/MSFTDeepSpeedJP), and [Chinese Zhihu](https://www.zhihu.com/people/deepspeed) for latest news on DeepSpeed. +* Follow us on our [English X(Twitter)](https://twitter.com/DeepSpeedAI), [Japanese X(Twitter)](https://twitter.com/DeepSpeedAI_JP), and [Chinese Zhihu](https://www.zhihu.com/people/deepspeed) for latest news on DeepSpeed. We welcome your contributions to DeepSpeed! We encourage you to report issues, contribute PRs, and join discussions on the [DeepSpeed GitHub](https://github.com/deepspeedai/DeepSpeed/) page. Please see our [contributing guide](https://github.com/deepspeedai/DeepSpeed/blob/master/CONTRIBUTING.md) for more details. We are open to collaborations with universities, research labs, companies, such as those working together on deep learning research, applying DeepSpeed to empower real-world AI models and applications, and so on. For such requests (and other requests unsuitable for GitHub), please directly email to deepspeed-info@microsoft.com. diff --git a/blogs/ulysses-offload/README.md b/blogs/ulysses-offload/README.md index 283b5142e274..5dfd63ccdc32 100644 --- a/blogs/ulysses-offload/README.md +++ b/blogs/ulysses-offload/README.md @@ -258,6 +258,6 @@ possible in LLM and AI. This release is part of the bigger DeepSpeed ecosystem of large-scale AI training, finetuning and inference. For more details on all DeepSpeed technologies and innovations, please visit our [website]((https://www.deepspeed.ai/)) and follow us -on X, formerly Twitter, ([English](https://twitter.com/MSFTDeepSpeed), -[Japanese](https://twitter.com/MSFTDeepSpeedJP)) and +on X, formerly Twitter, ([English](https://twitter.com/DeepSpeedAI), +[Japanese](https://twitter.com/DeepSpeedAI_JP)) and [Chinese Zhihu](https://www.zhihu.com/people/deepspeed). diff --git a/blogs/zeropp/chinese/README.md b/blogs/zeropp/chinese/README.md index e4a6b5279de5..09aac2cef948 100644 --- a/blogs/zeropp/chinese/README.md +++ b/blogs/zeropp/chinese/README.md @@ -174,7 +174,7 @@ ZeRO++ 已集成到 DeepSpeed-Chat 中,以支持 ChatGPT 类模型的 RLHF 训 DeepSpeed-ZeRO++ 是 DeepSpeed 生态系统的一部分。 要了解更多信息,请访问我们的网站,在那里您可以找到详细的博客文章、教程和有用的文档。 -您还可以在我们的[英文 Twitter](https://twitter.com/MSFTDeepSpeed)、[日文 Twitter](https://twitter.com/MSFTDeepSpeedJP) 和[中文知乎](https://www.zhihu.com/people/deepspeed) 上获取最新的 DeepSpeed 新闻。 +您还可以在我们的[英文 Twitter](https://twitter.com/DeepSpeedAI)、[日文 Twitter](https://twitter.com/DeepSpeedAI_JP) 和[中文知乎](https://www.zhihu.com/people/deepspeed) 上获取最新的 DeepSpeed 新闻。 DeepSpeed 欢迎您的贡献! 我们鼓励您在 DeepSpeed GitHub 页面上报告问题、贡献 PR 并加入讨论。 有关更多详细信息,请参阅我们的贡献指南。 我们对与大学、研究实验室和公司的合作持开放态度。 对于此类请求(以及其他不适合 GitHub 的请求),请直接发送电子邮件至 。 diff --git a/blogs/zeropp/japanese/README.md b/blogs/zeropp/japanese/README.md index 1e5ef91a035f..5a76930e3f96 100644 --- a/blogs/zeropp/japanese/README.md +++ b/blogs/zeropp/japanese/README.md @@ -174,7 +174,7 @@ ZeRO++の技術的な詳細については、arXivにアップロードされた DeepSpeed-ZeRO++は、DeepSpeedエコシステムの一部です。詳細については、我々の[Webサイト](https://www.deepspeed.ai/)をご覧ください。詳細なブログ記事、チュートリアル、ドキュメントが掲載されています。 -また、[英語版Twitter](https://twitter.com/MSFTDeepSpeed)、[日本語版Twitter](https://twitter.com/MSFTDeepSpeedJP)、[中国語版Zhihuアカウント](https://www.zhihu.com/people/deepspeed)でも最新のDeepSpeedニュースを発信しています。 +また、[英語版Twitter](https://twitter.com/DeepSpeedAI)、[日本語版Twitter](https://twitter.com/DeepSpeedAI_JP)、[中国語版Zhihuアカウント](https://www.zhihu.com/people/deepspeed)でも最新のDeepSpeedニュースを発信しています。 DeepSpeedは、皆様の開発への参加を歓迎しています。DeepSpeedのGitHubページで、バグ報告、Pull Request、ディスカッションへの参加が可能です。詳細は[ガイドライン](https://github.com/deepspeedai/DeepSpeed/blob/master/CONTRIBUTING.md)をご覧ください。また、大学、研究所、企業とのコラボレーションも行っています。こうしたコラボレーションについてのご要望(およびGitHubには適さないその他の話題)については まで直接メールをお送りください。 From c3b558b55984bd1e986e7b4d953beae585ca7ce2 Mon Sep 17 00:00:00 2001 From: Quentin Anthony Date: Thu, 6 Mar 2025 09:43:44 -0800 Subject: [PATCH 754/754] revert steps_per_print_default change --- deepspeed/runtime/constants.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/deepspeed/runtime/constants.py b/deepspeed/runtime/constants.py index 55cfa8f59c91..679230ca7d4c 100755 --- a/deepspeed/runtime/constants.py +++ b/deepspeed/runtime/constants.py @@ -77,7 +77,7 @@ # Steps STEPS_PER_PRINT = "steps_per_print" -STEPS_PER_PRINT_DEFAULT = None +STEPS_PER_PRINT_DEFAULT = 10 ######################################### # Training micro batch size per GPU
    More news

    os@s&bR|8;=%me*4uV}WNL&X zWp-?-Qj0y5aoH)VQu;X=*S&q&mc>8r0wY!Qa_#s8D#5o18eu@M?Q$$-Ru`*)`y(`p zsf4gPH}ZkF3Q|AlSelsm*G!tvfbGIW=Q@5}w|3$#z3|YvN+wcd=pbCcSY6O~nHC`9 zZMWD{Eyw@vl}`p|$ip1dujD+&r$Z1}s@PA_$bIb6^s#kDE?7sKZw4kH9)C6CS+zF^vU zu-Hi%3i<8J-bR0fBe7sPRep|sG8|ZZ!=^_rt|#Dy#DR;PcAm~F9>DCmEnI`r?fAWf zKUQMegWqCn5#8Tup=;KvIcbdj%?LkWCjV0myqkMi>$b(o2n7f;jf=)jgVA_sy!4dt zOasa)og%0XMrKRPz&URCEx+!IWMdkMi4n-i~5+YLS4}E;=1(cClS=2ZtRV zC6n@;UNG98qjjkUV35P)QY;>4m2hgs+`5q`;<~uR@6(}d*-#oUjWKvX(@19VVn;~o zs%z0v^}b%`a`&^q^PT5TO-DBwaR;2vXO2O6qR9HRvpgl0a;yWAn5Dbz2cYbdp4^Tc zAvohEf5efsY_ggg{C#hAA_11LGk7^xvKEtiKIKrFqDWDqs2sV^19IW4u4-BkF9TA& zsqZ==dMM^Cv^ox1aFlH1nE7YULoEfMkw3QV=fWRda5{#b_q;diZm`3%L>&KxIJu8` z#ki6oR2stE{kIBQ5!Ll+p>kb-cTm6??DUi=8$nB7lzrM3Ikz;-bv%L*wlA5ytry!m zF{`QA)Ai?0f32J!%dJP83KCtc4^v3|8h7NX4Z$~FrvxCG=b@R?r>E2}jS7yO1)R>i zV;swQ*ohAkIJ@|PzO=;tFT6HRU=!8UK~Lc&$Q=L9m?;jL72nDw!9!Ofis|>6(6iYh zG=5sP4CwbWx(+v9WdgBV;FaZn(6gzbSfupMyjs}xx5O|vd4=QW1uAJgK?vKQvTa4) z)?`C+6Lv_S;l`0u7$riiCZyWN6>YBN>y`_r7W?O9qXxc=tvG?5L@=-KQa0(^#@@SH z!w!cSr)!-do;URf)gcl`++}QFNg)87PHG~I{f&^x0L8Z&8%8$&^l|+qG?VY@y_de? z7%tY*tl%D0cDxBm!)E0lthWdOrjL?Bd!lIs^&^sq0|U~dgZM&*@`))#Vd6GRlMK~Q zE-SLNl=$k3JzKoV>&F_XX9cRK53CZ^vFo1znsnXG;2L3_Y&;=@s;|Mq_J>r`OROd| zQd|#^32#qGW=+g=ovE!}mNiq@3?s2G6E<)C>(!BJAdE0%ey?Si_Ham6xJ9AyqU~R% zgmw+k{4ToL{*dIElbriL-!bNp`Fqce?7~-z#sIKW3e#z7L(ky-KFXuLxAmFlEzc7t z$*w;XdqZVEf=dY-(ZsLBCqyw29st^yU_?jFwQ!xHdW3Os6>n0(#Q<=8!!_}N^Qi9WuUT6O0WMzx{(gLdf(;1w-q#(?!&utyFMjN%CXjDw8s_M zL}HVlmcqZRzO~Oej)=H+#CT(t<_uj`XIYsi$VL_FW3to7q*`7>$@|x0(7r*Ny@_SI z-63>xm;weGWsm8L^guY$fyKJvQ3|4|D!JBvB|%{{`c+w=Bocf@+W8i7l;1` e4kS^)A-nJwp#Bfl-hY_rFCDGhsPbzz5&r{9mKclx literal 0 HcmV?d00001 diff --git a/blogs/ulysses-offload/media/image3.png b/blogs/ulysses-offload/media/image3.png new file mode 100644 index 0000000000000000000000000000000000000000..7777b1b245dde404dc71e6641a929fb6816320c6 GIT binary patch literal 187041 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�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 {XDp$tK@ql`(3N7_B^!w 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 literal 0 HcmV?d00001 diff --git a/blogs/ulysses-offload/media/image4.png b/blogs/ulysses-offload/media/image4.png new file mode 100644 index 0000000000000000000000000000000000000000..05226922851b4b57166def9182a2bda6a745da39 GIT binary patch literal 319690 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

  • tL zW=>$di|{^!CX3bXgATXhT#J;pj-l0ECMULcVmNF`8j|D8E$> ziC+a6BpXPtLmjMpTJ*7{FO8j)jt`6m)SP;yolwg3-yaVQ?EbQM_7WClm(j3bb^tdd zuxh%m3O2c0kqMbM&}*LC7*0(G^cVp)+^=nFi71yi5T45Pk#T!A9hjQ{Q3Er<5J_Vm zQB^jLhd8;Za*VipWvMcebqrKlvn-@?r8R7G(1p9u+IUaZ&e=CoNWqAu7+`Gs}loM^1 zww9vdWu(}Ibm4pxe9N8wZ23M)N%Pb;UgIn8hC!ymPFK3k1X`5D>Jc^(mRXPg!CU}> zvp>}9-o7A7@0-8%0|+qIv6*Znq)J-t`cLNiQ(jUgxR3(%2c;mpzfuEkg0J}YdPjho z8@lM6%{#kpVORPzW)l}I)O8WSRZ@tc-+!7QYlo^j+Bd|V@K8d}8QsPPzZ|R6j!13u zp>|E|ZeY`vcUvg~K=n0hvCRj}Q&YRkCHY_-E2C9Gm?I+?-yMOhu_^FWy=$9^)Q zxe{A~-IaY-N~}g{dOrI&0;C^M8nEhcG7#$-TAee~0%KZkE|8To^ZZ^*BvQ$QO8i;p ziEwlvdd0ELRX)l~4L3bpTdMk=yw#{A@EiXIl16oecd z2_I2gCDyzCgc*K)O*$;0Q{_4XpEUEy&BK4HgKpc+Xd|2dU1Q4EKsB z2Y}LdXAg7>ZbjWT*~b=gg9?cQslXP=%b(AS9@O0JuJXDUIbmfksN7B)x>zmJg`4Yb zgT4NRaI5~;@o(78?*#|28ea{AgTCXeAr!uK&!)VRS%EvUkWTInF>-hVH8*^ckQxfC z=%^{tVFGIh=)SlwDTV_}~oi3d95iViVouFZ*`N zw#H*U_QEQk*Hpg2=jWRBB#vSlKI|mR{OiW#cw0XOm;ZY%J+uX5??`GV^FCD0tLifl zw=1OER{Xn{_4nH(lK;N(0R;+?nN174k_XTwtAL#%NV}HtL7&zZM%oo&@#S<=-;8hl zr6Dyyu6#u#1BN z%a`o=&Rdm=X5Foo1qkHfz(a;TI)Q7NW>XThSgGo(^OBf%WmN@C#X1z=%yR#q1vZJ3 z(UV5sJ>gS6qMfRo@auI9+~~c7*?!KLRy8qO3if>XUTAvCujZba!PYSOX@>YHxoqZ_ zU{SoAkxdBb$;)dQE4L74QBsr{ExendS4-fk6a2HD2t;{(!4Kxc;||P3T*?9KsAR1R zIu_yU0z6LLYX}1(6Z6{R&J2#KqN31X?7v-N;PPj+QTJY%7(Tkh9|Z08gYWkZR!G`j348?IrwCDMi<}I&ISGQKP5{#us zeL7_!eW-3eCZz8O*1OqHGA6Hb`VP{AO!K=S%coXr4Hw87QEccOkm3Ole?KZKb%}KB z61ovEA@v;?7YIvS8-1jvNZlfGjV`Q>ms{x^b(i?(v$|AiMSR+RU2ZW_uhTGD^U6uw zOth!Q*yqeM9A47Htq1EHFH8k}nPZEGXUmtrnv3^7xlH4NnAw#V$=>05Y(f{`gUf#3 zPEcphJ#c^j?*Lp~?J>sC3cQ7VWOWww<@2e%V4rbo16fP|8eB>tQ4eFk!l}EZ9SMTS z1}ELc`O&6MvJ_onQ)D0dossHet-5PtWu3k$@*5{Lr*CBVPz439WJ3zx*QS?di$&&4RvrjLYXkV#OZWp9svCI#jrKs_*Tr57bh5F*elZO!*x zT=L4%Gi@OMowxMwBo|#r%@apA+;<}*`96TfVmLt?AQxXd&?$641ITerr`Y}}JNgcL zZIb9t68I>D#sZtKQez*Z!Jz@SqbiTMb^6jnuK=HMsW#7P#+&)jjPG0P*HO^cwb z1c1)N*up4x!_6wQ3sPoz!cbFMr)rKPIGkL1@^Q)oRpdt;4S$_9JP=H`N zNG(?#+2a{_e8b8_Y`m9ZO#Gp~H?d~!Q-R}X zMuFA;5jiYh_jEoB*X*3zgMlpxbg;2Niu$n5g@+Q8sLYFs#+x|hg}!2#4XO3WfC*;l z@eUU-%L0q|!J9rE3-aUbu-(Q6N88PM{b6Q9lNQGxxv7_c(MKog4WvsE7~&`?co9 zmH$aPR!+l=v`l|UJOqrJDSXg1T_}rpN1I;Vty%9hZ6CcWywQ6pvM> zStSOb56?eAFKu@p215$H`K-y#uC!PQVHgJDDr(AZCMw(Q(DVzZY5#hO6u`n5QUFw+ z2C=Dkrf2eoRn^AYkUkqoHj+lElTrA)G-_8ZcT3~l@l0mJ4#Kshf+Ndx&`aqHXfjy~ zjbPY_gE3aw(s1}xT4KUXroIF*x3c0}7nJG75%R-cc#V{6t?jYyVq>s4+AKJ?mr zW>^1(>d)UD`nNzavmiYtrP$y*FBt4scw?yUX56A>m7)7ATEcZXC57bz5hyyrRAK0t zu`Jrx+96RXZ{oM!qJp9j&_Q6T<~=I|P+b@kpIR;LwD;4-y;?0ZydwtJ5M>?gLCXLz z0k-znxTzrs&aU*H*Ir~?I_l#I_b3}LHiRa9+$c8dtDr=Z-WWC$?kcfb_CW;bW<6-C zs^I3DI{Oj7mM)U-xa+%kRsM-FGXv_C0H?)&9q5KC^gFE84cBCJTBeH0q9B)m)&O!3 z{lR^YMQ`zl-M!B{sG1@1#s=GXnSskMBoDLxZ{G@Cpg|u+wi1raYp7!8){^lUYm{a`JN+119|GraqyyB>{>Sx0VVZabSw{rr&{8P(tW;-V*RkpmClN7Z*^f zRCh{D67+o!cT*YbN&K~gu70R!g$*iW5;jKU(9|0g_jII#RLLv?Yd6P}jyZ3?n($NQ zrO6Ws6^$9*FykGU)W1%#$6)c?2E)mQhV*8Xx>e^;W{>Lj>5`of-jANko8xtLR zWLFOic}*jmQhm?3ZA)twsvXBpX~?a_%MRY#N3zoH`Wq12eJfOR$88}%7e7}4>uF9blR4?kF*?b4NRv`-6yFu4b>e=mz0#BPSA^&X&ZW%8u0*QSK|JQ{zr88R3awp^fcd>W(J^n65rK#gtj$1 z8g3DKMdSx$dbldWK|CS1&#qvu+X4Pm&shBqv0bv5yUf5OxZ=4zNmHgHp5;Uxw>YN~ zvHS}1Fxt&TXgq#qY3NdtApU!X`_m0^$Nhe;vp>C_?JR$!rV_6q<52%G?!MzyJ!(KOSWCHJg?e3Bj9OBDZEIX+g0#Oe|2|1|E2&Mo}j#z6h`bBQgbaeA_F?GKdr zBaEWS?{aR}ydx5&U-^t0b)^8ZwdfHfy& zDA-fshrZ}Tli(Yu{5HX;Dpm?$wn6bxQ5$fxLV|t9nFsGM8oeoi+3?7bsh}V%{d-aV z^kRg>_^UV}g=h9J{V*M!*!|n@_;X7VL4KUtBKE1Dyf1DKA%(qt=(R3_3oxa~Q9KEp zK&>xT2M*0n-#`9j^UWEbwxHL;Fs)EE+gL2s4T1}aXaR-2hyp13-2)lLux?Rrn;a!X z1az%hGD%J=dFj9cxwiJS_f}rTPe%HLM;ql1n|4PU0w9C)W*tEktdvmPD@V&On<_EU zrLt$|CF28Bwfr|xJ%jrK;Sl@93nMF6LUHXSu2AfC%+)*oN!~zLnep;QvD2;MO9)6S z_h&D18+WR!z&Y43h3wljbxnWy(doi&>sU)Lb7`gE-xa|fPrJltqV$Nw^@}o$h(Aj039H`_FjtUg(*4N;z=bv5NF~ z#w&aOx)m%JkFGquo>;^#L($`!7(=qWV(4n4E;jyS?fkJEvqp93oTdt6)?Un`dPg;ewvs5(8go}@3GaE zngn15+3J8i5MaqZV`8!@Z=@u9QEj`RkXDe)x02YZaf1dF!mYIU&U|QHQs&XAEM;YS zK#5B@;&=Ef$49YbL@60D+4+IFc90cY5hoDQLGT_2BE^E&iL*Cg%-HlhInr@UhEjU~NH52cD)@)6WeCARo{w>C1Oh{nnE_8^VNw zSgx~z4jDSU=-yL^z{m^ea=9=xtYNd1jr8IBq67Dq&f-v3xQt`tunt12@!ippIeJB# zuQy^lv1ykT_2vIjd_JI%@{oT4)#*xe?RxOuXhJ6wquS&dhIE&V(Jz+6ux=qwX0?$SWpRfFfSRCg!Ut<5qvNI>wcNT+H zVO|MC|Ck)arn6$G$R|H5axsF(0Wuox*nvQ%d`9lax5y-XL_MYEv6|swEl|=_ojkt~ z0@M%p9U`egI=TrR|H%||R*Zs5;M%fHZgX?shO=Gnak&5`%xe9|Xu{3=TM-+9VS{o~yTqbyoa=*GLHDHNq}}df4^2Sv z8lFpjX0D9rwoWd>G^-;=^`F|Y17hBYl)F(nI+gYrpk*g?Do%n>ywC$MjR*K(qV2qF z03>=+08%|vHza`m9(c?L4Z05lD$g}3b-LA|px1raW6Di>7@!bhej7uxV>9GqaH{rdfF0;0BYlKVmor!KToPIiwrN zzsWk16yr{1{a=&O%cMNY0Ik-YcuaJXRfzM10VK?O@1mC(@Z$-wN*0r_m6_RXK!E$7 z-;gn{^nfEE&$*~3@hA1;6C9p3J&Dh=3-}X7AW-$X=Ap4+OQ6)Ih>j$AkY(4qWO$%y zw<^!sig_`oDW>C|>&(DR85swFl@gM94EN100Z>rdjF%Iu;WG~8XvOzO!2bb^QGv1gDsu-2oFjdd5gZ z@T(6WA3-ioA*ma&V-rddD0W>&>U(6x9-_MY{kVlAHiF1;5p8*AF6gOhOq8J2d*h#V zT9r|4-+HG)9tH_$Nu$uWe^U^r2*!#gD()8h2vO-68oTs=vRt$XenGV$RdLWP9}l?v z0f<2c?6IMi1pstsKx&@opeV$EI&4KuoT4x8QSYVBfvfxYPGERz;z}+wAW|~VKQ41OItN2bempXY@MkRGuy6#`= zD`umRp!>v8AF3m7Ru<(<8aOqi@q>=qKd>xdr|)eqxhEF=9x{vs0l~VlAV4uMJ!N}) zcRpAct$z{A=SEKz+Hc8}X~GwK5>@g2=fHwNyz_8vxKkF1u4ou^aJ)aOKY+jg8N~dG|IVs${37*R+~&v|cli!#3({=}_4Xe`)B8L{*Ei%{morgYD*??vaMo zP0pW=;tWS^o{ZdBe?YRD_P`yBnC2X1DoG+Yn_e^t`|6R#<#lPp9Z*Wb#wuIvz}y;6 z3llqBjFgypH7q4ufsuAr$K{vG<>Ya(8-HRFLTz`@Ns`O}0b!1-hd;Kij}VE6Pu6*J zD#(@W9a(2_>V!^C($VEvxyN1N`|#stASSg=q3UPKo_nUb5Kq*7K>#cM0v0qXYjHkbSbp4zf=M8XLn>Z8l=R z{bIAzS}6mJjlfg}F_+zTDR#`K>em)dsi}*&{Y%sJR8$PRi-J$5>%PUu#gQL$zqy8q z(y6=qfS@82^XAX^q*P5#ZRpF==CzcAh*21|fqV7%7txVO`pQVP0)wdBZ=Gu=UaA4R z!v~|Q8(S@2KI6bB>LbG9fG9V`TY`=Q7n+amETFQH?jZVj3!9G8u997?>_KP~qn+ z@_Ok~rLS-IXtR8_O#iUPg(AA;>VmTEvtX8tl8j^w6$jp59YF!AgbSJ*{9?3YrEiRN z#BSfkUhFOVUXhAr!^WU?W+GLdotl$K9IqyUEZ_OXhW?pMqI&Xpr>Wec*cS`LLYa4Q zah9jQvJ_KGyAcT}TDQ>u?h-k0>&;gH!e#gjA>4bQdK+LoKXE}VclFjMtI$7HHjoxg zYar0&HK1+%=$Oi0b^e{VPeh7#_{WWJ1*AD}Ird5|lyB+MUN_RN52&Zc%*f66N; z=M`r0F9m>hfxwGk#NCE zhuWt1F%qgt{dWaj5w$RG;@=qNzcxKmDe6a`^Gdm&7rHbfkQJU4F8LH*B*+j_@kfB{ zjM(iw1}`ZAYP6wxXdEpZ^2+Q zW+o=ma9{+W55;D1XTlwr@;%!)?$T&@b=PM_;rMj4F_Q6eJLt>VX6<054f1i}ya}3o zGUZ3~c1Cn1-3*hijjK(!#+IXoBXRG;vh+4qi5(p8)o1Bn%_a5{HOi5;wHphE)%`w% z2A8|>I}vu?=+h^CZkaBAyYO@nx_&HM{zU23%WHvxb?=gsl4vfDVVB2qgA$Dg1$HvX zdmfAgN8N{=%DyC3la6>2hb2)n8jYuM1Yg@fye@k_hw&GV6|~B~2xv+!4=}_75V=4- zM=`*RfGHyBDyuk9r2PP-k<=rLbSmDnDQ<7a2Qua1f=ZPcx4Nt++rkPSrY^wm)7USw zy^A*pCTH*7USDU|EV0Mk6$aPo7&TXXi>3hG^ht--Q?8D&bcxUD?bgU1LSO&NA&Lx> z&&m_ul4pllS)rzfo}knEY0p&X-iQ4(t%mC%QC~~3<@eVFxSa&+0c%c*jpE{XlZAo>Q=0)d+m@T zs)rIjfUEew55b>2aJLc9TdnTMciQZS9Gand302>cdkSW&cxDj5y-#sKMLjLS4{+$t z&~zBF`GQUyhmip_@{}CPg&18vyjW77W0_Yr$&j1Y2Jtv|*!@(uy{kjbeZpTsmr)cS zNgTvQz6K$ejtlesTT!XQfKB4|!FhNJaD~*qy)$Ii4N1pA`R|^5+Rm+ ztXKcMj{!~Qy`LBZHTTvoO(6>J-FLOyS%L@;R#WReA;7epdJlwnv6Pv@;8o|zJBsaM z>>-X*)lT)6Y{nlI!@Du6!{gMo5$AHj55+w@1%L39c@K{my~Gw z@~~>>@~Dx~&UY{Q<1b0cF_8FZBY@-o^=4aFB)!<9`-ELIun>b~>@-O%Is^fYz_p`E zC*@mCe46ej3-NP;MIKK+f(R0BujPPDUoX5feW@sr#lV zkvHGtE~%Hbt_);0NQ#%!KWQ1~fWM%4M+D%}%sWgo1b~WBH0evP)5Xj7LP}J%2eyU3 zdA+bAM-9TNE`LM^a;tz|@{p{4P*k2*&JTrj{s7>w0(x=Kb$D;vv=}L+?Pay$|D(e{ zq5$S9g%e9I&hbnl+283SgcL5?c~+BE*D0T2%3)J)(NLc)xo;8|eeRKnmjYjZ zkHe8(*^!vV=ftLxI@96H7qsD|UELg+%?k2oK$Oltm8`XnH42#wys>VQDk7s%aa%xv zbwe83Y;_7&2dqV8IA3r^pbBkbdpg5Nj8ySutw$MasVTW~`yH)ec!@$gpD}Nbrtu3M zb#&87_>Lk=W2!ik!^gI`kS1GsEpm)1aH;Gx^%^nLf2j>g(!9q%%+8}JQ7l`246g;g zHMdCz?1t0fqDOJUS|>48=~w4V28Es;YXw!a$HOq7sgHCW9th4 zLL|99?m#UNf%zDl&{^)s+t~!OT;nsgN7RngY!!uN5u|#TFh zCuMC^ioTBiW+@|WKFl!`UosE3>|QUs|E?p=v{%g?@)2^53ft>;9-=3Tdgwq5m)f+y zqJIFy#e0LY%B_4_3qW0B)Z#z*v4B>1u*QWyz+;5V81}t}=_#MiNb<~*R5}C|*Yii1 z9BShISj2tSROJ;Zjp+RhjUxTyohUy#wI&nbDTg2Z^eQ5dXOIENppUposn%IvJAA>J zEu$uA{DMtJMLvU!^RCIeHWv11xs1+qaTK-I{yZpL7P&g<_j@r>ZZSBY{uTry`)aWV@4DF2 zccn9)4g_V6-s^c}NXnwvl)!7OG%g%vo)Izh7N7b>VD-vl1%2eQ9`@!CPFGXx8*UzqV|3i+xt>vGhk9`_d7$i$64u=qxtmP$_c8*WU4> zjg55Vzszwv2nFeo^<7KtvbyKto$21;aboPjW`x+d>6nLEBX}8J4tZ#n+evqd4)|y0 z2DJ?$OM=!Nn(!JSX}*mb8(E(^Z^iZdLN&dLSgXR@C?Zp5Qo2X0B`L>JXQ69(wXng3 ztZuzK3zbVKVZWqGIhsg$u5TO9KRV+(gt^Ts``zD)ZC|?(j1(Qc&WXKNRto$4ImcfV z5W14((H2aN+sXHK&!?FW?Y`3Rn4cbf%HMO(At2!CtFczJL{^uvR&ETUgCMxInkU<@ zt6cAumb|{I<;UT+8skZmgB)L#xiS1wQ`4el=wANB-)QsWsk!x>NZ<09mmBBDNMmZ+ zP?z-=5AR>kQrMzj5s$bf_1OQlK8g07ELN!po{w+dz))@Q^YL1GfG>w;QO&yMRhs7I zw8egw;?*bNwN>%6e*RsSfl*a%A+?&qJ7~t8IHxSMPhC^l;KzovEM}Qn>FjOT$)GIb z%!E}@TM>xa+v{3Se$7aY(M|{qr-D`^hO0k5FAsbO43H{nIJHc18PWQ3dAjz5MTIcD zbk_j)F{)a|s}non0nA!>0XAh%sfBUhe2_G>YQhda@+Ckn)`w)0+o(_v zQU`C~-HI$n&MMC0H!;nBRuyy-oOgbP_Ix$@EFc_-P1Ri&_IhU z=}pK;(RjkxRNNixwb6%N<~IhSZ*pC`=Udl{FTV|M%XJEeM|Gz!ho#>q!tXhshb!BI@->+=BTC}*lPIAO8FjhJ z)rYTqBbZV;RkjfvMIc8t-S5(ODN8I&ilF&t4H}!DB>3OoIf8>V!YU6@Q7e1biB>ai zHe*u!wiC^>?*<Vo`y#5J3MVKU_EOSTi{2T9;yb=ZGvd8${T% zylBtS8Pqm8BT4W4@kXhAe%|{8ERqy%OsVAPYrKvmGD_bxwXo3b`E*QWB#K!(B1_`4 zJFV`ia9?SBb9+slpC!Tf&V+vFO8$hPnh>HAdDKCO_O%fr6$tht`2|G> zMFWV+a3{r7R^9w^Z6;9|HKPUs&D$ryVQxJuSMnSUgol;e;CY{M4LnVvO~Hu!^=p5{ z_0?g)tL{x^1-%Nju;Tl4hzV!$eI|^@q95HZn8@PtsJj+W z+o76)bLJ3rYLaE@1cqQ>AVgA949;t?f)Ur@2cO0NGPEyPHv9IC7OR!?YnNEQIlvNd zdG9!xFm*mR!=navQxen>6aqGYVUp+i`nG5T@7}#jhh)@UMoEMJ%JV$q+u$2kiic+O zJ|0#rx;}w0B=dReZ2io}^$9fP)CR)te zZ+r7*)7RAG3GH8eb*a6iNv@LV(pa;2^P%wjmopElD=m7GGtK;+2@oU#B%gu7TDSZUMmV|doE4sqz z6E-+Vaj09_W43NWF``xG&puT5qP>s!Ch+{OHqOjLZHT=BKcg zs>#aUQy~lQ{)-y#MBS@vK^xESbbx&=u1gek9&Mt2xXz+si^($j9)ED=+=?MwusH^V zepCPE!H=>x@7&3gD-NFaySg|stG6nury!C%=aD#D=U>5(;0a`xk&&rTU@#ySm}05V zA?Hvx-2T;^L+8v*GV8rnf7Iiz6tLgAobXxF5J`pBwf^C5!*M3$>7*8hM_s71B)aB|_79ZERogx-;G{Cy8G>R)!<&O^Pebz1Qcg^pbt@ zIGu8OG42&nVCY?i2t?M7NnMA2;GMEEsQti~$&ahy8(H8qEnVlvVNGyO_J;P<$e>G+ zmhS7Xh!_)gg+hWlk;z{~ajUoTZsgKVbD&K)wiOC3`DgM!t9gMnVUnYCPf7ISPE&x? z-OtQH_$5keD{qrsXh`WlIEOk?=-+#?0yEw7k9;oVm#lrHDF+S+1r=koLo#*|I7JqgT*YOrDewYbTSpPE)NaOw(6kWbt~`_4XtR5I#;upD%!f z&KYI22O4(LoKepV4B1E>swV$GzTP@4%6IDm9=bzOLRy3Yq(QntT0jBmh9RW8LqJec zdT2@M7^J0}p(RGTLAo2h2hZ<(=Y7w6ecvCBbLk%p^W68|Yp=c5-lK6N7OUrO5esO3 zPRl*J89$&RQUS9+h%Z(dY@667Pl_a5ftiftQ)ji@5~_;0*sePZW`PhYq~;_FY<$XZ~Algb_9h zH-2F!ZVz?Xtk-sF-G1}+0Z?kmfxmMjqoCwTy%hOPl(oEU5*!+8x(O12f~4D!4xH^!kLf z0i1xf7l(+xGvv(Thp?P%og36mRx8lq3L&h>1JpW(t!X%c+CO3ndbR+-iga9t{Lu~_ z`5x)Q5Z@!+)rc%*!`=*992gTCI8hGT7L7-ro&xY7O$`a57~n5Of9`L~*NNd1>5$1z z*zz6YD5u~X*9Rz`D$@+ZT3-;jDDpL4hCo2+=DnRmG=`Ki1ZWgI8@}X%hT= zQ_qm(1-bNLy;RX!^lqMrlhw1W&DA?C^r@1XRn+7;wUpv+CPCMtbk-z%bwS0vMmvh{ z85!?Hx@SzSl*&xk{PadPJ`>L%T!UWgff#4jm=n}G9f_hcf1!zQ<&Fl(CJ2SEw4#bj zNlBffWTCDlbH2@U`tksM@~rJ1B903a$Sch(dx?y8*wPapw2OR3+}0X}%6x9tVYdGw ztJfw8J|@38CZ0JE2oDi&psujxjo~7bqd>FS!jX2bE$<^Tt_pN|++F2zNxOZHRpAtu^aEP3I~12ecq zsA9f(pZVUTxWRY&(7gS{Cu+W+czn%W)S{?j zOdVpG-(-z^en>376hNu6=$H~Bh~?pxiH8d8vOlik`QD82dbdDmV~%?R8fx;BaAyOiZ-EZK_}$%xIO5TQOLfyjgBCmwtTUwc9q7n9HBsK zCY4u|(K?yMvx?XO86Kmb`|Jc8>s8KE2p>!J{e=pHR~4Gp~he(RVd zP1Cf3G)~P1qcPDR%BuGEh0iQNL|~ns&BZoAj4EDhH|cpb$af}^^bI9#?S&#DIWFb! zy$xU&sC!uh+eXPsLsdvuVFrI*VQ>XtG|;rG6i{}`e@9uiX#*b`62$~f7>Omsb#6ob zqJd(gZG#R^YvX7jiM%@bt)rz{k~H))AG03%6DX2LD4XjH619d7(K1Zmvq zV<>H4-uc(Mq|P%eG_FM(A>B+9;hPr<6u2O6S?JjuFYX%i4+!M;KS*# z64`n@tm{t>HZqq{{4`GJ=Tc*hyF*6i2?9lasRCKLx<(#SbFpLkMxvTR3*#y*@$;(rN!7zQMH=~`>*E3wG z8Xd;~Mx^`itkG5v_mVd{IvH2t18r&=`i2NNugeuM_JhdYp!qnCbjo@u2Gf$!JYaRQ z%~(SEws+_hX_%FVvV^B|?hCJ48DL-MJvY)JlYfB5GMRW0XFW(2UEn~k>Go`f!I=?B z^*0)cUO;hq^KT!wuBV!$E1nJ8WsL_ru;JzH@|Nyjg%5dR#e8wLlIqF2eXH$QWhYrZ zVkEDUc86=qf=4s21BnIQk5I>4MjbgT*p=*NwV!nJcg;W@fjft$_GQ26qT}&RW11bV zo*CUogt7iWU7~xziu#B8_vbpUa|LjCdn=nJ`UpUyL$AWmz2>~K_ZqCN2M7Nc6g1gg z!cD+2Q5qzm{yrT3IO-&4{TVO);#-rI#TG}t-p&qXI7^|E{Hgh2P~{*A}# zgQDabupz?hS4G0Bw`l`!pWZMQW&2A{MA4|*pG%!~*L=sSd-RH`MPd+csGaKiWxDW; zdtpG8=!T|Z59OE59$v08I@fxRNzY@OX#Dm+T^U-7V&uh%7^b?`kNe$|`dwM4>a{d9 z=!^1vs)M2=-jtGQ%{3&ua$gf&US47n5G?Gwta$r%?^oZ6dYRrXdZA5|l*DeBK7CA7 zoSUgh@0-DVajn@lGxK}4UIP=Wu>I;(W4hr7Hn3s!HYFv~e&EM#e#F3N9oxCSni|vX zkiwIvoOBTSvXDAr&b2Q7XPd491?#&gCmg>H0a4VHaVtaM5 z6#C3%Q#EM6xmaR2<5e9Y@$>Zwk|Pt@hT&srUwGF=DSSIVyM533rcn9B{H%^)c3 zjT&d3vb3M^&#dVs4*W9Id{Zi*d%K-hPQkZyfz|VtKcn68X;isGT9-yrDG1PR|;(6=X-ruZet>YsitPn^kc6L*Wv9J zzgzu#kwJPkm9UcpO@p@pTk?)F0f2A<`aX%wAg>5|TjDs+*hPAn53z0KB0ab5UNV8r zIr6&#kbF+yMVq*dSis62=g&^BFQ*mVHksWGNN@E6dX*>ZaFJAza}c!R@*mSFs%Y!` z+m*7OhO}n*;N%_o`wekcWkRb9^xWEM6{hZ@x?cWn@<0>gB!O{T#fshoq zWDPVZdE%p-2PVrHbG$0Lr}OXlmE**26$1&q8j@8;Ve=7lAqO0ME62; z0zu2l{=iO2Njzp?^W}OfM0@Dt@Iq41G~kcftaAdJLOpSth&}fZWQ+DgrVDkBIa{O- z0&Hsj`mbKOb57ktGcxS{faX_rZjMAPOrfr&jq@GWtW$cYe3`PSOcxXoaLh0-#Cctu zAZh$ccXy<_K_$X9i?bdQv9@13E6i!&T(8|btlTkFE%&5bNosWL{+s1cDPx)|{gH)1 z$gK7hoyA#X?_u3j0cR?iq3rV*m=&_qJISx9b-0(`e!k_{mwz(UO#GUg{q-SSEP1LO zn)JrSj24v^XT!McUN4wMJ8*OGaQZ8g ztGnMh@GpZ?obm^d}Ct#a{d7 zXk#vWGfui-f`VbglT2U8ZaBN!QgOM$!ES9Az=z8)!y87C1Oj`cbG}pc|66l{rQmH}W0C9E0}RGqcSzT&>D$Rb6}!BC zSan5#iA#wcL4g%PZt-nc8wL^+lM|xWYJ8uP#M#PgCCUX*=8>^Tmd_(}fH)fX_hUUE zh=0gDbXNR$Dm+?QjmJMYL;kKw)1@FH#JuSF{V?b8GDUnNnC8^L?0{$5v16P z0JYZBbx|q|0CunL{_Z-jV+K7(Hky}=Ls3D&I!RayRh;ZsHphdQ?Icw+a$<_< zW!E8)KDzti)zk;QLCQf5|3(I0qY>0?`x;i@+zAQCZ3j*DUg4RLckvp}eR8P8tduL6 zA^m)6LeBe1(c4kvId9qPlTT~Yk9i3W2V`kI+cxA5{gAMzhM#-6y|g*Fz}y!8ZIr%2 zqP20$Iytx-SrG%p)TR80_Y#G$(gD-NM^t*JWFv-S#qq_EkNS>d=a3)%XomfBlOd96 zo^n8K{w(}dQMkgdUTku}%lIWqrLY+iF)BRhe%4cqunuz|v0TzJxw?bb=CLUPh@JDN zDViVd){9cN#4Rewx9v3-$;FBrBYrQiA}kaaw64muzwf1ZXQp|o>4t)eTX))@STVf2$f z^UA_4bE=!4;?wkuu04DPxlY}+t!YHuL4?wF9sU021KqWY%B-Lq+D=?nH?vAo%2gp)bfef##YSGNRelSJ5QjNv1MEs7u zW+bmK9ua^U>XhEjNHd5LMr}ts#OfO`DE7M~1IYP)pZs5*MQRD*1RV*n$xd?{$A`$M z6#%4kfQvuPhsr@lohPPC!$03qAr~?yJPd;RE9j|=Ca0FB;=H?&qiiU%BQnOR8>7QgAg0tdR@IFKo`fF=i&x0 z&BPD_gKvOPc6B3@5>f3oX7d79fw9`(AIC>I1r?qF>>FG(!iffEuS?52^N7wP=izz| z4TkItKy=pZl{hqj5AAv)>=ke~AD#eYm~M^(ip% z_ItY5pTg^;l}lO*h2Dgjl}ZlrU;=%2KFtw<=mGPx;b%GqZw4vflsmryrx;9G_jFHZ zd}D1D))CLrB3vJMIU|UJy#Cy>nc(BbaOcq_QH9sML&@=eh{J+C;np$POkS*>YQv;W&z|M%T0U_*e8M38(fTRgq_=ONtAU|uqzVa3 zDz{cMbu`UA6f;?<;7oA+l_<&a#--`JoJMSB!*{s!CVylM=xsYu&n6Y)9&ZfC z-P`_L+a?DQMAIl`P_W!yC2WqFqcq=eJ)`y`4L_d`@0qdh$#LCAZ90@eHt-jbxcZLe zv6g_^bi-x1GFqgOb~0QGB!=vR(<$=94uTJ(wfoq()Knj_h=@(PBhU_xmi;hOCniG& zPZ}H(23;e!UCY*`$G7zcKj%;V&{3?&`8gy|iFS(uNawo2F6VRZv z*L*com*Nm&mn{Pq0!t%xwBlo0IKFo0=x(SWgknIGDo%Xji^;tf)&AO<#BZF08WYPv zTLx&t0boIp?0E%a68XFjQQejGVhJojO+|!sQTW-)ncwY)#de&)>phgK6JzR<8W28V z#|K2oeEs;xBzOZfNi*ozFXR$^a@yfPXqebK0m-B|0q-@ZNNM71uwX8aS6|G^PXpX` zC_YA&AJ@u8g>h>zRzLyROejWBG9?~pbHImcvcUebZiZyrDs}NQ7O()f_@x$r70dXq zoJ~s-)7$+x-7y#&Di9a2ILNmUG5^y$l`ISD8tVXLZ8{8btT$25UiF*Jz5sdsI5E2v z^f)kz!#ei(tW2C}pL((k8P2ffayaUy3+qd@pDfWH+Y0A2w<$924OMyj_A3HEX`}Ku zIe9IJ;01DSu(78o7dQ9U_;|AbRmkYg-Sz&P#6hvU!|3%JPX6T%0x_P*cWgboTpgRE zVH;wstb@W&ub>pA!!r$8ZhyNHSR%jXZ~^ z+Lt?P-j+@QFgCUL4l?%!sPiXBs;u#5mb)e|MCJZ`4hVRCaH<~+wFBN^L(Yn^Chreo^tS(-q2E?d?0>RnJ! zX(a^?F>1%KJr)G6MLUD}y3y^c$MvpO(~-h+11~0d7VY_h#nY*{wPUlJegD2O0_E<4 zOoo*KcIYAZqjbTp9E)MrcYAUXlmii&AC^{N?`nSjI+2i)Bo3#XF5jl$ku~)#y;XVz z)|I+d0!oxLBOU)@fw^ZzEd&;6BWoB&sS$TbW#hH>hO^%LKlyj7$0N!mfV--2st8=B zqRVhj0yZHh4Gj%lkjtFl@y#4TK%yWa$lM2$+xc;FNfF`8+JKE_eUmQYX|qHXC6?B@;Bx;ltz)!-o@E)%5@%jJo_v_5!8ngF( zfHeq^W(F+{n%V{{wcI_!#DQg*IFqC%1~VaEt(Nviq?k!!>Jt;|OvfRV;$m~LNKM<| z(^_Yo9|)gngqaUKU-es`1|-(1c1a_Ud>&b7m-DhTPB$0Pc9sM&=B<26P{Jgjk zO@#?sg;g96Q{GnpsTTTfRgpT_;4iE2^`U|XTD{D*F*uuMbYF(*41Rho0nAz)em0so z^ih0Js*6#)B70#yau)oLyk*=qHHQ&sujSq^4)7w=z`jPF?-i-P)h>;{0{C^@gFG zoSaI?;4`9#f$g**bIENN<@&#s;E#37vJZ);eB2htWIb6}?NUB9veME!hGlmR)~q8Q zl$~AS^fbJp@+_}ewC_~n_iJg~V0!FtzlGr#eyNKL4Ab2RuloTbY_Wd4tQjHEUiD25 zcPnHS&G5PF(7^QiA?BFH{3ke>zwCO6Zp_}f@Vi78*&9JI#E>8&f9Itmxk=pEqg0ym zs$qUBZhD5!=k&Dbxndu+w|oN=0-! zJ1IhwY`RC!YLIY9&{D6wm$F}D;^A?}MO)sMu1BpmKmhH-V3sh(p{398@E^9E$?C42 z9)*_K=IDrsuHQc@$C4ttHb*Nj{uFC9U6`=kotA3}A1kqBc(c8~O0D!*Lc6~7zb6k* zG7vPn$?V>*!;Rb)zI9>A@M0!rZ=ndcZ;9+m=Bzw|M<(3G&ROW`m7M4k#M3b_DEswz zY^j0e@424>Lljmz2w)=(uK4pFbedPmo=5%}@$8yc8TA*3J$ks5DdC4J&YY$)`0Mb# z#0}5HlO*m{Xa-wPH6A%%zQTgipZ#f6gi6{D`_N8w&+zT|pNyn9+p-4eu1!rXVh;io z^%uW?e0bA1`$I`;yST7EsJ_fFD%AmZ5bcqpUdYNzn}UaoZwGuC+WzCCy_LF?3ls(B zi9yEa8$bCNquFk}(-oCz4i~xqLYIvYHR-ilt{$f+U*ZCYji{~lhXN)h|ESAt( z^j>Yq(m(`=W{_l>ms~ELjaO>k8?@zY4t?5MX4d$#Te>wq%knoxp^^;pVF&AKy++OJ zUhX-Svqy~A*k5-`<9$Qr$#{`MM#U?uwd-!HY>BVTJfVlqhJ`koe&i_rcU22|Yc_vd zS8Bk`R*olCR=kL{K?&@-yA5pI7bTq(rgA&%YHi$?{GCf|Qu3X~=dEr9gt0v{SQH04 zS0IW0O;hREY#hYgEH^|ei9J*}8c^ckSYIi?xEOo=nr*aciCMw|G8d3pbgIQO=7>SA zUEIzyugA>j`I)1gm6Fz1O0>^@&faO!y_t+8-#rf&g|fzPL_lQ}^Xhx|tckvjGAI1u z2RirvmOx~SsXyqvl8R9}apD4=bNk(m;bxUoLz$dA!ya7#ygu&5<%ZZj8G*=2Oy7G? zVWg3p8=o!IPte6+p#BDyvpC`SUC%5mUu~Dm*4oX%D=Et^KqfM8Gl+PfTiKW$`6K7v zL=B8wv}~sx+z@iv%+#>j{XBh-GA4S|ONTB_De6;4rpnC3#5q6}sf9239aRD=@3GGs z=xOvXWBB-QnUjvGKSohVN5~Z@xDiM>XNB#l|?g?4dj0AaTR*Zv@ueG}c z<828fw7*ch^{9004dzq|S#!9Bo_Ft^QmQuJyoqP8qxSYGYs)~8WSMkpe^2%mJwu%h znfqq@Hf1wp3?5na)1?vEuGCe>uG{jv;eFY_n90t(M%dhI=ydv{PjioM-_{&3#d{it za}B>#72H6NM;HBEg{QBYSc8k^NfxG})HY^5@aFcX%N7^Wlb)LN$pz~@%aT+?=3*y5 zZUk+U%D?*w!Y|p`6Phgw(_rt+Ac@Zz@}J-k$1nF#D;}PV=hfXDz1!MITy8p6aO|TG zwfDaWdetm;KKt%w&pi*=tn^O!JZ-L~#h>Z<^Bqz5eYONq3#PN3N^=u!Y#hb4OFahP z-*cpVb_9Yh-&;2_H5Uii&zBqbfw4!8$UzvIa{f)oqN3ipz74W|_ab4@>`Bd*^(P(u z=HzQ*DyD{!!`EDhvg=>2f5XSwKjDLa39Dw{$6s!5V*I~b2_XZUK=e@V-cFceEnoQc zOP$+p;3~BZ*v1>u)&u~O`o{V);|HAR=?lAq#Nd{D*BGW0wdiL$FDqPO)Cq%;JPx}^ zB2DA)l?4S6>u(Fyi|By7TLb}L9Tyh|FxR8M9AJUV(S=!xkI<=Uyy6a+L=q=qm7Gl+ zWMutn>m;U3C`IGZe3l4Ws~6vL!_guR)?MTlnug5I?is^e8KRJuLy;>{0v;;-pPhcy zP@zlDBWZ0vHq|F6aU#{6kH%Q$&{tV7#(YZ5StAvpR@|Gc6Ya;7cMrJ`!z&l~LPmDw-dX>mA>kUXsdCVM$*Ox+^ z{y2^KJcSInO#=%tYagETJP?WCzwz!rt$KwL7c#;T01l$Oc?`Pk5xWb_5b;ilAjX|F z=MV>&L~e*vh1vI$cG0^FQN#g0P@5iZsa2fgyH`Qf-n3MJcH~YdM=}hj*co z*XV`q14q8OqpY09;T3@}zcr|>tox68JE4YjA3$sNp zKw}m)%BowEuNVb|1*itS3Kyoy7J?mH<*_W6d}rFQN<2EAuBA*35{P= z$-$#5qLntU;h}{AJ;0ov#kyXAXg4 zl@ZW*6h>(QnKC7TKdLEobiR+63T}w8T3W+FD>mc4dKX$$q%f|DtqTl)UB@tT91-rc z)%iFEe?zQ1`|^6lZ%*M=4IG}R{T38&p}PrtF$$Sl^`wjMb3Ar|T%=*WP>CV;<0qV1 zh$@tIMStFm(mpd#tYs!k(~ue>jupmLY+-CRzL94789v+RyWYPqJp)X@oqyh<`6d3P z+K~M>G*Q>tx2_TYp#G}J1+|`@fw%oEFz`0v1j3>*J6Ctz% zM6A36n=(d8(Y2(Z24wkts??tb9xDy@#;oV?v|#y_>3?Wbfn23A4JuqoVc;QqouLXU z#=UEZ>u!)&ixuCDX9@_FeIzVGx3pr4G%~G)6EJxybTm4+lZ~o`<@Z41`&23Yc2O@( zDflls04$jilnXwsZMl6T7}nAbAbfY1t+6h%uvMG;l7Lj~d3v)x5GQgBwa)<(mCu31 zEFdgNL4UFo9Tm5 zQop};>m4PqoHMNU-A zIJ8wQQ=}_c?(0L-0z;FXDz6>-o%^B@xACV7n^38asZgU`1?J3Bnw;W4su&6}N2Dy5 zA&$kj#(scGY)B?bH}un|J%FU?x2nkOmj|wm(i&WK4_O>bl-jCQa7O3^<0rsWJ`{;X zIk6AfiarYQ*gz>ABGL6-S=O55hd5&v7(dIgn8Zjy?npg)Go1DtT=jV_Hx#%9c4smOQGVXwAQDmSo{>j(5=Qn16=piaF^s~b9>*+*# z#KALBt}XHxn|-)xs3NsCNY9@KRB#wwI_Wlhj#1=Be;on)#+i0&wZ^T1clve;cYh<< z<_TPu^04|}w0-=h=QdgL+{1$c7q}vZ2dvyaTh#8o;RoIQ;n03ENOg#YG3nG`eFlKyjHRTnykW;xk9v15Xj2oe$)PB=u z;`EkVOH0N>hkZ}Di+oQ;WiMLpuf+y|s8?Ul&sa(Zv=4}c0s*_cMTY+ zKCOEUNA9j~h-XOrG5R4O`m@=y4N~Mk_Hfap`4jqkF(Ya+ySX;A%cXXp=fPTmOm@7h zbb#wtxU3#?f=&U^{mh-q%@HEOm6p&%qc=Y_q-5~*<-&g3{1@!FL+8t*r}=m5FTuK_ zZHmAdyv2fCmk&JQ^S80kP|kYNO+LSSzdCjd(MhgPMQNqrGM|Wf4f-$949VxaY-4O(KjarTYZ;F zTDjXTxRju$DIi2^M~K+bSxnaIz(3HH8d z&EFI48R@xX@|e}8vZ+`nvQ}PE&(M@I@jX1BegR@qt&IRFDDUE8J%)6kQ}eET&pM&# z^1o&4%!%{V5`%#6ctEcjl?jWBD~N&H(J=tV1gN~m$BArbYFco)t_R=2XD|$Doao2XCgdlr|j022GAyOdhMe!%{?FF>z?YMlg_ZI zV1Sl-aM_&5p){%&t-lbBegd+!iscQ%S~oiQq=kpVZym({40~~L163T$g18468Yn(y zX~bofyc1t6oU737AWoy+GdwYs!O?{)$|B-cwwgB@QMT)*M(!;m?^` zkr-IQ0@(De)4xT2b^te4kFCbvC5DLV#sazV2Pyzf|GMOUpe7_Gk%Ox39=ZoWGodg3 zA(+x32X!41OX{6HSv;3*T~Vs!2KjroTxrmlJEdbGr6Nmw*h#k6#x6SIr2$(#ZJ%TT z&LIuU8Cf8}{4kz2KGnM7Clr%AOEo(8*Xwk2m8lvy8=Mw2?!(r-Q?S}_((^LhB|SCZ zY!*|WR6@>reFR_FGygVh2{|pHw2%HSwmvUak`y9Qds3MN?wPMQNTcv>O54wM%CMI>hyeHsND27*FU(^zzQd&uSh^VY*C!8KhT7*M}H3V(13kJ(&P;h z6DtBVH%!rL9`bQcRXi}+sOnZQ%=_`5)!=GWVJvsIule+176>e_v#$_yf2()+6qd%L zfQJH$2&7`AjE)MDkO*;Nmu;VNMaTpd`D?XXtRsd z%;M<+V5*pZKVJ*uU~E%CPkRwj!JTNIj&E~bvu(zT?xcwawa8hr>>13GiSUxkag|mg6^cxF=IQPZERe*o z8W4?J2-r=G49j4!Ym-F{9wpq@zWC3l{`<}v7qoWj|Kj0$eMkB7;h%U-Aj9o)LK2JF zjYz|=z^xW!NSJ4aIV|u~GfLbR*M~={iBX@{>3Noo*EBd1g7ZX^qWd1ik~_18{BrIOet-pXn% za%Gw>jvo0kC@~CncRIR9#T8smbDn>v4hTCFzodS|m5Rr{{u5_R$5?!@qejrsQ9mHt4O`cI=eTe{`hadz(t3O58q?eAlP zq?Fjw36QQBNs=Van-(PwmoNA@VS>cz5*azPQlCfgf5*?`5}6^mH^M;&uVcuz8+x=%QULZo;i|gxiia+e5x<=;;nz{ z%?DdIRkpa=$tV%N+cS2F(5Mf57P;6?i2!R=5_=iAC@cZy|ULy5wv31U#>mdW|R zZ7S!UDSwy=y5-q)V zQwfrLhGVn!0Tv+R%U-T;o2bH#SVlG4Rzl>n$B?0}veagQY1N{B5@oXv7p5On_GX~$ zC2d5nt^4Wx&WbHUJQ#ESCBn$=Tq60@)t`gfJSKg0q_}vsO@7u#`GF2}^|uaeWwyf3 z&(k(Kw(MM48euw4GgEMmb9h-FnLmr#RGRGj%P=MVgpX?*%_N(1 zGO!3_0ET3wv4#Wm^DgY4b#>FEEh{V&vX51}UHLgWv`ev|k86MqG9dX*PK}nZp5?9e zd_gHfg%ceoVeey(5|`;HBn+_|Fn1joI4akMq3_Pr@|j;g;Od77JoZ0NiM`JEY|&#e zb25}(p#~fY3zX8q7hVHj==g&RAMio`!iwb$>GPB4`aXv4O!$2jzKpv^V`c@Rw{XA~ zL1QBBhwGX~!oE85I<%+jbq6Hlh0Ux*tRWP4l~y=KIvY?baV5zh+TT8vuD?;VA4sE52*4m7R zZ8`0MDg8yXY%E^>V<#4P3zT0vA0N{1zl_Do&DK4ISX9KXQ9jcJB(Q^y%Tbz!(IA=l z@S6!F!e95%t$#Fu7G>29BrCf$>H~06v2nPGyQdvDG={(R?<=f&%tvu#?sE+L;}Z|3 zf8oDZQ5C%RGwNztV<0sHjy5$hNXJ4iod~=~tya!mHe~zg`|9dv_*oy;Q!Ll@P-Fqc zKsXw&H#krQIqk56rL#USI{q3=WB;RMq0?+a_&sD3u5Y#Umg+;h17e8Klagrz5__Ab zEeey|@eqZ1bA7Pf;swC*PWqZ=;jGd_Z8`L$=LGQXrDHl?r1|}@9eWWwfV<#NFze&o zAqwyt8<_-6C$VTuIeC{r?-9Yj9loa{I;r&@pMGgEox zVcZ5ODPwR}78^^$SBy+d;_APU3|(@cDEk5}i|fBv?>|B#Hr*UO^rxVEHSMk$oYoM8k-hB;zUSABcx;jHP^@AWH0){ zGZTa`6c9+dv_JXY@9o4m#)P00q4E-F;)<`(3|<_r9Bvh4D)d}J(!BTT>rN+i^H2~y zX7|El_!&495s6fsfs+RZ4n!k;7>}bm4tw&&G@pE)DMmiNe?YPLXV2Kctyq1ZbXW{L`d}}6UQdq0LO>x!mJYS9YPx? zZm%faH7$_yI#&-Y01C0S1Q4S#VCa`+7u4U1kNkq{ldEGhbJi&kiWMMw02=x6a`o~9 zWdqoAFB|fJE?Fgj6OqRF?{@&?X8_)V4Jo3FD2wOQ@y*yDi0*AMWa0$^czrK&)_7-r zxMv0$>Kt!w@#tmrS6TVN2ZLkWk?+Q=WDXVWsAF&A&#P z5wXcvfvhV5R0Uqm2pFssu>+D0>%yzaQ2%NQmrxH`wG%wWF^8ZIs2POQhgUQ3t-5%|}Fjt|nr!~_>g0lb9LP7xox7iu( z;(9z*g5$|G08#jY#)lPc7oR`>%<70$7u}Nq*>CJu8n*;Ir$HutUtw(pW(W#g8G2T zIR_8(OMo_9k5xhXrvbJ`_zg8FX&v=lZZdsbdN~<4B+IbH50cvSHo0wlYHEtbyUrwM z7--$w1XVB@Pkbn=M+X#n)qR5fpdWNk$s>KHJ-oeBO`o6iXJI8muUBZ;X`i5X9wtaU z!L>O%Jml0CHT2$ns*=l{ci_?EFOl zv}FiA%nXh()?{r#Lyhqw;ya$q7D4BiF1*T2qE)j=WeAe_qM~ULbFGnuaqgU~aW$SG zEq?=eA<;BbPbk6MO?xV07hFHrahCOfH{_8kyH0B59H0Km#o@eEc7{VqkSY054iVri45@fRlEO236 z+d-37MC3Fge@zcKurK8#Vhnr>xv+UM=8|5l1NvbT+63vZ?5$t1NQ?QJRY2y<{$s#t zHeD1cYK4eq!cjaS^)Ey4FO8_QA@x!ZAZ!^D+zw#hi&yj8OBH(Wb~@3@x1e=zqV`-} zTZ{3Hq}4h-Jp#*0O3Jo-%=4HfOJ4ODY-JY}zrGIm{S2)nxjulS!7L?PeWn7a2?^%4 zjZS$XGFaY68g>%L^*AT10@>8Do+iCP9GTeMF;x+>${o=Q&k+7d&*@$PZr3#)0CfK^ z3n%XSbC))ygka8=t3NLvOeXx-J1|FJbi^{y3y2?@GeVK&QWa763fxh`qZXwAW|IhH zc&?M77;&Kh--TrQ+cEFr8A7_&HdieF$ArF1AtZ3G*|W{joHsG;OJBr$N4`nnxm*Gk z&}5~&hsjob2K`6(kF|m$#HAJoRg)gND`iKTt8hHBr@=^#eW(N}SjY$fvOo|Vdbp!t;A?jOT1`$0Z_C1u+l5g~ zYck*!N|F;+y+pJpUw(6gxI)%udH*tau|tTSoJIsFJ}l~pnfMf?;!<|&b>BIY+D^$b zZW(PgB3TO^J&l7j1Xkzl=7c`Ma}0_6*N+&cM)5( zljA9u%Ay-)5e&slZNKunXY=3`rhG;PECnlGMZ^yRYUY2LjtM1XkQ3~GqUkx~Ih+B* z?Z$#_dd1EacYmqT-m)y7w_xnGP;b%=N<$7yUbe@x;7HM9`9UB$2i#m^kW1Xe{BJES z>G5u}`~bAzt53HZbJ=+@2*;-kux~*VRDd}L^Ux=;V;miS;F}NFlw9TuLS5{^ zhRFG>Y3m@MYmpTE>Z|nHpWlS0{mavra6e2Pu5E^IYV($;Dr9oQrULIAV?x^=p`hb( zWWD&NEE${WbMzUZ3HW73n|;02{2)~Hi}EoEQHmMVRQI=IFu$Wd@FBt?)A;IStGiE| zK}1V*TG=fWn3(cEk1*e(HkF~XLEQANF*j3mn!6m zBsl~fAB3*}`vq**PRVJqgYZ znm9q2qhthlaV28t?U0?Kg@wWw^>j~M$qIax<^t|`*pA=nQ-|?47(%Ymp`-Fj7>-G7 zlT3qlo@%g*8ubS<1Pe&f|7Tp3bhtraO7!6Q3Y!z$3J=Q(0kJ^F-*j z$j?`#L(^tspkmO|I3i{zJrUz4ghC^bGoHnbbByi@K1aPjUps&0YiS|NB0$OhI0PV`B zTW49*Btv}R3z~yU9xG@)Hz2G}Tz$D2`hrm5!f8duXjjJw!IkE550odj4=?YpPFV&iSAjMbaFcm&#jGE?@Lc`4pF2V<6eZp6Y=r(ou(WyP+Bd5UlNs_&WZMKJ=BSYgBFhTP(V7V{&@&WcifjEH#?YG*Z_>W1RK7ExMm5-eDfJh&VO3DChYnRaE+j>X&*SZ8Ad%|D00Z`2KuU?Sf)LRFhq;Rr9kJ z#JGS2C`KCJ?cNnJTjPubB)h_dai;6BdbNy}RHDjzPO8X+p=;b#uynbvAjZi3%XB0$ zjNdGIKw&mm)zc;aOu#Rb8vTikyg)9Cx6_)j3hAk;sq0O%dGto1&cC$fe+gzOiZ9w z_2q*l-ti4_E77xUi-D;e44}Li(N0N)pCOumhKO$!tXk+nmZgoluyGQd8>I9Aop2cg;2DGoPS~&1LCU zPDJ#oNYV&wjq=YSps95NGOCTaI&{HdtS}yl#pFp8D(x0V=m9@^w8z#sZi!K?V6tqo zKrG$*V(S}1_(mw6EROtgJJ?r~he)#mLM=Zud`jxgpD7-3O&4mtQ!S{lbsc6P(QPA` z;&6m}me&rBCO5t#bRz=?{71H_f{y+5IOV{fk{`ch?J+B`?*ZrRuYn73E(pvZ%{;Rx zC2z!1-mUF5T)vY1W^$^KpZ0{o*3F?)RS&9$;^kS1^oW_~S@;l(4P9iy9@c9j)Lci> znGvJcDy55YJ%W}mpVLJ(7*c$y5afBc>XL*23pF@NAgkHKldF~!6V~p#hY5L>vB{4` z7@RbT2xy$rOPiWnauhs0O+>A+-nlkbeb+B++Zq2btyS3LyNjeMabn)JTOqiywA8~= zvaDCH4iz-Dw!j0}NMQoqzmC^Gp9*EeU|JCpl_u>q5;s8(eMh(1@$vD=HBo)%bKI#Sl^ls+~E93&0*>Sd(Pd-SI)(mql8FJql8qI_YW#GSo_oxcJd(4qNR5!#D?kV z)guao1b3Yv>Uqy&tdnnI=~%K=BZ^XaJ$*br6{S|3&<1h#pNia>X?1F;8t7w;^ozR_M*pwR>)Cu92&+0D5!vkHK0+3BqgXX;>s4w2?9DQDQpMBP<}1 z6T-N5J-$hI?S;cURLB!c8pNvtYV53kt6kpz@|okD{EE=7A?dxBGA2 zid;-TOG$hzlR1}@+|!>KB3+l(=O4EQ4X}0M69Yi?cv+okN@4%zBNNTK+R10Hkq+_m%AEV5=hvCEtET^G=vdRybsc zmA(@$d4d zKXXm11TWOaCUsp}Uq9)<_EJf1puHVsG+(VNM6cl9DC~qRnTNtKs6gA>+7nloIS>RWnn@?42v010MBz)Cf;>n zr7RZPQ<&gX%KYF*;NCOR(=;~0+|zhLm2k*c_=WV)z*oad=M{`Q{NW=}^NTbjeagp# z1*v`&Vvf8~)HvG!{a)WVOlfX~o)^z*iOrih7l#AthZsv&C)O*cGt`*Q>58-O^wrCo zu?|r6h$82+nweFrkH(T-Iy;lE8P%y+s2j9xskWmW*QR(+Hx2i-deq_zHNd0S6wz`p z1GuOtxkc^!TS=KLFv?vMc^_*mat9!BH4==-*-e^F#HD+XzUpCWk-B{WdmSRS5s+i1 zRv!g58~OCOsT)M1n*In>O?P+>cWy#zx*;8rtD*z@IOwSr^U#a-?L%T_`6@5A9DFtv zQ(EjYbTp*CgeMtcf<++JtQLO`jb-{~CW_k-fy9&lZMFVqEBS+L_Gb$>oX>x3tGJXsMNXke=Y09^{fl=1r@ z7x!<6`l&`3|Jh%Eguehlb8KO*6WydiwDTJ&PZ!cdPSTZrY!p{rL(JGG4?|>9dmHQ2 zYP85+plD!v@?F_H#h|-3@^QqE#fsyPc1t)6ncfD`r3Qnh8PpawbnE_#MB5x&%w$Ym z37^b2B`BsK8^)LlS!p9Q%Q-@zO{ zfcia+F=6N-eP8;BhS-SjrhJE^8&2HqWK`as*K5 zY&A;{Pe;h(U6THmG^2;kdv)vIFq}Hj;4wy^E@2=UT~6VoCx>n4y!Q<&m%_F&ISBCY zQqHC-WBHXVm`{3Y1%;y>PPvLjn2|Bfe5{SKF{npV!ir3(I6(%W<|LO`lW8?D5M{qE z(4#y+Z-6A5xq4o73#AdYilc50eZ?VpZnF6Fg6RogK9o&7#gEw@M1BIHD_ zch%7^J}oD~zf-3OqNZlPZ;t)C#@?n?t%;Agpif9dKBX{363cIdmYe`mC&eM%+vAuk zX5*JR^7eVcW1)@O6@NB1vRK>5ou~gbt5)EbfK5s|;*QI;^8{z(OY;9kEQZ=iGH0qg zZG=&T@haIUXIl+^Vrkd6fQyonvCTYsJ6HNSLDZVP4a343k`-``$wqH-cp49q3ZU5T z%#n#1aJtlu*rD~c`O~`&!~Ic`teC1<^pRKShjSZ(WN)YBQ;}7u+5UDAqe$vnV;_0v z-ybw77e9<-&&i!~NJqH0#v4sbXD)Y6ZD*uOBv$?ZcS5Kx`}s@UYU%U$xU03)&{V|+kn_?wllUQh%X(uW;KKY*eg~pF z32;V;xVjn!r-iVC)SFL&j?;?(!xuDP1yLgpj9+i$c4ptPZ}1G4)^D;c%Uaf`$k6#E zP?c49ou-C`g$=;^{W}5E_yD}TO9M0%nVN@Z{m;N&e1U_jK{GOO&&u!0Vc>hzF`Zo>-q@g}QxF>*K^ z-Uw%o%OCnu)+tG~&wrxcM*R>?{S)Bei~!w!%gaM9!cIv>Y$L+f7kEe|CTK?Rg2mq5 z`fTM6Ro=@6Lh=^W>@IwHy#hmo^YcGm#Vkh0oFkcJ)Q+%FiPsRgBsM@$_8S(al(UY< zhMnc4=wM!40d!`-(>nFyXeo^TMs{&Ia;KxpejGwR^4J~sDykq#$*9x=+uc>hFi|R| zEG?yjLmg*e1*HlHon%;mag@IFE zwe{N9=skzcXvx+0Wy#AE6kwaPSQa25nJmry9rAsHd9iw;xLxQ`f#-T5IyiuZOo){% zm;?UxsnE89v%Q5F{e9&pexSeg157{!a~9#k^}7{=_HnWRmQg)q2(Yhc5l(cViy$B+ zh3*zC3!Dy03$+!PnwpLzZbKL0pdlkd#7qFmZ9r0gCc>|gS0?*9Z4daDz7Pk$o*(vc z^Eys{yJ>waJ|8>xKo4{i*@TNmWva#b+_FUvk@voxz zKd)rMx`zL)Dw;GUu?@0N5Z%Zl=HnjnX0P07X@WuI!QzY%F8&9GnEV6SlY+$Z>GyzT za7-uChc7`Pgo67aRgumcHvC?$x`%(9DrZsY0@BfxD2d-FlZ7tzGWWuW53LBWpQxb^ z@XW9VX$Kc@Y|TH!E_U^FErna!W`l>b`V>G8Zpe^cZy)GY&Zt&Bv3^azsC>R+buYPR zz-5o9x=8Gcr^S=(Y&H_xJu=6&~m z0t&%P2;3&ar?VwXO8&ho5REbOzogyp=7R)THvnrmumgdj+yMHQvea7-q*|}au4Hf| z>)r}O)2k<;o5rWy=C@`@dv1Sk@+}IfGf|8rU#3D7=V!JpZ@SZtP-A{%wCmnYRJd)( zO*Z^C!uEIC#p=K-U*4fAN|`7+`63(U6QMl+El&%UaOvvIMK^@<%3PDr&kd1 z4@3UnpvEKa#5LN~l#%P@m7@M~1*zF$1HjOXl4RX)#Q+K#(77N1WG;sra~39)lW9{0 zn-6GCXFNTEJFclhx8q6+daiqRCP*bk|8An$W-y=Cm^$dnGA5Wh_^+D3RY-Od3p;k+4gXaqImY6EmTJY?<(;~2fWZb4MLu7)&fsYux&MjF48s5D z|GlYetSfVus}b85vvgsX&tL}E<)i#sTU%?p%zwpP<(To1`YYIC;s6G=AhbW}MJHR` zZ3T_*y8cTa9}zJ7f{d|eU+BDeBY~;nn&$#NS+P-(h!tt~dM2qJgStJ7X~m5;auZZi6}X}x zy`)d)ukWY}2k{InbW37%*E5Fp&Nlokn7w;g?_H-jZ+7gj)y*4N)Crty9ysHySdoiR z`m8$n;>4$n9mylQr4M$y5Z2{+Fr74@q`4%%Vj2)A;!MxLtxz$Jbihpi;y$FB;m`^% zYp&_+&!85YhGY7i#umm^?MINkpspll)|caI)sV@=et^ubtH1BoM=Ca2>TVRi9KTxR zTX-&IvykhSG$jMDjKOo?i`5qA0PM8aoA98)_KH!p+QoHX*oiNN^UdC-kA&7az0D9; zfD@d+|K>cXgaxr|XEHM}B`*>Ohe}FHj_9R2PD>1r94wKo=x=lr7K-bL8oTc|gNCpR z7h-Le9K>A;5o*f^a@err8C9YE4d909)Z4x{xyKqa$dPCxLbf6byL695izAmd7zYy$ z+zM$`v>4^yWRKVfi}a5ELg1J>uCdvyPR&oabUj7ZV0@G&Tp=z?6K-oEw%zfzQ~}#$ zN!0ofw#$~9&c7{Te(OQHo5sA>d%WSo%(MQmWzY3$(I;ry-_ zZkI=YoUNdP--SD&$VE8?J>i)_LF4%A8@4Q=xtT7YU0RU`A-ZBn#qP`D`1@ZXx3_FE zr{GCUaguTY0bA@jQWe=s6FPXF)xxtI$m**jLjKSF*Fw4sWSbC#6gHc$Ah)3_O8cLz ziT__c>_yIcd)Rod3?Kk1=BSfwI`Yz3B01c9>HM+W=Q^l`P zXe?@uC6T8{(honUrv7&F^Yf^!;!ABj46Qs!x+oHmh54P3?5As2g-C7WFdd6%6l%9+ zxY{!alj&DIFI;$q?d#g?T11KQ%BggYrByBAQ*8jO=HnH#Dx&JbmC_xDSP=Fb4K$Z% z2vZ6qxGec^xRFx@KbF@XUVkz}WR$)U-tNMSxi-sx!&H9@`oCXdZI!Sa&6*i3jY`LM zI=+aKqo&{d!3!04y~bCv3UqPlUv(r;F1;zdJv*At$%eTeSzJGjta0d2q%P?psONhj0Cb$RfCE_d_$ zN6X=~xbj^x-wN@fdxA)H>_OY+*k-Pu+eb=(t7hGXU718_?2iuBsPCK4==PttTp43~ z5mZHVcXv=Kta-vDtit8G{EQ$8b4t&ib-DpcC%>NI`Gp{BFFY zs+^f#ZDZ*L$b0|AYJUF8yqmy$QCgmM@bZ50O_jagmW>suIt5F5E`H3dn5wXny!$wZ zdGcfXjnN$E3geU(+#VfOJe1*u9*3;Q3456D-=&mL96oD+AlUKqf1BNZaHyr+-(U&{ zy{0bsM?|mL@x&H^`B8M3}z}^ZVXZ7S$O0{gGeEq1t$CQjPM#Z^q`d) z>99i%pJw7o_8C5McC|%$p~x~j?(#C_UUdlnj1Ya_XEHh|oNg1``%kCgA}BtVh0~l{ zOf!ol&`rh`knzxB^9$(W^sv2CCSG?2CUC+W6W}W@(wmQ`-U*d6K)MYdTI*Y)SSS+Z z2KPj}brjIWql?n~(~Rmt;szc{%2ZZyZj(RKDS4c{(uAU0iaK7FXy?u!mElAU)D?I- zGGEfN6O$!Hww%@n$Di~~d4WzfI1@=T*L5aU5D5#5^psJ2)3y9|#G76wD{U?@VmU)1 z=>`0!^B~o#smIWR5)Z*Wy3K4pen$CWm!v}6IM1>x zf*CVt=ub)Qyj`!9-}x(IVK2U)HalR!c*YNjOV;zaR`Ss1izRYR`+>>|NB7JfkEkfC zvRo5en^GW-?LsNg3JRAtUuPD}Q^oxDSw11r#&C(%{DMDl!8&j~nRFYB_e(VGY0D(FexJrmaXni>L1A?9OntnRo3QwAWiTb<|?mJdR(Q2Wyw5 z`2aA#Ev_iXE{`}Ni#0KqA;DUVG(vwjv+KFOP9g5`E^gxy-v04u%gq@|?E>DcH^cr} zvr%_!=h@vk#w!qUB8zYE@_0Ft^SaKv0!@2$op)W+!yA0p|IB~^y^*4a!+j#6hp_xR zGRScoHn%wFl&%Hu5wx*_^@oc)_vkaz`K;4*jC*zp$AqPFg7 z=Q82CE~#GL9&Q;tkuIHOF$mjEI`hP*^B{`i!3o`RHmilByC#6WTCp`}LYUjb@?99+ zA~y!#YocpL%wCSnAR(l_3}it+wi)u5iR(EZf16E(XNNgsTyx8OS{La~zwrW|m#El& z`46pzkr^G5-dBPkl3l)TN)cviZuNrMXMUx8tkqnQl+4UB=?{vlYZkP%T#!wQQI?mV z?Eu3pyq)2CN`y-Owq;c>u5ccbcFdWV3pUYH@rsJb!uhJuy!4#-t+BKG1Hx9vkqN+8 zSJ)0j0z@~6Spe<^zQIuJE1OJ7(*2d3%J!V(-u|q9B2kT$6s`Pe1?Yw|4i0L9{84=D zl%mkDz}#c6k@apYle*@F>zAJwl80jo?gXNG_RR)yq6I zaf90>{VesGo)%)6d{ho{zZl*H;(}w9o%|64t^5|-c_d$0YY@H*~v7Qe8@{wg4Cp(HY zrZ3+zYZdHJpG>{Ig#t>x>f(C0IVs8Y_i&}Z1Q!Lh;Lb*p^{J|;1=ee)N%J68FMRdB*F!eaqrA=^q$?Vf-^cK_tIZ&|`G)l6C_2avvd;{_1F2WXe~`kd zY_s){iw~>FSOjmf4R@%LCkFuNRCDva-PNTnHr{ zggU(O28QPdf>t(&!px%{kMmyO*Gi6zj6B9_Sc;aT;k9l8;z*Uiww@+uk@2wtt$Yy5 zgz6Ca%~Z1*b!_tB53E65tAbd7>TZoO6xt}!7ICo7RcpCJb*6e0gYCdv?!gu%N+?f* z!T1T8=sofQO5kKh%bJt4G3|waa4|oI{8`-Id+I>pH%_RHaNtXZG&E(=^ZAt;uKf$fFK8Kx_3Ei>iGHi@Q|g)SZ0WxF631I@U_p$C~F-|7wGOU zj&4%?l*}0K|4b&qege5Kx2~thbc6pmW-YI|8I4!uz}~g;3P5D!x>|9emAF7Ya4WyMRKVQ=-TWoC6K~*I;2;Vj-iEK&o?ngL_2bzDb}`HEw1qX z3XnXi0un2u^}$c1$ktG;K_}JjxH~syHz>KapoUXeV1Cb^x_r;n_*1GBhrE;G2!^K~ z*MBEqQ4I*|6XoD|ckhwpUUH8OGN!mkD*pUpT-n{cnz?usRyMzO#`*?Jl?Y<87(eY@ zouWMthd>A8xW%560NfSIQ4@^tqVur1R{Fuzai?)$pKrHSr#>pxLU8^RS$;z0kpH1gWMA?AJzkB){6|W zzbP6r6`m%1sca;OZy3=qAdBq1exZa9*j8uW6v9Xj{T~#5)YAAdKrE2GXTEox8ohCZ zDFX{=X{>9~Uy;HxT5F87XckkiUcu6K-e8}Jwk%*xSe~_sto}IBV0r{{D02Zx(t@A=tfO2Mqz_u7aWbUt3T3xD6ud{7Q zUMGdrOjSM+6H|P5U(wUoubGI5*a*oDJ`AZxz_cIol;3k((^kkVqabG1wmjdrJKoUx zL?cl++#DdltXeE1EgdgTT(}}y7$Zs6)m@^aHv>EJSZHEfS<`*-^P}BHpUxMzbqeBgt!%|6Mog<;W9%#LiFsPX9H<00CD z8j1W$tWSp9UeXQVhrYz;Xhhi;of%x)0oceHoB3FubgxwwqsA%s3<6q~LL31A;ro%f1@i;hj7 zRVsTKIH#dWgFS&mnvSn^bB$YtS%^?_Zk4!Ff>O;Y-F{EyD`t1-1tXQ>dAzkXfWL8d z1lS)zHjQ1x1J!9*xGd4-k%J$riuXcUEva&oH{~m&o=k#bjT{t&9ew~KJvw#Sd_rg^9sr+fi2qZ6c~1;_}-K8+4bn^&-|5w@MpS)jS@ApG8Gn9 ztMMP><$b*9#GD8#^*m)d8}A-E4I1hH7E|9v3qZY8`H5ZzuNXVxwHolHnX>m~V0RIz z^vvn5fQDN43fjX>=G?OK@;o&^Sz~!NS3L4CjYZTQo-}qtt~<76E_qK4VAa zPB_7?ClV9YkyS&2`d9npcjJ0uH8ss9`dzNB{!Vpu7?e`$mAHv2amlPMr zbk*JY-9_ZjC<_McYR!D5+d(-c?vp`P zs=0Krs+=;blB||nIP9RIU4mBi@qE4?Y1Lg{)1$7&Np1iSf&7dATVh0XJGPssX4Z~U zmaT_}hda6V4D+&2#(w=ui9C>8txAIZIY0LvMKlz!?USvER7s&kx06gZEo- zFtQu$aQX(s7rX+>k)`6Q!8Q@cK+Sfsa;3ey#QehkJ*7?qDn!|Z;_HA-^s z_IW06@Yffii8C}60lv3k*h`kKhnYZ!KiikU;Q!UZnKY__g4sSFNt%88qJaI@nJ>Ec z$iX>V8 mzwmP171F~Zkp%KUa=nBH@@)hZ#iB6STWX5kjz}m$gf4z{e`eCHdB8( zpOnh|^Cn8xlPA~&)YL&SG3_83V=IQoZFOxxurK%V4lc0UNkElkQAO>HKzoNT6?G6h zC1J9^UaNUCa-Olz(o9LGbHeJQ3_{sznN%JfiSZV_)UvoZr>rU%OA}^Iu$|!Y5%015 zIH8{)&TQL{*Xt%nSLa#DH>LpuH2=hKBcwF{d>X45{(vq$we}i-i+~?4v&ynj-G$?CiXu zgx`W7E@ln>)rBtq0lwYVEu;0FM_m&LF-D?^Cs<1rnI*frOhq%urMU9`$q16l&dvt% zX#UPKyMeKlv)|75Yf8sgYK>~2IDDC8u6PwvT1)yo77j8iB2Tv3I>s$blCB3mYOVWk zX=^-j1>s^xNU*6jOaXUNxz(w8hBbwtauRSR-$CEHd)IKm54mj$UGsGY9Vc_PDN$ zOeuBZ9!T7N`^#sK-siSUKJ5-|3Aw2?ArLRrU*@mW&kd(O=FDq*#eR}feBc!2ZsJgn#*q7@p6JJ1}8W_3S5M-)3 zD7kTj?AX>|CHZ{a<+J;1Dlf=<)w#XQx1R>LN45+H;%?}`Eof=Xb|wwTW`ZrY#tn>` z=cnJ{W{*si*Vt-(Jtp*bx(;7(F(_Ras+lOojjwIadp2D3CyQqg^XB2(K{&9H6;p$e-tbMMr{aNCNu8uQyy?4Dw3^=hYWwEfb z_Q{GZ9$QVaJT?3`@8!t+{Mr`xXqhL>lf*4$2tkK6gB@=_Txxda_dPtbZZOea>Qg#) ze(IK~wY22bu%GTIDYvPEB#6vNNlCd%+A`>0=eybM-|kx%$eg)0%bWnu$huJvq)(Wo z!0aT8rn;bJsTDh=)|+Mdd7hR1C*j$S(;d7!9-Tt6w2wsCF9l42Y;rVT8{zzsj*!TK zd-t!f`8LJ|pWl$kkP%YCwBP5x&3)&8R6pIhpak&g5@i6#p^vJ85*>jW7K9-9=BKu#*Ev4d)5zKM_%q>YGtg8$CSEb$;Ewp8G@u) zN*c6F=5p@k@wTtyYt9iNud?5*^TBdAsdALUPv#t8mD#2-Q`M1cB3JB)YR0pCeD98PlDQ^2U3l0b*lx<{G}|hH}xTFeO^b_ zQ)owigu-ySeoCZ6|6B1?PS4$2$4SS*%q<%~NYOPq-N>06<9TBQV`gIXpCh&WccQZ$Rj)J$Oayx)G=jZJQzzWZW(=klsx{sd!KyVU_bE&o$OU46ZukCuf=~h@=h#FgcI^$|1l28oQD6f zBKP6WO!lCdO-M;GbmRBsrY(P$prNJZrZ(z(wK8*kAypd~m^l-S_OC7@(y_SCZN0Uf zf#8cAx9r*O*8YG{^vh9ZblQMMa!_W&ycRySgTM%-J64(!BbLygO0?WGU@2OnQ{>%v zYA9|B6KI|6<7QcGzN;QD)S;U9Tbwt}g%QM@M4jx3}Zp@k(|*f8jZL?AiPPS45ii>wuyHk*;G?T{jH33+8i0 zGh8#dPZZXEPmgVfOapE_z-R%?pW^>VQWQZz{|s8$Z{)Z*xJknOQ0fnfL)ro*($O`+ ziWnAehI5wHDM`yLdr);rVBCkwYeQ^DK1$Zs{>mNF4CSM0^Yu0{NaO-!G*>|>6=8mRR)JJp%JT?R`d05lm6BxCtXiGNDH7Jyc6X@ty7y5{3BZO|2T0Q*Ed6YSr^ zGj?+8L7)>#AWOEoOh*5{h<>3t7hE}0eDB%>syMdA9*MO^Db8b` zU~vd-y@`p5na&MJ_U=!sfb}Qw0(bPX{gqg?CGLO=Y_7T$qU+!I0WCnd76cl(LmSUA z9lhiU&^6q*NptB0^Y<2C7;BaAD~@n~+=OB4{@Kr-MB(fH&2N8IFnK87n)NTdBqZg& zC$rxMLB&u=W$VUo4RRxBY{70tsv;B*K$lrldDcDKqtE9|lrWeXo{Ka}NW|FJ{Tidj z=*qY6uC+C+!XcV_91X8Mq0a2#&oYvl%OAnocS2EoXVi@FE83X#fY6mdwW!7{TutQW zr>^QojGPXU9d8#H{56C+xGo8K!!RDY9=vie6erz!!@|H}#XKJ3ZE4+Y%z=&75ffz& zBH|(zbBijxH>NXZDtS0en+B&x1oRuNeg?VL_txJTD$G&I!Hn8PcdC=7n z;ddU?u!Lg187#?{VjeZQd3oaw{Uqbp-S zPutO$Kk`V_5OcK@iy$R(ZAst|nLHOsH2W6X{L`Yq{(%y8gT8;*&;2v}geEl}KfmDL zt0WvZDdyhZlX}k1S98}Ftx%JRrp?{NGJk(1-q**5?%QNR_>z+r=I{wKmZ9X(L{r5C zewH-Kp|1~S{7EWWwIiXbstEcmz zUr@?fEW4_0U~)+hrMZMA-`rD#nj(9rqoCeWBUIQ^02ao#;)psSohi=bl?WX23R=W) zNKk`byCY@!sh#uhGn-E}2Ua`x${w(ryK&Q5^F@LE``_4i!6oD!4JuV3YD12A3;rqR{a zd?BDU3)z{;EmWx(viBAyVAjcgY?M>NH3qHJe$!wlG#rXKg^qz@nVZ6-tOWUHB8DC4 zxnTjni=uAuZk3_1c9C0`?r+d$1sMX8C8f-9d<6xC_h^BK$>U@Y!~W!?2pLrQjW=0)LF#Nz)R7AjF4GlG zbM>I{+?C?@hjZj190w3l>1jS|$-;j3p;?Y{>YOOSUbKjsdBgRfj!*)|j^{L!7-u%8=^-H;ccz^2+n7cklc5+Q30*XlUXBgXy&Lfqo4KO&BQ?9Ua}1OA4(0efg*+J>)z! zwU+*5to_5vg%Z5cCo#c-Q+D#Qy;pki?_A!BXUA#3Vn@c>!uF!0l#I`}mUMkIkyU70@9pBBBiaaW5T&pCh)! zxuUlJfmUcdbgyF}9(z{Ny--6)DHK9a$3ymH{tE&Bm33Ty{rx15dy5|Ei!6I@oY2N= zfM*WBOX(e%zF)K7nVi9zSIhP&=P^(&K8CvmUQ8hMWmfdP3$WyW``n`fxE0uuK1XgC z4T3e;{q7SjERBOJtz1!88b6MzBalzmOdWF*FLxx3+SN-Pa4UHG6uS-NWw1XR?}M-% z?g)Ap>#SOkkRH!EyY9I*qf6@SkM;nQuOB+}wOm0@q1R~-$3ScV%9+xM+n7$vUI2cY zFW0LGZ4sMHM>CT>+Y!_*vA`)4F|sL-Nh z>5o%GgoVl4yx1&G7L^<*{s@E z`ILx{+O*pW*c}<+B$KgKNWPw(7HY$S+mCwMGDiHiAF;P(%rUWY7uh$I&*&Ez8(E)H z#GY98EnVa;9s7+X**ui9LcUJPpa6bMMU%}tb^m3nem+9i!;SYG!3X}jf|8Ac4;MV{WBp1M9hC|1F!;>fEm6g3Y&Fb&Y&-tD{PoU>;5K7=);DnXW?H|nmoYK>>H*PLT z+(#%+bq-ezKBwR4EmY$$my=mZS)`X}*`IXJeYf$!f`7w;Z*^=y^mPUy-%an%Qo9d(qdA}EZJ4UmywH@t0K(n$A zep9Lw$L`fI+^nxD9+PrG8TOVZRP?ukx@xvZ$J3CF5w_1@{zLLD!q&i#u2Li=k zzS*dkGdbgA5oQQo{us1+{+I=CnN0J>cjm+t?3aA>=dNPU*sq3cZEf?^2ATw}Cew<8 zU`||J*2aBXH^rWO10J~b{j1o&t<25*4$!y&6L6UY25f-AqNPBa1<=!hrK2l?$CfVM z!~Z7g;frU%(Wnowc!*vWPc!H`(RV2pxM67#y`I&>+2$l-FHe390$N(4xXxY59P;j8 z)J;v2kw*r;?IT!`ID|kHqukz+wW{vjp^(l)tAhAaZT4jY_kMbk>y4{5W!~5uoQj+8 z3RL#DOHcYrYunJ}u@KA+fF&yu$mTNv8c@99Xu@e@*-YaM9yO5 ze%DT|?DVprueEs=8fjmzo!2-{hh3OCd(YKKZgM7$WiC=&IG)zOnmoo0aq#!k}7gKsyx;wkV#p~ z@89@VW>rw;Rry;5hKGS6sM!9b-3;$n$2Rr;I${3j;x%-l3anekhPS|`1t$>UGVTH_ zWR~+%oer>VNQ;pn|JC=En`2ycB(pcJ<1N2`IO zYqCH-08IgH(128^N5vlTdlcIY=@;J}v}z{477lcT3HaEnS6R~7jjVrWcB8j*)y-lK zpf1GzqVa>Be5`?A!$c!wvsdD4Y3Z6_r|`Dc1O*9LxnXNCecK4H$TWY`weL(%`Cbsik2m}eKB~4^} zLg-0K+!r~NFVB%IJ10L_J>Y;WEftrQ@w(h;!jx!xRUe9(LwG>+i90Kgamp74Im66{ zwd=n%Py+5K3byRa{d{oS+Uy7jH5jhGc8-^fjjR_X9P0H6=9buQ-nH9V7pi7qesF0+ zZ_9j)%!JyZ%@*$)78~O7nKwe|$Y-Gc8nyc`1z)NH_h-}Ns{Oxf&#DWWou_Zv#(*V0 z--7=YCt`NxugLvh3s0a6DU4;7Mct7g;Hao2Ko6gdb>uf8^5alJQzQyn63$}ngig%X z4WqwbDJ3v+qVF}S#GzM+^>CvtEIOqRuptzDo=<1~`_K?_tP|IN8;d4|6*vOTL_ar0 z=J<|;*+{Bh;hgb;EfxxiJmf@QvAB;Da9?I2}afM1=!b8k|#54ywgG5*k| z*QKYb&FXhC!>yWpJOOKDVzP`95japW-oB0EyRHTcs1f%k>Bza@ZaM+Jg`|K)Kd0ty zKH{VB^%bzM@u<{cUyKk7?BhZi6kaxOIa2pb(YEX-d%gUrr3#LmE+#u&B1rtwr9zut zb2V+7S=4}5CeuM?)PQ}!9;GEO=T%F)s9mmaP_d+3}6qN-54?^U+g)C-lv@~&HAgH|d?55s989jC|^q9_^* zNW;|ISCf*Sb?Gk-10R*nnK3*JsT0Fx{ZLgCM$DmT;JJs;KgE`DR9Wsc3qvxudQS8h zX1;PIF0Y+-oZoRzGQ+m|P0O9;ULS3nG`^%?vJ|pB<3i5@`D>bWslqgES-%*da=@yB zhNk6s0~n38s7VLDW6D|IixOjqJ8hJkX4+a>n3@ zhH^;R_y{^y`aj2WE=TCj{mnMk6kyJOS_H*J*g(8BCd(oO|#%_-aFa)YmTOzpe8f zio-b-^Rmq>UBg{m4^XIUGCLb}rl+n5Ywqw8PCF1x#u1zIW%i2jkgF+>@~Ve0?-j9c zuQM|gaQw5sV z2k~1(sIVoht;rnzm_R0&4oky_L1wh{+Pb=NpI!scjqkamg2I!cnj3!U96Fob(E@+w ze1)cK23mk%?{~V_5*U`yMZM-fWk}d}1n$lSm6`+rr!>!=lp@dMJtPooqrHkwu8#dHWEr|Mt0tlj=|Cb&eyCspevg@fG#N zkd}4#QH>%t;Py%U2ILSFFbTNAG`FtL8%d(`hUNfDWasblbkMhogkNtoH3RRnGtgwJA2KgC$H~Zd|cq#QzJs3 z1DqC=ZN-{=xj5j~5fwG5zLZ^@mLH#)_cWFH#`ltfyX>kPBF7Y?H^xuK60#rI6%WU;zm3u;Q-(nio(ami~upLlt7YH{S ze?bqRxDj~PMart`%ln^VO5L^ zMXCN-J7wZye4=wmE7GWS1s~5{vDEz9dYsjNLf9W^T5-+M+WXLESSD*1)@qRwwd=$Q zV7*NVzB-mx?VHQQ5I8S6@Rq#-^FzAJ#I0cZ6nHjB-u$uP};8*b-JG#yvto%5t)|V79 zwi>Rs5eB+{Y+%S}y?b+3`KLs;?&1rfj)>FNXwJ*Tt|_lIGHyjp5j|kjU6#hqmtJnY zo)1xSspxR6{x96i|DYgD=1YL4>s@wkKrAz_q&=0MF;?j6{WhGvYK%l=OM(lowv^RI2n0D~J$dKAh z@O9mV?Q}p$scdV?=ejS6gb)aB8hn4wH#$0vX8Zt_8j3oAgAZnq8~`aTG5D7M@_drr zFo}9)?_xWUUKhlmf8jT`_ThS0`Bvz1FX^>YCvNM^%%!q$D5sAfU`g-dnqX!uZ6Q&= zdxhLH=Nyjh8}@q(d*t(3Cn}RA;Lq15d#=gqacdUx#krcU76}v!mS*c{o3Y*bj$cyH zfz3+17hn_uH8xQHC#_4v+q)4}