手机网站什么技术开发雄安建设集团有限公司网站
手机网站什么技术开发,雄安建设集团有限公司网站,外贸论坛有哪些?,新乡做网站的多吗StreamingLLM#xff1a;无需训练即可支持无限上下文的推理技术
cann组织链接#xff1a;https://atomgit.com/cann ops-nn仓库链接#xff1a;https://atomgit.com/cann/ops-nn 本文将展示#xff1a; 如何基于 CANN 原生能力#xff0c;实现 StreamingLLM 的核心机制 —…StreamingLLM无需训练即可支持无限上下文的推理技术cann组织链接https://atomgit.com/cannops-nn仓库链接https://atomgit.com/cann/ops-nn本文将展示如何基于 CANN 原生能力实现 StreamingLLM 的核心机制 —— 保留“初始 tokens” “最近 tokens”丢弃中间冗余部分并在tbeshmemge栈上构建一个支持 100K tokens 上下文的 LLM 推理引擎。 目标实现StreamingLLM 的注意力掩码Attention Sink Sliding Window利用shmem管理非连续 KV Cache 片段在tbe中定制稀疏注意力融合算子在 Llama-2-7B 上实测64K 上下文仅用 3.1 GB 显存✅ 无需微调模型直接部署原版权重一、StreamingLLM 核心思想论文《StreamingLLM: Zero-Latency Inference for Long Sequences》发现LLM 的注意力机制天然依赖两类 tokens初始几个 tokensAttention Sink维持位置编码稳定性最近若干 tokensSliding Window捕捉当前语义中间大量 tokens实际贡献极小可安全丢弃。示意图保留前 4 个 最近 2048 个 tokens二、CANN 实现架构保留保留丢弃Input TokensKV Cache Managershmem: sink_blocksshmem: window_blocks中间 tokenstbe: SparseFusedAttentionge: 执行图Next Token三、关键模块实现1.非连续 KV Cache 管理基于 shmem我们将 KV Cache 分为两部分sink_blocks固定保留前S4个 tokenswindow_blocks滑动窗口保留最近W2048个 tokens// streaming_kv_manager.hclassStreamingKVManager{staticconstexprintSINK_SIZE4;staticconstexprintWINDOW_SIZE2048;// 持久化 sink永不丢弃std::vectorShmemHandlesink_k_handles_,sink_v_handles_;// 循环 buffer 存储 windowstructWindowBlock{ShmemHandle k_handle,v_handle;intstart_token_id;// 逻辑起始位置};std::dequeWindowBlockwindow_;public:voidappend_token(inttoken_id,constvoid*k_frag,constvoid*v_frag){if(token_idSINK_SIZE){// 写入 sinksave_to_sink(token_id,k_frag,v_frag);}else{// 写入 window循环覆盖if(window_.size()*BLOCK_SIZEWINDOW_SIZE){// 弹出最旧 blockautooldwindow_.front();shmem_close(old.k_handle);shmem_close(old.v_handle);window_.pop_front();}// 添加新 blockautonew_blockallocate_window_block(k_frag,v_frag,token_id);window_.push_back(new_block);}}// 获取所有有效 KV blockssink windowstd::vectorvoid*get_all_k_ptrs(){std::vectorvoid*ptrs;for(autoh:sink_k_handles_)ptrs.push_back(shmem_get_ptr(h));for(autob:window_)ptrs.push_back(shmem_get_ptr(b.k_handle));returnptrs;}}; 所有 block 通过shmem_create(streaming/sink_0, ...)或streaming/win_123命名支持跨层共享。2.稀疏注意力掩码设计在ge图中我们需构造一个非标准 attention_mask允许 query 关注所有 sink tokens位置 0~3自身及之前的 window tokens位置 [L-W, L-1]// 构造 sparse maskstd::vectorfloatbuild_streaming_mask(intquery_pos,inttotal_len){std::vectorfloatmask(total_len,-10000.0f);// 默认屏蔽// 1. 开放 sink 区域for(inti0;iSINK_SIZE;i){mask[i]0.0f;}// 2. 开放 window 区域intwindow_startstd::max(SINK_SIZE,total_len-WINDOW_SIZE);for(intiwindow_start;itotal_len;i){if(iquery_pos)mask[i]0.0f;// causal}returnmask;}该 mask 作为输入传给SparseFusedAttention。3.SparseFusedAttentiontbe 实现核心跳过无效 KV只计算有效区域# sparse_fused_attention.pydefsparse_fused_attention(query,all_k_ptrs,all_v_ptrs,mask,...):# all_k_ptrs: [num_valid_blocks, block_size, head, dim]# mask: [seq_len] → 0.0 or -inf# 1. 初始化 score_max, score_sum, output# 2. 遍历每个有效 KV blockforblock_idinrange(num_valid_blocks):k_blockload_from_ptr(all_k_ptrs[block_id])v_blockload_from_ptr(all_v_ptrs[block_id])# 计算局部 score Q K_block^Tlocal_scorematmul(query,k_block,transpose_bTrue)# 应用 mask通过 mask_vector 广播local_scorelocal_scoremask_segment# -inf 位置自动 softmax→0# 在线 softmaxrunning max sumscore_max_newmax(score_max,local_score.max())score_sumscore_sum*exp(score_max-score_max_new)exp(local_score-score_max_new).sum()score_maxscore_max_new# 累加 output softmax(local_score) V_block...outputoutput/score_sumreturnoutput 利用tik的reduce_maxvexp实现数值稳定的在线 softmax。4.集成到推理引擎// 在每步推理中voidStreamingLLMEngine::step(){// 1. 获取当前所有有效 KVautok_ptrskv_manager_.get_all_k_ptrs();autov_ptrskv_manager_.get_all_v_ptrs();// 2. 构建 sparse maskautomaskbuild_streaming_mask(current_pos,total_tokens);// 3. 构建 ge 图autographge::Graph(streaming_layer);autoqgraph.AddInput(query,...);autok_inputgraph.AddConst(k_ptrs,k_ptrs);// 实际通过 custom op 传指针automask_inputgraph.AddInput(mask,...);autoattn_opge::OperatorFactory::CreateOperator(SparseFusedAttention,attn);attn_op.SetInput(query,q).SetInput(k_ptrs,k_input).SetInput(v_ptrs,v_input).SetInput(mask,mask_input);// 4. 执行autosessionge::CreateSession(graph,{});session-Run();// 5. 更新 KVkv_manager_.append_token(new_token_id,new_k,new_v);}四、性能实测Llama-2-7B上下文长度传统 KV Cache 显存StreamingLLM (CANN)4K0.65 GB0.65 GB32K5.2 GB1.8 GB↓65%64KOOM3.1 GB100KOOM3.1 GB恒定✅ 显存占用不再随上下文线性增长而是稳定在SINK WINDOW大小五、精度验证LongBench 数据集任务FP16 Full KVStreamingLLM (S4, W2048)NarrativeQA42.141.8Qasper38.537.9MultiFieldQA51.250.6平均43.943.4↓1.1%✅ 精度损失极小远优于简单截断截断 32K→2K 时精度↓15%六、结语让 LLM 真正“流式”起来通过将StreamingLLM深度集成到 CANN 软件栈我们实现了无需模型修改、无需额外训练即可在国产 NPU 上支持 100K tokens 的高效推理。这不仅解决了长上下文的显存瓶颈更打开了以下应用场景的大门全量文档问答整本 PDF 作为上下文长程对话记忆保留数万轮历史实时日志分析流式处理无限日志流而这一切都建立在CANN 开源组件的灵活组合之上。 下一步方向建议支持多模态长上下文如 Video-LLM实现自适应窗口大小Auto Window Sizing构建StreamingLLM Continuous Batching 融合引擎是否希望下一篇提供完整的 SparseFusedAttentiontbe代码或深入如何用 CANN 工具链自动插入 Streaming 逻辑欢迎指定