把 KV Cache 压到 FP4:BitDecoding-FP4 的算法-系统协同设计复盘

C# 上位机之海康工业相机开发(SDK)实战教程 海康工业相机的C#开发核心是基于MVS SDK的“初始化→枚举→连接→采集→释放”流程,其中图像回调处理和格式转换是关键。严格按照SDK文档处理设备类型(网口/USB)和像素格式;及时释放图像资源,避免内存泄漏;错误码是排查问题的重要依据(可参考SDK中的“错误码说明”文档)。掌握这些基础后,可结合机器视觉算法(如OpenCV)实现缺陷检测、尺寸测量等高级功能,构建完整的工业视觉系统。 阅读详情

从今天觉醒,技术赋予每一个人数字生命


把 KV Cache 压到 FP4:BitDecoding-FP4 的算法-系统协同设计复盘

长上下文推理的真正瓶颈从来不是算力,而是 KV Cache 的容量与带宽。一个 128K 上下文的请求,KV Cache 轻松吃掉几十 GB 显存,decode 阶段每步都要把整段缓存从 HBM 里拖一遍——吞吐被显存带宽锁死,并发被显存容量锁死。4-bit 微缩放格式(NVFP4、MXFP4)加上原生 FP4 Tensor Core 看起来是答案,但过去一年实测下来,两条路都走不通:

  • 系统先行的 FP4 方案:直接把 KV 做 vanilla 量化塞进 FP4 Tensor Core,带宽省了,精度崩了;
  • 算法先行的 4-bit 方案(vector codebook 一系):精度守住了,但 codebook 查找的开销把 decode 吞吐打回原形,而且根本喂不饱 Tensor Core。

An abstract conceptual illustration of data compre

这就是 BitDecoding-FP4 要解决的断裂带:算法量化与系统加速之间的鸿沟。实测效果先摆出来:在 B300 上跑 Qwen3-4B 和 Qwen3-30B-A3B,峰值服务吞吐相比 BF16 KV 提升 2.4–3.0 倍;精度上 NVFP4 与 BF16 KV 差距在 0.5 分以内(MXFP4 在 1 分以内),且在 RL 训练 rollout 中能紧贴 BF16 KV 的轨迹。下面拆解它怎么做到的,以及我们复现时踩过的坑。

背景与痛点:误差预算花在了哪

FP4 只有 16 个可表示值,直接量化注意力链路,误差集中在三个位置,各有不同的失效模式:

  1. Query:单次 FP4 量化后,attention logit 相对误差高达 60%——softmax 前的分数已经面目全非;
  2. Softmax 概率:长上下文下概率分布极平,最大值可能只有 1e-3 量级,用 E4M3 做 scale 时直接下溢归零,注意力权重整行消失;
  3. Key 异常通道:token-wise scaling 下,个别 outlier channel 撑爆 block 的 dynamic range,其余值全部被压进最低量化档。

不解决的代价很直接:要么掉精度换不来速度,要么换来速度不敢上线。

方案设计:三个算法补丁 + 一个系统重构

设计原则只有一条:每个误差源用针对性的算法手段压掉,且手段本身必须与原生 FP4 MMA 兼容——凡是需要查表、反量化回高精度的路,一律不走。

  • Dual-Residual Query Quantization:把 Q 拆成两个 FP4 张量 Q₁ + Q₂,logits = Q₁Kᵀ + Q₂Kᵀ。多一次 FP4 GEMM,仍然是 Tensor Core 原生路径,logit 误差从 60% 压到 1%;
  • Underflow-Aware Probability Scaling:在选 scale 时就约束下溢边界,不让长上下文概率被 E4M3 舍成零;
  • Outlier-Aware Key Quantization:static smoothing + Hadamard rotation + scale search 三连,在 token-wise scaling 下摊平 Key 异常值。

系统侧用转置 softmax 把概率量化融进 kernel(消除 softmax 瓶颈),并用 stacked query MMA 适配 paged KV cache,保证 Tensor Core 不断粮。

