超大规模训练调度优化实践

字节跳动在超大规模模型训练场景下,遇到了资源、稳定性、性能等问题。为了解决这些问题,基于 YARN 自研了通用分布式机器学习训练调度框架。为了更好地支持该调度框架,对 YARN 进行了一系列修改和适配,包括支持了多种异构资源,开发了具有全局视角的新调度器,新增了多种单机技术等,大幅提升了训练体验。

展开查看详情

1.超大规模训练调度优化实践 张云尧,字节跳动基础架构工程师 钱瀚,字节跳动基础架构工程师

2. 目录 • 背景 • YARN 针对训练场景的优化 • 资源类型 • 调度器 • 隔离及性能 • 稳定性 • 混部 • PRIMUS 机器学习训练调度框架 • 多框架支持 • 多角色支持 • 编排调度 • 混部优化

3.背景

4. 背景 整体架构

5. 背景 挑战 编排调度需求复杂 性能、稳定性要求高 部署环境复杂 资源严重短缺 多种深度学习框架需求各不相同 单作业存在多种角色,不同角色间的资源配置和调度需求差距很大

6.YARN 针对训练场景的优化 • 资源类型 • 调度器 • 隔离及性能 • 稳定性 • 混部

7. YARN 训练规模 YARN 训练规模

8. YARN 资源类型 YARN 新增资源类型: • GPU • TPU • PORT • NIC

9. YARN 调度器 Fair Scheduler • 调度由节点心跳触发 • 每次调度分配有限个 container 问题: • 资源不足时,训练作业 pending 不如直接失败 • 没有全局视角,不能满足各种特定调度需求

10. YARN 调度器 Unified Scheduler • 提供 All or Nothing 调度语义 • 全局视角 • 丰富的调度约束 • 约束类型:强约束(必须满足)& 弱约束(尽量满足) • 全局:quota 平均、quota 集中 • 作业:container 打散、container 集中、host unique、整机调度 • 节点:节点属性、高 load 跳过

11. YARN 隔离及性能 Docker on YARN:解决复杂依赖环境问题 • 提升作业启动速度:镜像 P2P 下载、镜像预热 • 管控本地磁盘:本地镜像自动回收,挂载目录读写管控 Docker on YARN CU Strict 训练作业已全量上线 Docker on YARN。 相对挂载模式

12. YARN 隔离及性能 CPU 隔离及性能优化 • CPU Strict:保证每个容器的 CPU 时间片 • NUMA:绑定 NUMA,减少跨 socket 开销,性能提升 20% 以上 • CPUSET:绑核,减少上下文切换开销和减少 cache miss 等,性能提升 30% 以上

13. YARN 稳定性 Health Check、黑名单、机器巡检、…… 退出码治理:直观标识作业失败原因 • 细化 container 退出码 • 新增 application 退出码

14. YARN 混部 如何解决资源短缺的问题? 通过大规模混部的方式,使用其他业务(在线/流式等)的空闲资源。 常态混部: 错峰混部: 在线/流式和离线训练全天同时运行 在线机器凌晨出让给离线训练

15. YARN 混部 混部主要工作: • 单机多级资源隔离 • 动态资源 & 动态 quota • 资源不足时驱逐混部 container • 单集群 5W 节点 • 作业 pending 时间过长直接失败 为训练作业提供了充裕的资源,提升了机器利用率。 针对字节内部上线的多种混部方式,训练框架也做了相应优化。

16.机器学习训练调度框架 • 多框架支持 • 多角色支持 • 编排调度 • 混部优化

17. Primus 简介 • 运行于Hadoop Yarn之上 • 负责机器学习框架的编排调度 架构图

18. Primus 多框架 • 问题:如何用尽可能低的成本适配多种框架? • 解决: • Plugin 方式,模块内有多个 hook 点 Tensorflow

19. Primus 自定义角色 • 问题:如何满足多种角色的需求? • 解决: • Json 描述角色名、个数、资源、镜像、各种策略等 • 根据不同角色使用不同的资源和调度配置

20. Primus 自定义角色 • 问题:如何满足多种角色的需求? • 解决: • Json 描述角色名、个数、资源、镜像、各种策略等 • 根据不同角色使用不同的资源和调度配置

21. Primus 编排调度 问题:如何满足不同框架的各种编排调度需求 解决:定义多种编排调度策略 Gang Dynamic Order

22. Primus 编排调度 Failover策略 • Never • Always • OnFailure

23. Primus 编排调度 Failover策略 • Never • Always • OnFailure

24. Primus 编排调度 Failover策略 • Never • Always • OnFailure

25. Primus 编排调度 Failover策略 • Never • Always • OnFailure

26. Primus 编排调度 Failover策略 • Never • Always • OnFailure

27. Primus 编排调度 Failover策略 • Never • Always • OnFailure

28. Primus 编排调度 Failover策略 • Never • Always • OnFailure

29. Primus 常态混部支持 • 特点 • 杀死率高 • 不可预知 • 明显潮汐特征 • 解决 • 只调度支持 failover 角色,优化 failover 逻辑 • 细粒度 checkpoint • 低 worker 运行 & 跨 app 状态保存与恢复