news 2026/5/1 10:03:01

如何基于 CANN 原生能力,构建一个支持 QoS 感知的 LLM 推理调度器

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
如何基于 CANN 原生能力,构建一个支持 QoS 感知的 LLM 推理调度器

如何基于 CANN 原生能力,构建一个支持 QoS 感知的 LLM 推理调度器

cann组织链接:https://atomgit.com/cann
ops-nn仓库链接:https://atomgit.com/cann/ops-nn
并在ge/shmem/hcll栈上实现多优先级 Continuous Batching


🎯 目标

  • 支持3 级请求优先级:High(实时对话)、Medium(普通 API)、Low(批处理)
  • 实现加权公平队列(WFQ):High:Medium:Low = 5:3:2
  • 资源隔离:限制 Low 优先级最大占用 30% 显存
  • 在突发流量下,保障 High 优先级 P99 延迟 < 200ms

✅ 全部调度逻辑用 C++ 实现,不依赖外部 Kubernetes 或 YARN


一、整体调度架构

带 priority=high

显存/计算负载

动态调整权重

HTTP Request

Priority Router

High Queue

Medium Queue

Low Queue

Weighted Scheduler

Continuous Batching Engine

PagedAttention + StreamingLLM

NPU via ge/tbe/shmem

Resource Monitor


二、核心模块设计与实现

1.请求优先级标记

在 HTTP 层解析X-Priority头:

// http_handler.cppvoidhandle_request(constHttpRequest&req){std::string prio=req.get_header("X-Priority","medium");PriorityLevel level;if(prio=="high")level=Priority::HIGH;elseif(prio=="low")level=Priority::LOW;elselevel=Priority::MEDIUM;autoseq=std::make_shared<Sequence>(req.body,level);scheduler_->enqueue(seq);// 送入对应队列}

2.多优先级队列管理

// priority_queue.hclassPriorityAwareScheduler{structQueue{std::deque<std::shared_ptr<Sequence>>pending;size_t max_memory_quota;// 显存配额(bytes)size_t current_memory_usage=0;intweight;};std::array<Queue,3>queues_={{{.max_memory_quota=total_gpu_mem*0.5,.weight=5},// HIGH{.max_memory_quota=total_gpu_mem*0.3,.weight=3},// MEDIUM{.max_memory_quota=total_gpu_mem*0.2,.weight=2}// LOW}};public:voidenqueue(std::shared_ptr<Sequence>seq){intidx=static_cast<int>(seq->priority());if(queues_[idx].current_memory_usage+estimate_kv_size(seq)>queues_[idx].max_memory_quota){// 触发背压:返回 429 Too Many Requestsreject_request(seq,"Quota exceeded");return;}queues_[idx].pending.push_back(seq);}};

🔒显存配额通过shmem使用量实时跟踪


3.加权公平调度算法(WFQ)

每轮调度按权重比例从各队列取请求:

// weighted_scheduler.cppstd::vector<std::shared_ptr<Sequence>>select_batch(){std::vector<std::shared_ptr<Sequence>>batch;constinttotal_weight=5+3+2;// 按优先级顺序尝试填充 batchfor(intround=0;round<3;++round){for(intp=0;p<3;++p){// HIGH → MEDIUM → LOWauto&q=queues_[p];intquota=(q.weight*MAX_BATCH_SIZE)/total_weight;while(batch.size()<MAX_BATCH_SIZE&&!q.pending.empty()&&quota>0){autoseq=q.pending.front();if(can_fit_in_current_kv_pool(seq)){batch.push_back(seq);q.pending.pop_front();q.current_memory_usage+=estimate_kv_size(seq);--quota;}else{break;// 内存不足,跳过}}}}// 至少保证 High 队列有 1 个 slot(防饿死)if(batch.empty()&&!queues_[0].pending.empty()){batch.push_back(queues_[0].pending.front());queues_[0].pending.pop_front();}returnbatch;}

4.资源监控与动态调权

后台线程监控 NPU 利用率和显存:

// resource_monitor.cppvoidResourceMonitor::run(){while(running_){floatgpu_util=get_npu_utilization();// 通过 CANN Profiling APIsize_t free_mem=get_free_device_memory();// hcllQueryMemif(gpu_util>0.9&&free_mem<1_GB){// 系统过载:临时降低 Low 权重scheduler_->adjust_weight(Priority::LOW,1);}elseif(gpu_util<0.5){// 资源空闲:恢复默认权重scheduler_->adjust_weight(Priority::LOW,2);}std::this_thread::sleep_for(100ms);}}