明确放弃的方案:vector codebook(查找开销与 Tensor Core 路径不兼容)、运行时 per-channel Key 量化(太贵)、P 矩阵保 FP8(省不了带宽还引入额外转换)。

核心实现

双残差 Query 量化(参考实现)

下面是可在任意 GPU 上验证趋势的 PyTorch 参考实现(算法级,非 kernel):

import torch

# E2M1 全部可表示值
FP4_LEVELS = torch.tensor([-6., -4., -3., -2., -1.5, -1., -0.5, 0.,
                            0.5, 1., 1.5, 2., 3., 4., 6.])

def fp4_quant(x: torch.Tensor, block: int = 16):
    """NVFP4 风格:block 内共享 scale,最近邻量化到 E2M1 网格。"""
    B, D = x.shape
    pad = (block - D % block) % block
    x = torch.nn.functional.pad(x, (0, pad)).view(B, -1, block)
    amax = x.abs().amax(-1, keepdim=True).clamp_min(1e-8)
    q = x / (amax / 6.0)
    idx = (q.unsqueeze(-1) - FP4_LEVELS.to(x.device)).abs().argmin(-1)
    return (FP4_LEVELS.to(x.device)[idx] * (amax / 6.0)).view(B, -1)[:, :D]

def dual_residual_fp4(qt: torch.Tensor):
    q1 = fp4_quant(qt)
    return q1 + fp4_quant(qt - q1)   # 第二级 FP4 吸收残差

torch.manual_seed(0)
Q, K = torch.randn(8, 128) * 2, torch.randn(4096, 128)
ref = Q @ K.T
e1 = (fp4_quant(Q) @ K.T - ref).abs().mean() / ref.abs().mean()
e2 = (dual_residual_fp4(Q) @ K.T - ref).abs().mean() / ref.abs().mean()
print(f"single: {e1:.2%}  dual-residual: {e2:.2%}")

合成数据上能看到误差数量级的下降;真实模型张量上的 60%→1% 与论文口径一致。

异常值感知的 Key 量化

def hadamard_matrix(n: int):
    H = torch.ones(1, 1)
    while H.shape[0] < n:
        H = torch.cat([torch.cat([H, H], 1), torch.cat([H, -H], 1)], 0)
    return H / n ** 0.5

H = hadamard_matrix(128).to(K.device)   # head_dim=128,2 的幂直接用
K_rot = K @ H                            # 旋转摊平 outlier channel
Q_rot = Q @ H                            # Q 必须同步旋转:(QH)(KH)ᵀ = QKᵀ

Hadamard 矩阵正交且自逆(归一化后 HH = I),旋转不改变注意力结果,只重新分配各通道能量,让 token-wise FP4 的 scale 不被单个 outlier 绑架,再配合 scale search 选最优缩放。

Kernel 侧:转置 softmax 融合

关键点是改变 softmax 的数据布局,让概率归一化与 FP4 量化在同一个 kernel pass 内完成,避免中间结果落 HBM;scale 选择逻辑里加下溢保护(小于 E4M3 最小正规格时提升 scale)。paged KV 上用 stacked query MMA 把多个 query 块拼进一次 MMA,掩盖 block table 寻址延迟。

效果验证

复现环境:NVIDIA B300(Blackwell Ultra),CUDA 13.x,PyTorch 2.9+。算法参考代码(上文)任意 GPU 可跑;端到端 kernel 需要原生 FP4 Tensor Core:

git clone https://github.com/OpenBitSys/BitDecoding-FP4.git
cd BitDecoding-FP4 && pip install -r requirements.txt
# 具体 benchmark 入口以仓库 README 为准

结论(dense + MoE,GQA + MLA 均覆盖):NVFP4 精度差 ≤0.5 分,MXFP4 ≤1 分;峰值吞吐 2.4–3.0×;RL rollout 轨迹贴 BF16。

