池化抽象:把芯片差异收敛成统一算力单元
异构算力池化的第一道关是硬件抽象。不同厂商的加速卡在接入方式、指令集架构、内存管理模型、通信协议上存在巨大差异。有的卡支持硬件级虚拟化切分,有的只能靠软件模拟;有的卡对特定数据格式有硬件加速,有的需要靠编译器做算子映射。如果调度器直接面对这些差异,每接入一种新硬件就要改一遍调度逻辑,池化的维护成本会高到不可接受。
息壤通过硬件抽象层与算力网关两套机制来解决这个问题。硬件抽象层把不同厂商加速卡的接入方式、指令集、内存架构、通信协议封装成标准接口,向上暴露“逻辑算力单元”这一概念。资源注册中心实时维护每张卡的空闲容量、拓扑位置、算力画像、功耗状态,使调度器看到的世界不是“某型号卡若干张”,而是“可用算力若干单元、附带时延与带宽标签”。
这种抽象带来两个工程后果。其一,新硬件接入周期从数月级缩到周级,厂商适配插件化,驱动初始化、网络拓扑感知、虚拟化切分都在适配层完成,不影响上层调度逻辑。其二,单卡可被切分为多个虚拟算力单元服务轻量任务,多卡空闲碎片也可被聚合为大块逻辑资源服务万卡级训练,资源粒度从“整卡”变成“比例”,利用率自然抬升。
接入网关:给闲散算力发统一通行证
物理算力不会自己走进池子。每个机房、每个集群的加速设备有自己的管理系统和接入协议,有的是容器平台设备插件,有的是厂商私有调度接口,有的是裸金属带外管理。把这些分散的资源收拢到同一个池子里,需要一个统一的接入层。
息壤的算力插件负责把集群内各类加速设备按标准协议暴露出来,算力网关负责对外部社会闲散算力做云化安全纳管——包括身份认证、资源计量、隔离策略、带宽配额。两者合起来相当于给所有算力资源发一张统一通行证:无论它原本是什么形态,进网关后都变成可调度、可计量、可回收的标准资源。
网关层还承担多租户隔离。大模型训练任务常占卡数天,网关要保证任务A的显存页、通信通道、检查点路径不会渗到任务B,即使两者跑在同一张物理卡的不同虚拟单元上。隔离做不好,池化规模越大,故障爆炸半径越大。一个租户的恶意代码通过共享资源窃取另一个租户的模型参数,这种安全事件在池化系统里不是理论上的风险,而是真实发生过的事故。
调度决策:从“有卡就塞”到多维最优匹配
池化解决“看得见面”,调度解决“分给谁”。有了全局资源视图,调度引擎要回答的问题是:一个新提交的训练任务,应该分配到哪些卡上。答案不是简单的“找空闲卡最多的机房”,而是要综合考虑多个维度。
息壤的调度引擎是两级决策。宏观层接任务描述——模型规模、并行策略、预计时长、优先级、数据位置。微观层盯实时指标——节点负载、网络时延、错误率、温度、功耗。决策目标可在综合最优、性能最优、成本最优之间切换。白天推性能最优,把通信敏感的参数同步段压到低时延机房;夜间错峰推成本最优,把可中断任务调度到电价低、带宽闲的区域。
拓扑感知是调度里最吃经验的部分。大模型训练中,梯度同步的集合通信操作涉及大量卡之间的数据交换,通信延迟直接决定训练效率。同机房内优先把通信频繁的进程排进同一组网平面,跨机房训练则提前算好通信体积与广域带宽的匹配度,避免把梯度同步热点铺到拥塞链路上。息壤把“算随数动、数随算动”做成默认策略:数据在哪边、算力在哪边,系统自己判断是把数据搬过去还是把算力调过来,而不是永远默认迁数据。
训练亲和性:异构混训不是平均主义
统一池化不等于把任何任务扔给任何卡。大模型训练对算力特征有强偏好:注意力层吃显存带宽,矩阵乘吃峰值算力,嵌入层吃内存容量,层归一化对数值精度敏感。如果把对精度敏感的层分配到精度较低的卡上,训练出来的模型可能出现无法收敛的问题。
息壤在任务拆分时按算子特征做异构感知分层,把合适子图派给合适芯片。高精度进口卡吃对数值稳定性敏感的层,国产卡吃吞吐友好层,配合自研异构训推框架做算子翻译,使一次开发的模型多框架多芯片运行。这种分层不是静态的——调度器会根据训练过程中的实际表现动态调整子图分配,如果发现某张卡上的某个算子计算时间异常长,下次迭代时就把这个算子换到另一张卡上。
亲和性还体现在框架无关。开发工程师提交的是任务与镜像,平台把主流训练框架的算子调用翻译成各芯片原生指令序列,用户不感知底层用的是什么训练框架。这种思路把开发侧心智从“选卡选框架”里解放出来,专注模型本身。开发工程师不需要为了适配某种新硬件而去学习一套新的编程模型,他们写好的代码,平台自动完成翻译和优化。
断点续训与故障隔离:万卡训练的日常生存技能
大模型训练跑几天几夜,中间任何一张卡掉链子都可能让全局同步卡住。万卡规模下,单张卡的故障概率已经不是小概率事件,而是每天都有可能发生的常态。如果没有断点续训能力,每次故障都从头跑,训练永远跑不完。
息壤在池化调度之上叠了高可用训练能力:分钟级检测异常、自动隔离慢节点、检查点快速保存与加载、从断点续训。容器故障动态感知后,调度器把该进程重新绑定到池内同构备用单元,数据从最近检查点恢复,不必从头跑。这个过程对训练任务的其他进程是透明的——它们只知道某个进程短暂暂停后又恢复了,不知道背后发生了故障隔离和重调度。
故障隔离和池化是互相成就的关系。正因为算力是逻辑池而非固定绑定,重调度才可能“就地换卡”;也正因为有慢节点隔离,池内碎片资源才不会被一个拖后腿的卡拖垮整个梯度步。万卡规模下线性加速比能维持在较高水平,靠的不是单机性能,而是这套“检测—隔离—续训”闭环。
慢节点检测是断点续训的前置能力。息壤在训练过程中持续监控每张卡的梯度计算时间,如果某张卡的计算时间持续比其他卡高出一定比例,就判定为慢节点。调度器对慢节点的处理策略是:先尝试垂直扩容,增加该卡的算力配额;不行再尝试迁移,把该卡上的进程换到另一张卡上;迁移不行再触发断点续训。这个三级处理策略的目的是尽量减少断点续训的次数,因为每次断点续训都会造成训练的中断和检查点的读写开销。
算数协同:调度的尽头是数据流动
异构池化调度最容易被人忽略的一层是存储与网络协同。训练任务不是只吃算力,还吃并行文件系统的吞吐和高速网络的时延。如果算力调度不考虑数据和网络的状态,就会出现“算力到位了,数据还没到”的尴尬局面。
息壤把算力池、存储池、网络状态放进同一个决策面:提交任务时一并评估数据当前位置、目标卡房的入网带宽、并行文件系统挂载点,得出“在哪训最划算”。这种算数网一体化调度,让跨域异构训练不再等于“跨域搬数据再训”,而是任务、数据、算力三者动态缝合。
具体来说,调度器在做决策时会计算几种方案的成本。方案A:把数据从机房A复制到机房B,在机房B训练。方案B:把算力从机房B调度到机房A,在机房A训练。方案C:在机房A和机房B同时训练,中间结果通过网络同步。调度器根据数据体积、网络带宽、算力空闲率、电力成本等因素,选择综合成本最低的方案。这个决策不是一次性的——训练过程中如果网络状况发生变化,调度器会重新评估并可能切换方案。
算数协同的另一个维度是数据缓存。热门数据集在多个机房之间缓存副本,调度器优先把任务调度到有数据缓存的机房,减少数据搬运的成本。缓存策略是动态的——根据数据访问频率和机房存储容量,自动决定哪些数据应该缓存、缓存多少副本、何时淘汰。
运维可观测性:池化调度的透明度
异构算力池化调度最让开发工程师头疼的问题之一是黑盒——任务跑得慢,不知道是因为卡不行、网络堵了、还是被别人抢了资源。息壤提供多层次的运维可观测能力,让调度决策有迹可循。
任务级别能看到:任务被分配到了哪些卡、每张卡的型号和代际、卡之间的通信拓扑、每步迭代的计算时间和通信时间、检查点保存的频率和耗时。集群级别能看到:全域资源的利用率分布、各机房的空闲卡数和卡型分布、碎片率、调度等待时间、任务排队长度。这些数据不仅用于事后排障,也用于调度策略的持续优化——如果发现某个机房的通信延迟异常升高,调度器会自动降低对该机房的调度权重。
可观测性的另一个价值是成本核算。不同机房的电力成本、网络成本、硬件折旧成本不同,全域池化后用户可以按实际消耗付费。详细的资源使用记录是成本核算的基础,也是用户优化自己任务调度策略的依据——用户可以看到自己的任务在不同机房、不同时段运行的成本,从而调整提交策略来降低开销。
结语
息壤平台的异构算力统一池化调度,本质是用软件定义把“芯片孤岛”重构成“逻辑水库”。开发工程师看到的入口是任务描述文件,背后站着硬件抽象层、算力网关、多维调度引擎、拓扑感知、异构训推翻译、断点续训、算数协同、运维可观测这几块基石。它不消灭底层差异,而是把差异关进抽象层的笼子里,让大模型训练从“找卡、配环境、调通信库”的体力活,变成“说清楚要什么、剩下交给平台”的工程消费。在国产加速芯片与进口加速卡长期共存的现实里,这种池化能力不是锦上添花,而是大模型研发能否把精力放在模型本身、而不是放在运维算力碎片上的分水岭。