在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

image

方式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,平衡速度与稳定性。

image

方式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

image

五、结果查看与分析

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/

数据集概览:

通过旭日图和表格,直观展示模型在所有评测数据集上的整体表现。旭日图的每一层分别代表数据集、类别和子集,扇区大小表示样本量,颜色深浅表示得分高低。

image

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

示例:arc 数据集详情


数据集详情

image

此时我们本次评测已完成,细心的小伙伴会发现命令行执行和脚本执行评测的结果不一样,尤其是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
    },
posted @ 2026-03-07 21:51  alias_ljx  阅读(3)  评论(0)    收藏  举报