From c6e2a37a9568d2ef5f6760ca43e40fb5cddfb21a Mon Sep 17 00:00:00 2001 From: CSWYF3634076 <58356743+CSWYF3634076@users.noreply.github.com> Date: Sun, 7 Sep 2025 21:06:36 +0800 Subject: [PATCH 01/36] [BugFix] qwen2.5vl enable_thinking=true bug fix (#3920) --- .../input/qwen_vl_processor/qwen_vl_processor.py | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/fastdeploy/input/qwen_vl_processor/qwen_vl_processor.py b/fastdeploy/input/qwen_vl_processor/qwen_vl_processor.py index df650fd9b..a3adeddf1 100644 --- a/fastdeploy/input/qwen_vl_processor/qwen_vl_processor.py +++ b/fastdeploy/input/qwen_vl_processor/qwen_vl_processor.py @@ -249,6 +249,16 @@ class QwenVLProcessor(TextProcessor): # Handle continuation of previous generation by appending existing tokens if metadata and metadata.get("generated_token_ids"): self.append_generated_tokens(outputs, metadata["generated_token_ids"]) + + enable_thinking = False + if metadata: + enable_thinking = metadata.get("enable_thinking", False) + + if request.get("chat_template_kwargs"): + chat_template_kwargs = request.get("chat_template_kwargs") + enable_thinking = chat_template_kwargs.get("enable_thinking", False) + request["enable_thinking"] = enable_thinking + outputs = self.pack_outputs(outputs) request["prompt_token_ids"] = outputs["input_ids"].tolist() From b2bb37d7c09e1af83ea5bd6e391fd54583d85af9 Mon Sep 17 00:00:00 2001 From: chenjian <1435317881@qq.com> Date: Sun, 7 Sep 2025 23:02:03 +0800 Subject: [PATCH 02/36] [Fix] when prompt token ids is numpy (#3944) --- fastdeploy/cache_manager/prefix_cache_manager.py | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/fastdeploy/cache_manager/prefix_cache_manager.py b/fastdeploy/cache_manager/prefix_cache_manager.py index 1ce710e6c..a0b110bde 100644 --- a/fastdeploy/cache_manager/prefix_cache_manager.py +++ b/fastdeploy/cache_manager/prefix_cache_manager.py @@ -467,7 +467,11 @@ class PrefixCacheManager: block_tables = task.block_tables last_node, num_cached_tokens = self.cache_info[req_id] - input_ids = task.prompt_token_ids + task.output_token_ids + if isinstance(task.prompt_token_ids, np.ndarray): + prompt_token_ids = task.prompt_token_ids.tolist() + else: + prompt_token_ids = task.prompt_token_ids + input_ids = prompt_token_ids + task.output_token_ids can_cache_computed_tokens = num_computed_tokens - num_computed_tokens % block_size left_input_ids = input_ids[num_cached_tokens:can_cache_computed_tokens] gpu_extra_block_ids = block_tables[num_cached_tokens // block_size :] @@ -517,7 +521,11 @@ class PrefixCacheManager: hit_info["gpu_cache_blocks"] = 0 hit_info["cpu_cache_blocks"] = 0 self.metrics.req_count += 1 - input_ids = task.prompt_token_ids + task.output_token_ids + if isinstance(task.prompt_token_ids, np.ndarray): + prompt_token_ids = task.prompt_token_ids.tolist() + else: + prompt_token_ids = task.prompt_token_ids + input_ids = prompt_token_ids + task.output_token_ids req_id = task.request_id logger.info(f"request_match_blocks: start to allocate blocks for req_id {req_id}") input_token_num = len(input_ids) From 051e4a881cedb606c184e5ed2fcbf9e032f64218 Mon Sep 17 00:00:00 2001 From: bukejiyu <52310069+bukejiyu@users.noreply.github.com> Date: Sun, 7 Sep 2025 23:57:48 +0800 Subject: [PATCH 03/36] ignore (#3949) --- tests/cov_pytest.ini | 1 + 1 file changed, 1 insertion(+) diff --git a/tests/cov_pytest.ini b/tests/cov_pytest.ini index 363132aa3..2874515c7 100644 --- a/tests/cov_pytest.ini +++ b/tests/cov_pytest.ini @@ -22,3 +22,4 @@ addopts = --ignore=tests/operators/test_flash_mask_attn.py --ignore=tests/operators/test_w4afp8_gemm.py --ignore=tests/operators/test_tree_mask.py + --ignore=tests/model_loader/test_common_model.py From 38e734e183dc76e39d34ba04e66cede2a88e843f Mon Sep 17 00:00:00 2001 From: chenjian <1435317881@qq.com> Date: Mon, 8 Sep 2025 00:31:34 +0800 Subject: [PATCH 04/36] [Feature] support hierarchical cache in v1 (#3939) --- fastdeploy/engine/sched/resource_manager_v1.py | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) diff --git a/fastdeploy/engine/sched/resource_manager_v1.py b/fastdeploy/engine/sched/resource_manager_v1.py index 694bbc701..bb9ae0bfb 100644 --- a/fastdeploy/engine/sched/resource_manager_v1.py +++ b/fastdeploy/engine/sched/resource_manager_v1.py @@ -348,6 +348,15 @@ class ResourceManagerV1(ResourceManager): if request.status == RequestStatus.WAITING: # Enable prefix caching if self.config.cache_config.enable_prefix_caching: + if ( + self.config.cache_config.enable_hierarchical_cache + and self.cache_manager.num_cpu_blocks > 0 + ): + if not self.cache_manager.can_allocate_gpu_blocks( + (request.need_prefill_tokens + self.config.cache_config.block_size - 1) + // self.config.cache_config.block_size + ): # to prevent block allocation for matching in hierarchical cache and cause dead lock + break success = self.get_prefix_cached_blocks(request) if not success: self._free_blocks(request) @@ -387,6 +396,15 @@ class ResourceManagerV1(ResourceManager): request.num_total_tokens ) # Before preempted task rescheduled, preempted task has been sent to engine, no more tokens are output, here num_total_tokens should be static and correct if self.config.cache_config.enable_prefix_caching: + if ( + self.config.cache_config.enable_hierarchical_cache + and self.cache_manager.num_cpu_blocks > 0 + ): + if not self.cache_manager.can_allocate_gpu_blocks( + (request.need_prefill_tokens + self.config.cache_config.block_size - 1) + // self.config.cache_config.block_size + ): # to prevent block allocation for matching in hierarchical cache and cause dead lock + break success = self.get_prefix_cached_blocks(request) if not success: self._free_blocks(request) From d6bf6de5e651faa553913f14fbc72a37b250271f Mon Sep 17 00:00:00 2001 From: ming1753 <61511741+ming1753@users.noreply.github.com> Date: Mon, 8 Sep 2025 00:32:22 +0800 Subject: [PATCH 05/36] [Bug Fix] Fix mm performance degradation (#3942) * [Bug Fix] Fix mm performance degradation * formate --------- Co-authored-by: Jiang-Jia-Jun <163579578+Jiang-Jia-Jun@users.noreply.github.com> Co-authored-by: chenjian <1435317881@qq.com> --- fastdeploy/engine/common_engine.py | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/fastdeploy/engine/common_engine.py b/fastdeploy/engine/common_engine.py index 0bf1cdf39..dc13c74f0 100644 --- a/fastdeploy/engine/common_engine.py +++ b/fastdeploy/engine/common_engine.py @@ -527,8 +527,14 @@ class EngineSevice: self.cfg.max_prefill_batch, ) + if self.cfg.model_config.enable_mm: + self.resource_manager.check_and_free_block_tables() + available_blocks = self.resource_manager.available_block_num() + else: + available_blocks = self.cfg.cache_config.max_block_num_per_seq + tasks = self.scheduler.get_requests( - available_blocks=self.cfg.cache_config.max_block_num_per_seq, + available_blocks=available_blocks, block_size=self.cfg.cache_config.block_size, reserved_output_blocks=self.cfg.cache_config.enc_dec_block_num, max_num_batched_tokens=self.cfg.max_model_len, From c7c1627456b849e4b00a10e5b7917326bef63b96 Mon Sep 17 00:00:00 2001 From: Yuanle Liu Date: Mon, 8 Sep 2025 11:11:05 +0800 Subject: [PATCH 06/36] Update paddleformers version to >=0.2.3 (#3936) * Update paddleformers version to 0.2.2 * Update requirements.txt * Update paddleformers version to >=0.2.3 --- requirements.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/requirements.txt b/requirements.txt index c7dfe9179..b6b47cad1 100644 --- a/requirements.txt +++ b/requirements.txt @@ -10,7 +10,7 @@ tqdm pynvml uvicorn==0.29.0 fastapi -paddleformers==0.2.1 +paddleformers>=0.2.3 redis etcd3 httpx From d43549953c4ab67239be78321d3df3280479f157 Mon Sep 17 00:00:00 2001 From: Zero Rains Date: Mon, 8 Sep 2025 14:06:10 +0800 Subject: [PATCH 07/36] [Cherry-Pick][Bug Fix]fix the bug for real size 0 in cudagraph (#3888) * fix the bug for real size 0 in cudagraph * fix cache_messager --------- Co-authored-by: Jiang-Jia-Jun <163579578+Jiang-Jia-Jun@users.noreply.github.com> --- fastdeploy/cache_manager/cache_messager.py | 2 +- fastdeploy/worker/gpu_model_runner.py | 8 ++++---- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/fastdeploy/cache_manager/cache_messager.py b/fastdeploy/cache_manager/cache_messager.py index a9a46d4c4..65d412f39 100644 --- a/fastdeploy/cache_manager/cache_messager.py +++ b/fastdeploy/cache_manager/cache_messager.py @@ -163,7 +163,7 @@ class CacheMessager: try: prefilled_step_idx_data = np.zeros(shape=[1], dtype=np.int32) prefilled_layer_idx_data = np.zeros(shape=[1], dtype=np.int32) - prefilled_layer_name = f"splitwise_complete_prefilled_step_{self.dp_rank_id}.{self.gpu_id}" + prefilled_layer_name = f"splitwise_complete_prefilled_layer_{self.dp_rank_id}.{self.gpu_id}" prefilled_step_name = f"splitwise_complete_prefilled_step_{self.dp_rank_id}.{self.gpu_id}" step_shm_value = IPCSignal( name=f"splitwise_complete_prefilled_step_{self.dp_rank_id}", diff --git a/fastdeploy/worker/gpu_model_runner.py b/fastdeploy/worker/gpu_model_runner.py index 23a1fdfe6..89834acd6 100644 --- a/fastdeploy/worker/gpu_model_runner.py +++ b/fastdeploy/worker/gpu_model_runner.py @@ -42,6 +42,7 @@ from fastdeploy.model_executor.layers.sample.meta_data import SamplingMetadata from fastdeploy.model_executor.layers.sample.sampler import Sampler, SpeculativeSampler from fastdeploy.model_executor.model_loader import get_model_loader from fastdeploy.platforms import current_platform +from fastdeploy.utils import ceil_div if current_platform.is_iluvatar(): from fastdeploy.model_executor.ops.iluvatar import set_value_by_flags_and_idx @@ -588,17 +589,16 @@ class GPUModelRunner(ModelRunnerBase): """Set dummy prefill inputs to share_inputs""" # NOTE(gongshaotian): The maximum decoding length is equal to the expected decoded tokens plus the eos token max_dec_len = expected_decode_len + 1 - full_length = min( - num_tokens // batch_size, + input_length = min( + ceil_div(num_tokens, batch_size), self.parallel_config.max_model_len - max_dec_len, ) # NOTE(wanglongzhi): When the full length is too large, DeepEP's buffer size will not be enough to cause the result to appear nan. # TODO(wanglongzhi): Figure out the accurate buffer size of DeepEP. if self.fd_config.parallel_config.enable_expert_parallel: - full_length = min(full_length, 32) + input_length = min(input_length, 32) - input_length = int(full_length * self.cache_config.kv_cache_ratio) block_num = ( input_length + self.cache_config.block_size - 1 ) // self.cache_config.block_size + self.cache_config.enc_dec_block_num From 1023a6776514d6771160b8f41cdcc856ce0f977e Mon Sep 17 00:00:00 2001 From: luukunn <83932082+luukunn@users.noreply.github.com> Date: Mon, 8 Sep 2025 14:12:13 +0800 Subject: [PATCH 08/36] [BugFix] fix default parser (#3932) * add reasoning parser plugin * fix finish reason * fix default parser --------- Co-authored-by: Yuanle Liu Co-authored-by: Jiang-Jia-Jun <163579578+Jiang-Jia-Jun@users.noreply.github.com> --- fastdeploy/input/preprocess.py | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/fastdeploy/input/preprocess.py b/fastdeploy/input/preprocess.py index 48626f380..16615599b 100644 --- a/fastdeploy/input/preprocess.py +++ b/fastdeploy/input/preprocess.py @@ -76,7 +76,9 @@ class InputPreprocessor: load_reasoning_parser_plugins, ) - reasoning_parser_obj = load_reasoning_parser_plugins() + custom_reasoning_parser = load_reasoning_parser_plugins() + if self.reasoning_parser == "custom_reasoning_parser": + reasoning_parser_obj = custom_reasoning_parser except: if self.reasoning_parser: reasoning_parser_obj = ReasoningParserManager.get_reasoning_parser(self.reasoning_parser) From 8903f937f93851c661e3d1c3ed50783d3c1416e2 Mon Sep 17 00:00:00 2001 From: Zhang Yulong <35552275+ZhangYulongg@users.noreply.github.com> Date: Mon, 8 Sep 2025 14:21:25 +0800 Subject: [PATCH 09/36] update ci (#3953) --- tests/cov_pytest.ini | 1 - tests/model_loader/utils.py | 14 ++++++++++++++ 2 files changed, 14 insertions(+), 1 deletion(-) diff --git a/tests/cov_pytest.ini b/tests/cov_pytest.ini index 2874515c7..363132aa3 100644 --- a/tests/cov_pytest.ini +++ b/tests/cov_pytest.ini @@ -22,4 +22,3 @@ addopts = --ignore=tests/operators/test_flash_mask_attn.py --ignore=tests/operators/test_w4afp8_gemm.py --ignore=tests/operators/test_tree_mask.py - --ignore=tests/model_loader/test_common_model.py diff --git a/tests/model_loader/utils.py b/tests/model_loader/utils.py index 0705af8ef..2d95d1ab9 100644 --- a/tests/model_loader/utils.py +++ b/tests/model_loader/utils.py @@ -23,6 +23,7 @@ from multiprocessing import Process, Queue import pytest TokensIdText = list[tuple[list[int], str]] +FD_CACHE_QUEUE_PORT = int(os.getenv("FD_CACHE_QUEUE_PORT", 8234)) def clear_logs(): @@ -117,6 +118,19 @@ def clean_ports(ports_to_clean: list[int]): """ Kill all processes occupying the ports listed in PORTS_TO_CLEAN. """ + try: + result = subprocess.run( + f"ps -efww | grep {FD_CACHE_QUEUE_PORT} | grep -v grep", shell=True, capture_output=True, text=True + ) + for line in result.stdout.strip().split("\n"): + if not line: + continue + parts = line.split() + pid = int(parts[1]) + print(f"Killing PID: {pid}") + os.kill(pid, signal.SIGKILL) + except Exception as e: + print(f"Failed to kill cache manager process: {e}, {str(traceback.format_exc())}") for port in ports_to_clean: kill_process_on_port(port) From fa2369271d553ab3f66d7f13cf8e50281d4940e4 Mon Sep 17 00:00:00 2001 From: Sunny-bot1 <68891411+Sunny-bot1@users.noreply.github.com> Date: Mon, 8 Sep 2025 14:44:52 +0800 Subject: [PATCH 10/36] update env docs for Machete (#3960) --- docs/usage/environment_variables.md | 2 ++ docs/zh/usage/environment_variables.md | 3 +++ 2 files changed, 5 insertions(+) diff --git a/docs/usage/environment_variables.md b/docs/usage/environment_variables.md index 313449a40..6cae70535 100644 --- a/docs/usage/environment_variables.md +++ b/docs/usage/environment_variables.md @@ -72,5 +72,7 @@ environment_variables: dict[str, Callable[[], Any]] = { "FD_USE_DEEP_GEMM": lambda: bool(int(os.getenv("FD_USE_DEEP_GEMM", "0"))), + # Whether to use Machete for wint4 dense GEMM. + "FD_USE_MACHETE": lambda: os.getenv("FD_USE_MACHETE", "0"), } ``` diff --git a/docs/zh/usage/environment_variables.md b/docs/zh/usage/environment_variables.md index 74b135eae..74d0fc9dd 100644 --- a/docs/zh/usage/environment_variables.md +++ b/docs/zh/usage/environment_variables.md @@ -71,5 +71,8 @@ environment_variables: dict[str, Callable[[], Any]] = { # 是否使用DeepGemm后端的FP8 blockwise MoE. "FD_USE_DEEP_GEMM": lambda: bool(int(os.getenv("FD_USE_DEEP_GEMM", "0"))), + + # 是否使用 Machete 后端的 wint4 GEMM. + "FD_USE_MACHETE": lambda: os.getenv("FD_USE_MACHETE", "0"), } ``` From d40a1046def4c03f00d8f0860a835b6abb0c2742 Mon Sep 17 00:00:00 2001 From: lizhenyun01 <1500424927@qq.com> Date: Mon, 8 Sep 2025 16:20:32 +0800 Subject: [PATCH 11/36] [Feature] support rl_tp_degree (#3934) * [Feature] support rl_tp_degree * add rl_tp_degree in lmhead * add rl_tp_degree in bias * fix split_axis=0 in bias * fix split_axis in weight * fix bias rl_tp_degree * fix bias rl_tp_degree * change attr to dict --------- Co-authored-by: Jiang-Jia-Jun <163579578+Jiang-Jia-Jun@users.noreply.github.com> --- fastdeploy/model_executor/layers/embeddings.py | 5 +++++ fastdeploy/model_executor/layers/linear.py | 18 +++++++++++++++++- fastdeploy/model_executor/layers/lm_head.py | 9 +++++++++ 3 files changed, 31 insertions(+), 1 deletion(-) diff --git a/fastdeploy/model_executor/layers/embeddings.py b/fastdeploy/model_executor/layers/embeddings.py index 377ff19bb..0ac2d0d70 100644 --- a/fastdeploy/model_executor/layers/embeddings.py +++ b/fastdeploy/model_executor/layers/embeddings.py @@ -77,6 +77,11 @@ class VocabParallelEmbedding(nn.Layer): ) if self.world_size > 1: set_weight_attrs(self.embeddings.weight, {"output_dim": False}) + set_weight_attrs( + self.embeddings.weight, + {"rl_need_attr": {"rl_tp_degree": fd_config.parallel_config.tensor_parallel_size}}, + ) + else: # column cut embedding self.embeddings = nn.Embedding( diff --git a/fastdeploy/model_executor/layers/linear.py b/fastdeploy/model_executor/layers/linear.py index 2c7f9aef3..0d079c90c 100644 --- a/fastdeploy/model_executor/layers/linear.py +++ b/fastdeploy/model_executor/layers/linear.py @@ -356,11 +356,21 @@ class ColumnParallelLinear(LinearBase): ) if self.nranks > 0: + _set_var_distributed(self.weight, split_axis=-1) if self.with_bias: # col parallel - _set_var_distributed(self.bias, split_axis=1) + _set_var_distributed(self.bias, split_axis=0) set_weight_attrs(self.bias, {"output_dim": True}) + # set_rl_tp_degree + set_weight_attrs( + self.weight, {"rl_need_attr": {"rl_tp_degree": fd_config.parallel_config.tensor_parallel_size}} + ) + if self.with_bias: + set_weight_attrs( + self.bias, {"rl_need_attr": {"rl_tp_degree": fd_config.parallel_config.tensor_parallel_size}} + ) + class MergedColumnParallelLinear(ColumnParallelLinear): """ @@ -743,6 +753,7 @@ class RowParallelLinear(LinearBase): model_format=fd_config.model_config.model_format, ) if self.nranks > 0: + _set_var_distributed(self.weight, split_axis=0) if self.with_bias: # col parallel _set_var_distributed(self.bias, split_axis=0) @@ -755,6 +766,11 @@ class RowParallelLinear(LinearBase): self.reduce_results = reduce_results + # set_rl_tp_degree + set_weight_attrs( + self.weight, {"rl_need_attr": {"rl_tp_degree": fd_config.parallel_config.tensor_parallel_size}} + ) + def forward_cuda(self, x: paddle.Tensor) -> paddle.Tensor: if self.fd_config.quant_config: out = self.quant_method.apply(self, x) diff --git a/fastdeploy/model_executor/layers/lm_head.py b/fastdeploy/model_executor/layers/lm_head.py index a62e46d61..b9dc06ab0 100644 --- a/fastdeploy/model_executor/layers/lm_head.py +++ b/fastdeploy/model_executor/layers/lm_head.py @@ -94,6 +94,12 @@ class ParallelLMHead(nn.Layer): "model_format": self.fd_config.model_config.model_format, }, ) + if self.bias_key is not None: + set_weight_attrs( + self.linear.bias, + {"rl_need_attr": {"rl_tp_degree": fd_config.parallel_config.tensor_parallel_size}}, + ) + if self.nranks > 1: set_weight_attrs(self.linear.weight, {"output_dim": True}) else: @@ -116,6 +122,9 @@ class ParallelLMHead(nn.Layer): if self.nranks > 1: set_weight_attrs(self.linear.weight, {"output_dim": False}) + set_weight_attrs( + self.linear.weight, {"rl_need_attr": {"rl_tp_degree": fd_config.parallel_config.tensor_parallel_size}} + ) def load_state_dict(self, state_dict: Dict[str, paddle.Tensor | np.ndarray]): """ From 36a58f487c64d8fd64b9134a61f6be4d501c1883 Mon Sep 17 00:00:00 2001 From: JYChen Date: Mon, 8 Sep 2025 22:17:32 +0800 Subject: [PATCH 12/36] [docs] update best practice docs for release/2.2 (#3970) * update best practice docs * add version and v1 loader info --- docs/best_practices/ERNIE-4.5-0.3B-Paddle.md | 23 +++++++-------- .../ERNIE-4.5-21B-A3B-Paddle.md | 27 +++++++++--------- .../ERNIE-4.5-300B-A47B-Paddle.md | 28 +++++++++++-------- .../best_practices/ERNIE-4.5-0.3B-Paddle.md | 20 +++++++------ .../ERNIE-4.5-21B-A3B-Paddle.md | 26 +++++++++-------- .../ERNIE-4.5-300B-A47B-Paddle.md | 28 +++++++++++-------- 6 files changed, 85 insertions(+), 67 deletions(-) diff --git a/docs/best_practices/ERNIE-4.5-0.3B-Paddle.md b/docs/best_practices/ERNIE-4.5-0.3B-Paddle.md index 450c6b834..7204e1b14 100644 --- a/docs/best_practices/ERNIE-4.5-0.3B-Paddle.md +++ b/docs/best_practices/ERNIE-4.5-0.3B-Paddle.md @@ -19,22 +19,23 @@ The minimum number of GPUs required to deploy `ERNIE-4.5-0.3B` on the following ### 1.2 Install fastdeploy - Installation: For detail, please refer to [Fastdeploy Installation](../get_started/installation/README.md). -- Model Download,For detail, please refer to [Supported Models](../supported_models.md). **Please note that models with Paddle suffix need to be used for Fastdeploy**: +- Model Download,For detail, please refer to [Supported Models](../supported_models.md). ## 2.How to Use ### 2.1 Basic: Launching the Service Start the service by following command: ```bash -export ENABLE_V1_KVCACHE_SCHEDULER=1 python -m fastdeploy.entrypoints.openai.api_server \ --model baidu/ERNIE-4.5-0.3B-Paddle \ --tensor-parallel-size 1 \ --quantization wint4 \ --max-model-len 32768 \ - --max-num-seqs 128 + --max-num-seqs 128 \ + --load_choices "default_v1" ``` - `--quantization`: indicates the quantization strategy used by the model. Different quantization strategies will result in different performance and accuracy of the model. It could be one of `wint8` / `wint4` / `block_wise_fp8`(Hopper is needed). - `--max-model-len`: Indicates the maximum number of tokens supported by the currently deployed service. The larger the value, the longer the context length the model can support, but the more GPU memory is occupied, which may affect the concurrency. +- `--load_choices`: indicates the version of the loader. "default_v1" means enabling the v1 version of the loader, which has faster loading speed and less memory usage. For more parameter meanings and default settings, see [FastDeploy Parameter Documentation](../parameters.md)。 @@ -42,17 +43,14 @@ For more parameter meanings and default settings, see [FastDeploy Parameter Docu #### 2.2.1 Correctly set parameters that match the application scenario Evaluate average input length, average output length, and maximum context length - Set max-model-len according to the maximum context length. For example, if the average input length is 1000 and the output length is 30000, then it is recommended to set it to 32768 -- **Enable the service management global block** - -``` -export ENABLE_V1_KVCACHE_SCHEDULER=1 -``` #### 2.2.2 Prefix Caching **Idea:** The core idea of Prefix Caching is to avoid repeated calculations by caching the intermediate calculation results of the input sequence (KV Cache), thereby speeding up the response speed of multiple requests with the same prefix. For details, refer to [prefix-cache](../features/prefix_caching.md) **How to enable:** -Add the following lines to the startup parameters, where `--enable-prefix-caching` enables prefix caching, and `--swap-space` enables CPU cache in addition to GPU cache. The size is GB and should be adjusted according to the actual situation of the machine. +Since version 2.2 (including the develop branch), Prefix Caching has been enabled by default. + +For versions 2.1 and earlier, you need to enable it manually by adding following lines to the startup parameters, where `--enable-prefix-caching` enables prefix caching, and `--swap-space` enables CPU cache in addition to GPU cache. The size is GB and should be adjusted according to the actual situation of the machine. The recommended value is `(total machine memory - model size) * 20%`. If the service fails to start because other programs are occupying memory, try reducing the `--swap-space` value. ``` --enable-prefix-caching --swap-space 50 @@ -61,7 +59,10 @@ Add the following lines to the startup parameters, where `--enable-prefix-cachin #### 2.2.3 Chunked Prefill **Idea:** This strategy is adopted to split the prefill stage request into small-scale sub-chunks, and execute them in batches mixed with the decode request. This can better balance the computation-intensive (Prefill) and memory-intensive (Decode) operations, optimize GPU resource utilization, reduce the computational workload and memory usage of a single Prefill, thereby reducing the peak memory usage and avoiding the problem of insufficient memory. For details, please refer to [Chunked Prefill](../features/chunked_prefill.md) -**How to enable:** Add the following lines to the startup parameters +**How to enable:** +Since version 2.2 (including the develop branch), Chunked Prefill has been enabled by default. + +For versions 2.1 and earlier, you need to enable it manually by adding ``` --enable-chunked-prefill ``` @@ -79,7 +80,7 @@ Notes: - Usually, no additional parameters need to be set, but CUDAGraph will generate some additional memory overhead, which may need to be adjusted in some scenarios with limited memory. For detailed parameter adjustments, please refer to [GraphOptimizationBackend](../features/graph_optimization.md) for related configuration parameter descriptions -#### 2.2.6 Rejection Sampling +#### 2.2.5 Rejection Sampling **Idea:** Rejection sampling is to generate samples from a proposal distribution that is easy to sample, avoiding explicit sorting to increase the sampling speed, which has a significant improvement on small-sized models. diff --git a/docs/best_practices/ERNIE-4.5-21B-A3B-Paddle.md b/docs/best_practices/ERNIE-4.5-21B-A3B-Paddle.md index c59878e4c..9de142d85 100644 --- a/docs/best_practices/ERNIE-4.5-21B-A3B-Paddle.md +++ b/docs/best_practices/ERNIE-4.5-21B-A3B-Paddle.md @@ -19,22 +19,23 @@ The minimum number of GPUs required to deploy `ERNIE-4.5-21B-A3B` on the followi ### 1.2 Install fastdeploy and prepare the model - Installation: For detail, please refer to [Fastdeploy Installation](../get_started/installation/README.md). -- Model Download,For detail, please refer to [Supported Models](../supported_models.md). **Please note that models with Paddle suffix need to be used for Fastdeploy**: +- Model Download,For detail, please refer to [Supported Models](../supported_models.md). ## 2.How to Use ### 2.1 Basic: Launching the Service Start the service by following command: ```bash -export ENABLE_V1_KVCACHE_SCHEDULER=1 python -m fastdeploy.entrypoints.openai.api_server \ --model baidu/ERNIE-4.5-21B-A3B-Paddle \ --tensor-parallel-size 1 \ --quantization wint4 \ --max-model-len 32768 \ - --max-num-seqs 128 + --max-num-seqs 128 \ + --load_choices "default_v1" ``` - `--quantization`: indicates the quantization strategy used by the model. Different quantization strategies will result in different performance and accuracy of the model. It could be one of `wint8` / `wint4` / `block_wise_fp8`(Hopper is needed). - `--max-model-len`: Indicates the maximum number of tokens supported by the currently deployed service. The larger the value, the longer the context length the model can support, but the more GPU memory is occupied, which may affect the concurrency. +- `--load_choices`: indicates the version of the loader. "default_v1" means enabling the v1 version of the loader, which has faster loading speed and less memory usage. For more parameter meanings and default settings, see [FastDeploy Parameter Documentation](../parameters.md)。 @@ -42,17 +43,14 @@ For more parameter meanings and default settings, see [FastDeploy Parameter Docu #### 2.2.1 Correctly set parameters that match the application scenario Evaluate average input length, average output length, and maximum context length - Set max-model-len according to the maximum context length. For example, if the average input length is 1000 and the output length is 30000, then it is recommended to set it to 32768 -- **Enable the service management global block** - -``` -export ENABLE_V1_KVCACHE_SCHEDULER=1 -``` #### 2.2.2 Prefix Caching **Idea:** The core idea of Prefix Caching is to avoid repeated calculations by caching the intermediate calculation results of the input sequence (KV Cache), thereby speeding up the response speed of multiple requests with the same prefix. For details, refer to [prefix-cache](../features/prefix_caching.md) **How to enable:** -Add the following lines to the startup parameters, where `--enable-prefix-caching` enables prefix caching, and `--swap-space` enables CPU cache in addition to GPU cache. The size is GB and should be adjusted according to the actual situation of the machine. The recommended value is `(total machine memory - model size) * 20%`. If the service fails to start because other programs are occupying memory, try reducing the `--swap-space` value. +Since version 2.2 (including the develop branch), Prefix Caching has been enabled by default. + +For versions 2.1 and earlier, you need to enable it manually by adding following lines to the startup parameters, where `--enable-prefix-caching` enables prefix caching, and `--swap-space` enables CPU cache in addition to GPU cache. The size is GB and should be adjusted according to the actual situation of the machine. The recommended value is `(total machine memory - model size) * 20%`. If the service fails to start because other programs are occupying memory, try reducing the `--swap-space` value. ``` --enable-prefix-caching --swap-space 50 @@ -61,7 +59,10 @@ Add the following lines to the startup parameters, where `--enable-prefix-cachin #### 2.2.3 Chunked Prefill **Idea:** This strategy is adopted to split the prefill stage request into small-scale sub-chunks, and execute them in batches mixed with the decode request. This can better balance the computation-intensive (Prefill) and memory-intensive (Decode) operations, optimize GPU resource utilization, reduce the computational workload and memory usage of a single Prefill, thereby reducing the peak memory usage and avoiding the problem of insufficient memory. For details, please refer to [Chunked Prefill](../features/chunked_prefill.md) -**How to enable:** Add the following lines to the startup parameters +**How to enable:** +Since version 2.2 (including the develop branch), Chunked Prefill has been enabled by default. + +For versions 2.1 and earlier, you need to enable it manually by adding ``` --enable-chunked-prefill ``` @@ -77,7 +78,9 @@ Add the following lines to the startup parameters ``` Notes: 1. MTP currently does not support simultaneous use with Prefix Caching, Chunked Prefill, and CUDAGraph. -2. MTP currently does not support service management global blocks, i.e. do not run with `export ENABLE_V1_KVCACHE_SCHEDULER=1` + - Use `export FD_DISABLE_CHUNKED_PREFILL=1` to disable Chunked Prefill. + - When setting `speculative-config`, Prefix Caching will be automatically disabled. +2. MTP currently does not support service management global blocks, When setting `speculative-config`, service management global blocks will be automatically disabled. 3. MTP currently does not support rejection sampling, i.e. do not run with `export FD_SAMPLING_CLASS=rejection` #### 2.2.5 CUDAGraph @@ -110,7 +113,6 @@ export FD_SAMPLING_CLASS=rejection # prefill export CUDA_VISIBLE_DEVICES=0,1,2,3 export INFERENCE_MSG_QUEUE_ID=1315 -export FLAGS_max_partition_size=2048 export FD_ATTENTION_BACKEND=FLASH_ATTN export FD_LOG_DIR="prefill_log" @@ -130,7 +132,6 @@ python -m fastdeploy.entrypoints.openai.api_server --model baidu/ERNIE-4.5-21B-A # decode export CUDA_VISIBLE_DEVICES=4,5,6,7 export INFERENCE_MSG_QUEUE_ID=1215 -export FLAGS_max_partition_size=2048 export FD_LOG_DIR="decode_log" quant_type=block_wise_fp8 diff --git a/docs/best_practices/ERNIE-4.5-300B-A47B-Paddle.md b/docs/best_practices/ERNIE-4.5-300B-A47B-Paddle.md index 42bd7c7ef..debb54fc0 100644 --- a/docs/best_practices/ERNIE-4.5-300B-A47B-Paddle.md +++ b/docs/best_practices/ERNIE-4.5-300B-A47B-Paddle.md @@ -16,22 +16,23 @@ The minimum number of GPUs required to deploy `ERNIE-4.5-300B-A47B` on the follo ### 1.2 Install fastdeploy - Installation: For detail, please refer to [Fastdeploy Installation](../get_started/installation/README.md). -- Model Download,For detail, please refer to [Supported Models](../supported_models.md). **Please note that models with Paddle suffix need to be used for Fastdeploy**: +- Model Download,For detail, please refer to [Supported Models](../supported_models.md). ## 2.How to Use ### 2.1 Basic: Launching the Service Start the service by following command: ```bash -export ENABLE_V1_KVCACHE_SCHEDULER=1 python -m fastdeploy.entrypoints.openai.api_server \ --model baidu/ERNIE-4.5-300B-A47B-Paddle \ --tensor-parallel-size 8 \ --quantization wint4 \ --max-model-len 32768 \ - --max-num-seqs 128 + --max-num-seqs 128 \ + --load_choices "default_v1" ``` - `--quantization`: indicates the quantization strategy used by the model. Different quantization strategies will result in different performance and accuracy of the model. It could be one of `wint8` / `wint4` / `block_wise_fp8`(Hopper is needed). - `--max-model-len`: Indicates the maximum number of tokens supported by the currently deployed service. The larger the value, the longer the context length the model can support, but the more GPU memory is occupied, which may affect the concurrency. +- `--load_choices`: indicates the version of the loader. "default_v1" means enabling the v1 version of the loader, which has faster loading speed and less memory usage. For more parameter meanings and default settings, see [FastDeploy Parameter Documentation](../parameters.md)。 @@ -39,17 +40,14 @@ For more parameter meanings and default settings, see [FastDeploy Parameter Docu #### 2.2.1 Correctly set parameters that match the application scenario Evaluate average input length, average output length, and maximum context length - Set max-model-len according to the maximum context length. For example, if the average input length is 1000 and the output length is 30000, then it is recommended to set it to 32768 -- **Enable the service management global block** - -``` -export ENABLE_V1_KVCACHE_SCHEDULER=1 -``` #### 2.2.2 Prefix Caching **Idea:** The core idea of Prefix Caching is to avoid repeated calculations by caching the intermediate calculation results of the input sequence (KV Cache), thereby speeding up the response speed of multiple requests with the same prefix. For details, refer to [prefix-cache](../features/prefix_caching.md) **How to enable:** -Add the following lines to the startup parameters, where `--enable-prefix-caching` enables prefix caching, and `--swap-space` enables CPU cache in addition to GPU cache. The size is GB and should be adjusted according to the actual situation of the machine. The recommended value is `(total machine memory - model size) * 20%`. If the service fails to start because other programs are occupying memory, try reducing the `--swap-space` value. +Since version 2.2 (including the develop branch), Prefix Caching has been enabled by default. + +For versions 2.1 and earlier, you need to enable it manually by adding following lines to the startup parameters, where `--enable-prefix-caching` enables prefix caching, and `--swap-space` enables CPU cache in addition to GPU cache. The size is GB and should be adjusted according to the actual situation of the machine. The recommended value is `(total machine memory - model size) * 20%`. If the service fails to start because other programs are occupying memory, try reducing the `--swap-space` value. ``` --enable-prefix-caching --swap-space 50 @@ -58,7 +56,10 @@ Add the following lines to the startup parameters, where `--enable-prefix-cachin #### 2.2.3 Chunked Prefill **Idea:** This strategy is adopted to split the prefill stage request into small-scale sub-chunks, and execute them in batches mixed with the decode request. This can better balance the computation-intensive (Prefill) and memory-intensive (Decode) operations, optimize GPU resource utilization, reduce the computational workload and memory usage of a single Prefill, thereby reducing the peak memory usage and avoiding the problem of insufficient memory. For details, please refer to [Chunked Prefill](../features/chunked_prefill.md) -**How to enable:** Add the following lines to the startup parameters +**How to enable:** +Since version 2.2 (including the develop branch), Chunked Prefill has been enabled by default. + +For versions 2.1 and earlier, you need to enable it manually by adding ``` --enable-chunked-prefill ``` @@ -74,7 +75,9 @@ Add the following lines to the startup parameters ``` Notes: 1. MTP currently does not support simultaneous use with Prefix Caching, Chunked Prefill, and CUDAGraph. -2. MTP currently does not support service management global blocks, i.e. do not run with `export ENABLE_V1_KVCACHE_SCHEDULER=1` + - Use `export FD_DISABLE_CHUNKED_PREFILL=1` to disable Chunked Prefill. + - When setting `speculative-config`, Prefix Caching will be automatically disabled. +2. MTP currently does not support service management global blocks, When setting `speculative-config`, service management global blocks will be automatically disabled. 3. MTP currently does not support rejection sampling, i.e. do not run with `export FD_SAMPLING_CLASS=rejection` #### 2.2.5 W4A8C8 Quantization @@ -87,6 +90,9 @@ Just specify the corresponding model name in the startup command, `baidu/ERNIE-4 --model baidu/ERNIE-4.5-300B-A47B-W4A8C8-TP4-Paddle ``` +Note: +- W4A8C8 quantized models are not supported when loaded via `--load_choices "default_v1"`. + #### 2.2.6 Rejection Sampling **Idea:** Rejection sampling is to generate samples from a proposal distribution that is easy to sample, avoiding explicit sorting to increase the sampling speed, which has a significant improvement on small-sized models. diff --git a/docs/zh/best_practices/ERNIE-4.5-0.3B-Paddle.md b/docs/zh/best_practices/ERNIE-4.5-0.3B-Paddle.md index 59d447ae7..c4a82d641 100644 --- a/docs/zh/best_practices/ERNIE-4.5-0.3B-Paddle.md +++ b/docs/zh/best_practices/ERNIE-4.5-0.3B-Paddle.md @@ -19,23 +19,24 @@ ERNIE-4.5-0.3B 各量化精度,在下列硬件上部署所需要的最小卡 ### 1.2 安装fastdeploy - 安装请参考[Fastdeploy Installation](../get_started/installation/README.md)完成安装。 -- 模型下载,请参考[支持模型列表](../supported_models.md)。**请注意使用Fastdeploy部署需要Paddle后缀的模型** +- 模型下载,请参考[支持模型列表](../supported_models.md)。 ## 二、如何使用 ### 2.1 基础:启动服务 通过下列命令启动服务 ```bash -export ENABLE_V1_KVCACHE_SCHEDULER=1 python -m fastdeploy.entrypoints.openai.api_server \ --model baidu/ERNIE-4.5-0.3B-Paddle \ --tensor-parallel-size 1 \ --quantization wint4 \ --max-model-len 32768 \ - --max-num-seqs 128 + --max-num-seqs 128 \ + --load_choices "default_v1" ``` 其中: - `--quantization`: 表示模型采用的量化策略。不同量化策略,模型的性能和精度也会不同。可选值包括:`wint8` / `wint4` / `block_wise_fp8`(需要Hopper架构)。 - `--max-model-len`:表示当前部署的服务所支持的最长Token数量。设置得越大,模型可支持的上下文长度也越大,但相应占用的显存也越多,可能影响并发数。 +- `--load_choices`: 表示loader的版本,"default_v1"表示启用v1版本的loader,具有更快的加载速度和更少的内存使用。 更多的参数含义与默认设置,请参见[FastDeploy参数说明](../parameters.md)。 @@ -43,16 +44,14 @@ python -m fastdeploy.entrypoints.openai.api_server \ #### 2.2.1 评估应用场景,正确设置参数 结合应用场景,评估平均输入长度、平均输出长度、最大上下文长度。例如,平均输入长度为1000,输出长度为30000,那么建议设置为 32768 - 根据最大上下文长度,设置`max-model-len` -- **启用服务管理全局 Block** -``` -export ENABLE_V1_KVCACHE_SCHEDULER=1 -``` #### 2.2.2 Prefix Caching **原理:** Prefix Caching的核心思想是通过缓存输入序列的中间计算结果(KV Cache),避免重复计算,从而加速具有相同前缀的多个请求的响应速度。具体参考[prefix-cache](../features/prefix_caching.md) **启用方式:** -在启动参数下增加下列两行,其中`--enable-prefix-caching`表示启用前缀缓存,`--swap-space`表示在GPU缓存的基础上,额外开启CPU缓存,大小为GB,应根据机器实际情况调整。建议取值为`(机器总内存 - 模型大小) * 20%`。如果因为其他程序占用内存等原因导致服务启动失败,可以尝试减小`--swap-space`的值。 +自2.2版本开始(包括develop分支),Prefix Caching已经默认开启。 + +对于2.1及更早的版本,需要手动开启。其中`--enable-prefix-caching`表示启用前缀缓存,`--swap-space`表示在GPU缓存的基础上,额外开启CPU缓存,大小为GB,应根据机器实际情况调整。建议取值为`(机器总内存 - 模型大小) * 20%`。如果因为其他程序占用内存等原因导致服务启动失败,可以尝试减小`--swap-space`的值。 ``` --enable-prefix-caching --swap-space 50 @@ -61,7 +60,10 @@ export ENABLE_V1_KVCACHE_SCHEDULER=1 #### 2.2.3 Chunked Prefill **原理:** 采用分块策略,将预填充(Prefill)阶段请求拆解为小规模子任务,与解码(Decode)请求混合批处理执行。可以更好地平衡计算密集型(Prefill)和访存密集型(Decode)操作,优化GPU资源利用率,减少单次Prefill的计算量和显存占用,从而降低显存峰值,避免显存不足的问题。 具体请参考[Chunked Prefill](../features/chunked_prefill.md) -**启用方式:** 在启动参数下增加即可 +**启用方式:** +自2.2版本开始(包括develop分支),Chunked Prefill已经默认开启。 + +对于2.1及更早的版本,需要手动开启。 ``` --enable-chunked-prefill ``` diff --git a/docs/zh/best_practices/ERNIE-4.5-21B-A3B-Paddle.md b/docs/zh/best_practices/ERNIE-4.5-21B-A3B-Paddle.md index c6a3904bd..36ee050c2 100644 --- a/docs/zh/best_practices/ERNIE-4.5-21B-A3B-Paddle.md +++ b/docs/zh/best_practices/ERNIE-4.5-21B-A3B-Paddle.md @@ -19,23 +19,24 @@ ERNIE-4.5-21B-A3B 各量化精度,在下列硬件上部署所需要的最小 ### 1.2 安装fastdeploy - 安装,请参考[Fastdeploy Installation](../get_started/installation/README.md)完成安装。 -- 模型下载,请参考[支持模型列表](../supported_models.md)。**请注意使用Fastdeploy部署需要Paddle后缀的模型** +- 模型下载,请参考[支持模型列表](../supported_models.md)。 ## 二、如何使用 ### 2.1 基础:启动服务 通过下列命令启动服务 ```bash -export ENABLE_V1_KVCACHE_SCHEDULER=1 python -m fastdeploy.entrypoints.openai.api_server \ --model baidu/ERNIE-4.5-21B-A3B-Paddle \ --tensor-parallel-size 1 \ --quantization wint4 \ --max-model-len 32768 \ - --max-num-seqs 128 + --max-num-seqs 128 \ + --load_choices "default_v1" ``` 其中: - `--quantization`: 表示模型采用的量化策略。不同量化策略,模型的性能和精度也会不同。可选值包括:`wint8` / `wint4` / `block_wise_fp8`(需要Hopper架构)。 - `--max-model-len`:表示当前部署的服务所支持的最长Token数量。设置得越大,模型可支持的上下文长度也越大,但相应占用的显存也越多,可能影响并发数。 +- `--load_choices`: 表示loader的版本,"default_v1"表示启用v1版本的loader,具有更快的加载速度和更少的内存使用。 更多的参数含义与默认设置,请参见[FastDeploy参数说明](../parameters.md)。 @@ -43,16 +44,14 @@ python -m fastdeploy.entrypoints.openai.api_server \ #### 2.2.1 评估应用场景,正确设置参数 结合应用场景,评估平均输入长度、平均输出长度、最大上下文长度。例如,平均输入长度为1000,输出长度为30000,那么建议设置为 32768 - 根据最大上下文长度,设置`max-model-len` -- **启用服务管理全局 Block** -``` -export ENABLE_V1_KVCACHE_SCHEDULER=1 -``` #### 2.2.2 Prefix Caching **原理:** Prefix Caching的核心思想是通过缓存输入序列的中间计算结果(KV Cache),避免重复计算,从而加速具有相同前缀的多个请求的响应速度。具体参考[prefix-cache](../features/prefix_caching.md) **启用方式:** -在启动参数下增加下列两行,其中`--enable-prefix-caching`表示启用前缀缓存,`--swap-space`表示在GPU缓存的基础上,额外开启CPU缓存,大小为GB,应根据机器实际情况调整。建议取值为`(机器总内存 - 模型大小) * 20%`。如果因为其他程序占用内存等原因导致服务启动失败,可以尝试减小`--swap-space`的值。 +自2.2版本开始(包括develop分支),Prefix Caching已经默认开启。 + +对于2.1及更早的版本,需要手动开启。其中`--enable-prefix-caching`表示启用前缀缓存,`--swap-space`表示在GPU缓存的基础上,额外开启CPU缓存,大小为GB,应根据机器实际情况调整。建议取值为`(机器总内存 - 模型大小) * 20%`。如果因为其他程序占用内存等原因导致服务启动失败,可以尝试减小`--swap-space`的值。 ``` --enable-prefix-caching --swap-space 50 @@ -61,7 +60,10 @@ export ENABLE_V1_KVCACHE_SCHEDULER=1 #### 2.2.3 Chunked Prefill **原理:** 采用分块策略,将预填充(Prefill)阶段请求拆解为小规模子任务,与解码(Decode)请求混合批处理执行。可以更好地平衡计算密集型(Prefill)和访存密集型(Decode)操作,优化GPU资源利用率,减少单次Prefill的计算量和显存占用,从而降低显存峰值,避免显存不足的问题。 具体请参考[Chunked Prefill](../features/chunked_prefill.md) -**启用方式:** 在启动参数下增加即可 +**启用方式:** +自2.2版本开始(包括develop分支),Chunked Prefill已经默认开启。 + +对于2.1及更早的版本,需要手动开启。 ``` --enable-chunked-prefill ``` @@ -78,7 +80,9 @@ export ENABLE_V1_KVCACHE_SCHEDULER=1 注: 1. MTP当前暂不支持与Prefix Caching 、Chunked Prefill 、CUDAGraph同时使用。 -2. MTP当前暂不支持服务管理全局 Block, 即不要开启`export ENABLE_V1_KVCACHE_SCHEDULER=1` + - 需要通过指定`export FD_DISABLE_CHUNKED_PREFILL=1` 关闭Chunked Prefill。 + - 指定`speculative-config`时,会自动关闭Prefix Caching功能。 +2. MTP当前暂不支持服务管理全局 Block, 指定`speculative-config`时,会自动关闭全局Block调度器。 3. MTP当前暂不支持和拒绝采样同时使用,即不要开启`export FD_SAMPLING_CLASS=rejection` #### 2.2.5 CUDAGraph @@ -111,7 +115,6 @@ export FD_SAMPLING_CLASS=rejection # prefill export CUDA_VISIBLE_DEVICES=0,1,2,3 export INFERENCE_MSG_QUEUE_ID=1315 -export FLAGS_max_partition_size=2048 export FD_ATTENTION_BACKEND=FLASH_ATTN export FD_LOG_DIR="prefill_log" @@ -131,7 +134,6 @@ python -m fastdeploy.entrypoints.openai.api_server --model baidu/ERNIE-4.5-21B-A # decode export CUDA_VISIBLE_DEVICES=4,5,6,7 export INFERENCE_MSG_QUEUE_ID=1215 -export FLAGS_max_partition_size=2048 export FD_LOG_DIR="decode_log" quant_type=block_wise_fp8 diff --git a/docs/zh/best_practices/ERNIE-4.5-300B-A47B-Paddle.md b/docs/zh/best_practices/ERNIE-4.5-300B-A47B-Paddle.md index eeb3b4a81..37e1ad7a5 100644 --- a/docs/zh/best_practices/ERNIE-4.5-300B-A47B-Paddle.md +++ b/docs/zh/best_practices/ERNIE-4.5-300B-A47B-Paddle.md @@ -16,23 +16,24 @@ ERNIE-4.5-300B-A47B各量化精度,在下列硬件上部署所需要的最小 ### 1.2 安装fastdeploy - 安装,请参考[Fastdeploy Installation](../get_started/installation/README.md)完成安装。 -- 模型下载,请参考[支持模型列表](../supported_models.md)。**请注意使用Fastdeploy部署需要Paddle后缀的模型** +- 模型下载,请参考[支持模型列表](../supported_models.md)。 ## 二、如何使用 ### 2.1 基础:启动服务 通过下列命令启动服务 ```bash -export ENABLE_V1_KVCACHE_SCHEDULER=1 python -m fastdeploy.entrypoints.openai.api_server \ --model baidu/ERNIE-4.5-300B-A47B-Paddle \ --tensor-parallel-size 8 \ --quantization wint4 \ --max-model-len 32768 \ - --max-num-seqs 128 + --max-num-seqs 128 \ + --load_choices "default_v1" ``` 其中: - `--quantization`: 表示模型采用的量化策略。不同量化策略,模型的性能和精度也会不同。可选值包括:`wint8` / `wint4` / `block_wise_fp8`(需要Hopper架构)。 - `--max-model-len`:表示当前部署的服务所支持的最长Token数量。设置得越大,模型可支持的上下文长度也越大,但相应占用的显存也越多,可能影响并发数。 +- `--load_choices`: 表示loader的版本,"default_v1"表示启用v1版本的loader,具有更快的加载速度和更少的内存使用。 更多的参数含义与默认设置,请参见[FastDeploy参数说明](../parameters.md)。 @@ -40,17 +41,14 @@ python -m fastdeploy.entrypoints.openai.api_server \ #### 2.2.1 评估应用场景,正确设置参数 结合应用场景,评估平均输入长度、平均输出长度、最大上下文长度 - 根据最大上下文长度,设置`max-model-len`。例如,平均输入长度为1000,输出长度为30000,那么建议设置为 32768 -- **启用服务管理全局 Block** - -``` -export ENABLE_V1_KVCACHE_SCHEDULER=1 -``` #### 2.2.2 Prefix Caching **原理:** Prefix Caching的核心思想是通过缓存输入序列的中间计算结果(KV Cache),避免重复计算,从而加速具有相同前缀的多个请求的响应速度。具体参考[prefix-cache](../features/prefix_caching.md) **启用方式:** -在启动参数下增加下列两行,其中`--enable-prefix-caching`表示启用前缀缓存,`--swap-space`表示在GPU缓存的基础上,额外开启CPU缓存,大小为GB,应根据机器实际情况调整。建议取值为`(机器总内存 - 模型大小) * 20%`。如果因为其他程序占用内存等原因导致服务启动失败,可以尝试减小`--swap-space`的值。 +自2.2版本开始(包括develop分支),Prefix Caching已经默认开启。 + +对于2.1及更早的版本,需要手动开启。其中`--enable-prefix-caching`表示启用前缀缓存,`--swap-space`表示在GPU缓存的基础上,额外开启CPU缓存,大小为GB,应根据机器实际情况调整。建议取值为`(机器总内存 - 模型大小) * 20%`。如果因为其他程序占用内存等原因导致服务启动失败,可以尝试减小`--swap-space`的值。 ``` --enable-prefix-caching --swap-space 50 @@ -59,7 +57,10 @@ export ENABLE_V1_KVCACHE_SCHEDULER=1 #### 2.2.3 Chunked Prefill **原理:** 采用分块策略,将预填充(Prefill)阶段请求拆解为小规模子任务,与解码(Decode)请求混合批处理执行。可以更好地平衡计算密集型(Prefill)和访存密集型(Decode)操作,优化GPU资源利用率,减少单次Prefill的计算量和显存占用,从而降低显存峰值,避免显存不足的问题。 具体请参考[Chunked Prefill](../features/chunked_prefill.md) -**启用方式:** 在启动参数下增加即可 +**启用方式:** +自2.2版本开始(包括develop分支),Chunked Prefill已经默认开启。 + +对于2.1及更早的版本,需要手动开启。 ``` --enable-chunked-prefill ``` @@ -75,7 +76,9 @@ export ENABLE_V1_KVCACHE_SCHEDULER=1 ``` 注: 1. MTP当前暂不支持与Prefix Caching 、Chunked Prefill 、CUDAGraph同时使用。 -2. MTP当前暂不支持服务管理全局 Block, 即不要开启`export ENABLE_V1_KVCACHE_SCHEDULER=1` + - 需要通过指定`export FD_DISABLE_CHUNKED_PREFILL=1` 关闭Chunked Prefill。 + - 指定`speculative-config`时,会自动关闭Prefix Caching功能。 +2. MTP当前暂不支持服务管理全局 Block, 指定`speculative-config`时,会自动关闭全局Block调度器。 3. MTP当前暂不支持和拒绝采样同时使用,即不要开启`export FD_SAMPLING_CLASS=rejection` #### 2.2.5 W4A8C8量化 @@ -88,6 +91,9 @@ export ENABLE_V1_KVCACHE_SCHEDULER=1 --model baidu/ERNIE-4.5-300B-A47B-W4A8C8-TP4-Paddle ``` +注: +- W4A8C8量化的模型不支持通过`--load_choices "default_v1"`载入。 + #### 2.2.6 拒绝采样 **原理:** 拒绝采样即从一个易于采样的提议分布(proposal distribution)中生成样本,避免显式排序从而达到提升采样速度的效果,对小尺寸的模型有较明显的提升。 From 934071578a47581611c1626416029db03abdd9f6 Mon Sep 17 00:00:00 2001 From: ming1753 <61511741+ming1753@users.noreply.github.com> Date: Tue, 9 Sep 2025 09:50:45 +0800 Subject: [PATCH 13/36] [Docs] release 2.2.0 (#3991) --- docs/assets/images/favicon.ico | Bin 0 -> 4286 bytes docs/assets/images/logo.jpg | Bin 0 -> 13951 bytes .../ERNIE-4.5-VL-28B-A3B-Paddle.md | 25 +- .../ERNIE-4.5-VL-424B-A47B-Paddle.md | 22 +- docs/features/data_parallel_service.md | 151 ++++++++++++ docs/features/disaggregated.md | 16 +- docs/features/graph_optimization.md | 2 +- docs/features/images/no_scheduler_img.png | Bin 0 -> 121156 bytes docs/features/images/plas_inference_union.png | Bin 0 -> 34881 bytes .../features/images/plas_training_distill.png | Bin 0 -> 81681 bytes docs/features/images/scheduler_img.png | Bin 0 -> 107082 bytes docs/features/moba_sparse_attention.md | 31 --- docs/features/plas_attention.md | 219 +++++++++++++++++ docs/features/speculative_decoding.md | 13 - docs/features/structured_outputs.md | 62 +++++ docs/get_started/installation/Enflame_gcu.md | 2 +- .../get_started/installation/kunlunxin_xpu.md | 10 +- docs/get_started/installation/nvidia_gpu.md | 6 +- docs/get_started/quick_start_qwen.md | 99 ++++++++ docs/index.md | 40 +++- docs/online_serving/README.md | 6 - .../graceful_shutdown_service.md | 71 ++++++ .../images/graceful_shutdown.png | Bin 0 -> 184531 bytes docs/online_serving/metrics.md | 7 +- docs/parameters.md | 4 +- docs/quantization/images/wint2.png | Bin 0 -> 82801 bytes docs/quantization/wint2.md | 106 +++++++-- docs/quantization/wint2.png | Bin 0 -> 82801 bytes docs/supported_models.md | 61 +++-- docs/usage/kunlunxin_xpu_deployment.md | 2 +- .../ERNIE-4.5-VL-28B-A3B-Paddle.md | 24 +- .../ERNIE-4.5-VL-424B-A47B-Paddle.md | 19 +- docs/zh/features/data_parallel_service.md | 166 +++++++++++++ docs/zh/features/disaggregated.md | 17 +- docs/zh/features/images/no_scheduler_img.png | Bin 0 -> 121156 bytes .../features/images/plas_inference_union.png | Bin 0 -> 34881 bytes .../features/images/plas_training_distill.png | Bin 0 -> 81681 bytes docs/zh/features/images/scheduler_img.png | Bin 0 -> 107082 bytes docs/zh/features/plas_attention.md | 223 ++++++++++++++++++ docs/zh/features/sampling.md | 2 +- docs/zh/features/speculative_decoding.md | 8 - docs/zh/features/structured_outputs.md | 64 +++++ .../get_started/installation/kunlunxin_xpu.md | 10 +- .../zh/get_started/installation/nvidia_gpu.md | 6 +- docs/zh/get_started/quick_start_qwen.md | 93 ++++++++ docs/zh/index.md | 40 +++- docs/zh/offline_inference.md | 2 +- docs/zh/online_serving/README.md | 5 - .../graceful_shutdown_service.md | 71 ++++++ .../images/graceful_shutdown.png | Bin 0 -> 184531 bytes docs/zh/online_serving/metrics.md | 7 +- docs/zh/parameters.md | 4 +- docs/zh/quantization/images/wint2.png | Bin 0 -> 82801 bytes docs/zh/quantization/wint2.md | 100 +++++++- docs/zh/quantization/wint2.png | Bin 0 -> 82801 bytes docs/zh/supported_models.md | 59 +++-- docs/zh/usage/faq.md | 4 + docs/zh/usage/kunlunxin_xpu_deployment.md | 2 +- 58 files changed, 1622 insertions(+), 259 deletions(-) create mode 100644 docs/assets/images/favicon.ico create mode 100644 docs/assets/images/logo.jpg create mode 100644 docs/features/data_parallel_service.md create mode 100644 docs/features/images/no_scheduler_img.png create mode 100644 docs/features/images/plas_inference_union.png create mode 100644 docs/features/images/plas_training_distill.png create mode 100644 docs/features/images/scheduler_img.png delete mode 100644 docs/features/moba_sparse_attention.md create mode 100644 docs/features/plas_attention.md create mode 100644 docs/get_started/quick_start_qwen.md create mode 100644 docs/online_serving/graceful_shutdown_service.md create mode 100644 docs/online_serving/images/graceful_shutdown.png create mode 100644 docs/quantization/images/wint2.png create mode 100644 docs/quantization/wint2.png create mode 100644 docs/zh/features/data_parallel_service.md create mode 100644 docs/zh/features/images/no_scheduler_img.png create mode 100644 docs/zh/features/images/plas_inference_union.png create mode 100644 docs/zh/features/images/plas_training_distill.png create mode 100644 docs/zh/features/images/scheduler_img.png create mode 100644 docs/zh/features/plas_attention.md create mode 100644 docs/zh/get_started/quick_start_qwen.md create mode 100644 docs/zh/online_serving/graceful_shutdown_service.md create mode 100644 docs/zh/online_serving/images/graceful_shutdown.png create mode 100644 docs/zh/quantization/images/wint2.png create mode 100644 docs/zh/quantization/wint2.png create mode 100644 docs/zh/usage/faq.md diff --git a/docs/assets/images/favicon.ico b/docs/assets/images/favicon.ico new file mode 100644 index 0000000000000000000000000000000000000000..80cc3b06d4350abadd9008736b7e3fde3a4f3822 GIT binary patch literal 4286 zcmeHL>q`_-6rcWsKK0p;{RKTJ^HFLl3BE$p$}&N%l+uFC4;qvZM)V-0xAYQwAZZCb zv?4MhdJ-ZMp|$gLc6atQ&br&_-ZMI^`?@1Uec8L**_nHO=XdWt=XdVFaNIKTOH1SE zmFrv1aVt2ETS+<@;xb966@!!p{=WtsS!+OTYsJpzZD7`=R8xsqskWMl zwVPl4%O{}CdG-{OQ#sOt*r31zpS_lex3dPN{V;MGyaOCr$vGXFtHGH1f%utY?SEx{ zvw_DRBv_P$WxPZ>^1NOS=M+YMyja*2icFXB?m%!0DgzV zKx;zUy)72Mua59!CtRQR(LAD_L$gP`?ZiHi;E zI=Fkz#a)9~T?T!neG+**Lj&OK>IDDeL96?QhhUcIgEr&mG>F^FAx!ok4jLft zskU&I&&V?f1pD4biy~t4b|Sp`;+jhsHkeZVWkzl`){LNCG{^i)Z%@};{kqiW(-~^EkwJqgj$sw=Q%YE z_`D30GoNr5ZUnhyKk6bpHwQv_5!&?6A8`)n`O_wL(>f3evq9Wi1l}jZX!G3bi&dAfeBKpas zmZ+|L1NT8WxOWj3JwItJP`k9#tWVF~JElL?KB?tob1lUt)$IV4Xqmn@nSMFzK|Rp{ zVpSO%OLWKLqxBFD1~Ig*`Mf0ap*g25XSwcI;wBF(^bEcCa)@Gp$V^6zAK*+u=-M*g8$cC>5h*8c6hA;9rgZ0fsC+0RR91 literal 0 HcmV?d00001 diff --git a/docs/assets/images/logo.jpg b/docs/assets/images/logo.jpg new file mode 100644 index 0000000000000000000000000000000000000000..0a05d685b8b13e2118669386f964bffd08553939 GIT binary patch literal 13951 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 lG^(dKbriS_LX(KS;P5^B ⚠️ Precautions: -> - FastDeploy only supports models in Paddle format – please ensure to download models with the `-Paddle` file extension. -> - The model name will trigger an automatic download. If the model has already been downloaded, you can directly use the absolute path to the model's download location. - ## 2.How to Use ### 2.1 Basic: Launching the Service **Example 1:** Deploying a 32K Context Service on a Single RTX 4090 GPU ```shell -export ENABLE_V1_KVCACHE_SCHEDULER=1 python -m fastdeploy.entrypoints.openai.api_server \ --model baidu/ERNIE-4.5-VL-28B-A3B-Paddle \ --port 8180 \ @@ -38,14 +33,11 @@ python -m fastdeploy.entrypoints.openai.api_server \ --limit-mm-per-prompt '{"image": 100, "video": 100}' \ --reasoning-parser ernie-45-vl \ --gpu-memory-utilization 0.9 \ - --enable-chunked-prefill \ --max-num-batched-tokens 384 \ - --quantization wint4 \ - --enable-mm + --quantization wint4 ``` **Example 2:** Deploying a 128K Context Service on Dual H800 GPUs ```shell -export ENABLE_V1_KVCACHE_SCHEDULER=1 python -m fastdeploy.entrypoints.openai.api_server \ --model baidu/ERNIE-4.5-VL-28B-A3B-Paddle \ --port 8180 \ @@ -57,14 +49,10 @@ python -m fastdeploy.entrypoints.openai.api_server \ --limit-mm-per-prompt '{"image": 100, "video": 100}' \ --reasoning-parser ernie-45-vl \ --gpu-memory-utilization 0.9 \ - --enable-chunked-prefill \ --max-num-batched-tokens 384 \ - --quantization wint4 \ - --enable-mm + --quantization wint4 ``` -> ⚠️ For versions 2.1 and above, the new scheduler needs to be enabled via an environment variable `ENABLE_V1_KVCACHE_SCHEDULER=1`. Otherwise, some requests may be truncated before reaching the maximum length or return empty results. - An example is a set of configurations that can run stably while also delivering relatively good performance. If you have further requirements for precision or performance, please continue reading the content below. ### 2.2 Advanced: How to Achieve Better Performance @@ -92,8 +80,8 @@ An example is a set of configurations that can run stably while also delivering #### 2.2.2 Chunked Prefill - **Parameters:** `--enable-chunked-prefill` -- **Description:** Enabling `chunked prefill` can **reduce peak GPU memory usage** and **improve service throughput**. -- **Other relevant configurations**: +- **Description:** Enabling `chunked prefill` can reduce peak GPU memory usage and improve service throughput. Version 2.2 has **enabled by default**; for versions prior to 2.2, you need to enable it manually—refer to the best practices documentation for 2.1. +- **Relevant configurations**: `--max-num-batched-tokens`:Limit the maximum number of tokens per chunk, with a recommended setting of 384. @@ -115,12 +103,7 @@ An example is a set of configurations that can run stably while also delivering - **Description:** Rejection sampling involves generating samples from a proposal distribution that is easy to sample from, thereby avoiding explicit sorting and achieving an effect of improving sampling speed, which can enhance inference performance. - **Recommendation:** This is a relatively aggressive optimization strategy that affects the results, and we are still conducting comprehensive validation of its impact. If you have high performance requirements and can accept potential compromises in results, you may consider enabling this strategy. -> **Attention Hyperparameter:**`FLAGS_max_partition_size=1024` -- **Description:** The hyperparameters for the Append Attention (default) backend have been tested on commonly used datasets, and our results show that setting it to 1024 can significantly improve decoding speed, especially in long-text scenarios. -- **Recommendation:** In the future, it will be modified to an automatic adjustment mechanism. If you have high performance requirements, you may consider enabling it. - ## 3. FAQ -**Note:** Deploying multimodal services requires adding parameters to the configuration `--enable-mm`. ### 3.1 Out of Memory If the service prompts "Out of Memory" during startup, please try the following solutions: diff --git a/docs/best_practices/ERNIE-4.5-VL-424B-A47B-Paddle.md b/docs/best_practices/ERNIE-4.5-VL-424B-A47B-Paddle.md index 2741a417e..670438968 100644 --- a/docs/best_practices/ERNIE-4.5-VL-424B-A47B-Paddle.md +++ b/docs/best_practices/ERNIE-4.5-VL-424B-A47B-Paddle.md @@ -15,15 +15,10 @@ The minimum number of cards required for deployment on the following hardware is Installation process reference documentation [FastDeploy GPU Install](../get_started/installation/nvidia_gpu.md) -> ⚠️ Precautions: -> - FastDeploy only supports models in Paddle format – please ensure to download models with the `-Paddle` file extension. -> - The model name will trigger an automatic download. If the model has already been downloaded, you can directly use the absolute path to the model's download location. - ## 2.How to Use ### 2.1 Basic: Launching the Service **Example 1:** Deploying a 128K context service on 8x H800 GPUs. ```shell -export ENABLE_V1_KVCACHE_SCHEDULER=1 python -m fastdeploy.entrypoints.openai.api_server \ --model baidu/ERNIE-4.5-VL-424B-A47B-Paddle \ --port 8180 \ @@ -34,15 +29,11 @@ python -m fastdeploy.entrypoints.openai.api_server \ --max-num-seqs 16 \ --limit-mm-per-prompt '{"image": 100, "video": 100}' \ --reasoning-parser ernie-45-vl \ - --gpu-memory-utilization 0.8 \ - --enable-chunked-prefill \ + --gpu-memory-utilization 0.85 \ --max-num-batched-tokens 384 \ - --quantization wint4 \ - --enable-mm + --quantization wint4 ``` -> ⚠️ For versions 2.1 and above, the new scheduler needs to be enabled via an environment variable `ENABLE_V1_KVCACHE_SCHEDULER=1`. Otherwise, some requests may be truncated before reaching the maximum length or return empty results. - An example is a set of configurations that can run stably while also delivering relatively good performance. If you have further requirements for precision or performance, please continue reading the content below. ### 2.2 Advanced: How to Achieve Better Performance @@ -70,8 +61,8 @@ An example is a set of configurations that can run stably while also delivering #### 2.2.2 Chunked Prefill - **Parameters:** `--enable-chunked-prefill` -- **Description:** Enabling `chunked prefill` can **reduce peak GPU memory usage** and **improve service throughput**. -- **Other relevant configurations**: +- **Description:** Enabling `chunked prefill` can reduce peak GPU memory usage and improve service throughput. Version 2.2 has **enabled by default**; for versions prior to 2.2, you need to enable it manually—refer to the best practices documentation for 2.1. +- **Relevant configurations**: `--max-num-batched-tokens`:Limit the maximum number of tokens per chunk, with a recommended setting of 384. @@ -93,12 +84,7 @@ An example is a set of configurations that can run stably while also delivering - **Description:** Rejection sampling involves generating samples from a proposal distribution that is easy to sample from, thereby avoiding explicit sorting and achieving an effect of improving sampling speed, which can enhance inference performance. - **Recommendation:** This is a relatively aggressive optimization strategy that affects the results, and we are still conducting comprehensive validation of its impact. If you have high performance requirements and can accept potential compromises in results, you may consider enabling this strategy. -> **Attention Hyperparameter:**`FLAGS_max_partition_size=1024` -- **Description:** The hyperparameters for the Append Attention (default) backend have been tested on commonly used datasets, and our results show that setting it to 1024 can significantly improve decoding speed, especially in long-text scenarios. -- **Recommendation:** In the future, it will be modified to an automatic adjustment mechanism. If you have high performance requirements, you may consider enabling it. - ## 3. FAQ -**Note:** Deploying multimodal services requires adding parameters to the configuration `--enable-mm`. ### 3.1 Out of Memory If the service prompts "Out of Memory" during startup, please try the following solutions: diff --git a/docs/features/data_parallel_service.md b/docs/features/data_parallel_service.md new file mode 100644 index 000000000..f8b20dde9 --- /dev/null +++ b/docs/features/data_parallel_service.md @@ -0,0 +1,151 @@ +# Data Parallelism +Under the MOE model, enabling Expert Parallelism (EP) combined with Data Parallelism (DP), where EP distributes expert workloads and DP enables parallel request processing. + +## Data Distribution Strategy +FastDeploy uses the splitwise scheduler to monitor the load status of each DP node and distribute incoming data accordingly. + +The splitwise scheduler relies on Redis to store DP load status and distribute received data. + +### Expert Parallelism + Hybrid Deployment +FastDeploy provides the splitwise scheduler that monitors DP load status and schedules incoming data. +The scheduling flow is shown below - users randomly request IP and port, obtain load status via Redis, and data is distributed to less-loaded DPs for inference. +![Scheduling Architecture](./images/scheduler_img.png) + +#### Offline Inference +```python +prompts = [ + "Hello, my name is", + "你好,请问今天是星期", + "请写6个以数字开头的成语", + "写一个300字的小说大纲,内容是李白穿越到现代,最后成为公司文职人员的故事", + "我要采访一位科幻作家,创建一个包含5个问题的列表" +] + +sampling_params = SamplingParams(temperature=0.8, top_p=0.95, max_tokens=128) + +llm = LLM( + model="ERNIE-4_5-300B-A47B-FP8-Paddle", + tensor_parallel_size=1, + data_parallel_size=8, + max_model_len=8192, + num_gpu_blocks_override=1024, + engine_worker_queue_port="6077,6078,6079,6080,6081,6082,6083,6084", + enable_expert_parallel=True, + scheduler_name="splitwise", + scheduler_host="127.0.0.1", + scheduler_topic="test", + scheduler_port=6379 +) +outputs = llm.generate(prompts, sampling_params) + +for output in outputs: + prompt = output.prompt + generated_text = output.outputs.text + print("generated_text: ", generated_text) + print("\n") +``` + +#### Online Inference +```shell +python -m fastdeploy.entrypoints.openai.api_server \ + --model ERNIE-4_5-300B-A47B-FP8-Paddle \ + --port 8184 --metrics-port 8185 \ + --engine-worker-queue-port "6077,6078,6079,6080,6081,6082,6083,6084" \ + --data-parallel-size 8 --tensor-parallel-size 1\ + --enable-expert-parallel \ + --scheduler-name "splitwise" \ + --scheduler-host "127.0.0.1" \ + --scheduler-port 6379 \ + --scheduler-topic "test" \ + --scheduler-ttl 9000 +``` + +### User-Managed Scheduling +FastDeploy provides multi_api_server, allowing users to launch multiple API servers and manually select DPs for requests. In this case, users can add their own load balancing models for scheduling. (Currently only supports online inference) + +#### Online Inference +![Scheduling Architecture](./images/no_scheduler_img.png) + +```shell +export FD_ENABLE_MULTI_API_SERVER=1 +python -m fastdeploy.entrypoints.openai.multi_api_server \ + --ports "1811,1822,1833,1844,1855,1866,1877,1888" \ + --num-servers 8 \ + --metrics-ports "3101,3201,3301,3401,3501,3601,3701,3801" \ + --args --model ERNIE-4_5-300B-A47B-FP8-Paddle \ + --engine-worker-queue-port "25611,25621,25631,25641,25651,25661,25671,25681" \ + --tensor-parallel-size 1 \ + --data-parallel-size 8 \ + --max-model-len 12288 \ + --max-num-seqs 64 \ + --num-gpu-blocks-override 256 \ + --enable-expert-parallel +``` + +### Parameter Description +- num-servers: Number of API servers to launch +- ports: Ports for API servers +- args: Arguments for API servers + +### Data Parallelism + Disaggregated Deployment +Refer to [Disaggregated Deployment](disaggregated.md#multi-machine-disaggregated-deployment) + +#### Online Inference +For multi-machine deployment, ensure network cards support RDMA and all cluster nodes are interconnected. + +**Note**: +* `KVCACHE_RDMA_NICS` specifies RDMA network cards for the current machine, multiple cards should be separated by commas. +* The repository provides an automatic RDMA network card detection script `bash scripts/get_rdma_nics.sh `, where can be `cpu` or `gpu`. + + +**Prefill Instance** +```bash +export FD_LOG_DIR="log_prefill" +export CUDA_VISIBLE_DEVICES=0,1,2,3,4,5,6,7 +echo "set RDMA NICS" +export $(bash scripts/get_rdma_nics.sh gpu) +echo "KVCACHE_RDMA_NICS ${KVCACHE_RDMA_NICS}" +python -m fastdeploy.entrypoints.openai.api_server \ + --model ERNIE-4_5-300B-A47B-FP8-Paddle \ + --port 8180 --metrics-port 8181 \ + --engine-worker-queue-port "25611,25621,25631,25641,25651,25661,25671,25681" \ + --cache-queue-port 8183 \ + --tensor-parallel-size 1 \ + --data-parallel-size 4 \ + --enable-expert-parallel \ + --cache-transfer-protocol "rdma,ipc" \ + --rdma-comm-ports "7671,7672,7673,7674,7675,7676,7677,7678" \ + --pd-comm-port "2334" \ + --splitwise-role "prefill" \ + --scheduler-name "splitwise" \ + --scheduler-host "127.0.0.1" \ + --scheduler-port 6379 \ + --scheduler-topic "test" \ + --scheduler-ttl 9000 +``` + +**Decode Instance** +```bash +export FD_LOG_DIR="log_decode" +export CUDA_VISIBLE_DEVICES=0,1,2,3,4,5,6,7 +echo "set RDMA NICS" +export $(bash scripts/get_rdma_nics.sh gpu) +echo "KVCACHE_RDMA_NICS ${KVCACHE_RDMA_NICS}" +python -m fastdeploy.entrypoints.openai.api_server \ + --model ERNIE-4_5-300B-A47B-FP8-Paddle \ + --port 8184 --metrics-port 8185 \ + --engine-worker-queue-port "25611,25621,25631,25641,25651,25661,25671,25681" \ + --cache-queue-port 8187 \ + --tensor-parallel-size 1 \ + --data-parallel-size 4 \ + --enable-expert-parallel \ + --scheduler-name "splitwise" \ + --cache-transfer-protocol "rdma,ipc" \ + --rdma-comm-ports "7671,7672,7673,7674,7675,7676,7677,7678" \ + --pd-comm-port "2334" \ + --scheduler-host "127.0.0.1" \ + --scheduler-port 6379 \ + --scheduler-ttl 9000 + --scheduler-topic "test" \ + --splitwise-role "decode" +``` \ No newline at end of file diff --git a/docs/features/disaggregated.md b/docs/features/disaggregated.md index e5e20dcae..5cc30d8e6 100644 --- a/docs/features/disaggregated.md +++ b/docs/features/disaggregated.md @@ -72,6 +72,11 @@ Refer to the example code `offline_disaggregated_demo.py` in the `fastdeploy/dem ### Multi-machine Disaggregated Deployment #### Prerequisite: Redis + +> **⚠️ NOTE** +> **Redis requirement: version 6.2.0 or higher** +> Versions below this may not support the required commands. +> * Installation via `conda` ```bash @@ -103,14 +108,17 @@ sudo systemctl start redis For multi-machine deployment, confirm that the NIC supports RDMA and that all nodes in the cluster have network connectivity. **Note**: -* `KVCACHE_RDMA_NICS` specifies the RDMA NICs of the current machine, with multiple NICs separated by commas. +* `KVCACHE_RDMA_NICS` specifies RDMA network cards for the current machine, multiple cards should be separated by commas. +* The repository provides an automatic RDMA network card detection script `bash scripts/get_rdma_nics.sh `, where can be `cpu` or `gpu`. **Prefill Instance** ```bash export FD_LOG_DIR="log_prefill" export CUDA_VISIBLE_DEVICES=0,1,2,3 -export KVCACHE_RDMA_NICS="mlx5_2,mlx5_3,mlx5_4,mlx5_5" +echo "set RDMA NICS" +export $(bash scripts/get_rdma_nics.sh gpu) +echo "KVCACHE_RDMA_NICS ${KVCACHE_RDMA_NICS}" python -m fastdeploy.entrypoints.openai.api_server \ --model ERNIE-4.5-300B-A47B-BF16 \ --port 8180 --metrics-port 8181 \ @@ -133,7 +141,9 @@ python -m fastdeploy.entrypoints.openai.api_server \ ```bash export FD_LOG_DIR="log_decode" export CUDA_VISIBLE_DEVICES=4,5,6,7 -export KVCACHE_RDMA_NICS="mlx5_2,mlx5_3,mlx5_4,mlx5_5" +echo "set RDMA NICS" +export $(bash scripts/get_rdma_nics.sh gpu) +echo "KVCACHE_RDMA_NICS ${KVCACHE_RDMA_NICS}" python -m fastdeploy.entrypoints.openai.api_server \ --model ERNIE-4.5-300B-A47B-BF16 \ --port 8184 --metrics-port 8185 \ diff --git a/docs/features/graph_optimization.md b/docs/features/graph_optimization.md index ff335b66b..09d93f105 100644 --- a/docs/features/graph_optimization.md +++ b/docs/features/graph_optimization.md @@ -44,7 +44,7 @@ CudaGrpah can be enabled by setting `--use-cudagraph` or `--graph-optimization-c The `graph_opt_level` parameter within `--graph-optimization-config` is used to configure the graph optimization level, with the following available options: + `0`: Use Dynamic compute graph, default to 0 + `1`: Use Static compute graph, during the initialization phase, Paddle API will be used to convert the dynamic image into a static image -+ `2`: Base on Static compute graph, use the complier(CINN, Compiler Infrastructure for Neural Networks) of Paddle to compile and optimize ++ `2`: Base on Static compute graph, use the compiler(CINN, Compiler Infrastructure for Neural Networks) of Paddle to compile and optimize In general, static graphs have lower Kernel Launch overhead than dynamic graphs, and it is recommended to use static graphs. For adapted models, FastDeploy's CudaGraph *can support both dynamic and static graphs* simultaneously. diff --git a/docs/features/images/no_scheduler_img.png b/docs/features/images/no_scheduler_img.png new file mode 100644 index 0000000000000000000000000000000000000000..c0eb505b93a758f85f638506a745a26876a8af90 GIT binary patch literal 121156 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 literal 0 HcmV?d00001 diff --git a/docs/features/images/plas_training_distill.png b/docs/features/images/plas_training_distill.png new file mode 100644 index 0000000000000000000000000000000000000000..7b1996bfe9ca18474d526edb922c0d40e3a4ca3f GIT binary patch literal 81681 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�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 ^q0(Orye3i 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 IkDK`Xf8+ID3;+NC literal 0 HcmV?d00001 diff --git a/docs/features/moba_sparse_attention.md b/docs/features/moba_sparse_attention.md deleted file mode 100644 index 8004bf4ac..000000000 --- a/docs/features/moba_sparse_attention.md +++ /dev/null @@ -1,31 +0,0 @@ -# moba_sparse_attention - -## Introduction - -We propose Lite MoBA and improve it based on MoBA. Specifically, we still draw on the MoE structure to divide KV into multiple blocks, introduce a learnable MLP layer to adaptively select important blocks. We use Full Attention's 1D Max Pooling Attention Map as Ground Truth. Then, we employ KLDivLoss to distill and train the MLP layer weights. Lite MoBA can be directly applied to post - training, where only the weights of the MLP are learnable and the weights of the original model remain unchanged. - -Compared to NSA or MoBA, our Lite MoBA is more scalable and pluggable, without the need to change traditional attention architectures or interfere with model weight training in the Pre - training and Post - training stages. It only requires a small amount of training on the MLP layer in the final stage of the model to achieve almost lossless accuracy. Since MoBA updates the weights of the entire model, even when Full Attention is automatically invoked for inputs shorter than BlockSize x BlockNum, it still cannot avoid the impact of model updates on the model's effectiveness in text processing. In contrast, our pluggable Lite MoBA can achieve Full Attention that is truly equivalent to that of the original model in short text scenarios. - -Compared with MoBA, in terms of effectiveness, its use of Average Pooling to represent inter - block relationships appears relatively limited and has poor handling of outlier representations. Our ablation experiments also demonstrated that the effectiveness of Average Pooling is inferior to that of the learnable MLP. In terms of training performance, since only the MLP weights need to be updated and the model weights do not need to be updated, a large amount of video memory will be saved during training (which needs to be tested). In terms of inference performance, when the input length is 128K, Block Size = 1024, and Block Num = 16, the performance is improved by 322% compared to Flash Attention 3. - -## Usage - -```bash -export FD_ATTENTION_BACKEND="MOBA_ATTN" - -python -m fastdeploy.entrypoints.openai.api_server - --model baidu/ERNIE-4.5-300B-A47B-Paddle \ - --port 8188 \ - --tensor-parallel-size 4 \ - --quantization wint4 \ - --enable-chunked-prefill \ - --max-num-batched-tokens 8192 \ - --max-model-len 131072 \ - --max-num-seqs 32 \ - --moba-attention-config '{"moba_encoder_top_k_left": 60, "moba_encoder_top_k_right": 80, "moba_decoder_top_k_left": 100, "moba_decoder_top_k_right": 120}' -``` -## Environmental Variables Description - -* Setting `FD_ATTENTION_BACKEND="MOBA_ATTN"` enables MOBA sparse attention. -* `moba_encoder_top_k_left=60, moba_encoder_top_k_right=80` indicates that the range of top - k is between 80 and 100 when the encoder is sparse. -* `moba_decoder_top_k_left=100, moba_decoder_top_k_right=100` indicates that the range of top - k is between 120 and 140 when the decoder is sparse. diff --git a/docs/features/plas_attention.md b/docs/features/plas_attention.md new file mode 100644 index 000000000..8384de3b5 --- /dev/null +++ b/docs/features/plas_attention.md @@ -0,0 +1,219 @@ +# PLAS + +## Introduction + +We propose **PLAS (Pluggable Lightweight Attention for Sparsity)**, an improvement over MoBA. Specifically, we adopt an MoE-inspired structure that partitions KV into multiple blocks and introduces a learnable MLP layer to adaptively select important blocks. PLAS can be directly applied during post-training, where only the MLP weights are learnable, and the original model weights remain unchanged. + +Compared to NSA/MoBA, our PLAS offers greater scalability and pluggability. It does not require modifying the traditional attention architecture or interfering with model weight training during pre-training or post-training. Only a small amount of training for the MLP layer is needed at the final stage to achieve nearly lossless accuracy. Since NSA/MoBA updates the entire model weights, it inevitably affects performance on short texts—even though it automatically switches to full attention when the input length is shorter than BlockSize × Top-K. In contrast, our PLAS can achieve truly equivalent full attention to the original model in short-text scenarios. + +In terms of training efficiency, the training cost is very low because only the MLP weight needs to be updated. For inference performance, when the input length is 128K, Block Size = 128, and Top-K = 55, PLAS achieves a **386% speedup** compared to Flash Attention 3. + +## Method + +### Training + +Following the approaches of NSA and MoBA, we partition the KV into multiple blocks. During both the prefill and decode stages, instead of performing attention computation over all KV, we dynamically select the top-K blocks with the highest attention scores for each query token, thereby enabling efficient sparse attention computation. + +
    +Attention Gate Module +
    + +* **Attention Gate Module**: As illustrated in the figure above, to estimate the importance of each block with low computational overhead, we design a lightweight attention gate module. This module first compresses each K block via a MLP layer to generate a representative low-dimensional representation: $K_c^T=W_{kp}K^T$, where $W_{kp}$ denotes the MLP layer weights. Compared to directly applying mean pooling, the learnable MLP can more effectively capture semantic relationships and importance distributions among different tokens, thereby providing a refined representation of each block. After obtaining the compressed representation $K_c$, the importance of each query token with respect to each block is estimated via: $Softmax(Q\cdot K_c^T)$. To enhance the discriminative ability of the MLP layer, we use the full attention result after 1D max pooling $1DMaxPooling(Softmax(Q \cdot K^T))$ as the ground truth. By minimizing the distribution divergence between the two, the MLP layer is guided to learn feature representations that better align with the true attention distribution. +* **Training Data**: Benefiting from the efficiency of both the model architecture and the training paradigm, our approach achieves near-lossless precision with only 1B tokens used for training. The training data is sourced from an internally constructed mixed corpus containing both long and short texts, thereby enhancing the module’s adaptability to varying sequence lengths. +* **Other**: We observe that the final decode layer has a significant impact on the overall model accuracy. Therefore, during training, we exclude this layer from sparse attention computation and revert to full attention for this layer during inference. + +### Inference + +During sparse attention computation, each query token may dynamically select different KV blocks, leading to highly irregular memory access patterns in HBM. It is feasible to simply process each query token separately, but it will lead to excessively fine-grained computing, which cannot make full use of the tensor core, thus significantly reducing the GPU computing efficiency. + +
    +Token/Head Union +
    + +To optimize performance in both the prefill and decode stages, we design a special joint strategy to adapt to their respective characteristics: + +* **Prefill Toke Union**: We observe that adjacent query tokens tend to select similar key blocks. Leveraging this locality, we take the union of the key blocks selected by consecutive 128 query tokens and jointly compute sparse attention for these tokens. +* **Decode Head Union**: Given the widespread adoption of GQA in modern models, we find that different heads within the same group often select overlapping key blocks. Thus, we combine the key blocks selected by all query heads within a group into a unified set and jointly calculate sparse attention. This way also reduces memory access overhead and further improves decoding efficiency. +* **Top-K Selection**: Conventional top-k algorithms based on sorting or direct calls to the cub library introduce significant runtime overhead. To mitigate this, we implemented an approximate top-k selection algorithm using binary search, which significantly reduces latency while maintaining accuracy, ultimately achieving significantly improved performance. + +## Evaluation + +### Experiments + +We evaluated the precision of full attention and sparse attention on LongBenchV2 and Ruler (with context lengths of 32K, 64K, and 128K). + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + Model + + Precision +
    + FullAttention + + SparseAttention +
    + LongBenchV2 + + Ruler + + LongBenchV2 + + Ruler +
    + 32K + + 64K + + 128K + + 32K + + 64K + + 128K +
    + ERNIE-4.5-21B-A3B + 31.4876.7456.4025.4831.4575.9355.3825.05
    + ERNIE-4.5-300B-A47B + 41.0294.7083.5658.1841.0594.5082.3257.85
    + +### Performance + +We selected a subset (longbook_sum_eng) from InfiniteBench as the performance evaluation dataset. For inputs exceeding 128K in length, we truncate the sequence by keeping the first 64K and the last 64K tokens. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    QPSDecode Speed (token/s)Time to First token(s)Time per Ouput Token(ms)End-to-End Latency(s)Mean Input
    Length
    Mean Output Length
    + ERNIE-4.5-21B-A3B + + FullAttention + 0.10113.328.08287.0561.400113182.32627.76
    + SparseAttention + 0.150(+48%)18.12(+36%)5.466(-48%)66.35(-31%)42.157(-46%)113182.32590.23
    + ERNIE-4.5-300B-A47B + + FullAttention + 0.0665.0713.812206.70164.704113182.32725.97
    + SparseAttention + 0.081(+23%)6.75(+33%)10.584(-30%)154.84(-34%)132.745(-24%)113182.32748.25
    + +## Usage + +``` +export FD_ATTENTION_BACKEND="MOBA_ATTN" + +python -m fastdeploy.entrypoints.openai.api_server + --model baidu/ERNIE-4.5-300B-A47B-Paddle \ + --port 8188 \ + --tensor-parallel-size 4 \ + --quantization wint4 \ + --enable-chunked-prefill \ + --max-num-batched-tokens 8192 \ + --max-model-len 131072 \ + --max-num-seqs 32 \ + --moba-attention-config '{"moba_encoder_top_k_left": 50, "moba_encoder_top_k_right": 60, "moba_decoder_top_k_left": 100, "moba_decoder_top_k_right": 120}' +``` + +**Note**: If sparse attention is enabled, the system will automatically load the MLP weights from `moba_mlp_weight.safetensors` in the weight directory. If the MLP weight file is not found, mean pooling will be applied to the key representations. + +**Parameter Description:** + +* Setting `FD_ATTENTION_BACKEND="MOBA_ATTN"` enables MOBA sparse attention. +* `moba_encoder_top_k_left=50, moba_encoder_top_k_right=60` indicates that the range of top-k is between 50 and 60 when the encoder is sparse. +* `moba_decoder_top_k_left=100, moba_decoder_top_k_right=120` indicates that the range of top-k is between 100 and 120 when the decoder is sparse. diff --git a/docs/features/speculative_decoding.md b/docs/features/speculative_decoding.md index 2239c8758..4093dcca5 100644 --- a/docs/features/speculative_decoding.md +++ b/docs/features/speculative_decoding.md @@ -18,13 +18,6 @@ This project implements an efficient **Speculative Decoding** inference framewor - ⏳ Coming Soon: Support Chunk-prefill - ⏳ Coming Soon: Multi-layer MTP Layer -- **Decoding with Hybrid MTP and Ngram Methods(Hybrid-MTP-with-Ngram)** - - - Overview: A hybrid method combining MTP and Ngram. First, MTP generates N draft tokens, then Ngram matching is used to supplement additional draft tokens. - - - Use Cases: Suitable when higher draft token coverage is required, leveraging both MTP’s generation capability and the efficiency of Ngram matching. - - --- ### Coming Soon @@ -139,13 +132,7 @@ python -m fastdeploy.entrypoints.openai.api_server \ --scheduler-password "scheduler_mtp" \ --speculative-config '{"method": "mtp", "num_speculative_tokens": 1, "model": "${path_to_mtp_model}"}' & ``` -## Decoding with Hybrid MTP and Ngram Methods -When starting the service, you only need to modify the --speculative-config option. -For example, use MTP to generate two draft tokens, and then append three additional draft tokens from Ngram matching: -``` ---speculative-config '{"method": "mtp", "num_model_steps": 2, "mtp_strategy": "with_ngram", "num_speculative_tokens": 5, "model": "'$model_path'/mtp"}' -``` ## 🧠 Using Ngram-Based Decoding This method uses an n-gram sliding window to match the prompt and generated tokens to predict draft tokens. It is particularly effective in scenarios with high input-output overlap (e.g., code completion, document search). diff --git a/docs/features/structured_outputs.md b/docs/features/structured_outputs.md index 40e177c1c..f7ee424cb 100644 --- a/docs/features/structured_outputs.md +++ b/docs/features/structured_outputs.md @@ -330,3 +330,65 @@ ParsedChatCompletionMessage[Info](content='{"addr": "No.1 Century Avenue, Pudong Address: No.1 Century Avenue, Pudong New Area, Shanghai Height: 468 ``` + +### Offline Inference + +Offline inference allows restricting the model's output format by pre-specified constraints. In `FastDeploy`, constraints can be specified through the `GuidedDecodingParams` class in `SamplingParams`. `GuidedDecodingParams` supports the following constraint types, with usage similar to online inference: + +```python +json: Optional[Union[str, dict]] = None +regex: Optional[str] = None +choice: Optional[List[str]] = None +grammar: Optional[str] = None +json_object: Optional[bool] = None +structural_tag: Optional[str] = None +``` + +The following example demonstrates how to use offline inference to generate a structured json: + +```python +from fastdeploy import LLM, SamplingParams +from fastdeploy.engine.sampling_params import GuidedDecodingParams +from pydantic import BaseModel +from enum import Enum + +class BookType(str, Enum): + romance = "Romance" + historical = "Historical" + adventure = "Adventure" + mystery = "Mystery" + dystopian = "Dystopian" + +class BookDescription(BaseModel): + author: str + title: str + genre: BookType + +# Constrained decoding parameters +guided_decoding_params = GuidedDecodingParams(json=BookDescription.model_json_schema()) + +# Sampling parameters +sampling_params = SamplingParams( + top_p=0.95, + max_tokens=6400, + guided_decoding=guided_decoding_params, +) + +# Load model +llm = LLM(model="ERNIE-4.5-0.3B", tensor_parallel_size=1, max_model_len=8192, guided_decoding_backend="auto") + +outputs = llm.generate( + prompts="Generate a JSON describing a literary work, including author, title and book type.", + sampling_params=sampling_params, +) + +# Output results +for output in outputs: + print(output.outputs.text) +``` + +Output: + +``` +{"author": "George Orwell", "title": "1984", "genre": "Dystopian"} +``` diff --git a/docs/get_started/installation/Enflame_gcu.md b/docs/get_started/installation/Enflame_gcu.md index e443a7ce3..1801cf6d0 100644 --- a/docs/get_started/installation/Enflame_gcu.md +++ b/docs/get_started/installation/Enflame_gcu.md @@ -62,7 +62,7 @@ python -m pip install paddlepaddle==3.1.1 -i https://www.paddlepaddle.org.cn/pac python -m pip install paddle-custom-gcu==3.1.1 -i https://www.paddlepaddle.org.cn/packages/stable/gcu/ # For source compilation, refer to: https://github.com/PaddlePaddle/PaddleCustomDevice/blob/develop/backends/gcu/README_cn.md ``` -For latest paddle verion on iluvatar. Refer to [PaddlePaddle Installation](https://www.paddlepaddle.org.cn/) +For latest paddle version on iluvatar. Refer to [PaddlePaddle Installation](https://www.paddlepaddle.org.cn/) 6. Install FastDeploy and dependencies ```bash diff --git a/docs/get_started/installation/kunlunxin_xpu.md b/docs/get_started/installation/kunlunxin_xpu.md index aeaae3bac..81356d759 100644 --- a/docs/get_started/installation/kunlunxin_xpu.md +++ b/docs/get_started/installation/kunlunxin_xpu.md @@ -25,9 +25,9 @@ Verified platform: ```bash mkdir Work cd Work -docker pull ccr-2vdh3abv-pub.cnc.bj.baidubce.com/paddlepaddle/fastdeploy-xpu:2.1.0 +docker pull ccr-2vdh3abv-pub.cnc.bj.baidubce.com/paddlepaddle/fastdeploy-xpu:2.2.0 docker run --name fastdeploy-xpu --net=host -itd --privileged -v $PWD:/Work -w /Work \ - ccr-2vdh3abv-pub.cnc.bj.baidubce.com/paddlepaddle/fastdeploy-xpu:2.1.0 \ + ccr-2vdh3abv-pub.cnc.bj.baidubce.com/paddlepaddle/fastdeploy-xpu:2.2.0 \ /bin/bash docker exec -it fastdeploy-xpu /bin/bash ``` @@ -37,7 +37,7 @@ docker exec -it fastdeploy-xpu /bin/bash ### Install PaddlePaddle ```bash -python -m pip install paddlepaddle-xpu==3.1.1 -i https://www.paddlepaddle.org.cn/packages/stable/xpu-p800/ +python -m pip install paddlepaddle-xpu==3.2.0 -i https://www.paddlepaddle.org.cn/packages/stable/xpu-p800/ ``` Alternatively, you can install the latest version of PaddlePaddle (Not recommended) @@ -49,7 +49,7 @@ python -m pip install --pre paddlepaddle-xpu -i https://www.paddlepaddle.org.cn/ ### Install FastDeploy (**Do NOT install via PyPI source**) ```bash -python -m pip install fastdeploy-xpu==2.1.0 -i https://www.paddlepaddle.org.cn/packages/stable/fastdeploy-xpu-p800/ --extra-index-url https://mirrors.tuna.tsinghua.edu.cn/pypi/web/simple +python -m pip install fastdeploy-xpu==2.2.0 -i https://www.paddlepaddle.org.cn/packages/stable/fastdeploy-xpu-p800/ --extra-index-url https://mirrors.tuna.tsinghua.edu.cn/pypi/web/simple ``` Alternatively, you can install the latest version of FastDeploy (Not recommended) @@ -63,7 +63,7 @@ python -m pip install --pre fastdeploy-xpu -i https://www.paddlepaddle.org.cn/pa ### Install PaddlePaddle ```bash -python -m pip install paddlepaddle-xpu==3.1.1 -i https://www.paddlepaddle.org.cn/packages/stable/xpu-p800/ +python -m pip install paddlepaddle-xpu==3.2.0 -i https://www.paddlepaddle.org.cn/packages/stable/xpu-p800/ ``` Alternatively, you can install the latest version of PaddlePaddle (Not recommended) diff --git a/docs/get_started/installation/nvidia_gpu.md b/docs/get_started/installation/nvidia_gpu.md index 381a2de0a..706162151 100644 --- a/docs/get_started/installation/nvidia_gpu.md +++ b/docs/get_started/installation/nvidia_gpu.md @@ -13,14 +13,14 @@ The following installation methods are available when your environment meets the **Notice**: The pre-built image only supports SM80/90 GPU(e.g. H800/A800),if you are deploying on SM86/89GPU(L40/4090/L20), please reinstall ```fastdpeloy-gpu``` after you create the container. ```shell -docker pull ccr-2vdh3abv-pub.cnc.bj.baidubce.com/paddlepaddle/fastdeploy-cuda-12.6:2.1.0 +docker pull ccr-2vdh3abv-pub.cnc.bj.baidubce.com/paddlepaddle/fastdeploy-cuda-12.6:2.2.0 ``` ## 2. Pre-built Pip Installation First install paddlepaddle-gpu. For detailed instructions, refer to [PaddlePaddle Installation](https://www.paddlepaddle.org.cn/en/install/quick?docurl=/documentation/docs/en/develop/install/pip/linux-pip_en.html) ```shell -python -m pip install paddlepaddle-gpu==3.1.1 -i https://www.paddlepaddle.org.cn/packages/stable/cu126/ +python -m pip install paddlepaddle-gpu==3.2.0 -i https://www.paddlepaddle.org.cn/packages/stable/cu126/ ``` Then install fastdeploy. **Do not install from PyPI**. Use the following methods instead: @@ -58,7 +58,7 @@ docker build -f dockerfiles/Dockerfile.gpu -t fastdeploy:gpu . First install paddlepaddle-gpu. For detailed instructions, refer to [PaddlePaddle Installation](https://www.paddlepaddle.org.cn/en/install/quick?docurl=/documentation/docs/en/develop/install/pip/linux-pip_en.html) ```shell -python -m pip install paddlepaddle-gpu==3.1.1 -i https://www.paddlepaddle.org.cn/packages/stable/cu126/ +python -m pip install paddlepaddle-gpu==3.2.0 -i https://www.paddlepaddle.org.cn/packages/stable/cu126/ ``` Then clone the source code and build: diff --git a/docs/get_started/quick_start_qwen.md b/docs/get_started/quick_start_qwen.md new file mode 100644 index 000000000..95a31d716 --- /dev/null +++ b/docs/get_started/quick_start_qwen.md @@ -0,0 +1,99 @@ +# Deploy QWEN3-0.6b in 10 Minutes + +Before deployment, ensure your environment meets the following requirements: + +- GPU Driver ≥ 535 +- CUDA ≥ 12.3 +- cuDNN ≥ 9.5 +- Linux X86_64 +- Python ≥ 3.10 + +This guide uses the lightweight QWEN3-0.6b model for demonstration, which can be deployed on most hardware configurations. Docker deployment is recommended. + +For more information about how to install FastDeploy, refer to the [installation document](installation/README.md). + +## 1. Launch Service +After installing FastDeploy, execute the following command in the terminal to start the service. For the configuration method of the startup command, refer to [Parameter Description](../parameters.md) + +> ⚠️ **Note:** +> When using HuggingFace models (torch format), you need to enable `--load_choices "default_v1"`. + +``` +export ENABLE_V1_KVCACHE_SCHEDULER=1 +python -m fastdeploy.entrypoints.openai.api_server \ + --model Qwen/QWEN3-0.6b \ + --port 8180 \ + --metrics-port 8181 \ + --engine-worker-queue-port 8182 \ + --max-model-len 32768 \ + --max-num-seqs 32 \ + --load_choices "default_v1" +``` + +> 💡 Note: In the path specified by ```--model```, if the subdirectory corresponding to the path does not exist in the current directory, it will try to query whether AIStudio has a preset model based on the specified model name (such as ```Qwen/QWEN3-0.6b```). If it exists, it will automatically start downloading. The default download path is: ```~/xx```. For instructions and configuration on automatic model download, see [Model Download](../supported_models.md). +```--max-model-len``` indicates the maximum number of tokens supported by the currently deployed service. +```--max-num-seqs``` indicates the maximum number of concurrent processing supported by the currently deployed service. + +**Related Documents** +- [Service Deployment](../online_serving/README.md) +- [Service Monitoring](../online_serving/metrics.md) + +## 2. Request the Service +After starting the service, the following output indicates successful initialization: + +```shell +api_server.py[line:91] Launching metrics service at http://0.0.0.0:8181/metrics +api_server.py[line:94] Launching chat completion service at http://0.0.0.0:8180/v1/chat/completions +api_server.py[line:97] Launching completion service at http://0.0.0.0:8180/v1/completions +INFO: Started server process [13909] +INFO: Waiting for application startup. +INFO: Application startup complete. +INFO: Uvicorn running on http://0.0.0.0:8180 (Press CTRL+C to quit) +``` + +### Health Check + +Verify service status (HTTP 200 indicates success): + +```shell +curl -i http://0.0.0.0:8180/health +``` + +### cURL Request + +Send requests to the service with the following command: + +```shell +curl -X POST "http://0.0.0.0:1822/v1/chat/completions" \ +-H "Content-Type: application/json" \ +-d '{ + "messages": [ + {"role": "user", "content": "Write me a poem about large language model."} + ], + "stream": true +}' +``` + +### Python Client (OpenAI-compatible API) + +FastDeploy's API is OpenAI-compatible. You can also use Python for requests: + +```python +import openai +host = "0.0.0.0" +port = "8180" +client = openai.Client(base_url=f"http://{host}:{port}/v1", api_key="null") + +response = client.chat.completions.create( + model="null", + messages=[ + {"role": "system", "content": "I'm a helpful AI assistant."}, + {"role": "user", "content": "Write me a poem about large language model."}, + ], + stream=True, +) +for chunk in response: + if chunk.choices[0].delta: + print(chunk.choices[0].delta.content, end='') +print('\n') +``` diff --git a/docs/index.md b/docs/index.md index b1e3c336f..d991b2f93 100644 --- a/docs/index.md +++ b/docs/index.md @@ -11,15 +11,39 @@ ## Supported Models -| Model | Data Type | PD Disaggregation | Chunked Prefill | Prefix Caching | MTP | CUDA Graph | Maximum Context Length | +| Model | Data Type |[PD Disaggregation](./features/disaggregated.md) | [Chunked Prefill](./features/chunked_prefill.md) | [Prefix Caching](./features/prefix_caching.md) | [MTP](./features/speculative_decoding.md) | [CUDA Graph](./features/graph_optimization.md) | Maximum Context Length | |:--- | :------- | :---------- | :-------- | :-------- | :----- | :----- | :----- | -|ERNIE-4.5-300B-A47B | BF16/WINT4/WINT8/W4A8C8/WINT2/FP8 | ✅| ✅ | ✅|✅| WIP |128K | -|ERNIE-4.5-300B-A47B-Base| BF16/WINT4/WINT8 | ✅| ✅ | ✅|❌| WIP | 128K | -|ERNIE-4.5-VL-424B-A47B | BF16/WINT4/WINT8 | WIP | ✅ | WIP | ❌ | WIP |128K | -|ERNIE-4.5-VL-28B-A3B | BF16/WINT4/WINT8 | ❌ | ✅ | WIP | ❌ | WIP |128K | -|ERNIE-4.5-21B-A3B | BF16/WINT4/WINT8/FP8 | ❌ | ✅ | ✅ | ✅ | ✅|128K | -|ERNIE-4.5-21B-A3B-Base | BF16/WINT4/WINT8/FP8 | ❌ | ✅ | ✅ | ❌ | ✅|128K | -|ERNIE-4.5-0.3B | BF16/WINT8/FP8 | ❌ | ✅ | ✅ | ❌ | ✅| 128K | +|ERNIE-4.5-300B-A47B|BF16\WINT4\WINT8\W4A8C8\WINT2\FP8|✅|✅|✅|✅|✅|128K| +|ERNIE-4.5-300B-A47B-Base|BF16/WINT4/WINT8|✅|✅|✅|⛔|✅|128K| +|ERNIE-4.5-VL-424B-A47B|BF16/WINT4/WINT8|🚧|✅|🚧|⛔|🚧|128K| +|ERNIE-4.5-VL-28B-A3B|BF16/WINT4/WINT8|⛔|✅|🚧|⛔|🚧|128K| +|ERNIE-4.5-21B-A3B|BF16/WINT4/WINT8/FP8|⛔|✅|✅|✅|✅|128K| +|ERNIE-4.5-21B-A3B-Base|BF16/WINT4/WINT8/FP8|⛔|✅|✅|⛔|✅|128K| +|ERNIE-4.5-0.3B|BF16/WINT8/FP8|⛔|✅|✅|⛔|✅|128K| +|QWEN3-MOE|BF16/WINT4/WINT8/FP8|⛔|✅|✅|🚧|✅|128K| +|QWEN3|BF16/WINT8/FP8|⛔|✅|✅|🚧|✅|128K| +|QWEN-VL|BF16/WINT8/FP8|⛔|✅|✅|🚧|⛔|128K| +|QWEN2|BF16/WINT8/FP8|⛔|✅|✅|🚧|✅|128K| +|DEEPSEEK-V3|BF16/WINT4|⛔|✅|🚧|🚧|✅|128K| +|DEEPSEEK-R1|BF16/WINT4|⛔|✅|🚧|🚧|✅|128K| + +``` +✅ Supported 🚧 In Progress ⛔ No Plan +``` + +## Supported Hardware + +| Model | [NVIDIA GPU](./get_started/installation/nvidia_gpu.md) |[Kunlunxin XPU](./get_started/installation/kunlunxin_xpu.md) | Ascend NPU | [Hygon DCU](./get_started/installation/hygon_dcu.md) | [Iluvatar GPU](./get_started/installation/iluvatar_gpu.md) | [MetaX GPU](./get_started/installation/metax_gpu.md.md) | [Enflame GCU](./get_started/installation/Enflame_gcu.md) | +|:------|---------|------------|----------|-------------|-----------|-------------|-------------| +| ERNIE4.5-VL-424B-A47B | ✅ | 🚧 | 🚧 | ⛔ | ⛔ | ⛔ | ⛔ | +| ERNIE4.5-300B-A47B | ✅ | ✅ | 🚧 | ✅ | ✅ | 🚧 | ✅ | +| ERNIE4.5-VL-28B-A3B | ✅ | 🚧 | 🚧 | ⛔ | 🚧 | ⛔ | ⛔ | +| ERNIE4.5-21B-A3B | ✅ | ✅ | 🚧 | ✅ | ✅ | ✅ | ✅ | +| ERNIE4.5-0.3B | ✅ | ✅ | 🚧 | ✅ | ✅ | ✅ | ✅ | + +``` +✅ Supported 🚧 In Progress ⛔ No Plan +``` ## Documentation diff --git a/docs/online_serving/README.md b/docs/online_serving/README.md index 178393489..c00b62e31 100644 --- a/docs/online_serving/README.md +++ b/docs/online_serving/README.md @@ -192,9 +192,6 @@ return_token_ids: Optional[bool] = None prompt_token_ids: Optional[List[int]] = None # Directly passes the token ID list of the prompt, skipping the text encoding step (default None means using text input). -max_streaming_response_tokens: Optional[int] = None -# Maximum number of tokens returned at a time during streaming output (default None means no limit). - disable_chat_template: Optional[bool] = False # Whether to disable chat template rendering, using raw input directly (default False means template is enabled). @@ -369,9 +366,6 @@ return_token_ids: Optional[bool] = None prompt_token_ids: Optional[List[int]] = None # Directly passes the token ID list of the prompt, skipping the text encoding step (default None means using text input). - -max_streaming_response_tokens: Optional[int] = None -# Maximum number of tokens returned at a time during streaming output (default None means no limit). ``` ### Overview of Return Parameters diff --git a/docs/online_serving/graceful_shutdown_service.md b/docs/online_serving/graceful_shutdown_service.md new file mode 100644 index 000000000..ea1b13e12 --- /dev/null +++ b/docs/online_serving/graceful_shutdown_service.md @@ -0,0 +1,71 @@ +# Graceful Service Node Shutdown Solution + +## 1. Core Objective +Achieve graceful shutdown of service nodes, ensuring no in-flight user requests are lost during service termination while maintaining overall cluster availability. + +## 2. Solution Overview +This solution combines **Nginx reverse proxy**, **Gunicorn server**, **Uvicorn server**, and **FastAPI** working in collaboration to achieve the objective. + +![graceful_shutdown](images/graceful_shutdown.png) + +## 3. Component Introduction + +### 1. Nginx: Traffic Entry Point and Load Balancer +- **Functions**: + - Acts as a reverse proxy, receiving all external client requests and distributing them to upstream Gunicorn worker nodes according to load balancing policies. + - Actively monitors backend node health status through health check mechanisms. + - Enables instantaneous removal of problematic nodes from the service pool through configuration management, achieving traffic switching. + +### 2. Gunicorn: WSGI HTTP Server (Process Manager) +- **Functions**: + - Serves as the master process, managing multiple Uvicorn worker child processes. + - Receives external signals (e.g., `SIGTERM`) and coordinates the graceful shutdown process for all child processes. + - Daemonizes worker processes and automatically restarts them upon abnormal termination, ensuring service robustness. + +### 3. Uvicorn: ASGI Server (Worker Process) +- **Functions**: + - Functions as a Gunicorn-managed worker, actually handling HTTP requests. + - Runs the FastAPI application instance, processing specific business logic. + - Implements the ASGI protocol, supporting asynchronous request processing for high performance. + +--- + +## Advantages + +1. **Nginx**: + - Can quickly isolate faulty nodes, ensuring overall service availability. + - Allows configuration updates without downtime using `nginx -s reload`, making it transparent to users. + +2. **Gunicorn** (Compared to Uvicorn's native multi-worker mode): + - **Mature Process Management**: Built-in comprehensive process spawning, recycling, and management logic, eliminating the need for custom implementation. + - **Process Daemon Capability**: The Gunicorn Master automatically forks new Workers if they crash, whereas in Uvicorn's `--workers` mode, any crashed process is not restarted and requires an external daemon. + - **Rich Configuration**: Offers numerous parameters for adjusting timeouts, number of workers, restart policies, etc. + +3. **Uvicorn**: + - Extremely fast, built on uvloop and httptools. + - Natively supports graceful shutdown: upon receiving a shutdown signal, it stops accepting new connections and waits for existing requests to complete before exiting. + +--- + +## Graceful Shutdown Procedure + +When a specific node needs to be taken offline, the steps are as follows: + +1. **Nginx Monitors Node Health Status**: + - Monitors the node's health status by periodically sending health check requests to it. + +2. **Removal from Load Balancing**: + - Modify the Nginx configuration to mark the target node as `down` and reload the Nginx configuration. + - Subsequently, all new requests will no longer be sent to the target node. + +3. **Gunicorn Server**: + - Monitors for stop signals. Upon receiving a stop signal (e.g., `SIGTERM`), it relays this signal to all Uvicorn child processes. + +4. **Sending the Stop Signal**: + - Send a `SIGTERM` signal to the Uvicorn process on the target node, triggering Uvicorn's graceful shutdown process. + +5. **Waiting for Request Processing**: + - Wait for a period slightly longer than `timeout_graceful_shutdown` before forcefully terminating the service, allowing the node sufficient time to complete processing all received requests. + +6. **Shutdown Completion**: + - The node has now processed all remaining requests and exited safely. diff --git a/docs/online_serving/images/graceful_shutdown.png b/docs/online_serving/images/graceful_shutdown.png new file mode 100644 index 0000000000000000000000000000000000000000..b08e56d473e95f369dbddcc0a5e57e905aee58ae GIT binary patch literal 184531 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 z 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

    t{HyIw-1k%XWqufQd$ z>Se2&s&t{FO|1lj2vV-lHRN48@VqJd-NkrwKp(OcF2+ zfyOt4CZb5PhZG4kbfw7#L zKqsO0DiaJ03doP*2#ARlDe;S4r@)1In@N%(5ITA%&*{}$25QulLKn>fo!VB9{^6x) z7dKNtCwLT@q%qaHaYqUlK?&>jAZh-3eU7(S(E8%9goJvK1R-DpM#8(I%z^M4D1yez zRJSTvSdU9!WVF0eMR$ELe=;#YhXO@B5CI<7688qoW6YIShx7 zxc4oyf6Y9YM<%(w>GnyvfCyMvsfI%R*CxRR$d(=uWdW=6ulh`i$O*)MK)W{JXqqtt-nu11tVe`T-O zCN4EXKX0yG|86Etp=mNDkE)~Atb%s?{VjM?q%fvIwQqP>KM?0l%!Vy;ip0i*D8xL`y%g^xtdqkS_5G>7xU@x%>Jsl zc_fD_sd}PE+|x-eu9B8WYV9p!&zm%VE#e zbCsnVN;RYPlN1$0YoL|AE-ye&E3(GmUkjv*^Hheu))gHOj`Q{)*;4Q(WAcdyB-US( zg1wTNMo`zks+@S|5>tWyyd_XuV*?~L`YC)hM{)!-0n2W0v$`4+wGr$B|iM3-v z@%`1RrTtFp;!CSs|4Wj%h{%6k31kiO(VbR_)-O-3fxz`eS&ZraO1f;nayPe!&PuS` z(G`2hVhJPEf@5jAPC81%6FN9if=jac^9$5_V?arLZ?-pnw=9hAPorlu9cDjgfB z&P}x*Zpk`4sO@N54pQ`xzSE6#ZGe7d`eM+Z4es_MDeP&1$*MbBc7+-Uh)>mE5ULR` zukL$p3?Ev|{SvH7{l-tP3J_Rq}wFlwBp}ER1Tm<_H@rpoKYZ(GqAg0bC|+)NE;d3I^)% zHw&CP-y!TFN7VmtFilkb?`BNwXNL|#?ZZANP~<1)X$I`$qcx8c>TNf7>b(0X|8nME4`XvEJibD$@PKC0y0t1?LeJjar3Jnr)dNhWSW zEg3WBE{V%)hWP|6_}X&H`f{PLq9D_>H6U!6V+~NT>%wi&<}?@C>U3nV5#%siS>9qW zb^c9wJ+d{*$`jOV20~_iqKkB3gGE=TKEQ}nCQ3B39lQZq7IBihd#&?>PM{G=rewfM zvgj;rtbKXp6Kiq(_{%Sp1j|g40DW90v%meh<1YjW1gC6oSJcIm-fE~-)6e+~8?X8z z<0%uJ4*4e{jPGRXO!~PV^1K_hpcDE2k{>z!pjyGpALoTj9?{58i#vGyjQg7D|3{7v zlY>r4{fyw2yF_i+F1Kp4(~1euO2a1iBA!G60f}b3T2Gdt+yRHR5lZmKF{37KQ3dvqxLUYsZ@ZU+^l|!1O!m z$8=f)AAGzC`zkk)?+0uY%3;PEwfaEGkpg5A=d4K~_^S2GVIQrJdC9W2L-ff%_uYB>RSx;P8$&G6^ z)CG)nj1I}L8}u2#&r6OVoT4%* zSYIp>sG6ZixvO~JlP1kWDym zWQ@7JQ|sp941)4mr*#jkFIS3k04aGJv;QYy;CK9bMktia{q8f@_<0PCx`$lJ#(3Ap zSL1IkE>E+-@XK)*MqrZeLDo}KM_jM=tI)Ph%IjlOv;vqGqbGHs#a-axX1tiMAkaK^ zLfVy?9yvf7ISKOlUTuWhp>M7pkW8LB#a>^RwXh7w&4*Lk zJmtV>_a}@MSxttNHwy0+eVm-p{cw=H)jRNVJACASh2WEb%>k!-=fm@~P)OkVt1YO7 z*?nt(EVuobS?f{nv=k{f$l!JcM+<8Kg&@JBoH#Jw;BSiM&a-dEXcB7aG(UG~kP+^X z5miB=PkA+nn{EU+X29APWP6${An^H@VxZ*UQy)Qynnwvwli1AxRyA8>Ad(|8G(4E? zpdahMF|zjS3KjgjGAHE2&o%G;frBU7H6m_xGTT+JA8(3^>HiX+UKPXd@A;dagt+W~ zllwnT=_!ijh=KPY?Qx}a7A^UD=B48oK{^j71*dq*p@f4;{T!6VfPe)VV-Ss>pV~SE z_xb5J;gb3m*&EW^N_1hKh>`p5khy749GK+)h3KPnX4Dbf=`e1fuY?aAr$^BN8L-o< z0GScyV#-#I6(WKEo=}D|`xH*xg_{2>c&)6#7=v_q{*i8A4-X9Ot6A9am>yG3r6?uO z;%*V#ahHzSCC-ae`&4t~m5UWUdptt>%O|PjXgvTN=J5F@5e)`bZ_2z^b9K)x9+aM~ zZMaTxAOndo1}{d6OQZDiUx$wPND1G6U{jqo*a1GFw6PWZRe2TUsu57)0~Wp@eQ}jl zHGV}Bo!%nAi}{mwYX%+QctM*F0w*EEpNJJVc}Y8yXXlvF{ZGR#m3t$T#;?=qXbSQS z4v;TI=R#5Gsc}dZ594T4^3>)qSKXe2lEf3Xv`r)aG1D{YHTQkfcy9DvQTF#kLmCH{ zomjCY)-ZN67v3KOmVv!p(I1Y=IzP2^ve!YamnN@<(hYju@AD+?aO3Tgdl^>;?4v2O=zVK<2SEtXJ z%zW)RvtvQKw%I5nd&1(o86EjzrOiw9k(rQ7##52R$J6BO&6|I?N#Fh<(AD!1Aly-{ z!?#!fJ}j;M_F`SMLq-6aQ#Kj)d`4eDL(#2@4%X6G1cBb0a@6ES73cl$J#ZwMlxQdo z3`j;3r^B}~DlT6JLHJdDp}1dCI8L=gK5zt7^)CbI4o`cCQK9`f?24tw3FAv-(!x&7 zg=mr{-=&0UgSim}3Tx*u9T5TX++C%GFAnYe`aU<#jOcUuZd-SCuI9%znyQ0^H+w&q z6dWKG(cUvF9H!O*(d*B@^K1_G%~*avrenswZxVSy@etZRoadX`4OI0>e;;zSGc9x> zx%h2VczE)N06KCBISq;=2pGpkrtya%+Vb>9P^9!FWb1vWqM;5P5!`rc_*jt*X$-8*G#t2^k2!{?m1e8MF_F{nRjt&U<)bu} zp*hSR2IZ^{y$g^2{2u(*mhT#=QF(Z>8V={iLp1c?8zX_~l z0~hj!9N-79gX;Z_=}aT{Acf$__&X4vSJKlv z3~ilcFrz^=;YA>D%^p2k2V-SWtrIR=Pwk{(oDeFV#HmH)ZwzVIlc7dc3P)bwHKTd+ z0B;RYSGQXLPb@weq;k9MB?6Kt7G8pX@f3aY<}!o;?3?8IT|Uls$SU6bv62WFmLgl`~dCuGqi!m z6UZH>IEcAxHY-SmLMrr_+Mcp}B?8Yg#I&Bn~3iN?k9x@ZDpK#BqNDDlK zoq??I+hN+jb=)EC_QRNddx`~cLRhx=i2vGJu~0}fAWg55vOWu-!V0^7NFh7{vR<{? zn5Da%P(G=X@Ao27+^EFF7kl*9M}f;LSogBziOf;|ykb?Wl^qAveN zo%4bFWSNp87;9_&vS<|+A@~YUK?j{r+5n00ZWVKVApAazV3b;2YG+Kghxj(0fOa%tyRH!U ziM$nX&t9X!8v&`jCnqNjleHN$Jd*Vwm9$E%aG={gsLeAlQZU zTWFC3K^bhs{~`Kphn7l!f*Lev-Y}85N8eebg3uA*l^6spo}6VLXwCQ`|syQ*}!p6 zJ2ZS2I=XdutG)A8 zP2iNX{&c$#q(@5NL#d=e>G{-;;zom33W3D~w6=^}4;w0;8UZOl+##AAt)(OC z4sFEAnk7D7eptBI^89)Eug$0-vyj9+e=G|^~KhtuiaG65Kvu4HY zmV>bNGaFL%mX9dPO6MCk=4@ustpyAock02hn+o__aEPgP7;A=9x#f`>1iDY`zeW7L zW)5KaR#I-+kD*5Vt9s~nMg!zV90sn()iveL4VLI& z#M@twc~%9}lr1X^BJz?EV7|$n0!#Nn4Z9KfilEQ|D0!f7xG^vDLJF}~w6*rODmv4# zdNIL!|Bk@3_RYt{!zyB64_~G2>%T*1haaM!Qd9Io7K%Wb_p2VDU9i~r#ZN!fjn{lj z1hh#09zr#S%iPNWHS?~^1aav>kmqY%HtU5`iRyC6oA9%NJwpVq40~Kga0>e0(`oBc$=NW6=UCXyg3lR7#@8(29j$h~gHEnb> z8U;`j`+`le-9z&l_24Mm)v?R2OAMaj+-&c7UIESu&p}0nJ0h>cF!YAzak*v_ zrA`fJur-%>ed8`f(pPn4K2c-t`|+npt&^O;wuR2$QcgvGf**_uXL9g^#6Q%neB_ct z7xChzH1c%@bYyuav_|Ibm?JAmEc5f*p^nSr=%il{zwHkEyALZ4li3)RKaznEA^gjO zxgCsC{q}~}ackfxRIYWykMk&9f}AclGLrxeO6CGUps>LBPNeb1z}Sv5+{#!z|?y=7w31Xb#2+16NqZ4 z9W6ZOVxFD?D=TmB3Ku`m$3l~#F#}NateF1-E9jbDMu#V2mzGC71k;6!cd@`u?yUj* zG@ZDrPXF%p0Ev{|`@P>IBTVtVv>9pq@U{<>_nfu;$W|-(S9W?-yW=D2rJ=9wDeKp- zSx&EdJXoVGTwkNR6zK$)Mg=axPX6*>_Q96&|7Zu$5#{x&+zSKWW _#1?|xy*Y*3 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%0Af!d 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 SQu5y-W>X_e!z#3M-2VY%@8`z= literal 0 HcmV?d00001 diff --git a/docs/online_serving/metrics.md b/docs/online_serving/metrics.md index c5c16ee81..f71fa6390 100644 --- a/docs/online_serving/metrics.md +++ b/docs/online_serving/metrics.md @@ -20,7 +20,12 @@ After FastDeploy is launched, it supports continuous monitoring of the FastDeplo | `fastdeploy:gpu_cache_usage_perc` | Gauge | GPU KV-cache usage rate | Percentage | | `fastdeploy:request_params_max_tokens` | Histogram | Distribution of max_tokens for requests | Count | | `fastdeploy:request_success_total` | Counter | Number of successfully processed requests | Count | - +| `fastdeploy:cache_config_info` | Gauge | Information of the engine's CacheConfig | Count | +| `fastdeploy:available_batch_size` | Gauge | Number of requests that can still be inserted during the Decode phase| Count | +| `fastdeploy:hit_req_rate` | Gauge | Request-level prefix cache hit rate | Percentage | +| `fastdeploy:hit_token_rate` | Gauge | Token-level prefix cache hit rate | Percentage | +| `fastdeploy:cpu_hit_token_rate` | Gauge | Token-level CPU prefix cache hit rate | Percentage | +| `fastdeploy:gpu_hit_token_rate` | Gauge | Token-level GPU prefix cache hit rate | Percentage | ## Accessing Metrics - Access URL: `http://localhost:8000/metrics` diff --git a/docs/parameters.md b/docs/parameters.md index ec6078ef5..7070c8fd7 100644 --- a/docs/parameters.md +++ b/docs/parameters.md @@ -37,7 +37,7 @@ When using FastDeploy to deploy models (including offline inference and service | ```reasoning_parser``` | `str` | Specify the reasoning parser to extract reasoning content from model output | | ```use_cudagraph``` | `bool` | Whether to use cuda graph, default False. It is recommended to read [graph_optimization.md](./features/graph_optimization.md) carefully before opening. Custom all-reduce needs to be enabled at the same time in multi-card scenarios. | | ```graph_optimization_config``` | `dict[str]` | Can configure parameters related to calculation graph optimization, the default value is'{"use_cudagraph":false, "graph_opt_level":0, "cudagraph_capture_sizes": null }',Detailed description reference [graph_optimization.md](./features/graph_optimization.md)| -| ```disable_custom_all_reduce``` | `bool` | Disable Custom all-reduce, default: False | +| ```enable_custom_all_reduce``` | `bool` | Enable Custom all-reduce, default: False | | ```splitwise_role``` | `str` | Whether to enable splitwise inference, default value: mixed, supported parameters: ["mixed", "decode", "prefill"] | | ```innode_prefill_ports``` | `str` | Internal engine startup ports for prefill instances (only required for single-machine PD separation), default: None | | ```guided_decoding_backend``` | `str` | Specify the guided decoding backend to use, supports `auto`, `xgrammar`, `off`, default: `off` | @@ -51,7 +51,7 @@ When using FastDeploy to deploy models (including offline inference and service | ```chat_template``` | `str` | Specify the template used for model concatenation, It supports both string input and file path input. The default value is None. If not specified, the model's default template will be used. | | ```tool_call_parser``` | `str` | Specify the function call parser to be used for extracting function call content from the model's output. | | ```tool_parser_plugin``` | `str` | Specify the file path of the tool parser to be registered, so as to register parsers that are not in the code repository. The code format within these parsers must adhere to the format used in the code repository. | -| ```lm_head_fp32``` | `bool` | Specify the dtype of the lm_head layer as FP32. | +| ```load_choices``` | `str` | By default, the "default" loader is used for weight loading. To load Torch weights or enable weight acceleration, "default_v1" must be used.| ## 1. Relationship between KVCache allocation, ```num_gpu_blocks_override``` and ```block_size```? diff --git a/docs/quantization/images/wint2.png b/docs/quantization/images/wint2.png new file mode 100644 index 0000000000000000000000000000000000000000..a117ea8afa82f183c2486ab2c3b1b0ede027f0c8 GIT binary patch literal 82801 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%0AJ?LOF(dY%2$JEN`J5~`q@Tqs< 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%0AJ?LOF(dY%2$JEN`J5~`q@Tqs< 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 ⭐ **Note**: Models marked with an asterisk can directly use **HuggingFace Torch weights** and support **FP8/WINT8/WINT4** as well as **BF16**. When running inference, you need to enable **`--load_choices "default_v1"`**. + +> Example launch Command using baidu/ERNIE-4.5-21B-A3B-PT: +``` +python -m fastdeploy.entrypoints.openai.api_server \ + --model baidu/ERNIE-4.5-0.3B-PT \ + --port 8180 \ + --metrics-port 8181 \ + --engine-worker-queue-port 8182 \ + --max-model-len 32768 \ + --max-num-seqs 32 \ + --load_choices "default_v1" +``` + +## Large Language Models + +These models accept text input. + +|Models|DataType|Example HF Model| +|-|-|-| +|⭐ERNIE|BF16\WINT4\WINT8\W4A8C8\WINT2\FP8|baidu/ERNIE-4.5-VL-424B-A47B-Paddle;
    baidu/ERNIE-4.5-300B-A47B-Paddle
     [quick start](./get_started/ernie-4.5.md)   [best practice](./best_practices/ERNIE-4.5-300B-A47B-Paddle.md);
    baidu/ERNIE-4.5-300B-A47B-2Bits-Paddle;
    baidu/ERNIE-4.5-300B-A47B-W4A8C8-TP4-Paddle;
    baidu/ERNIE-4.5-300B-A47B-FP8-Paddle;
    baidu/ERNIE-4.5-300B-A47B-Base-Paddle;
    [baidu/ERNIE-4.5-21B-A3B-Paddle](./best_practices/ERNIE-4.5-21B-A3B-Paddle.md);
    baidu/ERNIE-4.5-21B-A3B-Base-Paddle;
    baidu/ERNIE-4.5-0.3B-Paddle
     [quick start](./get_started/quick_start.md)   [best practice](./best_practices/ERNIE-4.5-0.3B-Paddle.md);
    baidu/ERNIE-4.5-0.3B-Base-Paddle, etc.| +|⭐QWEN3-MOE|BF16/WINT4/WINT8/FP8|Qwen/Qwen3-235B-A22B;
    Qwen/Qwen3-30B-A3B, etc.| +|⭐QWEN3|BF16/WINT8/FP8|Qwen/qwen3-32B;
    Qwen/qwen3-14B;
    Qwen/qwen3-8B;
    Qwen/qwen3-4B;
    Qwen/qwen3-1.7B;
    [Qwen/qwen3-0.6B](./get_started/quick_start_qwen.md), etc.| +|⭐QWEN2.5|BF16/WINT8/FP8|Qwen/qwen2.5-72B;
    Qwen/qwen2.5-32B;
    Qwen/qwen2.5-14B;
    Qwen/qwen2.5-7B;
    Qwen/qwen2.5-3B;
    Qwen/qwen2.5-1.5B;
    Qwen/qwen2.5-0.5B, etc.| +|⭐QWEN2|BF16/WINT8/FP8|Qwen/Qwen/qwen2-72B;
    Qwen/Qwen/qwen2-7B;
    Qwen/qwen2-1.5B;
    Qwen/qwen2-0.5B;
    Qwen/QwQ-32, etc.| +|⭐DEEPSEEK|BF16/WINT4|unsloth/DeepSeek-V3.1-BF16;
    unsloth/DeepSeek-V3-0324-BF16;
    unsloth/DeepSeek-R1-BF16, etc.| + +## Multimodal Language Models + +These models accept multi-modal inputs (e.g., images and text). + +|Models|DataType|Example HF Model| +|-|-|-| +| ERNIE-VL |BF16/WINT4/WINT8| baidu/ERNIE-4.5-VL-424B-A47B-Paddle
     [quick start](./get_started/ernie-4.5-vl.md)   [best practice](./best_practices/ERNIE-4.5-VL-424B-A47B-Paddle.md) ;
    baidu/ERNIE-4.5-VL-28B-A3B-Paddle
     [quick start](./get_started/quick_start_vl.md)   [best practice](./best_practices/ERNIE-4.5-VL-28B-A3B-Paddle.md) ;| +| QWEN-VL |BF16/WINT4/FP8| Qwen/Qwen2.5-VL-72B-Instruct;
    Qwen/Qwen2.5-VL-32B-Instruct;
    Qwen/Qwen2.5-VL-7B-Instruct;
    Qwen/Qwen2.5-VL-3B-Instruct| More models are being supported. You can submit requests for new model support via [Github Issues](https://github.com/PaddlePaddle/FastDeploy/issues). diff --git a/docs/usage/kunlunxin_xpu_deployment.md b/docs/usage/kunlunxin_xpu_deployment.md index 1096db339..04385d3d1 100644 --- a/docs/usage/kunlunxin_xpu_deployment.md +++ b/docs/usage/kunlunxin_xpu_deployment.md @@ -89,4 +89,4 @@ for chunk in response: print('\n') ``` -For detailed OpenAI protocol specifications, see [OpenAI Chat Compeltion API](https://platform.openai.com/docs/api-reference/chat/create). Differences from the standard OpenAI protocol are documented in [OpenAI Protocol-Compatible API Server](../online_serving/README.md). +For detailed OpenAI protocol specifications, see [OpenAI Chat Completion API](https://platform.openai.com/docs/api-reference/chat/create). Differences from the standard OpenAI protocol are documented in [OpenAI Protocol-Compatible API Server](../online_serving/README.md). diff --git a/docs/zh/best_practices/ERNIE-4.5-VL-28B-A3B-Paddle.md b/docs/zh/best_practices/ERNIE-4.5-VL-28B-A3B-Paddle.md index 12ebb2696..9377378da 100644 --- a/docs/zh/best_practices/ERNIE-4.5-VL-28B-A3B-Paddle.md +++ b/docs/zh/best_practices/ERNIE-4.5-VL-28B-A3B-Paddle.md @@ -17,15 +17,10 @@ 安装流程参考文档 [FastDeploy GPU 安装](../get_started/installation/nvidia_gpu.md) -> ⚠️ 注意事项 -> - FastDeploy只支持Paddle格式的模型,注意下载Paddle后缀的模型 -> - 使用模型名称会自动下载模型,如果已经下载过模型,可以直接使用模型下载位置的绝对路径 - ## 二、如何使用 ### 2.1 基础:启动服务 **示例1:** 4090上单卡部署32K上下文的服务 ```shell -export ENABLE_V1_KVCACHE_SCHEDULER=1 python -m fastdeploy.entrypoints.openai.api_server \ --model baidu/ERNIE-4.5-VL-28B-A3B-Paddle \ --port 8180 \ @@ -37,14 +32,11 @@ python -m fastdeploy.entrypoints.openai.api_server \ --limit-mm-per-prompt '{"image": 100, "video": 100}' \ --reasoning-parser ernie-45-vl \ --gpu-memory-utilization 0.9 \ - --enable-chunked-prefill \ --max-num-batched-tokens 384 \ - --quantization wint4 \ - --enable-mm + --quantization wint4 ``` **示例2:** H800上双卡部署128K上下文的服务 ```shell -export ENABLE_V1_KVCACHE_SCHEDULER=1 python -m fastdeploy.entrypoints.openai.api_server \ --model baidu/ERNIE-4.5-VL-28B-A3B-Paddle \ --port 8180 \ @@ -56,12 +48,9 @@ python -m fastdeploy.entrypoints.openai.api_server \ --limit-mm-per-prompt '{"image": 100, "video": 100}' \ --reasoning-parser ernie-45-vl \ --gpu-memory-utilization 0.9 \ - --enable-chunked-prefill \ --max-num-batched-tokens 384 \ - --quantization wint4 \ - --enable-mm + --quantization wint4 ``` -> ⚠️ 2.1及以上版本需要通过环境变量开启新调度器 `ENABLE_V1_KVCACHE_SCHEDULER=1`,否则可能会有部分请求最大长度前截断或返空。 示例是可以稳定运行的一组配置,同时也能得到比较好的性能。 如果对精度、性能有进一步的要求,请继续阅读下面的内容。 @@ -91,9 +80,9 @@ python -m fastdeploy.entrypoints.openai.api_server \ #### 2.2.2 Chunked Prefill - **参数:** `--enable-chunked-prefill` -- **用处:** 开启 `chunked prefill` 可**降低显存峰值**并**提升服务吞吐**。 +- **用处:** 开启 `chunked prefill` 可降低显存峰值并提升服务吞吐。2.2版本已经**默认开启**,2.2之前需要手动开启,参考2.1的最佳实践文档。 -- **其他相关配置**: +- **相关配置**: `--max-num-batched-tokens`:限制每个chunk的最大token数量。多模场景下每个chunk会向上取整保持图片的完整性,因此实际每次推理的总token数会大于该值。我们推荐设置为384。 @@ -115,12 +104,7 @@ python -m fastdeploy.entrypoints.openai.api_server \ - **描述**:拒绝采样即从一个易于采样的提议分布(proposal distribution)中生成样本,避免显式排序从而达到提升采样速度的效果,可以提升推理性能。 - **推荐**:这是一种影响效果的较为激进的优化策略,我们还在全面验证影响。如果对性能有较高要求,也可以接受对效果的影响时可以尝试开启。 -> **Attention超参:**`FLAGS_max_partition_size=1024` -- **描述**:Append Attntion(默认)后端的超参,我们在常用数据集上的测试结果表明,设置为1024后可以大幅提升解码速度,尤其是长文场景。 -- **推荐**:未来会修改为自动调整的机制。如果对性能有较高要求可以尝试开启。 - ## 三、常见问题FAQ -**注意:** 使用多模服务部署需要在配置中添加参数 `--enable-mm`。 ### 3.1 显存不足(OOM) 如果服务启动时提示显存不足,请尝试以下方法: diff --git a/docs/zh/best_practices/ERNIE-4.5-VL-424B-A47B-Paddle.md b/docs/zh/best_practices/ERNIE-4.5-VL-424B-A47B-Paddle.md index bb83c02fe..75328ae08 100644 --- a/docs/zh/best_practices/ERNIE-4.5-VL-424B-A47B-Paddle.md +++ b/docs/zh/best_practices/ERNIE-4.5-VL-424B-A47B-Paddle.md @@ -15,10 +15,6 @@ 安装流程参考文档 [FastDeploy GPU 安装](../get_started/installation/nvidia_gpu.md) -> ⚠️ 注意事项 -> - FastDeploy只支持Paddle格式的模型,注意下载Paddle后缀的模型 -> - 使用模型名称会自动下载模型,如果已经下载过模型,可以直接使用模型下载位置的绝对路径 - ## 二、如何使用 ### 2.1 基础:启动服务 **示例1:** H800上8卡部署128K上下文的服务 @@ -33,13 +29,10 @@ python -m fastdeploy.entrypoints.openai.api_server \ --max-num-seqs 16 \ --limit-mm-per-prompt '{"image": 100, "video": 100}' \ --reasoning-parser ernie-45-vl \ - --gpu-memory-utilization 0.8 \ - --enable-chunked-prefill \ + --gpu-memory-utilization 0.85 \ --max-num-batched-tokens 384 \ - --quantization wint4 \ - --enable-mm + --quantization wint4 ``` -> ⚠️ 2.1及以上版本需要通过环境变量开启新调度器 `ENABLE_V1_KVCACHE_SCHEDULER=1`,否则可能会有部分请求最大长度前截断或返空。 示例是可以稳定运行的一组配置,同时也能得到比较好的性能。 如果对精度、性能有进一步的要求,请继续阅读下面的内容。 @@ -68,9 +61,9 @@ python -m fastdeploy.entrypoints.openai.api_server \ #### 2.2.2 Chunked Prefill - **参数:** `--enable-chunked-prefill` -- **用处:** 开启 `chunked prefill` 可**降低显存峰值**并**提升服务吞吐**。 +- **用处:** 开启 `chunked prefill` 可降低显存峰值并提升服务吞吐。2.2版本已经**默认开启**,2.2之前需要手动开启,参考2.1的最佳实践文档。 -- **其他相关配置**: +- **相关配置**: `--max-num-batched-tokens`:限制每个chunk的最大token数量。多模场景下每个chunk会向上取整保持图片的完整性,因此实际每次推理的总token数会大于该值。推荐设置为384。 @@ -92,10 +85,6 @@ python -m fastdeploy.entrypoints.openai.api_server \ - **描述**:拒绝采样即从一个易于采样的提议分布(proposal distribution)中生成样本,避免显式排序从而达到提升采样速度的效果,可以提升推理性能。 - **推荐**:这是一种影响效果的较为激进的优化策略,我们还在全面验证影响。如果对性能有较高要求,也可以接受对效果的影响时可以尝试开启。 -> **Attention超参:**`FLAGS_max_partition_size=1024` -- **描述**:Append Attntion(默认)后端的超参,我们在常用数据集上的测试结果表明,设置为1024后可以大幅提升解码速度,尤其是长文场景。 -- **推荐**:未来会修改为自动调整的机制。如果对性能有较高要求可以尝试开启。 - ## 三、常见问题FAQ **注意:** 使用多模服务部署需要在配置中添加参数 `--enable-mm`。 diff --git a/docs/zh/features/data_parallel_service.md b/docs/zh/features/data_parallel_service.md new file mode 100644 index 000000000..31bcffc4b --- /dev/null +++ b/docs/zh/features/data_parallel_service.md @@ -0,0 +1,166 @@ +# 数据并行 +在MOE模型下,开启专家并行(EP)与数据并行(DP)相结合,EP 分摊专家负载,结合 DP 实现请求并行处理。 + +## 数据分发策略 +FastDeploy 通过splitwise scheduler 感知各个DP的负载状态,对接收到数据进行分发。 + +splitwise scheduler 依赖redis存储各个DP的负载状态,对接收到的数据进行分发。 + +### 专家并行 + 混合式部署 + +FastDeploy 提供了splitwise scheduler,可以感知各个DP的负载状态,对接收到的数据进行调度。 +具体调度流程如下图,用户随机请求ip 与端口,通过redis获取负载状态,将数据分发到负载较低的DP进行推理。 +![数据调度架构图](./images/scheduler_img.png) + + +#### 离线推理 +```python + +prompts = [ + "Hello, my name is", + "你好,请问今天是星期", + "请写6个以数字开头的成语", + "写一个300字的小说大纲,内容是李白穿越到现代,最后成为公司文职人员的故事", + "我要采访一位科幻作家,创建一个包含5个问题的列表" +] + +sampling_params = SamplingParams(temperature=0.8, top_p=0.95, max_tokens=128) + +llm = LLM( + model="ERNIE-4_5-300B-A47B-FP8-Paddle", + tensor_parallel_size=1, + data_parallel_size=8, + max_model_len=8192, + num_gpu_blocks_override=1024, + engine_worker_queue_port="6077,6078,6079,6080,6081,6082,6083,6084", + enable_expert_parallel=True, + scheduler_name="splitwise", + scheduler_host="127.0.0.1", + scheduler_topic="test", + scheduler_port=6379 +) +outputs = llm.generate(prompts, sampling_params) + +for output in outputs: + prompt = output.prompt + generated_text = output.outputs.text + print("generated_text: ", generated_text) + print("\n") + + +``` + +#### 在线推理 +```shell +python -m fastdeploy.entrypoints.openai.api_server \ + --model ERNIE-4_5-300B-A47B-FP8-Paddle \ + --port 8184 --metrics-port 8185 \ + --engine-worker-queue-port "6077,6078,6079,6080,6081,6082,6083,6084" \ + --data-parallel-size 8 --tensor-parallel-size 1\ + --enable-expert-parallel \ + --scheduler-name "splitwise" \ + --scheduler-host "127.0.0.1" \ + --scheduler-port 6379 \ + --scheduler-topic "test" \ + --scheduler-ttl 9000 +``` + + +### 用户自行调度 +FastDeploy 提供了multi_api_server,用户可以拉起多个api server,用户自行选择dp 进行请求,在该种情况下用户可以自行添加负载均衡模型进行调度。(目前该种方式只支持在线推理) + + +#### 在线推理 + +![数据调度架构图](./images/no_scheduler_img.png) + +```shell +export FD_ENABLE_MULTI_API_SERVER=1 +python -m fastdeploy.entrypoints.openai.multi_api_server \ + --ports "1811,1822,1833,1844,1855,1866,1877,1888" \ + --num-servers 8 \ + --metrics-ports "3101,3201,3301,3401,3501,3601,3701,3801" \ + --args --model ERNIE-4_5-300B-A47B-FP8-Paddle \ + --engine-worker-queue-port "25611,25621,25631,25641,25651,25661,25671,25681" \ + --tensor-parallel-size 1 \ + --data-parallel-size 8 \ + --max-model-len 12288 \ + --max-num-seqs 64 \ + --num-gpu-blocks-override 256 \ + --enable-expert-parallel +``` + +### 参数说明 +- num-servers: 指定拉起的api server 的数量 +- ports: 指定拉起的api server 的端口 +- args: 指定拉起的api server 的参数 + + + +### 数据并行 + 分离式部署 + +具体可以参考[分离式部署](disaggregated.md#多机分离式部署) + +#### 在线推理 + +多机部署时需要确认当前网卡是否支持RDMA,并且需要集群中所有节点网络互通。 + +**注意**: +* `KVCACHE_RDMA_NICS` 指定当前机器的RDMA网卡,多个网卡用逗号隔开。 +* 仓库中提供了自动检测RDMA网卡的脚本 `bash scripts/get_rdma_nics.sh `, 其中 可以是 `cpu` 或 `gpu`。 + +**prefill 实例** + +```bash +export FD_LOG_DIR="log_prefill" +export CUDA_VISIBLE_DEVICES=0,1,2,3,4,5,6,7 +echo "set RDMA NICS" +export $(bash scripts/get_rdma_nics.sh gpu) +echo "KVCACHE_RDMA_NICS ${KVCACHE_RDMA_NICS}" + +python -m fastdeploy.entrypoints.openai.api_server \ + --model ERNIE-4_5-300B-A47B-FP8-Paddle \ + --port 8180 --metrics-port 8181 \ + --engine-worker-queue-port "25611,25621,25631,25641,25651,25661,25671,25681" \ + --cache-queue-port 8183 \ + --tensor-parallel-size 1 \ + --data-parallel-size 4 \ + --enable-expert-parallel \ + --cache-transfer-protocol "rdma,ipc" \ + --rdma-comm-ports "7671,7672,7673,7674,7675,7676,7677,7678" \ + --pd-comm-port "2334" \ + --splitwise-role "prefill" \ + --scheduler-name "splitwise" \ + --scheduler-host "127.0.0.1" \ + --scheduler-port 6379 \ + --scheduler-topic "test" \ + --scheduler-ttl 9000 +``` + +**decode 实例** + +```bash +export FD_LOG_DIR="log_decode" +export CUDA_VISIBLE_DEVICES=0,1,2,3,4,5,6,7 +echo "set RDMA NICS" +export $(bash scripts/get_rdma_nics.sh gpu) +echo "KVCACHE_RDMA_NICS ${KVCACHE_RDMA_NICS}" +python -m fastdeploy.entrypoints.openai.api_server \ + --model ERNIE-4_5-300B-A47B-FP8-Paddle \ + --port 8184 --metrics-port 8185 \ + --engine-worker-queue-port "25611,25621,25631,25641,25651,25661,25671,25681" \ + --cache-queue-port 8187 \ + --tensor-parallel-size 1 \ + --data-parallel-size 4 \ + --enable-expert-parallel \ + --scheduler-name "splitwise" \ + --cache-transfer-protocol "rdma,ipc" \ + --rdma-comm-ports "7671,7672,7673,7674,7675,7676,7677,7678" \ + --pd-comm-port "2334" \ + --scheduler-host "127.0.0.1" \ + --scheduler-port 6379 \ + --scheduler-ttl 9000 + --scheduler-topic "test" \ + --splitwise-role "decode" +``` + diff --git a/docs/zh/features/disaggregated.md b/docs/zh/features/disaggregated.md index 66aed1e79..84a3dfb5c 100644 --- a/docs/zh/features/disaggregated.md +++ b/docs/zh/features/disaggregated.md @@ -75,6 +75,10 @@ python -m fastdeploy.entrypoints.openai.api_server \ #### 前置依赖 Redis * 使用`conda`安装 +> **⚠️ 注意** +> **Redis 版本要求:6.2.0 及以上** +> 低于此版本可能不支持所需的命令。 + ```bash # 安装 conda install redis @@ -106,13 +110,17 @@ sudo systemctl start redis **注意**: * `KVCACHE_RDMA_NICS` 指定当前机器的RDMA网卡,多个网卡用逗号隔开。 +* 仓库中提供了自动检测RDMA网卡的脚本 `bash scripts/get_rdma_nics.sh `, 其中 可以是 `cpu` 或 `gpu`。 **prefill 实例** ```bash + export FD_LOG_DIR="log_prefill" export CUDA_VISIBLE_DEVICES=0,1,2,3 -export KVCACHE_RDMA_NICS="mlx5_2,mlx5_3,mlx5_4,mlx5_5" +echo "set RDMA NICS" +export $(bash scripts/get_rdma_nics.sh gpu) +echo "KVCACHE_RDMA_NICS ${KVCACHE_RDMA_NICS}" python -m fastdeploy.entrypoints.openai.api_server \ --model ERNIE-4.5-300B-A47B-BF16 \ --port 8180 --metrics-port 8181 \ @@ -127,6 +135,7 @@ python -m fastdeploy.entrypoints.openai.api_server \ --scheduler-name "splitwise" \ --scheduler-host "127.0.0.1" \ --scheduler-port 6379 \ + --scheduler-topic "test" \ --scheduler-ttl 9000 ``` @@ -135,7 +144,9 @@ python -m fastdeploy.entrypoints.openai.api_server \ ```bash export FD_LOG_DIR="log_decode" export CUDA_VISIBLE_DEVICES=4,5,6,7 -export KVCACHE_RDMA_NICS="mlx5_2,mlx5_3,mlx5_4,mlx5_5" +echo "set RDMA NICS" +export $(bash scripts/get_rdma_nics.sh gpu) +echo "KVCACHE_RDMA_NICS ${KVCACHE_RDMA_NICS}" python -m fastdeploy.entrypoints.openai.api_server \ --model ERNIE-4.5-300B-A47B-BF16 \ --port 8184 --metrics-port 8185 \ @@ -150,6 +161,7 @@ python -m fastdeploy.entrypoints.openai.api_server \ --scheduler-host "127.0.0.1" \ --scheduler-port 6379 \ --scheduler-ttl 9000 + --scheduler-topic "test" \ --splitwise-role "decode" ``` @@ -168,5 +180,6 @@ python -m fastdeploy.entrypoints.openai.api_server \ * --scheduler-host: 连接的redis地址 * --scheduler-port: 连接的redis端口 * --scheduler-ttl: 指定redis的ttl时间,单位为秒 +* --scheduler-topic: 指定redis的topic * --pd-comm-port: 指定pd通信的端口 * --rdma-comm-ports: 指定RDMA通信的端口,多个端口用逗号隔开,数量与卡数一致 diff --git a/docs/zh/features/images/no_scheduler_img.png b/docs/zh/features/images/no_scheduler_img.png new file mode 100644 index 0000000000000000000000000000000000000000..c0eb505b93a758f85f638506a745a26876a8af90 GIT binary patch literal 121156 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 literal 0 HcmV?d00001 diff --git a/docs/zh/features/images/plas_training_distill.png b/docs/zh/features/images/plas_training_distill.png new file mode 100644 index 0000000000000000000000000000000000000000..7b1996bfe9ca18474d526edb922c0d40e3a4ca3f GIT binary patch literal 81681 zcmeEv2O!n!|3A`=rd9UHag6M}vN=L_k}{%mtc)@vBWc(&B3njU z*4_ciFAwG8Gd^>M3vOX-W@l_|&t-#f0GGh$#%2f`OaoP0R|_jEV<;a?kc$U=#Hwn1 z%EHFM*4`Y-FAIKGvT;CIf$!il_+MQc{C5oe2ynkk4vWq6^of-BFkfUh)z+Y1Zp@gEV9QL@)` zIxWX9C#Nm4_5s+(Sf5k0Gd^RkY70k`4SsH=3qBqpKor!B;4UjyczO9SSIq3N55mj@ zbwS(06+1ojWcYZ@94+7od(6!%eL2|LS~*ypS$*-8t&I)h6o$Q+9*ynnY@Js(GqttC zOb^rM43LUdy`wH@uOl<+s;&jx0muhRz(n|jSH^<6eh6VhN3F%$!`^w;nGN)5ZOYvljZ zogk+?%t%mI@HpI=Ps!z&lkzd%qnwy$I2l_xVkHqR8}<$^SfRGFb+myaP#glnE9-1- z;egOSV|)tL+!+WMxMuEPZ3TYg1wR4>U?pd3WxFE%{0RP2B0Q+u>>ccEPb0qhga`eF zy2IASVWaCS90RM)0fCX+4d{Ws^nIrM&KgAoSn3XTE`U9l9tDLl1jVcbK>^HqbN*ed z1Tam^zmX{HHDin*n|QFaOS+ln+H;OqRN-(3TYb#yScGXu^w+9TS~QlOor?;D*BP3AWy z5xYviHHp}3b_gqD2Medw{@X@&^3M$6_kn2Gf>7W)hFb(bi%Yoy9ocO<)8B; zFi!OMB!0C-|22;g22&6e6$K*wYkGuhJqh6rJVKO+phW6h@&ENaLUddR!q%VU5&r6Y z%pHZLDBq3i!DAF*}?qh~iSAF(0I|0*NbgxZ^!k$(a+`HMc`ISU7rONatc5a4IM zZ+`yWAp{?M^#{Ltk?31cE+y)o-~Gn_s~5TAK7GfF#KbrM(c4^+`tN%tzq?#togO}( zU&`G?VOVIBkI_ORSg+vcxtk(u6`$yTi-XC#9;;G4tg%Ah4Pi%=jQ=$!6E27lfeU=s z$y|BfPlgvoR*Q|0;CgtG7wb8G>rG-kOsshQ^Y|j~PX?w;d5rmajK9mVe-bDbSOaK? zh+ydPjhfnsk=Sd$5F>vwGPTJVDayBL8Hv#)Kg*xoY>X7zw2b@{7~}s1aoJ>y+e>4{Gi#pJ2EYgN(=jJd;SXKSQJm_DP zW7v6Oe2C4=v7d}M{Gv8#Gjr@G!wRD4uYcZ8Ut`8LGsk{(V7pc;{@Oe0MENmp6h>Qa z-W_%PKRHDH#kWR^3jfzI@+XJRzc?d#d3gV8IQf%f>R+Cdg8wy~#7yL8#SXuC&5MXI z#<*atq!170_f1z$$p4eW_RYpfY+?AOV2o*(Rp{kB-j%9{R6| zsWvhFe{xLqtJ({!+TDBx{wK#yzY4?FAc;bomSNahhfQVR*ISs)OaC7o+Wa#XX7kej zexgcs9|R|nU_S>xnW5V8g12;lx3`=F|7(EP zg;>~_flts~gANOU!b_g&&V-xf%El{T+<*A|YN4MDQhhxjVch}Nf9p>CwRzjkdkzM6%i8yB-(NZh;}4hew@VhS=l=f} zr>H2#E5=xzO-%kD4LSWC zQxb`Vt$yue6or3u!OA~llQu8?e>51dM#cT21w)(oyb0`1(x2r;{GwscX6D#G1~~k! zZp1pPw3%7b$gJzb@&S}^o1MSn;STnsJtW?0*}a7An(6F7cY$6M2<;{h^|eG|M*nA=$g~n);)65X5xi6f@gkECSK*R zyoD1G&cn9$_J1}9?|?XmO5&S4Sc5D)TG)SN`rX*k!FHvD0NwTK+$shS|JIlM8zJ(q z1tnOi=Enpn-$YkHQLaQ9--cIM(Zpuc|M|DLiEb2L{UDiw@`2bvz#LTqASmZxVT}Ni z#bdMjSNKY!e?@MkR03Ts@y)Bg`FJp;AA;By1!6=_aD($EA39^d}mSjGg`z5RuyV_3QSg^cG$arot zG6uAnsh#mDsIaUJR9GH-lSO@7)#P6>TqT2mHh&<7*i(Qos!n7BgUW~9-u;WKx{a`i zzbJ;^S9K~-L4_m#+R$&6+aC(n+7|+1?wmHzsRO6xBD zn*&AT<=Lo|>2H)dp!QJkE>_O}(}unO*<=APj}XR<#t5Adw#;)g3f;fy0(mHQgXk}u zp%TD?Y8aXOePjG)6uKXfF!;ZCbbo-l{j2>}`F(#5X4_B@Hwn%L#{SQ`dH)LH|Nr(} z5p1UWdm3@m2;vV&JbWKN(frrD`%_V@z?!p0Lz}M)+5#R$0tH zOd)*DMPVZbY}MQ*6sjMPLim2M2PmsV6?@nt&Z25PtPuakrGHMygaj}kJVwYito1Tom#C=W`L{Qehv zJeHmD8FN)zIO<5VZ`zRF`Z^`lBs79?kVk?^ z&&#Zutpwx($27-#0rFKNyQ7GsmtNspf+Y!>2ww5T(h;r^XQFqk8rf^mL(_+6hN~x0 zPr#t!MN(?ltDNmPd^Fpne0w&cCPF&3Q|HC!>EYVG+L+pz(YLidJt=xcPS!6cx9w%F z=y+f(H#0FZV#Qw3!$3r!B<;bHx~HaV@;qBvg4G1^gZ_G7U*8e8{-WOc>(+hZ&kF1` zC@1X)^FJAM8S)-fn^RL)-_vf+JWd(`KO zHOP8JkPX~&#Hq122pLpxvmxY*y)}^;Tr)b|jd?kTV)k+Ao8P*13okT@l^{n^nro;r z`0e6kyWw!5eTu|P%TseiRi{3QjLm|+sHCKgO+oLzrdlNOw9gsBX@x@Z5~!7mytzD& zpD+Y^n^COI{;I^bU4^Y|E|HwC1Dn%7TuwBD-XHDCCUU&Jli(qVbcDX|u2!kn<)tG; zc8!KP=9&;jp`9{e*4usJlNfleUHH=dNI{}g&7|z^mC6uWgXpLzi`>Wi>#idZEtEU% z3EeW=M*XQ=D%_!^Aw!0b$>q&8gC^L|Ofjnsl;m*^#y* z3tO3cl-hH5kLhM>yiaB`bn;7*1GGV?4n~sO&KMM@8#Ti$F<7{ zo0?@H;!du2W(rH;RV3LbA75+?Nxmk$og>(|Vn=y^9m7i&AhU^9Z;PV%UT|qQ!^!Sg z#uvmg^{VJMdCV{#Sf~nrNGt9{5v6D#lyBsbXWw7f_~C88@W_$J$RgQ!cl^K_hkX{o z2TvesB1!XJYv;Kc^io7Lqov*Zpj^^u#JRlGVB}3+fS3}MfJAfMXe8fcnR;GVbtH9-+_B2> zy{|NfiSFmCFU{)4Q>G2sI>vWY?YMdn5-Mdxb{g8x-l~|l=%TokFdob(qm|#CO&M*U zdavdI=w!>h=NnP(YDW_?e&Qj7WNAq?{@YF*TINTgQs-%DXGVfJjq3I{vP{*>?4ly% zoY^Hx-&>#kv@U8sBwgmqodY|(tMj`~^f>2dyCLzU5XHpJ$zU8L1 zOUgK}*y#}!f=tbv>9JY1Rlo5BR_d_tHXWJzM`W41NLOA*^XX&rURrJbCRTL{cK(eT zW|lr9+P8yy7LG1;<=IwG^g1h+?j$QC>%W~?D7jO@+#!cmW5&6>S+$hlkWtO7xXZ1Z zW8<>iV!=rvE=w~igAe+zTXkl@3jF(((@e7H$;)2q=^+{QNBF(#t{;t`63*6-7iAOg z>RX8ULc&#%51}T3c>3)yX%VwGbQlkhh>NZ0iAEp_>g-J%GvCjjKDyLqX@6WO9lB5@ zdT5eu`oVJkmyEfEYh};dK2()X+7=bG&xKR4y;6>Amku3g(~6XNW4mx3ZmZFvkY*+B zU#5Fhz+d=zJO3ek{AiX799vEFi}?iyY&0j%IQA{>OVB;AfM-5_CDNTZ*N9@$2sRSu zy0G}4IlU72Zd(S7lUeoZ3pHcV}x$6S-CP$afG?Eb6+q>YX*OlLBnwr*fJ38LuRaRVAG>Jq3CUeqK4rW2O8V5ja26B8 zSlMcqEWf)8{fL4}&x!ja@6tW=$l^>qxo7H&=h{l6g0mRI$WNcI%}p}vt=jIM6|Ady zV0-+i^Nbre1c}&T(xcadIQ`O@=zQnB^gRi3Ctu@VOU0pNU102WouD}yc)<7pi%$scE*Q+E&;1sP&wpUubdBPV!^-DySRhK5tkR!KR%t>1;b?%>nwF(d7&-eNJ9> zX_uJP{AAitMc#4?TdiZ=^>TZc*7?q9m(*^4sCQj{x#s+0^T1^bt4S}qf3wWI$@*O+ zxSEsa5ZQIA7sS3~o_0^XH$!%NPu1CN654&oZ_9iUS-z{+IxpZ!v!IYI@+7{DQhSz0 z`0kQpHN|V);ZOB4$60&+S*AnaN%(3Y|o785WDgAhnA5qsbqo3z2bi&4-yAUYzW$oS4KjUrsRkn8d1q zFrxeIIz7X^5;l`#^x6KGkGUL>4M`xUKUg=e9g*!ewymQnw~V};I9_HU63Whfg3;V* z$vx|^Z>>5#TjyeB@R_5z`NDC}vu`4j%V%m5$V9D(1I1p&{T7(mPhOIx%{is5Xx&=A zq~pXzFQj^ZtN?j#iCr?1rMG9;c7|8E`o543xF?9W@*&hCFZo!hvIpL0UR2l2;$yL0NS^jpB1{I`4bNuEjF_=H763>Pb;ItJYGD*^<}PBH`=! z8{O&mo)Nr9<&8wdB60qo48lK2Em3YbALr(q(Ao zn73rUkvU>_soTwcz6(pUWwuMhWlN{cC1=`B-?x(T<@PYnxp*w^nP+R}-69M{ zxCmRVmadR)RsW<)m4fnN)mE1*u2=iCXh-)?GKSoT>v^Vy`loNT@zb)YVK23Ta9at@ zBKl9xA6_D>kD3vgrxu%!k+Uo5I6q#pO{hQbtqp%o1ZRx1ea^_7mZ?Xca_OG7LLGyt z(P_!H-LmBj*MN)MKzo3&{cHtoU-48Oe}0$8!Xx)!$R`9FXEg#MR`ViAVDpoajKaWCp`(~h#n3k z`M==yoUie^xiDVlna8t*8lQnD0S74`e20m_Sr$PMw+kKsU@%O;Q+Y0cfaJ-)nSkl2!jx976Pk!&`1C% z#RIRb>LDF?WIC7TXja8W15gliMOxf$Slz>3aMh0}VKr$=m_T&JH!482s)sv_7dUi? zyX{w#=3n9hsrr|=D5-MYoRX_ce5}l)Bq}~$=tRDaASo#+Y^h!-;Q~)Y4xT?bw~)B=m_S%qnCWO+?wJGo zAK3L)A7;(BYBf1}_ZTh&wP-YnQ1||ZxmOkdF7(nTac~Q!@{FJU#xE|uBN-R}c|`>Z z05~bX2dJ+k#z*r-VzjYk8I)Pu@UKBXjU^th(bn%$&^m6m~pa(pjSO&P>;- zV2K;IL=Mc+07Qi1(1j^y$A0jzS|17EPBv^~;JGBdB-?#JSS5m^>el#m!mw~Cl4i~N9qmYtB{VNWxYEH>m4Ren2eUw^ z&d<-U?O(&N-)=AT?X9gl_PwBu?7wcAdLa&wbRXfFrA}I*{_%a{3|EI}fI_loOO@FV zborQzs9oF^BQj=k&Cmvjo`o7Lp=WoR)w}|k{%v)#@=Bd>zk?%pLSOrv70P}RsRkk_ zOZ;w8B7v!YTtmX&?z1w`q^J8VW;O8mO74odemJ0Fhr@n2+t6kU_5~E4Mj&%xYBqt@ZfSQz zGHdcU=%I8Lr>%?{SG-Gt8&c{|*>k(IwVX)5Q}GD1@Jt6q=Bq9@#fa*N$XxQ1^v20G z=u!BgMga$-XnMt(uMYZ1fp15>d*|j=e({3+wf!u+LD)p|K<-B*R+<*qXfV1!=EGi48QZswt^KG&@hc zxS7e*nr4H5=uh&ujxZ8E4ZUNq>;Ac{++?fC!`JUtvN&_yzIAIr5w+rBYG7_>^tu-% zCb^Wik^r*-y&;g^&f$feA9JF#6`h>ytzlQR@3|;p#d|fqzE|XFye=~NxXun(OYie- zfs##>P*RJxITm4A{zodGkWbpW=!O%7Ef&=c9L?5Cc0er}<`WV*a~#lq+q$kr8)<1d z9KFVuki0Pb-%2ht_aYwbf3)*Faptg!o!o21Hf}q(g6a^%i6)00GoqHcF2IJ3lc z``LVv+PE=2K{%;&!~o?g3y6cS49um&j#X9-2Y{yTfLv%pk1_86;0*W!#85&-r1tVE z6FdaGfT6P{+^c#`Gy{x_hsO5FuIhRkJbzjwi+q*6f5{JggL)D*`_&$UE9l|B9FWB& z7|E)j!&SaXKrlyoBQ9=w4>Jj#1T)Zt6;;70gRx~0CHXxWUL4argUOaieJjto%bK($ zpC1N`v}lxB9^Nv0$cvu*gu+F_Q9<0guEI~Z&v*oU`TS!3#G7rtGXQ6q&xSOH;Ee|xnp!2}R({_IjSFH;-v+Z zE0?_YZgEs@mtLc$T!idIG7T**Ao_j&hH^G%Mi|id(JUI}?)udA<;~Yy7QbMbGSEku zbCzqyVr#!GdH_^NGC%s>0k9m!JT&EN%5|2=@=>-*^=4T8Bt+4v3z<*_(nH~F&fb!< z79!*)=q>fF9A7_dxzepD+JvtqO0Js^pOp~tT+sNicrW?+yf~Rubpy}@4vR@Xd9sjK zeef^^st9hQ_%Crr4`gO)#`y>4AppB`NhR9VYm$*%Ss5Bn4^aW6*~4=sRs-{&ZPQAQ?JbGec;-|y%0vC{Wfn02 z*}S=slL?b|zAin|Z$dw|Q8%R4TNPoUaF_8#<|HQe)+U3Qq7m#sd^iT@!DFw;>yjRN zudmRfw`m2&wFu6nlVWw#K(84CSK7g_U*ska}E%tV=GpqGnubFDR@}8w=#53 zvN11MGV(6d-a+&YVt~m(Mgk3dR5|VoPT8*0mi&T(*PAltN`s8A=k8(lKUP(yPzYz2 zoK3OdL8jcSXnZf`>O3JAkwfNtpApq(`YuF*{nE_MncEa_rB%yTQ=zZF(zg9!gH>m- zXc%2&m`bak>-<*6oLzk;8Ia2IqxJQ@vog*CNejvhmw^P@pjZYL;OoAr4~w*Z%)KiK z4uyxF9zn$c1g(3=oxXHx4A;TkbfTEMucc}%vMPccRO5s{ zqgWZ!TuaN1sHiAjzQP=vjzTLcgR_sXYU)J$-wQg3OzFSMF-SpTpdJCgf1|!!(xqp; z0CW49iz`Z&J@hufRX;#cGeAOq!oXPuNd7e_tz6Po(nG!aBVmelU6QZC1wlC5H_}G; zNo|iFmwpOcL<5v7uW;-lmZ9GftiXeXb>b2!p%@<)a*vz*1g!@k?H;{GUM5!_uW+!? zHX5gGPlI>opfS6tV&tTXUvPROpia-%MP{jYpmdn)`5zF9+9fA$hS$7@wQTO`9mPmM z-@+YO;z-<(R_-@RIA{l$3{)mq2sh_6gMx67DIbJG2Nt_`m2dC4TxnQ5wGd!;$rmg6 zK&dD?$t@$m;%A& z$_sh~xXJ@(W0l%IER3=_izvZE&u*P@`nNL_%?etOGAG0FAGQRAN>->v0hc*E`%Pe> z{n8kWPTOiLGTfw@Eb@tk4&o1d@nJ6T2Cbp%Kv=lmKv_3HQZbc$g(p3{Xv0h)m z1stRR-hjJAikseb)l0s+@T^G^$8(ipPN6(${L4*+*jfPKCKdw6bV!XW*_P0GHd$TM zjJ@)XshPIQQ%ov45MV`AIAX@oEM*&ppWaEUt@FO4mHS!tkJda$+4X#y9-^<|53^0_$(?zi?1W zmfk!J=gU3SHX2Mu|0O5zGV>>+a? z+p)JcqVD&syJ_~UIL6=H{1$UF?*=!!pNxkLIxoGol=yO&vyo;S=4Ms!WZ@|)_l$=h z=-vH7?=wJdRNcPz8!BQ#2NpPbR4&^;>*2;j2hBR)S_!(}{bty|-#ol>b8_ScH=n?b zXF(0yT=YxEu4lA(IE!lgQJVE4zaN%#klws_KG`*#=+!C44=$_@6eEvl(6@GL8wPx z$>7mf_oJEH>nBr<%1dkO>V&k)Q?GKIPHES;+1-MI|l7H<&eVg4r{6XwU|DDKhVeu}3d(UXmED{>t%nn_ErHT50d0)p{9dO^j3SqUkS z3dQN|_yg(=zPG?ED?@F&{Js>+e{thi(WeI&+$-&Rtl>-yllagh60ifL%11BiC`4R? zcG>s`%!L-Qb2)hwHWSl|1C)Md=X9dS!BdUiO!=?nKWnKZo_D2y6Y5Qle$Mi2z3ovN z1`J38Czd(-~0@&R2lBRq-NIAc_tIfR_Y*;WwFy7B0(o zNN+d4jPvEr-WMej1n5aGwbZM=t{2XJHthvybCrYTB@Bj7a!9L32Y!if65lb=wUPwc z^ENPq*vKw`W3ZB#_970F>>?xL4&leUzEsBJI}-Oym+lbQje{bLI3==2Ww%~q2t*7Y zOaot`T7&fD5$V7Ovs-z@S{Jxpir}E90Y~A{a3#f{0U|IBA~H4zfmaJRvkaBe{y^fy zWq~UZ7nkXAQBA)fe7-EMq9LO-9L^9TuW(Ei#tb>Eye;Dr$9|R44l2qCXa&&yG!6R! zt@pEP!HDn<+LPd);@)v{{1e~kJz*;J2x-@jkU;iAgBJtEc|C&U(2~RFhXY|Ko~T{r zm=6UGPmj-T863UsG9i2yiG99YB)NN&j4T}I3p1A$ zkBrrzrrdvsRWIbob>gZ+Bn{q{XkidmT+0*U0G#@Ge7V+`iv#>6O4F6peyEwm5$R1r zf$Q@-sqrC?SY>#^OW1rGDmznLdv>9vM$Kp42uXatB$4D~k=v@r*Vf4?Kpm~Oqv!F!iWvq}6Me;S(kkocQfH5F@ z7Gk{CO_bE<%M-2Jj~jn$t$rqVNxpQTW+0G2n<#;3$Y0hlnLU)PUs!Jmgl}y<%o32`YqSpGvaMS>k;yYreZ_xy~0#LeT==r z#WO8Q61}Zg5cn=&k({T52$%MZ`T55sWID=Mr~$1eAt!OqXejwN06tPa)VMfIb}-~d zZH#aX@QoWg84||Z3tk;oRTZ7ymv)t-kHKHe2kz_ku{e}e)@ckFAe3U5T&oxwgr0j$ z(p_niynn=vj!lZHn{PW@w}m~TpI!OrBlrYi2=oMZysq-6$jg@b0BA)m-s2;0_=oyq z^twL-$sUr6AhkY~UeDP&XvIjkgPbc?(eu?U)y{hSy_c0B%8ZJP%1#2+h~p=BcCbx{ zR8UZ8Z9^5(A$vMckNHUhQBQrW{zfe66u=Y8<8RWv;chb1N`EHDq)|Guz(H+uS*i0? z5C61U1P?c<(24$H>GJkztx;-T{#2VLwA2+??u&aOeHk$H;HJ+YO>ppa;fi7IFhV&znX(lms&T`C9L#w>R4CRdlpJ zP9g;cXb*cg>bSuyUMB7F?%r1NwrZ)pS#fC`IVbu$xKW(m9D{fXyFybTC*4xc2mIA&8B*5kZ z-C(eHt!@y2FJ#$#HVy z1ClZDNTNvBs*9v~v^w06tvTKcZdbF;$%2KoK#9@Zd#e)yHL_c!N0aeQ$|{fD%(%$l z&sUkWCsVt9=&-*%<*w>r8{eGPW0YBEqQb8Z_9|-JLO+WKlR%>ub9}$8gp*Cc# zK7kSPM89P1OxbQ0&YR}on2AJdv9xtl_yDHxQegLmEpYsSZ4Q?-Ngj-|Q6p&6gGN7( z<)u%K^sDUAJL;@E!@mE_hh1;qB{97`(slHx|3^B&bJuGE zsTLNRlWLM*dJ=oJj?EIZJA6^?GobFW&QrA=HvC|&>9DfQwHepSXd-^kjw)fBFRm~7 z*zOkL(@niB_?yzRy^uK~;vl9$n6-o20w?-TeoGdc4{vC1=VhP>mR6c0OfOzfV z$A`Wo*DIWy1mW7?a4p;IgoC!#@5eotw@u9{1Pjl8nOcaZULGf}t++pTsdes3U|)1p zhVuuv#RireQPgIA9!uA*N<2F_>{4-qymaw$pXB*Y7IQ-r&YgOGg8UsBznV;*VWZr~2i@L3tu-s18x+0rN>?=|OkD)JP&dY(0__Q|6ql=lG)IAvgO>C#onYc0dDtRm0J3xkK3kF zDmeIA$|h6$7I%@q4o#JdkZ34=7fyade7yLT+tleUzT2^9{9L9#>qeDHEscBkL7Sgk zOFhQ_s>F3a$`!wlTEeSDUxx6LQiSBEPWBfnYT{M;4s|K>QVGi`txmN<_I0Q01&8Ys zc(~oh{4J}rmZG3a&!(O)=Zj9~-i}@vcU(?%@y!L0NAnAZ`-bQhow0$ux`(CC+H}Hq zw~sSSW!<9}jQlc;=;NmQeA50U=^g&VSw&ZWdjC{4d08WeYY!u&p2y&Gh)S)k$MkR;@`#%$n>il|>rOpo z1|`}wMs$3E*g$;f5rg~*a{;2G3ikz&pJtnk=40o(9gSjHRQlu3W)>`dh^+mv=%WzK z!|mGXzYFTZif|Avm; z%;eV#41pFH--EZ|m6)y0v+O z)*Yv5IQ;-PhzfR<*AMwo(}_%>t5Wl4?5hV^z)F@9HE$(rro|IB@C>7rathQ#)d1YM zF`)L;Tq$Qo+u5%Zl6Uyb&FVK!=joryESf2NhtNJLOh8jOqG8{xXBGw7EuQpUg$+|a z32OOGQJE1?cLlk(ZQC2tV+D2yA>|yf(ZJm}9LMX?%9B-qH`KE#wg@4;#*I>}ko(*A zz9eP{7V~iTiLi)7R_!7Q88RqxiUNs>9J_3MlzsE8xCXqOH6?TDF_Rm4XV-O>~d6GxlH4J^f~gO4^|j81|G`ioKv5zs9OeUIwa)*TYj=oU3`7 z7&=J*bnK&FWo2^@0a}P=oKd|Dz^me&qYvI5xI@&j4?qh54!W(07oaTQmw){UC9Ty~ zd%JC|D?y5Zkcq%Zf&8G9s(O?R%KjNKtn{E%$A+9gxQDYp$+*7rsC#Czf`d8mI?R*8 zh57Ifj`Q(-lG%ND>Eg)|{r!%L0hn@%7hqpN?d#V^AT($lc?v~d7>ml}f{kLfL9c05 zD0Iv1twrtaoZ^}7(&^&AmqQF64AZ&m&rWKvhr(I_DR6v=MuGts#*FvGs(>}pU$I8# z!x;z@gOLb`72`Wv?;YRYpca)z<<%aJCsJ;31G2q44D=8>l=g6@*oaitfvcFiQY%VNnIr5Y6IY3^Q`CR2Y{_dsAU z#WCaKxt2OYj7MhYStu2#sHtnHxI?uL-p3SJ=$Z}11%|oT+-RAyiK9MVNXOG=4!6iz z6m>m`cW{=3!d#_1BtJr$#epJnD|OEfUw4Y4Dul-b z9FsZgF3IBQJ~i*5#VlN!ELsXtk$t}1DBc%_=k6H{11@Z!-@yv&OE~qV0vB@|WUKU& z&xLWeD@2S$Zc7lq$8`ZEcBy4OvkGXB_f6l3H?kpivA(B^PvW6vLllzQEAt7{D3_W- z-Pghm=zA%vOYBm)5Bz*H$pg5k^r&dh2esqi!q})Tw4DjbBoDrlAvY01^nkp-J14T+ zF4xiU7M6u@XrBPi=g^YxLTm7$z5NEs8nZzaGYwN-uS6uB1#Ot*+CKHQ)@ z#U{p~@BADe8-aCl>5rFpT(-GMcNZMbQTCNW5bA&xy^;Cy1yA|bHU|JjyFUaHg7cx`hVg3FY%-L*x<=&i^85gz8ryXLyLyIK!2s_b_aK*%dx zFgux~T=BB{T84w2V0v_0QKX%l%fsVBgTi)aBbM`BLeOAX*A}oy^cRpR8Eg#(poGPd zH$%dfGui2Ci&#&A<4>$_+yT*C>`+L;{1oK-QX13pET4;QpZ$A|dQoITm;T~pdq zDM96_jxp)NXdTQ6M!4FArp1lF?2EpIraU3}*lE_J64P3$Y_LUXqyW0_+(UNl9cm9d zz)nG-&^&-S`+rVN&#E~zGW{VnCvdS%!(0)-h_p&fwKvo+X!_5c$4~a0==Y(jV|i3b z0vyOPQk0XrDrik&dNjqOc?*%L)x$Ejs8Q4bAY>5JjBi~>fKVI=x#lfs1{uV2qVG!d zE@pIaUq-*q?^VV-NJ@%0j#LhbIcG0ddo2|x@a&X@T2#XPhHv5r#T<05PtoBSK1GR- zuxP;N@)&B%Dm{V`hy253C~;%+zXJ$t(V2LkpjaFT#RSxcxNOc&HV{>)14?Qn5VOF2Uc;6g{BuIgrLV7recN!W z-ej);Yfwn)OL?~X%b@5%*55r0K$tK$wo^IWrLh{xphgGal7{Ls5pJR&Wm%Pq2zvv3HIEO;aJ`~>kead+F6jeSfN&%nB!**D90~Ad* zqWyfW0r5H_TH+mqkgB^@DjY0GWFAAi4<&B^H2GrkYydhIEd|$%?4Cj8E;Iz3(<)~* zTH6pn)IF>a45IB5kK>%$eTdk_2eRk&lNG3Qn&#H~dAsbh`rN*-FqFaKjBj} zQMmh2bWpqRzT>sx#?7Ei{wlE#!NAplWO`6NfENj-yQVajwm0Kkaj|=}pD~eHbZi9gC+=^((S6Fzho;U;)WkXIFpGf}G zsN@_u>Cg5fZvjFM(b0FUM8c|5H3(iqKb8;QzgNV*Aj7~45-uPsp>i1qLRV|%M_k-T zX@ALykO%n;M4`d{?r^rtp8>f`f<-t%?T^Z}IVQr79I8_m-e;!*L}iOs7*dhS0AUHL zh%*9k+br>I;0#+3k|Z$U!X%>Asgs>+`TGb)L87*MiH~+6(tW6ZdEo%kmt%ekqJ=K% zfQT969aMj1HTmu>hmo=^sCYs_2x99|tT-NAm}ImH9mKgdE42qz0R&jnxi04t%Jhg| zur_s9-hXN}plEM#>UE}QUid-G0$Nzd8YKR?%v({fALmkLhKpg)o-OO5C?q}wE@6Tg zY~%@l>NAlQnO9#Il2wtgp3j4oj@&<%#n>v8YcRnGz;sLTEj0H*z8JNB-)!)Bzhnlt z24{6d2xYS4*iPR=7@YLTI_W0!>OSP-UJ5Jybl<3~)2bDDIRtt&V7odold&)_ud!b} zJFiwhPMAURis7IoTMG;^DLhhc0JSxueK$@ax#uUxN8jd~je=4^)pQBoBS%Z++f;Ay zR3`+xkDQ{^X4m9>9VUh@9L0L%t5SG}f-dZ3PMf>9b;pZLgCeAmk3j8<7ff&BHFZI_ zQ*PQ{7pEu4p+0{eRCTwSlTzasuH?lQc)yY7!|g>j*jfN|Uhq)pqfn?yA1usj3n~Ih zjWmpgpNHvLL|tKdH9AS%Em|FLW`uc#{AKG@P8CUIun))aoJt=KUXt#3wT1T3K>6@? zN)lqQ#|f1VNnK|J^zh2L=Q+mSMJm64Xj&Uxkaq6Orw@mYw6Dnh)pdbv3SrM>-*VbT zZ3}W2>F`BL5=!Bfu5YgE+652!&ihc9TZ7pYgrT0Z>cF|fr#^j9JhHgbcjUUh)rcy& zJv)5Co;u=y7lAlpSFHk9qH>|NqR>Ey*IIMLb1~?ob?d3Fu+O@5<9D_XtQ7-!*2Yv~P#Oji^H`ak%9`0Z zrRSL8&jN;JLlFi|-zXuM zae4O2F6tMU)Z9$#N~H@v@(6!du~`~3tCP1h;|kL<)-Y{EnvzlJX!u*ogt%;o`)}IvGc6N$+$^(wff{GXpLKFoH5l`3g){knNl0 z0+vWQapZo~?&`N--Sypi+1ilQEjizivS>D$Dt)Vc*Jrn9sy00zK{YM=_xM9|mhz}M zye-xWiSraxnrD|y`SVtK%)9?4;R&Cuk-9I?&75a<4z6_dyAyzEUD2;Z)JU1ZGngUj zjLIMzDDdIK2RU+!2goBw)tFSRQ>gyaNCFafvWxJAGS!^#7bb@4Rb`GLyAbv43NN2M z&j3Z6M4+hik7+?r4IboHcgRChLSi(h$C*AsHXI0U~Vvy|rM1kLXFzZ3Dmy*z#h} zEWuSzd;Q*>NFxTui>5-yw*vZ+e@_5{9tJE^eZ9zlnE zfpDI=EPV#gsCcRE9YTu%e+YO!LmGZ=^b5sW9%r`|;l&?`Ye;n^lm`X)R5|1*`T4q) zZUUI%?iyeFz~4%Ylp=PJTbMYc(P^R1A_42m_v@y=Mv#w84a;bZZgwdP#aB~Piw2Mv zb7z}rMlj$A-$q?(qq?lxXQCK6l6_e1@~o8^ShZ)+0Sa~xKsQKnl}D1^rfOw7=M4** z^p`pk$km$qbRkFo9Gwud=k>JHTeP5Jx7~To0c|(Yn}USRms9(R_g}ta)q87E<+Sx( zckWjxdGC*b3#6y*y?%gN_z5i_w%Z2J3u`{jWXF`ml&ryMG8unMl1n&;5$H$NL9wI?HghqXt5WhGr3}>TI-i|%Xg@FX1aZJ7xI)c@= zI;!e{fOZz8J_qxfmfdJ{M^D4a{cqg3QMu3g8rXU~rE>2m(?#$7Duqm_Dr|Y|zC7`uN{+6@4js8A0EO0gQf6j4eayRni1SR^es(VH*`*aSKF z2)&%wj7=k%7)Y1HJM>D6fu8JQV`0BgJ(Mu%nKzGrsR|q&ldY?G7nFs7S_dxzP>Uu# z4%B(cI35lvTre;~MZG>Y@sGO8{cG#u#K9Re@bONFZsZtHY8Xt8T7;3~!mD|k8| z8!kZ#*x0AcZ~J}StuX$lvZ(?DIbigb#6nlmGUL@i^x#zu{QX66)C&Ci zwaYt){JeagflUZbq+s7yH8HRn*HRxGWCOLHz>vS+dEGNDae~%A(OVmy;u&>Q`Y-Rs&91G8(-EN&MOv&9qt` zGjchKJY~ZyON8C2F6$n#FSX9_G%J@g>>83!VB2T_Y>;$SngLbt*fyU$gDz6kkVyn6 z;4=SwK7so6PvH{DJqHd?mg@zDC6q=kN4-w1a}cZL2NfVB!_8hny4b^)7>Ar2R2ouf$3<~Gfb~c z=O%tN*b-KAPUYRoRxx>=E1Z2A(*-nUEmO))M=~rQ6BM=2J(%Ut2@Lhkv2M$$YEd`< zf4^fsznES5lG2ianS;L#7$#(83zZ3o>B^%ihgMFZk|EgXihB>hgmOpVE&gW=j6$iC zBpW?KAncY}+gj6aL9U26B~*jLmvHO0HU%(4@@(Z8Ohqn{52_SUf$9!Eelb|5odX1y zzV7gP3NCyiB1lmM%R=1qHQh>KDUO#9xK7M+HC-n0H;~=41ZJgT6qmpObwXCwrN-D!pgmk8?WlHQ_nVynVw`u#o`ygG)D~M_VNd;i+n6^; z10lmTA)pgS7d01xNUxD=RM$XQn3<80^3}`EBP}7h(d3Fw2j>Mqt?mGTcG5^KQivr$ zKs7BgFCbxqH?uWl66Gu+$rbzrs=64}CbL^xTOU%(jH0IhDHe=rYPa-M7;v7U39?i# zb@14AGX+lMS@BNhgAIBo00mbm~8JQoP{Q%1b`zc&rjgHihHwD)a?oi$p;dtanB@+rObu#!zpJyA{kzi7@Z|$g6@Ngp^jSt3sku${)lNzJKV&l(t;dg6A;7$#c;fD^KH%8#-x4OOAiZcWRYzFoM#XPE$rBm zpAg*um_w4B^t)x2M=FL-own5QFWcOCpqMCt@+T~S)6-ZfD-6ZaUy`Jkp)4a(8CPNToB!YkQNyTt5!3Rfu!^F zS~?|gs*WTD|KbE+66RBqHuL9bCTsz(%XU&EK@@n+_!^a7;wPS_NbTV!4B zJ|E2S^1yyd!8w`fFwOmMbY|d9lC9|dO`I1g-kMM*_tj2d_b(m-swCX7?#|hhcuv*F zmTF2ec*riZIcZWcIb@DT*vW^>hmKUc%}8h*yifKpS&IhWRr+1rxZCZ5(Y&`WGK{_q zx!jZZ^ir<2Uut>YMe6)VZ~EA{^J=2K;RV!!-b4~T`}golEwt9ZNZc#d8*6R*S^xZK zZl996s}>}uZ1Vd38x>MZ6GhkE%N9E7D;Fj^KVA{OQ8ph_M(8vmKKAfw`&9g_!15>c zWq9Y@bK&TEkD2VgN=UGPu7Trq(Z!EXy=kvrWO#`Hyot0`N-I8#nn())T;m=(vvJe$p7Rh;{nV=tamPX&BEqeq!XPrHToddd-mu5}D z_Uyjs)0w=C7rK^a@@u!yeZ0U>k&pZo{igVN@t~?L-y0*(5|=?0Bg@W-AZHN+mWxNO z$TD0*p=}M%G)K?iPu8=yYW12)juRlYKfA$n=)MdnnvpAwGLt{+HfT-fbH``lzB)fE zF;T3w*BW(_#Uy@a(U_Qh`Ci={d)(e_X&tC1R;1B9pwb2C`r^LlmtmKWJ(oMw-G{WZ zAD*x+X{sd9YBg1i=*d?1m<;QqtUvd>-Nw1o<#wxCf;*D0Ei~1>UgAyc+2@o~=?9Xf z`s1AA=kq-mgr|!8CAbf1{deuqn$}qpM(yapr_v_NPH8zl@-GzScILx@o>4 z*rSI@1#fuN*0ac^wZ_o2PPCt9s_;#TP2&G+?>nQS+O{>dLC%XBq_-Pl9eQq z1SFIqK{65~2oyyW6DX;GB1w>(6f6-XgOQw3kR(VDBp1P=2t5ns+;h)8-LGGd(S2W! zcj{m5vG>|@&9&AH-wYdByN~B+H@e9s(X4-M+P!&-tDR&XH;|*7i*H?At-;=}{~)vU zY_epw>w}Ew@qM1Psz%qC7Ls>c$W{(xRfSNJQ-$sL`LuO@pScH(?99ZPV$l&^b13|V zNV|7~;0N>e5rs$Q5oU%rs&{rDe7m+hFu>s6>(p&U41Z=yI%uIXJinOlTYiSnARJs~ zd{L<*?bPehCyw5^#L$f&``J@H=&!nJiPmw&M>?$&$KpeM7E-&Nk{0uOIat})FYL#3y%C~XX}KpOauKIMZC<(G_s5%2IIYFR z=dz^db_4nq^HH%3H64W!8WJ`dxTj_Fb$M#xyN-?%r`;>#gZ&t9c4&>l0rC({(9~O7 zZE~-OP*0Wo;D$KNKr%#%X%#7iZ8l)P{hS*1@D!-Hdp>KuR~2}_U$zNG}EvAopqZ(+jeGDTtdQW_tKue zQSWMg9B=!qx%sya9nHqK@)fi7_ggkrn>Wl69AY;WTtj5nf1E*KwGxjzysBOu=8_e3 z2XXZrY}3gCHNHvLs^gAjt;nk-B6P=it_)e=ZuKgh?3t{=s-2FM#rOG;rbZ`n^F@1# z?1k|y0S`55Q+}IYxeIwAF@TT8lX}Nwx+|RNG&1DsiTVnew#;bJ3w8KryhD7#YHMd+0Nqy?(`{$k61lK z2CwSh-BSo4ukCiBd-tQOlIdIOnk^of?m=~53X#%6E7^7|Hn=#)7&>-gWY>mV##8ytihH4^t>v;D~WXv~K%g|j&= zsF2aQhBb;*14S%&*L+N0{r%hBQ_?f&&@*#y>4e84j@!~3d6AExTEp(QGEHrM0foXj!b3*&@jAmro}Gkqx1K)Ee4?o1?6BtTcMkZV#D~d&YPDmqV=k5Fgr}S0 zPqe?V7`#_j*c~pFh?-cQu}!)hid^LBDLjor;DaL62;3Oa3)60OUY<$rk{o+)2LUvY za6&*0XD;z5iUu{J-h>gFQWr(tH|?r_MZljR)t__`btAj7`Q=M-V)zq#*=t;4gcQ{e zi-vuz73vmRR1*zH(jG!vo?kyTQxmaK?;?%2y*hW4IXuUd5j%G{g39Zn&#K%}sHr0gHLupzZU__Vfq&UFB zLa$itf{NrIUF*U(AFw{GOLlGqLj7v6QV-a3i$=uI%bM%mtVFfp;c-ph67;l7Qv4}T z0XsSrHeRF15G|vE`_jb!=G4q3&vimllDbO7yv&d4{gyMVc>dfdS|rg>=`z#$>^-X) z9jw*~2zxZk)LJUX4JVuzYP%VV=`}NYVII^^miFw;2g;XT){ zT6UCn-#on~J}9{?LS?<+Z1PsS77op1yFdqWMr0V@XVNY64KBrV@8y-dZWD51009z`s4qovs%E5YV2`XINjn>MpESAV~kv9`Q!ioqs; z_-*@k^yv7juOY(vhE9qfFPFNOsHsGb`{BhY{y;_>MIOyQPtL$>50%X5&639RxBSWq z-8?-d;(fTqX3bgmqE>J1LwG}?`XXz6p&$wo0RHzryv{;QNVHv0w)j>T5?U|}*fgkh z1F8y^c~Rj9AQRtvC)pc%L}6}9VRVei$|38}FYxsmGv&kkeo^T|cRp%VM%YG`XSpeK zjuiaF8{kc?9RKk2LLh4$tF9DkUY~#4%2!lSF#HsA6JSi>)Xb4%uZ{ao2gosk%3-`P zxx*hvb)TkokB3E1S67!5+P2u1fqK)~W&pQ_x}fV2f)<`(Q`@7v1wSSq2d~*-I9zWb z8hqG+-gf6r?!lTL1Mm0rZ!trxEdt=inN}U#zvXEAg4?>*D1B;%?6n_9rybhz%@qKr z3KHPCM1`P+gR|RUa?h_vwow=Y0eppB^oXC3GS%td319~TLQY^U7r?pf=;>&`u|+@} znE>^edDa#rya!bgxz&13E))om){s%3+49u42zW~-K#;eC3b6>cETW!qZ7mPY4FDp~ z3|_OMQ~*CQh>znE8B*Nbbx*-JEWxULZiPM?+Q!0~rCTnTHQB8fzec^yUkOGF9!me6 zv=uej#x6@X7ZTEEiymNSnvnG+E$V=L82aZVl$=cO0O{V0w%^izwV< zcl7b5t4sE;T_LfdBlc2TSRyQrXPige?+7aacmsiZ3Q7?`6m7A57F!r<%XJtdzg_dI zB)K?C?tl$qYobmxT~M11nYl5!YFfA=hdx{Ar$wu5k-ZaogTp8}3U8^m*d+&z#lzDV zzkjmwRfx+&2A+VRLKA~agCM~?$0(cJn*1Sj@)J2ZPwtZSlUW)EXwKF-g2zja^lqYy zZf->p_8D3<-%i3R<;JF8-5UMjZ9m4VCz*OfM1#|`84e<7W?>1?rtDjc-%j}(=S7CA zSm~p>DIerm$o8+L|biv?@!7Y&c*`%+j7QnUdelb$4h`6rMFr!kGfgU3EC@bP7uEHX2wg8IlS zusN_F?{=ee-!D8|W2FIF2Em|MdmhEo^7eiZ2!G-<>%igCnv3`d;L@Sq|H$+dc9B% zo;;F%@yHtg9i)~rrE4fOn()?uMiWQ1&xyflrA8k@eZJY9NKHF6UGn92&ps|m-%;mh z<-fHoM>BG8X#GuZO8v&4Z~;uQ!tJAevcn1Ap;y9>f|jIDjJA*AF>G{&2AS^{?$d> z2ib5~`H*lBvQ*PS$Z;(6``C=k`~VtOyCK-^rr-_%_~9@!^V;otw@M*Ang&<@K=j|_ z{LP)e_s-8~_unV$-y(MmDt>!U?(^~9=$-X<_cj%-olkm}^1XSj(PI4tr>xQH2bDIi z-#Tdl7_ct%o71PwS${-uKh3`MjSHkD>&(NSqPDmTQVw?I66@Y1*~+Z>itgrhoGD)x zW#zYgtbFTSH2rT3I{|n|;9?n@Nez)WX&`C5aaYV`omwg4)~20Z%j#Q$-H}J(9`#^K zk^btzyirY=Asa)xfYvk?vIP(T^0=hGx{(jEGfKg%bFSgX4{zhGz6#;;Ht4|g2f?dy zV$AW+ca2=b4Bnv!`b;&^66~tg*4i{=<*kH6`nNdKl}N3eq$q(1x^oTZ&rzQsyC2+L zax~|u){u(=OzZ??ZKkOn-;7wlB&!CZ;-+fIHMHY@_2pLaIOSz1Vym$dz(<)b{p#y?=v(q9l?d}5SREDHolDe7bUXMbhKgmL zi&i$iBNt6}c)B5y4mvb9iem~pD9VJoP(XLl0*rJO=uA1@wy84vAlQqQ_xY(vPtx}g znk4zVFt`w}mDYzyj;{S#LKG}v@cA8;Xkl_X#($*a|H=~JRehY(1P$r1k>r4ti8u`Q zN&bIlasGPh3mIZNVd_cGf;Rb?e34>(C4b}dDlrM5XDe2SG`?sb_aZ~=Ne z3Mg}F@pQ@evN!^a+FJ&Ap|C8mR~G5ak3XnJfAZZeV!)6Bo(m$oqGCAM&4k zQ=hNoBgsRN)(T+l zW{H5OH_*1!U=PmUlU=P|9Wh={CjtvBeV}=L90|fzvEsEe(P~qe>b*u`>Lkgp4~0iV zhyl#2Rb{hx_(jOjX7H-a;g=G4SBUOd@<&&!&eu1JRT9++uRcgOJ#zbOGs?U^$UGWE zf+f7pS2`&~006gnl^iC6I!a*(bcCa8LzGNx=jk~X1L*peodDcCjH!X zZShlle7tq7vB4;S}_57ht>BIbckLZ;pudmQmqi3nh|XF{P?^9 z@|1}H<=Z%vjA!K89i3X~%=fWa8u0aXA!D};zN>Si@F4=+X6Bu)P@Uc)`V&bxX9~!V z{nsgM$*50yg*Djob>0BW*>xxv<>psNTnS^Xgc+pe?d30PdE~P)9$O&w^=NZUL^?zh zSW5+2_sSW%G@kAjk?U5-7>>;(*LiB|_5#qGrbc1o<<)EGIi8OC0rmAHyW#V0CO>Dbs>@LcLV zx(RKaJ3xcNzN0tq`RU0E?Dv@s5LWT1+QB5?o<)N{(Tq%RuH)&R@Vv+1TqA{AflU(~ z%vbxZ{R%+RYGGugxzlQGWieg-DV77pqe<}%ki%DJCbCjT>k6(x`%3l;LUkPWIJ4Rg z`Rsdr6@Vx1Taz;9fN1Q{#qGoE^nNe&2-S4lWKOr2L1U-ia#^__8y zveXdm=<$IcN_v)BxPD@jdmMe`k9SHqzLz>f4rO!i{nejf)1Nm<)R(O<<|kp4>JFb^ z*A)ul)R~(+Ft)Kau#vE4thdeUQ)#~iL<*T>eK(eU#WXRW+wlcC&GI7w&ac5`bY<8~ zZu?6e{Nm76a`kza+=(Hd<buKJx;ko{i6YX=8+~JWN5P&@Y+5Tl8E|@RDrRhvJ8{N{HCIq(X z6R%?xS(f@SGmn$%*=XVGYCzPP!PO^_!~G{yVnp>))>Le6Vk2m(m`J*ZaH`xdkN8blHqLvU9J11Yo;!9HD*fYypNue#Jr>Q<%MFJk z!p0KK3)SA*RIV-6*WqZnVu!fu12!P|++cq3@S`w}28-%l=*l>?&Qd6J#CHnZ^X5x> z_KsX=GD7h$8@97fJ8K#8*s0uZFZb_n`5 z*J$5b^E;WT`6Wbhx+bw2YvUg3*^zodIoI52H(F)_&h<-L{|0_aR*D=M%_QxYmm!&Q zK9KC{|E0zag^b)Pve)0N!S=rtFl4OiH#kz`o|OMW;3nb#olIp@0J{9yh8YSQC+|SqHe?d@B_%`xIQ0Zbo?K`~{gDm^bXU!JSuvM*&jGR@~v@!U%Y+8C& zWJ^!slq#DFbZk26NWv=+m*Y-fZ-9hQVVk%|j~Xa)g7=|p1LnVlm|F03v<*Vpu5)cT zSk*qXCSble{xa(B>){k4hxsbcV;NB=GtT)GTf`?M*mJ1XX!FJ>yU`SPT`=Cuq546J z$|wFJHkGCK>Q}_9U5~OJL-?{4KoyOh(%pqYz6*5twC___ zWqrSYqv>-;Xw_-=(WcJLIX$;&=ls?Fx6^~qzWkVM*w8kwK*GJ33t<-P)l^F4R*7F; zOkdlmSH(*47DJ+zhEMlz{YSY4P9mJmv>XIJKe^uamUv~Luf${hqt0Ur$|H0MNOHqy zyMYSn<61eMhif%DbC3D&iLzG0oeO{XoT0cY5&b?lKzDl4(c^jX@KCMENW$v;&9mR# zJG7K{CcOUqLNWraQpXj}f3UhlWakUDst~@B{XK_lu!QBnuOD`^uS{px2P8U*x$Q08t*7dntC}<)f{*)DPx12;W4@f(!FI`!p==0;dtatUwWly%=om_{wU~6 zj%cOf=Awy0c3Xu_)P?p{K8cWGSM6IreGcbJocjE($j;oRHAPV=?cP2F&jIcT4kcWj zaBYotkn|%7`Q)Qyo+s=)KJV^pLA-$uNgjut6gO*KPtJ5Mm{=y?+5Wc{N`GK1xTpK*r7?BR9&6P4$Th zQ}&;||U9&Z5Pcw2{I{<{i;>b1Lwn8uBeBDlKSCPQGa^eVY53wWcswL}f(ZGcRt==4D zCP2}M_7|ZMzDgmZ1p1Gn;TO%bsdDBbL7q5QgT4L_>Cx2x+tcR-xM^+$c@}lx0@mA7 zWmLZ&6RG#)a#XpuVaC|L1399z?5g$`nfe4_0+?T^>OX}K)Qdf1FCmeaw>rVMb@J59 zUMv-Mt$5W~DRu(6tyN(nES)p!y$&ZFft`PeZMN28Sze|p&pXnxcbhl8POICq%VLS@Bb8Qdvk?=mczkDAyf+PMw zY|y9CEUa{FfvbnRFAsRj4x3Wocku~NhJ2f*JFkQ@7un3kfzSzZRv_7UK9Qr39|;`T zZ0QA2pMOGc<%IADSj4|#F?D{v~ZTCX% zx%?nx&yQUODPpeS+Tz+lBH?zC`~^K}_YZClie%g8<$wQ0B&TB9tNW4EYW|VC;%^?4{P|52rbB(2z|sE3?bvHoPq62I-IRr&IfuL+yUvs zxB~`^)Q51k>TuB~hl<7;E`Of7ogSAkF}L$}x9yUIr`61q$G>y%qG|R=5!39^%(!j-Zre?>`!o!4y0e*#^mYWrF^ar_eb$m3 zA7@G)pL)o{g5+44XwXLFzIiOgZ* zd8P5H+1Gnhc8^3A{N&Dkv3P`vBaKz}eqXNKSZu!CvMBFM=ovs&TD2EGZlwUGD*rW8 zOS2A=7vaNUSedm$|BY7WzsLspn~eX0r}pnf`G2q|_1x5Vwr$(XqoQ#3(!WExvm;Oa zCnR%lw?0PEZyN}0N*We9KRGQqgOiApTyno(GEv)ZYSU2hnfKQn$Vv07y3U5+Pw83s7bbD=RZ*J9tM9unOn}bH8zV}GB*qI(Do?0-(SZfkl|M# zVre{e$iJIH1|m3(@CnqH=;c0lF=nsXYR>hI@%BvqBIf3I186dlRd@;+;&4PGkyyNl zLD>t&H-Ua>I%Ziy;c%JdRvW-bMa9r+sdIlXX?ey`1`0%SZQi=j;xaZW$BWU@Wa`9` zCTni4G+BEoRd32)VG+oaTh*KY!0cPLM_$Ju=!=N-P%(T?6+@Wper~#N@(3`{^I(C` za@T1WBVa_~+ov&f{&%Rw4a)r%F;G0`_lsR7`w&h%%Bxl7 zWo2H^O568;36)*@2+TnYPbXI79YIW zqa~Nj$AawKXaCsD|CKAULYP~|_v_&<(($9Ba|6>BZawaoCw|Zf+(b}F94hc(c6_u* zdKFGf5ki&6i9}rrW!w{=EA~b+QL0e}BShVl7)iO5s${7jAZ;I?Ed=^@jWlP(8 z_LUb#vyykrr>V-6NalC3BBKrDl{+2z-FnU-wRWU5e+V`pmORNBb7_PgAAWo79^JGmITENzc6> zewMcyymrOu{X`^9(ag=S!e=x4MFv}Ljz?Imrm!^SJRNDPiv#KCidZx;F*M5t0a1}^UiJzWWf+CSjhou|e zG~{E=u8|0?bLshlnPLN8go*cbr33b^eM2IPUN4vLB^tM%vofZlIigv$B5kBOMeEP8 z2e@p{pJVL1wy4WLB)^uqE5L(*@$p%IP}M<*AF@e;y+Ru5dN}s+2ReP~t4T@gyCwPp zqvcR{F#(H^z^veS+uP{dL=QWXRrA8sF7~rFf%Q+%(6R{Jt8%p|U&K(W_pr!)39GVw z-S$}VG@*LEZ*$zMq2qbl4BSp`W~V~O?;h?U_0D$}@d&)zKPArYT9@u_%D^g9k;=_P z``-NxMilwZjXD7(k)8=tY8>sAu3fjH?^mu8 zbfgo>lY8VCwBK7}B=U_Jm1EFyf<=#vFqT->&O<8e5bTMz)DV-gUhDnniW5Z4RMeji zJvzBpjO26O(@t`3If`ZtqIGsgumn0r?~lMi>y7hUBtH=Q zd}ShjNE}1sX!*6#Y4l@@s)tV5%+ePfKie}8TEAC@dsp8i75{KqSTgW+=l>wJKrH(H zh^^tncRS;XmurR%Bat-Ug;mR$f=AW;3BNaJ%>@6r!$os>!Ur6mE~?Pil^He#Cr}7gu2#=4k=P6cuOoIV=cl#lt@z=RARni z&m1@+Z*s`gW+3I5Bh%NX7A|ExiHP=RlF5u19jS!YSJN$V6#<#^8RF-9zJ3T5Yga!x z^qzih?3J(yMaB;TPqf$Ky5^S_`j+>EIdL~)pCQS&kABdy@`U@-GgA&$5&>>~OJ7SL z%d9Q5N1xu=!vTA1@AmJ@QC6TGQhULZa??xys2^VbEVfGLWCQVr2Q z5?3mga=+5}`?Bj93DCbS0U(R+@x^}C28EaI_P&e~sb;cbS~`PCbCX>zD#(tf29=?A z3dG$_(v;UPU0rb4e;kvv)Mw54iGp(B1c>YGE2AYMAg*l~1(^|h5501q z=^vf$E0rxJ8ISC}L0=M|0iq0YBk~5`yy&3rOZF>p4d^lolFLW*B&mFMkFGLvzcqQY zvN0Z(pd3^LW+s_9Py~1NFwU+}NYK2R_FNvv{ot$qo*bTW-mhu`M#{Zj%$SIhGl)Cd zF-rN6`$pg5^s`D*MZKNEZju7Ltsm|wzuDjwO;$}$*hl3}{1Hy&B*Iv;SafuBWz1FR zWJ@FxJKf!+F-vy-&&4?4OyucTt(5oo_YlyalFH+UO#TQI5|D*O%MvP5=se3BPbmL(hVaZ3K9}h0;3>Z0@5L%ba$iD zLrDrl%)1Za?f<@?=lSq{aDF&*&OUqZv-eupy4JP!Dj|V1!KGe}8DwGIU!%PUut>|n+~HrqZIz&=!>5)-~W9mcp#h~uQmuX)OxY>_WwQtj)lm>>N)8W490s< z{N)yN;L#UnX!WoCdjy1r@=W8~iJuw582|3-Vb5QZP&_{#Z43=^Riei~s`Y4qN>x}q zl>ZtXoJj=cM~5j0m$W^(>$o3aPW*5QrH^`wcum~7o!EtQzvyTZ(iFTu|7SXwNMPUS zF$JNLYyUIdhwXjC(+D`}6&2`}oqxos<6f0xUHk7;mEkp;?I}8u4Y~bifUMHqg2#Of zy$ELgragBP@zD%55r@+KXReYTBKPVs%pE_zAaL5&E6PakRVU!yn^+(8>ae44B*4_d z)>cJ}<7fLW{fyslCSP(Gi!o^r+G`2H%gM?j_}AVwNwb zaZgipmd?0PwM%x~chs6^$&14aS3)O5EsDF1`))*d)&#NS!RNu>OD>P{d+tdf#yFyV zyMI?0{vKLqPEOq*u@Xh#fhRFrcC3fRtD%V&jccw%RLx#3??@O(c%;NgJt{~7O>q>~ zW5PmjxY&YT$GY77K=^}sw?}RsD=tkTk>b008gTK1sEYF0&#CEuIzL=I4gKo5YuFuw9G7J`E$?Y&-|H#UwXya8EH+hI|SrFu1TdM~_q zktp;sE`?04H!5jkSE2LAkAi*xvI ztj-!OeYpJK%4x~trQ=ExDh^Ah{Eiml^A9)=9*j?7n6g^!g*o8&+}j4PV*<6E*lmI# zVU*bEeKQduez2|X7JRoO@kgD1+zaG;y~zYIxB4*k5`54_N{T=@{5}!rIq5;dY)m^z zn>vg_j69sH2mO0RuW4D8A!`4+4*r5hbLx{`Vl^f7utFvNN4*;G!^8Oji;2jb?p)_o zHjP{J79yKxRT($ux{{t(USvC3HS-jmn>PkJzU5xDC@t#Tlojj1{ixS+5UHg;Ux4w$ zn^I}cdpmuv`d7b&-iHl~q3S0K#!KkZvU<#L2<71-j-ghPtj2#RRfBAnj0~i6_{twK$b*50MG8juBT8(i3HO4A$I zx;GbwHGNX*${RNAG6m1O4_;~M!66{qkYGNuFCECmYo9RZZdSBcAo0(xCbWNxHP8`%wZoAT&Xf)N3>E}m z$D#n3fzC59^T9rf3QCIcYh$>b;T&Zpr2aSKNwN917Pe7>{&r`0(V0K=dVUxk_WQ8O zc-Ai|lyj=sIf){Xi9wgW;Q@H2dy1jSm%Q}ukGy& z=VC^#MA2aP3>D)2utGL@ohasAh9JWb=GZFUQX?V+9l&Mo6bcX&^`wRt~$qq(pu{WR+Z2rBI!gH9% z?t>vAFz#s&;G_p-L`eJ}bm31nnNJg$1v^o^E#lb?{Hsrupienb9P^jF z;p{|L`nL6Y>frD~l%LH4?HwA%~m!Oxfv9)lE>;{amFyjj_QrdhAQ}oc? z$Y7X`!~kVfG9?_Tf+swQ787{kpr>Jn8Q& z(qD&zU!$46oPjw|C{>~N*>ye9eV||^8*&|u&+~G?`8B7R{mp_lKu{~O-)ZD z)G`U;eB;MJtN4U-bb3KN!x1SD$IW7~kH(>etD2bhh^SjhSF+9vS#uT}x0?f*FK-mP zhBS+GinaQx6jJY{g8%%~HLBQ@FK=;ipdAHgCsZOYs(rv5LRgsNU8VkEVHXbXVf+2u zr5>y{Wtbri;tsBANSZj&=^oxC83euoFgxXNlSdLPm$d;st(`uN4;UHN_p6Ud-x@SgD_1;Wrt?! zZVwyg`HpK4mGz!F#`2)OXn!u}#f^UcCd|>+DD=hJ)W6SQeB%`s>?y3QePGjbBpFkk zFucLC4c22n6;lIYFVmMzJ5uK?;L6fZ&%Iuly+e;lqTQ?WCs*vl);BroL)t^Q(~1wT z*5?bS);hpE)RCt+T4;_?KTH#EW)5uHT?)dO{~~uRY>dA9KhJ)E_=N*^UDK14D!2y_39=B2 z=NOG3ec_jL5-qIu$R{E@<-LC?L^U!79)lj_RouoaV3R%fPSEM@BzCzP@>iq1Y)A_e z($6U>miw{v76I{b&9+wq{77gY=G|;e8eizb9|$MHrUCuy z$E&r*QDHRNHw~9Ko_(;nweV0b`#LIAIP(FT?xz*l{D} z5Wm9j^BzRKlH$eH0*3X_QZadZs~{5wI{5ew$Qi{)>q8i==|q0NgCCkB1*)?=Pwu2X zjU&CRbkBPlEZV0C*8?2p5!)%UKO;j@8lN`CGdKdooYjJH;MMp z3%L#=v*Eew>8U)^3^HpBofBRK5z;^WeWZdJhB(TH#0^`)_W21YJBgKX8eppCivy;BUiIH%lszG=4+{0BSMOm%?^08aJxht^sc%P zat%KHyxAY0R<^VaAdt%f@&fik#LQq5Q|P~jvk<3ws*0tfl{ZsRiaF0>cj^2m>sHeT zgpk!9$y(z=KP6{O(zFG8Vv zLP%R?9n*9MWtU`I*=ZH$b3KGtuGzE;%?`3bSD+ z`rGIH6M4R`AjN0Bn`4|NJO-{il{u{>um`GgrMoK&MUq%{`mzP;tJoJ%$QW9)UlQU-dNzsL$H$PWlNgqP zQ6+z|p5dyz`4QEoR<6cWt;1+XHkF9OMxc5jO@}awicLV()3>f$aO_xDZEEmZWDu-iPr;X9Bpi9(dds4}N9|H?;F5%2-o;Q}yB>TId1k095cb{DQ_GS}q8 z6cofi+<3udicHv~FB z(@dQ)Fm20Ee({dOW~I7HE+1{#X}{pY9umKE=-1rZnN8faa9SGf%c(wa^@@c;ab$#d zb0GMBA|%E3&h#sZI&!EHQP?68>=j8`l}cr*Z>i^77yw5R?4chQW_$S#^z7RBwkAU) z&d#a52nKm2!l_8|MzcFAV&v42c6%Th=)d!%-(F&s&QV9zPJRE%D2U`$-)^0d`7 z0w@y%qM5A?=bd!8KH9j1kr*BW&(}o03nDp*Hyv%7$Y2gMjoq7e>jDSTWHbA}ClX19 z%u?fRd*lwEbA^H{v36SR=F;WeunP#KLd~f;NUzWTyq-20lOdQ+!TG#1s5>>u)UhTAxm)R5D~_d zN6l+)h3tbC>T_j0jA9-hFZH!w?*|FqRi zEn_|DRVsAl!hhRR_ZBRZck(f+Jef!k>TxPLOje7O zDv%mY{`bXrVB5Yt>@yb3h!DIO{L>GPTR_I(4GKUY>7@0;zg`j>=B`S_O3oZl`9Hrh zxxuEOP!+l?0B~=55&kEzGL!~;3k*8;zW&#jl>8qIOmoBxtp94+R2=brSaULYiz_n- zBfAqy_V>K2UhK?NzfSUkP0fTFnok|`E58{rNVA z41XpAc@+;t{!MiXDU=|3AP&M@rR=8r5$`nqDJfXE8NIb+5y+AMQeI@KaKr$jGcrK45Q?0L9w3{}0$IFbn7S{{wBQwU~Bjc6sY*?+eq zDThxfqv~Ccxg$g$6}>!Xl~;rBh)Pc#28REMb@hJH{`O>ui^#8Uw0eWOPGd$a?`)nw ztyrxuswHM0ObQW?rA_T@Wl3~@a=qf$bKu?$_$>#y%U7y)7njRdwyZCWK5ICCP|@vr zurs^VCNNPLB5@F1OiKLt^dXb>{Y;vdu9WVKFUui$aQM!dB0;2|x|a8;htNI)zQB9n z#AfF{`Fp~v8e>>RH^u0={lnS!^u;8ppf&ov`*&Kjvm9JE<{m@7X+k5hIM2X%Z+o?9 z#HxH~)UM-c3up1W>?$;>XlvMF#C0Ltgx;#;y%*Kv9(jSy*~oqX`K$vui=x|Zc8Hc1 zld3&(F#>lk?G>Nq0>*cDZ@oiA*?LjNTDW3&x%@yrut!0p&2jXZv{yCgkXQNl=OlY^ zbXqyh1)tpN`@zCPSQ08l^6CYyphH?jui&HGeOUEoB#v6BF$AK%SH{@mc-3ry*inc~OsC(_`B{felia=56&BUy}WFT9)E{ zUA6hu_gtB(ueVQjINa=Tb98?yp!HdpMPE=EevVqWkD8}8{alYxkWh9du2M`CciDX} z^&-x?O6Yo4Z)=AHh9U3+%cj7DyPdYz{^rwn4J!<;nYM=I^3N} za*4f8MwWfMrOyM*@rE2?V`G)8_4NA!lm{!AgO2Lb(}7cjN=~v-x{fiN1+6zyHqSpG zJWL=E5-CObai2~|=DL42V(QQWXlZ&^T<+wB=6yv8%)5lPa{CLcAPlK!uoq^(cynRk zdcQ!m`d?uf*qLk_9-bHFY9$(T9I)q+nyJF!j(dm_-O>d9}LcKepHLL#v2q3sFThLu{9>l@|q&z>HX&L-I5sh{ER zy0cn0^zlBe$U;`Z9?PD(u0x-O>+dnAM89ew?mktOArKbJTT^gUZU6MF#<&K4*TbNr zCgc@35I1nPz!tb+pmsrijCOtm2c2?j+F~}hD_gsG4+~I&V7sm1rnRgIo{oFZb^mpk z?@`|xY4ynv3N+u*rQ!sDt3#KBnQ!6#%>FjiVxTf5!}xX#m<8hHK=eWGW?ex}Jx1RL z<%Ah`Tj3iZ^=8klxbbo(Wb=()<*i@C7P&*~9TL`{PhgJtJfdg5QYmgs`g(0Vm;i{k z{*n9YU3y{rG)$X!jSs=dWB>EU0hlj1J>|ZAYFuj#8P1o zS{F8rSJWoD(JA?~dU_wTR6J3C3H20l&N#XT3T;Ph>PYuKQqz8e8Tmrkl*h^*d zW7MNHYc1A zC(ZW~ZJV!=+|9Mv-W<@g&dKrYHR=N6vjWz`P`6m|C)o9X>NU*d3Y=(6;j;Kx5L0o? zMPR`;X`v-jUx?S&5UEN9Cq(HaOb>AZw_s*@?ucaT16%vytXjKP zuhBFs7@vb$i3+%gezwj`x$6pM8jP6#I4|h^iF> zJXnpPmCmwCAZkUtSh>M>oNz9hLs)s@po?&N-2P>bddnWLJo?a%=6D4x?JzT-D>R%d zaW>w^0Aiqlt9AqEeZY4gd#UL%9r+Z2N0SEyCdI*Qr3f5?VFtU_$Lv{o&zGtJ zh;jax>E$-;cDM)TJqZ~5%4 z2xgW13`h|t3Czw~&YnVg=vZWbwoHw8TwBlC*RZbKl(ROL6Wi=fS>Y7j`&IWXY%S{Q z(hrtq5Sgl8;kLcvpm|rH`c4X05?5x5RqppQmk-%EZ*6ZSTofCiyZ4<-J!jA{3$x9b zD&`D#>V8&fc+jFbq2o6(%-(vo#Xt_t(>!&b1Cf=ANv*3iDXH)45CCZCIv0K4z@ycn z&`xtS&N#^vQBs8BY;lvLzvw zn@fQR4>Oi{du7Dgr5ah+!qh>!>dR8E^C-_tT1-Xj^xsGFq4FKYQ27s*DDXVfTYhr) z8a<=BedIb!9e`z8aKrDUncDiu$vSa$@lACy->m5#Ipc5K)J?i}U}4YSUj=TU5X?s> zxt>7~-`=zBR8>h^ir)Z|kTCDB0_tWiByj%_II0YG32IxF8u6xmub^{DA`wZdF??~( zI4@F7>slFmO1+gw&-Vxw1s(^Ur1}7jWICMs;PVz`k3Xc2vdiDI#+eg5qop{8>lY=q zyI62Qwd-nIHCi$1@q5hkGyrnh5@eV(Y(3o_-#VS13D4bZjMOdrA&G<45YtdFOL|3Z z{3C+^9h}!zWBWd65b_x;{0jZTD`Lb}SA0lZH&I44p*4$dKH?Jt$VVGjmX&wiL9`@?G7 zb2I*Bxn2Cv^X@g2;b@x1&uNpm22^!dp&bscd5lFo^U(fTPjB7(^Mg+rQGiru96<|5 zfgJB(^?Q4O9P4XaNIOReyW9yDr0OhI3A-TtdrQ-F{-RF|Q$`s2H@q zb>O2-44X#AqtX}DeXP^wqruGS^fazN_iG3kc^yg%>&Qd~p9FFm-&g>KxDs=)+x3vR zUC*KK;f$+@WYA;Ohgrz|mQO!m;6s*gDNg8Y1NJI@q?5;v>m}}T5=D z8hK%!6sDfl?y99MaDL;K2H#BiR;FsS6>%Ekks2yLMb)Q-?t`NE&Xh*}4Ru;c;d=D< zUmOLkKPPOu2%P=N&YOc6d7+Wo}tntq**|5}BZZV;0dcoi6dSr-ty z<~rf=TXRDq{&yF58_Uvr-g8i{%e&dTKda^5$d&UxWtQ|wTq1*P=_BFd1hOZDhB<^$ z9P4aVzC&jF-bj73SaCjGNImAZbWwnfgU^&}zGhG^@DN&D-=0m@4}mRabXhvM)z6QG zn6KY|GVO=3Xs+2qe)CqfN%Qp7p}x=s*D~$-Gjz2<%|8SonBrXYzGt{7!Eiuj-`qFX zaZ=dIJT2Js{>66*bhRJG_UFn;QBu+kf(+_CsQj6!B(oF4## z>;a)e5mRFXW>l`>t6{i&KaWw$JV;@%2r$Z}EhOm+3-=S8N_q@@ncA{8bxl5a*$rO1 zOwj`xWUd8|-}}*YTaF{E$)655ywh3zY}OQrvX>6J0?Xe3b+((NHB6remfkj65D?=x8Vb)pXT}}*+g1p^+>!zKJc;_~w z%oT36YP7j`2=hk?K{2yz5tYpBqF8xA_Z7{32#ifQ6;j_O!6~e+8Wm@Dxkbm&x=#%p6Hf4eg^p(KI<6c4MX?$^;Votq`$}Aa&wHs+cDYwfPFj>1(13iY*O&c{%Q7RXlkBJfIi+yn3@0ogekM`qXZ&&igZZ4yx%q zyW1nrGT`Vyb$203r1$58W&W4`@JwLIV;t%~rEJe|=lM*3AA1 zcs=KZ5$s!reD4q0@+R&e zGtl_}q{^eIt9H0Am7f|o2(6+*O>LI4o+&r=Y$tjr(=GHRx)k1zHV@}=@b&_!fH2tw zStmYNCITIHpKF!g9i(E>Rc2x>uZTNO z*74;FuFW2;(LA3@?%hWKY+3FV{`k#Z8lJJKYyH#R!0j4l=2n%dv0HSmcGI8wb}5sc ziEl~|Bs&k{$k$tMDsq&uD}un&fg@pD<0U?-jk@v%4H*WNnOj?Mu+c8EVp*1+OpnuS zlKZGqPSGmkKC{I0Noi|^lC3t%KJt6bb&9V+LZp!j$+gSgQI{oTlHRfwLISV?f!#5y z(kXZt(e>k`7UBWiUZR{@#@V&47p(n85Dg!>$DVD7>Q9v^44|23uBFv;e_(TdARHqw zYU7h$evVT`Z=KO&<4wB78NO310DJQTe|<(SHw@3*J*a-bG3jxecy0&@O4fcr8!I2P z(WAJY{|mUpskQ~PZ3u;d0f@!{o06?p?fFRnrwnaH%u4C%AEvDrV7yw*Busn zxvRUR=wlLI4vbl;e*in#j6)-6&6Vnk#xH=8h5*jE&^l9JzFcNuB^+%tcB;z>d!zp= z#IMC(0GV(KG5&sSn4;Kb#C-j2%g1lLlSKn8pWg*3H7tji9S754GO%RMIcN^IYi&W? zvRym$3ghu5XXe`RU6H0b$7im} z%PNpN&}@72Je7(ZkKaUOtEvjn8K>d z^#%MI9lJIoklC!psQIyz`lXjMj2V{f%)~vd+L=*Ny6c0^%QW?ay-7`QHQ%kq>{bsd zJE)w&edILe0HVsQddKOTw4FTf>Cc@HFYN-r$+E0TX>oL^KReFL=N5CB*<0<>)>p}* z&7%xm6hIn_x>0c3L9-wcx7TRKYn??T)4a&Uwaa zIejTqa8`<9{ju|_5FJh4VNv!V2;*7+A0Z((13+5*t*)bH&>H@xE+g65$+>lj3ejja z+WY3X>H>22uUFbrjGmdKR@dpG0l{~LhYJ)30lar3KCbK{^`o>LmyOja8x8LBOElLA zLxTIV!>S&?U)P+ioGq=Ur_>E`0m85>ECX-=87$0__Sy(-BHCyUELz=`|`X{D2CL1E#5Momjv% zqhoxFk7W;tJtx)Xu9>JC>?Q+b@pxKTq15U|^g(3-cb7-Yk;1q=0?zF zkPq;P?aP4Z=n3NX;{oiB9dX(zbr0$>5mbJf%-VXdQD4kKViG<0FN#C+Fz1Ez#R>#8 zlg<8U@FoAP^!k080^oVT z(DJN=r#lA+I@y)u_HFFpTvKJBE^y&Zvs#B3OwLbVPp8z+0`%DiDEiFUqK{Skk;c4l zzR_rNTyNaGmsn=2ETEw0x$_aqI`e~^{cN_1snpo%GYj-w6$uL({!!|}+3KAi7EWCd z9X#YK^ga9m#xH6lA?Yx6aTW(FK+U>h^~F3r0WfCd&+mgZ^}}{eOW|D@{bd-8h{!o% zc4BZ-^!ocVA}r@XVEfw^mA@7J8Iv&%Xz%eiWm&Ew{fDwZIPxZ*Xa~?8+GClL5I>HH zoIEgNe;C0wohz@P6st3ioj|IJm)s2o;a7L^fhb(+B~hP;+F29{X#$Ib-A19mra1Je+uZZx5frOR`)7E zM^kc;y^)>3AH1WLwq~5dyJKAFc_nQ|bFA?t|ENFJ7?3{5H}Eph#P=67>Ie`9i>}FN zgKW|gh}1c@+lbG-b48`6u<9C{*$3+T-R!3%e& zzF|1dIM(3N3J#Qm0LQZHE-l{}lakN&1L^Zds07pLNOk_~;!)d{m~m#C?9l=fMRgml ztP5kKX(EhECRUf<5XCpVVVYe8)c&lfiS+BUkHJ7P=9xp=<1Ysb)^35^VYM5hgA;Fu z=z8>Pd#gKCfIxNPWwoxlaKVLMA0I(;8c+fl{mhDhexvE!^C7ajGy>_ozGYd;JU>qs zUpClzQNT>D-;vU$czSCZ^Q~9FxFWKkYNX{3>dmsJt&8xlFF1BRkqT)O7{Esh6~&gl zc!ehn6TM!_g6R<7wX_qXUKzC1yoG9?20SwtyH&ajpu1DOBtIyLRz6SNAJA<897mtM zTrXo{!nRZ8XNu&c+nS1V*Yg`M-BPm5%CS-adsD-ig4?{8l^!UW=F_)YxXN35uRh3Y zicxw~{A z|6F->p|7nCSQHDe+?*}fbL_ZjuAM;&sBI)ym$?z+sf(r?`~r!9h`mQrm7;9pkJaEz zI50NFq#-0%V1Qh-(|{4xTlE`P-B9`WzK%XiZyDwCJyCgj;M$YY$^*V4t{X3=x%a8H_p{jusEz3&Xh~7zdWt`zw2H%~A)K7Px(68FXZ-q6;cvGbzIbDA z0s9k!UbK7o)2|!+>9GhBIJ{%ooM#%Sa|}|RR)GLfEv1ndx!X$RZ@IDC^Mg?Z!9PviTtz1P)b%z)5W$(Xb&{9GYDbLd5NZ@i zE;~k}NO`sv-n3KQz}D6TlvzIaOR=v~ijsW}Y3)sUu=7X4z%nl*Y->ZJS1EmfD zQsSVIW~}l6bm$@oOp1Xu8Qz$3;7}&TMy>1apaA%s_bKw&-TDkAD^`jh?IsK0h@M8%HBWex@5+In|Rb0-rpr3vqUY40{ebrQ3OIEQTB*M_1m@Tj+ zvphhgoAQ*#?fzv~6@8F9c&O}f4y5gL%Yn32K360AQ$5{5X)^haS^-aXDpw4oPV146 zF$fXsw;!KljuGXZ6YUhZVs8Qv{>r8`a*p8tGP`u=KC8=3n>4!i4@5xH62giCV=t8^4qVF)Kyu>77(=H#@mRDoz(V`@ z%VUlsZDBX!EOJWaoC>FJ0(FZUh!5mOx;;%tP*j+ya7F&g_#ZAGt6PuJtu(HfQOjEZV=8HZ*^yIfFN*3HeK6Ny@30Eh~Qgt~PkSll>3DPVtr z7@sGk%2PPgsV!2|`Kr7ohkt%LnIq_a&Z|d)uD8vCF`%|ijh5-So<;R41<+sXJcI>D zn(jFvDWD>O!v|iu3}-u;lauf4gRz1zLG~uv|Nem~^pBEBcRm#Dup9Z33|*d*vrqNP7%)nOKsmZrK{TzFa#MZ=#mo%?h}rG~kUu<@vqm0CD3xXDzTSnx)U?~)59zol za%O8c_3E5_NkJV~243y7bcv3vN{aHpwggB;PPpoM7V}HrG5c#2K zbbRD0SP6}9j})wC%|<9XOccoNy;}kNTST0~JZ?Dgb&qK7en& zLy1hwZziH{$=`%l(KK<|sM5~+Z8k;K98=+^l3-xP=c@R1+e^4l zVo?+*vG2jBy9+wR7iMLrBbzzBUNGXCQw)McmaPRjkPZp7K~ig_V0g(WVHC@B)_suj z2OAw1PbT9r><5}lhn(M%0NT3AT1+}tzAfQ}Mr>eZfFx7Wd57KyLbFii!wXXSw{a$r z_IXYYJ5ri0>bb|EUOU?4HT*No|AK3pJV^5&pgQwDHP=#bc^5+I5SXk3C+==zi%;_<-+Lk=k z<%vK~F+IxY{_EBVm=4Rb`IG{%Zd=Oi=fkQH9y8IPENA9VjZGqwTe&p(jG$WI2^X;J zrK*7U_%)@>J-BuFJNs_g(kVzMB{ChMVhLi!PXK1~^La_=vMva!y~A-3B2Xne>di$~ z4oJ*SI0L!}Y#=WnUOOqUAqBfnQ2KH44fDW9U6ieSx1WWWj*2a)*HAhvf{;{FgO)yJ zYpR3j11%?=-AX`B4W~UwTKw)q-fubn3*e?O4XN*@?keyA!Gxt*4^@`q^nvUxKiyLE7G)_G=EZ5$rkIgN0$o z#VmC@YLzi}_V3f_G=SOp4Q7Xei}tvng-mh5K7$_PCk~9_NQ_B>8AzE_k%F8Pl>1p1 zRSfJF&07JI`qS7Q>w70FfGtWne|OP101pZ$q2L-QQTB760ufJ2PKxro^NyhE?DUzV z!TU55MbZ*6D=Hs$3Y6Px`QWNDW;{~ePXpyDMn3#)#=v7W;X!pON;}XP?uM_}4wXlt z>oH8JP&x}3>hT01yvNXExn6SGnCs$?#l~sJZbt~mN_6?c<>Hou{;ce zL^~oyoIthxPD_Gu^a`ku!IQkXNWKd)7al%O#$9HgqN?dpMmh4J7R`xlZbfezK6&qa z(V?dejm9E!2=GS9_a*8i_O76DwJqazK!sU#GeY5-H(g;Dcux%>jMg=sNDrf%M|}lQ z;67m}hyjlsEad)yJu;^T0`=;C(gM#R*qtMgb7-ZGKK{Zer>Vio3J(-cD(|6s1E%x; zZY_frXvSR2>vNhQ?e6g-j{joXg-soak`cZDq$m=G8J=8&a3u_7hM7^%fq-Fi@oaZ2 z!Pa4o@^L4mh;Tue!tz<34ig?`DJN`+_fN|RRl-xCR`B^nYLQk2DBf$k`epnOiWEj4 zVjE@6)K!UVvfanDGBz%X8D4ubB_|L?l^FmFqepF&ah3n>_TMe!FM~6r2W(NzuIC2ZTacnIYK<}+jK32Ec_QgtMvhiv81*A&oFV+%WQvHj<}lfV8M^ciqfH7hyE2~bBA z66PiTyH|4Hd0x-&7Ns1=m$iyhWY@%j0dIPE8Tu`2~_}+9?xk3 z(1eAc=quHb4pMy7@D?(?@^~P843L;YJ%PBr$LrMnS?{xlmF-XvsBd~yihs0Rk>R+I z_SbFdjr2V-sPw2tY!A4KMNlNj8uKD&otU}12()Q-{{^Op?aNUO0~5vRKeZ_rBOdk0 zc>-?;VcUj?vcvA09c-$KfN2QgCwjx5vmR~tUhz)s0yA8`*{H2KeetMTsjNMKehZPd;KOOeobT?96UUB*Y9Ok z-!$J%x87qEuzGhMlsobR>7h2}V1EfXxlgN;4XJDTdB9PIiepC#usNw7q%lBsq}M!z z9*6WW{{oI#3)B-lEokE}Sjep&cc!}fR66g?ZcCAtJbW6&phqQvg|XN>N4uMe4T)CT z{D6|~3(vTo^ekHXu$uAE{U3Tj%{MZj3P}8IAz(v?fVW&3T&#Mwfi3ef;AgA0gcTm|tRLkN-u(ebfeZvyoIFK#5d2HPRObzn#0{CIv` z)cV8bD7Mvtdvna-s*-1jt5!ynSjH(;#`IQ`%la4Lw_)=dml*0h%f&J@UeHvol#yh%vC%1$J|@N7f02oN;?#1XrOvj-1VTd zA!m7NrR+}y4PF>ITJ&G8BGHPQ`gw9EK3Li=e&qCk48v>}!z|2e;ZGY8)F*8a9Qu*U zUjBoXlF8swF0$U)tB#93zMMm zVKp{-jKjb*NYS*M8wHu_{#?E4QBf+$pqLOsOY)4R_H;yZCIs$36S@PArU(=b&4dkt z&2tF4+QfGkOSzdTSUKUZ)lMG+s8H+wUuCVSpg<8scAo%4cXies(E8hBm?>B^tDbi> zn79(}vfT%zXRc(e-J4e9?l_Au$7>gyJhcn*a6p)(V=D_OruU8tKb2u@*Hx`p6HX!| z#1w8yta(QM={QJ7Umpi*ok_SzuD{%pXLyt{e`V|LJh!1760aZ$t+1JppW~{u`5wF! zFzx@-kiujrI5-C^)~*Be!u1JPC?*9t`jNyLNbYV*gB^Jv#8V%tMc8sxt#)qiflS1g zNcBfC+Ph#`w8-B?!1-WVJ+81HwwHAh3KMXJq>$n;pjXHUVw9+w${RM%q#i|_GkN!E z3O!s8R<8~>DW}X6y$CWKm>DhMfYT3G?xme47;q#C&rut^#tThPuY$mmT=W;5>-R=# zd{Uaxa|dt%8BAm`Pm-(8rZf_i*CL2<6FjywcY&ST=K~Uh3y`!@q7AC_Rm$;h25TZ9 zckRw}z~Pvol2N45jZ9aC&G;KxU@st#rs98!Y2%A7g2#g5uI6)4*#3X6CIwX{VIxCN z6i>}u;z7VQVRy{=5H>rMTPGMy5W_Q1OjoX_(Bv~Y&2`1BaztIw~$0N(p;3(#}x{$GfPMsGNY;l;y8 z&@>8bf+I+9kBJl;DhEXv9S8!#L9FE8fv-8-thew})nrlc_wmBYRBSxEpK~?H@1N&=vM74ya z=yba#q$EAWco>oV8%g{_R(1aC5H+v^pJBiKQ^j#~qoF*26j|rHuB=JY{ok7kHG|F= z^KfoD)HffRhX0IGAO3&zN(kzelT6beMpNm(=cpxXg8|wzR!c33jr_sZC(!5*;zOJw0ub}PkE|N> z6VdA<8xD{u0M8k;`ttuf9z-E@5?ue~fpfcU{NNQ+AD! z@Ue^%o)vhK%vYcj1&)EGw~F`Su^}hm4H$?GBGs|&#Hy_P1|p)+Q-7{JL7jh21xeNc z1B+mU^C`PBop1q;e+r&VUt@t2r2c6Z{3R0(X5LI#tF171k>vl;t{P~!_kytFpUPCz z3M}nANF4+?f=sI;`2DEE%fCQA&`uskJx1V-DTigpkd^+0tG`_1cHg!k!8gH$9m3S^ zD_^P(7hta@#1RUn%Xe)jMqHWy1G70V!=?TOXk&Fje~cw=n+-~A{i#bn@~mKd`PboO zhc_rgamt&zO`u?Ec$8d%XnwQBf0f+#v9YR-m3P7{WnCAnyVd zVa+zUEPiTO1bk26M@cMLBq1oC6N8RB(SQmtp_&Cy#r`?0?-g{K2nSrZzm}jHTQk>? zs@Evel=7sYTKGN?(zb`0ls~}ENld!bst&e8wd4|zjTb|?RG{&Eq770{= z`8#9@jw&gFj&mRbM|+6uOocB&B6v_l($m`r)x!;f?2;)si{SkPJX5gj8uzy|DjJF6 z9+r)v7s0V{&J8p-Deo|&uKWTyT(m%>>RbpNUvu@RWV>vIxXa-9tHzfgiz-ECD3yOp z_w5@TS^lGCZ%W%ZbsZd=BAS)nc4nX>UCds-c#`)(gscfDB#c20(XV<6fbt?L1;H9{ z6bQ{O(1`8jnR{M<7%Fhd9z9WCR^khXD$Ic!ko_$zf@Gn5-7>#Bqu1W5v>Pa6umnZf zTL5YegLI&YK|}DSHM0wl+c44HG?ufhe&jMu-Bb1h56G=gbqJ?ofamKW#UYJ#l)41s z?i=iIUA3|IAGz3z1s~emg{+JAjl~KW`!SQrsC7xW%b=_zX8m@4wNmgDK ze1iny#A|QtV>u}whJlktDxX3M_n!gmzzt>_^9sg!0O^_|P~eYXt_)W@sjoMsv2HB6Sg|IG@fe0ubnkI-SVgg6jby(5{%guWJOttiVm8}UK!yaqwE$cS=l=w9FcWw&hPm;^!apu z@9X|w|LeYP*C*qg_j$cv@8|0|9z*e@ihs4=of{d!IyFZvsq3KsY+0jr{JU_7%#aXD@VX3cILLXzD^uw4OupZ7_HDH+SxXua_T3>wVNV#VF6i=thktBe?< zUBWqXHD0ifUX69v?FNyUwTkuz0Fsst1athVSeeX+-sy+m?LY7eII0c&JwFO?hb<*1s&m&Q;tQQRvsYpp%ddO{tdQ6j@NjGVjZ1zbkoA& zE@es>chk*{CWo`$k1wQzTN+IaR*Dod$vWTd40WWHVCWEaz(evD%LDgj_Gv~AyDU24 zfE*Vs<{eg&)%0VduaIyq;A>Vj!PWB4L%<9OciozimA(=-e)Y99mdL>7UbTzf6nJG5 zZAMOoK&Dt(D;Up^@S!sY>OmpGaJLy; z^C7mJex$y(x?S|EIh0qv0^GJ@cPXu8zC+ek01TEsx3bJSJP@HDy~e+B8JzhkKIl~y z{}@r_m<63WJh~lbf9A`$!VX>O*QJ?}0utOH&MD#D8yy%%9zFT3#geJaHnX;?IZ?>Y zGkrL+B#TwHZKF_2xCQ}-UvzNU>lRyk1CxNXYY2QWIrw0a!1fSiErH^_8-QnyP>`D0 z8|3*vw~G4QX6&j)Ovd5dLbIb&ErIs+kN{nP{$Z%bs)@NS5ct-XbeEd2aZo(f_5pAD zmcdi(^2+bFY@>HlO^1k3dp79zoIMmP#>&co#u)Z+=?#=N-gme>KGj|I`2jqtaLZ|k zBVj>1{V`7|jolgC4W{|jO{|nnbXPfThA!Y=Dcj}?qGu%_ic%y3Mx9T%Pa}RSZZ#{T zpB;w(4mPWvZ_OD-3MypMe$eNb2$~W){t@v&`D6I~nR%3zmoa5zW_+xDqd#gFu3SRQsx{e<=v4 zIY(__&R<8@tP1I-_!oLyI74xLQx9$8J(z@diQT?sc=_7PjMR`}(Pd>N0dg`L3)Qze z>Y9;HJR^X82k>E+N8WdUfoAkW17Okd!f!@geD8aR?Z!zO znMb}r#+kZvEBSFUpMHh4kSf*!N<_Bv0Ho+^wPIo=h#IJxkWrq8Bh(L-HGu|xzr1JS zsbu0)ziYH;?gZwP6LvQV%lzu;iI#g71#<44w@s3TqRq7?ncWSFFMQmX9`o#h9r?(` z{>eoUw5Z^#Bjm3k0ZioG@?c*Q!X8R6>jkPHynLe zfDL$Kzvo0gqIla6VkI5pk4&9}GrR*%IY;S9{G;`({Q8h8H`yh#-?PVyn8c~l2Yf(? za{jj;vAg>I9&M3A!v>f3?n4N0`gvj(S%3iC(N?1Mg~&ns^RQh9+s*1>eqj zK$VqC&dY@m6#Gp#h&z>)I z0?wqnR0hQw>i{nnDsntPh7f(dkh6FIA8v_$p(Hc+DY+^fH8+O(BT}QbGSe~5y>C+eCZvw{x@H^%wkgMXh&e!HXQ(5F6mpe1O64b6qQ=a8R&}DYWfR5F9m6 z7EHhY=*8J2cx_Gr5_Y2cDeS1`8T03MtDq3ksX)y&l$N-r zJD6!Ye631HKY1ooZ@$0`de8ImrtL+c^tLjl2z3hZ_@k_KX7ey_eik>ma8*$rUuovV zI(qQj;Ww#g#idR&9d299IXQ_q;$u_~+M4TF#jo3yv?Nen>*dkn^UL*3ba%UyB6*nA z?4}DbusZ0+*w3IJ!IAQSmt4aBT583Y#BGY_b|Ff0BP3@rttBr zv)mmig6S>KzZuuUxyBi8Jy?*WD%tDCeu7%|2&|1+G<)5h9o&(J2E$I)J2C4G zjzd*4Zmbso47fsNufWNDFL&x<$GqrhzdoKFnxU8MG53CN=y`;0KNDRWmZp49E}-;A z*dHZ7FgDpSW;1DBX6}op8q%Zx>3u_?hPT79co0Fx{C`5h{e z1}~4f2cDJO6T`1W?!Gq;aHL*|=R6@}s-w&FumY0eOOMu6V~v`VyQ8jAcV+~GPL7(n z?jA*e{qa3Z5~ADRRnuZQ!LZT3;fYAcgzSP;=KZ@Lkk2Sx4;dfH4PKHx1^8;GZ}(kw zB-a5M9@j1>cBR_3^N`-Da`taHg!Iddg#*67#pwAOugyi3vBwfV zE`h3twe3ya$Rqe#GYyN<`SaLkP0sGx$%o>S2ZDYgoGvcp=-nKjPDsQ8J40&F;iK9+ z^hVc>5Gll@XB;HHuM+U-xvew%W0#}!wieDyO0Pol&;~F}>)bJ`I+)zE(&dQ1ZC%U} zilTjyDc77-8^X1ts?}&0%1y>T`_<`*rl03(_l_H>x>d-v7WrgTbKOrt?_<)>c*$LST|=VNVu}CGPw5#BS{Du7XtRm5 zFfB2iwGWF>*Bm2I6Co>JcCtO(U!ui?&Gh0j!zKqh9)08ZHJw+QUGm=2IS!%;w~l~^ zOhLH!m3OUm;q_a4=Ptay;7zCG;x_5@W+2#5(5bO|FFxduaPAf5d9FuFDk^)uQv7Zf zlv|%Jr)OI0MvVV84ptKR%;{7w&Did7wI`#?%h6h(5o-)J`^kdbF}P#}!t*y$I7pH?Ll3ggoqf{S=! zS;qE)&=;q?ELrvrtnw|U=YlP-9rDuN1k%R?e+3{Y?a$dw2t@(xX9F$Y=}S`H8Z%!7 z809nerog2s{T%*`99MVOWVu$*;UhD$c%ZbpqYRDQQg>tr588FLQpfSzha5@ObQ{rZ zShWoVdB(QGPMVc-ps!RmmRy*b^(tgc4GZL%uaBL2Uz9{!cOF?X(EW3??0!LZ~L|7Q4Q{iiAMdMK@-sRMD=1&;MXTl zC##2*Y@?gB*Bp||h^-nWeTtf%r@iPDMN6~>yhFMP6M+!Oma-l~wRCnk^a`lq6 zx3pYSu6duks1-C3cCgk|&xFJ+*z)Mbuf7V!B}_(yN#hT@_F6o@6uc*?sWz%zdlAyB zFQMZlOGDnf_?%vZ?a^z$fD_s;og}IVs_adbV<{qMOe7Q@0{U6$gf=|ukAX3ve=G>~ z`oNV#Eye^$5<9}W*sbY8{Fow&ctpEybrF@nEuJ6r8%lSd=n~&`VLgle9N~6x$+u2K zf}pw~o971@?5L9S(=rXupRN1H&~=d$TGjy-+$-?}q`ZwAb{yAUI53b4K;Z@)blROG zmcKlzBDqsBe?28^1zK#A8tsE4usiP`7`N?V*jGH0|=C;)Y7A1%uGNVio&1C#h(pS+h;6MvKHfj!vAG-)At&;wFCU7ql)?aq9Il zv#OO^CcRtB7k`A#1K(v)BY*tfIFNPfTAtJctlhzOv7KoJA~TuvH~I6g_Tk ziZ-V|i2cS_ABd_4DgrLu>%+@ToNZTp8Ky>6Oi<}LV*j;zmd#`j4=Cj1+!^`M99G~O zYWF!O?uXu~YeIQN+sb(p2iqi`ub8d9&In%+Z#QnHEw6W6Dg=j57ZQV7h@5 zgCrrwBB1u1{?>|-0w&W6{W8)y8WW0SSAq2AhW6kz)aedr#GbDu^U&>Gr=o`F_>p;p zf-8>8RFGoV@<~_uV65S#GHBh``g(cSd4WWwya6a;ut6+#t2uhUl@KjEeAB}{d#^WP z15j}_SCbD*5$)LX5r}T184I!tJ^5FJ{N|t|@sqlsZY=m*ce*37v?TLL+v0Cq9$_~b zs2!QQonpIbFGjL1zYVR}ng^rS8pmCS)sKBDYV6*DTie!F3Y00jzTNyIoIAeV3o}_; zEL|^39zPxqV)4c!C*2KJnqCNr+TnmX_vW;pi90oXXS_{||L0~;JHZ1A<8FEzx+KB7 zutb$X0&CwExlcslD(Yz0u86*}ZOxDOnSbuud)a5E^k}N}K3sUm`nVY}MA@}I^Y`i~ zx%<|g^vz}CXI2YBK{fB$@rQbSJ3ek)MI$lu_tNFH zh0FLagn3;}MIzY9gR7jubst)L8d}^54saAba<3O1PTFuuA`Snw(rX`n$j$ zBpZ~12ELcs=xq(#H)?$G_4z0ddfd&@AI0yD<#5r5aqinrf%6Tnk{d{reCJV*r_EQ0 zqVg|_GyCC2i|8NA#cTeJtSys_Ys1SY%x*(3F5D_Ud0PJ3ZMQr8yDSLy$C{YNaO;h& zI%;`TZhBX)FN%xnMd9&pTLsUHRYv(iE+zJbqh;c}DF!y`HV3`I%%pby%5z58Mu<<) zF7H5x9Wk12U}~yB&OAftVGCshtbns|d-FqF#n^}O7U>CmW?yTzT5jyQFqMK!W+uy{ zR@LytnC0H!cDM>Sfw@xEZ#Cf~(N1!dES$zU^haMg3RoLkA9fF8Gt?Ns%{I6nPkXbS z#zG4bB-5d*04;;)JfYA@J`$0AF3Wr`Y3>rR44GMvV=ck8^weDB_=v|&h~8Y^=27sz zy9Pt%2aNfb>9g}bu~5BXAA54Tkr0w<5@;v?VcOVa`u2*;jv9Bh@vT)&&OSYS?5SSu z70mdpmG@VVe(w0*r7ZR^a~cWKg(=t8WhN3)Cg$_{(jzsAys5fJ#wnj}XC_u^N-96l z$&7OsH!Q6vXS9E7IehNabpMUtve=nm#hNn@TGqnLf*H8*m1>E(7XrtPTckxm$m4s- z;!$Qvb{sA)>5|M6H_IitT5{Yq^jYs}qle#NqJ0g5fgjUm#@=|3TrJ-Q9aNMK3KI-X zW~hZ17RO{01%S3|1#=3aXCh`lXIjVDj+mGvjou?dGlEs^8{v41^VXcq@klhDwvKwI zC|=SB$@e>Z$E-u|T}5@&Tlg!xxY}d&gH-OI${C59<9}R*LrSt?Hc5-NUbwL3LY^ha znHdUX^=yfCf~*I(21Nj+o(os)W$g7hwuT1i#(r1rZ`FCopH!0Y4f_~0K;O;9(&@!0 zUcz0$>3vLvr$8}taR7*8Pk_C9yJ6b-jh&&N%7Am^mFp*(X)MlSEYFL{yi;@u+!oWJnq7GdXh1S+kYT!LMEoDHPuC2z%WG8K}jI*qz ztYeRq-Y#7aUp~9YFF8q(__(w5^$oHMF}=`^)qSaOZmc-?K%}t0j<{)KYQ;DqeVRvwH~jtOE{z}^ z={F^7O`eqJUJOeA#1+uK5QS0Gkl;1<_{VGkdw@S+m|$uN;SG!*BCFKWYkwTvboPok z8o=6PfQzqtXua|+ir^m)Y-YKWr;5xxP)fy?{NcwZAkq`BWl#Yb&K1Z@%}i-U@qN&U>+6CF8hx zXdFCaA1n3zjZ1hH3`yD7IqWTGi}pMF5R9x8!vBY+5cTmf0)kIK8^63qg^h4=4QQLg z#tnqW@wGDgo$goO5@?ful-7&OT1q*8$7p*hg8)!e9UKiIhSxM-Bso!?=EKK?1S3jy zQ$j~s=Cu5Bz>kh|iT==$l@`0In{_g|?Cw_{%~by{cgzpFJ_%Mz7FwxFukF%!E!Jk) z|)uB5eoik^SurX6z0M?>Zx}$2Hbf!jdz!%Hy!XIOR_0 z$RBy7H*Em!R@j1p1Gd+7K3rpD^*Lw4?b)j05IBsRMkxCbHj`8b7H^Kkhkglq&-!~D zubYmo;&CpHL1FhQd{(-kpqlL0nxr{;;zIuvvNsUFUwf=4y8)!{zuRxu<7=i9F4Gj5 z*vY4?|Jt$l7pTI7RQbT=A3XT(T07S@y$a@jmbi<) zdPWX~9rQb8Cvs$1@WE$RnD@@%W93e-0P=159Wd>@sBO@CANmzV} zaL$#_c0dZ6sT?~YU%%F8to0F5NFP_EemEr?zluoaMp1nTnh)@+C;_|cP#I*agzrs_ z)-Y7)-2>cGwWvAjb|W5KrKtS1(VEsp?uwmEA@~^3E-#(0Di#T#Nilv)kOaBo^+pHh z^o-iB{s`N+68o9&jYHKqI~u_hp+`s#pELz;+4q((Ykr6uVyS>_W};wv?>=zW{zV%wK^vq26H z0G3H%!AG0bEVgKCh|7+lk+iCQvBS~j?ArhXt!Wv#)}7Qr?5c?K?YGabL)ia$j@44P zF$5Yd0*cQ8R(TqIXbVh0^3Gs2TRo6A8c6x_`mM3i4uUQwk&4MZFhz1_l1&!q8KvUx zfrvr&=srJFjmB{`>ewsGrU9#~lw9)CY0?L?yRPhAJ9*K&d-e4rNPR#}kSMs*W*@%_RZrKUbF26(c}<50s)<0QYHy)o#Ja)+ zV_D-<=7648EKqbNV3rO?cC>IC<^9a)J$eh`=W^qgbe17+i;0(1yF=~%Iv@Wsv+L$; z-BrL_1#&_4?d#Ww?^D4Npf?kq(cmKKua6GCWixhG5ZmTwYQmJke<1cyNd|8` z^5#JL*ThpI-qLe0h9C?o`@QGB=;1!Ct-f^~@DKI?V(=5QS%Fc)l}orSdV`gH@13g- zY!48iO}`obGqfbj+0&}Ua_Q>%{1(fB@+2X<_5>JHe&2vb1f&3GGA#5Pbnucq;#MQJ zxf;tyLkTu;(>nDCJCRG}RBz4cK-9;s)H0y2LL%oGId0fi^UPyD+uK2tUZ%lmcWbYf ztX4MF)m{Z5P^i=UFbai(-SFy&?P_?RloYgY)ij=ze&Z0geOwNp&pf5&w{~+MioR$F zTvqYV%qwn`SGD_;^W;%K((avvaZQ+PXm|^wA8?SCxrI-Fc&lpfO1ghojr|S-n-@>M z5?V5rUnB9UZobwj#0N2Q7ERR@X^K`^URO+fL+go(Et$g=^$P$rFnLt3FmkU%^c!}6 z`OkUi3Z5LK3@FLl_ZoTyU)@~=^iA!vD)UBXMo;WD+55HBv8}j-Km$U5Ja**E-C;lP zm1Ipxx*J;_ayOXUeyu?}ve@L7CjJ%X7Rm1mRP^cG&cR%CL;})B=mOg`vWk8A-4zA( zgX_M!N*L~i^#LsePvfxT!l`Mfi5&2BrdPxd@@HMtqlM#E{Ra61v-U?*sENP-=?&f9 z&!;2P8EUof^yU4OmMd6kIS>ngPtoVE?rhy{xvO@{vCS8?&~>Mm;nK{M1{ zx4yi_XFY=@8HzNtJyMzDQIqsCaBi-^&T?(5V|HQN7o(K*u~~B3uW#b^yZWRkYkcSj z4QCIKs9Pjj3q-^qxJF`@p)*q#P!EMpxp=j_tA`H1oScWA?TnoF}vl_5B#nX$X#bk^)B>+S#f9PH#0B2QmI^F{TJ=O7kOB$}viYCV>tD9T4(+5J`vl4!GS?>ab!5YxH(v1C*vs~2= z^UDe7SWG$HL}K3SYFy%BnPdimab4|oY`vY3*4K+PzmSBcx(P>)YTZ5;IT1p zdT67D2?lLw0`^XA(eQ-%6FjhS7wa!3x+e` z=kXxsEvB>GFm=|b->}gwL!ti^O-&P)v$td09hRu4M%U3ei#ZOI4xWP2!OFhhQrdt@ z8LCT36sqkW*eBXzspL$uD?{hK5{XYezIc3M>5ak{E zW2)F{?+XU>;gm^i+jUQ6$US~Zo1(d2eAVtGKJ|3B8^OWM+Qhvnnd&Fd6k7nT;RB`! zRkTWVL7A1_J}*{*>X{Fd=q{%$GcX0XR!d0y0g98S^Qaz$9ZnSj3Ar}&ibkn`Rl@^I zI)nL+H@Cy^7cuwIKyNjgr(|c+>#e{o{V6|OiA)Ph&K@o3fALZD@zp_P$T!Wq zS)pG?3XpGVlJPPP{LfKW-2O`S{XC>YEmShPubG4AfSzq=!mPTax?7q1)&VG*1QvDA z8qJjvR|w-HPTKv~8|475a?zG^DDFKPN{G4D>3*Nr#xhh8_X?~KcO3$&7p9?6wK>&;lE*#4JdZoI697q49d zN?jpnhvTvw!_OUjnnbhwQ|VZW_3O@7Y3QIA4x)ZT%F1ikg}9O|*R@XRjkFPqv?)!Z zpvge(n~9`Py-QQtQl={v&&r;a1zEtw-oa5DFG6Wfo}6kIcnWCC586iPMT)W<>=kQL z3FF+;9Z4!B+s4R#L82~2Nm4ofejj6A3sUrjt4Fr{!JqO(2nDG38G+U5(w1BhM}yK3 zU+pK`x_7&dQ!Gogx;fA*QiZJEpG;lvqw~?1Ay7Q+MF1S;dUDtdQ(uBF>WGU#afZ6(KeCQ4w@e_-zz= z>V>|1P^2(a2XO2Cy)$OMOI1#Ddc?J(i^8z$yI~e#UruPtN60Y}s07({z|&ZSAa!uY zPdt_yOL-JCK(PVm)^vh*@us`V=X0&8j9m7{d_f%7soBW`H#RJiFdiURRbQXC|4{Z3 zB#036cni4VoRu(;2IPot-3>R`)7>CxW8^ALuj&tEdbmuBGhiKaiuzHOSgil@LiU0> zJ)$or_I2+g={f{FW#ak30NqTk!xX#``$&auibr%cF=cG zioP7pTr^p-hZKWE662=Ojb8^ZlTd)h8cS9M{E{Y*J<3ROAxoQN=FrG~3%&V=-4I`h zvXZ^$m|85e-3mV2l><|t25=CDIdu`6ZcKh2Wpog-=3~{JvjN&5O`g z8nf^$22tui6efAHDeAwyKod?k;Nb^IwB2eyOw;V6Y*MFp ze23i29uP()h~A<^p?@25icZ6@_kO4}k2A=L>|&iW}BBg8ha95z0}NeBB?GZ^y}7q1N(9B>MD!-srwQWfp` zUdWw_NqpCUdgeE9(Eb90i%%1`kPTk(7ErLb@E!b5ULnM?*$T8hUjs6`jl>%Y*_Nvc zY$c=+q_zw?3QT^%O*%p+{`3NnMIStBA_58M8n$zrzY4~1QND6piz%u0;{wopZ!3y? zYRey<8adjKbPeHyQ&Q^tV`3>UG7u)ZC10~V(LS1UjZ78sk&xIbB*z{?L5ZjCbg|oI zT|zzC|1UuY@a$%`u6>L@*?Pm_(K>O%ns9C_I1H0f>?1$Qjfng-tVm>H*Vi_Q6KsTzH|I3D>sOE{CLuMo{9Ld}fVu=A8 z$=UH!+W%i?M~BsT06w9XrKl`{`z?w%MNpl0-l7w-##^28wA`I4vVCUz)HB-fl=Xub z>jgkz!nat|wk18`@J#Iibm7+m=%bK{tmAozXZRQS0;~AF|?Hea=iwDVjF>30e8;Ug$=UEHMGpnwZct1vKCe z5Sx7OPd2h;1k+nj_C&N;G0j17IN}T6lk-R8yKXIV2b9ooI=>}DEP!SD^(K1F1+4{F z24-n$Lp~Y9gQMIch)#Dp@;HfS=#R;yN#A?XC*Ava)Ky%p;UN3H!LKetZVabuDUkmv z`pp+Ea;;b**&>L2UV?D*0)YU~!2;@!b*uuH?~}|rcJ2C0)nnTM6CDwx>7LEz`|2Ru zr_)vxsLjD4VgGFG8Gr)T0n02I4T2e>kK{#e0r7d;A9)KBzqR#6wc$o=0!b)7x{Y1B zVM%LMb6FWC^hxA@sGB5_2VE(Vrp27VL_Is$nNFoJ3?`93kdFE975z1d|Y9RI~)2XJf9Kp-u{pthSWT@vB%o415fZ>UbI(4?u zq4AMhOL}Xc3$^V`PrCG+m|R{F)|axdP_W`4ie9_z{p2eIrE^&+a5Kb#y|NFcVyaDTLE78F~TsB%P?AmUbXY*>;ypC*o zqK!uw*I(47gwGUFFgN_H+5zzylh8*Fw#y6n*4kSE%HiJJM}ZdyS8FYSoWY|U`a2-J z0dsT{8-=8M+Z(V1Dcq-S!u%tQlS4>k^Im&Eb{uJvkqK2XK1 z#RH<)iG-4;;5v5eWQ2K)AsLBGm5#x$V4K(e|`oK|GJp6$&V@mqi<;*JG)#ZsLTIr5Mey*;K4C3sys55V$k zhLZFo1jm>SU;l(udUr~Z>-hJTEZCV8Pn&t#i&Gf1t5Y{`y3Kzo@yBE6734Cg zw{EMZK~|dT=P;669-a$zBW;0K2au<@0uBj$!gvhBPuDWOT>KM`n#a!V^4>qR0^b8! zxp2!#6bT+5!N}?#WNw1oKA+t7%{F4-0b?O6iDnCu33-BTfU|6(#D036Lr*`3q=1P# zm`x{WwKv=oTOSY04t{&)B)95@e+CB3EnjZ^fHiFiG?4!>Bn(!UIT8WRUiwDoHVn%n zbRc)l_qO=V1{pb@W&_Eq{mGHZu5$srf#eq3PzG||-#b^};69`+Md|iIbals5XRl}P zemy)udOB`Xye9-9?|02_tp`7NqeVJJ!S1ydqd(|3hjRc)c=lUW${UY?HETe^^m+Ho z`M;P};Idn3b4`oM6*|)v2W;v{Qc`f+RC&@Rp(;rIC<4r_D2(R(5i|JdA=&+aXyu~o zFKm^O+>-J(VjCH9ucvv;o8Ya-Xt7E!pHE*E-Grp<}dn)LCs8; zJ5Jiuq%RKSB^B-NzTGLr%2dMdElBfxApvv3fZioL=vpl}x%$`;e zDvAq&Z|ncj$Phf5FzzMW!DM09zEU!|V^i&jC*la12&&Lp4mWnfi`cD3o}c3;Uk1^g zEXzNN7O0j;Ih)YBpwm8G61Ri1Wr};fPmjca-?*KV_tE&^m$0#{D-((s@)oQLVk|GXRd1e>tv?{y|cU#*#R0g2r)bSO> zssHnSaOnkfV%-GSQ|!bi?rU3l7gYkQmsS3G+Q6U4%~PLV@a3_`Wk1EOHUf3R1M-)C z?+FizvhA*$wA=mJ8BcfdC^Yo&R2ZokQsV&(i9bzNr0=~jDb|Ly#`D>1g5F7W;&;|Y_xz{U zJ*w>u5JJ+A@j!8E!=tH)pEPZTwIe6Bnnh=q%mlZt&4f)XA6_!IkmZvs1Rg^S zfsvq<+}cU<0LJVhr!V$ZzpQc=Y$-IH_dECl(z5+ch z_Q zF|Ax|vophcO-^{5iVPI~zBJ7&Bm8`APR3KZ3Y1PSG}!e!Hh#*%Vw7op5zp?!9yna<&*(4)A>O4)|<9u-0-dx!2>;ifA;mv_p-QS3t2OR0ORl1hAe zyfByb5buf-h4TH~1M-BN+0-*)tPtC^X>yr1ADYHaXeN2i?=)Y5yJio)2+8i9m;7Gw zVuTD0G4zG+j+wvRQaLSQ{i|I{zwO%@iwXg|X?L(K+h$oj0cayWBsXvYlbj^u!DObzvOgq?GX$+r>*AKUN{qO6tK|-TZr{0Bac7`BySZMfj{(F_^ z`>{y6VB}4Ht1b&q|K?^O1qjlYKk}cTkcTCzIWu-p{&PP4xBMqaS;4+BjG5py4<`Gc zpD^|)ykXi*zRSO_^k4Fym_c;uG2%vwJZAozK-Rx^)~4F4^jTO_^;=g_ghpW(zGNT4 z;7B>#pI;A9MzWfIGz(CLY%R`B~|aL1#dRJ($z~b3M6Rn*Y2Z>6$U+@L6*r1;+Mi7H_fp z-xtM*F6#Z)&9sVi6^Hj@r2gZ*Bg){iK1V;?M_#xs_ivfljd%RB$=q4tvg+UN->5)0 zuHppw$G<8M*kupl+U3uxeN*H)L3V*;IJ|LCq74Wkc~crU!4d9xJND`Azt$@KqW|K5 zenb)Yr9*>fj?%QK_+R|%H#c7KkB(V-AY8pW=D^v177N7hcAA^~^-rjRbYUIrSS)-f z@WO95;J1I47G2n%*V^>=K1<4;H!nGb;>^EK75ZMfDeNEogg#S1HEr&u)zx1w_D8s5 z*DhEI-ZKyXTAzfyhLu!e)}O=10eC3tZtwrIjbZsP<&LHkNC^Gk-F6to#N%8~c_a3c%`^YU zkI*k|>R>=|_n#VgaLHoPo3n_2)^$Szk1+%zP1#}h_nVO3?#~_nFAY2h3SY^8as0=c zY-r%Ummwcxe*3Kq>@_o*7Rz zR4GpJ>A-({aI~0zZXho_ji+|2{w1vwae!>*PiKI%Alb+!d3^7UYkl72LmT~-Kkxe2 z?IVNp(Jww=vrHo0{Z~gZDEs^8mlIgfL0grq9%p3a-}CSD_MgjCfMTGaAMKWZ?m15* zE&0%Y=%*N-hbO5`x^IXz0OS83g#+oeHa;BmLg3_hPaU82?^{9tV^bq;daV! z@hY~5vgn`58CZtFhw|$9EC%K?UpGH6+CrLa0nq9v$=iX0Sw3(xdQ05Lt$;BasRr&# zKfU4vbKjDqNlquY1^)uD_iLCh19Vd%iF9)+P}>R!H)89rJID@|{LJBwEG9dBJ!?3$RxB9anc_D4C9K@#k zXaQW)KOg>Uja|qT8Pn6=g81&sbEcAHFk3PrI&3ND($v|P_1Go=`KGf1=*#HZ=K~JN zj~Tl3R??Lg45S?uV2jROWvn~nC)}13e`&w-91j4Ra%yS;7y^E&)h$`QQ``8LQsYY&^ROPtapK zoUGBele8%RKGL?ko`Dq5<#8gQ>+*7W%u(MKftb;78F4BDzxRLxq(mbbvH8PuS`;P~)C$GZK+kdt>f8HC>2i_{C2(S{0E_(rd^+1AkWK4k zIQh#Q4Z|h??*-C1Ij-q{%`zQSD%mH!>A2p{FP(B83z1LXRfuuJ7 zE5D%&2wC=^Mifh!?CnOL$A~s*59FCV2p``hI?T78#HS~#a?5(W$oS2Ryf9NG4+0~V zX{DdIJ`%!8hh}CIh>7a6d&z$*!?9s;){HZ6VXSdETz39hFNnP$m-G%0Nx*lHbI>hI zxjxW2FZ6ACFF*`Q%Ag>m8149LbRrC%;C)57zQyY>p_+Yf2IJ{|r(~?eD>O+%eo68< zAdcxb`@`lZ(!@b_Toy2I9$y+X@#w5-h3L-}`0^LC5z8p$$@Yhe^!$@+Yy$)7Fua($LTAXg`dEeo@b~obz zvOJM+I3>xB6sB$f7L_xDdB=qhOGp$PRVtdktc;;Gt3?a1nB2U3mk*)@8|k%X4E_ASe}%QQhI^((6F#Ew=Z~;3@I}Ez^~i z-V?J)5!v)^Z7N%9!31bysZMyz@aC*TC`U0%u@};INKHTPj44mO;Bn)}Ed0jW9 z{|vC&r-BuWKT=X1K{L`wn96-lQ1+?vtbV9FikzQY@#ue*(A-Wq4C}iL?s4z zM&@At`jibfM^|pbc)CSxr+aC#B=4-N0!9qtUODj2vZ~5^l}n zg-uQHr}=;+EYOtDvkI_$Tm0|d!U^M)T};adF?ok=zw1iMRsBf!^Db9A1|$vF;S6m*s!i0ub3Sg&%3ur!^V)CP zbfXmKH>oxE_ar}%7bxnu>?==PSEZLdByxzv4&zgi4H z---|+Z>34E^wHZ|w%jg!sGKy)^IL~M4p&0J(JPk}{FkqLy3giA?h+l>*1kaA@(Cve z#DdV`Z{CPmft^-}8kh#exJ?lIn^MS0@UMvwIcIC|@Z-*K5>yjZV@wu4#N?RJ2@#j4TIdApi}h>iFQWcE|(v^;vQbZWFswOVECNoAR=Aam-Q9;y!Aauw;4#uL07m?%kicKvvZRt=NY=KQY6g7WHU~vG z)%M*H#W%%WgNFnctomwf7wSMq}%^H5%L_i`wisK zUQzJZ0g2E;6d&gs^9KJq+V=}51Y3)rVLSJHYKUS;;P=o4d)(ue*Eih4TO`+jo#%k3 zCW6+Li2JGJU{^vVHoTl2l7NfA}{*1u84BUm%K~x9X@HLCP{;U zyGCwJN^l-|gt`YXeMClvm%E#^hmp-4;{i#zp@>uVP_@+8l^*=!HDlI)<}Qw-T!GO9 z=LJ}NNYZnZyaH!p*%~F7%BPQm9W+8C-i(JJRxGHz>eqX$v75Q+K*>@f2QO%-JWAm> zVu-_elPncI0OlI&DZW0g7IvLkF4lVLAr-oGq8X?HQ9gz z8Jo}H;=Vh4Oqftw;JxSdqWkXJj-o{P#|=Oh92~K}{`4oE>^4)iz2KUts=aU==$bn3 zS|P4885Kc3wQ|XOpE37}j;A=D$yAbel`@RmXH;Uj$v}zU4Zshvo^3yp0&DkmDQUWy zZhOhk1wjH=?N_d}(?o^4oc_+3Agy~&N-pr~KeU|5aSRr!SiDSmg1XbhrHUnwgHK@y zx=K`!^78uZ8*8EoJ1rbk)@C66==FWRE7Vx|EmC?5eZe7?hXFZ#o+D)7;1Ix!^kLrz zRtx=GH1hyPQ(QGOK)Q^J5H1fcSE6)xL`+mMrq}3d_B4{y6Tke1XYQqz+6P?eq%B@T zSz{^^&-xP(@t?Y%#wnr%X#y<7@)5CUnJ~_FLzJiNJs`BkB=)S57+VZz`R83`W%+5T!(QY+zd-Ze9|L3@IOaE zqu|@idWDr6K!(uIlN2sUDzUg=tQN_RAd(1gi70RL@D`CFdyOVR77nT=CNk0u7DQc= z(D*GD+ySR4&QNT&DnyPXaBOKxYio^=z5Ma6>QBir)z4>52i%5_v^(qTrV)OgD)ch4 z%P#zdu$X|c>wzs9_v+z2xw;%DhOZ!cPy|t(?N^`5woI~Rq@R}&9etTQTE{ztdoSd_ zpQr5K*~k+1no7apc<1Vx4H%;j_h7XAmVC)cdPN*YFNFXl*5DUaLCI*;u`?lf6%Mm@ zw<}6cT93P)uFn0uooSR1w*LyBPlp#kYbAWxc#3k*Kq7$P`50NsGvMt(Qk8wlz;=>E z=-k-5m@Aat^S^9ta~Yg;=(}t?815X873SeS5p-(!aD%h{)3o!l8D;{%cgQU!IKYXL zI%yqJMJEjS$^~$ZcPnV>-SKNtYgxErF^Qf_x&?%=mckm}Cxa)`(IQQ3ZyrVkGxvF( zq}*6b7$Tx_Gn9?~+4Udyk`=&d^+SO7jeRmXW59nh;u|>zatbI_AFbS$2Pm`WBjfB0Rud#Cn>BKo$fe`uLH|t(gRAJ=(t}_;W~?Y z+~m5RVu4ijB6^kcP2wg#>mbtL3pLa+@tY_|N$3dEg z3pg?Bb*IYTO+gQ$0}0c01@l)_WH`eqSju|hgE5xa6($ONOP+{=En|>ApM!!*<8#1e z$-jCMFgI$a2fz|l$J>COEi~M0y^KxR2hPtNV?GIUw$V1@4t2Jgm%?cSrRRrVAR>62 zuv5NHtXV&gNb323R_p{+s-Qz=_3Tn`QtghDzmBbdJn1h07v=@A8m3ztw=25yGSi1k z;8h~+d;t&7K1>f7X6?Q*D`TgvH=$lIyyyliiRAm7ViC32NlrR>($BGS&7;|qtfjmG zgc@0~7n;k$R%rRN%t@+7oCsCv%C*3ID)@0Z*NZ(^&b1;%w-d7)=Lxjrplj{%@v|^F zf%PBfy-!*G?76KGT=n0#IBpq|YMBxa=i!<9CPicSB5yon8fxkjD#w5#7R5e<449At zaV++of(7AoC7c<{CUX>*n)1Gd24@5q)C|KTI_D&oelpscv%PHGX3g@c!9iBo2WHqH zrL6$UeqtR_2g15}$K3mwdMhtT$~?Y1QYF90F)?35NDXMy>0iYs69KMTh=dXgcF+oo z--O%7;@-rh<^)tC(Q>by^zADC$t!!YOkYdciTq;{htJ%BzGMr}+n3Oun}ZWna*g*g z^4JN1nhR8Hc#RI}Mqy6eM?Lnd-1T1hU9ZMIh+EFiAN{YzaoX@$vQ z(qCE}8sKc@GTO_~K~i*G1@rfE;5$=1DxOA?h~BPmTRY-HnV(-Lt}Uo(ERCOC1s#xv zTWOzLv1A}J~0&@ia*DiTUd3`$7|C`!km5=u*nbPgpoGz0wSs-U0$`o85_ zihA$4C-&KApS_>`Z1<%~Pk{dUv=8*8O!+g&xpf!p`|FECRhCVUh)y8~T=!bY2Q^DU zi=kI}%N@WBAny{SpCrF(FmE_*kB2B7Bw{ZeM4CX5fu9IqEI^*y>aRN$K#X(*JBs+` z5=f2r-L=-((%-xHz}M z;RDERA4duvr{cc63rJzFN1TyX4O@7W6}$u3la->18_$JqjxR+ZIP<8-X4Oz2iS$)9 zj=y65jm2fraKtDJ&-9lJ6@i44x%~Kn$CmGLV*qSuJG*`@?E9$8q?W0`F1W{xjs$gj zpEDP=Q3pw#GT|%LAYVV;NqD*x5)-K4cnx}ATa+gn0~n)k0jA@Y|fW6Hr=1QiG*bkb=89YQT z0Rc8^3bu-EU+=H6hZZ9-1jJtD?N)1gn9`_(PLwWU0yJt*5=44EX5w^Vv_ zks?Olj+cu%a>XcLd}DP{ zSJsS(23G1#r%OF%n4G!vPN0J=sXfsZSAegIjIM zxGi5*I?aG4<00CVjY=$0x#G>r>AWN2yK6cTz&jo9peLX6oo3l; zyat*|ik*|DtdtfS11y;fwLsexdElt#p@a+*ha>u9;4 zzyJ70PE7;>Y-o#BtP@_}WY8%t0%{ryWeSAJCm~P0vGC}4-aQgv5|M8Y%>B%~fbIBL z7RHmr01^Ibz7^-2f)}pc1c@htE)7zH%aAu@t4^d7URyRU%?BbN6_aK1(wUPDmHdHF z{cnFnnf0?^1C3yi57~#>e)vl(g8v9f*Te+W6vZfl~gFDJR+5`RC~Jn`+|$W z24%E$7Y7aqLXT90tC8#DT99)ZbpcWnePU~EAVvQ)$*MVUUK^#!a%rfh$+4@8p3G{! z@VU#OYL6GG@pFi()fhMS8j@I90;1!Z&~Kb&f!#V5aCoL#A_GZaL(V0&K&jR^JJqU} z=6Q6TT{5kb{`!IbQ|RPpIDTYYTf%L}N0Q%3zhn&&M$S&z07oIEAm`w>Gxl!0piVhT zRxAu&mjQ2sdL>)-sOfrwMvQpALALID(dy+evHs;vz>uPtUjZ_eLQV)--v^37vaGWE z<3*j!`@klZ<^jn$eO&Gd(Q2wA=+k$N;TfFT>o}G0P1XOBcdqvZJu2mYV#Zmxm z_?rsd!;xsFK8C?D4fXZ)x%I-RmF4@is+ugb^ttba*TQk(Sdt}}dAWZ=6zzMkb)(Ua zUf$Umv1EW+%yIK02STu#ia&Q!eSi7>0G$8DZYO##+QU3b#Yy6m>BgzfVf>UR%E@{5 z6{hou`#m>6v`N&H9mgM|ZmK;a2pOE@z}xDS^xf8^VBi08{mxO~B+bDzJ??kJjCh)X zC=e>k#BBMIL1CFgs^BQNL8?}}oo#BLK!XfX2?60x`tQWnR^fwUdREMVCqjS9Bjy$v z6CSPVxAE$ic&44VFr^1k6R@QAO$y1 z-AMst`@9aoJ@GE#x~kVF6*F2;XXo)!gUp`b$**P^+SwKBfU_prV^JQxUP&HUJx^+e zgUijIu?Fe9&7T#9w?M?m5BQOZVGYsMYjaMX>#!kuS<8BmRYhkQ7Yy9@Vyq5;L>^VW zX7}O^f$xWf(aLh@ zcBGo{W{Cf$9VT_|d=GHDv=A;bSeR2t?P8?DctAZJd#Duc2SAWT^VQkD2-J^Ihca9V z!w3iJhV!)UA3a`f@gnrxN>*_nXIK^!r*X5qm-rdiq1V6m@_is5Us_?vyu;0%Dl1Mz zl0wTA@h&a#7!2#`&(si&_Wt-rM`rc}_H-5z;9h(UQ4ikYU$~$t35@(Kq2edyz{^M+ ztZ!fhn2p~9t|Z2Av9W)7JpF*+KLDNNYEBXtf(X5h`k=#ZX}h-uq01GcFDjW5A@Q0I zg#|1d+~8omh;l;NzWfS~o(5bU=|W{hXIQ21uHJYAQ8>ECbLIo@Q8NxfkW3>zvCNxM@D$|77kxxN8xU~8Q48>oOOibK5K zAWx`v-S*T7-yZOQ3lvh86F(EQROnfhSv2vSejf53xUHk4KcO_ZDS18aGII6Fyw1G-b%6WI?>esrGGW@(xs^XKp`0d!yB-fxZ(@*1q} z38=?Jtms6@aiXo5&JdVgHsN`N++)0|;5fAXb7tFR2=49g7Tx`&pgB`z-vzpnJ&rtr za)V88aZ!)a9T8kY^J76g<``!HqQ#Er`ms%L&KX37Rqx!URr{gEq2IiLN~|G%ne6ms z?dN>`)bB+{2;5;aTM|^-gtAqb{pgE2D_8GcN5v9p5AI0;&Ru6OKcQFy%(II>mc5-C z>W$`ImR~1gs;nPD9H)Rb4E}}qH30^*ub3R{mkV9djEV}dQVlX6ZfmOk>H;c-WHUF7 zBag1{<=mf#suRka@<=D(dyRfnWS%11xR`X5>~n&K+jZ1kBH-zGn4>oZeBC)-HVUSg z?Vr-uZVb9nwdOH**p1t;DQ%07aFRSai#CHqB#h?YwyZVpXS=V5@&25QlTBITuVgu3 zAPvmA+a7p0^t&sC4&UV`qS)KeM#B2<>K&{dn6J-#vVne6%?T*iJZ_XHY{j)Y&T{?3 z-WY=O+G{D-1WO``V}S7V^gosT0g(F@01$3-B)TR)B{!7**^2iCFyRJooD2>Y-_{%> za-2yCHI}>%pCE1CpuP9K2wh4I+mB{zmDEo?33CqE>Hh$tif4fJS-jLPPyL{z>bv9M z*S!A2RlH6susKZIdCTff%|ZWx274TQ1cihxy)K4Nk+wH%IfeJ}^+)vIs+kApvwmtK z3V1Hpd=mBNT!;2nRnvesw!P6nuKJoD7lm})6Vu^ zpg9i5f1EQB?DFU0FBo(WrWNd|j$_l-gtA;qZR^*rbw1-t#ki0fUjMlYrFqF= z!7?WWND*XZWm-j~ zj}Z94HjbeJ5vW};G;>jsuj>ggUa>{PgKk2)i<}A1@|n%y`5(h);w6A>z?Upvk`*U7Utw5-ePS|G$>m?gNG>`~mef$W_?^(nb22gh5Ku@5w=vX5)WMz61Wdky_Nx@!i8zRE^nkXPv8h*Tt zDI_y=`uVuTF(9B1pUoY%7{xJ?LeJzy0NaMI<7l$IRwi*`2Q~}%E{2m7jB-28@$hTl zyG+squpLnL=<1uX^dhOU_AB5&Eo_N+N`DH>ckqgHThqWnw=otZhGay?Npvz*N#WbL zdrIfP zcs#0sp}m-j;UR$S3E8wZr@-Sy=JpT14vB_<3J?^Y`zv^7wLd=bQ)*N3upZ4Hok2~3 z6Cv?rg8V_(m>dXHvVM!!kDp}az{d&FDT;djI5mE~@R{F&@~1G^o(E$6B)sY1YpBs< zh3S9x2-={JApy$b?7zRJbuf~{=U2!L<$q537tpCrzRW|F{NbWS_8$`WV-WE`mjy8V zldxan^!G4NkGw_S!}HV4gVR0^j{L1STV(y4c*OU*-Jg2f(nS%`wbBTMrDZ4LE-4_n65H zh5i&Xu*Z%8$&k52JVvW#|!kGfT|_J5sg zR0lnHs=Q(7*{`o*rb!Jg|7z(N*g!Jph$T$bbpBoi%|lVLI1aXV#F$n|>#yz#e1rA; zVfR22m%0iTRwdxyM1%HUdiQWolKoyZf$QL@Yjd8)#s~diB?H>}VCH|UKIdzo6KGim z)^n_X?ec>u1&?vo1d9B)Wiio%6-m33{wnKWMIvbheyYL4)>5OPK6x2R7DV6v?*afM zfnqOipUL=_go3do1UCIO8_Mip2izilE7|SJeXwSSTj@|HHLXFXtPtfrhaIuKhN=AP z`3x}S=FjB&b{~~qJ(z{V88{ptXBH+MzHieUf6Tg>Ia33DCR0868D)&}1zoPH(_d}) zso6ZTb-fLUn}#>1XNETiaQJ0>wk|W8Ek=2FGDRju2K7l(`0i;WU?nDJRFtRHVUIPlztv-;^9;R9HSc%lzh;^*f3b8onF$@(Tf?_BeF zXJ#I>KQL;Zt@}n2PkijTLFsRch3Ps0dH&&~{%E8<76WX=Z=Z+fnx!fC=%%rJ0Sim~ z`f!pj1pv5&5pbJoZl6Q>F*J3wY?<|1UTPW+v$WhgiFQnp36mj|3Xlq5UlE@GqXYxq zJQd%lT~mYKTfy7;Qf+PtJrPP@F8ALPMr`1B!T---spq`*JojAAxJ!6~Ki$0-3Wo|) zWbk}9Y<*XEYTnw^1_bR<2p{=q@46&AB6}(2vg38uu(MOHzpr%y0x*Uvhw}GhRZ|}x zS#}I&@7t~}1r5Muw8FR--$Io7=ih}wjaXnV=pkGYq37TH~)m9)MK>|+tMXy%J{3TK&Y*yR0`x1o~r-euhoAn0I1TmKd*K_U#tA=!TJLm zF|YhT-;%usgX6Q*lbL}pHXh;UeXU>d)vYC&jGN!?6Ak?5x1r5)*jx8&fky)u9PC>4 z|MOhaw73b&|HBx9nrP32HduY{v^5(TqN_efIsXX5U%C${!~>(kf(GbH>M^a?st3}A z5g<3bdoYNf(u7iC1c%B@NGhJFF!_L`Gn(y&_`y+ux^024os^mufkZsd{#q(Dkp$J=Mp@EAzAj8(;Xq0b z_v@i4#SShb`?qE*oDceD5e?7F{j0HIV32HteLGE0l=ORp{%Q+#U`nArK}Wav!oqL) z)+3nvYe4P9;6U<|y~`K|H_1F)f&=}0IM!VTU`9K;Zv3_mX@ZXawQ|zHni$qG6CKJ4 z+&Y-$!*L!8NNNCB)E%4eDZd}dAxb(lZGZmj^b;U!XKKs))Zr%A4%;|TMTc{>eHNU# zET0#Ci$rR5pvv!tfBaO=2OgSBcXD|F%l}JJ{JEM{Q16Y+OMag(?auW^Qu*)w`hQn#%~U^v-ov&2(Wru^1-Q+hr5ensuHAQ1Do;)!Db+ey^MjH8wq~ZQ z!Hg^MsFhbkh@!MOPkXGd4;gu9f|63jlh5uXw6a%zxOG^EU zF1E`Pi2k*E{uH2OXxLX;JbuqRy9P%3FFRfslCtPVihFz(|7(v(gNgp`mGFCFECk>@ z5B_tpWeLGUlrAR1s<7WD*#Dow>(Cc-qW}2X&)egF?Dg|NZa9ooPw5jh{f`m0fTu)7 zFNGZT17ksMDDl^P1pzsQ{aa*3Q%Lofe)z+_XjcTQ&vrWQrxy=ePKt=Y3wr-4B23UB zp+0)051tos_{oEAAD(6Dpi^0tfju5givH0)w53jo}E-0f$X*NN?;}}RyxVJnv0b&+R;X%gAzvh=o87#NF z*H<2Q8(9AD=Gw_oP_D{6An+Uo@RCo#py;dw56ESz`Wn-(Yw?l@!b~jzhUQznq`gh6 zGo2rR7hSB&udFIMscD2IZ8y(@l1 z_LhGMy^rSrWN_k883|Gl><;h*r9t|K6(9C&f&>PZa6lC80@&9d$N*1ml)g~VtpUBg zVA0C6r$A_C6g1>i#WOWuhN&fHIkgAI8or1PHOJrd1o56r2=h$R8jX+*TLg%LkAk!d z67#*4xDOzJBVI1nB9xH- zeiOjD&g6qDKp`l4b^jWRpS!MjUJ1;D2nrw+f;_JW(BN)>V!`C--Fch2Dc+qR03jP5 z4RiLjWEFt;HG?5c{rEY-2mnJ+b!MuO$APqr^ys?e9%TDRT3@)8dHlXfhTOmjcxUbbfmw^hrQNRy z5M48ScATxfyDiBs(3x0OQqsM@Q?s9IbapsdspUN_2MBx-io6@QiV=Azt*+?jANI{g zE8?N#5FXI|Yp)$YirmE|cPt+bv8e0X`Z~YkPLiXyeJ+!kkE3X(uon=ajIx1nf2riK z(9o_->*#%$DT9j}w0EX~Yn5ft(z%6RGnEhpNc4Hgmq6L;${PRyMGdV*5u&yR3o|r;c?)Npem^<;x>j*y{ zp30^7eLL*7SHwXHgCfS$v=bv#H@17S$l*c3k0IEEKmxW2u+E$52nAgddB_&I)W{am z)pZ9fMZVIU$3GQlbIPXi_xWTHH?>}WnsE$PdeKYI&MI-)m*NIfO}`I4M)bfJpo1Qd z^2>JuNJ70h;>B|#8wPqW4nrFlIDGb+-!q43nV#|X^SPn)OojyHnXB|f?sLqz99m_u&V>!T zK9bx@`+>r-Rtat( zBP96gYcgc;#WM2huUL0Uvf=HXl5d}e)+)34NSOz>proJs0CFNNG6@a=O8YO`qyR!G zz0S0ll_l;F~l9Q19Et!a2JFSwU7Ngd(!i>La-H(op3LZB=`lp-NMl5kG;gmdf4l z&eSTr?{pE_(Vf}2*Bu*n2{bQv3jIsmbmW%}D>v)-`PkPyQWTm2ZoJqY4V8)bBW#7a z0tbeY#;vUUT#N-NxU$WXwY1*b2Y`k1HaSX*rD==w`lW^cY(2V8+T3B0}@^Pn@i~7H%ansOL`e z0U0s+v-Q^Bh7@L7*SmadM#$&V!4b2DA7;DRvVEqojm72(fdVHW=gDk_zjrD57X zZP*!^1aDPH)8nxvEw@+_!AV$}Ljp9<2H_x;{soD&K$z)q7aeFb+d@%*SL2S3U^7#q zKpq^M0{~=s^gK+;bH{hx??K2c zwu+{7p?n zFIp|=QzooIomcptEL&|&Dr`jGl_UEo>SoHNR){xLulre^>1`Zg8jFB0xbL(Pz^2|Z1o)yK8jfb4 z$qeAsivstvWOipTr^kiiCLmd26x0o&a8DDeexekwIGD}UG?*s_Rg~yQR`gcrNa%%I z@1W-=-LZubzM($KG*)hKA5@mtElET}Nv})Q#QDjhKvqzQwb!>;rYeZwj@lluUBl&GyUM)P0;u`B^^UrS ztiNZhF64TZCzR%kpu!=2W-qGy4^zDN+73rnrsXjCQtMw3gT#f=@RM;J_rl zRl8jMy|PKt8zA?JM*QrH2C5)J*WepuDOn3t$spxbr<>dFx}f3um$+(o?b)PlJSe|X zR<6fT(g`SM`nS5L7iDCITV~{TDpivs(z=*L@`k_HwF$L$$dT@KdMbF0VRkad-X1#l zEzSYEl;Z`q{KD}mz~XeLBiT?E;~;nEjOWcj|7Dxjq`t5g zeMienbR8yJjbP6y>b_56Nnw6tbZ8P#8|=nckl;h8p}usk zQCA?5FVgekJTYPkg~3Ry(g%R#*(uQkwN4g105P9_iHvQZU@4Di4?cC+3HM-ta!b5^`mK`P4Yp<5N z3;acrK!zyF(zR1f^nq@#$Xc;b$10cwkuuWRB$M_JAAyA{?DO>IJ<7`@Kpov=O?@w} zK-dJGYmsE<7(=5ZhUbW$mF0`oC;7Z`s3x4AAW->PUfC%k8H#bZU5zdq@vNH!r8fg+qjN zwZ!k^v1_;F-o;f;To{ch@U{8@c_0uAa)3uO6Qz7rIHg_t$a?TNblpP9gr6X3u5+Ah z0I8uWhCn5LK-TOG$}UA>dg7{AGs-oT9*2cl$uR~AP~^#@mmuT_R86B^wB__NNar+x zkm^O=Su;1s9EddCp zqYD%!K<9k`86t*>7oYrN382-mXH9$+4i+aN3853ujhZFu$aQ-li#!Q;xf!tKo-2>u z>bhsSoGDs$u^A{aqxPVq;bYr_DQzqzrHTWP|oe5*3cTL!ndcdh#A3vxCiC zq1B*u-}icMXBEEkR)4(PtNgcLl>3kud%r?PfJnW|Ud{Tu0!nwAIvXfUwom)DX|>;o|H?BR)YK%yzQpFh)5*?QBL4uRuW+W(c=ODGVfF*!@4a3m}(eSuXqqd_?6 z!6`as(U)$j1)`b#FlI3-iRn~tqw=TftYxKVXNMw!iPxJ1N1fajSZ%61Fs|5v7lIKS z=e50bdc`SaCnj4xgAi~pTSHb}8BOPWBUp7bcTHZ0Fo7~Njpufj79zGI^2$AG4Plp8 zkv*SfkAzyVhPk<4)N(%kc+>jBVFabUCL~TIfofvaki?zTThT z0N8b6@pJlqK*0TWwiTIT`=T<51=Qe~BcycowT_Hs7Sp&cqWnsx&(4=)q6u?)a%)RJ z%V*2$lXz>C`&xdt?+J0Nm-nN#2fp&^2o3-8!Ntx}C;q168@2KEa?C-Y4G*pAP+67$B{c%inUDQK>5J0B&(to;(=L-AociN-l$Z~X=c9_oGQ-fgEL9y zIL0{xK-k3!Yd{48UuK*Vdhkd@# zIhekiE>WqaxZVb+Q^o<6WHX8*0FZG@nV5n>;WIn@`SK%ZBn3?*Cm(k!u0h&rO1*3B z4PFX)atfQ^zu<;$;uMFJjmS*)wf3^{SL~J{qy?UJ+;2p5P%#Pt0}xR}pZ8V(Gm)0g z8b+`N(OGxoh}ZN&kX1IyQi){)zOLPrm?2V*LkGes$zBaMw&KCPKg+b4;^yKd@JYLv;X3G_c_DT2J{f;8*i=2x5j={IV zIrD|bxHu`87Z%;8dUAisoe&vG=j&X|jO+?ni9&+|E%T$}vG}k~*Je6JSBY>^+xi(X z|Bg_z;~aD0I+ToJS^A2nv%I}JC zfK9&Vh z+XK65$P@6A&GGmJ_;k>NdV;-a_1#gXUX8Fmb*`#G;k~aKMCZruYBw5%=Sw1785f^lr8SL69bVXvHg`8dO1%=lVC4aCah# zLnaR(&bRs;B)Tymg(JO2g4BWTlr4kFm5Md4U3#s?9835+o6Z4E$b_?|r;e%bu z11+ETw3`&!Y?Eg%b9)T6cM}fU6q@A{YD5b+HK{xSnUfpVeY1R7&mXpBl%KHXWo=X? z{FL{JbRSI?>*~lLS_yJ|=%ehXbWB0kx0YJH5vfT@k%Hbn$R)JQB<*YcrpVUcg=N$5 zX}71FTa(S=y)Bswu}xa)4c$@oOM8Zy zO`#xDSZprN=hKBa3Slx|(3_;al4(j8J{CFFt}*f*$=^KW?Kj(ciZ&5EVNmRIKz%|+EaYcBaU zH*DdV*tSKoQdVPH%H%8wHAp9LT2!!!E#b_vxybwz@vYQwH!4t;0ZM)%Dko-TLFTP= zDI(01oEXlBZ+$yW$1}>es^7!LdQDu6xEgpXj+P6YJ0f3lcAyGPmebwOx7+I`>fNE91F;bCg3@BoMFo4AQ~UVxExVxbRp%6q&`x1}*W^1qrF+w#gYxf>t#paK3xI{! zRr*pfbUwmmj|AB7V+@R z@_H*sV)QHECo)XEEzaDr<)AELeMg9}|Hg<mAFmy~-HY(LLZB1Ja>+8RlDh=u-!jO)1Z%3$+ zFuE-%*JqNZeD>m@bPGLneoONvBTqvu1C zM@bY0KoT{|!s&I&z(v)iz%}vSn>C}&SmK4qHb6NoN=XXc6A1Yw&u&iwOlpda_#(oG{6&sOC;8nKMiU<26_c};w< zfy!xGH|Fcp&ehu4l&o1WpDn+ScHtNK>+m3$nj}&^v2g+?Og6M6On{~rB%Wgo z>9RQzCQ#=aT^6sO#D7LIwzuDTHePre|Kf~kVGA?oMFUqwk?<*8CGaa#`ejl_E5Xmv=u@C{Npmw+U5~i!*NG$8puAR5);%qE5>}Eqt8y zqk8hBO=F1Y3L#V2Md7gy#U`)16+8y3>0jOFF1V?&R|A}okAEX1!$EKlsfvA+cEQ5& znpWV5klebCx_HL8ljCMuR0SESeUFgCalFh(AmMv(I>P!Jhdngz$#S)~seIQ)HojTZ zEj(AFwlWa{g~((Q)q3ZivKhy3hDg2-{nQdhVtAhhfKgOpPBzso*`Ex?Z1ff>y)pr^KH-Tfkl_NrmBh>}&=Nz=O;BCeH7imDMmJ z{m1PwaAPz)tE^+SYsRcKmL0=_b>e{;xFTdSUxz5f`Z9MG_^;)j=%$!Y9P#%jKyfqE z^Z=eQ-#gvHly`(vbuYB0C=oS@F%&UIM3@1uUW7((A}i;06aB?)<;hnYTiw*g%r`=< zB5)=fz6i#9sJgZfy7I~c^{EkMp;G4c-VMBH4w=DRV8u*eeMD>c5e8eT6K+E2R^j2Z zfHcQIQKazlw$s!p%U!(YqVK#x0*O1e>4WfKT}NqyyFF$Kq?1vcqE2B}oK(u7Z?jr? zyFI8rq<+-DAIc*V$z4fqrPKAL>g7p_!KnC^k=|>oHY(EF&zhA3smVr_9Kpl%mF<%I zfQ{*`@HzT6!Ib*j?*tQfzbs+IWYV4fY2-%&ptbjfk-Gq*gjxY^IsUfSZvoP+osa-# zI*{GU(%|0r-t^9ZqiPB708zu>tvZ=??YfaCK4*3`c$@YK63o>xfz=qD0E(v(h_KLr z<~v#3DCt)i!0SDCT!@iB~PV4W~bW#B{#+3`tS&z$nVQUe{0Vlqp#onxjSd9s`a z>XguJ*%djYtC0n9gkjbL&;7xD_b80Ty$W+WbKpYTU_1PZahbJe2$2S17xx_C1i0Q= zMT9!Bu%1_YGHPBK6?%EA~`QbVqj%yWFok1?W0n0NY%w-_V*mv13 zX-tZ9DtF_=({e&|*1YW%u9O|uMBypt!rG&*cYReqeArZtB5jSk8S9OHSm)dN%Pk`- z4&O8u21uGGKan&~XbPXE@nXi8;I~PX{by9n$p*HX20sj(ZZ&lq5LdJ)N})wQTDJ9c z_2PU7*W_a*|lFQ)MK4lrBg!Z;`~J9e`<=%(kEkkZqWJ^;ieBqQ6LG z;#4+ie^+ZY%_sVqDrBm)wH)1M=ijDrc(u_WGFUdz>wNsJ`e~m93M`*}xS$+CdC&{= z4F2*-HC%>9uke->U<$g<9YgRC@bKQ}cq6<;A>DS8F|#aiPshY7B-NMIlB@8%`ZHI?m zIt|4`HmY3CRetGt<&G!kB3bAJrtpnflUXzM7iEU$g%D_DduCapgn8zejg`NVeK{jK z4zP>(+$Hw$4;Z+ZA`?NHp91cLsN42X%uP5Ri)*keZ_4RiQcuxuYw(Y`*d17_Mz&Vn z|MJ6?;D^2?$ns&`4>pqMEqp%Lf}|exN;-3|UDuRP*yP&L>X6W;%|R{IT+ue9rK?d@ z+sB&-Ebyy~!ki!=8|OWM(ztZ$>Kw2~qWEMr!&nJXY71Wr3|JS+dHKd8KHY3D?5mQi*0xjLK5z!|wyW}3`c9m^mh_@nVl z!ssQ{2LO^MBe}wDkXf0)CG56CC8-lZPC}sV_UZF+(*BY1ZKe=O*kVl zm)}v<4tiUuO>%_sB{MM+x3>5)Yg}#jfZM^p+wn}aTBb0c;}uz2ttI71qM0SSI5Wgq zGXye$kIxb{}!XBVcrM3Tt_zFfUFpkC!Vi`Q@rUDH9IT$}yEX8fqbCDpZH=(WYw zpj~&Zf8+%<-nFwTZVOP=DO7anXot;qhqkF8R37b2e3JgMd1l1!Y-ElwEoP?PtpzQNJdHG=NK zs^y$8AWT>LU~3TzLW}8B6hmL*>BEx{8qP^2LxQ1r+P;t&> zsoTN0dy<7SxzgRNg4`F4>caRC-i$ag=1JmmG zbbXM*WADNHPvQdG0Rs(f<2@F;?B~-TJ5{oM*S=^YSF_gR$i8O59P4&hFK}Vi`~K+C${zK? zSU`8K8U1u;wN^XY>BDCA$YinJN#*ABY8IX0tX)nzQ(A`5#tJoUg87@(>R67I!J!$% z%pOn80`LXLpdBTWx21A7yi#Vz3S-*db~)b%PE~5PCI+G7C-MEe&EfqJXnl~u#RrOS zxj-o=3*$C3^qLm3M4(36q|0i@wchA(j69dErtcFz|!a;wlHo+GiR-2!P2umX3Wwz8>EqY#|GGBOdAEl2`TATKb-{DOvTG_ zVZX7488P+2?1neGyE+8aE0;747ODpT-$uNnT`KvxZP$WcKP^F*j|yeR@vQWeB+Xez zgBn(S{0BXHiGsqirS8QlBx^VDcZX>$hu@w3C+^zg3c>URe3tp{%@W=^zYONb+Wa5X zMB101-b$GmEu}9xi6yo6pX4?tH6b48Zqktlj0LI!#b3n~0?XqII(#d8R=hmN*k#(> zxi-<;m1mv(6=P(q+9a~ut{~V9V_CeN5{LUpG#JrAIU7|v5ify$1m~P{_d@B>>5$}l zhRj@sDQkfF*&sr2+XbEvaMBw5)U{=r-Q|y7PgAW^K#)}dT+gN1KFl(=Q)Tz!`k42t zR>qU6{gjWh5XRcWxM&V~ymN+s_R%;HPQ9;IEPT9xZRmODmq*rzKul&}>^KLGpCe)> zEmcKX!`2qg@az#Z-F*~b%W&`Rgc4=8B&ALmd7g2lTdaln%v!K6YtfMDowed8WU*O6 z>}x$)=2K&r_9EGjD5bL3%mWyN2`h=xh$Q+<)r^X$dc!1KQ9GDNqr0Zh^|@fM({B2PPWK2hG5{dlNU}%l5&NlXZW}(YRpI-g zNQWU{Wb5_46g54ocR}5Po&LOiMt{0)p;R|^AGjzCb;=bQVp4YjUj$t#cLMTA*IbrF zO-C2PR;m$ecR4vnW7)7UYz)h22e?ztrv=N;#%Ij;DdrC5rOysJ8h;j=m0vdD@-HqP z>-^rGk^tMqq=?PoDQqwPaQGWRp zcQq22B06ZBY~kW4dqdS-c2=<5eprTzl}}iHbw;$4ZAp0DcX5Cv9;A1<4Q-D?2>R2* zW>W^X#|X&eq$liHBQxbcV#*(&%0Y7`YkYH(Kfo&~kC}1NS9N#U?AK&7CO|jtR z56(0XI5S=Y0B5i;g0ONTc&zivgi_3dRd0DN zF*I3V#=2g?u}d`tUF$mQc~Ra$=jc=CLL5m@=fYMsDPqlmhv#{WWSWlc;C7{|NNnc% zwGA2gQ^2>nS_lf-roRzZyS)avD!48?jVj4|b}Fl~%Fhn&=Y2{>8*2$mpyEf$!-l__M0* zC8Z0rDm+@MWZA3?R@t8n6%}`vRahDxIDG1}u0`ou@Okt)-x)8W(^<>eXjq@u%TdTq zT>$KSjMHWuXjcg5_&Stzy92O*0M4bNKEPrnbrQR8*L4k*vi{QLpSK{aAt2xxYkzs;Y>j$JmUx?_t5VE8R-|C^_;o3U zI)!)z7ss0`NPQtcc~6A`Rf(iv$+PZ>UD1D zk*Zm11A%X&zZ_*huja=eDJqlhAN6kg_)+vLDDTzZ4dq0TOPi!6iz1*YB!Ogp2|~zJ zTUtK^rr9+Z1oB9&F<-bjNtFHlXnAOz1VC|yD)ss1Q1^D3TDR=APf!^xkhNZZw!=Z+ z#VVWF^i(Z#kEWHOd5?qM@V01UVva!$PZ82c$ougvH~#vJf%d_wq>r>D0%&`WjOiGCN~Ix+CeHy@I_yboMtEwg&^%fa_^ z9+V~A96vFUWK| z?LCr>S%kuVvMy{3_gt$BHg(4vK*%|Ma9L?c3?f8wy(I3$p&2!7J;(i4gow*txr zT8T~UZS$S$BTgG*Ijc>ks>XnlFZZcGKwX6BmZ<9`e2Z5~#%4>Jh9;hmPbTAIFdu8| zq^R>CU3E$6@i9;o3`pWARATD^1_uLRElr9~3JX<-3n2l;u7gn#*r{cJ{LcPO1~c_n zq@d;O#qgUcUA|TI*^<9$Td!8c(N|*0dq`P zFt-ytRV#Gy;mtrX55Arq#P@3nkK|lu6+Q@zn^Ds3IxVJ~WFwC(OMl)l=I*Z;2_grd zDxW#4!%_2TGf4&@{S2$@6?fUQKMVL|e)Uv9`o}1L@6;+PlGK((DKWTgK-*J*)cq75 z8_^<0q4R(jN*{`(9a&hqxebDQDHI9}xJhi;?HI|_nP7JGnJi;3JKN?&GJ%g)?l+>y z9#um~K=?7sYB6<3ZVwyd<~Fgl20t!NqtpRn?S>!kPR~7COGs&qw3lV2>2zw38!wy7uQ+P<)r5!I18db- zx2jths&H(mK(pC6iR0@B9fYucyP|>{%}-q+IIXdVS$cWU*g^nvyP=G+;4(Fq9mTQj%Fm~MqEk~J zKTumdv_@N^WT}+oblGXGb>F{l>a*mVsJcaQgr#<``mvV==r~~)hK+Zh*c0LF1|S^W zhGh(6Hi?+n0>d%vY%$3RU#r&G(aO{%Bt%ob68?APJ|Qv}cbqY-pjl_p`UBX$iHi9^&$sK`Q7~44ukr1QQp=2X?EL0(0Rv=Gnm*n^OUl&6oj;=TP++~T$YIrH&Sx9ZXgfS*~@Q#wUB zM6Vemc6$m+4M<%MTDUPwX~(NoS8`jmM|nNpccamwqB=8akIA&Rr{-(mZ0KOvKc8RE{sDH1)=Gq&(GGJ6{ZI z0Agt?rriH7xQ}6MNG3mvib2GCeXorHtH~TfNsHf5fn{l&C_%c`A9#yXXg1`MJwHF< zI7Olk{k6!g^+a8zn|4a_%|V;2DSRTC?3=eN#q%~@#MPpq8s);|Z#PzOPx;!lDew6r zaOcftuVb0+v@RnaLx3)n8@f&X%eW?e3KdP8^Ftu+d0T&{6%Fe`>v~?SEmC%PHQC#9 zLiyGpwr84)h}!xhZG@VhPs{%1AseT#9)p-Uu|W(2Us3TX zklp#wrd^msI(}OT>@LOvO{e&8q@UG;I2UNss?w@WEg&oi5>h zW%G0rA}KaA7_t>?f2}jhi)ptFFY3OP=zajk|8W!?gy}@!q~*4$1Br{lF^)qt|P za9VW4b_*vro9?b4FU50^_gfdzI$)?b4Dj?cMr&`4@U!rQQf^BSvI(U4Hu?^RBw;LNY(v89mPi640_9U3Py=xTq zr7g$_G(*S-UBrYO+=bB8PTf>wm^qy@H^J}${KY~H<#H<4zeh&LV@~IhE_JZ?SH-H} z`y|5!!j+WS=efxR;asY4q>-N-W8bdRa2ERHc-6P zQ{cVq3s9bR?upGDZi;9zd{gb}JsNVVw4z6drCss)7Y8xC>d>qwoqtV_x_+)MDcI1e zv`5Gw)@{g3U|pC3&&bd9{p|;MI*iouW!z2Eid_y@_q;QM1&I+H2eTr+>7Rbh zJgDF<-!RZD-d$Y5-rFTD9T_yU#bPYG)^G2IU5O5tseJruo(|Yd{W%0!ul{g4qN_o_ zhC@eYcJrsruSON(4ZTeD{RaOz>oub|&r#Pu5j=SL+fR#3#e^d?PRauK2i-m4fNaX+ zO0q+nn<(Ut8ryyaf*PZ&Fi2M)CE+$u+gGT`s5v|$JJ5S6WAjh-8(x_|8JdU34qbQ3 z{$OgdN0~9t{hubaJ-X%mZR6jboQMr;Gd&|{<@xm zSzONi>HZ4Y7T37W;ScT&h5Y4~VfRwDOUG>RuOPVIF?$4~Dt30*DIKIGch9Km=J1up zOsmIk7Uz`+?J{v1miGEESLwHRIGTecVS4_Pw8qopis3)L9cY@ev@%hNQ*`yXN$>vB zySm0XPKH-yx)d)KdW?5ayLDjx>?a!tYP##1FFt<#7LBUN&wVQankf8Vjj@QyPKW5j z@`j3VaiHqe8-azX!RRem$#fb&h2&|~tUy6i;n|D)84`$coZ?;$8b9kvtM|%wKBpv9 zekqotwLG#I=f%LXDK3^ed7b@2TjF^8wv2PTV)li`&IVuF!i!}%%TXQDW2rE+`D%uo zOy&ip$jD4(dEsL(`;q44PH{Z-IbNev25DzZ-b$+)2MHgG0GEAj@vy~SgE{M`+ngGD zQsT-;J9pg?=wWO+UnzEI^yB%8gH-cKkp27R_{aF0m((graF(oSHqpxdu)sG+6AW}h z;$P0S6?)l!wK9QNQ2fC_m;ztG9IxV^fJiGDjY)ZZiD|{?uAb3qMJJr#!G`1;G_v>Q+r_H(C0_q@ z#9&hq!P39oF55=p2KV`E&*PiK<=+gy+;j0S(+Bw0$}gJn=6uJde)kpibX`>*4M7Lp zR5xYYKUMD(9ZIU*I84OXhr325`xpk@|06x5R2G1rTYoVpkWisHa0<>_{i?%RiK*_X zIY0YvpqQ4A5Q0S#N4srbDTUZ zTf&jr5Bv>hvDOK6%bEuf#wuw=g@1#lYzHHoRo<-BD-4a|x3S?~gvK1*OpN29 zYD?=(t-j_KWWy~>y}_`ssKmaX_UbR&HhPt*gMt!nB6TH2`!`8GH{U#ik3ISHEU7Zq z>UzeFsFO4qmQnq?%b77Bv9dh%`}6DuMtWR#P#wL@;U<_eXt)lW+E4`N{7rIKud%iA z{P@XTbmyj*AU!qTZ@I#R1D&ZSy*PwW`i!VI*iYd`5s}?pmDmQ4@i#`ays0B4Bh^{4 ztq=+MHKVaDP1bx@$-5G}_o3m=EZUtuG~>Ag8U4xP5xraPXU55&laE>FxYti?5Fhn( zz2W}ihb|rapZUn+A?QeejxK}x;)U-I|D=d1Z=Py=zEE0C^_9P}zH0u=%T|@y9!)b| ztzv;xjRQ2}t@>T}`I|oy4HmE^x?Fdio9Ms4CWe<;c-f{_+v`YJyuWW^s^4|!GXslE zZ@1remX<85ms_ZNw${16Q<0dq>~zhtI@__Mh1>P%XnMX=vD4w{UX=)i59vqKYk$>V zhcs%8S&_H9;+_Y9IyKxdaJOZoR7;ATRY8EZ%=v&I-mhvjyOihL+frl#B?7&-x9qdo z^s}!sQz@~fI5;urT4_(pgO)?CJzr*QU8l42d)V+w!!EvEPeKwSuC;b4yqVH#dd+8- zSLm<@A2^iAtXyQ>>OfnYb<^9s{#K6pbaVT!$~2>IWs_&ZR*|W8svuOA0A!#~4C!qm?-F~M;~<-fe|8LK#i zjuwgJaoo1WN|D2M;f()@w$$K}%&sBF>4WtA91J^BlL?61Zv6d3^QA2VFN7*js8nLt z|H{t_xbc3yhakIXcVa10#A)>7Qw2fGVaCNK#G{!MPUnAV(}fVL8oa%`+wFzRmoMvW zCjz&cE6rsLvT874*MU_XejZ9)&Y$tg%r5nod*&B2-XI1xwjJGBf}Y@J_oJu#q+#rn z$tN!$PxocqWgkABfs0+s88E3BgXfi`Np$hV@U{tH${FrZZgGAon0I`qsB&{?9JY2Sm>8V2idI7uQl&U^ra$ zI=?AOM%h+<)6kVI7cw-DH#z-0v8ka5gnpaTg6g>pT|d2dD?g2Fu+PJCu}tDNdGOP;^y86ps;&bgAtgN6aI-{;x<_7EroUsauFd(rSo*hQXjcIMsA zp`+Gm)gzU6W%Di#eA7?abF;QNXI0D{h z_smet?ER_q1f@?6V3>CEBHDK!o*|tE1fcvDX-M!5-DpU zDL&uW6Y4XcWg%2EZL54Uy?jbBy3J2`U&e5HL65@EuwDn3o_#0Z>BXtfjlLDgExyLk z6&J6|oVYb&>cJ{ElVAzX?238BB91=FRyln-nIzeVk^JRoZfN6(nhyp!Tr3eH47YEl(ZloZ9>gSago6L zE!q2Dgq=kk4W4y`4SQ&tUVf)nz)wqxLYNIf-1O)@VtmkHLC(2B(;vMXAG%qGOIiRD zfFS%OBb_yMg|cuM&` zdw~7e_;gE|0_oSnAVgJ{H{Z$sc<80x)t&ZYP>L(mB?z;#4q+`1%5Mw;bj{K8o(jYV zRDlnGK5-w>Cx~oJx>w+{+o(MPSia{azb3y3G)!k;f;+uUdRL_eb?PhJd7`C96$L19 zp5s{4v{9U+>QNOx!tALiMNBOsjRm_x=>t60i6ZnNTUJSF0CE?RLFzcdbG9Mb1}#1z z=0zMAZZ|U1*JmR5Gjt9DiuG>@QU0*i_$=)M0L>e5*sLJ^dUK)t3!#~6z@;^wM~D7m zL@o@OA;VmP#UvpHw>09JbYFK#SGUEF-N-*hIL={R2mREFfh;=?8jMCmx4CPgLl%#2 zs7;Wvo4R45~ypyPF(KH`kN+xDg9AiJ)Ud+hf|~%>Yq%X)mg?Z z^&(!{f?g&i>FPhYC1>�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 ^q0(Orye3i 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 IkDK`Xf8+ID3;+NC literal 0 HcmV?d00001 diff --git a/docs/zh/features/plas_attention.md b/docs/zh/features/plas_attention.md new file mode 100644 index 000000000..09a98e6f4 --- /dev/null +++ b/docs/zh/features/plas_attention.md @@ -0,0 +1,223 @@ +# PLAS + +## 介绍 + +我们提出了**PLAS(Pluggable Lightweight Attention for Sparsity)**,这是对 MoBA 的改进。具体来说,我们采用了受 MoE 启发的结构,将 KV 划分为多个块,并引入了一个可学习的 MLP 层来自适应地选择重要块。PLAS 可以直接在训练后应用,此时只有 MLP 权重可学习,而原始模型权重保持不变。 + +与 NSA/MoBA 相比,我们的 PLAS 具有更高的可扩展性和可插拔性。它无需修改传统的注意力架构,也无需在训练前或训练后干扰模型权重训练。最终阶段只需对 MLP 层进行少量训练即可实现几乎无损的准确率。由于 NSA/MoBA 会更新整个模型权重,因此不可避免地会影响短文本的性能——即使它在输入长度小于 BlockSize × Top-K 时会自动切换到完全注意力机制。相比之下,我们的 PLAS 在短文本场景下可以实现与原始模型真正等同的完全注意力机制。 + +在训练效率方面,由于仅需更新 MLP 权重,训练成本极低。在推理性能方面,当输入长度为 128K、Block Size = 128、Top-K = 55 时,PLAS 相比 Flash Attention 3 实现了**386% 的加速**。 + +## 方法 + +### 训练 + +借鉴 NSA 和 MoBA 的方法,我们将键值对 (KV) 划分为多个块。在预填充和解码阶段,我们不再对所有键值进行注意力计算,而是动态地为每个查询 token 选择注意力得分最高的前 K 个块,从而实现高效的稀疏注意力计算。 + +
      +Attention Gate Module +
      + +* **Attention Gate Module**: 如上图所示,为了以较低的计算开销估计每个块的重要性,我们设计了一个轻量级的注意力门模块。该模块首先通过一个 MLP 层压缩每个 K 个块,生成一个具有代表性的低维表示:$K_c^T=W_{kp}K^T$,其中 $W_{kp}$ 表示 MLP 层的权重。与直接应用均值池化相比,可学习的 MLP 可以更有效地捕捉不同 token 之间的语义关系和重要性分布,从而提供每个块的精细表示。在获得压缩表示 $K_c$ 之后,通过以下公式估计每个查询 token 相对于每个块的重要性:$Softmax(Q\cdot K_c^T)$。为了增强 MLP 层的判别能力,我们使用一维最大池化后的完整注意力结果 $1DMaxPooling(Softmax(Q \cdot K^T))$ 作为 ground truth。通过最小化两者之间的分布差异,引导 MLP 层学习更符合真实注意力分布的特征表示。 + +* **Training Data**: 得益于模型架构和训练范式的高效性,我们的方法仅使用 10 亿个 token 进行训练,便实现了近乎无损的精度。训练数据源自内部构建的包含长文本和短文本的混合语料库,从而增强了模块对不同序列长度的适应性。 + +* **Other**: 我们观察到,最终的解码层对模型整体准确率有显著影响。因此,在训练过程中,我们将该层排除在稀疏注意力计算之外,并在推理过程中将其恢复为完全注意力。 + +### 推理优化 + +在稀疏注意力计算过程中,每个查询 token 可能会动态选择不同的 KV 块,导致 HBM 的内存访问模式非常不规则。简单地对每个查询 token 进行单独处理是可行的,但这会导致计算粒度过细,无法充分利用张量核,从而显著降低 GPU 的计算效率。 + +
      +Token/Head Union +
      + +为了优化预填充和解码阶段的性能,我们设计了一种特殊的联合策略来适应各自的特点: + +* **Prefill Toke Union**: 我们观察到相邻的查询标记倾向于选择相似的关键块。利用这种局部性,我们取连续 128 个查询标记选择的关键块的并集,并联合计算这些标记的稀疏注意力机制。 + +* **Decode Head Union**: 鉴于 GQA 在现代模型中的广泛应用,我们发现同一组内的不同查询头经常选择重叠的关键块。因此,我们将同一组内所有查询头选择的关键块合并为一个统一的集合,并联合计算稀疏注意力机制。这种方式也减少了内存访问开销,并进一步提高了解码效率。 + +* **Top-K Selection**: 传统的 Top-k 算法基于排序或直接调用 Cub 库,会带来显著的运行时开销。为了缓解这个问题,我们实现了一个基于二分查找的近似 Top-k 选择算法,该算法在保持准确率的同时显著降低了延迟,最终实现了性能的显著提升。 + +## 评估 + +### 实验 + +我们在 LongBenchV2 和 Ruler(上下文长度分别为 32K、64K 和 128K)上评估了全注意力和稀疏注意力的精度。 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
      + Model + + Precision +
      + FullAttention + + SparseAttention +
      + LongBenchV2 + + Ruler + + LongBenchV2 + + Ruler +
      + 32K + + 64K + + 128K + + 32K + + 64K + + 128K +
      + ERNIE-4.5-21B-A3B + 31.4876.7456.4025.4831.4575.9355.3825.05
      + ERNIE-4.5-300B-A47B + 41.0294.7083.5658.1841.0594.5082.3257.85
      + +### 性能 + +我们从 InfiniteBench 中选择了一个子集 (longbook_sum_eng) 作为性能评估数据集。对于长度超过 128K 的输入,我们截断序列,保留前 64K 和后 64K 个 token。 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
      QPSDecode Speed (token/s)Time to First token(s)Time per Ouput Token(ms)End-to-End Latency(s)Mean Input
      Length
      Mean Output Length
      + ERNIE-4.5-21B-A3B + + FullAttention + 0.10113.328.08287.0561.400113182.32627.76
      + SparseAttention + 0.150(+48%)18.12(+36%)5.466(-48%)66.35(-31%)42.157(-46%)113182.32590.23
      + ERNIE-4.5-300B-A47B + + FullAttention + 0.0665.0713.812206.70164.704113182.32725.97
      + SparseAttention + 0.081(+23%)6.75(+33%)10.584(-30%)154.84(-34%)132.745(-24%)113182.32748.25
      + +## 使用方式 + +``` +export FD_ATTENTION_BACKEND="MOBA_ATTN" + +python -m fastdeploy.entrypoints.openai.api_server + --model baidu/ERNIE-4.5-300B-A47B-Paddle \ + --port 8188 \ + --tensor-parallel-size 4 \ + --quantization wint4 \ + --enable-chunked-prefill \ + --max-num-batched-tokens 8192 \ + --max-model-len 131072 \ + --max-num-seqs 32 \ + --moba-attention-config '{"moba_encoder_top_k_left": 50, "moba_encoder_top_k_right": 60, "moba_decoder_top_k_left": 100, "moba_decoder_top_k_right": 120}' +``` + +**Note**: 如果启用了稀疏注意力机制,系统将自动从权重目录中的`moba_mlp_weight.safetensors`文件加载 MLP 权重。如果未找到 MLP 权重文件,则将对关键表示应用均值池化 + +**Parameter Description:** + +* `FD_ATTENTION_BACKEND="MOBA_ATTN"` 启用 MOBA sparse attention. +* `moba_encoder_top_k_left=50, moba_encoder_top_k_right=60` 表示当encoder时,top-k的范围在50到60之间。 +* `moba_decoder_top_k_left=100, moba_decoder_top_k_right=120` 表示当decoder时,top-k的范围在100到120之间。 diff --git a/docs/zh/features/sampling.md b/docs/zh/features/sampling.md index 51464515d..df04d1c28 100644 --- a/docs/zh/features/sampling.md +++ b/docs/zh/features/sampling.md @@ -1,6 +1,6 @@ # 采样策略 -采样策略用于决定如何从模型的输出概率分布中选择下一个token。FastDeploy目前支持 Top-p 、 Top-k_Top-p 和 Min-p Samping 多种采样策略。 +采样策略用于决定如何从模型的输出概率分布中选择下一个token。FastDeploy目前支持 Top-p 、 Top-k_Top-p 和 Min-p Sampling 多种采样策略。 1. Top-p 采样 diff --git a/docs/zh/features/speculative_decoding.md b/docs/zh/features/speculative_decoding.md index 58b70742c..eb898e873 100644 --- a/docs/zh/features/speculative_decoding.md +++ b/docs/zh/features/speculative_decoding.md @@ -14,9 +14,6 @@ - ⏳ 即将支持:兼容 Chunk Prefill - ⏳ 即将支持:多层 MTP layer -- **混合MTP、Ngram方法解码(Hybrid-MTP-with-Ngram)** - - 方法概述:混合MTP与Ngram方法,先使用MTP产出N个草稿Token,再使用Ngram匹配补充草稿Token。 - - 使用场景:适合在需要更多草稿Token时使用,兼顾MTP生成能力与Ngram匹配的高效性。 --- ### ⏳ 规划中 @@ -113,12 +110,7 @@ python -m fastdeploy.entrypoints.openai.api_server \ --scheduler-password "scheduler_mtp" \ --speculative-config '{"method": "mtp", "num_speculative_tokens": 1, "model": ""${path_to_mtp_model}"}' & ``` -## 使用混合MTP、Ngram方法解码 -在启动服务时,只需改动 --speculative-config 即可。例如使用MTP产出两个DraftToken,再额外拼接三个Ngram匹配的DraftToken -``` ---speculative-config '{"method": "mtp", "num_model_steps": 2, "mtp_strategy": "with_ngram" ,"num_speculative_tokens": 5, "model": "'$model_path'/mtp"}' -``` ## 🧠 使用 Ngram 解码 该算法通过 n-gram 窗口从 prompt 和已生成的 Token 中进行匹配生成草稿 Token,适合输入和输出有很大 overlap 的场景,如代码续写、文档查询等。 > 使用 4×H100;量化方式选择 WINT4 diff --git a/docs/zh/features/structured_outputs.md b/docs/zh/features/structured_outputs.md index ce33f1232..cafda804c 100644 --- a/docs/zh/features/structured_outputs.md +++ b/docs/zh/features/structured_outputs.md @@ -330,3 +330,67 @@ ParsedChatCompletionMessage[Info](content='{"addr": "上海市浦东新区世纪 地址: 上海市浦东新区世纪大道1号 高度: 468 ``` + +### 离线推理 + +离线推理允许通过预先指定约束条件,限制模型输出格式。在 `FastDeploy` 中,支持通过 `SamplingParams` 中的 `GuidedDecodingParams` 类指定相关约束条件。`GuidedDecodingParams` 支持以下几种约束条件,使用方式可以参考在线推理: + +```python +json: Optional[Union[str, dict]] = None +regex: Optional[str] = None +choice: Optional[List[str]] = None +grammar: Optional[str] = None +json_object: Optional[bool] = None +structural_tag: Optional[str] = None +``` + +以下示例展示了如何使用离线推理生成一个结构化的 json : + +```python + +from fastdeploy import LLM, SamplingParams +from fastdeploy.engine.sampling_params import GuidedDecodingParams +from pydantic import BaseModel +from enum import Enum + +class BookType(str, Enum): + romance = "Romance" + historical = "Historical" + adventure = "Adventure" + mystery = "Mystery" + dystopian = "Dystopian" + +class BookDescription(BaseModel): + author: str + title: str + genre: BookType + +# Constrained decoding parameters +guided_decoding_params = GuidedDecodingParams(json=BookDescription.model_json_schema()) + +# Sampling parameters +sampling_params = SamplingParams( + top_p=0.95, + max_tokens=6400, + guided_decoding=guided_decoding_params, +) + +# Load model +llm = LLM(model="ERNIE-4.5-0.3B", tensor_parallel_size=1, max_model_len=8192, guided_decoding_backend="auto") + +outputs = llm.generate( + prompts="生成一个JSON,描述一本中国的著作,要包含作者、标题和书籍类型。", + sampling_params=sampling_params, +) + +# Output results +for output in outputs: + print(output.outputs.text) + +``` + +输出 + +``` +{"author": "曹雪芹", "title": "红楼梦", "genre": "Historical"} +``` diff --git a/docs/zh/get_started/installation/kunlunxin_xpu.md b/docs/zh/get_started/installation/kunlunxin_xpu.md index 29fb801fc..42770df90 100644 --- a/docs/zh/get_started/installation/kunlunxin_xpu.md +++ b/docs/zh/get_started/installation/kunlunxin_xpu.md @@ -25,9 +25,9 @@ ```bash mkdir Work cd Work -docker pull ccr-2vdh3abv-pub.cnc.bj.baidubce.com/paddlepaddle/fastdeploy-xpu:2.1.0 +docker pull ccr-2vdh3abv-pub.cnc.bj.baidubce.com/paddlepaddle/fastdeploy-xpu:2.2.0 docker run --name fastdeploy-xpu --net=host -itd --privileged -v $PWD:/Work -w /Work \ - ccr-2vdh3abv-pub.cnc.bj.baidubce.com/paddlepaddle/fastdeploy-xpu:2.1.0 \ + ccr-2vdh3abv-pub.cnc.bj.baidubce.com/paddlepaddle/fastdeploy-xpu:2.2.0 \ /bin/bash docker exec -it fastdeploy-xpu /bin/bash ``` @@ -37,7 +37,7 @@ docker exec -it fastdeploy-xpu /bin/bash ### 安装 PaddlePaddle ```bash -python -m pip install paddlepaddle-xpu==3.1.1 -i https://www.paddlepaddle.org.cn/packages/stable/xpu-p800/ +python -m pip install paddlepaddle-xpu==3.2.0 -i https://www.paddlepaddle.org.cn/packages/stable/xpu-p800/ ``` 或者您也可以安装最新版 PaddlePaddle(不推荐) @@ -49,7 +49,7 @@ python -m pip install --pre paddlepaddle-xpu -i https://www.paddlepaddle.org.cn/ ### 安装 FastDeploy(**注意不要通过 pypi 源安装**) ```bash -python -m pip install fastdeploy-xpu==2.1.0 -i https://www.paddlepaddle.org.cn/packages/stable/fastdeploy-xpu-p800/ --extra-index-url https://mirrors.tuna.tsinghua.edu.cn/pypi/web/simple +python -m pip install fastdeploy-xpu==2.2.0 -i https://www.paddlepaddle.org.cn/packages/stable/fastdeploy-xpu-p800/ --extra-index-url https://mirrors.tuna.tsinghua.edu.cn/pypi/web/simple ``` 或者你也可以安装最新版 FastDeploy(不推荐) @@ -63,7 +63,7 @@ python -m pip install --pre fastdeploy-xpu -i https://www.paddlepaddle.org.cn/pa ### 安装 PaddlePaddle ```bash -python -m pip install paddlepaddle-xpu==3.1.1 -i https://www.paddlepaddle.org.cn/packages/stable/xpu-p800/ +python -m pip install paddlepaddle-xpu==3.2.0 -i https://www.paddlepaddle.org.cn/packages/stable/xpu-p800/ ``` 或者您也可以安装最新版 PaddlePaddle(不推荐) diff --git a/docs/zh/get_started/installation/nvidia_gpu.md b/docs/zh/get_started/installation/nvidia_gpu.md index a370a4589..562f112e4 100644 --- a/docs/zh/get_started/installation/nvidia_gpu.md +++ b/docs/zh/get_started/installation/nvidia_gpu.md @@ -15,7 +15,7 @@ **注意**: 如下镜像仅支持SM 80/90架构GPU(A800/H800等),如果你是在L20/L40/4090等SM 86/69架构的GPU上部署,请在创建容器后,卸载```fastdeploy-gpu```再重新安装如下文档指定支持86/89架构的`fastdeploy-gpu`包。 ``` shell -docker pull ccr-2vdh3abv-pub.cnc.bj.baidubce.com/paddlepaddle/fastdeploy-cuda-12.6:2.1.0 +docker pull ccr-2vdh3abv-pub.cnc.bj.baidubce.com/paddlepaddle/fastdeploy-cuda-12.6:2.2.0 ``` ## 2. 预编译Pip安装 @@ -23,7 +23,7 @@ docker pull ccr-2vdh3abv-pub.cnc.bj.baidubce.com/paddlepaddle/fastdeploy-cuda-12 首先安装 paddlepaddle-gpu,详细安装方式参考 [PaddlePaddle安装](https://www.paddlepaddle.org.cn/en/install/quick?docurl=/documentation/docs/en/develop/install/pip/linux-pip_en.html) ``` shell -python -m pip install paddlepaddle-gpu==3.1.1 -i https://www.paddlepaddle.org.cn/packages/stable/cu126/ +python -m pip install paddlepaddle-gpu==3.2.0 -i https://www.paddlepaddle.org.cn/packages/stable/cu126/ ``` 再安装 fastdeploy,**注意不要通过pypi源安装**,需要通过如下方式安装 @@ -64,7 +64,7 @@ docker build -f dockerfiles/Dockerfile.gpu -t fastdeploy:gpu . 首先安装 paddlepaddle-gpu,详细安装方式参考 [PaddlePaddle安装](https://www.paddlepaddle.org.cn/) ``` shell -python -m pip install paddlepaddle-gpu==3.1.1 -i https://www.paddlepaddle.org.cn/packages/stable/cu126/ +python -m pip install paddlepaddle-gpu==3.2.0 -i https://www.paddlepaddle.org.cn/packages/stable/cu126/ ``` 接着克隆源代码,编译安装 diff --git a/docs/zh/get_started/quick_start_qwen.md b/docs/zh/get_started/quick_start_qwen.md new file mode 100644 index 000000000..afb13e30b --- /dev/null +++ b/docs/zh/get_started/quick_start_qwen.md @@ -0,0 +1,93 @@ +# 10分钟完成 Qwen3-0.6b 模型部署 + +本文档讲解如何部署Qwen3-0.6b模型,在开始部署前,请确保你的硬件环境满足如下条件: + +- GPU驱动 >= 535 +- CUDA >= 12.3 +- CUDNN >= 9.5 +- Linux X86_64 +- Python >= 3.10 + +为了快速在各类硬件部署,本文档采用 ```Qwen3-0.6b``` 模型作为示例,可在大部分硬件上完成部署。 + +安装FastDeploy方式参考[安装文档](./installation/README.md)。 +## 1. 启动服务 +安装FastDeploy后,在终端执行如下命令,启动服务,其中启动命令配置方式参考[参数说明](../parameters.md) + +> ⚠️ **注意:** +> 当使用HuggingFace 模型(torch格式)时, 需要开启 `--load_choices "default_v1"` + +```shell +export ENABLE_V1_KVCACHE_SCHEDULER=1 +python -m fastdeploy.entrypoints.openai.api_server \ + --model Qwen/Qwen3-0.6B\ + --port 8180 \ + --metrics-port 8181 \ + --engine-worker-queue-port 8182 \ + --max-model-len 32768 \ + --max-num-seqs 32 \ + --load_choices "default_v1" +``` + +>💡 注意:在 ```--model``` 指定的路径中,若当前目录下不存在该路径对应的子目录,则会尝试根据指定的模型名称(如 ```Qwen/Qwen3-0.6B```)查询AIStudio是否存在预置模型,若存在,则自动启动下载。默认的下载路径为:```~/xx```。关于模型自动下载的说明和配置参阅[模型下载](../supported_models.md)。 +```--max-model-len``` 表示当前部署的服务所支持的最长Token数量。 +```--max-num-seqs``` 表示当前部署的服务所支持的最大并发处理数量。 + +**相关文档** + +- [服务部署配置](../online_serving/README.md) +- [服务监控metrics](../online_serving/metrics.md) + +## 2. 用户发起服务请求 + +执行启动服务指令后,当终端打印如下信息,说明服务已经启动成功。 + +``` +api_server.py[line:91] Launching metrics service at http://0.0.0.0:8181/metrics +api_server.py[line:94] Launching chat completion service at http://0.0.0.0:8180/v1/chat/completions +api_server.py[line:97] Launching completion service at http://0.0.0.0:8180/v1/completions +INFO: Started server process [13909] +INFO: Waiting for application startup. +INFO: Application startup complete. +INFO: Uvicorn running on http://0.0.0.0:8180 (Press CTRL+C to quit) +``` + +FastDeploy提供服务探活接口,用以判断服务的启动状态,执行如下命令返回 ```HTTP/1.1 200 OK``` 即表示服务启动成功。 + +```shell +curl -i http://0.0.0.0:8180/health +``` + +通过如下命令发起服务请求 + +```shell +curl -X POST "http://0.0.0.0:8180/v1/chat/completions" \ +-H "Content-Type: application/json" \ +-d '{ + "messages": [ + {"role": "user", "content": "把李白的静夜思改写为现代诗"} + ] +}' +``` + +FastDeploy服务接口兼容OpenAI协议,可以通过如下Python代码发起服务请求。 + +```python +import openai +host = "0.0.0.0" +port = "8180" +client = openai.Client(base_url=f"http://{host}:{port}/v1", api_key="null") + +response = client.chat.completions.create( + model="null", + messages=[ + {"role": "system", "content": "I'm a helpful AI assistant."}, + {"role": "user", "content": "把李白的静夜思改写为现代诗"}, + ], + stream=True, +) +for chunk in response: + if chunk.choices[0].delta: + print(chunk.choices[0].delta.content, end='') +print('\n') +``` diff --git a/docs/zh/index.md b/docs/zh/index.md index 73bf10fa9..b4f44cfd8 100644 --- a/docs/zh/index.md +++ b/docs/zh/index.md @@ -11,15 +11,39 @@ ## 支持模型 -| Model | Data Type | PD Disaggregation | Chunked Prefill | Prefix Caching | MTP | CUDA Graph | Maximum Context Length | +| Model | Data Type |[PD Disaggregation](./features/disaggregated.md) | [Chunked Prefill](./features/chunked_prefill.md) | [Prefix Caching](./features/prefix_caching.md) | [MTP](./features/speculative_decoding.md) | [CUDA Graph](./features/graph_optimization.md) | Maximum Context Length | |:--- | :------- | :---------- | :-------- | :-------- | :----- | :----- | :----- | -|ERNIE-4.5-300B-A47B | BF16/WINT4/WINT8/W4A8C8/WINT2/FP8 | ✅| ✅ | ✅|✅| WIP |128K | -|ERNIE-4.5-300B-A47B-Base| BF16/WINT4/WINT8 | ✅| ✅ | ✅|❌| WIP | 128K | -|ERNIE-4.5-VL-424B-A47B | BF16/WINT4/WINT8 | WIP | ✅ | WIP | ❌ | WIP |128K | -|ERNIE-4.5-VL-28B-A3B | BF16/WINT4/WINT8 | ❌ | ✅ | WIP | ❌ | WIP |128K | -|ERNIE-4.5-21B-A3B | BF16/WINT4/WINT8/FP8 | ❌ | ✅ | ✅ | ✅ | ✅|128K | -|ERNIE-4.5-21B-A3B-Base | BF16/WINT4/WINT8/FP8 | ❌ | ✅ | ✅ | ❌ | ✅|128K | -|ERNIE-4.5-0.3B | BF16/WINT8/FP8 | ❌ | ✅ | ✅ | ❌ | ✅| 128K | +|ERNIE-4.5-300B-A47B|BF16\WINT4\WINT8\W4A8C8\WINT2\FP8|✅|✅|✅|✅|✅|128K| +|ERNIE-4.5-300B-A47B-Base|BF16/WINT4/WINT8|✅|✅|✅|⛔|✅|128K| +|ERNIE-4.5-VL-424B-A47B|BF16/WINT4/WINT8|🚧|✅|🚧|⛔|🚧|128K| +|ERNIE-4.5-VL-28B-A3B|BF16/WINT4/WINT8|⛔|✅|🚧|⛔|🚧|128K| +|ERNIE-4.5-21B-A3B|BF16/WINT4/WINT8/FP8|⛔|✅|✅|✅|✅|128K| +|ERNIE-4.5-21B-A3B-Base|BF16/WINT4/WINT8/FP8|⛔|✅|✅|⛔|✅|128K| +|ERNIE-4.5-0.3B|BF16/WINT8/FP8|⛔|✅|✅|⛔|✅|128K| +|QWEN3-MOE|BF16/WINT4/WINT8/FP8|⛔|✅|✅|🚧|✅|128K| +|QWEN3|BF16/WINT8/FP8|⛔|✅|✅|🚧|✅|128K| +|QWEN-VL|BF16/WINT8/FP8|⛔|✅|✅|🚧|⛔|128K| +|QWEN2|BF16/WINT8/FP8|⛔|✅|✅|🚧|✅|128K| +|DEEPSEEK-V3|BF16/WINT4|⛔|✅|🚧|🚧|✅|128K| +|DEEPSEEK-R1|BF16/WINT4|⛔|✅|🚧|🚧|✅|128K| + +``` +✅ 已支持 🚧 适配中 ⛔ 暂无计划 +``` + +## 支持硬件 + +| 模型 | [英伟达GPU](./get_started/installation/nvidia_gpu.md) |[昆仑芯P800](./get_started/installation/kunlunxin_xpu.md) | 昇腾910B | [海光K100-AI](./get_started/installation/hygon_dcu.md) | [天数天垓150](./get_started/installation/iluvatar_gpu.md) | [沐曦曦云C550](./get_started/installation/metax_gpu.md.md) | [燧原S60/L600](./get_started/installation/Enflame_gcu.md) | +|:------|---------|------------|----------|-------------|-----------|-------------|-------------| +| ERNIE4.5-VL-424B-A47B | ✅ | 🚧 | 🚧 | ⛔ | ⛔ | ⛔ | ⛔ | +| ERNIE4.5-300B-A47B | ✅ | ✅ | 🚧 | ✅ | ✅ | 🚧 | ✅ | +| ERNIE4.5-VL-28B-A3B | ✅ | 🚧 | 🚧 | ⛔ | 🚧 | ⛔ | ⛔ | +| ERNIE4.5-21B-A3B | ✅ | ✅ | 🚧 | ✅ | ✅ | ✅ | ✅ | +| ERNIE4.5-0.3B | ✅ | ✅ | 🚧 | ✅ | ✅ | ✅ | ✅ | + +``` +✅ 已支持 🚧 适配中 ⛔ 暂无计划 +``` ## 文档说明 diff --git a/docs/zh/offline_inference.md b/docs/zh/offline_inference.md index 037fdf236..adac6ff28 100644 --- a/docs/zh/offline_inference.md +++ b/docs/zh/offline_inference.md @@ -35,7 +35,7 @@ for output in outputs: 上述示例中 ``LLM``配置方式, `SamplingParams` ,`LLM.generate` ,`LLM.chat`以及输出output对应的结构体 `RequestOutput` 接口说明见如下文档说明。 -> 注: 若为思考模型, 加载模型时需要指定 `resoning_parser` 参数,并在请求时, 可以通过配置 `chat_template_kwargs` 中 `enable_thinking`参数, 进行开关思考。 +> 注: 若为思考模型, 加载模型时需要指定 `reasoning_parser` 参数,并在请求时, 可以通过配置 `chat_template_kwargs` 中 `enable_thinking`参数, 进行开关思考。 ```python from fastdeploy.entrypoints.llm import LLM diff --git a/docs/zh/online_serving/README.md b/docs/zh/online_serving/README.md index 5e72dd5ed..250c24b37 100644 --- a/docs/zh/online_serving/README.md +++ b/docs/zh/online_serving/README.md @@ -191,9 +191,6 @@ return_token_ids: Optional[bool] = None prompt_token_ids: Optional[List[int]] = None # 直接传入 prompt 的 token ID 列表,跳过文本编码步骤(默认 None 表示使用文本输入)。 -max_streaming_response_tokens: Optional[int] = None -# 流式输出时每次返回的最大 token 数(默认 None 表示不限制)。 - disable_chat_template: Optional[bool] = False # 是否禁用聊天模板渲染,直接使用原始输入(默认 False 表示启用模板)。 @@ -365,8 +362,6 @@ return_token_ids: Optional[bool] = None prompt_token_ids: Optional[List[int]] = None # 直接传入 prompt 的 token ID 列表,跳过文本编码步骤(默认 None 表示使用文本输入)。 -max_streaming_response_tokens: Optional[int] = None -# 流式输出时每次返回的最大 token 数(默认 None 表示不限制)。 ``` ### 返回参数总览 diff --git a/docs/zh/online_serving/graceful_shutdown_service.md b/docs/zh/online_serving/graceful_shutdown_service.md new file mode 100644 index 000000000..90f0133aa --- /dev/null +++ b/docs/zh/online_serving/graceful_shutdown_service.md @@ -0,0 +1,71 @@ +# 服务节点优雅关闭方案 + +## 1. 核心目标 +实现服务节点的优雅关闭,确保在停止服务时不丢失任何正在处理的用户请求,同时不影响整个集群的可用性。 + +## 2. 实现方案说明 +该方案通过结合 **Nginx 反向代理**、**Gunicorn 服务器**、**Uvicorn 服务器** 和 **FastAPI** 协作来实现目标。 + +![graceful_shutdown](images/graceful_shutdown.png) + +## 3. 组件介绍 + +### 1. Nginx:流量入口与负载均衡器 +- **功能**: + - 作为反向代理,接收所有外部客户端请求并按负载均衡策略分发到上游(Upstream)的 Gunicorn 工作节点。 + - 通过健康检查机制主动监控后端节点的健康状态。 + - 通过配置管理,能够瞬时地将问题节点从服务池中摘除,实现流量切换。 + +### 2. Gunicorn:WSGI HTTP 服务器(进程管理器) +- **功能**: + - 作为主进程(Master Process),负责管理多个 Uvicorn 工作子进程(Worker Process)。 + - 接收外部信号(如 `SIGTERM`),并协调所有子进程的优雅关闭流程。 + - 守护工作进程,在进程异常退出时自动重启,保证服务健壮性。 + +### 3. Uvicorn:ASGI 服务器(工作进程) +- **功能**: + - 作为 Gunicorn 管理的 Worker,实际负责处理 HTTP 请求。 + - 运行 FastAPI 应用实例,处理具体的业务逻辑。 + - 实现 ASGI 协议,支持异步请求处理,高性能。 + +--- + +## 优势 + +1. **Nginx**: + - 能够快速隔离故障节点,保证整体服务的可用性。 + - 通过 `nginx -s reload` 可不停机更新配置,对用户无感知。 + +2. **Gunicorn**(相比于 Uvicorn 原生的多 Worker): + - **成熟的进程管理**:内置了完善的进程生成、回收、管理逻辑,无需自己实现。 + - **进程守护能力**:Gunicorn Master 会在 Worker 异常退出后自动 fork 新 Worker,而 Uvicorn `--workers` 模式下任何进程崩溃都不会被重新拉起,需要外部守护进程。 + - **配置丰富**:提供大量参数用于调整超时、Worker 数量、重启策略等。 + +3. **Uvicorn**: + - 基于 uvloop 和 httptools,速度极快。 + - 原生支持优雅关闭:在收到关闭信号后,会停止接受新连接,并等待现有请求处理完成后再退出。 + +--- + +## 优雅关闭流程 + +当需要下线某个特定节点时,步骤如下: + +1. **Nginx 监控节点状态是否健康**: + - 通过向节点定时发送 health 请求,监控节点的健康状态。 + +2. **从负载均衡中摘除**: + - 修改 Nginx 配置,将该节点标记为 `down` 状态,并重载 Nginx 配置。 + - 此后,所有新请求将不再被发送到目标节点。 + +3. **Gunicorn 服务器**: + - 监控停止信号,收到停止信号(如 `SIGTERM` 信号)时,会把此信号向所有的 Uvicorn 子进程发送。 + +4. **发送停止信号**: + - 向目标节点的 Uvicorn 进程发送 `SIGTERM` 信号,触发 Uvicorn 的优雅关闭流程。 + +5. **等待请求处理**: + - 等待一段稍长于 `timeout_graceful_shutdown` 的时间后强制终止服务,让该节点有充足的时间完成所有已接收请求的处理。 + +6. **关闭完成**: + - 此时,该节点已经处理完所有存量请求并安全退出。 diff --git a/docs/zh/online_serving/images/graceful_shutdown.png b/docs/zh/online_serving/images/graceful_shutdown.png new file mode 100644 index 0000000000000000000000000000000000000000..b08e56d473e95f369dbddcc0a5e57e905aee58ae GIT binary patch literal 184531 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 z zXO@cnEN!{sqUR;n%LMEq@@meHn0Wn|M(BgjqE*=rn1xGKVbAV&tGfs-Xt!@?lRQUTnjnYtlw=^JwSYI`|Cjeh_`v}4sd)|8b z-zRNAeyfBGMC^wtn|l zF?rSFN#b?70pM0XQvmqk6H_g1fG3V@0wfiaOD=+ebD(RLDvD0-`-zYz7VnCB_?QO% zlF16-@}~~BAnjbgG+C3Lra?3aCLwMQK$Y75pcZ`JySF;$+JBO^5e%PWZ1!)ooHSPa zvzT{~Asg88F)ro>PeV6ozJ{S~cenxuP#eO=*E0`Sm#3rd)MP%?{DoqM<`bttww zS5RtE;$8Olu6c5KZ{#3F&Yn5o=2A!M@n%TzK0T}HdZ-FfB1s#Kjj2$S1OUXF*VW&Er-=Js&A)(P$7u4b4}jn zKiVHRU+4+RM?qO=WqqF1mw@8fCf}kiTRuvp!v$TD#Bp=SL5sRD;?Z)W_^8FFro*Ox z&RG@)gNduSw`hIn-&b4pMRd2xOnkJ_b_Vp@=00p~o@?_T^kWkE8GHF*R~l@C2Nn5y zN5+Br2BLq6(ME&l8Q%l)SD$u!n~;dQesO?y^Ljzt{``aal#^v~3-3MosEdYbs6I4TU3PkGG3MUR=AwJssjF(4T9gFbZWE7$?Q2`)sV*0)L+^ zjBHstOwz!s>79}Hq?(|T?w4df`NwdigWKY{5>WvQir}j#<1Y17epP^VkLz`6k}R1NWoTbG4a9NQhol6TQrb5po5V&duc^UOm8e z-Q9fiWwENL=I{;qXeR4;UCI)>FgquHsDr_*Umw9FX#vgQ>CbdKJ-ZMi3m_8O3S{NU z2#qfmSg;2C2P+ai#GR=flJtQ@?tGYMnIf7f(OBUrJE0%YNf)n)FjgZPl)#2-@ppSb zWl|bNI`nc@cP&SD#g6L5O9aAGEUbW7tDL}yyR)f903i@lXan>k72Ah3>2I3Ywf`Au7T#-sqv3Xw<}V|&{d7&sv$zZZfaIczkfd7 zAC8FAs%&W%*ILr2zegR4V1=_$N=njB%3D28cEMm8VMw2m(JEmafvKHq1J_ek+ri=% zT>Xp+a125;;iVi!1uCYYy<5xuU!)JNc-~#u?I0uNoIo|T3ml9}bO3hLC~o zVDW~*T1qkOIW4i`i80XnpGOK;qrW}G`I%zrLhzXZ?zb*It88HQAk@K5F%O-_h*s8NU6X z7pXAw%89u)6>}?QMaI<#qK$sC zLrZMo3=JLkVJdECg?j<2$ZVw8k<+ovhkzyN_;<0do&iXMPEPKcB^J6Xz;l%eRb zZ<^{Kx-vwvB3O=Q#GFgXTB9{G zd(jA;pi*6z1}Bt8da76+$;MP)l6Zd863x|XuZwDgrhlFvDZA(ZVK4{_4@55?J3vBa z`fEOV?}1{QB59I_vM^fbEpATr!|wqc7*9}&#n#R17tf=~o&oRyNk*psAWHcf?73}=*OUS`r-KlrnD4`=<1Ti3EJQ<+CaU^V*Y)p~#+1g=c` zjt7-Fd1n~kPd)sV9T{Kp>UKVu1Fez{u7xNc(*qHXZA2RU9djVS0W#Qu)9`ktH?6A6 ze+37(Nh+04auY*ZZn89%$QP@41&uQ;^zz~!z`$I*=j!z9D;R6ruH`a@orsYWUt5pe z<0xRd8zak9P=XYvN0pdYBl?|!NMaK;YoB(*f_-VqVOq&B%2Vz-e|ugo6Z{8TVgGV1}qz@;h89pGze-UT|?dfhH)+d@h5s>?->PBhjP!pXQ@A#XdWFG4!1l& zPLu6%{dC1aj7(ZkQZ5WN zN6daezj2c63=cspbG_WU^I{D=se{TZXE~x+z%|ct9W3HXB_=MF1d-0kKf6!&`NB08 z5|!Ya>?+P9$(-hx@ZGL*7-e~hNW=c(K@!Y6hGCBwW=w@H2GxL%rS`*XN)z_g}^A9d6 z2*_6#)P6Lm@2AUvNo^$o68tD-fDcU1^|x-Q-N37(BF#VJK6-)+bb`|hD>G-GZ{8WO$O{_6%S@j;6CSacZbOUr^Z>9G zF|zfMg$H4=WdLOPJlL6!$@OexytYcssBhYc$eGk3`fPF|#ZjbOI`zSLgNxr&{_78_ zFB+MY0fn^^-(Siz)B`ld?I2ggmfS$Vt`<)Ak50pIwC_#!gMJO=>~9I!g#p>*vBu=P zVfBnA=U6MEqsn3awgahsv9Etteu&8QNrIx*)=OXlte`FghJ=nmu{70NWsiV!Wco*ZnjzSIraKt{c#=-8%`i!MLfj8m{)<6o3i3B zlVq@{Z zE{cqcFA)ac?}#%OYQnH#Q51?mtXN5S;K@sh|s=_>00g+`d>zP>rUO!ZaIjL&Ql=uvl@3rk?BFie@{J6j~{uD z2OS+3;AnnN1Q#Uuun9^%;|)ljsph(5Yy)r-+^L3v=;;;bS`r7J=32ac^>L7Kt#$s5rq)Cb{`@*OZ2n zc&LMC8d$;aVmZ;w6*TEC6=<*O!@(%$A8hrRnFC=Sq$9%tG!DT)ZG6DB;erB`6tC%ZZg3R#vk4{UXnpECak

      t{HyIw-1k%XWqufQd$ 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 _#1?|xy*Y*3 z_p9%7p(6u*_A8q%`_h`217y#fJavchh_24(dv@o#!|Wy&ecm3<#|DHkL)`rEe^P*P zyWP3Al4RzV)wEXy(AV%xRg~J5J+)2=|2Lt28Yn~t6pe79bHKUr7HJ|ucWR_b2?PG~ zKv~%rO8Xb)l1_Y{`N5C$ zfSuAsVL4(H0^+tK>P81Lej$)>VC>UIi6cB6c23gDyt)J?Cikk5o*ACn(H8wa6D&O$ zVIaY_2~NCSaJh3~Ui&G+_}87Hs&VpdA%=+vrF)<1$|(}kETzb#OI=i`Fu$MA`AiFM zxEue5tB$iYaB(XJls#2O6%5t(m;g0NL3WV5fm%w+#AwU*_LYPjrE66=;25hb>!Ds( zXMb4n8%jJAPWZH25gb6hUNp4+^MW7WyK_d`_Duf;1UR-5v9VQep=fTRPXl8}0y}xC z+ka%^%N&$+wS9I=Xi%pO$8a_F_Sd6*=D6xL$vHGDyH66mrZrO}xG$EQ!8Ky;{cl(# zNz$Fsz|@6}4&VC9w5i!1qBt1?xD(h1@sElhfV_5*OH#!YZM!{`temIUYRh&$$sjm$ z`{j8|S@Fow;@Rt!1^-I{aA!W0k&>63TCroA7tigp?LLLzyID|j)R^ieevOVi^;2H; z@Xt4hq&|QnSvrN4J*{Y$&0w7Lbx}RklQC<3Rkup$#S^FK`{#_yPbq^qN8mxj$$;gTWB!gRyXiyMm$WNz+B}7RcFo$U^*Z_`u;lmJm-AuORqy*u9p*XpJ%c~yY98v4sL(=bMR64{1ZW3E zLW~4D!%xYDR?=u?=Nr9asa62*o7$V#cHS1M+Opf>Kq2-FAwy|U!8#qlnXjeJW{7f9 z%q_^({4{%f)#<0px;)KK?>|{eC&2PJHPgCk_l$owJ)px~VS>|ZAxnliu(bq9yP>%r8O!mUIGc83u`BG$_caIu^uvPgt~vcP`HgRQ`j`b%_eAr!||hwCq81$W~} zxoL!2g6j0$t?kCQ|Jjl>w+dEsVW;Fos|V;)6p6}I2$Ez#jj?N|h3nQq7a6Q7-699I zJ!!^%*@$Y``xQ-vYzVGFtS#q#2-h>Lv~v)~#dAITxv<|ikkmWtK>#V*XBFB|Bumz; zhMov3r`*dcLh8SFD*PP6^CJb|2ce10tC^bev=@&!;Od}0XcRs_r-n?yLKCEN2y0yM zNGIm|6a#&}dl`e}+*T#2Iu?LluJYDN)tO7>2wvPB!i43h&V4Y*z3!W)D!%fJTE6it zX)LM}fia2X#LemsHDk9yIaqIoZt6gn3|c#f5!c?BJNUZj z{2W}7PraK>`rj)Mc*vocvbk7qR3FShAIF?8F|lGpK5=vR;6#(D9jw=t?PfO?*ts05 zaZ%Rp?}SnFh!?&;3t*aMF>%vRWFriWRbaa0M(BOrWMP)xMd-9pZ|QICRj5CMpZkJ? z%}?u^+R}qPnsGenF;<<>5w+!e7Gem5EhsMb1~sSus-6umXY{V+r@n)eH$=C-S5FRf z6Ly=mBoEE~_cDHOxsUtWwfR5iT6QOz%YGOYMD88>UgA2R6o2cmTF?nD|69IIrSVW! zYWy7C-qAUDp&_H9CH&skuZrF6P0$SXZ^pLz&1Em@DI1BfMN=a7KIzp`kDUV!pHuK7 z0j)gf;1wpC>!=%Gn6X}$oivFo;7C%BFp;z*f9T{yhh1WLC;kpki`M3&v%pA1ydfIc z${$Pq-~4Vm?FHUnzsqEJZum6#7#f=KtH zXPlm8T`fdLYI&sux5pX)0^HuFKx%`FpkD z#U^RkW$Ue*2AsC{pWd>v(4x3;q9+IeQl60i;thc!Lk;!v<8(8ElSflE)a^R^&4^KP z)X6t$btTzM4aQQuA>x*;G%7#v3ZD~b1*-j)?uKEEI9isZm(o=J(m9RRG0yJte-w#K zqb3#oAtQ=8W?;yAXPQAN6@Hq^!$wFcYDPdp4{~Atx289Ln9`CN?~nPpb|!JQW72Cn zu)GIjpW6PgvhsYibvGvZKD#?}_evAgp(n5$^z>+ntkrT3I89YZLwXd{zGk|vi?9(t zwdwi^MQM9KcwV^t%J!vmk~ZK63ZdKl)Ok&GD5{@2J2qs?56rMgYqr1Y(3f^hvs8oN zy)y1s_(kBIqCta=z^8IT`v_895XSmBJB%U8+!)0dVZ!x*|3EuYdDOCe zfd)2k6ApxULf~BwRdl#-#K&(&wGgAsJL2vF^D6E&Pr4**N^eA;Fb58D-bqz=H@>UU zKCEp7$Ztb#KM=U8*m6M{Ty0xl{uZ0)sM3z%OEkJ*&ll}H{8F|5>ti}*siCF6F0TW5 z8Vmp^XUT)!vLYJ?$awcF9$HMUBxx#n^<@t&Ner@^^v$sWoTrI8b0`bHT}xl zx+zPq(?WH!U;5N_?P}=LLvR{Sl0-S7x@P^n;)C(WX3!FvB*radQmMlxv&7Q?YNvB@ zDYpmR1zznQb&y|^lO|yyeg-s`ufO-Pm~fZUwRx2Ofq=G*SRa*o_2FU?pk~-!BH2j| zhxT!tLuSFU2MkZJGV9zUJeB|Z$2lD1kbT>PWSoPH zLXkLDSsk2nI#$`q$Q}*l;GkoKWS4WybB;p@WmIM=DWhyMi)`(oe(yft$M1h0k8|Jm zdtBG+x~}J|L&i@YulX~ek4@pBxa2c-lI!o{An{n~0L{qh-NJ54cLZjWM5x!dX%5|A zf9CX*$C{2HFM54Dy{cjUc)Bwu4TPCU9s*J zAKH9!2JcaHT^98dU3t$+tF_hck3>LMRZbmRqX%INaf)|5yKh-lJdV-v#^h_Yz0LBz zb@m+jp>+md-I1<`yi$&nKe;M>x_(%MSRNlQ3z{5X&iz(g-*xnjB3Y*Enl^r=NHOBL z9i)CPr23ezx+DrKPlMspUbR$RMHRXejiptTn3{$x2fKLmURPD_9?HD-Q@I89@gkMc z?}e5BM(;v02FbcX+!qwEf6N$~#Uba_OoUV0jPLvA;Sc4#lckdNe%oJSCkCH>5yp{w zd^txfA(hXW4!U&i?W*Dqmy>I4l9PY52W#W=wSNXaFb@6vM^r>Yj=;7|!swdks#~H@>PbD{?D|iC_$C?-qUUkTeJgNUG-L}(N>yV+%Cpp}p z&-d>+jsqutfuAK}A>e*q^;OnQx%iXyKg7?bN=&|;F#u)#JPz5Xx=bnM!vvk8FYkT$ z8kVB9E=s&!uaR}mZRWB1lHvM*|LVEe(}3Qi68Hb!q#1~ggmW#U4P)uV6QlzAcwV>h=iXC`ZMSz735ie zc?Lh^$2jTKTvGYJwb;(?nyDe`NkW7aE{8MfR#=Y{oKTtPiJWGE!`&nePSeq)JSM;G zC7&3N``YSF<*VxZxYK0YBBe@>-77^p1=?QCOO|w9k|CcK<(yqCCX0@8s>OYL{>nI= z-Cdn_kZ1gTfC809?o?bFZdu^BxTej{lbDF87-?EC zh=FQy9Z@8s+!Wh{DY#t&Gk9wOke@+GYSJj#lr;5>D%XRmx2@<37gW%y_qqzt83|rr??u;UZ&AnA>L!c{%E}{AY;BxrRG!wIDx9>UC`o9&wwkLYN#u0DY~Lyt)4=c{#)8x@E3`gT=Rjf-_bDaJoXDkN+J*D+qh# zEtPT%camVUQ2lYi^>R#~tah5$iL_X)dCgfN-p?+_17u~YCcG!WWUcITpUIwCDu@Sj zRWlUu+e$Y_=9<6_Y0QjGMn?EKO_=6;)L-XA<)6QTZdbnL;Tbt}3{w}FOC!nbDE>|J{hM+mvF=d>s48eDB}(qYNIV$)0-}MU6qol- z41Ko#yJ0T^Jb`cVGvPqngQsSB;-k1aJKyg(-T5Z-=Yzt;Un)PARs95Kp*k)8wy1T* zy|Pg@>q;2PB2de#Hv^g7{P#Tu%{p#2E-`AL&#j;1ou*&g|bN;r7X6M5+raqO&qMSb%LqV5o9L>|E zWh)SnbFQTRV2f6zR=_dNgs7!!Ri8t@SAHCovSDL}s3XP}g!_>aB~Q3Cy9HFDu9We~ zTsqMHsgEB2p*^PB0R#7A*g;GoF`)8_q9%Xnev^>5@#GO%31{`{oxb~S``xQ(7cbH) z-O#ambYl^FABuD37)~4==lo^M9$vFwt$JVGGu0bdzc;mlNqh(V16tdw5T3pFS$kf0 zG*lJu`tK$Xb)30EQ+=1-rihS2Rv|V8+-Mgf;AE6I+OQP$%(Z z&uI5fNviOY9LZ2f$5$};L2}uWjGBowk$Y)oO8NkKv5;LF#$0JHhpPzX`N+T>Th0sN zr5$@O8zJ3$*L+t<<`!?SAXkLreL1w0Z7b08sz47G;_ulaL z2tnU*QLP`ZNBcbsPkZ$~8FwH0>&(;>eq;A9sG?OeAhP!1K!1^pE)m zAcXzym#28`XGchbAg%2lJLPisTvZKZBivN{Pp7z-3eD;@RQ+>DzFG>U&sC#$`9J;^ zV)dm=EJPv#1|N8yx+l)n>7;5_Uok8aqUZ(hw%WHQdj58H@Rg_wJ1!9&lQ*t-e&lW@ zX~B4fq@TXviBN3~y4q4Pxh#&V^Rk7S>)1W6^kIqC<`4}`T16faK*LAo%>&@w+T4pe z7X-h%8HzjO$qwPg9H*0Wmu<%DyykGt!FQ7+qS}^DZC2Lwb~XJ7%{i>>qB;gc4Zar9 z18D>Jm#D3R;oQy1_!|?w#H+Gph%~6&^137neT*!a#I5f*=X}X2?bB6*TllNpw=j+P zH+%=)(ib+eyeHL0^yR_XVl4gU7_b(08`TiFEq;E&9WB z(}i_|%4ucRdF1St5I({ZORb(gCyI*M)jh^{Sd0YO*l z6BUIl?`-IBjMk;-oYOz|JDhqrVWi!z-T{ z1d{_t_nIMmCX&|WA9~Rxc4!G>n{cKA@i-9m6o}{AX4wf@@;=Mmi@75`Chm>yQ8`Y! zCf+hX;Fsh>Wv1|fDzs7(=a3PX$kx)hfN5t06dmMY|H$j-qYvYv`=>_;L%ap3IN|F{ z)001}%1d4!!2G>dm;duz5_Iku%$!jNx_)uvi9*Paw}4lhovO$1xEI6SN2_cm*BqFD zsK*+n`Zx^a1wt!H+7A~`G39VJ%KuWRwNsqTxGRwoU5yk3RyrwH{r(60w!6cc{`m01 zcMCLOCXbNid8T-_d@0vvqLp3ldj))tdg-TDA5U{?;Q{{H?B~QAs$ndy@69s2VkQ#> z>G^!YJxcZI?R!zZ+T5FsV^5=ZzM`<5rC}K-j9B5}uTs582#yMHGQCd5&&cj~Zmq-0 zb6(0vel?*GSefI=CnYgAe@jr_7`fVX&mmq@4w`-{_LHC8%RQHCqp=_qCT(xd#>ALV za^6;=A@P&Z8Bz)T?bdD#~HvYGi9Q}PIbSR2#r4%#QAXm#kO?5RMNRw7LN>OA4PQZIx0BUS)_OuXL`4u zoY+Y+hN`@JqmOgS{7>t&f1f*O#8^mblANk41vgmWG=HD zVokjI`n?xR+IF?|3&Hli{|lqe%n~8qNgziJZ5vzizD{x&&f=?hIAyqhmnT_+kW29J zv!qm!=CuyAUJyVD+@p7pUo8q?O`sLO`n+k#m8E5Qys^<$)3cWYHK_gJXe$>ob^hy! zsOFI5?-xHe!x?g?2S?h`(0BHCMPs+_Vpwk|f4TvIe*ZuCzbd%HKC2FCA2chJ7SSR& zO{7SjLh~};)p%{3tC%!v;7py5iyoDIlHkliiJU&e5hdKL)#o&_XP~OWNeGp8#>*#? z2dbx=LKD;sO`-Gvk17^dL*)&TXY+`{j&s6iVOZA_lYm_HTUVJ{c`gCEX@Gw=BYql= z6PHQ2;nZ@I4kI11hv$uq@;5IWs!`1)U!RB&XGb)XIq9%~`PrI}JJ;|156HjMHstOw4jA&bTdZaHI!e z!_5@Ozm+BsEj&uOc8qE^MBqd3eo0zy$>`N@8~a_h^sA|RoVuud@tguK|KY~O6uU+v zu3Vz74g4%J^GYaF4(rEU3C*@_2>||e@Gy3%E%w5mcAw9u;!m94 zy7OzrsAmDj7rY?~`AOPdQ{TgYab6_nSRNp-UA}|I7uAlfo~ZA2W~vwPL1c{Dnr*0>>c1*ksn<~-i@wD=l!M`eA2qcuF+x2 zW?xoZm->81%VFAE}rpXm?u`;tsCudREMr&i1o zXQwW<4^%z)8k{E^{1Z+vQ3ute;7O^XWhVZX0{uD|+v79g>HF#xP^($TIo9v8`U*Nn&E%WEp^sZg2rY^KOcK%d`dmIduk}mTJsu3I z&ge>%Y1TFsP|~Ia}#g!eE2*GJo6q;U2uY z4*xs#0LZmf{!!26?%Ut}&hF|Y_q?ka-S()Vfv768gP#l=?BJg8DXBvb(2Dg|^k%!( z&T7=*4G)c7;L}cj)JA^x_KO#@#dhpd(cV-mK>+nJ19C3m6T6app8hbPUsQQr3nwD( zP=RQgKVBt`A$ep)35sOUy9V)KqWsjM2>1j4XC#?d zjBNnP;3psZQ}eDn275WzpTF~jE46FDPo(f$e@QJxc$$y1eZqH~Ip$@aMLlMaX&fvi zNgksNiS`dDMSTR2&t4xc6 z!ZI!Cu!qKsL3?VxPto}X@%J~h6EE^s**Gb_Jn#B(`df_3ZF6@!{(C(2s{tH)Scyu4V1L( zwa*pnH{nn{7H7||UcF-;K9GxK9+Qp~U`NQVa5%mVf?iZCvY7oTZ(69vhW@v=&YX7H z=|*Z`uv9xxF=+jTCH@Spww^g=%6NA9_3)8{cy~(6vi+wc_U5CdE4|iCLb$zhfO#_6 z#p>FC?N7eEZI<8%;!U)zqXeaFUhb59zMF)sO94wQ$Zl%*mXs%)UMkDZXuDMhYgc>` z@;SCH-f4RnE`$1r4W(x#Tr`Lp8$HoxdJ;N(+0E%a$7Q48S52SJeO4?@Q`&vjdoVHT zcga@N3;BIfp}E>zx#2G1Q!${{@Th6ZU~^JknW@Yi)VpE~Ni;1b@ZK@J3FU;Ws9If< znE6rjC$=-5U?0gG#CB3nN4k(kr;p(L&hd_GW&m?~*FN0pD|8_;Q7;7*ZU%)VBW-5z zf`9C}fDjtyzwy6?VuZ)i(7@U8d6!#}{DsIRr?x+bt~=#k`sf8$DmCf(wdZc*XJj#3 zNt4qY>24}{?^6)`$S5?DQvIoL`PKak=ZlBFicdA}>GwU7dc;>D-8>nD;~Xtoj{Q z1~-aeZ%vrzmMIc^$A=QAdb4q>)*dwF2P}oy2W@5|6A=x3unHtWab~!(Z|0}T=`Hs{V<*B(ZJ)G#lySt3`%!<@$19~ zi3an%F8;bx=^Mq0>$7GGn=FsoNT*}_X$s%!Dfj({>`1nf-e)6blUFMh`Is zREi#3C{0y;oA|nFc+63s@bbpwwWa7~;1PqA9K}&yK1Nj3Dp2mC`!}n|7mpZ1*FE}* zIrt6j9nAHPa35K5N1mU<0&n5*eV0&xESVe^7J5_?FV`Z2?zdv&wt`HG)-zt{hbI zswj>E`e)GC&I@u$OhLV04hHd$a(;@xB+YDRT@ZO4a zzIQ#ysw2kkP|m@9?5z3Wb2{-zzsa1BziLJiG?=3Yhe6{y!1}-@L{P&f^$K@CT3Cal zsEG6?B>}@G=Dk-w*idc}Q;6)~f$afm&gPyOv|gL;R$6c~<3@0JSrRS&bpHOj2Q*lY zLj4)`8yS$sJATm(@2`g{y+HEn&%>r{mrzxrQdUJ74{|W)=?gOT$=t9RGdXqs`K<(= zuStS0aWd^%avV59D;bWu240XX>_zV~%LUY|2xymCA8b(lMZZf0y?iGU%{dZ~AqUSd zo24W5_a%C#w@UQad!D2lE&{K>#O1FTxEj4NNeGYebBajTv5u|ZU6#eW2!6p!^;RNo zSUCI}6-NCc{0_N!Xw=tOfCaBi&pWKw8(uv181Q^p10O zr4Z@yRZkZhB?^%xj!0}LncXDS1Zo%iXE`g*6)&2@?bC%gJm|nVjQ7j%-R>fjeKyr`X5E$%ce*9=rsdS{LzK8yirkKw)YH-J?}2_!d@y(~T$wqCUCum) zvspBwd;Sq_ZSL|paC~<8Qx=6+SfzCpxOC^~&b)Cc@2y_2*gQq;j$wevb85dwT^EH+P1(&^v2aDR8|c-QpmE`v z<$*F5tTNwROeitP!f+BY8}rtPAx?Aaz!YsxZlCzDI%HhV8q~W}2g`td1>Ie67NBvl zQ0H-eDWPIGIqa=wMAVry<@4(!fP1@S5`WQGKxLv5QEbbD?;_tl3KzvKT~z?h`+f_E zK7hYyN-RvHfL6-wkrVLqM@;*Tfv1fF&_Bjg8xx2q-H|=CMe+B)rBWq>nxxe{RBPIINm3xAWt|E>9FU) z)6Vzh*JZ}ZfhYl$r*$RC!}#JXvD5OMks|V5cIXBES0W1uQ8g;WMYvRDZ3&DO)G4}3vBysK{V;3DshTv8|@LcR{9K<<< z?*TKCipBu+EE2?+n-{vG)2POq*He!8C|6DOIe3@G^C8=vU&w$f2TPBaAd`pZ^MLtWnh0O`H=0MNX2wup!5J z4WIC20qb%OrgviQ@(=cDmH`_RNKOa4QrsE|&~6(vHvHkf%s+ytmCE0SxX;x=hV3`M z3^v4OiM=jIY-ZY%dW1P^;5c^(W3G0CC5{RJV$`bA36JyU{U>ZeYr3C;f}QR4V`KP- zSH%c(FRYD3Y#`Pr%UeVLKpL4za+ogi2O3P+Lua`wgzo!ybJ*>duhQF5fzDAJ;i!hv z&7dv>%8g_I=E|g%rDiDv`@JviHU#3k;ZqLTzdxqm^|nuRNMdaVPO^$x3C2FD{Nub% zj#{`JMKezRQ-O>)_kx_T0bbuhXOW@Ujy9_VpLJ4KRz2*SbBY7$P93b5SIZN?1PO-R zmrtrUGHszKKc{^#b5;7#LH@1FjDm3PT=_g9?R>P}OSgWP^NP$mdc0m(YhQgNGvvob zYn4%aotL@OSY&xMB@tqM8Mo_jP=qV@Wp>;V7c8q&1v%qcGP4GdjzcCZ$#I9mysLf_ zPkZz(Z{p|w5#e~5F+++2HW2up;3yCoh*ZXHuVf>$#Z4$LT*X&TPw03b;lkQJabRUW z;zlJIa^+mB0u)qAw$L4TfN&$1ByAHzU@bxHy)V+XRPual?j0TUT-zG^=BFTvy&m-ahvp$m?xm>4(@M?o8_u; z2zPR>&)*>NjCw)59Yhah3V?vBE9IlDw0suWGz8wPUg5jQA-sK)pmVN_U}!{POOX@P({TFOMTl1 z?`BbdMz2a)6#Dsc9N-dp8f(<3MuXMPsrG> zhWo!cYW@&rQezBtkV6mQ+pk^CYybK8%irYA(zk0DfwStG;#`>P3R3d0D1F(vi)+=H z*Sz1ki+njTJfha#-0};nRW>L{r4sgo>Buo(#)@VlKidHnKN3?h=K9fpCz_?w6EZgn zjVL}`ni9fz;0;)t#*c+ek#vPUb*#zeBsh01Ql<@8^@Q;&-yW^i2|9}^#_JwqU}og& z7kHWO0{Viub#Ub|`Ln21{WTjZ?2Lpsb=d25*dpu21CBN5-R14Wa2TgbThnH`$vlG#$gXGM+HWMK~WyUyo0wKZ6JDv{% z_6wsFU<1SIXRm={IW7?=GdaekUVT~@7pTk>s34~(T`iMhNpkTEcsf)s#SpR)D3fp& z)sciQ%eFk46>ghpYwlY9B_cYA&&hzY?Ma3X=6?8iWBByYM1bVxq@NRydRsCQCQJIQ z%5~m72(Hv6s&$cyFj05p<7nO<*uth^#UBt&zo>v2XKwLxD`KOCtObE+lSG{PB+~zxO75as+D-* zkL>g?PVoE>C%c1vqIby;DI&Ny+cfA#*HP5cg z=1Jn}NPGt8^RS)In;Ze;x1#ev8rQKGyy{Xa|E$>iF$d*!A6S{DBVTZ9rFHe-Pt$}; zVLxx?h#a6v{FL@pnR&faSNite9c<_5-f_gzX`60HOvNpMg;hleWgxX~P0)Hxv|V+c z6XDxJ4zY+dJSzQuCLryA4OD#g(CG;(5204-=PPH;le0flRi#m`ceDF_w)RB+^d!~B z2Y<1FXbLeMj(3pGrHD?nV#SF|#?&=l#!9|>pqqJ{vIj}+VYzaj>$u=kzbbB&GY?7w z+%*ef*r492*CnPGZn0&Nkmx%|A&$YB0(z-#v1xzh;j197unIKl)s9Q#Wemm+UW{_= z-Ay5JDd>-?c}eZREsi+RCq`0+3`U&+^CCyY!SSm|b@UO%!$tw+9~N(H$5iX^2p&m@h8E zipC=^QhzYngZoGZ9KT*c21TMSto*;wd+6yMtl%gh8qiB?IEe_i)C_@CWNW*c;XeLV zcSDZjH`Adr(O}TvD9z>?G>D%Y3x7tz3WmJXn`sKg&Ds%&8sg}gsKi{`iAh$ro^rA~ zI7#+An zP2w2t{DFI=77-VQ@EDRNPVIoo2X>yV$^&v8jd+m1u6%!3Q_He=a6RoS>sR~Mj*lcs zj>$VtE<;TB-k8V-fNGiG)f<<()nV7&jfUEU@o(s*M$-LnXz}(I!^YTppxRCF!FsXs zcq?P^GGD-_*##!&ksxmWFkq}*HX==sol#f^>+r?EgG4jC@27+O6(yCLM=2>XV$R8`|tl4zYYIPx{ zrUszq3NQ}lh4&tgjDdZjbxNq)%_Rk?8KTn|NQuL#)H;$h`lvoNIdLlwY$10YfABuj zFU1GX=M$u(zing^h7QyMB>ihR@#9*w{|kt-c+h{g1KgoiDzsxmiAy^J8LKNPU;W_3 zg_#hI6F_r%@2!$I`z|ISMlgq377ccK!5m5BraENFVCADe1{4+>HhKjsGUJX)*u#TH%MovH zn}G!QUSz#H#1Vih=RsqKd|SyCkm8_F4A!*&(R#06(M}$9d4BV zBewgjZ2@ES()pQj?9j>qN4SWNHGhQVm6L{#z~GTp2f0kKHcs#jKt~^F47B5p_na{K z{NPI!x__6$vr!nYg6j$F8Wv6{GxbO~EMUD=fr#+tYqK`$S2Z#6f)sc$2F&&&ai$0IH8yl+iWYHC$^d7swANia1 zzgPcz$ni+~Z>o(HJZaLw4?d>Bg<=q{v<39R>k56lBR3n!G&T%HUHvURP zd38tTF}&-{|35t(C+FB(=#}`#1q3VUraphH4JB0yj;x9SP7LwXSKx>npymuKR@Tol8yq-G?3FzW8BhXiwfIa{ryfGc|(S z4QetT&5bC4wlTC^O{Ml~pK>?Yx5^-d{yXW##_-d1@pPEjUgofSdFNsxWCMk?SMDrn z*{*lF%N@imi4$|`nZWHCe2|G@Xh!bO z&f=9QQ!fMqU0mKL1l!YlVVNv-A_yHd>qUZzQx@iDA7L$&|OK|SF!b;?f+c{{jZ&# zsTR=`z@TFx=u+r*lS<78X(DrOo7w1Urb|I{r z{2(3~GSL)o40LdRwf~NK54fW_4Hz8NIKtNsYeFBobl)$&$kAr7q{P(>7VH`O1BNbb zVVs~vN?XMiOSj7NAiZEQsA<`B)7z!8HTgJwzwXS=2i_yZ5ZD~bu7zQ#lZe%vS*(Q~C=i9V zc!37ekg}N~4*tAIM6+{79~&pSOPZ;1@@*n0rr4|95CjZrj*(p;)HrBx*^`XKYB%DC zjsyv~8gnTQ{v9M}{b|j6{Pgi9rN+QO-sm950_q(ehQKTf@fp4g;c!kI%lb*}u+O{K z4)9+Nz<@~@xALnLf9=;*{MqOAUCS;sm|d4Yk&US$Y!(qR^3+Y@#GKTH?az*+NJu2p zDnj%rIeKQrcYq32mSa3uWEHcO`V!nuN2EP!vJ#Ez1#z2CJ8Tj+G<$)Y~>{W0C4f7~Oc|`i8`jE-J@;6Ddqfj8}mVA`mnQ z#J(?4e_{$9<@pSnGQ`b!E4!UkQ`8lYfyHGU7F^uI4x!JmY7Ni9`Sx-u zCcKz2V@_Nsi<$Es@w>Y#7i8j~?ar9qE;2NEZM5aRC@%i0H-h69GXKEmtDavv3Yx4Q zAzL@cKGghK;J|2TXxwjC#WOMH_e+r8q1b11PeSwlA_ z!jkyoLtvG{-yd?(lBabYCMq02MwqZ_v!F7vAENKiXPxf>vg}0I*efLEr5uAYXblXz zl8Qlob`a2R7i7{d`wIf@@K_R9-_Ixrv$hI7vt;?L-~^AA82)NOT1oEvbLwZ@ zd#~PqL~BJiK?iY(9QyXB2ty8%hB}Q*qi53`L5VN)2YLxRp=VCS;Wa*uMk4)C<=rit zX>vMvwKays8-8|5;i?R_Ucx!5wmjPeBGSxTYTxb1(9lagWQalYG>N;%ve$F7 z`iW8fBIlxK9K7ZG*AswQr&zpFC zIF)+8sxwxs%NqdhpBc?0$S3qCxa#~^3(iG7UpA?GcRiyOeZ2XI%A3ee@_q_pDNkjZ z9Y3QC;IgfK5=*g@eV1kju(kwhrIqSfM)CVuD{$?%cC1^5;sz|oSdYx+?Mu1a>h@ly zWS@G!hGJ8WD5)0R#)_&OGkoAW1N4sGWkJ;01|%yEH~_O<(iFyLvfVdS{g=Gw_n?6Y+o+|1D0vv;*X{pbztY-4h^dHlL5)xJxg6pl~uY zrTn!6Dc-uoKAyt+mupr!eBYNP1X?_z);#DxYp?~AJXVTM-Qo3HO?H$ zitZ&xaVr&xh#xbVB}d050=gqbfZgAqktw2~IDKI5S<_gl7Nxx90;*Q_%xG_~PnMWF zI8yiW{^m$dRFVNbGe_{Th6ky})mT{c-lY`rv$Aguum1Qgy(;RHr1Gk}?@ApV_M#xc zqqhb03en?dn(XJ61}|4U;3xqR`gq4RhQ5yuNWjMpx7@4RboUbgXU|xRW975<=B(y|Ud~qarQj>ZJagHpHDtL}P5Yy$9USO?>j#mJR`GzhWpaJVgw6@I zmvEydSC2#w{FnFv%O&0pa@UH*e%cAc%paZuSb2-6ppE(y|F&t7h`ra$k;O~ESC@{o z)_j7^KQJhC!K>|pJA-DKh`thjk|`II06FWD=W7RMdyYFMeH0$dOVY$~`2t5o<S8$VsRzlR|k^&;Fbg6JcH z=iO{-TXbUd^cZQa_4FbmWB+SwIniFJNZ5B+lp`2kjM{aV_}>aP5vq&7F32B%&7vi} zVHFX*p{z+qBe_xeNc7wC6e;`X?p;{o^OzrXw~&KpXieqh&gqLRDVS;Hs6&0c-Su^) zCA0+_fVs(SI?TOpdv&2b_@|@MmyNRd?HV0{W{Om{FD0X0-a8$cIS&hek1022V>5=v zr?DNpscz;&G=2p0J_f1g@9-Arj_GR-D|rv+r?a{zBE=wCk7Go26M` zY#=ua$gLps*!Jy`d*c9Zw{jqY3~8^}J{hR@#Exsy(3i}lMC3&Wk~hz;h1`E)a{FuX z$8VrTl@7BZUD7<;8dVVXwI+WxD1uEzOf1ia3zd{pt~K4nwjTeYWX=A8EE-gcPQsr8 zA2=oRT@l<#&!kK@Y*tSxIcMK%<)xFYjc&5>-?~ZChlfE8av)K^kvWdFw=f-ep=B2t z@7pO*im(w|MB@DH`^xG8pFX}Ao`iVOZmK?fHUJy?)6x^J zvM?o~V9M#WihMxTugQo7M(sI4nu`X~0(^?A=I5u1o6D z*`$nZ-p1-0frHoK_(R)GsG2}m8>S!n7*%nYn2;+XnJ~Pgs-86&h0u&TI4?Bg9 zRW|j5?hf!3yDeeoW+@j7`*vsWx#%U$I4?b4rrztv&~*T{ zxT!xRgllxUu&pmQteDg8B3SBDtf&Eo_`01o3b2Z??T2=Ec6Jm}j8Wmg_My;KzL;UP zi_;W@_eMt0``RGjGHN8pex7$pu2q~YJ0pYoCr9^I@WOAej52S|>-+aBK-cOVxR8Nh|OMUtvTuubUY^F5k#cnW<6$oRc2@U@ z*~q5TRYgaqPNp}qu8+qFcLsL>)tL`=&}m;7cAFK*+2WFAwvfs~hdCnsIt=gn_?Dcs z+%@Zb-MiQSwlu>C@@@}Y$wyn7byKrA?&ZEf6V7PWP`I=PB8R7p>d<>F9>_Q8jj0)JI4D)al}|1{yk_JNNaS&B+y>ndiE=?GUxu zktqvCKF} zWOLR5F5SR6%n(ozU{9eI5ZR8=6sXZ?VvYpo2!17a=J>^iiATV)Z{!rPYZ&`{x47UE zS6eDT_P4|9X{DP$-ln)5H|6+|RCaTPeY<_-!mq%4iHl>iXLOH}U%C_a4u8Ax7aIhB zNOY@`k^5r;Yf4&m+2Onv_YR?sddW9kKv#HqI_2=xdx@sEQ5WcIiXB}3cb|13oZ_Fq zTDv29)31gN_fi*wJki=F>j^|r26A(fNLQ%S1J&pbpQ+oRWUt|qIFXG^!V+N#$Ruw^ z5*|@I@(|i8M>I=XC73`idpNa)ap*2G)a=tN!7Gh-~~P!FZ4O3SjH2X*4BB zOuhzM3VLQ6O9~ArP9WQPp5(8G3;B7G0t>#Y?P^AKIiB8V+P`2^e9fgUR-Y&!q=`Fu zHungJ*Ye3Nr)Iau#bh%5M7z~nK2y*6`?=Ti(`Y48xOY=U>&sG z-7W%kt!wU-=m2M3=^9u1y_$?kKG^M|m{S~l#j(=wypQW1N8ux`|K1r%r-0c11=oEW z=<4dSH1A7^&q0b6_i3K)%O_3#^?+E}`t;99Fo|-Q*Y>@jRjX0+v;&EP-B4h(%qclj zkILca9$a*F*^tA4MyaoXqq07K>Pu!Mzbg&&d-2Y3ev5icGXd?N-!AMBH@tf@@`EVKCYQ)Vm$G6x8ECf`fZ`-yHCe)`!Pijo^#@-#7 zk9=}=w=MkNG8II8bYjd&{;^xV#F*1k)xwRNP_ji_p4O(grkH?EFtT7r4w0ES?+PQNqW1>6tm1q9yK)3o5Fqha90mb^C}v@z4$!M$ zZ!J@iakfmR$yya{A@P%=rwNb`g2(W#lD!B;CX30NtK4X1Kya-;2N%MpG^-ITZ-0|=UAe`>EwXx?`?(r z3{-Tqx4o|#uXv8@lTB1Q4Bl_}Szv(I8W)UYp}P1Gar5l!?*dnNovILa37m|7sdWx~AwRgDlW0(L7$t_8+H61c{2_`C9>9_BNV z68s|O$m!sD9=!4Gu-liC!_HIe&-b|A`}Fujygw=;%shqOCuH`qY~&cx-@EW{lGs?C zGM7jMbn>kSh7@wEBM>o39%}hl`wN-4h6=Ns!gg91N4C1(Qt}~Pc0G_&Pujx@;_0xo za!a$|?lxxx6WQV+#}JpCy=!uOUVlE$vaOg?Zgzz_+&UAjARV*|NDB20L@rATVWYscI!go5roc$^hdid>}hNH}j{j6nGcW!(wR34TcWI(}-B(O+9bQL~7d22Y$jN%9 zKM?{}ZoEn!jE;z_T>AKDb_|xi?Fi{9Q5zq{k*DNlZFb8Jc1#-A6I+v+e!=>M)4C@W zG{zxzL|2*h>-aDLaQF7%dYq3Garv2zf{9pGBy?FsIO@v0?9vi_mf`r>{?h1z8Okq|9_=iWl zZb-*}xlEzl-@mc==*c4_e&w-|ip;FxBU+`GP zkY{SWXnMiiFW}vj<8`XhaARPCa~0N!f5FZ?9lld zpbJi>n?UPtO}K~?CJ6m->Hv$9Topx-uIm{a_%KBM{8RMpw10J}bZ9Kp9?ychCf8{; zHZS}UX6IP{`SvmJwEMM)QJ@6J^fS_C`iTwn#A;-@+_WBhJ3K!_N4FZ_)p}r-`&P3V z8lat6-|np&s9S1Q263SZpZ?o~q=o*jWwA4UyMA`eM}#smsQDyd&gviL2L>*(89Paf zFkNbTqnXdnBP?s$b2?0b!n5R4zwdF~@gxqpv#q%o?nMM?tAXk zd>1@MR6-x>1#$i5(sx^5h~WE)yytjIW+m*zNsPr5p;V+_vJhGBw?2Mf!xjBlBJXY? zwD?u}@QuXc+uCXjzXBwsnDyxYG4<7PO@H7269Hj>fbt@w1Vmty7DNFFnF1oYjnUmD z9ZJdo2NHsWO7}*0N=QjaNJ*!ZNGYJy?}fg+~*RDJ?ieFr0#FBdgGs3NZMfb$)fuc=D2 zfiCD>E}gxC1;4of0=!Dez>Nue(!eVlH6=Tycy)VnC9s=!;t5qZZjm^#Zv@c1M`Ok9 zaXZg2oQnB+-kp?8+*SIpue(o_0AI6vV5Quw%ehwh;C;TaOx%6P6nYD54;8%Ed2Al6 z*3u-65uT-?Lr%nP5PBtL_23A=lifu@;6fTT3sus6jKvnXR}#Lf2B+Y<+*vDb<}#z3 zckPH#Zshcuzpks_Q%d)hy);?aXn|LErzy#(mCy#Ohs){-pM>je2;gPmq=QdYI|?JY(Nv%b!aeOSdWjp&xM}B|()` z9`SWK;DtH1Xt}gl9dSmCDuF8){u>ar0eH{st?^;Obi7eb{mbm)) znRC2`e|72y0iSXQk%DFfXcO??rpu}v@OS}goOEq?`MmlU)I@`gLj0eWgQ4 z4X=^PR(W$p60NWd27j3Q4CtL~=+f|#Tn9bI_*OkRz28J6n7>SGoxpu^VD<##i{8e` z0$t9b^Bz7wOyDN%;F(<>aU7V}#m1c)_^f>W;-mCm8;lq6LP%j^je4-3v;*GD`{=Hc ztI%C5w7RqgHi`H1Wg@KpxOGUiuoelu@k1fj0yQuLsLakxcI{G-DLK`E>d#)P2H*F6 z+eGso9oN8ENw!C*vBW{};F%(g$OmWV`poZVp*7q&N|t&qSl%vhs~M>g5)+`k+827$la)V_>rgfFkhRLt zzH|exq>Dhe$;1JXiB|8Xv~P~nBDvCH?#ZQOLgjoetAAQt-%ETR;Fsp*b1tCw@@gVqnPT6{%IOI!?d(Z4 z6uRQA!DhbWMPd0FBu)cFSpJyqwO@;iJ||vH5rw0%t{3SjE0g0cU%`;-^@TG&zK|UD zKJR6IM$cG)Q~Q&m&*#2Fbpv2y8opk6k2@SDe}&|tXxPv;6TXCnFHwZ?;!uDz(~k)? zEfSy5KOPZ_H^DlI1Ny{o`A=Z703IJeHSE09uOkaANth5DEvuI=M{R)@>NXHH-feQh zJo$4c!Y@4M%RNcyOWk@%4OQc70WpqQV;&hSm#>lJt0R#3r{J>U^dZ30X*N5|p!>+| zTxH07U=x)SNnpDM*qco$Fn+F97QDLPU`Eo$6F#^VA^@s9BA$%5FceKpX;B8Ys`alL zD7U9p^53QZfTphT(jq}f2)Ix*ADlK5;&%{m&7qN@aWWKDIn+qaCmdM6N>8c(Sh>3 zjDU^00l^k~aTI8`SASg@6B4mrds@wLH9$02(T|$`1#Aujc217}s&Tt`M~XuWF*joO zdEwiso3#Dtc;qYLycR}@&dgW&oM{I=eSg+0PNnkdOzolgFy!s&%50VyEvFo)z{3=F zyI~;`3w4rO?~)g{C)x*kt-%< z5gZuCx8d;M%N{atSsBmx!`b53M!-5wr(+=nuBMK-z^wqLY;^>L{c7gu2X~WpUhA$v zl&M4N8?Fe}R!8=R$v))5(u@HZ>6uXL{%>12)HctN2fd|)&mmfnv~TaJ2%)x7V0~U= zTh*%Yh)Z;dSa;+O1bkzbBEx z;E#!4yxEWJd4T55)_Wulx>f_vF_8c`8)6#S0fl;DKHhZYU2?GD+66rBcYn6p6IYCT z`&ZSv+04)%YUy~ED$@1q9`{_-T-8z?p1qJ&gxmO($qB~+(yuB z((QrH5sTgppK7CJniO|+IuVA3{buaXPOMtUz>4|!WX7cQ-Z6KaWZpu7zX-U&`(;Ub zldm)An~TnZX(Hl>(ZWbjjz4|dtk1B~#Rh++zXRL`J2R%L!CrGA+qI_Y;(|r3> zj%HOa6GsNdkA6JXs;0fE+v1_W)qcHxYX*ZGlV*!t^Zo&v!unO^4hO=K!uxkckAFuo z40QhfWzpaq$~pvf`e@zhHEt*Tak;iJp$W4E#vhXB2^AOE6LTAf=|*kL>K(# z!-I(>wD%ta&#h*+ijqT2k4&|&$turcVWi)qg@aZuxi>?UCqoxu@ZmI4W0QI_J4vk& zOkJoKTmRxL6}A7CPtI5faJL9Ww1?^ zv-c#yV(3YRm%lAzJoSv-Z&6 z%s~G=dwg2Fr40%ULn-94Z9HM&roLP=kI`%dWd5ft< zt#+kLcJA@ZG%>oU@{oxRd72}IQ?@8qL1HtZ+Of>`U~XB!&>Ss-3J?fr5vvs^IBt-lf1HchEY8;P|Nd+wUeI?iE=USYsak1s*Ki&=Ae~{?eqp^0h@a zDqM}x7gQpZ->F{KLvBwf-*wwWS|ZMgS9z^z@fOeDj-hcHZPwRTa7rDF2lZA5zWPYo z{?{KRdVKT+SsSG;54-d zNAl#uV0HA!mUJ^PgKd#C?uxqsHVycu`0PQC_|a6Q9$P4WjY-Xz5?SgbX-L_i?bka2 z{R=fcH0u@tE-gYz87^JEHB1HMkg)S9w%PQG%# zJynW0;oP78et`yWSz~jxqn_p_i*f)HRI{LmxBT#zRkP6|NK0l@S?o)I1SLx=S6i`j zgC1o~H9O(FDG(7d;rpp_Ftn-zPW;i}T@?(J+Iu7^X;{dwIPh4>4vrD{Yu!8!<`~gw z0Gk;Q$vmf!Xo#V^sV=0Y-1AX$$t7d=5Yyon|8k^SzLWW~+0vD zXi-akbX7&1CH4E_s4g~qv+57E+YMcACYJ)s@`EaQGx`vgQBeB6@vA3fgwZr8bG9C`8ihbTutQU9&rTuh@Gd!CRtlqf>uUMZ9p9cU|5`j*967tR!yXLH!h3<0Fch!;SaWj^)fs4R3$+t>N+4%7wFX~=(fEekY}#dEaESRSsKdr zp{v6p9^04EdGcVValMg@g5Y?PpmZz0ns$qNoA>9(PvTb>8^3x^6epw#^lwLrw!erl zd&7{(7#*a0O>3e_XWr!xQc{aJ{Ab_Fgag!uWYhU_DI(AL{tLbj8UkDF>|5-9p}&jo zqMA?FTqmF$6nO!~>(lSL0Z3&srB z5)}uT=g9qqngstJY6}l^kNSIX$44|Fz>OaA9n$x_cynRZ(^0c68EyaaE}Ki(G^){c(&3$U zD{ttW3L{ehq6CH`I2P-1tpD-5ws%{ zcOnp<<(I!q-DYgRUCw2A0W$A@*0VJ|yWG@vG-^5@rnmj8&6=p0%Ihc()xdgo!*It% zQ#kl(BRUa4QV?a>ZXH(TkCt%u>L40Tu*ImnYN%wsok|Q}`E`n$fx6a!#lGZcUBs5l50Hh7%W=PMjt_?Ewf)iyIF&EPHMu0?F2Qj{yM!H5lVb4 zJ`y!vhJxQSlyhVT2NZt+@cGdcd*y2)4j(C$qbmyJbL}cD0HsPBV6PHd$#0?MFbPlc ztjLM)dp(pwtlV9*-+M#7Y#64wi9;7Q!@)7;-UIj_#t*P1vJFRw9`tHe$3>ny>(|;{buZVX1e`7S@kmKR2Vk6MP zyZ~Dpz>yf4No8mQn4(SW@RiWyYN(DiFtJwT@c5+0W0cI(-kBt+68d`>=eHPhvPOOC zco70=Mh5|bUhUtQE*Bx4eJfk_u*6>i%89KzVdnRX3g4=kB%<2lQ8&W%!yVo_VQ7!g z8vALO`{c-OXvR<_)VZIr7+g{SSfG`70f_K_i-fC?9G}gqaW|tCmm4QupT4NKJjb*7dN~wt85L`^wJ3gw>A9Y0DjF z2kpR}O58+slxsZ4pK9GeZE%QYI0-yVn+7lB@_t+o+s^yElU(mTgUin4EuiG9V`2)-P}(=qqrOtu@kUvHp`BD z$nq6G1j`!d#Ji$*D%m?CP+1Kl0<-UkyW_2R0+k2JKWP%wJty(C|IvAa7^Jg0KF=D_ z2{Ww#EQ;jB@@pcnaCam#TH%#DL5P*NpfxE_@`eY``Gz>Egy!pFkqMc;TxZco4m**C zfj`d4>~l_LaehGjVAY}06h>|dykYo`DaSq3pL}cgjAEb|P5Z7AXFaJ)1vhO-N3FW8 zWSQoQF4%v>9sVjRN6!Hu&$nUcbkR$|aReXPV)1ka8~Pcw6D6&b%}(@#x9xy+7r^Rb zZ8NN`AcKA^{oYO{}4bONmKiZ&H$%((KP}uJV z+a1>;4A{DE4#8YB<@m8eR=~cWz_oV{+nTHGm5&KDR)A@B3=BP=tZd1Qe$GD^{J7H8 z|M2?Xxs^;9lkDKA%4BMG)DDJmd8J`c6{7~T9@v!SSbS?XVN-0Tn~93BolP=JDi|{U z(#}r0NLt5($-Nx6K2|Q~(XvpKjR#IVCjV}=0G$N-iY4lbo2Tki_46K)pc_;G) zo$!hbSLM3C_!6R9!l}x@poe|Wa7#ph0fW#ijh#?0f81!=c8){Ful`ai9_P&N7mjs)`An^W;w~Yuio|=`p4G|aqVn-z@ z$b9?A`J%;C6}Vf`49yWb{WQC7mQ-!Hp!FTtnEAMhF3SR#e_K-}7#>D{kTz1|(FgmE z+*dNFG&MQGvCMp9Cj#eE00Y-!TAvPb?wM`7CSgFRT?Z>*`@%{I%UubTbg7~;oZ&|o zaEceSO7<%_B71_pxocvM%UI`s7^y}v{lhUb5HyUBzvx#jJVbN&xrTu%<}<8Y7mF{a z0p+MLgL&)+h>(+WWvo9mhMS(A<63^>{JG$ioSZYqK^fbKoN3e@tbl66w*^N}jUV%R zQIz!V)9zi?03)RtG!%b@0JT#b=W2@>-ZpmQ`OEenPPM2*Xb%%u%x4wIeG8mjKPN5! zIceXSdNm*NoPBubgQgWM!;P0hoil^&Po{3DyA!(n1yYE+Q8H86&xQ1@>;S)4YPiEK zuyi2>W51#BuG%?K&{qns8vh4_TjH=|s*ImtTri7BThX%~I z-4-VBrMAHQH3FIVI{e9p#}D8>n^imKN))43668g)nEI_!-l{-eumt++offjNe?_+% zS~@y>io;hCVy>ZMkjv}~6V94#H1Pa9feKunW1^NtLk@6CePVw6X3IM8LHuIGC-o?FMY0_(}yYFYxR6M*yuH6b#DACllvGA(DE34 zQKv=NX3lm5R_>g6dFxBszD?;?;I7N8xcTG*jn@8$?MfWi8A}Dze@px)JX-a-wD7MN zR*0`^PQqT}BySj40v?Ap2k63u-5L)~+E=1l62I#nNEanfmDRkMvKE+bOeOoL{O+Dh zFqh`e+>YAlNv$cs=av)CPak28)~HDCO5IESM&n2v_by8bb*&P*riT#SPhWTJ(Lrc# zj=)U6!0vm=l-6g2h=tJpmF1Q5eI<07FG_|#SzvjGrnPn66zQemDP48Bb`!J>Cac9! z4!i=hsl>|eb??=5s&Tp;kJcw#PNQwnrAK(6Vv-cp>{NeurwXihoh`m_dygeM1ywOS z+4EJqT@P!(kuO0|j8%Tv2OBQnG-Mgu?-N%3s`2Ee#Ad!lJN;hDOtj`@^lJWpDDUx4 z3l5Lq$SG`rp$c3XRSJa|!xy3K+Ky-17z9_5K`FG4Ihi3Z=kpEqDn>C>fxOtJ>O*Ir z-hbo~|3@C-$eTd_FwTWWBk{Tefu_(6S00m*Y0C7UQim3_#}^P zzr2M(lx?g~%|s(znO*JloUz*9soA%w!NoyRXwSLt)1jZ`_5F}%wz^dZoJ3(&2TEMu zyQO-vD$m^p__E}wMA3n1V8+vWF*8&A$eYOF5T%TbLciaj%ZJy>SD>^ihMC;zV12Xm`pX^^2qa4F=JTMWyEJ}mN>MNq z9Mb@YtLs8pOX*-!mWlq#=Bsn5Do8XT(VQ2Z^xGW{=W*K9L%gqqI*EA{5FEpr8rwa$ zSZ=CnUZW_G|0enBh(h`PeQmy5CBCfxnRjaEn{8Y^Z((gKjJ`tX-Ia{gfvRbZ4aJS3vbL2aP^B0j8%*54bX}IgrJ1!yOj@ zE{7eEHghrOumq<@eNPnxMrqXG=$Hmn)(m522QCjGlzErgz8y9djUO(BvXAYHuGHmR zHKaf`py+yD%^O_HeULWu;Gb3Y?tGYy%c$q4Wc@2Aie#I@3VsNEb%NpyOn2u;MH{Rw z`&076itINmcLo2K)sikgcME4Ml{233JBG-Nvs)MZe4fFT|p z;crWxp6qq-3vEIWh_XAHJa~~f)mFE>L-lfSb;~dk{qT1247`!cUHwl`MJ#QvBQ6qUWO3n2uAc zB_qf!opco$5ilPNv4a%{OZqXX1^^@#PA3#SUoaXT`>Eb-)+b z_@A@!4_M?H-dUbh6D^c?|Rfoq_;UX_Ub)iTNIzx4Lp zV+9=yN>BnZ1mt&qWU0tZAH41pcD(ZP+K5OIOx$auM%Aan)4OTP^+q|g^44)5(_dX$ zLoMTfR$A8Tun5G#i_G5#!}d+EtGU`N?VQSnm6OZvxwG{VekFEIp`pC2J&KK{4~`DK zVn}bX3=La{#YA;~|M2wrt>5!Y)JX7%`%=l`=tB6$PPd8sWr8~kdAXwX)d%l#5Z0EO4mCX2i2g1gQvDjY*I#02 zKOS4E^+|Ak>!A7gBg@j>$}L@sJ8JhA4Yp=}z^g~A9H<%f?+ko6SGIE_Uysz=yJLjB z`9~WxgW50ehW|M*U!eW~rnnVne!4yN?&PohLJq|@w@y!|C?!#E)H$!1XD|wWW30>w zli2!m!)?HL>MPv3nhG4R`7qag=$Vsvr%(?j)#^LTy%>`GWr?NZ4MCHU_i;fsmgj7W z#xcl65|?uCl!hMZyr`A0!Ui=MMm)Xnm-`T@JIK=N9kp5NyH{14rbr*?DJGu2T~MZ& zmlXMHazl#Q@Z;>48@7H$ld3pGoO^|k=UQbdb6ui6j55A802|KGl+>3rOL zcJ1TGf5H;5DS8DD`D>;?9HWQt`x>XHd8KGa{F`|?G+?8FsPLTm<26X3Q}UF)f5aOv zL$X9eF&B%Mt!W|E55OY9@&MW2CXDX3HVZztfED-(t_VV^^Lsbd*2-9s|X| zFa8~{`PVT^)bTgDDM2JH;~DYaIX6gr^jc^dSnMn|Ic(qKME>JJz@rXlsprRjdfV|* zkqsU+_yBEl^LxDDoN6LZ5`VuyPwkiL<^^ez{PWM&kJ&o)iw^_QQw=Aq>Ck_Z(A%Cp zY*FI(O9z5skm5O~b2=YWI4xdselJWK6NwJnCL>4v((8sd->&bPG+~80`H3`;c~d z_QQ3M9RWHu9?CHx4=y?DzR9p%VG3=>{hFt$*B>T+q(MT>cwZ%pl@0>&dSt%>O}DxT zUlPzzc>ZB1IP75TUE@I`zk?3K{H4!N#i5MOlp%Qyl75CRaMK&7qysK6pF9CgZ`5YJ zThUnQRpb+nA5|Joxj=owZ(am&NSdS%?xPuI-I!Za_MBDZnzetrY2e+BbRXMKb)=V* z;FXBqnUqVQs~|K#fE%%`2uC_NSWMTpL!Y_6E(&>BCo!yrY{|s-zp)Xe00&~!)o`>k z=-hj0J6*+(DX=CW>ay_JD-<}GSD9=P$hbW+8G-xUk`ZJgjHd0D&gReCKRhi{ccy`D zON;!ameKG{wd^4~Grks?m%!JFhp*UccF7O`q!tupm5*y`=?VH>v6xbsDR<~5(TM#; z_=21U$@yvn(t$gV1S1rSO%bISlj0hBI4>S@pZP8mC@n2TK6&|)W2*3}@W<*py&lDd zVZqS3a_4+%@XMJD`pZ6;0c+2@)Rc5)~ zT$tK7wA85ESb&I@10pAnXg0Ee5(4o(SSFU8j3#)sv8Pk3O){=uNCCQPw*)cFm!rL=cA;25OraPMgl$jq~G zN#<`AF^rUg*S2~cE6qgAySdFy&$gr{h~!`MFAl^JH}y~Jmz{>(ZuE_=Ac6$M`S3;2 zc&yZ1Y^1ijK_~a|sYG(+yxbnAVe3Yh|Gn#Hw6IWNg} z_WcYRW^pu!?qFsf5#%3mjmBR56@N=x3=sVI(o>aZb+enpS|*R{hVIU=rZb45|6vfO zIm)kT_Lq#fQkSnFvrE&nXa18-iqm&+Fvve}f;V7UPZoUozjc8_Y&(tr_d-a2K*s-OmN!iL zpMu)nKIQ?RD+##J1j-Hg`QKMr$eO7?PBNc=-2B7$-FKVocZa6){|28;>FJevzkhao zKSKG_8fu~Q6*zbb_Cn9O{_s-3w5+xEqqr70TBsE}&302k>OZHfD2B{==k*^;LBcf5ziWv|_gyHBMA?@p4pENV263(eTH{N7CY^EZ|h;2tyy?ki&I98m|`r zIeJH$H{^Ho9SAeai%Exz-sE@msf&45&I}nILRr`}25CQa=QjFrG3Ra6)N3+pUTF3; z46MEo(5YFihiUaRX*AXF>x*T7d+o;kJ^gGhf1~?8&kYaLGoT;=p0Z0%XhXKuZI9&d z?f6hkHa&@c{Yy+pt#Z0Zlkff)76n$u?A|6}0@_zrQb_ni^6B?0(pi6{cs3qK)6TF` zxn42^$!wfR5@iH^xqekhRB2&Ho*-!l|-5hz6NmzTmB;@x$T6F0$ zdKX1ktPS5MjU-N;UfHTn5bW7!C~sP#YxVGdE~#77)ceE8oG&gm^XJKB(+l~aiE*KM zeSBT5EniIY=-tklVXs#*g3;An&13L~@b~XItR(^eE%sJdo3C&yHaiwjqY@@lRG(S_&Vc)1z|liO~~Qf7aw! zs}xSIcCHO|M109`zH;2deI_whomo410nfi2co|41UkPtV&Ey#h3*B*#x9L_}74 zm99q?W(ZkT8#$%b=d8^rX9$-{&u-?f?q+o&&#g0J&|V90dUCQw?LGlh%>9-4(#4*3L=Rhj#iiw9W1wa3PLF7jxr9vN z9YLNds2N93VTS6AVRyxws~>VuC6cQ^EDU=8rtQn| z(Ym;%Q+V%_V^*72GwF(#S$R?W&@i`p)kYa%AX~8-oQztSV`=UYcD^dOSY> zyRs)jm>Y+^UpC+KdQU{v)xcX7bC;~0xb)@qc+DSzTz9=md|aYj@Yx_-Zb)}y z-@uT7jMd!5hFkm1bb8p>l%J)P1U4IWjnk{~{zP--;}6C!99rF~gxZdB4d>bQEm2qE z1;@moFD{Ak*=8=IIc_ItnO{!TA_%a3Z}S@J|jVPSi( z&>ETx3)Jd*-4&>TFw_zjo&M;nU8@Me_?O#OxYWEZ#mY7zrD>vn_LT#EG5TR&*d(K7o)*Nc*>`q1t(GA&Cu#dQ!DBW1dlnS z!U{7Ug8Uy0v`y|{-8!=A5@5f#Q~f3LA>aKOJ&j{q#iO}>P5siy8+jR;X*bH$6LShU zMRf>WfvB$2X4ry@<7Ko3?Ay0EWx8Wt7ykpP)6+KYRU$^Z1VP@m#QqX!hh#9E?iq;V zpw6628lUh3_RxdV7C1QakoT1C{CT|tgvwqI` z;-l9A?fY4P14@^JPhH=oqfdI+ zw1XoG507CnTw#zoZmY0$>T}cGqRU)0$Gm(R92oHRDLo>8_E7ikdX8 zLIh9r{Nz+ST4N}2iLAF>7kf?A_cf~PVhGP+aA8fQwF;k$@y{Dkn3X@b?3dLCRNilwz2|VhUbfYR`E#r5gTAipc(g1G&=Ob6rd72rrW&Bt^|Gm@(E)g zRDrvq6cjbwMkT6=Ed0TbZ6MyHDN+a1ZBEJ0MN_Q}y#jY4J4Fu@xSAlcU2>LSNc$ zRcEz|n7VMc=?AsqT6^zbgc;h3Z?s1AwkrmBzfT(u^a7a`M$$##E(V3T>xcT);42AH zYP#4kq}BLfOza}c-^%`o{*Ll0#u6f zAv-X=Qq$U=@Oq6{`F4|AqFVOAee?o#0)>bk;kswVoGCk^=ARG5?TYQPopgUOS*N z23n!;!Qs{8fxEBk z>Ki1sE>xndfJ%)9uxbr(Kh9-G{!^gt1A1gFF+A~&a!mw_vc5{b^Zf0Uj2mN#6}W{f z@t|UhEC}k2kUWZHz#n+n1LlRCu7;Mt-LL$9yh}A-y;9T?TXoenk^dPqTDI+@7G$5= z>L-%+6ztQ)chMT}N^wPlOQ!kdXbzrmRPdgoCYy*8FhZGI$SLMsyNDjFb$7@uKy(!H zmq5LxY+iqeyp=ayYb+^hA>e@*c%Y1Zg{q;;zL9s*_L`lW*?I=H+kjGhd6!}F_WK8f zr==uLfV@3W#$hN1`{6~a)Twa&Ar6iPi)j9{u=X_i3%4KsL5wGP7z6m@TJd{Mx6vk0 zQGIuJdmuSJxC?g7u$Kmq&}KB=mQFt7#uj9*+8 zKa^c(wiPQomu}B@C^whAL1K8S%*{bu-00OJiJ`M3>waCVA^n?gg+a)Aius!aMcWKP zE(<`@H01>N^|2kDUX*wR!7A{h8kg14Qz$;PmbMuskCl}|+GXbu2qV*iR zko+fi#(sdXK0=Sdvi#`dsDdVW9$BQA>%T&cv)p8Ue%;s5P86--U@bo_7@Zhfp>7Y1 z=wcnD%C6i94N0O%5_ixQQGJ*7I_Yj1H0ha@z-P^F6=tb#Srlzrme;gHUf(Rp7!Tch zto+1iuz%6j8fb6yioDG0N+rCo&oH)_`UuofyQ$~y;&$91Zb#+p+S0r=Ar0+RigUb= zRd)LFcq|01v8m9YH8W6YS@gZ3nVS1yI(Js&HEnyKvi)%ndWYWDMeHk0#R?4pLsG9* z()#UCg3zTh0TYQ;*63Ecs)I;zD0=c4R^|dRYK$qoL|lp^C(vZVRANwZOHTB+#2@cN zoKPwnOdW?`6l+YukZ;gnVf$QC*0Eo2QmwRT|1&bdgmK7e|D%wNp^SL>TFOV}4GQ*| z11A67QOz=GOQ2HhZ3WJjArOpz(!)&I0r_Ip{T0#IrJvk+!=x;1YYv3eZKnK*<0U()_vz{A;w691O$acSX0!=+xuS_z4U29I5xhX z&6nIIj7_dG)gR24NcwH^D|yK@Hcl+LKtIVy3B_#X17hy{wFS&Bdc6&!cjBUdS38-+ zEFFI)ku*;cIH(^Du$5F*5r4kDL;UIKE}CN!lnup5v7%-4{MFBGu-r7L$_<}Y(>skk;b;ItK8G~YvS zk|~j5F8lcB76IUQkJHZ&$f$(v9fN8@+(k(Pw2zo%$S7!^+;GNGYVDU&od>e741!!KK-1$bQOfST{P{|Va+O;(nm_Z z2hq}tz&BH1|FrG>ix8kUtLU4geOL2-xq1|1o#WY>r_@lZ4&1<7|Vte)eK98l8!_Z(o7IcmAF=OPIxKm(8b}% zEhbpu@k82Ygt?|E>L??Rqw0f$gX)u_6+u0uFnEe`DE~e6*%0jB)2E5NtufQ~6+t8V zXPa2g!jhov_}!M07icN>Py2SpfJn9bGYhof)o&J{6vW5tAy#fKfVRvv!oUGneT6;B zXj8uW^gDVHMl(xe_T3o~V@h~xK%t!vbiiDU0Y^5Y#LrxTN!hEWwWvIcT=BYy7fJfQ ztw^oV){4O+Ts5w>prF-T@tb`?D~|+rv*zm~_Mf1QiE~Jp*D5*vrm5cW>{-({hfbri zJfgF3Vu;~R@!BjkSK#Uu)1h+r5Lp{6rucem0mqz>>;?0dcL8~63N^H84bX<7ZB9QV4HiTu?P zL86!;QTSzALDKY#Lr6JNRM_4;6s4XnelP|US%=yTrrZkIPo4A^diIAWp{I6X3-)tQ zPh&*&wo}issHmV3)T)tPr6I5T+KTh)JqcmT0?f_#^#W>>{I+|}V^4l7jQ;l3pY(9} zq4%(2BnViM8VeDR1k`8>qc;p2tDbZ!MQh&6!d)dzB7tucPtt}FM;ONqK46j&W{ND% zj_0OqmkeWl;*(6hS|a*&JqXNgpTm|Sl&_43n~|Vv6>l;#!B6F{fM=W+kb&vTgIPUo zn+LjB5ma8#oKJEJdrA^9SKCmzDORnc#tJw@yVfy$ry>;28(Xn=OAd(@6u@!Om_TbA>ceYRCbvJHQsZ=5gR)wE-eerdB zMP}qikds;}y4FN)mtfX@l}zky_TXF%FY#rRPJ^X1XOHa#yMTSp)onTDxLoPy60o@9 zoAT5*FT%(KG^0&4NXC^4_QX)*N%lKlVI7cJI?=WI`8Og=9~jX;JHr=BPM~!V!!R$f zgqI={m{ZkDm6!rW%5@^;D0i>3!cD63S`~?~Eij>sI!b)lLJ$Edw=l`Yy1v@fp+9I5 zyqY-ki|g!Hk-HZ1fI0~#brRdNY_W5SC-u7eN0<0!4pjaCgPNwoI7{nlSlwH@qi;j_ zGiB&F*>g0B5x$3h{^$g(^f@S*mNxwT`^1pIlZmwmHv6B0qmWI+0Hu7Gt8uB|#(VAYm4g9v+`z#+QaR8^j-D_{Jn(8DKX2l*5g7ur2& z>efzFjLw+Tad)DSHTs_cf1QZ4-S->57*nv!Td$dW7*O7Zo0uVP-wV2|C|ZBN$J;lE z|4ZQ`cnUKdtZsKmdpCo`r$&`OoGtoA32Afqb^1SvYsNBH)8=sodg>%Tj+xLa$Up)( z6~ndP6j9++YHpWMkhhQ!!E|~%&0m@O>f-3=3~1vh6?e$>udyqmEDx*^H&uEyG_Wd0 z^|?4O_mBx02nUP2QrEfJ>PnK+>F$UkHGUbDP{1gA_H$iB$ngvrdH(9j{@Jeg8BWRb zwtuP#j5VcLdU$<)+CHq&{$&!mwXXft{l>i}g3;){4h8G2R5{c3H&4{vrR`Tm`ab@C zFZ^!$3QuW{gT>h-aR%dqfkNQ8>|u)wu=rud6RcwY`&Ha300XOQ>L=WFl=Fl*4H zU9BLNK*+b?sNfSrFGHmh#I?Bw<8)mwihjSL{zip}8>-59YC}WSWqns9KSPNsa)*`0 zs?6aQK3ahC1&nyP5fk#2eog5h+%yv76b_rT&8BDvTb={~_)rR@+#_U5j8dthI_ZWq zN|pp4Mv7V*Md1e&0mK!)cQCi{Y<#HzQwEs%xf9i3nDavDt$TZ+i&rAq+X&d?$4Pf85XB;aCO4sUSt6yg64qQgdF$CK zof4w&Y2^a*5y`}O4W+cDa#MK~KJB$cWE_--ocu|v@P~_2x^lg&V4;KN9yZ$X{;@Xb zt!@+7<~p`Fg{7YpmICf}Bf;ACKbeeeEtLSBAXvl=b+BgfHTI7?0$$4(@dE_ESI7_p zX05Qj#3)L9^FjW`AL&ToBr!jO6r)NaZ!hBhE~DQ zAUrZoEojc%D6)O3HgIF`5-kx+&+#7vO%WPs+<_0Kg#vAy1aF0~v@lwKY*0^wb`y+~ zgKd&E3oO`!3@3hazHq4XPi6F681%gvn%f z+%RtEBH5w0wBB$(&^pzR@*j>n%YV7ccrI5U6VhM8((9&?i<9b@m`ku*t8p+DVLja< z&z}9g^|3Shbk*cPFKbOGX+l?t1Op_58s8AZ=IsZcIq(E(Cd{e-T;-$AC%R8QL9NCU z3tJs8dKDfyi)et7t|FUcj0jH=`gguvE&n`mEone^QUa=yjTKYE^X6jZwH`ha_c0zt z(weVHb!9;Xw6Gt<{z%wf4d%s|fKBu0>Ew28UMbYqFvjJuQDb((YJ)m#)?fPRzm~D6 zh}O&aV{`4(UyUN9JuKB!xW0i$Gi8b=?^yI^Ta#cBUws={hS_5moyfFUY-UO_mg95n zSHHzewS12?!RFwmEHn^cxvuvY)5n$4u2{l+iqkn!X&a7sYZZK#!|TtN?7dp8(~u&Y z6N;{=9O%!koT~mif?)uL_u|EEldqNTiUAV%Uroun^cv6wP@SldqIl~)Zs)i17CGDq zY+W|D_iXJ+C{7s2sl5?T0k$5fIAIk$<3+oLvojBpE5Q7gMoC#d&d!pGN&JP~v*55v zzeN9HBMmjDiv}$?4KtGAYqPO!IM<%`CL$L_>~s|@3N6KqzKsn6wyylJ0s+GqEUA`E z3>C@C5FP@9kHt{8541?;pDQC(iLhVlYN`Tm#=?xHn?hj&v4&URM50?lbNBJG_fhI3 zarJ{Q^3C6QCzBZj!6@siYA?djo;mS|&M^Q#-`2Vn69P;O2=kA54sOANGLRup_EQ{AyVw-o}P`0CnS2Wq>s zu$#BWFFg$U>Ubyb^Fl*Pe{T4KG=9m)!;F@Rrm%(`Zu~W6s_cXq6QgNMiO+Lu!I3Uj zaWICvw$9v&m3^sHnvn|!>*D)f-Q1kGa(%ZvP4uN+tT}l&jOJNszWnTEvu*u_f*h!W zgIaycPhAYHC_3)@M9km>cOY~U&EvpXl*E@RI9cg{4@iHYj#y&O<7AV*_6X1mtJWeZ zjnPF*(+qE=Bm_6U+lts14&R#b=9ra{qx z(h)mJWAD{kQ7u(_wzjHG6|I*3p7-bb`^$?zyq@QN&VBCdT<1R5Rb2()JrJaw#0`Dk zN3X1%%m3}!uktx6QQ-cBvTa}gbsNP$&bT2S?6#J+*lo7=GAtaP3&K8uW{_u0=$H}Q z6AQx{cbXt>j+dNQpa^TXOphB=#s+Eh^m*`~BUstTF?sF}vI7F<-rpx8kzLsxcvPj| z5}jaSaJREF&ZMLhj#JVzqO<2BdTezHT$OvP%A_c2iv+zOzt!6Jxfa7laJ0Iruk=2< z@lNzK*^yoQk7TiO-=WQ#~m(g!y@bx`c|4t4%fyj!)IRkjh>DAGkDMT zt~%DOJ2D!uhq}|*SB-37wY9K+RY(T>_-9p}CHS!B^JhlQ(4|E>RcbXD2=u9Z`Hq^tl= zvz)!EMY{c0aMM{-=@m}2J4#QFkqGhV5z2*s=OHIszPDykCdK9~or2@hhg{9AXUG*g zrT252`?+{ie=*t1v2G@Qd~j=I^xw-9oBuvgHuaB5`1V|_=0o618zMXPdv&$6B&hRL zu<|qGU1=^>UPb@SdQ#!E)>_qF6L_fC&o&_lAGH45cvH_t2`nDfV7C?rk4 zw7&6O*o@#t1>WV02pR#yPLsFK)J)Eny0__YPnc8m!)$#+jS26+@VntAl+g?C&~_ z#fS!RH05}86tX+vT4@$_tn*xc=Eow~Wx9c3{SKH^H#mPfV^SGg;@c0p3`cxRF1GsK z+pWK(VtbJEzx-=MSeR-o(7DxBt3=h-Yg&@4gd~&$Sh3;C)a5(Rp9D}es{OUFtqfSg zrv7vIV*-9I`)d&ivZ@E<($<3U25U1j6>RVO9dK~2#JKTwP%*6ataYE(8)le|pIw63 zMU@T?GZeIPQMJ}BpJG)S>c}2hphfCDEmvFa+Of7){Il__a?z#vJ}9tLl%i);O_bpC+O3=- zTLLj=b34)SpPLgzh%lJ0)|~79^jis~J?77$O=rtDw1XZ?r0kt_M`~G}c=wlIw3>H_ zt&=chI2ai{ojS33b^2i?wEPz%<}=O$H=8su?PS~M zLq(xhaeL;V(4?LuN!XIqlm<6~W5GJWyTA`UBvtLrJsS6UQTd(OV_`dpel#$cje2Eh zhlJZfb9;rt5tyg%5WicVxbh(~7J*eX~LGlExVEXpu)*)a?_bG`w3SdoJLr{_bC)e0L)f9Ue_uPJ39O)vd}5!Nhc@ zEp+B@)e))eO~kbY@#ltT5bI~k&pZTvqeVVgeD_#m|Cnun{d6V`2%o_2BP;zsi$G7y zaeKOEK%P11AL5ifreqx`fkIYub}T+3;Co77LuQQVnCJ8uLPCk$eTV!VZ!!_R#cbu( zEA))<@fC)Oj$2-KR6i4h22U!`Z7UP=SY#FFIDWI6I(#Ww5GG55F+u`*88bu!j*Ks! zQcGu>UC@hcK|JTLL21kYGi;8Y2rk6}TDC#K!W4vgU6{PWsbVIm;+ z^+QDSqc=C?%Z2p-MXV{Mw+O{dY4_THZ(5$-$`x1Z5no_>a;sK2>(>V-+qQqCzlk{8 ztx5wF^5*yYK)d|LdZ|aoP1!?nS|uLi(s}UU(x-A{u}n2HJE&_hjaj77Z=Lg7SNZup z1IUdmmS?h=Fa9bcdEHz>76Kg15p4$#n_A0}tIf0HfaDKdl!iH^&LyqraX^Y4#@k(mrp>+XT+LjlW%f zy;ZVjf*|hVl12+n;IFO0Q}@Aam%TD|7Hj;X$3)4(_e-narYZpxDDD${>$-w_I`ObQOYJkIML$g z=RxJ@OLcPlA=eg@;Sh!#G;K{{qDYt+(GG4kU~7x)!TWe7w4GV^7&i7PaQ!r6@tzv6 zx2mRJSMy)^IqwNS?E>th&Of<)lk_n{=S&7Fj}RKS_jUAdzSs7FVzLi4oWk@qdNyR_ zM{9QCKgPor-#t*#iyM=SIS74g2{hj^EP?q>C>V<=a#?%ckgW3;xvBC-i@(XxCA2-kkX?; z+Y)G$i4sqVkOSpFkQs0f*-?=3eu0+K*BIySetg@_j5mGXv=)-JmCBloL#6pZ*}lIQ zt?}0ak+5svAEzd{o~Z7Ts@&su|zGDSgsQ8<(H?TtH80 zGzWYeOuomnCp0Ratri9)ciS}sO0vc-s@1z_navp%wAl6KdhLRRUMxJ?c{=6MxW2PV z>&Ab(2Tz`ED9$R=P!5t5Z%%;ko;NpDluUW-JE2pACy*AiMyv7g&C%*^TZiwUn7kB9 zKtctIEC=l<6(ATf$GzY5HE2l>+v^#VvD^pi^}Q|+&UI|g|6hpJ+{!(x1|-PqfdfL`R@)qZP?oMfP?+srfA`KXPIRxWERNCBFH^AJE zosvlfD;i3*pT}1aJah}^LNHGcRi&rBk59rpi?gWIBU@_VK&@KH2zq)x;REQ2rRn!n zVKPL%PR@~a8x%vWlxP#e(zEek(3vUdsRHgoDw`ABkZG(aBMqE{;C~Qn zBfKwQ;)@M0@jKf`r)7?)Hm#9^D5p+Xn2tc%_t4`RawsKo+6O6_MjMX}d=bGHv*&T3 zaF2U+5(kV#>O6TcGvYMU$Fj{TQul-V${KD~2(V{%;*;8Tx zM|oQIBdl9^h4Lo|S56A}yelLE&zRDIk_WeJiFp1W z>EI6*h_}S)w1kGbXSDgsh{u~#B?7K6F@{6k058Oyxqr){P2h0HdT`)Oxu~+LKg!m@ zd?_^Xjlx;JnTtRP8B-funv%7lkhY)@lu(po)%T*ScRT@ z4?crdxX2&!Y%>UAu0(_|2UQJESThV7nJ;2dagO}zC0SMIfIU*g5;cRujDYT;BG{s*Cp4c)bOGH8Myucxm>+ke-eethM$wtGn6v1jGG-1V;{ zM5oadMN`1Gi*@_yy8rSypgcS z$Wr753{jlcm}!z{bVZYnXEx|AOw8oze6TLYr$vppxKUYA^b(#geZ;RT+4Tpn4y@rhp)&ppx07q);RzJrEn z8Yj{?j*^fY>hVN}dYs^{^RgS2`|TI>0+?CbqQC8Y0=5)?mW7)8jExBXn_aHonjL$` z?43j?0K&cc>iz$`F3$!#b=n`G?+Rdih(UuDn3(aC?}c2QZ$+yP$DxS%R-OTdDd{H* z(`fN8ql#V|qt!mVc72^qfl@IL%spFv?L4^kg@?eq3sky_$!In>_e4o}-Mz7L;Y;uq zHJwYMTp#E26XRZB?2+szIg3opIccNSk>ko-PcNlBmjmIK*+2A_vaeRzRIMK;-1@lff*C|U$>_(KsUcpN8(ZXJEPSWa$cCXj)P;rwC0GBtop78N-EmDDBzpl-ax`B~1LOK7|mHd*`?+tJ{#^u~YrM)VJuu?7!uI?}M8_ z@s_j1@_Y6pZ?4703YY<)o_W@SUaABg!9w9#rsFv19AlCA6&Q}lQoudsa~;O%?xS1%+2pv!v5D7xyn(u~Ul=|GfVBKL|WOKTeenV^1fK8mx` zT;56eTukSQ|4ps0*1$LKiZA#Cxp!aVaJF?L>(j0p9&a9I%LBnzmX*dFe1bu);NZ@U zsF}jP@T3f*?=l6zjVr0ItDootKFK$R>Rs~O7Q$&*475J3-!TaJlj7^y5$%q0$KV-tglUcKMci%hFt3RSXj+ zlh95+%xl7%r-SuT=;nbGiX+V{qX_?lr2~%Zu#D^};F4+|qE-5Lj~hV_T)_h}_xRl8jTyR6ZULm*ht-#t636wgK7SX2iGkj)*pXcOLWx>IW)oHeso_3WqWx)QFs*)m|* zL8d~DWbi_}00!3%S$4BU>ScdBr_J!;7(g{Z1K|067J{>Q)QI>vbIy@JPAd0Y;%qy8!nd>0y+{T2mw%0@1GbJN&S)B|Sf zIQ(g(50+G{bZvHVXP55U=)8-N->TvvdG$dN#MeDlF2_$p4DF#3Tp$-*@CF?-Qz+TS zhwV-ULTp&{S6s(P4=cIM^yrSw>sh>iap?iSx(!-{)vZQU0%83;nBeE|;Emqefxk*_ zEk$`eX?e$osb0GBm&=yV?eXHLYD1g}B#CdHUKG$= z<>@epQ!W)hKs0Sg;xaJvjEogLv z*4M0)yMos52fI6GWm%Xny|`%Q>^$>yi6`v7uKImi49ovj&7df2lTJEdHC^`M*%3_| zT>AMIlkTI>3H&k8cD#UKrXIjc@nN&;n?{G&nGqg+nf;omrT4O!F8jzQCH$QNuF3-m zIz5hDH)x`p3gptp&O(JlCu{)Mp@@yoBSMtu0<{9B; zMEcHyA7E21`)0zwYaJ`cLRhy4g(xQMucz%c zq4HSIjI2@IfNb1|7kDJ|m}V&k#&*+`cA7jwRvo_M|@ajERa!BiO1kbyys*NVr(m zrmALLL3eZip3{w~ezC4oKhw2Wu>fD0U7v?>=SW5gUZw|s7%-+SFPGQeYS`axg;-;4`;y8v!#1L!$eAuhI2ojCl7o%Y`QKqFcv59AC#GB z@m_^xZ*bwkOuKTe&F>7YA znQa0CrlRlQhQmWPDIZgdF@I88!eYOi1GNsZyvk&?>ZD zGuj7QNs~vARXrcT9i5<3?DRzMCA!9c;#@FWgwaX=*(@fuZR9>)y;NsuaOD^j9XdDJ z)(2IFyD(I=w)KH;VR-wZ8}&(GY%IfCnNQ|koquG{^z$5K0JB#yD%E4AP9M;BN2au} zJAr8qbdN+b2rVY-5^uf|qSoF1h@(x|mOr9F9PV&~ln$8DQCyXg)zu($y|}`L4C(uw z3b0TjO~0huj~@>0FQFE!1O98tErec91pY{&O51E>?qB5xkFRz-*Eyrw#Wuu{JQT71 zjf33#Bxt|uzRT*tRK!rL_R4V0vuZxwLB=VvPmN1-MZ2S9rGXvPKw~%Z>5aeco2w*` z-&=mK#+;P68w*^jAXSMkRrPs`J!i_(yz1R2vd|rXT_23X)L@J39#h?}a)*Yhl;s^H zYTy3%Z}VkZRv~db@!2o{@Pu5t&Uey#a&?urejXuc@OX{%tn^qp7Nrx-5! zoqO_On)o7RR#1IJwEo~gC$jl-K-tAcZ_m`mBPaPZD^h`P>p}v3pcRi%LycXd`AJ3I z*PvUMW1kl}`HeIp1oyFW-^zDsMm)Z9j=$lI5%2f-_9tO%)<3^?^Ddf}LeSM!f|;ue z$wdQ--TPBCrstxO!twXcgca+4CP5Na<#w151wXG(&TK8}qAWyv+fQDQ!ks?pHDr6| zyY|RQXn$&bkKKBtioWlK3kgyVd*GI^IU<3Q`&3{GtPEGTGI6UuBgJn2dp-;EaccN> zvB=L339f~dOH%zXA4LKEwlC4)73W{oreMtiC}EG-p^eS~EpV>>SIZ+<-V zEsF?jl@bWDn5=WZdGj!gy4f!#^RuPIS3t2<6N$KiZC1K`lew#`C9v_O?}_Av?e3(a zZd}!?VXr?x-^43%70`5u0~hTetAQC@TBx+}Gd)35qUGAWqZ1xh#@a%M>+H#q%L>VF zTT2;ar^nJ1O3_Lx?1PtVfNu-|vHf8kI_sQgH;TFz)o#^gkA@pi9NJ-#PFZ{iEY^`{ z_RKX0!-7UuS4YQ)jC4`~^^4r)x4t@KPP74ef1I43z{zAX+yRX_DGXT`V|GK5YUR|g zwa9==Z)#b-L1YP`Wi_bbY=b{b-VqtO^l)Wfi^ zT_t2VPjIJ55-sA3Xg-ek;Hkd21UdLqBMsTK(x8Y|qA<7Bwp?@f5hrVcp?gl{cFT`&VB}>Oox@Lwglqo6f=wE>=OKy*QWCe30+0Ca>q9* z^XP?)=xgeC71mUKbNQv0UKAqI$@RL9u=I-2V(EMGeH{r*Wg1^S4U0(UcH3y2tQXN8 zCVk>1`1FfeZenS_H7P{1|8{VA%NCjZVBE<)mCeUJ8ra;pnWdk<%?TwF>gf@K3>4JY zw@*84W}mElRh6Mkwmu;2&;1GVc}l!hGl-|dPLB0jL!WHvV7DFaV7osa`64TS-qn{c z(en2D>d7xqHuEPMk%p6`ROVgbZUx@F7kw-W*DOAY*rL(*D0*m^gW}!L7ynAU^(}m) zV&}R?LdjXu+bi_U{L1FMNdS_phyNjVVkU?8heSUeu5-V@3y#CmklVjaA5LDcdKqLL z$8vJryp<_4yo`N2IPRH^XIUKaQ-Nnj3^o44y{= za`CGim}?t~O`(#7;`3qFMz&|jwF%2{2hnf#JQI@AI~!N`Tw(b~VlvAvsrZs-Wk)^EYrfII6GnJC;N%luwo2;cN+LA9 z^xpaXP<8>7KCbMXJw4v|7kFvP@S9ZB@GSykz>CdtmJ?$o`0)VuBRL$C%_}&AF+kyw zZ~n-*Hcf#2)pL^|-j&qT`Tc4X3p%;t=E{jM><0Y)ru#1}SoR$=*2k%@6%2=y z5@*_Ejd@V2wA}7*BYO8&m9xHXS{(Du9(^mP99{l&^Q8$q0h=iM)?Tf+dZTv75=+`~MCC+VQVtx>DbHPsM?M zjR_@(&d=1x@X&}gg>41fvXS)Vy=FrP+@U+?rSL){bW=^werSIdsDzX^-QIoQ_>>CM zN;ry9XMD7KJz=;Sa-jt0h+Q`C%K~d@*T&f@k6$97iCfuq;RN2%#1{~%F6-hQyhpsn0N{=j9z4@W3! z`BBz5W;*$!vX){>l86?b95^}d;X`azZR97ibhk3hS&us!?p@iA#|SI3A-vPUEXY?R zCPS~VsCf|Sb7n;G`1xF=gdtE~c;qdA>yzW>pAT+6copG_<&H9V+goq?b1gkmPdkDj zv@S2=o}e0lOF7z!k+dU651>2vElr)RQuM^nzvN&jZA=~&usSWVdH;V&;b5uBBR5%k z_K@GXq-M7Dx?B_wGvyfRmGxKs>XTVsm5pQ3qYEpr;oI*of!E|BQ{ZmWCU!!I3`7*L zt#M6A%$NyRC9wxdnSRNcv$=kmKK2Fe`_AvFZ%=hAV?#N*Z|`*g`Y+eqed~SGuPU3L zS89<|Z%@DBn`|O!5ztS`TQD)Br_As8p<_>5LF6PtNpW&!?1Yi&y;9S-epv0-he_=_ zs}&|?+Kv9ZWJS;a3a4NCKtvx^c~2At{gHGD!?M|OXuu&GCR^lZaa*rAo~|g{WvSR9 zj~-E1T7qeq4NGqYxLi{Cf^|F-x_GVDKWClB0CadgUy zsjS@-xeuP{Gyem*b9h9Fo72S!qs()ysydl(9kB09yS=4P(-t9%PGkStAEedRCyR}D zn6^L=8Ja_F=78)o*ia&;S|{vdyI9=aqRe4IlTq(HCWM-bd*@eDjI_&%dZT0&?O{8? zcZ}(cpJC!n?(Et-XX)Xl@~j>7nCW5x+Zeck!uwF&9_S z2-K8-ap#Ps%2Sl)#N_k77t(MUaXFi&Uz*64rX<(<7(cbP1Wszg0_ZJ(6umuGM6ho1 zxt};CA!6)Z8z%)uj||)WYF{*^Z{&YZLdU`jol20R`ot z4)D0TF(=C%JrIy?=k&^vy*tsm$4H*XDQOqr8M2~saWUn-&1$7Ee_STQD@8;E@%QBO z(YDRmw_9z01!Odo4%5!z0-@ywBWwHF#rTZsmxcJ+T7L~;m>@RZOi>^$r#=I`xe!T* z__p;%WdffGCXBgs#7~Qo+EZg$CF$nx=zYT|m(w1Vm#)5_zWxf6fnF={S=_j4?J!wY zrF!>UqB=3wol1C>PCnOsS+41HZJFnC$T+!w-J~oxyc$BUT4tIjo5z}p6a9Sq&%}=v2 zqD5Vzn^Y{_*o!`egt0$6J{=esDGHHWe7Hg?3y9X^Zsh2|VCqn!ttdY9U6 zJ)lMW;4qnFJ1g!SEoC}Lov`Th2&0j=OmQ{yfTnT20!^v@6*LqWfYsob`b?k`7lPiT z`|msQ)iKJ2ct2IPb>{<7=kcbX%T)l*D?6)#N}msN+8n@k<=s&L|No8SE&x6`@fly98QrXn3G^&&W3GMdTfT3j96;17=@w*j^`x$tGIV3)DF zqI+jv{wZ@A_lM0#hovRHYkTjRxT56;d+R$q^Fo-n$7LfC8qPT$-mm=fy11+q^+UJ2X zqSiMo2s5&rX~}~cO@3KFehj_%a%S$cr()?a`z?a0X7r>kam$2jZRrQc>m_dUavMj< zw%B$L^6i<|D@8PR8J0rEv=lyDCAAV5fnHY#V+8O)y1u|r$eM(&tEMzB4xLZ1B-_N5 z{JGIz#<>rEmYv%)z5WQ}RcYWR+S;fncTXms*>!d6@VkVXl%EDR)v57iQPqT}Ngx*y zGIL_qe_zfEeTl5s&lR6c`gv<9LU?Lw5t`3EQragXm7n*S!xJxrWwHjCc1>(YOhc3H z(wWz$?ao~t=^7p=)xJxi!9?1&*eo7iuetEMR*mB>%O`$BBK3M`Tqw~Cid`l_o)L%- zPofjS>jw|xwX_vAUSZj6hz9qhvHmkHAuRQ$PPQ1#!Ol&np2s6$-mR7L_YrE(SDrg3 z{thx-4ahxKfoK-P^mEUc5>5Z1T>B{F{c)mffgXGvFI_y85 ztW?ot2a||~pYn)63u^EcALiI9pZYBVU!0<>z%&;|NNY3UuCgUfRz83he`QDggQFEM zJmyt`i0vW8DdUw>D`yaV7_op!8Eo>48Uq@=-29Akd5`{N2=UkDqb8nCd?OQgD_>~P zOF4Jsjvho*#%PijamUOBDf=*Gd4~trF>a7fPlRFzn zMfj&Z073ilxtRbusjzrH`?a4;KHKoiNw}05TbBFeo5B-84D`A;} ztfob@ZdSN!YHi6v7@iZVi(?gS^?&W9ky_if&XT6`!T}a4^(e zxH>dicJ;xohjur8ZS417P*r8{0NU%D8kg#O_AukdDL;QAH>trR(iEt?J<<&evuYO8 zfxq5zE`e2fLP6~Dh)I%&St=|cU1HIdoe`4L7goEY$a7Es7IYh&QLz{{cl^gmB-*}N}BHZ+DAKR3qTJVSJ%(h%E zk5e8#<+XCwcSjw>{fYQuuk+(frw%nkg2Gf~Ug%aYXE6a@-PcgR6F8abYU!4o8Q`-T z5ayPkf%WCR>~eHqjXMtAD!KjIYDjx1BGPjg+rEBv!FP=_nTa(yWxA}itEsvd`~3tp z0(HEW^Dh-RW{SH3&e;vCS;En&z>R)8YL2+3QRzcD%wS+72My~TrWFhQIA{^0$yKP4i#D=s$~wD7&mvZcO%Kf+G@zIY$DAar@QJKp2SqOaxM6H{APR@ZWgMU_;%Xgnf}aFxkLL4)}z3!(aZO-`&T^dDRI?@bUrZr!mWzGtO-Y*4DmlsSPWS zvK(vYRQ)SQR~hSt5}jF)zOst?=iddhwVvQ1z%qE3XROh-RsZ4e_aOu&x>4dXl=+8n-r?ipd>5{978&>E`Mdi6>nVb%mzm?u+B!1p>S4M(u| z_fq$m$h&C8Z$uBvyr0zpJqR3G|Ozhl2mp9wN?f-bNGF0-2Wqo!?!O+0wQZnfngMP7&b zeNBSaG^D-YeIWdn%eCZulL-sE8%5j#_-xVlqlxfxhF(ZFtW(8wef1XX|01Db<{QLZ zMd~Ac&Jj}q1k;{zKNGGfK5${@`I-;ttfnWeVZ!KqKLtKrU9s5d*?&Wxm}KyU%c3Mw zft8%x3gpLgIX(#sKv8q-pbFlHj={R$HB|G&)k;NqRoy0u_p<4(2jAUX7p}PCmY)h& z1SIJ#+erq}=okjde#d_GP>$r*qYuzRm=6n1=`^X*K$FsI58b@NRR06K!Dm}p9U}b1 z{0af~nKPNyoEg3HJTbu`zc}dRi^_{LbT|f8nV6fBdH?uKU1p15tvu{}@eix$O#dQU z{r-QLdz>8}(s&^#3K@Hg6RbyyPaC`q6MQ~P+RvAFGl-R6NhT^ki+}H#Jr%4b&{p#* z?>hUkvmSs@9{!xM7zRtODD%1GjdD{Y5rXBM4mhG=6U9bbuPP~36d<9Lb*vo5)yx>|( zGy>Y5@;lOC==UAnJd6QoNoH^Q0PaLZ>W|zPQHiU?u#i{p(2m${>7v2pJZ_T2KbjNg z|3&Zh;DnPGd_>s~1-~C04n#BsI8PNwTzeKBjcnQEzh3g=bmz8}(U0aYtaZIrFFl>U zUgzZRmU+2fm@UxKB1vf!65%s7N(qlWduOdTd_=XLkh5S$d^f5MoSk~2`u8ER& zgO16FaS5uRS_Hem+l4RJ63@#m|_^xnr``mbK!-stQ zCg|T@H^)QyZV!F!LiX7Y3m+I@JX>K4ZG3zeZM)+%g>T1KR#wjAdpJj`??4IjXG-)T zG0Cr-|EzqThVY;m3b&weEuoqdlS^qPK-^T6J*TXPIz@Li25&IKTof&I}Q!&e@(8FLb)Z_QLWdJPGpqHm3tv7ocG|EN{C#C4WE=PLbpq$ zAiZbfvjed}fb6!_Z$j2~7CLD+lBuIOe_2eBYbK6;@m`r_9zABqaq#dQ9&GWKM`mlG zw#u#lZQOObG>{Mb8<;B~g2OaeQ)d;^EP%UfNz59b=1~cX$@$5C9jt~xmk^oh)1iq3 z6bl+Td=NF!K6ys+dal7EFY_{I#~yl<+qfrl=_ko!mKQSQDoN+=dr8h7xht<;o)b4? zb0k}FuEmePRf*)9@QJH$|L*N(B*o`heYUIWLPGqA{M%}&Tb)D!^`rUo`vFnuJmV;8 z(^>b6ZxCRE=zf$^X~}E(xcAe!;td~#e@UuhZ1|zdOXbKJV(gj2TSpExvhgrGjq|T( zFF9r!Hz~)*F#{TAgxz`@fq0{e{suuuq>5tK!+T_(yNH-}e(k{xC!s9Hd+WzpaLUYF zW@ncab~Esa-UsM;_ovGLT&E98^Lk)JhsOpv zaVW8ks8J*Wq7X`FrP~hz43;L}q@`8X|0VCcgNgbtR!B%PVrt7HVZ0 zkBcjY0a&S0mRGH}?8v5l5BGny;~n=VN2HtTvB4SJ-M5ZvG38tK$nyE*R0{*(!{;@l zg>6Hbx=l^8=??+iTktl<n(ZbeV3_75&Sk^N5$pYFi)A$ z3m@yUp@@%T%xG#Mz6kB!q`y49BzymkEty85s3!Fd36eZGmwI6WOO_ROPq2d)q$#KS zTp|RXK?vB^n$JXzJx5n$FHf^!GKxN+62h0)#LM2`Uxz!FfxrCtgVy)P9(=s%Vp|!@ z>QI`6>HY9*ilvt|+_@=2)1KOXoO1I2KMA_(D-ohQ_wV$jX{WE^_N8~a)S64x8vmeE$V>9$1wdIOHO+&X zUn0Kra6$*;gDuj*u&CbpE?H5GH@xMnRj|4oWGSEbe1V6e@k{WSzc*g&^; zRgvh9?Q&ia zpBz_s?a5M3+5zHAR6^r8=NpYXX#FSG>GmCpvxFyws~QY}R0fu!TlX8Y;6hFHy0m1m zuj47m1OJT0!YYV*p7A0-dV#mPYvwcvJ@ie=O8$)-jpF2JHFlfjI`~5e(~gcJM>{cD z;XK^5YxpJg`K>ol$c0*Up|W`i8_jUcXm5|bjQD1;6zb;LKn?23jR>Md!`NdR;3NEw z3QNU18$i$#XkKvlx^bnfrsL4)-qS(8uoApQQ^^01C?ls1Ko*fR`%W4=bjlzZFX&9x zSm)84u}w*NZL`zP+=vdj$4KV$IrYKqEoEiK%2hvLK?K(n&k8yG8H3q(&se+OxFWLd zEK}#-3=-Jq#n?$<4e&ZSjSgBa0}kWCZ(BIKnZsLS#jsf$>O4D(y;E%gP|?WhXEb!G z`Jni90FR_q=^fj5azhNwA3niIiiRQL4rLYZVH%S!k2$WC3W0%`^tt~Nex+QYvcFaKjc*uncW?V z4p}YE0yPfm0*Lc+j|u5?p;!yRi0dPU?50*FaB_fihraXnmd*+q!q0T!-)Fs65f?j* z2eOH=s|G;oh@Uwne$}7)*$6q!_y*2>EsoWHxEN+Uxj21=1fk~)+_moujr>{`nlASn z9YS!x@V5N##FuSo>&8EnLxqV2^CZ-yVHDjf4Hy$$GX0oU+f};ZFQ(X@4fgR_0DWx? z=ThX1>PNonJ*Dm@B?7h^+g)2SI9sFgw51f!mR$IDhHIZoNf}yS(v}1vyLpaVxR5KM zh~V|&{YP$0*Ne^a;vyc>3NjaN<#?=2mqe()FG=yCZn-0~n%PJ;!2KIn0$Gahv=6(Y;g+E^@ zAtxu-=wU)qJ2`#O-k|14A4V6*Nu=G$L!j?-%Dy=`loXzvH+Cf8Z|;Zkw`M)b`XIra zU&d0qL&x7hDAB{~CIWCHz6RR_BksXVzsv}=Yf>=2c`iRgkN~@72l* z@E%KNQwo5$&Uq%XZ3%FEn9Ml^2HtXKj)`_7UiT+@&%j&0zHglKKJn|87s9+tp_t(H z?v8f+;Y67`H2YQa@Qq3u#wHWMv?AoGAM!8Z;!`-WAZaN3f-TaH>~ug<9(El>-A#1>Nt~d6biS8oFZ(0gOSNY&si!+%$Ug=UJ z@9x-e2-?1Xb--sx>CDH=hXz>tc>?|Sf7RoZtX|WeNBRE~lE-{mxb4)yU-8Zm@Rj>w zI&BJ2&&3RTgj@Q{t3`bDvez?&$7zLbv7+5qrrG06fEU?+aPxNj@|fC?P0LGN5nSt8 zm5Wq)RkZCEE+4iRJ|s?v@_ylJZ$}oRee#j}dmn~q@Teqbs1#Oj#;MLhZZ8BeT~bSq zW7gP>EfjR8$35#!n56JiI6dNq8xn`ZJ+08-?Htk4$rU(kB;ZdR$?a1P@4n>2)OcOu zEC2yt4)Q$R+HW;-WrfMyW4NgX)Rxt%o6~g9q_QBI{cG+S&S#aF*JH0QEZKea=gD9l z!ZBl{j-P0ZEq)uJM`;f+~G_exQd9>Qac%RE+MG7!{@rck1kWk=AOfaXW62u_c75;{deR@vAS<@e zzVTK%MCkwCA((mwL4XY*#nkv7{pl!%ja}RyVvOq}dCg$^!?$hrdSBfaCwv26!X0|W#q#A-s*LR3@MZxVF+RYq-F%im;euX z`BF@P_^W*7f-(j?6Qo#C;r{u6OEmrY)V3?Ntn}TWeS&{s%fFsPi(J1h{PO5CE>;>V z7GVSMqY%V4l=f<)s+FO!j6XwQS$2@cQUy#AfY$G_LmocS+baK1H-eW!eJIA?hJ(H` z6eeb7=5h^}ScynNGt&)4p%WbRGet6}L+>f`9bI#ms4d-NbiQ5E(pr@RLwa0LF<$b* zM@Zbz9h*6XBN%3|^TFmk&Y3=&0FR{Qu%}~NAHAskq32c> z95;vRd70-pzCI>Dt{Ag5GbdHh9@yWx;^--VaSOs+jicGJ^ap5Qe&@6=U)$!##QvE2 z`7gc7W3-|#0lp2w=oVQ?x0(Rff(_=fT-K z8a6nPWhJL7BphwCz0N*11e(re!;SuIdN93KdECqW{f!T0hR2U&z^l!>XYEAlw2@C4 zD+cMF_-XDjkR;t0W3*BIzl>{8+1bN(*tq0E-u*ez)p;UPUzGJy&@N;VhG7Z3;mBqf z67an38a=pt<01|W0=Rhy#_~Fa@9=8d^w(8G*ygIgwDc>f*YKaDgv=@pw0NNEBdt^A z8Xsv7rkA7DA{ZJrM}8rx%o-f||1tH}VNJI0|M)-3%0@Q#uu-B?J-p-9FFrdH=ru?l^W|^}5dMb+#p9SdIIZ2_0B} zdL{7spIV6-EuQz5hIz838GrtqxM*XB4ggFl{HNNPtqK6JGDD1;i*u1C$u7SIJKKJG z(XPiqZw_3`W3QNu74%TE)|I8^-qOO#f_gOQ2me6HYE;Vq-y>2@R;cmpa^Ulxg}vEx z*{Dr0)6mXZ_in|l*?QXB^-lIv*DEye5z|`I#NsURcE2@EEemBYF~>0d>A?v2nr1-| zU23aji7%~nQ(|-+3}x>$FwrPv>UQC*;YkxRKI&VpFtS$f1NxKP7{T+=l;YiTtnL{4&)oB2|Mm!#So>h^3PkQJOUAJ}19`vjQQ?#&reAtr3x zP*Rcw9zUHryq^stxt+vn#14pr05OkRw@}~b)OmV!cGg|#S*jL@zdql08Z)pP5?i9@ ze+x3O>zo-}OolFNkEz9wk*8w~0aOp0Zehk1)%vJV9A2@um^=RnD@JF+H=&BF#@OS< zOYT0kLlsf**EUXeUamh&-@$+H19s?6xbVFHFn6Obexc@%j`>B&hXb;#V|I){+&d%@ zLuE_Xuq6F&No3>*s$g_z*=DR0QeJ*(3!EOmPE z_U&UyR9^5+`{bJvxfCpFUiBOk{c&&_ObkxL>=@}-3Q}5=Fq`iPkXY4KD>ykd89>7g zXM-QuNUodxdl@oSwVF*C(G&$B$)Y0J_@YgCPL;1y%Sr%|L_ z=GY|8cyf*TO$v&36tFRr7^D;TKt@h4h;Rg0tG-Ehe@rzes#4T*Hvlj(F=+#Q3y&`z z?8LxdgQ{>G2d!~yJ%@(Jw;(MnFV=G(rQB!1{Yj09^)@3RNkRZ2v{IiVdy5SVnM z-`$@JlfQI_xN~|spBTxHOwTt@{!K&Bk~b}H;y2F=JdA~}Wo$JU@oj2=nn{@40GZ}tQzB#<@EHgKsn1{`Dssmoyqien4XnOe#Wl)v9mjXc6+A4lnyU9AYJ>M{qlRr?px7xykDrLr9VNo{a;>k?!4q%*A34gIV z#Ux&m1~cURZy{j-GS?F6Nb{HAgEV_BNWZkbrwY{b_Cs0uaeboiC}!CUr3r0w#y87g zva%JFMyo$Y;vd8Cwo;$tPk-FCd7mSR$}&unkz+Q$go42JO56Qr?ZN1Bl^#@`TMGrt zwPkIruRh8ptiEyW$cH8`kS;#{p{wL9FB$?Z$Y+-UwAeqcC{z7aEI!e?=2?lOo--KB z{LqF@vrW0>5u0G209WJyFR8byJg8Rl^M3)PNm~*G^p?y`4@jaWRg@`o@EUAT|ji5RF~7%_6S!hAf`F>TjW0D~Tryj0rIT}T&0Fz=s0 zppeIC?Vi@Gmr`274$XwZf@+0Jo-C^;vh7FXSI>}0+F4n^*5m5Ux!|$az*sKM05t_M z=R{$us-6HiD!1>A$#5F&1j7yD&|pm7o$dHGmBxaHR8P~QuAB45)gVp0?T(CukH!C8 zgJ~#mX=zyjIG!HQe`2?&MVL#6G5PL&snNjpU%Bh|Ywwc=mabsX=IK`ps=Tknb7iI|8}_r@FcU|NvhXk67=gH zJUP;Wpxa~+{d7Ix z4YLG(H(Htq#)4Wiw%z?^Bhz>`h9Q(<;YSmB877o&Nrnkat1Z&Ft2KL@(Qs4@NJt5H zanZK1x)P?8dt+yTfY)LuU8#*T&0Up2?9n>qgUOeX)Uu8@_Us(?I66gTqr zZT#tU=?(OOO822;)wiI-l^Zvx#)>EI%8>D*ZcP-ASv+gMZud-M>2}P@h6a>%R?tHu zOqJ&&?Z-0_yy)l;4J;~uS3TiBrMv$jE~i4soX;5r~xV2T~cha;$!h6`5e`+l~hjd8Qn$h%XwJZfBdqHsYw#01fD=BgRgj zbg^wr&?BkO@LB~j5`0cEy!pz(VB3yJ+V58oFLPMt=EKpF6qX$6IKRG-!Ut1Ra^Ff* zNUuhTuH){cebU1(a39#zPt0V(cCl?4WB#t=Jyj@=NGAN?)UEoEM$LcKIe9vSMai+t zn5Ao>tW(L)OP9v8b?#)(`;+To~ULe*CYS8%kR8xz*FvE%L(G25pKU%WAi9HpS~ zk$d(bUsO+3ES$5;F5lGiJeLu)9eLe|Bep)wBTh|V`N=uP?N>`)s{PQEU-gKcrIq8nuT}!(n)=6nvpHV7sMNaOJ^+r?MKILQEjWE<(pM$xaGU})(RcF2YhJ_x7!v*ndl-S&PQm5Ja3#$?neY` zRrstrn-Dl+xtfKw@@i!_lnTMfdg?DVW}pRy8sgGR(N%`N3GLFWd{$Sjh1CetkatwE zx&%Es1Wj>{>?9mtd6KoX$k6<2!dfz_paDc$HWjY*8s49I^Mf@lPf(u{d89Eru~DoZ zZG^^CnGMM2QlVrrkDoXj{krN$YDMU0hBtz4ywJqo`dSo=+QoUb(oFsJsWFxswF4|@ zp{M@$NM7zaOn)j_Tj;IQ9S9_5smBZ3hP}`TJ=~1%{sB7YbasN+j}TGPR?Lq~f%a(w)&En<5p!PyeDpHDyEPYAK?)6i8H~L9DVGx)u85RS2WkB#BA#H z^D(uL1L!Nr$Ppd*@G>vsOMV)?D`Vo;lLGl`TMpsy{(h%=Y2azQo%`xky>yfu|2^^t z$RV`8n$;^^eCvQZ6^hAnVu~T<8ygpj-URw$anN?ytkEyuDav!}A0`!u=*KwDT)oFP z1qODi1NKV9*^~T=3Yc|JOOIrAOS40mm<7E<6~@|Z_#%$x#LIAJWzCP_AmoB+ybjkJ zW&+zOyJA5Fv>-pD7P%PTW=1V2B!FqBgoIWkYbY#wIIV`#-M}ll=cIJI;TPh2U!FCn zUl&sXpG?8`BHGo&xi0mJ07%dm#|j3#g7Qr+7dyyB7^;ee!`Wy)PqdPmw0CKHkKq#rw72k!EQ6k5YyG9+0AyY}OzQrsK}zPde}%8XZ44 zG^Vup2QeXYI#VM7)CC^msLkwJ4=Hq6Y9!bL_$U>^)y%4GEI$$*=g5fSP~Gdqc4&CHZ1KCq!06J04U>mgF^>21(?DIoHwo#?hYq-x z`WQ3hl`WRi^8uiyzm;hHT^V#`doiL`dZrPI5QxITf(CTqaAlFC+~%3z5-qzt#o+R@I7g zTTu6>`NY*6t*N>-*F=nxz)xD0g&tw@*iVp}Z`;L`hOD~#CMF@%LphpH$0Wvg=nB(9 zt=mZy_`~7Ivm&Rh@g>pMa9EQD;gPWiSSh|d9Tsqz#6fBuRBja6$Wfy*d9vS3Idezk z@oDeM16n`R;uSTpS;0}eAr`?}d5gzQPiuwhJ-sR(TRaa+^04gw&ok@BD6C04&<&fh zU^0^U?utxz+5$VYXIDKdE;5uv4EK$${wR%k0$ihXOqMYNKo>qV^MYS%2BPf`I1sGy z^xFHad)Q=zhJHSAw-0v?g`q4%+t)8{@G0XX6>WtINiS;^pfXvMVqsAO%fzbuF{J#8 zl)%SRUGBNOrD~z+8yGfZKa`2BgFa*H>8VDV*rqD7N5m*-_NNgcTy7~!F z{`!mWeH2p>JZKxVZqFrVZ&_4(jxO})^Ri&tsxP#&j#HinJZCIkgCTHx$?8bQ5WYgS zM!}#W*CAFSg-Z3rs6!<=>iPs0ML8~)d*Se?bX-|DKZ^$jKiIbXNrPn9o(MHaUjE1S z$VDHsH<=C#1{gH+V%cO#9<-Db_4B=VD?08Ayv%;>ij?)NG{6MljNjcs`AdzSTNE02 zU9YQtIj~o;CTI;BKyKnEmF# zTjL0gcDl^NM>d*rQb~<2{jmKqo8DH5wWMYxuaI-x*+@(NXMQ{Fgc^f7NJ8Ki`F!B>AC^y(q=uL{%Fh^FF+ZI3!E*|A$+jSy zm*pRj#elhl^XFSVswRX?V}fid1@I}G*>%6}zN=xIhWx2gUf^pDc{zp_W2kO|%HqTvla#hzV%EPEl7=w&cfo~$8n zlvI4bHnNL~2P5#0VMM-e>ke8--5`5B4vx->V;0Vh+ZxCYf%0k-ZmC@5McJwnyKZVi z`)*U-D6ni<)-~F5__MDV@c8sDMaY5GdAm0^_z2FNpYSoTw@0iKu6>5#Ev1glcWZ-I zUf)o-BHL9~q<*7?`OVje%dkGuD^GP+rZnUk6PfU$nm0e)Pr3Z7LBA76h95kY^V;gx z!uF*omzrv()E9jtLtKXi$08$(d#bJ~15EL1RD73XY2TWRj<%Ctyn}PB0?D7XvF+BUSITkV*yx87kte{p4g)pbL8NX%X6PIS=^ z1sv~oPTV0_0oXxe1RH5{-_6haIKN7n99(8p@f3+>|Mp(0RCxM3xRB_8%|5b64%B0kf%Prj{&t=S#RH z$BcZpjbXcNoTl$fTW)Oi7xSn`k9e4UCki-a^x3*-mv{3mcu@SY)Ys!4zQZ~UOQaDJ zw$(+_Uvk|Twe`FY<^Vpr!Qp#jzbL6ru7cT zpH~xVPQbD<;r)N)gh!$!{+tf9TwQDcg_!T1VhBR7R5l`j_I+bE%&54DRrsG>8xh>g zZ^u!g-i#;ae;G!tJV8z)OaV@wR-9BIO-s(Y@CRZmD3rSkKngT#$(KEh-*icZD^F0X zGvhhU()$efl3G2embD2#21&!bp@=^m8gK5Tk=OHqRY6}owz_!kGlN^zDg5+%t6m)l z;YAHP_bOnB(FB~l2eQ7%YvCq95cswHf)iUsAAo0TYBu(i-LbA zZ(5wdRM;9WLh4Uf+#Up$unY%n;`({A*;HS2Sk^S5*C4mS2$z=6zegoWM9@PDd*XhR zQvLwztsDr~UA;~BFpR)k)#|4AaEDOB0B!%IGT{E5(0V!hGP(wtKHcDC2fmF}k_x8v z@p@<@1y@FljWlpu#U+oO=Tup&#*cT{WA^QXLJy&dqi8t*M&kAP3O?<0L0h``i=|Wn zU2`P-`V}qyG+x%+{e0pa6QWCxbf;p`PI*hEPd(*3(qX3ZtTcrl=ile!9SF{~yr2!s z=q=)IDd-w_ljI3b27D7^pIuukePPOy>Rnf0p4O)Dgk{1c^J~t zmm=}ybt3Q#JHa^W+k}VzQ2@#ouAsufYdBAj-XpsTUzoW+eN#cDh*JAPJ zwwZhr{iOE|@THQ%Y7**9VEK`@#WTcH!|R+Rc~c*U9^pTcT{iR1hFQ>W5kjB{7Q-~t z^BWUsVC<6Q1091dm=d{)jix}NFlF#7qrjLdk2i-;EA?8^sb~9hS(>NV zLlc#;2sYN?AeIwAD>wxWK z0X@`0+^^H3BFddAt$1RXo{D&_+2*(NQ^jFv-VO(-)m*Y#cqm-7H+_^`vBOCDMzN$)wfS>ZNKLEx$}v z4Mr|JyF_|Bx{9N=*~nc)1!xS^!ghhAf7bDQL++*IBlQMj91GeZnIv~!3(C_{kEKuq zEm`l}i>7mNQyogQtUVJoX_xS@}+@Pd4W-$Gs$Al0^m}N1~YMI zvrmJsOM;T2NlV`5W_njTI)pe4mQ&!w##l2)2gcTmuA2IECDo>EGP3Be^kryWNUq95d&{riBSuUa?Re~yy(Y~WRMF@Gs8E(DXbW$$+7Vbl z{f()tQ$BHx{*|>Ui3PGBTVv^wk;1nrP{v*zcsm72o^qq1KH1PG-%(wW%C~<>QBTdk zS7j(xe1`uNdUy7+Na6X1&lZH$yCE& z0;F*W)h9(|QT)s;XSYv~#e;1lqVv<8{q>Ltoxftwy7(3|(pfHdLPaA;9S8#bz*>au zGp*iofBn+HeiB+@O3NZpmYmvwHSwa`7x5(XI;Bg#_L5}U66$*wd-syGYE79@#^z8| z3<^0k;YR26Zla&5fkA^kGfWPU?A)zpabG**8^6bJ3B?fzCYN1BgF}RmEfoSeC9k1{{$;bQ*<>?`FQfDr=(I5?FYh*f&i5Z|lIACkX zS^Rr-*bM}d8;8D!e1Nmi4;9?5DWfp78RG9DYcVFk@y5+PRSn3pS8{DIC4+2a`u&@P zBVz(%2hEHNEXSeLl;2?Qd9ThgDOm7(n0v3&2_j{biIW}4g{f(GwO?!-6%IDHuFdXo{fq-rceYfWw)QXt*-aSuH-}$4g^|xL5u<98zZ)l#>ppojZ&Pw0LQg#q78-%TB9y zdAz7$1}wt=#7l5^;UyPFKom*D$yB02hE>@>3V4YY$7j5b!l+%BaiFFOA2&zNNdTx9si`t8{#qY~@i1POyJ8 zg8oC^Rd%Fi|95!9bmd!X#+FHSJ6vA?siJ9>d$=Rf55hKUP91?cf4+%+>&fPse`e9E zsnp5fc)fA^i6lGzpf(MtmU9aDoXG&JfxsHqzffAY69b*H3Cts}E+dX!!@O~TQxq`WfxjJoG(ubK2*pV{R zq-1M94(OGEF7n%q9VV%;{nLSlI2X{w52=ts$7QlrVk#k!H_`HXwyuaJ(rZx$u-}tSYuEN%GRfmo!T;#Qg|6P@vi64deZo&jauKsZXTxFcYS?_^qw14Gq z{31@fShuuYfp#~xieiod-|B~9MVn>#EFEq*9so%hxG zblUpk!H{1A7=)+9*%_;I|94IOACo|lIXGjg+?`*1F3MaZ4n)l7i(K=v)=E8eLyBNqk?>v#?HV$DR6EQ}ooB{Z5bq zrg5~+yTll45rL8?QI9hvFAZER(c^ncy~;H{8EufG^gWkSq-)QQ_5q*I+Ajk3KG&CH z!JRCx4GwsC8&`3kM=Y;DwUrVz;WP6_Z`DnWe&K!$#G!FZ1gbJSKpg$E{NhZTA3J8J zt|Ia)(EHKpmlHxUg3?F1RL4hHQ+`_mCkK3HQ9q5IEoN&Qeaee$q88tl7uNbN_2ElH zRlnVPZC2g%vjnN980w#Y4Vop|FB`tvw;z)iUL)~`(=dRiW_4+cb>O&XKuSnduuzRh z{A_BU|Uq8JqPPU%zArefJ0rnfpjP@eb z59w|;Pgz6T2#l>=@yTz48Eamz8G)UER(=X~^_8@PgSpEK?^4r?pWbsN7BFQC^){N1TarG9;hMqoX1Q;5 z5`<{&ZrnD>J*_>@q7EA{yUWg=|H9q+%EZtSSCC(m3HHv`yi$wS>-8(*qz<+hMG$&c zj{o+CuJj=h@_ry-jBO&W!oiOa`Ab*&1$_1vvf^C9$jicrcMl8Ia%xFt;Y@79?HX-l z*|=qEyy$1Rq2EBqgPb=7>N`}lqNQf(a|i4FgPoM@u5Smn?hQyr&xbqul$CMYKm8!< z-hhyOYx0#vW$Cjhub4absBkc@Qe!<^ig2OcF#cy&SDekzvA^ncK6r0c;^-dP<;!hx zxhR~5clWu$blf2&HM!GtHJ0iFl`N>@{NKEXkh`iL-n)N5FygO0sEEmDd5hT2jbl~= z8_~NY>0iyYXae=tOO#s`CIr)h`AeRawb#d%<4(AjP0ILI>2kC`?kY7pxbbhW7kNU~ z-Q;}JE9gxjbUIR?lH^=OYB&n8yl{@vuH0M6{5_$<(@U%;%bvY_b#L)X=E8W-b-H|F z!So$=6jP11d^Bpa4Tl16kKpI#n%J@|^N$uGg2U5!raBTLzTQ%!tw%dDHxEv?hALxk z&&(woD`*gOO8p)`mN+S~x<&bbZ(O(kqI>Se+&eZj%*mCihTt@>OkXaD2?1Um}G z?fd(x=@krWM@9h3J8>m2bL7BBLVclo>`Rj$kcK(8h-K7BFI;=M?@fzF4*ypUwO9+NL z4*FtMB7Q@&w%8Eg%tjXq!;3%SjQWYZHtuMdVR(Pv%u~esB=(#`9Biw_=4Mx!`5&jV z^u?E|nio|w46p5vt~OtUng_pbHm6tTHr+kr-M|0mC_nn8b;obbJW7MQPd3@N!*?il z-l5df8i^shl0v3s6EN!LdC%A*o|V;r6kT~=pV7T8FrYHad2;CsSD)NF@d2xGx-+Yk zk!$Uhg|D^^zDHkPwMopy1a-?_Dq2S%MGespJ_wC}B|PlQ<(XviP<9qmdK1s|I~`Su zvOMK&Au4*X&8OQ74;IrK62-zv@LcB%9U?r>kK?c&erHrH_H6H)bkK{%IgVaz zl)m!FfOZW17O-o*kb?aFOd6vDfy{+g8Y1$oq3(sU2HDv7kQZ0b4wi5PFZbvHp30Kx z!CUQ5Yq4{VAAfk1lXa&({k_m-RfoR*$a+P>;E!I_JM*SzCxd>P(a(O~F1Y4=wFT0< zv|ds>1p7{tnBCfQZ&ysJB7*HtpC64DWY^jR+Jk^Vb`;9pC(TD-HLr8aU^Ub?PK2>u z`n|N65Jv22lk9R6I_a@um1*-f{b4{ddM!FOhH=7onZXs02S&!DgT2#L@6~(DoWOC_ z{?oM;IQ|EEi%INVfHG0UP2vUCH++TCo>0gF&u3TKjS~gZ%?+x0!sKTE`}=wYX<*@D zu_%WY9ZbDmn@m-P$=H>rh)>B_>IWG%qZmAZ?Q9xUPWcKpnV)+@B^*$GPrs;iv@_A= z{Re$eO5ZS@UiE>cJQIF;GA{Y$-1k?XLxa zKwt=E2I5r!;_rSp))uRM`8*PJEMha}-u#skrFPvW;K6!Y}5<;4w7uuXc+=CX6aWF>pbfa4C$sfS9=p}3p&@$sAv){P*)Nz&1#EWYA z9~Lc4S`sqMCJ%iS^=}m%25&+azM+l znGJ{+VH`RCeqWgApS^ivNvMn`eE~G}z4sB$vK|)CzV zcGi#J7FDiZ|0_p*649j*q6NlAIzxL@L5-+UN)zqvJGc+|NVNoX0zE}G#B}`D;p}`R zd-tOU%VajWlb01M=uY;K>Q&RSB3=l=_!dM|_eFFRnLh-Fi1+@UXFr((aA=hSNdtv9s2&v=e=WaNgi=(jAGZ=A zQjMi4S`fV8Ihe!H&V4t0jK3dR0juG}+aOKRkyWx6N;*(3a&QPV;-9_BwSqpXgi)2) z^QiRoiiEEC8t=dopX36oV+PY#X#2UagJZD82qd3D^{sV`aGeafI1X+5E(efwdAavd z+Or@+u3-0svX5*iK}YskiJ~s}<;iT8zmq=}D!LY#s)wDwjLTxNq4T|K=A;+-qEt7i z2#H@bsAk{ce^C3&%Wg*X<;(;+Yo-<}874wY>s3ld)ASNZ{?m2hLpug5GU7{fVuV06 zFx13Glh}W&IF2|FD*E1b(rlwRVyTb=|o|`-(8UYSE8k60^lCc&98(P1y1)D-rV!L z{c{fElxZc;tyi9hj&Z-pf9NQtPx?FOPqn@j<7V05@MZfp);b!^&CL}K^dl-QY4 zr^>V^M|#4S8EbjXgc+|EYh8Dop{JRn^H$!3@>vUB7wUR-V*4E4DH$ElD_k@g3hk*O zfVIrL{SH~5vgH?#9rXvKX^JLI zJ9#p)e2lTe@69(o8?etuVDKBYMn+Yn6JJpU*G}g`x);7?AH45xu#%rl6;CMFxMdCw z#QCpKh^`E5Le21oK9dYIoY9N>0;iecFlAQRtb2B;a%yO@u3I=^Hc+4Fa;UZZqaWL1 zQ&w~Z8j}pm!be#}4ANB@@WHd+c*0ZTDc`@}PZknI72W!**VcYgN7L;wq<&+A?yjm zM%elK59(=S;gIrr>*)YD%S=O29cv+OG1d{-b?WVs61Z8Y%dd&-iNcJ_{PQ4?mE;Sx z+Vwd9_st8_owr&{Apy6h9uYJah;FoBH;p&lfLy$%L zHqiAaMS(?Nkx(?z1w+amoeGcW?bNn|x(+Qe>tyRb)Gx;dH-Qbv$2HhjdZteB$4AA7 zM?NT;fS(r?u)(lrOz$1H261}aPhX@5Uz2Tv5fH)G?oGfLW@y=O5{a7vmU@KB@m-4T z9Dir;*V!s#ojKLgE zo$PE3g5ryaSM7IX5!Y)_cWLHnWl5n3nv!d>NqPt|go9w1oE`8oU`L-2w$tnDA@O=~ zyaA>6bIfR`ruS+e<-;?(X};~(uLe}F4x6ntw7f^WBbUdR268-7tv&KT?}wZ2)}jUt z_4e*r$v2sp;OxoSf&&4Z4k?>oINJZz8BiV4K=#f3c0Gi&)N^3G5~hw02tpHi z&2fBojl;wn!z98kh1vp#KMdzRL)Ku5f9tRo@}~p0^u%fZpIN9W>R3VFRHH=Qm3uR6 zJAM@sUny$;6a!o>c$03~9rFnm<6~^aTuU+#w)gH`q!L$G%duYDmH^#H=5<$EWl}bp zLXAdQQb(sEh^F@?scP7uX7z_}uVY1(USj0ue(i2D^y}otW1j`RMy<$%jmd<&9+k9( z?RlAHjp9<*zRs0u_~`%dBc?^91$i5?P!4@M^euh)VsU+4sPx4bxW=K=Hb;fSV{v`? zNAx3J7(&2sxqu;GTvdDDQK#(xgNhfUxPz$F!VKF?>*0^+NG-bNn}xeMDEd$ZgK4{9 zE3fJz;wsdjB%J4C?roa_i00$vQ%!`ij5fDREcTi#Cnntkdu^#wPbRQ*pr~Cb!vrwz zO?0$VAi|@qbfu7&e?*`r<52!{m9W8$izx2Qy?Dp&cDs+)$VPNI*@87nW%pogot{<1 zJOz_{Jkyo1?YOwZ73jJP>VTyTc2DcInN^pu;_Ct5ukhW^t5d6{Y5IeGdL}Y99T_6Y z*z2-?%y%e|x9eg#_2l!hj=p?jQY_VbStWSct-tyu zaINqb`1JhB2To8AHTCtXadMo0M3j3KJQKpvnjdA8^szZ;lZOv!0<4QNU?@~dB`z;@ zKMgoj;_R0tg8cXI9AFH7#E8bkI7_(>-$PR;qaND>x|i|xK{`gPSrv+P6K2$$6Ll!d z@;iJlK1bD|4@}#1K~WG0bRr-N+m-AbC$CX4j*(FUK0K<0veRfy<=(_mjQpntW30Zf z52x}k@_}ztO3FR9&gllm>Igi>fffewH-_%PAhmo&q+EYiF2{%!&{w7L5d*q<Mn&cD3a0hLD=T5q*6khL!XBztU+JM+B_du$^g>HtMaiKM>C!+CC}if6PSI{9 z&fM9~a{??A(mz#y=tk*r6}=dQI&icr`4|t@gdRQpq>WN;m-{K-0b7M{&?v2~Z`lzD zUJ7CKd`-JoNFlAWd&j?Ci5Mbm2?&p8M39z|l_rfd`z z${y_rdwdw+El~y=3a1Jc?)JkCw2Rg}o0TuWNQXeqgIkYQE5=tlp#IZCIOhU>*KBjU zO4vLnG3xt3nDnz96wUq`1A4`FJ>NYdLR7QU4ph|8|KTErI2cLz zjo0_TAcu%#19Q3rPioH3DivYPq%kzfs1=Q5RPg4#GAqEb66U@xRyJG8uCuPif$KFY zanT#9DZBL?e8nIT_cWmT1u&$GwW=URa@tl@+8T=47c;}`3)$n)i`oSV_FOq!Q8OiO zRT;F{C2mk_fIwzGqBr#khSYh!1-p8B)ip4km?u0%?d2Epx=$1Ju!RU7oBIV0-nG_H z(|^Wz#iA~cU?`Y;iHVd4b1}=!r*hFI>0akO0IO9oa}=wNJK?bxO`U~UJEzjUY;ztV z@<<`QGB(;IELd?G;y*o(n}b(Y!|aRLSDXvpprowxN2B#<0tBsc>)eXBwWw4K^zn$* z-wzUb`-<4VC3ntOE!8HU3DeRffgBj(&-nNMGf~5fOP%lxI}EkwuZ63$QSOd*M%8WP zo@H@~1I5EPLQa3;;-^&<8{*;~F#fu&YfW%H==~SP5J;_N(PR~jImf$TcL+YJCm$0V zkEVVYso4E(s>9DoF#F!TqsQKj_{}WR7?lt=`U;#*K2Xevq(#I-2SY5;=f19df<+>YEW`SOO=Dc-q^E1y*g1)>pVZ`-#07oEa z`^#t{wRei>FOB+A=XttsHiyV@za=zc2nnVUJ|6LdHEsHI*;=(3Gde-@hCuo|8~wcP zTuXxdc|%8$rr9`cCTYoKY5xxEa9bh^ZL5bp!=dsja0em9m9|G6+u+$3p`PnB34ELt zF3dwmvY5)1bA(*|zP0=R@6~%WcTt9qChyXqKGxlC*Q>x%rFUu+{>K<7*02E{#=N$5 z<9$GmuKme&_};a=lT{mWF7to$t;qo5yWojy!Q<#f9Gk{g5z3_hYy=V_Qt)San89MAv#Tcq`{cl!&x(ZG^?i0Tz;r&riR5`*Q+;UkHW z;%OgRXW)HjvjPQF>2*}1_o`6AKF4fMwU%Gm2p`a!&Ub0)&UZ+_mHYFJ;d~1;97&|O zh{yEh^NN;#M0pjwA#ma6;64VbKN4-e^QpYN^F#9&*Z|};dJ_j-2RR%Ba(pg49UqFS z?5iqJNRXtNC=LkaSc%q`lay#`R`~?IW27(7>zZ)&o$P|eaOwWt;-Wvlj2}Kcrzuhl z;Qx2ecl-1NNYZ{4va1!zg7Q6Df1fQ%;!*2&yIrw@!8SP6%LN=k>qOI1v;Z~pLgLBl z7<`GVYDuMY=|6z$SQDZNb*N60wQ2dZEY*THRtDmd!z6q@Z*cKcG@hB2UR#l}E3Ub& z@x`1Eqcv1*vd}(>n25Q5R&Bo|Xf=#3Y8PQZC$wkv!=FEqcqi@m5{L?~Q8_^@6Y&s) zgapNUDoIE4QCW|ls-u-Gazu(EzJA9+|ARRIJ`vT7=oN?Yi~1NgqjRRSq|+NTQCl@^|%xx zJgG=>$xa$g@+1pf^Re(Nj?^LxG_8N@Uu-R``x|0;nAgM2#(XI zDN6R2z@b}zMd+24!g!vH-S`u)()+r-$qEz6QfdaEc@;yRj4taNj)S7+Q*W%RCxM?Fg-2o;cMXilVJ1?Rcksm!26BG!2)o6 z3Cuwe9DMHH?_<1e-b>eg=rWc!Q2+R-{%ic3zsU7xT5Bg6_o!O?7q8Pb*a17E4# zYh1KFQPeL1O2x)7n~?7Y#VySZ82RlQ-0N^hyC(Hqv=8tG3TZ7`EK%NTnRu15`L?$g z;bRPOh<}HWEl(Eq=ytRR=0F+VA(v5x)2q$rBSzJH6nK~MxS&BUgmTrd>81PiiKAbU z=L2(foHg$d`ZPb-5NZAysGrR01`jVTl69Vw?l_1{(%cr$>6m+=#w~HOizHDw!y99B zu}*ac#X+Q{{6EIZ+E<;&r4+A*<8W9HrBm#d6l2qtRk{Ihyv>#0lCAB=C8FZ!T5zTO)uw|VN@cXM zVxiMWM>x@p@nwc@9U|HUvQ%|pRFbeJ^cDf%*T=UM%uiKsl)z`bI91zz;Tu>-JTxsO z!86LL5#M`}0{8M883`?I@KKe7U z;N<)883{UqmAunIOaPrnb`AqO#WioB4HSy`^V&Hv0cQ72f|P*egOS~PSSd4X*~8(! zD93>Kj!LJDDBsJ{@X3$%fc7>J;;OX+3Po=sWp1V)do=>ndr;+$H{*6(5J$sTBNYnz_|Fh^A@=}c~!<|?lM2)3%RZU+1oftmQKoC%J>au z96CvXh5i+7vc2jWE?5(acrAR;1VztWBmBkRR>3E?tHpVb)oj&>u`CHx$GyG_m%XnQ zX%nQrjj6vSvz$=^EZfm0npibrs5MN^yA#Lq4L3khzFVoGlItFHH^=#yWniJy-~VBf zutD*oAIL(Q2~!v8i?oT4i$q6nFNhHRLW`%tfX2@}^7!7v^?I5_h|c6#Wyf9of|=N> zcvd)4Al$4pe+f)5@u-#un1qNnpngs+!eY|E@}woLY}D6*BkYeyJT!})!w{jR=5`AkDGYX{O{y;=(@9)DbDik~n;v$N8bBz; z&5>yv0dNYsyl8mrFPoW9m+5by-@cL--^aqwo|LLDaP|o;>N?9XvTi>aYkFpmS$W0W z;8v3Gd*g84XtcXe9#QNcqC#rPA^Mo|_WeSSvj;TGqw4qX7Vg%H#`jj;FNEln7RhQu zhl>DR%XZk6F!g+m2~`pt zOkLu{ee3nyMCIO5!y3FL^mep7u44H|)y^qKVd+4SX z)fUrWg`zz7DI)`#>zQc-tJXxn1^};%+QFui{AP@NiKV7=%^I)xFfJ!2o`;pw57i|| z7XyoDq(Rd?h-X8*!R$2^SKsw?tMrNSZp;5*7VKIebw1> z$fK!&D2x@x?FSKUE=@U~PP^01Y!#S(xMyMB7`=P%&MSy8$)k7m;rHvwHc1|TXl+kl z8cJd5gW5S0(8Bh!L;I3+DKV$iW~&J?OmM;?ca~dohK*{)Mif_YrF**5=qtsd`vS}zh{dS_q=3i6 zMGCcBZMnzx;Tll62*E<*gyL?b|NDl#C01o!?BnM97SknsqZ0!n)2f&V@p40n=$-z| zL*|qhV-+9R$ET7R=)wd!zI*DwbGM#pPOfq!P#yeyIrV$WnA+N@IN@IXcax>Eyue1w zrAdLKY{}2uwM!GuNAGzkuoT7rA5&i)7iIUnO)ar>+=PUHA$psURUK(ygRo5Tftx^L?J*=lxIqanF6uoSAE`nKM_e091$V zjMqd#P;;RoXI66Mp*r;{^fmi|;GFR9FpY@oY1gOi4i~Th@f)WxAZjjCt_dVbIa+`qh2JSZ%Vo8^NjY;T<^Mh~z5 z5zyre^WS9+vWPF%msZ_G{|3Kc^v?ptg&HsGFHmCVz?r&B3DKCu<)a@I!^5 zEhW#%5W#(gTyaVv>O#%+pJh2scc+NKPM|6@t=VI$h^z9N=Dm9nC8K8$Ja*jSy4oca zLAzg4`|CJ^PE*yQ!wAb5EoN=`M*w{PH$#Kwbu$$qy2qtw#l@qSqr$#cKFz~Al7o+q z2uU7>rWlsVn%(KIL7tIUMg{|4a7Mr{RSmj6a9q`6ZE<14LQ|w_l3J!B;8MRUJ6DiI zKzxu6UAywt%NxE=!vpTU9+9?Nf!p3mBw7(iB2hqnn{hGEhj~3c>y(zQ%y?C@Slpvv zQSfg)Gl9{t_V@@wB4|N0$xMquN+{Q}`70Bt-H2f`)i1e!j)JbN&ZNbj+>$06?E&ZH zakN$214C|_DN*4}~EnnwEC7nwL#_5RXb1Rdd zGJe)`RtVb)`{eWpKPUV5-Mm0tHJ@>l=$MspDy+$EM~LDTr}dd2FHjwJ zw%}ytQ2&m5_C4opnAK{vB!kXVc8_K=VA}|DZO(P5wj{2utgORLn#8c9b3M2{1#wR; z@$B6%?m*&^fnyU+r^uScQ3~DBlQ90oAV15(EN^|ma6`+2M>6| zTB~KW>L0(mhl205d5iNe5&IUB%U{5@@U7Yr63}Zb5rai%y+01$ zqj89w{F5OY@Ex9ex7$;>@_aIkcg)xN;m7A5TD7D`l%V?Qc`P(de40_am%*|N5)c?E+1E=6j51mctTr1_Ea38v5&%AAZk| zy7f8?{PHn0Xn8*S?dud?w^2>9G=eVx5`J43hA>Ziq06mJvtGi8etb`bMOznU7p;*e zyt8}EeK-7g_o}19w<~i4m`-mn#~rmDyFU}_ z|K;v^g^S?fuUF}zzH!(!Q-MyKrf>2&FWB_wQOku5wK4o+0^ftk@#V0|pJQL<6*&D~ zUZ7oW>0Z@cb$#A?@fouVv9rG}+QmzR0U>K1qx9X#Z!bH~R`tu{i`^KgLah$b$&bvv zvQ-x_YWnWW@;n{v5tbWF5V0v`@Y&9bbju(cvw+=)4bXqKxLkINQhfFjQJV?R9;58b zmR|iA3O={*vNx|pAHL{d2u=Mh+%=Xov$--^WbARWtcoAgZ&YcXbd->j$a2HF+$fk-*Y#uV2v9<#aILsIV${m*1O>!Tkz!c3!r~{0q?l!2czquKG zl;=m)b$>%0)E@R0W$@r)9?rzZ<;kt3dn4!{YEH-++Jx7gg& zw92Pg+2K~7%nup%<`DOk(r|`!smuCR$PD+Fy(0NA?_9AbFouuReKG_?=Z}~5&13n4 zVpvYOV;X~YuYY{T99njTiUnGr#R2Ks-ml!{+XP%Oek))lt@r zCvO<3w`!7-V?aS=wRXX&_kOXvN(GCB2*HC=#1tr(97K+tLypxH4!*c^M7!)BdPzfI zwgPI?MXf;67skAi_*3@?Cej(;W80nvXpt^pyy`Rtw$p|4gx9FK#|f7Csmu|+e+}*> zJKNj(LH5>_LfPEKZxZV1E6OHwSI0dm>6N{`J1)-6x1Noh@;%s}`>{*ceF;5(jce!y z<3p{Is|#F|^o|f{l^fq0BVp;u-G)?Hz4c{-wxl6}|)H~Y(=!$wU- zFxzBUZS?#`zYC$ZyJ5FB9r+?6q^`X6TzzUtQjYq#9rw>q>oniakgtlMx=~W2>vezQ zX1e;eHgqlavt01Q^eg#-#)?*3-_`kS30wV>LiU+rjfC-*-O zww%SWcJ)QEZKn*5g@nYZv(S7U|K&%{_e+Pz9sPWl9;F_f0`MTeAek1r|J=vkNclax zr-F!Q4U0M^A$1n_mCEEBz?Zy`LPm!HHfaffDd1F=6x0U^w0LG2 zUzTKbY;=!OiLmr8PMuaGC59u4FBXO+Q7wZA#Bd@_1tnoPYYdo*@&%?B-c0{I*YV2! z^iWdUXR)+&_xa+jjt=|bNY8s<#ZP0HY&3H|GG0)f(wkDXOn6Vpi zFR40QRX`1>5FXDdppwi0{<9y&*DPVU%~(e`gFfH`(h$lTE7!~(fmfsAZ5=O@m87;a z$0{}IfXd!%3XffHHUdl`?t<|N6)K*F*v*#MH)dS;9|`O?9DAQ-CVIRCd4Q_@O3FH@ zEVube__*xv1Q+9(%itWWO&vidW6}GX6^^%XMVkd~;u5N#R|V7Msc}N9(Sliy(Xhsg zf_9r>@sMtguE3kA$NO-A#2_k$3OvLxV>5l#Tyhu&+(j1L#GLG|(tS)|pHN^M>iaD- z!*%~axM@4Qd!66Tp+u5lR6n5v`H|giq>u_~D~87uP*F)zBjOW;+@OTk zx{^OXN7wydP$)AGw-**k+ON?!-K~vkqCm2?rNo9?mZCqHtKL4HnV%#z;brn+qa277 z5*c`$xg)iu4WYUX#(=|F9y0;+J>-Trl$B+iny_^2pl~DQN*d;&!Mk+O9#l_ekzF)y z;b}(Z5HWd_eD?uPUQ9on!@j5_YJ1AbV0MtfyYtMYklx+91U)sNN$**QbM|*lP6OS; zVEO&uPe%tbNT{FjpMUbWcG0Is% zk^E(kda8`aEvW*H`Mjcln&~z-!xYG=x&I~nK*jFavfT5Sq}MUMA%gr481(scu=QSa zX)PtT0S<)wiu(=_*5ZPaNDSzWih1=AzNbj?PcOH>65p6U=`DlKZMzd3`!eU8nr$@0 z6>p^Yh0wws<1bGoW`W#Vr@{u9Ky4h<*%j!1Tfc$FMijy%7`mBqRZ_(BVaD=p@r<*X z&eH;$1#+C?KcoL{PVRPaM9Iw{TFwE{z)L8Ghulb~!dO;MN09(GZ|*-Fru!4VNOBSe zI(NQCmXO!112h)f=cqru$zpmwQzIEBpF;0=FV?)?P2Tl>?2DC-QZRCPcYjKZ$QlSk zT%P=@>7)YQJpW55{gosUX7k=K2-@)3Q(-Hd^GziLEJ5I@mVW`q(EPx$I1)i7qXDtHqHai^B#mRLsXs_Js zpE0RHdkh2&|JpsmHTU&ptaV`VPmw}>hgZY8=;qK281}Ya+xE?#=?~mfop~v z=v}1HPjk4Py7BqH_vi_%w$MEf9G=c)9uJPBTqTEGwnnm=668&JTz_@$%HBBspOabl ze|=ptSt}YY89KUFGw8qw^$Q$+$~?>mk3Mdzaj;268pJd^GyNi?uJs{*KrdvRV}>Np zEf*zhnG!l*;w>Q|yRwAN*R?W~hw+^()h@_cE2NO56`tZlF`}7b-V~r9csv;jdPZH> zVFvif)W(>Kn*u>KGaR{i-96CffjC*>0v$*36p>BB4%QXnwxcstDF7Q!yR{^zjXC36w(vQS{b) zG*W&NK9*UXc(+ohk9MQJX-v0fTcyyBq68bKA(}hxddB61k4T|pWXT0lWt0dUU7w$~z!pcYOgmWQ~O$u{$xtfpO1? z>;}B>jS{j|ojlk zT*!IVQy@@iq;%{hgXK*RpQ0HdI!1z^-N5M}V+u*3(~}CmN>o)TE7k=t zY_6Z0@VZC$>7F;mF22e8639o?&UTN5`PG7>LuQ7sP@_75KAk}|MT)M~d)EMGD@-ju z=5!`2Mw?Z3FIvT%f?6y;n|KB#*7D_uAXpRnL2gMKlyLt}y?S03m~qlT(MI}~LTT4E)rl8LNHQBt%HGlx z6qFjm=%QVP1qm2#h9X;)p3rxRS)6#`1nZW|S=H{VtW}|UY3v`a0drF$p3^a7+#6DgEh zwg#^&F(!L=boq0a{MrmMns)#+-qdRpy%6cIU3J26BO_QvvM!|p-Ba4Ps{F0r>v-q+ zTDvyAuLV>w|MsgVxO&HUzHsivpuvY>y2!eVP2SF1jvKh)rQFzM7R~1W`MGrZMQV>< zp|v3tR)%k!^^qC3`CpV;w%B}^&BMEW5BxQO%t(~Nh-#CWiY3*m=bu9@L3g6!8WH)h zx5i!2nLF~=Ve6VnFz<2Ze2?>Uwyf;taKlGWqs*uVk*xa|^m~2J8_6(NUX;Ffk}4A% z;Id< z-rz7uLZ|B+Q6>tN_(C&+wOmc=%V?#{C>SR?k$F)2@4)Rc^flfK0%d3yTd9+%0Af!d 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 SQu5y-W>X_e!z#3M-2VY%@8`z= literal 0 HcmV?d00001 diff --git a/docs/zh/online_serving/metrics.md b/docs/zh/online_serving/metrics.md index 578124acd..cb9448257 100644 --- a/docs/zh/online_serving/metrics.md +++ b/docs/zh/online_serving/metrics.md @@ -20,7 +20,12 @@ | `fastdeploy:gpu_cache_usage_perc` | Gauge | GPU KV-cache 使用率 | 百分比 | | `fastdeploy:request_params_max_tokens` | Histogram | 请求的 max_tokens 分布 | 个 | | `fastdeploy:request_success_total` | Counter | 成功处理的请求个数 | 个 | - +| `fastdeploy:cache_config_info` | Gauge | 推理引擎的缓存配置信息 | 个 | +| `fastdeploy:available_batch_size` | Gauge | Decode阶段还可以插入的请求数量 | 个 | +| `fastdeploy:hit_req_rate` | Gauge | 请求级别前缀缓存命中率 | 百分比 | +| `fastdeploy:hit_token_rate` | Gauge | token级别前缀缓存命中率 | 百分比 | +| `fastdeploy:cpu_hit_token_rate` | Gauge | token级别CPU前缀缓存命中率 | 百分比 | +| `fastdeploy:gpu_hit_token_rate` | Gauge | token级别GPU前缀缓存命中率 | 百分比 | ## 指标访问 - 访问地址:`http://localhost:8000/metrics` diff --git a/docs/zh/parameters.md b/docs/zh/parameters.md index 196c44644..72300638a 100644 --- a/docs/zh/parameters.md +++ b/docs/zh/parameters.md @@ -35,7 +35,7 @@ | ```reasoning_parser``` | `str` | 指定要使用的推理解析器,以便从模型输出中提取推理内容 | | ```use_cudagraph``` | `bool` | 是否使用cuda graph,默认False。开启前建议仔细阅读 [graph_optimization.md](./features/graph_optimization.md),在多卡场景需要同时开启 Custom all-reduce。 | | ```graph_optimization_config``` | `dict[str]` | 可以配置计算图优化相关的参数,默认值为'{"use_cudagraph":false, "graph_opt_level":0, "cudagraph_capture_sizes": null }',详细说明参考 [graph_optimization.md](./features/graph_optimization.md)| -| ```disable_custom_all_reduce``` | `bool` | 关闭Custom all-reduce,默认False | +| ```enable_custom_all_reduce``` | `bool` | 开启Custom all-reduce,默认False | | ```splitwise_role``` | `str` | 是否开启splitwise推理,默认值mixed, 支持参数为["mixed", "decode", "prefill"] | | ```innode_prefill_ports``` | `str` | prefill 实例内部引擎启动端口 (仅单机PD分离需要),默认值None | | ```guided_decoding_backend``` | `str` | 指定要使用的guided decoding后端,支持 `auto`、`xgrammar`、`off`, 默认为 `off` | @@ -49,7 +49,7 @@ | ```chat_template``` | `str` | 指定模型拼接使用的模板,支持字符串与文件路径,默认为None,如未指定,则使用模型默认模板 | | ```tool_call_parser``` | `str` | 指定要使用的function call解析器,以便从模型输出中抽取 function call内容| | ```tool_parser_plugin``` | `str` | 指定要注册的tool parser文件路径,以便注册不在代码库中的parser,parser中代码格式需遵循代码库中格式| -| ```lm_head_fp32``` | `bool` | 指定lm_head层的类型为 FP32 | +| ```load_choices``` | `str` | 默认使用"default" loader进行权重加载,加载torch权重/权重加速需开启 "default_v1"| ## 1. KVCache分配与```num_gpu_blocks_override```、```block_size```的关系? diff --git a/docs/zh/quantization/images/wint2.png b/docs/zh/quantization/images/wint2.png new file mode 100644 index 0000000000000000000000000000000000000000..a117ea8afa82f183c2486ab2c3b1b0ede027f0c8 GIT binary patch literal 82801 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%0AJ?LOF(dY%2$JEN`J5~`q@Tqs< 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%0AJ?LOF(dY%2$JEN`J5~`q@Tqs< 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 ⭐ **说明**:带星号的模型可直接使用 **HuggingFace Torch 权重**,支持 **FP8/WINT8/WINT4 动态量化** 和 **BF16 精度** 推理,推理时需启用 **`--load_choices "default_v1"`**。 + +> 以baidu/ERNIE-4.5-21B-A3B-PT为例启动命令如下 +``` +python -m fastdeploy.entrypoints.openai.api_server \ + --model baidu/ERNIE-4.5-0.3B-PT \ + --port 8180 \ + --metrics-port 8181 \ + --engine-worker-queue-port 8182 \ + --max-model-len 32768 \ + --max-num-seqs 32 \ + --load_choices "default_v1" +``` + +## 纯文本模型列表 + +|模型|DataType|模型案例| +|-|-|-| +|⭐ERNIE|BF16\WINT4\WINT8\W4A8C8\WINT2\FP8|baidu/ERNIE-4.5-VL-424B-A47B-Paddle;
      baidu/ERNIE-4.5-300B-A47B-Paddle
       [快速部署](./get_started/ernie-4.5.md)   [最佳实践](./best_practices/ERNIE-4.5-300B-A47B-Paddle.md);
      baidu/ERNIE-4.5-300B-A47B-2Bits-Paddle;
      baidu/ERNIE-4.5-300B-A47B-W4A8C8-TP4-Paddle;
      baidu/ERNIE-4.5-300B-A47B-FP8-Paddle;
      baidu/ERNIE-4.5-300B-A47B-Base-Paddle;
      [baidu/ERNIE-4.5-21B-A3B-Paddle](./best_practices/ERNIE-4.5-21B-A3B-Paddle.md);
      baidu/ERNIE-4.5-21B-A3B-Base-Paddle;
      baidu/ERNIE-4.5-0.3B-Paddle
       [快速部署](./get_started/quick_start.md)   [最佳实践](./best_practices/ERNIE-4.5-0.3B-Paddle.md);
      baidu/ERNIE-4.5-0.3B-Base-Paddle, etc.| +|⭐QWEN3-MOE|BF16/WINT4/WINT8/FP8|Qwen/Qwen3-235B-A22B;
      Qwen/Qwen3-30B-A3B, etc.| +|⭐QWEN3|BF16/WINT8/FP8|Qwen/qwen3-32B;
      Qwen/qwen3-14B;
      Qwen/qwen3-8B;
      Qwen/qwen3-4B;
      Qwen/qwen3-1.7B;
      [Qwen/qwen3-0.6B](./get_started/quick_start_qwen.md), etc.| +|⭐QWEN2.5|BF16/WINT8/FP8|Qwen/qwen2.5-72B;
      Qwen/qwen2.5-32B;
      Qwen/qwen2.5-14B;
      Qwen/qwen2.5-7B;
      Qwen/qwen2.5-3B;
      Qwen/qwen2.5-1.5B;
      Qwen/qwen2.5-0.5B, etc.| +|⭐QWEN2|BF16/WINT8/FP8|Qwen/Qwen/qwen2-72B;
      Qwen/Qwen/qwen2-7B;
      Qwen/qwen2-1.5B;
      Qwen/qwen2-0.5B;
      Qwen/QwQ-32, etc.| +|⭐DEEPSEEK|BF16/WINT4|unsloth/DeepSeek-V3.1-BF16;
      unsloth/DeepSeek-V3-0324-BF16;
      unsloth/DeepSeek-R1-BF16, etc.| + +## 多模态语言模型列表 + +根据模型不同,支持多种模态(文本、图像等)组合: + +|模型|DataType|模型案例| +|-|-|-| +| ERNIE-VL |BF16/WINT4/WINT8| baidu/ERNIE-4.5-VL-424B-A47B-Paddle
       [快速部署](./get_started/ernie-4.5-vl.md)   [最佳实践](./best_practices/ERNIE-4.5-VL-424B-A47B-Paddle.md) ;
      baidu/ERNIE-4.5-VL-28B-A3B-Paddle
       [快速部署](./get_started/quick_start_vl.md)   [最佳实践](./best_practices/ERNIE-4.5-VL-28B-A3B-Paddle.md) ;| +| QWEN-VL |BF16/WINT4/FP8| Qwen/Qwen2.5-VL-72B-Instruct;
      Qwen/Qwen2.5-VL-32B-Instruct;
      Qwen/Qwen2.5-VL-7B-Instruct;
      Qwen/Qwen2.5-VL-3B-Instruct| 更多模型同步支持中,你可以通过[Github Issues](https://github.com/PaddlePaddle/FastDeploy/issues)向我们提交新模型的支持需求。 diff --git a/docs/zh/usage/faq.md b/docs/zh/usage/faq.md new file mode 100644 index 000000000..371b6678b --- /dev/null +++ b/docs/zh/usage/faq.md @@ -0,0 +1,4 @@ +1. 服务可以支持多大并发? +- 服务部署时推荐配置环境变量export ENABLE_V1_KVCACHE_SCHEDULER=1 +- 服务在启动时需要配置```max-num-seqs```,此参数用于表示Decode阶段的最大Batch数,如果并发超过此值,则超出的请求会排队等待处理, 常规情况下你可以将```max-num-seqs```配置为128,保持在较高的范围,实际并发由发压客户端来决定。 +- ```max-num-seqs```仅表示设定的上限,但实际上服务能并发处理的上限取决于KVCache的大小,在启动服务后,查看log/worker_process.log会看到类似```num_blocks_global: 17131```的日志,这表明当前服务的KVCache Block数量为17131, 17131*block_size(默认64)即知道总共可缓存的Token数量,例如此处为17131*64=1096384。如果你的请求数据平均输入和输出Token之和为20K,那么服务实际可以处理的并发大概为1096384/20k=53 diff --git a/docs/zh/usage/kunlunxin_xpu_deployment.md b/docs/zh/usage/kunlunxin_xpu_deployment.md index b89481401..94e598afc 100644 --- a/docs/zh/usage/kunlunxin_xpu_deployment.md +++ b/docs/zh/usage/kunlunxin_xpu_deployment.md @@ -89,4 +89,4 @@ for chunk in response: print('\n') ``` -OpenAI 协议的更多说明可参考文档 [OpenAI Chat Compeltion API](https://platform.openai.com/docs/api-reference/chat/create),以及与 OpenAI 协议的区别可以参考 [兼容 OpenAI 协议的服务化部署](../online_serving/README.md)。 +OpenAI 协议的更多说明可参考文档 [OpenAI Chat Completion API](https://platform.openai.com/docs/api-reference/chat/create),以及与 OpenAI 协议的区别可以参考 [兼容 OpenAI 协议的服务化部署](../online_serving/README.md)。 From 14df2c59daa425a6e889b529fc43a3e26afdc442 Mon Sep 17 00:00:00 2001 From: yangjianfengo1 <125249383+yangjianfengo1@users.noreply.github.com> Date: Tue, 9 Sep 2025 10:23:51 +0800 Subject: [PATCH 14/36] =?UTF-8?q?=E6=9B=B4=E6=96=B0=E6=96=87=E6=A1=A3=20(#?= =?UTF-8?q?3996)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 17 +++----- README_CN.md | 19 +++------ dockerfiles/Dockerfile.gpu | 6 +-- mkdocs.yml | 87 +++++++++++++++++++++----------------- 4 files changed, 65 insertions(+), 64 deletions(-) diff --git a/README.md b/README.md index 0c20629ff..7685149b3 100644 --- a/README.md +++ b/README.md @@ -26,6 +26,8 @@ English | [简体中文](README_CN.md) # FastDeploy : Inference and Deployment Toolkit for LLMs and VLMs based on PaddlePaddle ## News +**[2025-09] 🔥 FastDeploy v2.2 is newly released!** It now offers compatibility with models in the HuggingFace ecosystem, has further optimized performance, and newly adds support for [baidu/ERNIE-21B-A3B-Thinking](https://huggingface.co/baidu/ERNIE-4.5-21B-A3B-Thinking)! + **[2025-08] 🔥 Released FastDeploy v2.1:** A brand-new KV Cache scheduling strategy has been introduced, and expanded support for PD separation and CUDA Graph across more models. Enhanced hardware support has been added for platforms like Kunlun and Hygon, along with comprehensive optimizations to improve the performance of both the service and inference engine. **[2025-07] The FastDeploy 2.0 Inference Deployment Challenge is now live!** Complete the inference deployment task for the ERNIE 4.5 series open-source models to win official FastDeploy 2.0 merch and generous prizes! 🎁 You're welcome to try it out and share your feedback! 📌[Sign up here](https://www.wjx.top/vm/meSsp3L.aspx#) 📌[Event details](https://github.com/PaddlePaddle/FastDeploy/discussions/2728) @@ -57,8 +59,9 @@ FastDeploy supports inference deployment on **NVIDIA GPUs**, **Kunlunxin XPUs**, - [Iluvatar GPU](./docs/get_started/installation/iluvatar_gpu.md) - [Enflame GCU](./docs/get_started/installation/Enflame_gcu.md) - [Hygon DCU](./docs/get_started/installation/hygon_dcu.md) +- [MetaX GPU](./docs/get_started/installation/metax_gpu.md.md) -**Note:** We are actively working on expanding hardware support. Additional hardware platforms including Ascend NPU and MetaX GPU are currently under development and testing. Stay tuned for updates! +**Note:** We are actively working on expanding hardware support. Additional hardware platforms including Ascend NPU are currently under development and testing. Stay tuned for updates! ## Get Started @@ -68,20 +71,12 @@ Learn how to use FastDeploy through our documentation: - [ERNIE-4.5-VL Multimodal Model Deployment](./docs/get_started/ernie-4.5-vl.md) - [Offline Inference Development](./docs/offline_inference.md) - [Online Service Deployment](./docs/online_serving/README.md) -- [Full Supported Models List](./docs/supported_models.md) - [Best Practices](./docs/best_practices/README.md) ## Supported Models -| Model | Data Type | PD Disaggregation | Chunked Prefill | Prefix Caching | MTP | CUDA Graph | Maximum Context Length | -|:--- | :------- | :---------- | :-------- | :-------- | :----- | :----- | :----- | -|ERNIE-4.5-300B-A47B | BF16/WINT4/WINT8/W4A8C8/WINT2/FP8 | ✅| ✅ | ✅|✅| ✅ |128K | -|ERNIE-4.5-300B-A47B-Base| BF16/WINT4/WINT8 | ✅| ✅ | ✅|❌| ✅ | 128K | -|ERNIE-4.5-VL-424B-A47B | BF16/WINT4/WINT8 | WIP | ✅ | WIP | ❌ | WIP |128K | -|ERNIE-4.5-VL-28B-A3B | BF16/WINT4/WINT8 | ❌ | ✅ | WIP | ❌ | WIP |128K | -|ERNIE-4.5-21B-A3B | BF16/WINT4/WINT8/FP8 | ❌ | ✅ | ✅ | ✅ | ✅|128K | -|ERNIE-4.5-21B-A3B-Base | BF16/WINT4/WINT8/FP8 | ✅ | ✅ | ✅ | ❌ | ✅|128K | -|ERNIE-4.5-0.3B | BF16/WINT8/FP8 | ✅ | ✅ | ✅ | ❌ | ✅| 128K | +Learn how to download models, enable using the torch format, and more: +- [Full Supported Models List](./docs/supported_models.md) ## Advanced Usage diff --git a/README_CN.md b/README_CN.md index 6cebc527a..6c5128384 100644 --- a/README_CN.md +++ b/README_CN.md @@ -26,7 +26,9 @@ # FastDeploy :基于飞桨的大语言模型与视觉语言模型推理部署工具包 ## 最新活动 -**[2025-08] 🔥 FastDeploy v2.1 全新发布:** 全新的KV Cache调度策略,更多模型支持PD分离和CUDA Graph,昆仑、海光等更多硬件支持增强,全方面优化服务和推理引擎的性能。 +**[2025-09] 🔥 FastDeploy v2.2 全新发布**: HuggingFace生态模型兼容,性能进一步优化,更新增对[baidu/ERNIE-21B-A3B-Thinking](https://huggingface.co/baidu/ERNIE-4.5-21B-A3B-Thinking)支持! + +**[2025-08] FastDeploy v2.1 发布**:全新的KV Cache调度策略,更多模型支持PD分离和CUDA Graph,昆仑、海光等更多硬件支持增强,全方面优化服务和推理引擎的性能。 **[2025-07] 《FastDeploy2.0推理部署实测》专题活动已上线!** 完成文心4.5系列开源模型的推理部署等任务,即可获得骨瓷马克杯等FastDeploy2.0官方周边及丰富奖金!🎁 欢迎大家体验反馈~ 📌[报名地址](https://www.wjx.top/vm/meSsp3L.aspx#) 📌[活动详情](https://github.com/PaddlePaddle/FastDeploy/discussions/2728) @@ -55,8 +57,9 @@ FastDeploy 支持在**英伟达(NVIDIA)GPU**、**昆仑芯(Kunlunxin)XPU - [天数 CoreX](./docs/zh/get_started/installation/iluvatar_gpu.md) - [燧原 S60](./docs/zh/get_started/installation/Enflame_gcu.md) - [海光 DCU](./docs/zh/get_started/installation/hygon_dcu.md) +- [沐曦 GPU](./docs/zh/get_started/installation/metax_gpu.md.md) -**注意:** 我们正在积极拓展硬件支持范围。目前,包括昇腾(Ascend)NPU 和 沐曦(MetaX)GPU 在内的其他硬件平台正在开发测试中。敬请关注更新! +**注意:** 我们正在积极拓展硬件支持范围。目前,包括昇腾(Ascend)NPU 等其他硬件平台正在开发测试中。敬请关注更新! ## 入门指南 @@ -66,20 +69,12 @@ FastDeploy 支持在**英伟达(NVIDIA)GPU**、**昆仑芯(Kunlunxin)XPU - [ERNIE-4.5-VL 部署](./docs/zh/get_started/ernie-4.5-vl.md) - [离线推理](./docs/zh/offline_inference.md) - [在线服务](./docs/zh/online_serving/README.md) -- [模型支持列表](./docs/zh/supported_models.md) - [最佳实践](./docs/zh/best_practices/README.md) ## 支持模型列表 -| Model | Data Type | PD Disaggregation | Chunked Prefill | Prefix Caching | MTP | CUDA Graph | Maximum Context Length | -|:--- | :------- | :---------- | :-------- | :-------- | :----- | :----- | :----- | -|ERNIE-4.5-300B-A47B | BF16/WINT4/WINT8/W4A8C8/WINT2/FP8 | ✅| ✅ | ✅|✅| ✅ |128K | -|ERNIE-4.5-300B-A47B-Base| BF16/WINT4/WINT8 | ✅| ✅ | ✅|❌| ✅ | 128K | -|ERNIE-4.5-VL-424B-A47B | BF16/WINT4/WINT8 | WIP | ✅ | WIP | ❌ | WIP |128K | -|ERNIE-4.5-VL-28B-A3B | BF16/WINT4/WINT8 | ❌ | ✅ | WIP | ❌ | WIP |128K | -|ERNIE-4.5-21B-A3B | BF16/WINT4/WINT8/FP8 | ❌ | ✅ | ✅ | ✅ | ✅|128K | -|ERNIE-4.5-21B-A3B-Base | BF16/WINT4/WINT8/FP8 | ✅ | ✅ | ✅ | ❌ | ✅|128K | -|ERNIE-4.5-0.3B | BF16/WINT8/FP8 | ✅ | ✅ | ✅ | ❌ | ✅| 128K | +通过我们的文档了解如何下载模型,如何支持torch格式等: +- [模型支持列表](./docs/zh/supported_models.md) ## 进阶用法 diff --git a/dockerfiles/Dockerfile.gpu b/dockerfiles/Dockerfile.gpu index 6a31156ff..0f1f29588 100644 --- a/dockerfiles/Dockerfile.gpu +++ b/dockerfiles/Dockerfile.gpu @@ -1,6 +1,6 @@ -FROM ccr-2vdh3abv-pub.cnc.bj.baidubce.com/paddlepaddle/fastdeploy-cuda-12.6:2.1.0 -ARG PADDLE_VERSION=3.1.1 -ARG FD_VERSION=2.1.0 +FROM ccr-2vdh3abv-pub.cnc.bj.baidubce.com/paddlepaddle/fastdeploy-cuda-12.6:2.2.0 +ARG PADDLE_VERSION=3.2.0 +ARG FD_VERSION=2.2.0 ENV DEBIAN_FRONTEND=noninteractive diff --git a/mkdocs.yml b/mkdocs.yml index 5f4a354a1..16237f04d 100644 --- a/mkdocs.yml +++ b/mkdocs.yml @@ -2,11 +2,13 @@ site_name: 'FastDeploy : Large Language Model Deployement' repo_url: https://github.com/PaddlePaddle/FastDeploy repo_name: FastDeploy +copyright: Copyright © 2025 Maintained by FastDeploy + theme: name: material highlightjs: true - icon: - repo: fontawesome/brands/github + favicon: assets/images/favicon.ico + logo: assets/images/logo.jpg palette: - media: "(prefers-color-scheme: light)" # 浅色 scheme: default @@ -50,14 +52,17 @@ plugins: HYGON DCU: 海光 DCU Enflame S60: 燧原 S60 Iluvatar CoreX: 天数 CoreX + Metax C550: 沐曦 C550 Quick Deployment For ERNIE-4.5-0.3B: ERNIE-4.5-0.3B快速部署 Quick Deployment for ERNIE-4.5-VL-28B-A3B: ERNIE-4.5-VL-28B-A3B快速部署 ERNIE-4.5-300B-A47B: ERNIE-4.5-300B-A47B快速部署 ERNIE-4.5-VL-424B-A47B: ERNIE-4.5-VL-424B-A47B快速部署 + Quick Deployment For QWEN: Qwen3-0.6b快速部署 Online Serving: 在线服务 OpenAI-Compitable API Server: 兼容 OpenAI 协议的服务化部署 Monitor Metrics: 监控Metrics Scheduler: 调度器 + Graceful Shutdown: 服务优雅关闭 Offline Inference: 离线推理 Best Practices: 最佳实践 ERNIE-4.5-0.3B: ERNIE-4.5-0.3B @@ -83,6 +88,8 @@ plugins: Sampling: 采样策略 MultiNode Deployment: 多机部署 Graph Optimization: 图优化 + Data Parallelism: 数据并行 + PLAS: PLAS Supported Models: 支持模型列表 Benchmark: 基准测试 Usage: 用法 @@ -91,23 +98,26 @@ plugins: Environment Variables: 环境变量 nav: - - 'FastDeploy': index.md - - 'Quick Start': + - FastDeploy: index.md + - Quick Start: - Installation: - - 'Nvidia GPU': get_started/installation/nvidia_gpu.md - - 'KunlunXin XPU': get_started/installation/kunlunxin_xpu.md - - 'HYGON DCU': get_started/installation/hygon_dcu.md - - 'Enflame S60': get_started/installation/Enflame_gcu.md - - 'Iluvatar CoreX': get_started/installation/iluvatar_gpu.md - - 'Quick Deployment For ERNIE-4.5-0.3B': get_started/quick_start.md - - 'Quick Deployment for ERNIE-4.5-VL-28B-A3B': get_started/quick_start_vl.md - - 'ERNIE-4.5-300B-A47B': get_started/ernie-4.5.md - - 'ERNIE-4.5-VL-424B-A47B': get_started/ernie-4.5-vl.md - - 'Online Serving': - - 'OpenAI-Compitable API Server': online_serving/README.md - - 'Monitor Metrics': online_serving/metrics.md - - 'Scheduler': online_serving/scheduler.md - - 'Offline Inference': offline_inference.md + - Nvidia GPU: get_started/installation/nvidia_gpu.md + - KunlunXin XPU: get_started/installation/kunlunxin_xpu.md + - HYGON DCU: get_started/installation/hygon_dcu.md + - Enflame S60: get_started/installation/Enflame_gcu.md + - Iluvatar CoreX: get_started/installation/iluvatar_gpu.md + - Metax C550: get_started/installation/metax_gpu.md + - Quick Deployment For ERNIE-4.5-0.3B: get_started/quick_start.md + - Quick Deployment for ERNIE-4.5-VL-28B-A3B: get_started/quick_start_vl.md + - ERNIE-4.5-300B-A47B: get_started/ernie-4.5.md + - ERNIE-4.5-VL-424B-A47B: get_started/ernie-4.5-vl.md + - Quick Deployment For QWEN: get_started/quick_start_qwen.md + - Online Serving: + - OpenAI-Compitable API Server: online_serving/README.md + - Monitor Metrics: online_serving/metrics.md + - Scheduler: online_serving/scheduler.md + - Graceful Shutdown: online_serving/graceful_shutdown_service.md + - Offline Inference: offline_inference.md - Best Practices: - ERNIE-4.5-0.3B: best_practices/ERNIE-4.5-0.3B-Paddle.md - ERNIE-4.5-21B-A3B: best_practices/ERNIE-4.5-21B-A3B-Paddle.md @@ -116,26 +126,27 @@ nav: - ERNIE-4.5-VL-424B-A47B: best_practices/ERNIE-4.5-VL-424B-A47B-Paddle.md - FAQ: best_practices/FAQ.md - Quantization: - - 'Overview': quantization/README.md - - 'Online Quantization': quantization/online_quantization.md - - 'WINT2 Quantization': quantization/wint2.md + - Overview: quantization/README.md + - Online Quantization: quantization/online_quantization.md + - WINT2 Quantization: quantization/wint2.md - Features: - - 'Prefix Caching': features/prefix_caching.md - - 'Disaggregation': features/disaggregated.md - - 'Chunked Prefill': features/chunked_prefill.md - - 'Load Balance': features/load_balance.md - - 'Speculative Decoding': features/speculative_decoding.md - - 'Structured Outputs': features/structured_outputs.md - - 'Reasoning Output': features/reasoning_output.md - - 'Early Stop': features/early_stop.md - - 'Plugins': features/plugins.md - - 'Sampling': features/sampling.md - - 'MultiNode Deployment': features/multi-node_deployment.md - - 'Graph Optimization': features/graph_optimization.md - - 'Supported Models': supported_models.md + - Prefix Caching: features/prefix_caching.md + - Disaggregation: features/disaggregated.md + - Chunked Prefill: features/chunked_prefill.md + - Load Balance: features/load_balance.md + - Speculative Decoding: features/speculative_decoding.md + - Structured Outputs: features/structured_outputs.md + - Reasoning Output: features/reasoning_output.md + - Early Stop: features/early_stop.md + - Plugins: features/plugins.md + - Sampling: features/sampling.md + - MultiNode Deployment: features/multi-node_deployment.md + - Graph Optimization: features/graph_optimization.md + - Data Parallelism: features/data_parallel_service.md + - PLAS: features/plas_attention.md + - Supported Models: supported_models.md - Benchmark: benchmark.md - Usage: - - 'Log Description': usage/log.md - - 'Code Overview': usage/code_overview.md - - 'Environment Variables': usage/environment_variables.md - - 'FastDeploy Unit Test Guide': usage/fastdeploy_unit_test_guide.md + - Log Description: usage/log.md + - Code Overview: usage/code_overview.md + - Environment Variables: usage/environment_variables.md From d43c2f257745af7ff394c75eae8b912fcbf266ce Mon Sep 17 00:00:00 2001 From: zhuzixuan Date: Tue, 9 Sep 2025 10:58:11 +0800 Subject: [PATCH 15/36] [Optimize]Error messages about Model api. (#3839) (#3972) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * add v1/models interface related * add model parameters * default model verification * unit test * check model err_msg * unit test * type annotation * model parameter in response * modify document description * modify document description * unit test * verification * verification update * model_name * pre-commit * update test case * update test case * Update tests/entrypoints/openai/test_serving_models.py * Update tests/entrypoints/openai/test_serving_models.py * Update tests/entrypoints/openai/test_serving_models.py * Update tests/entrypoints/openai/test_serving_models.py * Update fastdeploy/entrypoints/openai/serving_models.py * 优化报错信息。 --------- Co-authored-by: yangzichao01 Co-authored-by: Yzc216 <101054010+Yzc216@users.noreply.github.com> Co-authored-by: LiqinruiG <37392159+LiqinruiG@users.noreply.github.com> Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> --- fastdeploy/entrypoints/openai/serving_chat.py | 2 +- .../entrypoints/openai/serving_completion.py | 2 +- tests/entrypoints/openai/test_serving_models.py | 16 ---------------- 3 files changed, 2 insertions(+), 18 deletions(-) diff --git a/fastdeploy/entrypoints/openai/serving_chat.py b/fastdeploy/entrypoints/openai/serving_chat.py index d8356ce52..07516bf1e 100644 --- a/fastdeploy/entrypoints/openai/serving_chat.py +++ b/fastdeploy/entrypoints/openai/serving_chat.py @@ -91,7 +91,7 @@ class OpenAIServingChat: if self.models: is_supported, request.model = self.models.is_supported_model(request.model) if not is_supported: - err_msg = f"Unsupported model: {request.model}, support {', '.join([x.name for x in self.models.model_paths])} or default" + err_msg = f"Unsupported model: [{request.model}], support [{', '.join([x.name for x in self.models.model_paths])}] or default" api_server_logger.error(err_msg) return ErrorResponse(message=err_msg, code=400) diff --git a/fastdeploy/entrypoints/openai/serving_completion.py b/fastdeploy/entrypoints/openai/serving_completion.py index ba81afc35..dde3471b7 100644 --- a/fastdeploy/entrypoints/openai/serving_completion.py +++ b/fastdeploy/entrypoints/openai/serving_completion.py @@ -67,7 +67,7 @@ class OpenAIServingCompletion: if self.models: is_supported, request.model = self.models.is_supported_model(request.model) if not is_supported: - err_msg = f"Unsupported model: {request.model}, support {', '.join([x.name for x in self.models.model_paths])} or default" + err_msg = f"Unsupported model: [{request.model}], support [{', '.join([x.name for x in self.models.model_paths])}] or default" api_server_logger.error(err_msg) return ErrorResponse(message=err_msg, code=400) created_time = int(time.time()) diff --git a/tests/entrypoints/openai/test_serving_models.py b/tests/entrypoints/openai/test_serving_models.py index 1ef2fff7e..a6b804508 100644 --- a/tests/entrypoints/openai/test_serving_models.py +++ b/tests/entrypoints/openai/test_serving_models.py @@ -1,19 +1,3 @@ -""" -# Copyright (c) 2025 PaddlePaddle Authors. All Rights Reserved. -# -# Licensed under the Apache License, Version 2.0 (the "License" -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. -""" - import asyncio import unittest From 35b8362804234af8d7bee49a04fa9d6b62c5a9ac Mon Sep 17 00:00:00 2001 From: Zero Rains Date: Tue, 9 Sep 2025 15:07:51 +0800 Subject: [PATCH 16/36] get org_vocab_size from args (#3984) --- fastdeploy/config.py | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/fastdeploy/config.py b/fastdeploy/config.py index a0121afdf..f1ee1d457 100644 --- a/fastdeploy/config.py +++ b/fastdeploy/config.py @@ -155,9 +155,7 @@ class ModelConfig: if hasattr(self, "vision_config"): self.vision_config = PretrainedConfig.from_dict(self.vision_config) - self.ori_vocab_size = self.vocab_size - if ErnieArchitectures.contains_ernie_arch(self.architectures): - self.ori_vocab_size = args.get("ori_vocab_size", self.ori_vocab_size) + self.ori_vocab_size = args.get("ori_vocab_size", self.vocab_size) architectures = self.architectures[0] if MultimodalRegistry.contains_model(architectures): From dfc94371eea7993965c5ecaa93985dd7aee97f56 Mon Sep 17 00:00:00 2001 From: yangjianfengo1 <125249383+yangjianfengo1@users.noreply.github.com> Date: Wed, 10 Sep 2025 10:04:29 +0800 Subject: [PATCH 17/36] =?UTF-8?q?=E3=80=90FIX=E3=80=91Change=20the=20name?= =?UTF-8?q?=20of=20sparse=20attn=20from=20moba=20to=20plas=20(#4006)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * 更新文档 * 【docs】 update readme (#4000) * 更新文档 * update readme * update docs * 【FIX】Change the name of sparse attn from moba to plas (#3845) * 更新文档 * 更新文档 * 更新文档 * 更新文档 * 修改moba为plas * code style * update ci * code style * update ci * code style --------- Co-authored-by: Jiang-Jia-Jun <163579578+Jiang-Jia-Jun@users.noreply.github.com> --- README_CN.md | 2 +- docs/features/plas_attention.md | 12 +-- docs/zh/features/plas_attention.md | 16 ++-- fastdeploy/config.py | 74 +++++++++--------- fastdeploy/engine/args_utils.py | 26 +++---- fastdeploy/engine/engine.py | 2 +- .../layers/attention/__init__.py | 4 +- .../layers/attention/attention.py | 24 +++--- .../attention/moba_attention_backend.py | 44 +++++------ fastdeploy/platforms/base.py | 2 +- fastdeploy/platforms/cuda.py | 6 +- fastdeploy/rl/rollout_config.py | 4 +- fastdeploy/worker/worker_process.py | 10 +-- ...ba_attention.py => test_plas_attention.py} | 76 +++++++++---------- 14 files changed, 151 insertions(+), 151 deletions(-) rename tests/layers/{test_moba_attention.py => test_plas_attention.py} (83%) diff --git a/README_CN.md b/README_CN.md index 6c5128384..a4b8f1efd 100644 --- a/README_CN.md +++ b/README_CN.md @@ -26,7 +26,7 @@ # FastDeploy :基于飞桨的大语言模型与视觉语言模型推理部署工具包 ## 最新活动 -**[2025-09] 🔥 FastDeploy v2.2 全新发布**: HuggingFace生态模型兼容,性能进一步优化,更新增对[baidu/ERNIE-21B-A3B-Thinking](https://huggingface.co/baidu/ERNIE-4.5-21B-A3B-Thinking)支持! +**[2025-09] 🔥 FastDeploy v2.2 全新发布**: HuggingFace生态模型兼容,性能进一步优化,更新增对[baidu/ERNIE-21B-A3B-Thinking](https://huggingface.co/baidu/ERNIE-4.5-21B-A3B-Thinking)支持! **[2025-08] FastDeploy v2.1 发布**:全新的KV Cache调度策略,更多模型支持PD分离和CUDA Graph,昆仑、海光等更多硬件支持增强,全方面优化服务和推理引擎的性能。 diff --git a/docs/features/plas_attention.md b/docs/features/plas_attention.md index 8384de3b5..b139ef88f 100644 --- a/docs/features/plas_attention.md +++ b/docs/features/plas_attention.md @@ -196,7 +196,7 @@ We selected a subset (longbook_sum_eng) from InfiniteBench as the performance ev ## Usage ``` -export FD_ATTENTION_BACKEND="MOBA_ATTN" +export FD_ATTENTION_BACKEND="PLAS_ATTN" python -m fastdeploy.entrypoints.openai.api_server --model baidu/ERNIE-4.5-300B-A47B-Paddle \ @@ -207,13 +207,13 @@ python -m fastdeploy.entrypoints.openai.api_server --max-num-batched-tokens 8192 \ --max-model-len 131072 \ --max-num-seqs 32 \ - --moba-attention-config '{"moba_encoder_top_k_left": 50, "moba_encoder_top_k_right": 60, "moba_decoder_top_k_left": 100, "moba_decoder_top_k_right": 120}' + --plas-attention-config '{"plas_encoder_top_k_left": 50, "plas_encoder_top_k_right": 60, "plas_decoder_top_k_left": 100, "plas_decoder_top_k_right": 120}' ``` -**Note**: If sparse attention is enabled, the system will automatically load the MLP weights from `moba_mlp_weight.safetensors` in the weight directory. If the MLP weight file is not found, mean pooling will be applied to the key representations. +**Note**: If sparse attention is enabled, the system will automatically load the MLP weights from `plas_attention_mlp_weight.safetensors` in the weight directory. If the MLP weight file is not found, mean pooling will be applied to the key representations. **Parameter Description:** -* Setting `FD_ATTENTION_BACKEND="MOBA_ATTN"` enables MOBA sparse attention. -* `moba_encoder_top_k_left=50, moba_encoder_top_k_right=60` indicates that the range of top-k is between 50 and 60 when the encoder is sparse. -* `moba_decoder_top_k_left=100, moba_decoder_top_k_right=120` indicates that the range of top-k is between 100 and 120 when the decoder is sparse. +* Setting `FD_ATTENTION_BACKEND="PLAS_ATTN"` enables PLAS sparse attention. +* `plas_encoder_top_k_left=50, plas_encoder_top_k_right=60` indicates that the range of top-k is between 50 and 60 when the encoder is sparse. +* `plas_decoder_top_k_left=100, plas_decoder_top_k_right=120` indicates that the range of top-k is between 100 and 120 when the decoder is sparse. diff --git a/docs/zh/features/plas_attention.md b/docs/zh/features/plas_attention.md index 09a98e6f4..06951c7a2 100644 --- a/docs/zh/features/plas_attention.md +++ b/docs/zh/features/plas_attention.md @@ -18,7 +18,7 @@ Attention Gate Module -* **Attention Gate Module**: 如上图所示,为了以较低的计算开销估计每个块的重要性,我们设计了一个轻量级的注意力门模块。该模块首先通过一个 MLP 层压缩每个 K 个块,生成一个具有代表性的低维表示:$K_c^T=W_{kp}K^T$,其中 $W_{kp}$ 表示 MLP 层的权重。与直接应用均值池化相比,可学习的 MLP 可以更有效地捕捉不同 token 之间的语义关系和重要性分布,从而提供每个块的精细表示。在获得压缩表示 $K_c$ 之后,通过以下公式估计每个查询 token 相对于每个块的重要性:$Softmax(Q\cdot K_c^T)$。为了增强 MLP 层的判别能力,我们使用一维最大池化后的完整注意力结果 $1DMaxPooling(Softmax(Q \cdot K^T))$ 作为 ground truth。通过最小化两者之间的分布差异,引导 MLP 层学习更符合真实注意力分布的特征表示。 +* **Attention Gate Module**: 如上图所示,为了以较低的计算开销估计每个块的重要性,我们设计了一个轻量级的注意力门模块。该模块首先通过一个MLP层压缩每个K个块,生成一个具有代表性的低维表示: $K_c^T=W_{kp}K^T$ ,其中 $W_{kp}$ 表示 MLP 层的权重。与直接应用均值池化相比,可学习的 MLP 可以更有效地捕捉不同 token 之间的语义关系和重要性分布,从而提供每个块的精细表示。在获得压缩表示 $K_c$ 之后,通过以下公式估计每个查询 token 相对于每个块的重要性:$Softmax(Q\cdot K_c^T)$。为了增强 MLP 层的判别能力,我们使用一维最大池化后的完整注意力结果 $1DMaxPooling(Softmax(Q \cdot K^T))$ 作为 ground truth。通过最小化两者之间的分布差异,引导 MLP 层学习更符合真实注意力分布的特征表示。 * **Training Data**: 得益于模型架构和训练范式的高效性,我们的方法仅使用 10 亿个 token 进行训练,便实现了近乎无损的精度。训练数据源自内部构建的包含长文本和短文本的混合语料库,从而增强了模块对不同序列长度的适应性。 @@ -36,7 +36,7 @@ * **Prefill Toke Union**: 我们观察到相邻的查询标记倾向于选择相似的关键块。利用这种局部性,我们取连续 128 个查询标记选择的关键块的并集,并联合计算这些标记的稀疏注意力机制。 -* **Decode Head Union**: 鉴于 GQA 在现代模型中的广泛应用,我们发现同一组内的不同查询头经常选择重叠的关键块。因此,我们将同一组内所有查询头选择的关键块合并为一个统一的集合,并联合计算稀疏注意力机制。这种方式也减少了内存访问开销,并进一步提高了解码效率。 +* **Decode Head Union**: 鉴于GQA在现代模型中的广泛应用,我们发现同一组内的不同查询头经常选择重叠的关键块。因此,我们将同一组内所有查询头选择的关键块合并为一个统一的集合,并联合计算稀疏注意力机制。这种方式也减少了内存访问开销,并进一步提高了解码效率。 * **Top-K Selection**: 传统的 Top-k 算法基于排序或直接调用 Cub 库,会带来显著的运行时开销。为了缓解这个问题,我们实现了一个基于二分查找的近似 Top-k 选择算法,该算法在保持准确率的同时显著降低了延迟,最终实现了性能的显著提升。 @@ -200,7 +200,7 @@ ## 使用方式 ``` -export FD_ATTENTION_BACKEND="MOBA_ATTN" +export FD_ATTENTION_BACKEND="PLAS_ATTN" python -m fastdeploy.entrypoints.openai.api_server --model baidu/ERNIE-4.5-300B-A47B-Paddle \ @@ -211,13 +211,13 @@ python -m fastdeploy.entrypoints.openai.api_server --max-num-batched-tokens 8192 \ --max-model-len 131072 \ --max-num-seqs 32 \ - --moba-attention-config '{"moba_encoder_top_k_left": 50, "moba_encoder_top_k_right": 60, "moba_decoder_top_k_left": 100, "moba_decoder_top_k_right": 120}' + --plas-attention-config '{"plas_encoder_top_k_left": 50, "plas_encoder_top_k_right": 60, "plas_decoder_top_k_left": 100, "plas_decoder_top_k_right": 120}' ``` -**Note**: 如果启用了稀疏注意力机制,系统将自动从权重目录中的`moba_mlp_weight.safetensors`文件加载 MLP 权重。如果未找到 MLP 权重文件,则将对关键表示应用均值池化 +**Note**: 如果启用了稀疏注意力机制,系统将自动从权重目录中的`plas_attention_mlp_weight.safetensors`文件加载 MLP 权重。如果未找到 MLP 权重文件,则将对关键表示应用均值池化 **Parameter Description:** -* `FD_ATTENTION_BACKEND="MOBA_ATTN"` 启用 MOBA sparse attention. -* `moba_encoder_top_k_left=50, moba_encoder_top_k_right=60` 表示当encoder时,top-k的范围在50到60之间。 -* `moba_decoder_top_k_left=100, moba_decoder_top_k_right=120` 表示当decoder时,top-k的范围在100到120之间。 +* `FD_ATTENTION_BACKEND="PLAS_ATTN"` 启用 PLAS sparse attention. +* `plas_encoder_top_k_left=50, plas_encoder_top_k_right=60` 表示当encoder时,top-k的范围在50到60之间。 +* `plas_decoder_top_k_left=100, plas_decoder_top_k_right=120` 表示当decoder时,top-k的范围在100到120之间。 diff --git a/fastdeploy/config.py b/fastdeploy/config.py index f1ee1d457..153403ee3 100644 --- a/fastdeploy/config.py +++ b/fastdeploy/config.py @@ -683,63 +683,63 @@ class GraphOptimizationConfig: argument = self.use_cudagraph -class MobaAttentionConfig: +class PlasAttentionConfig: def __init__( self, args, ): - self.moba_encoder_top_k_left: int = None - self.moba_encoder_top_k_right: int = None - "The sparse topk of encoder attention is located at [moba_encoder_top_k_left, moba_encoder top_k_right]" - self.moba_decoder_top_k_left: int = None - self.moba_decoder_top_k_right: int = None - "The sparse topk of decoder attention is located at [moba_decoder_top_k_left, moba_decoder top_k_right]" - self.moba_use_encoder_seq_limit: int = None - "When the number of encdoer token is less than moba_use_encoder_seq_limit, it is not sparse" - self.moba_use_decoder_seq_limit: int = None - "When the number of decdoer token is less than moba_use_decoder_seq_limit, it is not sparse" - self.moba_block_size: int = 128 - self.mlp_weight_name: str = "moba_mlp_weight.safetensors" - self.moba_max_seq_length: int = 128 * 1024 + self.plas_encoder_top_k_left: int = None + self.plas_encoder_top_k_right: int = None + "The sparse topk of encoder attention is located at [plas_encoder_top_k_left, plas_encoder top_k_right]" + self.plas_decoder_top_k_left: int = None + self.plas_decoder_top_k_right: int = None + "The sparse topk of decoder attention is located at [plas_decoder_top_k_left, plas_decoder top_k_right]" + self.plas_use_encoder_seq_limit: int = None + "When the number of encdoer token is less than plas_use_encoder_seq_limit, it is not sparse" + self.plas_use_decoder_seq_limit: int = None + "When the number of decdoer token is less than plas_use_decoder_seq_limit, it is not sparse" + self.plas_block_size: int = 128 + self.mlp_weight_name: str = "plas_attention_mlp_weight.safetensors" + self.plas_max_seq_length: int = 128 * 1024 if args is not None: for key, value in args.items(): if hasattr(self, key): setattr(self, key, value) - if self.moba_use_encoder_seq_limit is None and self.moba_encoder_top_k_left is not None: - self.moba_use_encoder_seq_limit = self.moba_encoder_top_k_left * self.moba_block_size - if self.moba_use_decoder_seq_limit is None and self.moba_decoder_top_k_left is not None: - self.moba_use_decoder_seq_limit = self.moba_decoder_top_k_left * self.moba_block_size + if self.plas_use_encoder_seq_limit is None and self.plas_encoder_top_k_left is not None: + self.plas_use_encoder_seq_limit = self.plas_encoder_top_k_left * self.plas_block_size + if self.plas_use_decoder_seq_limit is None and self.plas_decoder_top_k_left is not None: + self.plas_use_decoder_seq_limit = self.plas_decoder_top_k_left * self.plas_block_size self.check_legality_parameters() def check_legality_parameters( self, ) -> None: - if self.moba_encoder_top_k_left is not None: - assert self.moba_encoder_top_k_left > 0, "moba_encoder_top_k_left must large than 0" + if self.plas_encoder_top_k_left is not None: + assert self.plas_encoder_top_k_left > 0, "plas_encoder_top_k_left must large than 0" - if self.moba_encoder_top_k_right is not None: - assert self.moba_encoder_top_k_right > 0, "moba_encoder_top_k_right must large than 0" + if self.plas_encoder_top_k_right is not None: + assert self.plas_encoder_top_k_right > 0, "plas_encoder_top_k_right must large than 0" assert ( - self.moba_encoder_top_k_right >= self.moba_encoder_top_k_left - ), "moba_encoder_top_k_right must large than moba_encoder_top_k_left" + self.plas_encoder_top_k_right >= self.plas_encoder_top_k_left + ), "plas_encoder_top_k_right must large than plas_encoder_top_k_left" - if self.moba_decoder_top_k_left is not None: - assert self.moba_decoder_top_k_left > 0, "moba_decoder_top_k_left must large than 0" + if self.plas_decoder_top_k_left is not None: + assert self.plas_decoder_top_k_left > 0, "plas_decoder_top_k_left must large than 0" - if self.moba_decoder_top_k_right is not None: - assert self.moba_decoder_top_k_right > 0, "moba_decoder_top_k_right must large than 0" + if self.plas_decoder_top_k_right is not None: + assert self.plas_decoder_top_k_right > 0, "plas_decoder_top_k_right must large than 0" assert ( - self.moba_decoder_top_k_right >= self.moba_decoder_top_k_left - ), "moba_decoder_top_k_right must large than moba_decoder_top_k_left" + self.plas_decoder_top_k_right >= self.plas_decoder_top_k_left + ), "plas_decoder_top_k_right must large than plas_decoder_top_k_left" - if self.moba_use_encoder_seq_limit is not None and self.moba_encoder_top_k_left is not None: - assert self.moba_use_encoder_seq_limit >= self.moba_encoder_top_k_left * self.moba_block_size - if self.moba_use_decoder_seq_limit is not None and self.moba_decoder_top_k_left is not None: - assert self.moba_use_decoder_seq_limit >= self.moba_decoder_top_k_left * self.moba_block_size + if self.plas_use_encoder_seq_limit is not None and self.plas_encoder_top_k_left is not None: + assert self.plas_use_encoder_seq_limit >= self.plas_encoder_top_k_left * self.plas_block_size + if self.plas_use_decoder_seq_limit is not None and self.plas_decoder_top_k_left is not None: + assert self.plas_use_decoder_seq_limit >= self.plas_decoder_top_k_left * self.plas_block_size def to_json_string(self): """ - Convert moba_attention_config to json string. + Convert plas_attention_config to json string. """ return json.dumps({key: value for key, value in self.__dict__.items() if value is not None}) @@ -1098,7 +1098,7 @@ class FDConfig: decoding_config: DecodingConfig = None, quant_config: QuantConfigBase = None, graph_opt_config: GraphOptimizationConfig = None, - moba_attention_config: MobaAttentionConfig = None, + plas_attention_config: PlasAttentionConfig = None, speculative_config: SpeculativeConfig = None, tokenizer: str = None, max_model_len: int = 8192, @@ -1133,7 +1133,7 @@ class FDConfig: self.early_stop_config: Optional[EarlyStopConfig] = early_stop_config self.decoding_config: DecodingConfig = decoding_config # type: ignore self.cache_config: CacheConfig = cache_config # type: ignore - self.moba_attention_config: Optional[MobaAttentionConfig] = moba_attention_config + self.plas_attention_config: Optional[PlasAttentionConfig] = plas_attention_config # Initialize cuda graph capture list if self.graph_opt_config.cudagraph_capture_sizes is None: self.graph_opt_config._set_cudagraph_sizes(max_num_seqs=self.parallel_config.max_num_seqs) diff --git a/fastdeploy/engine/args_utils.py b/fastdeploy/engine/args_utils.py index bb6d57356..8ed63247f 100644 --- a/fastdeploy/engine/args_utils.py +++ b/fastdeploy/engine/args_utils.py @@ -29,9 +29,9 @@ from fastdeploy.config import ( FDConfig, GraphOptimizationConfig, LoadConfig, - MobaAttentionConfig, ModelConfig, ParallelConfig, + PlasAttentionConfig, SpeculativeConfig, TaskOption, ) @@ -344,9 +344,9 @@ class EngineArgs: """ Configuration for graph optimization backend execution. """ - moba_attention_config: Optional[Dict[str, Any]] = None + plas_attention_config: Optional[Dict[str, Any]] = None """ - Configuration for moba attention. + Configuration for plas attention. """ enable_logprob: bool = False @@ -571,9 +571,9 @@ class EngineArgs: help="", ) model_group.add_argument( - "--moba-attention-config", + "--plas-attention-config", type=json.loads, - default=EngineArgs.moba_attention_config, + default=EngineArgs.plas_attention_config, help="", ) model_group.add_argument( @@ -971,17 +971,17 @@ class EngineArgs: graph_optimization_args[k] = v return GraphOptimizationConfig(graph_optimization_args) - def create_moba_attention_config(self) -> MobaAttentionConfig: + def create_plas_attention_config(self) -> PlasAttentionConfig: """ - Create and retuan a MobaAttentionConfig object based on the current settings. + Create and retuan a PlasAttentionConfig object based on the current settings. """ attention_args = asdict(self) - if self.moba_attention_config is not None: - for k, v in self.moba_attention_config.items(): + if self.plas_attention_config is not None: + for k, v in self.plas_attention_config.items(): attention_args[k] = v - return MobaAttentionConfig(attention_args) + return PlasAttentionConfig(attention_args) else: - return MobaAttentionConfig(None) + return PlasAttentionConfig(None) def create_early_stop_config(self) -> EarlyStopConfig: """ @@ -1037,7 +1037,7 @@ class EngineArgs: scheduler_cfg = self.create_scheduler_config() graph_opt_cfg = self.create_graph_optimization_config() graph_opt_cfg.update_use_cudagraph(self.use_cudagraph) - moba_attention_config = self.create_moba_attention_config() + plas_attention_config = self.create_plas_attention_config() early_stop_cfg = self.create_early_stop_config() early_stop_cfg.update_enable_early_stop(self.enable_early_stop) @@ -1075,7 +1075,7 @@ class EngineArgs: max_long_partial_prefills=self.max_long_partial_prefills, long_prefill_token_threshold=self.long_prefill_token_threshold, graph_opt_config=graph_opt_cfg, - moba_attention_config=moba_attention_config, + plas_attention_config=plas_attention_config, guided_decoding_backend=self.guided_decoding_backend, disable_any_whitespace=self.guided_decoding_disable_any_whitespace, early_stop_config=early_stop_cfg, diff --git a/fastdeploy/engine/engine.py b/fastdeploy/engine/engine.py index d9c6e49f4..05f5eda70 100644 --- a/fastdeploy/engine/engine.py +++ b/fastdeploy/engine/engine.py @@ -471,7 +471,7 @@ class LLMEngine: f" --load_strategy {self.cfg.load_config.load_strategy}" f" --early_stop_config '{self.cfg.early_stop_config.to_json_string()}'" f" --load_choices {self.cfg.load_config.load_choices}" - f" --moba_attention_config '{self.cfg.moba_attention_config.to_json_string()}'" + f" --plas_attention_config '{self.cfg.plas_attention_config.to_json_string()}'" f" --ips {ips}" ) diff --git a/fastdeploy/model_executor/layers/attention/__init__.py b/fastdeploy/model_executor/layers/attention/__init__.py index 7157ac63b..cbc6152aa 100644 --- a/fastdeploy/model_executor/layers/attention/__init__.py +++ b/fastdeploy/model_executor/layers/attention/__init__.py @@ -20,7 +20,7 @@ from .block_multihead_attn_backend import BlockAttentionBackend from .flash_attn_backend import FlashAttentionBackend from .iluvatar_attn_backend import IluvatarAttnBackend from .mla_attention_backend import MLAAttentionBackend -from .moba_attention_backend import MobaAttentionBackend +from .moba_attention_backend import PlasAttentionBackend from .native_paddle_backend import PaddleNativeAttnBackend from .xpu_attn_backend import XPUAttentionBackend @@ -35,5 +35,5 @@ __all__ = [ "IluvatarAttnBackend", "BlockAttentionBackend", "Attention", - "MobaAttentionBackend", + "PlasAttentionBackend", ] diff --git a/fastdeploy/model_executor/layers/attention/attention.py b/fastdeploy/model_executor/layers/attention/attention.py index 7b3581de2..58d232fca 100644 --- a/fastdeploy/model_executor/layers/attention/attention.py +++ b/fastdeploy/model_executor/layers/attention/attention.py @@ -119,19 +119,19 @@ class Attention(nn.Layer): self.init_weight() if ( - fd_config.moba_attention_config is not None - and fd_config.moba_attention_config.moba_encoder_top_k_left is not None - and fd_config.moba_attention_config.moba_encoder_top_k_right is not None - and fd_config.moba_attention_config.moba_decoder_top_k_left is not None - and fd_config.moba_attention_config.moba_decoder_top_k_right is not None + fd_config.plas_attention_config is not None + and fd_config.plas_attention_config.plas_encoder_top_k_left is not None + and fd_config.plas_attention_config.plas_encoder_top_k_right is not None + and fd_config.plas_attention_config.plas_decoder_top_k_left is not None + and fd_config.plas_attention_config.plas_decoder_top_k_right is not None ): mlp_weight_path = os.path.join( - fd_config.model_config.model, fd_config.moba_attention_config.mlp_weight_name + fd_config.model_config.model, fd_config.plas_attention_config.mlp_weight_name ) - self.moba_use_mlp = mlp_weight_path is not None and os.path.exists(mlp_weight_path) - moba_block_size = fd_config.moba_attention_config.moba_block_size - moba_max_seq_length = fd_config.moba_attention_config.moba_max_seq_length - if self.moba_use_mlp: + self.plas_use_mlp = mlp_weight_path is not None and os.path.exists(mlp_weight_path) + plas_block_size = fd_config.plas_attention_config.plas_block_size + plas_max_seq_length = fd_config.plas_attention_config.plas_max_seq_length + if self.plas_use_mlp: mlp_weight = {} with safe_open(mlp_weight_path, framework="np", device="cpu") as f: for key_name in f.keys(): @@ -148,12 +148,12 @@ class Attention(nn.Layer): * self.kv_num_heads : (fd_config.parallel_config.tensor_parallel_rank + 1) * self.kv_num_heads ] - assert self.attn_gate_weight.shape[1] % moba_block_size == 0 + assert self.attn_gate_weight.shape[1] % plas_block_size == 0 self.cache_k_block_means = paddle.zeros( [ fd_config.parallel_config.max_num_seqs, - moba_max_seq_length // moba_block_size, + plas_max_seq_length // plas_block_size, self.kv_num_heads, self.head_dim, ], diff --git a/fastdeploy/model_executor/layers/attention/moba_attention_backend.py b/fastdeploy/model_executor/layers/attention/moba_attention_backend.py index 7ddba90d1..0151e7aec 100644 --- a/fastdeploy/model_executor/layers/attention/moba_attention_backend.py +++ b/fastdeploy/model_executor/layers/attention/moba_attention_backend.py @@ -39,7 +39,7 @@ from fastdeploy.model_executor.layers.attention.base_attention_backend import ( @dataclass -class MobaAttentionMetadata(AttentionMetadata): +class PlasAttentionMetadata(AttentionMetadata): """ AppendAttentionMetadata """ @@ -54,7 +54,7 @@ class MobaAttentionMetadata(AttentionMetadata): max_dec_len_this_time: int = 0 -class MobaAttentionBackend(AttentionBackend): +class PlasAttentionBackend(AttentionBackend): """ The backend class that uses paddle native attention implementation. Which is used only for testing purpose. @@ -70,11 +70,11 @@ class MobaAttentionBackend(AttentionBackend): decoder_block_shape_q: int = -1, ) -> None: """ - MobaAttentionBackend __init__ + PlasAttentionBackend __init__ """ super().__init__() - self.attention_metadata: MobaAttentionMetadata = None - assert fd_config.moba_attention_config is not None, "moba_attention_config is None" + self.attention_metadata: PlasAttentionMetadata = None + assert fd_config.plas_attention_config is not None, "plas_attention_config is None" self.block_size = fd_config.parallel_config.block_size self.max_seq_len = fd_config.parallel_config.max_model_len self.max_num_seqs = fd_config.parallel_config.max_num_seqs @@ -83,18 +83,18 @@ class MobaAttentionBackend(AttentionBackend): self.head_dim = fd_config.model_config.head_dim self.num_layers: int = fd_config.model_config.num_hidden_layers self.attn_block_m = 128 - self.moba_block_size = fd_config.moba_attention_config.moba_block_size - self.moba_encoder_top_k_left = int(fd_config.moba_attention_config.moba_encoder_top_k_left) - self.moba_encoder_top_k_right = int(fd_config.moba_attention_config.moba_encoder_top_k_right) - self.moba_use_encoder_seq_limit = int(fd_config.moba_attention_config.moba_use_encoder_seq_limit) - self.moba_decoder_top_k_left = int(fd_config.moba_attention_config.moba_decoder_top_k_left) - self.moba_decoder_top_k_right = int(fd_config.moba_attention_config.moba_decoder_top_k_right) - self.moba_use_decoder_seq_limit = int(fd_config.moba_attention_config.moba_use_decoder_seq_limit) - self.moba_max_seq_length = fd_config.moba_attention_config.moba_max_seq_length + self.plas_block_size = fd_config.plas_attention_config.plas_block_size + self.plas_encoder_top_k_left = int(fd_config.plas_attention_config.plas_encoder_top_k_left) + self.plas_encoder_top_k_right = int(fd_config.plas_attention_config.plas_encoder_top_k_right) + self.plas_use_encoder_seq_limit = int(fd_config.plas_attention_config.plas_use_encoder_seq_limit) + self.plas_decoder_top_k_left = int(fd_config.plas_attention_config.plas_decoder_top_k_left) + self.plas_decoder_top_k_right = int(fd_config.plas_attention_config.plas_decoder_top_k_right) + self.plas_use_decoder_seq_limit = int(fd_config.plas_attention_config.plas_use_decoder_seq_limit) + self.plas_max_seq_length = fd_config.plas_attention_config.plas_max_seq_length def init_attention_metadata(self, forward_meta: ForwardMeta): """Init the metadata for a forward pass.""" - metadata = MobaAttentionMetadata() + metadata = PlasAttentionMetadata() metadata._dtype = paddle.get_default_dtype() metadata.cu_seq_q_pack, metadata.cu_seqlens_k, metadata.q_pack_tokens = get_cur_cu_seq_len_k( forward_meta.seq_lens_encoder, @@ -116,7 +116,7 @@ class MobaAttentionBackend(AttentionBackend): [k_token_num + self.attn_block_m, self.kv_num_heads * self.head_dim], dtype=metadata._dtype ) self.attention_metadata = metadata - assert self.max_seq_len <= self.moba_max_seq_length + assert self.max_seq_len <= self.plas_max_seq_length def get_kv_cache_shape( self, @@ -186,13 +186,13 @@ class MobaAttentionBackend(AttentionBackend): self.max_seq_len, attention_metadata.max_enc_len_this_time, attention_metadata.max_dec_len_this_time, - self.moba_encoder_top_k_left, - self.moba_encoder_top_k_right, - self.moba_use_encoder_seq_limit, - self.moba_decoder_top_k_left, - self.moba_decoder_top_k_right, - self.moba_use_decoder_seq_limit, - layer.moba_use_mlp, + self.plas_encoder_top_k_left, + self.plas_encoder_top_k_right, + self.plas_use_encoder_seq_limit, + self.plas_decoder_top_k_left, + self.plas_decoder_top_k_right, + self.plas_use_decoder_seq_limit, + layer.plas_use_mlp, getattr(layer, "cache_quant_type_str", "none"), )[0] return out diff --git a/fastdeploy/platforms/base.py b/fastdeploy/platforms/base.py index a0e13f9c7..478bb7b62 100644 --- a/fastdeploy/platforms/base.py +++ b/fastdeploy/platforms/base.py @@ -26,7 +26,7 @@ class _Backend(enum.Enum): MLA_ATTN = enum.auto() FLASH_ATTN = enum.auto() BLOCK_ATTN = enum.auto() - MOBA_ATTN = enum.auto() + PLAS_ATTN = enum.auto() class Platform: diff --git a/fastdeploy/platforms/cuda.py b/fastdeploy/platforms/cuda.py index a9e070755..9720e7ace 100644 --- a/fastdeploy/platforms/cuda.py +++ b/fastdeploy/platforms/cuda.py @@ -64,9 +64,9 @@ class CUDAPlatform(Platform): elif selected_backend == _Backend.FLASH_ATTN: logger.info("Using FLASH ATTN backend.") return "fastdeploy.model_executor.layers.attention.FlashAttentionBackend" - elif selected_backend == _Backend.MOBA_ATTN: - logger.info("Using MOBA ATTN backend.") - return "fastdeploy.model_executor.layers.attention.MobaAttentionBackend" + elif selected_backend == _Backend.PLAS_ATTN: + logger.info("Using PLAS ATTN backend.") + return "fastdeploy.model_executor.layers.attention.PlasAttentionBackend" else: raise ValueError( "Invalid attention backend you specified.\n" diff --git a/fastdeploy/rl/rollout_config.py b/fastdeploy/rl/rollout_config.py index 1fe797868..3cd2771fc 100644 --- a/fastdeploy/rl/rollout_config.py +++ b/fastdeploy/rl/rollout_config.py @@ -59,7 +59,7 @@ class RolloutModelConfig: graph_optimization_config: str = None, early_stop_config: str = None, local_rank: int = 0, - moba_attention_config: str = None, + plas_attention_config: str = None, data_parallel_size: int = 1, ): # Required parameters @@ -106,7 +106,7 @@ class RolloutModelConfig: self.local_rank = local_rank self.early_stop_config = early_stop_config self.ips = None - self.moba_attention_config = moba_attention_config + self.plas_attention_config = plas_attention_config def __str__(self): return "\n".join(f"{k}: {v}" for k, v in self.__dict__.items()) diff --git a/fastdeploy/worker/worker_process.py b/fastdeploy/worker/worker_process.py index 8a0ff6f09..0aba37d26 100644 --- a/fastdeploy/worker/worker_process.py +++ b/fastdeploy/worker/worker_process.py @@ -34,9 +34,9 @@ from fastdeploy.config import ( FDConfig, GraphOptimizationConfig, LoadConfig, - MobaAttentionConfig, ModelConfig, ParallelConfig, + PlasAttentionConfig, SpeculativeConfig, ) from fastdeploy.input.ernie4_5_tokenizer import Ernie4_5Tokenizer @@ -560,10 +560,10 @@ def parse_args(): help="Configation of Graph optimization backend.", ) parser.add_argument( - "--moba_attention_config", + "--plas_attention_config", type=json.loads, default=None, - help="Configation of moba attention.", + help="Configation of plas attention.", ) parser.add_argument( "--guided_decoding_backend", @@ -672,7 +672,7 @@ def initialize_fd_config(args, ranks: int = 1, local_rank: int = 0) -> FDConfig: graph_opt_config = GraphOptimizationConfig(args.graph_optimization_config) - moba_attention_config = MobaAttentionConfig(args.moba_attention_config) + plas_attention_config = PlasAttentionConfig(args.plas_attention_config) early_stop_config = EarlyStopConfig(args.early_stop_config) @@ -772,7 +772,7 @@ def initialize_fd_config(args, ranks: int = 1, local_rank: int = 0) -> FDConfig: cache_config=cache_config, engine_worker_queue_port=args.engine_worker_queue_port, ips=args.ips, - moba_attention_config=moba_attention_config, + plas_attention_config=plas_attention_config, ) update_fd_config_for_mm(fd_config) diff --git a/tests/layers/test_moba_attention.py b/tests/layers/test_plas_attention.py similarity index 83% rename from tests/layers/test_moba_attention.py rename to tests/layers/test_plas_attention.py index b19485042..9de05578a 100644 --- a/tests/layers/test_moba_attention.py +++ b/tests/layers/test_plas_attention.py @@ -57,7 +57,7 @@ def naive_attn(q_input, k_input, v_input, mask): return out -class TestMobaAttention(unittest.TestCase): +class TestPlasAttention(unittest.TestCase): def setUp(self): paddle.seed(0) self.seq_len = int(8 * 1024) @@ -65,15 +65,15 @@ class TestMobaAttention(unittest.TestCase): self.num_kv_heads = int(1) self.head_dim = int(128) self.max_num_seqs = 1 - self.moba_max_seq_length = int(128 * 1024) - self.moba_block_size = int(128) - self.moba_encoder_top_k_left = 2 - self.moba_encoder_top_k_right = 3 - self.moba_use_encoder_seq_limit = int(4 * 1024) + self.plas_max_seq_length = int(128 * 1024) + self.plas_block_size = int(128) + self.plas_encoder_top_k_left = 2 + self.plas_encoder_top_k_right = 3 + self.plas_use_encoder_seq_limit = int(4 * 1024) self.cache_k_block_means = paddle.zeros( [ self.max_num_seqs, - self.moba_max_seq_length // self.moba_block_size, + self.plas_max_seq_length // self.plas_block_size, self.num_kv_heads, self.head_dim, ], @@ -96,12 +96,12 @@ class TestMobaAttention(unittest.TestCase): self.rotary_embs = paddle.ones([2, self.seq_len, self.head_dim // 2], dtype="float32") self.attn_gate_weight = paddle.randn( - [self.num_kv_heads, self.moba_block_size, self.head_dim], dtype="bfloat16" + [self.num_kv_heads, self.plas_block_size, self.head_dim], dtype="bfloat16" ) self.gqa_group_size = self.num_heads // self.num_kv_heads - self.num_blocks = (self.seq_len + self.moba_block_size - 1) // self.moba_block_size + self.num_blocks = (self.seq_len + self.plas_block_size - 1) // self.plas_block_size self.sparse_step = 4 @@ -115,38 +115,38 @@ class TestMobaAttention(unittest.TestCase): for i in range(self.max_num_seqs): k_padding = paddle.zeros( [ - (self.seq_len + self.moba_block_size - 1) // self.moba_block_size * self.moba_block_size, + (self.seq_len + self.plas_block_size - 1) // self.plas_block_size * self.plas_block_size, self.num_kv_heads, self.head_dim, ], dtype="bfloat16", ) k_padding[0 : self.seq_len] = self.k_input[i * self.seq_len : (i + 1) * self.seq_len] - real_k_block_means = k_padding.reshape([-1, self.moba_block_size, self.num_kv_heads, self.head_dim]) + real_k_block_means = k_padding.reshape([-1, self.plas_block_size, self.num_kv_heads, self.head_dim]) real_k_block_means = real_k_block_means.mean(axis=1) compute_k_block_means = self.cache_k_block_means[i, 0 : real_k_block_means.shape[0]] assert (compute_k_block_means - real_k_block_means).abs().max() < 0.003 - print("[consistency]Moba attention: split_qkv_rope matches.") + print("[consistency]plas attention: split_qkv_rope matches.") def compare_mlp_einsum(self, k_gate_weight): for i in range(self.max_num_seqs): k_padding = paddle.zeros( [ - (self.seq_len + self.moba_block_size - 1) // self.moba_block_size * self.moba_block_size, + (self.seq_len + self.plas_block_size - 1) // self.plas_block_size * self.plas_block_size, self.num_kv_heads, self.head_dim, ], dtype="bfloat16", ) k_padding[0 : self.seq_len] = self.k_input[i * self.seq_len : (i + 1) * self.seq_len] - k_padding = k_padding.reshape([-1, self.moba_block_size, self.num_kv_heads, self.head_dim]) + k_padding = k_padding.reshape([-1, self.plas_block_size, self.num_kv_heads, self.head_dim]) real_result = paddle.einsum("nbhd,hbd->nhd", k_padding, self.attn_gate_weight) compute_result = k_gate_weight[i][0 : real_result.shape[0]] assert (real_result - compute_result).abs().max() < 0.5 - print("[consistency]Moba attention: MLP einsum matches.") + print("[consistency]plas attention: MLP einsum matches.") def compare_qk_gemm(self, qk_gate_weight): for i in range(self.max_num_seqs): @@ -170,10 +170,10 @@ class TestMobaAttention(unittest.TestCase): conpute_result = qk_gate_weight[i * self.seq_len : (i + 1) * self.seq_len, :, 0 : self.num_blocks] assert (qk_gemm_out - conpute_result).abs().max() < 1e-4 - print("[consistency]Moba attention: qk_gemm matches.") + print("[consistency]plas attention: qk_gemm matches.") def compare_qk_gate_topk(self, qk_gate_topk_idx): - limit_topk = self.moba_use_encoder_seq_limit // self.moba_block_size + limit_topk = self.plas_use_encoder_seq_limit // self.plas_block_size for i in range(self.max_num_seqs): qk_gate_topk_idx_batch = qk_gate_topk_idx[i * self.num_blocks : (i + 1) * self.num_blocks] qk_gate_topk_idx_batch_no_sparse = qk_gate_topk_idx_batch[0 : limit_topk - 1] @@ -191,40 +191,40 @@ class TestMobaAttention(unittest.TestCase): - paddle.ones(qk_gate_topk_idx_batch_sparse.shape, qk_gate_topk_idx_batch_sparse.dtype) * self.sparse_step ).abs().max() < 1e-6 - print("[consistency]Moba attention: qk_gate_topk matches.") + print("[consistency]plas attention: qk_gate_topk matches.") def compare_attn(self, attn_out, qk_gate_topk_idx): x = ( - paddle.tensor.triu(paddle.ones([self.moba_block_size, self.moba_block_size], dtype="bfloat16"), 1) + paddle.tensor.triu(paddle.ones([self.plas_block_size, self.plas_block_size], dtype="bfloat16"), 1) * -1000000 ) - limit_topk = self.moba_use_encoder_seq_limit // self.moba_block_size + limit_topk = self.plas_use_encoder_seq_limit // self.plas_block_size for i in range(self.max_num_seqs): q_input = self.q_input[i * self.seq_len : (i + 1) * self.seq_len].unsqueeze(axis=0) k_input = self.k_input[i * self.seq_len : (i + 1) * self.seq_len].unsqueeze(axis=0) v_input = self.v_input[i * self.seq_len : (i + 1) * self.seq_len].unsqueeze(axis=0) mask = paddle.tensor.triu(paddle.ones([self.seq_len, self.seq_len], dtype="bfloat16"), 1) * -1000000 - mask[self.moba_use_encoder_seq_limit - self.moba_block_size :] = -1000000 + mask[self.plas_use_encoder_seq_limit - self.plas_block_size :] = -1000000 for i in range(limit_topk - 1, self.num_blocks): n_block = i mask[ - i * self.moba_block_size : i * self.moba_block_size + self.moba_block_size, - n_block * self.moba_block_size : n_block * self.moba_block_size + self.moba_block_size, + i * self.plas_block_size : i * self.plas_block_size + self.plas_block_size, + n_block * self.plas_block_size : n_block * self.plas_block_size + self.plas_block_size, ] = x idx = 0 n_block -= int(qk_gate_topk_idx[i, 0, idx]) idx += 1 while n_block >= 0: mask[ - i * self.moba_block_size : i * self.moba_block_size + self.moba_block_size, - n_block * self.moba_block_size : n_block * self.moba_block_size + self.moba_block_size, + i * self.plas_block_size : i * self.plas_block_size + self.plas_block_size, + n_block * self.plas_block_size : n_block * self.plas_block_size + self.plas_block_size, ] = 0 n_block -= int(qk_gate_topk_idx[i, 0, idx]) idx += 1 naive_attn_out = naive_attn(q_input, k_input, v_input, mask).squeeze(axis=0).transpose([1, 0, 2]) assert (attn_out - naive_attn_out).abs().max() < 0.016 - def test_moba_attention(self): + def test_plas_attention(self): qkv_out = paddle.randn([self.tokens, self.num_heads + 2 * self.num_kv_heads, self.head_dim], dtype="bfloat16") seq_len_encoder = paddle.to_tensor([self.seq_len] * self.max_num_seqs, dtype="int32") @@ -255,7 +255,7 @@ class TestMobaAttention(unittest.TestCase): self.num_heads, self.num_kv_heads, self.head_dim, - self.moba_max_seq_length, + self.plas_max_seq_length, self.seq_len, self.seq_len, "none", @@ -307,9 +307,9 @@ class TestMobaAttention(unittest.TestCase): self.seq_len, self.num_heads, self.num_kv_heads, - self.moba_encoder_top_k_left, - self.moba_encoder_top_k_right, - self.moba_use_encoder_seq_limit, + self.plas_encoder_top_k_left, + self.plas_encoder_top_k_right, + self.plas_use_encoder_seq_limit, ) self.compare_qk_gate_topk(qk_gate_topk_idx) @@ -332,7 +332,7 @@ class TestMobaAttention(unittest.TestCase): self.num_heads, self.num_kv_heads, self.head_dim, - self.moba_max_seq_length, + self.plas_max_seq_length, ) self.compare_attn(attn_out, qk_gate_topk_idx) @@ -340,18 +340,18 @@ class TestMobaAttention(unittest.TestCase): def test_server(self): if get_cur_cu_seq_len_k is None: return - os.environ["FD_ATTENTION_BACKEND"] = "MOBA_ATTN" + os.environ["FD_ATTENTION_BACKEND"] = "PLAS_ATTN" base_path = os.getenv("MODEL_PATH") if base_path: model_path = os.path.join(base_path, "./ernie-4_5-21b-a3b-bf16-paddle") else: model_path = "./ernie-4_5-21b-a3b-bf16-paddle" - moba_attention_config = { - "moba_encoder_top_k_left": 50, - "moba_encoder_top_k_right": 60, - "moba_decoder_top_k_left": 100, - "moba_decoder_top_k_right": 120, + plas_attention_config = { + "plas_encoder_top_k_left": 50, + "plas_encoder_top_k_right": 60, + "plas_decoder_top_k_left": 100, + "plas_decoder_top_k_right": 120, } # 加载模型 @@ -365,7 +365,7 @@ class TestMobaAttention(unittest.TestCase): quantization="wint4", enable_chunked_prefill=True, max_num_batched_tokens=8192, - moba_attention_config=moba_attention_config, + plas_attention_config=plas_attention_config, ) prompts = ["Hello world!"] From 7272afe3dccc5de500b923b50b0eef832686d58c Mon Sep 17 00:00:00 2001 From: Yuanle Liu Date: Wed, 10 Sep 2025 12:49:03 +0800 Subject: [PATCH 18/36] Fix down projection weight shape in fused MOE layer (#4041) --- .../model_executor/layers/moe/fused_moe_triton_backend.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/fastdeploy/model_executor/layers/moe/fused_moe_triton_backend.py b/fastdeploy/model_executor/layers/moe/fused_moe_triton_backend.py index 1b0e3a7cb..06e7d3670 100644 --- a/fastdeploy/model_executor/layers/moe/fused_moe_triton_backend.py +++ b/fastdeploy/model_executor/layers/moe/fused_moe_triton_backend.py @@ -695,7 +695,7 @@ class BlockWiseFP8MoEMethod(QuantMethodBase): layer, down_proj_weight_name, layer.create_parameter( - shape=self.up_gate_proj_weight_shape, + shape=self.down_proj_weight_shape, dtype=self.weight_dtype, default_initializer=paddle.nn.initializer.Constant(0), ), From a6b161b0077c1885fd0c05d5fc99766cb3d4c14a Mon Sep 17 00:00:00 2001 From: ltd0924 <32387785+ltd0924@users.noreply.github.com> Date: Wed, 10 Sep 2025 13:48:17 +0800 Subject: [PATCH 19/36] [Fix] fix multi api server log dir (#3966) * fix scheduler bug * fix * Update api_server.py * Update multi_api_server.py * [Fix] --- fastdeploy/entrypoints/openai/multi_api_server.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/fastdeploy/entrypoints/openai/multi_api_server.py b/fastdeploy/entrypoints/openai/multi_api_server.py index 16a61de94..a34cb137a 100644 --- a/fastdeploy/entrypoints/openai/multi_api_server.py +++ b/fastdeploy/entrypoints/openai/multi_api_server.py @@ -51,7 +51,7 @@ def start_servers(server_count, server_args, ports, metrics_ports, controller_po controller_port = int(controller_ports[i]) env = os.environ.copy() - env["FD_LOG_DIR"] = f"log_{i}" + env["FD_LOG_DIR"] = env.get("FD_LOG_DIR", "log") + f"/log_{i}" cmd = [ sys.executable, "-m", From c4098d56a0212f0e6cdc912fe76ebc869e62a700 Mon Sep 17 00:00:00 2001 From: guozhuangzhuang <61482277+zhuangzhuang12@users.noreply.github.com> Date: Wed, 10 Sep 2025 13:48:24 +0800 Subject: [PATCH 20/36] =?UTF-8?q?Fixed=20the=20issue=20of=20metrics=20file?= =?UTF-8?q?=20conflicts=20between=20multiple=20instances=20=E2=80=A6=20(#4?= =?UTF-8?q?010)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * Fixed the issue of metrics file conflicts between multiple instances on a single machine * Use uuid to name the metrics shared folder * Use uuid to name the metrics shared folder --- fastdeploy/metrics/metrics.py | 27 ++++++++++++--------------- 1 file changed, 12 insertions(+), 15 deletions(-) diff --git a/fastdeploy/metrics/metrics.py b/fastdeploy/metrics/metrics.py index 0798d89af..ca8b6b391 100644 --- a/fastdeploy/metrics/metrics.py +++ b/fastdeploy/metrics/metrics.py @@ -19,6 +19,7 @@ metrics """ import os import shutil +import uuid from typing import Set from prometheus_client import ( @@ -35,24 +36,20 @@ from fastdeploy.metrics import build_1_2_5_buckets from fastdeploy.metrics.work_metrics import work_process_metrics -def cleanup_prometheus_files(is_main): +def cleanup_prometheus_files(is_main: bool, instance_id: str = None): """ Cleans and recreates the Prometheus multiprocess directory. - - Depending on whether it's the main process or a worker, this function removes the corresponding - Prometheus multiprocess directory (/tmp/prom_main or /tmp/prom_worker) and recreates it as an empty directory. - - Args: - is_main (bool): Indicates whether the current process is the main process. - - Returns: - str: The path to the newly created Prometheus multiprocess directory. """ - PROM_DIR = "/tmp/prom_main" if is_main else "/tmp/prom_worker" - if os.path.exists(PROM_DIR): - shutil.rmtree(PROM_DIR) - os.makedirs(PROM_DIR, exist_ok=True) - return PROM_DIR + base_dir = "/tmp/prom_main" if is_main else "/tmp/prom_worker" + if instance_id is None: + instance_id = str(uuid.uuid4()) + prom_dir = f"{base_dir}_{instance_id}" + + if os.path.exists(prom_dir): + shutil.rmtree(prom_dir, ignore_errors=True) + os.makedirs(prom_dir, exist_ok=True) + + return prom_dir class SimpleCollector(Collector): From 4f8ff478b3d0105473826b5994f653ec15093afa Mon Sep 17 00:00:00 2001 From: chenjian <1435317881@qq.com> Date: Wed, 10 Sep 2025 16:01:13 +0800 Subject: [PATCH 21/36] [Feature] Support mixed deployment with yiyan adapter in release22 (#3974) * [Feature] Support mixed deployment with yiyan adapter in release2.2 * [Feature] Support mixed deployment with yiyan adapter in release2.2 * fix metrics * add unit test * add unit test * add unit test * add unit test * add unit test * add unit test --- fastdeploy/engine/common_engine.py | 38 ++- fastdeploy/entrypoints/engine_client.py | 4 +- fastdeploy/envs.py | 8 + fastdeploy/inter_communicator/__init__.py | 13 +- fastdeploy/inter_communicator/zmq_client.py | 195 +++-------- fastdeploy/inter_communicator/zmq_server.py | 307 ++++++++++++++++++ fastdeploy/output/token_processor.py | 2 + fastdeploy/scheduler/local_scheduler.py | 3 + .../splitwise/internal_adapter_utils.py | 118 +++++++ .../test_eblite_serving.py | 250 ++++++++++++++ .../ci_use/EB_Lite_with_adapter/zmq_client.py | 121 +++++++ 11 files changed, 892 insertions(+), 167 deletions(-) create mode 100644 fastdeploy/inter_communicator/zmq_server.py create mode 100644 fastdeploy/splitwise/internal_adapter_utils.py create mode 100644 tests/ci_use/EB_Lite_with_adapter/test_eblite_serving.py create mode 100644 tests/ci_use/EB_Lite_with_adapter/zmq_client.py diff --git a/fastdeploy/engine/common_engine.py b/fastdeploy/engine/common_engine.py index dc13c74f0..64a0be4eb 100644 --- a/fastdeploy/engine/common_engine.py +++ b/fastdeploy/engine/common_engine.py @@ -37,12 +37,14 @@ from fastdeploy.inter_communicator import ( EngineCacheQueue, EngineWorkerQueue, IPCSignal, - ZmqClient, + ZmqIpcServer, + ZmqTcpServer, ) from fastdeploy.metrics.metrics import main_process_metrics from fastdeploy.metrics.trace_util import start_span, start_span_request from fastdeploy.model_executor.guided_decoding import schema_checker from fastdeploy.output.token_processor import TokenProcessor +from fastdeploy.splitwise.internal_adapter_utils import InternalAdapter from fastdeploy.splitwise.splitwise_connector import SplitwiseConnector from fastdeploy.utils import EngineError, envs, llm_logger @@ -573,9 +575,19 @@ class EngineSevice: if api_server_pid is None: return self.api_server_pid = api_server_pid - self.zmq_server = ZmqClient(name=api_server_pid, mode=zmq.PULL) - self.zmq_server.start_server() - self.zmq_server.create_router() + if envs.FD_ENABLE_INTERNAL_ADAPTER: + self.recv_request_server = ZmqTcpServer(port=envs.FD_ZMQ_RECV_REQUEST_SERVER_PORT, mode=zmq.PULL) + self.send_response_server = ZmqTcpServer(port=envs.FD_ZMQ_SEND_RESPONSE_SERVER_PORT, mode=zmq.ROUTER) + self.internal_adapter = InternalAdapter( + cfg=self.cfg, engine=self, dp_rank=self.cfg.node_rank * self.cfg.worker_num_per_node + ) + else: + self.recv_request_server = ZmqIpcServer(name=api_server_pid, mode=zmq.PULL) + self.send_response_server = ZmqIpcServer(name=api_server_pid, mode=zmq.ROUTER) + self.recv_result_handle_thread = threading.Thread( + target=self.send_response_server.recv_result_handle, daemon=True + ) + self.recv_result_handle_thread.start() time.sleep(3) self.insert_task_to_scheduler_thread = threading.Thread(target=self._insert_zmq_task_to_scheduler, daemon=True) self.insert_task_to_scheduler_thread.start() @@ -589,11 +601,11 @@ class EngineSevice: try: block = True if len(added_requests) == 0 else False if not self.cfg.model_config.enable_mm: - err, data = self.zmq_server.receive_json_once(block) + err, data = self.recv_request_server.receive_json_once(block) else: - err, data = self.zmq_server.receive_pyobj_once(block) + err, data = self.recv_request_server.receive_pyobj_once(block) if err is not None: - llm_logger.error("Engine stops inserting zmq task into scheduler, err:{err}") + llm_logger.error(f"Engine stops inserting zmq task into scheduler, err:{err}") break request, insert_task = None, [] @@ -645,7 +657,7 @@ class EngineSevice: ) # Since the request is not in scheduler # Send result by zmq directly - self.zmq_server.send_multipart(request_id, [error_result]) + self.send_response_server.send_response(request_id, [error_result]) except Exception as e: llm_logger.error( f"Error happend while receving new request from zmq, details={e}, " @@ -663,7 +675,7 @@ class EngineSevice: time.sleep(0.005) continue for request_id, contents in results.items(): - self.zmq_server.send_multipart(request_id, contents) + self.send_response_server.send_response(request_id, contents) except Exception as e: llm_logger.error(f"Unexcepted error happend: {e}, {traceback.format_exc()!s}") @@ -763,5 +775,9 @@ class EngineSevice: self.worker_healthy_live_signal.clear() self.exist_prefill_task_signal.clear() self.model_weights_status_signal.clear() - if hasattr(self, "zmq_server") and self.zmq_server is not None: - self.zmq_server.close() + if hasattr(self, "send_response_server") and self.send_response_server is not None: + self.send_response_server.close() + if hasattr(self, "recv_request_server") and self.recv_request_server is not None: + self.recv_request_server.close() + if hasattr(self, "recv_control_cmd_server") and self.recv_control_cmd_server is not None: + self.recv_control_cmd_server.close() diff --git a/fastdeploy/entrypoints/engine_client.py b/fastdeploy/entrypoints/engine_client.py index fa23aaaee..d9a93a8bb 100644 --- a/fastdeploy/entrypoints/engine_client.py +++ b/fastdeploy/entrypoints/engine_client.py @@ -27,7 +27,7 @@ from fastdeploy.config import ModelConfig from fastdeploy.entrypoints.openai.utils import DealerConnectionManager from fastdeploy.envs import FD_SUPPORT_MAX_CONNECTIONS from fastdeploy.input.preprocess import InputPreprocessor -from fastdeploy.inter_communicator import IPCSignal, ZmqClient +from fastdeploy.inter_communicator import IPCSignal, ZmqIpcClient from fastdeploy.metrics.work_metrics import work_process_metrics from fastdeploy.multimodal.registry import MultimodalRegistry from fastdeploy.platforms import current_platform @@ -110,7 +110,7 @@ class EngineClient: """ Create a ZMQ client. """ - self.zmq_client = ZmqClient(model, mode) + self.zmq_client = ZmqIpcClient(model, mode) self.zmq_client.connect() async def format_and_add_data(self, prompts: dict): diff --git a/fastdeploy/envs.py b/fastdeploy/envs.py index 6bf468788..3d7c320cd 100644 --- a/fastdeploy/envs.py +++ b/fastdeploy/envs.py @@ -95,6 +95,14 @@ environment_variables: dict[str, Callable[[], Any]] = { "FD_FOR_TORCH_MODEL_FORMAT": lambda: bool(int(os.getenv("FD_FOR_TORCH_MODEL_FORMAT", "0"))), # force disable default chunked prefill "FD_DISABLE_CHUNKED_PREFILL": lambda: bool(int(os.getenv("FD_DISABLE_CHUNKED_PREFILL", "0"))), + # enable internal module to access LLMEngine. + "FD_ENABLE_INTERNAL_ADAPTER": lambda: int(os.getenv("FD_ENABLE_INTERNAL_ADAPTER", "0")), + # LLMEngine recieve requests port, used when FD_ENABLE_INTERNAL_ADAPTER=1 + "FD_ZMQ_RECV_REQUEST_SERVER_PORT": lambda: os.getenv("FD_ZMQ_RECV_REQUEST_SERVER_PORT", "8200"), + # LLMEngine send response port, used when FD_ENABLE_INTERNAL_ADAPTER=1 + "FD_ZMQ_SEND_RESPONSE_SERVER_PORT": lambda: os.getenv("FD_ZMQ_SEND_RESPONSE_SERVER_PORT", "8201"), + # LLMEngine recieve control command port, used when FD_ENABLE_INTERNAL_ADAPTER=1 + "FD_ZMQ_CONTROL_CMD_SERVER_PORTS": lambda: os.getenv("FD_ZMQ_CONTROL_CMD_SERVER_PORTS", "8202"), } diff --git a/fastdeploy/inter_communicator/__init__.py b/fastdeploy/inter_communicator/__init__.py index 41eb1ccc2..373702edb 100644 --- a/fastdeploy/inter_communicator/__init__.py +++ b/fastdeploy/inter_communicator/__init__.py @@ -17,6 +17,15 @@ from .engine_cache_queue import EngineCacheQueue from .engine_worker_queue import EngineWorkerQueue from .ipc_signal import IPCSignal, shared_memory_exists -from .zmq_client import ZmqClient +from .zmq_client import ZmqIpcClient +from .zmq_server import ZmqIpcServer, ZmqTcpServer -__all__ = ["ZmqClient", "IPCSignal", "EngineWorkerQueue", "EngineCacheQueue", "shared_memory_exists"] +__all__ = [ + "ZmqIpcClient", + "IPCSignal", + "EngineWorkerQueue", + "EngineCacheQueue", + "ZmqTcpServer", + "ZmqIpcServer", + "shared_memory_exists", +] diff --git a/fastdeploy/inter_communicator/zmq_client.py b/fastdeploy/inter_communicator/zmq_client.py index 7ef78c37e..ac9ba4bfe 100644 --- a/fastdeploy/inter_communicator/zmq_client.py +++ b/fastdeploy/inter_communicator/zmq_client.py @@ -14,209 +14,100 @@ # limitations under the License. """ -import os -import threading -import time -import traceback +from abc import ABC, abstractmethod -import msgpack import zmq -from fastdeploy import envs -from fastdeploy.utils import zmq_client_logger +from fastdeploy.utils import llm_logger -class ZmqClient: +class ZmqClientBase(ABC): """ - ZmqClient is a class that provides a client-side interface for sending and receiving messages using ZeroMQ. + ZmqClientBase is a base class that provides a client-side interface for sending and receiving messages using ZeroMQ. """ - def __init__(self, name, mode): - self.context = zmq.Context(4) - self.socket = self.context.socket(mode) - self.file_name = f"/dev/shm/{name}.socket" - self.router_path = f"/dev/shm/router_{name}.ipc" + def __init__(self): + pass - self.ZMQ_SNDHWM = int(envs.FD_ZMQ_SNDHWM) - self.aggregate_send = envs.FD_USE_AGGREGATE_SEND + @abstractmethod + def _create_socket(self): + """Abstract method to create and return a ZeroMQ socket.""" + pass - self.mutex = threading.Lock() - self.req_dict = dict() - self.router = None - self.poller = None - self.running = True + def _ensure_socket(self): + """Ensure the socket is created before use.""" + if self.socket is None: + self.socket = self._create_socket() + @abstractmethod def connect(self): """ Connect to the server using the file name specified in the constructor. """ - self.socket.connect(f"ipc://{self.file_name}") - - def start_server(self): - """ - Start the server using the file name specified in the constructor. - """ - self.socket.setsockopt(zmq.SNDHWM, self.ZMQ_SNDHWM) - self.socket.setsockopt(zmq.SNDTIMEO, -1) - self.socket.bind(f"ipc://{self.file_name}") - self.poller = zmq.Poller() - self.poller.register(self.socket, zmq.POLLIN) - - def create_router(self): - """ - Create a ROUTER socket and bind it to the specified router path. - """ - self.router = self.context.socket(zmq.ROUTER) - self.router.setsockopt(zmq.SNDHWM, self.ZMQ_SNDHWM) - self.router.setsockopt(zmq.ROUTER_MANDATORY, 1) - self.router.setsockopt(zmq.SNDTIMEO, -1) - self.router.bind(f"ipc://{self.router_path}") - zmq_client_logger.info(f"router path: {self.router_path}") + pass def send_json(self, data): """ Send a JSON-serializable object over the socket. """ + self._ensure_socket() self.socket.send_json(data) def recv_json(self): """ Receive a JSON-serializable object from the socket. """ + self._ensure_socket() return self.socket.recv_json() def send_pyobj(self, data): """ Send a Pickle-serializable object over the socket. """ + self._ensure_socket() self.socket.send_pyobj(data) def recv_pyobj(self): """ Receive a Pickle-serializable object from the socket. """ + self._ensure_socket() return self.socket.recv_pyobj() - def pack_aggregated_data(self, data): - """ - Aggregate multiple responses into one and send them to the client. - """ - result = data[0] - if len(data) > 1: - for response in data[1:]: - result.add(response) - result = msgpack.packb([result.to_dict()]) - return result + @abstractmethod + def close(self): + pass - def send_multipart(self, req_id, data): - """ - Send a multipart message to the router socket. - """ - if self.router is None: - raise RuntimeError("Router socket not created. Call create_router() first.") - while self.running: - with self.mutex: - if req_id not in self.req_dict: - try: - client, _, request_id = self.router.recv_multipart(flags=zmq.NOBLOCK) - req_id_str = request_id.decode("utf-8") - self.req_dict[req_id_str] = client - except zmq.Again: - time.sleep(0.001) - continue - else: - break - if self.req_dict[req_id] == -1: - if data[-1].finished: - with self.mutex: - self.req_dict.pop(req_id, None) - return - try: - start_send = time.time() - if self.aggregate_send: - result = self.pack_aggregated_data(data) - else: - result = msgpack.packb([response.to_dict() for response in data]) - self.router.send_multipart([self.req_dict[req_id], b"", result]) - zmq_client_logger.info(f"send_multipart result: {req_id} len {len(data)} elapse: {time.time()-start_send}") - except zmq.ZMQError as e: - zmq_client_logger.error(f"[{req_id}] zmq error: {e}") - self.req_dict[req_id] = -1 - except Exception as e: - zmq_client_logger.error(f"Send result to zmq client failed: {e}, {str(traceback.format_exc())}") +class ZmqIpcClient(ZmqClientBase): + def __init__(self, name, mode): + self.name = name + self.mode = mode + self.file_name = f"/dev/shm/{name}.socket" + self.context = zmq.Context() + self.socket = self.context.socket(self.mode) - if data[-1].finished: - with self.mutex: - self.req_dict.pop(req_id, None) - zmq_client_logger.info(f"send_multipart finished, req_id: {req_id}") + def _create_socket(self): + """create and return a ZeroMQ socket.""" + self.context = zmq.Context() + return self.context.socket(self.mode) - def receive_json_once(self, block=False): - """ - Receive a single message from the socket. - """ - if self.socket is None or self.socket.closed: - return "zmp socket has closed", None - try: - flags = zmq.NOBLOCK if not block else 0 - return None, self.socket.recv_json(flags=flags) - except zmq.Again: - return None, None - except Exception as e: - self.close() - zmq_client_logger.warning(f"{e}, {str(traceback.format_exc())}") - return str(e), None - - def receive_pyobj_once(self, block=False): - """ - Receive a single message from the socket. - """ - if self.socket is None or self.socket.closed: - return "zmp socket has closed", None - try: - flags = zmq.NOBLOCK if not block else 0 - return None, self.socket.recv_pyobj(flags=flags) - except zmq.Again: - return None, None - except Exception as e: - self.close() - zmq_client_logger.warning(f"{e}, {str(traceback.format_exc())}") - return str(e), None - - def _clear_ipc(self, name): - """ - Remove the IPC file with the given name. - """ - if os.path.exists(name): - try: - os.remove(name) - except OSError as e: - zmq_client_logger.warning(f"Failed to remove IPC file {name} - {e}") + def connect(self): + self._ensure_socket() + self.socket.connect(f"ipc://{self.file_name}") def close(self): """ - Close the socket and context, and remove the IPC files. + Close the socket and context. """ - if not self.running: - return - - self.running = False - zmq_client_logger.info("Closing ZMQ connection...") + llm_logger.info("ZMQ client is closing connection...") try: - if hasattr(self, "socket") and not self.socket.closed: + if self.socket is not None and not self.socket.closed: + self.socket.setsockopt(zmq.LINGER, 0) self.socket.close() - - if self.router is not None and not self.router.closed: - self.router.close() - - if not self.context.closed: + if self.context is not None: self.context.term() - self._clear_ipc(self.file_name) - self._clear_ipc(self.router_path) except Exception as e: - zmq_client_logger.warning(f"Failed to close ZMQ connection - {e}, {str(traceback.format_exc())}") + llm_logger.warning(f"ZMQ client failed to close connection - {e}") return - - def __exit__(self, exc_type, exc_val, exc_tb): - self.close() diff --git a/fastdeploy/inter_communicator/zmq_server.py b/fastdeploy/inter_communicator/zmq_server.py new file mode 100644 index 000000000..46a4ff6c5 --- /dev/null +++ b/fastdeploy/inter_communicator/zmq_server.py @@ -0,0 +1,307 @@ +""" +# Copyright (c) 2025 PaddlePaddle Authors. All Rights Reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License" +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +""" + +import os +import threading +import time +from abc import ABC, abstractmethod +from collections import defaultdict + +import msgpack +import zmq + +from fastdeploy import envs +from fastdeploy.utils import llm_logger + + +class ZmqServerBase(ABC): + """ + ZmqServerBase + """ + + def __init__(self): + self.cached_results = defaultdict(list) + self.response_token_lock = threading.Lock() + + @abstractmethod + def _create_socket(self): + """Abstract method to create and return a ZeroMQ socket.""" + pass + + def _ensure_socket(self): + """Ensure the socket is created before use.""" + if self.socket is None: + self.socket = self._create_socket() + + def pack_aggregated_data(self, data): + """ + Aggregate multiple responses into one and send them to the client. + """ + result = data[0] + if len(data) > 1: + for response in data[1:]: + result.add(response) + result = msgpack.packb([result.to_dict()]) + return result + + def receive_json_once(self, block=False): + """ + Receive a single message from the socket. + """ + self._ensure_socket() + if self.socket is None or self.socket.closed: + return "zmp socket has closed", None + try: + flags = zmq.NOBLOCK if not block else 0 + return None, self.socket.recv_json(flags=flags) + except zmq.Again: + return None, None + except Exception as e: + self.close() + llm_logger.warning(f"{e}") + return str(e), None + + def receive_pyobj_once(self, block=False): + """ + Receive a single message from the socket. + """ + self._ensure_socket() + if self.socket is None or self.socket.closed: + return "zmp socket has closed", None + try: + flags = zmq.NOBLOCK if not block else 0 + return None, self.socket.recv_pyobj(flags=flags) + except zmq.Again: + return None, None + except Exception as e: + self.close() + llm_logger.warning(f"{e}") + return str(e), None + + def recv_result_handle(self): + while True: + try: + with self.response_token_lock: + client, _, request_id = self.socket.recv_multipart(flags=zmq.NOBLOCK) + req_id_str = request_id.decode("utf-8") + need_send_after_finished_inference = False + with self.mutex: + self.req_dict[req_id_str] = client + if req_id_str in self.cached_results: + if self.cached_results[req_id_str][-1][-1].finished: + need_send_after_finished_inference = True + if need_send_after_finished_inference: + self.send_response(req_id_str, []) + llm_logger.info(f"send_multipart finished, req_id: {req_id_str}") + self.req_dict.pop(req_id_str, None) + + except zmq.Again: + time.sleep(0.001) + continue + except Exception as e: + llm_logger.error(f"recv_result_handle get unknown exception: {e}") + continue + + def send_response(self, req_id, data): + """ + Send generated token result to client. + """ + self._ensure_socket() + if self.socket is None: + raise RuntimeError("Router socket not created. Call create_router() first.") + new_data = [] + has_result_handle = False + with self.mutex: + if req_id not in self.req_dict: + self.cached_results[req_id].append(data) + else: + has_result_handle = True + if req_id in self.cached_results: + for history_data in self.cached_results[req_id]: + new_data.extend(history_data) + llm_logger.info( + f"get request {req_id} result handle after cached result, total cached length {len(self.cached_results[req_id])}" + ) + del self.cached_results[req_id] + if has_result_handle: + try: + new_data.extend(data) + start_send = time.time() + if self.aggregate_send: + result = self.pack_aggregated_data(new_data) + else: + result = msgpack.packb([response.to_dict() for response in new_data]) + with self.response_token_lock: + self.socket.send_multipart([self.req_dict[req_id], b"", result]) + llm_logger.debug( + f"send_multipart result: {req_id} len {len(new_data)} elapse: {time.time()-start_send}" + ) + + except Exception as e: + llm_logger.error(f"Send result to zmq client failed: {e}") + + if data and data[-1].finished: + with self.mutex: + if req_id in self.req_dict: + llm_logger.info(f"send_multipart finished, req_id: {req_id}") + self.req_dict.pop(req_id, None) + + @abstractmethod + def close(self): + pass + + def __exit__(self, exc_type, exc_val, exc_tb): + self.close() + + +class ZmqIpcServer(ZmqServerBase): + """ + ZmqIpcServer, used when FD_ENABLE_INTERNAL_ADAPTER=0 + """ + + def __init__(self, name, mode): + self.name = name + self.mode = mode + self.cached_results = defaultdict(list) + if mode == zmq.PULL: + self.file_name = f"/dev/shm/{name}.socket" + elif mode == zmq.ROUTER: + self.file_name = f"/dev/shm/router_{name}.ipc" + self.ZMQ_SNDHWM = int(envs.FD_ZMQ_SNDHWM) + self.aggregate_send = envs.FD_USE_AGGREGATE_SEND + self.mutex = threading.Lock() + self.response_token_lock = threading.Lock() + self.req_dict = dict() + self.running = True + self.context = zmq.Context() + self._create_socket() + + def _create_socket(self): + """create and return a ZeroMQ socket.""" + self.socket = self.context.socket(self.mode) + self.socket.setsockopt(zmq.SNDHWM, self.ZMQ_SNDHWM) + self.socket.setsockopt(zmq.SNDTIMEO, -1) + self.socket.bind(f"ipc://{self.file_name}") + return self.socket + + def _clear_ipc(self, name): + """ + Remove the IPC file with the given name. + """ + if os.path.exists(name): + try: + os.remove(name) + except OSError as e: + llm_logger.warning(f"Failed to remove IPC file {name} - {e}") + + def close(self): + """ + Close the socket and context, and remove the IPC files. + """ + if not self.running: + return + + self.running = False + llm_logger.info("ZMQ server is closing connection...") + try: + if self.socket is not None and not self.socket.closed: + self.socket.close() + if not self.context.closed: + self.context.term() + self._clear_ipc(self.file_name) + except Exception as e: + llm_logger.warning(f"ZMQ server failed to close connection - {e}") + return + + +class ZmqTcpServer(ZmqServerBase): + """ + ZmqTcpServer, used when FD_ENABLE_INTERNAL_ADAPTER=1 + """ + + def __init__(self, port, mode): + self.mode = mode + self.port = port + self.cached_results = defaultdict(list) + self.ZMQ_SNDHWM = int(envs.FD_ZMQ_SNDHWM) + self.aggregate_send = envs.FD_USE_AGGREGATE_SEND + + self.mutex = threading.Lock() + self.req_dict = dict() + self.running = True + self.context = zmq.Context() + self._create_socket() + self.response_token_lock = threading.Lock() + + def _create_socket(self): + """create and return a ZeroMQ socket.""" + self.socket = self.context.socket(self.mode) + self.socket.setsockopt(zmq.SNDHWM, self.ZMQ_SNDHWM) + self.socket.setsockopt(zmq.SNDTIMEO, -1) + self.socket.bind(f"tcp://*:{self.port}") + return self.socket + + def recv_control_cmd(self): + """ + Recieve control command from client + """ + self._ensure_socket() + try: + client, _, task_data = self.socket.recv_multipart(flags=zmq.NOBLOCK) + task = msgpack.unpackb(task_data) + task_id_str = task["task_id"] + except zmq.Again: + return None + with self.mutex: + self.req_dict[task_id_str] = client + return task + + def response_for_control_cmd(self, task_id, result): + """ + Send command result back to client. + """ + self._ensure_socket() + if self.socket is None: + raise RuntimeError("Router socket not created.") + try: + result = msgpack.packb(result) + self.socket.send_multipart([self.req_dict[task_id], b"", result]) + + except Exception as e: + llm_logger.error(f"Send result to zmq client failed: {e}") + + with self.mutex: + self.req_dict.pop(task_id, None) + llm_logger.debug(f"response control cmd finished, task_id: {task_id}") + + def close(self): + """ + Close the socket and context. + """ + if not self.running: + return + + self.running = False + llm_logger.info("ZMQ server is closing connection...") + try: + if self.socket is not None and not self.socket.closed: + self.socket.close() + if not self.context.closed: + self.context.term() + + except Exception as e: + llm_logger.warning(f"ZMQ server failed to close connection - {e}") + return diff --git a/fastdeploy/output/token_processor.py b/fastdeploy/output/token_processor.py index 1f9ba002c..7573ce024 100644 --- a/fastdeploy/output/token_processor.py +++ b/fastdeploy/output/token_processor.py @@ -359,6 +359,7 @@ class TokenProcessor: metrics = RequestMetrics( arrival_time=task.arrival_time, inference_start_time=task.inference_start_time, + model_execute_time=time.time() - task.inference_start_time, first_token_time=time.time() - task.inference_start_time, time_in_queue=task.schedule_start_time - task.preprocess_end_time, preprocess_cost_time=task.preprocess_end_time - task.preprocess_start_time, @@ -371,6 +372,7 @@ class TokenProcessor: metrics = RequestMetrics( arrival_time=time.time(), request_start_time=task.arrival_time, + model_execute_time=time.time() - task.inference_start_time, ) self.number_of_output_tokens += len(token_ids) self._record_metrics(task, current_time, token_ids) diff --git a/fastdeploy/scheduler/local_scheduler.py b/fastdeploy/scheduler/local_scheduler.py index 5d79e5009..159dd447d 100644 --- a/fastdeploy/scheduler/local_scheduler.py +++ b/fastdeploy/scheduler/local_scheduler.py @@ -208,6 +208,9 @@ class LocalScheduler: """ return (token_num + block_size - 1) // block_size + def get_unhandled_request_num(self): + return len(self.ids) - self.ids_read_cursor + def get_requests( self, available_blocks, diff --git a/fastdeploy/splitwise/internal_adapter_utils.py b/fastdeploy/splitwise/internal_adapter_utils.py new file mode 100644 index 000000000..a9d0ab92f --- /dev/null +++ b/fastdeploy/splitwise/internal_adapter_utils.py @@ -0,0 +1,118 @@ +""" +# Copyright (c) 2025 PaddlePaddle Authors. All Rights Reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License" +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +""" + +import threading +import time +import traceback + +# **Note**: Just for internal use +import zmq + +from fastdeploy.inter_communicator import ZmqTcpServer +from fastdeploy.metrics.metrics import get_filtered_metrics, main_process_metrics +from fastdeploy.utils import envs, get_logger + +logger = get_logger("internal_adapter_utils", "internal_adapter_utils.log") + + +class InternalAdapter: + def __init__(self, cfg, engine, dp_rank): + self.cfg = cfg + self.engine = engine + self.dp_rank = dp_rank + recv_control_cmd_ports = envs.FD_ZMQ_CONTROL_CMD_SERVER_PORTS.split(",") + self.response_lock = threading.Lock() # prevent to call send_multipart in zmq concurrently + self.recv_control_cmd_server = ZmqTcpServer(port=recv_control_cmd_ports[dp_rank], mode=zmq.ROUTER) + self.recv_external_instruct_thread = threading.Thread( + target=self._recv_external_module_control_instruct, daemon=True + ) + self.recv_external_instruct_thread.start() + if cfg.splitwise_role != "mixed": + self.response_external_instruct_thread = threading.Thread( + target=self._response_external_module_control_instruct, daemon=True + ) + self.response_external_instruct_thread.start() + + def _get_current_server_info(self): + """ + Get resources information + """ + available_batch_size = min(self.cfg.max_prefill_batch, self.engine.resource_manager.available_batch()) + + available_block_num = self.engine.resource_manager.available_block_num() + server_info = { + "splitwise_role": self.cfg.splitwise_role, + "block_size": int(self.cfg.cache_config.block_size), + "block_num": int(available_block_num), + "max_block_num": int(self.cfg.cache_config.total_block_num), + "dec_token_num": int(self.cfg.cache_config.dec_token_num), + "available_resource": float(1.0 * available_block_num / self.cfg.cache_config.total_block_num), + "max_batch_size": int(available_batch_size), + "max_input_token_num": self.cfg.max_num_batched_tokens, + "unhandled_request_num": self.engine.scheduler.get_unhandled_request_num(), + "available_batch": int(self.engine.resource_manager.available_batch()), + } + return server_info + + def _recv_external_module_control_instruct(self): + """ + Receive a multipart message from the control cmd socket. + """ + while True: + try: + with self.response_lock: + task = self.recv_control_cmd_server.recv_control_cmd() + if task is None: + time.sleep(0.001) + continue + logger.info(f"Recieve control task: {task}") + task_id_str = task["task_id"] + if task["cmd"] == "get_payload": + payload_info = self._get_current_server_info() + result = {"task_id": task_id_str, "result": payload_info} + logger.debug(f"Response for task: {task_id_str}") + with self.response_lock: + self.recv_control_cmd_server.response_for_control_cmd(task_id_str, result) + + elif task["cmd"] == "get_metrics": + metrics_text = get_filtered_metrics( + [], + extra_register_func=lambda reg: main_process_metrics.register_all(reg, workers=1), + ) + result = {"task_id": task_id_str, "result": metrics_text} + logger.debug(f"Response for task: {task_id_str}") + with self.response_lock: + self.recv_control_cmd_server.response_for_control_cmd(task_id_str, result) + elif task["cmd"] == "connect_rdma": + self.engine.engine_worker_queue.put_connect_rdma_task(task) + + except Exception as e: + logger.error(f"handle_control_cmd got error: {e}, {traceback.format_exc()!s}") + + def _response_external_module_control_instruct(self): + while True: + try: + result_data = self.engine.engine_worker_queue.get_connect_rdma_task_response() + if result_data: + task_id_str = result_data["task_id"] + result = {"task_id": task_id_str, "result": result_data} + logger.info(f"Response for task: {task_id_str}") + with self.response_lock: + self.recv_control_cmd_server.response_for_control_cmd(task_id_str, result) + else: + time.sleep(0.001) + except Exception as e: + logger.error(f"_handle_connect_rdma_results got error: {e}, {traceback.format_exc() !s}") diff --git a/tests/ci_use/EB_Lite_with_adapter/test_eblite_serving.py b/tests/ci_use/EB_Lite_with_adapter/test_eblite_serving.py new file mode 100644 index 000000000..d3e1df360 --- /dev/null +++ b/tests/ci_use/EB_Lite_with_adapter/test_eblite_serving.py @@ -0,0 +1,250 @@ +# Copyright (c) 2025 PaddlePaddle Authors. All Rights Reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +import os +import queue +import shutil +import signal +import socket +import subprocess +import sys +import time + +import pytest + +current_dir = os.path.dirname(os.path.abspath(__file__)) +project_root = os.path.abspath(os.path.join(current_dir, "..", "..")) +print("project_root", project_root) +if project_root not in sys.path: + sys.path.insert(0, project_root) + +from ci_use.EB_Lite_with_adapter.zmq_client import LLMControlClient, LLMReqClient + +env = os.environ.copy() + +# Read ports from environment variables; use default values if not set +FD_API_PORT = int(os.getenv("FD_API_PORT", 8188)) +FD_ENGINE_QUEUE_PORT = int(os.getenv("FD_ENGINE_QUEUE_PORT", 8133)) +FD_METRICS_PORT = int(os.getenv("FD_METRICS_PORT", 8233)) +FD_CACHE_QUEUE_PORT = int(os.getenv("FD_CACHE_QUEUE_PORT", 8234)) + +FD_ENABLE_INTERNAL_ADAPTER = int(os.getenv("FD_ENABLE_INTERNAL_ADAPTER", "1")) +FD_ZMQ_RECV_REQUEST_SERVER_PORT = int(os.getenv("FD_ZMQ_RECV_REQUEST_SERVER_PORT", "8204")) +FD_ZMQ_SEND_RESPONSE_SERVER_PORT = int(os.getenv("FD_ZMQ_SEND_RESPONSE_SERVER_PORT", "8205")) +FD_ZMQ_CONTROL_CMD_SERVER_PORTS = int(os.getenv("FD_ZMQ_CONTROL_CMD_SERVER_PORTS", "8206")) +FD_ZMQ_CONTROL_CMD_SERVER_PORT = FD_ZMQ_CONTROL_CMD_SERVER_PORTS + +env["FD_ENABLE_INTERNAL_ADAPTER"] = str(FD_ENABLE_INTERNAL_ADAPTER) +env["FD_ZMQ_RECV_REQUEST_SERVER_PORT"] = str(FD_ZMQ_RECV_REQUEST_SERVER_PORT) +env["FD_ZMQ_SEND_RESPONSE_SERVER_PORT"] = str(FD_ZMQ_SEND_RESPONSE_SERVER_PORT) +env["FD_ZMQ_CONTROL_CMD_SERVER_PORTS"] = str(FD_ZMQ_CONTROL_CMD_SERVER_PORTS) +env["FD_ZMQ_CONTROL_CMD_SERVER_PORT"] = str(FD_ZMQ_CONTROL_CMD_SERVER_PORT) + +# List of ports to clean before and after tests +PORTS_TO_CLEAN = [ + FD_API_PORT, + FD_ENGINE_QUEUE_PORT, + FD_METRICS_PORT, + FD_CACHE_QUEUE_PORT, + FD_ZMQ_RECV_REQUEST_SERVER_PORT, + FD_ZMQ_SEND_RESPONSE_SERVER_PORT, + FD_ZMQ_CONTROL_CMD_SERVER_PORT, +] + + +@pytest.fixture +def zmq_req_client(): + client = LLMReqClient("0.0.0.0", FD_ZMQ_RECV_REQUEST_SERVER_PORT, FD_ZMQ_SEND_RESPONSE_SERVER_PORT) + return client + + +@pytest.fixture +def zmq_control_client(): + client = LLMControlClient("0.0.0.0", FD_ZMQ_CONTROL_CMD_SERVER_PORT) + return client + + +def is_port_open(host: str, port: int, timeout=1.0): + """ + Check if a TCP port is open on the given host. + Returns True if connection succeeds, False otherwise. + """ + try: + with socket.create_connection((host, port), timeout): + return True + except Exception: + return False + + +def kill_process_on_port(port: int): + """ + Kill processes that are listening on the given port. + Uses `lsof` to find process ids and sends SIGKILL. + """ + try: + output = subprocess.check_output(f"lsof -i:{port} -t", shell=True).decode().strip() + for pid in output.splitlines(): + os.kill(int(pid), signal.SIGKILL) + print(f"Killed process on port {port}, pid={pid}") + except subprocess.CalledProcessError: + pass + + try: + result = subprocess.run( + f"ps -ef -ww| grep {FD_CACHE_QUEUE_PORT} | grep -v grep", shell=True, capture_output=True, text=True + ) + for line in result.stdout.strip().split("\n"): + if not line: + continue + parts = line.split() + pid = int(parts[1]) # ps -ef 的第二列是 PID + print(f"Killing PID: {pid}") + os.kill(pid, signal.SIGKILL) + except Exception as e: + print(f"Failed to kill cache manager process: {e}") + + +def clean_ports(): + """ + Kill all processes occupying the ports listed in PORTS_TO_CLEAN. + """ + for port in PORTS_TO_CLEAN: + kill_process_on_port(port) + + +@pytest.fixture(scope="session", autouse=True) +def setup_and_run_server(): + """ + Pytest fixture that runs once per test session: + - Cleans ports before tests + - Starts the API server as a subprocess + - Waits for server port to open (up to 30 seconds) + - Tears down server after all tests finish + """ + print("Pre-test port cleanup...") + clean_ports() + + base_path = os.getenv("MODEL_PATH") + if base_path: + model_path = os.path.join(base_path, "ernie-4_5-21b-a3b-bf16-paddle") + else: + model_path = "./ernie-4_5-21b-a3b-bf16-paddle" + + log_path = "server.log" + cmd = [ + sys.executable, + "-m", + "fastdeploy.entrypoints.openai.api_server", + "--model", + model_path, + "--port", + str(FD_API_PORT), + "--tensor-parallel-size", + "1", + "--engine-worker-queue-port", + str(FD_ENGINE_QUEUE_PORT), + "--metrics-port", + str(FD_METRICS_PORT), + "--cache-queue-port", + str(FD_CACHE_QUEUE_PORT), + "--max-model-len", + "32768", + "--max-num-seqs", + "128", + "--quantization", + "wint4", + ] + + # Start subprocess in new process group + # 清除log目录 + if os.path.exists("log"): + shutil.rmtree("log") + with open(log_path, "w") as logfile: + process = subprocess.Popen( + cmd, + env=env, + stdout=logfile, + stderr=subprocess.STDOUT, + start_new_session=True, # Enables killing full group via os.killpg + ) + + # Wait up to 300 seconds for API server to be ready + for _ in range(300): + if is_port_open("127.0.0.1", FD_API_PORT): + print(f"API server is up on port {FD_API_PORT}") + break + time.sleep(1) + else: + print("[TIMEOUT] API server failed to start in 5 minutes. Cleaning up...") + try: + os.killpg(process.pid, signal.SIGTERM) + except Exception as e: + print(f"Failed to kill process group: {e}") + raise RuntimeError(f"API server did not start on port {FD_API_PORT}") + + yield # Run tests + + print("\n===== Post-test server cleanup... =====") + try: + os.killpg(process.pid, signal.SIGTERM) + clean_ports() + print(f"API server (pid={process.pid}) terminated") + except Exception as e: + print(f"Failed to terminate API server: {e}") + + +def test_request_and_response(zmq_req_client): + prompt_token_ids = [5300, 93956, 55791] + req_id = "test" + request = { + "req_id": req_id, + "request_id": req_id, + "min_tokens": 1, + "dp_rank": 0, # P实例 DP rank, 从当前环境变量里读取 + "prompt_token_ids": prompt_token_ids, + "prompt_token_ids_len": len(prompt_token_ids), + "eos_token_ids": [2], + "stop_token_ids": [2], + "max_dec_len": 32 * 1024, + "max_tokens": 32 * 1024, + "min_dec_len": 1, + "arrival_time": time.time(), + "preprocess_start_time": time.time(), + "preprocess_end_time": time.time(), + "messages": [], + "temperature": 0.8, + "penalty_score": 1.0, + "repetition_penalty": 1.0, + "presence_penalty": 0, + "top_p": 0.8, + "frequency_penalty": 0.0, + } + result_queue = queue.Queue() + zmq_req_client.start(result_queue) + zmq_req_client.send_request(request) + zmq_req_client.request_result(req_id) + has_is_end_result = False + while True: + result = result_queue.get() + if result[-1]["finished"]: + has_is_end_result = True + break + assert has_is_end_result is True + + +def test_control_cmd(zmq_control_client): + result = zmq_control_client.get_payload() + assert "unhandled_request_num" in result + result = zmq_control_client.get_metrics() + assert result is not None diff --git a/tests/ci_use/EB_Lite_with_adapter/zmq_client.py b/tests/ci_use/EB_Lite_with_adapter/zmq_client.py new file mode 100644 index 000000000..db811d04a --- /dev/null +++ b/tests/ci_use/EB_Lite_with_adapter/zmq_client.py @@ -0,0 +1,121 @@ +import threading +import time +import uuid +from threading import Event + +import msgpack +import zmq + + +class LLMReqClient: + """ + LLM request client + """ + + def __init__(self, ip, send_req_server_port, recv_res_server_port): + self.ZMQ_SNDHWM = 64 * 1024 + self.context = zmq.Context() + self.send_req_client = self.context.socket(zmq.PUSH) + self.recv_res_client = self.context.socket(zmq.DEALER) + self.send_req_client.setsockopt(zmq.SNDHWM, self.ZMQ_SNDHWM) + self.send_req_client.setsockopt(zmq.SNDTIMEO, -1) + self.recv_res_client.setsockopt(zmq.SNDHWM, self.ZMQ_SNDHWM) + self.recv_res_client.setsockopt(zmq.SNDTIMEO, -1) + self.send_req_client.connect(f"tcp://{ip}:{send_req_server_port}") + self.recv_res_client.connect(f"tcp://{ip}:{recv_res_server_port}") + self.need_exit = False + self.response_socket_lock = threading.Lock() + + def send_request(self, req_data): + self.send_req_client.send_json(req_data) + + def request_result(self, req_id): + with self.response_socket_lock: + print(f"request result data for {req_id}") + self.recv_res_client.send_multipart([b"", req_id.encode("utf-8")]) + + def consume_results(self, result_queue): + while True: + try: + try: + with self.response_socket_lock: + frames = self.recv_res_client.recv_multipart(flags=zmq.NOBLOCK) + except zmq.Again: + time.sleep(0.001) + continue + data = frames[-1] + response = msgpack.unpackb(data) + print(f"get result data {response}") + result_queue.put(response) + if self.need_exit: + break + except Exception as e: + print(f"zmq client occured error {e} type: {type(e)} frames: {frames}") + + def start(self, result_queue): + threading.Thread(target=self.consume_results, args=(result_queue,), daemon=True).start() + + def exit(self): + print("exit") + self.need_exit = True + + +class LLMControlClient: + """ + LLM control client + """ + + def __init__(self, ip, port): + self.ZMQ_SNDHWM = 64 * 1024 + self.context = zmq.Context() + self.control_client = self.context.socket(zmq.DEALER) + self.control_client.setsockopt(zmq.SNDHWM, self.ZMQ_SNDHWM) + self.control_client.setsockopt(zmq.SNDTIMEO, -1) + self.control_client.connect(f"tcp://{ip}:{port}") + self.task_event = {} + self.result = {} + self.response_socket_lock = threading.Lock() + threading.Thread(target=self.recv_results, daemon=True).start() + + def get_payload(self): + task_id = f"get_payload_{uuid.uuid4()}" + task = {"task_id": task_id, "cmd": "get_payload"} + self.task_event[task_id] = Event() + payload = msgpack.packb(task) + with self.response_socket_lock: + self.control_client.send_multipart([b"", payload]) + self.task_event[task_id].wait() + result = self.result[task_id] + del self.result[task_id] + del self.task_event[task_id] + return result + + def get_metrics(self): + task_id = f"get_metrics_{uuid.uuid4()}" + task = {"task_id": task_id, "cmd": "get_metrics"} + self.task_event[task_id] = Event() + payload = msgpack.packb(task) + with self.response_socket_lock: + self.control_client.send_multipart([b"", payload]) + self.task_event[task_id].wait() + result = self.result[task_id] + del self.result[task_id] + del self.task_event[task_id] + return result + + def recv_results(self): + while True: + try: + try: + with self.response_socket_lock: + frames = self.control_client.recv_multipart(flags=zmq.NOBLOCK) + except zmq.Again: + time.sleep(0.001) + continue + data = frames[-1] + result = msgpack.unpackb(data) + task_id = result["task_id"] + self.result[task_id] = result["result"] + self.task_event[task_id].set() + except Exception as e: + print(f"zmq client occured error {e} type: {type(e)} frames: {frames}") From 7e3148ed817bee60e822cd5b752674be8117ee9b Mon Sep 17 00:00:00 2001 From: YuBaoku <49938469+EmmonsCurse@users.noreply.github.com> Date: Thu, 11 Sep 2025 22:04:40 +0800 Subject: [PATCH 22/36] [CI] update paddlepaddle==3.2.0 in release/2.2 (#3997) * [CI] update paddlepaddle-gpu==3.2.0 in release/2.2 * [CI] debug paddleformers==0.3.0 in release/2.2 * [CI] update paddlepaddle==3.2.0 in release/2.2 --- .github/workflows/_accuracy_test.yml | 2 +- .github/workflows/_base_test.yml | 2 +- .github/workflows/_build_linux.yml | 2 +- .github/workflows/_logprob_test_linux.yml | 2 +- .github/workflows/_pre_ce_test.yml | 2 +- .github/workflows/_stable_test.yml | 2 +- .github/workflows/_unit_test_coverage.yml | 2 +- scripts/run_pre_ce.sh | 2 +- scripts/run_unittest.sh | 2 +- 9 files changed, 9 insertions(+), 9 deletions(-) diff --git a/.github/workflows/_accuracy_test.yml b/.github/workflows/_accuracy_test.yml index a41b9c339..ea88b7225 100644 --- a/.github/workflows/_accuracy_test.yml +++ b/.github/workflows/_accuracy_test.yml @@ -143,7 +143,7 @@ jobs: -v "${CACHE_DIR}/ConfigDir:/root/.config" \ -e TZ="Asia/Shanghai" \ --gpus '"device='"${DEVICES}"'"' ${docker_image} /bin/bash -xc ' - python -m pip install --pre paddlepaddle-gpu -i https://www.paddlepaddle.org.cn/packages/nightly/cu126/ + python -m pip install paddlepaddle-gpu==3.2.0 -i https://www.paddlepaddle.org.cn/packages/stable/cu126/ pip config set global.index-url https://mirrors.tuna.tsinghua.edu.cn/pypi/web/simple diff --git a/.github/workflows/_base_test.yml b/.github/workflows/_base_test.yml index 9e5f309ca..fd938b7ec 100644 --- a/.github/workflows/_base_test.yml +++ b/.github/workflows/_base_test.yml @@ -143,7 +143,7 @@ jobs: -v "${CACHE_DIR}/ConfigDir:/root/.config" \ -e TZ="Asia/Shanghai" \ --gpus '"device='"${DEVICES}"'"' ${docker_image} /bin/bash -xc ' - python -m pip install --pre paddlepaddle-gpu -i https://www.paddlepaddle.org.cn/packages/nightly/cu126/ + python -m pip install paddlepaddle-gpu==3.2.0 -i https://www.paddlepaddle.org.cn/packages/stable/cu126/ pip config set global.index-url https://mirrors.tuna.tsinghua.edu.cn/pypi/web/simple diff --git a/.github/workflows/_build_linux.yml b/.github/workflows/_build_linux.yml index 28436e772..46f230534 100644 --- a/.github/workflows/_build_linux.yml +++ b/.github/workflows/_build_linux.yml @@ -148,7 +148,7 @@ jobs: elif [[ "${PADDLEVERSION}" != "" ]];then python -m pip install paddlepaddle-gpu==${PADDLEVERSION} -i https://www.paddlepaddle.org.cn/packages/stable/cu126/ else - python -m pip install --pre paddlepaddle-gpu -i https://www.paddlepaddle.org.cn/packages/nightly/cu126/ + python -m pip install paddlepaddle-gpu==3.2.0 -i https://www.paddlepaddle.org.cn/packages/stable/cu126/ fi pip config set global.index-url https://mirrors.tuna.tsinghua.edu.cn/pypi/web/simple diff --git a/.github/workflows/_logprob_test_linux.yml b/.github/workflows/_logprob_test_linux.yml index e15dd8722..04f9cf2cd 100644 --- a/.github/workflows/_logprob_test_linux.yml +++ b/.github/workflows/_logprob_test_linux.yml @@ -133,7 +133,7 @@ jobs: -v "${CACHE_DIR}/ConfigDir:/root/.config" \ -e TZ="Asia/Shanghai" \ --gpus '"device='"${DEVICES}"'"' ${docker_image} /bin/bash -xc ' - python -m pip install --pre paddlepaddle-gpu -i https://www.paddlepaddle.org.cn/packages/nightly/cu126/ + python -m pip install paddlepaddle-gpu==3.2.0 -i https://www.paddlepaddle.org.cn/packages/stable/cu126/ pip config set global.index-url https://mirrors.tuna.tsinghua.edu.cn/pypi/web/simple diff --git a/.github/workflows/_pre_ce_test.yml b/.github/workflows/_pre_ce_test.yml index 02a064639..f7f24f109 100644 --- a/.github/workflows/_pre_ce_test.yml +++ b/.github/workflows/_pre_ce_test.yml @@ -142,7 +142,7 @@ jobs: --gpus "\"device=${DEVICES}\"" ${docker_image} /bin/bash -c ' git config --global --add safe.directory /workspace/FastDeploy cd FastDeploy - python -m pip install --pre paddlepaddle-gpu -i https://www.paddlepaddle.org.cn/packages/nightly/cu126/ + python -m pip install paddlepaddle-gpu==3.2.0 -i https://www.paddlepaddle.org.cn/packages/stable/cu126/ python -m pip install ${fd_wheel_url} bash scripts/run_pre_ce.sh ' diff --git a/.github/workflows/_stable_test.yml b/.github/workflows/_stable_test.yml index 5988f5a73..8dd74210f 100644 --- a/.github/workflows/_stable_test.yml +++ b/.github/workflows/_stable_test.yml @@ -146,7 +146,7 @@ jobs: -v "${CACHE_DIR}/ConfigDir:/root/.config" \ -e TZ="Asia/Shanghai" \ --gpus '"device='"${DEVICES}"'"' ${docker_image} /bin/bash -xc ' - python -m pip install --pre paddlepaddle-gpu -i https://www.paddlepaddle.org.cn/packages/nightly/cu126/ + python -m pip install paddlepaddle-gpu==3.2.0 -i https://www.paddlepaddle.org.cn/packages/stable/cu126/ pip config set global.index-url https://mirrors.tuna.tsinghua.edu.cn/pypi/web/simple diff --git a/.github/workflows/_unit_test_coverage.yml b/.github/workflows/_unit_test_coverage.yml index 4e9e2ef43..c049a3bf9 100644 --- a/.github/workflows/_unit_test_coverage.yml +++ b/.github/workflows/_unit_test_coverage.yml @@ -168,7 +168,7 @@ jobs: git config --global --add safe.directory /workspace/FastDeploy cd FastDeploy git diff origin/${BASE_REF}..HEAD --unified=0 > diff.txt - python -m pip install --pre paddlepaddle-gpu -i https://www.paddlepaddle.org.cn/packages/nightly/cu126/ + python -m pip install paddlepaddle-gpu==3.2.0 -i https://www.paddlepaddle.org.cn/packages/stable/cu126/ pip config set global.extra-index-url https://mirrors.tuna.tsinghua.edu.cn/pypi/web/simple python -m pip install coverage diff --git a/scripts/run_pre_ce.sh b/scripts/run_pre_ce.sh index c06bf9367..159767458 100644 --- a/scripts/run_pre_ce.sh +++ b/scripts/run_pre_ce.sh @@ -44,7 +44,7 @@ for subdir in "$run_path"*/; do if [ "$exit_code" -eq 1 ] || [ "$exit_code" -eq 124 ]; then echo "[ERROR] $file 起服务或执行异常,exit_code=$exit_code" if [ "$exit_code" -eq 124 ]; then - echo "[TIMEOUT] $file 脚本执行超过 6 分钟, 任务超时退出!" + echo "[TIMEOUT] $file 脚本执行超过 10 分钟, 任务超时退出!" fi fi diff --git a/scripts/run_unittest.sh b/scripts/run_unittest.sh index f55c17699..577eaa94c 100644 --- a/scripts/run_unittest.sh +++ b/scripts/run_unittest.sh @@ -17,7 +17,7 @@ pwd git config --global --add safe.directory /workspace1/FastDeploy -python -m pip install --force-reinstall --pre paddlepaddle-gpu -i https://www.paddlepaddle.org.cn/packages/nightly/cu126/ +python -m pip install paddlepaddle-gpu==3.2.0 -i https://www.paddlepaddle.org.cn/packages/stable/cu126/ python -m pip install --upgrade --force-reinstall -r requirements/unittest/requirements.txt python -m pip install xgrammar==0.1.19 torch==2.6.0 bash tools/build_wheel.sh From 4e8ba622410f5d5ddaf1d55b2182a004b3f7d4ce Mon Sep 17 00:00:00 2001 From: YuanRisheng Date: Mon, 15 Sep 2025 11:41:55 +0800 Subject: [PATCH 23/36] [setup optimize]Support git submodule (#4033) (#4080) * support git submodule * update setup * fix ci network * fix clone * revert clone linux * delete args * fix ci * update --- .github/workflows/_build_linux.yml | 1 + .gitmodules | 9 ++ custom_ops/setup_ops.py | 138 ++++++++++----------------- custom_ops/third_party/DeepGEMM | 1 + custom_ops/third_party/cutlass | 1 + custom_ops/third_party/nlohmann_json | 1 + 6 files changed, 61 insertions(+), 90 deletions(-) create mode 100644 .gitmodules create mode 160000 custom_ops/third_party/DeepGEMM create mode 160000 custom_ops/third_party/cutlass create mode 160000 custom_ops/third_party/nlohmann_json diff --git a/.github/workflows/_build_linux.yml b/.github/workflows/_build_linux.yml index 46f230534..2f3b760b1 100644 --- a/.github/workflows/_build_linux.yml +++ b/.github/workflows/_build_linux.yml @@ -134,6 +134,7 @@ jobs: fi git config --global --add safe.directory /workspace/FastDeploy + chown -R $(whoami) /workspace/FastDeploy cd FastDeploy if [[ "${WITH_NIGHTLY_BUILD}" == "ON" ]];then GIT_COMMIT_TIME=$(git --no-pager show -s --format=%ci HEAD) diff --git a/.gitmodules b/.gitmodules new file mode 100644 index 000000000..fa4c5ea9e --- /dev/null +++ b/.gitmodules @@ -0,0 +1,9 @@ +[submodule "custom_ops/third_party/DeepGEMM"] + path = custom_ops/third_party/DeepGEMM + url = https://github.com/deepseek-ai/DeepGEMM.git +[submodule "custom_ops/third_party/cutlass"] + path = custom_ops/third_party/cutlass + url = https://github.com/NVIDIA/cutlass.git +[submodule "custom_ops/third_party/nlohmann_json"] + path = custom_ops/third_party/nlohmann_json + url = https://github.com/nlohmann/json.git diff --git a/custom_ops/setup_ops.py b/custom_ops/setup_ops.py index a0757d180..331f0e6f5 100644 --- a/custom_ops/setup_ops.py +++ b/custom_ops/setup_ops.py @@ -37,6 +37,52 @@ def load_module_from_path(module_name, path): return module +def update_git_repo(): + try: + print("update third party repo...", flush=True) + original_dir = os.getcwd() + submodule_dir = os.path.dirname(os.path.abspath(__file__)) + third_party_path = os.path.join(submodule_dir, "third_party") + root_path = Path(third_party_path) + + # check if third_party is empty + update_third_party = False + for dirpath in root_path.iterdir(): + if dirpath.is_dir(): + has_content = any(dirpath.iterdir()) + if not has_content: + update_third_party = True + + if update_third_party: + os.chdir(submodule_dir) + subprocess.run( + "git submodule sync --recursive && git submodule update --init --recursive", + shell=True, + check=True, + text=True, + ) + else: + print( + "\033[33m[===WARNING===]third_party directory already exists, skip clone and update.\033[0m", + flush=True, + ) + + # apply deep gemm patch + deep_gemm_dir = "third_party/DeepGEMM" + dst_path = os.path.join(submodule_dir, deep_gemm_dir) + patch = "0001-DeepGEMM-95e81b3.patch" + patch_source = os.path.join(submodule_dir, patch) + patch_destination = os.path.join(dst_path, patch) + if not os.path.exists(patch_destination): + shutil.copy(patch_source, patch_destination) + apply_cmd = ["git", "apply", patch] + os.chdir(dst_path) + subprocess.run(apply_cmd, check=True) + os.chdir(original_dir) + except subprocess.CalledProcessError: + raise Exception("Git submodule update and apply patch failed. Maybe network connection is poor.") + + ROOT_DIR = Path(__file__).parent.parent # cannot import envs directly because it depends on fastdeploy, @@ -46,6 +92,8 @@ envs = load_module_from_path("envs", os.path.join(ROOT_DIR, "fastdeploy", "envs. archs = json.loads(envs.FD_BUILDING_ARCS) use_bf16 = envs.FD_CPU_USE_BF16 == "True" +update_git_repo() + def download_and_extract(url, destination_directory): """ @@ -78,52 +126,6 @@ def download_and_extract(url, destination_directory): print(f"Error extracting file: {e}") -def clone_git_repo(version, repo_url, destination_path): - """ - Clone git repo to destination path. - """ - try: - subprocess.run( - [ - "git", - "clone", - "-b", - version, - "--single-branch", - repo_url, - destination_path, - ], - check=True, - ) - return True - except subprocess.CalledProcessError: - return False - - -def process_git_repo(cur_path, dst_path, commit_id=None, patch=None): - """ - reset git repo to destination commit and apply patch. - """ - if commit_id is not None: - reset_cmd = ["git", "reset", "--hard", commit_id] - if patch is not None: - patch_source = os.path.join(cur_path, patch) - patch_destination = os.path.join(dst_path, patch) - shutil.copy(patch_source, patch_destination) - apply_cmd = ["git", "apply", patch] - - try: - os.chdir(dst_path) - if commit_id is not None: - subprocess.run(reset_cmd, check=True) - if patch is not None: - subprocess.run(apply_cmd, check=True) - os.chdir(cur_path) - return True - except subprocess.CalledProcessError: - return False - - def get_sm_version(archs): """ Get sm version of paddle. @@ -191,13 +193,6 @@ def find_end_files(directory, end_str): if paddle.is_compiled_with_rocm(): # NOTE(@duanyanhui): paddle.is_compiled_with_cuda() returns True when paddle compiled with rocm. # so we need to check if paddle compiled with rocm at first. - json_dir = "third_party/nlohmann_json" - if not os.path.exists(json_dir) or not os.listdir(json_dir): - if not os.path.exists(json_dir): - os.makedirs(json_dir) - clone_git_repo("v3.11.3", "https://bgithub.xyz/nlohmann/json.git", json_dir) - if not os.listdir(json_dir): - raise ValueError("Git clone nlohmann_json failed!") sources = [ "gpu_ops/save_with_output_msg.cc", "gpu_ops/get_output.cc", @@ -316,28 +311,6 @@ elif paddle.is_compiled_with_cuda(): "gpu_ops/ipc_sent_key_value_cache_by_remote_ptr.cu", ] - cutlass_dir = "third_party/cutlass" - if not os.path.exists(cutlass_dir) or not os.listdir(cutlass_dir): - if not os.path.exists(cutlass_dir): - os.makedirs(cutlass_dir) - clone_git_repo("v3.8.0", "https://github.com/NVIDIA/cutlass.git", cutlass_dir) - if not os.listdir(cutlass_dir): - raise ValueError("Git clone cutlass failed!") - - # deep gemm - deep_gemm_dir = "third_party/DeepGEMM" - if not os.path.exists(deep_gemm_dir) or not os.listdir(deep_gemm_dir): - if not os.path.exists(deep_gemm_dir): - os.makedirs(deep_gemm_dir) - clone_git_repo("main", "https://github.com/deepseek-ai/DeepGEMM.git", deep_gemm_dir) - if not os.listdir(deep_gemm_dir): - raise ValueError("Git clone DeepGEMM failed!") - cur_path = os.path.dirname(os.path.abspath(__file__)) - dst_path = os.path.join(cur_path, deep_gemm_dir) - commit_id = "95e81b3dd6704e279e5f4757c5b94776ac988a8d" - patch = "0001-DeepGEMM-95e81b3.patch" - process_git_repo(cur_path, dst_path, commit_id, patch) - dg_third_party_include_dirs = ( "third_party/cutlass/include/cute", "third_party/cutlass/include/cutlass", @@ -365,14 +338,6 @@ elif paddle.is_compiled_with_cuda(): except Exception as e: raise RuntimeError(f"Failed to copy from {src_dir} to {dst_dir}: {e}") - json_dir = "third_party/nlohmann_json" - if not os.path.exists(json_dir) or not os.listdir(json_dir): - if not os.path.exists(json_dir): - os.makedirs(json_dir) - clone_git_repo("v3.11.3", "https://github.com/nlohmann/json.git", json_dir) - if not os.listdir(json_dir): - raise ValueError("Git clone nlohmann_json failed!") - cc_compile_args = [] nvcc_compile_args = get_gencode_flags(archs) nvcc_compile_args += ["-DPADDLE_DEV"] @@ -593,13 +558,6 @@ elif paddle.is_compiled_with_custom_device("gcu"): ) elif paddle.device.is_compiled_with_custom_device("metax_gpu"): maca_path = os.getenv("MACA_PATH", "/opt/maca") - json_dir = "third_party/nlohmann_json" - if not os.path.exists(json_dir) or not os.listdir(json_dir): - if not os.path.exists(json_dir): - os.makedirs(json_dir) - clone_git_repo("v3.11.3", "https://gitee.com/learnlov/mirrors_nlohmann_json.git", json_dir) - if not os.listdir(json_dir): - raise ValueError("Git clone nlohmann_json failed!") sources = [ "gpu_ops/update_inputs_v1.cu", "gpu_ops/save_with_output_msg.cc", diff --git a/custom_ops/third_party/DeepGEMM b/custom_ops/third_party/DeepGEMM new file mode 160000 index 000000000..95e81b3dd --- /dev/null +++ b/custom_ops/third_party/DeepGEMM @@ -0,0 +1 @@ +Subproject commit 95e81b3dd6704e279e5f4757c5b94776ac988a8d diff --git a/custom_ops/third_party/cutlass b/custom_ops/third_party/cutlass new file mode 160000 index 000000000..afa177220 --- /dev/null +++ b/custom_ops/third_party/cutlass @@ -0,0 +1 @@ +Subproject commit afa1772203677c5118fcd82537a9c8fefbcc7008 diff --git a/custom_ops/third_party/nlohmann_json b/custom_ops/third_party/nlohmann_json new file mode 160000 index 000000000..9cca280a4 --- /dev/null +++ b/custom_ops/third_party/nlohmann_json @@ -0,0 +1 @@ +Subproject commit 9cca280a4d0ccf0c08f47a99aa71d1b0e52f8d03 From fbb4e0f8d17a4403350f32d65f97412704899114 Mon Sep 17 00:00:00 2001 From: chen <103103266+ckl117@users.noreply.github.com> Date: Mon, 15 Sep 2025 18:52:58 +0800 Subject: [PATCH 24/36] [CP]Glm45 air 2.2 (#4073) * [Feature] Support zai-org/GLM-4.5-Air BF16 model (#3928) * support glm45_air * [Feature] GLM-45-AIR Support Mix Quantization(Dense wfp8afp8 and wint8 triton_moe_backend) (#4051) * check * fix v1 load for mix and wint8 * check --quantizations 'None' * check * support RL rollout * check v1 loader * check glm rollout_model, change wfp8afp8 per_token_cast_to_fp8 to native impl * check rollout moe gate begin layer_id * check rollout e_score_correction_bias * delete infer_to_train_mapping={} * code check --- .../decoder_write_cache_with_rope_impl.cuh | 136 ++++ .../decoder_write_cache_with_rope_kernel.cu | 36 +- .../encoder_write_cache_with_rope_impl.cuh | 103 +++- .../encoder_write_cache_with_rope_kernel.h | 11 + fastdeploy/config.py | 3 +- fastdeploy/engine/args_utils.py | 5 +- fastdeploy/engine/engine.py | 3 +- fastdeploy/model_executor/layers/moe/ep.py | 31 +- .../layers/moe/fused_moe_cutlass_backend.py | 32 +- .../layers/moe/fused_moe_deepgemm_backend.py | 2 +- .../layers/moe/fused_moe_marlin_backend.py | 26 +- .../layers/moe/fused_moe_triton_backend.py | 164 +++-- fastdeploy/model_executor/layers/moe/moe.py | 30 + .../layers/quantization/mix_quant.py | 6 +- .../layers/quantization/weight_only.py | 12 +- .../layers/quantization/wfp8afp8.py | 107 +++- .../model_executor/layers/rotary_embedding.py | 27 + fastdeploy/model_executor/layers/utils.py | 11 + fastdeploy/model_executor/models/glm4_moe.py | 579 ++++++++++++++++++ fastdeploy/rl/rollout_config.py | 4 +- fastdeploy/rl/rollout_model.py | 85 +++ fastdeploy/utils.py | 13 + fastdeploy/worker/gpu_model_runner.py | 3 +- fastdeploy/worker/worker_process.py | 23 +- tests/e2e/test_fake_Glm45_AIR_serving.py | 223 +++++++ 25 files changed, 1505 insertions(+), 170 deletions(-) create mode 100644 fastdeploy/model_executor/models/glm4_moe.py create mode 100644 tests/e2e/test_fake_Glm45_AIR_serving.py diff --git a/custom_ops/gpu_ops/append_attn/decoder_write_cache_with_rope_impl.cuh b/custom_ops/gpu_ops/append_attn/decoder_write_cache_with_rope_impl.cuh index c8273cd3c..0b6e5707c 100644 --- a/custom_ops/gpu_ops/append_attn/decoder_write_cache_with_rope_impl.cuh +++ b/custom_ops/gpu_ops/append_attn/decoder_write_cache_with_rope_impl.cuh @@ -381,6 +381,142 @@ __global__ void append_decode_cache_T_rope_kernel( } } +template +__global__ void append_decode_cache_T_neox_partial_rope_kernel( + const T* __restrict__ qkv, // [bsz, num_heads + 2 * kv_num_heads, + // head_size] + T* __restrict__ key_cache, // [num_blocks, kv_num_heads, block_size, + // head_size // 2] + T* __restrict__ value_cache, // [num_blocks, kv_num_heads, block_size, + // head_size // 2] + T* __restrict__ qkv_out, + const int* __restrict__ block_tables, // [bsz, max_blocks_per_seq] + const int* __restrict__ cu_seqlens_q, + const int* __restrict__ seq_lens, // [bsz] + const int* __restrict__ seq_lens_encoder, // [bsz] + const float* __restrict__ cos_emb, // [2, 1, max_model_len, 1, rotary_dim/2] + const float* __restrict__ sin_emb, // [2, 1, max_model_len, 1, rotary_dim/2] + const int max_seq_len, + const int max_blocks_per_seq, + const int num_heads, + const int head_size, + const int rotary_dim, + const int block_size, + const uint32_t elem_cnt, + const int kv_num_heads, + const bool rope_3d) { + using LoadT = AlignedVector; + using LoadBiasT = AlignedVector; + using LoadKVT = AlignedVector; + constexpr int HalfVecSize = VecSize / 2; + using LoadEmbT = AlignedVector; + + LoadT left_vec, right_vec; + LoadBiasT left_bias_vec, right_bias_vec; + LoadKVT left_cache_vec, right_cache_vec; + LoadEmbT cos_emb_vec; + LoadEmbT sin_emb_vec; + + int64_t global_thread_idx = blockDim.x * blockIdx.x + threadIdx.x; + const int half_head_size = head_size / 2; + const int half_rotary_dim = rotary_dim / 2; + const int64_t hidden_size = (num_heads + 2 * kv_num_heads) * head_size; + const int64_t half_hidden_size = hidden_size / 2; + // const int64_t offset = 2 * hidden_size; + + for (int32_t linear_index = global_thread_idx * VecSize, + step = gridDim.x * blockDim.x * VecSize; + linear_index < elem_cnt; + linear_index += step) { + const int ori_bi = linear_index / half_hidden_size; + const int bias = linear_index % half_hidden_size; + const int hi = bias / half_head_size; // q + k + v + const int h_bias = bias % half_head_size; + if (hi < num_heads && h_bias >= half_rotary_dim){ + continue; + } + if (seq_lens_encoder[ori_bi] > 0) continue; + const int write_seq_id = seq_lens[ori_bi]; + if (write_seq_id == 0) continue; + const int start_token_idx = cu_seqlens_q[ori_bi]; + + const int* block_table_now = nullptr; + + block_table_now = block_tables + ori_bi * max_blocks_per_seq; + const int block_idx = block_table_now[write_seq_id / block_size]; + const int block_offset = write_seq_id % block_size; + uint32_t ori_idx_left = + start_token_idx * hidden_size + hi * head_size + h_bias; + uint32_t ori_idx_right = ori_idx_left + half_head_size; + if (hi < num_heads){ + ori_idx_right = ori_idx_left + half_rotary_dim; + }else if (hi < num_heads + kv_num_heads){ + if (h_bias < half_rotary_dim){ + ori_idx_right = ori_idx_left + half_rotary_dim; + }else{ + ori_idx_left = ori_idx_left + half_rotary_dim; + ori_idx_right = ori_idx_left + half_rotary_dim; + } + } + + Load(&qkv[ori_idx_left], &left_vec); + Load(&qkv[ori_idx_right], &right_vec); + + if (hi < num_heads + kv_num_heads) { + // q k rope + const uint32_t emb_idx = write_seq_id * half_rotary_dim + h_bias; + uint32_t new_emb_idx = rope_3d ? emb_idx + ori_bi * max_seq_len * head_size * 2 : emb_idx; + if (h_bias < half_rotary_dim){ + Load(&cos_emb[new_emb_idx], &cos_emb_vec); + Load(&sin_emb[new_emb_idx], &sin_emb_vec); + } + } +#pragma unroll + for (int i = 0; i < VecSize; i++) { + // rope + float input_left = static_cast(left_vec[i]); + float input_right = static_cast(right_vec[i]); + if (hi < num_heads + kv_num_heads && h_bias < half_rotary_dim) { + const float cos_tmp = cos_emb_vec[i]; + const float sin_tmp = sin_emb_vec[i]; + left_bias_vec[i] = + static_cast(input_left * cos_tmp - input_right * sin_tmp); + right_bias_vec[i] = + static_cast(input_right * cos_tmp + input_left * sin_tmp); + } else { + left_bias_vec[i] = static_cast(input_left); + right_bias_vec[i] = static_cast(input_right); + } + } + if (hi < num_heads) { + // write q + Store(left_bias_vec, &qkv_out[ori_idx_left]); + Store(right_bias_vec, &qkv_out[ori_idx_right]); + } else { + // write k/v + const uint32_t kv_head_idx = (hi - num_heads) % kv_num_heads; + uint32_t tgt_idx_left = + block_idx * kv_num_heads * block_size * head_size + + kv_head_idx * block_size * head_size + block_offset * head_size + + h_bias; + uint32_t tgt_idx_right = tgt_idx_left + half_head_size; + if (hi < num_heads + kv_num_heads) { + if (h_bias < half_rotary_dim) { + tgt_idx_right = tgt_idx_left + half_rotary_dim; + }else{ + tgt_idx_left = tgt_idx_left + half_rotary_dim; + tgt_idx_right = tgt_idx_left + half_rotary_dim; + } + Store(left_bias_vec, &key_cache[tgt_idx_left]); + Store(right_bias_vec, &key_cache[tgt_idx_right]); + } else { + Store(left_bias_vec, &value_cache[tgt_idx_left]); + Store(right_bias_vec, &value_cache[tgt_idx_right]); + } + } + } +} + template __global__ void append_decode_cache_T_neox_rope_kernel( const T* __restrict__ qkv, // [bsz, num_heads + 2 * kv_num_heads, diff --git a/custom_ops/gpu_ops/append_attn/decoder_write_cache_with_rope_kernel.cu b/custom_ops/gpu_ops/append_attn/decoder_write_cache_with_rope_kernel.cu index 68b22968b..06c55ac84 100644 --- a/custom_ops/gpu_ops/append_attn/decoder_write_cache_with_rope_kernel.cu +++ b/custom_ops/gpu_ops/append_attn/decoder_write_cache_with_rope_kernel.cu @@ -97,6 +97,7 @@ void append_decode_cache_rope(const QKV_TYPE* qkv, const int num_heads, const int kv_num_heads, const int dim_head, + const int rotary_dim, const int block_size, const int bsz, const cudaStream_t& stream, @@ -137,7 +138,29 @@ void append_decode_cache_rope(const QKV_TYPE* qkv, kv_num_heads, rope_3d); } else { - append_decode_cache_T_neox_rope_kernel + if (rotary_dim < dim_head){ + append_decode_cache_T_neox_partial_rope_kernel + <<>>(reinterpret_cast(qkv), + key_cache, + value_cache, + qkv_out, + block_tables, + cu_seqlens_q, + seq_lens, + seq_lens_encoder, + cos_emb, + sin_emb, + max_seq_len, + max_blocks_per_seq, + num_heads, + dim_head, + rotary_dim, + block_size, + elem_nums, + kv_num_heads, + rope_3d); + }else{ + append_decode_cache_T_neox_rope_kernel <<>>(reinterpret_cast(qkv), key_cache, value_cache, @@ -157,6 +180,7 @@ void append_decode_cache_rope(const QKV_TYPE* qkv, elem_nums, kv_num_heads, rope_3d); + } } } else { if (qkv_out_scales) { @@ -534,11 +558,20 @@ void DecoderWriteCacheWithRoPEKernel( const float* cos_emb = rotary_embs ? rotary_embs.get().data() : nullptr; const float* sin_emb; + int rotary_dim = dim_head; if (rotary_embs) { sin_emb = use_neox_rotary_style ? rotary_embs.get().data() + max_seq_len * dim_head : rotary_embs.get().data() + max_seq_len * dim_head / 2; + rotary_dim = rotary_embs.get().dims()[rotary_embs.get().dims().size()-1] * 2; + if(rotary_dim < dim_head){ + if (!use_neox_rotary_style || qkv_out_scales || q_norm_weight || k_norm_weight|| cache_quant_type_str != "none"){ + PADDLE_THROW(phi::errors::Fatal( + "partial_rotary_factor < 1.0 only supports neox_rotary_style=True, qkv_out_scales is None, q_norm_weight/k_norm_weight) is None, and cache_quant_type_str is 'none'.")); + } + sin_emb = rotary_embs.get().data() + max_seq_len * rotary_dim / 2; + } } if (q_norm_weight && k_norm_weight) { @@ -599,6 +632,7 @@ void DecoderWriteCacheWithRoPEKernel( num_heads, kv_num_heads, dim_head, + rotary_dim, block_size, bsz, stream, diff --git a/custom_ops/gpu_ops/append_attn/encoder_write_cache_with_rope_impl.cuh b/custom_ops/gpu_ops/append_attn/encoder_write_cache_with_rope_impl.cuh index 44489bae0..b79591f47 100644 --- a/custom_ops/gpu_ops/append_attn/encoder_write_cache_with_rope_impl.cuh +++ b/custom_ops/gpu_ops/append_attn/encoder_write_cache_with_rope_impl.cuh @@ -900,6 +900,74 @@ __global__ void GQANeoxVariableLengthRotaryKernel( } } +template +__global__ void GQANeoxVariableLengthPartialRotaryKernel( + const T *qkv, + const float *cos_emb, + const float *sin_emb, + const int *batch_id_per_token, + const int *cu_seqlens_q, + const int *seq_lens, + const int *seq_lens_decoder, + const float *qkv_out_scales, + const T *qkv_biases, + T *qkv_out, + const int64_t elem_cnt, + const int q_num_head, + const int kv_num_head, + const int seq_len, + const int head_dim, + const int rotary_dim, + const bool rope_3d) { + using LoadT = AlignedVector; + using LoadEmbT = AlignedVector; + LoadT left_vec; + LoadT right_vec; + LoadEmbT cos_emb_vec; + LoadEmbT sin_emb_vec; + int64_t global_thread_idx = blockDim.x * blockIdx.x + threadIdx.x; + const int rotary_dim_half = rotary_dim / 2; + const int offset = (q_num_head + kv_num_head) * rotary_dim_half; + for (int64_t linear_index = global_thread_idx * VecSize, + step = gridDim.x * blockDim.x * VecSize; + linear_index < elem_cnt; + linear_index += step) { + const int token_idx = linear_index / offset; + const int ori_bi = batch_id_per_token[token_idx]; + if (seq_lens && seq_lens[ori_bi] == 0) continue; + const int bias = linear_index % offset; + const int hi = bias / rotary_dim_half; + const int h_bias = bias % rotary_dim_half; + + const int ori_seq_id = (token_idx - cu_seqlens_q[ori_bi]) + seq_lens_decoder[ori_bi]; + + const int emb_idx = ori_seq_id * rotary_dim_half + h_bias; + int64_t new_emb_idx = rope_3d ? emb_idx + ori_bi * head_dim * seq_len * 2 : emb_idx; + const int base_idx_left = + token_idx * (q_num_head + 2 * kv_num_head) * head_dim + hi * head_dim + + h_bias; + const int base_idx_right = base_idx_left + rotary_dim_half; + + Load(&qkv[base_idx_left], &left_vec); + Load(&qkv[base_idx_right], &right_vec); + Load(&cos_emb[new_emb_idx], &cos_emb_vec); + Load(&sin_emb[new_emb_idx], &sin_emb_vec); +#pragma unroll + for (int i = 0; i < VecSize; i++) { + const float input_left = static_cast(left_vec[i]); + const float input_right = static_cast(right_vec[i]); + const float cos_tmp = cos_emb_vec[i]; + const float sin_tmp = sin_emb_vec[i]; + left_vec[i] = + static_cast(input_left * cos_tmp - input_right * sin_tmp); + right_vec[i] = + static_cast(input_right * cos_tmp + input_left * sin_tmp); + } + Store(left_vec, &qkv_out[base_idx_left]); + Store(right_vec, &qkv_out[base_idx_right]); + } +} + template __global__ void cache_kernel( const T *__restrict__ qkv, // [num_tokens, num_heads + 2 * kv_num_heads, @@ -1755,6 +1823,7 @@ void gqa_rotary_qk_variable( const int seq_len, const int input_output_len, const int dim_head, + const int rotary_dim, const cudaStream_t &stream, bool use_neox_style = false, bool rope_3d = false) { @@ -1835,7 +1904,38 @@ void gqa_rotary_qk_variable( dim_head, rope_3d); } else { - GQANeoxVariableLengthRotaryKernel + if (rotary_dim < dim_head){ + PD_CHECK((rotary_dim / 2) % PackSize == 0); + elem_nums = + qkv_out_scales + ? token_num * (num_heads + 2 * kv_num_heads) * rotary_dim + : token_num * (num_heads + kv_num_heads) * rotary_dim; // for all q k v + if (use_neox_style) { + elem_nums /= 2; + } + const int pack_num_new = elem_nums / PackSize; + GetNumBlocks<128>(pack_num_new, &grid_size); + GQANeoxVariableLengthPartialRotaryKernel + <<>>( + reinterpret_cast(qkv_input), + cos_emb, + rotary_emb + input_output_len * rotary_dim / 2, + batch_id_per_token, + cu_seqlens_q, + seq_lens, + seq_lens_decoder, + qkv_out_scales, + qkv_bias, + qkv_out, + elem_nums, + num_heads, + kv_num_heads, + seq_len, + dim_head, + rotary_dim, + rope_3d); + }else{ + GQANeoxVariableLengthRotaryKernel <<>>( reinterpret_cast(qkv_input), cos_emb, @@ -1853,6 +1953,7 @@ void gqa_rotary_qk_variable( seq_len, dim_head, rope_3d); + } } } } diff --git a/custom_ops/gpu_ops/append_attn/encoder_write_cache_with_rope_kernel.h b/custom_ops/gpu_ops/append_attn/encoder_write_cache_with_rope_kernel.h index 5af84e73f..668f1a65c 100644 --- a/custom_ops/gpu_ops/append_attn/encoder_write_cache_with_rope_kernel.h +++ b/custom_ops/gpu_ops/append_attn/encoder_write_cache_with_rope_kernel.h @@ -55,9 +55,19 @@ void EncoderWriteCacheWithRopeKernel( auto kv_num_heads = meta_data.kv_num_heads; auto head_dim = meta_data.head_dims; bool is_scale_channel_wise = false; + int rotary_dim = head_dim; if (cache_k_scale && cache_k_scale.get().dims()[0] == head_dim * kv_num_heads) { is_scale_channel_wise = true; } + if (rotary_embs){ + rotary_dim = rotary_embs.get().dims()[rotary_embs.get().dims().size()-1] * 2; + if(rotary_dim < head_dim){ + if (!use_neox_style || q_norm_weight || k_norm_weight || num_heads == kv_num_heads || is_scale_channel_wise){ + PADDLE_THROW(phi::errors::Fatal( + "partial_rotary_factor < 1.0 only supports use_neox_rotary_style=True, q_norm_weight/k_norm_weight) is None, GQA and is_scale_channel_wise=false.")); + } + } + } if (q_norm_weight && k_norm_weight) { if (num_heads != kv_num_heads && !is_scale_channel_wise && !use_neox_style) { @@ -125,6 +135,7 @@ void EncoderWriteCacheWithRopeKernel( max_seq_len, rope_3d ? rotary_embs.get().dims()[3] : rotary_embs.get().dims()[2], head_dim, + rotary_dim, stream, use_neox_style, rope_3d); diff --git a/fastdeploy/config.py b/fastdeploy/config.py index 153403ee3..08e52b52f 100644 --- a/fastdeploy/config.py +++ b/fastdeploy/config.py @@ -132,6 +132,7 @@ class ModelConfig: self.eos_tokens_lens: int = 2 self.lm_head_fp32: bool = False self.model_format = "auto" + self.partial_rotary_factor: float = 1.0 for key, value in args.items(): if hasattr(self, key): setattr(self, key, value) @@ -396,7 +397,7 @@ class SpeculativeConfig: # model for mtp/eagle/draft_model self.model: Optional[str] = None # quantization of model - self.quantization: Optional[str] = None + self.quantization: Optional[Dict[str, Any]] = None # allocate more blocks to prevent mtp from finishing the block earlier than the main model # Fixed now self.num_gpu_block_expand_ratio: Optional[float] = 1 diff --git a/fastdeploy/engine/args_utils.py b/fastdeploy/engine/args_utils.py index 8ed63247f..042d63975 100644 --- a/fastdeploy/engine/args_utils.py +++ b/fastdeploy/engine/args_utils.py @@ -41,6 +41,7 @@ from fastdeploy.utils import ( DeprecatedOptionWarning, FlexibleArgumentParser, is_port_available, + parse_quantization, ) @@ -138,7 +139,7 @@ class EngineArgs: """ dynamic load weight strategy """ - quantization: str = None + quantization: Optional[Dict[str, Any]] = None guided_decoding_backend: str = "off" """ Guided decoding backend. @@ -550,7 +551,7 @@ class EngineArgs: ) model_group.add_argument( "--quantization", - type=str, + type=parse_quantization, default=EngineArgs.quantization, help="Quantization name for the model, currentlly support " "'wint8', 'wint4'," diff --git a/fastdeploy/engine/engine.py b/fastdeploy/engine/engine.py index 05f5eda70..73b924c9a 100644 --- a/fastdeploy/engine/engine.py +++ b/fastdeploy/engine/engine.py @@ -16,6 +16,7 @@ from __future__ import annotations +import json import multiprocessing import os import re @@ -463,7 +464,7 @@ class LLMEngine: f" --kv_cache_ratio {self.cfg.cache_config.kv_cache_ratio}" f" --expert_parallel_size {self.cfg.parallel_config.expert_parallel_size}" f" --data_parallel_size {self.cfg.parallel_config.data_parallel_size}" - f" --quantization {self.cfg.model_config.quantization}" + f" --quantization '{json.dumps(self.cfg.model_config.quantization)}'" f" --ori_vocab_size {ori_vocab_size}" f" --speculative_config '{self.cfg.speculative_config.to_json_string()}'" f" --graph_optimization_config '{self.cfg.graph_opt_config.to_json_string()}'" diff --git a/fastdeploy/model_executor/layers/moe/ep.py b/fastdeploy/model_executor/layers/moe/ep.py index 5b10b68ec..f1fb9fbf8 100644 --- a/fastdeploy/model_executor/layers/moe/ep.py +++ b/fastdeploy/model_executor/layers/moe/ep.py @@ -28,38 +28,9 @@ except: import fastdeploy from fastdeploy.config import MoEPhase +from fastdeploy.model_executor.layers.moe.moe import get_moe_scores from fastdeploy.utils import singleton -try: - from fastdeploy.model_executor.ops.gpu import noaux_tc -except: - logger.warning("import noaux_tc Failed!") - - -def get_moe_scores( - gating_output: paddle.Tensor, - n_group, - topk_group, - top_k, - routed_scaling_factor, - e_score_correction_bias, -) -> paddle.Tensor: - """ - compute moe scores using e_score_correction_bias. - """ - scores = paddle.nn.functional.sigmoid(gating_output) - assert e_score_correction_bias is not None, "e_score_correction_bias is none!" - scores_with_bias = scores + e_score_correction_bias - scores, topk_values, topk_idx = noaux_tc( - scores, - scores_with_bias, - n_group if n_group > 0 else 1, - topk_group if topk_group > 0 else 1, - top_k, - routed_scaling_factor, - ) - return scores, topk_values, topk_idx - @singleton class DeepEPEngine: diff --git a/fastdeploy/model_executor/layers/moe/fused_moe_cutlass_backend.py b/fastdeploy/model_executor/layers/moe/fused_moe_cutlass_backend.py index e83250d1d..a44ef26dc 100644 --- a/fastdeploy/model_executor/layers/moe/fused_moe_cutlass_backend.py +++ b/fastdeploy/model_executor/layers/moe/fused_moe_cutlass_backend.py @@ -27,11 +27,8 @@ from ..utils import get_tensor from .fused_moe_backend_base import UnquantizedFusedMoEMethod if current_platform.is_cuda(): - from fastdeploy.model_executor.ops.gpu import ( - moe_expert_dispatch, - moe_expert_reduce, - noaux_tc, - ) + from fastdeploy.model_executor.layers.moe.moe import get_moe_scores + from fastdeploy.model_executor.ops.gpu import moe_expert_dispatch, moe_expert_reduce try: from fastdeploy.model_executor.ops.gpu import w4afp8_gemm_scale_permute @@ -46,31 +43,6 @@ elif current_platform.is_iluvatar(): from fastdeploy.model_executor.utils import TensorTracker, free_tensor, set_weight_attrs -# used for deepseek_v3 -def get_moe_scores( - gating_output: paddle.Tensor, - n_group, - topk_group, - top_k, - routed_scaling_factor, - e_score_correction_bias, -) -> paddle.Tensor: - """ - compute moe scores using e_score_correction_bias. - """ - scores = paddle.nn.functional.sigmoid(gating_output) - scores_with_bias = scores + e_score_correction_bias - scores, topk_values, topk_idx = noaux_tc( - scores, - scores_with_bias, - n_group, - topk_group, - top_k, - routed_scaling_factor, - ) - return scores, topk_values, topk_idx - - class CutlassMoEMethod(UnquantizedFusedMoEMethod): """ Use Cutlass Group Gemm to compute Fused MoE. diff --git a/fastdeploy/model_executor/layers/moe/fused_moe_deepgemm_backend.py b/fastdeploy/model_executor/layers/moe/fused_moe_deepgemm_backend.py index b2571b325..386dbe75d 100644 --- a/fastdeploy/model_executor/layers/moe/fused_moe_deepgemm_backend.py +++ b/fastdeploy/model_executor/layers/moe/fused_moe_deepgemm_backend.py @@ -481,7 +481,7 @@ class DeepGemmFusedMoeMethod(MoEMethodBase): gate_out = gate(x.cast("float32")) if layer.topk_method == "noaux_tc": - from .ep import get_moe_scores + from fastdeploy.model_executor.layers.moe.moe import get_moe_scores _, topk_weights, topk_ids = get_moe_scores( gate_out, diff --git a/fastdeploy/model_executor/layers/moe/fused_moe_marlin_backend.py b/fastdeploy/model_executor/layers/moe/fused_moe_marlin_backend.py index ed39b64e0..4346063b7 100644 --- a/fastdeploy/model_executor/layers/moe/fused_moe_marlin_backend.py +++ b/fastdeploy/model_executor/layers/moe/fused_moe_marlin_backend.py @@ -19,39 +19,15 @@ from paddle import nn import fastdeploy from fastdeploy.distributed.communication import tensor_model_parallel_all_reduce +from fastdeploy.model_executor.layers.moe.moe import get_moe_scores from fastdeploy.model_executor.ops.gpu import ( MoeWna16MarlinGemmApi, - noaux_tc, tritonmoe_preprocess_func, ) from ..quantization.quant_base import QuantMethodBase -def get_moe_scores( - gating_output: paddle.Tensor, - n_group, - topk_group, - top_k, - routed_scaling_factor, - e_score_correction_bias, -) -> paddle.Tensor: - """ - compute moe scores using e_score_correction_bias. - """ - scores = paddle.nn.functional.sigmoid(gating_output) - scores_with_bias = scores + e_score_correction_bias.unsqueeze(0) - scores, topk_values, topk_idx = noaux_tc( - scores, - scores_with_bias, - n_group, - topk_group, - top_k, - routed_scaling_factor, - ) - return scores, topk_values, topk_idx - - def gptq_marlin_moe_repack( b_q_weight: paddle.Tensor, perm: paddle.Tensor, diff --git a/fastdeploy/model_executor/layers/moe/fused_moe_triton_backend.py b/fastdeploy/model_executor/layers/moe/fused_moe_triton_backend.py index 06e7d3670..bf3baaa91 100644 --- a/fastdeploy/model_executor/layers/moe/fused_moe_triton_backend.py +++ b/fastdeploy/model_executor/layers/moe/fused_moe_triton_backend.py @@ -24,7 +24,6 @@ from fastdeploy.model_executor.utils import TensorTracker, set_weight_attrs from fastdeploy.utils import ceil_div from ..quantization.quant_base import QuantMethodBase -from .ep import get_moe_scores try: from fastdeploy.model_executor.ops.gpu import tritonmoe_preprocess_func @@ -32,6 +31,7 @@ try: from .triton_moe_kernels import fused_moe_kernel_paddle except ImportError: pass +from fastdeploy.model_executor.layers.moe.moe import get_moe_scores class TritonWeightOnlyMoEMethod(QuantMethodBase): @@ -72,43 +72,70 @@ class TritonWeightOnlyMoEMethod(QuantMethodBase): layer.moe_intermediate_size, layer.hidden_size, ] - setattr( - layer, - up_gate_proj_weight_name, - layer.create_parameter( + if self.quant_config.is_checkpoint_bf16: + layer.up_gate_proj_weight = layer.create_parameter( shape=self.up_gate_proj_weight_shape, - dtype=self.weight_dtype, + dtype=layer.weight_dtype, default_initializer=paddle.nn.initializer.Constant(0), - ), - ) - setattr( - layer, - down_proj_weight_name, - layer.create_parameter( + ) + + layer.down_proj_weight = layer.create_parameter( shape=self.down_proj_weight_shape, - dtype=self.weight_dtype, + dtype=layer.weight_dtype, default_initializer=paddle.nn.initializer.Constant(0), - ), - ) - # weight_scale - setattr( - layer, - self.added_scale_attrs[0], - layer.create_parameter( - shape=[layer.num_local_experts, layer.moe_intermediate_size * 2], - dtype=self.default_dtype, - default_initializer=paddle.nn.initializer.Constant(0), - ), - ) - setattr( - layer, - self.added_scale_attrs[1], - layer.create_parameter( - shape=[layer.num_local_experts, layer.hidden_size], - dtype=self.default_dtype, - default_initializer=paddle.nn.initializer.Constant(0), - ), - ) + ) + set_weight_attrs( + layer.up_gate_proj_weight, + { + **extra_weight_attrs, + "tensor_track": TensorTracker(shape=layer.up_gate_proj_weight.shape, output_dim=True), + }, + ) + set_weight_attrs( + layer.down_proj_weight, + { + **extra_weight_attrs, + "tensor_track": TensorTracker(shape=layer.down_proj_weight.shape, output_dim=False), + }, + ) + else: + setattr( + layer, + up_gate_proj_weight_name, + layer.create_parameter( + shape=self.up_gate_proj_weight_shape, + dtype=self.weight_dtype, + default_initializer=paddle.nn.initializer.Constant(0), + ), + ) + setattr( + layer, + down_proj_weight_name, + layer.create_parameter( + shape=self.down_proj_weight_shape, + dtype=self.weight_dtype, + default_initializer=paddle.nn.initializer.Constant(0), + ), + ) + # weight_scale + setattr( + layer, + self.added_scale_attrs[0], + layer.create_parameter( + shape=[layer.num_local_experts, layer.moe_intermediate_size * 2], + dtype=self.default_dtype, + default_initializer=paddle.nn.initializer.Constant(0), + ), + ) + setattr( + layer, + self.added_scale_attrs[1], + layer.create_parameter( + shape=[layer.num_local_experts, layer.hidden_size], + dtype=self.default_dtype, + default_initializer=paddle.nn.initializer.Constant(0), + ), + ) def process_loaded_weights(self, layer: nn.Layer, state_dict): """ @@ -151,6 +178,62 @@ class TritonWeightOnlyMoEMethod(QuantMethodBase): getattr(layer, weight_name).set_value(quanted_weight) getattr(layer, scale_name).set_value(quanted_weight_scale) + def process_weights_after_loading(self, layer): + """ """ + if not self.quant_config.is_checkpoint_bf16: + return + + algo = layer.quant_method.quant_config.name() + assert algo == "wint8" + max_bound = 127 + weight_id_map = {"gate_up": 0, "down": 1} + if ( + hasattr(layer.up_gate_proj_weight, "tensor_track") + and layer.up_gate_proj_weight.tensor_track is not None + and layer.up_gate_proj_weight.tensor_track.is_fully_copied() + ): + weight_type = "gate_up" + layer.up_gate_proj_weight.tensor_track = None + else: + weight_type = "down" + layer.down_proj_weight.tensor_track = None + + # weight + weight_name = self.added_weight_attrs[weight_id_map[weight_type]] + # scale + scale_name = self.added_scale_attrs[weight_id_map[weight_type]] + + weight_tensor = getattr(layer, weight_name) + quanted_weight_scale = weight_tensor.abs().max(axis=1) + quanted_weight = weight_tensor / quanted_weight_scale[:, None, :] * max_bound + quanted_weight = paddle.round(quanted_weight).astype("int8") + quanted_weight_scale = quanted_weight_scale / max_bound + + getattr(layer, weight_name).value().get_tensor()._clear() + + # create weight + setattr( + layer, + weight_name, + layer.create_parameter( + shape=weight_tensor.shape, + dtype=quanted_weight.dtype, + default_initializer=paddle.nn.initializer.Constant(0), + ), + ) + # create scale + setattr( + layer, + scale_name, + layer.create_parameter( + shape=quanted_weight_scale.shape, + dtype=quanted_weight_scale.dtype, + default_initializer=paddle.nn.initializer.Constant(0), + ), + ) + getattr(layer, weight_name).copy_(quanted_weight, False) + getattr(layer, scale_name).copy_(quanted_weight_scale, False) + def apply( self, layer: nn.Layer, @@ -164,12 +247,11 @@ class TritonWeightOnlyMoEMethod(QuantMethodBase): token_num = x.shape[0] top_k = layer.top_k num_local_experts = layer.num_local_experts - top_k = layer.top_k moe_intermediate_size = layer.moe_intermediate_size hidden_size = layer.hidden_size if layer.topk_method == "noaux_tc": - _, topk_weights, topk_ids = get_moe_scores( + gate_out, topk_weights, topk_ids = get_moe_scores( gate_out, layer.n_group, layer.topk_group, @@ -177,15 +259,15 @@ class TritonWeightOnlyMoEMethod(QuantMethodBase): layer.routed_scaling_factor, layer.gate_correction_bias, ) + topk_weights, topk_ids = paddle.topk(gate_out, k=layer.top_k, axis=-1, sorted=False) else: topk_ids, topk_weights = fastdeploy.model_executor.ops.gpu.moe_topk_select( gate_out, layer.gate_correction_bias, - layer.top_k, - True, # apply_norm_weight + top_k, + True, # apply_norm_weight, False, ) - up_gate_proj_out = paddle.empty( [token_num * top_k, moe_intermediate_size * 2], dtype=x.dtype, @@ -302,6 +384,9 @@ class TritonWeightOnlyMoEMethod(QuantMethodBase): down_proj_out.reshape_([token_num, top_k, hidden_size]) out = down_proj_out.sum(axis=1) + if layer.reduce_results and layer.tp_size > 1: + tensor_model_parallel_all_reduce(out) + return out @@ -432,7 +517,6 @@ class TensorWiseFP8MoEMethod(QuantMethodBase): hidden_size = layer.hidden_size if layer.topk_method == "noaux_tc": - _, topk_weights, topk_ids = get_moe_scores( gate_out, layer.n_group, diff --git a/fastdeploy/model_executor/layers/moe/moe.py b/fastdeploy/model_executor/layers/moe/moe.py index bc58ef3eb..76c962069 100644 --- a/fastdeploy/model_executor/layers/moe/moe.py +++ b/fastdeploy/model_executor/layers/moe/moe.py @@ -27,6 +27,11 @@ from fastdeploy.model_executor.utils import slice_fn from fastdeploy.platforms import current_platform from fastdeploy.worker.experts_manager import RedundantExpertManger +try: + from fastdeploy.model_executor.ops.gpu import noaux_tc +except: + logger.warning("import noaux_tc Failed!") + def get_moe_method(): """ @@ -54,6 +59,31 @@ def get_moe_method(): raise NotImplementedError +def get_moe_scores( + gating_output: paddle.Tensor, + n_group, + topk_group, + top_k, + routed_scaling_factor, + e_score_correction_bias, +) -> paddle.Tensor: + """ + compute moe scores using e_score_correction_bias. + """ + scores = paddle.nn.functional.sigmoid(gating_output) + assert e_score_correction_bias is not None, "e_score_correction_bias is none!" + scores_with_bias = scores + e_score_correction_bias + scores, topk_values, topk_idx = noaux_tc( + scores, + scores_with_bias, + n_group if n_group > 0 else 1, + topk_group if topk_group > 0 else 1, + top_k, + routed_scaling_factor, + ) + return scores, topk_values, topk_idx + + class FusedMoE(nn.Layer): """ FusedMoE is a layer that performs MoE (Mixture of Experts) computation. diff --git a/fastdeploy/model_executor/layers/quantization/mix_quant.py b/fastdeploy/model_executor/layers/quantization/mix_quant.py index 05c456d55..a88efb7c1 100644 --- a/fastdeploy/model_executor/layers/quantization/mix_quant.py +++ b/fastdeploy/model_executor/layers/quantization/mix_quant.py @@ -76,13 +76,13 @@ class MixQuantConfig(QuantConfigBase): if layer.moe_tag == "Image": return ( get_quantization_config(self.image_moe_quant_type) - .from_config({"is_permuted": self.is_permuted, "self.is_checkpoint_bf16": self.is_checkpoint_bf16}) + .from_config({"is_permuted": self.is_permuted, "is_checkpoint_bf16": self.is_checkpoint_bf16}) .get_quant_method(layer) ) else: return ( get_quantization_config(self.moe_quant_type) - .from_config({"is_permuted": self.is_permuted, "self.is_checkpoint_bf16": self.is_checkpoint_bf16}) + .from_config({"is_permuted": self.is_permuted, "is_checkpoint_bf16": self.is_checkpoint_bf16}) .get_quant_method(layer) ) elif isinstance(layer, Attention): @@ -97,6 +97,6 @@ class MixQuantConfig(QuantConfigBase): else: return ( get_quantization_config(self.dense_quant_type) - .from_config({"self.is_checkpoint_bf16": self.is_checkpoint_bf16}) + .from_config({"is_checkpoint_bf16": self.is_checkpoint_bf16}) .get_quant_method(layer) ) diff --git a/fastdeploy/model_executor/layers/quantization/weight_only.py b/fastdeploy/model_executor/layers/quantization/weight_only.py index 89c0a5d88..b4c4ba676 100644 --- a/fastdeploy/model_executor/layers/quantization/weight_only.py +++ b/fastdeploy/model_executor/layers/quantization/weight_only.py @@ -44,6 +44,7 @@ class WeightOnlyConfig(QuantConfigBase): def __init__( self, algo: str, + is_checkpoint_bf16: bool = False, ) -> None: super().__init__() self.algo = algo @@ -55,6 +56,7 @@ class WeightOnlyConfig(QuantConfigBase): self.quant_max_bound = 0 self.quant_min_bound = 0 self.quant_round_type = 0 + self.is_checkpoint_bf16 = is_checkpoint_bf16 def name(self) -> str: return "weight_only" @@ -62,7 +64,8 @@ class WeightOnlyConfig(QuantConfigBase): @classmethod def from_config(cls, config: dict) -> "WeightOnlyConfig": algo = config["algo"] - return cls(algo) + is_checkpoint_bf16 = config.get("is_checkpoint_bf16", False) + return cls(algo, is_checkpoint_bf16=is_checkpoint_bf16) def get_quant_method(self, layer) -> Optional[QuantMethodBase]: if current_platform.is_xpu(): @@ -153,12 +156,13 @@ class WINT8Config(WeightOnlyConfig): weight only int8 config """ - def __init__(self) -> None: - super().__init__("weight_only_int8") + def __init__(self, is_checkpoint_bf16: bool = False) -> None: + super().__init__("weight_only_int8", is_checkpoint_bf16) @classmethod def from_config(cls, config: dict) -> "WINT8Config": - return cls() + is_checkpoint_bf16 = config.get("is_checkpoint_bf16", False) + return cls(is_checkpoint_bf16) def name(self) -> str: return "wint8" diff --git a/fastdeploy/model_executor/layers/quantization/wfp8afp8.py b/fastdeploy/model_executor/layers/quantization/wfp8afp8.py index f868a9aab..93f96bf54 100644 --- a/fastdeploy/model_executor/layers/quantization/wfp8afp8.py +++ b/fastdeploy/model_executor/layers/quantization/wfp8afp8.py @@ -14,10 +14,15 @@ # limitations under the License. """ +import copy from typing import Optional import paddle +from fastdeploy.model_executor.layers.linear import ( + MergedColumnParallelLinear, + QKVParallelLinear, +) from fastdeploy.model_executor.layers.quantization.ops import ( cutlass_scaled_mm, scaled_fp8_quant, @@ -26,6 +31,8 @@ from fastdeploy.model_executor.layers.quantization.quant_base import ( QuantConfigBase, QuantMethodBase, ) +from fastdeploy.model_executor.layers.utils import per_token_cast_to_fp8 +from fastdeploy.model_executor.utils import TensorTracker, set_weight_attrs class WFP8AFP8Config(QuantConfigBase): @@ -33,13 +40,19 @@ class WFP8AFP8Config(QuantConfigBase): Quantization config for weight and activation with FP8. """ - def __init__(self, weight_scale_dict, act_scale_dict) -> None: + def __init__( + self, + activation_scheme: str = "dynamic", + weight_block_size: list[int] = [-1, 1], + is_checkpoint_bf16: bool = False, + ) -> None: super().__init__() - self.weight_scale_dict = weight_scale_dict - self.act_scale_dict = act_scale_dict self.quant_max_bound = 448 self.quant_min_bound = -448 self.quant_round_type = 1 + self.activation_scheme = activation_scheme + self.weight_block_size = weight_block_size + self.is_checkpoint_bf16 = is_checkpoint_bf16 def name(self) -> str: """ """ @@ -48,9 +61,8 @@ class WFP8AFP8Config(QuantConfigBase): @classmethod def from_config(cls, config: dict) -> "WFP8AFP8Config": """ """ - weight_scale_dict = config.get("weight_scale_dict", None) - act_scale_dict = config.get("act_scale_dict", None) - return cls(weight_scale_dict, act_scale_dict) + is_checkpoint_bf16 = config.get("is_checkpoint_bf16", False) + return cls(is_checkpoint_bf16=is_checkpoint_bf16) def get_quant_method(self, layer) -> Optional[QuantMethodBase]: """ """ @@ -68,26 +80,85 @@ class WFP8AFP8LinearMethod(QuantMethodBase): ) -> None: super().__init__() self.quant_config = quant_config + self.use_per_token_if_dynamic = True def create_weights(self, layer, **extra_weight_attrs): """ """ - layer.weight_shape.reverse() - layer.weight_dtype = "float8_e4m3fn" - # TODO(YuanRisheng): set weight logic should be moved to process_loaded_weights func - self.skip_quant = False - layer.create_parameter( - shape=layer.weight_shape, - dtype=layer.weight_dtype, + weight_shape = layer.weight_shape + weight_block_size = self.quant_config.weight_block_size + assert len(weight_shape) == 2 and len(weight_block_size) == 2 + scale_shape = copy.deepcopy(weight_shape) + for i in range(len(weight_shape)): + scale_shape[i] = ( + (weight_shape[i] + weight_block_size[i] - 1) // weight_block_size[i] if weight_block_size[i] > 0 else 1 + ) + scale_shape = scale_shape[::-1] + if self.quant_config.is_checkpoint_bf16: + self.use_per_token_if_dynamic = True + layer.weight = layer.create_parameter( + shape=weight_shape, + dtype=layer.weight_dtype, + is_bias=False, + default_initializer=paddle.nn.initializer.Constant(0), + ) + quant_attrs = extra_weight_attrs + if isinstance(layer, MergedColumnParallelLinear) or isinstance(layer, QKVParallelLinear): + quant_attrs = { + **extra_weight_attrs, + "tensor_track": TensorTracker( + shape=layer.weight_shape, output_dim=extra_weight_attrs.get("output_dim") + ), + } + set_weight_attrs( + layer.weight, + quant_attrs, + ) + else: + layer.weight_shape.reverse() + layer.weight_dtype = "float8_e4m3fn" + # TODO(YuanRisheng): set weight logic should be moved to process_loaded_weights func + self.skip_quant = False + layer.weight = layer.create_parameter( + shape=layer.weight_shape, + dtype=layer.weight_dtype, + is_bias=False, + default_initializer=paddle.nn.initializer.Constant(0), + ) + layer.weight_scale = layer.create_parameter( + shape=scale_shape, + dtype="float32", + is_bias=False, + default_initializer=paddle.nn.initializer.Constant(0), + ) + + def process_weights_after_loading(self, layer) -> None: + if not self.quant_config.is_checkpoint_bf16: + return + weight_tensor = layer.weight.transpose([1, 0]).contiguous() + assert self.quant_config.weight_block_size == [-1, 1] + qweight, weight_scale = per_token_cast_to_fp8(weight_tensor) + + if hasattr(layer.weight, "tensor_track"): + layer.weight.tensor_track = None + layer.weight.value().get_tensor()._clear() + del layer.weight + + layer.weight = layer.create_parameter( + shape=qweight.shape, + dtype="float8_e4m3fn", is_bias=False, default_initializer=paddle.nn.initializer.Constant(0), ) layer.weight_scale = layer.create_parameter( - shape=[1], + shape=weight_scale.shape, dtype="float32", is_bias=False, default_initializer=paddle.nn.initializer.Constant(0), ) + layer.weight.copy_(qweight, False) + layer.weight_scale.copy_(weight_scale, False) + def process_loaded_weights(self, layer, weights) -> None: """ """ if self.skip_quant: @@ -97,18 +168,12 @@ class WFP8AFP8LinearMethod(QuantMethodBase): if weights.dtype != paddle.float8_e4m3fn: self.use_per_token_if_dynamic = True weight_tensor = weights.transpose([1, 0]).contiguous() - qweight, weight_scale = scaled_fp8_quant( - weight_tensor, - use_per_token_if_dynamic=False, - ) + qweight, weight_scale = per_token_cast_to_fp8(weight_tensor) layer.weight.copy_(qweight, False) layer.weight_scale.set_value(weight_scale) def apply(self, layer, x): """ """ - if self.skip_quant: - linear_out = paddle.matmul(x, layer.weight, False, True) - return linear_out if self.use_per_token_if_dynamic: out_type = x.dtype a_q, a_scales = scaled_fp8_quant(x, use_per_token_if_dynamic=self.use_per_token_if_dynamic) diff --git a/fastdeploy/model_executor/layers/rotary_embedding.py b/fastdeploy/model_executor/layers/rotary_embedding.py index e52add837..1d405d7a9 100644 --- a/fastdeploy/model_executor/layers/rotary_embedding.py +++ b/fastdeploy/model_executor/layers/rotary_embedding.py @@ -73,6 +73,30 @@ class ErnieRotaryEmbedding: return rot_emb +class GlmRotaryEmbedding: + def __init__(self, rotary_dim, base, partial_rotary_factor): + """ + Pre-calculate rotary position embedding for position_ids. + """ + self.rotary_dim = rotary_dim + self.base = base + if partial_rotary_factor < 1.0: + self.rotary_dim = int(self.rotary_dim * partial_rotary_factor) + + def __call__(self, position_ids): + bsz, max_seq_len = position_ids.shape[:2] + inv_freq = self.base ** (-paddle.arange(0, self.rotary_dim, 2, dtype="float32") / self.rotary_dim) + freqs = paddle.einsum("ij,k->ijk", position_ids.cast("float32"), inv_freq) + # shape: [B, S, D/2] + rot_emb = paddle.zeros((2, bsz, max_seq_len, 1, self.rotary_dim // 2), dtype="float32") + emb = paddle.stack([freqs], axis=-1).reshape((bsz, max_seq_len, self.rotary_dim // 2)) + # shape: [B, S, 1, D] + emb = paddle.unsqueeze(emb, 2) + rot_emb[0] = paddle.cos(emb) + rot_emb[1] = paddle.sin(emb) + return rot_emb + + class QwenRotaryEmbedding: def __init__(self, rotary_dim, base, partial_rotary_factor): """ @@ -246,6 +270,9 @@ def get_rope_impl( if model_config is None or architecture.startswith("Qwen"): rotary_emb_layer = QwenRotaryEmbedding(rotary_dim, base, partial_rotary_factor) rotary_emb = rotary_emb_layer(position_ids) + elif architecture.startswith("Glm"): + rotary_emb_layer = GlmRotaryEmbedding(rotary_dim, base, partial_rotary_factor) + rotary_emb = rotary_emb_layer(position_ids) else: rotary_emb_layer = ErnieRotaryEmbedding(rotary_dim, base, partial_rotary_factor) rotary_emb = rotary_emb_layer(position_ids) diff --git a/fastdeploy/model_executor/layers/utils.py b/fastdeploy/model_executor/layers/utils.py index 85de8ec4c..76ab1bd9a 100644 --- a/fastdeploy/model_executor/layers/utils.py +++ b/fastdeploy/model_executor/layers/utils.py @@ -77,6 +77,17 @@ def per_block_cast_to_fp8(x: Tensor, block_size: list = [128, 128]) -> Tuple[Ten ) +def per_token_cast_to_fp8(x: Tensor) -> Tuple[Tensor, Tensor]: + """ + Per token cast to float8_e4m3fn used in wfp8apf8 + """ + x_abs = paddle.abs(x).astype(paddle.float32) + x_max = x_abs.max(axis=-1, keepdim=True).clip_(min=1e-4) + x_s = x_max / 448.0 + x_q = paddle.clip(x / x_s, -448.0, 448.0).astype(paddle.float8_e4m3fn) + return x_q, x_s + + # for distributed tensor model parallel def _set_var_distributed(var: Tensor, split_axis: int): """ diff --git a/fastdeploy/model_executor/models/glm4_moe.py b/fastdeploy/model_executor/models/glm4_moe.py new file mode 100644 index 000000000..e9a272e4c --- /dev/null +++ b/fastdeploy/model_executor/models/glm4_moe.py @@ -0,0 +1,579 @@ +""" +# Copyright (c) 2025 PaddlePaddle Authors. All Rights Reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +""" + +from __future__ import annotations + +import re +from functools import partial + +import paddle +from paddle import nn +from paddleformers.transformers import PretrainedModel +from paddleformers.utils.log import logger + +from fastdeploy.config import FDConfig +from fastdeploy.distributed.communication import tensor_model_parallel_all_reduce +from fastdeploy.model_executor.forward_meta import ForwardMeta +from fastdeploy.model_executor.graph_optimization.decorator import ( + support_graph_optimization, +) +from fastdeploy.model_executor.layers.activation import SiluAndMul +from fastdeploy.model_executor.layers.attention.attention import Attention +from fastdeploy.model_executor.layers.embeddings import VocabParallelEmbedding +from fastdeploy.model_executor.layers.linear import ( + MergedColumnParallelLinear, + QKVParallelLinear, + ReplicatedLinear, + RowParallelLinear, +) +from fastdeploy.model_executor.layers.lm_head import ParallelLMHead +from fastdeploy.model_executor.layers.moe.moe import FusedMoE +from fastdeploy.model_executor.layers.normalization import RMSNorm +from fastdeploy.model_executor.models.model_base import ModelForCasualLM + + +class Glm4MoeMLP(nn.Layer): + """ """ + + def __init__( + self, + fd_config: FDConfig, + intermediate_size: int, + prefix: str = "", + reduce_results: bool = True, + ) -> None: + super().__init__() + + self.up_gate_proj = MergedColumnParallelLinear( + fd_config=fd_config, + prefix=f"{prefix}.up_gate_proj", + input_size=fd_config.model_config.hidden_size, + output_size=intermediate_size * 2, + with_bias=False, + activation=fd_config.model_config.hidden_act, + ) + + self.down_proj = RowParallelLinear( + fd_config=fd_config, + prefix=f"{prefix}.down_proj", + input_size=intermediate_size, + output_size=fd_config.model_config.hidden_size, + with_bias=False, + reduce_results=reduce_results, + ) + + self.act_fn = SiluAndMul( + fd_config=fd_config, + bias=None, + act_method=fd_config.model_config.hidden_act, + ) + + def forward(self, x): + """ """ + gate_up_out = self.up_gate_proj(x) + act_out = self.act_fn(gate_up_out) + down_out = self.down_proj(act_out) + return down_out + + +class Glm4Moe(nn.Layer): + def __init__( + self, + fd_config: FDConfig, + layer_id: int, + prefix: str = "", + ) -> None: + super().__init__() + + self.expert_parallel_size = fd_config.parallel_config.expert_parallel_size + self.tensor_parallel_size = fd_config.parallel_config.tensor_parallel_size + self.tensor_parallel_rank = fd_config.parallel_config.tensor_parallel_rank + self.tp_group = fd_config.parallel_config.tp_group + + self.use_ep = self.expert_parallel_size > 1 + self.use_tp = self.tensor_parallel_size > 1 + + self.n_routed_experts: int = fd_config.model_config.n_routed_experts + self.n_shared_experts: int = fd_config.model_config.n_shared_experts + + weight_key_map = { + "gate_correction_bias_key": f"{prefix}.gate.e_score_correction_bias", + "up_gate_proj_expert_weight_key": f"{prefix}.experts.{{}}.up_gate_proj.weight", + "down_proj_expert_weight_key": f"{prefix}.experts.{{}}.down_proj.weight", + } + + self.gate = ReplicatedLinear( + fd_config=fd_config, + prefix=f"{prefix}.gate", + input_size=fd_config.model_config.hidden_size, + output_size=fd_config.model_config.n_routed_experts, + with_bias=False, + skip_quant=True, + weight_dtype="float32", + ) + self.gate.e_score_correction_bias = self.create_parameter( + shape=[1, fd_config.model_config.n_routed_experts], + dtype="float32", + default_initializer=paddle.nn.initializer.Constant(0), + ) + + self.experts = FusedMoE( + fd_config, + reduce_results=False, + moe_intermediate_size=fd_config.model_config.moe_intermediate_size, + num_experts=fd_config.model_config.n_routed_experts, + top_k=fd_config.model_config.num_experts_per_tok, + topk_method="noaux_tc", + topk_group=fd_config.model_config.topk_group, + n_group=fd_config.model_config.n_group, + routed_scaling_factor=fd_config.model_config.routed_scaling_factor, + layer_idx=layer_id, + gate_correction_bias=self.gate.e_score_correction_bias, + weight_key_map=weight_key_map, + ) + + shared_experts_intermediate_size = self.n_shared_experts * fd_config.model_config.moe_intermediate_size + + self.shared_experts = Glm4MoeMLP( + fd_config=fd_config, + intermediate_size=shared_experts_intermediate_size, + prefix=f"{prefix}.shared_experts", + reduce_results=False, + ) + + def forward(self, x): + shared_experts_out = self.shared_experts(x) + out = self.experts(x, self.gate) + out = out + shared_experts_out + # We do to TP all reduce after the sum of experts. + if self.tensor_parallel_size > 1: + tensor_model_parallel_all_reduce(out) + return out + + +class Glm4MoeAttention(nn.Layer): + """ """ + + def __init__(self, fd_config: FDConfig, layer_id: int, prefix: str = "") -> None: + super().__init__() + + tp_size = fd_config.parallel_config.tensor_parallel_size + self.fd_config = fd_config + self.head_dim = fd_config.model_config.head_dim + self.num_heads = fd_config.model_config.num_attention_heads // tp_size + self.num_kv_heads = fd_config.model_config.num_key_value_heads // tp_size + self.attention_bias = fd_config.model_config.attention_bias + self.use_qk_norm = fd_config.model_config.use_qk_norm + self.q_size = self.num_heads * self.head_dim + self.kv_size = self.num_kv_heads * self.head_dim + + self.qkv_proj = QKVParallelLinear(fd_config, prefix=f"{prefix}.qkv_proj", with_bias=self.attention_bias) + + self.o_proj = RowParallelLinear( + fd_config, + prefix=f"{prefix}.o_proj", + input_size=fd_config.model_config.num_attention_heads * fd_config.model_config.head_dim, + output_size=fd_config.model_config.hidden_size, + ) + + self.attn = Attention( + fd_config, + layer_id=layer_id, + prefix=prefix, + use_neox_rotary_style=True, + rms_norm_eps=fd_config.model_config.rms_norm_eps, + ) + if self.use_qk_norm: + self.q_norm = RMSNorm( + fd_config, + hidden_size=self.head_dim, + eps=fd_config.model_config.rms_norm_eps, + prefix=f"{prefix}.q_norm", + begin_norm_axis=2, + ) + self.k_norm = RMSNorm( + fd_config, + hidden_size=self.head_dim, + eps=fd_config.model_config.rms_norm_eps, + prefix=f"{prefix}.k_norm", + begin_norm_axis=2, + ) + + def forward( + self, + forward_meta: ForwardMeta, + hidden_states: paddle.Tensor, + ): + """ """ + qkv_out = self.qkv_proj(hidden_states) + + if self.use_qk_norm: + q, k, v = qkv_out.split([self.q_size, self.kv_size, self.kv_size], axis=-1) + q = self.q_norm(q.reshape([-1, self.num_heads, self.head_dim])).reshape(q.shape) + k = self.k_norm(k.reshape([-1, self.num_kv_heads, self.head_dim])).reshape(k.shape) + qkv_out = paddle.concat([q, k, v], axis=-1) + + atten_out = self.attn( + qkv=qkv_out, + forward_meta=forward_meta, + ) + output = self.o_proj(atten_out) + return output + + +class Glm4MoeDecoderLayer(nn.Layer): + """ """ + + def __init__( + self, + fd_config: FDConfig, + prefix: str = "", + ) -> None: + super().__init__() + + layer_id = int(prefix.split(sep=".")[-1]) + self.self_attn = Glm4MoeAttention( + fd_config=fd_config, + layer_id=layer_id, + prefix=f"{prefix}.self_attn", + ) + + if ( + fd_config.model_config.n_routed_experts is not None + and layer_id >= fd_config.model_config.first_k_dense_replace + ): + self.mlp = Glm4Moe(fd_config, layer_id, prefix=f"{prefix}.mlp") + else: + self.mlp = Glm4MoeMLP( + fd_config, + intermediate_size=fd_config.model_config.intermediate_size, + prefix=f"{prefix}.mlp", + ) + + self.input_layernorm = RMSNorm( + fd_config, + hidden_size=fd_config.model_config.hidden_size, + eps=fd_config.model_config.rms_norm_eps, + prefix=f"{prefix}.input_layernorm", + ) + + self.post_attention_layernorm = RMSNorm( + fd_config, + hidden_size=fd_config.model_config.hidden_size, + eps=fd_config.model_config.rms_norm_eps, + prefix=f"{prefix}.post_attention_layernorm", + ) + + def forward( + self, + forward_meta: ForwardMeta, + hidden_states: paddle.Tensor, + residual: paddle.Tensor = None, + ): + """ """ + if residual is None: + residual = hidden_states + hidden_states = self.input_layernorm(hidden_states) + else: + hidden_states, residual = self.input_layernorm(hidden_states, residual) + + hidden_states = self.self_attn( + hidden_states=hidden_states, + forward_meta=forward_meta, + ) + + # Fully Connected + hidden_states, residual = self.post_attention_layernorm(hidden_states, residual) + + hidden_states = self.mlp(hidden_states) + + return hidden_states, residual + + +@support_graph_optimization +class Glm4MoeModel(nn.Layer): + """ """ + + def __init__( + self, + fd_config: FDConfig = None, + ): + """ + Initializer for the Qwen2Model class. + + Args: + + """ + super().__init__() + + self.num_layers = fd_config.model_config.num_hidden_layers + fd_config.model_config.pretrained_config.prefix_name = "model" + + self.embed_tokens = VocabParallelEmbedding( + fd_config, + num_embeddings=fd_config.model_config.vocab_size, + embedding_dim=fd_config.model_config.hidden_size, + params_dtype=paddle.get_default_dtype, + prefix=(f"{fd_config.model_config.pretrained_config.prefix_name}.embed_tokens"), + ) + + self.layers = nn.LayerList( + [ + Glm4MoeDecoderLayer( + fd_config, + prefix=f"{fd_config.model_config.pretrained_config.prefix_name}.layers.{i}", + ) + for i in range(self.num_layers) + ] + ) + + self.norm = RMSNorm( + fd_config, + hidden_size=fd_config.model_config.hidden_size, + eps=fd_config.model_config.rms_norm_eps, + prefix=f"{fd_config.model_config.pretrained_config.prefix_name}.norm", + ) + + def forward( + self, + ids_remove_padding: paddle.Tensor, + forward_meta: ForwardMeta, + ): + """ """ + hidden_states = self.embed_tokens(ids_remove_padding=ids_remove_padding) + + residual = None + + for i in range(self.num_layers): + hidden_states, residual = self.layers[i](forward_meta, hidden_states, residual) + hidden_states = hidden_states + residual + + out = self.norm(hidden_states) + + return out + + +class Glm4MoeForCausalLM(ModelForCasualLM): + """ + Glm4MoeForCausalLM + """ + + def __init__(self, fd_config: FDConfig): + """ + Args: + fd_config (FDConfig): Configurations for the LLM model. + """ + super(Glm4MoeForCausalLM, self).__init__(fd_config) + + self.model = Glm4MoeModel(fd_config) + + self.ori_vocab_size = fd_config.model_config.ori_vocab_size + + self.lm_head = ParallelLMHead( + fd_config, + embedding_dim=fd_config.model_config.hidden_size, + num_embeddings=fd_config.model_config.vocab_size, + prefix="lm_head", + ) + + @classmethod + def name(self): + """ """ + return "Glm4MoeForCausalLM" + + @paddle.no_grad() + def load_weights(self, weights_iterator) -> None: + """ + Load model parameters from a given weights_iterator object. + + Args: + weights_iterator (Iterator): An iterator yielding (name, weight) pairs. + """ + + from fastdeploy.model_executor.utils import ( + default_weight_loader, + process_weights_after_loading, + ) + + stacked_params_mapping = [ + # (param_name, shard_name, shard_id) + ("qkv_proj", "q_proj", "q"), + ("qkv_proj", "k_proj", "k"), + ("qkv_proj", "v_proj", "v"), + ("up_gate_proj", "gate_proj", "gate"), + ("up_gate_proj", "up_proj", "up"), + ("embed_tokens.embeddings", "embed_tokens", None), + ("lm_head.linear", "lm_head", None), + ("experts.gate_correction_bias", "gate.e_score_correction_bias", None), + ] + # (param_name, weight_name, expert_id, shard_id) + expert_params_mapping = FusedMoE.make_expert_params_mapping( + num_experts=self.fd_config.model_config.n_routed_experts, + ckpt_gate_proj_name="gate_proj", + ckpt_down_proj_name="down_proj", + ckpt_up_proj_name="up_proj", + param_gate_up_proj_name="experts.up_gate_proj_", + param_down_proj_name="experts.down_proj_", + ) + params_dict = dict(self.named_parameters()) + process_weights_after_loading_fn = process_weights_after_loading(dict(self.named_sublayers())) + for loaded_weight_name, loaded_weight in weights_iterator: + for param_name, weight_name, shard_id in stacked_params_mapping: + if weight_name not in loaded_weight_name: + continue + if "mlp.experts" in loaded_weight_name: + continue + model_param_name = loaded_weight_name.replace(weight_name, param_name) + if model_param_name not in params_dict: + continue + param = params_dict[model_param_name] + weight_loader = getattr(param, "weight_loader", default_weight_loader(self.fd_config)) + weight_loader(param, loaded_weight, shard_id) + break + else: + for mapping in expert_params_mapping: + param_name, weight_name, expert_id, shard_id = mapping + if weight_name not in loaded_weight_name: + continue + model_param_name = loaded_weight_name.replace(weight_name, param_name) + if model_param_name not in params_dict: + continue + param = params_dict[model_param_name] + weight_loader = param.weight_loader + weight_loader(param, loaded_weight, shard_id=shard_id, expert_id=expert_id) + break + else: + model_param_name = loaded_weight_name + if model_param_name not in params_dict: + continue + param = params_dict[model_param_name] + weight_loader = getattr(param, "weight_loader", default_weight_loader(self.fd_config)) + weight_loader(param, loaded_weight) + + model_sublayer_name = re.sub(r"\.(up_gate_proj_weight|down_proj_weight|weight)$", "", model_param_name) + process_weights_after_loading_fn(model_sublayer_name, param) + + @paddle.no_grad() + def set_state_dict(self, state_dict): + """ + glm4_moe only support loader_v1. + """ + assert False, "glm4_moe only support --load_choices default_v1." + + def compute_logits(self, hidden_states: paddle.Tensor): + """ """ + logits = self.lm_head(hidden_states) + logits = logits.astype(paddle.float32) + logits[:, self.ori_vocab_size :] = -float("inf") + + return logits + + def forward( + self, + ids_remove_padding: paddle.Tensor, + forward_meta: ForwardMeta, + ): + """ """ + hidden_states = self.model(ids_remove_padding=ids_remove_padding, forward_meta=forward_meta) + + return hidden_states + + def clear_grpah_opt_backend(self): + """Clear graph optimization backend, the captured cuda graph will be cleaned""" + self.model.clear_grpah_opt_backend(fd_config=self.fd_config) + + +class Glm4MoePretrainedModel(PretrainedModel): + """ + Glm4MoePretrainedModel + """ + + config_class = FDConfig + + def _init_weight(self, layer): + """ + _init_weight + """ + return None + + @classmethod + def arch_name(self): + return "Glm4MoeForCausalLM" + + @classmethod + def _get_tensor_parallel_mappings(cls, config, is_split=True): + + logger.info("Glm4Moe inference model _get_tensor_parallel_mappings") + + from fastdeploy.model_executor.models.tp_utils import split_or_merge_func_v1 + + fn = split_or_merge_func_v1( + is_split=is_split, + tensor_parallel_degree=config.tensor_parallel_degree, + tensor_parallel_rank=config.tensor_parallel_rank, + num_attention_heads=config.num_attention_heads, + num_key_value_heads=config.num_key_value_heads, + head_dim=config.head_dim, + ) + + def get_tensor_parallel_split_mappings(num_layers): + final_actions = {} + + base_actions = { + "lm_head.weight": partial(fn, is_column=True), + "embed_tokens.weight": partial(fn, is_column=False), + "layers.0.self_attn.o_proj.weight": partial(fn, is_column=False), + } + + # Self Attention Layer which are need TP. + base_actions["layers.0.self_attn.q_proj.weight"] = partial(fn, is_column=True) + base_actions["layers.0.self_attn.k_proj.weight"] = partial(fn, is_column=True) + base_actions["layers.0.self_attn.v_proj.weight"] = partial(fn, is_column=True) + base_actions["layers.0.self_attn.q_proj.bias"] = partial(fn, is_column=True) + base_actions["layers.0.self_attn.k_proj.bias"] = partial(fn, is_column=True) + base_actions["layers.0.self_attn.v_proj.bias"] = partial(fn, is_column=True) + + # MLP Layer + base_actions["layers.0.mlp.gate_proj.weight"] = partial(fn, is_column=True) + base_actions["layers.0.mlp.up_proj.weight"] = partial(fn, is_column=True) + base_actions["layers.0.mlp.down_proj.weight"] = partial(fn, is_column=False) + + # Moe Layer + for expert_idx in range(config.n_routed_experts): + base_actions[f"layers.0.mlp.experts.{expert_idx}.up_proj.weight"] = partial(fn, is_column=True) + base_actions[f"layers.0.mlp.experts.{expert_idx}.gate_proj.weight"] = partial(fn, is_column=True) + base_actions[f"layers.0.mlp.experts.{expert_idx}.down_proj.weight"] = partial(fn, is_column=False) + + # Shared Expert Layer + base_actions["layers.0.mlp.shared_experts.up_proj.weight"] = partial(fn, is_column=True) + base_actions["layers.0.mlp.shared_experts.gate_proj.weight"] = partial(fn, is_column=True) + base_actions["layers.0.mlp.shared_experts.down_proj.weight"] = partial(fn, is_column=False) + + # MTP parts + base_actions["layers.46.embed_tokens.weight"] = partial(fn, is_column=False) + base_actions["layers.46.eh_proj.weight"] = partial(fn, is_column=True) + base_actions["layers.46.shared_head.head.weight"] = partial(fn, is_column=True) + + for key, action in base_actions.items(): + if "layers.0." in key: + for i in range(num_layers): + final_actions[key.replace("layers.0.", f"layers.{i}.")] = action + final_actions[key] = action + + return final_actions + + mappings = get_tensor_parallel_split_mappings(config.num_hidden_layers) + return mappings diff --git a/fastdeploy/rl/rollout_config.py b/fastdeploy/rl/rollout_config.py index 3cd2771fc..42a363ded 100644 --- a/fastdeploy/rl/rollout_config.py +++ b/fastdeploy/rl/rollout_config.py @@ -14,6 +14,8 @@ # limitations under the License. """ +from typing import Any, Dict, Optional + from fastdeploy.worker.worker_process import initialize_fd_config @@ -52,7 +54,7 @@ class RolloutModelConfig: expert_parallel_size: int = 1, enable_expert_parallel: bool = False, ori_vocab_size: int = None, - quantization: str = "None", + quantization: Optional[Dict[str, Any]] = None, guided_decoding_backend: str = "off", disable_any_whitespace: bool = True, enable_logprob: bool = False, diff --git a/fastdeploy/rl/rollout_model.py b/fastdeploy/rl/rollout_model.py index f6c390120..bc10fd121 100644 --- a/fastdeploy/rl/rollout_model.py +++ b/fastdeploy/rl/rollout_model.py @@ -14,6 +14,7 @@ # limitations under the License. """ +import copy from typing import Dict import paddle @@ -28,6 +29,10 @@ from fastdeploy.model_executor.models.ernie4_5_vl.ernie4_5_vl_moe import ( Ernie4_5_VLMoeForConditionalGeneration, Ernie4_5_VLPretrainedModel, ) +from fastdeploy.model_executor.models.glm4_moe import ( + Glm4MoeForCausalLM, + Glm4MoePretrainedModel, +) from fastdeploy.model_executor.models.model_base import ModelRegistry from fastdeploy.model_executor.models.qwen2 import ( Qwen2ForCausalLM, @@ -529,3 +534,83 @@ class Qwen2_5_VLForConditionalGenerationRL(Qwen2_5_VLForConditionalGeneration, B self._complete_missing_mappings() return self.infer_to_train_mapping + + +class Glm4MoeForCausalLMRL(Glm4MoeForCausalLM, BaseRLModel): + """ + Glm4MoeForCausalLMRL + """ + + _get_tensor_parallel_mappings = Glm4MoePretrainedModel._get_tensor_parallel_mappings + + def __init__(self, fd_config: FDConfig): + """ + Args: + fd_config (FDConfig): Configurations for the LLM model. + """ + super(Glm4MoeForCausalLMRL, self).__init__(fd_config) + + @classmethod + def name(self) -> str: + """name""" + return "Glm4MoeForCausalLMRL" + + def get_name_mappings_to_training(self, trainer_degree=None) -> Dict[str, str]: + """Generate mapping between inference and training parameter for RL(donot delete!).""" + if self._mappings_built: + return self.infer_to_train_mapping + + self.infer_to_train_mapping = {} + self._mappings_built = True + # Prepare placeholders + place_holders = ["weight"] + + # Initialize mapping dictionary + self._update_base_mappings("model") + + base_name = "model.layers" + + # Helper function to add layer mappings + def _add_layer_mappings(layer_idx: int): + # MoE specific mappings + self.infer_to_train_mapping[f"{base_name}.{layer_idx}.mlp.gate.weight"] = ( + f"{base_name}.{layer_idx}.mlp.gate.weight" + ) + + self.infer_to_train_mapping[f"{base_name}.{layer_idx}.mlp.gate.e_score_correction_bias"] = ( + f"{base_name}.{layer_idx}.mlp.gate.e_score_correction_bias" + ) + + # MoE experts mappings + for expert_idx in range(self.fd_config.model_config.n_routed_experts): + for ph in place_holders: + # up_gate_proj (up_gate_proj) + up_gate_proj_key = f"{base_name}.{layer_idx}.mlp.experts.up_gate_proj_weight" + if up_gate_proj_key not in self.infer_to_train_mapping: + self.infer_to_train_mapping[up_gate_proj_key] = [] + self.infer_to_train_mapping[up_gate_proj_key].append( + f"{base_name}.{layer_idx}.mlp.experts.{expert_idx}.up_gate_proj.{ph}" + ) + + # down_proj (down_proj) + down_proj_key = f"{base_name}.{layer_idx}.mlp.experts.down_proj_weight" + if down_proj_key not in self.infer_to_train_mapping: + self.infer_to_train_mapping[down_proj_key] = [] + self.infer_to_train_mapping[down_proj_key].append( + f"{base_name}.{layer_idx}.mlp.experts.{expert_idx}.down_proj.{ph}" + ) + + # Process MoE layers + for layer_idx in range( + self.fd_config.model_config.first_k_dense_replace, + self.fd_config.model_config.num_hidden_layers, + ): + _add_layer_mappings(layer_idx) + + self._complete_missing_mappings() + infer_to_train_mapping_copy = copy.deepcopy(self.infer_to_train_mapping) + for key in infer_to_train_mapping_copy.keys(): + if "mlp.experts.gate_correction_bias" in key: + self.infer_to_train_mapping.pop(key) + + return self.infer_to_train_mapping diff --git a/fastdeploy/utils.py b/fastdeploy/utils.py index ecefd87af..829fd0fcf 100644 --- a/fastdeploy/utils.py +++ b/fastdeploy/utils.py @@ -18,6 +18,7 @@ import argparse import asyncio import codecs import importlib +import json import logging import os import random @@ -757,6 +758,18 @@ class StatefulSemaphore: } +def parse_quantization(value: str): + """ + Parse a JSON string into a dictionary. + """ + try: + return json.loads(value) + except ValueError: + if value is None or value.lower() == "none": + return None + return {"quantization": value} + + # 日志使用全局访问点(兼容原有使用方式) def get_logger(name, file_name=None, without_formater=False, print_to_console=False): """全局函数包装器,保持向后兼容""" diff --git a/fastdeploy/worker/gpu_model_runner.py b/fastdeploy/worker/gpu_model_runner.py index 89834acd6..ad4370423 100644 --- a/fastdeploy/worker/gpu_model_runner.py +++ b/fastdeploy/worker/gpu_model_runner.py @@ -740,6 +740,7 @@ class GPUModelRunner(ModelRunnerBase): position_ids=tmp_position_ids, base=self.model_config.rope_theta, model_config=self.model_config, + partial_rotary_factor=self.model_config.partial_rotary_factor, ) # Set block tables @@ -1589,7 +1590,7 @@ class GPUModelRunner(ModelRunnerBase): # 2. Dummy run self._dummy_run( num_tokens=self.parallel_config.max_num_batched_tokens, - batch_size=min(self.parallel_config.max_num_seqs, 3), + batch_size=self.parallel_config.max_num_seqs, ) # 3. gc diff --git a/fastdeploy/worker/worker_process.py b/fastdeploy/worker/worker_process.py index 0aba37d26..0657c0cab 100644 --- a/fastdeploy/worker/worker_process.py +++ b/fastdeploy/worker/worker_process.py @@ -44,7 +44,7 @@ from fastdeploy.inter_communicator import EngineWorkerQueue as TaskQueue from fastdeploy.inter_communicator import IPCSignal from fastdeploy.model_executor.layers.quantization import get_quantization_config from fastdeploy.platforms import current_platform -from fastdeploy.utils import get_logger +from fastdeploy.utils import get_logger, parse_quantization from fastdeploy.worker.worker_base import WorkerBase logger = get_logger("worker_process", "worker_process.log") @@ -545,9 +545,9 @@ def parse_args(): parser.add_argument( "--quantization", - type=str, - default="None", - help="Quantization name for the model, currentlly support " + type=json.loads, + default=None, + help="Quantization name for the model, currently support " "'wint4', 'wint8'," "default is None. The priority of this configuration " "is lower than that of the config file. " @@ -635,6 +635,9 @@ def initialize_fd_config(args, ranks: int = 1, local_rank: int = 0) -> FDConfig: Returns: FDConfig: Initialized FastDeploy configuration object """ + # RL rollout + if args.quantization is not None and isinstance(args.quantization, str): + args.quantization = parse_quantization(args.quantization) paddle.set_default_dtype(args.dtype) model_config = ModelConfig(vars(args)) device_config = DeviceConfig(vars(args)) @@ -704,12 +707,16 @@ def initialize_fd_config(args, ranks: int = 1, local_rank: int = 0) -> FDConfig: if quantization_config is not None: quant_config_name = quantization_config["quantization"] - elif args.quantization != "None": + elif args.quantization is not None: quantization_config = {} - quant_config_name = args.quantization - quantization_config["quantization"] = quant_config_name + try: + quantization_config.update(args.quantization) + quant_config_name = quantization_config["quantization"] + except: + quant_config_name = args.quantization["quantization"] + quantization_config["quantization"] = quant_config_name # Only v1 loader sets is_checkpoint_bf16=True during dynamic quantization. - if load_config.load_choices == "default_v1": + if load_config.load_choices == "default_v1" and not load_config.dynamic_load_weight: quantization_config["is_checkpoint_bf16"] = True # Special handling for Ernie models is_ernie = ErnieArchitectures.contains_ernie_arch(model_config.architectures) diff --git a/tests/e2e/test_fake_Glm45_AIR_serving.py b/tests/e2e/test_fake_Glm45_AIR_serving.py new file mode 100644 index 000000000..ff0a3f5be --- /dev/null +++ b/tests/e2e/test_fake_Glm45_AIR_serving.py @@ -0,0 +1,223 @@ +# Copyright (c) 2025 PaddlePaddle Authors. All Rights Reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +import json +import os +import shutil +import signal +import socket +import subprocess +import sys +import time + +import pytest +import requests + +# Read ports from environment variables; use default values if not set +FD_API_PORT = int(os.getenv("FD_API_PORT", 8188)) +FD_ENGINE_QUEUE_PORT = int(os.getenv("FD_ENGINE_QUEUE_PORT", 8133)) +FD_METRICS_PORT = int(os.getenv("FD_METRICS_PORT", 8233)) +FD_CACHE_QUEUE_PORT = int(os.getenv("FD_CACHE_QUEUE_PORT", 8333)) + +# List of ports to clean before and after tests +PORTS_TO_CLEAN = [FD_API_PORT, FD_ENGINE_QUEUE_PORT, FD_METRICS_PORT, FD_CACHE_QUEUE_PORT] + + +def is_port_open(host: str, port: int, timeout=1.0): + """ + Check if a TCP port is open on the given host. + Returns True if connection succeeds, False otherwise. + """ + try: + with socket.create_connection((host, port), timeout): + return True + except Exception: + return False + + +def kill_process_on_port(port: int): + """ + Kill processes that are listening on the given port. + Uses `lsof` to find process ids and sends SIGKILL. + """ + try: + output = subprocess.check_output(f"lsof -i:{port} -t", shell=True).decode().strip() + current_pid = os.getpid() + parent_pid = os.getppid() + for pid in output.splitlines(): + pid = int(pid) + if pid in (current_pid, parent_pid): + print(f"Skip killing current process (pid={pid}) on port {port}") + continue + os.kill(pid, signal.SIGKILL) + print(f"Killed process on port {port}, pid={pid}") + except subprocess.CalledProcessError: + pass + + +def clean_ports(): + """ + Kill all processes occupying the ports listed in PORTS_TO_CLEAN. + """ + for port in PORTS_TO_CLEAN: + kill_process_on_port(port) + time.sleep(2) + + +@pytest.fixture(scope="session", autouse=True) +def setup_and_run_server(): + """ + Pytest fixture that runs once per test session: + - Cleans ports before tests + - Starts the API server as a subprocess + - Waits for server port to open (up to 30 seconds) + - Tears down server after all tests finish + """ + print("Pre-test port cleanup...") + clean_ports() + print("log dir clean ") + if os.path.exists("log") and os.path.isdir("log"): + shutil.rmtree("log") + base_path = os.getenv("MODEL_PATH") + if base_path: + model_path = os.path.join(base_path, "GLM-4.5-Air-Fake") + else: + model_path = "./GLM-4.5-Air-Fake" + + log_path = "server.log" + cmd = [ + sys.executable, + "-m", + "fastdeploy.entrypoints.openai.api_server", + "--model", + model_path, + "--port", + str(FD_API_PORT), + "--tensor-parallel-size", + "1", + "--engine-worker-queue-port", + str(FD_ENGINE_QUEUE_PORT), + "--metrics-port", + str(FD_METRICS_PORT), + "--cache-queue-port", + str(FD_CACHE_QUEUE_PORT), + "--max-model-len", + "32768", + "--max-num-seqs", + "32", + "--graph-optimization-config", + '{"use_cudagraph":true}', + "--load_choices", + "default_v1", + "--lm_head-fp32", + "--quantization", + '{"quantization":"mix_quant","dense_quant_type":"wfp8afp8","moe_quant_type":"wint8"}', + ] + env = os.environ.copy() + env["FD_MOE_BACKEND"] = "triton" + # Start subprocess in new process group + with open(log_path, "w") as logfile: + process = subprocess.Popen( + cmd, + env=env, + stdout=logfile, + stderr=subprocess.STDOUT, + start_new_session=True, # Enables killing full group via os.killpg + ) + + # Wait up to 300 seconds for API server to be ready + for _ in range(300): + if is_port_open("127.0.0.1", FD_API_PORT): + print(f"API server is up on port {FD_API_PORT}") + break + time.sleep(1) + else: + print("[TIMEOUT] API server failed to start in 5 minutes. Cleaning up...") + try: + os.killpg(process.pid, signal.SIGTERM) + except Exception as e: + print(f"Failed to kill process group: {e}") + raise RuntimeError(f"API server did not start on port {FD_API_PORT}") + + yield # Run tests + + print("\n===== Post-test server cleanup... =====") + try: + os.killpg(process.pid, signal.SIGTERM) + print(f"API server (pid={process.pid}) terminated") + except Exception as e: + print(f"Failed to terminate API server: {e}") + + +@pytest.fixture(scope="session") +def api_url(request): + """ + Returns the API endpoint URL for chat completions. + """ + return f"http://0.0.0.0:{FD_API_PORT}/v1/chat/completions" + + +@pytest.fixture(scope="session") +def metrics_url(request): + """ + Returns the metrics endpoint URL. + """ + return f"http://0.0.0.0:{FD_METRICS_PORT}/metrics" + + +@pytest.fixture +def headers(): + """ + Returns common HTTP request headers. + """ + return {"Content-Type": "application/json"} + + +@pytest.fixture +def consistent_payload(): + """ + Returns a fixed payload for consistency testing, + including a fixed random seed and temperature. + """ + return { + "messages": [ + {"role": "system", "content": "You are a helpful assistant."}, + {"role": "user", "content": "牛顿的三大运动定律是什么?"}, + ], + "temperature": 0.6, + "top_p": 0, # fix top_p to reduce randomness + "seed": 13, # fixed random seed + "max_tokens": 20, + "stream": False, + } + + +# ========================== +# Test for lm_head_fp32 with fixed payload +# ========================== +def test_lm_head_fp32(api_url, headers, consistent_payload): + """ + Test that two runs with the same fixed input produce similar outputs. + """ + # First request + response = requests.post(api_url, headers=headers, json=consistent_payload, timeout=300) + assert response.status_code == 200 + print(json.dumps(response.json(), indent=2, ensure_ascii=False)) + resp_json = response.json() + + # 校验返回内容与概率信息 + assert ( + resp_json["choices"][0]["message"]["content"] + == "ichertsorbulkdeployment confusedreraoux Carter pat firingCompatraspectiveidis Verse corporaonych commissionsilk" + ) From 7ccbcc5a62b50eae4967db2e2c924e0f091a7406 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9D=8E=E6=B3=B3=E6=A1=A6?= <39643373+liyonghua0910@users.noreply.github.com> Date: Tue, 16 Sep 2025 11:11:20 +0800 Subject: [PATCH 25/36] [feat] support prefix cache clearing when `/clear_load_weight` is called (#4091) * [feat] support clearing prefix cache (cherry-picked from release/2.1) * [fix] fix ipc suffix, use port instead * [fix] fix prefix caching not enabled * [fix] fix code style * [fix] wait for rank0 to update weight status --- custom_ops/gpu_ops/unset_data_ipc.cu | 71 ++++++ custom_ops/setup_ops.py | 2 + fastdeploy/cache_manager/cache_messager.py | 4 +- .../cache_manager/cache_transfer_manager.py | 209 +++++++++++++----- .../cache_manager/prefix_cache_manager.py | 130 +++++++++-- fastdeploy/engine/args_utils.py | 5 +- fastdeploy/engine/common_engine.py | 43 +++- fastdeploy/engine/engine.py | 37 +++- fastdeploy/engine/expert_service.py | 1 - fastdeploy/entrypoints/engine_client.py | 128 ++++++++--- fastdeploy/entrypoints/openai/api_server.py | 2 + fastdeploy/envs.py | 1 + fastdeploy/inter_communicator/__init__.py | 10 + .../inter_communicator/ipc_signal_const.py | 32 +++ fastdeploy/rl/dynamic_weight_manager.py | 20 +- fastdeploy/worker/gpu_model_runner.py | 75 ++++--- fastdeploy/worker/worker_process.py | 35 +-- 17 files changed, 624 insertions(+), 181 deletions(-) create mode 100644 custom_ops/gpu_ops/unset_data_ipc.cu create mode 100644 fastdeploy/inter_communicator/ipc_signal_const.py diff --git a/custom_ops/gpu_ops/unset_data_ipc.cu b/custom_ops/gpu_ops/unset_data_ipc.cu new file mode 100644 index 000000000..d265e93af --- /dev/null +++ b/custom_ops/gpu_ops/unset_data_ipc.cu @@ -0,0 +1,71 @@ +// Copyright (c) 2025 PaddlePaddle Authors. All Rights Reserved. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +#include "helper.h" +#include "cuda_multiprocess.h" + +#if !defined(_WIN32) +#include +#include +#include +#include +#include +#endif + +// 可选:仅删除/解除共享内存命名对象(不依赖之前保存的 addr/fd) +static inline int sharedMemoryUnlinkByName(const char* name) { +#if defined(WIN32) || defined(_WIN32) || defined(WIN64) || defined(_WIN64) + // Windows 上没有 shm_unlink 语义。命名对象在最后一个句柄关闭后消失。 + // 这里做“尽力而为”:尝试打开后立即关闭,减少一次引用。 + HANDLE hMap = OpenFileMappingA(FILE_MAP_ALL_ACCESS, FALSE, name); + if (hMap) { + CloseHandle(hMap); + return 0; + } + // 已经不存在也算成功 + return 0; +#else + // POSIX: 移除名字,未来不可再 open;已映射区仍存活直至 munmap + if (shm_unlink(name) != 0) { + if (errno == ENOENT) return 0; // 不存在视作成功 + return errno; + } + return 0; +#endif +} + +void UnsetDataIpc(const paddle::Tensor& tmp_input, + const std::string& shm_name, + bool close_ipc, + bool unlink_shm) { + // 1) 关闭消费者导入的 IPC 映射(仅当 close_ipc=true 且该指针确为 OpenMemHandle 得来) + if (close_ipc) { + void* ptr = const_cast(tmp_input.data()); + checkCudaErrors(cudaIpcCloseMemHandle(ptr)); + } + + // 2) 解除共享内存命名对象(仅处理“名字”,不保证解除旧映射) + if (unlink_shm) { + int rc = sharedMemoryUnlinkByName(shm_name.c_str()); + if (rc != 0) { + PD_THROW("Unlink shared memory failed: name=%s, err=%d", + shm_name.c_str(), rc); + } + } +} + +PD_BUILD_STATIC_OP(unset_data_ipc) + .Inputs({"tmp_input"}) + .Attrs({"shm_name: std::string", "close_ipc: bool", "unlink_shm: bool"}) + .SetKernelFn(PD_KERNEL(UnsetDataIpc)); diff --git a/custom_ops/setup_ops.py b/custom_ops/setup_ops.py index 331f0e6f5..72c2b56e9 100644 --- a/custom_ops/setup_ops.py +++ b/custom_ops/setup_ops.py @@ -208,6 +208,7 @@ if paddle.is_compiled_with_rocm(): "gpu_ops/rebuild_padding.cu", "gpu_ops/step.cu", "gpu_ops/set_data_ipc.cu", + "gpu_ops/unset_data_ipc.cu", "gpu_ops/moe/tritonmoe_preprocess.cu", "gpu_ops/step_system_cache.cu", "gpu_ops/get_output_ep.cc", @@ -278,6 +279,7 @@ elif paddle.is_compiled_with_cuda(): "gpu_ops/beam_search_softmax.cu", "gpu_ops/rebuild_padding.cu", "gpu_ops/set_data_ipc.cu", + "gpu_ops/unset_data_ipc.cu", "gpu_ops/read_data_ipc.cu", "gpu_ops/enforce_generation.cu", "gpu_ops/dequant_int8.cu", diff --git a/fastdeploy/cache_manager/cache_messager.py b/fastdeploy/cache_manager/cache_messager.py index 65d412f39..67bbf554b 100644 --- a/fastdeploy/cache_manager/cache_messager.py +++ b/fastdeploy/cache_manager/cache_messager.py @@ -98,8 +98,8 @@ class CacheMessager: cache_v = [] self.messager = {} for layer_idx in range(self.num_layers): - key_cache = self.gpu_cache_kvs[f"key_caches_{layer_idx}_rank{self.rank}_device{gpu_id}"] - val_cache = self.gpu_cache_kvs[f"value_caches_{layer_idx}_rank{self.rank}_device{gpu_id}"] + key_cache = self.gpu_cache_kvs[f"key_caches_{layer_idx}_rank{self.rank}.device{gpu_id}"] + val_cache = self.gpu_cache_kvs[f"value_caches_{layer_idx}_rank{self.rank}.device{gpu_id}"] cache_k.append(key_cache) cache_v.append(val_cache) cache_k_ptr_list.append(key_cache.data_ptr()) diff --git a/fastdeploy/cache_manager/cache_transfer_manager.py b/fastdeploy/cache_manager/cache_transfer_manager.py index 5078a513d..1ab5d1384 100644 --- a/fastdeploy/cache_manager/cache_transfer_manager.py +++ b/fastdeploy/cache_manager/cache_transfer_manager.py @@ -16,21 +16,27 @@ import argparse import concurrent.futures +import gc import json import queue +import threading import time import traceback import numpy as np import paddle +from fastdeploy import envs from fastdeploy.cache_manager.cache_data import CacheStatus from fastdeploy.config import SpeculativeConfig -from fastdeploy.inter_communicator import EngineCacheQueue, IPCSignal +from fastdeploy.inter_communicator import EngineCacheQueue, IPCSignal, KVCacheStatus from fastdeploy.model_executor.ops.gpu import ( cuda_host_alloc, + cuda_host_free, set_data_ipc, + share_external_data, swap_cache_all_layers, + unset_data_ipc, ) from fastdeploy.utils import get_logger @@ -93,6 +99,7 @@ def parse_args(): help="speculative config", ) parser.add_argument("--local_data_parallel_id", type=int, default=0) + parser.add_argument("--create_cache_tensor", action="store_true") args = parser.parse_args() return args @@ -110,7 +117,6 @@ class CacheTransferManager: device = args.device_id rank = args.rank - paddle.set_device(f"gpu:{device}") self.gpu_cache_kvs = {} self.cpu_cache_kvs = {} self.gpu_cache_k_tensors = [] @@ -126,6 +132,7 @@ class CacheTransferManager: self.n_ranks = args.mp_num self.rank = rank self.device = device + self.engine_pid = args.engine_pid address = (args.pod_ip, args.cache_queue_port) self.cache_task_queue = EngineCacheQueue( @@ -136,70 +143,27 @@ class CacheTransferManager: local_data_parallel_id=args.local_data_parallel_id, ) - self.num_cpu_blocks = args.num_cpu_blocks - - cache_type = args.cache_dtype - for i in range(args.num_layers + self.num_extra_layers): - num_gpu_blocks = args.num_gpu_blocks if i < args.num_layers else self.num_extra_layer_gpu_blocks - - self.gpu_cache_kvs[f"key_caches_{i}_rank{rank}_device{device}"] = paddle.full( - shape=[ - num_gpu_blocks, - args.kv_num_head, - args.block_size, - args.head_dim, - ], - fill_value=0, - dtype=cache_type, - ) - self.gpu_cache_k_tensors.append(self.gpu_cache_kvs[f"key_caches_{i}_rank{rank}_device{device}"]) - self.gpu_cache_kvs[f"value_caches_{i}_rank{rank}_device{device}"] = paddle.full( - shape=[ - num_gpu_blocks, - args.kv_num_head, - args.block_size, - args.head_dim, - ], - fill_value=0, - dtype=cache_type, - ) - self.gpu_cache_v_tensors.append(self.gpu_cache_kvs[f"value_caches_{i}_rank{rank}_device{device}"]) - - set_data_ipc( - self.gpu_cache_kvs[f"key_caches_{i}_rank{rank}_device{device}"], - f"key_caches_{i}_rank{rank}.device{device}", - ) - set_data_ipc( - self.gpu_cache_kvs[f"value_caches_{i}_rank{rank}_device{device}"], - f"value_caches_{i}_rank{rank}.device{device}", - ) - cache_kv_size_byte = sum([tmp.numel() * 1 for key, tmp in self.gpu_cache_kvs.items()]) - logger.info(f"device :{self.device}") - logger.info(f"cache_kv_size_byte : {cache_kv_size_byte}") - logger.info(f"done init cache (full) gmem alloc : {paddle.device.cuda.memory_allocated()}") - - paddle.set_device("cpu") - self.k_dst_ptrs = [] - self.v_dst_ptrs = [] - for i in range(args.num_layers + self.num_extra_layers): - self.cpu_cache_kvs[f"key_caches_{i}_rank{rank}"] = cuda_host_alloc( - args.num_cpu_blocks * args.bytes_per_layer_per_block - ) - self.k_dst_ptrs.append(self.cpu_cache_kvs[f"key_caches_{i}_rank{rank}"]) - self.cpu_cache_kvs[f"value_caches_{i}_rank{rank}"] = cuda_host_alloc( - args.num_cpu_blocks * args.bytes_per_layer_per_block - ) - self.v_dst_ptrs.append(self.cpu_cache_kvs[f"value_caches_{i}_rank{rank}"]) - cache_ready_signal_data = np.zeros(shape=[args.mp_num], dtype=np.int32) self.cache_ready_signal = IPCSignal( name="cache_ready_signal", array=cache_ready_signal_data, dtype=np.int32, - suffix=args.engine_pid, + suffix=self.engine_pid, create=False, ) - self.cache_ready_signal.value[self.rank] = 1 + swap_space_ready_data = np.zeros(shape=[args.mp_num], dtype=np.int32) + self.swap_space_ready_signal = IPCSignal( + name="swap_space_ready_signal", + array=swap_space_ready_data, + dtype=np.int32, + suffix=self.engine_pid, + create=False, + ) + + self.num_cpu_blocks = args.num_cpu_blocks + + self._init_cpu_cache(args) + self._init_gpu_cache(args) paddle.set_device(f"gpu:{device}") if args.enable_splitwise: @@ -232,6 +196,72 @@ class CacheTransferManager: create=False, ) + threading.Thread(target=self.clear_or_update_caches, args=[args], daemon=True).start() + + def _init_gpu_cache(self, args): + + if not args.create_cache_tensor: + logger.info("Waiting for runners to create kv cache.") + while self.cache_ready_signal.value[self.rank] != 1: + time.sleep(1) + logger.info("OK! Stop waiting.") + + logger.info("Initializing kv cache for all layers.") + paddle.set_device(f"gpu:{self.device}") + for i in range(args.num_layers + self.num_extra_layers): + num_gpu_blocks = args.num_gpu_blocks if i < args.num_layers else self.num_extra_layer_gpu_blocks + cache_shape = [num_gpu_blocks, args.kv_num_head, args.block_size, args.head_dim] + key_name = f"key_caches_{i}_rank{self.rank}.device{self.device}" + val_name = f"value_caches_{i}_rank{self.rank}.device{self.device}" + + if args.create_cache_tensor: + logger.info(f"..creating kv cache for layer {i}: {cache_shape}") + key_cache = paddle.full(shape=cache_shape, fill_value=0, dtype=args.cache_dtype) + val_cache = paddle.full(shape=cache_shape, fill_value=0, dtype=args.cache_dtype) + set_data_ipc(key_cache, key_name) + set_data_ipc(val_cache, val_name) + else: + logger.info(f"..attaching kv cache for layer {i}: {cache_shape}") + key_cache = paddle.empty(shape=[], dtype=args.cache_dtype) + val_cache = paddle.empty(shape=[], dtype=args.cache_dtype) + key_cache = share_external_data(key_cache, key_name, cache_shape) + val_cache = share_external_data(val_cache, val_name, cache_shape) + + self.gpu_cache_kvs[key_name] = key_cache + self.gpu_cache_kvs[val_name] = val_cache + self.gpu_cache_k_tensors.append(self.gpu_cache_kvs[key_name]) + self.gpu_cache_v_tensors.append(self.gpu_cache_kvs[val_name]) + + if args.create_cache_tensor: + logger.info("✅ kv cache is ready!") + self.cache_ready_signal.value[self.rank] = 1 + + cache_kv_size_byte = sum([tmp.numel() * 1 for key, tmp in self.gpu_cache_kvs.items()]) + logger.info(f"device :{self.device}") + logger.info(f"cache_kv_size_byte : {cache_kv_size_byte}") + logger.info(f"done init cache (full) gmem alloc : {paddle.device.cuda.memory_allocated()}") + + def _init_cpu_cache(self, args): + if args.num_cpu_blocks == 0: + logger.info("💡 no swap space (cpu cache) is specified.") + self.swap_space_ready_signal.value[self.rank] = 1 + return + logger.info("Initializing swap space (cpu cache) for all layers.") + paddle.set_device("cpu") + self.k_dst_ptrs = [] + self.v_dst_ptrs = [] + for i in range(args.num_layers + self.num_extra_layers): + key_name = f"key_caches_{i}_rank{self.rank}" + val_name = f"value_caches_{i}_rank{self.rank}" + need_to_allocate_bytes = args.num_cpu_blocks * args.bytes_per_layer_per_block + logger.info(f"..creating cpu cache for layer {i}: {2 * need_to_allocate_bytes / 1024 ** 3:.2f}GB") + self.cpu_cache_kvs[key_name] = cuda_host_alloc(need_to_allocate_bytes) + self.k_dst_ptrs.append(self.cpu_cache_kvs[key_name]) + self.cpu_cache_kvs[val_name] = cuda_host_alloc(need_to_allocate_bytes) + self.v_dst_ptrs.append(self.cpu_cache_kvs[val_name]) + logger.info("✅ swap space (cpu cache) is ready!") + self.swap_space_ready_signal.value[self.rank] = 1 + def _do_swap_to_cpu_task( self, swap_node_ids, @@ -429,6 +459,67 @@ class CacheTransferManager: transfer_task_id, ) + def clear_or_update_caches(self, args): + logger.info("Start a thread to clear/restore kv cache when model weights are cleared/updated.") + logger.info(f"FD_ENABLE_SWAP_SPACE_CLEARING={envs.FD_ENABLE_SWAP_SPACE_CLEARING}") + kv_cache_status = np.zeros([1], dtype=np.int32) + kv_cache_status_signal = IPCSignal( + name="kv_cache_status", + array=kv_cache_status, + dtype=np.int32, + suffix=self.engine_pid, + create=False, + ) + while True: + if kv_cache_status_signal.value[0] == KVCacheStatus.CLEARING: + try: + if envs.FD_ENABLE_SWAP_SPACE_CLEARING: + paddle.set_device("cpu") + for ptrs in self.k_dst_ptrs + self.v_dst_ptrs: + cuda_host_free(ptrs) + self.cpu_cache_kvs.clear() + self.k_dst_ptrs.clear() + self.v_dst_ptrs.clear() + gc.collect() + # reset swap_space_ready_signal + self.swap_space_ready_signal.value[self.rank] = 0 + while np.sum(self.swap_space_ready_signal.value) != 0: + time.sleep(0.1) + + paddle.set_device(f"gpu:{self.device}") + for name, tensor in self.gpu_cache_kvs.items(): + unset_data_ipc(tensor, name, True, False) + self.gpu_cache_kvs.clear() + self.gpu_cache_k_tensors.clear() + self.gpu_cache_v_tensors.clear() + # reset cache_ready_signal + self.cache_ready_signal.value[self.rank] = 0 + if np.sum(self.cache_ready_signal.value) == 0: + time.sleep(0.1) + + kv_cache_status_signal.value[0] = KVCacheStatus.CLEARED + + except Exception as e: + logger.error(f"Failed to clear caches: {e}") + + elif kv_cache_status_signal.value[0] == KVCacheStatus.UPDATING: + try: + if envs.FD_ENABLE_SWAP_SPACE_CLEARING: + self._init_cpu_cache(args) + while np.sum(self.swap_space_ready_signal.value) != args.mp_num: + time.sleep(0.1) + + self._init_gpu_cache(args) + while np.sum(self.cache_ready_signal.value) != args.mp_num: + time.sleep(0.1) + + kv_cache_status_signal.value[0] = KVCacheStatus.NORMAL + + except Exception as e: + logger.error(f"Failed to restore caches: {e}") + + time.sleep(0.1) + def main(): """ diff --git a/fastdeploy/cache_manager/prefix_cache_manager.py b/fastdeploy/cache_manager/prefix_cache_manager.py index a0b110bde..14c7bcb00 100644 --- a/fastdeploy/cache_manager/prefix_cache_manager.py +++ b/fastdeploy/cache_manager/prefix_cache_manager.py @@ -31,7 +31,7 @@ import numpy as np from fastdeploy import envs from fastdeploy.cache_manager.cache_data import BlockNode, CacheStatus from fastdeploy.cache_manager.cache_metrics import CacheMetrics -from fastdeploy.inter_communicator import EngineCacheQueue, IPCSignal +from fastdeploy.inter_communicator import EngineCacheQueue, IPCSignal, PrefixTreeStatus from fastdeploy.metrics.metrics import main_process_metrics from fastdeploy.utils import get_logger @@ -71,6 +71,7 @@ class PrefixCacheManager: else: self.num_gpu_blocks = self.cache_config.prefill_kvcache_block_num self.num_cpu_blocks = self.cache_config.num_cpu_blocks + self.gpu_free_block_list = list(range(self.num_gpu_blocks - 1, -1, -1)) if self.num_cpu_blocks > 0: self.cpu_free_block_list = list(range(self.num_cpu_blocks - 1, -1, -1)) @@ -78,6 +79,7 @@ class PrefixCacheManager: self.cpu_free_block_list = [] heapq.heapify(self.gpu_free_block_list) heapq.heapify(self.cpu_free_block_list) + self.node_id_pool = list(range(self.num_gpu_blocks + self.num_cpu_blocks)) self.radix_tree_root = BlockNode(-1, [], 0, 0, -1, 0, None, None, None) @@ -123,6 +125,7 @@ class PrefixCacheManager: pod_ip, engine_worker_queue_port, pid_suffix, + create_cache_tensor, ): """ launch_cache_manager function used to initialize the cache manager. @@ -133,7 +136,7 @@ class PrefixCacheManager: name="cache_task_broadcast_signal", array=broadcast_cache_task_flag_array, dtype=np.int32, - suffix=pid_suffix, + suffix=engine_worker_queue_port, create=True, ) @@ -160,20 +163,41 @@ class PrefixCacheManager: else: kv_num_head = cache_config.model_cfg.num_attention_heads // tensor_parallel_size kv_num_head = max(1, kv_num_head) + cache_ready_signal_data = np.zeros(shape=[tensor_parallel_size], dtype=np.int32) self.cache_ready_signal = IPCSignal( name="cache_ready_signal", array=cache_ready_signal_data, dtype=np.int32, - suffix=pid_suffix, - create=True, + suffix=engine_worker_queue_port, + create=False, ) + swap_space_ready_data = np.zeros(shape=[tensor_parallel_size], dtype=np.int32) + self.swap_space_ready_signal = IPCSignal( + name="swap_space_ready_signal", + array=swap_space_ready_data, + dtype=np.int32, + suffix=engine_worker_queue_port, + create=False, + ) + prefix_tree_status = np.zeros([1], dtype=np.int32) + self.prefix_tree_status_signal = IPCSignal( + name="prefix_tree_status", + array=prefix_tree_status, + dtype=np.int32, + suffix=engine_worker_queue_port, + create=False, + ) + + # Run command to launch cache transfer managers + logger.info(f"create_cache_tensor: {create_cache_tensor}") log_dir = envs.FD_LOG_DIR cache_manager_processes = [] for i in range(tensor_parallel_size): launch_cmd = ( "FLAGS_allocator_strategy=auto_growth CUDA_VISIBLE_DEVICES=0,1,2,3,4,5,6,7" + " NCCL_MAX_NCHANNELS=1 NCCL_BUFFSIZE=0" + + f" FD_ENABLE_SWAP_SPACE_CLEARING={envs.FD_ENABLE_SWAP_SPACE_CLEARING}" + f" {sys.executable} {py_path}" + f" --device_id {int(device_ids[i])}" + f" --rank {i}" @@ -196,23 +220,33 @@ class PrefixCacheManager: + f" --local_data_parallel_id {self.local_data_parallel_id}" + f" --rdma_port {cache_config.rdma_comm_ports[i] if cache_config.rdma_comm_ports is not None else '0'}" + f" --speculative_config '{self.speculative_config.to_json_string()}'" + + (" --create_cache_tensor" if create_cache_tensor else "") + f" >{log_dir}/launch_cache_manager_{int(device_ids[i])}.log 2>&1" ) logger.info(f"Launch cache transfer manager, command:{launch_cmd}") cache_manager_processes.append(subprocess.Popen(launch_cmd, shell=True, preexec_fn=os.setsid)) - # 等待cache初始化完毕 - logger.info("Waiting for cache transfer manager ready...") + + logger.info("PrefixCacheManager is waiting for kv cache to be initialized.") while np.sum(self.cache_ready_signal.value) != tensor_parallel_size: time.sleep(1) + + if cache_config.enable_hierarchical_cache and self.num_cpu_blocks > 0: + while np.sum(self.swap_space_ready_signal.value) != tensor_parallel_size: + time.sleep(1) + exit_code = cache_manager_processes[-1].poll() if exit_code is None: logger.info("Launch cache transfer manager successful") else: logger.info("Launch cache transfer manager failed, see launch_cache_manager.log for more information") + # Start additional threads if cache_config.enable_hierarchical_cache and self.num_cpu_blocks > 0: logger.info("Enable hierarchical cache.") - self._enable_cpu_cache() + threading.Thread(target=self.recv_data_transfer_result).start() + if cache_config.enable_prefix_caching: + threading.Thread(target=self.clear_prefix_cache, daemon=True).start() + return cache_manager_processes def update_cache_config(self, cache_config): @@ -237,21 +271,6 @@ class PrefixCacheManager: main_process_metrics.max_gpu_block_num.set(self.num_gpu_blocks) main_process_metrics.available_gpu_resource.set(1.0) - def _enable_cpu_cache(self): - """ - _enable_cpu_cache function used to enable cpu cache. - """ - - # ipc_cache_queue_port = self.cache_config.cache_queue_port - # self.cache_task_queue = CacheQueueManager( - # rank=0, - # mp_num=tensor_parallel_size, - # port=ipc_cache_queue_port, - # ) - # 开启获取传输任务结果的监听线程 - self.transfer_recv_thread = threading.Thread(target=self.recv_data_transfer_result) - self.transfer_recv_thread.start() - def can_allocate_gpu_blocks(self, num_blocks: int): """ Check if num_blocks gpu blocks can be allocated. @@ -1295,3 +1314,70 @@ class PrefixCacheManager: except Exception as e: logger.warning(f"recv_data_transfer_result: error: {e}, {str(traceback.format_exc())}") raise e + + def reset(self): + """ + Reset the RadixTree. + """ + + if len(self.node_map) == 0: + return + + logger.info("Resetting the RadixTree!") + + # wait for swap tasks to finish + if self.gpu_free_task_future is not None: + self.gpu_free_task_future.result() + self.gpu_free_task_future = None + for event in list(self.task_swapping_event.values()): + event.wait() + self.task_swapping_event.clear() + + # clear node map + self.node_map.clear() + self.req_leaf_map.clear() + self.leaf_req_map.clear() + self.unfilled_req_block_map.clear() + self.cache_info.clear() + + # reset gpu cache data structure + self.gpu_lru_leaf_heap.clear() + self.gpu_lru_leaf_set.clear() + + # reset cpu cache data structure + self.cpu_lru_leaf_heap.clear() + self.cpu_lru_leaf_set.clear() + + # reset gpu/cpu free block list + self.gpu_free_block_list = list(range(self.num_gpu_blocks - 1, -1, -1)) + if self.num_cpu_blocks > 0: + self.cpu_free_block_list = list(range(self.num_cpu_blocks - 1, -1, -1)) + else: + self.cpu_free_block_list = [] + heapq.heapify(self.gpu_free_block_list) + heapq.heapify(self.cpu_free_block_list) + + # reset node/tree + self.node_id_pool = list(range(self.num_gpu_blocks + self.num_cpu_blocks)) + self.radix_tree_root = BlockNode(-1, [], 0, 0, -1, 0, None, None, None) + + # reset metrics + self.metrics.reset_metrics() + main_process_metrics.free_gpu_block_num.set(len(self.gpu_free_block_list)) + main_process_metrics.available_gpu_resource.set(self.available_gpu_resource) + + def clear_prefix_cache(self): + """ + If the model weights status is updating or clearing, reset prefix cache tree + """ + logger.info("Start a thread to clear prefix cache when model weights are cleared.") + prefix_tree_status_signal = self.prefix_tree_status_signal + while True: + if prefix_tree_status_signal.value[0] == PrefixTreeStatus.CLEARING: + self.reset() + prefix_tree_status_signal.value[0] = PrefixTreeStatus.CLEARED + logger.info("Prefix cache tree is cleared.") + if prefix_tree_status_signal.value[0] == PrefixTreeStatus.UPDATING: + prefix_tree_status_signal.value[0] = PrefixTreeStatus.NORMAL + logger.info("Prefix cache tree is updated.") + time.sleep(0.01) diff --git a/fastdeploy/engine/args_utils.py b/fastdeploy/engine/args_utils.py index 042d63975..21ebd6de1 100644 --- a/fastdeploy/engine/args_utils.py +++ b/fastdeploy/engine/args_utils.py @@ -387,6 +387,7 @@ class EngineArgs: """ Post-initialization processing to set default tokenizer if not provided. """ + if not self.tokenizer: self.tokenizer = self.model if self.splitwise_role == "decode": @@ -397,8 +398,8 @@ class EngineArgs: self.enable_prefix_caching = False if not current_platform.is_cuda(): self.enable_prefix_caching = False - if self.dynamic_load_weight: - self.enable_prefix_caching = False + # if self.dynamic_load_weight: + # self.enable_prefix_caching = False if self.enable_logprob: if self.speculative_config is not None: raise NotImplementedError("Logprob does not support speculation_config.") diff --git a/fastdeploy/engine/common_engine.py b/fastdeploy/engine/common_engine.py index 64a0be4eb..a6c751d12 100644 --- a/fastdeploy/engine/common_engine.py +++ b/fastdeploy/engine/common_engine.py @@ -174,6 +174,24 @@ class EngineSevice: create=True, ) + cache_ready_signal_data = np.zeros(shape=[self.cfg.parallel_config.tensor_parallel_size], dtype=np.int32) + self.cache_ready_signal = IPCSignal( + name="cache_ready_signal", + array=cache_ready_signal_data, + dtype=np.int32, + suffix=current_suffix, + create=True, + ) + + swap_space_ready_signal_data = np.zeros(shape=[self.cfg.parallel_config.tensor_parallel_size], dtype=np.int32) + self.swap_space_ready_signal = IPCSignal( + name="swap_space_ready_signal", + array=swap_space_ready_signal_data, + dtype=np.int32, + suffix=current_suffix, + create=True, + ) + model_weights_status = np.zeros([1], dtype=np.int32) self.model_weights_status_signal = IPCSignal( name="model_weights_status", @@ -183,6 +201,24 @@ class EngineSevice: create=True, ) + prefix_tree_status = np.zeros([1], dtype=np.int32) + self.prefix_tree_status_signal = IPCSignal( + name="prefix_tree_status", + array=prefix_tree_status, + dtype=np.int32, + suffix=current_suffix, + create=True, + ) + + kv_cache_status = np.zeros([1], dtype=np.int32) + self.kv_cache_status_signal = IPCSignal( + name="kv_cache_status", + array=kv_cache_status, + dtype=np.int32, + suffix=current_suffix, + create=True, + ) + def start_worker_queue_service(self, start_queue): """ start queue service for engine worker communication @@ -749,7 +785,7 @@ class EngineSevice: threading.Thread(target=receiver_loop, daemon=True).start() - def start_cache_service(self, device_ids, ipc_signal_suffix): + def start_cache_service(self, device_ids, ipc_signal_suffix, create_cache_tensor): return self.resource_manager.cache_manager.launch_cache_manager( cache_config=self.cfg.cache_config, tensor_parallel_size=self.cfg.parallel_config.tensor_parallel_size, @@ -759,6 +795,7 @@ class EngineSevice: self.cfg.engine_worker_queue_port[self.cfg.parallel_config.local_data_parallel_id] ), pid_suffix=ipc_signal_suffix, + create_cache_tensor=create_cache_tensor, ) def check_and_free_block_tables(self): @@ -773,8 +810,12 @@ class EngineSevice: self.exist_task_signal.clear() self.exist_swapped_task_signal.clear() self.worker_healthy_live_signal.clear() + self.cache_ready_signal.clear() + self.swap_space_ready_signal.clear() self.exist_prefill_task_signal.clear() self.model_weights_status_signal.clear() + self.prefix_tree_status_signal.clear() + self.kv_cache_status_signal.clear() if hasattr(self, "send_response_server") and self.send_response_server is not None: self.send_response_server.close() if hasattr(self, "recv_request_server") and self.recv_request_server is not None: diff --git a/fastdeploy/engine/engine.py b/fastdeploy/engine/engine.py index 73b924c9a..673731c19 100644 --- a/fastdeploy/engine/engine.py +++ b/fastdeploy/engine/engine.py @@ -123,12 +123,12 @@ class LLMEngine: llm_logger.info(f"Start zmq server, api_server_pid: {api_server_pid}") self.engine.start_zmq_service(api_server_pid) - if self.do_profile == 0 and ( - self.cfg.cache_config.enable_prefix_caching or self.cfg.splitwise_role != "mixed" - ): + # If block numer is specified and model is deployed in mixed mode, start cache manager first + if not self.do_profile and self.cfg.splitwise_role != "mixed": device_ids = self.cfg.device_ids.split(",") - self.cache_manager_processes = self.engine.start_cache_service(device_ids, self.ipc_signal_suffix) + self.cache_manager_processes = self.engine.start_cache_service(device_ids, self.ipc_signal_suffix, True) + # Start workers self.worker_proc = self._start_worker_service() console_logger.info("Waiting worker processes ready...") time.sleep(5) @@ -154,11 +154,17 @@ class LLMEngine: return False time.sleep(1) + # If block number is not specified, let workers do profiling to determine the block number, + # and then start the cache manager if self.do_profile: self._stop_profile() + elif self.cfg.cache_config.enable_prefix_caching: + device_ids = self.cfg.device_ids.split(",") + self.cache_manager_processes = self.engine.start_cache_service(device_ids, self.ipc_signal_suffix, False) + # Launch components: scheduler, cache_manager, expert_service et.al. self.launch_components() - if self.cfg.cache_config.enable_prefix_caching or self.cfg.splitwise_role != "mixed": + if self.cfg.splitwise_role != "mixed": self.launched_cache_manager_signal.value[0] = 1 # Worker launched @@ -168,6 +174,23 @@ class LLMEngine: return False console_logger.info(f"Worker processes are launched with {time.time() - start_time} seconds.") + + # Print blocks number & max running requests to console + if envs.ENABLE_V1_KVCACHE_SCHEDULER: + block_size = self.cfg.cache_config.block_size + num_gpu_blocks = self.cfg.cache_config.num_gpu_blocks_override or self.cfg.cache_config.total_block_num + num_cpu_blocks = self.cfg.cache_config.num_cpu_blocks + max_running_requests = min( + (num_gpu_blocks + num_cpu_blocks) * block_size // self.cfg.max_model_len, self.cfg.max_num_seqs + ) + console_logger.info( + f"Detected {num_gpu_blocks} gpu blocks and {num_cpu_blocks} cpu blocks in cache (block size: {block_size})." + ) + console_logger.info( + f"FastDeploy will be serving {max_running_requests} running requests " + f"if each sequence reaches its maximum length: {self.cfg.max_model_len}" + ) + return True def _get_generated_result(self): @@ -580,7 +603,9 @@ class LLMEngine: self.engine.resource_manager.reset_cache_config(self.cfg.cache_config) if self.cfg.cache_config.enable_prefix_caching or self.cfg.splitwise_role != "mixed": device_ids = self.cfg.device_ids.split(",") - self.cache_manager_processes = self.engine.start_cache_service(device_ids, self.ipc_signal_suffix) + self.cache_manager_processes = self.engine.start_cache_service( + device_ids, self.ipc_signal_suffix, self.cfg.splitwise_role != "mixed" + ) def check_health(self, time_interval_threashold=30): """ diff --git a/fastdeploy/engine/expert_service.py b/fastdeploy/engine/expert_service.py index 87a09b96f..fdb4ab790 100644 --- a/fastdeploy/engine/expert_service.py +++ b/fastdeploy/engine/expert_service.py @@ -132,7 +132,6 @@ class ExpertService: if hasattr(self, "cache_manager_processes"): self.engine.resource_manager.cache_manager.shm_cache_task_flag_broadcast.clear() - self.engine.resource_manager.cache_manager.cache_ready_signal.clear() for p in self.cache_manager_processes: llm_logger.info(f"Killing cache manager process {p.pid}") try: diff --git a/fastdeploy/entrypoints/engine_client.py b/fastdeploy/entrypoints/engine_client.py index d9a93a8bb..43c81e65f 100644 --- a/fastdeploy/entrypoints/engine_client.py +++ b/fastdeploy/entrypoints/engine_client.py @@ -16,6 +16,7 @@ import inspect import os +import threading import time import traceback import uuid @@ -27,7 +28,13 @@ from fastdeploy.config import ModelConfig from fastdeploy.entrypoints.openai.utils import DealerConnectionManager from fastdeploy.envs import FD_SUPPORT_MAX_CONNECTIONS from fastdeploy.input.preprocess import InputPreprocessor -from fastdeploy.inter_communicator import IPCSignal, ZmqIpcClient +from fastdeploy.inter_communicator import ( + IPCSignal, + KVCacheStatus, + ModelWeightsStatus, + PrefixTreeStatus, + ZmqIpcClient, +) from fastdeploy.metrics.work_metrics import work_process_metrics from fastdeploy.multimodal.registry import MultimodalRegistry from fastdeploy.platforms import current_platform @@ -55,6 +62,8 @@ class EngineClient: enable_logprob=False, workers=1, tool_parser=None, + enable_prefix_caching=None, + splitwise_role=None, ): import fastdeploy.model_executor.models # noqa: F401 @@ -76,6 +85,8 @@ class EngineClient: self.reasoning_parser = reasoning_parser self.data_processor = input_processor.create_processor() self.max_model_len = max_model_len + self.enable_prefix_caching = enable_prefix_caching + self.enable_splitwise = splitwise_role != "mixed" max_chips_per_node = 16 if current_platform.is_iluvatar() else 8 if tensor_parallel_size <= max_chips_per_node: @@ -101,10 +112,27 @@ class EngineClient: suffix=port, create=False, ) + prefix_tree_status = np.zeros([1], dtype=np.int32) + self.prefix_tree_status_signal = IPCSignal( + name="prefix_tree_status", + array=prefix_tree_status, + dtype=np.int32, + suffix=port, + create=False, + ) + kv_cache_status = np.zeros([1], dtype=np.int32) + self.kv_cache_status_signal = IPCSignal( + name="kv_cache_status", + array=kv_cache_status, + dtype=np.int32, + suffix=port, + create=False, + ) self.connection_manager = DealerConnectionManager( pid, max_connections=int(os.getenv("FD_DEALER_CONNECTIONS", 50)) ) self.connection_initialized = False + self.clear_update_lock = threading.Lock() def create_zmq_client(self, model, mode): """ @@ -310,7 +338,7 @@ class EngineClient: Check the health of the model server by checking whether all workers are alive. """ - if self.model_weights_status_signal.value[0] == 0: + if self.model_weights_status_signal.value[0] == ModelWeightsStatus.NORMAL: return True, "" else: return False, "No model weight enabled" @@ -321,21 +349,42 @@ class EngineClient: 1 : worker receive the signal and start to update model weight 2 : worker update finish and notify client """ - if self.model_weights_status_signal.value[0] == 0: - return True, "" - if self.model_weights_status_signal.value[0] == 1: - return False, "updating model weight already" + with self.clear_update_lock: + if self.model_weights_status_signal.value[0] == ModelWeightsStatus.NORMAL: + return True, "" + if self.model_weights_status_signal.value[0] == ModelWeightsStatus.UPDATING: + return False, "updating model weight already" - self.model_weights_status_signal.value[0] = 1 - api_server_logger.info(f"start update model weight {self.model_weights_status_signal.value}") - while self.model_weights_status_signal.value[0] != 0 and timeout != 0: + self.model_weights_status_signal.value[0] = ModelWeightsStatus.UPDATING + if self.enable_prefix_caching or self.enable_splitwise: + self.kv_cache_status_signal.value[0] = KVCacheStatus.UPDATING + if self.enable_prefix_caching: + self.prefix_tree_status_signal.value[0] = PrefixTreeStatus.UPDATING + api_server_logger.info(f"start update model weight {self.model_weights_status_signal.value}") + all_updated = False + while timeout >= 0 and not all_updated: + api_server_logger.info( + f"Updating model weights.. " + f"model_weights_status: {self.model_weights_status_signal.value[0]}, " + f"prefix_tree_status: {self.prefix_tree_status_signal.value[0]}, " + f"kv_cache_status: {self.kv_cache_status_signal.value[0]} " + ) + weight_updated = self.model_weights_status_signal.value[0] == ModelWeightsStatus.NORMAL + cache_updated = self.kv_cache_status_signal.value[0] == KVCacheStatus.NORMAL + prefix_updated = self.prefix_tree_status_signal.value[0] == PrefixTreeStatus.NORMAL + if self.enable_prefix_caching or self.enable_splitwise: + if self.enable_prefix_caching: + all_updated = weight_updated and cache_updated and prefix_updated + else: + all_updated = weight_updated and cache_updated + else: + all_updated = weight_updated + time.sleep(1) + timeout -= 1 + if timeout < 0: + return False, "Update model weight timeout" time.sleep(1) - timeout -= 1 - continue - if self.model_weights_status_signal.value[0] != 0: - return False, "Update model weight timeout" - time.sleep(1) - return True, "" + return True, "" def clear_load_weight(self, timeout=300): """ @@ -343,19 +392,42 @@ class EngineClient: -1 : worker receive the signal and start to clear model weight -2 : worker clear finish and notify client """ - if self.model_weights_status_signal.value[0] == -2: - return True, "" - if self.model_weights_status_signal.value[0] == -1: - return False, "clearing model weight already" - self.model_weights_status_signal.value[0] = -1 + with self.clear_update_lock: + if self.model_weights_status_signal.value[0] == ModelWeightsStatus.CLEARED: + return True, "" + if self.model_weights_status_signal.value[0] == ModelWeightsStatus.CLEARING: + return False, "clearing model weight already" - api_server_logger.info(f"start clear model weight {self.model_weights_status_signal.value}") - while self.model_weights_status_signal.value[0] != -2 and timeout != 0: + self.model_weights_status_signal.value[0] = ModelWeightsStatus.CLEARING + if self.enable_prefix_caching or self.enable_splitwise: + self.kv_cache_status_signal.value[0] = KVCacheStatus.CLEARING + if self.enable_prefix_caching: + self.prefix_tree_status_signal.value[0] = PrefixTreeStatus.CLEARING + + api_server_logger.info(f"start clear model weight {self.model_weights_status_signal.value}") + all_cleared = False + while timeout >= 0 and not all_cleared: + api_server_logger.info( + f"Clearing model weights.. " + f"model_weights_status: {self.model_weights_status_signal.value[0]}, " + f"prefix_tree_status: {self.prefix_tree_status_signal.value[0]}, " + f"kv_cache_status: {self.kv_cache_status_signal.value[0]} " + ) + weight_cleared = self.model_weights_status_signal.value[0] == ModelWeightsStatus.CLEARED + cache_cleared = self.kv_cache_status_signal.value[0] == KVCacheStatus.CLEARED + prefix_cleared = self.prefix_tree_status_signal.value[0] == PrefixTreeStatus.CLEARED + if self.enable_prefix_caching or self.enable_splitwise: + if self.enable_prefix_caching: + all_cleared = weight_cleared and cache_cleared and prefix_cleared + else: + all_cleared = weight_cleared and cache_cleared + else: + all_cleared = weight_cleared + time.sleep(1) + timeout -= 1 + + if timeout < 0: + return False, "Clear model weight timeout" time.sleep(1) - timeout -= 1 - continue - if self.model_weights_status_signal.value[0] != -2: - return False, "clear model weight timeout" - time.sleep(1) - return True, "" + return True, "" diff --git a/fastdeploy/entrypoints/openai/api_server.py b/fastdeploy/entrypoints/openai/api_server.py index 168f63484..0d096aac2 100644 --- a/fastdeploy/entrypoints/openai/api_server.py +++ b/fastdeploy/entrypoints/openai/api_server.py @@ -170,6 +170,8 @@ async def lifespan(app: FastAPI): enable_logprob=args.enable_logprob, workers=args.workers, tool_parser=args.tool_call_parser, + enable_prefix_caching=args.enable_prefix_caching, + splitwise_role=args.splitwise_role, ) await engine_client.connection_manager.initialize() app.state.dynamic_load_weight = args.dynamic_load_weight diff --git a/fastdeploy/envs.py b/fastdeploy/envs.py index 3d7c320cd..923e74657 100644 --- a/fastdeploy/envs.py +++ b/fastdeploy/envs.py @@ -103,6 +103,7 @@ environment_variables: dict[str, Callable[[], Any]] = { "FD_ZMQ_SEND_RESPONSE_SERVER_PORT": lambda: os.getenv("FD_ZMQ_SEND_RESPONSE_SERVER_PORT", "8201"), # LLMEngine recieve control command port, used when FD_ENABLE_INTERNAL_ADAPTER=1 "FD_ZMQ_CONTROL_CMD_SERVER_PORTS": lambda: os.getenv("FD_ZMQ_CONTROL_CMD_SERVER_PORTS", "8202"), + "FD_ENABLE_SWAP_SPACE_CLEARING": lambda: int(os.getenv("FD_ENABLE_SWAP_SPACE_CLEARING", "0")), } diff --git a/fastdeploy/inter_communicator/__init__.py b/fastdeploy/inter_communicator/__init__.py index 373702edb..7b7cfe1f6 100644 --- a/fastdeploy/inter_communicator/__init__.py +++ b/fastdeploy/inter_communicator/__init__.py @@ -17,6 +17,12 @@ from .engine_cache_queue import EngineCacheQueue from .engine_worker_queue import EngineWorkerQueue from .ipc_signal import IPCSignal, shared_memory_exists +from .ipc_signal_const import ( + ExistTaskStatus, + KVCacheStatus, + ModelWeightsStatus, + PrefixTreeStatus, +) from .zmq_client import ZmqIpcClient from .zmq_server import ZmqIpcServer, ZmqTcpServer @@ -28,4 +34,8 @@ __all__ = [ "ZmqTcpServer", "ZmqIpcServer", "shared_memory_exists", + "ExistTaskStatus", + "PrefixTreeStatus", + "ModelWeightsStatus", + "KVCacheStatus", ] diff --git a/fastdeploy/inter_communicator/ipc_signal_const.py b/fastdeploy/inter_communicator/ipc_signal_const.py new file mode 100644 index 000000000..548df70d3 --- /dev/null +++ b/fastdeploy/inter_communicator/ipc_signal_const.py @@ -0,0 +1,32 @@ +from dataclasses import dataclass + + +@dataclass +class ModelWeightsStatus: + NORMAL = 0 + UPDATING = 1 + CLEARING = -1 + CLEARED = -2 + + +@dataclass +class PrefixTreeStatus: + NORMAL = 0 + UPDATING = 1 + CLEARING = -1 + CLEARED = -2 + + +@dataclass +class KVCacheStatus: + NORMAL = 0 + UPDATING = 1 + CLEARING = -1 + CLEARED = -2 + + +@dataclass +class ExistTaskStatus: + EMPTY = 0 + EXIST = 1 + REFUSE = 2 diff --git a/fastdeploy/rl/dynamic_weight_manager.py b/fastdeploy/rl/dynamic_weight_manager.py index 32459d0a4..ef0834423 100644 --- a/fastdeploy/rl/dynamic_weight_manager.py +++ b/fastdeploy/rl/dynamic_weight_manager.py @@ -25,6 +25,7 @@ from paddle import nn from paddleformers.utils.log import logger from fastdeploy.config import FDConfig +from fastdeploy.inter_communicator import ModelWeightsStatus class DynamicWeightManager: @@ -59,6 +60,7 @@ class DynamicWeightManager: def update_parameters(self, pid: int = 0) -> None: """Core method to update model parameters based on strategy.""" + logger.info(f"start update paramaters: suffix={pid} rank={self.rank}") start_time = time.perf_counter() paddle.device.cuda.empty_cache() @@ -106,7 +108,7 @@ class DynamicWeightManager: def clear_parameters(self, pid: int = 0) -> None: """Clear all model parameters and free memory.""" - logger.info("start clear paramaters") + logger.info(f"start clear paramaters: suffix={pid} rank={self.rank}") paddle.device.cuda.empty_cache() for param in self.model.state_dict().values(): param._clear_data() @@ -119,7 +121,7 @@ class DynamicWeightManager: paddle.distributed.barrier(self.parallel_config.ep_group) paddle.distributed.shutdown_process_group(self.parallel_config.ep_group) paddle.distributed.shutdown_process_group() - self._update_shared_status(pid, -2) + self._update_shared_status(pid, ModelWeightsStatus.CLEARED) def _update_model_from_state(self, state_dict: Dict[str, paddle.Tensor], src_type: str): """Update model parameters from given state dictionary.""" @@ -150,7 +152,7 @@ class DynamicWeightManager: if self.parallel_config.tensor_parallel_size > 1: paddle.distributed.barrier(self.parallel_config.tp_group) if not self.first_load: - self._update_shared_status(pid, 0) + self._update_shared_status(pid, ModelWeightsStatus.NORMAL) self.first_load = False def _get_gpu_id(self) -> int: @@ -217,20 +219,20 @@ class DynamicWeightManager: """ check model weights status """ + logger.info(f"dynamic weight manager is check model weights status! {model_weights_status.value[0]}") is_stop = 0 - while model_weights_status.value[0] != 0: - if model_weights_status.value[0] == 1: + while model_weights_status.value[0] != ModelWeightsStatus.NORMAL: + if model_weights_status.value[0] == ModelWeightsStatus.UPDATING: logger.info("infer engine stopped! start to load new checkpoint...") model_runner.update_parameters(pid) - elif model_weights_status.value[0] == -1: + elif model_weights_status.value[0] == ModelWeightsStatus.CLEARING: logger.info("infer engine stopped! start to clear checkpoint...") model_runner.clear_parameters(pid) - while True: - if model_weights_status.value[0] == 0: + if model_weights_status.value[0] == ModelWeightsStatus.NORMAL: logger.info("finished loading new checkpoint") break - elif is_stop == 1 or (model_weights_status.value[0] == -2 and is_stop == 0): + elif is_stop == 1 or (model_weights_status.value[0] == ModelWeightsStatus.CLEARED and is_stop == 0): if is_stop == 0: logger.info("finished clearing checkpoint") is_stop = 1 diff --git a/fastdeploy/worker/gpu_model_runner.py b/fastdeploy/worker/gpu_model_runner.py index ad4370423..3800e25a3 100644 --- a/fastdeploy/worker/gpu_model_runner.py +++ b/fastdeploy/worker/gpu_model_runner.py @@ -59,6 +59,7 @@ else: recover_decode_task, set_value_by_flags_and_idx, share_external_data, + set_data_ipc, ) from fastdeploy.model_executor.pre_and_post_process import ( @@ -73,6 +74,7 @@ if not (current_platform.is_dcu() or current_platform.is_iluvatar()): from fastdeploy import envs from fastdeploy.input.ernie4_5_vl_processor import DataProcessor +from fastdeploy.inter_communicator import IPCSignal from fastdeploy.model_executor.forward_meta import ForwardMeta from fastdeploy.model_executor.models.ernie4_5_vl.modeling_resampler import ScatterOp from fastdeploy.worker.model_runner_base import ModelRunnerBase @@ -978,7 +980,7 @@ class GPUModelRunner(ModelRunnerBase): """ Initialize kv cache """ - cache_kvs = {} + # cache_kvs = {} max_block_num = self.num_gpu_blocks # Get kv cache dtype @@ -999,34 +1001,50 @@ class GPUModelRunner(ModelRunnerBase): ) local_rank = self.local_rank % self.parallel_config.tensor_parallel_size - if not profile and (self.cache_config.enable_prefix_caching or self.parallel_config.splitwise_role != "mixed"): - cache_kvs_list = [] - for i in range(self.model_config.num_hidden_layers): - key_cache = paddle.empty(shape=[], dtype=cache_type) - key_cache_name = f"key_caches_{i}_rank{local_rank}.device{self.device_id}" - val_cache_name = f"value_caches_{i}_rank{local_rank}.device{self.device_id}" - key_cache = share_external_data(key_cache, key_cache_name, kv_cache_shape) - cache_kvs_list.append(key_cache) - value_cache = paddle.empty(shape=[], dtype=cache_type) - value_cache = share_external_data(value_cache, val_cache_name, kv_cache_shape) - cache_kvs_list.append(value_cache) + cache_ready_signal_data = np.zeros(shape=[self.parallel_config.tensor_parallel_size], dtype=np.int32) + cache_ready_signal = IPCSignal( + name="cache_ready_signal", + array=cache_ready_signal_data, + dtype=np.int32, + suffix=self.parallel_config.engine_worker_queue_port, + create=False, + ) + + # Check if gpu runner needs to create kv cache + # 1. During profiling, it creates its own kv cache. + # 2. GPU runner creates kv cache tensor unless p/d disaggregation is enabled. + create_cache_tensor = profile or self.parallel_config.splitwise_role == "mixed" + + if not create_cache_tensor: + logger.info("Waiting for cache managers to create kv cache..") + while cache_ready_signal.value[self.local_rank] != 1: + time.sleep(1) + logger.info("OK! Stop waiting.") + + logger.info("Initializing kv cache for all layers.") + cache_kvs_list = [] + for i in range(self.model_config.num_hidden_layers): + key_cache_name = f"key_caches_{i}_rank{local_rank}.device{self.device_id}" + val_cache_name = f"value_caches_{i}_rank{local_rank}.device{self.device_id}" + if create_cache_tensor: + logger.info(f"..creating kv cache for layer {i}: {kv_cache_shape}") + key_cache = paddle.full(shape=kv_cache_shape, fill_value=0, dtype=cache_type) + val_cache = paddle.full(shape=kv_cache_shape, fill_value=0, dtype=cache_type) + set_data_ipc(key_cache, key_cache_name) + set_data_ipc(val_cache, val_cache_name) + else: + logger.info(f"..attaching kv cache for layer {i}: {kv_cache_shape}") + key_cache = paddle.empty(shape=[], dtype=cache_type) + val_cache = paddle.empty(shape=[], dtype=cache_type) + key_cache = share_external_data(key_cache, key_cache_name, kv_cache_shape) + val_cache = share_external_data(val_cache, val_cache_name, kv_cache_shape) + cache_kvs_list.extend([key_cache, val_cache]) + self.share_inputs["caches"] = cache_kvs_list + + if not profile and create_cache_tensor: + logger.info("✅ kv cache is ready!") + cache_ready_signal.value[self.local_rank] = 1 - self.share_inputs["caches"] = cache_kvs_list - else: - for i in range(self.model_config.num_hidden_layers): - cache_kvs[f"key_caches_{i}"] = paddle.full( - shape=kv_cache_shape, - fill_value=0, - dtype=cache_type, - ) - cache_kvs[f"value_caches_{i}"] = paddle.full( - shape=kv_cache_shape, - fill_value=0, - dtype=cache_type, - ) - self.share_inputs["caches"] = list(cache_kvs.values()) - for value in cache_kvs.values(): - del value paddle.device.cuda.empty_cache() def initialize_attn_backend(self) -> None: @@ -1672,6 +1690,7 @@ class GPUModelRunner(ModelRunnerBase): self.share_inputs.pop("caches", None) if self.forward_meta is not None: self.forward_meta.clear_caches() + paddle.device.cuda.empty_cache() def clear_parameters(self, pid): """ " Dynamic model loader use to clear parameters use for RL""" diff --git a/fastdeploy/worker/worker_process.py b/fastdeploy/worker/worker_process.py index 0657c0cab..513e89655 100644 --- a/fastdeploy/worker/worker_process.py +++ b/fastdeploy/worker/worker_process.py @@ -41,7 +41,7 @@ from fastdeploy.config import ( ) from fastdeploy.input.ernie4_5_tokenizer import Ernie4_5Tokenizer from fastdeploy.inter_communicator import EngineWorkerQueue as TaskQueue -from fastdeploy.inter_communicator import IPCSignal +from fastdeploy.inter_communicator import ExistTaskStatus, IPCSignal, ModelWeightsStatus from fastdeploy.model_executor.layers.quantization import get_quantization_config from fastdeploy.platforms import current_platform from fastdeploy.utils import get_logger, parse_quantization @@ -175,7 +175,7 @@ class PaddleDisWorkerProc: name="launched_expert_service_signal", array=launched_expert_service_signal_data, dtype=np.int32, - suffix=self.parallel_config.engine_pid, + suffix=self.parallel_config.engine_worker_queue_port, create=False, ) while self.launched_expert_service_signal.value[self.local_rank % self.max_chips_per_node] == 0: @@ -192,7 +192,7 @@ class PaddleDisWorkerProc: name="worker_ready_signal", array=workers_ready, dtype=np.int32, - suffix=self.parallel_config.engine_pid, + suffix=self.parallel_config.engine_worker_queue_port, create=False, ) self.worker_ready_signal.value[self.local_rank % self.max_chips_per_node] = 1 @@ -260,7 +260,7 @@ class PaddleDisWorkerProc: self.model_weights_signal = paddle.zeros([1], dtype=paddle.int32) while True: if self.local_rank % self.parallel_config.tensor_parallel_size == 0: - if self.model_weights_status.value[0] != 0: + if self.model_weights_status.value[0] != ModelWeightsStatus.NORMAL: self.model_weights_signal[0] = int(self.model_weights_status.value[0]) if self.fd_config.load_config.dynamic_load_weight and self.parallel_config.enable_expert_parallel: paddle.distributed.broadcast(self.model_weights_signal, src=0, group=self.parallel_config.ep_group) @@ -281,7 +281,7 @@ class PaddleDisWorkerProc: if self.nnode > 1 and self.parallel_config.tensor_parallel_size > self.max_chips_per_node: self.task_queue.read_finish_flag.set(1) else: - self.exist_task_signal.value[0] = 1 + self.exist_task_signal.value[0] = ExistTaskStatus.EXIST if self.parallel_config.tensor_parallel_size > 1: # Synchronize the signal for other workers @@ -292,7 +292,7 @@ class PaddleDisWorkerProc: paddle.distributed.barrier(self.parallel_config.ep_group) else: paddle.distributed.barrier(self.parallel_config.tp_group) - if self.model_weights_signal[0] != 0: + if self.model_weights_signal[0] != ModelWeightsStatus.NORMAL: logger.info(f"Rank: {self.local_rank} has updated parameters.") from fastdeploy.rl.dynamic_weight_manager import ( DynamicWeightManager, @@ -304,16 +304,16 @@ class PaddleDisWorkerProc: self.worker.model_runner, self.parallel_config.engine_worker_queue_port, ) - self.model_weights_signal[0] = 0 + self.model_weights_signal[0] = ModelWeightsStatus.NORMAL - if self.exist_task_signal.value[0] == 1 or self.task_queue.read_finish_flag.get() == 1: + if self.exist_task_signal.value[0] == ExistTaskStatus.EXIST or self.task_queue.read_finish_flag.get() == 1: logger.info(f"Rank: {self.local_rank} Detected new requests.") self.insert_step = True tasks, read_finish = self.task_queue.get_tasks() if read_finish: # Ensure that every worker get the task - self.exist_task_signal.value[0] = 0 + self.exist_task_signal.value[0] = ExistTaskStatus.EMPTY self.task_queue.read_finish_flag.set(0) req_dicts = [] @@ -389,7 +389,7 @@ class PaddleDisWorkerProc: name="get_profile_block_num", array=get_profile_block_num, dtype=np.int32, - suffix=self.parallel_config.engine_pid, + suffix=self.parallel_config.engine_worker_queue_port, create=False, ) self.get_profile_block_num_signal.value[0] = num_blocks_local @@ -397,18 +397,7 @@ class PaddleDisWorkerProc: num_blocks_local = self.fd_config.parallel_config.total_block_num logger.info(f"------- num_blocks_global: {num_blocks_local} --------") - # wait engine launch cache_manager - if self.cache_config.enable_prefix_caching or self.parallel_config.splitwise_role != "mixed": - launched_cache_manager_signal_data = np.zeros([1], dtype=np.int32) - self.launched_cache_manager_signal = IPCSignal( - name="launched_cache_manager_signal", - array=launched_cache_manager_signal_data, - dtype=np.int32, - suffix=self.parallel_config.engine_pid, - create=False, - ) - while np.any(self.launched_cache_manager_signal.value[0] <= 0): - time.sleep(0.01) + # 4. init kv_cache with accurate num_blocks self.worker.initialize_cache(num_gpu_blocks=num_blocks_local) @@ -443,7 +432,7 @@ class PaddleDisWorkerProc: name="loaded_model_signal", array=loaded_model_signal_data, dtype=np.int32, - suffix=self.parallel_config.engine_pid, + suffix=self.parallel_config.engine_worker_queue_port, create=False, ) if self.ranks > 1: From b41988f4bcd5d6f8b326b37033180a215ea864e6 Mon Sep 17 00:00:00 2001 From: gaoziyuan <88373061+gzy19990617@users.noreply.github.com> Date: Tue, 16 Sep 2025 20:56:36 +0800 Subject: [PATCH 26/36] fix gid (#4038) --- fastdeploy/config.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/fastdeploy/config.py b/fastdeploy/config.py index 08e52b52f..5a86fa092 100644 --- a/fastdeploy/config.py +++ b/fastdeploy/config.py @@ -349,12 +349,14 @@ class ParallelConfig: (self.data_parallel_rank + 1) * self.tensor_parallel_size, ) ) + dist.collective._set_custom_gid(None) # same ep group id dist.collective._set_custom_gid(self.data_parallel_size + tp_gid_offset) self.ep_group = dist.new_group(range(self.expert_parallel_size)) logger.info( f"data_parallel_size: {self.data_parallel_size}, tensor_parallel_size: {self.tensor_parallel_size}, expert_parallel_size: {self.expert_parallel_size}, data_parallel_rank: {self.data_parallel_rank}, tensor_parallel_rank: {self.tensor_parallel_rank}, expert_parallel_rank: {self.expert_parallel_rank}, tp_group: {self.tp_group}." ) + dist.collective._set_custom_gid(None) def print(self): """ From 7f9a9b37f389f3fdc62a2c57eb298239bbad81af Mon Sep 17 00:00:00 2001 From: K11OntheBoat Date: Wed, 17 Sep 2025 12:40:08 +0800 Subject: [PATCH 27/36] Support limit thinking lengths (#4070) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: K11OntheBoat <“ruianmaidanglao@163.com”> --- fastdeploy/config.py | 1 + fastdeploy/entrypoints/engine_client.py | 2 - .../ernie4_5_vl_processor.py | 4 ++ .../model_executor/pre_and_post_process.py | 2 +- fastdeploy/worker/gpu_model_runner.py | 58 +++++++++++------- fastdeploy/worker/worker_process.py | 23 +++++++ .../EB_VL_Lite/test_EB_VL_Lite_serving.py | 60 +++++++++++++++++++ tests/e2e/test_EB_VL_Lite_serving.py | 60 +++++++++++++++++++ 8 files changed, 184 insertions(+), 26 deletions(-) diff --git a/fastdeploy/config.py b/fastdeploy/config.py index 5a86fa092..1339e878f 100644 --- a/fastdeploy/config.py +++ b/fastdeploy/config.py @@ -130,6 +130,7 @@ class ModelConfig: self.quantization = None self.pad_token_id: int = -1 self.eos_tokens_lens: int = 2 + self.think_end_id = None self.lm_head_fp32: bool = False self.model_format = "auto" self.partial_rotary_factor: float = 1.0 diff --git a/fastdeploy/entrypoints/engine_client.py b/fastdeploy/entrypoints/engine_client.py index 43c81e65f..41ff38a2a 100644 --- a/fastdeploy/entrypoints/engine_client.py +++ b/fastdeploy/entrypoints/engine_client.py @@ -177,8 +177,6 @@ class EngineClient: task["prompt_token_ids_len"] = len(task["prompt_token_ids"]) input_ids_len = task["prompt_token_ids_len"] task["max_tokens"] = min(self.max_model_len - input_ids_len, task.get("max_tokens")) - if task.get("reasoning_max_tokens", None) is None: - task["reasoning_max_tokens"] = max(int(task["max_tokens"] * 0.8), 1) min_tokens = task.get("min_tokens", 1) if "messages" in task: del task["messages"] diff --git a/fastdeploy/input/ernie4_5_vl_processor/ernie4_5_vl_processor.py b/fastdeploy/input/ernie4_5_vl_processor/ernie4_5_vl_processor.py index ce5187e3f..8e1d2e5e9 100644 --- a/fastdeploy/input/ernie4_5_vl_processor/ernie4_5_vl_processor.py +++ b/fastdeploy/input/ernie4_5_vl_processor/ernie4_5_vl_processor.py @@ -255,6 +255,10 @@ class Ernie4_5_VLProcessor(Ernie4_5Processor): request["prompt_token_ids"] = request["prompt_token_ids"][: max_model_len - 1] if request.get("max_tokens") is None: request["max_tokens"] = max(1, max_model_len - len(request["prompt_token_ids"])) + else: + request["max_tokens"] = min(max_model_len - len(request["prompt_token_ids"]), request["max_tokens"]) + if request.get("reasoning_max_tokens") is None: + request["reasoning_max_tokens"] = max(int(request["max_tokens"] * 0.8), 1) data_processor_logger.info(f"Processed request {request}") return request diff --git a/fastdeploy/model_executor/pre_and_post_process.py b/fastdeploy/model_executor/pre_and_post_process.py index 975174737..3468dd78d 100644 --- a/fastdeploy/model_executor/pre_and_post_process.py +++ b/fastdeploy/model_executor/pre_and_post_process.py @@ -166,7 +166,7 @@ def post_process_normal( ) -> ModelRunnerOutput: """Post-processing steps after completing a single token generation.""" # handle vl: - if model_output.enable_thinking: + if model_output.enable_thinking and model_output.think_end_id is not None: exists_think_end = sampler_output.sampled_token_ids == model_output.think_end_id paddle.assign( paddle.where( diff --git a/fastdeploy/worker/gpu_model_runner.py b/fastdeploy/worker/gpu_model_runner.py index 3800e25a3..0d5fa0459 100644 --- a/fastdeploy/worker/gpu_model_runner.py +++ b/fastdeploy/worker/gpu_model_runner.py @@ -265,15 +265,21 @@ class GPUModelRunner(ModelRunnerBase): else: position_ids = None - enable_thinking = request.get("enable_thinking", True) - enable_thinking = enable_thinking if enable_thinking is not None else True - self.share_inputs["enable_thinking"][:] = enable_thinking - self.share_inputs["need_think_end"][idx : idx + 1, :] = 1 if enable_thinking else 0 - self.share_inputs["reasoning_index"][idx : idx + 1, :] = request.get("reasoning_max_tokens", 2048) self.share_inputs["rope_emb"][idx : idx + 1, :] = self.prepare_rope3d( position_ids, request.get("max_tokens", 2048) ) + if request.get("enable_thinking", False) and request.get("reasoning_max_tokens") is not None: + # Enable thinking + self.share_inputs["enable_thinking"][:] = True + self.share_inputs["need_think_end"][idx : idx + 1, :] = 1 + self.share_inputs["reasoning_index"][idx : idx + 1, :] = request.get("reasoning_max_tokens") + else: + # Disable thinking + self.share_inputs["enable_thinking"][:] = False + self.share_inputs["need_think_end"][idx : idx + 1, :] = 0 + self.share_inputs["reasoning_index"][idx : idx + 1, :] = 0 + if isinstance(request.prompt_token_ids, np.ndarray): prompt_token_ids = request.prompt_token_ids.tolist() else: @@ -495,16 +501,22 @@ class GPUModelRunner(ModelRunnerBase): self.share_inputs["prompt_lens"][idx : idx + 1] = length if self.enable_mm: - enable_thinking = request.get("enable_thinking", True) - enable_thinking = enable_thinking if enable_thinking is not None else True - self.share_inputs["enable_thinking"][:] = enable_thinking - self.share_inputs["need_think_end"][idx : idx + 1, :] = 1 if enable_thinking else 0 - self.share_inputs["reasoning_index"][idx : idx + 1, :] = request.get("reasoning_max_tokens", 2048) self.share_inputs["rope_emb"][idx : idx + 1, :] = self.prepare_rope3d( position_ids, request.get("max_tokens", 2048) ) self.share_inputs["seq_lens_decoder"][idx : idx + 1] = 0 + if request.get("enable_thinking", False) and request.get("reasoning_max_tokens") is not None: + # Enable thinking + self.share_inputs["enable_thinking"][:] = True + self.share_inputs["need_think_end"][idx : idx + 1, :] = 1 + self.share_inputs["reasoning_index"][idx : idx + 1, :] = request.get("reasoning_max_tokens") + else: + # Disable thinking + self.share_inputs["enable_thinking"][:] = False + self.share_inputs["need_think_end"][idx : idx + 1, :] = 0 + self.share_inputs["reasoning_index"][idx : idx + 1, :] = 0 + def get_attr_from_request(request, attr, default_value=None): res = request.get(attr, default_value) if res is not None: @@ -735,6 +747,11 @@ class GPUModelRunner(ModelRunnerBase): # Initialize rotary position embedding tmp_position_ids = paddle.arange(self.parallel_config.max_model_len).reshape((1, -1)) + # Initialize thinking related buffers + self.share_inputs["need_think_end"] = paddle.full(shape=[max_num_seqs, 1], fill_value=0, dtype="int32") + self.share_inputs["enable_thinking"] = paddle.full(shape=[1], fill_value=False, dtype="bool") + self.share_inputs["reasoning_index"] = paddle.full(shape=[max_num_seqs, 1], fill_value=0, dtype="int32") + # TODO(gongshaotian): move to models if not self.enable_mm: self.share_inputs["rope_emb"] = get_rope( @@ -827,11 +844,6 @@ class GPUModelRunner(ModelRunnerBase): dtype="float32", ) self.share_inputs["image_features"] = None - self.share_inputs["need_think_end"] = paddle.full(shape=[max_num_seqs, 1], fill_value=0, dtype="int32") - self.share_inputs["enable_thinking"] = paddle.full( - shape=[1], fill_value=("ernie" in self.model_config.model_type), dtype="bool" - ) - self.share_inputs["reasoning_index"] = paddle.full(shape=[max_num_seqs, 1], fill_value=0, dtype="int32") def _prepare_inputs(self) -> None: """Prepare the model inputs""" @@ -1220,10 +1232,10 @@ class GPUModelRunner(ModelRunnerBase): ), accept_tokens=(self.share_inputs["accept_tokens"] if self.speculative_decoding else None), accept_num=(self.share_inputs["accept_num"] if self.speculative_decoding else None), - enable_thinking=(self.share_inputs["enable_thinking"] if self.enable_mm else None), - think_end_id=(getattr(self.model_config, "think_end_id", -1) if self.enable_mm else -1), - need_think_end=(self.share_inputs["need_think_end"] if self.enable_mm else None), - reasoning_index=(self.share_inputs["reasoning_index"] if self.enable_mm else None), + enable_thinking=self.share_inputs["enable_thinking"], + think_end_id=self.model_config.think_end_id, + need_think_end=self.share_inputs["need_think_end"], + reasoning_index=self.share_inputs["reasoning_index"], stop_token_ids=self.share_inputs["stop_seqs"], stop_seqs_len=self.share_inputs["stop_seqs_len"], ) @@ -1515,10 +1527,10 @@ class GPUModelRunner(ModelRunnerBase): ), accept_tokens=(self.share_inputs["accept_tokens"] if self.speculative_decoding else None), accept_num=(self.share_inputs["accept_num"] if self.speculative_decoding else None), - enable_thinking=(self.share_inputs["enable_thinking"] if self.enable_mm else None), - think_end_id=(getattr(self.model_config, "think_end_id", -1) if self.enable_mm else -1), - need_think_end=(self.share_inputs["need_think_end"][:num_running_requests] if self.enable_mm else None), - reasoning_index=(self.share_inputs["reasoning_index"][:num_running_requests] if self.enable_mm else None), + enable_thinking=self.share_inputs["enable_thinking"], + think_end_id=self.model_config.think_end_id, + need_think_end=self.share_inputs["need_think_end"][:num_running_requests], + reasoning_index=self.share_inputs["reasoning_index"][:num_running_requests], stop_token_ids=self.share_inputs["stop_seqs"], stop_seqs_len=self.share_inputs["stop_seqs_len"], ) diff --git a/fastdeploy/worker/worker_process.py b/fastdeploy/worker/worker_process.py index 513e89655..12e867cfb 100644 --- a/fastdeploy/worker/worker_process.py +++ b/fastdeploy/worker/worker_process.py @@ -129,6 +129,28 @@ def update_fd_config_for_mm(fd_config: FDConfig) -> None: fd_config.model_config.sequence_parallel = fd_config.parallel_config.sequence_parallel +def update_think_end_id_for_ernie(fd_config: FDConfig) -> None: + """ + Updates the think_end_id in the model config. Uses the ID of '' + if it exists, otherwise defaults to None. + """ + is_ernie = ErnieArchitectures.contains_ernie_arch(fd_config.model_config.architectures) + if current_platform.is_cuda() and is_ernie: + tokenizer = Ernie4_5Tokenizer.from_pretrained( + fd_config.model_config.model, + model_max_length=fd_config.parallel_config.max_model_len, + padding_side="right", + use_fast=False, + ) + + vocab = tokenizer.get_vocab() + fd_config.model_config.think_end_id = vocab.get("", None) + if fd_config.model_config.think_end_id is not None: + logger.info(f"Get think_end_id {fd_config.model_config.think_end_id} from vocab.") + else: + logger.info("No token found in vocabulary, the model can not do reasoning.") + + class PaddleDisWorkerProc: """ Paddle Distributed wrapper for fastdeploy.worker.Worker, @@ -771,6 +793,7 @@ def initialize_fd_config(args, ranks: int = 1, local_rank: int = 0) -> FDConfig: plas_attention_config=plas_attention_config, ) update_fd_config_for_mm(fd_config) + update_think_end_id_for_ernie(fd_config) return fd_config diff --git a/tests/ci_use/EB_VL_Lite/test_EB_VL_Lite_serving.py b/tests/ci_use/EB_VL_Lite/test_EB_VL_Lite_serving.py index e5d7bfccd..4cbf838be 100644 --- a/tests/ci_use/EB_VL_Lite/test_EB_VL_Lite_serving.py +++ b/tests/ci_use/EB_VL_Lite/test_EB_VL_Lite_serving.py @@ -580,3 +580,63 @@ def test_profile_reset_block_num(): f"Reset total_block_num {actual_value} 与 baseline {baseline} diff需要在5%以内" f"Allowed range: [{lower_bound:.1f}, {upper_bound:.1f}]" ) + + +def test_thinking_logic_flag(openai_client, capsys): + """ + Test the interaction between token calculation logic and conditional thinking. + This test covers: + 1. Default max_tokens calculation when not provided. + 2. Capping of max_tokens when it exceeds model limits. + 3. Default reasoning_max_tokens calculation when not provided. + 4. Activation of thinking based on the final state of reasoning_max_tokens. + """ + + response_case_1 = openai_client.chat.completions.create( + model="default", + messages=[{"role": "user", "content": "Explain gravity briefly."}], + temperature=1, + stream=False, + extra_body={ + "chat_template_kwargs": {"enable_thinking": True}, + }, + ) + assert response_case_1.choices[0].message.reasoning_content is not None + + response_case_2 = openai_client.chat.completions.create( + model="default", + messages=[{"role": "user", "content": "Explain gravity in a way that a five-year-old child can understand."}], + temperature=1, + stream=False, + max_tokens=20, + extra_body={ + "chat_template_kwargs": {"enable_thinking": True}, + "reasoning_max_tokens": 5, + }, + ) + assert response_case_2.choices[0].message.reasoning_content is not None + + response_case_3 = openai_client.chat.completions.create( + model="default", + messages=[{"role": "user", "content": "Explain gravity in a way that a five-year-old child can understand."}], + temperature=1, + stream=False, + max_tokens=20, + extra_body={ + "chat_template_kwargs": {"enable_thinking": True}, + "reasoning_max_tokens": None, + }, + ) + assert response_case_3.choices[0].message.reasoning_content is not None + + response_case_4 = openai_client.chat.completions.create( + model="default", + messages=[{"role": "user", "content": "Explain gravity in a way that a five-year-old child can understand."}], + temperature=1, + stream=False, + max_tokens=20, + extra_body={ + "chat_template_kwargs": {"enable_thinking": False}, + }, + ) + assert response_case_4.choices[0].message.reasoning_content is None diff --git a/tests/e2e/test_EB_VL_Lite_serving.py b/tests/e2e/test_EB_VL_Lite_serving.py index af6daf246..8b10317fb 100644 --- a/tests/e2e/test_EB_VL_Lite_serving.py +++ b/tests/e2e/test_EB_VL_Lite_serving.py @@ -592,3 +592,63 @@ def test_profile_reset_block_num(): f"Reset total_block_num {actual_value} 与 baseline {baseline} diff需要在5%以内" f"Allowed range: [{lower_bound:.1f}, {upper_bound:.1f}]" ) + + +def test_thinking_logic_flag(openai_client, capsys): + """ + Test the interaction between token calculation logic and conditional thinking. + This test covers: + 1. Default max_tokens calculation when not provided. + 2. Capping of max_tokens when it exceeds model limits. + 3. Default reasoning_max_tokens calculation when not provided. + 4. Activation of thinking based on the final state of reasoning_max_tokens. + """ + + response_case_1 = openai_client.chat.completions.create( + model="default", + messages=[{"role": "user", "content": "Explain gravity briefly."}], + temperature=1, + stream=False, + extra_body={ + "chat_template_kwargs": {"enable_thinking": True}, + }, + ) + assert response_case_1.choices[0].message.reasoning_content is not None + + response_case_2 = openai_client.chat.completions.create( + model="default", + messages=[{"role": "user", "content": "Explain gravity in a way that a five-year-old child can understand."}], + temperature=1, + stream=False, + max_tokens=20, + extra_body={ + "chat_template_kwargs": {"enable_thinking": True}, + "reasoning_max_tokens": 5, + }, + ) + assert response_case_2.choices[0].message.reasoning_content is not None + + response_case_3 = openai_client.chat.completions.create( + model="default", + messages=[{"role": "user", "content": "Explain gravity in a way that a five-year-old child can understand."}], + temperature=1, + stream=False, + max_tokens=20, + extra_body={ + "chat_template_kwargs": {"enable_thinking": True}, + "reasoning_max_tokens": None, + }, + ) + assert response_case_3.choices[0].message.reasoning_content is not None + + response_case_4 = openai_client.chat.completions.create( + model="default", + messages=[{"role": "user", "content": "Explain gravity in a way that a five-year-old child can understand."}], + temperature=1, + stream=False, + max_tokens=20, + extra_body={ + "chat_template_kwargs": {"enable_thinking": False}, + }, + ) + assert response_case_4.choices[0].message.reasoning_content is None From cffde70949ca5b56d666a61ecd7f05c8ec44f0af Mon Sep 17 00:00:00 2001 From: Jiang-Jia-Jun <163579578+Jiang-Jia-Jun@users.noreply.github.com> Date: Wed, 17 Sep 2025 16:02:56 +0800 Subject: [PATCH 28/36] Add assertion for ENABLE_V1_KVCACHE_SCHEDULER (#4146) --- fastdeploy/config.py | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/fastdeploy/config.py b/fastdeploy/config.py index 1339e878f..4d1f7e7d1 100644 --- a/fastdeploy/config.py +++ b/fastdeploy/config.py @@ -1339,6 +1339,11 @@ class FDConfig: ) if self.scheduler_config is not None: self.scheduler_config.check() + + if int(envs.ENABLE_V1_KVCACHE_SCHEDULER) == 1: + assert ( + int(envs.FD_DISABLED_RECOVER) == 0 + ), "FD_DISABLED_RECOVER is not supported while ENABLE_V1_KVCACHE_SCHEDULER is turned on." def print(self): """ From 0fa28b1068ecfe14ac178e5a39b456a3e0b23b23 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9D=8E=E6=B3=B3=E6=A1=A6?= <39643373+liyonghua0910@users.noreply.github.com> Date: Thu, 18 Sep 2025 10:34:49 +0800 Subject: [PATCH 29/36] [fix] fix ep group all-reduce (#4140) * [fix] fix ep group all-reduce * [fix] fix clear/update lock not working when workers > 1 * [chore] add preemption triggered info log * [fix] fix code style * fix model_weights_signal (#4092) * fix model_weights_signal --------- Co-authored-by: Yuanle Liu --- fastdeploy/config.py | 10 ++++++--- .../engine/sched/resource_manager_v1.py | 1 + fastdeploy/entrypoints/engine_client.py | 12 ++++++---- .../layers/moe/fused_moe_cutlass_backend.py | 2 +- fastdeploy/rl/dynamic_weight_manager.py | 20 ++++++----------- fastdeploy/worker/worker_process.py | 22 ++++++++++++++----- 6 files changed, 41 insertions(+), 26 deletions(-) diff --git a/fastdeploy/config.py b/fastdeploy/config.py index 4d1f7e7d1..ce83df4f2 100644 --- a/fastdeploy/config.py +++ b/fastdeploy/config.py @@ -352,8 +352,12 @@ class ParallelConfig: ) dist.collective._set_custom_gid(None) # same ep group id - dist.collective._set_custom_gid(self.data_parallel_size + tp_gid_offset) - self.ep_group = dist.new_group(range(self.expert_parallel_size)) + # dist.collective._set_custom_gid(self.data_parallel_size + tp_gid_offset) + # self.ep_group = dist.new_group(range(self.expert_parallel_size)) + if self.enable_expert_parallel: + dist.collective._set_custom_gid(self.data_parallel_size + tp_gid_offset) + self.ep_group = dist.new_group(range(self.expert_parallel_size)) + dist.collective._set_custom_gid(None) logger.info( f"data_parallel_size: {self.data_parallel_size}, tensor_parallel_size: {self.tensor_parallel_size}, expert_parallel_size: {self.expert_parallel_size}, data_parallel_rank: {self.data_parallel_rank}, tensor_parallel_rank: {self.tensor_parallel_rank}, expert_parallel_rank: {self.expert_parallel_rank}, tp_group: {self.tp_group}." ) @@ -1339,7 +1343,7 @@ class FDConfig: ) if self.scheduler_config is not None: self.scheduler_config.check() - + if int(envs.ENABLE_V1_KVCACHE_SCHEDULER) == 1: assert ( int(envs.FD_DISABLED_RECOVER) == 0 diff --git a/fastdeploy/engine/sched/resource_manager_v1.py b/fastdeploy/engine/sched/resource_manager_v1.py index bb9ae0bfb..bb9164d24 100644 --- a/fastdeploy/engine/sched/resource_manager_v1.py +++ b/fastdeploy/engine/sched/resource_manager_v1.py @@ -120,6 +120,7 @@ class ResourceManagerV1(ResourceManager): self._free_blocks(preempted_req) preempted_req.cached_block_num = 0 self.to_be_rescheduled_request_id_set.add(preempted_req.request_id) + llm_logger.info(f"Preemption is triggered! Preempted request id: {preempted_req.request_id}") preempted_reqs.append(preempted_req) scheduled_reqs.append(self._prepare_preempt_task(preempted_req)) main_process_metrics.num_requests_waiting.inc(1) diff --git a/fastdeploy/entrypoints/engine_client.py b/fastdeploy/entrypoints/engine_client.py index 41ff38a2a..1931b284a 100644 --- a/fastdeploy/entrypoints/engine_client.py +++ b/fastdeploy/entrypoints/engine_client.py @@ -16,12 +16,12 @@ import inspect import os -import threading import time import traceback import uuid import numpy as np +from filelock import FileLock from fastdeploy import envs from fastdeploy.config import ModelConfig @@ -132,7 +132,7 @@ class EngineClient: pid, max_connections=int(os.getenv("FD_DEALER_CONNECTIONS", 50)) ) self.connection_initialized = False - self.clear_update_lock = threading.Lock() + self.clear_update_lock = FileLock(f"/tmp/fd_weight_clear_update_lock__pid{pid}_port{port}.lock") def create_zmq_client(self, model, mode): """ @@ -351,7 +351,9 @@ class EngineClient: if self.model_weights_status_signal.value[0] == ModelWeightsStatus.NORMAL: return True, "" if self.model_weights_status_signal.value[0] == ModelWeightsStatus.UPDATING: - return False, "updating model weight already" + return False, "worker is updating model weight already" + if self.model_weights_status_signal.value[0] == ModelWeightsStatus.CLEARING: + return False, "worker is clearing model weight, cannot update now" self.model_weights_status_signal.value[0] = ModelWeightsStatus.UPDATING if self.enable_prefix_caching or self.enable_splitwise: @@ -395,7 +397,9 @@ class EngineClient: if self.model_weights_status_signal.value[0] == ModelWeightsStatus.CLEARED: return True, "" if self.model_weights_status_signal.value[0] == ModelWeightsStatus.CLEARING: - return False, "clearing model weight already" + return False, "worker is clearing model weight already" + if self.model_weights_status_signal.value[0] == ModelWeightsStatus.UPDATING: + return False, "worker is updating model weight, cannot clear now" self.model_weights_status_signal.value[0] = ModelWeightsStatus.CLEARING if self.enable_prefix_caching or self.enable_splitwise: diff --git a/fastdeploy/model_executor/layers/moe/fused_moe_cutlass_backend.py b/fastdeploy/model_executor/layers/moe/fused_moe_cutlass_backend.py index a44ef26dc..aab5960ee 100644 --- a/fastdeploy/model_executor/layers/moe/fused_moe_cutlass_backend.py +++ b/fastdeploy/model_executor/layers/moe/fused_moe_cutlass_backend.py @@ -297,7 +297,7 @@ class CutlassMoEMethod(UnquantizedFusedMoEMethod): ) if layer.reduce_results and layer.tp_size > 1: - tensor_model_parallel_all_reduce(fused_moe_out) + tensor_model_parallel_all_reduce(fused_moe_out, layer.fd_config.parallel_config.tp_group) return fused_moe_out diff --git a/fastdeploy/rl/dynamic_weight_manager.py b/fastdeploy/rl/dynamic_weight_manager.py index ef0834423..869582bab 100644 --- a/fastdeploy/rl/dynamic_weight_manager.py +++ b/fastdeploy/rl/dynamic_weight_manager.py @@ -220,23 +220,17 @@ class DynamicWeightManager: check model weights status """ logger.info(f"dynamic weight manager is check model weights status! {model_weights_status.value[0]}") - is_stop = 0 while model_weights_status.value[0] != ModelWeightsStatus.NORMAL: if model_weights_status.value[0] == ModelWeightsStatus.UPDATING: logger.info("infer engine stopped! start to load new checkpoint...") model_runner.update_parameters(pid) + while model_weights_status.value[0] != ModelWeightsStatus.NORMAL: + time.sleep(0.01) + logger.info("finished loading new checkpoint") elif model_weights_status.value[0] == ModelWeightsStatus.CLEARING: logger.info("infer engine stopped! start to clear checkpoint...") model_runner.clear_parameters(pid) - while True: - if model_weights_status.value[0] == ModelWeightsStatus.NORMAL: - logger.info("finished loading new checkpoint") - break - elif is_stop == 1 or (model_weights_status.value[0] == ModelWeightsStatus.CLEARED and is_stop == 0): - if is_stop == 0: - logger.info("finished clearing checkpoint") - is_stop = 1 - time.sleep(0.001) - break - else: - time.sleep(0.001) + while model_weights_status.value[0] != ModelWeightsStatus.CLEARED: + time.sleep(0.01) + logger.info("finished clearing checkpoint") + time.sleep(0.01) diff --git a/fastdeploy/worker/worker_process.py b/fastdeploy/worker/worker_process.py index 12e867cfb..856a58ef9 100644 --- a/fastdeploy/worker/worker_process.py +++ b/fastdeploy/worker/worker_process.py @@ -270,6 +270,11 @@ class PaddleDisWorkerProc: create=False, ) + def _broadcast_model_weights_signal(self, src: int, group) -> int: + model_weights_signal_tensor = paddle.full(shape=[1], fill_value=self.model_weights_signal[0], dtype="int32") + paddle.distributed.broadcast(model_weights_signal_tensor, src=src, group=group) + return model_weights_signal_tensor.item() + def event_loop_normal(self) -> None: """Main event loop for Paddle Distrubuted Workers. TODO(gongshaotian): support remote calling of functions that control worker. @@ -279,15 +284,19 @@ class PaddleDisWorkerProc: req_ids = [] num_running_requests = 0 local_rank = self.local_rank % self.parallel_config.tensor_parallel_size - self.model_weights_signal = paddle.zeros([1], dtype=paddle.int32) + self.model_weights_signal = np.zeros([1], dtype=np.int32) while True: if self.local_rank % self.parallel_config.tensor_parallel_size == 0: if self.model_weights_status.value[0] != ModelWeightsStatus.NORMAL: self.model_weights_signal[0] = int(self.model_weights_status.value[0]) if self.fd_config.load_config.dynamic_load_weight and self.parallel_config.enable_expert_parallel: - paddle.distributed.broadcast(self.model_weights_signal, src=0, group=self.parallel_config.ep_group) - if self.fd_config.load_config.dynamic_load_weight: - paddle.distributed.broadcast(self.model_weights_signal, src=0, group=self.parallel_config.tp_group) + self.model_weights_signal[0] = self._broadcast_model_weights_signal( + src=0, group=self.parallel_config.ep_group + ) + if self.fd_config.load_config.dynamic_load_weight and self.parallel_config.tensor_parallel_size > 1: + self.model_weights_signal[0] = self._broadcast_model_weights_signal( + src=0, group=self.parallel_config.tp_group + ) self.insert_step = False req_dicts = None @@ -315,7 +324,9 @@ class PaddleDisWorkerProc: else: paddle.distributed.barrier(self.parallel_config.tp_group) if self.model_weights_signal[0] != ModelWeightsStatus.NORMAL: - logger.info(f"Rank: {self.local_rank} has updated parameters.") + logger.info( + f"Rank: {self.local_rank} to update or clear parameters, signal is {self.model_weights_signal[0]}, [-1:clear, 1:update]" + ) from fastdeploy.rl.dynamic_weight_manager import ( DynamicWeightManager, ) @@ -327,6 +338,7 @@ class PaddleDisWorkerProc: self.parallel_config.engine_worker_queue_port, ) self.model_weights_signal[0] = ModelWeightsStatus.NORMAL + logger.info(f"Rank: {self.local_rank} has updated or cleared parameters.") if self.exist_task_signal.value[0] == ExistTaskStatus.EXIST or self.task_queue.read_finish_flag.get() == 1: logger.info(f"Rank: {self.local_rank} Detected new requests.") From 74d7b9151d9cbcd68ed2f0213d1541f94cb336ad Mon Sep 17 00:00:00 2001 From: JYChen Date: Thu, 18 Sep 2025 10:53:07 +0800 Subject: [PATCH 30/36] fix mtp (#4153) Co-authored-by: YuanRisheng --- .../model_executor/models/ernie4_5_mtp.py | 22 ++++++++++++++----- 1 file changed, 17 insertions(+), 5 deletions(-) diff --git a/fastdeploy/model_executor/models/ernie4_5_mtp.py b/fastdeploy/model_executor/models/ernie4_5_mtp.py index 19123678a..a722b2e56 100644 --- a/fastdeploy/model_executor/models/ernie4_5_mtp.py +++ b/fastdeploy/model_executor/models/ernie4_5_mtp.py @@ -16,6 +16,7 @@ from __future__ import annotations +import re from functools import partial from typing import Dict, Union @@ -250,7 +251,7 @@ class Ernie4_5_MTPModel(nn.Layer): self.embed_tokens = fd_config.speculative_config.sharing_model.ernie.embed_tokens self.norm = fd_config.speculative_config.sharing_model.ernie.norm - self.layers = nn.LayerList( + self.mtp_block = nn.LayerList( [ Ernie4_5_DecoderLayer( fd_config=fd_config, @@ -296,7 +297,7 @@ class Ernie4_5_MTPModel(nn.Layer): self.eh_proj.load_state_dict(state_dict) for i in range(self.num_layers): logger.info(f"Start load layer {i}") - self.layers[i].load_state_dict(state_dict) + self.mtp_block[i].load_state_dict(state_dict) def forward( self, @@ -315,7 +316,7 @@ class Ernie4_5_MTPModel(nn.Layer): hidden_states = self.eh_proj(inputs_embedding) residual = None for i in range(self.num_layers): - hidden_states, residual = self.layers[i](forward_meta, hidden_states, residual) + hidden_states, residual = self.mtp_block[i](forward_meta, hidden_states, residual) hidden_states = hidden_states + residual @@ -374,17 +375,23 @@ class Ernie4_5_MTPForCausalLM(ModelForCasualLM): weights_iterator (Iterator): An iterator yielding (name, weight) pairs. """ - from fastdeploy.model_executor.utils import default_weight_loader + from fastdeploy.model_executor.utils import ( + default_weight_loader, + process_weights_after_loading, + ) all_param_mapping = [ # (param_name, weight_name, expert_id, shard_id) ("embed_tokens.embeddings", "embed_tokens", None, None), ("lm_head.linear", "lm_head", None, None), + ("enorm", "mtp_emb_norm.0", None, None), + ("hnorm", "mtp_hidden_norm.0", None, None), + ("eh_proj.linear", "mtp_linear_proj.0", None, None), ] params_dict = dict(self.named_parameters()) shard_id = None - + process_weights_after_loading_fn = process_weights_after_loading(dict(self.named_sublayers())) for loaded_weight_name, loaded_weight in weights_iterator: for param_name, weight_name, exp_id, shard_id in all_param_mapping: if weight_name not in loaded_weight_name: @@ -396,11 +403,16 @@ class Ernie4_5_MTPForCausalLM(ModelForCasualLM): else: if loaded_weight_name not in params_dict.keys(): continue + model_param_name = loaded_weight_name param = params_dict[loaded_weight_name] # Get weight loader from parameter and set weight weight_loader = getattr(param, "weight_loader", default_weight_loader(self.fd_config)) weight_loader(param, loaded_weight) + model_sublayer_name = re.sub( + r"\.(up_gate_proj_weight|down_proj_weight|weight|cache_k_scale|cache_v_scale)$", "", model_param_name + ) + process_weights_after_loading_fn(model_sublayer_name, param) def compute_logits(self, hidden_states: paddle.Tensor): """ From 4f460db5568d3a70e8255183df5dcfc709b0ac12 Mon Sep 17 00:00:00 2001 From: Sunny-bot1 <68891411+Sunny-bot1@users.noreply.github.com> Date: Fri, 19 Sep 2025 11:13:12 +0800 Subject: [PATCH 31/36] [CP2.2] Machete support group scale & wint8 & v1 loader (#4166) * support v1 loader for machete (#3999) * [Optimize] Support WINT8 and group scale for Machete (#3905) * [Optimize] Machete using group scale default (#4121) --- custom_ops/gpu_ops/machete/machete_mm.cu | 6 +- .../gpu_ops/machete/machete_prepack_B.cu | 2 + .../layers/quantization/ops/machete_mm.py | 19 ++- .../layers/quantization/weight_only.py | 89 ++++++------ tests/operators/test_machete_mm.py | 132 ++++++++++++++---- 5 files changed, 166 insertions(+), 82 deletions(-) diff --git a/custom_ops/gpu_ops/machete/machete_mm.cu b/custom_ops/gpu_ops/machete/machete_mm.cu index 53774fa0c..c6f56d1c9 100644 --- a/custom_ops/gpu_ops/machete/machete_mm.cu +++ b/custom_ops/gpu_ops/machete/machete_mm.cu @@ -30,10 +30,12 @@ paddle::Tensor mm(paddle::Tensor const& A, paddle::Tensor const& B, std::optional const& maybe_token_scales, std::string maybe_schedule) { machete::ScalarType const b_type = machete::ScalarType::from_id(b_type_id); - std::optional maybe_group_size_opt; + std::optional maybe_group_size_opt = std::optional(maybe_group_size); std::optional maybe_schedule_opt; if (maybe_schedule == "") { maybe_schedule_opt = std::nullopt; + } else { + maybe_schedule_opt = std::optional(maybe_schedule); } return machete::mm_dispatch({.A = A, .B = B, @@ -63,6 +65,8 @@ std::vector MacheteMMKernel( paddle::DataType maybe_out_type; if (b_type_str == "uint4b8") { b_type_id = machete::kU4B8.id(); + } else if (b_type_str == "uint8b128") { + b_type_id = machete::kU8B128.id(); } else { PADDLE_ENFORCE(false, "b_type_str not supported!"); } diff --git a/custom_ops/gpu_ops/machete/machete_prepack_B.cu b/custom_ops/gpu_ops/machete/machete_prepack_B.cu index 6014ca9ef..34bd1c705 100644 --- a/custom_ops/gpu_ops/machete/machete_prepack_B.cu +++ b/custom_ops/gpu_ops/machete/machete_prepack_B.cu @@ -51,6 +51,8 @@ std::vector MachetePrepackBKernel( if (b_type_str == "uint4b8") { b_type_id = machete::kU4B8.id(); + } else if (b_type_str == "uint8b128") { + b_type_id = machete::kU8B128.id(); } else { PADDLE_ENFORCE(false, "b_type_str not supported!"); } diff --git a/fastdeploy/model_executor/layers/quantization/ops/machete_mm.py b/fastdeploy/model_executor/layers/quantization/ops/machete_mm.py index 218da0d21..b080bb627 100644 --- a/fastdeploy/model_executor/layers/quantization/ops/machete_mm.py +++ b/fastdeploy/model_executor/layers/quantization/ops/machete_mm.py @@ -85,7 +85,7 @@ def quantize_weights( w_s: Scales (None if `group_size` is None). """ assert paddle.is_floating_point(w), "w must be float type" - assert quant_type in ["uint4", "uint4b8"], "only support quant_type = uint4, uint4b8" + assert quant_type in ["uint4b8", "uint8b128"], "only support quant_type = uint4b8, uint8b128" orig_device = w.place size_k, size_n = w.shape @@ -103,8 +103,12 @@ def quantize_weights( max_val = paddle.max(w, axis=0, keepdim=True) min_val = paddle.min(w, axis=0, keepdim=True) - max_q_val = float(7.0) - min_q_val = float(-8.0) + if quant_type == "uint4b8": + max_q_val = float(7.0) + min_q_val = float(-8.0) + else: + max_q_val = float(127.0) + min_q_val = float(-128.0) w_s = paddle.ones([1], dtype=paddle.float32) # unscaled case @@ -124,6 +128,8 @@ def quantize_weights( # w_q += quant_type.bias if quant_type == "uint4b8": w_q += 8 + else: + w_q += 128 # Restore original shapes if group_size is not None and group_size < size_k: @@ -131,11 +137,11 @@ def quantize_weights( def reshape_w(w_tensor): w_tensor = w_tensor.reshape([group_size, -1, size_n]) w_tensor = w_tensor.transpose([1, 0, 2]) - w_tensor = w_tensor.reshape([size_k, size_n]) + w_tensor = w_tensor.reshape([size_k, size_n]).contiguous() return w_tensor w_q = reshape_w(w_q) - w_s = w_s.reshape([-1, size_n]) + w_s = w_s.reshape([-1, size_n]).contiguous() # Move tensors back to original device w_q = w_q.to(orig_device) @@ -153,7 +159,8 @@ def machete_quantize_and_pack( group_size: int = -1, ): w_q, w_s = quantize_weights(w, group_size, quant_type=quant_type) - w_q = pack_rows(w_q, 4, *w_q.shape) + num_bits = 4 if quant_type == "uint4b8" else 8 + w_q = pack_rows(w_q, num_bits, *w_q.shape) w_q_col = w_q.transpose([1, 0]).contiguous() # convert to col major w_q_prepack = machete_prepack_B( w_q_col, diff --git a/fastdeploy/model_executor/layers/quantization/weight_only.py b/fastdeploy/model_executor/layers/quantization/weight_only.py index b4c4ba676..571efb46e 100644 --- a/fastdeploy/model_executor/layers/quantization/weight_only.py +++ b/fastdeploy/model_executor/layers/quantization/weight_only.py @@ -141,8 +141,7 @@ class WeightOnlyConfig(QuantConfigBase): ) if ( - self.name() == "wint4" - and _ENABLE_MACHETE + _ENABLE_MACHETE and envs.FD_USE_MACHETE == "1" and layer.weight_shape[1] and layer.weight_shape[1] % 128 == 0 @@ -219,12 +218,22 @@ class WeightOnlyLinearMethod(QuantMethodBase): quant_attrs, ) else: - # The scale shape should be equal to the output dim of weight using Per-Channel Quantization. - weight_scale_shape = [layer.weight_shape[1]] - layer.weight_shape.reverse() - if self.quant_config.name() == "wint4": - layer.weight_shape[0] //= 2 - layer.weight_dtype = "int8" + if isinstance(self, MacheteWeightOnlyLinearMethod): + # Using group scale for machete, group size is 128 + weight_scale_shape = [(layer.weight_shape[0] + 127) // 128, layer.weight_shape[1]] + if self.quant_config.name() == "wint4": + layer.weight_shape[0] //= 8 + else: + layer.weight_shape[0] //= 4 + layer.weight_dtype = "int32" + else: + # The scale shape should be equal to the output dim of weight using Per-Channel Quantization. + weight_scale_shape = [layer.weight_shape[1]] + layer.weight_shape.reverse() + if self.quant_config.name() == "wint4": + layer.weight_shape[0] //= 2 + layer.weight_dtype = "int8" + layer.weight = layer.create_parameter( shape=layer.weight_shape, dtype=layer.weight_dtype, @@ -260,17 +269,30 @@ class WeightOnlyLinearMethod(QuantMethodBase): def process_weights_after_loading(self, layer) -> None: if not layer.fd_config.load_config.load_choices == "default_v1": return - quanted_weight_tensor, weight_scale_tensor = weight_quantize( - layer.weight, - algo=self.quant_config.algo, - arch=self.quant_config.weight_only_linear_arch, - ) + if isinstance(self, MacheteWeightOnlyLinearMethod): + from fastdeploy.model_executor.layers.quantization.ops import ( + machete_quantize_and_pack, + ) + + # Using group scale for machete, group size is 128 + quanted_weight_tensor, weight_scale_tensor = machete_quantize_and_pack( + w=layer.weight, + atype=layer._dtype, + quant_type="uint4b8" if self.quant_config.name() == "wint4" else "uint8b128", + group_size=128, + ) + else: + quanted_weight_tensor, weight_scale_tensor = weight_quantize( + layer.weight, + algo=self.quant_config.algo, + arch=self.quant_config.weight_only_linear_arch, + ) free_tensor(layer.weight) layer.weight = layer.create_parameter( shape=quanted_weight_tensor.shape, - dtype="int8", + dtype="int8" if not isinstance(self, MacheteWeightOnlyLinearMethod) else "int32", is_bias=False, default_initializer=paddle.nn.initializer.Constant(0), ) @@ -361,32 +383,6 @@ class MacheteWeightOnlyLinearMethod(WeightOnlyLinearMethod): ) -> None: super().__init__(quant_config) - def create_weights(self, layer, **extra_weight_attrs): - - assert layer.bias is None, "Machete weight only linear method does not support bias." - assert self.quant_config.name() == "wint4", "Machete weight only linear method only supports wint4." - - # The scale shape should be equal to the output dim of weight using Per-Channel Quantization. - weight_scale_shape = [1, layer.weight_shape[1]] - - # layer.weight_shape.reverse() - if self.quant_config.name() == "wint4": - layer.weight_shape[0] //= 8 - layer.weight_dtype = "int32" - - layer.weight = layer.create_parameter( - shape=layer.weight_shape, - dtype=layer.weight_dtype, - is_bias=False, - default_initializer=paddle.nn.initializer.Constant(0), - ) - - layer.weight_scale = layer.create_parameter( - shape=weight_scale_shape, - dtype=layer._dtype, - is_bias=False, - ) - def process_prequanted_weights(self, layer, state_dict) -> None: pass @@ -395,24 +391,27 @@ class MacheteWeightOnlyLinearMethod(WeightOnlyLinearMethod): machete_quantize_and_pack, ) + # Using group scale for machete, group size is 128 quanted_weight_tensor, weight_scale_tensor = machete_quantize_and_pack( w=weight, atype=layer._dtype, - quant_type="uint4b8", + quant_type="uint4b8" if self.quant_config.name() == "wint4" else "uint8b128", + group_size=128, ) layer.weight.set_value(quanted_weight_tensor) layer.weight_scale.set_value(weight_scale_tensor.astype(paddle.get_default_dtype())) def apply(self, layer, x): - assert layer.bias is None, "Machete weight only linear method does not support bias." - assert self.quant_config.name() == "wint4", "Machete weight only linear method only supports wint4." from fastdeploy.model_executor.layers.quantization.ops import machete_wint_mm + # Using group scale for machete, group size is 128 linear_out = machete_wint_mm( x, w_prepack=layer.weight, w_g_s=layer.weight_scale, - weight_dtype="uint4b8", + weight_dtype="uint4b8" if self.quant_config.name() == "wint4" else "uint8b128", + group_size=128, ) - + if layer.with_bias: + linear_out = paddle.add(linear_out, layer.bias) return linear_out diff --git a/tests/operators/test_machete_mm.py b/tests/operators/test_machete_mm.py index 117fd7928..76fc93edc 100644 --- a/tests/operators/test_machete_mm.py +++ b/tests/operators/test_machete_mm.py @@ -64,11 +64,11 @@ def convert_uint16_to_float(in_list): not core.is_compiled_with_cuda() or get_sm_version() < 90, "machete only support sm90.", ) -class WeightOnlyLinearTestCase(unittest.TestCase): +class WeightOnlyInt4LinearTestCase(unittest.TestCase): def config(self): self.dtype = "float16" self.rtol = 1e-5 - self.atol = 1e-2 + self.atol = 1.3e-1 self.bias = False self.batch = 1 self.token = 512 @@ -77,11 +77,10 @@ class WeightOnlyLinearTestCase(unittest.TestCase): self.weight_dtype = "int4" self.static = False self.group_size = -1 + self.machete_group_size = -1 def setUp(self): self.config() - if self.dtype == "bfloat16" or self.weight_dtype == "int4": - self.atol = 1.3e-1 x = np.random.random((self.token, self.in_features)) self.x = paddle.to_tensor(x, dtype=self.dtype) if self.bias: @@ -111,30 +110,33 @@ class WeightOnlyLinearTestCase(unittest.TestCase): return out.numpy() def get_weight_only_linear_out(self): - for i in range(10): - out = Q.weight_only_linear( - self.x, - self.weight, - bias=self.bias, - weight_scale=self.weight_scale, - weight_dtype=self.weight_dtype, - group_size=self.group_size, - ) + out = Q.weight_only_linear( + self.x, + self.weight, + bias=self.bias, + weight_scale=self.weight_scale, + weight_dtype=self.weight_dtype, + group_size=self.group_size, + ) return out.numpy() def get_machete_weight_only_linear_out(self): w_q, w_s = machete_quantize_and_pack( w=self.float_weight.cuda(), atype=self.dtype, - quant_type="uint4b8", + quant_type="uint4b8" if self.weight_dtype == "int4" else "uint8b128", + group_size=self.machete_group_size, ) out = machete_wint_mm( self.x, w_prepack=w_q, w_g_s=w_s, # group scales - weight_dtype="uint4b8", # weight_dtype + weight_dtype="uint4b8" if self.weight_dtype == "int4" else "uint8b128", # weight_dtype + group_size=self.machete_group_size, ) + if self.bias is not None: + out = paddle.add(out, self.bias) return out.numpy() def test_weight_only_linear(self): @@ -149,26 +151,96 @@ class WeightOnlyLinearTestCase(unittest.TestCase): np.testing.assert_allclose(out_paddle, out_machete, rtol=self.rtol, atol=self.atol) -M = [32, 128] -K_N = [[2048, 4096]] +@unittest.skipIf( + not core.is_compiled_with_cuda() or get_sm_version() < 90, + "machete only support sm90.", +) +class WeightOnlyInt8LinearTestCase(unittest.TestCase): + def config(self): + self.dtype = "float16" + self.rtol = 1e-5 + self.atol = 1e-1 + self.bias = True + self.batch = 1 + self.token = 512 + self.in_features = 7168 + self.out_features = 1024 + self.weight_dtype = "int8" + self.static = False + self.group_size = -1 + self.machete_group_size = 128 + def setUp(self): + self.config() + x = np.random.random((self.token, self.in_features)) + self.x = paddle.to_tensor(x, dtype=self.dtype) + if self.bias: + bias_attr = base.ParamAttr( + trainable=False, + regularizer=None, + initializer=paddle.nn.initializer.Constant(value=1.0), + ) + else: + bias_attr = None + set_default_dtype(self.dtype) + self.linear = paddle.nn.Linear(self.in_features, self.out_features, bias_attr=bias_attr) -def make_case(m, k, n): - class Case(WeightOnlyLinearTestCase): - def config(self, _m=m, _k=k, _n=n): - super().config() - self.token = m - self.in_features = k - self.out_features = n + self.bias = self.linear.bias + self.weight = self.linear.weight + self.float_weight = self.linear.weight + self.weight_scale = None - Case.name = f"WeightOnlyLinearTestCase{m}{k}{n}" - return Case + self.weight, self.weight_scale = Q.weight_quantize( + (self.float_weight.cuda() if self.weight_dtype == "int8" else self.weight.cpu()), + algo=("weight_only_int8" if self.weight_dtype == "int8" else "weight_only_int4"), + group_size=self.group_size, + ) + def get_linear_out(self): + out = self.linear(self.x) + return out.numpy() + + def get_weight_only_linear_out(self): + out = Q.weight_only_linear( + self.x, + self.weight, + bias=self.bias, + weight_scale=self.weight_scale, + weight_dtype=self.weight_dtype, + group_size=self.group_size, + ) + return out.numpy() + + def get_machete_weight_only_linear_out(self): + w_q, w_s = machete_quantize_and_pack( + w=self.float_weight.cuda(), + atype=self.dtype, + quant_type="uint4b8" if self.weight_dtype == "int4" else "uint8b128", + group_size=self.machete_group_size, + ) + + out = machete_wint_mm( + self.x, + w_prepack=w_q, + w_g_s=w_s, # group scales + weight_dtype="uint4b8" if self.weight_dtype == "int4" else "uint8b128", # weight_dtype + group_size=self.machete_group_size, + ) + if self.bias is not None: + out = paddle.add(out, self.bias) + return out.numpy() + + def test_weight_only_linear(self): + out_expect = self.get_linear_out() + # out_paddle = self.get_weight_only_linear_out() + out_machete = self.get_machete_weight_only_linear_out() + + if self.dtype == "bfloat16": + # out_paddle = convert_uint16_to_float(out_paddle) + out_expect = convert_uint16_to_float(out_expect) + out_machete = convert_uint16_to_float(out_machete) + np.testing.assert_allclose(out_expect, out_machete, rtol=self.rtol, atol=self.atol) -for k, n in K_N: - for m in M: - cls = make_case(m, k, n) - globals()[cls.name] = cls if __name__ == "__main__": unittest.main() From bba279cf38f62b4881944d89d09049e6a52c026b Mon Sep 17 00:00:00 2001 From: ltd0924 <32387785+ltd0924@users.noreply.github.com> Date: Fri, 19 Sep 2025 12:54:49 +0800 Subject: [PATCH 32/36] [Feature] support rdma IB transfer (#4123) * Update serving_chat.py * Update serving_completion.py * Update serving_completion.py * mv connection_manager init * [BugFix] fix kv cache * fix format --------- Co-authored-by: Yuanle Liu --- .../transfer_factory/ipc_cache_transfer.py | 1 + .../include/kvcache_connection.h | 15 +++++-- .../kvcache_transfer/include/util.h | 16 +++++++ .../src/kvcache_connection.cpp | 44 ++++++++++++++----- 4 files changed, 60 insertions(+), 16 deletions(-) diff --git a/fastdeploy/cache_manager/transfer_factory/ipc_cache_transfer.py b/fastdeploy/cache_manager/transfer_factory/ipc_cache_transfer.py index 61a4fa10b..d97ea88fb 100644 --- a/fastdeploy/cache_manager/transfer_factory/ipc_cache_transfer.py +++ b/fastdeploy/cache_manager/transfer_factory/ipc_cache_transfer.py @@ -45,6 +45,7 @@ class IPCConnector: self.local_gpu_id = int(local_gpu_id_) tmp = paddle.ones([1, 1]) logger.info(f"init ipc rank{self.rank_id} with remote {self.remote_gpu_id} {self.local_gpu_id}") + paddle.set_device(f"gpu:{self.local_gpu_id}") for layer_id in range(layer_num): key_unique_name = f"key_caches_{layer_id}_rank{self.rank_id}.device{self.remote_gpu_id}" value_unique_name = f"value_caches_{layer_id}_rank{self.rank_id}.device{self.remote_gpu_id}" diff --git a/fastdeploy/cache_manager/transfer_factory/kvcache_transfer/include/kvcache_connection.h b/fastdeploy/cache_manager/transfer_factory/kvcache_transfer/include/kvcache_connection.h index 596e3b2e6..a63eb0c59 100644 --- a/fastdeploy/cache_manager/transfer_factory/kvcache_transfer/include/kvcache_connection.h +++ b/fastdeploy/cache_manager/transfer_factory/kvcache_transfer/include/kvcache_connection.h @@ -73,12 +73,13 @@ struct IbDeviceInfo { int realPort; int maxQp; }; - /// @brief Queue Pair information for RDMA struct QpInfo { uint32_t lid; uint32_t qpn; uint32_t psn; + uint8_t sl; // Service Level for IB networks + uint8_t path_bits; // Path Bits for IB networks union ibv_gid gid; enum ibv_mtu mtu; @@ -88,7 +89,10 @@ struct QpInfo { intBuffer[0] = htonl(lid); intBuffer[1] = htonl(qpn); intBuffer[2] = htonl(psn); - memcpy(buffer + 12, gid.raw, sizeof(gid.raw)); + // Pack SL and Path Bits into the 4th uint32_t + uint32_t sl_path = (static_cast(sl) << 8) | static_cast(path_bits); + intBuffer[3] = htonl(sl_path); + memcpy(buffer + 16, gid.raw, sizeof(gid.raw)); intBuffer[7] = htonl(static_cast(mtu)); } @@ -98,11 +102,14 @@ struct QpInfo { lid = ntohl(intBuffer[0]); qpn = ntohl(intBuffer[1]); psn = ntohl(intBuffer[2]); - memcpy(gid.raw, buffer + 12, sizeof(gid.raw)); + uint32_t sl_path = ntohl(intBuffer[3]); + sl = static_cast((sl_path >> 8) & 0xFF); + path_bits = static_cast(sl_path & 0xFF); + memcpy(gid.raw, buffer + 16, sizeof(gid.raw)); mtu = static_cast(ntohl(intBuffer[7])); } - static const size_t size = 12 + sizeof(gid.raw) + 4; + static const size_t size = 16 + sizeof(gid.raw) + 4; }; /// @brief RDMA connection context diff --git a/fastdeploy/cache_manager/transfer_factory/kvcache_transfer/include/util.h b/fastdeploy/cache_manager/transfer_factory/kvcache_transfer/include/util.h index c040b2a62..2663c2bec 100644 --- a/fastdeploy/cache_manager/transfer_factory/kvcache_transfer/include/util.h +++ b/fastdeploy/cache_manager/transfer_factory/kvcache_transfer/include/util.h @@ -156,6 +156,8 @@ private: const char* error_file_path_; bool relax_ordering_enabled_; int ib_timeout_; + int ib_service_level_; + int ib_src_path_bits_; const char* rdma_nics_; // Private constructor for singleton pattern @@ -213,6 +215,18 @@ private: "KVCACHE_IB_TIMEOUT" ); + ib_service_level_ = parse_int_value( + std::getenv("KVCACHE_IB_SERVICE_LEVEL"), + 0, + "KVCACHE_IB_SERVICE_LEVEL" + ); + + ib_src_path_bits_ = parse_int_value( + std::getenv("KVCACHE_IB_SRC_PATH_BITS"), + 0, + "KVCACHE_IB_SRC_PATH_BITS" + ); + rdma_nics_ = std::getenv("KVCACHE_RDMA_NICS"); } @@ -255,6 +269,8 @@ public: } int get_ib_timeout() const { return ib_timeout_; } + int get_ib_service_level() const { return ib_service_level_; } + int get_ib_src_path_bits() const { return ib_src_path_bits_; } // Configuration retrieval methods int get_rdma_gid_index() const { return rdma_gid_index_; } diff --git a/fastdeploy/cache_manager/transfer_factory/kvcache_transfer/src/kvcache_connection.cpp b/fastdeploy/cache_manager/transfer_factory/kvcache_transfer/src/kvcache_connection.cpp index 6bb4e43a9..b7dc73b98 100644 --- a/fastdeploy/cache_manager/transfer_factory/kvcache_transfer/src/kvcache_connection.cpp +++ b/fastdeploy/cache_manager/transfer_factory/kvcache_transfer/src/kvcache_connection.cpp @@ -169,8 +169,12 @@ int parse_port_ib_info() { dev_info.maxQp = dev_attr.max_qp; strncpy(dev_info.devName, dev_name, MAXNAMESIZE); - INFO("Adding device %s port %d (%s)", dev_name, port_num, - port_attr.link_layer == IBV_LINK_LAYER_INFINIBAND ? "IB" : "RoCE"); + if (port_attr.link_layer == IBV_LINK_LAYER_INFINIBAND) { + INFO("Adding IB device %s port %d (LID:0x%x Rate:%dGbps)", + dev_name, port_num, port_attr.lid, port_attr.active_speed/10); + } else { + INFO("Adding RoCE device %s port %d", dev_name, port_num); + } g_ib_all_devs.push_back(dev_info); ++g_kvcache_ib_dev_nums; @@ -304,14 +308,24 @@ QpStatus modify_qp_to_rts( attr.max_dest_rd_atomic = 1; attr.min_rnr_timer = 12; - attr.ah_attr.is_global = 1; - attr.ah_attr.grh.hop_limit = 255; - attr.ah_attr.grh.flow_label = 0; - attr.ah_attr.grh.traffic_class = 0; - attr.ah_attr.grh.dgid.global.subnet_prefix = (dest->gid.global.subnet_prefix); - attr.ah_attr.grh.dgid.global.interface_id = (dest->gid.global.interface_id); - attr.ah_attr.grh.sgid_index = sgid_id; +bool use_grh = (port_attr.link_layer == IBV_LINK_LAYER_ETHERNET); + if (use_grh) { + attr.ah_attr.is_global = 1; + attr.ah_attr.grh.hop_limit = 255; + attr.ah_attr.grh.flow_label = 0; + attr.ah_attr.grh.traffic_class = 0; + attr.ah_attr.grh.dgid.global.subnet_prefix = (dest->gid.global.subnet_prefix); + attr.ah_attr.grh.dgid.global.interface_id = (dest->gid.global.interface_id); + attr.ah_attr.grh.sgid_index = sgid_id; + } else { + attr.ah_attr.is_global = 0; + attr.ah_attr.dlid = dest->lid; + attr.ah_attr.sl = KVCacheConfig::getInstance().get_ib_service_level(); // 从配置获取服务级别 + if (port_attr.link_layer == IBV_LINK_LAYER_INFINIBAND) { + attr.ah_attr.src_path_bits = KVCacheConfig::getInstance().get_ib_src_path_bits(); // IB特定路径位 + } + } attr.ah_attr.src_path_bits = 0; attr.ah_attr.port_num = port; @@ -602,11 +616,17 @@ bool client_exchange_destinations( my_dest.lid = ctx->portinfo.lid; my_dest.mtu = ctx->portinfo.active_mtu; + my_dest.sl = KVCacheConfig::getInstance().get_ib_service_level(); + my_dest.path_bits = KVCacheConfig::getInstance().get_ib_src_path_bits(); // Validate LID for InfiniBand - if (ctx->portinfo.link_layer != IBV_LINK_LAYER_ETHERNET && !my_dest.lid) { - ERR("Invalid LID 0x%04x for non-Ethernet link layer", my_dest.lid); - return false; + if (ctx->portinfo.link_layer != IBV_LINK_LAYER_ETHERNET) { + if (!my_dest.lid) { + ERR("Invalid LID 0x%04x for IB network", my_dest.lid); + return false; + } + LOGD("IB network detected - LID:0x%04x SL:%d PathBits:%d", + my_dest.lid, my_dest.sl, my_dest.path_bits); } // Get GID if specified From 7bdc6f41e50836f3c2276e9df843d87fe0fd6103 Mon Sep 17 00:00:00 2001 From: chen <103103266+ckl117@users.noreply.github.com> Date: Mon, 22 Sep 2025 10:57:13 +0800 Subject: [PATCH 33/36] fix glm all_reduce tp group (#4188) --- fastdeploy/model_executor/models/glm4_moe.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/fastdeploy/model_executor/models/glm4_moe.py b/fastdeploy/model_executor/models/glm4_moe.py index e9a272e4c..ea56e9a47 100644 --- a/fastdeploy/model_executor/models/glm4_moe.py +++ b/fastdeploy/model_executor/models/glm4_moe.py @@ -160,7 +160,7 @@ class Glm4Moe(nn.Layer): out = out + shared_experts_out # We do to TP all reduce after the sum of experts. if self.tensor_parallel_size > 1: - tensor_model_parallel_all_reduce(out) + tensor_model_parallel_all_reduce(out, self.tp_group) return out From 01f69341623c5730fceb22d652ced4c9c8ed8049 Mon Sep 17 00:00:00 2001 From: RAM Date: Mon, 22 Sep 2025 14:31:36 +0800 Subject: [PATCH 34/36] [Executor] Adjust signal sending order in RL training (#3773) (#4066) (#4178) * Adjust processing order * fix bug * fix update_parameters bug * refine code --- .../cudagraph_piecewise_backend.py | 19 ++++++++----------- fastdeploy/rl/dynamic_weight_manager.py | 5 ++--- fastdeploy/worker/gpu_model_runner.py | 18 ++++++++++-------- 3 files changed, 20 insertions(+), 22 deletions(-) diff --git a/fastdeploy/model_executor/graph_optimization/cudagraph_piecewise_backend.py b/fastdeploy/model_executor/graph_optimization/cudagraph_piecewise_backend.py index 6e7619faf..6b615e036 100644 --- a/fastdeploy/model_executor/graph_optimization/cudagraph_piecewise_backend.py +++ b/fastdeploy/model_executor/graph_optimization/cudagraph_piecewise_backend.py @@ -18,6 +18,7 @@ from contextlib import contextmanager from dataclasses import dataclass from typing import Callable, Dict, Optional +import paddle.jit.dy2static.utils as jit_utils import paddle.nn.layer from paddle.device.cuda import graphs @@ -51,27 +52,24 @@ class ConcreteSizeEntry: class Dy2StCudaGraphManager: def __init__(self): - # NOTE(gongshaotian): Use local import to avoid RLHF version problems - from paddle.jit.dy2static.utils import CUDAGraphState - self.state = CUDAGraphState.DISABLE + self.state = jit_utils.CUDAGraphState.DISABLE self.captured_batch_size = set() self.batch_size = -1 def run_impl(self, original_run_impl, inputs, parameters, attrs): - from paddle.jit.dy2static.utils import CUDAGraphState run_state = self.state prog_attrs, cuda_graph_attrs = attrs - if run_state == CUDAGraphState.REPLAY: + if run_state == jit_utils.CUDAGraphState.REPLAY: if self.batch_size not in self.captured_batch_size: - run_state = CUDAGraphState.DISABLE - elif run_state == CUDAGraphState.CAPTURE: + run_state = jit_utils.CUDAGraphState.DISABLE + elif run_state == jit_utils.CUDAGraphState.CAPTURE: self.captured_batch_size.add(self.batch_size) cuda_graph_attrs |= { "cuda_graph_state": run_state, - "cuda_graph_dispatch_key": self.batch_size if run_state != CUDAGraphState.DISABLE else 0, + "cuda_graph_dispatch_key": self.batch_size if run_state != jit_utils.CUDAGraphState.DISABLE else 0, } return original_run_impl(inputs, parameters, (prog_attrs, cuda_graph_attrs)) @@ -104,7 +102,6 @@ class CudaGraphPiecewiseBackend: self.cuda_graph_manager = Dy2StCudaGraphManager() def run_static_model(self, entry: ConcreteSizeEntry, **kwargs): - from paddle.jit.dy2static.utils import CUDAGraphState if not entry.captured: # Warmup the model @@ -121,14 +118,14 @@ class CudaGraphPiecewiseBackend: entry.input_addresses = input_addresses # Capture - self.cuda_graph_manager.state = CUDAGraphState.CAPTURE + self.cuda_graph_manager.state = jit_utils.CUDAGraphState.CAPTURE self.cuda_graph_manager.batch_size = entry.real_shape entry.captured = True with self.cuda_graph_manager.run_impl_guard(): entry.runnable(**kwargs) # Replay - self.cuda_graph_manager.state = CUDAGraphState.REPLAY + self.cuda_graph_manager.state = jit_utils.CUDAGraphState.REPLAY self.cuda_graph_manager.batch_size = entry.real_shape with self.cuda_graph_manager.run_impl_guard(): return entry.runnable(**kwargs) diff --git a/fastdeploy/rl/dynamic_weight_manager.py b/fastdeploy/rl/dynamic_weight_manager.py index 869582bab..2452f0d35 100644 --- a/fastdeploy/rl/dynamic_weight_manager.py +++ b/fastdeploy/rl/dynamic_weight_manager.py @@ -45,6 +45,7 @@ class DynamicWeightManager: self.model: nn.Layer = model self._capture_model_state() self.update_parameters() + self.finalize_update() logger.info( f"✅ DynamicLoad model built successfully by {self.load_config.load_strategy}, " @@ -81,8 +82,6 @@ class DynamicWeightManager: logger.info(f"Update parameters in {time.perf_counter()-start_time:.2f}s") - self._finalize_update(pid) - def _update_ipc_snapshot(self): """Update using IPC snapshot strategy for elastic recovery.""" model_path = os.path.join( @@ -146,7 +145,7 @@ class DynamicWeightManager: if src.shape != dst.shape: raise ValueError(f"Shape mismatch for {name}: {src.shape} vs {dst.shape}") - def _finalize_update(self, pid: int): + def finalize_update(self, pid: int = 0): """Finalize update process with verification.""" self._verify_parameters("update") if self.parallel_config.tensor_parallel_size > 1: diff --git a/fastdeploy/worker/gpu_model_runner.py b/fastdeploy/worker/gpu_model_runner.py index 0d5fa0459..cf4177531 100644 --- a/fastdeploy/worker/gpu_model_runner.py +++ b/fastdeploy/worker/gpu_model_runner.py @@ -1705,25 +1705,27 @@ class GPUModelRunner(ModelRunnerBase): paddle.device.cuda.empty_cache() def clear_parameters(self, pid): - """ " Dynamic model loader use to clear parameters use for RL""" + """Dynamic model loader use to clear parameters use for RL""" + # Clear CUDAGraph + if self.use_cudagraph: + self.model.clear_grpah_opt_backend() + # Clear parameters and Send single self.dynamic_weight_manager.clear_parameters(pid) self.clear_cache() paddle.device.cuda.empty_cache() - # Clear CudaGraph - if self.use_cudagraph: - self.model.clear_grpah_opt_backend() - self.dynamic_weight_manager._log_memory("dynamic weight manager clear all memory") def update_parameters(self, pid): - """ " Dynamic model loader use to update parameters use for RL""" + """Dynamic model loader use to update parameters use for RL""" + # Update parameters self.dynamic_weight_manager.update_parameters(pid) self.initialize_kv_cache() - - # Recapture CudaGraph + # Recapture CUDAGraph if self.use_cudagraph: self.capture_model() + # Send single + self.dynamic_weight_manager.finalize_update(pid) self.dynamic_weight_manager._log_memory("dynamic weight manager update all memory") From 0358329946ff3f24ac8d2ce52d3503771e99d2b0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9D=8E=E6=B3=B3=E6=A1=A6?= <39643373+liyonghua0910@users.noreply.github.com> Date: Mon, 22 Sep 2025 18:56:00 +0800 Subject: [PATCH 35/36] [fix] initialize available_gpu_block_num with max_gpu_block_num (#4193) --- fastdeploy/cache_manager/prefix_cache_manager.py | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/fastdeploy/cache_manager/prefix_cache_manager.py b/fastdeploy/cache_manager/prefix_cache_manager.py index 14c7bcb00..5c3c4a63b 100644 --- a/fastdeploy/cache_manager/prefix_cache_manager.py +++ b/fastdeploy/cache_manager/prefix_cache_manager.py @@ -113,6 +113,10 @@ class PrefixCacheManager: + f"{self.num_cpu_blocks}, bytes_per_layer_per_block {self.cache_config.bytes_per_layer_per_block}" ) + main_process_metrics.max_gpu_block_num.set(self.num_gpu_blocks) + main_process_metrics.available_gpu_block_num.set(self.num_gpu_blocks) + main_process_metrics.available_gpu_resource.set(1.0) + @property def available_gpu_resource(self): return len(self.gpu_free_block_list) / self.num_gpu_blocks if self.num_gpu_blocks > 0 else 0.0 @@ -269,6 +273,7 @@ class PrefixCacheManager: self.node_id_pool = list(range(self.num_gpu_blocks + self.num_cpu_blocks)) main_process_metrics.max_gpu_block_num.set(self.num_gpu_blocks) + main_process_metrics.available_gpu_block_num.set(self.num_gpu_blocks) main_process_metrics.available_gpu_resource.set(1.0) def can_allocate_gpu_blocks(self, num_blocks: int): From 6b47773bd664304f6a6b643b8cfd347a134c576a Mon Sep 17 00:00:00 2001 From: luukunn <83932082+luukunn@users.noreply.github.com> Date: Mon, 22 Sep 2025 21:12:05 +0800 Subject: [PATCH 36/36] [fix]Modify follow-up push parameters and Modify the verification method for thinking length (#4177) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * [fix]Modify follow-up push parameters and Modify the verification method for thinking length (#4086) * 续推参数 generated_token_ids 修改成 completion_token_ids;修改思考长度校验方式 * 续推参数 generated_token_ids 修改成 completion_token_ids;修改思考长度校验方式 * 续推参数 generated_token_ids 修改成 completion_token_ids;修改思考长度校验方式 * 续推参数 generated_token_ids 修改成 completion_token_ids;修改思考长度校验方式 * add completion_token_ids * add logger * fix reasoning_max_tokens ParameterError * add unittest * add unittest * add unittest * add unittest * add unittest * add unit test * fix --- fastdeploy/entrypoints/engine_client.py | 9 +++- fastdeploy/entrypoints/openai/protocol.py | 4 ++ .../ernie4_5_vl_processor.py | 14 +++--- .../qwen_vl_processor/qwen_vl_processor.py | 16 +++--- tests/e2e/test_EB_VL_Lite_serving.py | 50 +++++++++++++++++++ tests/input/test_qwen_vl_processor.py | 6 +-- 6 files changed, 75 insertions(+), 24 deletions(-) diff --git a/fastdeploy/entrypoints/engine_client.py b/fastdeploy/entrypoints/engine_client.py index 1931b284a..3784dd686 100644 --- a/fastdeploy/entrypoints/engine_client.py +++ b/fastdeploy/entrypoints/engine_client.py @@ -255,8 +255,13 @@ class EngineClient: raise ValueError(f"max_tokens can be defined [1, {self.max_model_len}).") if data.get("reasoning_max_tokens") is not None: - if data["reasoning_max_tokens"] > data["max_tokens"] or data["reasoning_max_tokens"] < 1: - raise ValueError("reasoning_max_tokens must be between max_tokens and 1") + if data["reasoning_max_tokens"] < 1: + raise ValueError("reasoning_max_tokens must be greater than 1") + if data["reasoning_max_tokens"] > data["max_tokens"]: + data["reasoning_max_tokens"] = data["max_tokens"] + api_server_logger.warning( + f"req_id: {data['request_id']}, reasoning_max_tokens exceeds max_tokens, the value of reasoning_max_tokens will be adjusted to match that of max_tokens" + ) if data.get("top_p") is not None: if data["top_p"] > 1 or data["top_p"] < 0: diff --git a/fastdeploy/entrypoints/openai/protocol.py b/fastdeploy/entrypoints/openai/protocol.py index b74e0ffb4..78b766050 100644 --- a/fastdeploy/entrypoints/openai/protocol.py +++ b/fastdeploy/entrypoints/openai/protocol.py @@ -588,6 +588,7 @@ class ChatCompletionRequest(BaseModel): prompt_token_ids: Optional[List[int]] = None max_streaming_response_tokens: Optional[int] = None disable_chat_template: Optional[bool] = False + completion_token_ids: Optional[List[int]] = None # doc: end-chat-completion-extra-params def to_dict_for_infer(self, request_id=None): @@ -613,6 +614,9 @@ class ChatCompletionRequest(BaseModel): ), "The parameter `raw_request` is not supported now, please use completion api instead." for key, value in self.metadata.items(): req_dict[key] = value + from fastdeploy.utils import api_server_logger + + api_server_logger.warning("The parameter metadata is obsolete.") for key, value in self.dict().items(): if value is not None: req_dict[key] = value diff --git a/fastdeploy/input/ernie4_5_vl_processor/ernie4_5_vl_processor.py b/fastdeploy/input/ernie4_5_vl_processor/ernie4_5_vl_processor.py index 8e1d2e5e9..f65d3a1df 100644 --- a/fastdeploy/input/ernie4_5_vl_processor/ernie4_5_vl_processor.py +++ b/fastdeploy/input/ernie4_5_vl_processor/ernie4_5_vl_processor.py @@ -241,10 +241,8 @@ class Ernie4_5_VLProcessor(Ernie4_5Processor): else: raise ValueError(f"Request must contain 'prompt', or 'messages': {request}") - metadata = request.get("metadata") - # 如果metadata包含之前输出的token,将这些token添加到input_ids末尾 - if metadata and metadata.get("generated_token_ids"): - self.append_generated_tokens(outputs, metadata["generated_token_ids"]) + if request.get("completion_token_ids"): + self.append_completion_tokens(outputs, request["completion_token_ids"]) outputs = self.pack_outputs(outputs) request["prompt_token_ids"] = outputs["input_ids"].tolist() request["prompt_token_ids_len"] = len(request["prompt_token_ids"]) @@ -263,11 +261,11 @@ class Ernie4_5_VLProcessor(Ernie4_5Processor): return request - def append_generated_tokens(self, multimodal_inputs, generated_token_ids): - "append already generated tokens" + def append_completion_tokens(self, multimodal_inputs, completion_token_ids): + "append already completion tokens" - num_tokens = len(generated_token_ids) - multimodal_inputs["input_ids"].extend(generated_token_ids) + num_tokens = len(completion_token_ids) + multimodal_inputs["input_ids"].extend(completion_token_ids) multimodal_inputs["token_type_ids"].extend([IDS_TYPE_FLAG["text"]] * num_tokens) start = multimodal_inputs["cur_position"] diff --git a/fastdeploy/input/qwen_vl_processor/qwen_vl_processor.py b/fastdeploy/input/qwen_vl_processor/qwen_vl_processor.py index a3adeddf1..00856ec01 100644 --- a/fastdeploy/input/qwen_vl_processor/qwen_vl_processor.py +++ b/fastdeploy/input/qwen_vl_processor/qwen_vl_processor.py @@ -245,15 +245,11 @@ class QwenVLProcessor(TextProcessor): else: raise ValueError(f"Request must contain 'prompt', or 'messages': {request}") - metadata = request.get("metadata") # Handle continuation of previous generation by appending existing tokens - if metadata and metadata.get("generated_token_ids"): - self.append_generated_tokens(outputs, metadata["generated_token_ids"]) + if request.get("completion_token_ids"): + self.append_completion_tokens(outputs, request["completion_token_ids"]) enable_thinking = False - if metadata: - enable_thinking = metadata.get("enable_thinking", False) - if request.get("chat_template_kwargs"): chat_template_kwargs = request.get("chat_template_kwargs") enable_thinking = chat_template_kwargs.get("enable_thinking", False) @@ -278,16 +274,16 @@ class QwenVLProcessor(TextProcessor): return request - def append_generated_tokens(self, outputs, generated_token_ids): + def append_completion_tokens(self, outputs, completion_token_ids): """ - Append generated tokens to existing outputs. + Append completion tokens to existing outputs. Args: outputs: Current model outputs - generated_token_ids: Generated tokens to append + completion_token_ids: completion tokens to append """ out = {"input_ids": [], "token_type_ids": [], "position_ids": [], "cur_position": outputs["cur_position"]} - self.processor._add_text(generated_token_ids, out) + self.processor._add_text(completion_token_ids, out) outputs["input_ids"] = np.concatenate( [outputs["input_ids"], np.array(out["input_ids"], dtype=np.int64)], axis=0 diff --git a/tests/e2e/test_EB_VL_Lite_serving.py b/tests/e2e/test_EB_VL_Lite_serving.py index 8b10317fb..6a4477623 100644 --- a/tests/e2e/test_EB_VL_Lite_serving.py +++ b/tests/e2e/test_EB_VL_Lite_serving.py @@ -255,6 +255,16 @@ def test_consistency_between_runs(api_url, headers, consistent_payload): assert content1 == content2 +def test_with_metadata(api_url, headers, consistent_payload): + """ + Test that result is same as the base result. + """ + # request + consistent_payload["metadata"] = {"enable_thinking": True} + resp1 = requests.post(api_url, headers=headers, json=consistent_payload) + assert resp1.status_code == 200 + + # ========================== # OpenAI Client Chat Completion Test # ========================== @@ -555,6 +565,46 @@ def test_chat_with_thinking(openai_client, capsys): assert reasoning_tokens <= reasoning_max_tokens +def test_chat_with_completion_token_ids(openai_client): + """Test completion_token_ids""" + response = openai_client.chat.completions.create( + model="default", + messages=[{"role": "user", "content": "Hello"}], + extra_body={ + "completion_token_ids": [94936], + "return_token_ids": True, + "reasoning_max_tokens": 20, + "max_tokens": 10, + }, + max_tokens=10, + stream=False, + ) + assert hasattr(response, "choices") + assert len(response.choices) > 0 + assert hasattr(response.choices[0], "message") + assert hasattr(response.choices[0].message, "prompt_token_ids") + assert isinstance(response.choices[0].message.prompt_token_ids, list) + assert 94936 in response.choices[0].message.prompt_token_ids + + +def test_chat_with_reasoning_max_tokens(openai_client): + """Test completion_token_ids""" + assertion_executed = False + try: + openai_client.chat.completions.create( + model="default", + messages=[{"role": "user", "content": "Hello"}], + extra_body={"completion_token_ids": [18900], "return_token_ids": True, "reasoning_max_tokens": -1}, + max_tokens=10, + stream=False, + ) + except Exception as e: + error_message = str(e) + assertion_executed = True + assert "reasoning_max_tokens must be greater than 1" in error_message + assert assertion_executed, "Assertion was not executed (no exception raised)" + + def test_profile_reset_block_num(): """测试profile reset_block_num功能,与baseline diff不能超过5%""" log_file = "./log/config.log" diff --git a/tests/input/test_qwen_vl_processor.py b/tests/input/test_qwen_vl_processor.py index 0dc547ac7..d995b1b6b 100644 --- a/tests/input/test_qwen_vl_processor.py +++ b/tests/input/test_qwen_vl_processor.py @@ -176,12 +176,10 @@ class TestQwenVLProcessor(unittest.TestCase): 3. Video processing produces expected output dimensions 4. Correct counts for images (1) and videos (1) """ - num_generated_token_ids = 10 + num_completion_token_ids = 10 request = { "request_id": "12345", - "metadata": { - "generated_token_ids": [1] * num_generated_token_ids, - }, + "completion_token_ids": [1] * num_completion_token_ids, "stop": ["stop", "eof"], "messages": [ {