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),仅供参考

相关新闻

端侧AI文搜图实战:HarmonyOS本地相册搜索的模型与索引优化

端侧AI文搜图实战:HarmonyOS本地相册搜索的模型与索引优化

1. 起心动念:为什么要在相册里做文搜图先说个真事。有天晚上我想找一张去年生日时朋友偷拍的照片,记得很清楚:画面里有奶油蛋糕、暖黄色烛光、我笑得特别没形象。我在系统相册里翻了五分多钟,关键词换了无数轮都搜不到&#xff0c…

2026/10/10 14:44:06 阅读更多 →
本地AI绘图全家桶:ComfyUI工作流与显存优化实战指南

本地AI绘图全家桶:ComfyUI工作流与显存优化实战指南

1. “本地AI绘图全家桶”不是营销话术,而是当前创作者的真实生存刚需“本地AI绘图全家桶”这七个字,最近在设计、插画、独立游戏开发和自媒体内容生产圈里高频出现。它不指某款软件、某个品牌,也不是某家厂商推出的预装包——它是一类高度定制…

2026/10/10 22:48:29 阅读更多 →
会调API不等于AI工程师:从零搭建AI工程的完整链路

会调API不等于AI工程师:从零搭建AI工程的完整链路

很多人问我同一个问题:我现在能调大模型的API,能写Prompt,能跑通一个Demo,算不算一个AI工程师?我的回答通常不太留情面:不算,甚至离得还挺远。"ai-engineering-from-scratch"这个项目…

2026/10/10 22:48:32 阅读更多 →

最新新闻

基于Spring Boot + Vue的蘑菇百科系统设计与实现指南

基于Spring Boot + Vue的蘑菇百科系统设计与实现指南

毕设选题年年有人纠结,年年有人踩坑。如果你正盯着“XX管理系统”这类老掉牙的题目发愁,或者担心做纯网页展示类项目显得工作量不足,我强烈建议你认真看看“基于Spring Boot Vue的蘑菇百科系统”这个方向。它既有信息管理系统的完整业务链路…

2026/10/11 2:23:00 阅读更多 →
PJ85718DM与PIC18LF46K40在HVAC温控系统中的高可靠设计

PJ85718DM与PIC18LF46K40在HVAC温控系统中的高可靠设计

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/11 2:23:00 阅读更多 →
Kubernetes 内存超分与防爆死指南:基于 cgroup v2 memory.high 的平滑降级实操

Kubernetes 内存超分与防爆死指南:基于 cgroup v2 memory.high 的平滑降级实操

在 Kubernetes 生产集群的算力成本治理中,CPU 属于典型的“可压缩资源(Compressible Resource)”,当算力超卖或并发突刺时,CFS 调度器最多让应用稍微慢一点、延迟稍微抖动一下,进程本身并不会消亡。而内存则…

2026/10/11 2:23:00 阅读更多 →
Git误操作急救:reflog与fsck恢复丢失代码

Git误操作急救:reflog与fsck恢复丢失代码

git误操作这种事,凡是写过代码的人多多少少都遇到过。可能是午休回来手一抖,把分支 reset 到了一周前;也可能是合并的时候顺手 rebase 了一下,push 时才被远程仓库一口回绝;更常见的是git checkout -- .之后&#xff0…

2026/10/11 2:23:00 阅读更多 →
Linux进程控制实战:fork、exec、wait与僵尸进程排查指南

Linux进程控制实战:fork、exec、wait与僵尸进程排查指南

写Linux程序的人,几乎都要跟进程控制打交道。fork、exec、exit、wait这四个词,翻过书的人都能念出来,但真正把它们组合起来用对,才是区分“看过”和“会写”的分水岭。我见过不少开发者在多进程服务里栽跟头,要么子进程…

2026/10/11 2:23:00 阅读更多 →
Linux网络性能优化实战:从内核参数调整到tcpdump抓包排查

Linux网络性能优化实战:从内核参数调整到tcpdump抓包排查

某个深夜,线上接口的P99延迟从60ms一路冲到700ms,我第一时间就想做一轮Linux网络性能优化与监控,于是把网上那套内核参数调优脚本挨个灌进去,tcp_tw_reuse、tcp_max_syn_backlog全都改了。结果延迟没降,反而有机器连接…

2026/10/11 2:22:00 阅读更多 →

日新闻

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

简介:基于 ARIMA、LSTM、Transformer 等模型的流感时间序列预测 Python 源码,面向计算机相关专业课程设计与期末大作业学生,以及项目实战学习者。内容覆盖预处理、平稳性检验、定阶、残差分析、多模型对比预测的完整时序建模流程,…

2026/10/11 0:00:27 阅读更多 →
影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别 做影刀RPA自动化,十个新手有八个栽在"往输入框里填东西"这件事上:要么填不进去,要么填了一半,要么直接把原来内容追加在后面。这背后的根因&…

2026/10/11 0:00:27 阅读更多 →
影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容 1. 认识影刀:什么场景该用RPA采小说数据 起点中文网的页面结构相对稳定——分类榜单、书籍详情、章节内容三块独立页面,跳转链路清晰。这种场景非常适合影刀自动化&#x…

2026/10/11 0:00:27 阅读更多 →

周新闻

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

简介:基于 ARIMA、LSTM、Transformer 等模型的流感时间序列预测 Python 源码,面向计算机相关专业课程设计与期末大作业学生,以及项目实战学习者。内容覆盖预处理、平稳性检验、定阶、残差分析、多模型对比预测的完整时序建模流程,…

2026/10/11 0:00:27 阅读更多 →
影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别 做影刀RPA自动化,十个新手有八个栽在"往输入框里填东西"这件事上:要么填不进去,要么填了一半,要么直接把原来内容追加在后面。这背后的根因&…

2026/10/11 0:00:27 阅读更多 →
影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容 1. 认识影刀:什么场景该用RPA采小说数据 起点中文网的页面结构相对稳定——分类榜单、书籍详情、章节内容三块独立页面,跳转链路清晰。这种场景非常适合影刀自动化&#x…

2026/10/11 0:00:27 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/10 5:23:50 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/9 21:32:20 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/10 10:38:42 阅读更多 →