资讯详情 MindSpeed-LLM 的 GSM8K 数学推理评估实战:直接评估与 Chain-of-Thought 模式详解
📅 2026/10/15 15:20:54
人工智能大模型分布式训练预训练微调模型推理服务强化学习Ascend【免费下载链接】MindSpeed-LLM昇腾LLM分布式训练框架项目地址https://gitcode.com/Ascend/MindSpeed-LLM点击查看免费下载GSM8KGrade School Math 8K是衡量大语言模型多步数学推理能力的主流基准数据集。本文基于 MindSpeed-LLM 仓库中 GSM8K 评估文档 展开结合 gsm8k_eval.py 等源码实现系统讲解 MindSpeed-LLM 内置的两种 GSM8K 评估模式直接评估与 CoT 思维链评估的调用方式、推荐参数、底层评测流程与答案后处理逻辑帮助读者在昇腾环境中快速复现并理解数学推理能力评测。GSM8K 基准概述问题描述GSM8K数据集包含 8,500 道高质量、语言多样的小学数学应用题word problems由 OpenAI 团队于 2021 年发布详见文末参考文献。该数据集专门服务于需要多步推理的基础数学问答任务是评估模型算术推理、逻辑链生成能力的事实标准之一。在 MindSpeed-LLM 的基准支持列表中GSM8K 与 MMLU、CEval、BoolQ、BBH、AGIEval、HumanEval、CMMLU、HellaSwag、NeedleBench 并列共同构成公开基准评测体系见 models_evaluation.md 中的支持基准表。数据集特点GSM8K 评测集重点关注以下两个维度多步推理每道题通常需要2 至 8 步才能求解。解题过程主要依赖按顺序执行一系列简单计算并运用加、减、乘、除等基本算术运算得到最终答案。自然语言解题过程解题过程以自然语言形式描述而非简单的数学表达式因此模型不仅需要算对还需要说清楚推理过程这对模型的生成式推理能力提出了更高要求。MindSpeed-LLM 仓库目前为 GSM8K 提供了两种评测模式下文逐一展开。模式一直接评估模式默认工作原理直接评估模式是 MindSpeed-LLM 的默认 GSM8K 评测方式。其核心思路是将3-shot 少样本模板提示词与待回答问题拼接后送入模型进行生成评测。从源码实现看该拼接逻辑位于 gsm8k_eval.py 的Gsm8kEval类中class Gsm8kEval(DatasetEval): def __init__(self, test_dir, eval_args, instruction_template{fewshot_template}\n\n{question}, output_templaterThe answer is (.*?) ): ...在eval()方法中当未开启--chain-of-thought时指令按如下方式组装instruction self.instruction_template.format(fewshot_templategsm8k_few_shot_template[few_shot], questionitem[question])其中fewshot_template来自 gsm8k_3shot_template.json即原文档所指的模板提示词文件。该 JSON 文件内含 3 道带完整推理过程的示例3-shot例如{ few_shot: Q: There are 15 trees in the grove. Grove workers will plant trees in the grove today. After they are done, there will be 21 trees. How many trees did the grove workers plant today?\n\nA:There are 15 trees originally. Then there were 21 trees after some more were planted. So there must have been 21 - 15 6. The answer is 6.\n\nQ: If there are 3 cars in the parking lot and 2 more cars arrive, how many cars are in the parking lot?\n\nA:There are originally 3 cars. 2 more cars arrive. 3 2 5. The answer is 5.\n\nQ: Leah had 32 chocolates and her sister had 42. If they ate 35, how many pieces do they have left in total?\n\nA:Originally, Leah had 32 chocolates. Her sister had 42. So in total they had 32 42 74. After eating 35, they had 74 - 35 39. The answer is 39. }模板的路径由 template.py 中的GSM8K_TEMPLATE_DIR常量统一管理GSM8K_TEMPLATE_DIR os.path.join(cur_file_dir, fewshot_template/gsm8k_3shot_template.json)直接模式的答案提取直接模式下模型输出使用output_template正则表达式rThe answer is (.*?) 进行匹配提取The answer is之后的内容作为最终答案。源码中的提取逻辑还包含额外的清洗步骤answer chat_result[0].lstrip() answer answer.split(Q:)[0] answer_result answer.replace($, ).replace(,, ) answer_result answer_result.replace(., , -1) ... final_answer re.findall(self.output_template, answer_result) final_answer [final_answer[0][::-1].replace(., , 1)[::-1]]即先截断到下一个问题Q:之前去掉货币符号$与千分位逗号,再对小数点的处理做反转兼容最终通过The answer is (.*?)捕获答案。推荐参数--max-new-tokens设置为512。原因GSM8K 题目需要生成包含完整推理步骤的较长文本生成长度不足会导致推理过程被截断、答案提取失败。相关参数的默认值定义在 utils.py 中默认 128评测时需按文档调高。模式二Chain-of-ThoughtCoT评估模式工作原理CoT 模式将CoT 模板提示词即思维链示例作为评测模板与模型需要回答的问题拼接后送入模型进行评测旨在激发模型一步一步思考Lets think step by step的能力从而提升多步推理任务的准确率。从源码看CoT 模式的核心 Prompt 常量定义在 gsm8k_utils.py 中由 4 道带逐步推理的完整示例four_shots_prompt构成four_shots_prompt: str ( Question: Angelo and Melanie want to plan how many hours over the next week ...\n Lets think step by step\n Answer:\n Angelo and Melanie think they should dedicate 3 hours to each of the 2 chapters, ...\n The answer is 4\n\n Question: Marks basketball team scores ...\n ... Question: )在Gsm8kEval.eval()中当开启--chain-of-thought后指令组装变为if args.chain_of_thought: instruction four_shots_prompt item[question] \nLets think step by step\nAnswer:即在 4-shot 示例之后追加待评测问题并显式引导模型先输出逐步推理、再给出Answer:。CoT 模式的答案提取CoT 模式不再依赖The answer is正则而是通过gsm8k_postprocess函数从整段推理文本中提取最后一个数字作为答案def gsm8k_postprocess(text: str) - str: text text.split(Question:)[0] numbers re.findall(r\-?\d\.\d|\-?\d, text) if not numbers: return NULL return numbers[-1]该后处理逻辑的思路是CoT 输出中最后一个数字通常即最终答案支持负号与小数若完全没有数字则返回NULL判定为错误。这一后处理函数与 Prompt 常量共同定义在 gsm8k_utils.py仓库的单元测试镜像 tests/mindspeed_llm/tasks/evaluation/eval_utils/gsm8k_utils.py 保留了同份实现用于测试验证。推荐参数--max-new-tokens设置为512 或更高。CoT 模式要求模型输出完整推理链生成长度需求高于直接模式建议不低于 512。--chain-of-thought开启 CoT 评测模式。该开关在 utils.py 中定义group.add_argument(--chain-of-thought, actionstore_true, defaultFalse, helpuse chain_of_thought method to evaluate your LLM)完整参数与调用入口评测相关参数总览除上述两个关键参数外GSM8K 评测还涉及以下由 utils.py 中add_text_generate_args()注册的通用文本生成参数参数默认值说明--task-data-path[]数据集路径GSM8K 评测数据所在目录可传多个--task[]评测任务名gsm8k即触发 GSM8K 评测--temperature0.5采样温度--evaluation-batch-size1评测批次大小可调大以提升评测吞吐--greedyFalse使用贪心采样--top-p0.9Top-p 采样--top-k0Top-k 采样--max-new-tokens128生成文本最大长度GSM8K 评测需调至 512--no-chat-templateFalse关闭 Huggingface chat template--use-kv-cacheFalse使用 KV Cache 加速推理--hf-chat-templateFalse使用模型自带 chat template--eval-languageen评测语言en/zh--max-eval-samplesNone每个数据集最大评测样本数调试用--broadcastFalse推理时是否广播数据开启专家并行时须置位--alternative-promptFalse使用另一套提示词评测--origin-postprocessFalse使用原始方式提取答案--chain-of-thoughtFalse开启 CoT 评测模式任务分发入口根目录 evaluation.py 是评测总入口。其中gsm8k()函数按--task-data-path定位数据目录并实例化Gsm8kEvaldef gsm8k(eval_args, agent): data_path None answer None score_df None for path in eval_args.task_data_path: data_path path try: if data_path: gsm8k_eval Gsm8kEval(test_dirdata_path, eval_argseval_args) answer, score_df gsm8k_eval.eval(chatagent) if dist.get_rank() 0: logger.info(\n%s, score_df) except Exception as e: logger.info(e) return answer, score_df任务分发处通过gsm8k in args.task判断并调用if gsm8k in args.task: gsm8k(args, LLMChat(args, model, tokenizer))整体框架上Gsm8kEval继承自 dataset_eval.py 中的抽象基类DatasetEval须实现eval()与top_k_eval()通过 chat.py 的Chat抽象接口chat()/beam_search_chat()与模型交互——这一数据集评估器 模型对话接口的抽象设计使得同一套评测框架可平滑对接不同推理后端。底层评测流程解析Gsm8kEval.eval()的完整执行链路如下加载模板读取GSM8K_TEMPLATE_DIR指向的 3-shot 模板 JSON仅直接模式使用。读取数据遍历--task-data-path目录下的每个文件按行解析 JSON 数据每行一条记录包含question与answer字段。截取样本若设置--max-eval-samples每个文件仅取前 N 条便于调试。分布式切分调用get_final_list_dataset()实现在 utils.py根据世界大小、张量并行、流水线并行规模计算数据并行域将数据集均分到各 DP 组并对长度不足的分片做首条补齐alignment_list_data_length避免分布不均导致的精度偏差。构造指令按模式一/模式二的规则拼接指令参考答案取自item[answer].split(#### )[-1]即####分隔符后的最终数值。批量推理按--evaluation-batch-size攒批调用chat.chat()随后dist.barrier()同步若开启--broadcast则在 rank 0 上广播。答案提取与比对按模式对应的后处理逻辑提取模型答案与参考答案逐题比对统计正确数acc_n。跨卡归约非 broadcast 模式下将各 DP 卡的正确数与题目数通过dist.all_reduceReduceOp.SUM作用于mpu.get_data_parallel_group()汇总。输出结果rank 0 打印There {acc_n} corrects in {total_questions} questions, with accuracy {acc_n / total_questions}并汇总出score_df列subject、question_n、acc最终追加total行给出总准确率同时返回final_result字典{题号: 答案}供上层使用。check_divisible_by_zero()见 error_utils.py用于在题目数为 0 时避免除零异常保证结果打印与 DataFrame 构造的健壮性。数据格式、运行方式与验证GSM8K 数据格式评测数据为 JSON Lines 格式每行包含{question: There are 15 trees in the grove. ..., answer: There are 15 trees originally. ... The answer is 6. #### 6}question题目文本answer参考答案其中####之后的部分如6是最终答案源码通过split(#### )[-1]提取用于比对。典型运行方式参考 评估指南 中基准评测脚本的命名与启动约定可组织形如examples/mcore/model_name/evaluate_xxx.sh的评测脚本# 关键配置 TASKgsm8k # 任务名 DATA_PATH./gsm8k/data/test/ # GSM8K 数据集目录JSON Lines 格式 CHECKPOINT./model_weights/xxx-mcore # 已转换的 mcore 权重 TOKENIZER_PATH./model_from_hf/xxx-hf/ # HF tokenizer # 直接模式 bash evaluate_xxx.sh --task gsm8k \ --task-data-path $DATA_PATH \ --max-new-tokens 512 # CoT 模式 bash evaluate_xxx.sh --task gsm8k \ --task-data-path $DATA_PATH \ --max-new-tokens 512 \ --chain-of-thought实际运行脚本还需补齐模型结构参数如--tensor-model-parallel-size、--pipeline-model-parallel-size、--load、--tokenizer-type、--tokenizer-name-or-path等可参考仓库中其他评估脚本的完整写法。测试验证仓库 CI 流水线内置了 GSM8K 评测的端到端用例见 tests/pipeline/ut/evaluation/test_evaluate.json 中的test_gsm8k_evaluate配置以 1 层小规模 Qwen2 模型为例覆盖--task gsm8k、--task-data-path、--max-new-tokens、--no-chat-template等参数组合对应的执行逻辑位于 tests/pipeline/ut/evaluation/test_evaluate.py。该用例验证了 GSM8K 任务从参数解析、数据加载、推理生成到得分统计的完整链路可作为自行复现与排查问题的参考基线。两种模式对比与选型建议维度直接评估默认CoT 评估Prompt 模板3-shot 示例gsm8k_3shot_template.json4-shot 逐步推理示例four_shots_prompt指令拼接{fewshot_template}\n\n{question}four_shots_prompt question \nLets think step by step\nAnswer:答案提取正则The answer is (.*?) 清洗gsm8k_postprocess提取最后一个数字--max-new-tokens512512 或更高额外开关无--chain-of-thought选型建议若评测对象为指令微调模型且希望快速获得数值准确率使用默认直接模式即可若希望充分激发模型的推理链路生成能力、追求更贴近推理型模型评测口径则开启 CoT 模式并相应放宽生成长度上限。参考文献Cobbe, K., Kosaraju, V., Bavarian, M., Chen, M., Jun, H., Kaiser, L., Plappert, M., Tworek, J., Hilton, J., Nakano, R., Hesse, C., Schulman, J. (2021).Training verifiers to solve math word problems[Preprint]. arXiv preprint arXiv:2110.14168.说明本文涉及的所有实现细节均可回溯至仓库源码gsm8k_eval.py评测主逻辑、gsm8k_utils.pyCoT Prompt 与后处理、template.py模板路径注册、utils.py参数定义、evaluation.py任务入口。赞分享人工智能大模型分布式训练预训练微调模型推理服务强化学习Ascend【免费下载链接】MindSpeed-LLM昇腾LLM分布式训练框架项目地址https://gitcode.com/Ascend/MindSpeed-LLM点击查看免费下载相关推荐MindSpeed-LLM GSM8K 评估指南直接评估与思维链CoT两种模式实战MindSpeed LLM GSM8K 评估指南直接评估与思维链CoT两种模式实战 MindSpeed LLM 在昇腾环境下支持对 GSM8K小学数学人工智能大模型分布式训练预训练微调模型推理服务强化学习AscendMindSpeed-LLM HellaSwag 常识推理评估数据格式、直接评估模式与分布式评测实现解析MindSpeed LLM HellaSwag 常识推理评估数据格式、直接评估模式与分布式评测实现解析 HellaSwag 是 MindSpeed LLM 支人工智能大模型分布式训练预训练微调模型推理服务强化学习AscendMindSpeed-LLM 中 HellaSwag 常识推理评估实践数据集特性、直接评估模式与分布式实现解析MindSpeed LLM 中 HellaSwag 常识推理评估实践数据集特性、直接评估模式与分布式实现解析 HellaSwag 是经典的常识推理commo人工智能大模型分布式训练预训练微调模型推理服务强化学习Ascend创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考