池化抽象:把物理算力变成逻辑资源
资源池化的第一层工作是硬件抽象。不同厂商、不同代际的加速卡在算力、显存、通信带宽、虚拟化能力上差异巨大。如果调度系统直接面向物理卡做决策,每接入一种新硬件就要适配一套新的管理接口,池化的规模越大,运维复杂度越高。
大模型训推服务提供商的池化层通过硬件抽象机制,把每张物理卡的属性——型号、显存大小、互联拓扑、虚拟化切分能力、当前负载——注册到资源管理中心,向上暴露成标准化的逻辑算力单元。逻辑单元不是一比一映射到物理卡。一张高性能卡可以被切分成多个虚拟单元分配给多个推理任务,多张低性能卡也可以聚合为一个逻辑单元满足单一大模型训练的内存需求。切分粒度和聚合策略由调度器根据任务需求和卡的实时状态动态决定,不是管理员预先配死的。
抽象层还要消化驱动和固件差异。不同代际的加速卡对训练框架版本、通信库版本、容器运行时版本的要求不同,池化层在任务调度时自动匹配或通过容器化方式屏蔽这些差异,不让软件版本成为跨代际调度的障碍。开发工程师提交任务时不需要声明“我要用某型号卡”,只需要声明“我需要多少算力、多少显存”,池化层负责找到最合适的物理资源来满足这个需求。
资源切分与隔离:一张卡服务多个任务
资源池化的核心能力是切分。一张物理卡可以被切分成多个逻辑单元,每个单元拥有独立的显存空间和算力配额,运行不同的任务实例。切分的粒度决定了资源利用率的极限——切分太粗,小任务浪费资源;切分太细,隔离开销吞噬性能。
大模型训推服务提供商的切分策略是动态的。对于推理任务,单个实例通常只需要一小部分显存和算力,一张卡可以同时运行多个推理实例。对于训练任务,单个实例可能需要独占整张卡甚至多张卡,切分粒度相应调整。调度器根据任务的资源需求和当前池子的碎片情况,自动选择最合适的切分方案。
切分之后是隔离。多个任务共享同一张物理卡时,必须保证它们在显存、算力、带宽上互不干扰。推理任务的突发请求不能抢占训练任务的算力配额,训练任务的大量显存读写不能影响推理任务的显存访问。硬件级虚拟化切分提供最强的隔离保障,软件级切分则需要配合服务质量保障机制来弥补隔离性的不足。
隔离的另一个维度是安全。不同租户的任务可能跑在同一张物理卡的不同虚拟单元上,必须防止一个租户通过共享资源窃取另一个租户的模型参数或推理数据。池化层在虚拟化切分的基础上叠加内存加密和访问控制,确保租户间的数据隔离达到安全合规的要求。
弹性扩缩:按需分配、动态调整
弹性扩缩是资源池化的价值兑现环节。没有弹性,池化只是把资源集中在一起,并没有改变资源的使用效率。弹性让资源可以根据负载的变化自动调整分配,在流量高峰时扩容保障服务质量,在流量低谷时缩容节约成本。
弹性扩缩有两个维度。水平扩缩改变实例数量——流量上升时启动更多实例,流量下降时回收多余实例。垂直扩缩改变单个实例的资源配置——流量上升时为现有实例增加算力配额,流量下降时缩减配额。水平扩缩解决规模问题,垂直扩缩解决速度问题。水平扩缩的响应速度受限于实例启动时间,可能需要几十秒到几分钟;垂直扩缩可以在秒级完成,适合应对突发流量。
大模型训推服务提供商的弹性策略是水平和垂直协同的。当检测到负载上升时,先触发垂直扩容,在秒级为现有实例增加资源,吸收突发流量。同时启动水平扩容流程,创建新的实例。当新实例就绪后,把流量逐步切换到新实例上,再将原有实例的资源配置恢复到正常水平。负载下降时,先回收多余的实例,再调整剩余实例的资源配置。这种先垂直后水平、先水平后垂直的协同策略,目标是让服务质量曲线始终保持稳定,不因弹性动作本身产生抖动。
弹性扩缩的触发条件通常是多维度的。请求延迟超过阈值触发扩容,队列深度超过阈值触发扩容,资源利用率超过阈值触发扩容。单一的触发条件容易误判——延迟升高可能是因为流量突增,也可能是因为后端服务自身的抖动。多维度联合判断可以提高弹性动作的准确性,减少不必要的扩缩。
训推混部:让训练吃掉推理的波谷
资源池化的最高级形态是训推混部。训练任务和推理任务共享同一个资源池,调度器根据实时负载动态调整两者的资源配额。推理流量高时,训练任务让出资源;推理流量低时,训练任务吃掉闲置算力。
训推混部的核心矛盾是资源竞争的公平性。训练任务希望独占资源以保证训练效率,推理任务希望随时有资源可用以保证服务延迟。如果训练任务完全不吃亏,推理任务的波峰就会因为没有资源而失败;如果推理任务完全不吃亏,训练任务在推理波谷时也拿不到闲置资源,池化的价值就打了折扣。
大模型训推服务提供商的混部策略是优先级加配额的双重管控。推理任务享有高优先级,在资源紧张时可以抢占训练任务的资源。训练任务享有低优先级,在资源空闲时可以借用推理任务的资源。但抢占不是无条件的——推理任务只能抢占到满足其延迟要求的程度,不能无限度地挤压训练任务。配额机制保证训练任务在长时间尺度上获得其应有的资源份额,不会被推理任务的频繁抢占拖垮训练进度。
混部的实现依赖加速卡的虚拟化切分和动态重配能力。一张卡在白天可以同时运行训练和推理任务,各占一部分虚拟单元;深夜推理流量下降后,推理单元的配额被释放,训练单元接管整张卡。这种动态切换在秒级完成,对两端任务的影响降到最低。
调度决策:从全局视角做最优匹配
资源池化和弹性扩缩的背后是调度引擎。调度器掌握全局资源视图和所有任务的资源需求,在每次决策时综合考虑多个维度,选出最优的资源分配方案。
调度决策的第一个维度是资源匹配度。不同任务对算力、显存、带宽的需求不同,调度器需要把任务分配到最能满足其需求的物理资源上。对显存敏感的大模型训练任务优先分配到显存大的卡上,对延迟敏感的推理任务优先分配到算力强的卡上。
第二个维度是拓扑亲和性。大模型训练的梯度同步依赖卡间通信带宽,调度器会优先把同一个训练任务的进程分配到拓扑距离最近的卡上,减少通信延迟。推理任务对拓扑亲和性的要求较低,但同一个模型的多个推理实例如果分布在不同的机房,用户请求的延迟会因地域差异而不同,调度器会尽量把它们集中部署。
第三个维度是时间和成本。不同时段、不同地域的算力成本不同,调度器可以在性能最优和成本最优之间切换策略。高优任务走性能最优路线,低优任务走成本最优路线,夜间低谷期利用闲置算力跑可中断的训练任务。
第四个维度是预留和抢占的平衡。有些任务需要在特定时间开始,调度器支持资源预留,在任务开始前锁定所需资源。预留和抢占之间的冲突由优先级和预约时间共同决定——预约时间越早、优先级越高的任务,预留的锁定力越强。
运维可观测性:让弹性动作透明可见
资源池化和弹性扩缩最让开发工程师头疼的问题是黑盒。任务跑得慢,不知道是因为资源不足、网络拥堵、还是弹性动作本身导致的抖动。运维可观测性的价值就是让每一次调度决策、每一次弹性动作都有迹可循。
任务级别能看到:任务被分配到了哪些物理资源、资源的型号和代际、资源切分的比例、弹性扩缩的历史记录、每次扩缩的触发原因和执行耗时。集群级别能看到:全局资源的利用率分布、各机房的空闲资源量和类型分布、碎片率、调度等待时间、任务排队长度。业务级别能看到:请求延迟的分位数变化曲线、弹性动作前后的延迟对比、弹性动作对用户体验的实际影响。
这些数据不仅用于事后排障,也用于弹性策略的持续优化。如果发现某次水平扩容后的延迟反而升高了,说明冷启动阶段的请求被分配到了尚未就绪的新实例上,需要调整预热策略或负载均衡算法。如果发现垂直扩容的频率过高,说明流量波动幅度超出了垂直弹性的能力范围,需要提高水平弹性的响应速度或增加预热池的容量。
可观测性的另一个价值是成本核算。不同资源的使用成本不同,详细的资源使用记录是成本核算的基础,也是用户优化自己任务调度策略的依据。用户可以看到自己的任务在不同时段、不同资源配置下的运行成本,从而调整提交策略来降低开销。
结语
大模型训推服务提供商的资源池化与弹性扩缩,本质是用软件定义的调度能力把物理算力从孤岛变成海洋,让训练和推理两种性格截然不同的负载在同一片海洋里和谐共存。池化解决资源的可见性和可调度性,切分和隔离解决资源的利用效率和安全性,弹性扩缩解决资源与负载的动态匹配,训推混部解决训练和推理之间的资源复用,调度决策解决多维约束下的最优分配,运维可观测性解决整个系统的透明度和可优化性。开发工程师在使用这类服务时,不需要手动规划资源的分配和释放,平台根据负载变化自动完成这一切。在算力成本居高不下、训练和推理需求同时增长的背景下,这种资源池化和弹性扩缩能力不是锦上添花的优化,而是让大模型服务在经济上和技术上都可持续运行的基础设施级支撑。