VLLM/SGLang服务上线后,如何用lm_eval快速做个‘体检’?附完整API评测命令
VLLM/SGLang服务上线后,如何用lm_eval快速做个‘体检’?附完整API评测命令
当你终于把大模型服务部署上线,那种如释重负的感觉还没持续多久,新的焦虑就来了——这个服务真的能稳定运行吗?效果符合预期吗?作为负责模型部署的工程师,我深知这种忐忑。好在有lm_eval这样的工具,能让我们像给模型做"体检"一样,快速验证服务质量和效果。
1. 为什么模型服务需要"体检"?
想象一下,你刚部署了一个基于VLLM的Qwen-8B模型API服务,端口开在8000。客户端调用看起来一切正常,但你真的了解它的实际能力边界吗?它能处理多少并发?在不同类型任务上的表现如何?这些问题的答案,决定了这个服务能否真正投入生产环境。
传统做法是手动测试几个样例,但这既不系统也不全面。lm_eval的local-completions评测模式,正是为解决这个问题而生。它能:
- 标准化评估:使用学术界公认的评测集(如MMLU)进行系统测试
- 压力测试:通过调整并发数(
num_concurrent)观察服务稳定性 - 效果验证:确保部署后的模型效果与预期一致
提示:模型服务上线前的评测,应该像软件发布前的自动化测试一样成为标准流程
2. 搭建评测环境
评测前需要准备好环境。假设你已经通过VLLM或SGLang部署了模型服务(比如在localhost:8000),接下来需要安装评测工具:
# 安装lm_eval及其API评测依赖 pip install lm-eval[api]验证安装是否成功:
lm-eval --tasks list这个命令会列出所有支持的评测任务,你应该能看到类似这样的输出(节选):
mmlu hellaswag gsm8k ...3. 配置评测参数
核心评测命令结构如下:
lm_eval \ --model local-completions \ --tasks [任务名] \ --batch_size [批次大小] \ --model_args '[JSON格式参数]'其中model_args是最关键的部分,需要根据你的服务情况配置:
{ "model": "你的模型名", "base_url": "API服务地址", "num_concurrent": 并发数 }举个例子,如果你部署的是Qwen-8B模型,服务地址是http://localhost:8000/v1/completions,想用8个并发测试,那么配置应该是:
{ "model": "Qwen/Qwen3-8B-FP8", "base_url": "http://localhost:8000/v1/completions", "num_concurrent": 8 }4. 选择评测任务
lm_eval支持多种评测任务,对于刚上线的服务,建议从这些开始:
4.1 MMLU综合评测
MMLU(Massive Multitask Language Understanding)是评估模型多任务理解能力的标准测试集,包含57个学科领域的问题:
lm_eval \ --model local-completions \ --tasks mmlu \ --batch_size 8 \ --model_args '{"model": "Qwen/Qwen3-8B-FP8", "base_url": "http://localhost:8000/v1/completions", "num_concurrent": 8}'4.2 MMLU子任务评测
如果只想测试特定领域,MMLU支持细分评测:
| 子任务类别 | 包含领域示例 |
|---|---|
| mmlu_stem | 数学、物理、化学等STEM学科 |
| mmlu_humanities | 历史、哲学、法律等人文学科 |
| mmlu_social_sciences | 心理学、经济学、政治学等社会科学 |
| mmlu_other | 商业、健康等其他领域 |
例如,单独测试STEM学科:
lm_eval \ --model local-completions \ --tasks mmlu_stem \ --batch_size 8 \ --model_args '{"model": "Qwen/Qwen3-8B-FP8", "base_url": "http://localhost:8000/v1/completions", "num_concurrent": 4}'4.3 GSM8K数学题评测
对于需要数学推理能力的场景,GSM8K是个好选择:
lm_eval \ --model local-completions \ --tasks gsm8k \ --batch_size 4 \ --model_args '{"model": "Qwen/Qwen3-8B-FP8", "base_url": "http://localhost:8000/v1/completions", "num_concurrent": 4}'5. 解读评测结果
评测完成后,你会看到类似这样的输出(以MMLU为例):
| Task | Version | Metric | Value | | Stderr | |-------|---------|--------|-------|---|--------| | mmlu | 0 | acc | 0.556 | ± | 0.003 | | mmlu_stem | 0 | acc | 0.519 | ± | 0.006 | | mmlu_humanities | 0 | acc | 0.587 | ± | 0.005 |关键指标说明:
- acc:准确率,越高越好
- Stderr:标准误差,反映结果的稳定性
- ±后的数值:表示结果的波动范围
6. 高级技巧与优化
6.1 并发数调优
num_concurrent参数对评测结果影响很大。建议采用阶梯测试法:
- 从较低并发开始(如4)
- 逐步增加(8,16,32...)
- 观察两个指标:
- 准确率是否下降
- 请求失败率是否上升
找到准确率开始明显下降的临界点,那就是你服务的合理并发上限。
6.2 批量大小调整
batch_size影响评测效率,但设置过大可能导致OOM。经验值:
| 模型规模 | 推荐batch_size |
|---|---|
| 7B以下 | 8-16 |
| 13B | 4-8 |
| 70B | 1-2 |
6.3 自定义评测集
除了预设任务,你还可以创建自己的评测集。基本步骤:
- 准备JSON格式的测试文件
- 按照lm_eval的规范定义任务
- 通过
--tasks参数指定你的任务名
7. 常见问题排查
在实际使用中,可能会遇到这些问题:
- 连接被拒绝:检查服务是否真的在指定端口运行
- 超时错误:尝试增加超时时间(在model_args中添加
"timeout": 60) - 结果不稳定:可能是并发太高,尝试降低
num_concurrent - 内存不足:减小
batch_size或使用更小的评测集
有一次我在测试70B模型时,发现准确率异常低。经过排查,发现是服务端没有正确加载适配器权重。这种问题只有通过系统评测才能发现,简单的API调用测试很容易遗漏。
