From d5f18de15a2227a2d469365afc4fa9e2df0c631d Mon Sep 17 00:00:00 2001 From: Anmol Agarwal Date: Thu, 29 Aug 2024 23:45:42 -0400 Subject: [PATCH] [Docs, Bugfix] Update Logo and Tokenizer Bug Fix (#11) * logo * readme * Tokenizer bug fix * logo: update logo * make format * revert make format for config.py --- README.md | 4 ++-- docs/_static/logo/dark.png | Bin 33398 -> 34058 bytes docs/_static/logo/light.png | Bin 30770 -> 32774 bytes etalon/capacity_search/config/config.py | 14 +++++++------- etalon/core/hf_utils.py | 2 +- etalon/core/llm_clients/__init__.py | 10 +++++++--- etalon/core/llm_clients/base_llm_client.py | 5 +++-- .../openai_chat_completions_client.py | 4 ++-- etalon/core/requests_launcher.py | 2 ++ etalon/core/requests_manager.py | 8 +++++++- etalon/prefill_profiler.py | 1 + etalon/run_benchmark.py | 16 +++++++++++++++- 12 files changed, 47 insertions(+), 19 deletions(-) diff --git a/README.md b/README.md index ac5d607..bfe653e 100644 --- a/README.md +++ b/README.md @@ -1,9 +1,9 @@ - +

Tool to benchmark LLM Inference Systems diff --git a/docs/_static/logo/dark.png b/docs/_static/logo/dark.png index 7c458b229e2d5f0f5cf2fc384aad5a61dbcfa280..aa3756fecb48120834b3990095e4e79e0bd1cdfc 100644 GIT binary patch literal 34058 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 Lyr_O|{r>*|sC|s< literal 33398 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 diff --git a/docs/_static/logo/light.png b/docs/_static/logo/light.png index 6cf807686d8169ecdc8776a216a4e91a50595a72..433080002f4fccfdfd1b59ad42d0c8effb569cbd 100644 GIT binary patch literal 32774 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 s{qG bool: return not self.parallel_specs or spec_name in self.parallel_specs @@ -312,10 +316,6 @@ def generate_job_configs(cls, config: dict): and server_config.openai_server_engine in ["vllm", "lightllm", "fastertransformers", "sarathi-serve"] ) - or ( - model_config.name != "gpt-3.5-turbo" - and server_config.openai_server_engine == "default" - ) or ( request_generator_config.trace_file_name == "sharegpt" and request_config.request_generator_max_tokens == 16384 diff --git a/etalon/core/hf_utils.py b/etalon/core/hf_utils.py index 087f85e..e913a21 100644 --- a/etalon/core/hf_utils.py +++ b/etalon/core/hf_utils.py @@ -26,7 +26,7 @@ def get_tokenizer( ) except TypeError as e: # The LLaMA tokenizer causes a protobuf error in some environments. - err_msg = "Failed to load the tokenizer." + err_msg = "Failed to load the tokenizer. If model name is correct, consider setting --tokenizer CLI arg to equivalent model on HuggingFace." raise RuntimeError(err_msg) from e except ValueError as e: # If the error pertains to the tokenizer class not existing or not diff --git a/etalon/core/llm_clients/__init__.py b/etalon/core/llm_clients/__init__.py index 65c3bfd..7a67c33 100644 --- a/etalon/core/llm_clients/__init__.py +++ b/etalon/core/llm_clients/__init__.py @@ -10,7 +10,11 @@ def construct_clients( - model_name: str, llm_api: str, num_clients: int, use_ray: bool = True + model_name: str, + tokenizer_name: str, + llm_api: str, + num_clients: int, + use_ray: bool = True, ) -> List[BaseLLMClient]: """Construct LLMClients that will be used to make requests to the LLM API. @@ -36,8 +40,8 @@ def construct_clients( ) if use_ray: - clients = [impl.remote(model_name) for _ in range(num_clients)] + clients = [impl.remote(model_name, tokenizer_name) for _ in range(num_clients)] else: - clients = [impl(model_name) for _ in range(num_clients)] + clients = [impl(model_name, tokenizer_name) for _ in range(num_clients)] return clients diff --git a/etalon/core/llm_clients/base_llm_client.py b/etalon/core/llm_clients/base_llm_client.py index 1420226..f63ca8b 100644 --- a/etalon/core/llm_clients/base_llm_client.py +++ b/etalon/core/llm_clients/base_llm_client.py @@ -9,9 +9,10 @@ class BaseLLMClient: """A client for making requests to a LLM API e.g Anyscale Endpoints.""" - def __init__(self, model_name: str) -> None: + def __init__(self, model_name: str, tokenizer_name: str) -> None: + self.model_name = model_name self.tokenizer = get_tokenizer( - model_name, + tokenizer_name, trust_remote_code=True, ) diff --git a/etalon/core/llm_clients/openai_chat_completions_client.py b/etalon/core/llm_clients/openai_chat_completions_client.py index 15a0a8a..71dbe2d 100644 --- a/etalon/core/llm_clients/openai_chat_completions_client.py +++ b/etalon/core/llm_clients/openai_chat_completions_client.py @@ -19,8 +19,8 @@ class OpenAIChatCompletionsClient(BaseLLMClient): """Client for OpenAI Chat Completions API.""" - def __init__(self, model_name: str) -> None: - super().__init__(model_name) + def __init__(self, model_name: str, tokenizer_name: str) -> None: + super().__init__(model_name, tokenizer_name) self.client = httpx.AsyncClient() def total_tokens(self, response_list: List[str]) -> int: diff --git a/etalon/core/requests_launcher.py b/etalon/core/requests_launcher.py index c349b11..c9b6e6a 100644 --- a/etalon/core/requests_launcher.py +++ b/etalon/core/requests_launcher.py @@ -13,6 +13,7 @@ class RequestsLauncher: def __init__( self, model: str, + tokenizer_name: str, llm_api: str, num_ray_clients: int, num_concurrent_requests_per_client: int, @@ -23,6 +24,7 @@ def __init__( AsyncRequestsManager.remote( client_id=client_id, model=model, + tokenizer_name=tokenizer_name, llm_api=llm_api, max_concurrent_requests=num_concurrent_requests_per_client, ) diff --git a/etalon/core/requests_manager.py b/etalon/core/requests_manager.py index 68a1825..2e8890c 100644 --- a/etalon/core/requests_manager.py +++ b/etalon/core/requests_manager.py @@ -15,7 +15,12 @@ class AsyncRequestsManager: """Manages requests for single LLM API client.""" def __init__( - self, client_id: int, model: str, llm_api: str, max_concurrent_requests: int + self, + client_id: int, + model: str, + tokenizer_name: str, + llm_api: str, + max_concurrent_requests: int, ): self.max_concurrent_requests = max_concurrent_requests self.requests_queue = asyncio.Queue(maxsize=max_concurrent_requests) @@ -23,6 +28,7 @@ def __init__( # just create a single client per manager self.llm_client = construct_clients( model_name=model, + tokenizer_name=tokenizer_name, llm_api=llm_api, num_clients=1, use_ray=False, diff --git a/etalon/prefill_profiler.py b/etalon/prefill_profiler.py index aaac198..fc6aa47 100644 --- a/etalon/prefill_profiler.py +++ b/etalon/prefill_profiler.py @@ -81,6 +81,7 @@ def run(self): os.makedirs(run_dir, exist_ok=True) run_benchmark( model=self.args.model, + tokenizer_name=self.args.tokenizer, output_dir=run_dir, additional_sampling_params=self.args.additional_sampling_params, num_ray_clients=PREFILL_NUM_RAY_CLIENTS, diff --git a/etalon/run_benchmark.py b/etalon/run_benchmark.py index bee9a93..0f7aab5 100644 --- a/etalon/run_benchmark.py +++ b/etalon/run_benchmark.py @@ -107,6 +107,7 @@ async def collect_results( async def run_main_loop( model: str, + tokenizer_name: str, llm_api: str, tokenizer: Any, additional_sampling_params: Optional[Dict[str, Any]] = None, @@ -123,6 +124,7 @@ async def run_main_loop( ): req_launcher = RequestsLauncher( model=model, + tokenizer_name=tokenizer_name, llm_api=llm_api, num_ray_clients=num_ray_clients, num_concurrent_requests_per_client=num_concurrent_requests_per_client, @@ -185,6 +187,7 @@ async def run_main_loop( def run_benchmark( model: str, + tokenizer_name: str, output_dir: str, additional_sampling_params: Optional[Dict[str, Any]] = None, num_ray_clients: int = 2, @@ -239,7 +242,7 @@ def run_benchmark( ) tokenizer = get_tokenizer( - model, + tokenizer_name=tokenizer_name, trust_remote_code=True, ) @@ -265,6 +268,7 @@ def run_benchmark( asyncio.run( run_main_loop( model=model, + tokenizer_name=tokenizer_name, llm_api=llm_api, tokenizer=tokenizer, additional_sampling_params=additional_sampling_params, @@ -300,6 +304,12 @@ def parse_args(): args.add_argument( "--model", type=str, required=True, help="The model to use for this load test." ) + args.add_argument( + "--tokenizer", + type=str, + required=False, + help="The tokenizer to use for this load test. By default, the tokenizer is inferred from the model.", + ) args.add_argument( "--num-ray-clients", type=int, @@ -591,6 +601,9 @@ def parse_args(): args = args.parse_args() + if args.tokenizer is None: + args.tokenizer = args.model + if not args.should_use_given_dir: benchmark_identifier = f"{args.model}_{args.request_interval_generator_provider}_{args.request_length_generator_provider}" benchmark_identifier = re.sub(r"[^\w\d-]+", "-", benchmark_identifier) @@ -629,6 +642,7 @@ def parse_args(): llm_api=args.llm_api, output_dir=args.output_dir, model=args.model, + tokenizer_name=args.tokenizer, timeout=args.timeout, max_num_completed_requests=args.max_num_completed_requests, num_ray_clients=args.num_ray_clients,