当前位置: 首页 > article >正文

昇腾CANN runtime Stream 调度引擎:从命令队列到 AI Core 的执行链路

用户看到的是一行torch.nn.functional.softmax(x)背后 runtime 要做分配 Stream、入队命令、调度到 AI Core、等待完成、同步结果。如果这一行的延迟是 10μsruntime 的调度开销必须 0.5μs——否则就是 5% 的性能损失。runtime 的 Stream 调度引擎管理 32 个命令队列Command Queue每个对应一个硬件 Stream。命令入队后Dispatcher 根据资源Cube/Vector/L1/HBM 带宽做调度——不是先到先得是 resource-aware 调度。Stream 架构runtime Stream 架构 每个 Stream 独立维护命令队列32 个 Stream 共享 64 个 AI Core Stream 0cmd_1,cmd_2,... → AI Core 0,1 (Cube/Vector) Stream 1cmd_1,cmd_2,... → AI Core 2,3 (Cube/Vector) ... Dispatcher 调度器根据资源可用性决定哪个 Stream 的命令可以执行// runtime/stream/stream_engine.hclassStreamEngine{private:staticconstexprintMAX_STREAMS32;structCommand{uint64_tid;KernelPtr kernel;void*args;intstream_id;uint64_tenqueue_time;ResourceRequirement resources;};structCommandQueue{std::queueCommandpending;std::queueCommandexecuting;intstream_id;boolis_active;};std::arrayCommandQueue,MAX_STREAMSstreams_;structResourceDispatcher{intavailable_cube_units62;intavailable_vector_units62;intavailable_l1_kb32*1024;intavailable_hbm_bw900;intmax_concurrent_kernels8;intcurrent_concurrent0;};ResourceDispatcher dispatcher_;public:StatusEnqueueCommand(intstream_id,KernelPtr kernel,void*args){Command cmd;cmd.idnext_command_id_;cmd.kernelkernel;cmd.argsargs;cmd.stream_idstream_id;cmd.enqueue_timeGetTimestamp();cmd.resourceskernel-GetResourceRequirement(args);streams_[stream_id].pending.push(cmd);Schedule();returnStatus::OK;}voidSchedule(){if(dispatcher_.current_concurrentdispatcher_.max_concurrent_kernels){return;}// 优先级老化调度不是简单 Round-Robinstd::vectorCommand*candidates;for(ints0;sMAX_STREAMS;s){autostreamstreams_[s];if(stream.is_active!stream.pending.empty()){candidates.push_back(stream.pending.front());}}// 按等待时间排序等待越久优先级越高std::sort(candidates.begin(),candidates.end(),[](Command*a,Command*b){return(GetTimestamp()-a-enqueue_time)(GetTimestamp()-b-enqueue_time);});for(auto*cmd:candidates){if(!IsResourceAvailable(cmd-resources))continue;// 原子分配资源避免部分分配导致死锁ReserveResources(cmd-resources);autostreamstreams_[cmd-stream_id];stream.pending.pop();stream.executing.push(*cmd);dispatcher_.current_concurrent;LaunchKernelAsync(cmd-kernel,cmd-args,cmd-stream_id);}}boolIsResourceAvailable(constResourceRequirementreq){returnreq.cube_unitsdispatcher_.available_cube_unitsreq.vector_unitsdispatcher_.available_vector_unitsreq.l1_kbdispatcher_.available_l1_kbreq.hbm_bw_gbpsdispatcher_.available_hbm_bw;}voidReserveResources(constResourceRequirementreq){dispatcher_.available_cube_units-req.cube_units;dispatcher_.available_vector_units-req.vector_units;dispatcher_.available_l1_kb-req.l1_kb;dispatcher_.available_hbm_bw-req.hbm_bw_gbps;}voidOnKernelComplete(uint64_tcmd_id,intstream_id){autostreamstreams_[stream_id];Command completedstream.executing.front();stream.executing.pop();ReleaseResources(completed.resources);dispatcher_.current_concurrent--;Schedule();// 触发下一轮}};同步原语EventStream 之间需要同步——等 Stream 0 的 AllReduce 完成后Stream 1 才能用梯度更新参数。// runtime/stream/sync_primitives.cppclassStreamSynchronizer{private:structEvent{uint64_tid;intstream_id;uint64_tcmd_id;boolrecorded;boolcompleted;};std::unordered_mapuint64_t,Eventevents_;std::vectorstd::vectorintstream_wait_for_;// Stream 依赖图public:voidRecordEvent(uint64_tevent_id,intstream_id,uint64_tcmd_id){Event ev;ev.idevent_id;ev.stream_idstream_id;ev.cmd_idcmd_id;ev.recordedtrue;ev.completedfalse;events_[event_id]ev;}StatusStreamWaitEvent(intwaiting_stream_id,uint64_tevent_id){Eventevevents_[event_id];if(!ev.recorded)returnStatus::INVALID_EVENT;if(ev.completed)returnStatus::OK;stream_wait_for_[waiting_stream_id].push_back(ev.stream_id);streams_[waiting_stream_id].is_activefalse;returnStatus::OK;}voidCompleteEvent(uint64_tevent_id){Eventevevents_[event_id];ev.completedtrue;// 唤醒等待此事件的所有 Streamfor(ints0;sMAX_STREAMS;s){autowaitersstream_wait_for_[s];boolall_waited_completetrue;for(intwaited_stream:waiters){if(!IsStreamComplete(waited_stream)){all_waited_completefalse;break;}}if(all_waited_complete){streams_[s].is_activetrue;Schedule();}}}StatusSynchronizeAll(){for(ints0;sMAX_STREAMS;s){while(!streams_[s].executing.empty()){SpinWait(10);// 最后手段平时不用全局同步}}returnStatus::OK;}};事件同步的实际用法# Python 侧——compute-communication overlapimporttorch_npu compute_streamtorch_npu.Stream()comm_streamtorch_npu.Stream()# 计算流上跑前向withtorch_npu.stream(compute_stream):lossmodel(input)# 通信流上跑 AllReduce和前向并行withtorch_npu.stream(comm_stream):eventtorch_npu.Event()hccl.all_reduce(loss,eventevent)# 只等通信流——不影响其他 Streamcompute_stream.wait_event(event)# 等到了梯度就可以更新参数withtorch_npu.stream(compute_stream):optimizer.step()踩坑一Stream 饥饿Starvation某些大 kernel 持续提交 → 总是分配不到资源 → 小 kernel 永远得不到执行。修复优先级老化——每 100μs 等待 1 优先级等待时间越久的排越前。intGetPriority()const{uint64_twait_time_us(GetTimestamp()-enqueue_time)/1000;returnwait_time_us/100;// 每 100μs 1}踩坑二资源死锁Kernel A 占 16 个 Cube 等 2 个 VectorKernel B 占所有 Vector 等 32 个 Cube → 永远等不到 → 死锁。修复原子资源分配——要么全部分配要么一个都不给拒绝部分分配。StatusAtomicReserveResources(constResourceRequirementreq){if(!IsResourceAvailable(req)){returnStatus::INSUFFICIENT_RESOURCES;// 拒绝不部分分配}dispatcher_.available_cube_units-req.cube_units;dispatcher_.available_vector_units-req.vector_units;dispatcher_.available_l1_kb-req.l1_kb;dispatcher_.available_hbm_bw-req.hbm_bw_gbps;returnStatus::OK;}踩坑三全局同步破坏 Overlaptorch.npu.synchronize()等待所有 Stream 完成——compute-communication overlap 全部失效。正确做法用 Event 做精确同步# ❌ 全局同步——所有 Stream 都停torch.npu.synchronize()# ✅ 精确同步——只等需要的 Streameventtorch_npu.Event()compute_stream.record_event(event)comm_stream.wait_event(event)runtime 的 Stream 引擎是 NPU 硬件的操作系统。32 个 Stream 并发执行、资源感知调度防饥饿、原子资源分配防死锁、Event 同步只等需要的。训练时的 compute-communication overlap 就靠这个引擎——缺少它AllReduce 和 MatrixMul 就只能串行。

