在A100-40GB环境下使用EvalScope+vLLM评测Qwen3-4B模型的完整实践指南
一、环境准备
1.1 系统要求
操作系统:Linux(Ubuntu 22.04)- 云机器
显卡:NVIDIA A100 40GB(可用显存40GB)
CUDA版本:12.8+
显存需求:至少20GB可用显存(40GB显卡完全满足)
评测模型:Qwen3-4B-Instruct-2507 (Qwen/Qwen3-4B-Instruct-2507)
评测数据集:GSM8K(数学推理)、ARC(科学推理)
评测框架:EvalScope v0.0.0_dev(源码安装)
推理框架:vLLM(推荐)/ Transformers
1.2 检查CUDA环境
# 检查CUDA版本
nvidia-smi
# 检查CUDA是否安装
nvcc --version
# 检查Python版本
python --version
实际输出示例:
1.3 创建Conda虚拟环境
# 创建conda环境(Python 3.10)
conda create -n evalscope python=3.10 -y
# 激活环境
conda activate evalscope
# 验证Python版本
python --version
实际输出:
Python 3.10.19
1.4 下载EvalScope源码
# 进入工作目录
cd /root
# 克隆EvalScope仓库
git clone https://github.com/modelscope/evalscope.git
# 进入项目目录
cd evalscope
# 查看当前分支
git branch
# 切换到最新稳定分支(可选)
# git checkout main
1.5 安装EvalScope依赖
方式1:安装基础依赖(推荐)
# 安装基础框架依赖
pip install -e .
# 安装性能压测依赖(可选)
pip install -e '.[perf]'
# 安装可视化依赖(可选)
pip install -e '.[app]'
方式2:安装所有依赖
pip install -e '.[all]'
验证安装:
# 检查evalscope是否安装成功
python -c "import evalscope; print(f'EvalScope版本: {evalscope.__version__}')"
# 检查命令行工具
evalscope --help
实际输出:
EvalScope版本: 0.0.0_dev
二、vLLM安装与配置
选择原因:
2.1 安装vLLM
重要:vLLM版本与CUDA版本必须严格对应!
根据当前的环境(CUDA 12.8 + Driver 570.133.20),推荐以下版本组合:
版本对应关系(关键!)
| CUDA版本 | Driver要求 | vLLM版本 | PyTorch版本 | Python版本 |
|---|
| 12.8 | ≥570 | v0.12.0 | 2.9.0+cu128 | 3.10-3.12 |
| 12.8 | ≥570 | v0.11.1/v0.11.2 | 2.9.0+cu128 | 3.10-3.12 |
| 12.4 | ≥550 | v0.9.2 | 2.5.0+cu124 | 3.9-3.12 |
| 11.8 | ≥470 | v0.6.x | 2.2.0+cu118 | 3.9-3.12 |
推荐安装方式(最新稳定版)
# 安装PyTorch 2.9.0 (CUDA 12.8)
pip install torch==2.9.0 torchvision torchaudio --index-url https://download.pytorch.org/whl/cu128
# 安装vLLM v0.12.0(最新稳定版,支持CUDA 12.8)
pip install vllm==0.12.0 --extra-index-url https://download.pytorch.org/whl/cu128
验证vLLM安装:
python -c "import vllm; print(f'vLLM版本: {vllm.__version__}')"
预期输出:
vLLM版本: 0.12.0
2.2 vLLM配置说明
关键参数说明:
| 参数 | 说明 | 推荐值(A100-40GB) |
|---|---|---|
| --gpu-memory-utilization | GPU显存利用率 | 0.85-0.90(40GB显存充足) |
| --max-model-len | 最大上下文长度 | 8192(40GB显存推荐值) |
| --tensor-parallel-size | 张量并行大小 | 1(单卡) |
| --port | 服务端口 | 8801(自定义) |
| --served-model-name | 服务模型名称 | Qwen3-4B |
| --trust-remote-code | 信任远程代码 | 必须添加 |
三、模型准备
3.1 Qwen3 系列模型概览
-
发布时间: 2025年4月29日
-
模型组成: 2个MoE模型 + 6个密集模型。Qwen3-235B-A22B - 旗舰级MoE模型,Qwen3-30B-A3B - 小型MoE模型,Qwen3-0.6B、Qwen3-1.7B、Qwen3-4B - 中等规模模型(性能媲美Qwen2.5-72B)、Qwen3-8B(支持128K上下文)、Qwen3-14B (支持128K上下文)、Qwen3-32B (支持128K上下文)。
-
核心技术突破:
-
混合思考模式: 首创将思考模式和非思考模式集成在同一模型中
-
预训练数据: 36万亿tokens,是Qwen2.5的2倍,支持119种语言
-
Agent能力优化: 原生支持MCP协议,强大的工具调用能力
-
多语言支持: 覆盖119种语言和方言
-
3.2 Qwen3-4B 模型介绍:
-
类型:因果语言模型
-
训练阶段:预训练 & 后训练
-
参数数量:40 亿
-
非嵌入参数数量:36 亿
-
层数:36 层
-
注意力头数(GQA):Q 为 32 个,KV 为 8 个
-
上下文长度:原生 32,768 和 使用 YaRN 的 131,072 个令牌。
3.3 模型选择:
由于显卡只有 40G 的原因,本次选择4B模型评测。
3.4 模型下载
方式1:使用ModelScope自动下载
EvalScope和vLLM会自动从ModelScope下载模型,无需手动操作。
方式2:手动下载模型-推荐
# 安装ModelScope
pip install modelscope
# 下载模型
modelscope download --model Qwen/Qwen3-4B --local_dir /root/model/qwen3-4b
3.5 验证模型文件
# 查看模型文件结构
ls -lh /root/model/qwen3-4b/
# 预期文件列表
# config.json
# model.safetensors.index.json
# model-00001-of-00004.safetensors
# model-00002-of-00004.safetensors
# model-00003-of-00004.safetensors
# model-00004-of-00004.safetensors
# tokenizer.json
# tokenizer_config.json
# vocab.json
# merges.txt
四、评测方案
4.1 数据集说明
GSM8K & ARC 数据集对比表
| 项目 | GSM8K 数据集 | ARC 数据集 |
|---|---|---|
| 全称 | Grade School Math 8K | AI2 Reasoning Challenge |
| 描述 | 小学数学应用题,评估模型的数学推理能力 | 科学考试多选题,包含两个子集 |
| 任务类型 | 数学应用题(自由生成) | 科学多选题(四选一 / 三选一) |
| Few-shot | 默认 4-shot | 默认 0-shot |
| 输入形式 | 自然语言问题 + 要求分步解答 | 自然语言问题 + ABCD 选项 |
| 典型 Prompt 模板 | 请解决下面数学题,给出详细步骤和最终答案。问题:{question}答案: | 问题:{question}A. {A}B. {B}C. {C}D. {D}请直接输出答案字母: |
| 模型输出要求 | 输出完整推理过程 + 最终数值答案 | 只输出:A/B/C/D 或 (A) 这类格式 |
| 答案提取方式 | 从输出中抽取最后数值 | 从输出中抽取第一个出现的选项字母 |
| 评测指标 | 准确率(Accuracy) | 准确率(Accuracy) |
| 得分计算 | 预测答案 == 标准答案 → 正确,否则错误 | 预测字母 == 标准答案字母 → 正确,否则错误 |
| 测试集规模 | 1,319 题 | ARC-Easy:2,376 题 ARC-Challenge:1,172 题 |
| ModelScope ID | AI-ModelScope/gsm8k | allenai/ai2_arc |
4.2 使用vLLM部署评测(推荐)
步骤1:启动vLLM服务
创建启动脚本 `start_vllm_server.sh`:
#!/bin/bash
# 设置环境变量
export VLLM_USE_MODELSCOPE=True
export CUDA_VISIBLE_DEVICES=0
# 启动vLLM服务(A100-40GB优化配置)
nohup vllm serve Qwen/Qwen3-4B-Instruct-2507 \
--gpu-memory-utilization 0.85 \
--served-model-name Qwen3-4B \
--trust-remote-code \
--port 8801 \
--max-model-len 8192 \
--dtype auto \
> vllm_server.log 2>&1 &
echo $! > vllm_server.pid
echo "vLLM服务已启动,PID: $(cat vllm_server.pid)"
echo "日志文件: vllm_server.log"
echo "等待服务启动..."
sleep 30
# 检查服务是否启动
curl -s http://127.0.0.1:8801/health
if [ $? -eq 0 ]; then
echo "服务启动成功!"
else
echo "服务启动失败,请检查日志"
tail -n 50 vllm_server.log
fi
运行启动脚本:
chmod +x start_vllm_server.sh
./start_vllm_server.sh
步骤2:验证vLLM服务
使用curl测试:
curl http://127.0.0.1:8801/v1/models
预期输出:
{
"object": "list",
"data": [
{
"id": "Qwen3-4B",
"object": "model",
"created": 1772689045,
"owned_by": "vllm",
"root": "/root/share/new_models/qwen3/Qwen3-4B",
"parent": null,
"max_model_len": 8192,
"permission": [
{
"id": "modelperm-9e54692cf447e7ce",
"object": "model_permission",
"created": 1772689045,
"allow_create_engine": false,
"allow_sampling": true,
"allow_logprobs": true,
"allow_search_indices": false,
"allow_view": true,
"allow_fine_tuning": false,
"organization": "*",
"group": null,
"is_blocking": false
}
]
}
]
}
使用Python测试:
from openai import OpenAI
client = OpenAI(
api_key="EMPTY",
base_url="http://127.0.0.1:8801/v1"
)
response = client.chat.completions.create(
model="Qwen3-4B",
messages=[
{"role": "user", "content": "你好,请介绍一下你自己。"}
],
max_tokens=50
)
print(response.choices[0].message.content)
步骤3:执行评测
方式1:命令行评测(快速测试)
# 快速测试(每个数据集评测前10条)
evalscope eval \
--model Qwen3-4B \
--api-url http://127.0.0.1:8801/v1 \
--api-key EMPTY \
--eval-type openai_api \
--datasets gsm8k arc \
--limit 10
10分钟后评测完成,终端会打印出如下格式的得分报告:
./outputs/20260305_133951

