支撑千万规模类别分类技术,百度飞桨定义工业级深度学习框架

文章正文
发布时间:2020-03-27 14:35

2016 年,AlphaGo 横空出世,人工智能时代到来。同年,百度开源自研的深度学习框架 PaddlePaddle(飞桨),成为中国首个开源深度学习框架。
然而,这波由深度学习推动的技术和产业浪潮,也面临着诸多挑战。
数据量越来越大,有些模型的训练数据动辄上 TB;模型越来越深,越来越复杂,从 AlexNet 的 8 层,到 ResNet-1000 的 1202 层;模型参数越来越多,甚至超过 10 个亿……
深度学习模型的训练效率成为一个关键问题。
因为深度学习模型的效果迭代对训练速度非常敏感,所以能够带来高性能分布式训练的深度学习框架是实际开发和应用的刚需,也是 AI 在产业界能够真正落地的基础。
相同的硬件设备数,高效率的分布式训练,可以大大缩短产品迭代周期。而在受限的时间要求下,高效率的平台型工具也可以显著减少硬件需求。
作为中国首个唯一开源开放、功能完备的深度学习平台。经过多年的产业实践,百度飞桨已成长为集核心框架、工具组件和服务平台为一体的端到端开源深度学习平台,飞桨的大规模分布式训练能力始终是其重要亮点。
百度深度学习技术平台部总监马艳军在 CSDN 举办的 AI 开发者大会上曾介绍,“飞桨同时支持稠密参数和稀疏参数场景的超大规模深度学习并行训练,支持万亿乃至更高量级规模参数的高效并行训练,也是最早提供如此强大的深度学习并行技术的深度学习平台,通过技术创新做到高效、稳定、成本低廉。”

真正的工业级规模:千亿规模稀疏特征,千万规模类别分类

为降低超大规模分类应用对普通的深度学习模型开发者的门槛,进一步帮助开发者提升个性化推荐应用的性能,飞桨推出了针对分布式训练的一套全新的高并发参数服务器实现, 并发布了超大规模分类训练库PLSC,帮助开发者实现千亿规模的稀疏特征进行训练,以及千万规模类别的分类。

千亿规模稀疏特征

千亿规模稀疏特征:推荐系统在信息流、短视频等面向用户端的产品中的应用越来越广泛,而个性化推荐是这些产品追求的一个重要目标。实现个性化的一种重要且有效的方法就是利用深度学习方法将海量的个性化特征记忆在具有泛化能力的模型中。对于拥有上亿日活用户的产品,只要将用户的个性化信息与图文等资源的内容特征进行简单的捆绑,特征规模就很容易扩张到百亿甚至千亿级别。
为了支撑千亿规模的稀疏特征、万亿规模的模型参数,飞桨设计了分布式 Key-Value 存取的方式,通过分段锁对 Key-Value 表进行分片,以支持并发更新的请求。针对大规模稀疏特征的更新和通信特点,基于百度自研的 baidu-rpc 通信库进行了分布式训练逻辑的通信层封装。该参数服务器集成的功能包括客户端发送参数的融合,请求分片,模型参数的更新、加载、保存等,形成了一套可插拔、支持高并发的参数服务器组件,并服务于信息流、短视频等推荐场景。

图 1:飞桨千亿规模稀疏参数服务器设计

千万规模类别分类

千万规模分类的现实需求:视觉领域中诸如图像分类、人脸识别、推荐系统中的标签推荐等应用通常面临着百万级甚至千万级的分类问题,目前,基于深度学习模型进行分类是解决该问题最有效的手段,但受限于当前硬件随机访问存储容量的限制,分类模型的模型参数难以保存在单张 GPU 卡中,限制了普通用户进行大规模分类模型训练的能力。对于此问题,目前最好的解决手段就是采用模型并行的方式,但模型并行的设计、实现、性能和调试对于普通的深度学习模型开发者而言门槛较高。为此,飞桨推出了 PLSC(Paddle Large Scale Classification),其能够大幅度降低基于模型并行的超大规模分类的应用门槛,并具备极好的性能和扩展能力,使得每个开发者都可以快速训练超大规模类别的分类模型。
飞桨 PLSC 功能特色:支持图像任务通用数据读取方式、千万类别的分类、多机分布式模型并行训练、自动混合精度训练、提供分类层语义表示的服务化计算。
PLSC 的性能和扩展性:对于单机 8 卡 32G 显存的 V100,相比常规的数据并行方式,PLSC 可以使分类任务的类别数提升 250%。使用 128 块 v100 进行模型并行训练时,PLSC 扩张的类别数可以达到 5 千万类。在多机多卡模型并行情况下,相比于单机八卡的 V100,PLSC 的加速效率比在千万类别以上时可以达到 80%。

