From 4be107edbbacf4787717bd1f0b6ebd76726bc20a Mon Sep 17 00:00:00 2001 From: Duke Date: Fri, 13 Jun 2025 12:14:37 +0800 Subject: [PATCH 1/4] fix: remove vim swap file --- llm_bench/.load_test.py.swp | Bin 61440 -> 0 bytes 1 file changed, 0 insertions(+), 0 deletions(-) delete mode 100644 llm_bench/.load_test.py.swp diff --git a/llm_bench/.load_test.py.swp b/llm_bench/.load_test.py.swp deleted file mode 100644 index 6e6592545774f071a6e9c1384062d344188478a1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 61440 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 UYpEhPlg9K)g{hcjHl*hN2I2Wy#Q*>R From 01cffef59862476af4055f6304e80aa9fed26f45 Mon Sep 17 00:00:00 2001 From: Duke Date: Fri, 13 Jun 2025 17:10:31 +0800 Subject: [PATCH 2/4] feat: support multiple completions (n > 1) in OpenAIProvider --- llm_bench/load_test.py | 52 ++++++++++++++++++++++++++++++------------ 1 file changed, 37 insertions(+), 15 deletions(-) diff --git a/llm_bench/load_test.py b/llm_bench/load_test.py index 7e62a55..b6d0a4b 100644 --- a/llm_bench/load_test.py +++ b/llm_bench/load_test.py @@ -273,23 +273,45 @@ def format_payload(self, prompt, max_tokens, images): def parse_output_json(self, data, prompt): usage = data.get("usage", None) - assert len(data["choices"]) == 1, f"Too many choices {len(data['choices'])}" - choice = data["choices"][0] - if self.parsed_options.chat: - if self.parsed_options.stream: - text = choice["delta"].get("content", "") - else: - text = choice["message"]["content"] + if self.parsed_options.n > 1: + texts = [] + for choice in data["choices"]: + if self.parsed_options.chat: + if self.parsed_options.stream: + text = choice["delta"].get("content", "") + else: + text = choice["message"]["content"] + else: + text = choice["text"] + texts.append(text) + + combined_text = "\n".join(texts) + + logprobs = data["choices"][0].get("logprobs", None) + + return ChunkMetadata( + text=combined_text, + logprob_tokens=len(logprobs["tokens"]) if logprobs else None, + usage_tokens=usage["completion_tokens"] if usage else None, + prompt_usage_tokens=usage.get("prompt_tokens", None) if usage else None, + ) else: - text = choice["text"] + choice = data["choices"][0] + if self.parsed_options.chat: + if self.parsed_options.stream: + text = choice["delta"].get("content", "") + else: + text = choice["message"]["content"] + else: + text = choice["text"] - logprobs = choice.get("logprobs", None) - return ChunkMetadata( - text=text, - logprob_tokens=len(logprobs["tokens"]) if logprobs else None, - usage_tokens=usage["completion_tokens"] if usage else None, - prompt_usage_tokens=usage.get("prompt_tokens", None) if usage else None, - ) + logprobs = choice.get("logprobs", None) + return ChunkMetadata( + text=text, + logprob_tokens=len(logprobs["tokens"]) if logprobs else None, + usage_tokens=usage["completion_tokens"] if usage else None, + prompt_usage_tokens=usage.get("prompt_tokens", None) if usage else None, + ) class FireworksProvider(OpenAIProvider): From 795c7d76aac132c11261ca773de11cfe920e2c3b Mon Sep 17 00:00:00 2001 From: Duke Date: Fri, 13 Jun 2025 17:15:54 +0800 Subject: [PATCH 3/4] fix: correct token count validation for multiple completions --- llm_bench/load_test.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/llm_bench/load_test.py b/llm_bench/load_test.py index b6d0a4b..8d1a320 100644 --- a/llm_bench/load_test.py +++ b/llm_bench/load_test.py @@ -845,8 +845,8 @@ def generate_text(self): add_custom_metric("time_to_first_token", dur_first_token * 1000) add_custom_metric("total_latency", dur_total * 1000) if num_tokens: - if num_tokens != max_tokens: - print(f"WARNING: wrong number of tokens: {num_tokens}, expected {max_tokens}") + if num_tokens != max_tokens * self.environment.parsed_options.n: + print(f"WARNING: wrong number of tokens: {num_tokens}, expected {max_tokens * self.environment.parsed_options.n} (max_tokens={max_tokens}, n={self.environment.parsed_options.n})") add_custom_metric("num_tokens", num_tokens) add_custom_metric("latency_per_token", dur_generation / num_tokens * 1000, num_tokens) add_custom_metric( From 84d45cf7c693097169a13868b77747d931f504fa Mon Sep 17 00:00:00 2001 From: Duke Date: Tue, 17 Jun 2025 16:12:17 +0800 Subject: [PATCH 4/4] fix: report latency_per_char in microseconds to avoid Locust rounding --- llm_bench/load_test.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/llm_bench/load_test.py b/llm_bench/load_test.py index 8d1a320..7430ad1 100644 --- a/llm_bench/load_test.py +++ b/llm_bench/load_test.py @@ -25,6 +25,8 @@ def add_custom_metric(name, value, length_value=0): + if name == "total_latency": + value = value * 1000 events.request.fire( request_type="METRIC", name=name,