方式2:命令行评测(完整评测)
# 完整评测(无limit限制)
evalscope eval \
--model Qwen3-4B \
--api-url http://127.0.0.1:8801/v1 \
--api-key EMPTY \
--eval-type openai_api \
--datasets gsm8k arc \
--eval-batch-size 16
> 注意:A100-40GB显存充足,可以将`--eval-batch-size`设置为8-12,平衡速度与稳定性。

方式3:使用Python脚本评测
创建评测脚本 run_eval_vllm.py:
#!/usr/bin/env python
# -*- coding: utf-8 -*-
"""
Qwen3-4B模型评测脚本
使用vLLM部署的API服务进行评测
"""
from evalscope.run import run_task
from evalscope.config import TaskConfig
from evalscope.constants import EvalType
# 评测配置
task_cfg = TaskConfig(
# 模型配置
model='Qwen3-4B',
api_url='http://127.0.0.1:8801/v1',
api_key='EMPTY',
eval_type=EvalType.SERVICE, # 使用SERVICE表示OpenAI API服务
# 数据集配置
datasets=['gsm8k', 'arc'],
# 评测配置
eval_batch_size=8, # A100-40GB推荐并发数
# 数据集参数(可选)
dataset_args={
'gsm8k': {
'few_shot_num': 4,
'few_shot_random': False
},
'arc': {
'subset_list': ['ARC-Easy', 'ARC-Challenge']
}
},
# 生成参数(可选)
generation_config={
'temperature': 0.0,
'max_tokens': 2048,
'do_sample': False
},
# 快速测试(可选)
# limit=10
)
# 执行评测
print("开始评测...")
print(f"模型: {task_cfg.model}")
print(f"数据集: {task_cfg.datasets}")
print(f"评测类型: {task_cfg.eval_type}")
print("-" * 50)
run_task(task_cfg=task_cfg)
print("评测完成!")
运行评测脚本:
python run_eval_vllm.py