踩坑记录:

  1. 概率整行归零变 NaN:长上下文下未做下溢保护时,softmax 输出量化后全零,归一化除零。排障方法:按行检查注意力概率和,定位到 scale 选择逻辑加 clamp。
  2. Hadamard 维度陷阱:head_dim 非 2 的幂(如 MLA 变体)不能直接构造,需要分块 Hadamard 或正交填充——padding 不保持正交性会引入静默精度损失,loss 不掉但长文本 eval 缓慢劣化。
  3. Scale 布局混用:NVFP4 block=16、MXFP4 block=32,paged cache 里 scale 张量 layout 弄混后输出"看起来差不多对",极难排查。务必先用小输入对拍 FP32 参考再上大模型。

边界与演进

硬性约束:依赖 Blackwell 及以后的原生 FP4 Tensor Core,Hopper/Ampere 上这套不成立(低 bit 模拟路径请看前代工作)。方案聚焦 decode 阶段,prefill 仍是计算密集的 BF16 领地。MXFP4 精度略逊于 NVFP4,硬件支持时优先后者。下一步值得关注的是与主流 serving 框架的深度集成,以及 FP4 KV 与低 bit 权重的协同设计——当缓存和权重都进 4-bit,长上下文服务的成本模型会被重写。

10、智慧变电站 - 加载vue大屏元素(整体效果) 这一篇文章非常简单,但是也非常出效果阅读前面几篇文章,都可以看到有顶部、左侧、右侧的面板,主要我不会录gif图片,大屏元素面板还有一些动态加载的效果。 vue的transition标签 Vue 提供了 transition 的封装组件,可以给任何元素和组件添加进入/离开过渡;在进入/离开的过渡中,会有 6 个 class 切换:v-enter 、v-enter-active 、v-enter-to 、v-leave 、v-leave-active 、v-leave-to。我们正好使用这个特性来达到面板进入 阅读详情

相关推荐

VoLTE吞字断续优化方案

网络侧通过各节点探针的数据采集,能够进行RTP和RTCP包的分析,确定各节点的上行或下行丢包情况。1.基于测试语音分析,每2秒中大约8个字,每个字约10个RTP语音包。通话过程中,语音有短暂停顿,收音段听语音中会出现“吞字/断续现象”2.连续丢3~5个RTP以上就可能会出现吞字断续的感觉。下行评价的丢包问题,很难有效指导定界定位分析,无从下手。2.部分终端可能存在RTCP不反馈,导致无法获取丢包。1.语音包为UDP包,无反馈,终端无法判定是否丢包。终端可依据自身的调度反馈或弃包进行上行丢包判决。

m0_73503557的博客 1513

视频隐私脱敏工程化:CSRT/KCF追踪算法在本地推理中的实现与边界

在短视频内容合规审查中,动态遮挡(Dynamic Masking)是高频且高耗时的环节。传统手动关键帧打码不仅效率低下,且在目标快速移动或遮挡时极易出现遮罩漂移。本文从计算机视觉工程角度,解析基于CSRT与KCF算法的目标追踪方案在视频隐私处理中的技术路径、性能权衡及落地实践。

Mysssone的博客 231

SNN目标识别MNIST

总体来说这篇论文提出的方法用了多种更精密的细节,如LIF膜电位公式,三种STDP方法,但我觉得还可以有很大的改进,比如输入层全连接到兴奋层,兴奋层通过抑制层实现的侧向抑制,抑制层不参与学习等等。尤其是兴奋层通过抑制层实现侧向抑制这里,当神经元兴奋时,通过抑制层再倒回兴奋层,所抑制的已经经过一了一段时间的延迟。如有错误,请不吝赐教。

m0_74982304的博客 1262

【算法拾光】链表 哈希表|K个一组翻转链表 + 两数之和

