ARTICLE · INTELLIGENCE

战地情报 · 详情页

来自尧图项目组的一线实战观察与深度解析

s1 项目 SGLang 引擎 GSM8K 多后端推理基准测试完整指南:数据准备、服务端启动与评分实现解析

s1 项目 SGLang 引擎 GSM8K 多后端推理基准测试完整指南:数据准备、服务端启动与评分实现解析 大模型推理模型微调模型推理服务【免费下载链接】s1s1: Simple test-time scaling项目地址https://gitcode.com/gh_mirrors/s1/s1点击查看免费下载导读本文面向需要在 s1 测试时缩放test-time scaling项目环境中复现 GSM8K 数学推理性能对比的开发者。文章以 eval/rebase/sglang/benchmark/gsm8k/README.md 为主线完整继承其数据下载与 SGLang、vLLM、LightLLM、Guidance、LMQL 五种后端的基准测试操作步骤并结合同目录下的 bench_sglang.py 与 bench_other.py 源码深入讲解 few-shot 提示构造、答案数值抽取、准确率计算与结果落盘机制。读完本文你将能够独立搭建并运行一套可复现的 GSM8K 多后端推理基准并理解每条命令背后的实现原理。基准测试目录结构该基准位于仓库的 sglang 分支目录下eval/rebase/sglang/benchmark/gsm8k/ ├── README.md # 操作指南本文主体 ├── bench_sglang.py # SGLang 专用客户端使用 SGL 结构化生成语言 └── bench_other.py # 多后端通用客户端vllm / lightllm / guidance / lmql / srt-raw两个客户端脚本与 README 同目录存放其中bench_sglang.py面向 SGLang 运行时SRTbench_other.py面向其余四种外部后端二者共享同一套 few-shot 构造与答案抽取逻辑保证各后端在完全相同的输入与评分标准下进行对比。仓库中benchmark/目录下还有 mmlu、hellaswag、multi_chain_reasoning 等同类基准benchmark 目录GSM8K 是其中面向数学应用题评测的代表用例。第一步下载 GSM8K 测试数据README 提供了直接获取 OpenAI GSM8K 官方测试集的命令wget https://raw.githubusercontent.com/openai/grade-school-math/master/grade_school_math/data/test.jsonl下载得到的test.jsonl为 JSONL每行一个 JSON 对象格式每一行至少包含两个字段question小学应用题题干自然语言描述 数学问题answer包含完整推导与最终数值的参考答案格式形如#### 25。该文件路径随后被两个客户端脚本通过--data-path参数引用默认值即test.jsonl见 bench_sglang.py 与 bench_other.py。数据读取由read_jsonl完成该工具位于 python/sglang/utils.py逐行解析 JSON 并跳过以#开头的注释行。第二步构建 few-shot 提示与答案标签在启动任何后端之前两个脚本都会做两件事构造 few-shot 示例和提取标准答案数值。few-shot 提示构造bench_sglang.py 中的构造逻辑如下def get_one_example(lines, i, include_answer): ret Question: lines[i][question] \nAnswer: if include_answer: ret lines[i][answer] return ret def get_few_shot_examples(lines, k): ret for i in range(k): ret get_one_example(lines, i, True) \n\n return ret默认取前 5 条--num-shot 5带答案的样本拼接为演示demonstration随后为每条测试问题生成Question: ...\nAnswer:形式的待补全输入期望模型续写出Answer:之后的求解过程与最终数值。这一设计使所有后端共享完全一致的上下文格式消除提示工程差异对对比结果的影响。标准答案数值抽取参考答案字符串包含完整推导评分前需先抽取最终数值。bench_sglang.py 中get_answer_value的实现为INVALID -9999999 def get_answer_value(answer_str): answer_str answer_str.replace(,, ) # 去掉千分位逗号 numbers re.findall(r\d, answer_str) # 提取所有数字 if len(numbers) 1: return INVALID try: return ast.literal_eval(numbers[-1]) # 取最后一个数字 except SyntaxError: return INVALID即去除千分位逗号后取字符串中最后一个整数作为模型预测值抽不出数字或解析失败时标记为INVALID -9999999。测试集标签同样经此函数转换并在进入主流程前通过assert all(l ! INVALID for l in labels)确保标签全部有效。第三步SGLang 后端基准SRT启动 SGLang 服务端python -m sglang.launch_server --model-path meta-llama/Llama-2-7b-chat-hf --port 30000该命令以sglang.launch_server模块启动 SGLang RuntimeSRT加载 Llama-2-7b-chat 模型并监听 30000 端口。README 的 Quick Start 部分sglang/README.md给出了相同用法可额外叠加的常用启动参数包括--tp 2启用 2 卡张量并行--mem-fraction-static 0.7显存不足时降低 KV cache 池静态内存占比默认 0.9--chat-template llama-2覆盖模型自带的对话模板。运行 SGLang 客户端python3 bench_sglang.py --num-questions 200客户端核心是一段 SGL 结构化生成程序bench_sglang.pyimport sglang as sgl sgl.function def few_shot_gsm8k(s, question): s few_shot_examples question s sgl.gen(answer, max_tokens256, stopQuestion)sgl.function将普通 Python 函数声明为 SGL 程序sgl.gen(answer, max_tokens256, stopQuestion)声明一次受限生成最多 256 token遇到Question即停止结果存入answer状态变量。随后通过select_sglang_backend(args)选择后端默认srt即连接http://127.0.0.1:30000的 RuntimeEndpoint并以run_batch批量执行、连续批处理continuous batching调度bench_sglang.pybackend select_sglang_backend(args) states few_shot_gsm8k.run_batch( arguments, temperature0, backendbackend, num_threadsargs.parallel)温度固定为 0保证贪心解码、结果可复现。--parallel默认 64 表示并发线程数test_utils.py 中add_common_sglang_args_and_parse定义。select_sglang_backend还支持srt-no-parallel关闭并行解码/编码与gpt-*走 OpenAI 云端模型等变体test_utils.py。第四步vLLM 后端基准启动 vLLM 服务端python3 -m vllm.entrypoints.api_server --tokenizer-mode auto --model meta-llama/Llama-2-7b-chat-hf --disable-log-requests --port 21000以 vLLM 的 OpenAI 兼容 API 服务启动同一模型监听 21000 端口--disable-log-requests关闭逐请求日志以减少 I/O 开销。运行 vLLM 客户端python3 bench_other.py --num-questions 200 --backend vllmbench_other.py通过add_common_other_args_and_parse解析参数其中--backend为必选项可选值包括vllm、lightllm、guidance、lmql、srt-raw、llama.cpptest_utils.py。未显式传--port时脚本按后端映射默认端口vllm21000、lightllm22000、lmql23000、srt-raw30000。vLLM 分支将请求封装为call_generate_vllmtest_utils.pyPOST 到{host}:{port}/generate请求体携带prompt、temperature、max_tokens、stop字段返回文本经pred[0][len(prompt):]截取新增部分作为续写结果。并发由ThreadPoolExecutor(args.parallel)线程池驱动。第五步LightLLM 后端基准启动 LightLLM 服务端# A10G python -m lightllm.server.api_server --tokenizer_mode auto --model_dir ~/model_weights/llama-2-7b-chat-hf --max_total_token_num 16000 --port 22000LightLLM 使用本地模型权重目录--model_dirA10G 环境下将 KV cache token 上限设为 16000显存更小的 V100 上 README 建议将该值降至 4500见同目录 mmlu 基准 README.md 的对照配置。运行 LightLLM 客户端python3 bench_other.py --num-questions 200 --backend lightllmLightLLM 分支走call_generate_lightllmtest_utils.py请求体字段为inputsparameterstemperature、max_new_tokens、stop_sequences返回generated_text[0]。注意该分支使用与 vLLM 不同的请求体结构bench_other.py通过partial预绑定 url 实现差异封装。第六步Guidance 后端基准Guidance 不需要独立的服务端进程直接在客户端进程内加载 GGUF 量化模型python3 bench_other.py --num-questions 200 --backend guidance --parallel 1bench_other.py 中 guidance 分支的实现为from guidance import models, gen model models.LlamaCpp( /home/ubuntu/model_weights/Llama-2-7b-chat.gguf, n_gpu_layers-1, n_ctx4096) def call_generate(prompt, temperature, max_tokens, stop): out model prompt gen(nameanswer, max_tokensmax_tokens, temperaturetemperature, stopstop) return out[answer]需预先准备 Llama-2-7b-chat 的 GGUF 权重文件README 中示例路径为/home/ubuntu/model_weights/Llama-2-7b-chat.ggufn_gpu_layers-1表示全部层加载到 GPUn_ctx4096设置上下文窗口用gen(nameanswer, ...)声明受限生成节点通过返回对象的out[answer]取出结果。由于是进程内推理、单模型实例README 明确要求--parallel 1避免多线程并发访问同一 LlamaCpp 实例造成冲突。第七步LMQL 后端基准启动 LMQL 服务端CUDA_VISIBLE_DEVICES0,1 lmql serve-model meta-llama/Llama-2-7b-chat-hf --cuda --port 23000lmql serve-model启动 LMQL 模型服务--cuda启用 GPU占用 0、1 两块 GPU监听 23000 端口。运行 LMQL 客户端python3 bench_other.py --num-questions 100 --backend lmql --parallel 2LMQL 分支bench_other.py使用lmql.query声明约束生成程序import lmql model lmql.model(args.model_path, endpointf{args.host}:{args.port}) lmql.query(modelmodel) async def program(question): lmql {question}[ANSWER] where len(TOKENS(ANSWER)) 257 and STOPS_AT(ANSWER, Question) return ANSWER LMQL 约束语言以声明式 where 子句限定生成长度len(TOKENS(ANSWER)) 257与 max_tokens256 对齐与停止条件STOPS_AT(ANSWER, Question)。该分支不使用线程池而是通过asyncio.gather按args.parallel的批大小并发调度bench_other.pyREADME 给出的示例批大小为 2。因服务端负载与并发模型不同示例请求数也相应减为 100。评分逻辑与结果输出统一评分流程无论哪个后端bench_sglang.py 与 bench_other.py 都执行相同的四步评分对每条模型输出调用get_answer_value抽取最后一个整数作为预测值acc np.mean(np.array(preds) np.array(labels))计算预测与标签完全相等的比例即准确率invalid np.mean(np.array(preds) INVALID)统计无法抽取出数字的输出占比打印Latency整批请求的端到端耗时单位秒、Invalid、Accuracy三项指标。其中accuracy基于严格的数值相等判断只要模型答案的最终数字与参考答案最后一个数字一致即判对这一粗粒度匹配规则与 GSM8K 评测惯例一致但无法区分推导过程正确与否。结果落盘评测结果以追加写方式open(args.result_file, a)写入 JSONL默认文件名为result.jsonl每条记录包含{ task: gsm8k, backend: sglang, num_gpus: 1, latency: 12.345, accuracy: 0.35, num_requests: 200, other: {num_questions: 200, parallel: 64} }同时dump_state_text(ftmp_output_{args.backend}.txt, states)会把全部生成状态含原始输出文本落盘为tmp_output_backend.txt便于事后排查失败样本与复算指标。常见问题与调参建议显存不足OOMSGLang 服务端可调低--mem-fraction-static默认 0.9LightLLM 降低--max_total_token_numA10G 用 16000V100 用 4500Guidance 减小n_ctx或减少 GPU 层数。端口冲突各后端默认端口约定为SGLang30000、vLLM21000、LightLLM22000、LMQL23000test_utils.py 中default_port映射。修改服务端端口时客户端需用--port显式对齐。结果波动所有后端在temperature0下运行以保证可复现如需观察不同并发对吞吐的影响可调节--parallel默认 64与--num-questions默认 200。扩展阅读客户端公共参数与后端请求封装python/sglang/test/test_utils.pySGLang 前端语言与运行时整体介绍eval/rebase/sglang/README.md同类基准的目录组织含 mmlu、hellaswag、multi_chain_reasoning 等eval/rebase/sglang/benchmark仓库内 s1 项目推理相关工具data/utils/inference_utils.py、data/bulk_inference.py在 s1 测试时缩放工作流中本文的 GSM8K 基准可用于快速验证不同推理引擎对数学应用题生成与评分的端到端表现为缩放策略的消融对比提供稳定、可复现的测量基线。赞分享大模型推理模型微调模型推理服务【免费下载链接】s1s1: Simple test-time scaling项目地址https://gitcode.com/gh_mirrors/s1/s1点击查看免费下载相关推荐SGLang GSM8K 基准测试实战从服务启动到 few-shot 数学推理评测SGLang GSM8K 基准测试实战从服务启动到 few shot 数学推理评测 GSM8KGrade School Math 8K是评测大语言模型小学模型推理服务推理引擎人工智能大模型本地部署多模态SGLang MMLU 基准测试指南数据准备、服务部署与 few-shot 精度评测SGLang MMLU 基准测试指南数据准备、服务部署与 few shot 精度评测 本文基于 SGLang 仓库中 benchmark/mmlu https模型推理服务推理引擎人工智能大模型本地部署多模态cann/asc-devkit FMA空间接口GetFmaMaxMinTmpSizea nameZH CN_TOPIC_0000002349009538 /a 功能说明a namesecti人工智能深度学习算子库CANNAscend上一篇Bilibili-Evolved终极开发指南快速上手API与插件开发下一篇告别手动整理文献Zotero与R语言协同实现文献计量自动化分析创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
RELATED READING

延伸阅读

更多一线实战笔记与深度复盘,助您持续精进