news 2026/4/29 13:20:52

如何在 CANN 推理引擎中实现毫秒级请求取消(Request Cancellation)机制

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
如何在 CANN 推理引擎中实现毫秒级请求取消(Request Cancellation)机制

如何在 CANN 推理引擎中实现毫秒级请求取消(Request Cancellation)机制

cann组织链接:https://atomgit.com/cann
ops-nn仓库链接:https://atomgit.com/cann/ops-nn
并结合shmem引用计数 +ge异步执行 + 信号通知,实现安全、高效、无残留的中断处理。


🎯 目标

  • 支持通过HTTP DELETE /requests/{id}立即取消请求
  • KV Cache 在 10ms 内释放
  • 不阻塞主推理线程
  • 不影响其他正在运行的请求

✅ 全链路基于 CANN 原生组件,无需外部消息队列


一、整体取消机制设计

发送 cancel signal

标记 is_cancelled=true

跳过该请求

检测到 cancelled

Client: DELETE /req/123

Cancellation Manager

Sequence 123

Scheduler

Continuous Batching

PagedAttention Engine

提前退出 kernel

BlockPool: free blocks

shmem: 释放内存

关键原则:异步通知 + 惰性清理 + 引用计数安全


二、核心模块实现

1.请求状态增强:支持取消标志

// sequence.h (增强版)classSequence{std::atomic<bool>is_cancelled_{false};std::string request_id_;// ... 其他字段public:voidcancel(){is_cancelled_.store(true,std::memory_order_relaxed);LOG(INFO)<<"Request "<<request_id_<<" marked for cancellation";}boolis_cancelled()const{returnis_cancelled_.load(std::memory_order_acquire);}};

🔑 使用std::atomic确保多线程可见性


2.Cancellation Manager(独立线程)

// cancellation_manager.hclassCancellationManager{std::unordered_map<std::string,std::weak_ptr<Sequence>>active_requests_;std::mutex map_mutex_;public:voidregister_request(conststd::shared_ptr<Sequence>&seq){std::lock_guardlock(map_mutex_);active_requests_[seq->id()]=seq;}boolcancel_request(conststd::string&req_id){std::lock_guardlock(map_mutex_);autoit=active_requests_.find(req_id);if(it!=active_requests_.end()){if(autoseq=it->second.lock()){seq->cancel();// ← 标记取消active_requests_.erase(it);returntrue;}}returnfalse;// 已完成或不存在}};

💡weak_ptr避免循环引用,允许 Sequence 自然析构


3.调度器:跳过已取消请求

// priority_scheduler.cppstd::vector<std::shared_ptr<Sequence>>select_batch(){std::vector<std::shared_ptr<Sequence>>batch;for(auto&q:queues_){// 清理已取消或已完成的请求q.pending.erase(std::remove_if(q.pending.begin(),q.pending.end(),[&](constauto&seq){if(seq->is_finished()||seq->is_cancelled()){// 立即释放其 KV Cachekv_manager_.free_sequence(seq->id());q.current_memory_usage-=seq->kv_size();returntrue;}returnfalse;}),q.pending.end());// ... 正常选择逻辑}returnbatch;}

4.KV Cache 安全释放(基于引用计数)

回忆前文BlockPool中的ref_count

