快速结论:当你给 TrainingArguments 设置了 fp16 等混合精度参数时,它会污染 ACCELERATE_MIXED_PRECISION 环境变量,导致之后即使不向 Trainer 传入 args=training_args,Trainer 仍会通过 Accelerate 启用混合精度。排查时优先确认环境变量是否被设置,以及 Trainer 是否被意外带入混合精度。
适用环境:Issue 中未明确列出完整环境(操作系统、Python、CUDA、显卡型号、PyTorch 版本等)。已知涉及 transformers 的 TrainingArguments 与 Trainer,并依赖 accelerate 的 ACCELERATE_MIXED_PRECISION 环境变量机制。
最快修复方案:暂无确认的一步修复方案。该问题已在 v5.0.0 由 PR #41697 修复:TrainingArguments 不再把 ACCELERATE_MIXED_PRECISION 写入环境,只把值解析到实例上(仍会读取环境变量以兼容 accelerate launch),同时 Trainer 显式把 args.mixed_precision 传给 Accelerator。如果你的版本低于 v5.0.0,可优先尝试升级到包含该修复的版本。
注意事项:不能简单删除该环境变量,因为 Accelerate 本身依赖它,accelerate launch 配合配置指定 bf16 等场景仍需要它。修复方向是把混合精度的控制逻辑迁移到 Trainer 内部,而不是在 TrainingArguments 中写全局环境变量;手动修改环境变量可能影响其他 Accelerate 流程。
问题场景
用户在使用 transformers 的 TrainingArguments 训练模型时,给 TrainingArguments 传入了 fp16 等混合精度参数。随后 TrainingArguments 自动把 ACCELERATE_MIXED_PRECISION 环境变量设为该精度值。此时即使用户不再向 Trainer 显式传入 args=training_args,Trainer 初始化 Accelerate 时仍会读取到该环境变量,从而在训练中启用混合精度。该行为在调试模型输出 logits 为 nan 时被发现,因为即使移除了 TrainingArguments,混合精度依然被隐式启用,干扰了排查。
报错原文
TrainingArguments shouldn't set ACCELERATE_MIXED_PRECISION env variable
原因分析
可能的原因在于 TrainingArguments 会将用户传入的混合精度类型写入 ACCELERATE_MIXED_PRECISION 环境变量。该环境变量是全局的,Accelerate 在初始化 AcceleratorState 单例时会读取它并设置 _mixed_precision,进而影响 Accelerator.native_amp 和后续 prepare_model 的行为。因此,只要该环境变量被设置,之后创建的 Trainer(即便没有显式接收 TrainingArguments)也会被 Accelerate 带入混合精度模式。Issue 讨论中指出,Accelerate 本身依赖该环境变量来支持 accelerate launch 等场景,所以不能直接删除,需要把混合精度的控制逻辑迁移到 Trainer 内部。
环境排查
- 确认当前
transformers版本,是否低于 v5.0.0;该修复位于 v5.0.0 的 PR #41697。 - 确认
accelerate版本,因为环境变量读取与AcceleratorState行为由 Accelerate 实现。 - 确认
TrainingArguments中是否设置了fp16、bf16或mixed_precision相关参数。 - 检查运行时环境中
ACCELERATE_MIXED_PRECISION是否已被设置为fp16或其他值。 - 确认是否使用
accelerate launch启动;该场景下环境变量可能由 Accelerate 配置正常使用,需要区分是否为预期行为。
解决步骤
- 先确认问题是否由环境变量引起:检查
ACCELERATE_MIXED_PRECISION当前值,并观察Trainer未显式传入TrainingArguments时是否仍启用混合精度。 - 确认
transformers版本。如果低于 v5.0.0,可优先尝试升级到 v5.0.0 或包含 PR #41697 的版本。 - 升级后,
TrainingArguments不再写入ACCELERATE_MIXED_PRECISION环境变量,只把混合精度值解析到实例上;Trainer会显式把args.mixed_precision传给Accelerator。 - 如果因环境限制无法升级,需注意不要依赖“删除环境变量”作为通用修复;Issue 讨论明确说明 Accelerate 依赖该变量,简单移除可能破坏
accelerate launch相关配置。 - 如果仍在旧版本且需要规避,可优先尝试在创建
Trainer前确认并重置相关环境变量,但该做法未在 Issue 中作为长期方案验证,可能影响同一进程中的其他 Accelerate 行为。
验证方法
升级到包含修复的版本后,设置 TrainingArguments 的混合精度参数,再检查运行环境中 ACCELERATE_MIXED_PRECISION 是否不再被 TrainingArguments 写入;同时在不向 Trainer 传入 args=training_args 的情况下,确认 Trainer 不会因该环境变量而自动启用混合精度。若使用 accelerate launch 并显式配置了混合精度,应确认该场景仍按 Accelerate 配置正常工作。
参考来源
huggingface/transformers #29510
AI 工具推荐
想把多个 AI 模型放在一个入口?
GamsGo AI 集成 ChatGPT、DeepSeek、Gemini、Claude、Midjourney、Veo 等常用模型,适合写作、绘图、视频和日常 AI 工作流。
推广链接:通过此链接购买,我可能获得佣金,不影响你的价格。
这个方案解决了吗?
可以继续搜索完整报错,或查看同一工具的其他排查指南。


