项目背景
NF4 (-bit NormalFloat) 是 QLoRA 论文中提出的一种量化格式,专门针对神经网络权重服从正态分布的特点进行优化。与传统的均匀量化(如 INT4)或 FP4 不同,NF4 采用分位数量化:将标准正态分布 的累积分布函数等分为 个区间,每个区间内的概率质量相等,区间的边界值作为量化值。这 个量化值构成一个查找表,存储为 个 FP16 常数。
NF4 的优势在于:对于正态分布的数据,分位数量化比均匀量化能提供更高的精度,因为它在分布中心区域分配了更多的量化级别,而在尾部区域分配较少。
项目的要求便是要求基于 QLoRA 的论文:
- 正确实现 NF4 索引到 FP16 的映射(NF4 查找表预定义为 个常数,需硬编码在 Kernel 中)
- 正确实现两级缩放的解量化公式
- 实现向量化内存访问(Packed Store):每个线程一次处理两个 4-bit 索引,计算两个 BF16 值后打包成一个 32-bit
uint32_t一次性写入全局内存 - 支持任意形状的矩阵(行数和列数无需对齐到块大小的整数倍)
嗯,于是我就先去了解了一下 QLoRA 是个什么东西,然后后台挂着 Copilot 让它先给我写一版了。我的打算是让 Copilot 帮我把 read_param, read_weights, write_output, data generation 什么的给解决掉,然后再在 Copilot 写的 cuda kernel 上再做优化.