faiss库中ivf-sq(ScalarQuantizer,标量量化)代码解读-2

文件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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

haven-852

你的鼓励是对我最大的动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值