Files
2025-10-17 00:51:53 +08:00

1.1 KiB
Raw Permalink Blame History

ISSUES

双重梯度裁剪

优化器级别global_clipnorm=self.args.get('grad_norm_clip_value', 0.0)第283行 手动级别tf.clip_by_global_norm第447-449行 这导致梯度被裁剪两次并且在TPU的分布式训练中可能引发内部状态冲突。

修复总结 问题根源双重梯度裁剪导致AdamW内部状态冲突 修复内容: 移除了优化器级别的梯度裁剪:删除了 global_clipnorm 参数 保留手动梯度裁剪:在 _train_step 中继续使用 tf.clip_by_global_norm 为什么会出错:

# 之前:双重裁剪
optimizer = tf.keras.optimizers.AdamW(
    global_clipnorm=clip_value  # 第一次裁剪
)
# 在 _train_step 中:
tf.clip_by_global_norm(gradients, clip_value)  # 第二次裁剪
optimizer.apply_gradients(...)  # 内部再次处理,导致冲突
现在的修复
# 现在:只有一次裁剪
optimizer = tf.keras.optimizers.AdamW(
    # 没有 global_clipnorm
)

# 在 _train_step 中:
tf.clip_by_global_norm(gradients, clip_value)  # 唯一的裁剪
optimizer.apply_gradients(...)  # 正常工作