4月10-12日 QCon 北京,与全球 140+ 顶尖工程师共同解构 AI 时代的技术浪潮! 了解详情
写点什么

字节跳动开源高性能分布式训练框架 BytePS:兼容 TensorFlow 等

  • 2019-06-27
  • 本文字数:2735 字

    阅读完需:约 9 分钟

字节跳动开源高性能分布式训练框架BytePS:兼容TensorFlow等

近日,字节跳动人工智能实验室宣布开源一款高性能分布式深度学习训练框架 BytePS,在性能上颠覆了过去几年 allreduce 流派一直占据上风的局面,超出目前其他所有分布式训练框架一倍以上的性能,且同时能够支持 Tensorflow、PyTorch、MXNet 等开源库。


首先奉上 BytePS 开源项目地址:https://github.com/bytedance/byteps


BytePS 结合了字节跳动人工智能实验室几个月来对分布式训练通信的多个研究与优化成果,包含通信优先级调度、PS 的 RDMA 实现、针对 PCIe switch 与 NUMA 的优化,以及 BytePS 本身构架的创新等。


深度学习的效果取决于模型与数据,目前行业内不断刷新深度学习准确率的最新研究,大多都基于更大的模型以及更大的数据集。然而,大模型与大数据对训练时的计算能力提出了极高要求,单张 GPU 卡,或者单台服务器上的 GPU 卡,已经远远不能够满足内部训练任务的需求。因此,分布式训练的效率,即使用多台服务器协同进行训练,现在成为了深度学习系统的核心竞争力。


一直以来,在分布式训练中有两大流派,分别是 allreduce 和 PS(Parameter Server)。过去三年中,尤其是百度提出 allreduce,以及 Uber 开源基于 allreduce 的 Horovod 之后,行业内的认知中,allreduce 是最好的分布式训练通信方式,而过去的 PS 实现的性能也确实与 allreduce 存在一定差距。


BytePS 颠覆了 allreduce 长期领先的局面,BytePS 拥有着超出目前其他所有分布式训练框架一倍以上的性能,包括 NVIDIA 开源的 NCCL,Uber 开源的 Horovod,以及 Tensorflow、PyTorch、MXNet 自带的分布式训练方案等。


BytePS 开发团队表示,在公有云或者私有云这类共享集群中,经过精巧设计和高质量实现的 PS,PS 架构不仅不比 allreduce 差,而且在一些环境还能得到比 allreduce 还高一倍的速度。


为了做到针对云计算和共享集群场景的最优训练表现,BytePS 团队重新思考了最佳通信策略,不仅在机器内使用 NCCL,同时也重新部署了机器间的通信方式。


据介绍,在服务器内,GPU 是插在不同的 PCIe switch 上的,相同 PCIe switch 内的 GPU 通信带宽较高,跨 PCIe switch 的通信带宽就较小。NUMA 是指服务器上有不止一颗 CPU,CPU 内存也有类似问题:同 CPU 的内存访问带宽高,跨 CPU 的内存访问带宽低。BytePS 会根据这些信息,有选择地分配数据在 CPU 和 GPU 中的内存位置,以及哪块内存和哪块内存通信,从而最大化通信带宽。


BytePS 构架本身也做了一些重要设计,使得 PS 架构理论上的潜能得以实现,包括:Tensor 自动切分、多级灵活流水线处理、网络通信优先级调度、ZeroMQ 优化、共享内存 zero-copy、RDMA 实现和 PS 端多队列多线程优化。


更详细的实现原理参见这里

性能表现

测试中,BytePS 团队使用了公有云上的虚拟机,每个虚拟机有 8 张 Tesla V100 16GB GPU,GPU 之间通过 NVLink 进行高速互连。每个 GPU 上的 batch size 选取为 64。虚拟机之间通过 20Gbps 的 TCP/IP 网络进行连接。在这种情况下,由于机器之内带宽足够大,TCP/IP 的网络带宽则成为了主要瓶颈。


BytePS 选择了 Resnet50 和 VGG16 两个模型进行评测,其中 Resnet50 是计算密集型的模型(对通信要求低,优化空间小),VGG16 是通信密集型的模型(对通信要求高,优化空间大),对照组选择了目前市面上最流行的通信框架之一 Horovod-NCCL(基于 allreduce 算法实现),性能指标为每秒钟训练的 ImageNet 图片数量,越高代表越好。




