写点什么

企业级别的 tensorflow 分布式训练架构总结

2019 年 11 月 29 日

企业级别的tensorflow分布式训练架构总结

一. 美团点评训练 Wide & Deep Learning 模型

模型架构:



采用架构:parameter-server 参数服务器


优化点:输入数据环节、优化集群网络瓶颈、优化 PS 上的 UniqueOP 性能瓶颈。下面分别介绍这三个优化点:


输入数据环节


读取数据慢的原因:旧的 tensorflow 消费数据接口底层采用的是 python 多线程,受制于 Python 的全局解释锁(GIL),Reader 线程在训练时没有获得足够的调度执行;Reader 默认的接口函数 TFRecordReader.read 函数每次只读入一条数据,如果 Batch Size 比较大,读入一个 Batch 的数据需要频繁调用该接口,系统开销很大;


解决方法:采用新的 dataset 接口,采用批量读数据接口 TFRecordReader.read_up_to,该接口能够指定每次读数据的数量。


  1. 优化集群网络瓶颈


在推荐业务的模型中,embedding 张量的参数规模是千万级,TensorFlow 的 tf.embedding_lookup_sparse 接口包含了几个 OP,默认是分别摆放在 PS 和 Worker 上的。如图所示,颜色代表设备,embedding lookup 需要在不同设备之前传输整个 embedding 变量,这意味着每轮 embedding 的迭代更新需要将海量的参数在 PS 和 Worker 之间来回传输。



有效降低网络流量的方法是尽量让参数更新在一个设备上完成,利用 embedding_lookup_sparse_with_distributed_aggregation 接口,该接口可以将 embedding 计算的所使用的 OP 都放在变量所在的 PS 上,计算后转成稠密张量再传送到 Worker 上继续网络模型的计算。


  1. 优化 PS 上的 UniqueOP 性能瓶颈


embedding_lookup_sparse 操作会使用 UniqueOp 算子,TensorFlow 支持 OP 多线程,UniqueOp 计算时会开多线程,线程执行时会调用 glibc 的 malloc 申请内存。


而 Hadoop 有时会设置 export MALLOC_ARENA_MAX="4"的配置,该配置的意思是当进程开启多线程调用 malloc 时,最多从 4 个内存池中竞争申请,这限制了调用 malloc 的线程并行执行数量最多为 4 个。去掉该配置之后,线程并行执行数量没有限制,tensorflow 的并发性能得到极大提升。



二. 美团广告交易平台


模型:Wide & Deep 模型,特征包括用户维度特征、场景维度特征、商品维度特征。Wide 部分有 80 多特征输入,Deep 部分有 60 多特征输入,经过 Embedding 输入层大约有 600 维度,之后是 3 层 256 等宽全连接,模型参数一共有 35 万参数,对应导出模型文件大小大约 11M。


采用架构:TensorFlow 同步


优化点:


采用 Backup Workers,解决异步更新延迟和同步更新性能慢的问题。


优化参数分配方式,采用 GreedyLoadBalancing 接口,根据总的参数大小平均分配参数到各个 ps 上,取代了 Round Robin 取模分配的方法,可以使各个 PS 负载均衡。


计算设备方面:只使用 CPU 而不使用 GPU,训练速度会更快,这主要是因为尽管 GPU 计算上性能可能会提升,但是却增加了 CPU 与 GPU 之间数据传输的开销,当模型计算并不太复杂时,使用 CPU 效果会更好些。


使用 Estimator 高级 API,将数据读取、分布式训练、模型验证、TensorFlow Serving 模型导出进行封装。


使用 Estimator 的优势:单机训练与分布式训练可以很简单的切换,而且在使用不同设备:CPU、GPU、TPU 时,无需修改过多的代码;Estimator 的框架十分清晰,便于开发者之间的交流;可以直接使用一些已经构建好的 Estimator 模型:DNN 模型、XGBoost 模型、线性模型和 Wide&Deep 模型等。


参考文献:https://tech.meituan.com/2018/10/11/tfserving-improve.html


三. 字节跳动 BytePS

