From d5681bbdc067eb502798231d2aa5b4c3be82169f Mon Sep 17 00:00:00 2001 From: Sunny-bot1 <592045536@qq.com> Date: Fri, 11 Jul 2025 16:17:50 +0800 Subject: [PATCH 1/3] fix topp default value --- fastdeploy/engine/sampling_params.py | 4 ++-- fastdeploy/worker/gcu_model_runner.py | 4 ++-- fastdeploy/worker/gpu_model_runner.py | 2 +- fastdeploy/worker/iluvatar_model_runner.py | 4 ++-- fastdeploy/worker/xpu_model_runner.py | 4 ++-- 5 files changed, 9 insertions(+), 9 deletions(-) diff --git a/fastdeploy/engine/sampling_params.py b/fastdeploy/engine/sampling_params.py index a7912407a8c..d81f9f99902 100644 --- a/fastdeploy/engine/sampling_params.py +++ b/fastdeploy/engine/sampling_params.py @@ -82,7 +82,7 @@ class SamplingParams: frequency_penalty: float = None repetition_penalty: float = None temperature: float = None - top_p: float = 1.0 + top_p: float = None top_k: int = 0 seed: Optional[int] = None stop: Optional[Union[str, List[str]]] = None @@ -132,7 +132,7 @@ def from_optional(cls, repetition_penalty=repetition_penalty if repetition_penalty is not None else 1.0, temperature=temperature if temperature is not None else 1.0, - top_p=top_p if top_p is not None else 1.0, + top_p=top_p, top_k=top_k if top_k is not None else 0, seed=seed, stop=stop, diff --git a/fastdeploy/worker/gcu_model_runner.py b/fastdeploy/worker/gcu_model_runner.py index 5ad0cec76ed..eee5dbf8e1e 100644 --- a/fastdeploy/worker/gcu_model_runner.py +++ b/fastdeploy/worker/gcu_model_runner.py @@ -24,6 +24,7 @@ from fastdeploy.config import FDConfig from fastdeploy.engine.request import Request +from fastdeploy.model_executor.forward_meta import ForwardMeta from fastdeploy.model_executor.guided_decoding import get_guided_backend from fastdeploy.model_executor.guided_decoding.base_guided_decoding import \ LogitsProcessorBase @@ -39,7 +40,6 @@ from fastdeploy.model_executor.pre_and_post_process import (post_process, pre_process, rebuild_padding) -from fastdeploy.model_executor.forward_meta import ForwardMeta from fastdeploy.worker.model_runner_base import ModelRunnerBase from fastdeploy.worker.output import ModelOutputData, ModelRunnerOutput @@ -235,7 +235,7 @@ def insert_prefill_inputs(self, req_dicts: List[Request]): request.eos_token_ids.append(request.eos_token_ids[0]) self.share_inputs["eos_token_id"][:] = np.array( request.eos_token_ids, dtype="int64").reshape(-1, 1) - self.share_inputs["top_p"][idx:idx + 1] = request.get("top_p", 1.0) + self.share_inputs["top_p"][idx:idx + 1] = request.get("top_p", 0.7) self.share_inputs["top_k"][idx:idx + 1] = request.get("top_k", 0) self.share_inputs["temperature"][idx:idx + 1] = request.get( "temperature", 0.95) diff --git a/fastdeploy/worker/gpu_model_runner.py b/fastdeploy/worker/gpu_model_runner.py index 3a61cbde1bd..f22d7cc6eff 100644 --- a/fastdeploy/worker/gpu_model_runner.py +++ b/fastdeploy/worker/gpu_model_runner.py @@ -245,7 +245,7 @@ def insert_prefill_inputs(self, req_dicts: List[Request]): request.eos_token_ids.append(request.eos_token_ids[0]) self.share_inputs["eos_token_id"][:] = np.array( request.eos_token_ids, dtype="int64").reshape(-1, 1) - self.share_inputs["top_p"][idx:idx + 1] = request.get("top_p", 1.0) + self.share_inputs["top_p"][idx:idx + 1] = request.get("top_p", 0.7) self.share_inputs["top_k"][idx:idx + 1] = request.get("top_k", 0) self.share_inputs["temperature"][idx:idx + 1] = request.get( "temperature", 0.95) diff --git a/fastdeploy/worker/iluvatar_model_runner.py b/fastdeploy/worker/iluvatar_model_runner.py index 069f7b37c24..8d9477b78fd 100644 --- a/fastdeploy/worker/iluvatar_model_runner.py +++ b/fastdeploy/worker/iluvatar_model_runner.py @@ -24,6 +24,7 @@ from fastdeploy.config import FDConfig from fastdeploy.engine.request import Request +from fastdeploy.model_executor.forward_meta import ForwardMeta from fastdeploy.model_executor.layers.attention import get_attention_backend from fastdeploy.model_executor.layers.attention.base_attention_backend import \ AttentionBackend @@ -37,7 +38,6 @@ pre_process, rebuild_padding, step_cuda) -from fastdeploy.model_executor.forward_meta import ForwardMeta from fastdeploy.worker.model_runner_base import ModelRunnerBase from fastdeploy.worker.output import ModelOutputData, ModelRunnerOutput @@ -224,7 +224,7 @@ def insert_prefill_inputs(self, req_dicts: List[Request]): request.eos_token_ids.append(request.eos_token_ids[0]) self.share_inputs["eos_token_id"][:] = np.array( request.eos_token_ids, dtype="int64").reshape(-1, 1) - self.share_inputs["top_p"][idx:idx + 1] = request.get("top_p", 1.0) + self.share_inputs["top_p"][idx:idx + 1] = request.get("top_p", 0.7) self.share_inputs["top_k"][idx:idx + 1] = request.get("top_k", 0) self.share_inputs["temperature"][idx:idx + 1] = request.get( "temperature", 0.95) diff --git a/fastdeploy/worker/xpu_model_runner.py b/fastdeploy/worker/xpu_model_runner.py index 7fb585f8a53..9099339766d 100644 --- a/fastdeploy/worker/xpu_model_runner.py +++ b/fastdeploy/worker/xpu_model_runner.py @@ -23,6 +23,7 @@ from fastdeploy.config import FDConfig from fastdeploy.engine.request import Request +from fastdeploy.model_executor.forward_meta import ForwardMeta, XPUForwardMeta from fastdeploy.model_executor.layers.attention import get_attention_backend from fastdeploy.model_executor.layers.attention.base_attention_backend import \ AttentionBackend @@ -31,7 +32,6 @@ from fastdeploy.model_executor.layers.sample.sampler import Sampler from fastdeploy.model_executor.model_loader import get_model_from_loader from fastdeploy.utils import get_logger -from fastdeploy.model_executor.forward_meta import ForwardMeta, XPUForwardMeta from fastdeploy.worker.model_runner_base import ModelRunnerBase from fastdeploy.worker.output import ModelOutputData, ModelRunnerOutput @@ -295,7 +295,7 @@ def process_prefill_inputs(self, req_dicts: List[Request]): self.share_inputs["eos_token_id"][:] = np.array( request.eos_token_ids, dtype="int64").reshape(-1, 1) self.share_inputs["pre_ids"][idx:idx + 1] = -1 - self.share_inputs["top_p"][idx:idx + 1] = request.get("top_p", 1.0) + self.share_inputs["top_p"][idx:idx + 1] = request.get("top_p", 0.7) self.share_inputs["top_k"][idx:idx + 1] = request.get("top_k", 0) self.share_inputs["temperature"][idx:idx + 1] = request.get( "temperature", 0.95) From cb7ad2f8e62abd8a5f26e2e9f09d73940fb1aef5 Mon Sep 17 00:00:00 2001 From: lizexu123 <2694294196@qq.com> Date: Tue, 29 Jul 2025 09:21:09 +0000 Subject: [PATCH 2/3] merge develop --- fastdeploy/engine/args_utils.py | 28 +++++-- fastdeploy/engine/sampling_params.py | 110 +++++++++++++++----------- fastdeploy/worker/gpu_model_runner.py | 12 +-- 3 files changed, 90 insertions(+), 60 deletions(-) diff --git a/fastdeploy/engine/args_utils.py b/fastdeploy/engine/args_utils.py index b1e464a6ac0..4bb39e9427c 100644 --- a/fastdeploy/engine/args_utils.py +++ b/fastdeploy/engine/args_utils.py @@ -320,6 +320,11 @@ class EngineArgs: Must be explicitly enabled via the `--enable-logprob` startup parameter to output logprob values. """ + seed : Optional[int] = None + """ + Random seed to use for initialization. If not set, a random seed is used. + """ + def __post_init__(self): """ Post-initialization processing to set default tokenizer if not provided. @@ -465,7 +470,15 @@ def add_cli_args(parser: FlexibleArgumentParser) -> FlexibleArgumentParser: default=EngineArgs.enable_logprob, help="Enable output of token-level log probabilities.", ) - + model_group.add_argument("--enable-logprob", + action="store_true", + default=EngineArgs.enable_logprob, + help="Enable output of token-level log probabilities." + ) + model_group.add_argument("--seed", + type=int, + defualt=None, + help="Random seed for initialization. If not specified, a random seed will be used.") # Parallel processing parameters group parallel_group = parser.add_argument_group("Parallel Configuration") parallel_group.add_argument( @@ -775,13 +788,12 @@ def create_model_config(self) -> ModelConfig: """ Create and return a ModelConfig object based on the current settings. """ - return ModelConfig( - model_name_or_path=self.model, - config_json_file=self.model_config_name, - quantization=self.quantization, - dynamic_load_weight=self.dynamic_load_weight, - load_strategy=self.load_strategy, - ) + return ModelConfig(model_name_or_path=self.model, + config_json_file=self.model_config_name, + quantization=self.quantization, + dynamic_load_weight=self.dynamic_load_weight, + load_strategy=self.load_strategy, + seed=self.seed) def create_cache_config(self, model_cfg) -> CacheConfig: """ diff --git a/fastdeploy/engine/sampling_params.py b/fastdeploy/engine/sampling_params.py index 688351883b2..67343a88796 100644 --- a/fastdeploy/engine/sampling_params.py +++ b/fastdeploy/engine/sampling_params.py @@ -15,10 +15,20 @@ """ from __future__ import annotations - import random +from functools import cached_property from dataclasses import dataclass, fields from typing import Any, List, Optional, Union +from enum import Enum, IntEnum + + +_SAMPLING_EPS = 1e-5 +_MAX_TEMP = 1e-2 + +class SamplingType(IntEnum): + GREEDY = 0 + RANDOM = 1 + RANDOM_SEED = 2 @dataclass @@ -108,50 +118,49 @@ def from_dict(cls, req_dict: dict[str, Any]) -> SamplingParams: ) @classmethod - def from_optional( - cls, - n, - best_of, - presence_penalty, - frequency_penalty, - repetition_penalty, - temperature, - top_p, - top_k, - min_p, - seed=None, - stop=None, - stop_token_ids=None, - max_tokens=None, - reasoning_max_tokens=None, - min_tokens=1, - logprobs=None, - bad_words=None, - ) -> SamplingParams: + def from_optional(cls, + n, + best_of, + presence_penalty, + frequency_penalty, + repetition_penalty, + temperature, + top_p, + top_k, + min_p, + seed=None, + stop=None, + stop_token_ids=None, + max_tokens=None, + reasoning_max_tokens=None, + min_tokens=1, + logprobs=None, + bad_words=None) -> "SamplingParams": """Create instance from command line arguments""" - return cls( - n=1 if n is None else n, - best_of=best_of, - presence_penalty=(presence_penalty if presence_penalty is not None else 0.0), - frequency_penalty=(frequency_penalty if frequency_penalty is not None else 0.0), - repetition_penalty=(repetition_penalty if repetition_penalty is not None else 1.0), - temperature=temperature if temperature is not None else 1.0, - top_p=top_p, - top_k=top_k if top_k is not None else 0, - min_p=min_p if min_p is not None else 0.0, - seed=seed, - stop=stop, - stop_token_ids=stop_token_ids, - max_tokens=max_tokens if max_tokens is not None else 8192, - reasoning_max_tokens=reasoning_max_tokens, - min_tokens=min_tokens, - logprobs=logprobs, - bad_words=bad_words, - ) + return cls(n=1 if n is None else n, + best_of=best_of, + presence_penalty=presence_penalty + if presence_penalty is not None else 0.0, + frequency_penalty=frequency_penalty + if frequency_penalty is not None else 0.0, + repetition_penalty=repetition_penalty + if repetition_penalty is not None else 1.0, + temperature=temperature if temperature is not None else 1.0, + top_p=top_p, + top_k=top_k if top_k is not None else 0, + min_p=min_p if min_p is not None else 0.0, + seed=seed, + stop=stop, + stop_token_ids=stop_token_ids, + max_tokens=max_tokens if max_tokens is not None else 8192, + reasoning_max_tokens=reasoning_max_tokens, + min_tokens=min_tokens, + logprobs=logprobs, + bad_words=bad_words) def __post_init__(self): - if self.seed is None: - self.seed = random.randint(0, 922337203685477580) + if self.seed == -1: + self.seed = None if self.max_tokens is not None and self.reasoning_max_tokens is None: self.reasoning_max_tokens = max(int(self.max_tokens * 0.8), 1) self._verify_args() @@ -175,7 +184,8 @@ def _verify_args(self) -> None: if self.top_k < -1: raise ValueError(f"top_k must be 0 (disable), or at least 1, " f"got {self.top_k}.") if not isinstance(self.top_k, int): - raise TypeError(f"top_k must be an integer, got {type(self.top_k).__name__}") + raise TypeError( + f"top_k must be an integer, got {type(self.top_k).__name__}") if not 0.0 <= self.min_p <= 1.0: raise ValueError("min_p must be in [0,1],got f{self.min_p}") @@ -194,10 +204,16 @@ def _verify_args(self) -> None: if self.logprobs is not None and self.logprobs < 0: raise ValueError(f"logprobs must be non-negative, got {self.logprobs}.") if self.logprobs is not None and self.logprobs > 20: - raise ValueError("Invalid value for 'top_logprobs': must be less than or equal to 20.") - - if not 0 <= self.seed <= 922337203685477580: - raise ValueError("seed must be in [0, 922337203685477580], got " f"{self.seed}.") + raise ValueError( + "Invalid value for 'top_logprobs': must be less than or equal to 20.") + + @cached_property + def sampling_type(self)->SamplingType: + if self.temperature < _SAMPLING_EPS: + return SamplingType.GREEDY + if self.seed is not None: + return SamplingType.RANDOM_SEED + return SamplingType.RANDOM def update_from_tokenizer(self, tokenizer): """ diff --git a/fastdeploy/worker/gpu_model_runner.py b/fastdeploy/worker/gpu_model_runner.py index 432a12ddff0..b4486801756 100644 --- a/fastdeploy/worker/gpu_model_runner.py +++ b/fastdeploy/worker/gpu_model_runner.py @@ -78,11 +78,14 @@ def __init__( self.enable_mm = self.model_config.enable_mm self.rank = rank self.local_rank = local_rank + self.generators={} self.device_id = device_id self.speculative_method = self.fd_config.speculative_config.method self.speculative_decoding = self.speculative_method is not None self.enable_logprob = fd_config.model_config.enable_logprob + self.gene + self.guided_backend = None if self.fd_config.parallel_config.guided_decoding_backend != "off": self.guided_backend = get_guided_backend(fd_config=self.fd_config) @@ -128,9 +131,7 @@ def __init__( self._init_share_inputs(self.parallel_config.max_num_seqs) self.infer_seed_increment = paddle.full( shape=[self.parallel_config.max_num_seqs, 1], - fill_value=4, - dtype="int64", - ) + dtype="int64") self.restore_chunked_prefill_request = dict() # Initialize attention Backend @@ -500,7 +501,7 @@ def _init_share_inputs(self, max_num_seqs: int): """ Initialize all share buffers for model inputs. """ - self.MAX_INFER_SEED = 9223372036854775806 + self.share_inputs = {} self.share_inputs["pre_ids"] = paddle.full( @@ -925,9 +926,10 @@ def _dummy_run( ids_remove_padding=self.share_inputs["ids_remove_padding"], forward_meta=self.forward_meta, ) + logits = self.model.compute_logits(model_output) hidden_states = rebuild_padding( - model_output, + logits, self.share_inputs["cum_offsets"], self.share_inputs["seq_lens_this_time"], self.share_inputs["seq_lens_decoder"], From bb92db2f995008ccf3343fe9415f6b6fe1f704bc Mon Sep 17 00:00:00 2001 From: lizexu123 <2694294196@qq.com> Date: Wed, 30 Jul 2025 10:23:43 +0000 Subject: [PATCH 3/3] seed --- fastdeploy/config.py | 1 + fastdeploy/engine/args_utils.py | 17 +++++++---------- .../model_executor/layers/sample/meta_data.py | 2 -- fastdeploy/utils.py | 9 +++++++++ fastdeploy/worker/gpu_model_runner.py | 8 +++----- fastdeploy/worker/gpu_worker.py | 4 +++- 6 files changed, 23 insertions(+), 18 deletions(-) diff --git a/fastdeploy/config.py b/fastdeploy/config.py index c8428d1f974..0afb57c4b7c 100644 --- a/fastdeploy/config.py +++ b/fastdeploy/config.py @@ -116,6 +116,7 @@ def __init__( self.enable_redundant_experts = False self.redundant_experts_num = 0 self.quantization = None + self.seed = 0 for key, value in args.items(): if hasattr(self, key): setattr(self, key, value) diff --git a/fastdeploy/engine/args_utils.py b/fastdeploy/engine/args_utils.py index ada82c003f4..cff949e2747 100644 --- a/fastdeploy/engine/args_utils.py +++ b/fastdeploy/engine/args_utils.py @@ -313,7 +313,7 @@ class EngineArgs: Must be explicitly enabled via the `--enable-logprob` startup parameter to output logprob values. """ - seed : Optional[int] = None + seed: Optional[int] = None """ Random seed to use for initialization. If not set, a random seed is used. """ @@ -469,15 +469,12 @@ def add_cli_args(parser: FlexibleArgumentParser) -> FlexibleArgumentParser: default=EngineArgs.enable_logprob, help="Enable output of token-level log probabilities.", ) - model_group.add_argument("--enable-logprob", - action="store_true", - default=EngineArgs.enable_logprob, - help="Enable output of token-level log probabilities." - ) - model_group.add_argument("--seed", - type=int, - defualt=None, - help="Random seed for initialization. If not specified, a random seed will be used.") + model_group.add_argument( + "--seed", + type=int, + default=None, + help="Random seed for initialization. If not specified, a random seed will be used.", + ) # Parallel processing parameters group parallel_group = parser.add_argument_group("Parallel Configuration") parallel_group.add_argument( diff --git a/fastdeploy/model_executor/layers/sample/meta_data.py b/fastdeploy/model_executor/layers/sample/meta_data.py index 69b2e3e1987..f8781de77c4 100644 --- a/fastdeploy/model_executor/layers/sample/meta_data.py +++ b/fastdeploy/model_executor/layers/sample/meta_data.py @@ -27,13 +27,11 @@ class SamplingMetadata: """ temperature: paddle.Tensor - pre_token_ids: paddle.Tensor eos_token_ids: paddle.Tensor frequency_penalties: paddle.Tensor presence_penalties: paddle.Tensor repetition_penalties: paddle.Tensor - min_dec_lens: paddle.Tensor bad_words_token_ids: paddle.Tensor diff --git a/fastdeploy/utils.py b/fastdeploy/utils.py index 0ceba665a20..29328fa4e03 100644 --- a/fastdeploy/utils.py +++ b/fastdeploy/utils.py @@ -29,6 +29,8 @@ from pathlib import Path from typing import Literal, TypeVar, Union +import numpy as np +import paddle import requests import yaml from aistudio_sdk.snapshot_download import snapshot_download as aistudio_download @@ -291,6 +293,13 @@ def extract_tar(tar_path, output_dir): raise RuntimeError(f"Extraction failed: {e!s}") +def set_random_seed(seed: int) -> None: + if seed is not None: + random.seed(seed) + np.random.seed(seed) + paddle.seed(seed) + + def download_model(url, output_dir, temp_tar): """ 下载模型,并将其解压到指定目录。 diff --git a/fastdeploy/worker/gpu_model_runner.py b/fastdeploy/worker/gpu_model_runner.py index 2c3ddfc25d9..03b5cd69ef7 100644 --- a/fastdeploy/worker/gpu_model_runner.py +++ b/fastdeploy/worker/gpu_model_runner.py @@ -78,14 +78,11 @@ def __init__( self.enable_mm = self.model_config.enable_mm self.rank = rank self.local_rank = local_rank - self.generators={} self.device_id = device_id self.speculative_method = self.fd_config.speculative_config.method self.speculative_decoding = self.speculative_method is not None self.enable_logprob = fd_config.model_config.enable_logprob - self.gene - self.guided_backend = None if self.fd_config.parallel_config.guided_decoding_backend != "off": self.guided_backend = get_guided_backend(fd_config=self.fd_config) @@ -130,8 +127,8 @@ def __init__( # Initialize share inputs self._init_share_inputs(self.parallel_config.max_num_seqs) self.infer_seed_increment = paddle.full( - shape=[self.parallel_config.max_num_seqs, 1], - dtype="int64") + shape=[self.parallel_config.max_num_seqs, 1], fill_value=4, dtype="int64" + ) self.restore_chunked_prefill_request = dict() # Initialize attention Backend @@ -270,6 +267,7 @@ def insert_tasks_v1(self, req_dicts: List[Request]): self.share_inputs["first_token_ids"][idx : idx + 1] = self.share_inputs["input_ids"][idx : idx + 1, :1] self.share_inputs["ori_seq_lens_encoder"][idx : idx + 1] = length + print("seed", request.get("seed")) if request.get("seed") is not None: self.share_inputs["infer_seed"][idx : idx + 1] = request.get("seed") diff --git a/fastdeploy/worker/gpu_worker.py b/fastdeploy/worker/gpu_worker.py index 084b4f0f2d8..c1c8552444a 100644 --- a/fastdeploy/worker/gpu_worker.py +++ b/fastdeploy/worker/gpu_worker.py @@ -26,7 +26,7 @@ from fastdeploy.config import FDConfig from fastdeploy.engine.request import Request from fastdeploy.platforms import current_platform -from fastdeploy.utils import get_logger +from fastdeploy.utils import get_logger, set_random_seed from fastdeploy.worker.gpu_model_runner import GPUModelRunner from fastdeploy.worker.output import ModelRunnerOutput from fastdeploy.worker.worker_base import WorkerBase @@ -69,6 +69,7 @@ def init_device(self): else: raise RuntimeError(f"Not support device type: {self.device_config.device}") + set_random_seed(self.fd_config.model_config.seed) # Construct model runner self.model_runner: GPUModelRunner = GPUModelRunner( fd_config=self.fd_config, @@ -123,6 +124,7 @@ def determine_available_memory(self) -> int: # 2. Profile run self.model_runner.profile_run() + set_random_seed(self.fd_config.model_config.seed) # 3. Statistical memory information paddle_reserved_mem_after_run = paddle.device.cuda.max_memory_reserved(local_rank)