K个一组翻转链表需分段反转,借助哑节点与前驱指针维护连接,避免断链;两数之和利用哈希表实现O(1)查找,空间换时间,高效定位目标组合。前者考察链表指针操作,后者聚焦映射关系构建,均为面试高频题。

wuqingyigexiaoba的博客 318

微带天线理论学习笔记(1)

微带天线的概念是由Deschamps于1953年提出来的,它是在一块厚度远小于工作波长的介质基片的一面敷以金属辐射片、一面全部敷以金属薄层作接地板而成。辐射片可以根据不同的要求设计成各种形状。微带天线具有质量轻、体积小和易于制造等优点,广泛应用于个人无线通信中。

qq_36521926的博客 6227

CAN开发笔记(TI开发者推荐笔记)

查阅了很多资料没有查阅到关于5728芯片CAN模块寄存器的介绍,希望通过本文能给做CAN驱动的后来者有一点参考意义,我也是刚接触CAN模块有些不足请各位多多指正。 由下图所示是CAN模块初始化流程图 首先要开始初始化,设置CAN位时间,然后配置message objects, 完成初始化。 1.开始初始化 首先要控制DCAN_CTL 寄存器,该寄存器是CAN模块的总控制器,很多配置通过...

weixin_44316996的博客 3562

排序算法深度笔记(下):非比较类排序的线性突破与工程边界

排序算法时间复杂度额外空间复杂度稳定性是否基于比较选择排序O(N^2)(O(1))不稳定是冒泡排序O(N^2)(O(1))稳定是插入排序O(N^2)(O(1))稳定是归并排序O(N\log N)(O(N))稳定是快速排序O(N\log N)O(log N)不稳定是堆排序O(N\log N)O(1)不稳定是计数排序(O(N + M))O(M))稳定否基数排序O(N)稳定否桶排序平均O(N) / 最坏O(N^2)

2401_87069538的博客 593

LTX-2.3 V1.6:8G显存本地AI视频生成工具与int8量化加速实践

这次我们来看一个本地部署的AI视频生成工具——LTX-2.3文字图片生成带音频视频工具V1.6版本。这个工具最大的特点是支持int8量化加速,相比原版提速2-4倍,效果更好,而且8G显存就能运行,不需要搭建复杂环境,解压即可使用。 对于想要在本地电脑上快速生成带音频视频内容的用户来说,这个工具解决了几个关键痛点:首先是硬件门槛低,8G显存意味着大多数主流游戏显卡都能胜任;其次是部署简单,避免了Python环境配置、依赖包冲突等常见问题;最后是性能优化明显,int8加速让生成速度大幅提升。 本文会重点演示如何

hqmln的博客 1235

优选算法:分治-归并排序

交易逆序对的总数

Wangshijie1015的博客 92

基于STM32+OV7670的图像采集系统(基础篇:ov7670介绍)

一、简单认识 先来看一下外观: OV7670,图像传感器,体积小,工作电压低,提供单片VGA摄像头和影像处理器的所有功能。通过SCCB总线控制,可以输入整帧、子采样、取窗口等方式的各种分辨率8位影像数据。 其他介绍比较繁琐,这里就不一一赘述了,我们只需要知道它是通过SCCB总线控制的就行了。 带FIFO与不带FIFO 目前市场上购买的ov7670模块分为两种,一种是不带FIFO芯片、一种是带FIFO芯片的。 FIFO是什么:(First Input First Output)先入先出的意思,

m0_59113542的博客 4万+

基于YOLO11深度学习的糖尿病视网膜病变智能诊断系统【Python源码+Pyqt5界面+数据集+训练代码】

本文详细介绍如何利用YOLO11深度学习技术构建糖尿病视网膜病变智能诊断系统。项目提供完整的Python源码、PyQt5图形界面、标注数据集及训练代码,实现从图片、视频到摄像头的多模态病变检测,旨在辅助医疗筛查,提升诊断效率。

weixin_29089057的博客 277

算法日常・每日刷题--<动态规划>42

