add balance-serve, support concurrence

This commit is contained in:
Atream 2025-03-31 22:55:32 +08:00
parent 8d0292aa44
commit 25cee5810e
196 changed files with 22077 additions and 565 deletions

View file

@ -0,0 +1,146 @@
import asyncio
import json
import sys
import aiohttp
import random
import argparse
import yaml
import os
import time
from time import sleep
decodesz = 128
# Server URL (replace with your server URL)
decodesz_list = [128]
ktansformer_prompt1024="""在遥远的翡翠森林里,住着各种各样的神奇生物。其中,有一只名叫露露的小狐狸,她与其他狐狸不同,天生长着一双晶莹剔透的翅膀。然而,这双翅膀却从未带她飞翔过。
一天森林里传来一个惊人的消息藏在森林深处的魔法泉水干涸了所有生物赖以生存的泉水即将枯竭他们说只有传说中的天空之羽才能唤醒泉水让它重新流淌然而天空之羽藏在一座高耸入云的山峰上没有任何动物能抵达那里
露露听到这个消息后决定亲自去寻找天空之羽即便她的翅膀无法飞翔她也要尝试最终露露来到了传说中的高峰脚下根本无法攀爬她望着天空心里充满了不甘如果我能飞起来就不会被这座山挡住了
正当她感到迷茫时一只年迈的白鹰出现在她面前
孩子你为什么到这里来白鹰用苍老但慈祥的声音问道
露露将森林的困境告诉了白鹰并说自己愿意付出一切只要能拯救森林
白鹰沉思了一会儿缓缓说道你的翅膀并不是没有力量而是你一直害怕它们不能飞翔相信自己勇敢跳下去
露露听后心跳加速她望着万丈深渊犹豫不决就在那一瞬间她竟然真的飞了起来露露兴奋极了她终于看到了天空之羽一根散发着金光的羽毛轻盈地悬浮在空中露露小心翼翼地将天空之羽叼住振翅返回森林
当她将羽毛放入干涸的泉水中时一道金光闪耀整个森林恢复了生机花草重新绽放动物们欢欣鼓舞从那以后露露成为了森林的英雄她是翱翔天空的勇士她让所有动物都明白只要相信自己勇敢前行就能实现自己的梦想
请简述这个故事的内涵 写10000个字
在遥远的翡翠森林里住着各种各样的神奇生物其中有一只名叫露露的小狐狸她与其他狐狸不同天生长着一双晶莹剔透的翅膀然而这双翅膀却从未带她飞翔过
一天森林里传来一个惊人的消息藏在森林深处的魔法泉水干涸了所有生物赖以生存的泉水即将枯竭他们说只有传说中的天空之羽才能唤醒泉水让它重新流淌然而天空之羽藏在一座高耸入云的山峰上没有任何动物能抵达那里
露露听到这个消息后决定亲自去寻找天空之羽即便她的翅膀无法飞翔她也要尝试最终露露来到了传说中的高峰脚下根本无法攀爬她望着天空心里充满了不甘如果我能飞起来就不会被这座山挡住了
正当她感到迷茫时一只年迈的白鹰出现在她面前
孩子你为什么到这里来白鹰用苍老但慈祥的声音问道
露露将森林的困境告诉了白鹰并说自己愿意付出一切只要能拯救森林
白鹰沉思了一会儿缓缓说道你的翅膀并不是没有力量而是你一直害怕它们不能飞翔相信自己勇敢跳下去
露露听后心跳加速她望着万丈深渊犹豫不决就在那一瞬间她竟然真的飞了起来露露兴奋极了她终于看到了天空之羽一根散发着金光的羽毛轻盈地悬浮在空中露露小心翼翼地将天空之羽叼住振翅返回森林
当她将羽毛放入干涸的泉水中时一道金光闪耀整个森林恢复了生机花草重新绽放动物们欢欣鼓舞从那以后露露成为了森林的英雄她是翱翔天空的勇士她让所有动物都明白只要相信自己勇敢前行就能实现自己的梦想
请简述这个故事的内涵 写10000个字
露露将森林的困境告诉了白鹰并说自己愿意付出一切只要能拯救森林
白鹰沉思了一会儿缓缓说道你的翅膀并不是没有力量而是你一直害怕它们不能飞翔相信自己勇敢跳下去
露露听后心跳加速她望着万丈深渊犹豫不决就在那一瞬间她竟然真的飞了起来露露兴奋极了她终于看到了天空之羽一根散发着金光的羽毛轻盈地悬浮在空中露露小心翼翼地将天空之羽叼住振翅返回森林
当她将羽毛放入干涸的泉水中时一道金光闪耀整个森林恢复了生机花草重新绽放动物们欢欣鼓舞从那以后露露成为了森林的英雄她是翱翔天空的勇士她让所有动物都明白只要相信自己勇敢前行就能实现自己的梦想
请简述这个故事的内涵 写10000个字
请简述这个故事的内涵 故事的内涵这个故事的内涵写10000个字"""
async def fetch_event_stream(session, request_id , prompt):
try:
payload = {
"messages": [
{"role": "system", "content": ""},
{"role": "user", "content": prompt}
],
"model": "DeepSeek-V3",
"temperature": 0.3,
"top_p": 1.0,
"stream": True # 开启流式输出
}
headers = {
'accept': 'application/json',
'Content-Type': 'application/json'
}
async with session.post(SERVER_URL, json=payload, headers=headers, timeout=500000) as response:
print(f"Request {request_id}: Connected, status {response.status}")
if response.status != 200:
print(f"Request {request_id}: Error, status {response.status}")
return
output_text = "" # 存储当前 response 的所有 token
total_tokens = 0 # 统计总 tokens 数
decode_start_time = None # 记录 decode 阶段开始时间
decode_end_time = None # 记录 decode 结束时间
async for line in response.content:
try:
decoded_line = line.decode("utf-8").strip()
# 过滤空行
if not decoded_line or not decoded_line.startswith("data: "):
continue
decoded_line = decoded_line[6:].strip() # 去掉 `data: `
# 确保 JSON 数据是合法的
if not decoded_line:
continue
response_data = json.loads(decoded_line) # 解析 JSON
# 确保 choices 存在
choices = response_data.get("choices", [])
if not choices:
continue
delta = choices[0].get("delta", {})
token = delta.get("content", "")
if token:
if decode_start_time is None:
decode_start_time = time.time() # 记录 decode 开始时间
output_text += token # 追加 token
sys.stdout.write(str(request_id))
sys.stdout.write(token) # 直接输出 token
sys.stdout.flush() # 立即刷新,确保 token 立刻出现在终端
total_tokens += 1 # 增加 token 计数
decode_end_time = time.time() # 每次收到 token更新 decode 结束时间
# 检查是否完成
finish_reason = choices[0].get("finish_reason", None)
if finish_reason:
# print(f"\nRequest {request_id}: Done")
break # 结束流式处理
except json.JSONDecodeError as e:
print(f"\nRequest {request_id}: JSON Decode Error - {e}")
except IndexError:
print(f"\nRequest {request_id}: List Index Error - choices is empty")
except Exception as e:
print(f"\nRequest {request_id}: Error parsing stream - {e}")
# 计算 decode 速度
if decode_start_time and decode_end_time and total_tokens > 0:
decode_time = decode_end_time - decode_start_time
decode_speed = total_tokens / decode_time if decode_time > 0 else 0
# print(f"Request {request_id}: Decode Speed = {decode_speed:.2f} tokens/s")
except Exception as e:
print(f"\nRequest {request_id}: Exception - {e}")
async def main(concurrent_requests , prompt ):
async with aiohttp.ClientSession() as session:
tasks = [fetch_event_stream(session, i , prompt) for i in range(concurrent_requests)]
await asyncio.gather(*tasks)
if __name__ == "__main__":
parser = argparse.ArgumentParser(description="Event Stream Request Tester")
parser.add_argument("--concurrent", type=int, default=1, help="Number of concurrent requests")
parser.add_argument("--prompt_lens", type=int, default=1024, help="prefill prompt lens, 1024 or 2048")
parser.add_argument("--api_url", type=str, default="http://localhost:10002/v1/chat/completions", help="API URL")
args = parser.parse_args()
SERVER_URL = args.api_url
if args.prompt_lens == 1024:
prompt = ktansformer_prompt1024
elif args.prompt_lens == 2048:
prompt = ktansformer_prompt1024 * 2
asyncio.run(main(args.concurrent, prompt))