大模型推理阶段KV计算分析:prefill和decode

大模型推理阶段分为两个过程,prefill和decode。prefill是用户输入完prompt到生成首个token的过程decode则为生成首个token到推理停止的过程

在prefill(预填充)阶段,大模型一次性对prompt中所有token进行计算QKV,由于不同token的计算是独立的,因此该过程可以并行。在attention部分,由计算得到的QKV进一步计算出Output矩阵,再经过后续的FFN层和解码得到首字母token。

在decode(解码)阶段,计算原理和prefill完全相同,但计算方式和decode是不能一样的。原因有两个。一是随着seqlen增加,Attention计算复杂度平方级增长,直接计算代价很大,导致长序列的推理时间极慢,甚至不可行。二是对decode阶段的计算过程简单分析发现,该过程可以复用prefill阶段的KV结果,也可以复用docode阶段已经产生的KV结果。综上,可以把已产生的KV存起来,不必重新计算,这就是KV cache。对于Q矩阵,每次需要计算的只是Q的最后一行q,计算关于qKV的attention,而不是关于QKV的attention,这样复杂度降低了一个量级,实现以存换算。

转自:https://zhuanlan.zhihu.com/p/716688741 

### 大模型中的PrefillDecode过程 #### Prefill 过程 在大模型处理输入序列时,Prefill 阶段负责初始化计算环境并执行初步的前向传播操作。此阶段的主要任务是对给定提示词(Prompt)进行编码,并生成初始隐藏状态表示。具体来说: - 对于每一个新请求,系统会先加载预训练好的权重参数。 - 接着将用户提供的文本转换成对应的token ID列表形式。 - 使用Transformer架构下的自注意力机制来捕捉上下文依赖关系[^1]。 ```python def prefill(prompt_tokens, model_weights): hidden_states = initialize_hidden_state(model_weights) attention_outputs = apply_self_attention(hidden_states, prompt_tokens) return attention_outputs ``` #### Decode 过程 当完成Prefill之后进入Decode环节,在这个过程中主要关注如何高效地逐个生成后续Token直到满足特定条件为止。为了加速解码速度通常采用如下策略: - 缓存已计算过的Key/Value矩阵以减少重复运算量。 - 利用Vulkan或CUDA等硬件特性来进行批量并行化处理。 - 实施Beam Search算法提高最终输出的质量而非单纯贪心选取最高概率项[^3]。 ```python def decode(current_token_id, cached_kv_matrices, beam_width=5): next_probabilities = compute_next_token_probs( current_token_id, cached_kv_matrices ) top_k_candidates = select_top_k(next_probabilities, k=beam_width) best_sequence = find_best_path(top_k_candidates) return best_sequence ``` 通过上述方法可以在保持较高精度的同时显著提升推理效率,使得大规模语言模型能够更加实时响应用户的查询需求[^2]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值