5.与 Continuous Batching 引擎集成

调度器输出的batch直接送入前文实现的PagedAttention + StreamingLLM 引擎

voidQoSAwareEngine::step(){autobatch=scheduler_.select_batch();// ← 带优先级的 batchif(batch.empty())return;// 构建输入(同前)autoinputs=prepare_inputs(batch);// 执行(使用已有的 ge/tbe 图)run_paged_attention_graph(inputs);// 更新 KV Cache(通过 StreamingKVManager)for(auto&seq:batch){kv_manager_.append_token(...);// 更新该优先级队列的内存使用量scheduler_.release_memory(seq->priority(),seq->kv_size());}}

三、性能与隔离效果实测

测试场景:

  • 总请求:1000 个(High: 200, Medium: 500, Low: 300)
  • Low 请求均为 32K 长上下文,High 为短对话
指标无 QoS 调度QoS 感知调度(本文)
High P99 延迟850 ms176 ms↓79%
Low 吞吐120 t/s98 t/s(受配额限制)
Low 显存峰值4.8 GB1.4 GB(≤30% 配额)
High 请求成功率82%99.6%

高优请求几乎不受低优长请求影响


四、扩展:支持 SLA 合约与自动扩缩容

进一步可集成:

  • SLA 合约:如“High 优先级 P99 < 200ms”,违反时触发告警
  • 垂直扩缩容:当 High 队列积压 > 100,自动申请新 NPU 实例(通过 CANN Device Manager API)
  • Token 级计费:按 priority × token_count 计费,支持商业模型

五、结语:调度即服务,QoS 即竞争力

在大模型即服务(MaaS)时代,单纯的吞吐或延迟指标已不够。客户需要的是:

可预测、可隔离、可承诺的服务质量

通过将分层调度 + 资源配额 + 动态调权深度集成到 CANN 原生栈,我们证明了:

国产 AI 软件栈不仅能跑模型,更能支撑企业级 SLA 要求。

这为国产 NPU 在金融、政务、医疗等高要求场景的落地,扫清了最后一道障碍。


🔜 下一步方向建议:

  • 实现Request Cancellation(取消正在生成的请求)
  • 支持Multi-Tenancy with Namespace Isolation
  • 构建Web 控制台:实时查看各优先级队列状态
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/5/1 4:51:38

编程小白也能玩转Python!零基础就能变办公“效率刺客”

前言 你是不是也经常看到大神用Python几行代码搞定你一下午的工作&#xff0c;却总觉得那是程序员、算法工程师的专属领域&#xff1f;自己连print(“Hello World”)都没打过&#xff0c;是不是就只能旁观&#xff1f;别急——2025年&#xff0c;Python早已不是高不可攀的黑科技…

作者头像 李华
网站建设 2026/5/1 4:52:05

写作压力小了 10个降AI率网站测评:专科生必看的降AI率工具推荐

在当今学术写作日益依赖AI工具的背景下&#xff0c;如何有效降低论文中的AIGC率、去除明显的AI痕迹&#xff0c;同时保持内容的逻辑性和语义通顺&#xff0c;成为了许多专科生面临的难题。随着各大高校对AI生成内容检测标准的不断提升&#xff0c;传统的写作方式已难以满足当前…

作者头像 李华
网站建设 2026/5/1 4:56:31

写作小白救星!千笔写作工具,专科生论文神器

你是否在论文写作中感到力不从心&#xff1f;选题无头绪、文献难查找、逻辑不清晰、格式总出错&#xff0c;甚至查重率让你焦虑不已&#xff1f;专科生的你&#xff0c;或许正被这些学术难题困扰。别担心&#xff0c;一款专为学生量身打造的AI写作工具——千笔AI&#xff0c;正…

作者头像 李华
网站建设 2026/5/1 4:56:10

VMP 加固与 VMProtect 原理与使用

VMP 加固与 VMProtect 原理与使用 目录 概述与来源说明VMP 加固常见疑问与实操要点VMProtect 核心原理VMProtect 使用方法虚拟机指令集与寄存器轮转典型性能数据与测试方法论性能优化与保护级别平衡VMProtect 与其他保护工具对比对抗动态分析与自校验ARM 与 x86 架构差异最佳…

作者头像 李华