通过两组实验结果可以看出,对于计算密集型的 Resnet50 模型,BytePS 性能超过 Horovod-NCCL 近 44%;而对于通信密集型的 VGG16 模型,BytePS 性能可以超过 Horovod-NCCL 将近 100%。


BytePS 团队也在配有 100Gbps 的 RDMA 网络的私有集群做了测试,BytePS 也有一定的性能提升,具体分析参见Github


除了在性能上超出目前其他所有分布式训练框架外,BytePS 可以兼容 Tensorflow、PyTorch、MXNet 等训练框架。BytePS 团队表示,开发者只需要非常少的改动,就可以使用 BytePS 框架进行分布式训练,享受 BytePS 带来的高性能。


此前行业里的 PS 实现,都是针对特定通用框架,例如专门为 TensorFlow 实现的 PS,也有专门为 MXNet 实现的 PS。


字节跳动人工智能实验室开源的 BytePS,通过实现一个通用的抽象层,抽象层可以被各种通用框架引用,实现了同时支持多个框架的可能性,因此能够支持 Tensorflow、PyTorch、MXNet 等行业主流训练框架。



BytePS 提供了 TensorFlow、PyTorch、 MXNet 以及 Keras 的插件,用户只要在代码中引用 BytePS 的插件,就可以获得高性能的分布式训练。BytePS 的核心逻辑,则实现在 BytePS core 里。具体的通信细节,完全由 BytePS 完成,用户完全不需要操心。

快速上手 BytePS

使用 BytePS 前,假设你已经安装了以下一种或更多框架:TensorFlow、Keras、PyTorch、MXNet 等。BytePS 主要基于 CUDA 和 NCCL。


复制 BytePS 和第三方依赖:


git clone --recurse-submodules https://github.com/bytedance/byteps
复制代码


进入 BytePS 文件目录,并安装:


python setup.py install
复制代码


注意:你可能需要设置 BYTEPS_USE_RDMA=1 来安装 RDMA 支持。


现在你可以试试我们已有的示例。假设你使用 MXNet,并想尝试 Resnet50 训练基准。


export NVIDIA_VISIBLE_DEVICES=0,1 \       DMLC_NUM_WORKER=1 \       DMLC_NUM_SERVER=1 \       DMLC_WORKER_ID=0 \       DMLC_ROLE=worker \       DMLC_PS_ROOT_URI=10.0.0.1 \       DMLC_PS_ROOT_PORT=1234 \       DMLC_INTERFACE=eth0
python byteps/launcher/launch.py byteps/example/mxnet/train_imagenet_byteps.py --benchmark 1 --batch-size=32
复制代码


对于分布式训练,你可能需要建立一个服务器镜像。研发团队提供了 Docker 文件作为例子。你可以将同样的镜像用于调度和服务器。


关于如何启动分布式任务的内容和更多上手教程可参考相关文档

如何在已有代码中使用 BytePS

虽然内核设计有所不同,但 BytePS 和 Horovod 接口高度兼容,我们希望通过 Horovod 接口减少用户测试 BytePS 的工作量。


如果你的任务只依赖于 Horovod 的 allreduce 和广播,你可以在一分钟内切换到 BytePS。只需要用 import byteps.tensorflow as bps 替换 import horovod.tensorflow as hvd,并将代码中所有的 hvd 替换成 bps 即可。

BytePS 的局限和未来计划

BytePS 目前不支持单纯的 CPU 训练,其中一个原因是 BytePS 的部分底层逻辑可能无法支持。因此你需要使用 CUDA 或 NCCL 来构建和运行 BytePS。


未来 BytePS 计划增加以下特性:


  • 稀疏模型训练

  • 异步训练

  • 容错机制

  • 延迟减缓


BytePS 团队表示,深度学习领域仍然有非常大的空间和可能性值得行业同仁们一起探索,开源 BytePS,是希望利用 BytePS 在性能和功能上的先进性,降低开发者和深度学习领域参与者们的门槛,帮助更多同道中人一起探索深度学习,提升 AI 应用效率。


2019-06-27 17:4811672
用户头像
蔡芳芳 InfoQ主编

发布了 802 篇内容, 共 573.9 次阅读, 收获喜欢 2799 次。

关注

评论 3 条评论