本题为“不相交的线”,与最长公共子序列问题相似。使用动态规划求解:定义 dp[i][j] 表示 nums1[0:i] 与 nums2[0:j] 的最大不相交连线数。若元素相等,则继承左上值加1;否则取上方或左方最大值。最终返回 dp[m][n],即两数组的最大不相交连线数。时间复杂度 O(mn),空间复杂度 O(mn)。

2503_92261635的博客 22

SAP CDS View 教程里的标准视图:SEPM_I_SalesOrderItem_E 当成一张表来用之前,你需要先弄清它到底是什么

摘要:SEPM_I_SalesOrderItem_E 是 SAP EPM demo 中的预交付 CDS 视图,用于表示销售订单行项目数据。它采用 VDM 命名规范,_E 后缀表示对外隐藏内部 UUID 键,提供业务友好的外部 ID 接口。该视图常见于 ABAP Platform 7.50+、开发版系统及 Gateway 教程中,可像表一样通过 Open SQL 查询。实际项目中,这类视图能有效解决内外系统键值映射问题,示例代码展示了如何查询其数据。使用时需注意系统是否安装了 EPM demo 内容。

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 552

C语言程序设计题|有序数组插入数字冒泡排序

题目要求将一个数插入有序数组末尾,并用冒泡排序实现整体升序。代码先将输入数存入数组最后位置,再通过双重循环进行冒泡排序,每轮将较大元素向后移动,最终输出11个升序元素。该方法虽时间复杂度为O(n²),但符合题目要求,逻辑清晰,适合初学者理解排序原理。

2301_81429079的博客 750

IMSL CNL 7.0.0 (x86-64)Crack

IMSL CNL 7.0.0 (x86-64)Crack intel的算法库破解文件,这是C++版本的破解文件

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

408 算法 06|堆与 Top-K:最小的 10 个数,到底该用数组还是堆

2022(42) 找 100 万个数里最小的 10 个,官方给了"10 元素有序数组"和"大根堆"两种答案。我把两种都实现并数了比较次数:k=10 时两者几乎打平,k=10000 时堆少 111 倍。另附 2021(42) 计数排序的比较次数与稳定性实测。

m0_56226131的博客 352

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

牛客周赛165C题(前后缀性质,递推,排序,枚举)

题目大意:给定长度为 `n` 的数组,选择 `k ∈ [1,n]`,将前 `k` 个元素整体翻转,后面的元素不变。要求操作后的整个数组非递减,统计满足条件的 `k` 的数量。题目链接:https://ac.nowcoder.com/acm/contest/141721/C。时间复杂度:O(nlogn)

2501_94316951的博客 172

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

408 算法 04|主元素与三元组最小距离:两种“扫描时做决定“的思路

2013(41) 的主元素用摩尔投票一遍选出候选,但真正的考点是"选完必须验票";2020(41) 的三元组最小距离,三指针每次只挪最小的那个,靠的是 D=2×(max−min) 这个恒等式。两套完整 C 代码加真实输出,附官方评分档位表。

m0_56226131的博客 414

【数据结构-3】算法美学之降复杂度

在while循环的循环体内,首先用临时变量保存最后一个位置的数据,再通过for循环把所有元素往后移动一位,最后把tmp中保存的值放到下标为0的位置上去。方法二的思路是:创建新数组,让原数组中后k个数据移动到新数组中前面的位置,让原数组中前numsSize-k个数据移动到新数组中后面的位置,这。这段代码的思路是:三次逆置,第一次逆置前numsSize-k个数据,第二次逆置后k个数据,最后整体逆置。这篇博文分享一道解法不一的算法题,求解过程的目的在于降低算法的时间复杂度,题源力扣。,属于空间换时间的操作。

weixin_44218929的博客 89

算法61,判定是否为字符重排

两字符串能互为重排 ⇔。

sheshibenniaodan的博客 219

算法日常・每日刷题--<动态规划>32

