From 40bde528bcac79f765dc8f15d6d1512b3415199f Mon Sep 17 00:00:00 2001 From: Liangliang Ma Date: Mon, 21 Oct 2024 20:25:11 +0800 Subject: [PATCH 01/62] [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 adeeb0acade2f..d19e73aeef1ce 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 02/62] [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 6da48000dafa4..ad8a10710bf2c 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 03/62] [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 ee98c2d5cac2f..0000000000000 --- 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 6a6798eaeb9cf..2da963ae64aa4 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 04/62] 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 1985d91413de8..7ffdfa1cad659 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 05/62] 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 df7a2f83e3bcc..669826206e4bc 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 f65d5e2a03bca..9ee546437f6cc 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 3357c200bd68c..a5538a8c6e689 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 06/62] 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 cf70c4530c822..dece5a2c4ecf4 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 07/62] 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 ed2645d415c41..988b74232bb92 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 08/62] 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 1ce2414a1e17c..90afaf03550a6 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 09/62] 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 6758c7a657f63..57be0c7938560 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 e809fe1118b51..8fd3ca9184330 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 9dd288ef46dbb..e9550a0ec25ad 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 915c89e0b00a9..d9ed54322d5c2 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 10/62] 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 879c0a1a2cc9c..fa9220f4fcd0f 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 55fb72f6c9fba..d5db29485db39 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 11/62] 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 96306184e42cf..f87f1beb7e4eb 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 12/62] 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 1609bc9005f46..461281d4a5699 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 13/62] 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 4e9ceb32b6b16..fdd270b89a21b 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 14/62] 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 fdd270b89a21b..9f1a9d973ca27 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 15/62] 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 484948b28e34a..f094c880c8b65 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 3de878547d6e7..2ecdf218b96af 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 0344c80451a68..5699b60557827 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 16/62] 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 f094c880c8b65..639f27498dd9d 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 5699b60557827..af406075b868e 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 17/62] 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 7ebf5487cf9ed..b75270cbd3068 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 18/62] 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 fc0dac5de9a26..007313964f4aa 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 044c282ba1198..f92aa7edfdd51 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 ed639aeb3b62c..31d7805db7bb2 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 4b9f278448ab7..bb1bc987379c3 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 19/62] 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 dece5a2c4ecf4..8b1455f20c693 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 20/62] 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 e2c273fd913fb..65460eb72a2f3 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 21/62] 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 f2692ecba3a6e..27ddf0cdef39a 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 685f943df2fec..f46ac666f27bb 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 22/62] 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 f46ac666f27bb..1498b0400ee1f 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 23/62] 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 b302e32dfd9ca..31051297d10cd 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 24/62] 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 2ad336cac4edc..329a1060f5ebd 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 25/62] [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 25a494111c54b..bbb8a7f00b1f5 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 0000000000000..1f0ca0578e04a --- /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 26/62] 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 90afaf03550a6..4b0ddb7679a9f 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 5780b2afd6def..49f477cc4a1b4 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 65460eb72a2f3..2c0c9d498d139 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 7262a1b2c998d..5dffd70aab687 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 27/62] 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 b89c872eefe5e..e249411e4868b 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 d8655299282f7..de405dc40edb5 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 dfd195bc37ebd..a72b3c951e973 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 c6a69dd2a49fb..8fd4293d312c0 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 8b1455f20c693..1c5745dcf1684 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 8be2f7ac40557..fb786f29722d7 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 36300eb904ddc..a82d8b1d5c7a0 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 b75270cbd3068..deb44c2e71eb9 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 b9617d3e632fd..f48adb58c9bff 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 ec9e9e94aeafe..1d4fcd60022c2 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 28/62] 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 e249411e4868b..b5d8afa8e0b41 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 29/62] 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 3103e3f36e84f..37b68f1dbe800 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 0000000000000..603fb614314fc --- /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 0000000000000..a0a7193201d47 --- /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 30/62] 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 7ffdfa1cad659..1282fff53bfab 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 31/62] 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 0de6832b37c13..0125fa50bc140 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 eb3ac9b03161a..1a13c0f3f4f10 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 72ba8abbd95df..fc810bc190d0d 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 02881ef12f39b..eb763792f0c4d 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 32/62] 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 0000000000000..bcb8579bf1f79 --- /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 33/62] 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 ea8d2f5f806f8..6e8d5847835d0 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 34/62] 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 5790e79e2bc2a..e276ad0856dd6 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 15d4e74d69d5f..465aae7b9a343 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 c06d3a6b35e93..6f500250f033a 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 faf99020aee52..a7db6fda37054 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 62b3049232222..beaf357a32117 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 85896ba86e194..6a98162314f9f 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 35/62] 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 de405dc40edb5..a8d15cd5332bc 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 0000000000000..208299fb8c50f --- /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 0000000000000..8eb95e49c29d0 --- /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 36/62] 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 05bb23e8ddd94..b639ef6a14562 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 37/62] 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 b639ef6a14562..e1e745d2b1121 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 1cfcd784e2ceb..7cac7e3c1ce71 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 4b0ddb7679a9f..082d7e874e4d0 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 2c0c9d498d139..04d52319ae8c2 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 c6a202d485eba..983e64642c696 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 47d9ff698f1f0..14e8ae2d28235 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 adb2f1679ea0e..51e3bbd6eaaa2 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 1d3b88a04a4e5..74c7098836454 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 38/62] 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 1e4335b192928..0e49bd9f64581 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 0536ff6a362e7..fb269b58315fb 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 20e81fe8eebd7..6b7599acecb44 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 6f311c5400c72..9452513972257 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 f841b8ce520a5..ac1cdf90f78be 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 da2ff568d74bf..56fb33fb18869 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 9de2fa2540486..debaf4a90731f 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 02b04057d1ac3..1ff0397043fae 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 48ea8a1339d45..64d7c2e0541e1 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 4fedf80808189..dfcb4125ab9ad 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 b80fa2d6c8e6d..bf298b691b814 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 f4a179deb9ec6..6913e9090bf57 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 f49f74394374e..b7055c8cc72b3 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 380bb0b9b6aed..d955527b1ba33 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 c052144a0190b..f11245c75a5e6 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 131e83e7b838a..25f68e177b2cb 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 57bf8d2207c45..2f165ee2c32a4 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 90b2d9b8bd31e..1f9825c34638b 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 4fe7cbba90aeb..aba3b5179d418 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 a074cfca317fe..1aa5f647a8aad 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 e94d42cd22af8..d97eff452eb52 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 39/62] 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 3014be18d6820..f833acebde9af 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 b1a8b53697610..e66bba3f818b2 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 zSK7a?D9pnEi}u%z;4vGdl9W@zNH=+KY#s?^Rf>z61R90)6d+qggV6fXN#&mY@uA3} z@HTnUdZV&3eMD{ukQ*baq)X)(UbVJgl)?7HjT+iC84FbeOMjL3`%0vae5nY&H8dgv z7?iS_gtduT^S=9hia=DUbZ_GqQ2VO2R~G;q&U0+XNh%`{8-&9=H?hkN7TMA6vG6vucD}Kw1Cq1d<20rum65Ylk{sA0 z6~J?CYGGMHI`_YRDX4v4`XwsNL{4t5qGs05u6_Zb=Boz(Q+H-z^78N1tF%dcS_&s{ zl~?}j7o`Am?tOnLLY=iO*wpio=Om5q4_nw1lSeMv>vv-$LP1)ROtAS7>OQwah=t}* zr!4BpyK8G+Ji*a9(1Y?C&7EIM&yqdkTf6z9%xQ+Pw0j#YO21|G=5_~3CN?Uuu>)d# z*3)#hYrAKh|A-&^&iM$N>Bcl zc`=<|^XV^F_V0l;Gip*xX!qY{N{En+u5MhLY%L;_3J% zUe@_o;4B!c$rAvxAJH*h2v4AQ0cU(QGH8sBF%*vlp5=iwM`6FP1?y+}MH zGcWas3pfo0-P5AtF?%#@%Bn<5ZH(X8A}E*{OSg6x_0t2BAGQFb^{{KE-p!#enpD*+ zd&LrTW>O;yR`Zs#2MW{(V4{oBQLR<3m3yEoLDsXtNVKw1C5}?Xq&GQ}#u!6uhYL2p zS>-yyH0`|x^heWJi~O)Jbt@D0&vc0Byp}*x_Fl*?Zuu=eILffWhY*__nP=$fP;~}V z9?MdMh4{vCc@`aZW0r<I~Vc%mqIS73~pzCVhweuijyvv_xV z8)#W*Ukvkz{Jki=WrP&P#8f_OmBctLl$JaR#=et+k2&XMY?1}%0I9C+M3I|!2Vc+E z#(FH1kAk0E$OfoUPC(#(L_NXqJSz>n?L}9xSb>3*kU^@pq0!Lm8U2iD33SiaANk=X zC6XMAd69fPz^4z` z{}$*KGN68^Ec-2WlGKtW0>jN_7v|8y;)1{Z<449}G@k`0?0Ki3i5)@y462)*UL-@; z*gx-wl3ZmzhFwLw#?#e25aNBhT!J6~gZszx+ezi5e_f9buZWYD- z(4{7z*U;ZYItkiAj53Yk2lyPM54u=>YDlh1M=WDHSq#K8hBn*Bax%P~?n{Kn@QLBh z8?+ISAd4UbsK;^hwDlPJVo~39r&kP{3w3@wp!o#kSQgA)g@xFsDLfrDksOQ4%IQ7T zBele$iFDf9cDI1G!Kj9WL=2!Ssv`Les08|zzMZJE6M62X4XG%%X~aODmP@xmOHgNp z8&Z=d0hJzN+IHB(SZT6`B{+Z4FgC6wBreP%Zj5RvK6`dQAc1CP|1SEnBju^`SF<-J z#{nY~M%9?LRdBkJ4fgH$d-bL_G%dhh5OJZXdK!JtQb}q~B z9avM>vUk3CeJ0SKL#+@I}K)MAz$FsWFmlYSBkG(tfm!fL$qqn?anDos4>XIz5LdR(@Xi%mgr z;)@D728X^=8^c${A_4YAR1dBaY`_w^^m>)9CPvOhcdDZ9=jP@jyR$Hh9IM$n5)G5Y z_2}T-n6~I3`a9*{R}%f|f3{kwRGY<2SCT6|to*?aOr_HG7)8!*tDB1$VkOnz=C@n4 zrN&g#Fajf1?x~ap8m`fs(HkfDV%MdYOX)8c_fxSFWkaSuA9!AJIPMPi=`LmJYMYt2 ziMPHMN%M?tk>`fgrGn5-+I}{iw!Pj3|lY&6nxdDQJ?n zgHH;uPjzX?InY#Ghles15=%>7KWxh0G0=NuM=dU>fLQ6Y$|$EgS_qrW+ht(EZYsR* zIrI|^%90sM;)eMK0y)eJj6L@O4j1^5pzhmte*X57?P5x2^kV$#9m1%PJWACpBW7By ze<4bP-xg>f6*hY;SI8V|3f8O3cyZUMda(+oY6(z9@{|mjLNcI58$PqS7!>}XvuOr8 z)w$Nt_kBq;QK}O4<+MCY=XW5OyjhY5|HYD0@|Y#tp}FF=kJCh_kD`*$^h~evI}_3{ zGa6ytv6A0(&#U;r1EFal9w4;TPwvS-A^A;quy$r*r~;rkO|=_K8uyXqHna8=8JELo z{nyIN#jbGsr>&zq{UjZh0*_A~nW|rK?`YX?pa}yH$%0H$D$E)TDKsk5PhWtBbBt29 zuE)oA=lq=ZfQeS2(WkD&?03rBm+`%W0t~SvbND_K&-hG0CyN`?aj%T5nbi8dEu3_C zDG|@7p=vEu@p5vDGwOoaA)P*dzGM4v)}2wjlk+NRCRm;Gbqp+=oh$=k`#|Y{$GCZhY;mLo>WmHCK2hUU@k&F)KO`fywG{t^qb@62e&+ua?uW>8$4q&S$={y#^ zDys_W;!}1ApgM}Z1OqaB`aN{1z|dfZ-P5Jl6q$L#A=1b3DHOgjCUn$t4*0T;4;E6= zS&VFw>CA`f2BzTL>E3Oj<-3J78_?)_r6@-a?F_So;2vZoDK zm#rqp2Y^VBw5VYVJ;f!+((3-aZTK2%D*r*M?l-e!7}}Q{h_~H zEkl?GTGs^q8b>3Z_}po`Ycqh^yVE32^4mi6>rJ0?Q7&iH(P==p6RYG z@J-=07_YVLDWTox08)Gr)%s>#IsZpNYTD3$$Q$kyl3EU-eHm5off}>7V=WnlqQgvl zw^me!_a6O{o*ekR_|gF%bzhYa(~b@Bo$9MM*73ofRs-ihbD)n(hcQ z>#W|_`;2y$?$<(MxG8J%oMZP56lM*}EEIQ3D(iqQzhHytvZ zXo{hdzWbFSa8vi;IQtf-bDKd|0f14d@9hX0TqVryDWQlpB%dt0{thw6N^U(9Y~bsf zf&S)9v!IG&um;=zI}pd_m_H4Fg-W`IT>~_wMGfv^CLFyR!8g$oX%ci1zhpIwlb|*)1$d z@wU?4@sxs5Us}|l3!|pRM&KrW`g8u<>g@qSK5)M|aOKv@_ww}MEFbS_CazYCIRK?% zd9pWy%y-=z4DDnX^L_pB^hSwG3w%U~8_?+uG*RVV8Z0sTB>U#)(+RA3|-$w>j0HgZg!{UMG54C9gi zzw<$&5+QIQCapoz<0oIFyqJLR(=lgONrVa=o><%|aQL7?aLmTb&N5U;uCrWm?FC3S zSZ1txqKKMVLT%$Zm``RhGV1;V(7B{b(?KHHaB#bwO2eIA<#SrQS@)l}orE9;T51%B zIov^>m+3;OC|gU=f2x;@m1f^e%H4b6>j`I_3IBwBG|*AmB7m$N`K6>1G7(OIfX09L z0CLZCHtt%6diQnMeu43=XLvflyXmv_{P?MhmaLCT93ax%H3?W2j7;Hi365N5!%8E_ zF*&9hN$^Sm7nKBclD%~Le`;w{Bq5#Bl+(po<-yK1Z~=-f_Jn)usm_z`tUr!_$^C8v5QTBE3IvdZtbzxNSImWlJMs`mb~?)g06ip(>hHZ zBRnNV#d*KN{eL*Fvl{r7&#*yTPpJ$_8y`Y6sar$#`s@B@`4ESM1doW9-;VIdI{$-+ zVl+8I4+!!vHNF}=*gAHrx9eE4cW;08l$e(mwcl_@O*Lfj(@4vK$!nXU-HAN&+|Fh* zGzSK_ivmz`FFiT;x3kD#LXjvuH`kTxbNVSd(E&0DmwL>d9$u4WuN)z9L8zQTi#rPI z_`BlWRHONu4(cu1Q6G-Q4&$*6qY69;%0dwy;nwM#*D$XJWjP`j4Mlv-!La3j&`Xn4 zTwsL#Fy@xacB0$>p+8w2CgQfAz5z^{y2;oN=ZKW*3V*@m^@@+mk^xQL^NCZ{HHT^C zvHk|n;(S_X8KXf#{e+MpbJd0E?My_|@_71|7DNM?R~Q6+uMhnmCNE{Rgl^-wEB+DG~Op{OsLNZo(mU zsysfR_PcLOWn17gXyj%h1u#aFv3l1#h}QfZGZXE`f2;MjNo1lBv-n5 zX3@PdFLyogtdZ%D<-)K9$(t?aT%L|9(+Cn7^fst`7}-5bLhsV=p_)i4)750cKg5{= zKu+!q06Ee|=fA_V9j2r`wL0DX2UQ4yhK$8sB)a~IXh=oaOXtfmDZOIZcv9edJGlOn z;Xp#TTEdmn*~EtX50A@TsEAwFqVh~JkSRkj%D(F6zzRu`TTv&Sk?4 ztg&Owx=tCKu(==NpX&sovK?<|W zlwnv-f|frBN7(%fpl7thfqBOGjLhd zno_&+kZsl0o z>n`E{xQgZwl;A6I*MyPy$8->Pa3>cNwu$AqN~=Hn*u=rPB(ZS~CaRWLh{5IVkR3YX zxDYIfm|)_n^8MAR{;!Z3Icc6=bbPO@8qo%2ZPf%Wra(s=x&FP7HvIto)#(FZ(ScxA z*wE2D{^Qg>8OSk*;)`VBoMYbcEb@)9f5fKOc%-?z%H2&;K1Y=ZwuO9rdh)vesuejM z<#p|W+o_Oei|Zi|c_~m9ieooWd|5X4?h>C!&3lu;T^l5G+H_R?h&c>C1SsNJmai%- z8A!6)75jm}H?>^aec%!;rnPv>+4)6^O1!;KJ(DF`B5DNiDdK4%#HU;lUBAEdwg0Rc z|3tmb#pbeg3jn5Z&#e9HIMxBMU>}#dSsko3jOW4!*8@*@BSkJ0yh+`uVDi4xlb@Y( zV1KzL?ve>GB{}wa`4^A?!y(!A;Yq&K$>OmgzZhNn3{+(QjCr?}W5u#8R{MaFmDgv= zLN(Q|qeH&1#gcqP90N0`Pg?&nYrGOzzWyY8n@3su=2m@{VJTtbe!(>HBX3S&T^4Pk z-}uJ(yV9zs3$JhHUt?A0@~^5*eFlttLU&ux6gTxKw&7Ye+CvpAY6^0R#!-E>-|1cUB4egCTJKUReE5<57~vYR ztyH2PV!F^d`CDz!ot;Z60rnfvgau0#F$j=}vBi41i*wtFeBGvVlhwU!-;6e1LVuj~ z9+uUspqSrm87KnO2p40IjhJ(%LNcSFKMyHrSuVsO+|fZdiAu;$3bie6&Yke{OoSjG0&@j(@N*>|@^mV60Yo>M03Ga`v|@5bR`7aD)f*7Li~N zC+V8hbpfg-%JDWy*|UPLf;aa1U)PisI~$t(^ghRpDemf$y&2>>%FuRe%b?5mS3b-^ zQu%nAqEXTBQH&;fB_6nZot>Stdv=T(&l>PMmVs#KL#dScNvEgXOnO@`2_IX0{(en5 zz#(-c%1xP!MQ8V4sHaPaS25Z}4`oiZ{Yp2#y;z~kBsj~+vRu9es$V+fTaQ z82Z_2P!3c#%pF$muxN9aRKG$_$juTsQ+#}q1e zt1mjzv^u#wwrz>~Ed2ws|INCWJu-XZe#85fzn{(c@K4cv(WIE9BlyeT(&`D3S`rzY z+)u6S*4iPi>nC~bpLBNmMkK(c%iK0%P@>NS5-fEMlt8S*LrfFXPbjd3yg*eKw$72 zqlzRf&_@?JufpTzS?r{)5e4pKeoD9o)C0m--xo^RD&*Ej4d_moO@g=bxpml{VA%VK zls7@qBALj{%yGJ=b-~W?rYV%yznw#&3F1CLYaS4&%El+l?e-6-P?}++b}JLCYmUE< zKKK{>KRa2hSGB5K-iQM?%A7&d293pvge-|@(|+aODswLv%bi8?)q~pYSXHE1iI1Q~ zrNFg%tgdae-+~{m)5_t0V&{l6bEDSNIjwrXB?ldpXD(dp+nUGP@x}? z=|8RJ=~**PJYV$fwMsHYu1V1kDX~>T9tJbxv!N@>!#7j<$XX5U~=0e z-LhWZCfmH#2(7nlRQw~B1Nn)5{sPMnB(8u4Ct4m<9*AUaWg1LfD=A5ZGgm%aL=*Jq z6L}nFn+RW|_m4Tg&!I48IB3{();0N=j>^O97cms7y;FO9b#x)$r{B8jh~M>nTN2DWC zw--a7iv~exoHT%z_u$ICNnqsmUyab_HT7rwTvHP=k9Je&!x`lH4;5S)Eu8%_D_=nA zCT812jA|iffFTQ;nS7q_YXX*~ic_!vnG!dfpMXAK*nHX)j}|e6%!V%Wh|Q4g0Q~}D za={l9!SZ{vz<^=MVV|Dax_zqhL||)2lIua^z8pDcuo3`|i`5cz(66eVV$XegK~eS) zq5Wz1ihJB9jLWG?mqjFiDCQ06Yn5&t%^j+eE2sm=L8?9v9J>$bgV{3>7GFXYH|xc z0o*-Hs`-2*^TUK?Rf!B(mgav*0|1BnGhbdhz}S4tO)C?EETAbOQ6ndbetaPsF;RQGP+XYnS+#XdP~({lDIouU@2jaq)3)%s)tYl5oleTEg4+_tC{`3a%}{ z%X&B50SP2*(%mVYN_PyQw5W(QGn9aI!vN9^2HiPGt1xs3NY{Iu;B`Ou`~Lp^eB1W;=eit+ zlbLhYtYfWx?fbsguJ<6mK+=AbH_=vpXusFXlFo2wECtAd35XCawrsoN`QJ#54f2}+xb-uyaGZ@bNnyN31o_MDdw zLzH=#2=~rQNHS1DmQzPCbFyA3OZE3KHl6`WY%tw7zf$h>Q~adV?(WHDv$?{i^BMv$ zf(7@2a@o;7ZzS)O0A|<3t#XIY*#$-FM4(zPMJ8m(a`v?^mtEe>#ZLGp1`xDxl_Hn8 z#T-iicR;$d*6z88>;j}41424uy}LZc6kNaiQ9BF`#D>^!pjNf^j&3qiD`fTdXrYm2 zl(4z?Tk~}P`19&OVCq04<)~k<=5@`2GC)?&i}oSb^s6kvH1gCNjpz*+>4~%-rMSi5CaRr_Tm_Ja!Mb^8M}d^a_~JiP#S0{pw2up| z!tL{_dX$5R(%F3+dj`t&=&;6beD2(Ao59vv%`?q4n0p&tb7l2iC!Tt%EJq2D(SknW zT<-@}lZI9S20)q)hWW^KsL%LRDKzl58u65@PSHEDt7^0daKIp)3tF&(^yy%ymMXR5 z`o&q2#U-=8n`s>~LGfK{(SAK`ISBCc*~*2*W>qooekHgW0clVC2f)H4^Ri4aRGwOerq_CLTiD!Qeg%r)ua=Y2RUK1s?W!97SHtJY;ujoJX!75%5YoB>uNYE% zhg0IRPn0unCjnl9;F4;OY zKVffZ+I_Zs*DhM2ZHg1GWmC$1Pyhbsj{1KEj9-vYk8@@If8j*+- z-F0Qqf9`^zAXks;dC|nFH`(jTf5|r47|IbcyQiY2jsmq&Xw8RBMaG;I9GsVIt1RPD zEmijA>uAh(sq*!dT8*iTKGR@ds~FX5wrdn$9*9VK-gfmoJ&^f+qfh?0Un?Fn`E8{D zVDKPC#IKKT-*kvo+OB8csT^Y|S!Y1kBNm%JU@eB;^Fv1wy&5@j>V0~yP)aMlrVa?4 z3E#A!Vp6R8L4352`uE*Q8`jLNMxQnygh8Z*{dXnFZc@3gpPqRTHu;LXK!W&?3-bDCY0mSLuF3@R@piZM=z8jyy`1$aMc`f<72 z-S9L_v&h$71FXC!pB&!Q)l-wHNOS6GWz}Du2elhlbqIy;yj9h9gt;!LBMI)Hl483Q z3ekng)#AfC$BYH?`?^VU6mqTvl}$}EwQfI*lDJBf5gozS;jL--R*V;i#yyVL20X5} zupltP-OOzf2-YbewtG{ld{3Y>LPcpgb>1K!ghA?g;V6^;v*FSbzMhQCsqjz1pOF{I zU_r0rABkysJ^XOTfg_K^9~+6IelD^V{wxub-6~QbgK%Gej}5f;j}Fz8<1ro0p^g_@`hgK zDWL9PR4Y9SVCpIIXgvlcb=LA`9kksLOs0kpr^m|oyv9T`tx@u&o!1hYMe(;Hm&xS%LGCeMP%IL(n=os2=)wRi&$Ibr|+M z{D20xP(OO7p4B9Y`asz)^6%hz$NF1A#pjhh$k`-gtr<`DZo}i~1cREw9AS9gkmBPW zpoB4icd%&mZOxC;N zn4RA|rvI48n%O&h3uqng)rww)IXdZWIJ}z!=LA>d;GivHMXLK!%(nJ+ODCW4v$+kP zz~PVC4Wl1sge38UVLudiBVZJ)Ey|z1&WjsJcZDZze5VG`LqJ#g;$W}UIy00hRF_X* zxve=_+pS0xnXEt89Q?!qjFMV{iN3hGfGIt^@k;03n-Q(Hl*<^@5Y5!av%{J&+O71I zjgg^RW8Jbn%00jY-` zJN(1n1adE-4k==vm(rumzY>;lI)B!4&-Su{9H}2mV=`bU+${8tENx4CCn@a-2FJoD ze6c(<=DWK7g|fwxcOns`DmNyQ^(l2#?#4VTp_RWE;6w64Rnm-N8dxR`MNryx{uAhG z)}1>`s`n@_9_lE|9XRFO$ANHu?wK4Ep?1D3F>Nj~mA-PUi9}pp3VomEWf{8C?6%KS z3jBI$+(~guOK`k>ZAn@Q4$s%L%WvpOGJXiM!$$C=2@2IC!AF>``$EL5e{Kt)R;0|< z&M{p0-Cmxa6n?}!pUgUtgON(DJe~wr%GMvv!|s`nQNOv_feO)-|0A4VF+?#F6!u&Q zA?G?nee~F~(O>-@s;v&Fj>4&`I&*-lK&68k@b=2Z-;-59xikm9Bv^h`M=U%`yMYhn z)YMi5A+z6-o>M;neT@M6_<0SUtbq=P$n^tRZqm8IB3)L@R<;`P`T6tygB3V_P?lD;)oI*N*TW9P!>RJJzb~^18&`uyup>iq^w}WSh;I z#v%510$tC#YrTlnT@u_^evu=8iL+^HlZ3~(+Obi*DDJZ2pXuRnu++PyE$i(v006C9 zS?dHkOnQx+et9id+;M@87Kaa>^=_7LZ3-F0`@pc)7?@nv`usGwE(@ULZdI@uSh`zN zso>&cby(o%ZG3jl!9tZkq#Rel>Or$*dufFKidP@w(9WNVK zFV!L7@le@1o}hU$E|4-zK?*fGUmHUNn9-F?o{3)*5ToY!OYOP3c@GbrXIClt?vNsM zlg++i_NS{hJ{Y>O3pEtRdvY@_ zmXzqs1*!LLwdQAI{-L0uc=GANoG$D)U z1Dup8c5X}9W==T@xigE0I=V`ZJYKgt7xzhZXRzjZaXrGH5}g3bJ~moS2Kd4ivx29B zQwr?!r17Xi3mb~R@skoWcf@zqN*&5lI@riV#e2-yS8ZKs{EGQMeiFydvP|VCYn~vw zsRR7dEY*;lmUD<0k;C5~`51GDOE@t9RxCOQQQg;fBv4T3&>z_wJ}_ACW#gWn!b1!K zS%OX=_2ByVJ(fb|kGIDPYDMAU#%kL?^gw^Jw2s$#X%J(7lLR(ADOXLw(l!7;KeHy6 zi0df)iqk-gOkP@~MB4}u(N#FxBbnLelzd?Eq2z<9fZbcKngE`1MO_;Cq?P2qwjX;= z_w-_JznsYH$|YUV9Q0a8&@MPT*L&EnJyLlxSYx$%D=Gn%d&0)K2YGq^1SlBDJO<+BKDS9_A9grjZm)0dmNMji&lD{pTT^@nJZ{8|@6fl2mb_-n zET?U-kq#S;?#ldRUp<1R?*Xc76hGJdkK%kwr)-O<@7DumBp~_#zN3vNV;99BqRS%G zvs;;rw;(=-o=R>)T{y3-&M+b(K>nusV0>cX!SGO_CiQF@9so=qTaQS^K85VgSRzKVl7`FFP;2S9x03c0t|-Iq`C0;s=7|4JZ6jU*kBlA=U4nXs4cmoOwYiz3 z^Fvla0jt#ev`?);>)*bgA7Wh$%>A{RzaHF4JXg@&)dig;0kE!W-=by-aPVr)de`Qq ziaS}cOIih_^@ge4z>4LMX=)fm8KwJ%-GHyrDNODB+_3L$*9{%*6~d$lZvdA-0C_mU z9diXx&~jm+DPmBX@+4Uc;!UZ+T^aH}e+sj0o>#RfPG3nQk={3&`p8xP4p_CUhj+TkcoJ5 zifk!kRa;~Y7~l$jB2%0>#6~~2-7NF;mdOXUb;txkeU8#P%7Q5|D zUO1o>ZYa6ZSf+6EV;9YD@60IWD0IQfDS79pZa#praN7us){byBA^kHuL)T?m0up9AHn;26GNcBKGZ1Pnk)|wk`>_N zB7&wOmN=D{-K)&-t77hon_ulXuXmS$V-%=nGQo#$9bS%lKPdTp22A3df%OdNj9r2G zgUc||8Gor?UCibsmTPxt{ouNFwg$>#sG;^MEw%^1TyuRt{uh!)V2kTe>nH2-=rvJn z(x3WkCE?YkpI$m&q>?|)Gv;n3Qy)(0c0PNXn3y~twv89Bq@C5zLpONtC2pfd`39ig zr_1~u-HKMwk(Zd_LVWwSi4dIvFGjWTf;1oEJ%?CN`={RoG(27i zSmRD=6@FRo>U6`zq5IFRW~-b#G~>USq%ZoNc+;jaPhtnROccKBAk`n|9AniMXXf?) zgoO?--Je-ONpx)H7ip=LvK+Bna=f)6^isMx>hz?>OUSFX*GP~Ic*6{e^%k;E0iO2J z)P>Mw%91S(#zqatBmKn%g#`fBV4O2Ney^K!^Rt)|vP7OyqP>mp$bGTV$l|iBU(|`a z-ZuK+ZTUg1BE)h0*}7m)h@PsYsC%!as@GE~R4nns9w^ZJR$?kV$GptZ1Fj#->H#wo zfN50OOEDuu6?xH^!Zg~>&{YZfI8Bjo%o+}F=SA+s z8`qIarbmJ7<+71mw_?gHbfW30tQiwmJHSWV`QVejYG#}cka2)ExW>*g6;!|Z9l(4H ze3!K(tXjqSGS0r znI|$eNyb#No_sRuh@5*Febb}?9%(M^QnJwhGWRnzk6G1YZmyYVt(D{njG25 zYH6E^Z)l#u^39JL+U&Hkq4aK-Bp_I|C#oTV$eak7ZpLZ{YsQ3LB!{myfn6h^e0H%m zOFI+)W@wXj((S7@k>HUmwPGOaS~a|FAMN(OUOM6Hq5jf68!g4+AR zQsz+RPG^>_M%2!D&}`2NV4k(PaxXi5%VaDdpl*{oFEX^K2Ayk-ML4ScLlfs+^p{-# zsbfm5yWqr{k2PN%sqotw<{5h3hoR<5Q~>dH^~N-~7GcIL!HNE*Iw&8|HUN0c;=J3@ z;|e5>i+1LkdZl^&qGUB&04#C!^!?e;do$ASOdmhS8qY5ndr{q!m!(qGVc5u*@PR>&5ZbsWJ=!5K)s8@;xFUH5Dy?qM^mwa3M18?U@2{VJ zLdz2l6vlB?{CNnA07JPz%%c}s@3ch>Bjj%xv#w}v)SHljdO^Q$!t;omerd6nb|IB# zvb0+8PK32wXO=Gw&uOP7?Lsl^*(X>dX3+3`A#(wITU{w(@jmUwpvl4o%4M~cpdAJX zh{^BA42^bhQC+S^Bo)B?N7vtGlgTkn`_T#)jcpdcO$p<5+43R58R-=VLvRd0a}wHl z__fP`g8lBrvif$t(axVgi(E1Ar5HKPFraDl>P~M_E?u4e$N70-^0DDXbxHK}VFcj2 zE`YDT^Uz!9omUPoSmb0@-?sOYlpesz6Mn9U&a6QKb6ac135Kc%*Vu{ZPxuJ52xl3q zs1BQKChn!-yonZiR@I9z3Stbf|5liskbE6Zy+U9T z=ucuhZ6&#_z1HvdDY4Y6q*e>V%$>3 zcYnQcyDQWi>YdYuVcIurPhiXY#izIJ-hy(FG+JRq;p%b9JkBO)sCY$15*{?yb+=*k zyN^z9-}1tOo~{gcarLb+QT7s~qnLPU9mp0P>w`F4k@x;7RC-Mh5To3{riv zuy?Ij93|w>`+2Ol>5h2OGdOZ)qaGfs)6rm~>ys$?LO}?i0Cn$cC|h`30Adr(!!4f{7+AP4NH+9 z%MvmebhvfpI~i0tjJp5yg(JKX2zO+5w&f#`5D7Er)HdRnKQx&m_y%+ zA*J7wdp_Y(Q21f^+>jEFcIKWe;jSS#GfLwi-m1^*<<)yLoxb?&ta6X}0F*d*-6Q-W@~8B8+JBM-jdqSKvic32pbgL_boj9Wuq z!k~AmlAqjwFq0Hs)raakNv*(}dIObkL#$H#v>G@|=RFobwOkLg8zsHB{Mpm<*UO1a z)r(^#Xhcn=bx7z&F(abJ#2I4BwCbMCyJq6IUP*-Wlbe*zT*+eK^oHyb%ry z@_Z^(e58!#8#t-DRk){iZ|Y~2yB;j!I;}BA=>iO?^GD_!Y7K&3Wb#G0Htno@z(>i1 zjC1|we&|h*kCsf#pA4SLi^|S1NN5$mH%8&WWk4k&+gn!lJdRV6|(%`HhOB)ocsy^fjnGQ@{ zS&5s&o;O9T8-mRWk+Uqf-`l0m-Ck_NKb~oAuX7W(QGiwOnqEYUduG(@vz>?VMH-o> zBE6zT5qbs;{5OE|a!jFCF$*X*K;05t_xxAU%!f<7U00Z-qDeg{?(vW`8agSII_kMh z@oZ&|UDug<)@C{?No%QmOFeD-Sng+9F>97>5}iQd`|k$6TfQ5ggH%hh=J==%7A0YR(_)DR8{2^&Go>&x^=>fb}axM`Mh&aA~0X9Z~fX#f=T!lXE z1BezbErFPKy`9++BT%k!-xqY>0=6J;D&08DeOv&RTkE^`#v1; z*C^{Ji&ZzZ%n!F~#mx0&k>5K&i@^dJXEz7{nXje90sq<_i6lE>mJxB-s5JMIX&{VD z0r(uu^;Ah_)Ei98Q~*vPi$dYQu&pESC(nP9k0io80d{YmGA1N&fr4BH=A96mtjB_W zh3E9wyv?O8h!iH<{Ynz{IDth39v1X*I@=)Fk_hdRw5o!lqbj@JHjt3QY9Ta$NAEMQ zq4ea5o>ol4rsYbg?tQ6UrbP@&#^Ebw5pW6>&NEC5(GC*B*%T@4JZB&M%8Sj*N2f1B zVsbAi6f^fpz67%S9V37tlTX7ZXl*e-50_yrCHJnKS~aeuBY9x5#K6Y!y@93MPn}YJ zFbB2`CHckm0gzJLV%QukgX>Ki1I|VUS)qe#{#xJky~tLru6#n{sKTKy=K8V*xSM4@|Z_v{_l!pk*zCGYSmB1?-* zbc>DvSh7QNPib#u0u(-7*$3yU-YckelU>7wM1XQh46tK5goyd?up)V6aVN9=h|y*r z0Rb#UXujh{a04(Z3J=gvTx#@>eNEe7wh8zI@`U%slJ)JCyb~GbcYrgZ)}OLWA-U`$ z_VrXS-ywa-EgO^&-Y%!eP^02)TPU6W=01y|)e&TPhlz_8!tw-h*`8}ICzlgf`BjIz zmDExs+I}K`0n(tC3j#uF7D#;wdFycNR#Tm|SLMf`{#`Nu1hJ**0C8B0!q$pT!m9`2 z&*P*Z^iM>6UNX2QKq3(XeI_*%#dtWh8-esbxP0&&%oc5lTLJyRc~`u4Rg0k2C8*Gm zaD_D9t6Kcu9Hg_ic$esINA1y^uOpQe8#tq+QDY9oFoRrvIIT9NZEY!h33hhU%Hd_P zs;KkaY+a@7*r4Qt4iyb68?HhbBU6Ubidcn4eu5A6m}x?td@B(v6GrF6?VwIUrf1>b zG-Ot+rzx(b!_7e7HsCo&@%!i6cR1&zCm3k4LNgq%&6UY~`QekOBr4sWeE!qg@{a>( zT~b;iaAfNMq-`rKLE!p|uqnT;Tu;*5oo#81S(WX&4sawQl5-hVpX@Csi@goJwVJn@ zfWKQ5vzMl_kgjSYBt2Wo#_I#Wc(gHiRoV|=Erq0cpVvoMY|u+u+vyfNDrQ1FGH`Xb zSz}{YL7cZ0b(3}IuiN(J7G&3C*W5Vr6HqyBXaOL{<-Y>_O_v9)2R&m>t`VJ2oLUiKvt~6X?dR8wG*GezV^cAevZd@oI@qOf|>=3>N(;1v#l;RFlO~ zj>-fGuhyK&t}F*@Df@t!bzfm+`s1gLFBNZrzRTq16Xvg;Z)gYD(nv6zoAzeiC7Enx zgYtzTlWxdgrb2W~*1h+!d}bO=IWKL>=_|8Nx}xb6MSOvna- zJ6Ri7x_7U=jKlQhAz197>MsUwDgu~UOG!3KkFSVK?JvZeY$;OT2ITG$#-L9 zw35IoI9;Z1k!M&xM7lRaDHP25wRyrb6-Ky$ub|J$VyWg(B&a-pYLGcpsYGuT}y zJ;<;5dJEFQl73iv$XGJ|K^v9eEd}UHK;;-7jTZ?luEIr3ZV&axWEOaF-jbE8^$Lg8 z4Lg^wmL9CL>VmO!e3|YztY_`>whbxRybxrk7RRQmzOd=tjo8T%p{6zVCK=T1r?}pc z7U!9jrIGKURz_Q*t`f=O#d5k#U9dduRrPiBZp$6d#xS0`_v$O^FJ77`-)MuGzyec0 z0`nO{P>*8<<3sJ7%rL+hfPE5C*;_{ewv{}`LCW76rs#lX*JpBvul=IweA>7KSYKsFL)$jWEL@(w91OO*30Y;xeQQUha*m}BZxiA_ z5U^G%TYm7>3TM^moZk}5Gv)-vmguLW=c5yhfFt*H+(}Lj+X>?x>L(|vp3YnjXmXJ! zRG_@_`pA^qYx_&TfF)8(YWJ0eeEXBzJfl6q*vgcQU;^coTds<Npa~1N8=RsYu#2*ftDkW>Er2g z65OU@9_S1fWB^}t!)m8AAQLTeN$3a*WF;0M(iPQGK^u@b5p#cb@!PlGQNCPiBA3D# z8}+sDpyMs!`o3t_HpqAj9s>rp40l`bZ{($Oj-Z+gw6O~Xgu@te-psP-D&bqrUE@a1 zMVADZ69@?jefhQ30H?sH>u{fDfAorRxo)WRf+ltwu&lFg-Ya>n+{urB0F-16+NzVi z(LDng`*lazn|%dYk;FU}ew`I6+app>|KLh?W9XL1m&Nh@-H7WZUvI3fjZDVOeaf~{ z&MF-dY`U9t8Q$(%@(|pwg$ZWMk1&gHQo z(03FMZ*yid*zE#$a^@j7b~s5*@m$2A^TYEa6%##5;ZR@u<7)79`Bh;3$}8~o#w%qt zjUWSjlY~?@21^odo^xSOH0DJgFteP2#IN0|@|2SnIGQ=va)?2Fu9qefg#J|hY6{x# z09yW4gprong#S;u9yJ9o2RG4t86cNsNKn`Am1I>c6YLnvyvfJBp86hIZ2*yVKbW$P z^RzTqX+5Q8jZbI!l>ad^!R=eVMo{`P_LiY~fH+1YCv!yetvquU;(JG->F`h0N}G#L z@eb)E2UO=916EGj&UGY(XAdHtXoiE`J=hWP%|>%ea--@Rpvhk2!W&R_iD9d9!UhXi zz>Ff3m!eab_xsbgOr2NtOuxa`_u^0p<#dGO9f3mnEiJk9zwDdP>ok!_kQqvWNNfz7 zrgUCCt~0BeDPF*~^G&+rNGVS|v1cbj%u>n&hE)7Md*%@?gND zo^fUEv81^?Z%0Q*C(_uEK!Z<)PYyA2w1{6Gnmh&EG~Yf*_NACud_-!-gpGLjdh3^b zXyeDwCmzYFpxLvzptmn$y)RKir99vd$f=;7p?O zZVaxxwDmZypk{VnAxE49aIAX?wGvffOSX;ET3w<&A2wX8uB#V#TqB#Nx~3y04oB11 zUZS7c_@IqTSv9UZ6F7}uNWwmsh98(VG$pk_HhPe~_d#3{KfS0)(n5O@y=XKLI( z;k#Z8tEO#J+Ad_b54LFYe8of&cz5KNz_(HY@}nz$377SWgts{6VF%H#iEk2aKygb_5iT>dQTBB_^z8lDR;^Y8ajb zRA9ib>-N2@WnjFr4tRn={jas;31##l06fP%ov)^SNr7R_(_7JnPXPGZKg^56L`$8wDFg~B;<19303-i?8+0^0@A2p#;0aN#Me*ymEb*6wK^NII)oc7wH;#lx)$H4G?xi z9rcP2J&4{fAg|iE-<-QUF*ZheaGN!GKDgN|nka;S5aK zuxDK_7{D;DR95lkQ{YGyreW|`X*npYn=Rt=1c7MLA)0T0aX8ww-A ztA^1E!;ow@I>b7V{Cl24+S0NnEJ>~aBjW? zyk1R~KSK+K+qgH!3gtW|5uE_Q*eg+N4 zri(_Mq)=?xWu$s{`~AE866b|Lsr}j-(AT}$om>`GY|n<40??4=ucVa|eyOn&$=gf6pShoMV9lZKSj!aZ7&pkK~~ue5tc4j`)mO0ru_7O?9ve zgw1gJ^{4x~QTygnv4KLTsB<_E!-X~Er-9&{06bW8^T&4IscjkPn~tB>>Lz?+oXMR@ zdTZxv=E#9VSbn_x~AyYFH2vRX?W7d3J35(xK)rI)`1+XGjTQ)4o9Rz8VV zY^2heT1QnCHs$Q)6;b8%_S>zlgBA309op?AOWIGIYWC$Z1Cw&H0mB%3bwi#PchMU5 z7&8$osCC+CM7FGTKd7=Epv1n?b)d_R%_+ux3E1tRJ>{zEmWQaAnF?!(pGWGkTjm-N zzAcBtt)tEm+zO}6qo{o$j)`>RS9Y{S-QH&rCC1(Mi)uPhT)~B8S-sqB3|0dw4GAkRt9Cl| zICZIjD8h^_fV2Xg*Rz1ZLKWb9iv^2}X0|?{hz|~BjuHQJG)d^H`u3v$n2XbcIUYW( z#JZWva@+N=(3D`u8*?i~V6hcYtwyvT6 z;$W&yg*}gEOqKIr5{og@e>r@jsxZo8EV-b*UAmn*Yp8CzF-B) zZs7L_mLWxU7Awr#e|e1)q{Yb7W@%Ovg=j4D4}0>N)DnR+yK##1Vl}G6}$*8wlCVc+>H>_b?=o`f)*pIGVpF5z_@lxRatC+(`Y^Eb)ZDx_B zbf&2etDIxlhnsO);^U+ML|BzDoMv1|npggcv2zP8Z~}@Y2#?aEvBmt7U^aQF!;Z}} zn(u&kkEvfHc#Cp*iA@vm!zO*^C*w?!Y(GKJ>TxC?j?LAgm}cCGgPJfc61DJDjl%ZG zVzxoIJD^^n@pb2kvMB;8X>RMO`q-0H{<}5};jWFEUz29*ZfO-D|KzIy9${fCjiC&~ zj}Azvu${?npKiglG}OG$0l)rA`Nd|>C~$8-j*dUbrp{Dp5=cxK0Q^fp`?FEzAv3{Q zwTPevr`? zF81HTP|Q{Z>)Bu1a6}a`RWJ ztwTf2hpgFT0f0#qUPTO`@KRjuZ}blhMU4U&YKOfg&9!DfyN-KNeM@?QstIN(^)1?k zVr9M#w!3nmrY|;Hl&}{d7|gwGITg1N7y4MFS)#|kkja7ci7&G&LbMchBkYT5HOt?5c4|h&K>G@Z63HUBe%+obno3X-%!-!E!NKQ zbY|{1p|p;3kiKK!@S%O|j;|NBNP?o z3tE9X{-NvE02TV;S_w3?;#4?tyVAc6VZj2-CSbv7KyVCwPUVpYz&=@(BIjkL@Qr)M zs_$iG4)k5(k4}RRGURE9#e534SpH{B@=jFgJ=YTE7Rt_8#}TPr$n4|gpHLb84BN1= z#;ygNKJ8t1;poiI2H_RpD8FgzsfG}G@cG6U#Xr-&^rXx+f;&!XwIvk%8=|0W-4V7) zUt@R33HmP@^FP$zMkaChX{1C@*25~eb#^3f)IUm#$LB(CcAWI4q0|T47+x^}nvZ^@ zTHxdFZY5xIY0cp9nwq)M$@QAWPAS8iJrbtcVDPUS+bRy!4#jov z6#^Y#-$XX1A}fCbQ4nNT5t|rkr#6>F_X6$)b4;Pb?jK6J3@ee}a!Z()|M^(@!Qqw; zEB}hmBJI4}wfuvz5yed1i_)?!u|&=;KD^wNm+pl+w%aWe-6n~L;H^Tc7jSBl;#h^_ zk$HV#cO4>|j(x0MHVao{%{w?$ozrKs$`&v=jCMxV=CEh0;0JPmIXZTW(A6+qz&4#W}lz*M=B2GB#Xx8PSRo{w}9NmKw5 zhktqmY#JI5pt0_<)YX`5*-|NJBg7=V871nPR~x-%$+4{cgd2Ud7_wXgfDG%L{iPyq z@qgpT1z2H=;+uo^2Wr}7-kBFqs@ol_8l|wrdR2t<_=^n?*kMB4uHBEZE zMo=3$@HW)7yjjBxk6FT+z4zLEL*yKZBWedBmOJnCY^_`}K(f>!hQ8J@659H1^Iz4-C*u9Rgwr znyHapQrZB~mpIkYQt_V0@kg*Okkwg!krNt8XJe2NbgK`~s;a7*FOOc&%pD%;dAuQv zcTw97if3Q*Lkv7S=)u3kFB~0S3brA-wHyb#()0I!aZ97&knapiX<*O=n^GZP{j~6| z7T&2Ou{h*{kbt%iEvV;cU`O;b(9zXdxwusV&W+z`da)tbkC+MMZ3zM5%?WnDBsnu+ zn9U-1;_ePkWkhF*^O6>F)9!%S!>VzzWl@XeKkiNXZ9`sI=QhI7Zmj-?Q!?DJxgKAP z$1(8PdO|t`N0vJnS#D%jNXv|8C8}MidA&&1j6{o)7TmC<_8<_e+`lyvzmz&@)NtvKQ`C({^B8>l0qyaG-}1KQ9m zt(D7aH-w_qWefhI-*X1n3ZF-AJ?UJM^}4T@LJcvV=b5{K^n>f&d{>19I7W%%s6g37 zM~Z9xq6Rtp`?1m7N;qWuRt7m$>zfgi@@dSlN8mkjrDE#rlnj?aIygED^nfD{fZ=hF zv2Wqf^V8!4E{9uF{3u2VWzyIid4|X)i&wtO`qe!A!gQ>!yIi2K^QN={7TL+G-Jvh= z&CdeYwXu}~p~wSEPV8%3Xh->L-nPf+6t%%M-ItOGmC$Jg1qBv;K*B5enC8f3=6;wS z=MoH@!I@rZ{GILcoikH)IQ*?!XJI;%rK@7Hjxc4Xed1}B6<7hG8{*dOr4tNIoLtP6PV3YW8jT>Z?#U3 z5_79@jT-FuIrNteT>=nGAE?8Ir@9^J@V{H+snm;&dRO3?jsgBVGDh=cErF+^N?=2E zRk}CZphage=A~McmUgc(i&hhLtOnD{)sL&JJsK>tEYu;;+FfN2z)e9_TI9E+*hh!d z!Je{gjgz=~(N+nmiy1Z>;EPo}TM?vqU9;VEj-A&pwo~oQ+Ucdztqt}tzc#q$3eq5f zRhhvQoa1RP9ecX^&d=U-8j{H;c6u4(gY)+8nbtA(5j7{YlzKg63SgDg8gi;2{+OG~ zcNqi=#AFI+=gS5ibJK1wQ&&!9A-3)Uz=P-w7a%WS{RE*{R<3z2kQuc;uR}^-{=sG6 zmygba5(^p@l7gfPP$wJdna(k1u)PIfKAu_wfbvHSEDtZj_8eQC~n*LN_BvOS@wy9lw?Qa3=R0+Z{gha_bgW`&PzV`?co z(YAk&*}W%Z0#7Sev-%IO$l=${Gb4vt`8mu8-Zlye8^Txo0obbi=b?f+AT$u8Z^7Dr z+T$(F+3Lo?2@a#3vyKWa#-@8(Rg7ft87A9;&_48}g|@)gNm)VTeal501Cd9aKUj;2 zex=bHFudo6DbQ{{RgONgZ9siVU9l-4g!DRh(SWcHrE=hZFNB!=Mz~=&wnbj9*i+KG9+sK@nYhKavA8ppuy=OV6vCvt zZ}A;OZBi*r_%T`HokUOLI=V5x5{n#2v`c}J;snJDwMH-nVpQ0Zj*G~uaT$rU(N)@= zXbmIBguLEGPn;TIA7O`^jdpxN@4z>4 zM<+w+J+l<;HkcW~kK8u^>;aK8vGw^Uus($Ye1}c~1DUUT)613aQ1DIvmQ4V&X0W~o z4mjN-C2yd%KxYK>ydC)#Dec_<@CcQGF4?V9c&B3Z4C*}^qq5$D{|1MC4IKu3M-*X& z{pcNj5>PwP^C;y{f}xXGVO^HxOK8wTBIRyq)k4oOo&xc7EVY1bSWSuydReX`flga& zf`R4x8DeD*C8GVah$u#S1_@vGlHenP9tIQ2y!4t$+Eo0v&BOjc+Jr>j8mo1)?Qhqf`Mvbv z=)}f)0r;*kv!-@ov4h>DScNQq2>+p`oa&0Ar5W5L)J$fPG8q-+Pn*Y*fHK(yO$K|F0LMRqAuJ z+ny5xvI-d`<%lA5F)WQB3gsf55^<5Y52lLq~GA_X7u#YCFmdY zi~u}@&r-mq^C=a0)NC`*m;)QT&fA(d^Gl%>);9=Laj{;8KmpHK>QxSOIsYB-&w(TG zmj+7ll=EvXNuE}#c6<%E38nLIeL+Fj4XNc-RQiB|%-rnZftwsQqWD2NKGyGhm-?~v zIw2(huSQTKLg3#R>jD#7hCkTf+(-d0XFmwM9Cn~D zQV@`Y?EbMUJ`tS10I&!gEWtgcI)BG`e|C3!Q$&n2aDxZHpQ)+B8Qe4I&Af+x+8hW< z$Jz7C!2x{wM{MM(+%L9Ug3asc(bpzkj)zCq(oc(`7woXT|K0;AHT-`b z2N{&usRUHQ^^P-*Cr5jJ1b_3-jY_|>Q*iL!!pC2}bzW0I{}8Dpa8-08vFydhw9(%u zGJl_L@M_v?*bv%kr}KPs_wU14W<%kZ`j7TD080iOra~9l9}5eIoRV@1tQl|gIr?*z z;om2>XMS6Nwkx#{oIQ~!yIiuyv|f9Uw{Gb5Fbu8OAcIg6j&`uk7-zw<9J zD*X2ebN`b>nQ#Bs!_WbF@#lXZ{(B?l{(p8)UiAT(&8JUj?|9GeY_FbVRpY-04^Hpe*q{?9^`D zDib*>vlLu8-tJ?%Wfz(9u_QwU3 zag(o&jeHzxE6{I0Fk$3N@o{JIqRGYU6=eVyEEYUm%-HZ=5b*nf>nrNGA^e|MN)5V= z6;^wAyddJYJ7&4EHfM>sk987pwja^w(d$w^$=$nOlX6tk#nE(ZN_F%-TPd-qZoRe( zR=3*1;alPh#OosaZ$w^h_wcSDHG4(Qj;Rv~OU-&6$-s>mHFRzvs=a^lI#fZC`59M5 z_+SofQJmRp+&dXoIni+1(60Z1!?B-6b(r?!?E0&}cP8Q5rT*MNfFBBZ?Lr?c!i9T* z23O{z>4s z-~RF2yPrRQ=A`)Q#a;9|SPwzR@n~{*cvxV1GyF%aV+X6zW-z&9{ia8sm(g#P|J;5? z5P!ite}+_mKWxK6kE8FGn?|=MC5c52qC^fVs~VKf5XM-40HLS6nY;JpEcpzduy7HT z#uM*-Cu?`h&6++RWf5lXM~__BYZk7Oo*tx}>7L!VxEJ(5&(iN?YHI4}Jxl&Zzwwuh z-ya!{#{FMyRDK4^-Gk+nAObI*s`M7iif~1L<`5lX^e6qtuJexo4)339RWrT|NiUY0 zTyDII#jb_sb)TsY5L5^AyiIvjk~K@&iSi=0FLy??SB$$T_?&*2b9m`S{=8|t|N4~Z z;=-~3v`_un+S(e+rVDSKMD>Bt@vC-O=>4$)68@>k*}~bCs@MP5C&G+Q7V-iO#OsN+ zKEKoLna%JQ-bWKNu}$DK657vbXTYij(VF9TnDgec@!?=x@)I|Ck@uzGnp8(6R5!WK zI#P~^9|Ao9*zzw@i6%7Hi2+Af4OKD9KIGqYP+g<~uP`dZuvFGWR|x1qom zdso)`WaYCz_7^Hk3yapaHW_JY@QLM1)c#EovLH?%km2GZJ-7YfBm>{y%?Q6^T;CtK zuZuxYg{UM8=21o0oF1;c!7KKfS^;>7w2X|%UQJ)a5%>-bB~F)v2;yzr3@hzTIa#%& z^8PJmcyURre?ZUl|Gws2Kde8Svuzss8j;9vC`yxr2_FL4SSqJ|;(^JVV^}nhDANR%YNFW46htR_-qErIztAh$0Cnqy! zC&niu#!za0;&*!dgWPX9$9MTx2*-m5576G4(;$1`@Poea_g9j}fA;;l#w=5O&QA7L zkQWy`Pk9iqaPikiEMPKzf9LwE2V`WP10hD4#@i_FKEZ8~vuzO`ndtcVcFJ`{IS9c3%gt#F$44>rZ!gcbY`t1K<6h8^Q(0WB31`7lSjH^Ws#=X<|eKmMwx>M zG`rK`_XUUK{}A>bP)%lC+b}j5L|_yV5fGIo(o}j4Rz#XorK|KNNGFt_h=@p+5;{^M zA|Qm`B1mtcLujEx=q1#IHYoD|CO{udOFde0} zEhy|&00iee{n&dm#I)K9efcP@M?FGQ?%Tk}e=pJ213(5Rd6P44%^J1%K;*DV zvNk=HhcB;V6ieDoyS|yD;rke3T?`%tgrKrKmhSh@``^GGt$8qV$Y_^g|K_GFLF=R< zolSvy96wCr;s4&S;QO|3@FG~!_lZMk-^y2e`H379?|gVlkw#(T4dbFm>g%R;(%QOZ zMb423c}v8go7Jj%hGRWqPzhrF75uEyWv~0+4i)}9wKfJ|X|#rdGN@Qs()u&}zkaRQ z0!Jn*c1XmEx^!iBwl%u1uMf(X<@pB`68;ZI44%DrjY{SeB@#mE{V$~MH}K(?(NZ%Y zsmGJVD;!~jQNVQ|Y@fHk>D4T4O#M3ihp62IM{JbRVf6nvHN~rZ0Q4Xfsl+aEVW}2D zqF!5DOI#T9T1ei~IQqE@ocRul1enoIz6Z`UdK77eMjwr#Pt5@|`LiLm|38a7pjPCR zcAf>6AlFG-rFhK)cm2jWT#L^V!3}{uNF}zWE}Eu#SpudvXy{mD(*<&($#&Tj6md?3 z+!9WF^rXvhV(Wsw5#-NSP|Z`2ELZtN+MA0AC7PzS!=PV7!fa4-0lmpV+nX-aCD@S2 zqf6y0-|GfK-VX`0*1VpZ{bdT5cGG0}^9|POfcf3pqW4cpO7huG#Ik?h{RJWZ!V>2t zcTS9|NsgbNWr;I#4kqout-?5DcYlKufr8_la-L5hH$OYJfGQ@4io8DsH7Y6>fPvK| zfX!@CE#~C#A5nQp9So&IK0p|XrHywC{&76v2I zR-J&UbUCzV(%VnJZ)uxaFIm>9QDFXBI$HJ+t*5~VNe}t6fnrxFdk)Nr2E1|d1ZVej zm(0FOj;*j9@Dx2lq#T3AaRrT^F3;oGdPbHxx(eXz}aS?X?o9ZeNR0_3`V^sV0!QvH@{Cl zLXj!#BH!h}Z%w!+9 z_Amh>A60TEsjXCQZ#0vhPqw*G%b?lIr&sE97IaUJo4nrrnPt_6h_aflBllZGjCXWw ziV(+tT8MB~PcsLs`wr~wc^Sz#PWHyp!}dcFDW1>h{_LXl4T|r%uMD3B24FGuDI|#x zdSeMD#*?2!{SM+_2a|OHhjmGXg@uyUQ}lM8LZ#VWcyO5U zdfN{xbV}-eaB6ori2r1u3P8%hBX0wY!Ge0JSl^f~NF#ra0jQ{cB7u*}6}qn))TAz3 z4t&$8wIjOy;=EtDRd50L}8j4Knt?rrz?0w<^i?J(E zB3Ku+Jjfj_L$$jl6i<#bf!a`B;2WPPaF}a)^i7!j9VC4XpJ}E9GfGzX?i3&LIcPWa zn-1p7++ z9iVlI!1v4jVMP#TFL)))s03dM^KO<)|^{v)x$$-(F_$TOIOS zT?awvrrdwqeJJ})yNN>iQVjA|$(rcjrT{_(Os=+{i;15APCW{dcEZ73WOsG4CDE8NG3dr^M0RvQoYw2_Ngmge`Z0&hmHu zKAo|425x_OV&lD}^^YHk6y07qi_Ff>_S^G-=|KQBVyRhtQ02bbi@xCt6xemNjWn6K zyGbU3qo9;z_5o(I^TU001n3#8XH6m~7>FlIIu7!*<9BvycJds30ihyNax#Q81Hl(O4daCP z4H+NJ1}V<|c* zDG8nsp(dabEy@S_e4zXI!e7id+!St#FPnytO~WamfneBG_an4NGmeWMj;_i=a}OaMp(OwiXs9UPnzwIKh<>X(#b$3QjT^<|KL=<{VH*)0}RbUTF= zc3J`qUcLbPW5uiC15rzkK&f(iZE2G;5Y!Al5PAjorPg(|)uW~UiIk7{ngTTiJeChy znz}!-n(j*MVhh6-Ztk;?)(AGuh;WBdC;a>#Fy`T6=lX%)A!0Ag?~p@Dp>n0=J(lcu zILygTS}aP>y}($@cO%TpeNQ+0d621B*JMlqd-+xj(rd!7MEeVOR?VIcU+R9?8h;wD zBk3~A8>v12CdNv-hVjSJ*c%nJT=mqRh63qF?C)K)z6*Bo_n)W~-vB4?t`CE4uG7e% z&(N^&KF&q6l}|G_ukZH*oI#{OXZzFFlcCP0UI`<6KO6Gbg2%}^k+m3kKQtuV7uQrM zGLApOo04zt2BN$V2N@N7+Y=Cud5<#4PK_-H?5!<$h(Ip_`+DCD=Cq$6$w6vKM5QVm z#{S|ok#QX;0HIxe&G;yxPM`}1*p)T{!)hfWueEzmKMGZC4-oQN@0>{7YMwgsY0Fs~ z;W25MPBmhZ!`gyX^k?Ma2A_z}VJss%%4{Z>0D%k;P<_8N+7$xCf`J0#iIZEccyK|50b&00>JJ6b0-l01&4S77Z?54rUa zm=Ci^tAHqhUJQuw+t>0;&YQSEdX2=a2Dz(Vx+@v)Iv8}Si^3R_7AE$V(PO^f+ZDL#jCvcN{>vyBB(qPB-oq|Rp^L%}Jl zTG$#Gbn+*Tsk!(r)s6@Ba1l~Np(M(y98h%bjT=an1UoO@+RX<-zqx$3_J1!{Z&*ti$+X^+dB9%N)Ui0SSFm7{gy!JBsU<;ue$M$_$VuGDHL zJZHYt?m;*}$ck1+*g^l#H*ltAOLcVxQPB+MQ`b9YQ@m-g1OX(|&!FWzyQl=8Stgj2 zXk&mG#WvOo|Gn4QGz@=JaU^zyJi2qU(9S?ilE+=AlDL9VoQ<)fH}P{Hh#M5hGZFJ% z6oDO3uqGMBO%^4@?V+HHCki-7%h=0D9gP}}#**%P5H$tYq1F>s2pWPqC+Ah}OVWvO z>0L+8RoD40yq6ysJ_w$(02rHM=PxdcL?-N6cZ{l~!`Q zX+C+xbXA@x)VWY7XpU&bAQifdj*ACcPkILk{ zBJIw58q}cvxB%68%ArZ#5`L5G9;d-=r#S%{thb5O_ipI{0Z*tzywtTk8ILD}FdeUi zBNeI1XMF;eT;a=cCc<{kp5yE6qzyL40#k!nzl9b+QD*^Jub3KF$|q!C@;uRACy+e@ z>1ygx^QURax1NF!nf&$~7VF;MzVM~klsEMfx(G`aT**W zvZAEoLGCNeHgCgxh^r^!YO257;8g>@TzNxWi|!N^)vB%i(s1eem`^K9Z0y^VyyC48 z$JGh)K@LvYxL34@Ih}bzbU)2+aF$}A7{@qv!J{-PV3ZnS6*rFNQCM>D-T#zys7`@A zpqQH={Te_iTprQ{Ci4>`^btgA9fP z4~ev4X$qvQHriY)$%ZKtgl~0wx0@e?5)XdjJTIN*uS>65Ek2EI94iE;S zeX*wz&AY0M@(S|A1^^qqAmICEG*T5_uk(jqa7q4TrviXnWcy`8JlRzMo!C!RE_#AeR7+vEnGpz<$u-N2m? zKVsaPQ8?YSCN$T8F| zd(LQn3-1M8iv;5myWQQuZxHvt85M2;1>r9b@z33g6;=v zX~_9FlLMS})#ZMet>mjUuMh9z0U29V)6^58#M}a}NWnKV+CCrv!+hqa;ac}6PEd7c zLm4Jqrcfw}^J%y!^PEbxe4o8HqeBxeuf2L1zm087il^_aOpv{fz$-);{oS#l4J-3s zIoz|o2kx%@*Ukj0`7N(uXahtWucSzN&Pg|yno4f&jPh~TI)2;B)v6&Aj_~7T>4O$Y zb$WKG0rH~SZ6p?9W$kc^?SP7WokP;`M4MjzSi>;7@g<(CDo z8uHG7W_c#&0JYEtv2&MM@<3@TTp}$?vI8;5T7&zDfRG~#$%oCs#^Zd1S~sY@wjPU` zy80+!mFfzmR$EgAs&X5Fn+5jLq(GGHZUM{%pIUIaX0r(7jE$D}W%T5^IA~VKsT~S`KGR%*ha^iO!jO(mnW z`a^U)_X1@y+5bjmp%r`~my$w-&t$K5PZ<)Y1FYyiJHyhUy4lZL1CpB8;!#0L=p%;p ziQ!_xhC*m=X!Gkgv#D}`CQqbb4-u?i1eD?@X5P5zN1VKH* z@!;pCh~NBu^lpxlhX$j(uuf0v#vYDKBgJ!)4&*qz@hVEN|G-_ zRYglmaay9$Gl=l;j;?7r{BREGD4G!~xj6|7!y*s%!k*sldap59Qx{)Rd@ zR2F6Q&GY(i(D>p_8V+tr%}rz^H%T(0)WoGQ_+26Zgo$)RwgJtZYaKQs`;Zqowf z+Xs178oR!Bhb_@Nj5hM(8;caBOw?OI=bPL#+-*ZzMibFSC$@VDw|VJ|K({8op`;LR22g_HyNlU-i@KD6(Bwc~#~l_N z#rPRn*g~CwzrWv7sWe+(5L0^bSHby{ir%k4_8##T7RK5DNe*7J_49sgma%7iYlNY6#%lLn#qTm@J`l#wBr@ho4<@27hEB<` zQqUOhlG!(-grMP+tst{SV=JvzQaYPSt0O)6G03Yu>x6*{xbMQevq{Cx`0EA>_)ZDC z^_6MOIm>&wRsnVap$W+Xhsh8T7%QoLi1T3h6c-HE+Lub09A+WCnqKx$UG;W4T$~i` z<4XnSFEL%C4JTyZLx>OcgYIB{V%+E)CdW+k<*X)qMS})OgZt#M><}-zd5{RY5WEOR zPML#!4_?k%kC#KqGalr=VV3+jEfP?4tOp&96fFUgUF;Of@7Id!q+YG2yC1pAREFgk zxyUM@Kj6xK#V@hMx8qTp-7pA!&4Nxkid!9!q699(OhZ7QN1FQavw>vN$dis~VBJ`h zUD$Oqt!7=o2h+1O?@xaO5F{VKc-iOBpCqfB{7ZntDm*qOE~!WZkELzRXR!PhhF#z> z0jCoJu;=ClB-s;~H{!W(*u$QiO6$hUL<}%+RN0ZO+^iAO)QSt`qD;xU($}aeDZ=m% zZ2i#_b84I%>=k~E_G1h7u4XzuFU$>UzM{6{9##n_v&w$Ux`J$7pMcFCG6(1-^^w=& zy3})It8xRL_f>fI4TMk&%c>}Vn70eZ`i*xqyf*%R5!rVlJXD<#a;s!7cgFM}Zf3NA z4HVQPmr2(9j(#4C_fS`Jx$Sz%`KIy7w+^@B(CV{EW=1RDTo!mgD%gRYpph|^aXP>R ztRKasix;o~E*5S?D9s?_CuT+=uPNSd>xiZRrTo_C@89xWZTtAbVVg*o^kS<(J>DCw zm9392qmCSxAxb-Y;KqdNCyHY7-S5Uf2W6-|)g8Z`h7)Az+U-H`bzb)Err{H=jgcC{ zoF-)1Uof{?_9D#R3wtO7v(CBU8bTJbIbUpGZ{@7f`H_ydTKeN%@w%y!t^;-{q#;HC zrunj?^s~>i=iXNAZIsv}1Cybc(b0O7xx?Ju27kA2qj6>L6G0P~czL(I@Ig?gjwyx*ST*^?jSNT4+= zRhMYvIcM;=Y7NZjty!3+Qy}Ng@jNm(Xe@JIC;O;g%{h_Q9`{jsv+CA9p{3!6dGx9f z`O$9FEaPo$zU_bWWyZ+Dz>E&*;* zq(5<*LgEN8)O6CD_AZ%9n;m?Mzi@a`hibCaYqCRzWIp?0J2oNt!(I_m%osZVGiHJP zpn;QvP-ds0aH!U44C_Ov(=Y7GbByiDPpg9-tB|{Iw3T>W@WCf zxDJWD4=RtC)&OMCK)!-wX_5dME~I;!><2yQ)&cpf${t8cpF`6ER>FEB-{t-K{=Hg1 z+aDq}Mq9(iTY}N#&NU5nQ$<`H8qM{(vC0&wo+S&{PQVzmYwI=r(8@pL0 z!9myymp>wt9xt`FV2=)_?ED<}MNCagT-r1jojTrs({oVovU&Bz`XC>3V(+nX(Q%jD zv)^ait(JrPZF6qM)!Ms{o1fj2=Y#_Zo<&dIVQV52QZ3aplj=cxfmqzqM)Ptlw8T$W zaP@5n^xT!}kkI&1;=qFBJ> z@PGKu?~8dO4Y6vj2u_L~^irw~1k`J&>k}7GGfQV8-kRLXS1VgmW<`XNc7}nx0{#;j zZhRA8M|NCXGUfC^=UN7siuhvesrD?aIv-vvkdX{mh6U`8V16!Q;zwfWtPo;;Ln196 z^u8OC3?Lm+cpoTN%@xAP!@*>X%)vMTV0sc<>eYh>8fzHo{aRCwaw0R*j*axCTns43 zA_gW?)IGY#ww4cdZ7gkH&NmeHX)t!amx8U^@j*#54RMaFg!(2k@|IqPq-&TDrJ}c~ z6jb2Vw_%EUv3Q~gf{vEQkh@MHw%bxtZ1Dtlfl=v?F zm-U(tZiU=&+0N#kiMZ>)OMRCdMgTsf76i$)c)1r*mM`m0z=ruA#4?#y`P!}zJqe>m<vx@6St?{)SPFIc+R_2;}TQ0>Hj#(X-a=isq< zRF}qGiq;ML?uCP2Nmg**Z{ZV3qWkGP@T8u~TDfR)L)|XFaA?cyW+sVRt&DSV%D6q8Q`#iEAb{#(ox2FoHNwtP{i_H5>WOt z9`@`gE2Or6&O}OdI7D#g1#m-*^}3c8IL2L^fQ#-d-b0FhFuh76P|Tpt@6)d->K$X@SM!Vp`BxcpGw+O9=?&Cfs>)|q|Gnn}TUSjqAQk&mgu=th(5*bU+jK=X_ z98C!wcrSiS?dsS&-FR7%`d?x&r~K!3XK(a|ta8@}(0U+_kO#(kye)9a;u5Dek*HzC z*V?dBdK>+Hyr^MhN~R%Z5dL1UR$?b%e%EH8(HO%w*y_;{?T~WS_?G55mTL*iB1xp6 z=c=;3DQcF;K8dO#<|RvL;p|)$GFmyv`v-H+r^}4qk1kXp9SXg#&h&Mhf90oezam6l zLMu>$r&;5nsvJb|9E+f_sCwxf=UjSLTl8`Z?ZB8qmUmKSyQ+9gBl^q(xQ8@h7W(S8 zW8YJKcB_fGMl-8POFnq%vw@^lp_V{McJfQp?{{vbRe@7w|J&~nEjLxJN1e<4e&h|& zNwO~$;z$0l^h-y7I2zZ;UgaWOTNQ!GtC6fR{_dMAtZ}z^ELaCS^dH>tXuvq5bg9$4 z9qlxB?+!*KxVe{OMv}J1d*6$3iM(Maeq7#e)wQJ0PX3tb-PS0WC9~=IWNqpiHagE) z@`{C*Ob2z{A(d;FVolpk=LaSVtVzCm5>aPAC?~xvjs0vvl11e|igZzf8hVTJS_wFx zi48WnEoENZdOh;iRiS2foZX=RnLx~((zDuUmGy7+MT@Q)zqkvPkZo7V@5o$E5p7pY z6#wz-`Guv@>0xspXW`4sB0@i;PyTbUmI6s1&mO1TL6@-Vw;9ff^s*TV8qx`_VkXRF zd3W$?{Vo9r8$6O~6W4a3;#m zu_?YJT|n^J+E4;jvHpC_k29`OrziR_-z9HHS-vrD&*W!?kI_HUuT?B+_#SGpKd=(< zol$YYGv)=i`0|PqGO2K`V^B6qug48NHxz?8^{Y^>{+7~VuNykj?8lk?6xC5BJ&2VT zHSRQ>WoL)*`^4(|NNURfMI%3`jK>M2meyE+e(`9V?#!=3Qt$D^d;duzpk8qCcf3F6 zqprDgwI_RA+js&YSEO3`>I=7mwpbOyNt16PLKnT=Eli#Z=2{ikcfK?5HgxKJc_FRY z?$-o(Hjjjz7P|#>YD};zb2uj>v5-kRQ4?j~E!_>Lm)R?5rn76~B%MlhOgT)n&PRE^ zz-(-*p2aZ7lq-=;BP`z%^soo zqqm_nk_(9@x4quL?{q~CU+Jv5-&n^(ELL#2ReXhg6U|u0aoQfk_Dlosj(K&XR7zUf( zOdIPI%$Uv01=gKEZ=<1C-QuB=ICd2AB3&Rw07K=PlEJM@YckSNlq<(n%#IuuX6=x3 z>5ZlJYkyjz^K)orf1BOCohW1cLi2lo{_Jm)-=V5J`F~+571i}S)bJ;9kzXo&4cuPG z0T^*zJ-PW-;VmtsdqqUD?DYo$L+P{TvKoa(pXM6ptGOs|)k~ZTn=f(Vs_P6}AKjO{b z8trq9w3K%BhICj7Q0{yynZwt7cUaR*6GVAsvzATF;e=wIfTKd39s3PH@Y?B6oA@3YGC&kdMF;{(P=K{EKol`}rDm zz#V?^M;FJVtCrZ5n1jxlvmrjPka&`ItDgJNkUmIMKSHaz=Py#P2)3lFd7i!O-g1vD z`Sf*UNEddciPtwE3I6jT{Af9{!2YX;6CLS;$bs1iEidVM(uh7@!$aBVgKOhojrj*{ zzf^QsJia+5_siE50Ec~aKpoidwN+xt&9$68>`sBNlYXJdLy%UaaC}=)73b8CgalqZ z**#c|rM1ksQ&8)rDmRqMQS(G{`;D)O{ad+~Kzy_>G~j7oCL4GRf3u=9N>Obt-^S(i z=Ml;_c-zX6hQn^Y7lY0nk+rUkF1w71OqQKn9lqxRL;ZN^3Zm6?jZ)ESe{obJkeGR+ zND0?~g^qK%S=>|(v7@EzJj+!@N%3ROe>*>$@9M0ixTkZejWYqT3wU5=t8|ut>SObp zw8&V?vY5Q4Ag$plD*L~V{i{a6dS1Sx)M6EJR{dX#Sv|y+`H&iUagM3cB`@FYV4v zTH5OCa~*GwZsW^N@FJM7K zY(p?p5NJAcp8X3mo}m=JDD$sF`yc-e6q6s$vwvg+*-z z`F64OwtZH4WqCP5$oT=ZXj^iDJ2Aj$czSDa%%tUVkl#ahp`?uf&(Z>Jh5MD3Nj?Ol z#=6FDbh52yZ8e3LE@OM?E-&+ZdP=BY33x6)-bW~+*Ydn)AX*o?EsvTtKPA2WzBKk# z{Fep!Oha(w@1Iea$Z&qoQHhu*$Od8O3!9wX`^v z?$iFtaqApThKY^Zr}agA$<;FSeCE4o8$zrR99Na4wx%;1ZmD%YuI2f;Q&?RIcFyC+ z7S91MlPU!-xb*b&1eekHm~UwBA1tIg_!*#6`EF0pc{R3)gWiQK2pvlwLvAk(>ed8=Bzm2?_}Vnl3u|^aPc4Pn*X?6mtgI> zNo{L!r!uW&s8(aEYqIid8lUa&uhy&g0#aKf$fc`RVDq zTCM8pc?Kn#H)34J1^RHVqLv*k$=;=Sa98PQvzfE()%cgu|5)sqB835@scK@Sn$$bk z*Irx*6*77N-2!i)NJQ90p{=zFmQIF8W((1Ox)ih351s1A4!5Rk%Qi-us6J!jZBUaF zQS_bpYy2GeM)r3W)3KlR--&4~^oGYfJh)+;@K_J>JKoxZn*$a?bZ~c2hZ2#4E4f#5Z|zc%vR|C!(?5jd z{mi{*Fq=1>0BFLLgyS?4#Bej=knCf#3-%ZNQ$(%QE1c)7QR?a_;#NE5c6E}}YcPok zyf6<8g%uYRTmhHw({q!PKt}{kvbvJwf0A*_DN5?_FM3@0>Ku3-xpxeeYlO>S@6}@2 z>oLWQ`Q}0l3xVE0?pTG0wlFiTb)BsG>me+6m?c9gi35btos~x>F|t2e27o+0ut;mX zai@W_X1S`&p+2r|IQtUbk00-Ca{gldau73RDFn1s#&QZ$uAj)8>t{3Ee<=3tcWm9S zJ7(QJJ}3Q`c{;^%#dBe&)pHGtD0W-TY%~kQi`ykx{q(@rgaTTAZ#&jO7^tx!c_r!y zqYc2DO^(|{Z(pi%u(#+G#94lHyBXqRh_UsN8ZUR(Gxs9;R)C9gz=qD96MlqM(0JMXPpcSk zyoxInmHkB5h7&u@NPbJ}vOq7P(O{sZS}qHFq|&*n1?*OG2C6eH+yfbppKMZn*5`9= z-K5&dgSX{@7_#cd>#`pIifHgn?EV%LpFgk1N&uBHHp}BITA!_=)w&0i+e&F+jJ}HI zL1&L0yq}wy!V(0LvHYqm3hJWyR-esTb5Uk_*y*CnumqKZmpp!Aa6)iFO`?oFA84S;!wOKpNG!P;l;Cm@ zsn8nSBHHb^d+rf3NoRJtSd|u~UC6+j^JQGO^b%*-PTYlIb^u#9t7~eoUJD$;P8~UV z1ry!r_gw1RfECfHkksXfeb9*(`jE@`#f!Gj{Kd)9TF;+fG5)95542&^{nnZm@jlIR zye)w&`uoahTs5}?*xDsjy<*9b2X}H_Mw~uh#j@25dOZM(F^vdBJly^s9f zI5i@+eUb8QpC#lTJWMIH6lnKQVMESZgaPH2*|G+bmGa;#^~XPwjAB2}Y1f{VR!3T9 zLLKcO^N&n5GbKm5KK{U|u+84Ii#1I{PExrRZB$}L{A6Kr@X~OVj40!UIKi?riiYlu z%&f-*qPr#7o7hX~6{BC!QY4>zMMt@vCCI4GUe6eYK>5a%VAK+0Gx$lMm;57uWJ%`| zhf(=)=5+M6WT${8X3V=J5ohHEX;v3tMZE{*dG_K8?ElE`x)=R=Se=apr{j{U| z9lEzWuCRn;5JcZ}1-2_HK_k@~$RwMH`Q-RFnks~S_rZ^m#5$q)Nn*hI)MeEV0z8ZFO3)mJ#YJ!TT-BNR`b-3Y<`S}6EfH+T`MJzWvkK`|AnQfw z6Kjj_F#Kj;!EaA=-#?~gqNq=uMvL^fR}Yo$jVtwJHKaFV7^O}NcD1ohzk4uCwN+(l znauHOaJZ<&;-EJ!0{de@f3|iw>9b;)82@0MPs|@}yY)xgvIq27&ssuB`!nG+)z#-l{2u3+kTFG+HERrzDg$TLGoV*F>th$x`NA9 ze?C7!*i!_C1GLVpXC*~7LR91ntK$=wTKx-yMb{E;-4O;v7E0n8IVE*zXXn>+g~(dhS9ZPn*J_R3 zP=5R|KpOsh1b_3?C-b;K4eress!nFS4MH9#V_OgWZqh##O@F2OBZOP{o&8-&>Sptf z*c%K&%&NplT4&4pF86^+P%M(cKWzeGbkie5tq@E%ZPYY#!D@~>DgU@=W<07 z=U5N9V@#g`%D#6z>N|VyPr;B@9eyBz%vk^#NEDyBu@Gp;bN<-kT}-hJQ<>e%h7V_5`Tu=nMd9DRP|fh^M&R^@X5DP+Z5j!4v+k+O zEAP6cnb+#xRa#I>OouxZ46`|O2wT@GI$eQI+`}9ySEr}mstfgsOtHjS8Jz8mf38RB z9xU34cGFnzq41D2?Z?)UYI`N?)aN z`hmHKxhe(M9+r$Y>COhCWn`18Ba;3S(NC<39usLh$J#Wu+Pdc&IAHSnq6;M%SHb75 z>tkbhUUj#WG#kG&ioDe!|4QV6L6l0IeWQcIs&*zO#$IB}Ql##-Ni~o_w{?x??Cn_Z zgbibpm+RgKD7#yg#_6H*OkVp4GW+~v+`N+~y3I|oegvU1JLfYjA|{yv|C*P|`3{AX zPVS^HAov+XVj8G7m5Qh6ZDO=$!>7NJK616Yvho-6f4-Vfwa|Jn7g!~FHNX0i$TpRj z9)P1KTvP8jKL^EK8gNhUr>MXc5mY9xzZvWH^yjA8`fLF~Ras_u6%YS%#)NLY!>L$M zMrhX6JhlkBu}DV*7Xr`wGpu*@{=E~s@Q!g~}c{}8U5$tU|1pEj?b`*69} zvG2Es+27G*YV+5AU4*gl5kC6M*s9K+dJ$Bmai>S?{;`H-Dpj$O@ZRQTjzNiS*5ep( zcp?AFgVPt^BZ>84;^Zvo!&%GzXEAgj7@jHfMsIpngAr6~kBO`Ew~;zV)pow7PRgfsQ_?SK=V(!l^_sM?Ez3wTThxOou#*zh z9Jrmkhtddut8YS2&eUqH1mA86SuUXT3SH-aWP6u2ttS^$$WsZoDV9{7{+w9dkd%`a z9XQlFpfLXkJJ$IquZH!P_>Ze&y3c8WFtFdHRaD99EkKbHMpeS7=`S@jH`ARwKJr&e zbgTJn^$M6-fvQ=-AcMyGUHATdw5&6LU5L1mNk^=rmSCRP^e;w;510)=;c%e$EzR%f z@a);Mpi?w6)c#KHz#5qUGWqij7+%I*bw&1C)y(byLL(KBJ!`Q`Bj*7<8_PPM-D9fq zZSPawFqdu5#IkG7_~OpDkg5lwm4&Q}KY&7ASZI7F@#5~-eNpeP!mEDSzp!_}YAk4? z5}rsy%XdepOtF!0D9|czPW>L{guum6;~DTcb%NT9>NQ`ykanoMovN%x1(R# z*p=t~JO}9D@CuW^#Kkk9iwyLk0D1yeH3~Kc2G~rv!r_NeN1#fMA3x50j@H5W^w)tU zU}6QYE$&~n7vFnrOx_8grpLVSS_mjp_-;h{^|;Z%F|vTX2U)uhUNZ2I`&`exf7MrBq<^P=DcHv>gJ8n1>Z7js-BiRudJ*L z1{5O3;S_4M170bhg-{2x*>KmGde5LKV2O>Xig3x; z%A@jARj*ElSAfBfTZ@0N>THT?nkZ~muP9G+XBzRxF3*5n^zY_RoLXq!0nB>kTbHr< zDmd{8*^z1fpWt*&VPKbNYFs^`LpY2t)`}CzDdoS74wr0A}DRQC&)F z;Njr`4T15@1IkuhG{J^R>*MCG7vFf3z{=M z@&&#C^Y>+|$-+q04>KZL&4&t1O~EW_@SkwDdQql@q%x8l!xoM z|AQSUvQhoGynW4;TyFB4XQ0mIX+p&`TmMdcj=oKnT21#>U4A_Z)~Qg_^R*6QMIoz- zxOy#fAaO3MkJs*6p3$2P&;0xT`>3~+`q8;FicDalCMbqTlErDQWTl`oS%`P8Y_Y0Q4<+)L@S+Lhq44eguIFO+)&Giq zuS)QS=`KVS7}?mlefepQHW&uLG4%c!m?&uc^wHI;SB)4QQAfKYC3ZMXI#6Yy427tO zRZvi%&?2ex0h{{fV?C$GGgN!5F8TB7VED3+KG3s%xkeHUrN_l!**_b|sJK2}wMT(6hBQ#(gVv>)#4*Pxj;0Dck$fCjW(HwMKn3M$E037Mwxz7Sr;Z zWX5?>CFK5A+c&4Y=XzqO0}s}ffA0X5=kMYPg(&iCWfNca)_8j;q-w;?i`=?Z2;g$; zSg|8^A_XN|;`%3JQ~uUZN>%~sFee%ppo7@M!eF4f>6#Px>C-1*T^AuXG3%c*n~NXo zttYCbhwin<3gNy~Ukq(>tUUm4a@W+L zPh`;k&`PUu2;k(PsD$N^_(-K|cgXG8QOj*5zs8d?+t=iQ^A}%}hfg+D*9m0`DB1R{ z|1PfqGnzR5vwmoI+8rauxwe=@2u#5^0p&1S`g%1Otl?gk=Kt#n@VGuuSf)GyzLCYW zJL}-0jO+EGs1L!x=_+(wf`Xq$iJ-D|wJKXhC^IWdCr2~Tj`i=q72}Rm`Oo|nBCT1d zq;0&txDC@8;L9H0ps)U}cf|J~v2Q}9!{A&iIO2R)KF1aiw(E1m@O)rKr9Qc04M2Wy@b58 z&}dn)Fs3sgTlpI}SxDEe%b#&Be7T1r-g1DaJ*@uVll?XfZ+_Rv>ue`?2v>2=(BhxA zRH_12;8l?==0yNPIu`C<>j87mfd8AVap6GhWo2h?dCI+71#$veRJ0h2wh>D>c7obz zRT@w`#BxeVXlT}QQWD5l>+9>V)r12Y8qFM6Fp(I$O=sf$nE1;P$;&hBPvVwZOdIO@(7rX)Vs=u=BE`C>TWkFN$kYQ(P0A zLZms)BqdpPB`L?v&n)(26z4=or>1fOoaX1}7cwl(tdWxT1$zxfEQ7IHKf#VoPfzmmtxhqV@osy+G!{2D&`#DdYJl_h=6)uOf*jKS% z@XhQS?xZIhQG%5@HU5&kncYG20PP3K2T62~Aw$cZr8z4c9H>2+)ne^ldG)A#_SO)4 zP>G%gk!#&_vSK3$#*dXy5~;@;{RaAt5gjQ5gsbAkC8jU67Ym=MN>Uk?leK%z zmbx|t)R*xOSS8Xr&ceSWm-2&1j-M#1q zNH=`fdiVKe&dk~G_D_Rxp67n9_|>gZ7iVZ&4~fK(WzAl>V1kQ2-+*^jS=1aYo+R2u zSrvEmW$3=~EphsJuZ-l5gy48dftbENCHM7@b6aqJoov^F*48`z;v*vUVi5jKGTe%O zHJ8tyI-B-RU|;mzz>wChudhcct5it@P80H;>xfj2HV!Qg>M84IC=*WS$w#7Wpe_Di zkAC6yo1R#h^NzctsS;dbP;ua_hgNCLBMxL+tSgi zv-#4*8X>|@2;uM;UP_BRKODa*^G;aR&HYXUs}lsn@LJa5SvcvT4_OW3}X;hk4)g#BfiYFJKAxLq(5%hTcckX9yM-<#d5!5S)@euWd3ggVt zuz}Q%G#dSM5s}OZ=l!iDcR}{yfUky8IYc<=?pHI-zVQkDSocomgm^n&@3;x<=i#8I zmhS^FbNvcA!~BEOxC;ebyUDkhj4A_&nO7!5osEqtkPN|2`cNrTRu8uJLsW+%!?e!B z1F;_qq)G+OVF$$s*|aaYALq(ekdv$2I&1mty-l#H7|B=>q+7gUx+nTPXDVn{xO{&k zUZz75L^OoKCdP+N=Xv9NtXn8jCGYsw>aU^POG+iq@U#OTKXU(;xPVbaxyDS|$|{Z) zOpwmC`~79XePfNk(sqSy@zxnyYZV~!>Viu4pOXxT5kME@umnSm_AirEQ=5SCYbBz> zuw)GQCakMh{U5P!!-KXl;(@9U1v6bddi!Lvt_&brSo_z<%cwLO8ynfo#&&1wF~@Ev z@I&)F$9^LVM|kk^gN5xd3F2;&%vBvkf(Quk9C zPmEoUYq&7g3RQiuf{C{u8dD;d<1?1F&d!M<11V_2Fgqf0-@<1gCo8+$Ownb?;`=Tc zpg0`w?Oh|RMy|&%ETj~sqbe`?8DIN7yd9`ou^ICI*B=6D)2Pmj15%z17JZ$Pgo29s zgjZ+UHJ>9jsx1S1xVjv+Jxj6jQ!+xz2+xo>Pz4m!zE|K@%SK|;VOV;N0I_@Mj8)N>e&+Rw=2ugGHk)(F2x)(>dyR2g{ZTls* zaL=#ptIOvYpuT%m$!*R*`WR0>T@h-b{Wqe)VfYIvO0#eU7T zvdx*=f8uLC-~bwPusN-iJ-A!+v=#IZ7@A`L`cSW869koghyxr4=KYacS5C84Iv;zIkiXQIxtApzUDvMLw7OaB#+d{sITxA?l%@nec9Lm2< ztnf|4b;eipDZZbPSU$T^1kw^~XJ^D;!9|;{;rrI0b93o+L~zuu^z+cZTNtJibOaq~ z$~0c${JBMRH#DAzJ09wuw8e%hJz8V8U1Rf5s@fO(fqcxL^@WsJBbPY8_4p5SCd`Cc zN6jCK-f>=({7$oI*ijhDNUUfVk!(@g^EcaFnj-AcOcwlhlL?7(dI3koUh)^F*Fbk->SK?va(nF<(WOS(qRPPHoGqvEMZ#c zPy99YKdT-c97s(gIA82Z$hz}mKZY(LHMK{>ArH75ULcGgd({6)6C*SqKLAX4uF20v zfX9JLJ(NegQS-&&$%*wk z5R6PrOv^W^Q{Qg2&^TN7^DcF^J=Eyn&6Ug(81J4)@t?t`mRAu>M(Xw66IQ?_T1j*6 z^dSy(Cn-y#;XJe6sK3a|I%zJ&QMJ9u^t8L8NhUa7G#)5GEJ-eTJ|Mv4*?@g2cL7J?qZ$U}4jV_!YB6~XQzGA?#3|dFu^Oa`LawaVaM~~`G z%s-}%TMaQGSjo{-Sz^v3a{mDlr6~a;z$o>^D2|6?r1t;cq9P)I zz_=0$4S>gPMr|8`9$c_aYf%9i%WEJ~~ZpSO|J1er( z-#QK+lwF$G?O6=|?K_#`lD-+DXJRPVlG;za`z4Oa*cNNsw^Q^FJ zFUn^W#MTj4%vJ>xSFFA^o@e79F1e0a0ptCSPuWhVN8$4x8lIQ+GT!$#^+QrZXkHoT zB-Fn6*zn?kzpNJrd;BeKT&dSvJKYeb#Unx7QW)Bw7|2%m@N>Zu?b{a%Lv-zqpLFC6i97k#L5}9 zp1m~bPxeB03+bGEs5Abuo>MCJbRaB^#O8ndG zj5M|f_%!QyNn9CBtxBIxhxqFkoU3UMj1V5eA;UjlChuNfQO4Bpj(;!-dP ztz`_&*9e0mz6 zVG=k=REsY&Y%0_)i<1cb5|;f^#3# z6C;~o1Qb|g$G5>&FTVzFlyp?E)+|EZbK2@ZwJG2hd`S5eSH7>~Tr#9?M2`#~q|ucd z<2}6BCsJgB-=1vFy`FFOPZ6UJDs$Yd-nl)Ds@kkg5zA?w-vTPH$xQMXI1-8qRoH*3 z9j$Y@kG^OA&DKZUo7uC^j zsNMA z#Xm^7-WVBor%m3*{WhQL*;hkJDM~cs8zO~M$<8kmjC%d zI&y$U7yt#4sn)xI2=FBZjCjWbn7 zFqu#v{?YqFT@mQn70vL+&Ab%%BkBzwJ#sJRJD`^P{GtcL#swjFxv;VI7P}8}pN!Ro z-B2P|ZA9Sb7u)v`@=BO7h0Nw=>tlCDt6Pl&Qe&n$ur=d84Y_S+NlbkFT?lg_eWv+ zw(7;2XO72QVAoV!`T6g7Y8v9JBd^`t85#IL>f%QM9y{WYTsf zZ2ri~U17`TDWTv7ZA(lR-mj^Aq#L=tUL$X0F^=lqPC0!_M8bp* zCiw4hzp-AT`$xG7sC?4@Y+Xo^97TK7NN{!V{I|!P5xK2;0N7j{xL?4It6t-zqVf>2 zm3*|bZTj)8LL;SgB0H>BOF_} z>HTo5x|Txs6t{eGhnP#hXqbY$LKjJVAaN29WakIXa~5AnLT9-t(3@;ROh|?R$TzPSsqp%x7GUH$%6SmdQ*`(iJioK zAverB{dQTzc>8?~n{yxciI!U4G?IcZ;ll?(+fp#{9Usr4tW`xab07VgsL>3%xoiwY zj+!4`)KvLkNxk#&3lo$%42)}D=q2+bl)X#aMUbu^{}uo`2uZ$vDUVgektA>%Xut>L2~~J7A}dnQY>E|NHMvs7r!ZH zQ*b_OWdq3q?#-K7@;+y&!8>OM)3o8DV^`nPKie19+cYe?@-*vpR_=2|jGQfIC-Hru z;F_Sbp{IkiwL?3aHfba>i8ct~T1(>m-SMQgi>T_F&51Le$VA_9S2K$_4-;Gm?Fto( z7ky$^M2T{`KP(k|X!Jq8?2vMl8b4b2{t7l$-t~6L9ku>M39e9Pb33B@(y6Yu>PBdI zP*Sg8_;)9$t(>kt!!Fg}v7uNuuY8})_UCb3VQYEHM1Oj%L{`r;D}_+8v2Deyap${4 zw<6tc_#I3?ao77Z$$5J(z9{5}TXlZA_*Y`az78&oE`@i@l=;D$bAjz-9sV@zaPWU! zT5-T#s3P=TIw1IF)Pa4_iqZ(Yk2mJYdn(o|4zX%&F=2kiK=5IN-T0r?>*(b}f7k+^ zZ7x^=tB?Xu7}$)W*w}G&MT_KsJ!eRQp@%c11kOCfj7OF-LwYwO0HflRYp~EF%(g+8 zJ`6)4pcX*dfz*GND$#{cDXQ3XbQ>*sugX)pJ4_j z%W0U9)g(J5if7K{Xnz=j7vF4dPEefuHnAz(>75da1n^3_irh}g4Y6!HM!T3LsmgP) z+RAGT7HlqOiPrn{6P62|>o|fxrH$01!lxAze33$V+&or$FOQB_ZMTO)2ZbyyUO3?q zd2Z(+N^#HcTT*lTbaX%JKNf@#Rx1ttH^`3FPAk+1nhg4CRaid9#c~0P=z?r98=44tAi%&|;9>4hnjD`WG+$!nc;T zzCB!GqGZ+6*Y(TT$>Sx{h9P_;w)CGp9K-$l%PRaNh-1@px-vN!B_lc&=r3M(v_F=h zQ~=1pNopqx5QM>>F4|cRLP~B0G{LKP!{uNR37+EeP-4MVUTISJE4uC4B16n6HL*YL znWJ{bcOLsDRAuRg!}get{m|p8B8O@Jo(82* z%u2;KppDhgXl$9wf({E|m|a`iC(*LwR) zY<;941vXlAUpr_fwg@V-dk1P8SoLebIB^ERqG(!3X$JrTY9M<-YqqyR5R~@ibSVdJ z{=)&9p$nbT4fjx5pFC?Vg+{jl$7U!;wM2#9?3Pz>RLBYp2L5~oA4cc4!_t@O=^0*k z2Zhen`{;rUp?{2@FausQok^=^XMOC!h#Wjs;h9AzLiU` zUQ>I9s+ngaSsDPEsE1r{!i8GciM%>o(9b2YJ93M>J+A#eZQ*@mkFDr>L!_wGIdk9J z?w$lc+|>hR`D`VU;I2plqSZX_pX=Nv7HeMz&Ceo3w4P?92==^ZC`Jt4SEDp&Ikqu% z)4Q2oG-@M965rJw!Ytf9+=4i#aE2aH+%;3e8#vx)-Mo?H7sxnasn=5B94Y%CSUgRB zZTB`O5k0TiQGYqT#W{<&8VypuFU>A#kjPVZFjG}((V}X=e&akKg*A9bHR*&;7OBV- z-|w*IruKG&Q)Z1*eZtm|BI zTfZxy?w$<>*zqE%^myG7%mM&Qjr5tQg;)w@k?&jH?&0jXl9byJJLY zAMd7ZiH*QyPC<)@7%w(GzhFHi+X3d7qAqZl)^V*z?IqR#CM(C7?_SXPKr2Qk$d z^iwG6>P7mul+$`=?7ctL{M$l0B%LV_`XiMZCtG=Wc{omdd<}4k4AP1namHj142{z+ z^^xd>+LI({2OzNl5@=~|4spG!I}QS{RU3}6%QxE$S#AgLDi#QZJts5N!-$a}A2yH+ zw+ydIX*;-eOqbiEV6ksf^nC%ql9HP#gG@GhvGpeIkE)JZUS24`((jtSxqV{LlsZ8ta;t^*UD##bcK=B9)JBd zIBn9i7hiP&e`ox*#`H5A3M1vDlLmC#*q0q-(faUMjy#5b=eD0L8u>bI0-@bgrOTr- z_=(FZ=a#^4qK4cv4gUB7mwfy5V5WF)sa2WNlI+Zh=HjJ>U_eCed7oL^Ik7^uPS)Nx zqXGN2@Dr}e;t}e>F=wJVoncbO5xb+F(UVsH`3d_QM4cetf!YgP1?|Am+~qZ-jna0& zGlN8z3z$_98K$HayT~tiZ3j%`$PMb*?79(CF2`YJ2LX!yl(s^elXq478kL5dw(%Z< zJ9{dFUXL5xD__3t7Jn~SB&{j=GD#xpj#6*u2EaxB9H%MF7-6!_rWNF@U!Th#v-j=3 zY87~WL^X+bI)}azqU8%l@w|wb81NqJKzYEd4Se=IXcagQSnz+VQtB$C2>KuIt^l3- z@QW6pcTF%XastZU{sN6+J_5}I{1mjb_aoEhHg|KH1!(dbBrhIm^z-HlEVskPvHsfL z{lM#5Rd@fh>BOpdOYU&@^-F=-v(wz9IHU1K=bI0P&&9?AM`oB^hoL$2 zv#Gsz`#V(MVI&ghi46JPf-t_GI{H}1?B`tL7sIyU{3tRTFNu{~&8mS{VkM{I3-{H2 z{p1GJDHk?aSc}F%~7lz%WceCa(KJ*pTDHQ{K2KR&YVu2qg@H0O0@WJj1TIsO#8 zQ?c#-sL1CVdBy!ML7)51^(RgK!mnj+GIG(b3>$O4!@#)M6?ykozUXkf=H=&?>rtTN z@)X)IoN)){%CmB-fg3GIIAB0)*hTSm@8oomi#P=pn+fwSAzIZp`Ssm;;knOhiRpY+;k*;)z{P$=w@Nrv@8G#;q!O zGx$)rhc=6T091NmtNOmc`93?%w(GijUX1smuNuPiYW}eJE4g2hsD;qnix5QlzQ(cg z@73F6Z09eHPT;**vjRKh%Jz~XG?=>RzHy17RN&M`#N%q^LAEcCnAy((f0e+ZBNGxB zuDP7DMdXNpF9x7mTveCTGM{l3@4RPKhsEO!q5uMp{#0$n;UF4`Ik!X-Q1XK$svF>Q z#o6qW&Z&dVfDS5)^w9ns`MUI?d4uZ>u5^{O7jEBRd!h zpu`EV?VbA3#CF9CXM+-qmn+T>8 zkSL^MFj_xlFKYX!2k;X%FXl_){-3DFldh|hX`*6P9u4o^=WcU0F%mN|H0<`M6&NIC zNp%8XXO!WU%Jx9v;TgZ6)2jY)OiG!7Y5ARdwj=h(xwlhTOK++wP(3+^;r?RS>?wP% zg6rs$=WJp&h|uxZAD`yr@q3RbV`HB;HLeis88NPXsUVIg zF#OjqXOcEIUye{!QL;F4S1^~h&sst5T{)l}+k+(+eRhp(L5)wYF^AorvSUjNCya*fNx6bC+( z{4H0f+t#{P>SnS!y5E~Vyu&eL>3^=a4MHS-LQ)OOWr9($^asI1E@m9I!?X@pIeT2y zBdIICAdV^MM(rDyTazqPo{2d+L~FVTq048SztN&hu(~N9N3jpN{`bXhqDnpWZ^miI zLm~?W;f3@Ut*qzto~e8=(thlq#>m{(rMZ6v&0kR0^Yx;j_ZTSJ#7>nb^1qBsz)uOBI3uR%4Xd~t-e7b)5S3{b!_`KVVSEDP5UHqShloS%9 z7(&akOPt1@zc*;~;hgYn*PmDR%p(3J*~INAahK{-=@&(VR@onk*B1_$exKlxGK|{0 zp0@Yb7_6Idnw~8Mn{Zu@9Nuii65(B`%-4oj?f?9qnMY)V9P-uBcHn%v_<8X-pDZ-U z!8QEC?X{a^4UJ=jm@eKk}%K^Ya)?> zL+gLEq#JI$j`!&ldeKf9VuRax6O>A^us~trCUrV z!(IMV4p}{Qr9XPVJZz%`FnA-S7dQw-JHX!3f8o`}f>GsZ1w*sURHibeCKy!y;FGj9-_L0u0)Oe6aNlB@) zAXLulCcgPpwTKet$isgtA@zVbaM+=Qr(P{&fQo;Y6MNeIf}02X^Xa>0((D1UvHO?k zw#k2^TzsIZpER~)S=%t|~qbJu$cCqHkYIgz6*=yPC z1pbfwd;}mF+lN(Ywj-+`FF7AJ(}H&kOLz7WB**GxaOY0?#lJcoT=J!C>f%vvWD&FJ zem5||pmxG|<~ET2G1|E~=k?>7wbfGQ1IbCJknMML5!uU@gw$FWT_BJ}X0cW=8t?g9 zuf%>>APFpG?p?*v9kE9^yl~!W;<4U`4kd8=`xnyKLCR~2(Dw&=+~e=7O5KvED1w(civ+>q=7eRUBVs|ERepZ$c=P&FzW zOz$*F4vGMxU)Z)fe3R;N4XjGwjjQ*+isvRxqN*paADr_It7dx_tNu4B%;Kz=4>!*F zXo6ixH{M2smYfD_bl3|KDMZ;+KUkso#=7u%wQmE(99z_5E~CNw)Ad8s56e`dxko;4 z8OOJAi@i;|xV+6-QmNo6yj zo+#<>SJ3;q7HqFuFK{l3CW1Ta&`p!}b6u|$qNXyZk)5BA{-rx^(C-0ux_=54<^y&s^0TN>mMv>RK`ew;38<+{ zOh-fPW|1&%kXK&*HFW1=DVTebaL`Ftzux|1Rz*9)s4WFk3gB-e>E!}IgI@<$9zZ@o zW`$m2p{#+!=1uKW_eY>>Qr-guq&J-sQDtZQ9e1$aoS~?nm+@7Xs48-oIR_ehO~yLV zz{MsG(V=Ypfao@>0^2UX=eWS6XEuFirjFV$vAISel+C95^?n)2%|H$J>Xm^>M^(mK z0lcf+W=kL(i@Q*ft?QZNFy(n&>MLbKVZr(UkwO)#l1r@VCWBupjBATILdQe+Eq97J z;+r^})5Iu!4Lg`7Vxe*+7O(fPp9s=(5|u5DZD8XvOwao)7+d|?{UbqsbI+cPEyS$r zc*&Oz*N5llAkhYIxG9IDJ!)GH*-pjiU!5#fRlu3GLaH?4$!4V1&lq4T*6jJn@odUZ z#WNT6%A_YQ$LHi8>69DY@7>kXWcf9H)ABdXaTAOcQkRsF?}AJU0oU-(pO;b&PL&iK~|Y4=-b z_nSn9B|>r^JVmg}-Xo>k4c8BWXtK zH?G^a@RmE>Zkd}NZ{1MZexOB4nc6TZkz^oM`pmjL%zKf>fSl}tc<|YM=KLg6?q|SP zU<82b;o6^UCB_Z1MYIR0)+L&OJ{55B1#z;;9M!VRZdC-ove8=h|H5=6{a&A{fhla7 z(jxjR5F6rAFOp_(+uE|=yh_Bq{>NFO_vO!PS1KsvjcaPw z-&WPduLyDqCQdRng?%5R3C5@9J+CJH+8l&*TeWpn4Yq|`;l*iVekI6!TMEt*O{J-s z2-HN`U6LV5cd^o&RuS(G*jl$_s=Jnt0#maEcfPnbH;Z@>GtZJ-P`o4K8g($gQ>FHz z)$rvavR=8IhrlnLdoy{s#Oftb<B+ay^5QCU3Qu*bNnZz(^ zwHjj#j#hSBtst4~bRD$j;bHQ*-OPAHN=+)X7J_gyRp-Ns=(w;Vr*o4ReDe{72$mjbp}F~tCtEp?%m z$3}eibB?&*w*9s;E9IwBkWIut4dcasZYrBfo5V7H*cp7z-K5FFGbh40VoEi=UGmY;D3uUz$n%Cdo$~$kCEj%6 zM%o~=#KtRCQD4gbtQg3OdtR#`lpppz@0k!R>3afsda{T`%=Hx2u@({Nii1kHS$U5Y z5ff=#)#5N#&CO_!HfQ$Tl1p8q6q)0vkU1lN`3e3TUU+VIB+q?#lW!4AQxalv`Z$M1 z5^{1EaY7Kzd|&4T-bY%$VMA|itUB4a7@u8okDwBArjt%eZeITYIye%quV48t#_2EE zUtw*qv9r+HDqLAC?BeQL;r8&A@w>`2F|n^|3>t;HZQ%M^>WsFY`E{vsAYE2YPNYXh zMh1^c5`B*_@OcDu@AJV;(-N3->|OzTqKBfGxOi%8&HleNS7p((LZI@HXZK#ZpSys{ z63jibrM7lncTm6>)ZS2?RV(;JAP@C zal%pWFl7Gx0(Hb?B@uc_EdGQc)8u9bC;$}-u5l`{9MwucN1pn|n{j-Mr;ed5D#??D zEi%-DTu8NvD(1Anvd$B5o7);z+OQ}_%0}S?$JJWpSBV!SUwpRq>@o>hJ#V}>LDd$M5#5p}2kQ7*yOTiMfRsl1Kc!roashxmATqL6mw{#(iPc+}K$ zCtJ9u^Os;UyPMM`rayVVe{|mawiz`op@k^X#A0n#;hFfM_`vp|RUT2%f?(P}6n(#5 zDg*}%@>J*6I?|n>A|N|AyhW+4tSe+QiguhuqL5nr9-+7>%diGZhY-uS(u)NHs~4Yd zOc&uXCPy#_oXUiT7|PEt;a~E- z3Mh{z=;0@pIzVkQw6Y<*U2Ha?_D-KJ5g%kuCV_~#$v%+AmAD~+`7tqotp zc`&oODr)~X8F(UpB4$c5GLO=3Au!IbU@02*CSRRIm3aSmQ6PVt_Jee|(Hwc!myrnB z^4ofFTEO`YH=vW8kmM=moE&WSr(yIYtk-_HfGx}o@cIl(Ra04LG)PWYrH4|Y_86Mj zf+;dNgJR(^1D!uphDq}{LUs=-cK|O#G3lMa091^FP^deY1Av=n<(QG!ht*4YElS@< zAG3=fQ!zXHqfxK*T(9F&YQ+;J&&g%2)yWw^%u*8fl;@--*wQ>-FX5+t1uF0+1zp^&r#z~hG=s(%|a*6qF; zQa;!#ad=A#Bg(eIi*x7tWs9piW82`3gcwx_-2q4KsJ^aHaDvU{Md>oNPx^$c{o=lK z$n+1l?F}}iOGWj07L};wkYjY-T?*yb;_X0QcSlL?OVvweaEH&ZZX)r0zkT>hyb}Gb z)NqV+8-ZPXz(}lcs7!{D@2h?)Z~39XaMc2Z$2k%2$`jfmugSlkd2geev`>^JC42kO z7;|bL1HHZ7e!|033k#a0q@>wcaj>Z0dHpn8r2CfRDIXu-a&ibz$spF~ta&E6IaRa5 zq58hWSOEg+42O?QMhh1*V^76VVYRFGWGXQA|YU$|&?3Ig*!b4`5|LlC021;ulr zIr=G9Za5y-k7xTN)lB1EZYJ?B2*^12Mxo#zW+4s|Vvx)lANc0!tfRWYVJ#AE@Li+~ z%#T)fLba^8%0w?rHi2kiOQ?3{4$m8mME(|(&Zp0itL9Tw1T~~J%@*L)Ah>Vdtk9>X zEwD8klUVT$uD*_r1d*VKX}X535S;$NJYQ@-jl0;Mnmk42X#i0a(MT&xs#lyRXJ05z zt;+%5m{PO>%WBb~)60~|C>lSZ+K@G6>&@gv^=CQPA_vPPe{`EG#*YiGotC1CV)32P z8M+Q)e!W@_4inJ4&CQ`DACscg?HOz7MbXY$LXVQ6Z-BT^4(tO@2ef9oli18 zKBgt^kzW_M9W`kY#BA|F3~+#^*(#<3V96i|Var zh+|oitr8OxTbrz6WB)b*v2#Ny|CVl^caS7u`=XtbjITc-~l**K+>3!b(nu+ zWvu3BC;t)x#_6ot7Q6Q;2BrXW0Ref^HNx!-HOC}y!$25GL(k1by?0M8N>YbaX+NN} zntb&@{r8uZGi@RAI6%2pumZZj%OQB5#jJPuy^t7=3Eg}y3yc~#qIvp_5?5>;@8759 zv?S!jWQZ-K(LElO7yl8fIRT*)_s0-hFPAl5=U~;y6d%G zXFog8T_FZABLp*F3`W_V-qnctY|>-hocb(A@3v{wf7Z8)!CzP?R7Yv7TU5b&Stq~8 zcn`Z-o5Ci=gKL{jQGxQBWK6H4F;|OLW?$Ho5Iti`;8!Wwd5>$>1@YkSHmXbm(D<+^ zZSRSn26Ks!`!$eT)+>v7x7&AyTO^WApIPj$NQ@HN=_gL-id1};sLGV6O6sW2BTQYp z8rbHg)frJp7%2KSmu_&u6}1)QQQ&sG!v_+mZNAoQyl)qh_ef)0ExmdCdJqF3Z|eQQ zRUXAwp0-lvpA3`M=Ss1 zjp}Rmz2#p1obLG|kgy%@4Qp7Nfd@G^O0ByE(DAJvCH8-ttt_kTHyJc)xg0yt5iOOi z#z+LgXwcWMU%&f-E1nn&-3fW;+9ao33eO$30nY?M>{epMl6P+`8X(U*NCwtRI4jFS zJh#)N9#sEL&AKKBz87}OmEXO*7tLyHkYhS-5q+A}WT98;zVux!{O)xPJei=lb>31d zQUKdRA(1hl+Lt6!^Qc@?grCo@@tw#o{`!HKnb@^+xVJRct zoH0+T*K>VM%%gycbdOGU$$ergq?6XMd!9g8l8&r|#|Mhxk7_d0uSLJSJor(#L$Min zvYGnmJ^6Hvbfpsxd+bI0sDchT_KC0l{u2OWM{JnTaqvlrTi&h-a;6{bK6DWJK4OJy zU9klWu)7gYb6EmoT}lZR8~sKNmSX$V+`^ zebxm3m5Vd6Lh5haOHtfvy)JQWYZgd(yT)@2af-z%M@W9{T3gZVbdJk&Z77N$?8 z3|;hDxSSPJ>n`naSeiZ|E@gEu7{Yg4horIL&&+buFlfA5H&%9I*qEiPJm$O{Kv zf@B0={u?Oy-6V;h7a};@TuB0(a|0KHQMNgPiE3~UF6gJfIGCS4v zEeUqocfQxj1{0oe)pn+rHBOES+iyI1{rCf0rRO(RqsG!sB6YdbNSyhg2-7e}NYP$F zkiWz%jKBdG2m^vmrq<+>%gG~%dmddX)lZyE7M*C4?1*;>2-{fUejF<5dyB=S5G>QK zZ$^Umd+F;(_K~k*0z1Y0zWoYPY}k6-_Mq^S#Wsuc%H;i(wgB}YW+Jw&xPMF>`S_1rAWS)Of6T1=1RpZ#s*JinhnwF5*1qumM%iE-vfMH`#-$;LNpr9KopJ z2CiWn0d3u6XxVEEuun)&o9kJU!*mPyT>XC#4Ng(RE`YCGCTeiqaE!B%2 z)oUZ?dzQG7?h`E}5_v1!B0lYP`TGJ!MMvX!n8OAK`D4a2b~`b-L$j9Bf=|Yt;0G~f zApxO>nEI|RwXsZwbqLjKyM2|@oPaD^so=oM5U=Unq2@62xVabd*xSAaYw6;hLIL#O zp|-MX<-Uh%Al(YreM`DfFzDnq#_W+matEWD1oZW=*=$qK+%ndp@iP$kBtWtVF@30a zhZuj2?|ihwfN;M!NE5cPu>k`!>;<#Bvd}DV;86y7Vej0<$A1M7frW)d?imQX=QlU& zY*u6o<4W^ifa(h*gjs`L=aU>)%N=+0fq|~jc``9M2|v-4<)QuNlmy`@HHPcv6gLy4 znzuv@iwq6+@oWS5yFb+Z4Mt~&uk@(_n6Fr6XO>$JR*7ZVd~o>vSJPvfr!@5`sF2%; zGbklu&_PY7J$Y&jkqZKu@>2khfLrRRKkwm;2bf5y@B4BQ8|di;E7*V;HIL#GOBJws zKpk}@=Q7f=(j%HUDW4Hs+*TM;6L&lAAEAd@v=r@=H-%Q}qd=s{mpLyn93K0Y=FT^x z7D49692o0|P3}z?ELp93MVaZUf1kxfQ*zpC(dOU98wnyB3Gy*)Cf$4Gu1gFIe{%HX z=%XD|QW4W2avt$QYPCwc&!+S8qhFr;x>~m5nS`|{W-_3psp93QIg(&BTH@6f+ue<> zpLHK<5Y5^dhbs51vDI%E85{W54}Ya8{pgzG^Mj@Z64IKPmqg7!1+;WWMvHz)UY|r! zWJK9CHTCny{uOekMX-z78U?C{y>-6wu~5>{<|^K5^Z5&f+5Vo?s1J4z&r#T%hV~fJ z^6>qC6bYqd=RN@O@Sn|_E089HHum!K`Y-Ct`T7Yglwy!_EcD1ABV-8fcM@JD>JV9t%bjrgz)lfAE9z z7tF0HarSoGo6wOaGd9GX$iEZ6egd3p+%`7eSaErJoq)2^gGN3O)eswXAtruKU4(O< zgvXj3)miC$mgq%Zw6pNT{Tn0|=YTc!bbe2!N@|n5I?vf^&mc{rlJz?Oy{%i-@t78b zV8n15fSuJuE^npJVy#JPFPZ8KUGonG;yn)8T^>(0mbN8joDdM7r-R-Sv?OkU~A z2}M2?Ie~ZG`eX2`zKtH~U42~71~kc`D?{yA+An$OyD<9uuE6}$gpR-hA*T6wDLp&; zC<^Z{i~;?KG59#w$4bBp&_ApTuNra+a@A{8Al}k^6CHbE!~nCb8$dm+V}QCr=3MXp z8X5uvVMmh}r%}rNIXpkijrq$&lupi-O`G3#nu{-YNPcq4kH%5RyM?5e_*=0MHEl6R zW3lbh+CRx^a&>`6nR$43G@zn`>JwL8Bn8B;De6?}Bf~7gS&lK+^m?pDFp8B(nz}MO z@ef+AlumE3VXT}Sl2fpJ|r5#LQ3kq+!cMM4ph_C+E`|hU(41(_X(w~!?>i#m( zX>i5P>oZ&{{b<1ZlOx~pTiyDLRdPrCNTAd*D?ucU7}@h9#6*@scvy-+@+=;N!N*S{ z6Ib|N@p>@Ir&2k;#j5)2T}sfkoIXOD=jwtjV)&6s#QK2C{T=akWZ04Q_ZLlPINumB zNgrIUzIWyO<6nnc^DEcdn(_du+xKx9<-$Nv!xHU;&U32)lUV{ommaj;i80vCC+pl3 z8LrYk`R^uD={cu^4T&kZ%MLNaM$E9BX{Cy*#33Bjxn7w z?#~fQtMy%X&DBA%r-oL&xONuE;ldBh|aq(`krNWFTl*6Zk!ll#G* zwZ_<0Ajrw`=4@n`!AALdNBh8ti;KE!=S(v0x%=!&T+LG0f^J)Cr=UkX&uEx1D{WC| zL&T_&ZBdlosC>P@bvQO&Uli}07#P4lTTb^r99M^Ne9p1v_YUSro?6#te2J;yP`eDM z=lWE5_+XB9IcQMZ%X6_1-yiLQ%QEDb%9g^8hb-4UI>t^S4JWI9z^X~ed`wr%<0mB6 z`G=N=5w_4EG6SJJVY#GGGq^A2*|EMVmX~Lo@=*fy%4z}p=pZpbHj3c_4uv`Mn$+(_ z(NrGtZy1QJKHX@x)y(VsLy2mV+PLdi6rC-O#}`V=TmI60WJ%etF`R06h3PKmC2G0* z*9d~^y4Ckt92{SM>Ru&oG0eb_CP$ar<>h6;{k{SnA@H2rtHp`3VsJa}n^sy-Wz5WI zRpAD5jjc3uWzq6u0f33sM=3~n3h#-ozEeMcSa+K3MJ$;ei|W76dN?#8tPzQQ&x~U z^XzvspxS+GVg?G8F4A)fchB&_FTA_VQ!@l!KZK=rK76RhpKHf4jbirS5~FGL>O$Z@ zw~x(M$uFYwjxlJF@R?F$^kjkiQMBLG-v4HP(hwA2L>o7D)U>l5NzN)=Y5vTf&&Vt) zd4x2BtK_Yt)#DsI6Hq$zPH^XmRJ>VZI8iuwEfVRdaj;90^X)!dB=VM$rBwi>l#5I@ z!0HD}!j@yr->OW%aG8{l-&n!@S}*ez?^kf~P2NAzHqwxOR4&#)(26gdD+>Ubos$vk z1ge2DsjE9v4+022$F=3q#~tbn6(#}Ni(_?)NB&0n$@uG6)|!|*s z^;aq3zBs>3ErzbLf+xw&^!gMJJ}T0LL$69Zv9lU0GQdRycYvz0yabG&wcxS>vW7z33hGB0w{Jr3T)m^hQ7B8|F(WRR?avi|IR^y~?DVrcy19wayCjf>rbnF7YTw=C z`l4MYyO7cJVzVS}Jh`@Tn&mc|RiMw?c6Uo*J=AlDtyHdlqqZhKDMRH{u{yG-L$b#1 zFXk_+ugaqV_mC2s>qIZd?!LZkB?8xCkso|D3?Q`-rqzFg*^i4;jbbIw;2iL;5q?(V z8R`~d7Mm$jp((Fj$&GO>qC}fq#}9+$q*0S!s(M^-AR;{d+#1U>=2KMh%mZF%JZnR?|yVPo6yC=8iW% z8bjyv{1-t0D685@-YVLG_bL1E|6}Z}qq1JNcHsvVQ9)S(f`EXM(jwhTh;$0lN+XSQ z2#SbwOLvK+bR#9*2t1^8clS3Rea{(tpY!hbeE+Pm)>v!d;Qrk)=QXboiJ4Qy)HZz= zy^Bla8fkY^KbTMbcF7g(Q zUYKk8SP8@KZ*LFzGCup!amQ5NG^>BF-Op`F3 z=4b}hZLZR^7^~`ks0P6}7Fnn#2$mXuY-gD{FbnZ(P{NAxn=hRNj%e3N+JF%=lXHgt<*lb0Q)9(aT3A{LCG3*G(HSOQ#*5$G?BdlzK&XR6H5OAYtP9ah*~g z;+9B_E0c3AHr?^Y>sRER5vMA%w{H)IUALmDL`gWSdZ)2ZH2#(&5G2=khXUdk3z=8@ z(#LxwANxyW%4ei|p>L{zZ-B%z?<{Niv!rowam7^to4;x{JG%?Kseao$&i{b&fSbKvu%XGwEp@myDqu^-X>oi7 zUmL--3QM_DmS%|>q1&<5alKXpKPC8weVZ8&(%*oR57&dQA}+p`70%8>{ld}6oAR3=bk-d|KCQ}r z%EuKVxEtWNJN-DI>XCiju-)vjyf&|1%XBX(S|VP%Ky~o-gWsZRXY&g$eE6hbqC&}2 z#)4{t5(e?-JIrb+wSs53Od9LDLw_C~)>}rR}Ttx_3 zJ^qDzO;;*!(Af9!SBvppB8K;p8OGL-jHkF>PDt!wkVWXWXcz(}{T{w7^ZGIJ8NI0* zN~^xNI~RYZPYAc-cCXC|lGUdXd&D|Ut%G??K~5pGD}Isp$r6kD#w5cUuSCc1Xm!v_ zUD6!be!Lca*6!(Q1CHn(y-%4|1GPS~-|;gRJHG{QuDFW7@~U^2K&?Mt*zO0L4i;>b z-;CVj)qCz7l7gTm-T)&qn>cijx}flIsz(ndd(s?(pHsrzar&4+C3g&jYD+#L>B?CN z0cUiy$3I-KQ!D{~6jh zk(Av&xR{>Ht34`M6K#>LiilQKJ ztV?k)Fs9pY7VI}(`n2hTb@gbU+jN_DtbwhI`IfVQ=*W&(NiStwYMgrxp&t2KDDQGi z^T1FbI0X-mai=T@KK{0SxHllD9BlF=)J3_%AltG}))XiDCbim@$BnU+$B=tFE!nH# z)|5mA2ItQh(~U76GTJQJr<%~fVE`Zdj(3Y$4@I3mC%)w#O>beP>=+O8vg^7hm*4`y zlOF_^P3k^wc(PVVObdbQFTHFwl`LeKxO#kKF=+qC@6%%h>IvP)dXlB|4czVe;-dPx z!3{5EMN1V-sn&*CX(=fi%`Z%qAN}9{=U?T89}~g%fR*NRISe9gTY13G?+WFRMFjJ~ z`~?!eL#@_0Tx=7S_JO1~+;hMum6Y2$)xdvw)~V19G16Jgaujn(h3iSw(}~ki&g-)q z(!9>6hb)fvdKaa7RG*38XlrY4GcX1tY?PD+U|`tty5}-DbGJ+azprI-=-QKp6%UO~ zuxqT@x&a{6vx(`xb@<*t@CV6cQL=HEqM$w_w5{Kc8_V{zD?oChu)PsD*yEefX5U57 zxiy1r46ia8FX01~%f#E{(cT6}EgZ5#{58_*9{zW2-yD@7P3s>I_&ibuE$}M&y@R;p zc@`*A@Mx;JSWk98LB8rKO08uGM%E`3&W)GPuf{75q}>KsT9bjRc#TVA|GB#1Dm$a z5;~<|(w5Q7`;L8$yYyVc=g3K-r*AAVVLAxb1AWCa@ahzFTMWTgYA-X9d%lQy)$$&y zWdWuwq$HR^4v(%D;gTLyLo~8qP6Mq+7!f&g4?lePuoxd3OT=Mn)UeA6;qvEzABC<| zf$KPtbmk$FH%FNs-`CTQCR~E`@na25%~m7SdA&{SK7n#=&s$2WB2}XM1*r3+W7ZV| zcRTZeP56h$QGTe;OdH+?mTyCun!bOIE9Z`-+vaaH$MoJ5G=$jCYFf2I1L^0_pBot& zMOI(Izz8Ja-3Q@I-meA`N}S*WUAMD6g1@IY_~w&5wPK&D3mUJd*x+-U_+<9t%@Pf5 z6Bvm;v}*9e&I4nRH5ECC5CC(`5y&<}47VK3W=sZ7C?z>7fyTpxBr|4yf^50m(^*)Xa-wKyE@eH zn4){b0q%eZ;Hsxu>9u8=NHR(axAM1jMjSY1y)Tk{c7J@KIWfI%(w3g=p;1PrMsadS zW|r0wBZ0>qfru&c+G!y1k-%&e@>+_stsbiPM|HGHNL-9frE>;g`> zTUWOrL2UQF77Ym1oDXt1*T~%M%vS3kVg0df1@Obk7ReR^uAq$3&f=7Zz0ceWX5a%u zuS9KMdUliW@ki3e6-q9y$f|vu>rX5uYvM?OUHOC-{Hw#t;EP60B-exhqS*WAEZdRp z=({eggLAEByI>as+$jg-1^GU*Qr(1=WO@d@Hxb)O3xXkL(bSOx-kfEkz-pFyC2aSs z6;fsaOuA*-LN@UXxL!a4l&4K2M!1g?{<^W&U;_G{&*w{B6W?GCQ2sMQW}9fKiTb{W z#v$|^8RtyEhmLXj^)&>A!8zR36N13?`pmc`Y{tm($cqGDt%r{2Lfn;SNcPbJkUg*nhL3J;;KMr69nq<}{Y(9dPjI zWK4OfEqFE(eTF9pM|y+Y`=-LGckfuOAK87{EL0;4S8h7lqtO;WLRQpQzJ<03rnaa! z0UI(I8FO=UZ*Om#xV0dYOzvkQ@LVEki4yZ!xqZ%S{jM9 zl{oKGc=Zd)8MYk2*IzrNeR0)(4}5zC%93lG+f$>X@MXYiSc2{o;N=b zU161>cYSqW`*!?T9bR?Id@63A8<(SPdRIC5$qf^_y9XqMQSd4hVzs!)NQZUk$qc)}p$UR|d0mfpo5|cd*3y6vx_>&J znTGo>0~q%lOE=A$tqGd7pBroUPJR!0+WS!IIk(h3BFK_vjqjMbd z6N3P+e6^NjU?o>3(*~~0k*8~Gk~HJ36UXm?(uR<>VcM^xyT1~@POpnPeDuoMhv{E| zFxTb!{A?*B!EUkVy?PmNs77pCX$KLzFmMAf_nEW3^)YZ#$oQQ^AjejT&I}BBFsKvU z&dcQhm^mcvgvmIm~g|2pm!CejLRBX$w{D-{ezJQFDtZ)8mISh8Bi4cZV+RV?16)%M50h~Q?8xj}t; zf0XS-s7>E}++MgLgV<=j0ZeV})UU{iuC}b4%eBO&?okDjze_V;^+ONSuM277Lw@=e z6KJ#ZW^G+}&Dw4VGRtx>^5>%gj1Cy(RnMH1YrrwhVEKkuL1X`GDDYt*LxlOEIt~E? zJaBNg3l`kOosQ;C6u_PBxSG-sUBJw^Fx;V~melUM`|McHnfeTa(_m*%@2F=GlvbD- zXYs|93MF%7b4xejku3@|U-n$O8XikpB7Jwat)blkf`T&q?sZ@`e^K$|q+)FSeYe1& z2*c6^BBiY&m^8Pcq_DRBrdhcUmCaJ0LgL}29&q5WwX#am+#SMUqvJ+h$q$`{l z+@90h;qRZObg#}f*ZCh&)P|Uyi5*ZznV-hacd0HNivu?vc@jKUyQ*T}kIm}fV{p<| z(mg1Uzv6E!M+@n2z_EwIQ}Lb#xhC&Z90JPI6Ha*N#tJN5RC5wV15w3QuCkQOFHeypN zO2<3AjP_7;4?iz>*zvU^x!T=B7*VlW>3UKU6B82}+7CR3GW~XZun>l{4_8P=0KyoQ zy%5<^u_y|aY>sjc5vqYWfRfERang!v9+9q6_MJpk6j`go-Z5M^_>AdJgq zy779&G&{Ir{BL8`SM-0;05~*%BJ9HBD>4Qyo02&9J5$^SEvYF6Im- zP0vBAZyhdw2+4G9Fv;w^_`U3O1qLt-ouAFE{1%G z_W)ldNIw|(w%14NzorZ7mstm{vy+1iNz5Y1?g7;nP*90c3TXIOjG>*-HRQegPCi6q zd<4i?-yKgIP)4H&QY&6Ap+P}URH{BV&j6{2{G8N{ZVPQTOZj8ciA2vtob z5RfNTr}D;}3Ow}zT0opMNBs^}VbL?E@3?uN%C_sr&{Jw!)mVgp&G~0gkHF=>2zIex zbCcq=^O=T(xdVBbsQQB0k`RU)(3c5wGD%`NZN~yi(;`qQTC*~l9Zo?7+LI+sKpc1K z$59B{huEcmJe?!s1=GcPvbyh(^!mlg$M}nIrk@qQwQ%0LT8ihla$oB(!e;Ja(|dcBoHZrLl#0fD^xL!{boz3dr&Eo7hra2I_h?2%zxb9F)r>M1O8%3 zrT{@OnZHC6cxsGpkqN{G1?8WX!(;U6(!r@0D`2nOY zn@29Wbr6hGVu}>9dkTEavkkWkUPzKF-Dm$-t-}9t&b*#Y=)-3dfjf8+_1W@$FyP>98rN%RgVD}07d3WkiG4~b-Ut?Pf zp92EYSK|5GJ34G^ZPVzbTH0M^{5coNv_9R7f3{Q4%O{X<0a=PYzo;RJ$*3>2bqI<& zVC(Sm^49Kj@!EKXDngexGc&XFC6E7qIzte1Y?)9DTn;4&%1DFH@rq#SlIq0~1|4|x zE|D2R6a|W}3ORGok8S8bUxd>qmrjVM8tv>2(PJOoE`DA;yvo5~G(Qpx{0GtNaYqdT z1fARRtG>VZWgfrTl~qPF2Cv>l1s!GzrqZ;pmoC=ped!$ZR)y1GW=*rqibGRZP&*L z>Vod)uTtPHgCvuQ{O;koypW0j)2@%~xBbqQBi>`1l8|2N$@2yA#B4_*pVO{U#efzF z;#<~6B*6bDSzUl8qCF;Br#Kc~4GQ}ac1Fe=Xqs#^r-B<;F`wW@MMb@T{~j(Y0kg0` zr@iGIt?Fp=%kXUc?@3_EhrcfhEF3B&(+GrrztfApg3k2Wv+oyuv)S3%ki{@Cpyb_1 z`jjbCDH;-Ic1AB?p(P%qsU5)73FKBP8-ymPg{HY*Q((V4Bs>^b7A(UF6~d7FQzlUT z1{b@0glpX{U_p+vpECO>om+aYN#+{KGWdx@S4r)S-7ZkB72%k$e@(80&<381M$F@U zMNBV_*M>wKwNIr)&6D%fXX9~XPK4o(f1obG=~Z=CPY2$Z!=f z-U$3xEzXSfNTe!tXm45xbwoQzTUJ(9PLPHP?4YOtCpCZ+&%r+hgm|ck*pU`H02J{F z36I*DYhBKd7NBhg!p#K~^gzj|wwM%%Tem%mD*>0sm*9RlLs(S>wwU9H9k`vqC)59g z3gv`eauq(&r*(1b{Z?Cm>`z}OfQSqN=1tjp7#0kbgSA%uzSS|MehlRiSMgKQoG?+s zAG%ma3wxCE)OF<}rNBpmCGp%N;AWaCai)F;xq;8+t*gC?72J5Ap3;F8>`TOuTKt_4 zZ-eISttXIV($!U)`G|so0)!$>JU~#vzu{@qPB0G4A&3P9bd`hmU7SqBmoElqOx6^Y z6kdjGM8?{V4^H@94mbNCtRN~IltCbHw2NGAy!~$#?~T77<*&VL-BT7U6b}s*09rLf zUUPBoTv0y=%e+4mC>U zvBNuUY`re?6I++#1!$*f?oXg5TNO|xUzGK>%jnY%*ua-}FuTi6w>CowuHzw6=z1m8Z5~QBf~6?##COmw zr9Zd9)w;qN%CCZ-(K^@!Jc?o$F7D?}MZY6a3!j>rIxD4n3fu2B4(3DZzlG*s?!dp_ z7!R#@?bl;p-i4eJGRW)#mI*wMb9dR_;H`C~L&E`fuhIv>fnfP+4@w9d4;9O^V_Pr) z0gJBlgW3y_xyP8pV#r1F&9|RNm)81V$JlaUJ_!Xft_qTO1iYLoWjAkgLNI;XR|Nnq zgUw>;Voz~#rzI9%`tP#&o<*sMu-d5&LO$Sg=B*EccQB@H1APwF(f!nlA)@Hlk(tlg z7K#}6m|Ck5cZy1&WhjM?5v4RDUHHBI|BC1V* z9w?NnfuUx9dpu+u5O8s)pCxD}Ne_c3MSRU?14n`8$mcs$o^;Sl7CapLD(2Jo{Q=@k z?Gceb#Dne@s?%gZYE#