五、结果查看与分析
5.1 评测结果位置
评测完成后,结果保存在 outputs/ 目录下,目录名以时间戳命名(格式:YYYYMMDD_HHMMSS):
outputs/
└── 20260305_152251/ # 时间戳目录
│
├── configs/ # 评测配置目录
│ └── task_config.json # 完整的评测任务配置(可用于复现)
│
├── logs/ # 运行日志目录
│ ├── eval.log # 评测主日志
│ └── *.log # 各数据集评测日志
│
├── predictions/ # 模型预测结果目录
│ └── <model_name>/ # 模型名称
│ └── <dataset_name>/ # 数据集名称
│ └── predictions.jsonl # 模型对每个样本的原始输出
│
├── reviews/ # 评测审查目录(评分详情)
│ └── <model_name>/ # 模型名称
│ └── <dataset_name>/ # 数据集名称
│ └── reviews.jsonl # 每个样本的评分详情
│
└── reports/ # 最终评测报告目录
└── <model_name>/ # 模型名称
└── <dataset_name>/ # 数据集名称
└── report.json # 最终评测报告(准确率等指标)
5.2 关键文件内容示例
predictions.jsonl - 模型预测结果
每行一个 JSON 对象,记录模型对单个样本的预测:
{"id": "gsm8k_001", "input": "Janet's ducks lay 16 eggs per day...", "prediction": "18", "raw_output": "The answer is 18."}
{"id": "gsm8k_002", "input": "A robe takes 2 bolts of blue fiber...", "prediction": "6", "raw_output": "The answer is 6."}
reviews.jsonl - 评分详情
每行一个 JSON 对象,记录单个样本的评分:
{"id": "gsm8k_001", "prediction": "18", "gold": "18", "score": 1.0, "correct": true}
{"id": "gsm8k_002", "prediction": "6", "gold": "8", "score": 0.0, "correct": false}
report.json - 最终评测报告
包含该数据集的最终评测指标:
{
"task_name": "gsm8k",
"model_name": "Qwen3-4B",
"score": 0.7825,
"metrics": {
"accuracy": 0.7825
},
"total_samples": 1319,
"correct_samples": 1032,
"eval_time": "2026-03-05 15:22:51"
}
5.3 查看评测结果
方式1:查看控制台输出
方式2:查看最终评测报告
# 查看 GSM8K 评测报告
cat outputs/20260305_152251/reports/Qwen3-4B/gsm8k/report.json | python -m json.tool
5.4 可视化评测结果
步骤1:安装可视化依赖
pip install 'evalscope[app]'
步骤2:启动可视化界面
evalscope app
预期输出:
Running on local URL: http://127.0.0.1:7860
在浏览器中打开 http://127.0.0.1:7860,即可查看可视化的评测结果。
需要我们输入报告地址,比如:/root/evalscope/outputs/
数据集概览:
通过旭日图和表格,直观展示模型在所有评测数据集上的整体表现。旭日图的每一层分别代表数据集、类别和子集,扇区大小表示样本量,颜色深浅表示得分高低。

数据集详情:选择特定数据集后,可以查看模型在该数据集上不同指标和子集的分数。您还可以进一步筛选,查看每个样本的详细输入(Input)、模型输出(Generated)、标准答案(Gold)和最终得分(Score)。
示例:arc 数据集详情
数据集详情

此时我们本次评测已完成,细心的小伙伴会发现命令行执行和脚本执行评测的结果不一样,尤其是gsm8k数据集,命令行执行的得分是0.9378,脚本执行评测的得分是0.8582;原因是:评测时的参数不同,脚本执行评测时设置了如下参数,大家在评测时需要特别注意参数的变动。
dataset_args={
'gsm8k': {
'few_shot_num': 4,
'few_shot_random': False
},
'arc': {
'subset_list': ['ARC-Easy', 'ARC-Challenge']
}
},
# 生成参数(可选)
generation_config={
'temperature': 0.0,
'max_tokens': 2048,
'do_sample': False
},
本文详细介绍了在A100-40GB云机器上使用EvalScope评测框架结合vLLM推理引擎对Qwen3-4B模型进行系统评测的完整流程。评测覆盖GSM8K数学推理和ARC科学推理两大数据集,全面评估模型的多步逻辑推理与科学知识掌握能力。
浙公网安备 33010602011771号