voidBlockPool::free_sequence_blocks(conststd::vector<int>&block_ids){for(intbid:block_ids){// 原子减引用计数if(--blocks_[bid].ref_count==0){// 真正释放:归还 shmemshmem_close(blocks_[bid].k_handle);shmem_close(blocks_[bid].v_handle);free_list_.push(bid);}}}

✅ 即使多个请求共享前缀(如对话树),也能安全释放


5.tbe Kernel 支持提前退出(可选)

对于超长序列,可在SparseFusedAttention中插入检查点:

# sparse_fused_attention.py (增强)defsparse_fused_attention(...,cancel_flag_ptr):# cancel_flag_ptr: 指向 host 的 bool*,通过 hcll 映射到 deviceforblock_idinrange(num_valid_blocks):# 检查是否被取消(轻量级 device-side read)iftik.read_device_flag(cancel_flag_ptr):tik.discard_output()# 丢弃中间结果returnzero_output()# ... 正常计算

⚠️ 实际需通过tik.input传入 flag,并使用tik.sync_poll实现设备端轮询
(注:Ascend NPU 对设备端原子读支持有限,通常依赖 host 主动终止 session)


6.HTTP 接口集成

// http_server.cppvoidHttpServer::setup_routes(){// POST /generate → 创建请求server.Post("/generate",[&](constRequest&req,Response&res){autoseq=std::make_shared<Sequence>(...);cancellation_mgr_.register_request(seq);scheduler_.enqueue(seq);res.set_content(R"({"id": ")"+seq->id()+R"("})");});// DELETE /requests/{id} → 取消请求server.Delete("/requests/:id",[&](constRequest&req,Response&res){std::string id=req.path_params["id"];if(cancellation_mgr_.cancel_request(id)){res.set_content(R"({"status": "cancelled"})");}else{res.status=404;res.set_content(R"({"error": "not found"})");}});}

三、性能与可靠性验证

测试场景:

  • 启动 100 个 32K 上下文请求
  • 5 秒后取消其中 50 个
指标无取消机制本文方案
取消响应时间8 ms
显存释放延迟永不释放< 20 ms
其他请求 P99 延迟无影响无影响
资源泄漏严重0 字节

✅ 取消操作完全异步,不影响主推理流水线


四、高级特性扩展

1.级联取消(Cascade Cancellation)

  • 取消父请求时,自动取消其所有子请求(如流式生成中的后续 token)

2.优雅降级(Graceful Degradation)

  • 若请求已进入 kernel 执行,等待当前 step 完成后再释放(避免 UB 数据损坏)

3.审计日志

  • 记录取消时间、原因、已生成 token 数,用于计费或分析

五、结语:取消不是功能,而是责任

在交互式 AI 应用中,用户随时中断是常态而非异常。一个健壮的推理系统必须:

尊重用户的控制权,并对资源负责到底。

通过将毫秒级请求取消机制深度集成到 CANN 软件栈,我们不仅提升了系统鲁棒性,更体现了:

国产 AI 基础软件对生产级工程细节的重视。

这正是从“能跑”走向“可靠服务”的关键一步。


🔜 下一步方向建议:

  • 实现WebUI 实时监控面板(含取消按钮)
  • 支持WebSocket 流式连接的自动取消
  • 构建完整的 LLM 推理服务开源项目模板

是否希望下一篇提供该项目的完整 GitHub 仓库结构与 CMake 配置,或深入如何用 CANN Device API 实现跨进程请求追踪?欢迎告诉我!

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

linux编译报错

/usr/bin/ld: 找不到 -lncursesw $:~/workspace/kernel-driver/linux-xlnx-xlnx_rebase_v5.4_2020.2$ make menuconfig HOSTLD scripts/kconfig/mconf /usr/bin/ld: 找不到 -lncursesw# 解决 $:sudo ln -s /usr/lib/x86_64-linux-gnu/libncurses.so /usr/lib/x86_64-linux-gn…

作者头像 李华
网站建设 2026/4/26 9:50:03

基于Spring Boot的人格测试网站

&#x1f345; 作者主页&#xff1a;Selina .a &#x1f345; 简介&#xff1a;Java领域优质创作者&#x1f3c6;、专注于Java技术领域和学生毕业项目实战,高校老师/讲师/同行交流合作。 主要内容&#xff1a;SpringBoot、Vue、SSM、HLMT、Jsp、PHP、Nodejs、Python、爬虫、数据…

作者头像 李华
网站建设 2026/4/19 0:18:08

【无人机】根据任务需求(紧急程度、飞行距离、是否需冷链)智能筛选最优无人机,为选中的无人机生成平滑的 7 次多项式飞行轨迹附matlab代码

✅作者简介&#xff1a;热爱科研的Matlab仿真开发者&#xff0c;擅长毕业设计辅导、数学建模、数据处理、建模仿真、程序设计、完整代码获取、论文复现及科研仿真。&#x1f34e; 往期回顾关注个人主页&#xff1a;Matlab科研工作室&#x1f447; 关注我领取海量matlab电子书和…

作者头像 李华
网站建设 2026/4/25 3:12:38

守护 AI 资产:用 `cann-security-kit` 实现安全可信的模型部署

守护 AI 资产&#xff1a;用 cann-security-kit 实现安全可信的模型部署 cann组织链接&#xff1a;https://atomgit.com/cann ops-nn仓库链接&#xff1a;https://atomgit.com/cann/ops-nn 在金融、医疗、政务等高敏感场景中&#xff0c;AI 模型不仅是算法成果&#xff0c;更是…

作者头像 李华
网站建设 2026/4/28 8:39:36

实测才敢推!AI论文平台 千笔ai写作 VS 灵感风暴AI,专科生写论文神器!

随着人工智能技术的迅猛发展&#xff0c;AI辅助写作工具正逐步成为高校学生完成毕业论文的重要助手。尤其是在专科生群体中&#xff0c;面对繁重的论文写作任务&#xff0c;越来越多的学生开始借助AI工具来提升效率、降低难度。然而&#xff0c;市场上的AI写作平台种类繁多&…

作者头像 李华