ARTICLE · INTELLIGENCE

战地情报 · 详情页

来自尧图项目组的一线实战观察与深度解析

Qwen2.5 数学评测全流程指南:基于 unilm 仓库 qwen25math 评测套件的环境搭建、模型评估与源码原理解析

Qwen2.5 数学评测全流程指南:基于 unilm 仓库 qwen25math 评测套件的环境搭建、模型评估与源码原理解析 Qwen2.5 数学评测全流程指南基于 unilm 仓库 qwen25math 评测套件的环境搭建、模型评估与源码原理解析【免费下载链接】unilmLarge-scale Self-supervised Pre-training Across Tasks, Languages, and Modalities项目地址: https://gitcode.com/GitHub_Trending/un/unilm导读本篇文章围绕 unilm 仓库中 qwen25math 评测套件 展开系统讲解 Qwen2.5-Math-Instruct / Qwen2-Math-Instruct 系列模型在数学基准上的完整评测流程从依赖安装、环境校验到一键化评估脚本再到答案解析、程序执行与数学等价判定等底层原理。读完本文你将能够独立复现 Qwen 数学模型的评测实验理解每一行命令背后的源码机制并能将这套评测逻辑复用到其他数学大模型的横向对比中。该评测套件在 PFPOProcess-Feedback Preference Optimization过程反馈偏好优化项目中被复用为核心后处理与打分模块是验证数学推理模型能力的标准化工具。环境安装与依赖准备安装步骤与版本要点按照 README 的说明评测环境需要依次完成四步安装cd latex2sympy pip install -e . cd .. pip install -r requirements.txt pip install vllm0.5.1 --no-build-isolation pip install transformers4.42.3各步骤的作用与注意事项如下latex2sympy评测链路中数学表达式解析LaTeX → SymPy的关键依赖需以可编辑模式安装。该库在 grader.py 与 parser.py 中均有直接引用from latex2sympy2 import latex2sympy用于将模型输出的 LaTeX 公式转换为可计算的符号表达式。requirements.txt仓库提供了完整的依赖清单见 requirements.txt核心依赖如下依赖包用途备注vllm高吞吐推理引擎评测默认推理后端tqdm / datasets / torch进度、数据加载与张量计算基础运行库transformers模型与分词器加载需配合版本4.42.3python_dateutil日期计算PythonExecutor 日期运行时使用flash_attnFlash Attention 加速可选加速项sympy1.12符号运算数学等价判定核心antlr4-python3-runtime4.11.1LaTeX 语法解析必须与 sympy 版本兼容word2number英文数字转阿拉伯数字答案清洗用Pebble多进程池并行评测打分timeout-decorator超时控制代码执行保护vllm0.5.1README 明确要求固定版本并加--no-build-isolation参数避免构建隔离导致的依赖冲突。vllm 在 math_eval.py 中通过LLM与SamplingParams提供批量生成能力。transformers4.42.3与 vllm 0.5.1 配套的分词器版本评测中用于加载 Qwen 系列模型与构造 Chat 模板详见后文apply_chat_template机制。环境校验小实验安装完成后可通过 grader.py 内置的自测函数验证数学等价判定是否正常工作python grader.py # 运行 _test_math_equal python parser.py # 运行 _test_extract_answer_test_math_equal中预设了math_equal(x1, x2n1, timeoutTrue)等多组对照用例若全部按预期输出布尔结果则说明 latex2sympy、sympy 与 antlr4 运行时版本兼容无误。一键评估 Qwen 数学模型支持的模型系列与命令模板README 给出了 Qwen2.5 与 Qwen2 两大系列、六个规格模型的评估命令统一通过sh/eval.sh脚本驱动核心参数为提示词类型PROMPT_TYPE与模型路径MODEL_NAME_OR_PATH# Qwen2.5-Math-Instruct Series建议使用 qwen25-math-cot 提示词 PROMPT_TYPEqwen25-math-cot export CUDA_VISIBLE_DEVICES0 MODEL_NAME_OR_PATHQwen/Qwen2.5-Math-1.5B-Instruct bash sh/eval.sh $PROMPT_TYPE $MODEL_NAME_OR_PATH模型规格显卡分配CUDA_VISIBLE_DEVICES适用提示词类型Qwen2.5-Math-1.5B-Instruct单卡0qwen25-math-cotQwen2.5-Math-7B-Instruct单卡0qwen25-math-cotQwen2.5-Math-72B-Instruct四卡0,1,2,3qwen25-math-cotQwen2-Math-1.5B-Instruct单卡0qwen-boxedQwen2-Math-7B-Instruct单卡0qwen-boxedQwen2-Math-72B-Instruct四卡0,1,2,3qwen-boxed说明MODEL_NAME_OR_PATH既可以是 Hugging Face 模型标识如Qwen/Qwen2.5-Math-1.5B-Instruct也可以是本地权重路径72B 大模型需将CUDA_VISIBLE_DEVICES扩展为多卡编号列表供 vllm 做张量并行切分。两种提示词模板的差异qwen25-math-cot与qwen-boxed分别对应 Qwen2.5 与 Qwen2 两代模型的官方推理风格其模板定义在 utils.py 的PROMPT_TEMPLATES字典中qwen25-math-cotutils.py系统消息为Please reason step by step, and put your final answer within \boxed{}.采用 ChatML 格式|im_start|/|im_end|要求模型逐步推理并用\boxed{}包裹最终答案。qwen-boxedutils.py同样为 ChatML 格式但系统提示为通用 assistant 描述\boxed{}要求被并入用户消息尾部。二者都会触发 math_eval.py 中的stop_token_ids[151645, 151643]对应 Qwen2/2.5 的|im_end|与|endoftext|特殊 token确保生成在正确位置截断。评测主入口参数全解eval.sh最终调用评测主程序 math_eval.py其parse_argsmath_eval.py暴露了全部可调参数参数默认值说明--data_namesgsm8k,math评测数据集逗号分隔可同时跑多个--data_dir./data数据存放目录--model_name_or_pathgpt-4待评测模型路径或标识--output_dir./output结果输出目录--prompt_typetool-integrated提示词模板类型--splittest数据集划分--num_test_sample-1采样条数-1 表示全量--seed0随机种子--start/--end0/-1样本区间切片--temperature0采样温度0 为贪心解码--n_sampling1每个问题采样次数用于 passk / majk--top_p1核采样参数温度非 0 时生效--max_tokens_per_call2048单次生成最大 token 数--shuffleFalse是否随机打乱样本--use_vllmFalse是否启用 vllm 推理后端--save_outputsFalse是否保存预测结果 jsonl--overwriteFalse是否覆盖已处理样本--use_safetensorsFalse是否用 safetensors 加载权重--num_shots0Few-shot 示例数0 为 zero-shot--apply_chat_templateFalse是否应用 Chat 模板--pipeline_parallel_size1流水线并行度--adapt_few_shotFalse多选题用 few-shot、其余 zero-shot两个关键联动逻辑值得注意top_p强制约束当temperature 0时代码自动将top_p置为 1vllm 贪心解码要求见 math_eval.py。断点续跑prepare_data会扫描输出目录中同前缀的 jsonl 并去重processed_idxs之外的样本才会重新推理math_eval.py评测中断后可无缝续跑。数据加载与持久化数据由 data_loader.py 的load_data统一管理优先读取data_dir/data_name/split.jsonl本地缓存缓存不存在时通过datasets库从 Hugging Face 拉取如competition_math、gsm8k、ChilleD/SVAMP、EleutherAI/asdiv、hails/mmlu_no_train等并自动to_json落盘缓存mawps 由 singleeq / singleop / addsub / multiarith 四个子任务合并而来所有样本统一补充idx字段并按 idx 排序。模型加载与多轮工具式推理setupmath_eval.py根据CUDA_VISIBLE_DEVICES自动计算 vllm 的tensor_parallel_size与pipeline_parallel_size并加载 Chat 分词器。核心推理循环math_eval.py采用最多 4 轮max_func_call4的推理-写码-执行-反馈迭代首轮构造完整 prompt含 few-shot 示例与系统模板vllm 或 HF 后端批量生成按stop_words截断[/s, |im_end|, |endoftext|]及针对各 prompt_type 的附加词若输出包含\boxed{}或未以结尾则视为解答结束否则从中抽取 Python 程序extract_program程序交由PythonExecutor执行执行结果以\noutput\n...\n\n形式回填进对话进入下一轮达到最大调用轮数时追加Reach max function call limit.结束迭代。这种写代码 看执行反馈的迭代范式对应 README 提及的 tool-integrated / PAL 类提示词prompt_type pal时还会把执行结果用\boxed{...}包裹math_eval.py。结果解析与打分原理答案抽取extract_answer 与 strip_string模型输出是自由文本必须从中提取可比较的规范答案。这一过程由 parser.py 完成extract_answerparser.py按优先级识别答案形态final answer is $...$minerva 风格→\boxed{...}→the answer is/final answer is/答案是中文→ 兜底取最后一个数字use_last_numberTrue时strip_stringparser.py做深度规范化去除\left/\right、统一\frac/\dfrac/\tfrac、bmatrix→pmatrix、移除单位词表unit_texts主要来自 MathQA、百分号、美元符号、\text{}包裹英文数字转阿拉伯数字word2number修正a/b为\frac{a}{b}等parse_ground_truthparser.py按data_name区分真实答案的解析方式MATH/minerva 从solution抽取、GSM8K 按####切分、SVAMP 取Equation/Answer字段、mmlu_stem 取 ABCD 索引、tabmwp 按 ans_type 转换数值分数/千分位/百分比等。数学等价判定math_equal 与符号化简grader.py 实现了严格的数学等价判定函数math_equalgrader.py判定预测 参考成立需满足以下任一条件字符串完全一致忽略大小写选择题答案参考为 A–E 时走choice_answer_clean归一化数值相等双方可转 float 时include_percentageTrue会同时比较参考/100、参考、参考*100三种形态容忍相对误差rel_tol1e-4numeric_equal符号相等通过symbolic_equal依次尝试parse_latex/parse_expr/latex2sympy解析再做直接相等、simplify(a-b)0、方程两侧之差、数值近似N()与矩阵逐元素比较特殊结构pmatrix矩阵、区间[a,b]/(a,b)、单侧x...等式等均递归判定超时保护timeoutTrue时通过多进程call_with_timeout限制符号化简在 1 秒内完成防止复杂表达式卡死评测。evaluateevaluate.py将全部(idx, pred, gt)三元组交给 Pebble 进程池ProcessPool(max_workers1)并行判定单样本 3 秒超时最终输出acc首列均值与按type聚合的type_acc细分精度。Python 程序执行器python_executor.py 提供安全的代码执行能力GenericRuntime用受限exec执行程序检测到input(即抛异常防止交互式阻塞DateRuntime/ColorObjectRuntime分别注入 datetime 与自定义 dict 运行时适配日期类与颜色类题目PythonExecutor.execute支持四种取答案方式get_answer_from_stdout捕获 print 输出、answer_symbol读全局变量、answer_expr求值表达式、或执行末行表达式结果统一做pickle序列化校验并truncate(400)截断执行带 5 秒默认超时timeout_length超时返回(, Timeout Error)。轨迹解析text_to_trajectorytrajectory.py 实现推理文本 ↔ 结构化轨迹的互转将交错出现的python程序块与output输出块解析为[{role: rationale|program|output, content: ...}]序列extract_program还能在程序执行失败时仅保留 import 行、合并多次修正后的程序、剔除调试用print还原出可运行代码。评测套件在 PFPO 项目中的工程化复用qwen25math 评测逻辑并非孤立工具而是深度嵌入了 PFPO 的训练-评测闭环qwen25_math_callback.py作为OpenAICallBack子类在 vllm 推理产出后立即调用extract_answerstrip_string清洗预测list类型响应自动做多数投票majority_voting_predict得到sc_pred打分阶段用线程池并发调用math_equal最终输出acc、passk、majk及按data_topic细分的主题精度qwen25_math_callback.py。PFPO/README.md明确建议采用 sympy 方式做更精确的评测并给出了独立打分脚本的调用方式python scripts/math_scale/qwen25math_style_eval_v2.0.py --input_file $prediction_file_path数据集侧PFPO 的conf/api与conf/exp下大量 yaml 配置引用该评测管线配合 vllm 推理脚本vllm_inference.py、vllm_inference_dp.py形成批量推理 → 数学打分 → 偏好训练的标准工作流。常见问题与调参建议场景建议复现 README 原始评测严格按 README 安装vllm0.5.1transformers4.42.3使用对应系列的 PROMPT_TYPE追求更高精度判定保持timeoutTrue符号化简并确保sympy1.12与antlr4-python3-runtime4.11.1版本匹配大批量采样评测设--n_sampling 4并配合--save_outputs从 metrics 中读取passk与majk评测中断续跑保持--output_dir不变且不设--overwrite脚本自动跳过已处理 idx多卡大模型将全部 GPU 编号写入CUDA_VISIBLE_DEVICESvllm 自动做张量并行结果异常如大量超时检查evaluate返回的timeout_samples与empty_samples字段定位空预测或符号化简卡死样本总结qwen25math 评测套件以 README 为入口提供了一条环境安装 → 一键评估 → 结果解析的完整链路上层由sh/eval.sh与 math_eval.py 驱动多轮工具式推理中层由 python_executor.py 与 trajectory.py 负责代码执行与轨迹还原底层由 parser.py 与 grader.py 完成答案抽取与数学等价判定。这套设计既保证了 Qwen 数学模型评测结果的可复现性与公平性也被 PFPO 项目无缝复用于过程反馈偏好优化的数据生成与训练评估环节是数学推理模型研发流程中值得直接借鉴的标准化评测基建。【免费下载链接】unilmLarge-scale Self-supervised Pre-training Across Tasks, Languages, and Modalities项目地址: https://gitcode.com/GitHub_Trending/un/unilm创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
RELATED READING

延伸阅读

更多一线实战笔记与深度复盘,助您持续精进