图 2:基于模型并行的大规模类别分类技术

表 1:飞桨PLSC中的arcface实现多机扩展效率


真正的工业级速度:让模型训练的速度飞起来

飞桨在借鉴 hogwild 无锁模式等业界经验的基础上,并基于对百度广泛的业务场景支持的实践积累,进一步提出全新的稀疏参数通信、IO 异步读取、Geo-SGD 训练模式、多机多卡高性能训练、混合精度训练等功能,帮助普通用户享受到工业级的模型训练速度。通过对通信和训练模式的创新,飞桨在超大规模模型或者数据吞吐、网络通信易成为瓶颈的任务上的训练速度和效果都得到极大提升,并全面超越市场同类产品表现。

全异步参数服务器训练

稀疏参数通信:在深度学习模型中,稀疏特征往往需要进行特殊的处理,否则将会给内存和通信的消耗带来严重问题。在目前主流的深度学习框架中,较为常见的处理稀疏特征的方法是通过变长张量对稀疏特征进行向量化,并对相应的特征嵌入进行稀疏查找。而在参数服务器多机训练过程中,飞桨则针对稀疏参数采用了一些不同的处理方法,即首先通过对单节点下的并发训练线程产生的稀疏梯度进行异步合并,而后进行批量通信,这一操作极大降低了训练过程的通信量。对于稀疏特征为主的模型训练,其多机加速比效果近乎可以达到线性。
多队列异步 IO:在某些数据量特别大、吞吐要求高,但模型本身计算开销较小的任务上,数据的 IO 很容易成为训练效率的瓶颈。为解决这一问题,飞桨针对性地设计了多队列异步读取的功能,通过适当牺牲数据读取的一致性,使得模型性能得到了极大提升。
无锁参数共享模式:早在 2010 年,Hogwild![1]就提出了无锁参数共享模式,其核心思想即稀疏参数模型在无锁读写模式下也可以达到收敛效果。飞桨将这一模式作为参数服务器训练的默认设置,并配合稀疏通信及多队列异步 IO,将 CPU 服务器的硬件资源的潜力发挥到了极致。

图 2:飞桨全异步训练原理

表 2:飞桨全异步训练在Criteo-CTR数据集的吞吐扩展性

飞桨 Geo-SGD 训练

Geo-SGD:与传统的参数服务器训练方式不同,飞桨独创的Geo-SGD(Geometric-SDG)采用 Worker 端进行模型参数的优化,并通过可定义通信间隔的方式,同步本地训练的模型参数插值。另外,服务器端会采用异步的方式融合各个 Worker 发送的模型参数差异。随着模型的收敛,worker 端的模型参数差异会逐渐变小,服务器端对全局模型参数的更新幅度也会以几何级数的方式降低。
在 Geo-SGD 异步训练模式下,Worker 不用再等待 Server 发来新的参数即可执行训练,该方式使得训练效果和速度都得到极大的提升。但是此模式比较适合可以在单机内能完整保存的模型,例如词向量、语义匹配等场景。以计算量极小,但使用场景广泛的 word2vec 模型为例,采用 Geo-SGD 训练模式的飞桨分布式训练的训练速度能够超越同类最优产品 18 倍,并且在公开数据集的验证中,模型效果没有任何损失。 

图 3:飞桨自研Geo-SGD算法原理

表 3:Geo-SGD在数据读取和通信易成为瓶颈的模型下的扩展性

GPU 多机多卡高性能训练、混合精度

通信扩展组件

