【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/7/22 7:46:44 阅读更多 →
前后端分离架构与性能优化实战指南

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

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

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

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

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

2026/7/22 7:46:44 阅读更多 →

最新新闻

TRELLIS.2:3秒照片转3D模型的技术突破

TRELLIS.2:3秒照片转3D模型的技术突破

1. 项目概述:TRELLIS.2如何颠覆3D生成领域 微软亚洲研究院最新发布的TRELLIS.2技术,彻底改变了传统3D模型生成的游戏规则。这项技术能够在短短3秒内将普通照片转换为高保真3D模型,其核心突破在于解决了当前3D生成领域的三大痛点:材…

2026/7/22 8:31:58 阅读更多 →
让 AI 第一次拥有行动能力

让 AI 第一次拥有行动能力

因此,对于模型来说,整个世界只有两件事情: 输入文本 ↓ 生成文本 如果只是聊天、翻译、总结、写代码,这已经足够了。 但是,当我们开始尝试让 AI 帮助完成真实工作时,很快就会遇到一个问题 当我们问模型: 帮…

2026/7/22 8:31:58 阅读更多 →
实战解析:如何绕过WAF并逆向WASM加密实现深度渗透测试

实战解析:如何绕过WAF并逆向WASM加密实现深度渗透测试

1. 项目概述:一次针对WAF与WASM加密的实战渗透 最近在做一个授权范围内的安全测试项目,目标是一个金融类Web应用。在初步信息收集和常规漏洞扫描阶段,我遇到了一个典型的“现代防御组合拳”:Web应用防火墙(WAF&#xf…

2026/7/22 8:31:58 阅读更多 →
iOS性能优化利器:Instruments工具全解析

iOS性能优化利器:Instruments工具全解析

1. iOS性能优化与Instruments工具概述在iOS应用开发中,性能优化是确保用户体验的关键环节。一个响应迟缓、内存占用过高或耗电量大的应用,即使用户界面再精美,也难逃被卸载的命运。作为苹果官方提供的性能分析工具套件,Instrument…

2026/7/22 8:31:58 阅读更多 →
征兵管理系统技术实现:微服务架构、数据安全与高并发设计

征兵管理系统技术实现:微服务架构、数据安全与高并发设计

这次我们来看一个与征兵相关的技术项目。虽然"征兵"本身是一个政策性和社会性话题,但在技术领域,我们可以从多个角度来探讨相关的信息化建设、数据处理和系统开发方案。本文将重点分析征兵信息化系统的技术实现方案,包括系统架构、…

2026/7/22 8:31:58 阅读更多 →
JavaScript TypeError: undefined is not a function 解析与解决方案

JavaScript TypeError: undefined is not a function 解析与解决方案

1. 错误现象与本质剖析 "TypeError: undefined is not a function"这个报错在JavaScript开发中出现的频率堪比咖啡杯旁的糖包。当你在控制台看到这行红字时,本质上是在说:"你试图把不存在的东西当函数调用"。就像对着空气喊"开…

2026/7/22 8:30:58 阅读更多 →

日新闻

TI DSP系统配置模块SYSCFG详解:中断机制与主设备优先级配置实战

TI DSP系统配置模块SYSCFG详解:中断机制与主设备优先级配置实战

1. 项目概述与SYSCFG模块的核心价值在嵌入式系统,尤其是像TI C6000系列这样的高性能DSP开发中,我们常常会与芯片手册里那些密密麻麻的寄存器打交道。很多开发者可能更关注算法实现、内存优化或者外设驱动,但对于一个稳定、高效的系统而言&…

2026/7/22 0:00:26 阅读更多 →
微信Server酱:高到达率的应急通知方案实践

微信Server酱:高到达率的应急通知方案实践

1. 为什么我们需要"最次"的通知方案? 在数字化协作环境中,消息通知系统的重要性不言而喻明。但现实情况是,企业级通知方案往往需要复杂的API对接(如企业微信、钉钉、飞书),个人开发者的小项目又经…

2026/7/22 0:00:26 阅读更多 →
甲方要的“简洁“PPT,到底是简洁还是省事?

甲方要的“简洁“PPT,到底是简洁还是省事?

甲方说"简洁一点",乙方听到的是"少做几页"。甲方说"不要太复杂",乙方理解成"别放图表了"。结果交过去,甲方说"我说的简洁不是这个意思"。"简洁"这个词在PPT语境里,是…

2026/7/22 0:00:26 阅读更多 →

周新闻

Go语言静态资源打包方案对比与实践指南

Go语言静态资源打包方案对比与实践指南

1. 项目背景与核心需求在Go语言开发中,我们经常需要处理静态资源文件的打包问题。无论是Web应用的模板文件、前端资源,还是配置文件、证书等,都需要随程序一起分发。传统做法是将这些文件与编译后的二进制文件放在同一目录下,但这…

2026/7/21 8:48:31 阅读更多 →
Go语言实现高性能LDAP认证服务的架构与实践

Go语言实现高性能LDAP认证服务的架构与实践

1. 项目背景与核心价值LDAP(轻量级目录访问协议)作为企业级身份认证的黄金标准,已经服务了超过80%的财富500强公司。我在金融科技领域实施统一认证体系时,发现传统Java方案存在启动慢、内存占用高等痛点。而Go语言凭借其协程并发模…

2026/7/21 5:34:47 阅读更多 →
【AI面试官实战指南】:用ChatGPT模拟10类高频技术岗面试,3天提升应答精准度92%

【AI面试官实战指南】:用ChatGPT模拟10类高频技术岗面试,3天提升应答精准度92%

更多请点击: https://intelliparadigm.com 第一章:AI面试官实战指南的核心价值与适用场景 AI面试官并非替代人类HR的“黑箱工具”,而是以可解释、可审计、可迭代的方式,赋能招聘全链路的关键基础设施。其核心价值在于将主观经验沉…

2026/7/21 8:25:39 阅读更多 →

月新闻