当前位置: 首页 > news >正文

在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 ]; thenecho "服务启动成功!"
elseecho "服务启动失败,请检查日志"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 OpenAIclient = 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},
http://www.jsqmd.com/news/447353/

相关文章:

  • LangFlow实战:5分钟用FastAPI+React搭建你的第一个AI工作流(附避坑指南)
  • 基于nodejs的污泥图像库图片发布分享系统的设计与实现
  • 从enum到enum class:手把手教你改造遗留C++代码(含性能对比测试)
  • 5分钟搞定!Docker+Ubuntu 22.10快速搭建内网DNS服务器(附端口冲突解决方案)
  • ADS实战:5分钟搞定多频段阻抗匹配(附Smith圆图技巧)
  • 4K/8K视频开发者必看:如何正确计算不同分辨率下的HDMI带宽需求
  • 从振动数据到动画展示:手把手教你用ODS分析机械结构变形
  • Workqueue调试指南:如何用ftrace揪出CPU占用100%的kworker
  • CISCO策略路由避坑指南:当route-map遇到ACL时的6种行为模式全解析
  • Unity Addressable资源管理进阶:如何高效利用标签和预加载优化性能
  • Dyna-Q算法实战:用Python模拟悬崖漫步环境(附完整代码)
  • 线性代数实战:如何用Python快速验证矩阵迹与特征值的关系
  • 提示工程架构师指南:用Agentic AI实现公交智能排班系统
  • VS2019项目重命名全攻略:从解决方案到命名空间一键搞定
  • 实用指南:使用Scikit-learn构建你的第一个机器学习模型
  • Ubuntu22.04上iRedMail邮件服务器搭建全攻略:从下载到配置的避坑指南
  • Scrutor隐藏技巧:用装饰器模式给.NET Core服务加日志竟如此简单
  • 初中物理必看:用几何相似三角形轻松搞定凸透镜成像公式推导
  • Simscape模型共享避坑手册:如何打包你的仿真文件才不会让队友踩到路径雷?
  • MySQL聚合函数避坑指南:为什么你的SUM()结果总是不对?
  • Docker离线部署OpenWebUI全流程指南:从镜像迁移到数据卷备份
  • MATLAB新手必看:5分钟搞定Simulink Buck变换器开环仿真(附参数设置截图)
  • 别再复制粘贴了!用OpenSSL生成自签名证书的5个专业技巧(2023最新版)
  • 完整教程:(77页PPT)健康医疗大数据整体规划方案(附下载方式)
  • 用MATLAB玩转语音变声:从频谱分析到GUI界面设计的完整实战指南(附源码)
  • WPF Frame控件实战:5分钟搞定页面跳转与传参(附完整代码示例)
  • 科技写作避坑指南:从选题到发表的完整流程解析
  • 工业控制新组合:用CODESYS+OneOS实现EtherCAT总线控制的完整流程
  • Avalonia跨平台实战:如何让你的.NET应用在Linux下跑起来(含独立发布技巧)
  • Linux多线程编程避坑指南:读写锁的7个常见错误用法及正确姿势