项目背景

NF4 (44-bit NormalFloat) 是 QLoRA 论文中提出的一种量化格式,专门针对神经网络权重服从正态分布的特点进行优化。与传统的均匀量化(如 INT4)或 FP4 不同,NF4 采用分位数量化:将标准正态分布 N(0,1)N(0, 1) 的累积分布函数等分为 1616 个区间,每个区间内的概率质量相等,区间的边界值作为量化值。这 1616 个量化值构成一个查找表,存储为 1616 个 FP16 常数。

NF4 的优势在于:对于正态分布的数据,分位数量化比均匀量化能提供更高的精度,因为它在分布中心区域分配了更多的量化级别,而在尾部区域分配较少。

项目的要求便是要求基于 QLoRA 的论文:

  1. 正确实现 NF4 索引到 FP16 的映射(NF4 查找表预定义为 1616 个常数,需硬编码在 Kernel 中)
  2. 正确实现两级缩放的解量化公式
  3. 实现向量化内存访问(Packed Store):每个线程一次处理两个 4-bit 索引,计算两个 BF16 值后打包成一个 32-bit uint32_t 一次性写入全局内存
  4. 支持任意形状的矩阵(行数和列数无需对齐到块大小的整数倍)

嗯,于是我就先去了解了一下 QLoRA 是个什么东西,然后后台挂着 Copilot 让它先给我写一版了。我的打算是让 Copilot 帮我把 read_param, read_weights, write_output, data generation 什么的给解决掉,然后再在 Copilot 写的 cuda kernel 上再做优化.