【Bug已解决】Mean Token Accuracy not found at evaluation while finetuning an model with SFTTrainer 解决方案
【Bug已解决】Mean Token Accuracy not found at evaluation while finetuning an model with SFTTrainer 解决方案原始报错Mean Token Accuracy not found at evaluation while finetuning an model with SFTTrainer 场景用 SFTTrainer 微调时想在评估阶段看到一个自定义指标平均 token 准确率mean token accuracy预测 token 与标签 token 一致的比例。但评估跑完日志里只有 loss没有这个指标——训练器只算默认的 eval_loss没有把平均 token 准确率接进评估指标计算。用户期望它能像 loss 一样自动出现在评估报告里。正确做法是把自定义指标注册/实现到评估逻辑中让它在每个 eval batch 上累积、最终平均。 关键词自定义指标、mean token accuracy、评估指标、metric 注册、SFTTrainer、compute_metrics、准确率累积、评估钩子。一、现象长什么样想要的指标评估里没有用户定义了平均 token 准确率作为关心的指标SFTTrainer 的评估默认只算eval_loss其它指标需要用户通过compute_metrics提供用户没接或接错了评估结束只有 loss没有 token 准确率用户以为训练器应该自带这个常见指标发现没有就以为坏了即使接了compute_metrics如果只在完整 batch 上算、没做跨 batch 累积平均最后报的值也会错被最后一个 batch 覆盖或未被正确聚合表现评估报告缺指标或指标值看着不对。核心问题自定义评估指标没有被正确注册与跨 batch 累积要么没接compute_metrics要么累积方式错导致最终值失真。二、背景评估指标是怎么算出来的Trainer 类含 SFTTrainer的评估流程是对每个 eval batch 跑前向得到logits和labels如果用户提供了compute_metrics(eval_pred)就用(logits/labels)调它返回一个指标字典Trainer 在一个 batch上调用compute_metrics得到该 batch 的指标多个 batch 的指标怎么聚合成整个 eval 集的指标取决于接口约定——很多实现是把所有 batch 的预测先拼成大数组再调一次compute_metrics这样你只需在全量上算一次即可。平均 token 准确率的正确算法是(predicted_token label_token 且 label ! -100).sum() / (label ! -100).sum()即在所有非填充标签 token 上求一致率。如果compute_metrics收到的是全量拼接的预测与标签一次算对即可如果收到的是单 batch则必须自己累积计数、最后除总数。三、根因指标未注册或累积方式错根因拆解未接 compute_metrics用户没传compute_metrics训练器只报 loss只算最后一个 batch有人在每个 batch 调compute_metrics却没聚合最终值被最后 batch 覆盖忽略 -100 标签算准确率时没排除labels-100的填充位分母错argmax 轴错对 logits 取argmax(-1)的维度错预测 token 不对指标名不一致用户找mean_token_accuracy但代码记的是acc对不上无注册机制没有指标注册表加指标要改评估核心。下面用最小模型复现只算 loss 没有准确率再给compute_metrics 正确累积的修复。四、最小可运行复现import torch def eval_loss_only(logits, labels): 错误评估只算 loss没有准确率指标。 return {eval_loss: 0.5} # 用户想要的 token 准确率根本没出现 if __name__ __main__: logits torch.randn(2, 3, 10) # (batch, seq, vocab) labels torch.tensor([[1, 2, -100], [3, -100, -100]]) print(评估结果:, eval_loss_only(logits, labels)) # 只有 loss运行可见评估结果只有 loss没有 token 准确率——用户想要却找不到的现场。五、方案用 compute_metrics 算全量 token 准确率第一层实现compute_metrics在全量拼接的logits/labels 上算平均 token 准确率排除 -100 标签位import torch def compute_metrics(eval_pred): logits, labels eval_pred if isinstance(logits, torch.Tensor): logits logits preds logits.argmax(dim-1) # (N, seq) 预测 token # 只在非填充标签(-100)上比较 mask labels ! -100 correct (preds labels) mask acc correct.sum().item() / mask.sum().item() return {mean_token_accuracy: acc} if __name__ __main__: logits torch.randn(2, 3, 10) labels torch.tensor([[1, 2, -100], [3, -100, -100]]) # 构造 eval_pred实际中 Trainer 会拼全量后传入 print(正确指标:, compute_metrics((logits, labels)))排除 -100 后准确率分母是真实标签 token 数指标正确且会被 Trainer 上报。六、方案逐 batch 累积计数最后聚合防御单 batch 调用第二层若接口是逐 batch 调 compute_metrics而非全量一次则需自己累积正确数/总数用闭包状态跨 batch 聚合class TokenAccuracyAccumulator: def __init__(self): self.correct 0 self.total 0 def update(self, logits, labels): preds logits.argmax(dim-1) mask labels ! -100 self.correct ((preds labels) mask).sum().item() self.total mask.sum().item() def result(self): return {mean_token_accuracy: self.correct / self.total if self.total else 0.0} if __name__ __main__: acc TokenAccuracyAccumulator() for _ in range(3): # 模拟多个 eval batch acc.update(torch.randn(2, 3, 10), torch.tensor([[1, 2, -100], [3, -100, -100]])) print(跨 batch 聚合准确率:, acc.result())累积计数保证多 batch 平均正确不被最后 batch 覆盖。七、方案指标注册表按需启用第三层用注册表管理可选指标评估时按配置启用新增指标只注册不改核心METRICS {} def register_metric(fn): METRICS[fn.__name__] fn return fn register_metric def mean_token_accuracy(logits, labels): preds logits.argmax(dim-1) mask labels ! -100 return (preds labels)[mask].float().mean().item() def evaluate_selected(logits, labels, names): return {n: METRICS[n](logits, labels) for n in names} if __name__ __main__: out evaluate_selected(torch.randn(2, 3, 10), torch.tensor([[1, 2, -100], [3, -100, -100]]), [mean_token_accuracy]) print(注册表指标:, out)注册表让指标可插拔评估核心不硬编码任何具体指标。八、验证把准确率正确且可累积锁进测试def test_accuracy_excludes_pad(): logits torch.zeros(1, 2, 5) logits[0, 0, 1] 10; logits[0, 1, 2] 10 # 预测 token 1 和 2 labels torch.tensor([[1, 2]]) # 全对 assert compute_metrics((logits, labels))[mean_token_accuracy] 1.0 def test_accuracy_with_pad(): logits torch.zeros(1, 3, 5) logits[0, 0, 1] 10; logits[0, 1, 9] 10 # 第2个预测错(9) labels torch.tensor([[1, 9, -100]]) # 第3个是填充 # 2 个有效标签1 对 - 0.5 assert compute_metrics((logits, labels))[mean_token_accuracy] 0.5 if __name__ __main__: test_accuracy_excludes_pad() test_accuracy_with_pad() print(token 准确率指标测试通过。)九、排查清单评估找不到 token 准确率按顺序查未接 compute_metrics是否传了compute_metrics没传则只有 loss。标签掩码算准确率是否排除 labels-100 填充位没排除分母错。argmax 轴是否对 logits 最后一维 argmax轴错预测 token 不对。单 batch 覆盖逐 batch 调 compute_metrics 是否累积否则被最后 batch 覆盖。指标名日志找的指标名是否与代码返回的一致mean_token_accuracy注册机制是否有指标注册表没有则加指标要改核心。全量 vs 单批接口是传全量还是单批决定用一次算还是累积。十、小结SFTTrainer 评估找不到平均 token 准确率是自定义评估指标没被注册与正确累积训练器默认只报 eval_losstoken 准确率需要用户用compute_metrics提供且必须排除 -100 填充标签、正确跨 batch 聚合否则要么指标缺失、要么值失真。修复三层compute_metrics在全量logits/labels 上算平均 token 准确率排除 -100累积计数逐 batch 调用时用累加器跨 batch 聚合不被末批覆盖指标注册表可选指标注册管理评估按配置启用新增不改核心。核心原则评估想要自定义指标如 mean token accuracy必须由compute_metrics提供且严格排除填充标签-100、正确跨 batch 聚合。凡是评估报告里找不到某指标的情况第一反应都是去确认 compute_metrics 是否实现、是否排除了填充、是否做了跨 batch 平均。

