uv run main.py运行测试程序,终端输出误差以及性能分析报告
结果示例:
--- 正在执行: 编译 C++ CUDA 内核 ---
--- 正在执行: 生成随机量化权重 ---
维度: 32768x32768 | Block: 64 | Group: 256
数据已写入: ./data/qlora_test.bin
--- 运行反量化 ---
耗时: 24.4132 ms | 吞吐: 1106.48 GB/s
基准输出已保存: ./data/py_output.bin
--- 正在执行: 运行自定义 CUDA 内核 ---
原始元素: 1073741824
对齐元素: 1073741824
Launch Kernel...
Kernel 耗时: 21.6289 ms
有效带宽: 1248.91 GB/s
--- 正在执行: 对比精度与性能表现 ---
测试维度: 32768 x 32768
Python: ./data/py_output.bin
C++: ./data/cpp_output.bin
==================================================
误差分析报告
==================================================
平均绝对误差 (MAE):6.5369757067e-05
均方误差 (MSE):2.4582243441e-07
最大误差 (Max Diff):1.5625000000e-02
--------------------------------------------------
完全一致元素数:1043509311 / 1073741824
一致率:97.1844%
==================================================
随机数据采样对比
---------------------------------------------------------------------------
Index | Python (BF16) | C++ (BF16) | Diff
---------------------------------------------------------------------------
0 | 0.394531 | 0.394531 | 0.0000e+00
1 | 1.171875 | 1.171875 | 0.0000e+00
2 | -0.215820 | -0.215820 | 0.0000e+00
446162790 | -0.277344 | -0.277344 | 0.0000e+00
1066319814 | 0.000000 | 0.000000 | 0.0000e+00
230426597 | 0.205078 | 0.205078 | 0.0000e+00
951028163 | 0.322266 | 0.322266 | 0.0000e+00
857049811 | -0.566406 | -0.566406 | 0.0000e+00
527929503 | 0.718750 | 0.718750 | 0.0000e+00
23305680 | 0.000000 | 0.000000 | 0.0000e+00
168636035 | 0.134766 | 0.134766 | 0.0000e+00
660748068 | -0.625000 | -0.625000 | 0.0000e+00
801264382 | 0.098633 | 0.098633 | 0.0000e+00
---------------------------------------------------------------------------
bnb耗时:24.41320ms, 带宽:1106.47730GB/s
nf4 kernel耗时:21.62890ms, 带宽:1248.91000GB/s
data目录存放测试文件以及反量化的输出结果。 在param.txt中可以修改测试用矩阵大小等参数。 data/log目录存放输出的性能日志。
kernel_test目录中是kernel逐步优化的过程。
generate_data.py 用于生成随机矩阵,并使用bnb库量化后输出文件qlora_test.bin供nf4_kernel.cu读取进行反量化。同时generate_data.py将量化后的矩阵进行反量化并计时,性能日志输出到data/log/log_py.txt,运算结果输出到data/py_output.bin
nf4_kernel.cu是CUDA实现的nf4反量化算子,从qlora_test.bin中读取量化后的矩阵进行反量化,并将结果输出到data/cpp_output.bin,性能日志输出到data/log/log_cpp.txt
benchmark.py 是测试程序。读取cpp_output.bin与py_output.bin,对二者反量化结果进行精度对比。