让我们暂时放下API的戏剧性事件。这个话题值得仔细考虑,因为我不断看到同样的错误被反复犯下。
Reflection的作者在Hugging Face上上传的模型遇到了问题。经过三次不同的上传,Hugging Face上的模型仍然表现远不如作者声称的那样。人们已经测试过,它的表现甚至不如基准的LLaMA 3.1 70B。
我不确定Reflection是否是一个骗局,但权重的确存在重大问题。
- LLama 3.1 70B使用BF16进行训练,并且权重以BF16格式上传:https://huggingface.co/meta-llama/Meta-Llama-3-70B-Instruct
- Reflection 70B被转换为FP16:https://huggingface.co/mattshumer/ref_70_e3
这有区别吗?是的,区别非常大。BF16和FP16是非常不同的格式,它们不兼容。你不能在不丢失大量信息的情况下将BF16模型转换为FP16。
FP16有一个5位的指数和10位的尾数,而BF16有一个8位的指数和7位的尾数。在不显著丢失信息的情况下,无法将BF16模型转换为FP16,反之亦然。特别是BF16到FP16的转换尤其有害。FP16不适合神经网络,除非你使用复杂的混合精度训练方法(https://arxiv.org/abs/1710.03740)。另一方面,BF16由DeepMind开发(代表Brain Float 16),可以直接用于训练神经网络。
FP16在早期用于像BERT和RoBERTa这样的仅编码器模型,这些模型通常以FP16运行。然而,T5在BF16中发布,此后没有其他主要模型使用FP16,因为它根本不起作用。过去使用FP16的唯一原因是Nvidia直到A100 GPU发布才支持BF16。然而,Google TPU支持BF16,这就是为什么T5在BF16中进行训练。
我提出这一点是因为,尽管FP16是一个已死的格式,而BF16是用于每个大型模型的格式,但许多人仍然混淆它们。这似乎发生在Reflection的作者身上。请,不要使用FP16,最重要的是,不要尝试将BF16权重转换为FP16,它会毁掉你的模型。
讨论总结
本次讨论主要围绕FP16和BF16在模型转换中的差异及其对性能的影响展开。原帖作者指出,将BF16模型转换为FP16会导致显著的信息丢失和模型性能下降,并呼吁避免这种转换。评论中,部分用户对原帖的观点提出质疑,认为实际影响并没有那么灾难性,并引用了实际测试结果来支持自己的观点。讨论中还涉及了GPU限制、量化技术、API戏剧性事件等话题,整体情感倾向偏向技术讨论和观点质疑。
主要观点
- 👍 BF16转换为FP16的实际影响被夸大了
- 支持理由:llama.cpp开发者的测试显示BF16和FP16之间的困惑度差异很小。
- 反对声音:原帖作者认为这种转换会导致显著的信息丢失和性能下降。
- 🔥 BF16和FP16是两种不同的浮点格式,不能直接转换
- 正方观点:BF16是训练神经网络的首选格式,而FP16已经过时。
- 反方观点:实际应用中,这种转换带来的误差通常小于其他量化误差。
- 💡 通过添加缩放因子,可以补偿BF16到FP16转换的范围差异
- 解释:许多模型可以通过量化到8位权重来保持准确性,甚至可以进一步量化到4位或更少。
- 👀 FP16的主要问题是其范围限制和边界附近的精度问题
- 解释:某些模型(如GEMMA)对FP16的表现不佳,而BF16则没有这些问题。
- 🤔 BF16是FP32的简化版本,保留了相同的范围但减少了精度
- 解释:从FP32转换到BF16比转换到FP16更安全,因为权重的近似幅度比精确值更重要。
金句与有趣评论
- “😂 While everything in your post is technically accurate, it does feel like you are wildly exaggerating just how destructive the BF16 to FP16 conversion is.”
- 亮点:对原帖观点的质疑,认为实际影响被夸大了。
- “🤔 The vast majority of weights for these models end up within range of FP16, it’s really not that destructive of an operation.”
- 亮点:强调大多数模型的权重通常落在FP16的范围内,转换影响不大。
- “👀 BF16 is just naively quantized FP32. ("Naively" doesn’t mean it’s a bad thing) It has the same range as FP32, but with less precision.”
- 亮点:解释BF16是FP32的简化版本,保留了相同的范围但减少了精度。
- “😂 If they trained in BF16, why would they convert to FP16 and damage the model?”
- 亮点:质疑为什么在训练时使用BF16后还要进行FP16转换,这只会对模型造成损害。
- “🤔 Thanks for raising awareness about this. Can you elaborate on bf16 training, fp16 training, fp32 training, and fp16 mixed precision training?”
- 亮点:请求原帖作者进一步详细解释不同的训练方法及其应用场景。
情感分析
讨论的总体情感倾向偏向技术讨论和观点质疑。原帖作者的观点引发了大量讨论和质疑,部分用户认为实际影响被夸大了,而另一些用户则支持原帖的观点。讨论中存在一定的分歧,但整体氛围较为理性,主要集中在技术细节和实际应用上。
趋势与预测
- 新兴话题:可能会有更多关于不同训练方法(如bf16训练、fp16训练、fp32训练和fp16混合精度训练)的详细讨论。
- 潜在影响:对模型转换和量化技术的深入理解将有助于提高模型性能和减少资源消耗,特别是在GPU限制的情况下。
详细内容:
标题:关于 FP16 和 BF16 的无尽困惑与思考
在 Reddit 上,一篇题为“Reflection and the Never-Ending Confusion Between FP16 and BF16”的帖子引发了热烈讨论。该帖子获得了众多关注,评论数众多。帖子主要探讨了 Reflection 模型在上传至 Hugging Face 后表现不佳的问题,并指出其中可能存在的权重转换错误,即从 BF16 转换为 FP16 可能导致大量信息丢失。
讨论的焦点主要集中在 BF16 与 FP16 转换带来的影响上。有人认为,BF16 到 FP16 的转换并非如帖子所说的那样具有极大破坏性。比如,有用户指出“根据 llama.cpp 开发者进行的测试,BF16 和 FP16 之间的困惑度差异实际上比 FP16 到 Q8 的差异小 10 倍。虽然困惑度不是一个完美的衡量标准,但它肯定表明这种转换并非像说的那样灾难性。”
但也有人坚持认为不能随意进行这种转换。例如,有用户说“BF16 的主要优势在于它可以表示 FP16 无法表示的一些极高值,这在训练期间很重要,但训练后的检查点通常一开始就不会有很多这样的值。而且由于 FP16 实际上在小数位方面具有更高的精度,在转换过程中在这方面不会有任何损失。”
还有用户提到实际应用中的情况,比如“仍有一些人出于某些原因在 FP16 中微调模型(可能是因为 T4 在 Colab 上是免费的)。” 也有人表示“不是每个人都能使用最新的 GPU。我必须为我的客户在 fp32 中训练 whisper,因为他们能使用的最好的 GPU 是 v100。”
关于这一话题的讨论仍在继续,不同观点的碰撞也让人们对 FP16 和 BF16 有了更深入的思考。
感谢您的耐心阅读!来选个表情,或者留个评论吧!