发布
用户头像
评论来了, 水一发字节跳动的招聘: https://job.toutiao.com/2018/spring_referral/?token=gJzTw%2BzsbdCQSiVyZBefSg%3D%3D&key=MzUyNzAsMzIxMTcsMzcxMDQsMzUyMjgsMzY3NjgsMzY3NjYsMTg1NTI%3D
2019-06-29 17:20
回复
用户头像
为啥感觉InfoQ上的文章通常都没人评论呢?
2019-06-28 13:31
回复
也想知道原因。
2019-06-28 14:26
回复
没有更多了
发现更多内容

业务缓存之体系化设计与开发

Qunar技术沙龙

系统开发

RT-Thread记录(三、RT-Thread 线程操作函数及线程管理与FreeRTOS的比较)

矜辰所致

RTT RT-Thread 8月月更 线程操作

开源一夏 | 使用 JavaScript 和 CSS 做一个图片转 PDF 的转换器

海拥(haiyong.site)

JavaScript 开源 前端 8月月更

Kubernetes资源编排系列之四: CRD+Operator篇

阿里云大数据AI技术

大数据 运维

自动驾驶中的SLAM

博文视点Broadview

云原生系列五:Kafka 集群数据迁移基于Kubernetes的内部

叶秋学长

kafka 开源 Kubernetes 8月月更

K8S之Flannel的vxlan网络模式初步源码解析

k8s flannel 签约计划第三季

鲲鹏开发者创享日2022:鲲鹏全栈创新 与开发者共建数字湖南

科技热闻

看到这个应用上下线方式,不禁感叹:优雅,太优雅了!

华为云开发者联盟

云计算 开发 CCE

PWA 应用 Service Worker 缓存的一些可选策略和使用场景

汪子熙

typescript 前端开发 angular Service Worker 8月月更

如何用建木CI构建前端E2E质量自查

Jianmu

DevOps 前端 持续集成 代码质量 自动化测试

以技术御风险,护航云原生 | 同创永益 X 博云举办产品联合发布会

BoCloud博云

云计算 容器 云原生

在SAP分析云里根据业务数据绘制词云(Word Cloud)

汪子熙

SaaS SAP 词云 8月月更 word-cloud

分分钟快速定制您的专属个性化软件应用——BizTool自动化工具简介

BizFree

软件开发 快速开发 低代码开发 个性化 应用开发

【LeetCode】受限条件下可到达节点的数目Java题解

Albert

LeetCode 8月月更

转转商品系统高并发实战(数据篇)

转转技术团队

分布式 高并发

海外邮件发送指南(一)

极光JIGUANG

消息推送 邮件 SendCloud

使用类似搭积木的低代码开发方式进行 SAP API 开发

汪子熙

低代码 云平台 SAP 8月月更 low-code

Dapr在Java中的实践 之 服务调用

万猫学社

微服务 dapr Sidecar

结合“xPlus”探讨软件架构的创新与变革

BizFree

敏捷开发 软件架构 数字化 信息化 软件定制

一名合格的程序员是如何优雅地解决线上问题的?

程序员小毕

Java 程序员 架构 程序人生 后端

Spring(五、注解开发)

开源 8月月更

Java 在Word中合并单元格时删除重复值

在下毛毛雨

java; 合并单元格 删除重复值

5S软件就是将软件应用全维度简单化的软件系统

BizFree

k8s 敏捷开发 软件架构 高性能 快捷调试

STM32的内存管理相关(内存架构,内存管理,map文件分析)

矜辰所致

内存 stm32 Flash 8月月更

游戏开发常遇到数据一致性BUG,怎么解?

华为云开发者联盟

数据库 后端 游戏开发

一文读懂配置管理(CM)

SEAL安全

企业安全 企业it安全 代码安全

Dapr在Java中的实践 之 环境准备

万猫学社

微服务 dapr Sidecar

Dapr在Java中的实践 之 状态管理

万猫学社

Java 微服务 dapr Sidecar

易周金融分析 | 互联网系小贷平台密集增资;上半年银行理财子公司综合评价指数发布

易观分析

金融 分析 易周金融

写给 Java 程序员的前端 Promise 教程

江南一点雨

Java spring 前端 springboot Promise

字节跳动开源高性能分布式训练框架BytePS:兼容TensorFlow等_AI&大模型_蔡芳芳_InfoQ精选文章