w#!K|7uV7L-{Y+2I_NE+6GlF;9nqr%!0f}$2V{2*1GKa z`ub2^_`%ey5`f6uZ|Co^szNK!Wx-A<01Q;9UV1uxW+6-m&V3OtO$Ly9u3o(gH%<7e z30z5v=~7nq_8AcB2H9Ky$UH|`kUx~hqg$I?>H4)+{nba-@6Y7H{ZN8Gxt6eEy@g#$ z>l$KHt$&9MXu;sjQAc*h_{YcGAhZYnNN~qzS8w6bH8ikzV$*ENku(O0ie6? z`z0d-j)W=CQj%6szLQSQ&iw&WwbZ?jCmDjDU%GtR7?UOg9^RUkO4!~H&4Er1zNLUi zjWB=@^ItfMV52gL^L{rPV$+Fr(YA^WW@yu2-vKzla+&y1lC+kJ-97_f+SO5&M#$#_qv0-w2kYzWdP6o%zIu;U z!8^Ll02Nb?l9WQysCysHmiaswvVkx&cbxvuJq*TRz+3{4)R2}Jf9_#_!aW}8HuR%h zH_;0l!}@U$O>>YE^>#4aGSa#opN>pHt`-=5DK#B6mEPtqEc*JumsykB$6uhZclnZ` zF1s|dbPZIC?90VA&It8K-)4b;{jvYzk+j_e+oWW$#>XV-mObY9N%iou(XS1G{Jf;D z_<)zXzmlqqbxibqIjeKc>IJEW)Cu|@Bh?mujGtMUw{HE+z9Z-Iubezn^uMNB0H8sB zhun0_g}ydpD)gj+4x3LN;`K54Jauv5b0lb9`jtfh;hu1p0BL3>dT)I^hKUg?M;YZO zV$EN5aee{~QZoIv(4aM=H&hmcTfTA-mWJm{9<&E&4va3qgW(vTa1p2)P(`nE>mF2N zxl99c7xuJGg(fa2my{xMmx8%~5O?^qv~Tp>B}Uj(aSEJ0Q6T?vc;~*osldOp8Kq?+ zXCRL6$@2cDc6?g;uMa5WshF11Zr4v2qnBWz@PJz>TIlLH+xM7ib%!41ZfAuny%7SS z3rs>rJ#<4Fy$WPWeG5%pgT=@oCmYm?MuDipzzzWyTv9?wO*HVff5Z6>li0fArSms+ z#>~*z*chTP7ALAJ^E3|+4})AGB<(TKt4QnqAj$ba#6YQ%poT?d(#&R}ZePuN@-;3; z&|LPX;kT?Qrb*n%)dxRwl>6-K;I!$D%TDpN`1&(@m2D6I{yhYAQ9yVNqQyr-HF<}#tw@_hqH8{}&v`mOl+8}_x+F*W ztXjr(r|fXDwq>qS>&sF4X7#YCO_1-aHs&@DNvy}W$4T!+fjoO(yq@31M`MA(ZS^ny{C$XJ?QMBXwu&sB7GvIqjzH>V=ql!@vHkBB)NT?BxJL+qgr9}TV*nl1 zM;7QqQB!5JgtLa382Ptg97Xq!Q-`Dr1kGH6?e?oEpTGA5p-$Aa-@MpngdgQS<4|TXX zmi}itD^A|E14*}66oK1134+%>{D{1~1BKB3eDuFT3?;1VWTS7~ka2$dWWIeo&HN8* zrtRcYnq>6?Q^fp}#Wr~WD@OeL{e<{ZVljEXUbzusZzTfF%u=6AM?&{I%BCnbV;qPP zd;eq;+Wohq6=h|=-HzbwU{ziy;XE?2(EsCXjDr0^g%AE92l3S#b&A)=;k5qv0A%@! zDwPU@s#krotM|H-%uQ<^T@c#&YNd`QjWd97=VRC%CNT#++yOK- zV70it2dRk)nPItbGAyMO(hT~R3;z;4*-^U!gbaW;K~OM_d3rxw%`j!wRVeH>3vRr+ zCFaulkzHT$6S|0uuUv3^l_mCE5|xb`;;3Kp?ok&yh^m2zh|e~|Ozdhm2kw20x1do= zBo;>ME77NA{R|3~iI<1Vl;wbGS{W(fNHU!ieDaY)wQU&tcg>pqoT$!O| z;I~BjG?e;1qd;w$`()2@)FP}@YMhgdw3yHHfe^@{x9~AwcN(;6@eB+u5TO+^e7}Om z9iZw%XqY~Rx)}&*AWgcb>5}g(=||&_2%l~w0LqZC1n>L9l@?Zs8eJyNyuzhk5$5aE z3nO=>JbI;!LOY%qZq?U-fiCPW+Uwbr9ylw7tm(>7EQ|%Od zaa-2HBL75~2cnn`ur^>g$9@;f#`BI$EY}ujsVqltk@7{JG7BO#A?2x@%JI#>*V_~7 z05GQTLe|;IZDP>B3@zQU`0}3m1w6cA+OUhU$X^QtHPEb6dz-@1WFy{W9NAv^}Jrm%cB!g!-lbE368Pxkuvv?`I^; zz`DE&EYW7i@&2HPMTe;9;Za%^iwQo6)&n_FI%IA`{B-ir%F+#b2m+5V2i7FuBBK_y zy@Fia)o1&o5FuxEClvMUFtH!iUYyiId`J%y{J!`4DdLL`R$W1Cf(jliZFvIbvRTu( z{mz3EU=m${b}Hy>k2W#z>nB_nHe{v>Nz%$` z__ka6@QO;HzY*62eTaoMwrXaukQ4pUMf|~1fBaiUPL;mhNn8XXNZ3F_WE&m3cXvPJ zccx}M+Z%Zat~A?SZ4cHI;o)So)B@JN#sk?V^O9f@6`E4K&WHDp8Tda^iuL+TDl%;d z<-cgvua%W@wdAqtE?B%%E6TJ;$er+FAen3?mO5QyBJTF>AJm@PVDz=^PTB>q(I-hq zC#M2s_YjCY?*7Mp9wxCasE{{2s21b@cpU~2K(!bheuCHq0CzaHuaWh@KR0(hl12CH z3OK8OR{$gfsMVeo6+E11#-PiM;XIU6f}Ukmp)rcS+Jex}vcKS;*&9z3mqyFJMsuBV zS#12ucpi_2cye3sQ!S3P#laq$k-5}lq^&`#fO=DRp8n5|-|x8NNIF~bcR3c!E=G?j zgcNq$cC`2e{AlgeRXIOC_xmlZfE7dNuJ^f++@nxP`#Ig}FRz2^WCD7HOb-M9ac9B? zg98nS7g^^=0ww7G&o8Kih#qXp3B#jB@awe%k)tQd#`Cq#pBe#C1RH+tctVBaPWt=z zXfZOP`n}1b*(oCWhK4jWG>{_j6P{H(c?BII1)ZvfV0E*fM*CQNMXh2bYgFVdGE9~O|pi563UcQnKw+)gG>f%n;$hX zahaW{s;USG2*@HLabm)Rv}bT|kl&Itd}KeT(C|EFz7 zSCL(?qMG--ZQyV*!||__!-J(Q?^df_o~!P+E>~z!Qa910HPX~Z;JFHWVX%KGrl92D z;CS#L>G_5`E#sBMb`R(VI8BFxoQ3V?JEF4hBvRf-biy0v2;qMTsN*O46cG(+fbgWu zLaI`j0o5IMEr_KmRZvJp6lG=_+u7ZIwqEXXWQ`KqI<5?47DAI(f8jJcKTl0;nF`}e z^5D<5VfUP>l9G~OAiRU>Z7YWIv}$hdPCC!eWB1#CjpBiQg4!;|s@H57(ECf`9Zm+Jw+i_umocXy=?=)wmtk63(hEh5GBoT=8YzkO~y8 zsEdsb4Ru#J;XW_y7aHzEv;{-H6ULP*pPO{{C;q{MNyavcQ_BDMtndjVqGeH4Tk_wP zf{n0^;=~sMx5#3wELfdZwZewhgz*P#!r@dpI*9+&%h?7ou#Csmn`Mp=d!uSnmzZ+ee$*1JZ z9MOKPrIXKTmnX|RZt$${@2}4V1qJmi9{%%M>6)3xYRW@95|#TWa;hBzP(2-3CA9@P?{tNS=+bx3o*G&B9Gr z6GLgtr@08W@b~_{(V4onM<;pwH|uU*L$vW!eC)MlpkT#RDV%;%$$m54%1?!_@!-QcggxD&?MXUItLfNrVi?e4br zQfqhswbqaCY}M745|YP63tR$w$nXw7ES}Q>$_%dHnntvTwW-XlQ>>_q2$U#&m;YR* zsH1d*VrV}E+!%Ha@Wt*k!z!^!N=N`Nf}lE@9L7<4IZY^B8t8=cgC~H_=MP@WhOtXb z2%yjb#cecvd{wYiV^zD)LqkJV#p*zX*(5Cs6NUyg*ez|ItEcaG4)Z}!>?eeHboA5=PQS?NTNy=JcPN$T7f zbKotr35)ykL8wUcM|>GGicH#^Wc&-fT35U6THZdbaiJ$ASS`;bt5q6provu=K z8{{rT&{y6P8ZEIgZ9LVDwYJ5MS4BL$a;awy4IWje|HthL(>EJSlyd+KsR0kpER72SsRxKiOQT{=vW3mnOH8K>Xn5^bU*({Kg#{-Ehk;_& zSB=_takfy?gfZ78e+*uc&5Yq*e#x_ddX&|;v!ZxlrFic11$4rqrDyNfAbW=EUVWt3 z?7ZhfTA(cVb=AgdjDvS7b$&Zwnjy=0O+;~&nq)ML)KYNH$3FIz&TK-ph#d)4(#zJ* zwQJV032wGQSJE>G`>tN2;qZ-}q_9hQG5x-_F_2l0O2oCLO;7!LnuxN&@(iX`z|7K7 zIA1%u*Lb;+Gn_32Cev;o+yW#T;)XlI#u2KLFw(!<1geov8fdJZ$p5{1;kR*wJ0&O& zu)4l1uC7lviC>zK!Z-&eE*zXl6gMMIa~6Bn?Qruo;4WoUs8#}e0kbIt!I~0w*bH^9 zcI`RbF)zV_;YoRDY;=vwkhH4_f%IF{9df4_*5#bbezG{@fhi2S9#2aG^#s{Q@i_cqHwDs+8(zdm!>-+^9L$v z;2#^aS$$(q;Js0tO2rSMEaKA@lKkc&7xK~kL2REITbATN$obZ~-G;@z7Ka1A6<6|7 z{D&+^vOeue@3+NwI#($j)i4PkYY-U*s%$^HqQFNj5efqvG9v zDs96khu@e)@^-iV>IeuPK*(+9j33UJ7gJnmvk?*nn|7z1LFs*ji7 zzV0<_&F=|*>z1fXL2>263kxBN+G#LX+Piv_$kL*vE0V>dn9d9QuwZWDcb7#6TqaBg zvms1Km*fV{ojYJ8kqJ7?Gw`(4tgz|r?`LIWTm6+a1kCX2>T1+Ql={MC6;XL=@UMe|dx0^zee0DK z1fr;+m)GBDBidDu$&2jbN5KRlxtD_e>D6s5bt?K~-}L-~6;B>Y}PzD1he z?7Vm6=Mnt32eC0*_!pMw2+>cdF9Jm*%+akZT1G}j3Y4k-AtMviYx!sWeJF4}>Fn47 zpqScSMTRo+3j*w6Z)Npb(F0JF-Dmc#q|daZ9P>Ssb( z!0MyL%4T)(&95iIbUC?2Lj0fFvS1ri-Pp6puT6sDI)h66SjOMs1Y{J4Vo~#_-RZ>P zJ~$c9NeS)d%BU_2zC)w8f@o^>yCp6#cei*^Y)Y>cF;Sj?sfx4>!n$W}h_~^Ee!p^m z>au_j8KMUDEombR&^ItBK!yR$gHnbrMrIixo^!Q)2Ibv_6 zU`E~WCNk7d#}IUMb9JlF6_szl>XS}*!))|MM$wmBm}X(T+A*@W|44I&d`!wHxh-S* ztPrk!=}oQe^PhECum4d;ck#?l9fqTnazO;ew2+?3%U67^6~TI`o0(?1Yt24naTyum zo!AID8;})5*+58HESX4){42yrdwUjerA*7|=x!3Rp)CJ0Wa5rte8Hez(lItx1s@|@ z78RCcDw76C+kd|Ef5d<%ZaZssLj(&uyMC7Z*TzN>TwL6efJ-*Z14~m4UZ$V;zGlh9 z@t7*y35Uvbvf4Rf&y|jvntCXo=;#gTOQ8fG=7aTZqvYjvUT9kQgj)))<$T*M>okMq zS6r_v7s?IUsA4b>H}GS^h;YJN-XXO9)D?|Som#Eit&T#lF6F$QFWOslORgH@J zK4r|DOG7gLPhlPTo2Sg;I8N|N4h(KnC8be$PnGyY_K4^WJ$NI2!R7V6bwQ(lQlL}9 z=d}r1Ip7^G@F_Y3f0Bz+R)eH zK!I>h#!C16{QZ${@Zg}B!NqQtwn0CioR!53k=#8!ava8J_)Hot26FPMRSs4U$dFI*WVgb(X0HcS%i8qI)K&tffvLZC&WT`19Tt;%%B z|4@%51`V+-ywI}wqFF7#ws!ZB#N>m{J~er6gB~-9WL?IRp>j0748MV+SR=Wm>VzI@ zuky=qmoiSc8ti@(q!eF7-RnZK7R(lRot&IoBYPCpB(E~Y_db{>3vCoOQQU~@_`GSj z;x43@>P;3Gh2iz`PDfiVRW(DiLy=m2$C;N1qooafZzys%)V+XG1g?eR;o;%@UwDDPfByzB zkP#~2ks@QDIA~PZWEK|gK>700KB=IfKqj7VX>rlv^l+=Fh;2|Ue_&t$CUangVYW5h z1m8OWP*b>^V3*vxd$%PWwzr(Qh3NGZj(BBO+kx-aUE%jr`--j8nO59nYObGjI4`NH zBJa{yTq#d*toSkW?U6D|LNb;p)u!WD^ZA!FXJ!>Ff2$ z#Lw8NHjL2@QAsKvb1+34$i!ez>aq$uhSA=@7c7r-Ff!{<)9uY>N;Y0gow-^1jx&ue`UwC#pB3#Z{iBw=p-8 zkj?XaXD%oC%W0U)Pb$`9){7~uKZY;DQN5|+xcdQ>VbRgim6azjv?OLT`ceFl5)l^_ zbp+6;73L{8-&IvttBSqjwap&x9Mx z4Q$Z>bO*qvy+Y9T{PYMN6JIGu?Zvi+G6e2%q74M zmsNR9qA{&KuVwD$XevqHdly@}VO=LYdR4UX;`{FAu(TnL!ludqj^&!F(M+)UkfFgV@{#*dy^heG1zsLBUj8q=N^*WA>m7K5P5(kPOYz$3%!H`3H}M!qiy+D zv&fUDCwbK)&T~x_m+h4|s*8Wjw0*sqA!fm~(_Zf}Il8tk&``N`jq@^bgo~Hkyu^4% z=0R-rMludEI`Onk##`3ygze~qSnMl>-M$3Tet&XmHd<4c=_-91|1}v?>S%+z+ch?er~Xjy3t)d;hFYQHn8Jqt#4&?FWo*yUUuUgaqDwV<(9@R3R{q$2 zT4Hj9YC)e)w*0Q25n$gI)%MYlz*D$hxt9@%Pglv@^#7)jWQbb zOy2_}tB5_ULrCA`Zne&<4@0M6?UntP$qeZAad>9pw4q%kUwFq%xaSBUW2K~W|0pI+ zX<{qR0h1*5mz9P%1fm9UsV5EHO!n2QR|w|m>FHs$_5fhJ0v8=h5etYigL@>Etb89D zOgb?9xN|2hD@z?NMxd5M5@}$;ojJ*ecx^gJMztb`vt#xZIi3Hp&rJhb3+5sfF7mrB zhDk^Rv;)wF2)||2C<|hTN5eg&e2HMc|HB`wgKFm6yaaB=8vszVub{w=>I=Qdg^W7+ zPq_TWjOfsl33g7Bk%o5gxD%+vgUiucx-KoD^ULuLM|lIxFtu0HXHoLlX}HhU%NkUmG~@yU6$a|#Xk5>YW9OxG9ig) zsQNqVrW0`}W--l79>xw!aea53trz&NE(S##%{x1Gda85bq@(2R2dq4lTbqLNzVGm4 zOx28b%j5L&x>oTv1VZh&P_U^3^w4Ut&1K|Gr8H11~Mk0W1 zpyY<3bPbqejg?t>6yx6~Cl}(-uvr<*xqSJusu#}xcsV|_0yoM`fF`Q-9<#ExpD>wB z{q!RgW({eNU@oLay)}>D*E_(=@-3PNuDt~x91hZ{Z@P2Y=JQ5p-I+f=JD58;RkL)T z`9x<@5WGmWfDw}Q1aaHM^5jx zR<~O{s;?@3(xmxeT{;tB6vm6dAxyye=k~?{)4ZzXu5@jFmaMSME(ansBU6L?s%;qRIdVN&gf5(V>uzKrx=}!vHy&TOltLUYvAu{uB zs+df+j@UB03a3Ri?uF`n7fo@TU+58%6vQghZ|gqqWh^Fr$G~c%;nj>K+*_~Sm^vic z(K#ojj{ZfZBZMn%pwh*XlnEtDNxeAZN5#?426h2z$8W2K5;iPITCcfAF`kdiD$s@z z634rks}J;{)zjusVsj5o1l?J~Uo!WzjlKWQX~{z&Am}Cnx{-<^uDA12{zU9$2f@Ch zz=wn*Dgd9-w{dc^7W(dj;^yW;?WOSlYSjPxrcu~ChDG;kwH7(3!F8prclP$?=8M07 ze=QB4EYW2;q!E)p4=^+n)oa^VZcwp^y-;kPc)LI0bXx{j@Vd_%!B$0%v`^*zfjj%6 zKO=Gldm?l>PwS)oZ2Ak&nO#SJ48Mj4OY}^P>+o^!^^KFRae9(-)h~_Vep*r)-QJ^U zrpY)VhXRaz)JK|1({S2GnH!k-Tq-x(B$;G^)wowYwM*813tP>u ztT~&XB*URNp~yqV@C7dNM@PsN*0`bFyXE&-?{F#=2BcB;Fm$q2%JqhWW#H+Sn*8Yt zhvO*vRz%;jfecB8Q_jfD$>S?5M*0!qcPZYvJXlHC!|h%uQ%si$MYcmhUrYjbl=InjQk{6w`Z z;5~>MM4{fY{{}t|2@eitdG!O~RK1IG3*A@T*v7fxxxBp0<_rh4zrX!w5DEa5yZ5-T zpft|0&!EZ+CIsE6Z*BME2#1@N0-d|4e9;mH71M z;n~edy;}QTxMJnjs!u<3aV_8mepxLOn4DSGJJ}IdAtkApUhKxi-jAy+9a^o1F4Q)% zDrJug+m%@58$6%IUZ$C>HYS&sxH@gl`v$*BHX9Fqw;B9y{bfE!$meVxzfIM#a^o;!fG zCV%`$1n+ua8=L0nYhS;bSXfx-ytmwxQ=yP10fb}S|3@Q`q~|S?48U&RN*eqL`(1Io z*)Pm@d98tCYi#H0dKMJ)4+`-|v@Q3|*jF2F$g|r%Y6;y)?JK}zBV8JC+2uHsb!JcV zc+yOnUXb?Wd-*Y2>QST_kMf7u2JC(nTh?YOts$g{oGH0Zs9SU?vkE*1Oclx@SX;p{ z=cav^QuX!H()B-z(s+tc*WB{2K2UpZJM}uhd(AzC^Nhrm)STbW&9iiatxlA8!S|;d z$%Soi(mCd>qNx11_ydEKQg*_nXQCMy@x^)_#^w$NH(6<3;EHFfayYPZ8WaXl5r2!~ zVCcRYA!UVTVmz$2U5jf&^_q%AHkve;!>ruXor!k$<=4fh@)VkOsfF#Vr#m#F^vR;V z0!ut*5e-`y(4?#yBhn(m@#x>#Fm3fr!UHJExJts3BPVcxI+^e>oUQ=_KQ*NvAUS?m+%MgoM^kOVlCBp#mgL>PWZ4lb&*8Sa0F@{ z)y}>(S8YAS4-cIJN-7Kx(z7*FAHJ`? zUrKD2P+auB-4|KPnvfI)@11t-JI#0@O_Z};sYL>V&P1AI#K$XDcwbQCLYo4LKS2L~ zP0G4UCF$VcS86K!VI$~+`?6dClv_@_i%;_+TH^VgUuKO#!=aG!>}Irzw)O?+I?5xAGT(@-(7Agu#3J9olE8Qtbw{$4o-Hj5`N-Et*DqRAC(hUOA(%s!>d^*=z zYwkVwIooUhvG(3;&TG!^ec$I9;~u~J9yEpp75v4s%#rhc!!4c8W$EdG5(Wyr147Mx zs-yDB#t*4(;}~T=Bc-BGk|J||8jjMapA5I|B9|laz~`uE&1T$89y`MsT%QiKt-LZL z>9x<1N>=g7j{M332Sr^=yT@u?VTPq*ZhpewOj<2DSVBgZr{4%Zc#mCrNYRSaU1shB zUB91i8B<%rwJvoB!l(Tqq_$G#bn!ik%(=F!dO3Sd`y$zWum<%OoT<5@ ze3@48m2OkGhY|A?WM_*pu^RWy?k@G`m42bjMk+~4(k?dWtk_e^QCtFBV4l#@A2r~A zVh-4Kb#+~8o*o};5EB!3tIaW)M9wzS8AEdf`#Vj+R*p0mz02$VZowXYWS9oeTrm1_ z&^Thqb^ge{I6a$s(hAT1RskQnIb&N$VvGh?Qrp+2=L6rZTf4&Xt{m5}lL*I4Yx8Lv z;{|N=KeeW6P^k>eycHz9jUMDqh%cc%mu*006RL*(#IyaW9|JcGE8332Cyr% zHW^1>@y(Cl+aa*3!NM`8D6cP>+r6`BZH=CFZsod;ERV{gB^K$N$F=6|5W!tnJSsI{ z*fo)avwERFRbLp_C2d{tcyx`iT-otr#c^5s*HX1W_oPU_!hOo%g~Wpjy(ffp*~WP1 zQ-$N18|U}D&PU|gY=4xz)yOVOaK?!9xyS7G2vLqISJ|QhVvgX18%1h=ZN^W|Yl$0co9thog50zQM zqoKEk^=AW(Mn&Q3vHde*XL!#Mb8@WxeBiM@C{1g$0u68v8}w0J|fM+nt+YSnf@w8cbKL zbzrjEE=3&j@^F-@P?NC;-HSP;R>bI|3*AN!bH%#jyfvksTS_s|c|U`TJ1NDgl=e!3 zx#N1}>2zEF+x9S3O=k?7V~gYivbyn$<6dRwwzb`vy8SV=rL}7DP_>$a!KBeoq2qQ2 zyG{MNtcgcvA>(dM)0RmdJNvem&pgVE+K3HSS>K|e(-N*7?qpcbq?)ctk`b!Ge>Nq< z`>4`&{GPYlky2;)#W!i@3@8gJJ8t_+h9pU=>X6~ltI3-o8IR84QY#JY1ICS_?DSqA zP7QY~e!|D$6vEm)&v860!|Me!K_}zkJer(@XXrR1^--k4NUpkB6*ptU87BHUA;+g` zD;t{DUxSrpN=k49eiQ6oj{UsTz02>GBjjCF%tyQXW$^1y?}EVmCTH&3fjWdpvbO;0 zxC||vzO_2IjR)19!iBaF{n)4{d3JVt$FlSkCD~VS3aG;R{CB$`o@0e##3m*ZfxeE7 zjotaFqM`zlXO!~QdK0HukTjo#3_30Lq<{clM%Ctxb_fO|rCg177f5zH22y9Ir_(bt z!3ZW;#UvuK%2L{9x_pY*Q z$@i>cWUEwnf(LUIaWNY%*22Ycyoh++?wMb%(U@h;9Gkgt5No{DlM{|q5)*?vE)co) z00qg5L5Lw_u`DVfp>sl#$^emTl%`t?6SCd#fPPR7U4|WITkg6Xk>UhFa#~UPBEj(! zDyk(&KZNhl9D3t80pSd&{>m+|56c1DN0L=jPW0PNtWh5LAvbxvb3+<5>H~-BiwRHH zop&d3Xp<3jWkl|q3;U)KtKBlzUt}d&Y|fTm(uCdCw*SK3<}|RSjZ3`DVJg!-+$dkO zu)3yGUA*+syu?4Fn)71UeCAz2pHqQEdm#~BQ-$q-O)wXaqkTr&PM@-K&cx%BYfWg| z%0ieZ_Ds)=wW4c1YMDC{O6by^b&iiK!-L8cZ5$r0==G@TirErwvhe|5QtKV` z@olADm5PL9T`Dnqi6&##m|HAT)tUoO<;Onvm*`fu-ZImO3$`(3?8`q|G*<*+?EK5- zudl-X9YcpdIke;HD=J(z^7EV5xe}b5b~Ed`^Vx8TYHKzaz8t6>ax$}$Qa|A)r(&Ta zp(6>>WWeg=qb-=hVlZ!gJ1Q*2XZ!qDzkm$c8m5$OmOy*x{fd3@_|Uss$q$C{rp}>j zB3)O_7t(%_>F1D4k>h(j`??Oftch;R&Ugf zi>>5sdrKTD*<_STfGZ4K0WSEOeh83O6qR#2v?CD$eD9fm8zf(`04ujAG5*!N8baT2d{w@fBw|LgQz%(BoIe z;57v}KBmi^A1Wg<7OT)WnXt@TVjh=}(Bd2ujb?fCeZdf+Y^ zcUnvu*niIfD_WatyNQ1R#sL}U;zrO$JyQx5KU_k z8<9qwT?qbPvq#zBwk&|)KRU?#L;9s~{?aR_AL+sj!YI{Qfs&<<; zb4^aR?)b~_Me`@mFYBVvBdKwdi6QmVQ`hzty$$A}?Uo&LA%3AwCv%)(=r_Rpni@7<5XfymntKobycJ~&Dj%7c+L*_m&d zISFXvf*7%FU83w6QC2!ky>@9Ik9c$j;~@G^%+;QTi8Vey4QZ)fMu$~Z;?oxDp( zC>2-F3NKRfi-!*%?z*B}>Pa?(T(k7-Y^tO2WJ&=13k^E)C%SOqU84+|R_Mz_rC(OL znJ)Id`&MI4lA)8PbK6()0~^_^ic5qZ_sH@a60dT0RbEac@KWuL_5GoL!IVr!xU04^ z)6$7g+&loIFf*fR{(i^z(*xFlLoz!D=&Bxeo7*HatVyNzRqUf{+mk023YCd2UoMt& zFDq+nI&ZHJwr`?X`aF~qgYuhdx(Ij8eTzO52$a})X>HC^+pchK+^c67NNb)W12C^q zGL=cJ#cfeSm;D(0S$X5r8cfeIb`Bo*?mC!BE*h_q3NbDO;4UcihxnBFF$Yu@9f|Y7gI^FSKCSe$%3(64TN@p56td!cInc% z%VvD^YlE`WG^gCXo}*))4n;+3=8xJN00*`?@Jt;!h>@Z4tE;J5jea!`W=uwDUswwd zyqZiPZh;3Um|RW`c!9LTEbgBofXy%n1nWgDgRv{3)YTHeentLKv$`xGpcUxUpD>+5 zLb|HHYOmQYC@cHw&U2HSc#G2ok9@56@-!<}i*f?e^x_S4U60=du`5{4+%1rLR#}R_ zAfV6Q8$s~dd2>6B+>?;FaQ%l{7!4|Sff=`(<4I-KXg5#w=HtWV{R7Z}~DecolLN?PcaXE;?^@7Ho09Q>j;+;hrYkckD zCf%#x2U&pLl_-~oce6K}6@>zN*8&SxY*1U-JNri$qzM+Z3Dc=&%NlM-85evc<7>3Q zOPDQY>AbLTFzNGOT@CKRm23A1ct0k{xYePtGp``XwZsNhqPKDD$8JKK{drokeHZbS z#i+V0jftoz%A0D)=E1I-Tw?WTT92Xp*3pX>M#RTtlL~wky60F-GaH^Ygb-Q`TSF`Si1VQ87IX z{WxKZo}>72EZIZT<>j|BA>&QxdfM>34B&4p&W%Xblf4Q0N`};n7s)UZZh1#iZNFlm zr}qQa=}Kke(5dx={V>wiompN+G*}%SlC0?P@cHYBuD%H-cQsMHIV=6>k$dh_{Rf0U zE8fh>r%#JWMVG^C&>K0&uorfjZb98;@M@+3D%D6hS_G8lhj#|vVm~txJ__~%lDaUm0|)+?299xuhuY5CvjWn~%o zoWPU9-gv_0vUlg5raz!osu&{$U$M3+^oIl($#>In1l7N_3~Q!c9FtgYY%lK3hu=-m zZ#D4!!7KzQG`tPcymRldDRj`0W_Os`bG}6qs^M^;WW{L6!ys$Hth$5z(w}GD-qLc9 zQSVKlVjQb^YFe7=v%BCHvAuj75&ZfPiLMR|qWAFeZE_#fogc42DWXC=D`1EN=9^;x zSD|wyynDAEo-+`_SzrT*eu2cv${KBs!v6%A-i1p&=6)9(-}lyD)DyH)X~zrWZfX@D zSpQz2RJ10G&pk<>ea9=aITToPw;H%^V6E{6lq!7Mz(qN3{;E$-eo%Jx&um!@kXTq} z2Yw7-JsD@eU!qawI0Hl#*e% zmTEeuabFm{yusCRLF}r(?%-=4*xzlj@Wv`fZtBy72 z`PyeAkmt$qUOX>isxvq=EFjIw@(yXQdhN)->&B&XM#Y&AI{eMn(*7$j^Oq8-l)}{b zvV_}Ic7xyIgLT6X6vOaP^Ecy+j5ZF+tt#ybqliAz-#41%mboEm?4UFwEetUP)rCv~ z;(M1OZq!x)(v?*b4CwM!%W?1<`Lpc93>?h_(ob(}Ze7sQ;Sx#+!2J8kb!L8RMA`f6 z(v|zLx)q9DAhL2`$X9*`WGY_1>0%XZM?a& z&ab>7&^?V#3`$A^ zAuJopgBEDU^|HE5?{GoGI;kP2kooCHlj#TA9ITJaKC$Ihdw$+R8RsC?J;+1;W zdSn{4weBw{yG&{n9}Jpsm_(ItG<`eR*K&5=99g+Mq~%_=uj%YOcF_5nEw$PE-S&?( zua+zUx%vj5@^=9sQzzxWkZY(8OJkr&?-|mFnkU9N0Zb!yejDAh3-J%8mp++aVxLTLqs9cXuf zvF%kO(Nj&45-M`Q^;errgjv+?a^4jrrSz3Z83~EKW!7G;jkM=x6FeFA4#QB{|T0 zW~wGKSWCm;U%)O-5mWUct)5~g&r^QviXSF7uCtcw7QJ65x~wAPRaxK7c9bDs*T$}H z<+SN?1ZWsWRgt7AYr#()Y;K`y{wO-xa0NPMmj(DWgm&ZlE2zhwf1u>6@>9FYWUh_Z zY>!x3et!x2{1CYgTCyVVG4P`copA??y(EL0AHl!H0C%U9R7huDs^Fvo2`py{WI&7- zpMTQgv1oMY!Tnuiw$ij!4o@;Yz({O2PZDE{@a46|%Sg#*|AP#rpYWKW{&806`1n8F*Ee3ko7 zn9Fz%f2_q!}qxLxV%?o}*4NT5~R)ths$)o+z0HPoBgDAS@$PBje9Sx1y5g%=u6bf zWGSZeV%UE4yDUz)w9yidDk_BOzw|1IYT6D;07{s~=mY9PpvVh!3m0T!V$&!&IXi1c zR8iXli0XN97K0x{tGW$!4Z*#8pYeE)LA7n~=Tr3nCm|8va2V~6$G*%G7PRG`kxAdP)b3}%UOY?e2D1@{p)aDI<@v+75LL@df}3%@nem+K{K zx6YCG+JV@U`e{=j(CarD9Tk-6o7}JXX~8mWcshAeLz+j4%{H9qLU{Zl56Co0Wnvj| z;d=$Ufl}goRhy?-M<*IwaW$KMuccbFuKm7X~181n84G^+_VVubP53Q6UV3hUp5h3DibZe*2U4CBp7GkFR~nc{L(s~?XVnz6{*dEedgxBQa$dG5X@a{A17 zT$^WaHQ09Z$u5vGjUV=uVJ)g~5d5t0uq+?7S!;#HalD&%uM&H6GlY_nh#>?i5D9sa zQHT}?mU(;u^>=lAF}1j;C@_?M^rF@oP%hu3qLPxlbL)==goFv;`6@!o23cX@*qn}> zys4$-O|Mj5+(Es;`LI&D3 zoB2q3R@O7zpI;Um+A||yek%_#36%w4rHZa}`~icHs#fXxy+Q*2Lt4ryR@6hAaCYXLsr@&KQPnKcJ@0 z$!AWa0bKb0AjKYth{d6){k^^Q6oQZb(=QEQ#XmiO+YruX(D7a%W>5ptAPLqncVKwl zOdbVK0fP1ibe9&_8rR5u68v?qaGyOz82qwIv$5$~l#TPz8rm zW(ayXL0v(g;F&*}m*dy_{P^J#4{r{tmjHxax3;uw?(IQHMSfvnA#@;rR8uhPQ3Kfx zeh~OwRu&g!bpa58WG?ZD@mlvdgO^M()*8`*9zuS%TCu${HJ`xwHkh9(4``)E_An^Q zMYXAE6p$YAUoVf|#=orWPGe}L>oXNc_qJ_Q;xv!9z$Z?E<}!d>%BYvt1NZTc+y+D$`-2b44B&nfPQQOHJOy{VGtoQZFk)jv!V6P3Gc z&~dsiF7+4MMHAgRimWY#yGE~K@q&({WM|rzyFHn*P`&wjR!JA35xuyWNLb<^Jru60 zPhOg($a)>>ZMBXf1Lb)TS0@8TftT}7wKFbWN3KN1EQCI=REsU3hFY-%#~c+oUpk^~ zOl-U(V5GWxw@lU1#=H6Xvn2nLmj`FQg<^-=jI!X8iZKVTDfEJ_um=OOhv47Z2|#Y} z{BS#M{yIN9nPZF-4YLLU5_6UbB733jVKqbpM$fWn?*zchilRa4 ztb_&L2vh(M7B;sayw3bfzzmykSyy){-{$K8D0?gG>d80VpFx;!o1?NGc8XMs`A?pY zoLRn@Ni~?S__@NV&fFq!FK*1ROG|3!lK(lK$&xD9iW&#;7r#lo_C(wb9UK=erubjk zT8BnGtl{sg!Jyc(op$o6R$PjP;`Kej8{(W_q}faJTh?<$yubvESv*0j9*_7k#HFR` zj+u95x=rh7xqm_{Rr7Km)J?m|4*OT0v>Y2PMZ-bd7R;JrA4$`msu#(n8b=s?8+{T6^1&7*mh{T9ZhUvEI z;S4y^kYKM>)Y;3>(Ydg1lOE<`mnt$t0n;wd__mOqX&5?bQ}B@B{AdNvm|HTVtquzj z$)aVK4&$M-19o>AZB$$v`#CmBfp*!-HFe}j7Ma(nP)dzCoI1Er?+{=`MJHqxq3gSw`8AT&k25dMH*FIb6uDqQ~zPBP(SKrW8Try;YIT`a%Z%|9k2WuU%F=- z#Fa$z|EUvi5i`)}Vw`2R@%b_krh!h0P;z~<)sG}m=!{s+EPZiO%2%#kz3?g6(}PaNP1~o_rsjuEa5c0|c3%5qL!1S>d76u-1BEta8m`;3 zu(XYd|E_)wByd_jj2{!n&`W_XBX1S%h@tg59=CxfoX-h> zKawESq*-|7@7AR%>>~Uf=ciM8Zfyu^zHguwYOivYT@RUHEz7(DGfAiPsAPLe2J{@+ zahyz!4o9D$d})dY&u z(&R@$>$8F5Oqcvv7FfMvKi7s`c31rJKV6HeTU%Q^F1yJ=CU6JC-jMHqes>NI$ocZj zya6fFkcz4L`*(i=K7%Mv&B>nc0?!2ozW%J;e@kb$akUVeKLsq9uAL*g?7hXH&E2Ge z0~lOV2ka+4`9SO|I_&$aGc*9yiBLeQM3>b#*t#NQXTd<=OK!y2WSCdjW8x@df zFGtcMd=~QSEH8uHN2XO=6>11rtWCooDrtvnl9_dK)UMn?^i78ezh=x)(FxthERic^P# zgal?#Bm88K-cgc~LGu(T#qbHq3DPD0?e&N?L_*?v0TR?3(0s#Zb$zzqN-Pe*8R(p^mX{0f7-5Zh(YGUl?r$(r*lv|}B`!DjgUK`Kvl>(L-O*O!xr_RI zh9J?j%k$!WP<7N6u1NHd{A3s#GLZ@27MpGQr)#X0-TfN+FG%ooRN;E7onNMw?+sks z)n2xLJ(>t#L(Ad8!Kv>=%<1`vt!dHO5j?m3_eVYX)l{v=OMwQT*&lWmJ4oVCRkWw) z<pbv1|q*9eQ5375Ama9G==VwnU=OzxZd~g>TL1 z-!K5juDOI5^|9%8PYJ(TL$f|7%j2>v8u?snBCtmqR*e|$m$f6*t;)T5FuMC#-}w0QVB;qt)fZc5ZS7;XVAyN00&-h$sTNM3@!9B$0rLZqpJ z{S&T>{f)`)SYEg;Mw*+mfNW+K0Fh7?a=j3LS{@3=TW>pfwQ4u-MQ%Rk->n(9FqaTWyK7OI z8BQb$ExbrBp@fJkH1x)r4xpjX&9rfz+p8b zVt20b{-jv{f%^}5zIFpSY#myl@B=^%E(80dB`Geel!bu=+@whl?7MgF634xdO?=nL zS{TXUc4iOB0^k!fnNV^~ps3rvldVAMHBx*Y+ zQXuHwfBnP=7k?rQHaL&hJjXX*e71d2kdU?+9xs5#Frapj8ubV%m@V zAWvP>yyB(vmxUn5y*Klmuu9E>^Id_{XUCAF;TmiB-FGZ>q#R4py5lhW8grYSh`2Ar z!Z7aqT6&;6l;CVQwX}q2VT*JV^6m_7!BtTsHg^M+kV2bZRMqMkwBo~b_=Gyp^BTR{n=(5jGYb?*bx|mVhdAtEcz9^ErH& zoWZKZf1U!CoLiAo_Z;qJ(4-6Pl-OtCTBpseN zc`w#ogHi`m8erugg5m!2CN>h(KqTM$Z!K%l6@QXm`PO zcmwjXXl1lMNXuB+K9~dk0Pr!mW`Mw=$<8U8-oq; zBi=6)&=QCg2zbO;O0Twpbaz?^-rtRNIo{?#&7yb24@9y_rKNkEc zK^dO4n}av!AizRj$jPa~?EP(N5X(Fu6Bn{T0XmY5WezayAn>ZSUr|EDRBLs?khZ_C zPle4Z^>4Dz|NML|AI}99{DDs|k3PYbYqNLTCJobAMx_ zKD2x+CO>{WsrnC%*m`%?O&ck!21^#G zrI1SfJYOxU_7jkn@ONZkX09lR@96Br#MmrH>=A-LjdvO|*pr-o*zOaF9rp-^^LF5o zMM4%D>Rt{+89ml5KPyB570%4Vt3hAifb6M$<1=~vpmurw_4cQYb$s(D1_dWkytey& z92v&+9QnLlErsCqEr=?Hd)y$!cGFV=?bC$o%H*>Rn~;O}c6f?PGu%Hq@7w3a+tXsp zzfyb6#xP=?ke~eCSA^o|*mte&*ktXTi%FCIwyJf>N=d@5$|9%GiB!KJKbKEg;C^sz zDJgb>X;!Q1*kR8|ba;kbZ#Wr=jQVv>$$k8)>5uvSjh<*@!;W)v&>5HT4M$UT4eFvB zg&ebn)1?@KiQX9D_C{|bfeH+XkB`sd3L0RC4v>*Exb?2QoNXu$j+4CM=!!hky?Qe9Adr1C_dSc73Nt~^XSqUu{2Own$o7Y;Q@bdUH- zQ-bNpAZ`4(YrNX+pcBg9M>BKc7&mnzPCAC6Jt zN8>&TMH;W|0h+3{UD26yRmIU5niDoYK@2TU7H+fvgNBiv{HI~p^qCdg8QW^3 zST6g7vUa{(mgZ6FpbH@b%8(Q1joiPv*M{qo|5>eqzDvx)_byt10^`|ku zHY7YMFY8%R;~ippadfg!sa?7Gn4Nb*X7r-5kadpAr-{x36cY{9yoCekruojMlX{Y_-`6UF4hR`ei%0v4f zPY-!fN~}aaPY($C1zi*nU$W9NWyT2T6uI2EQpR2e$?QVl2Rt`){ zhG$2&3KB~ZhlO~*V2|x!BFGv%)?EDelzk-g!%+hyziiR&_LM3UpijoFpKid&dPHU< z#dJ7pf3uye4KDu`nw{L)>l%9#n7SMWX`Tk5P-Tb6* zCZrnUesYTHu^LMJ9E85|at zWvPOx4JD0nhFwEuM#hv776_6s#PWpFFUV2Dl&x2x^M}Bw;9Ht+6f~C!lvxzSq+Otg zMEO)B?xMY2*M^K00m`kr=M?<=oR!VWwim90rndNNsQk#SCt4clZ?QMgwHvJNF$p_$ zSsPdVL?{a98gN@X+5#moP(;4-IgxDF?&{2~#{oFA%;GB3Or-@lM}MJB0o%=Tn&`u_Q*ZA=J!1MVq?UQb~fB-MT0V}cwQ5qUtVTY zh5eLwz5I0k=BK#+Y>mRfpBxlGYbcgI4i15x(=MN*|fwUNI-KJnf(p-cO8Y(IQ zEC9;4gEUCs$>kaxuOWV0q~u5^d@L5n(Ye7H9%yjon$jY{bWIjgqJxQR-lpg z4ne0=&5Qs?CqWE(+87+ zZAn9)>du!}R@%wwApSD=2g zp+5Ym|L|=n#+k3P(Pe_xhyqJG&CCq`Z!i@9E*I<3#Y3iC@jZHlfiMjJzWvpd@ZW$Bt#*ssYHGs3q>=IQ8k2#XF+Ct04Dyiz|4pz!uJ`}=MN*nWJ`%mw7uYx(4WJ+Z z!XRZN6;we!lK!~7-S-03;(5T9R~M%5Vq)&}%kcGHO;V_KFgG<_xlO>z&dCX(iD`0a zA`rjkTYIpxqgza+$j{FYch9g%IwCn5{&>mHoxc9nOCZBmWc{2iBG@mEW`Kf*kj4-S zA^3hW+2dh?;?sFcHV_gl)|}Ue7efqzpzVQ9gW0jK?9O8QlZoPjC?+XHXSjBy8@!J< zrMX?U&}MjI@L*`-v5_h>d1K6F_Z<2JrHlAgHcwBGigtbAsy2DgCD!B*mIy=D#H~8M z{8yKH!hM;6BB(h~+V?jrBb23w1dwaoZilkK3AxUcf?3)5LVkM~3D~_XNX4l%ULMRp zIX$u+ME+lw?<6!d?cctofkFq7ktywF(qK(C#1u>5^Gw7C#D&9Vwk0`v`uN@)j3jJK zDWqbVTUjo(fCt7{LA5+Eu(HxwfW*tK5W=e9&?tKq_OIWukDQKV2c)~qTz81I{UJpN zQc{(7p?lDi_5Lfk8#PKzd@Dj!F;P*37*VtKQ%5a(S#@!>>Yd*UVO$H+EofK+b@CJ5OJ|i2W>|a%#dfrF)GHt(o{Ir{Bx6-Y--#if5c!#+@QBxCg+F9A#hXe)bx{TXf1?SXzoOZ;t=3UsEzzh2e)ztW~HZT=jK+03yd&6Mleu z9D=|a?Cm!ucpg7~Yfl*}N@_AvLRB7!&th_)*X_OiETn#;4sUkAQ?0R{xwayE2bx}s zsSB0Va$16DbWwS-@zXXxVFk4;w`Jw+|k~V4AZ`=mMckAs`2h6UH7n_j=FX z&{{OQyNj@qmWYxbB5Nf?1CN|yybi7ytx8lF`f zV>Qqr^%sWU_SZ(loZxb%a*nRw!qS04@iJ80GeF@(a>3Z>Cq~#N`w;>wz{2+JOr_Lh z0B|%p32?GkM#sY<+D{sl4LB&W-2dMu@>D`p)Cn9Mpvf=M@PR`U>&~6G3Hex_g$P^4 zYj{rm_EF%ci~yT591mx3Bz*SX*7C8*^;Z5}3Xb#>)^v|A74rQOGt*gyoS8Cd+~bbnT+=lTXq3u)`4hJi z?el@6zt7SU4}%ug7xmtyCzg}W*a9fr>hxdz(IKD>nx~{|!a&F=afTimZtoWLmBYbq zuU2_Nu6`%d9a=^*HjA-CSmIOR_#!ArB8L9vg%v*{?E62masOn)|Gfw2#=Pk}KR<6` zVsd+V$W(M7`7qa`24Ijk&+oxp~j<1hKefvzK z$mv(AkX`T`XZ%fus(TIzWh>7=_UQ|@(SV+D@15xE^72T5CfB;q4Zd8+JcJZnh}@v} zm1}Hi5p`iFefZFu1v_qbR?k8c@C!UVn{oVz@bC)N*%Tj+N`Qv{V{^klX@broL_CS7}g8#F^MExefl%R4?xar`>X#Y6tx+^{ z{M8qwluyXo8pznX`EW6=7Q^_}(3mh=%WpJ-qAYS4y^t4t^;tMl%JWoi}K}F4|(0l~h z0}`}27Z6--*Yq6hvtU!q+e?FyEG7oVNV%m9CbPvDJ0oLwsRs+BVbCi}L9!hBpqdwp z>7bQDI3)8F4>ClBhxftmatmYNtl%!5!N2=gImQU7QqJw~P7o(7l;|(De!l(qBNwPk z*DkGv2uKfUv+}wru3;v>oR2%z?l7@f_ri0hcNG8LDCp_fSoPhi*I4Q8?jslhFhZY5 zZg7m!YrC9AhrTS+@ahhDBenjdU%g%M?MhF07A*3BQPI_#PjEaS)7|dF!S-A`mptg$ zBM|Tp)ZyX@fT+#izkj9@hkubIPWxpmOEOFtau3Sg@)1l~CBYX1K?FqVrsJC|CXuAY zkFvlI_4&W%4*%9fNUNOw6usAwe7~-R8xmW_?0KpkZODdMRaN0Q;%&S!8}ZEB9;1hb zH5?ntS;Qi7yewF@ys*&x8#;(Z`!(qqbK3l>pr8PDI-8!Ebai!=NTSvF>A{8y2;hrT z6xN5p*1SClpw0r-6#-d;f1K|u@W2oUFVdXQXUdmr=cAfgYbMY-=u%M{ooa$T&En@c zL^HU?y9XjWrielSBCMwvcRHM~lt9D#Sz)Al9ZW1>Ua}=LsBGhR`PHijo(*PqkmL+1 zH8}0g?Cl<*@lh7#Hxn7X=js)B9yyg%X_HcEGy%~oMfw7&@UOi|O+q5{;LeYH^%z&; z4@_V_9n3d^H#H(;wq8y_!S(!)DfOT!pCTKn+PDB12OBU)z{0DH41s_i`>U#~aee>XmHyH7fAekI zx60e6;SojBR((W+j=!q{`nHK`$FNe5-C-oVr%!!CL(!yq%FIVWCKx;(fR)kG?XzYR zUp|!L{DPs4nfww#*@q9>hYO<+A_1VIP5Tn;h_TuBB+d`|R|(4pHjV{XjVG}sLeN|{ z7k%w@hBPxcQ{lBjq2sbSJYMmMWM<`yRGo;?f(A&I$$IR}a$V-t@g=d1{=}=#Zb)oLhu_gkV3CIXLKDG%aWsqL?{6|gIZ&pc7vN-e)yDMw?iIC|V=obrLc6-B0mrIap@tPNaL07n75dfdRkR z4kBf2K@3NLHE(ifFht@cBNN`|tq2N2HNDF5&llMrq3$=c-c%-)4 z!^32!#E50%c#mIrfjoK8^kiWO77xSq^Ar8%ZGK2gZ-dA+s2a?Asi~pLv9+-=fq0IC zG|-$NJzYph$RZm2MW2=4UjF;A9cGCXh!ga;qVm@XTA_)S6L%^zdj9OCC6sg@YsEmwhcP`f=TLUpuA?yxu=mfriRw*a#ae9G_T zQGjk9?f;TWPuR)8(dA+8xXO7oY&;jzX-t;+wdu}zL6MRbnUC?jBOAz0c=;^)4dFu4 zk_sn+&rz>7Qos3yzGYADh;g^%s>t{1csH}N?p6p{f|nc`T4Q5?fx@CSz=^s6ERa}t z(*XFJAbPTf{`jaS=wT~^;;bYeWTA~WHHm=a z&SC4vLdA^4V>2sSCYudGXha+~KKlW*owSBXBi-Gf;CvjTZNtkw`+MH&|JCt-3x0o) z&crDP)iFdN7W4i+B>}0Rva%y+*^sB9p=@JQ1f%v+^m~uJOs5Wyj)3^dgEMJN1L9=g z1P1E32Y%LT#jt4g@&A3Yn4#aoXQtdBzAo;J#0fV9EspI>%I~WR2@8U=j{VVxHxwFU zh_8mKIi?O9v9TynxUXDl-Wn*iQDU)%`@Pd(JX<1cGV_bf+2%u<1iIB7#=ib@_d7rA zM+)HHr^xt{MeL2TE1|0-;_}q4!7>Ov`$JK^^-|nq%>BSOVl5q_-3R63E;dEQjEhH7 zQrIUoArQAr#B&e)SoiieaSbVbvM@$ zhtR3Sq>Rz)laPNOmz)M9_1o#qb6&5@v!hMmlHPIwwd0*uRj7QSN_=9X*0j)M^bKf1 zc;Ki;Og>B4#Gz@v1#&1_!}VXlXf_EO6Om>1QE{6ihA)O$Ml;3WDqi3vu~k11U>O z%d!VoRcqZi)T{36N=!lyE#fQ#Vx8e|ryJ(a6~m<^CEM;n70f8fOIspOpMHU=^-odq zRr&hOTh~!rltD&a6-aBREmC-{p z>#I%#SevVjE0Z|uxlDGsz&tc>#WnQ2@bvT?yxmB}O=`4LOA|Y87{U}D_$9wUbe$!0nVFejA()!*=`;nqbLFKT!20#vsi~pCYulUh z&!d+76ktn3 zCp3mVL}qsbi#^U<$}V9?A>2KKm*RQdW2KITHz^eHM)TUe^5bUS$Xgs0By`Yz<&HNLYR zYa?$qt=O`~vnIp${O&`)MxJX`R~5L79yp}e^Wy#idU3Cl&3{x^`zTyFD|?eE%zI{a z_v`C=oVv8*7UeQMnk_9aLp?g|n_@3tCBJd$o-nZMKA+V-^B$gGMsDAS7L-MfN%wD1 zN{O`zBJBwb=6ujs;M{Sj!jD^N3%h{UYlG{>j`8CQ-@gPs^VM`5s&b#>IB{YhnUx#h zSPL<)#dokic`Q9W3@JtLrWRg2KlkNd$0v?z)bg)$tg1RpB6boHW9%%Vec-J!%R9XB zKM!BOd8j|dlg(GkIqjgI{4((QGvC=~q{&7#H^eyGBI4J^!q48>*X;;Yf#dg+@f|eF$n<)n zq^9KNGy5uMASd`wq;|gh;BCAWH{MMEiuC<@^!a?mj+n9gNtR|kUjo4Hw>^(Fzy7&wOgZ49v*e2U^n|(d ztJsz-8NGy_%}p)|W!DpERUEEm`1ximobXzOD%MT#DQDdHj^fJ_?mbE7@=;S|1508| z4D5cC>qVl*Zq_@TAhCs=;cQY+GxYiN6T`?32n4c@+=`M>HXL{25@z<}HnmYnCl~MI z`L&Io`38)IJL%~92yCKKPZcbb&+5V`HXNcRMpoJ1!Lx#fm}oaT8}4nIulPCcqr5{o|M7?_#hnedhxadb$~C@w0?8ztWj<74Yo^*eOnmY# zGwx@)7pwg7ZQbD1?)~~Vf9x$UG5hf-XovMZ;SmMNg0^E0DGw|4OxkvL`aCBC1`?CK zTU`xOBTo`>Cbokf+fHv~X8GbJLVN92PS_637o8A-+h7mt zhWS@Vvki+UafJYCjDXkXf8<9Mmm@uzR!D$$W3 z_16{!75$TCQ{3h)TXqH2+LR5R%;^BwIYF|<@{Iw8&&Mykx}v34HaH$U&wwV8t%CN!K&FNeyn|m`Y~B??5XIf={q5DvF%6?FhWlYV0)nw$%J8TM;~5>D zxfgz0b3ZfUVtyzDXv`8HDBtBW&VRjuvMM|BdrT_s#a5w6?PfX6W_4&!3WAw-Zo=8^ ziu>Ot?%&!b8;J_mpxq6TKKp&k6ID|D# zIbcB=m&|dy%uRk2EjsaMJ(}j`R{ZKbQs*nVBP&*M!wMH0`=zstfhU3DKz>&``6=Ev zo_PXy*{NqOgSyBW<+1ox;xH$k|)7I7| zGN}+W(h+kVw{Br!Az&T*@cS__7M9W9<&`6*NwY*F^98L~otMm*2WAymVo~FtWQ4#= z27Rsj|7(Y};Z5|NJKK#nD!|?P@#9DROLSPuU;{)_C_OY(Bh)_wQiB}mYbX}39zbbOTpjTA8>ezi&XhPL~QwnPNKre6%Gh3moS<6HJl zGk4vlMZt%elWeV6kwC9J?e#O@_S@XqLwn=Duhy2|qhSbh-@j{V*>?6z`88I%YGF4~ zDNUDk&c>cq!(%IX^7QIm^d67lCfSc1cZaeQ#?LOoOu>>968rFHGOyvc3rKjdYj?SN z-FEbL!YEr8-@P@hY^aUSP0BV4aNVF5fH4OW4#4qgAq47AeB1j(ojK>DE)hF+Kiash zYccD{)$cWfzlQAxRgkg+Nd(+vef_Q2gc(@#6Hi<{!p6qN!NI}F`L?;axv#GZuUf9* z?+8>h90Ei{kVEh|=L+nI5$ELO6cC79 z;eEU#>t>CW12dCFFd&;9fL;|H6u z6>||*oU-QG$>TxqUD{oo?&YV}?BUT3cPWGh7#^aB2Dh(fio=G|^2BlEma})|z)!Gv zc|va!azN-6Dmz4&JsUZ+RIv$p-4x^c<;%w|%$o(w$lLvDpD`IEzqF3@=AWcWz2y)8 zlU6D6yXEeP5t8Hi^XDI#go#mSYo^y@8Hgs308>if*XguPu*gNI~@TS*R)!8dLj(6)2a`q>YN)x{it z5&o>}CZ90hhR}HgGL;Q2@ZYxgAMIg|bQ*?KmS*p{x8|Km~~ zhBpr2AQF!l85#9=^H`ur?W)8U`8v zUf6q|Qp+hRDM1lbveyZA#m#F1*piDshfN`zSo>PtUhABRV6ouzXU|w%{)ht1M`OEn z+^NoG{dup0mg1M99p?=wBHY zUFOqU!%Lb)m;omt()|8$_M;Xp&*W<7lrfX08cF>pTHS7DR#q^8i5{K!)KAgt+iyt1 zChlh{9jKb?leV4|9mS*En1;kk(~g)#q04<)IXMo>4|Vgp0j}!HD=Mq0g#-o;tXe(K z{GBkXJ{dw?u_0+9tM$N_B&E}*&0+P174Zik00)zEtzAD%Hn=vY%k$at zma$6HtYZ9Ecv9BJ%d+z;%yRukZU^$`r-Quo(wydo6B>8~>B@@RdgdRA7iZ~Cl|rl* zNj0H*$H*tn33(PYqp24;R+J7d zf4j?ti10{ceg?#)UmRCx&x&o;Q$*u9tiaeYn?IYD=4fk)&nUO4Z0YAi0Dyms&K@W2*gd3TO({iFhe*;A z=5Q=LecTZi6&JTWJ*@1W=Dq9=Wc05vR*&odJ&YCWI(2{w6tOG$+8uKAy&oIfPGoM2 zdoQ2p?r}6J$kSMN?btBXwQW(7Ct zXe2Pk*+moSEgg9W#ht5m8}H3|m#4J^{-v;{tAmZ~cP^%E=bHCgd=dD=fqx3d{Pbz( z&Ye=fgE8wld%4{*;))xHEJJd6(t!x|D_6cl_W?DtL8ZHs$i}T2PcQ1Is5C9t?3@Ib%1A zF#)Cb6{5ZB7v1d~yZSN^c zj`h=|9f0x>lO zXD;)n+%Mg8c+Zx9O5F8ub(NKuZ?|~7eVs4w)?(!Z_R(*=OiVYtry!*$ILz?Wu*Tc!gT>XP0`n zp44cy8~E9r`OW?gDbIS6-*usN-kKu#@n({`KOrXrZ!3xC106~Iyow3BFgiLq2%kQ) z^i;UPB|BLT(@C z{)yR-ZVH(UIYek^z@9%tLqDxvmg~$I?lOoMYq6PPYsq#Z9(?RMOg%!pchkCl z?T~UA|G>b)a;nSu#C&p%(`?TSz3=M8qiUwt#cf}&xTnEiGMj&mPIM~qi)rb}m9pNu z);5cfW#F8R1W2-PB2);^$Q*sUcv z<*o>(Vrlk^!$b#{ptbkQ^H0F&AW^)wzMcan=eas$;bfqG_Y&kcJvH?!k>917bXanJ zMXo5A2DnOwVPSHT#>2%9?tHQb*&w|H8sqJw%6|K_j%qEAt6wfz@ez1y()doJr|o`J zyIC6N>~hyEpI+F9!Xm%3opN#+nb>!?g~)unzHx`P4)cO)8-7#xqzZyVBo6vYU?=p~ zf_2y_l=ETz_h@z@GAog&7(v^5uHH9q&_dsGV#|U5H*AX(b_)mF-ry}oxQ-$Pa)lXs zHkoS<{#$0J`hj!?Ql8ith2dtFGJ@a!JDcOlUzoQj{NhbwuhXY z=AK{QxOM#>KsFIHjLq;sK+`ib+l4SagZ4^&D7pFzqto@qq?9&H_3%L!l?b7qV=yb9v#g!x}ZIAM&y#=rZf6m z#-3o{#NK&tPVBx3*ziiYp=z=v&&fXGVWb0;i;d~;ZDxz$CnCCSBJW*)_I>&5)0ex` zYjkN37KKIrc<>pE&SGtR5^@xOj#9gs^f>39(V zKE80L=s3-TzD)ogv3dLU?LC3A!Y=kF!DBH7W#U^iOwg|v5-9)%+>S5GQ1dsRhF*I; znUzGP*HY1X@)pyd#cjO6s3h<_qR*yG;O4avjo9$#Dw{7)7@-m{-Hbx^H@#B~$Z5-7 zjuu6Ee@a?+!kes-g~!_Rve(EA^&&U*USREDS{l<&aw+RDtmwpWUzSkawBu>D*HVzBA$ zGvF=;hJYADp)16Gqw|ThB(a6 zMd~6zVk75?WA-&)S`Rkg?o%*T3+cY%j@S{zz8-Z^zPKnU#Wuy@rVeI{N97LPEE=vaL{x_DsM3@;Ol7>h8wK>Yiq!aY|dQqP6SbegtG zEWmuwm}2{-;&VmYc5*V(@D3uJ4ys9WnG+5;*n%#TMgaH`ej|o#jGV9%jq%T54Xg8l!Mt~!-x96Q;Ba{qBb#vcvd470&Zg%4M zg!=y?t^5yUPZ*XehEvW(XD2@{#a^x=pgx4~ewjNsK}z3q@L&&Au+A)2)~#NdSw6S6 zZ`x$lp0PdFRJozAFTu%o*FC(u^A*TZa`o^i&@KIjr7E%UEl#dzck%R5*g88pMxwyh zZWKA7kLLHy!1uY%u!zSxp?oFSPm66u+Z{5|gbuc}d`M>Siqu^h2zwH4u46f-3xhtE z>^wx3wHD5M?N&%P#jwDU2PzgSfm$8NfWUp6ZWPIaK)vLEuJ=f4rU(5)emTPvPY5dhQSkt=MoLyog=`IZ({wq9VNPuY;`J zes?&U<;S|r|BH zouz!zbkNWtCxzotjWm{t6uiz(Ny*Dw>8j3@S~w+i(_a%zp?oI2l+!o(00eiAw!)-lOhyT8G^B-oA|0KJ~ z9UB`XI=-e8xI4kxKh`b9OT};1A~k(LO|P@RKk?~0wsb6}z{uM6?j)Cj}g{3dp6$1L(aK6cx{XOq}`joLonz zuHW5E_mN5CVtqEGhWC~391@=1I@vV*_QvMjC8P1&X+VlE4Mw(F3PTsU&%$oh3B@vkLtV(-mI z_pJPpnVkFt3}f5RSM4y@bg?|h!mh=br_|#J@gd)^t);UwGhk|bJcet2<0%|kNId-w zqsz(`VJBE8{y$e^SY%}695zz7?$-mP&QlVIRSXWvh4@ic>~7E{rAP3Q zR9GXh(@dI2K#R9 zGVzNVGK>LVb)$)@!ribxqH9j<;?c>8%n$i;g;iW~HryG!d7igTK!KjbIftl$>w%-^}s^UL?< zHv8X+g!UP7PyE)AB2MBRPy}y?$o=~gUhaTFQ5Rm$$eDHg$dNxLwr}1HQ=*xJw`{W>UjMFb92^)q z%0Q(~EbUQI+!~q}Og%9*rB*#`&nIZ};X9C|LNcSvNXx||)zzhr)#vEkNeQ}TdUiG~ z;8|Jv7+Val`7N6h8yEe(pIUhRSM+x#&^vx%Fl6(h5}<}a+Y(_<%N z(c=wF%UK5vVTZ>E9l@?g&hQusvx|{bKx@^OZ541D*A}e#Ekk-U_3SB-I&Pr%a?PL0 zTCfF@b*9>@jaNePtFIW`Sx9nAV&A{I5Y*nB3rDPvu_qh1a3t3OQc^C`3*V-`wpSiU zOjuuEA3j#v6ux@H2d5Ylj$b&16!0?7*^e&$0=C@|E4$dYGizOdaJ|%okukM`UU_JA zGjOO~Oz z#3Cu7t(gF>X3OUR0pq2)WN!Yxk=tg8J@yNilzc-@(&U zY=T@p4!P7q{8z24zMh3gYjV7Q(5fwa0f-iBUe-Olwp<|2HcHPC3(S=_g8m z>K*prH4`b4Nao-sto`Xd!Nzt|MZ@=X2z`5PT;q2tLR4ue;4PK=1t#lB5X z+y1iF{mv8kExcd20Ri2gw~%N3)pAGr!JoR*)8+Rr-OFrwb5S5qL-=y^GuD5a>#jq= zMTqN~MAg*PI+!*}N>;O|#IzW}M5W$Td_8Hsd1fWelChfDvfA5m2Be+HHmxuq1riHo z(La0>(llk#m|sc9|@qz&_wT=dN!agkaq%ei>bK(lzTb#Hl`%6SQ9taUND`One2C=|KWFrUf`Y==&ebbw zkc|=Q4h?NUb(62*lcAaRF)dUx8(1O)SQp>jT%tpCA4!s`ITzVod`gZpAlev z`DIJF8aug$(KHzM?EBtVXT@AvQ@joB74{^)K!llk2Jztc@muX&sWQ-)m<=+onj)2JKWkwMOY>`)D(-FDBEQuJr~f1)x2&8Twyw8eK3ux-+KAYD3zGcE z%2TQR|4phYQD+z3-{anLOqe2SU;8$>_U^!pruZEsorZV^U$?v zHX!E(^>k)-HjY)Uy}jya##rbmIgluprhnMg)V^_%J~)zT=vC`Xa>B`|d>r8r}6h-0$% zYQ;03NFpK?_qY|W0Xx^V1X(+7!ooBZ8WwZhX1MiH^CtuzqVbO_p?wy$)&9iDQU+27 zu@Ki*xpoiNgT5;s2AqauB&qutq`yD!?3~BtCO-sjw$HQwbaPXa1oGX{K_NU^TVZ+{ zX4b-;i+*v21_M^t01=^VS@MkrbjTf4t8Qzb>O(#+y7l{lw%q{Rk^IC+9sM@*Yb16G z&fFfA)LhncIK?~#Tk)zS(+`@S770#)SN@5u6r zjO4x9AJ5eP;lQcWHq-?jC&by-mJ?ri>5~jNsa?Lb`Nak`RbkA?4;I7vMQAVQW@k$R z9g>|F{c^r{4ph1;_SrC?1BB7uz@R%tE@;~L6GnPYWo=6fi#GOtP<9>BGI$9HPl!rX z5G-f03T6Bqi&R_%(4ZS#PCa!e%df~1#|>*ij4r5pEzX8oT6XvJ6kmLQt8s?iy@J>Z z19NgP&bBJqnS&wj?v?Gkz?N5=%P5*bT- zKFWhzJ=u<%WB|fcU>(C23|M&|9~U<*etvUaFy+#VwHxx)cDdN>KpxaHwkKXAe$p z>(AS?qEVE}=q)26BIX6<^{zveV`Xjqq)S2v2U}$S%u0ErzyAhYd=NXEYbl#%73l7b zg!n`=2wnNLYh;%e9nVvKQxsvIc$Zz1@k<*cuJzOt#Tl6pgP)QI(a^pdoSKp(AdrTV zQ}@9*wW;1+qu;kBIg7*(ac#h(M?BFsEbvTP?jAlF5*(WWkP_%r{sb#=!%v^E|NIp0 z<*G)#?Q3s!u+?$GiB;>R->~!H%my{-ZLD@eabsQH)0BSNSmI&J>Ym_phL@gc9qD@{ zRQ+u0L~M4tb07M4WPK8`S^6ImhQC5T{!FRBg`9louXAc@jNAd&H(DXvg`x&bg@)OfHY}>c< zfWfDv&iv<&hQ)R&)jTleU6tG=V%X(E58)OUz;HXwLd9G~j?M^-I}4P_O7l;#7(FWX z)rSxFo_fnh`=J4FsGQwyTVT^O{XRqGVE0);2fFi5TvwMDY&6-+xN&zXXlaG7aK0zj zdg|1SXizG<^r@RO@{|#AWc^w9MS{=xh=?<;4Fm+KHIW=4C4u!9U@6DeWYt(fuBn@E z9DmJy>xqv2gq1~^Q3R+e83toL_SIbKP>{H%aLU;DV@u01y`sMEZV`6&K%8uYDVUVI z9630kFvD&j=uxut3s^c8`jHwN+jw{5iU=(DSL~FeT|S^E2HLs=d5WG+V^|+79m#&gAec{AP`j=6Z ziQ%DN13=Rzntt4~R)8vp?mFUWu=-@3Uvm z{_xJ(_%CMdKPAP9L?8KQ4u~2NlkNXc4f;W0d#3oSwX&wB^w>ffF|Rj|%|=^nw>y}} zZ{@*02`v0<*fejc%r0np$QSC`iv$_C|IY2(Fw&oSEr0&W3Co0hK;ami@XH_+XaORe zV%r`TL!SM-W(p^L$iw_@qyC{!aG6{J<4|5!hK#diPzYP8IkV9Ab*jb|I)5`TG&G!i z4I=#1k^|J1;Xlq>)QkJ2fT_^K!qO$wX`;kENC|^&w@CagfU3&+LuBRfOzrAM$v$0 zPxAC3MChf8%-CIm4pLxB>GS~l1~NPUs-GhK+)!G4u+c0GEo?MH0#PsaZ0Z#k6ns7q z2wN=I9hG=S(n_OHKMHOU+#s{!@fH65{wypkxXiXvu3mn8s*G(|Ec5N#x6sDQdL(pz ziAZkD*h5Tc1KroOkq9DP)meB+#7y#%uA@ps!=z9k10Le`IAQd zEU6nXu)&zd8~M(5!wO&33oVhq*SYyy1KhpXWP{FSZ6xTLSN@8mwCj}-Kaw*v#uX({0AQxX)rh=zD&#bLBzc!!k3 z!FD`#Y=0Qqa((i{6B)rz{CRS0d-8)1jnO?wO|4N$&Cb3*f0+!m6dP-M4Q@Vt>U7Fq zGtDx})mTr+f&Z@O>@q9Wk&B0(tZG~63dRQ0z<$s>;Q0B~cKuE7dwb(z!(^Jf(MCRV zx_|H96}2w(sW^X^fG!E01Q(5S|4Kw+%Z?pu7y?Q*|3fO}{$tRus7O$VVDDzUCntbe zoA)3zX~=|j&$OAj)Th;NA{%ma9l2Tj&xo$>P6) zhp|Wu*z_QgyCx!I1v^V)LP=GuMhruu8*N}vM9ks>)4a#-m%}Hus7Tj9I%|k1E zQ}&3yXE?00=6Gjwr?k+P_VNP{2s2-AKD0w>H#zzB3UX3-T3Q;Yy(fX%+S4QYbpUM6 zAlHR}?N_t`bw55=Q$k4Lt`5AQ=+N+9sJt`D{~o)7*k6BdHY$ahR*3eS^W>@zIr+?C zNQ>`7rP-;_tlUH%mY~Efv4jfJTj3UdY1xM4j+fDhhqicWe$=O`T_f!Q$3g)Wc50l< zqbIm7W9YxDJQsK`tweC1>V-_aqI#jt$Z@grflg3SoFE#8aU3eV)1RsHQOePmRIjbZ z#`+ee-L1ZYmnaTmsS#S~1P3H5c4fWAyTLi8HlV7inqN28buLf%4gL{R?*-=3o9}qR zD;D~cSc|MCRxXi(2HpDu6uRERfV4KND0@=7`ljz6S!~Wyd%iONG}(RWYvpd`uL4o~ z1p2Mseek%$b?VNOd6U2tjjsm;7LE$uI)768ll<%XP={U@3To`9Gc!X zZR4AHJK6VE_d$f1QUbT5FoQ+V4@t^pBe%qu z@Mw$B4CQ=+k1WrQn4TMRmi;$;bOli6%%w@)Hc*)mR{L3dgNj)t9vYfx*m3IJ$o3)N z`Rz_$3s69CM&3hdgC)U2!SOg8zq{+1&m4WpdEtl&lj>J{T+uSyajxfU^go`4#D?n)R2GhAgfZ<@AZau__ zsq2V9-mBs^Mr?+R$~*9m%t}3ll3@9)Ew-$+-eUcXq`#VejRV%F4=p!tS$HT^D(AO{Sb5JaS=htiRc3 z+0^mt(4EnEQ6A;fVyv5`d|Zbn3v&^O%P@5${Pev6c{4{FN1Ka6OP$od87oYB4~V(R=VS zJsB;b43ItpY)C;LsO#0Vj9oo)jPb`Q=_NQ1Y$m3PFS}?Gr8+kpfAYiKP4@Mm+C?(b zVUQ()JD_76*UQ__QuX3=6V&gc>XCt`*HHsxu5@$Y{V;5%FmB+ z``IA#OIbOS?s<#3@6lR@6>+^o!x0u=yiez@d20L7q=vtWY5%cL=f}br2anIi2*;)} zN$-n?cynrcBw6HEJXXD=|1c8TzMoR6{izCSP3;XcyxaMVt+)5{nFT1N-+!gt1hocj zB=SwFZQdtQNq`7eo3tcFr@8rM59b z@)njykI9xB+WM4v5LS2d*pv0x#C1;M1LiF>QsHO8oF>bvtab(=!KXJ+ZhiZK8!APFpz(DUkvX~UnC%v*r@oc z@`7xosu2?t1EhFVR5N8&YfE=Rot`=$>En|N@?9}uz#(p)oAo%&d_Qk1IYkoA<(U-O z&8^@_=RSNm)2%+fns;Nu1KY!QGvyZ*sjdnwlH4(9;>ZxY(uk6=Ny-6T5IT8O zlaU+to2j=AhwZOVPbO$2YHo?ij|rvEYm_$b;Myyed-@e!vwVc|0js8G7qn|X4VZ_& z75*5)z-+A>N~7iK6*@q2gj@%Lfuk%;(Ah=N2A&*1BOBz5T>_2e?^$RL955*P9uQ4R z1AL0Jod21zk>ogiu>3(Ima%PP#Ad!?8Qq z1DeQuLLP`pgjd}kpX;)6B!JVBu6PJUtk4eDaNzdBs4C%(+7Z`y?V+! z@)pA)8!BVqU)j~@`22&BTIv^wGRr8tgMJ?%Qak8gLZ@W`7Ege zzs;sN$X#1U@p3nsP?aKYrE0Paq68nAgGoY=Bfu6LUWlyY<)z4eA9aDP08T5Xxl z0TXV6NLd;kWi{k`DMezA)Hf6(rP(9vgQj;8Wq(bK1qyIEJ?F9Av&+C=ig^?>s5`&rA< z{9QTzItHafK-DV23&)?8Rm*&)C3LdX%-`M`!O-Ns=0R1TXU^NaAFZkP43o3)xmhm1 zF=R3A_=S*949q60y<(F(Nk%mxyoY>)Z`~S4F3r8WNT-o;uJBpIAiQDwftx=eCQ5U= zZ;Wbuyu|g#AoP$Zw2dTwt~?tR3%Ie)?-TY}t-$j~(?&dh+iw1@MUAp`E!|-mgyQJ@ zKK&=>{cKhgyk^c~T7|i(>p?AI-D=MwS`4zddfn8r+5Q4v@{ZA|qQQ3G{3<&3jKo?Q zF9)kUm%yeEjF&ryBmHfbc|NT*3vJC_pA@(#IEsfmzBDxgmbmU@gga?5+Ek+A05g(R zW(@)pG-5#|WL-W)=v9RQB|tcV35WU{V2T#!+rW<7;8uC{p{on|{7x*p!Fg?a$nVpq(r zxqhb;!onC5rHWX*rB(E*3)!u%GtpqR`@w@p1H8>j&?Rd(uy|ilyv4F>Ez>WWQ9}Bk z4+GW+Fq+tfqNlU?B;)0td{5NHPIznNMI5|*aw+736aB*9PyOHSi~DfaCF5px##hpz zTXbKaZdO)M5HlRBYTVte$@|!%->P$O2d8j4cK`|WnqY&#l(nL*abIc zv0eI=5H;VS7a_}w0}ty`IamUz4h~Z-$4gKXH6uCw!lY@`rC%EUzXyyQ)9R{wcde>o zSH5=f&52oWyMyJ`g?1kewmCaEC|8l9Xng4eZSIYwY@eK%IBNLxp14QRKA_&_M@(-n z_B`>Kb~4uZpxn%E_E{oMlthvC$*d0Wl<}I^%PyHv zemg`7kPP4FV?A7y3?B^F>54AU87<=Wpyfsq`Bwn z_&lCgLdb)={HJnfWO|GAdtY=h(J@xLO5{twtx5Y)vJGzj!BUL<=U?RN7hJRmp6ahQ zML>D$`+V~Te#uI-QqlWPZ@nv4ZgY-o4Cz+HUGNb6Lgs?re*RJsr!v4_T^F@|-21sc zc%>UYG7UGoIrl?h_-FIrxx2Aa<#PsdmmC)@+R8&R>3msGL#ZqOz#@2*PV;{G?2Spl z*p4o>U3hbs!G2K|Gi7t+(de=9u7XUP_n#&va;n_;_Nv?ZNX!BX^uaxeNJeT#t>?Ra ziKQvE`|@3XoJR!#v~%CBCYWQQTKj3xd=B>m!Ti z$#iPg%`#gFTsojKvpPPydxIB$jQe5^`)dc9rMr(8D9EfLl*#{W<*u1R9*AM7_v6Pe zQjCg&rZL#sc+S$2)jvH;+HVUQ;m}kv&0R}hpEt0pByOK|eHdNNYmP|ESj}f>mUm`zp zKU%2j>S_g2H99cp0L^zx4jm~ZxLL!~>476sTh%ru?K?GQBh@eiMMJB}JRn(YlOF{; zgyNkNElG+WI-wM-tMApF+<0$D#-Vb3(tC#KJ*~Q7GLpPjBqBRaW~Gy=(AnGDJ6{HQ zGrwQJkxgV)S~OHttr&o24<^$L^7G@mvSKsgG@v_@k@6>+R0^cs? zD%|k^a6yErJ;_a@^VRh+w|o8vMQy9Rhr+n#^3UsU-n_w7ncZL-dPFYEigG{i4N9rG z;xG6e!YK`fpJ%=_eYJ&~o4c?R0@Y)6yDQyhGNi7pJHJhh6eAe_bS~i0jw5v;9ZZ-x zriO-?Hh8$X)pdkOND}jF6(Vs6Dp*U47fyUgIqFe)MMx^5G6+{0b5XI{Z#I$n&+jpr z`!KtS-FBoWm?YG7%xX0g>lJ`ikQFArXHcXP{ADa3CDi1KJaSK?{%x~>u#7eB1Z5!3l=zmK7v!LKUaxI4$SFo^lgGzy*Pm`3PvU5BirG0|1E z%JJ>kzCDuGz;o`s-uWv4ti$9LxIpdz#bzx-uJ2W32X#I08;SPtRN_Y0ZLYnOgh8*_{6ma#SnWv*WNws5IY!^h^wYOZDGMy|EKt=?ojT1{gU zyL>aYIN^|i2cn>$sLN1Gr}KqvB4y0p-d@CIGR~&)E zXo`#QI8xLASVnHkFoO@+p2hBky zjD|vXX;);7NM3(Hj-oADtrxGUN`ItG5>Y{w zrQurq{$oAPaB^tAK>XOv)MHnK5{SqA$0fqiI=8#){p0qsayQjV9ax9|Uid@?{p znQDm{`+apsOF`iyDTLK9y!AL~1v659Abm5{gDL1M^BI}PW7XQ9KXn*Y?OKGA?CtiHj$LXB2J3dr=txBYjox-OJ}6KYn~Pknl)EY80`Ugdv3Y4;B}D`!dgkd>fSz zqS2(d;^N{nI~Iz85(bI!ZBL3wg%%bitQL~>DI{|B^C$qM& zFf%N!_2nMiEtd6bMq_XIP^^~6?T53TvJ0Oy_O4C!Itw#iSKQ?b9K7hOf+FTI49@TC zN*G3PwmcfryOYWl0ncHzeVz&%QgngE(7t&Gzc zg2HL*fJd>umXAryX=A?sD`9=NA_|HtJ|mRqU72`8C5)bjp{g#R!{|`+3kbmFW4cnj zrF&h=M#@7w$=~2MAWF@~r1`I1jQ&*aZNGlGcKygkGAy{Az;o!7Lh}yXrt@ujrnjGP zDdA7j8T8(Fz)$09Gt}3IN%k9*)hfdsw2JWSmxE!Nz1Y~-xB44QB>7+a7sTto7M>4; zOe&aDGxy9B?W)zj{{H^NP>_OY4pu?!?>eAnqEv*E^gh#$sq*8aD!eM#= zQq=kD2Le6fKR~pH8Bg=`mAuvOe)@D)+6qpu2;qFaYxhpb@F1*I{jY6x|T;J z(W{T5=XTI(bGo{ArRk3{g=p-(zA-wHgI{*>I_9wfH%!Y3JTa z6Gh&}FWxPu-J2x#&|kh=z4y~*sojm0o$c)oKqF=cBZ3c0zixn&^PP|qt2Xtp89huU zZxh7J&p!Xd{suKHg?NSH`K>j>J`)ZIZ0J3I8txv1JxKATRmNZBrj4BaI(X0vT~D@z zNFha%we@@X%3nh+c)Ec4(`7VgNS)#&75t2hGV_LZjuuyUYnke;B4?lg%Xj?Jc0}&h zO%q`=&Ei`tIXizo1mW_p&3YjBzfdBm!2i^& z#}Ww(!JNcCPPFY^i`hsYftDob+zA~-IP5;d@!?URdllW_SFUiRP_jduALY7 zW23tSy~*T4)~%QjntmNm03zR8G@oA&s*dX(TwCp9X5|yZsR)jXj|Y;3d4$_CnO28b z{P3nuo8#cYgRHEX#06447_##QP?Ahdb+Bmw$P2 zVIoGUr(n~-Bo`igcLvEWM4(*t`P-mS7VwJJGOcTDY-$SrIgYYWPZdaJb#V`Q+cv3i zsKvART3$liVKFv2nShSIE5Zu$+U`|#4ouGOr@SbVoLoRG3m^aMg5BZ|!0R4-9j>Ld zz9ysqfB$;c4GNO~AGhhLmG{edqtYF+ZC3UeOP7?E2A(sok3gVg6s*FFr1(?4@I=a zJ7yPV(>z6y%b!avDJkL5d2q8&44SQ7zSPlOFT$9Wap9rSgY39q#Osf+EaYVYFB-B^ zrb@hf%&pyRw5j2i=g)76wKb*f`B>N?E1Pa~SmHHMYUKzv25%Y&CA{XwBflzypdY>| zd>20q<~8eCW1KKwWc>5KK5r;|*y+}3uZJd;y=p`9)z7c0A*qC-$c2?iH%Eca3i~(kJX91!UcMC)KU41=D@8YqY31TbWMF*!NBp;; zn=fNU8Ym+#BH<)oK*wiu!Wx;K*P*RqFw`0x9%lA8Z;W~0 z+^kk)p@2}g+FZxX{ku&IEbiFoWJ4FhX4tM6uaEAnt)lYJr6>1zQ3gnrFKBp*_qn>e zBfYfz5EzsY-CjUaoMRZjG13*pSU}?sXxB9oW}-`^H;E~1X)1lM@i8o zdStCGUPpo-ZSJW)_Vw9$_vQYD_~Rj$YXi)OR`V0TU?g*V#}DYloR@2t7XU$G4FhaD zPrqLQAOv~U*^xjJ30ta~WC;ZgP2>H{SxAQwnJV3i{zWPHvI=XSe{*5yoJ_vU$b z!947cgFn3;sIZ>~<~L)dfUViVGYobh)pQXcshVVc@GQ1ZWqb^zWQ(c8Py(K!kneP& zMCGYF2OMt?;Q%61qfin`UZM$%X+5I?8V?;BmE4`x)NlI&@7zgmxX}Ij?aX_9IMN zdo#Cx$TJjboc)HOpI9p(zp-%~OH@Kp0G*~#Wckf;Z z^>LQWb12)Eb2cy-*J#qmDLo2q4m08J!8?ih8Xd!}itKa|ug{7_ML`ZuM&rHK_p9gx zxketHa5a{=M&>!fV|@DI(&@1=1P6FS&5vdWDof3NdN9T;90tH++A1zQ84;RAN~3m> z_c(DnFZUtiFpXAI&`T*KK<4df&@+U)Oc- z7}%@VxG#GZwY6PE!b~<>f?5F-!;vV+PeNa^O+hUX zVF`fMbIo*7^%D|89UQn}5880^u31uH=}i=4GRIqgQ12IS=@R(0v5Y92B_2f}CD-mz zBZ4KQS+(55OS++{?qfWRs9!(sXrt5V-Z}Skuj@Ad4p|Fc$ahSjhBEY>GE(yiwSH1X z*5ojcPE*xf%Dl^%;nrbuRL!g&jS5 zG@U})6JVqAuV2$!)OmhuXBVQSrLh z@7!s-%)z?xYVOW(rR^iQLIe0U8CgJeZYQo(2%&M=Zeq&$olqj>gpMk1o%Ix$s*!Y?S zbQ)FwbcFFhS(Cj^ixwgIdq+LE>`nesdM#29g5O-?5U%b{qn}0yD?B5Umft_MasxiK zJX8L=j7(7KG8I*NymUew5{97ub4@*cgHy83+U~dd@Z#K`3 z!YLPo2B{_;rq!7IQ&i0#dwXpu|MEtVTu!g}G- z?>A=s99u=Pc`@_GViDaB?ovaw&=^}-#B%DzoE-60w2x-e^xxQ_QcH?+ zRkiXRPa-p$WEuyVW&mlKqdZq#b-&dzk6qeJ<3m&ybDwS}h!48&3>haH=Ier5MBP2= zy?Qx{aOWc{Jt*Q%02m?W1`X@gyBZa-fHIiH4oB%tSJi3G*W!HcCC&Ej$kyJro8xbC zbF0f=9n`5Rn?;tT&xMhG4eG@ED;nRw=!-hc*`7apmP2*T1@&HLjXX!XLkG2Q{wvDf z^VT#^yJ`*iJd@QDN(j(QdP;m<3#3d z$B!QmR#2NnS%7A~BDikvSds$XoH3?C&gU9x25`zLF{?{$;w zA=!zLX=yFcHr+7#m#jEl6rEQXe&#NGh=W2$k_B%@lGR=z_%F=x02l-0OK%^Cs`u!} zFJC4jZxlCdmUW< zjk<*KINg7mN1ggj#Qsi~J!axgk24Unr3#NOYHIP6nXsI0M~!MIs+GU~#59z$mj*B~ z{d##`G{KH9Tuep4)Y8bnV5{fw=%D&d+g^?Grk>h+cEvwF~G62~g4dcwIGqxud35!(9a$hZ(KGPpOemuiP zag>s7rP5~b%d^Yg?Rx#=GxHjF@>@50d&gNFKd^j8VDA2@pFsVR`Y7>A&6b`OGt#?_ z(%Q9a?Pm1D3?DvXXvcU{G1+nnq0={R{`-mFL#BD>;o 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 59/62] 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 1282fff53bfab..04a373efe6ba8 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 60/62] 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 eb763792f0c4d..02881ef12f39b 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 61/62] 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 04a373efe6ba8..2a0970ca757cd 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 62/62] 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 5f5452ce232d9..8bfc344a4edc7 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)]