import json import random import time import requests from sglang.srt.utils.common import kill_process_tree from sglang.test.test_utils import ( DEFAULT_DRAFT_MODEL_EAGLE, DEFAULT_TARGET_MODEL_EAGLE, DEFAULT_TIMEOUT_FOR_SERVER_LAUNCH, DEFAULT_URL_FOR_TEST, CustomTestCase, popen_launch_server, ) PROMPTS = [ "[INST] <>\\nYou are a helpful assistant.\\n<>\\nToday is a sunny day and I like[/INST]" '[INST] <>\\nYou are a helpful assistant.\\n<>\\nWhat are the mental triggers in Jeff Walker\'s Product Launch Formula and "Launch" book?[/INST]', "[INST] <>\\nYou are a helpful assistant.\\n<>\\nSummarize Russell Brunson's Perfect Webinar Script...[/INST]", "[INST] <>\\nYou are a helpful assistant.\\n<>\\nwho are you?[/INST]", "[INST] <>\\nYou are a helpful assistant.\\n<>\\nwhere are you from?[/INST]", ] class EagleServerBase(CustomTestCase): target_model = DEFAULT_TARGET_MODEL_EAGLE draft_model = DEFAULT_DRAFT_MODEL_EAGLE spec_algo = "EAGLE" spec_steps = 5 spec_topk = 8 spec_tokens = 64 mem_fraction_static = 0.7 extra_args = [] @classmethod def setUpClass(cls): cls.base_url = DEFAULT_URL_FOR_TEST cls.process = popen_launch_server( cls.target_model, cls.base_url, timeout=DEFAULT_TIMEOUT_FOR_SERVER_LAUNCH, other_args=[ f"--speculative-algorithm={cls.spec_algo}", f"--speculative-draft-model-path={cls.draft_model}", f"--speculative-num-steps={cls.spec_steps}", f"--speculative-eagle-topk={cls.spec_topk}", f"--speculative-num-draft-tokens={cls.spec_tokens}", f"--mem-fraction-static={cls.mem_fraction_static}", ] + cls.extra_args, ) @classmethod def tearDownClass(cls): kill_process_tree(cls.process.pid, wait_timeout=60) def send_request(self): time.sleep(random.uniform(0, 2)) for prompt in PROMPTS: url = self.base_url + "/generate" data = { "text": prompt, "sampling_params": { "temperature": 0, "max_new_tokens": 1024, }, } response = requests.post(url, json=data) assert response.status_code == 200 def send_requests_abort(self): for prompt in PROMPTS: try: time.sleep(random.uniform(0, 2)) url = self.base_url + "/generate" data = { "model": "base", "text": prompt, "sampling_params": { "temperature": 0, "max_new_tokens": 1024, }, } # set timeout = 1s, mock disconnected requests.post(url, json=data, timeout=1) except Exception as e: print(e) pass def run_decode(self, sampling_params): return_logprob = True top_logprobs_num = 5 return_text = True n = 1 response = requests.post( self.base_url + "/generate", json={ "text": "Human: Write a travel blog post to Hawaii.\n\nAssistant:", "sampling_params": { "max_new_tokens": 48, "n": n, "temperature": 0.7, **sampling_params, }, "return_logprob": return_logprob, "top_logprobs_num": top_logprobs_num, "return_text_in_logprobs": return_text, "logprob_start_len": 0, }, ) self.assertEqual(response.status_code, 200) print(json.dumps(response.json())) print("=" * 100)