玩转 lm-evaluation-harness 自定义评估循环:语言模型少样本评估实战手册
玩转 lm-evaluation-harness 自定义评估循环语言模型少样本评估实战手册【免费下载链接】lm-evaluation-harnessA framework for few-shot evaluation of language models.项目地址: https://gitcode.com/GitHub_Trending/lm/lm-evaluation-harness微调验收撞上评估瓶颈标准流程卡在哪刚微调完一个问答模型在 lm-evaluation-harness语言模型统一评估框架里跑标准流程验收结果全量测试集跑完才能看到一个数字想只看前 50 条却做不到。更要命的是内置 accuracy 把「答案格式完全一致」才算对而你的业务场景要求「先从模型输出里提取数字再比较」。控制评估粒度、自定义判分口径这两点就是这套框架自定义评估循环的两条主线项目概览见 README.md。本文以一个微调模型为例走通可控跑基线、加载自制任务、注册自定义指标三件事。完成后你可以只改命令和配置就能上线自己的评估流程不必碰框架内部代码。内置任务库已经覆盖数百个子任务上图是其中一个挪威语基准的任务类型分布可见分类、生成、多选题都被组织成独立可跑的任务。核心机制速览从任务到指标的流水线一次评估就是这条流水线。lm_eval/tasks/manager.py 里的任务管理器TaskManager扫描 YAML 建任务索引lm_eval/evaluator.py 里的评估器Evaluator把样本转成 Instance 并批量发给模型。模型侧只需实现loglikelihood和generate_until两个抽象方法数据侧的提示、少样本、判分逻辑全部收敛在任务 YAML 里改评估方式不用改代码。下图是标准少样本输入结构任务描述、若干示例、待答题目拼成一条 prompt框架自动完成组装。动手实践从基线运行到自定义指标用 limit 跑一次可控的基线评估目标5 分钟内确认链路通。用--limit只取子集配合新版 CLI 的run子命令完整参数见 docs/interface.mdlm-eval run --model hf \ --model_args pretrained./my-checkpoint,dtypefloat32 \ --tasks my_qa_task \ --num_fewshot 0 \ --limit 50 \ --batch_size auto关键参数如下参数类型作用默认值modelstr模型后端hf/vllm 等必填model_argsstr/dictpretrained 等构造参数Nonetaskslist任务名或任务组列表必填num_fewshotint少样本示例条数0limitint/float取样数量或比例None全量batch_sizeint/auto批大小auto 自动探测1预期结果终端输出各任务准确率及 bootstrap 标准误加--output_path还能落盘 JSON。limit传小数时按比例取样0.1 即取 10%。用 TaskManager 加载自制任务任务不在内置列表里时把 YAML 放到自己目录用TaskManager(include_path...)指给评估器参数表参考 docs/python-api.mdfrom lm_eval.tasks import TaskManager from lm_eval import simple_evaluate tm TaskManager(include_path./my_tasks) # 扫描指定目录的 YAML results simple_evaluate( modelhf, model_argspretrained./my-checkpoint, tasks[my_qa_task], limit50, task_managertm, ) print(results[results])预期结果results[results][my_qa_task]直接给出准确率及其 stderr。YAML 最小必填项是task、dataset_path、output_type和doc_to_text完整字段对照 docs/task_guide.md 的 TaskConfig 清单。注册一个自定义指标回到开头的痛点判分前要先从输出里提取数字。用register_metric注册判分函数再在任务 YAML 的metric_list里引用注册表实现在 lm_eval/api/registry.pyfrom lm_eval.api.registry import register_metric register_metric( metricrelaxed_accuracy, # YAML 里引用的名字 higher_is_betterTrue, aggregationmean, # 聚合方式用均值 ) def relaxed_accuracy(references, predictions): correct 0 for ref, pred in zip(references, predictions): if extract_number(pred) ref: # 先从输出提取数字 correct 1 return correct / len(predictions)任务 YAML 中引用即可生效output_type: generate_until metric_list: - metric: relaxed_accuracy预期结果输出结果里新增relaxed_accuracy和relaxed_accuracy,stderr两个字段评估入口代码一行不用动。扩展点地图哪些地方能改框架的定制点分散在任务、后处理、指标、模型接口四层按场景挑扩展点适用场景修改方式任务 YAML换数据集、提示、判分在 include_path 目录写新 YAMLfilter_list提取答案、多数投票YAML 声明后处理链register_metric自定义判分函数Python 装饰器注册register_aggregation自定义聚合方法注册表登记聚合函数子类化 LM接入非 HF 模型实现 loglikelihood 与 generate_untilapply_chat_template评测对话格式模型传 bool 或模板名参数其中filter_list用得最多。gsm8k 的自一致配置lm_eval/tasks/gsm8k/每题先生成 64 次正则提取数字多数投票定案后再判分repeats: 64 filter_list: - name: maj filter: - function: regex regex_pattern: The answer is (\\-?[0-9\\.\\,]*[0-9]) - function: majority_vote - function: take_first「多路生成、提取、投票」这类流程全在 YAML 声明一次推理的产出可被多条管线复用。踩坑实录四个高频陷阱这些问题在 docs/footguns.md 都有记录照着排可以少走弯路。换行符变成字面量\n模型不停生成YAML 单引号不处理转义序列必须用双引号generation_kwargs: until: [\n] # 双引号才解析为真换行chat 接口跑 loglikelihood 任务分数异常chat-completion 端点不返回打分所需的 logits详见 docs/API_guide.md。正确做法是走 completion 接口或命令行加--apply_chat_template用对话格式评测。正式评估带limit分数无法复现limit只用于链路验证lm_eval/evaluator.py 参数注释原话。正式报告必须全量需要固定子集时用samples参数指定确切索引。batch_size auto在长序列上仍 OOMauto 探测的是当时能装下的最大值序列长度差异大的任务要用max_batch_size封顶API 类模型调num_concurrent而不是本地批大小。下一步三条进阶路径要接入非 HuggingFace 模型读 examples/transformer-lens.py它是第三方模型实现 LM 接口的完整样例。想把命令行参数固化成可版本化的配置读 docs/config_files.md讲了--config与 YAML 配置格式。新增任务前先过一遍 docs/new_task_guide.md 和 templates/new_yaml_task/ 的空白模板确认数据集字段与必备方法。评估循环调不通时八成问题出在提示或判分定义上把任务 YAML 定下来框架只负责忠实执行。拿不准参数语义时对照 docs/python-api.md 的参数表和 docs/task_guide.md 的字段定义不要改源码。【免费下载链接】lm-evaluation-harnessA framework for few-shot evaluation of language models.项目地址: https://gitcode.com/GitHub_Trending/lm/lm-evaluation-harness创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考