news 2026/9/11 11:09:34

如何编译 BitNet W2A8 CUDA 内核并用 test.py 运行 GEMV 加速测试?

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
如何编译 BitNet W2A8 CUDA 内核并用 test.py 运行 GEMV 加速测试?

如何编译 BitNet W2A8 CUDA 内核并用 test.py 运行 GEMV 加速测试?

【免费下载链接】BitNetOfficial inference framework for 1-bit LLMs项目地址: https://gitcode.com/GitHub_Trending/bitne/BitNet

BitNet 仓库的 gpu/ 目录提供了一组针对 W2A8 推理(2-bit 权重 × 8-bit 激活)的自定义 CUDA GEMV 内核,并配有现成的基准测试脚本。如果你的目标是验证这组内核相对 torch BF16 矩阵乘是否真的有加速,流程只有两步:先编译出libbitnet.so,再在gpu/目录下运行python test.py。前提是一台可用的 NVIDIA GPU——compile.sh 的编译目标是compute_80(Ampere 架构),gpu/README.md 中的基准数据也是在 NVIDIA A100 40GB 上测得的。

准备环境

按 gpu/README.md 的说明,用 conda 创建一个 Python 版本低于 3.13 的环境,并安装 gpu/requirements.txt 中的依赖(包含torch>=2.2.0xformers>=0.0.22transformers等):

conda create --name bitnet-gpu "python<3.13" conda activate bitnet-gpu # 以下命令默认在仓库的 gpu/ 目录下执行 pip install -r requirements.txt

还有三点依赖需要注意,都来自对 test.py 源码的直接检查:

  • test.py通过device='cuda'生成张量并取torch.cuda.current_stream(),因此需要可用的 NVIDIA GPU 和对应 CUDA 环境的 PyTorch;
  • 除 requirements.txt 中的包外,test.pyimport numpy,环境里缺 numpy 时需要先补装;
  • test.py依赖同目录下的本地模块 pack_weight.py,它负责权重的 16×32 块重排、2-bit 压缩打包和位交织,不要移动该文件。

编译 W2A8 CUDA 内核

cd bitnet_kernels bash compile.sh cd ..

compile.sh 的内容就是单条 nvcc 命令:

nvcc -std=c++17 -Xcudafe --diag_suppress=177 --compiler-options -fPIC -lineinfo --shared bitnet_kernels.cu -lcuda -gencode=arch=compute_80,code=compute_80 -o libbitnet.so

几个直接影响能否跑通 test.py 的细节:

  • -shared-o libbitnet.so表示编译成共享库,产物输出在当前目录
  • -gencode=arch=compute_80,code=compute_80指定目标为 compute capability 8.0(Ampere,如 A100);
  • test.py 通过ctypes.CDLL('bitnet_kernels/libbitnet.so')加载库,相对路径是bitnet_kernels/libbitnet.so——所以 compile.sh 必须在bitnet_kernels/目录内执行、且test.py必须从gpu/目录启动,否则找不到编译产物。

内核源码 bitnet_kernels.cu 的入口bitlinear_int8xint2按 (N, K) 形状硬编码了各形状专用的ladder_int8xint2_kernel模板实例,且只处理M == 1的 GEMV 调用;遇到未特化的形状,它只向屏幕打印required ladder gemm kernel: M ... N ... K ...提示,不会执行计算。bitnet_kernels/下另有一个 setup.py(CUDAExtension 打包形式),但 README 给出的主路径是 compile.sh。

README 的 “Optimizations” 一节说明了这组内核相对常规实现的三个优化点:权重矩阵按 16×32 块重排以优化访存、16 个 2-bit 值按交错模式打包进一个 32-bit 整数以加速解码,以及使用dp4a指令完成低精度点积累加。

运行 test.py 做 GEMV 基准测试

回到gpu/目录执行:

python test.py