相关新闻

EMIFA内存控制器电源管理与接口配置实战详解

EMIFA内存控制器电源管理与接口配置实战详解

1. EMIFA内存控制器电源管理深度解析 在嵌入式系统,尤其是对功耗和实时性有严苛要求的工业控制、通信设备或便携式仪器中,内存控制器的功耗管理绝非锦上添花,而是系统设计的基石。EMIFA(External Memory Interface A)作…

2026/10/19 13:52:42 阅读更多 →
前后端分离架构与性能优化实战指南

前后端分离架构与性能优化实战指南

1. 前后端分离架构解析前后端分离已成为现代Web开发的主流模式,这种架构将传统的单体应用拆分为独立的前端和后端系统。在实际项目中,我们通常使用Nginx作为前端服务器,Tomcat/Spring Boot作为后端应用服务器,中间可能加入Node.js…

2026/10/19 0:14:27 阅读更多 →
光模块 SG2520VHN LVDS 差分晶振规格解析:Vishay/Diodes 器件对比,RTC 与高速时钟概念区分指南

光模块 SG2520VHN LVDS 差分晶振规格解析:Vishay/Diodes 器件对比,RTC 与高速时钟概念区分指南

前言本文围绕爱普生 SG2520VHN 2520 封装低抖动 LVDS 差分有源晶振展开完整知识梳理,结合 Vishay、Diodes 两大品牌振荡器产品线做规格横向对比,同时厘清行业内极易混淆的 LVDS 高速差分时钟与 RTC 实时时钟两类器件差异,区分石英振荡器&…

