跳转至

说明

说明

tiny_quant_config.h 集中定义了量化子系统的数据类型枚举、量化参数结构以及各种格式的极值常量。所有 INT / FP8 量化函数都依赖这些类型,是整个 quant 模块的基石。

Quant Config — 量化数据类型与参数结构体

定义 \(tiny\_dtype\_t\) 枚举和 \(tiny\_quant\_params\_t\) 结构体。

参考

枚举值 名称 位宽
TINY_DTYPE_FP32 32 位浮点 32
TINY_DTYPE_INT8 8 位有符号整数 8
TINY_DTYPE_INT16 16 位有符号整数 16
TINY_DTYPE_E4M3FN FP8 (E4M3FN) 8
TINY_DTYPE_E5M2 FP8 (E5M2) 8

tinydtypet

typedef enum
{
    TINY_DTYPE_FLOAT32  = 0,  // 32-bit IEEE 754 float(原生计算类型)
    TINY_DTYPE_INT16    = 1,  // 有符号 16-bit
    TINY_DTYPE_INT8     = 2,  // 有符号 8-bit(ESP32-S3 上最硬件友好)
    TINY_DTYPE_FP8_E4M3 = 3,  // 8-bit float E4M3FN:范围 ±448,权重/激活
    TINY_DTYPE_FP8_E5M2 = 4,  // 8-bit float E5M2:范围 ±57344,梯度
} tiny_dtype_t;

tinyquantparams_t

typedef struct
{
    tiny_dtype_t dtype;
    float        scale;       // float_val = scale * (quant_val - zero_point)
    int          zero_point;  // 对称量化 / FP8 时为 0
} tiny_quant_params_t;

tiny_ai 默认使用 对称量化zero_point = 0):

\[ \mathrm{quant} = \mathrm{round}(x / \text{scale}),\quad x = \text{scale} \cdot \mathrm{quant} \]

scaletiny_quant_calibrate_minmax 根据张量绝对最大值计算:

\[ \text{scale} = \frac{\max(|x|)}{Q_\text{max}} \]

其中 \( Q_\text{max} \) 为 INT8 = 127、INT16 = 32767、FP8 E4M3 = 448、FP8 E5M2 = 57344。

格式极值

// FP8 E4M3FN(OCP 规范):无 ±inf,NaN 编码为 0x7F / 0xFF
#define TINY_FP8_E4M3_MAX   448.0f
#define TINY_FP8_E4M3_MIN  (-448.0f)
#define TINY_FP8_E4M3_NAN   0x7Fu

// FP8 E5M2:支持 ±inf 与 NaN
#define TINY_FP8_E5M2_MAX  57344.0f
#define TINY_FP8_E5M2_MIN  (-57344.0f)
#define TINY_FP8_E5M2_INF  0x7Cu
#define TINY_FP8_E5M2_NAN  0x7Fu

// INT8 / INT16 对称范围
#define TINY_INT8_MAX   127
#define TINY_INT8_MIN  (-128)
#define TINY_INT16_MAX  32767
#define TINY_INT16_MIN (-32768)

选择哪种 dtype

场景 建议 dtype 备注
部署纯推理 + 内存敏感 INT8 与 INT8 dense kernel 配合,4× 压缩
高精度推理 / 中间统计量 INT16 2× 压缩,几乎无精度损失
静态权重,需要 FP 表达 FP8_E4M3 4× 压缩,比 INT8 表达范围更大
梯度 / 反向中间结果 FP8_E5M2 范围更大、精度更低,适合梯度
训练时全程 FLOAT32 反向稳定性最高

命名空间

tiny_quant_config.h 中的类型与常量都暴露在全局 / extern "C" 段,C 与 C++ 都能直接使用。tiny_quant.hpp 在此基础上提供 tiny::QuantParams

struct QuantParams
{
    tiny_dtype_t dtype;
    float        scale;
    int          zero_point;

    tiny_quant_params_t to_c() const { return { dtype, scale, zero_point }; }
};

to_c() 方便在 C++ 调用 C 接口(例如 tiny_quant_f32_to_int8)。