相关文章:

昇腾CANN runtime Stream 调度引擎:从命令队列到 AI Core 的执行链路

用户看到的是一行 torch.nn.functional.softmax(x)&#xff0c;背后 runtime 要做&#xff1a;分配 Stream、入队命令、调度到 AI Core、等待完成、同步结果。如果这一行的延迟是 10μs&#xff0c;runtime 的调度开销必须 < 0.5μs——否则就是 5% 的性能损失。 runtime 的…...

Kubernetes StatefulSet深度解析:管理有状态应用的最佳实践

Kubernetes StatefulSet深度解析&#xff1a;管理有状态应用的最佳实践 一、StatefulSet概述 StatefulSet 是Kubernetes中用于管理有状态应用的控制器。它为Pod提供稳定的网络标识和持久化存储&#xff0c;确保Pod的有序部署、扩展和更新。 1.1 StatefulSet vs Deployment …...

JDK常用类与工具(速览版)

JDK常用类与工具&#xff08;速览版&#xff09;JDK&#xff08;Java Development Kit&#xff09;提供了丰富的标准库和实用工具&#xff0c;它们构成了Java开发者日常工作的基石。掌握这些核心类、集合框架、并发工具、IO/NIO库、日期时间API、正则表达式、异常处理机制、日志…...