脚本内部固定了 8 组测试形状(N×K):(2560, 2560)、(3840, 2560)、(13824, 2560)、(2560, 6912)、(3200, 3200)、(4800, 3200)、(3200, 10240)、(20480, 3200),每一组都分两个阶段:

  1. 正确性检查:生成随机 int8 激活和权重,权重经pack_weight.convert_weight_int8_to_int2压缩打包后调用内核,结果与 numpy 的 int32 矩阵乘逐元素比较,打印一行custom == np Truecustom == np False
  2. 计时对比:用torch.utils.benchmark.Timer分别对 W2A8 内核和torch.matmul(input0_bf16, weight_bf16)各计时 50 次(timeit(50)),按Shape(N, K), W2A8: <均值>us, torch BF16: <均值>us的格式打印。

这 8 组形状与 bitnet_kernels.cu 中的内核特化一一对应,因此按文档流程执行时每个形状都会真正走内核计算,而不会落到“unsupported shape”的提示分支。

如何判断结果

运行输出的两类行分别对应两种判断:

  • 正确性行应当是custom == np True,即内核输出与 CPU 上的 numpy 整数矩阵乘完全一致;
  • 性能行给出 W2A8 内核与 torch BF16 基线的延迟均值,例如输出形如:
Shape(3200, 10240), W2A8: 19.64us, torch BF16: 60.79us

注意这是文档中展示的结果格式,读者机器上跑出的具体数值取决于硬件和驱动环境。gpu/README.md 的 “Kernel Benchmarks” 表格给出了文档在 NVIDIA A100 40GB 上测得的参考数据:

Shape (N×K)W2A8 Latency (us)BF16 Latency (us)Speedup Ratio
2560 × 256013.3218.321.38
3840 × 256014.9018.871.27
13824 × 256018.7559.513.17
2560 × 691214.4937.782.61
3200 × 320014.6119.081.31
4800 × 320013.0921.841.67
3200 × 1024019.6460.793.10
20480 × 320030.99112.393.63

表中加速比从 1.27 到 3.63 不等,K 维度越大(即权重矩阵越宽的行数越多)加速越明显——这个规律可以直接用你自己跑出的两列数值核对。

限制与注意事项

  • 该内核只覆盖M == 1的 GEMV 场景,对应解码阶段的逐 token 生成计算;批量矩阵乘(M > 1)不在 bitnet_kernels.cu 的处理范围内,会落入提示分支;
  • 只有源码中硬编码的 (N, K) 形状会被实际计算,除 test.py 使用的 8 组外,源码还特化了(5120, 27648)(55296, 5120)两组;
  • 编译目标固定为compute_80,README 的对比表基于 A100 40GB;在其他 GPU 上执行 test.py 得到的绝对延迟和加速比都会与表中不同,判断时以正确性行全为 True、再结合自己环境下的两列延迟为准。

如果内核验证通过,gpu/README.md 还给出了端到端路径:用huggingface-cli下载 BitNet-b1.58-2B 权重,经convert_safetensors.pyconvert_checkpoint.py转换后用generate.py --interactive --chat_format做交互式推理,那一步会真正用上这里编译的内核。

【免费下载链接】BitNetOfficial inference framework for 1-bit LLMs项目地址: https://gitcode.com/GitHub_Trending/bitne/BitNet

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/9/11 11:05:25

云计算十年进化史:从OpenStack到Serverless的架构变迁与运维变革

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华
网站建设 2026/9/11 11:03:22

POA优化BP神经网络的时间序列单步预测与MATLAB实现

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华
网站建设 2026/9/11 10:59:41

微信聊天记录导出完整指南:WeChatMsg 用 3 条命令把微信记录留下来

微信聊天记录导出完整指南&#xff1a;WeChatMsg 用 3 条命令把微信记录留下来 【免费下载链接】WeChatMsg 提取微信聊天记录&#xff0c;将其导出成HTML、Word、CSV文档永久保存&#xff0c;对聊天记录进行分析生成年度聊天报告 项目地址: https://gitcode.com/GitHub_Trend…

作者头像 李华
网站建设 2026/9/11 10:58:38

基于IGDT与阶梯碳交易的多能系统优化调度建模与实现

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华