adapt to sglang v0.5.2rc1 on dcu
This commit is contained in:
66
benchmark/multi_turn_chat/README.md
Normal file
66
benchmark/multi_turn_chat/README.md
Normal file
@@ -0,0 +1,66 @@
|
||||
### Benchmark sglang
|
||||
|
||||
Run Llama-7B
|
||||
|
||||
```
|
||||
python3 -m sglang.launch_server --model-path meta-llama/Llama-2-7b-chat-hf --port 30000
|
||||
```
|
||||
|
||||
Run Mixtral-8x7B
|
||||
(When there is a CUDA out-of-memory error, try to reduce the `--mem-fraction-static`)
|
||||
|
||||
```
|
||||
python3 -m sglang.launch_server --model-path mistralai/Mixtral-8x7B-Instruct-v0.1 --port 30000 --tp-size 8
|
||||
```
|
||||
|
||||
Benchmark(short output)
|
||||
|
||||
```
|
||||
python3 bench_sglang.py --tokenizer meta-llama/Llama-2-7b-chat-hf
|
||||
```
|
||||
|
||||
Benchmark(long output)
|
||||
|
||||
```
|
||||
python3 bench_sglang.py --tokenizer meta-llama/Llama-2-7b-chat-hf --long
|
||||
```
|
||||
|
||||
### Benchmark vLLM
|
||||
|
||||
Run Llama-7B
|
||||
|
||||
```
|
||||
python3 -m vllm.entrypoints.api_server --tokenizer-mode auto --model meta-llama/Llama-2-7b-chat-hf --disable-log-requests --port 21000
|
||||
```
|
||||
|
||||
Run Mixtral-8x7B
|
||||
|
||||
```
|
||||
python3 -m vllm.entrypoints.api_server --tokenizer-mode auto --model mistralai/Mixtral-8x7B-Instruct-v0.1 --disable-log-requests --port 21000 --tensor-parallel-size 8
|
||||
```
|
||||
|
||||
Benchmark(short output)
|
||||
|
||||
```
|
||||
python3 bench_other.py --tokenizer meta-llama/Llama-2-7b-chat-hf --backend vllm
|
||||
```
|
||||
|
||||
Benchmark(long output)
|
||||
|
||||
```
|
||||
python3 bench_other.py --tokenizer meta-llama/Llama-2-7b-chat-hf --backend vllm --long
|
||||
```
|
||||
|
||||
### Benchmark guidance
|
||||
|
||||
Benchmark Llama-7B (short output)
|
||||
|
||||
```
|
||||
python3 bench_other.py --tokenizer meta-llama/Llama-2-7b-chat-hf --backend guidance --parallel 1 --n-ctx 4096 --model-path path/to/gguf
|
||||
```
|
||||
|
||||
Benchmark Llama-7B (long output)
|
||||
|
||||
```
|
||||
python3 bench_other.py --tokenizer meta-llama/Llama-2-7b-chat-hf --backend guidance --parallel 1 --n-ctx 4096 --model-path path/to/gguf --long
|
||||
```
|
||||
93
benchmark/multi_turn_chat/bench_other.py
Normal file
93
benchmark/multi_turn_chat/bench_other.py
Normal file
@@ -0,0 +1,93 @@
|
||||
import json
|
||||
import time
|
||||
from argparse import ArgumentParser
|
||||
from concurrent.futures import ThreadPoolExecutor
|
||||
from functools import partial
|
||||
|
||||
from data_gen import gen_arguments
|
||||
from tqdm import tqdm
|
||||
from vllm.transformers_utils.tokenizer import get_tokenizer
|
||||
|
||||
from sglang.test.test_utils import add_common_other_args_and_parse, get_call_generate
|
||||
from sglang.utils import dump_state_text
|
||||
|
||||
|
||||
def multi_turns(generate, qas):
|
||||
s = ""
|
||||
for qa in qas:
|
||||
s += qa["prompt"]
|
||||
s += generate(s, max_tokens=qa["new_tokens"])
|
||||
|
||||
return s
|
||||
|
||||
|
||||
def main(args):
|
||||
print(args)
|
||||
|
||||
tokenizer = get_tokenizer(args.tokenizer, trust_remote_code=args.trust_remote_code)
|
||||
|
||||
multi_qas = gen_arguments(args, tokenizer)
|
||||
|
||||
states = [None] * args.num_qa
|
||||
|
||||
call_generate = partial(get_call_generate(args), temperature=0)
|
||||
|
||||
def get_one_answer(i):
|
||||
states[i] = multi_turns(generate=call_generate, **multi_qas[i])
|
||||
|
||||
tic = time.perf_counter()
|
||||
if args.parallel == 1:
|
||||
for i in tqdm(range(len(multi_qas))):
|
||||
get_one_answer(i)
|
||||
else:
|
||||
with ThreadPoolExecutor(args.parallel) as executor:
|
||||
rets = list(
|
||||
tqdm(
|
||||
executor.map(get_one_answer, list(range(len(multi_qas)))),
|
||||
total=len(multi_qas),
|
||||
)
|
||||
)
|
||||
for _ in rets:
|
||||
pass
|
||||
|
||||
latency = time.perf_counter() - tic
|
||||
|
||||
# Compute accuracy
|
||||
print(f"Latency: {latency:.3f}")
|
||||
|
||||
dump_state_text(f"tmp_output_{args.backend}.txt", states)
|
||||
|
||||
with open(args.result_file, "a") as fout:
|
||||
value = {
|
||||
"task": "multi_turn_chat",
|
||||
"backend": args.backend,
|
||||
"num_gpus": 1,
|
||||
"latency": round(latency, 3),
|
||||
"num_requests": args.num_qa,
|
||||
"num_turns": args.turns,
|
||||
"other": {
|
||||
"parallel": args.parallel,
|
||||
"output_mode": "long" if args.long else "short",
|
||||
},
|
||||
}
|
||||
fout.write(json.dumps(value) + "\n")
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
parser = ArgumentParser()
|
||||
parser.add_argument("--turns", type=int, default=4)
|
||||
parser.add_argument("--num-qa", type=int, default=20)
|
||||
parser.add_argument("--min-len-q", type=int, default=256)
|
||||
parser.add_argument("--max-len-q", type=int, default=512)
|
||||
parser.add_argument("--min-len-a", type=int, default=4)
|
||||
parser.add_argument("--max-len-a", type=int, default=8)
|
||||
parser.add_argument("--tokenizer", type=str, required=True)
|
||||
parser.add_argument("--trust-remote-code", action="store_true")
|
||||
parser.add_argument("--long", action="store_true")
|
||||
args = add_common_other_args_and_parse(parser)
|
||||
|
||||
if args.long:
|
||||
args.min_len_a = 256
|
||||
args.max_len_a = 512
|
||||
args.num_qa = 20
|
||||
main(args)
|
||||
79
benchmark/multi_turn_chat/bench_sglang.py
Normal file
79
benchmark/multi_turn_chat/bench_sglang.py
Normal file
@@ -0,0 +1,79 @@
|
||||
import json
|
||||
import time
|
||||
from argparse import ArgumentParser
|
||||
|
||||
from data_gen import gen_arguments
|
||||
from vllm.transformers_utils.tokenizer import get_tokenizer
|
||||
|
||||
import sglang as sgl
|
||||
from sglang.test.test_utils import (
|
||||
add_common_sglang_args_and_parse,
|
||||
select_sglang_backend,
|
||||
)
|
||||
from sglang.utils import dump_state_text
|
||||
|
||||
|
||||
@sgl.function
|
||||
def multi_turns(s, qas):
|
||||
for qa in qas:
|
||||
s += qa["prompt"]
|
||||
s += sgl.gen(max_tokens=qa["new_tokens"], ignore_eos=True)
|
||||
|
||||
|
||||
def main(args):
|
||||
tokenizer = get_tokenizer(args.tokenizer, trust_remote_code=args.trust_remote_code)
|
||||
|
||||
multi_qas = gen_arguments(args, tokenizer)
|
||||
|
||||
backend = select_sglang_backend(args)
|
||||
|
||||
tic = time.perf_counter()
|
||||
states = multi_turns.run_batch(
|
||||
multi_qas,
|
||||
temperature=0,
|
||||
backend=backend,
|
||||
num_threads=args.parallel,
|
||||
progress_bar=True,
|
||||
)
|
||||
latency = time.perf_counter() - tic
|
||||
|
||||
print(f"Latency: {latency:.3f}")
|
||||
|
||||
dump_state_text(f"tmp_output_{args.backend}.txt", states)
|
||||
|
||||
with open(args.result_file, "a") as fout:
|
||||
value = {
|
||||
"task": "multi_turn_chat",
|
||||
"backend": args.backend,
|
||||
"num_gpus": 1,
|
||||
"latency": round(latency, 3),
|
||||
"num_requests": args.num_qa,
|
||||
"num_turns": args.turns,
|
||||
"other": {
|
||||
"parallel": args.parallel,
|
||||
"output_mode": "long" if args.long else "short",
|
||||
},
|
||||
}
|
||||
fout.write(json.dumps(value) + "\n")
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
parser = ArgumentParser()
|
||||
parser.add_argument("--turns", type=int, default=4)
|
||||
parser.add_argument("--num-qa", type=int, default=20)
|
||||
parser.add_argument("--min-len-q", type=int, default=256)
|
||||
parser.add_argument("--max-len-q", type=int, default=512)
|
||||
parser.add_argument("--min-len-a", type=int, default=4)
|
||||
parser.add_argument("--max-len-a", type=int, default=8)
|
||||
parser.add_argument("--tokenizer", type=str, required=True)
|
||||
parser.add_argument("--trust-remote-code", action="store_true")
|
||||
parser.add_argument("--long", action="store_true")
|
||||
args = add_common_sglang_args_and_parse(parser)
|
||||
|
||||
if args.long:
|
||||
args.min_len_a = 256
|
||||
args.max_len_a = 512
|
||||
args.num_qa = 20
|
||||
|
||||
print(args)
|
||||
main(args)
|
||||
29
benchmark/multi_turn_chat/data_gen.py
Normal file
29
benchmark/multi_turn_chat/data_gen.py
Normal file
@@ -0,0 +1,29 @@
|
||||
import random
|
||||
import string
|
||||
|
||||
random.seed(42)
|
||||
|
||||
|
||||
def gen_prompt(tokenizer, token_num):
|
||||
cha_set = string.ascii_letters + string.digits
|
||||
ret = "".join(random.choices(cha_set, k=token_num))
|
||||
while len(tokenizer(ret).input_ids) < token_num:
|
||||
ret += random.choice(cha_set)
|
||||
return ret
|
||||
|
||||
|
||||
def gen_arguments(args, tokenizer):
|
||||
multi_qas = [{"qas": []} for _ in range(args.num_qa)]
|
||||
for i in range(args.num_qa):
|
||||
qas = multi_qas[i]["qas"]
|
||||
for _ in range(args.turns):
|
||||
prompt_len = random.randint(args.min_len_q, args.max_len_q)
|
||||
new_tokens = random.randint(args.min_len_a, args.max_len_a)
|
||||
qas.append(
|
||||
{
|
||||
"prompt": gen_prompt(tokenizer, prompt_len),
|
||||
"new_tokens": new_tokens,
|
||||
}
|
||||
)
|
||||
|
||||
return multi_qas
|
||||
129
benchmark/multi_turn_chat/long_prompt_multi_turn.py
Normal file
129
benchmark/multi_turn_chat/long_prompt_multi_turn.py
Normal file
@@ -0,0 +1,129 @@
|
||||
import json
|
||||
import random
|
||||
import time
|
||||
from argparse import ArgumentParser
|
||||
from pathlib import Path
|
||||
|
||||
from tqdm import tqdm
|
||||
|
||||
import sglang as sgl
|
||||
from sglang.srt.hf_transformers_utils import get_tokenizer
|
||||
from sglang.test.test_utils import (
|
||||
add_common_sglang_args_and_parse,
|
||||
select_sglang_backend,
|
||||
)
|
||||
from sglang.utils import dump_state_text
|
||||
|
||||
|
||||
def gen_prompt(tokenizer, token_num):
|
||||
all_available_tokens = list(tokenizer.get_vocab().values())
|
||||
selected_tokens = random.choices(all_available_tokens, k=token_num)
|
||||
ret = tokenizer.decode(selected_tokens)
|
||||
return ret
|
||||
|
||||
|
||||
def get_cache_path(args):
|
||||
# Create cache directory under ~/.cache/sglang
|
||||
cache_dir = Path.home() / ".cache" / "sglang"
|
||||
|
||||
# Create a unique cache filename based on the arguments that affect generation
|
||||
cache_key = f"qa_{args.num_qa}_{args.turns}_{args.system_prompt_len}_{args.len_q}_{args.len_a}_{args.tokenizer.replace('/', '_')}.json"
|
||||
return cache_dir / cache_key
|
||||
|
||||
|
||||
def gen_arguments(args, tokenizer):
|
||||
cache_path = get_cache_path(args)
|
||||
|
||||
# Try to load from cache first
|
||||
if cache_path.exists():
|
||||
print(f"Loading cached arguments from {cache_path}")
|
||||
with open(cache_path, "r") as f:
|
||||
return json.load(f)
|
||||
|
||||
print("Generating new arguments...")
|
||||
# First progress bar for system prompts
|
||||
multi_qas = []
|
||||
for _ in tqdm(range(args.num_qa), desc="Generating system prompts"):
|
||||
multi_qas.append(
|
||||
{"system_prompt": gen_prompt(tokenizer, args.system_prompt_len), "qas": []}
|
||||
)
|
||||
|
||||
# Nested progress bars for QA pairs
|
||||
for i in tqdm(range(args.num_qa), desc="Generating QA pairs"):
|
||||
qas = multi_qas[i]["qas"]
|
||||
for j in range(args.turns):
|
||||
qas.append(
|
||||
{
|
||||
"prompt": gen_prompt(tokenizer, args.len_q),
|
||||
"new_tokens": args.len_a,
|
||||
}
|
||||
)
|
||||
|
||||
# Save to cache
|
||||
cache_path.parent.mkdir(parents=True, exist_ok=True)
|
||||
with open(cache_path, "w") as f:
|
||||
json.dump(multi_qas, f)
|
||||
print(f"Cached arguments saved to {cache_path}")
|
||||
|
||||
return multi_qas
|
||||
|
||||
|
||||
@sgl.function
|
||||
def multi_turns(s, system_prompt, qas):
|
||||
s += system_prompt
|
||||
|
||||
for i, qa in enumerate(qas):
|
||||
s += qa["prompt"]
|
||||
s += sgl.gen(max_tokens=qa["new_tokens"], ignore_eos=True)
|
||||
|
||||
|
||||
def main(args):
|
||||
tokenizer = get_tokenizer(args.tokenizer, trust_remote_code=args.trust_remote_code)
|
||||
|
||||
multi_qas = gen_arguments(args, tokenizer)
|
||||
|
||||
backend = select_sglang_backend(args)
|
||||
|
||||
tic = time.perf_counter()
|
||||
states = multi_turns.run_batch(
|
||||
multi_qas,
|
||||
temperature=0,
|
||||
backend=backend,
|
||||
num_threads="auto",
|
||||
progress_bar=True,
|
||||
)
|
||||
latency = time.perf_counter() - tic
|
||||
|
||||
print(f"Latency: {latency:.3f}")
|
||||
|
||||
dump_state_text(f"tmp_output_{args.backend}.txt", states)
|
||||
|
||||
with open(args.result_file, "a") as fout:
|
||||
value = {
|
||||
"task": "multi_turn_system_prompt_chat",
|
||||
"backend": args.backend,
|
||||
"latency": round(latency, 3),
|
||||
"num_requests": args.num_qa,
|
||||
"num_turns": args.turns,
|
||||
"other": {
|
||||
"parallel": args.parallel,
|
||||
},
|
||||
}
|
||||
fout.write(json.dumps(value) + "\n")
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
parser = ArgumentParser()
|
||||
parser.add_argument("--turns", type=int, default=8)
|
||||
parser.add_argument("--num-qa", type=int, default=128)
|
||||
parser.add_argument("--system-prompt-len", type=int, default=2048)
|
||||
parser.add_argument("--len-q", type=int, default=32)
|
||||
parser.add_argument("--len-a", type=int, default=128)
|
||||
parser.add_argument(
|
||||
"--tokenizer", type=str, default="meta-llama/Meta-Llama-3-8B-Instruct"
|
||||
)
|
||||
parser.add_argument("--trust-remote-code", action="store_true")
|
||||
args = add_common_sglang_args_and_parse(parser)
|
||||
|
||||
print(args)
|
||||
main(args)
|
||||
Reference in New Issue
Block a user