文件ScalarQuantizer.h
主要介绍这里面的枚举以及一些函数内容:QuantizerType、RangeStat、ScalarQuantizer、train、compute_codes、decode、SQuantizer、FlatCodesDistanceComputer、get_distance_computer、select_InvertedListScanner
QuantizerType
量化类型中包含一些枚举类型,代码内容如下:
enum QuantizerType {
QT_8bit, ///< 8 bits per component
QT_4bit, ///< 4 bits per component
QT_8bit_uniform, ///< same, shared range for all dimensions
QT_4bit_uniform,
QT_fp16,
QT_8bit_direct, ///< fast indexing of uint8s
QT_6bit, ///< 6 bits per component
QT_bf16,
QT_8bit_direct_signed, ///< fast indexing of signed int8s ranging from
///< [-128 to 127]
};
QuantizerType 枚举内容解析
枚举值 | 描述 | 适用场景 |
---|---|---|
QT_8bit | 每个分量用 8-bit 表示,分量间有独立范围(非均匀量化)。 | 精度较高,适用于一般场景。 |
QT_4bit | 每个分量用 4-bit 表示,分量间有独立范围(非均匀量化)。 | 精度较低但压缩率高,适用于存储敏感的大规模数据。 |
QT_8bit_uniform | 每个分量用 8-bit 表示,但所有分量共享一个范围(均匀量化)。 | 适合数据分布较均匀的场景,计算简单,存储开销低。 |
QT_4bit_uniform | 每个分量用 4-bit 表示,所有分量共享一个范围(均匀量化)。 | 存储极为节省,但精度较低,适合快速粗筛。 |
QT_fp16 | 每个分量用 16-bit 浮点数(half-precision floating-point) 表示。 | 高精度场景,兼顾压缩率和精度,但存储开销大于 8-bit 和 4-bit。 |
QT_8bit_direct | 直接使用无符号 uint8 值,无需量化,直接存储整数。 | 数据本身就是无符号 8-bit 整数,例如像素值。 |
QT_6bit | 每个分量用 6-bit 表示,比 8-bit 压缩但比 4-bit 精度更高。 | 存储与精度需求的折中选择,适合数据分布复杂但存储受限的场景。 |
QT_bf16 | 使用 bfloat16(16-bit 浮点数) 表示,范围与精度介于 fp16 和 uint8 之间。 | 适用于高动态范围但对精度要求不高的场景,例如部分深度学习推理中。 |
QT_8bit_direct_signed | 直接使用有符号 int8 值,无需量化,范围为 [-128, 127]。 | 数据本身就是有符号的整数,例如分量可能包含负值的数据。 |
为什么设置为这些类型?
支持不同的精度需求
- 数据量化需要在存储成本与精度之间找到平衡,不同类型的量化方式提供了不同的压缩率和精度。
- 8-bit 和 4-bit:提供了常见的两种量化方式,适合大多数存储需求。
- 6-bit:为 8-bit 和 4-bit 之间提供折中选择。
- fp16 和 bf16:用于精度较高的场景,支持浮点值表示。
适配多种数据分布 - 有些数据在不同维度的范围不同(非均匀分布),需要 非均匀量化(如 QT_8bit 和 QT_4bit)。
- 对于范围均匀的数据,可以使用 均匀量化(如 QT_8bit_uniform 和 QT_4bit_uniform),进一步减少存储复杂性。
提高存储效率 - QT_4bit 和 QT_4bit_uniform:只用 4-bit 表示每个分量,适合存储空间受限的大规模向量。
- QT_6bit:比 8-bit 进一步压缩,但比 4-bit 提供更高精度。
兼容特殊数据类型 - QT_8bit_direct 和 QT_8bit_direct_signed:直接存储原始值,不需要量化过程,适合已经量化好的数据或离散整数值。
RangeStat
代码内容如下:
enum RangeStat {
RS_minmax, ///< [min - rs*(max-min), max + rs*(max-min)]
RS_meanstd, ///< [mean - std * rs, mean + std * rs]
RS_quantiles, ///< [Q(rs), Q(1