GPS测速仪SpeedView 3.2.0汉化版 精准速度 实时测速工具

一款实时测速应用程序&#xff0c;英文名为“SpeedView”&#xff0c;安装到手机上就能够在开车的时候查看仪表盘车辆的速度是否准确 实时测速&#xff1a;通过GPS精准定位&#xff0c;实时显示当前速度、平均速度和最高速度&#xff0c;支持多种单位切换&#xff08;km/h、mp…...

阿里巴巴运营/2026年阿里巴巴1688店铺效果越来越差的3个核心原因(附解决方案)

阿里巴巴运营/2026年阿里巴巴1688店铺效果越来越差的3个核心原因&#xff08;附解决方案&#xff09;最近很多工厂老板跟我说&#xff0c;小峰老师&#xff0c;我这1688店铺怎么越做越没效果了&#xff1f;明明以前还能来几个询盘&#xff0c;现在越来越少&#xff0c;是不是16…...

CANN-ATB量化推理-昇腾NPU上W8A8量化为什么比W4A16更实用

Llama2-70B 权重 140GB&#xff0c;8 卡 TP 刚好放得下但没什么余量给 KV Cache。W8A8 量化把权重从 fp16 压到 int8&#xff0c;权重体积减半&#xff0c;4 卡就能跑 70B。W4A16 理论上压得更狠&#xff08;4 倍压缩&#xff09;&#xff0c;但精度损失在实际业务里往往不可接…...

CANN-HCCL-昇腾NPU分布式训练的通信库怎么选

8 卡 Atlas 800I A2 内部走 HCCS&#xff08;带宽 200GB/s&#xff09;&#xff0c;跨机走 RoCE&#xff08;带宽 100GB/s&#xff09;。HCCL 是昇腾NPU的通信库&#xff0c;对标 NVIDIA 的 NCCL。Tensor Parallel 和 Pipeline Parallel 的 All-Reduce、All-to-All 都靠它。 HC…...

nvm-setup安装步骤详解

nvm-setup是 Node Version Manager&#xff08;Node.js 版本管理器&#xff09;​ 的安装包。装了它&#xff0c;你就能在一台电脑上随时切换多个 Node.js 版本&#xff0c;做前端开发、跑不同项目的必备工具。一、准备工作安装包下载&#xff1a;https://wwbkk.lanzoub.com/iU…...

独立开发者如何利用 Taotoken 的 Token Plan 套餐以更优成本启动 AI 项目

&#x1f680; 告别海外账号与网络限制&#xff01;稳定直连全球优质大模型&#xff0c;限时半价接入中。 &#x1f449; 点击领取海量免费额度 独立开发者如何利用 Taotoken 的 Token Plan 套餐以更优成本启动 AI 项目 对于独立开发者或小型工作室而言&#xff0c;在项目启动…...

工业级大模型学习之路021:LangChain零基础入门教程(第四篇):文档加载与文本分块技术

一、文档处理是 RAG 系统的基石1.1 为什么文档处理决定了 RAG 系统的上限&#xff1f;RAG 系统的核心逻辑是 **"检索相关文档片段 → 喂给大模型生成回答"**&#xff0c;整个流程的质量完全依赖于文档处理环节&#xff1a;如果文档解析失败&#xff0c;再好的检索和生…...

深度学习安全帽佩戴检测系统

