项目地址:github.com/bytedance/p…

跟着机器学习的发展,模型及练习模型所需的数据量越来越大,也都趋向于经过分布式练习实现。而算法工程师通常需求对这些分布式结构涉及到的底层文件存储和调度体系有较深的理解,才能够快速批量开启模型练习,确保资源利用率。

现在业界有很多类似的结构,如 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 全体架构

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

  1. 提交阶段

用户需求描绘整个使命的练习资源,数据输入以及容错战略。

  • 练习资源包含需求的人物(如 PS,Worker 等)以及各人物所需的资源,包含其需求的 CPU、内存以及运转脚本、环境变量等。
  • 数据输入用于描绘怎么把数据提供给练习器。
  • 容错战略用于描绘遇到错误时,Primus 需求进行的操作。

Primus Client 经过根据用户的装备,向 YARN 或 Kubernetes 集群提交 Primus Application Master(之后简称 AM)用于管理 Primus 作业集群的运转。

  1. 履行阶段

当作业提交到集群后,AM 会根据用户的装备向 Resource Manager 申请若干 Executor,并上拉起对应的人物,在持续监控这些人物的健康状况过程中,如果发现状况反常,AM 则会根据用户装备进行相应的操作确保练习正常运转。

  1. 数据读取

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 更多才能后续将连续开放,详见:mp.weixin.qq.com/s/uGBy-Wpdj…

  2. Primus 现在与字节内部练习结构集成较多,Tensorflow 和 Pytorch 可以使用 Primus 的基本才能,后续将开发 Tensorflow 和 Pytorch 适配 Primus API 实现更深度的集成,赋能开源练习结构。

现在,Primus 已在 Github 上开源,欢迎我们一同参与共建!

项目地址:github.com/bytedance/p…