量化降低了模型权重和激活值的数值精度,这会影响 Sentence Transformer 嵌入和相似度计算的准确性和速度。较低的精度(例如,int8 或 float16)使模型更小、更快,但可能会引入轻微到中等的准确性损失。例如,将模型从 float32 转换为 float16 可以将内存使用量减少一半,而 int8 则进一步减少(约 75%),从而可以在针对较低精度优化的硬件上实现更快的计算。但是,降低的精度可能会导致舍入误差或嵌入中细粒度细节的丢失,这会影响相似度分数。
速度提升取决于硬件支持和量化方法。现代 GPU 和 TPU 具有专门用于 float16 和 int8 操作的单元,允许并行处理更多数据。例如,与 float32 相比,在兼容的 GPU 上使用 float16 可以减少 20-50% 的推理时间,就像 all-MiniLM-L6-v2
等模型的基准测试中所见。Int8 量化通常需要额外的步骤(例如,校准以将 float32 范围映射到 int8),但一旦应用,它可以使 CPU 密集型场景中的推理速度加倍。但是,并非所有操作都能获得同等的好处:矩阵乘法增益最大,而层归一化或激活可能获得的增益较小。像 ONNX Runtime 或 PyTorch 的 torch.quantize
这样的工具可以自动进行这些优化,但开发人员必须测试其特定环境中的延迟降低情况。
准确性影响因任务和数据集而异。例如,在语义相似度任务中,float16 通常保留 float32 准确性的 ~99%,因为嵌入保留了足够的精度。但是,根据模型和校准数据,int8 可能会使准确性下降 1-5%。校准不佳的 int8 模型可能会错误地对检索系统中的配对进行排序(例如,对于关键匹配,返回相似度分数为 0.85 而不是 0.92)。为了缓解这种情况,像 Hugging Face transformers
这样的库提供了带有校准数据集的训练后量化,从而最大限度地减少了准确性损失。对于大多数应用程序,float16 可以实现实际的平衡,而 int8 更适合于资源受限的部署,在这种部署中,可以接受轻微的准确性下降。使用特定领域的数据(例如,法律文本与社交媒体帖子)进行测试对于评估实际影响至关重要。