2026/10/18 16:57:04 阅读更多 →

最新新闻

手写代码评审辅助工具:基于静态分析与代码块评分,实现机器扫雷人做判断

手写代码评审辅助工具:基于静态分析与代码块评分,实现机器扫雷人做判断

程序员之间最容易翻脸的地方,除了代码风格,就是代码评审。 公司项目组从去年开始严格执行 MR 评审制度,本意是守住质量底线,但真正执行起来,问题特别多。一个 400 行起步的 MR,评审人往往只来得及看两三个…

2026/10/19 13:51:40 阅读更多 →
从零配置Maven环境:避开JDK版本、settings.xml与依赖下载的坑

从零配置Maven环境:避开JDK版本、settings.xml与依赖下载的坑

上周帮A同学折腾新电脑,一天之内踩遍了配置 Maven 环境的所有经典坑:mvn 命令找不到、JAVA_HOME 路径不合法、依赖下载到一半卡死、IDEA 里构建正常但命令行一跑就报错。很多教程把 Maven 配置写成"下载解压、配两个变量、完事",但…

2026/10/19 13:51:40 阅读更多 →
SAP物料编号范围设计原理与实战配置指南

SAP物料编号范围设计原理与实战配置指南

简介:本资源是一份面向SAP ABAP开发人员、后勤模块顾问及系统实施工程师的实操型配置指南,聚焦物料主数据编号范围的后台维护方法与典型问题处理。针对ERP 6.0 EHP7版本,详细讲解如何通过MMNR/SNRO事务码创建号码组、定义内外部编号段&#x…

2026/10/19 13:51:40 阅读更多 →
LeetCode反转链表:迭代法详解与指针操作避坑指南

LeetCode反转链表:迭代法详解与指针操作避坑指南

1. 反转链表到底在反转什么 链表反转是LeetCode上出镜率最高的题目之一,没有之一。我刷了这么多题,面试里被问到的链表题,十道里有六道跟反转沾边——要么是完整反转,要么是反转前K个,要么是两两交换,要么是…