通信拓扑支持:飞桨支持多种通信的拓扑结构,例如 Ring-Based AllReduce、Hierachical Allreduce、2-D Allreduce 等,用户可以定制不同的通信拓扑,针对不同的集群环境提升整体的通信性能。
梯度自动聚合:通过对模型参数梯度大小的分析,飞桨启发式的将梯度进行了聚合,以发挥高性能通信网络,下一定范围内的数据包通信延时基本不变的特性。
通信并发:飞桨通过支持多流通信的技术,能够将通信相关的算子并发,以充分利用带宽的优势,将整体通信的延时大幅度降低。
Collective Operator:飞桨通过将通信组件算子化,极大的提升了并行算法定义的灵活性。以大规模分类库 PLSC 为例,其通过多种 Collective Operator 灵活的组装,可以进行定制化的大规模模型并行算法的开发。
基于最优优化策略的组合,我们以自然语言处理和计算机视觉两个领域公开可获取的经典模型作为 Benchmark 进行对比,飞桨的多机训练优势随着 GPU 卡数的增加而逐渐增加,在绝对性能和扩展性上都全面超越了公开的其他框架。

表 4 :飞桨多机多卡多机训练与参考框架的纵向对比

混合精度通信加持

在支持半精度的 GPU 卡上,飞桨能够通过一行代码开启自动混合精度(Automatic Mixed Precision,AMP)计算,显著降低单卡的显存占用和计算时间。在多机多卡训练的情况下,飞桨分布式训练技术通过对计算图的分析,针对混合精度多机多卡训练的情况,结合Op的角色,对 all reduce 算子进行了依赖关系的微调,保证多机通信的过程中采用半精度进行通信。在混合精度通信的情况下,模型的训练精度不受影响,且通信带宽占用下降 50%,保证了飞桨自动混合精度多机多卡训练情况下仍然有较好的加速比。

图 4:飞桨自动混合精度中多机多卡训练的半精度通信原理
表 5 中展示了飞桨在 Resnet50 模型上,基于 Imagenet 数据集测试的全精度训练和混合精度训练在多机情况下的横向扩展性以及纵向扩展性。在飞桨混合精度的支持下,GPU 多机多卡下的横向扩展能力与全精度情况下相当,而纵向扩展方面的训练吞吐提升达到了 2 倍以上。

表 5:飞桨多机多卡自动混合精度训练的扩展性


真正的 AI 普惠化:降本增效,惠及所有开发者


为进一步惠及普通用户,飞桨针对多个不同场景进行了专门开发,包括定制多种不同分布式训练模式的 Fleet API、帮助提升公有云 GPU 训练速度及效果的深度梯度压缩(Deep Gradient Compression)技术以及 LocalSGD 技术、超大规模训练中可大幅提升 batch size 的重计算技术。通过对已有功能的整合以及现有技术的创新,飞桨大幅度降低了用户训练分布式模型的学习、调试及算力成本,帮助用户更快获得最优训练效果。

Fleet API

大多数深度学习用户在使用分布式训练功能时,通常会遇到四大问题:1)本地程序如何转成可以分布式训练的程序;2)如何提交分布式训练程序到集群中;3)应该采用什么样的并行训练方法,如何定义;4)如何进一步提升自己任务的训练效率。
为了降低用户使用分布式训练的门槛以及训练成本,飞桨提供了分布式训练 Fleet API,以帮助用户获得极佳的性能体验。
通过使用 Fleet API,用户只需添加十余行代码,即可使用飞桨的参数服务器进行同步训练、异步训练、Geo-SGD 及 GPU 多机多卡同步训练,极大降低了用户在多种模式之间切换带来的学习成本。此外,Fleet API 提供了与集群资源进行交互的接口,并对用户透明化,极大降低了用户面向集群资源进行调试的成本。Fleet API 还提供了可扩展接口,方便社区开发者自定义并行训练加速算法。 

公有云场景分布式训练的难点

