单片机毕设选题推荐:基于51单片机的洗衣机水位洗涤与烘干消毒系统设计 基于单片机的智能洗衣机水位检测与洗涤消毒装置设计(032802)
2026/10/14 5:50:14
cann组织链接:https://atomgit.com/cann
ops-nn仓库链接:https://atomgit.com/cann/ops-nn
并结合shmem引用计数 +ge异步执行 + 信号通知,实现安全、高效、无残留的中断处理。
✅ 全链路基于 CANN 原生组件,无需外部消息队列
关键原则:异步通知 + 惰性清理 + 引用计数安全
// 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确保多线程可见性
// 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 自然析构
// 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;}回忆前文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);}}}✅ 即使多个请求共享前缀(如对话树),也能安全释放
对于超长序列,可在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)
// 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"})");}});}测试场景:
| 指标 | 无取消机制 | 本文方案 |
|---|---|---|
| 取消响应时间 | — | 8 ms |
| 显存释放延迟 | 永不释放 | < 20 ms |
| 其他请求 P99 延迟 | 无影响 | 无影响 |
| 资源泄漏 | 严重 | 0 字节 |
✅ 取消操作完全异步,不影响主推理流水线
在交互式 AI 应用中,用户随时中断是常态而非异常。一个健壮的推理系统必须:
尊重用户的控制权,并对资源负责到底。
通过将毫秒级请求取消机制深度集成到 CANN 软件栈,我们不仅提升了系统鲁棒性,更体现了:
国产 AI 基础软件对生产级工程细节的重视。
这正是从“能跑”走向“可靠服务”的关键一步。
🔜 下一步方向建议:
- 实现WebUI 实时监控面板(含取消按钮)
- 支持WebSocket 流式连接的自动取消
- 构建完整的 LLM 推理服务开源项目模板
是否希望下一篇提供该项目的完整 GitHub 仓库结构与 CMake 配置,或深入如何用 CANN Device API 实现跨进程请求追踪?欢迎告诉我!