1 前言 今天学长向大家介绍一个机器视觉的毕设项目&#xff0c;深度学习安全帽佩戴检测系统 项目运行效果&#xff1a; 毕业设计 深度学习安全帽佩戴检测系统&#x1f9ff; 项目分享:见主页简介 1 课题背景 建筑工人头部伤害是造成建筑伤亡事故的重要原因。佩戴安全帽是防止…...

解决华硕灵耀X双屏Linux下扬声器不工作的问题

解决华硕灵耀X双屏Linux下扬声器不工作的问题系统信息解决方法0. 备份系统1. 修改内核启动参数&#xff0c;使用HDA驱动2. 测试修复方案3. 持久化修复方案系统信息 我的电脑是&#xff1a;华硕灵耀X双屏Pro UX5100HM 电脑声卡为&#xff1a;ALC294 操作系统为&#xff1a;Manj…...

第二周学习

学习&#xff08;一&#xff09;、低通滤波器1、原理&#xff08;为什么方波经过低通滤波器变成了正弦波&#xff09;傅里叶变换对于f&#xff08;t&#xff09;来说&#xff0c;只要f&#xff08;t&#xff09;是周期的&#xff0c;则一定可以将f&#xff08;t&#xff09;拆解…...

【Linux驱动开发】第12天:Linux设备树核心:树形结构+节点+属性 完整全解

目录 设备树树形结构概述节点&#xff08;Node&#xff09;全解&#xff1a;命名规范标准节点常用设备节点属性&#xff08;Property&#xff09;全解&#xff1a;类型核心属性总线专用属性标签与节点引用&#xff1a;设备树复用的核心常见错误与注意事项总结&#xff1a;驱动…...

2026年亲测AI写作辅助软件指南(高效定稿版)

为解决学术写作中效率与合规两大核心痛点&#xff0c;本文精选8款高适配性AI论文写作工具&#xff08;按综合优先级排序&#xff09;&#xff0c;围绕中文学术规范适配、真实参考文献生成、格式标准化、高性价比四大核心维度筛选&#xff0c;同时配套分场景精准选型方案与学术合…...

安全打底・能力拉满:我的 OpenClaw 龙虾生态 Skill 清单

2026开年AI圈两大热词&#xff1a;龙虾&#xff08;OpenClaw&#xff09;、Skill插件。龙虾是短期流量话题&#xff0c;热度来得快去得快&#xff1b;而Skill插件可一次部署、长期复用&#xff0c;真正落地到日常办公、协作、社交场景。 市面多数Skill推荐内容堆砌命令、实用性…...

HTML应用指南:利用GET请求获取智己汽车门店位置信息

智己汽车作为高端智能电动汽车品牌&#xff0c;深度融合先锋设计美学、纯电驱动技术、高阶智能驾驶与全场景出行服务&#xff0c;依托L7、LS7、LS6、L6等产品矩阵&#xff0c;打造兼具科技感与驾控乐趣的高端出行体验。在营销推广层面&#xff0c;智己摒弃传统4S店模式&#xf…...

2025大厂Java后端面试:RAG高频考点【干货】

根据近期&#xff08;2025-2026年&#xff09;牛客网上字节、腾讯、阿里、快手、京东等大厂的Java后端面经&#xff0c;RAG&#xff08;检索增强生成&#xff09;已高频结合传统Java八股进行考察。&#x1f4da; 面试问题分类与总结1. &#x1f3d7;️ RAG 基础概念与理解这是面…...

传统FPM项目怎么渐进式迁移到Swoole/Hyperf?

传统 FPM 项目渐进式迁移到 Swoole / Hyperf 完整方案下面是一份实战派迁移指南,不搞理想化"重写",而是一边赚钱一边换引擎。---一、先讲清楚:为啥要迁?要迁到哪?1.1 FPM 的痛点- 每个请求都要重新加载框架(Laravel 启动 30~80ms,Hyperf 启动后 0ms)- 不能保持长连…...

从Java全栈开发到云原生:一次真实的面试对话与技术剖析

从Java全栈开发到云原生&#xff1a;一次真实的面试对话与技术剖析 面试场景回顾 在一次真实的互联网大厂Java全栈开发岗位的面试中&#xff0c;面试官和应聘者展开了一场围绕技术栈、项目经验和系统设计的深入交流。面试官以专业严谨的态度&#xff0c;逐步引导应聘者展示其技…...

pod创建

