以 ChatGPT 为代表的 AIGC 浪潮正在重塑数字内容的生产方式和消费模式,相应的,各行业高算力业务场景对 AI 算力的需求也水涨船高。在有限算力的情况下,通过 GPU 算力上云,驱动云原生 + AI 实现算力资源的快速弹性和高效使用,已经成为 AI 技术落地的新基石。
当前,在异构计算场景下,云原生在资源灵活分配方面已经具备标准化能力,然而,这一能力并不能直接在 GPU 资源上复用。在保障性能和安全的前提下,如何进一步提高 GPU 的利用率,将多个容器运行在单张GPU卡上,仍是业界在持续探索的难题。
针对这一问题,目前业内已提出多种方案,例如 NVIDIA vGPU、NVIDIA MPS、rCUDA 等,都推出了不同的技术实践。但它们或多或少都存在 license 购买、故障隔离和重编译等问题。
在此背景下,火山引擎推出 mGPU(multi-container GPU)容器共享解决方案,为 AI 服务增添新动力。
mGPU 是火山引擎基于内核虚拟化隔离 GPU 并结合自研调度框架提供的容器共享 GPU 方案。在保证性能和故障隔离的前提下,它支持多个容器共享一张 GPU 显卡,支持算力与显存的灵活调度和严格隔离。
如上图所示,火山引擎 mGPU 容器共享解决方案包含两大关键模块:mGPU Driver 和容器服务 VKE。
其中 mGPU Driver 是火山引擎内核与虚拟化团队推出的容器共享 GPU 驱动软件,负责提供算力、显存的虚拟化能力和故障隔离能力:
- 资源隔离:支持显存资源上限与算力资源时分隔离,细粒度配置算力资源比例;
- 本地资源池化:支持对多卡容器进行资源隔离,消除资源碎片,最大化提高 GPU 资源利用率;
- 细粒度任务监控:提供容器内进程级别 GPU 任务监控能力;
- 动态资源配置:支持运行时更新资源配置;
- 生态兼容:支持 Pascal、Volta、Turing、Ampere 等主流 NVIDIA GPU 架构,适配标准开源的 Kubernetes 和 NVIDIA Docker。
火山引擎容器服务 VKE 在 mGPU Driver 的基础上,结合自研调度算法,提供完整的容器共享 GPU 服务。在 GPU 设备之上,切分后的 GPU 资源由 mgpu-device-plugin 发现和上报,mGPU Scheduler 根据上报资源和 Pod 中请求的 GPU 资源,通过调度算法计算实现 Pod 的灵活调度。
目前,VKE 支持单个容器申领 1% 精度的百分比算力和 1 MiB 级显存调度,兼容整卡调度场景,满足同时使用 GPU 容器共享和整卡 GPU 的业务场景。
除此之外,用户也可以通过开源 Prometheus,在整个调度过程中实现容器内 mGPU 相关用量指标采集和监控,充分保障应用的可靠性。
从技术角度看,将整张 GPU 卡切分使用其实已经满足提升资源利用率的需求。但在实际生产环境中,为了真正实现资源的弹性扩展、算力提升,用户还需要合理配置算力资源、充分使用碎片化的 GPU 资源,达到成本控制的目的。
火山引擎针对这一场景,在 mGPU scheduler 中引入 Kubernetes Scheduling Framework 框架扩展,实现了多种类型的调度能力。用户可通过容器服务 VKE 设置多种调度算法和策略,在不同场景下精细化调度各类资源。
算力分配策略
mGPU 提供多种算力分配策略,创建 GPU 节点池时可设置算力分配策略,Pod 亲和调度到对应的算力策略节点,实现不同算力资源池的配置和应用的调度,满足算力资源的高效应用。
双重调度策略
mGPU Binpack 调度
使用 Binpack 调度策略,可将多个 Pod 优先调度到同一个节点或者使用同一张 GPU ,显著提高节点和 GPU 的资源利用率。
mGPU Spread 调度
使用 Spread 调度策略,可将 Pod 尽量分散到不同的节点或者 GPU 卡上,当一个节点或者 GPU 卡出问题,并不影响其他节点或者 GPU 卡上的业务,保障高可用。
Binpack/Spread 双层调度
Binpack/Spread 双重调度可将节点和 GPU 卡不同层级的调度策略进行组合使用,灵活支撑不同场景下资源的使用情况。详细双层调度策略及适用场景如下:
多卡共享策略
在双层调度的基础上,mGPU 还支持多卡共享能力。单个容器可使用同一节点上的多张 GPU 卡共同提供算力和显存资源,打破同一个容器使用算力/显存局限于一张 GPU 卡的束缚,超过整卡资源可随心分配。
多卡共享场景下,应用只需申请显存和算力(例:L 个 GiB 的显存和 M% 的算力),并指定提供该资源的 GPU 卡数即可(例:N 张卡),系统将根据多卡共享算法,匹配符合要求的节点和 GPU 卡,每张 GPU 卡将为应用等分提供显存和算力(例:L/N 个 GiB 的显存和 M%/N 的算力)。
示例:假设 A 应用申请了 18GiB 显存和 240% 的算力,并指定了 GPU 卡数为 3,那么该节点需为该应用提供 3 张 GPU 卡,且每张 GPU 卡提供 6GiB 显存和 80% 算力。
总结
云的弹性,不仅能够帮助企业降低成本,也能大幅降低创新所需要的等待时间,这一点在大模型时代尤为关键。在 2023 年 4 月火山引擎举办的“原动力大会”上,谭待指出,基于字节跳动的云原生技术实践,火山引擎能帮助客户通过云原生进一步用好云的弹性。
mGPU 作为火山引擎深度自研的关键云原生技术之一,支持 Pascal/Turing/Volta/Ampere 等 Nvidia 主流 GPU 架构,对比 GPU 直通性能基本无损。经落地验证,它可以帮助客户将 GPU 部署密度提升 500% 以上,资源利用率提升超过 50%。
目前,mGPU 已作为核心能力之一融入容器服务 VKE,结合其他关键自研技术,火山引擎可以帮助客户简单便捷地实现 GPU 容器间共享、调度和监控能力,为用户提供一站式服务体验。未来,火山引擎云原生团队也将持续深耕云原生异构计算领域,提供更精细的调度策略、更优更稳定的计算能力和更好的计算价值。