2026/10/19 13:51:40 阅读更多 →
MobileNetV2端到端部署实战:猫狗分类与模型量化

MobileNetV2端到端部署实战:猫狗分类与模型量化

1. 项目背景与技术选型思路一直在做端侧视觉类项目,说实话,猫狗图像分类这种题目听起来很“教学”,可真要把它做成一套能跑的轻量级系统,反而比想象中更能暴露问题。很多人一上来就往 VGG、ResNet 这种大模型上靠,训练…

2026/10/19 13:51:40 阅读更多 →
进口阀门选型与采购实务:极端工况应用与避坑指南

进口阀门选型与采购实务:极端工况应用与避坑指南

进口阀门这些年一直是工业项目里绕不开的话题。做设备采购的、搞工艺设计的、管工厂运维的,几乎都跟它打过交道。很多人一听到“进口阀门”就想到贵、货期长、售后麻烦,但实际上它能在国内重工业场景里占据一席之地,靠的是极端工况下那份稳定…

2026/10/19 13:50:38 阅读更多 →

日新闻

频率跟踪型PWM电源设计:臭氧发生器谐振点漂移与软开关实现

频率跟踪型PWM电源设计:臭氧发生器谐振点漂移与软开关实现

简介:本资源为电源技术方向的学术研究文档,聚焦介质阻挡放电型臭氧发生器电源的频率跟踪型PWM控制策略,面向电力电子、高压电源及臭氧应用领域的科研人员与工程技术人员。针对负载呈容性、等效电容随外加电压升高而增大、谐振频率随之漂移的难…

2026/10/19 0:00:47 阅读更多 →
Vibe Coding 遇上 TaoToken:把开发者思维圣殿的灵感流接入统一 Key 通道

Vibe Coding 遇上 TaoToken:把开发者思维圣殿的灵感流接入统一 Key 通道

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/19 0:00:47 阅读更多 →
HundredCV-Chat话题建模实战教程:利用4,871个内置话题标签构建主题分析系统

HundredCV-Chat话题建模实战教程:利用4,871个内置话题标签构建主题分析系统

【免费下载链接】HundredCV-Chat 项目地址: https://ai.gitcode.com/hf_mirrors/Jax-dan/HundredCV-Chat 点击查看 免费下载 HundredCV-Chat 是一个由 100 位青年简历数据开发而来的中文多轮对话数据集,共包含 24,750 组日常闲聊对话和 4,871 个话题标签…

2026/10/19 0:00:47 阅读更多 →

周新闻

基于GMM的语音识别系统原理与MATLAB实现详解

基于GMM的语音识别系统原理与MATLAB实现详解

说到基于高斯混合模型(GMM)的语音识别系统,很多人第一反应就是一堆数学公式,觉得门槛很高。但如果你真的在MATLAB里把它落地跑通,会发现核心其实就是三件事:把声音变成特征向量,用GMM给每个类别…

2026/10/19 10:02:04 阅读更多 →
数字图像处理入门:反白、灰度化、调色板修改与导出txt实践

数字图像处理入门:反白、灰度化、调色板修改与导出txt实践

数字图像处理这四个字听起来挺唬人,但落到具体操作上,无非就是让计算机按你的想法“摆弄”像素。我在一个模拟项目X里用了一套特别经典的基础处理流程:对图像做反白、改调色板、彩色转灰度,最后把像素数据导出成txt文件。单看每一…

2026/10/18 0:00:55 阅读更多 →
机器人大脑技术盘点:具身智能的感知、决策与数据闭环

机器人大脑技术盘点:具身智能的感知、决策与数据闭环

如果你的信息流最近也天天刷到“机器人大脑”这个词,你会发现一个很有意思的现象:每个人说的“大脑”根本不是同一个东西。有人指的是大语言模型,有人指的是运动控制系统,还有人指的是能理解物理世界的端到端模型。在2026年这个时…

2026/10/19 1:30:52 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/19 2:54:50 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/19 9:10:22 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/18 12:16:16 阅读更多 →