Pod 由一个或多个紧密耦合的容器组成&#xff0c;它们之间共享网络、存储等资源&#xff0c;Pod 是 Kubernetes 中最小的工作单元&#xff0c;Pod 中的容器会一起启动和停止。1.创建pod一个pod只有一个业务容器kubectl logs mypod 命令用于查看名为 mypod 的 Pod 中唯一容器的标…...

第 2 篇:Agent 的三种工作模式,选错了事倍功半

系列简介&#xff1a;从零搭建一个多 Agent AI 助手&#xff0c;覆盖原理、实现、部署全链路。不讲空话&#xff0c;每篇都有可运行的代码。 项目地址&#xff1a;https://github.com/CodeMomentYY/LangGraph-Agent 本篇目标&#xff1a;理解 Agent 的三种工作模式&#xff0c;…...

为什么92%的Midjourney水效渲染失败?——解析v6.1+版本流体折射权重、noise scale与--s值的黄金三角关系

更多请点击&#xff1a; https://codechina.net 第一章&#xff1a;为什么92%的Midjourney水效渲染失败&#xff1f;——问题现象与根本归因 大量用户在使用 Midjourney v6 生成「水效渲染」&#xff08;Water Efficiency Rendering&#xff09;类提示词时遭遇高频失败——表现…...

Shutter Encoder:构建高效媒体工作流的FFmpeg图形化解决方案

Shutter Encoder&#xff1a;构建高效媒体工作流的FFmpeg图形化解决方案 【免费下载链接】shutter-encoder A professional video compression tool accessible to all, mostly based on FFmpeg. 项目地址: https://gitcode.com/gh_mirrors/sh/shutter-encoder 在数字媒…...

AI正在重构工程师岗位:被替代的不是“人”,而是低维度能力

过去很多人认为,AI更适合写文案、做客服、生成图片,而真正复杂的工程领域——尤其是工业、制造、自动化系统——依然离不开工程师。 但最近一个劳动仲裁案例,让越来越多工程技术人员开始重新思考这个问题: 一位从事测绘工作15年的工程师,因为企业全面导入AI自动化测绘系…...

嵌入式C语言开发中的三大致命陷阱

很多人刚开始学习C语言时,会觉得: 会指针 会结构体 会寄存器操作 能驱动外设 似乎就已经掌握了嵌入式开发。 但真正进入项目后才会发现: 嵌入式开发最难的,从来不是语法,而是“代码与硬件现实世界之间的耦合”。 同样一句代码: 在PC上可能只是运行错误; 在单片机里却可…...

Midjourney V6调色板设置失效的5大隐性原因:从--sref误用到色域压缩陷阱,一文终结色彩失真

更多请点击&#xff1a; https://codechina.net 第一章&#xff1a;Midjourney V6调色板设置失效的全局认知 Midjourney V6 引入了更严格的色彩语义解析机制&#xff0c;导致此前在 V5.x 中广泛使用的 --palette 参数&#xff08;如 --palette vibrant 或 --palette muted&…...

SQL 数据库从免费到付费选型实战:支撑真实规模产品的能力分析与选择指南

引言:为什么 SQL 数据库选型如此重要? 在当今数据驱动的时代,数据库是任何数字产品的核心基础设施。无论是初创公司的 MVP(最小可行产品),还是日活百万的成熟应用,数据库的选择直接影响着产品的性能、成本、可扩展性和开发效率。 对于技术决策者而言,面对琳琅满目的 …...

【小白快速上手】Windows 系统 OpenClaw v2.7.5 一键部署完整教程(包含安装包)

OpenClaw 一键安装完整教程&#xff08;2026 最新&#xff09; 适配系统&#xff1a;Windows10/11 64 位当前版本&#xff1a;v2.7.5&#xff08;虾壳云版&#xff09;文件大小&#xff1a;约 58.7MB下载地址&#xff1a;https://xiake.yun/api/download/package/16?promoCod…...

SQL 能包打天下吗?多少比例的产品只需 SQL,何时需要引入其他存储?

引言 在数据驱动的时代,SQL(结构化查询语言)作为关系型数据库的标准查询语言,其地位无可撼动。它以其强大的数据操作能力、清晰的声明式语法和广泛的生态支持,成为绝大多数应用开发者的首选。然而,随着业务场景的日益复杂和数据形态的多样化,一个灵魂拷问随之而来:SQL…...