关于开源:字节跳动正式开源分布式训练调度框架-Primus

30次阅读

共计 2263 个字符,预计需要花费 6 分钟才能阅读完成。

我的项目地址:https://github.com/bytedance/primus

随着机器学习的倒退,模型及训练模型所需的数据量越来越大,也都趋向于通过分布式训练实现。而算法工程师通常须要对这些分布式框架波及到的底层文件存储和调度零碎有较深的了解,才可能疾速批量开启模型训练,保障资源利用率。

目前业界有很多相似的框架,如 TonY、TensorFlowOnSpark,Kubeflow 中的 Training Operators 等,但这些框架或多或少存在某些问题,如与固定的机器学习框架(Tensorflow,Pytorch)耦合须要写明例如 PS、Worker 等角色,容错和弹性调度反对不敌对,不反对异构调度,调度语义较为简单,不反对文件读取等。

将算法工程师从此类沉重的底层细节中解脱进去、更多地关注到算法层面,即为 Primus 解决的问题。

日均作业百万核的字节跳动实际

通过字节跳动在一直实际中调整打磨的 Primus,领有以下能力撑持业务需要:

  1. 自研训练框架:目前除了业界开源的 Tensorflow、Pytorch,为了满足用户的各种需要,字节也在机器学习场景进行了深刻摸索,自研多个训练框架用于满足用户需要;
  2. 领有底层资源调度零碎 YARN 和 Kubernetes:目前阶段处在 YARN 向 Kubernetes 的迁徙过程中,在此过程中须要对用户屏蔽底层的调度零碎,提供统一的体验;
  3. 大规模利用混部资源:因为混部资源不稳固的特点,对训练的容错和稳固有着更高的要求;
  4. 反对简单调度编排语义:为了使集群资源利用率最大化,须要将适合的容器放在适当的地位上,并须要可能动静调整并发和容器大小。
  5. 反对简单数据源和数据调度需要:反对多种类型数据源和数据类型的混合训练,如 HDFS、Kafka 等批式流式数据源,Text、PB、Parquet 等数据类型。

目前 Primus 流批一体训练框架在字节外部反对了抖音、头条、Tiktok、广告等大部分业务,每天运行在 Primus 上的作业总核数达到几百万。相比旧的基于 Hadoop Streaming 的框架,训练性能晋升 3 倍,单次训练总数据量从 TB 级晋升到了 PB 级,训练筹备工夫由几十分钟升高到秒级。

分布式训练调度框架 Primus

Primus 是一个通用的分布式训练调度框架,治理了机器学习训练框架(如 Tensorflow、Pytorch)的生命周期和数据散发,帮忙训练框架取得更好的分布式能力。

架构介绍

Primus 整体架构

整个 Primus 生命周期分为两阶段,提交阶段和执行阶段。

1. 提交阶段
用户须要形容整个工作的训练资源,数据输出以及容错策略。

  • 训练资源包含须要的角色(如 PS,Worker 等)以及各角色所需的资源,包含其须要的 CPU、内存以及运行脚本、环境变量等。
  • 数据输出用于形容如何把数据提供给训练器。
  • 容错策略用于形容遇到谬误时,Primus 须要进行的操作。

Primus Client 通过依据用户的配置,向 YARN 或 Kubernetes 集群提交 Primus Application Master(之后简称 AM)用于治理 Primus 作业集群的运行。

2. 执行阶段
当作业提交到集群后,AM 会依据用户的配置向 Resource Manager 申请若干 Executor,并上拉起对应的角色,在继续监控这些角色的衰弱状态过程中,如果发现状态异样,AM 则会依据用户配置进行相应的操作保障训练失常运行。

3. 数据读取
Primus 反对读取数据输入到训练器,可能实现数据的负载平衡并时刻记录数据的状态,升高长尾问题,在训练器有问题时也可能切换到失常的训练器持续进行训练。AM 通过扫描须要训练的数据并切分为 Task,能够将 Task 分发给 Executor,并与 Executor 通信记录 Task 的状态。

性能介绍

  1. 多训练框架反对:Tensorflow、PyTorch、Monolith 等;
  2. 多调度器反对:YARN、Kubernetes 等;
  3. 多角色反对:如 PS-Chief-CPU、Worker-GPU、Worker-Evaluator 等,并反对多角色之间的亲和反亲和等非凡调度策略;
  4. 多编排策略:反对同时启动,一一启动,基于角色的按程序启动等(如先启动 PS,再启动 Worker);
  5. 容错解决:Worker 失败主动拉起新 Worker,PS 失败整体失败;
  6. 动静调度:例如反对动静扩充放大 Worker 数;
  7. 多数据源数据类型反对:HDFS、Kafka 等;
  8. 数据负载平衡与状态保留:反对按 Worker 负载动态分配 Task,如在 Worker 失败时反对回收 Task 并进行重新分配;
  9. 多线程高速数据读取:反对多线程读取 HDFS 和 Kafka 后输入到训练器,进步单训练器的吞吐。

部署状况

Primus 撑持了字节跳动外部“举荐”“广告”“搜寻”等场景,如头条举荐、抖音视频举荐、穿山甲广告、千川图文广告、抖音搜寻等业务的超大规模深度学习训练,日均可达上万工作的训练,450W Core 资源的应用。

将来布局

  1. 开源 Primus 更多能力后续将陆续凋谢,详见:https://mp.weixin.qq.com/s/uGBy-WpdjTMUy-7MQAZiwwPrimus
  2. 目前与字节外部训练框架集成较多,Tensorflow 和 Pytorch 能够应用 Primus 的根本能力,后续将开发 Tensorflow 和 Pytorch 适配 Primus API 实现更深度的集成,赋能开源训练框架。

目前,Primus 已在 Github 上开源,欢送大家一起参加共建!

我的项目地址:https://github.com/bytedance/primus

正文完
 0