给定严格递增的正整数数组,求最长斐波那契子序列长度。使用二维DP,dp[i][j]表示以arr[i]、arr[j]为最后两项的序列长度,初始化均为2。通过哈希表快速查找前一项target = arr[j] - arr[i],若存在且下标小于i,则状态转移:dp[i][j] = dp[k][i] + 1。遍历更新全局最大长度,最终若结果小于3则返回0。时间复杂度O(n²),空间复杂度O(n²)。

2503_92261635的博客 178

【前缀和+复合离散化】题解:双色矩形(two)_数据结构_算法优化_预处理_二维前缀和_STL_C++算法竞赛

给定一个 $n \times n$ 的黑白棋盘,初始按 $i+j$ 奇偶染色,经 $k$ 个格子颜色翻转后,求子矩形中黑白格子数差的绝对值最大值。由于 $n$ 可达 $10^9$,但 $k \leq 50$,可离散化关键点。枚举所有由修改点构成的矩形及其四边向外扩展(共 $16$ 种扩展方式),利用二维前缀和快速计算变化量,结合奇偶性判断多出的格子颜色,最终取最大绝对差。时间复杂度为 $O(k^4)$,在 $k \leq 50$ 下可行。

YLCHUP的博客 43

算法札记:几何分布在算法题UVA1262的运用

集卡问题求解核心:将集齐n种优惠券的过程分为n个阶段,每个阶段期望购买次数为 $ \frac{n}{k} $(k为剩余种类数),总期望为 $ n \cdot H_n $(调和数)。通过自洽方程推导单阶段期望,无需几何分布或无穷级数,逻辑清晰且适用于大一水平。例如,n=5时期望约11.42,非5。题目要求以带分数形式输出精确结果,算法上需累加分数并化简。

Keven_11的博客 360

SSL证书选RSA还是ECDSA:公钥算法、CA签名与兼容性怎么核对

申请SSL证书时,RSA和ECDSA该怎么选?先分清站点公钥算法、CA签名算法和TLS实际兼容性,再用隔离OpenSSL实验读取两类材料,核对申请、续期和部署交接,避免只看Signature Algorithm就选错。

谁呀!的博客 400

考拉兹猜想 - 7

本文通过引入虚数单位重构Collatz猜想的迭代逻辑,指出偶数减半与奇数“乘3加1”的过程在虚数坐标下等价于归结操作。关键在于:乘3加1使奇数跃升至偶数,随后持续减半,而虚数单位代表“无限减1”,实现无限向有限的转化。无论初始值如何,减半始终主导,最终归结为4-2-1循环。该视角消解了正向思维中的速度竞争疑虑,证明归结是必然结果。

杨铸人的博客 45

贪心题目:可以到达的最远建筑

为了到达尽可能远的建筑物,在将砖块替换成梯子时,应将高度差最大位置的砖块替换成梯子,此时剩余的砖块数量最多,如果将高度差较小位置的砖块替换成梯子,则剩余的砖块数量较少,能到达的最远建筑物下标不可能更大。开始向后面的建筑物移动,移动过程中维护优先队列存储正高度差,优先队列的队首元素是最大元素,每次遇到正高度差时优先考虑使用砖块,如果砖块数量不够则使用梯子替换最大高度差位置的砖块,直到砖块和梯子都使用完毕时,到达的建筑物即为最远建筑物。如果以最佳方式使用给定的梯子和砖块,返回可以到达的最远建筑物的下标。

stormsunshine的博客 293

强化学习第十一课:完整 Q-Learning 算法

表示有:\[ 5 \]0 1 2 3 40:向左1:向右目标位置:\[ 4 \]

qq_56657939的博客 306
上一篇: 把具身任务搬进屏幕:一套 CUA 打通四个赛道的实战记录
下一篇: 被困在桌面里的AI,与腾讯WorkBuddy的开放生态突围
I Am a robert girl
博客等级 码龄167天 6粉丝 176原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值