趋近智
现代机器学习工作负载经常在由不同处理单元组成的系统上运行,这些单元包括多核CPU、高性能GPU和专用AI加速器(如TPU、NPU或定制ASIC)。有效利用这些资源的综合性能,需要精密的运行时调度策略。目标是协调计算任务在这些不同设备上的执行,以最小化总执行时间,同时最大化硬件利用率。这是一个复杂的优化问题,需要仔细考虑计算成本、数据局部性、设备间通信开销、任务依赖性以及每个硬件组件的特定能力。
智能调度的一个先决条件是对目标硬件能力有清晰的认识。运行时调度器通常依赖于一个性能模型,该模型可以是静态推导的,也可以通过运行时分析改进,它根据以下指标描述每个设备:
准确的特性描述使调度器能够对何时何地执行特定计算内核做出明智决策。
机器学习计算通常表示为有向无环图(DAG),其中节点代表操作(内核),边代表数据依赖(张量)。调度器在该图上运行,决定任务的放置和执行顺序。
一个简化的ML推理图,显示了任务的潜在设备放置,并突出了主机(CPU)与设备(GPU)内存之间的数据传输。
DAG中任务的粒度对调度有显著影响。细粒度任务(例如,单个算术操作)提供最大灵活性,但会产生高调度和同步开销。粗粒度任务(例如,融合操作符序列)减少开销,但限制了跨设备并行执行和负载平衡的机会。许多运行时在中间粒度上操作,通常对应于单个ML框架操作或优化内核。
尽管最小化端到端延迟通常是主要目标,但其他目标也会影响调度决策:
这些目标可能相互冲突。例如,最大化吞吐量可能涉及批处理请求,这可能会增加单个请求的延迟。节能策略可能涉及关闭设备或以较低频率运行它们,影响峰值性能。调度器通常必须根据系统策略或应用需求来平衡这些相互竞争的需求。
运行时调度器采用多种策略将任务分配给设备并确定它们的执行顺序:
静态调度: 调度决策在运行时之前(AOT)做出,通常在编译阶段。编译器分析DAG,根据设备配置文件估计任务执行时间和通信成本,并生成固定的执行计划。经常使用异构系统最早完成时间(HEFT)或关键路径分析等算法,这些算法已适应异构成本。
动态调度: 调度决策在运行时做出,就在任务准备执行之前。当任务完成时,调度器检查就绪任务(那些依赖已满足的任务),并根据当前系统状态和调度策略将它们分配给可用设备。
混合调度: 这种方法结合了静态规划和动态调整。大型计算块或关键路径可能被静态调度,而较小的任务或基于运行时条件(例如,队列长度,实际执行时间)的调整则动态处理。这旨在平衡低开销和适应性。
异构调度中,管理数据移动也许是最重要的因素。在主机CPU主内存和加速器本地内存之间传输张量(例如,通过PCIe)通常比计算或设备内内存访问慢几个数量级。有效的调度器优先考虑最小化或隐藏这种通信延迟:
决定哪种类型的设备(CPU、GPU、其他加速器)最适合给定任务涉及基于以下因素的启发式方法:
在多个设备上执行DAG需要同步。当设备B上的任务依赖设备A上任务的输出时,调度器必须确保任务A在任务B开始前完成。这通常通过硬件/驱动程序API提供的轻量级同步原语(例如CUDA事件、HIP事件、围栏)来管理。调度器插入并等待这些事件。跨设备同步会引入延迟,因此最小化同步点是另一个优化目标,通常通过仔细的任务分组和调度实现。
在这些核心原理之上,高级运行时引入了更多复杂性:
为异构系统设计一个有效的调度器仍然是研究和工程领域的一个活跃方向。这需要对ML工作负载特性和底层硬件能力有深刻的理解,仔细平衡众多权衡,为复杂的AI应用提供最佳性能和效率。
这部分内容有帮助吗?
© 2026 ApX Machine Learning用心打造