ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

NInfer 量化 GEMM 算子调优指南:200+ 内核文件背后的单卡性能秘密

NInfer 量化 GEMM 算子调优指南:200+ 内核文件背后的单卡性能秘密 NInfer 量化 GEMM 算子调优指南200 内核文件背后的单卡性能秘密【免费下载链接】ninferHigh-performance single-GPU inference for selected model checkpoints and GPUs.项目地址: https://gitcode.com/gh_mirrors/ni/ninferNInfer 是一个从零构建的 C/CUDA 单卡推理引擎专为 RTX 5090 上的 Qwen3.5/3.6 系列模型优化。它的核心性能秘密藏在 src/ops/linear/ 目录里——超过 200 个量化 GEMM 内核文件覆盖 Q4、Q5、Q6、Q8、NVFP4、FP8 与 BF16 七种权重格式。本文将带你理解这些内核文件为何存在、如何测量与解读单卡量化 GEMM 的调优结果无需编写一行 CUDA 代码。上图是 examples/cli/ 中的视觉测试素材。无论是文字还是图片最终都要经过一层层矩阵投影Linear/GEMM——这正是量化内核的主战场。为什么量化 GEMM 是单卡推理的性能命脉大模型推理中一次 token 生成要跑几十层网络其中矩阵乘法GEMM占掉绝大部分时间。单卡没有多机通信的余地性能完全取决于权重读得快不快——小批量 decode 时耗时几乎全部花在读权重上带宽瓶颈Tensor Core 用得满不满——大 batch/prefill 时算力利用率决定吞吐。量化Quantization把 16 位的 BF16 权重压成 4/5/6/8 位整数或 FP4/FP8权重体积越小显存带宽瓶颈就越容易突破。NInfer 的 持久化张量格式规范 定义了它支持的七类权重编码格式每权重位宽分组规模典型用途bf1616 bit无分组高精度参考基线fp8_e4m3fn_row_bf168 行缩放每行 1 个 BF16 缩放大矩阵输出头nvfp44 bit 块缩放每 16 权重 1 个 FP8 缩放极限吞吐A4 激活路径q4_g64_fp164.25 bit64 权重共享 1 个 FP16 缩放draft head、视觉 QKVq5_g64_fp165.25 bit64 权重共享 1 个 FP16 缩放视觉注意力输出q6_g64_fp166.25 bit64 权重共享 1 个 FP16 缩放完整输出头q8_g32_fp168.5 bit32 权重共享 1 个 FP16 缩放MTP 投影层200 内核文件是怎么来的一张格式 × 策略 × shape地图打开 src/ops/linear/你会看到按量化格式划分的 7 个子目录每个目录内部又是按计算策略划分的内核族bf16/、fp8/、nvfp4/、q4/、q5/、q6/、q8/—— 每个格式一个目录目录内常见文件命名规律*_gemv.cu单 token 向量型内核、*_mma.cuTensor Core 矩阵乘、*_simt.cu标量/寄存器通用路径、*_sliced_k_mma.cu块内切分 K 维的部分和每个格式的shapes/子目录里是按精确 (N,K) 形状命名的定制实现例如 n6144_k5120.cu、n248320_k5120.cu这就是文件数量爆炸的原因同一个量化格式在不同 token 数 T 下最优策略完全不同。T1 用 GEMV 最省带宽T8~128 用 sliced-K 或 MMAT≥512 用 TMA 大规模 MMA。每种组合都要单独编译、单独调参。视觉请求的每个 patch 也要穿过 Linear 算子Vision suite 中登记了 patch、QKV、merger 等 7 组精确几何所以这些形状专属内核不是过度工程而是真实模型几何的一一映射。如何测量linear bench 三类命令NInfer 为 Linear 算子提供了独立的长期基准 bench/ops/linear_bench.cu其合同定义在 linear-benchmark.md。新手只需记住三种用法单点测量指定格式、形状和 token 数./build/bench/ninfer_linear_bench \ --qtype q4 --policy a16 --n 4096 --k 5120 --t 8小 T 扫描找性能台阶./build/bench/ninfer_linear_bench \ --qtype q4 --policy a16 --n 4096 --k 5120 \ --sweep 1:32:1扫描会输出相邻 token 数的耗时变化百分比用于发现不合理的阶跃和路线切换边界。典型模型 suite一键跑完代表几何./build/bench/ninfer_linear_bench --suite qwen3_6_27b27B suite 覆盖输出头Q6、draft headQ4、GDN 输出门Q5、MTP 投影Q8等 49 个精确点位35B-A3B suite 有 37 个--suite all合并去重为 68 个唯一点。关键指标带宽利用率与 Tensor Core 利用率怎么读基准输出采用与路线无关的统一口径方便横向比较不同量化实现model_bytes 权重字节 2*K*T输入 2*N*T输出 逻辑带宽 model_bytes / 耗时 / 1e9 有效算力 2*N*K*T / 耗时 / 1e12分母使用固定硬件规格RTX 5090 标称 1792 GB/s DRAM 带宽另附实测可持续纯读参考 1674.5 GB/s来自 hbm_bandwidth_probe.cu。以官方保留报告 Q4 6144×5120 案例 为例CUDA Graph 单次调用、冷缓存 medianT延迟 (µs)逻辑带宽 (GB/s)带宽利用率Tensor Core 利用率115.651069.459.68%—GEMV 路径823.74711.439.70%10.12%12881.18241.413.47%47.35%512212.19133.17.43%72.46%1024381.70104.25.82%80.57%读表口诀T1 看带宽T512/1024 看 Tensor Core。小 T 阶段权重只读一遍逼近读带宽上限就是满分大 T 阶段权重被复用Tensor Core 效率才是胜负手。新手调优清单5 步建立正确的工作流按 linear-tuning.md 的规范建议按此顺序推进先跑 suite 建立基线——--suite qwen3_6_27b记下每个 point 的 median这是判断回退的参照测满热区间 1~128 的每个合法整数 T——重点核对 T1、4、8并发 decode 与投机验证的直接对应点用 sweep 定位台阶——曲线上的跳变通常对应路线切换GEMV→sliced-K→MMA判断它是否合理大 T 锚点单独报告——T512 与 T1024 分别测量不要用平均值掩盖某一侧的回退候选实验临时做决定只写进生产 selector——临时 sweep 和私有 launcher 用完即删长期基准永远只走公开linear()入口见 op-development.md 的候选工作流。延伸阅读基准合同与预置 suitedocs/maintainer/linear-benchmark.md调优区间与报告规范docs/maintainer/linear-tuning.mdQ4 完整调优报告范例含 130 个实测点docs/maintainer/examples/q4-linear.md持久化张量九种数值格式定义docs/maintainer/tensor-formats.mdLinear 公开算子契约含支持的 shape 注册表include/ninfer/ops/linear.h各算子内核基准与构建说明bench/README.md理解了格式 × 策略 × 精确形状这个三维组织方式你就能读懂 NInfer 200 内核文件背后的单卡性能秘密不是写得更多而是每个真实模型几何都被单独善待过。【免费下载链接】ninferHigh-performance single-GPU inference for selected model checkpoints and GPUs.项目地址: https://gitcode.com/gh_mirrors/ni/ninfer创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表