在网络环境不佳的集群中,由于多机之间的通信受到带宽的限制,在训练较多节点的分布式训练任务时,通信阶段往往成为整个分布式训练的效率瓶颈,在公有云上的 GPU 集群进行训练时,这种情况尤为常见。为了让公有云用户能够在较低的带宽下进行高性能的分布式训练,飞桨提供了深度梯度压缩(Deep Gradient Compression)[2] 技术。
飞桨在原始论文算法的基础上进行了进一步优化。考虑到在不同模型下模型参数梯度的碎片程度,飞桨仅对一定尺寸以上的模型参数梯度进行稀疏通信,以同步参数。而对于小块模型参数梯度,考虑到其与 TopK 模型参数梯度的通信延时没有太大的差异,因此仍采用普通的多机多卡同步机制。 目前,飞桨的深度梯度压缩技术已经应用在了一些架设在公有云的 AI 平台,经过内部业务数据评估,即使在计算力较弱的预估卡 P4 的多机多卡训练的情况下,飞桨 DGC 技术也会将训练时间降低了 40%-60%。

LocalSGD

针对公有云场景,飞桨同时还提供 LocalSGD [3] 多机训练技术,其能够将多步本地更新的模型参数在多机多卡之间进行加权融合。大量实验证明,使用飞桨的 LocalSGD 技术进行多机训练,对模型的收敛效果不会产生显著影响。同时,由于同步参数的间隔相比常规的多机多卡训练有所扩大,整体的加速比也有较好的提高。

使用重计算技术节省显存进行超大 Batch 的并行训练

在飞桨的多机多卡 GPU 训练中,用户可以通过重计算技术来提升全局 Batch Size 的大小,这在一些片上内存较小或者 GPU 卡数不够的场景极为有效。
飞桨重计算技术:随着训练数据规模的逐渐增加,训练更大、更深的深度学习模型逐渐成为主流趋势。在目前的深度学习模型训练中,模型通常需要保留前向计算的隐层结果。由于结果的数量会随着模型层数的增加而线性增加,对目前能够使用的计算芯片内存大小构成了挑战。为此,飞桨提出 Forward Recomputation Backpropagation(FRB)技术,通过在反向过程中对必要的前向逻辑进行重新计算,实现显存随层数增长而亚线性增长[4]。

图 5:飞桨重计算显存优化原理

重计算扩展 Batch Size 的原理:将前向中间隐层结果显存释放,并在反向过程中基于锚点进行局部重新计算。

图 6. Bert 模型在单步计算显存的变化曲线图

在使用 32G V100 & FP32 时,我们在多个不同模型下进行了最大 batch size 的测试,其提升高达 600%。在分布式情况下,由于通信时间与重计算时间会有一定自动的重合,多数模型的训练性能下降会控制在 20%以内,检测类模型的多机训练吞吐则不受影响。

表 6. 飞桨重计算技术对多个模型最大可训练 Batch 的提升情况
 

开源不易,飞桨加速,唯有祝福

 
2013 年,百度开始研发深度学习框架 PaddlePaddle,搜索等核心业务上线 DNN 模型。
2016 年,在百度世界大会上,百度宣布 PaddlePaddle 开源,标志着国产开源深度学习平台的诞生。
2019 年 PaddlePaddle 发布中文名“飞桨”,升级为功能完备的产业级开源开放平台,加大技术和产业生态的建设。
在正确的道路上坚持数年之后,飞桨开始加速。
然而,这些成功来之不易,因为开源只是生态建设的极小一部分,商业公司往往要考虑投入产出比,而发展自己的深度学习框架,既有对 AI 综合技术实力的要求,也需要对开发资源常年持续投入,目前全球也仅 Google、Facebook、百度等几大 AI 巨头在该方向上持续投入。
 一款深度学习框架产品要被广大开发者认可,只有在全面技术竞争力的基础上,长期持续紧贴用户需求打磨,围绕框架建立上下游生态,进而建立具备高度壁垒的综合竞争力。
打造深度学习框架没有捷径可走,打造真正的产业级深度学习框架更加不易,祝福百度飞桨,也祝福后来者。

[1] HOGWILD!: A Lock-Free Approach to Parallelizing Stochastic Gradient Descent. Feng Niu , Benjamin Recht , Christopher Re , Stephen J. Wright

[2] Deep Gradient Compression: Reducing the Communication Bandwidth for Distributed Training. Yujun Lin , Song Han , Huizi Mao , Yu Wang , William J. Dally

[3] Local SGD Converges Fast and Communication Little. Sebastian U. Stich

[4] Training Deep Nets with Sublinear Memory Cost. Tianqi Chen, Bing Xu, Chiyuan Zhang, Carlos Guestrin

点击阅读原文,了解更多!