TrainingArguments shouldn’t set ACCELERATE_MIXED_PRECISION env variable

当你给 TrainingArguments 设置了 fp16 等混合精度参数时,它会污染 ACCELERATE_MIXED_PRECISION 环境变量,导致之后即使不向 Trainer 传入 args=training_args , Trainer 仍会通过 Accelerate 启用混合精度。排

快速结论:当你给 TrainingArguments 设置了 fp16 等混合精度参数时,它会污染 ACCELERATE_MIXED_PRECISION 环境变量,导致之后即使不向 Trainer 传入 args=training_argsTrainer 仍会通过 Accelerate 启用混合精度。排查时优先确认环境变量是否被设置,以及 Trainer 是否被意外带入混合精度。

适用环境:Issue 中未明确列出完整环境(操作系统、Python、CUDA、显卡型号、PyTorch 版本等)。已知涉及 transformersTrainingArgumentsTrainer,并依赖 accelerateACCELERATE_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 流程。

问题场景

用户在使用 transformersTrainingArguments 训练模型时,给 TrainingArguments 传入了 fp16 等混合精度参数。随后 TrainingArguments 自动把 ACCELERATE_MIXED_PRECISION 环境变量设为该精度值。此时即使用户不再向 Trainer 显式传入 args=training_argsTrainer 初始化 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 中是否设置了 fp16bf16mixed_precision 相关参数。
  • 检查运行时环境中 ACCELERATE_MIXED_PRECISION 是否已被设置为 fp16 或其他值。
  • 确认是否使用 accelerate launch 启动;该场景下环境变量可能由 Accelerate 配置正常使用,需要区分是否为预期行为。

解决步骤

  1. 先确认问题是否由环境变量引起:检查 ACCELERATE_MIXED_PRECISION 当前值,并观察 Trainer 未显式传入 TrainingArguments 时是否仍启用混合精度。
  2. 确认 transformers 版本。如果低于 v5.0.0,可优先尝试升级到 v5.0.0 或包含 PR #41697 的版本。
  3. 升级后,TrainingArguments 不再写入 ACCELERATE_MIXED_PRECISION 环境变量,只把混合精度值解析到实例上;Trainer 会显式把 args.mixed_precision 传给 Accelerator
  4. 如果因环境限制无法升级,需注意不要依赖“删除环境变量”作为通用修复;Issue 讨论明确说明 Accelerate 依赖该变量,简单移除可能破坏 accelerate launch 相关配置。
  5. 如果仍在旧版本且需要规避,可优先尝试在创建 Trainer 前确认并重置相关环境变量,但该做法未在 Issue 中作为长期方案验证,可能影响同一进程中的其他 Accelerate 行为。

验证方法

升级到包含修复的版本后,设置 TrainingArguments 的混合精度参数,再检查运行环境中 ACCELERATE_MIXED_PRECISION 是否不再被 TrainingArguments 写入;同时在不向 Trainer 传入 args=training_args 的情况下,确认 Trainer 不会因该环境变量而自动启用混合精度。若使用 accelerate launch 并显式配置了混合精度,应确认该场景仍按 Accelerate 配置正常工作。

参考来源

huggingface/transformers #29510

GamsGo AI

AI 工具推荐

想把多个 AI 模型放在一个入口?

GamsGo AI 集成 ChatGPT、DeepSeek、Gemini、Claude、Midjourney、Veo 等常用模型,适合写作、绘图、视频和日常 AI 工作流。

了解 GamsGo AI

推广链接:通过此链接购买,我可能获得佣金,不影响你的价格。

这个方案解决了吗?

celebrityanime
celebrityanime
文章: 23770

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注