解决量化模型中的 NaN 问题:为何非量化层应选用 FP32?(41)
“等一下,为什么我们的量化模型中会有torch.float16参数呢?”
实际上,量化并不会应用到模型的每一层。只有少数经过精心挑选的层——你可以称之为“天选之层”——会被量化。当然,我是在开玩笑:量化的天然目标是解码器块内部那些庞大的线性层。这些层构成了模型参数的绝大部分,因此我们只需关注这些层,就能显著减小模型大小。
“好吧,但非量化层默认不应该是torch.float32吗?”
问得好!你可能会这么认为,毕竟FP32是默认的数据类型,对吧?然而,加载量化模型时会默认将其改为FP16,除非你主动指定torch_dtype参数。
“那我应该指定它吗?应该使用什么数据类型呢?”
是的,你或许应该指定,而且使用torch.float32可能是最佳选择。为了理解原因,让我们看看如果不指定会发生什么情况,也就是说,如果像上面的model_q8那样将非量化层保留为torch.float16的话:
out = model_q8(**batch)
out.loss
运行结果:
tensor