字节跳动 AI 实验室宣布开源了一款高性能分布式深度学习训练框架 BytePS。该框架支持 TensorFlow、Keras、PyTorch、MXNet,可以运行在 TCP 或 RDMA 网络中。BytePS 在性能上超过了过去性能一直领先的 ring all-reduce。BytePS 主要的优化点为:


  • 为云和共享集群设计,抛弃了 MPI 的通信方式。

  • 基于优先级的调度。

  • NUMA 感知本地通信、 PCIe switch 的优化

  • 分层策略

  • PS 的 RDMA 实现

  • 张量分区

  • 缺点:

  • 不支持纯的 CPU 训练

  • 不支持稀疏的模型训练

  • 异步训练

  • 容错机制

  • Straggler-mitigation

  • 本文转载自 Alex-zhai 知乎账号。


原文链接:https://zhuanlan.zhihu.com/p/75946827


2019 年 11 月 29 日 13:46274

评论

发布
暂无评论
发现更多内容

一个有趣的问题——孙庞猜数

小七

Python 数学

区块链将构建数字社会高效的全球网络

CECBC区块链专委会

数字经济 数字时代

架构师第一期作业(第 6 周)

Cheer

会展云技术解读丨多重安全保障护航云上会展

京东科技开发者

云计算 云服务 云平台

Mac/Windows 连接 Ubuntu 的 samba 服务器

jiangling500

ubuntu Mac windows Samba

创新方案百花齐放,英特尔助力2020 EdgeX中国挑战赛推动智能边缘行业创新及人才发展

intel001

测试悄然扩围 千万元红包搅活数字货币江湖

CECBC区块链专委会

数字人民币

合约自动跟单软件开发,API合约跟单系统

135深圳3055源中瑞8032

牛皮了!世界级调优大师以上古传承之魔法,彻底揭开GC的秘密

周老师

Java 编程 程序员 架构 面试

Netty源码解析 -- 内存对齐类SizeClasses

binecy

Netty 内存管理

区块链钱包应用开发,数字货币钱包系统

135深圳3055源中瑞8032

架构师训练营 - 第二周学习总结

joshuamai

Javassist实现JDK动态代理

AI乔治

Java 编程 架构 jdk

数字货币交易所源码,币币交易系统搭建

135深圳3055源中瑞8032

架构师训练营 - 第 6、7、8、9、10 、11、12、13周学习总结(1 期)

阿甘

JVM 源码解读之 CMS GC 触发条件

AI乔治

Java 架构 JVM GC

区块链是连接传统经济和数字经济的桥梁

CECBC区块链专委会

区块链 数字经济

面试官问我:看过sharding-jdbc的源码吗?我吧啦吧啦说了一通!!

冰河

分布式事务 微服务 分布式数据库 系统架构 中间件

《Linux学习笔记》从常用命令、常用操作到网络管理、性能优化,无论是Java开发或是运维都可以学习!

Java架构之路

Java 程序员 架构 面试 编程语言

USDT支付系统源码,承兑支付系统平台开发搭建

135深圳3055源中瑞8032

【高并发】导致并发编程频繁出问题的“幕后黑手”

冰河

并发编程 多线程 高并发 高性能 异步

甲方日常 41

句子

工作 随笔杂谈 日常

与其思考公司该为员工提供什么福利,不如思考有哪些 “福利” 不应该提供!

非著名程序员

个人成长 管理 福利

本文将大数据学习门槛降到了地平线

MySQL从删库到跑路

大数据 hadoop hdfs mapreduce

从实际案例聊聊Java应用的GC优化

AI乔治

Java 编程 架构 JVM GC

GitHub上最励志的计算机自学教程(重制版),前端小白到亚马逊工程师

沉默王二

GitHub 学习 程序员 面试

【JSRC小课堂】Web安全专题(三)SRC漏洞挖掘技巧:三步走收集高质量信息

京东科技开发者

WEB安全

工作5年的阿里Java程序员分享从业心得总结与面试笔记分享

Java架构师迁哥

架构师训练营 - 第 6 周课后作业(1 期)

阿甘

Apache Doris在京东广告的应用实践

DorisDB

数据库 大数据 数据仓库

JavaScript 对象 — 重学 JavaScript

三钻

Java 前端 对象

演讲经验交流会|ArchSummit 上海站

演讲经验交流会|ArchSummit 上海站

企业级别的tensorflow分布式训练架构总结-InfoQ