本文根据作者在深度学习基础服务方面的几年实践经验,分享一些关于深度学习计算框架以及平台服务演进的历程,重点围绕计算架构从高性能计算(High Performance Computing, HPC)架构向云生态(Cloud)架构的演进展开介绍,较多的来自于多个实际业务场景的工程实践,其中引用了一些公开资料,有兴趣自己去了解,本文主要面向对深度学习基础架构有初级实践的同学,如有不够严谨之处,请多指正。
有个说法,人工智能几个重要的要素,分别是算法、算力、数据,我们重点介绍算力要素。一个算力系统(平台)一定是为了满足某个业务场景的需求,那么这个需求的特点是权衡一个计算架构设计的参考要素,可以理解为是一种技术产品思考角度。实践中,一个算力系统最终形态不能排开服务的业务场景、应用的深度(机器)学习算法计算特点、业务的基础系统基建能力,以及其它历史负担,还有行业系统软件生态发展现状等,不能孤立地从技术生态看待一个平台系统建设。稍后会展开描述。
本文剩余部分主要依据时间顺序,先介绍比较早期的以HPC架构计算系统[18,19,20,23]为主导的设计,到后续陆续存在的融合Hadoop生态的混合架构[13,14,15,16],以及现在基于容器统一基础架构的融合多种计算服务类型的云(Cloud)架构[21,22],其中包括了满足AI需求的计算服务。除此之外,一些活跃在学术界的研究和思考[1,37]也尝试进一步改进AI计算领域的分布式系统问题,有兴趣可以进一步阅读相关论文。有兴趣的同学可以将参考文献中几个开源架构的star数、活跃度做一些对比,应该可以发现一些趋势特点。
高性能计算架构(HPC)
本文定义的用户深度学习场景的高性能计算架构,包括异构服务器、异构互联、中间件服务、调度集群43等服务,下面陆续介绍一些过程。
似乎工业界大规模尝试深度学习算法可以追溯到Alexnet [11],它采用GPU实现卷积神经网络的加速,并取得显著的算法效果提升。在这之后,从计算硬件、计算框架到计算集群分布式系统都开始逐渐有更加系统的研究,满足神经网络计算需求,而且GPU这种高密度数据并行处理器似乎成为神经网络或者人工智能最受追捧加速处理器,甚至极端情况下被误导为GPU符合几乎所有神经网络计算场景的需求,同时CPU也被一定程度受到不太公平的对待。似乎HPC计算架构成为试图应对神经网络计算最首要考虑 的计算架构,这跟GPU(严格上叫,General Purpose GPU, GPGPU [12])加速器追求并行计算性能的目标是比较匹配的。
随着深度学习在语音识别、自然语言处理、计算机视觉以及搜索推荐等商业场景的落地以及学术界深度模型设计研究的推进,深度模型设计越来越复杂[24,25],训练一个模型需要的浮点计算量也越来越大(可能有些模型相对今天的硬件来说还不够复杂)。这个从当时头部互联网公司的Public relations (PR)新闻宣传中,强调自己支持的神经网络参数量级,例如支持万亿参数的神经网络,可见一斑,所以大家一时间对计算需求是急剧增长的。当时在实际生产中也出现了一波对异构计算加速硬件系统的改进过程来满足急剧增长的计算需求,包括GPU单芯片的计算能力升级、GPU互联技术[5,6,7]、异构计算服务器设计[2,4]、跨节点集群通信技术[8,9,10]的升级,最终甚至也包含了芯片的设计[3] 等等。其中,从生产角度,构建超大规模的并行计算机可以快速的满足实际需求,相比于等待下一代计算芯片的出现要快很多,大部分落地场景从搜索互联网巨头开始(一般可以解释为他们具有更大的数据量以及落地场景,他们距离数据更近),他们的分布式软件技术能力的快速构建要更加得心应手。
图1 [26]描述一个GPU服务器物理拓扑结构。早期可以获取的也是类似单机两个GPU的服务器,后来也尝试通过设计更高密度GPU数量的单机服务器提升计算能力,例如最大接触过单机8~16个GPU甚至更大的计算服务器,但是会受限于服务器供电甚至机房机架供电能力、gpu之间的通信瓶颈(每个GPU都需要通过CPU来中转数据)、以及跨节点通信带宽能力。一系列改进技术,例如采用pcie-switch机制来提升大节点内高密集GPU的数据交换能力;改进服务器设计提升供电能力;采用无损(lossless)网络,例如Infiniband [8]或者RoCE(v1/v2) [29]技术提升高带宽网络设备的带宽利用率(链路的延迟性能会极大的影响高带宽通信设备的有效带宽利用率);甚至图1描绘的GPUDirect技术[5]被提出来进一步优化GPU的点对点通信性能[7]。上面一波技术的落地加速了深度学习模型的探索过程。在实际生产中,有一段时间,一度出现将超算的技术栈[20]搬移到互联网数据中心,采用56Gbps无损链路互联、1:1收敛比的超算集群来探索计算机视觉等模型的研究。这个受当时一些研究背景驱动,例如大家对深度学习模型算法精度极致的追求[27],一方面深度学习算法研究学者试图从模型的结构设计角度探索更加高精度的算法模型,算法模型复杂度加大,另一方面有人希望通过提升计算算力,通过堆数据和算力来进一步探索算法模型精度[28],所以算力系统也在竞争中不断快速发展。
除了硬件资源架构进化外,深度学习计算框架以及分布式架构也在逐渐形成,并最后形成开源趋势。早期,框架层面主要集中在利用异构并行优化方法实现神经网络算法,比较定制化的解决模型训练问题[30],没有形成“框架”逻辑,复用性不强,同时对于神经网络模型训练方法min-batch SGD [31]的并行设计还未成为框架一部分,较少引入computer system design理念,还未顾及对“框架”的模块性、模型描述能力、自动微分能力、易用性、可维护性设计。之后,来自伯克利的caffe [32]在计算机视觉模型领域进一步降低了神经网络模型研发门槛,来自百度的PaddlePaddle [33]在自然语言领域对时序模型描述具有更好的易用性。在这之后,caffe改进版本Caffe2,TensorFlow、PyTorch、MXNet以及优化后的PaddlePaddle架构设计,都分别在多方面增强了框架的表达能力,降低了研发模型的门槛,提升模型迭代设计的效率,最终几乎都形成了以Python为前端描述模型、具备异构计算的后端引擎、支持自动微分、甚至自动计算优化的计算框架。由于本文侧重对深度学习基础架构做总结,故不做过多神经网络框架(库)的设计对比,可以参看[34]了解更多。
在计算框架原生尚不支持分布式并行计算能力[41]的时候,为了驾驭高性能计算系统,比较自然的想法是采用高性能基础技术栈[20,38,39],如图2所示。由于该栈在HPC领域比较成熟,且MPI层服务能较容易获取异构协议栈以及异构计算能力,能较快的获取单机多GPU、多机多GPU的并行处理能力。例如,对早期采用的Infiniband/RoCE等无损链路如果不采用MPI编程接口,需要使用verbs等接口规范,对互联网程序员而言,一般是不熟悉的,适应成本较高,原型概念验证(POC)难度也较大。但是这个技术其实一开始并没有大规模铺开来,主要是受到基础成本、人才稀缺等影响,同时随着大家对神经网络并行计算的深入研究,很多在系统结构层面的微观并行策略的优化(广泛采用latency隐藏技术,NCCL等中间件软件商业推广)也获取了较好的scale-out性能,算法模型结构设计对模型精度贡献越来越大且模型开始朝精细化设计、可落地生产的方向发展,所以该技术并没有呈现大规模落地,只是在头部互联网企业以及特殊垂直方向有些落地。此处说一个后话,并不是说无损链路技术对人工智能无突破性贡献,只是成本和收益的权衡,据说在头部企业的数据中心无损链路的传输技术不仅在AI甚至在其他数据处理场景都获取不错的应用,且随着成本和技术栈的完善、新计算场景的探索,该技术前景可能也是非常乐观,最终NVIDIA $6.9billion收购[40]了提供该技术的以色列厂家。
之后GPU厂商、头部互联网企业,也相继开源一些中间件[17,42],例如,nccl2它简洁的接口和高效的环形通信效率,借由中间件生态的完善,进一步提升了高性能计算并行架构在深度学习规模化训练上的普及度。现在完成一个中小规模、主流dense深度学习模型的分布式训练,支持TensorFow、PyTorch等主流架构,都是比较成熟的,甚至对计算硬件要求都不是很苛刻[17]。
云架构
此处介绍的云计算不是专指云计算架构,而是相对于传统高性能计算生态、在互联网更加适用、泛义的计算架构。高性能计算的软件生态很多也开始迁移到云生态架构[44],其中典型的是NVIDIA开发插件支持Kubernetes调度GPU容器,随后容器集群上陆续开始支持异构计算任务[45,46]。后续会展开介绍一点体会。
个人觉得早期的高性能计算基础架构的人工智能基础服务,最终朝着云基础架构演进是合理且必要的。目前相对于容器云计算架构,高性能计算架构的优势主要在于异构计算的效率[62]以及已经成熟的上层软件生态[62],但是随着云上高性能生态的持续迭代,云上基础架构的优势还是多于劣势[47]。另外,从实践以及实用性角度看,一个中小规模的人工智能计算架构也有较多的设计空间,相比于传统高性能应用[59],它对高性能计算架构的渴求也比较适中,它的计算规模上限天花板比较适中。神经网络的高密度计算、多节点并行计算是一种相对规则的allreduce计算[60],完成它可以进行domain specific的优化设计[17,42,61],它们理论上可以脱离HPC的软件生态独立存在,构建到容器云计算架构难度也比较适中。
采用HPC架构完成神经网络计算架构的实践中也发现有一些缺点,例如:
(1)软件生态匮乏。相比于云生态,高性能计算的生态还是较为贫乏。当前深度学习框架多样,版本迭代也很快,在HPC架构下设计一个支持不同AI计算场景、不同计算框架的平台具有较多的二次研发。
(2)高性能计算调度系统等等设计上比较依赖于基础服务系统的账户,简陋的安全系统难以系统灵活的支持多业务场景,同时也由于软件生态贫乏,它比较难融合到现有的互联网大数据、云生态,或者成本较高。
(3)架构设计不够灵活。例如,社区方案需要较高的二次开发成本实现高可靠架构。
除了上面不足外,受一些基础技术进步和落地场景影响,HPC架构的思路也受到其他一些因素影响:
(1)竞品方向持续发展。云生态的持续健康发展,从KVM到容器架构,云生态提高了研发效率、部署效率、系统效率,深度学习框架生态也朝着云生态去尝试[47]。
(2)人工智能逐渐强调落地,工业界的计算需求逐渐趋于合理,模型训练计算在除头部企业以外强调落地,也一定程度缓解了短期对计算能力的需求。根据有些资本市场的调研,未来算力规模增长更大的是推理场景,因为推理计算往往跟业务规模呈正比,尤其对于C端服务业务。
(3)深度学习算法的突破。随着Transfer Learning在计算机视觉广泛使用,还有自然语言领域迁移学习的进展,强调落地的工业领域对计算算力的渴求也相对比较适中。
(4)基础芯片能力提升。相对早期的基础芯片,现在的异构计算芯片单芯片能力也有量级的提升,也进一步缓解了实际工业生产中对高密度计算的需求
(5)微观并行优化改进以及易用性提升。随着部分核心厂商推动的中间件42的落地,以及易用性提升,也进一步让获取高性能计算能力的成本降低。同时,分布式技术上,随着通信反向传播叠合技术的广泛使用,能有效隐藏一定的通信代价,所以横向的scale-out性能日趋提升。
在追求全面向云架构设计的机器(深度)学习架构思路之前,[13,14,15,16]代表了一种将深度学习计算能力搭载到Hadoop生态的架构流派。这个架构的选择可能是跟应用场景有较大的关系,例如在电商搜索推荐业务场景,用户行为数据、商品数据一般都是在Hadoop分布式系统下,将深度学习计算能力融合到Spark引擎,扩展mlib能力,在平台易用性等方面可能会更加亲和。但是,个人觉得融合到Spark中的深度学习计算能力也存在一定的问题:
(1)描述能力会受到一些限制。利于描述搜索推荐模型 ,呈现的用户使用范式更加亲和,但是对于AI其他问题,例如强化学习、语音细分领域会受到限制,因此这种架构对于业务覆盖广的平台仍然会受到一些限制。
(2)维护成本。由于深度学习计算框架生态中,Python是典型的前端接口语言,后端是c++编程语言居多,跟Java生态为主的Hadoop生态有一定的兼容性代价,后期维护成本大。
(3)扩展性能。从前章节可以见到,深度学习计算从高性能计算来,尽管随着硬件和架构的成熟对高性能计算生态依赖逐渐减轻,但是追求性能仍然是神经网络计算主要诉求之一[50,51]。高性能计算强调计算、通信协同的规则性、服务器架构的规则性,更强调微观的计算和通信优化,但是Spark等架构主要完成批量运算,相比神经网络的迭代运算,批量运算更加能容忍算子执行异步性。因此,将这种高性能计算组件融合到Spark框架中也面临计算和通信的微观优化问题。
但是,上述缺点在生产上取决于最终的工程投入,调研发现也有很多方法对上述问题做一些改进,这里就不做赘述。
除了基于Hadoop生态扩展深度学习计算服务能力,也有很多寻求云容器架构的基础架构方案。典型的云计算服务提供公有云等服务,另外也出现了专属云、私有云、混合云等变种方案适配不同场景的基础服务需求,本文就不对概念做形式化解读了。在企业私有化基础服务架构中,kubernetes [63]容器基础架构当前经常被选择为机器(深度)学习平台基础架构[56,57,58]。Kubernetes上层生态日益完善,它对数据中心核心软件服务的标准化, 且kube-native extensibility [53,54,55]进一步增强了它对上层应用架构的编排扩展能力,可能使得发布一个数据中心infrastructure变成可能64。从某个时间开始,大家发布软件都开始默认带Docker发布,会不会以后会出现默认发布一个服务会默认发布一个Kubernetes扩展组件?随着标准化能力提升,会不会未来在IDC部署一个分布式服务就像在Ubuntu上apt-get安装一个服务一样便捷[65]?从一些项目的实践来看,kubernetes容器云架构的确提升了效率,生态发展也越来越成熟。所以机器(深度)学习似乎也不能逃脱这个被融合的趋势。
实践中,Kubernetes [52]作为容器基础架构,被广泛应用于生产环境的机器学习基础架构[56,47,57,58]中。例如,社区Kubeflow [47]、openPAI [57]基于Kubernetes的一站式机器学习服务提供了一些应用于生产的reference design。tf-operator [22]基于Kubernetes Operator扩展架构实现了一个Parameter Server架构的分布式作业原型的编排,详细请查阅文档。但是,如果深入进去也会发现一些不足,还需要进一步迭代完善。例如,在高性能计算阶段,服务器同构性对实现PS架构或者环形的allreduce SGD同步算法比较重要,对于追求精度和效率双高质量的生产任务,甚至会强调对服务器架构做同构性设计,但是目前的容器云架构更强调云化资源编排、复用等等。例如,社区tf-operator的编排方案在迁移生产任务时可能需要持续优化容器基础网络架构的南北和东西传输性能,提升机器学习迭代运算的协同效率,也可能需要对计算隔离效率、I/O效率、编排策略等方面针对计算场景持续不断的优化。
由于篇幅限制,大致介绍到这里,谢谢。
文章来源:网易云 作者:王燕飞
参考文献:
1. Ray: A Distributed Framework
for Emerging AI Applications,https://www.usenix.org/system/files/osdi18-moritz.pdf
2. introducing-big-basin-our-next-generation-ai-hardware, https://engineering.fb.com/ target="_blank" rel="nofollow noreferrer">https://en.wikipedia.org/wiki/Tensor_processing_unit
4. Baidu X-MAN Liquid Cooled 8-Way NVIDIA Tesla V100 Shelf,Baidu X-MAN Liquid Cooled 8-Way NVIDIA Tesla V100 Shelf
5. Accelerating High Performance Computing with GPUDirect RDMA
,http://on-demand.gputechconf.com/gtc/2013/webinar/gtc-express-gpudirect-rdma.pdf
6. NVLINK AND NVSWITCH https://www.nvidia.com/en-us/>enter/nvlink/
7. Evaluating Modern GPU Interconnect: PCIe,
NVLink, NV-SLI, NVSwitch and GPUDirect,https://arxiv.org/pdf/1903.04611.pdf
8. InfiniBand for AI, https://www.infinibandta.org/how-rdma-is-solving-ais-scalability-problem/,https://insidehpc.com/2019/03/video-why-infiniband-is-the-way-forward-for-ai-and-exascale/
9. Network Accelerated AI,https://www.sc-asia.org/2018/wp-content/uploads/2018/04/2_1530_Elad-Wind-v2.pdf
10. HPC Breaks Through to the Cloud: Why It Matters ,http://www.roceinitiative.org/hpc-breaks-through-to-the-cloud-why-it-matters/
11. ImageNet Classification with Deep Convolutional Neural Networks,ImageNet Classification with Deep Convolutional Neural Networks
12. General-purpose computing on graphics processing units ,https://en.wikipedia.org/wiki/General-purpose_computing_on_graphics_processing_units
13. TensorFlowOnSpark , https://medium.com/lifeomic/sparkflow-train-tensorflow-models-with-apache-spark-pipelines-74dca32f60f3, https://github.com/yahoo/TensorFlowOnSpark
14. shifu, https://github.com/ShifuML/shifu
15. Flexible and Powerful Parameter Server for large-scale machine learning, https://github.com/Angel-ML/angel
16. An industrial deep learning framework for high-dimension sparse data , https://github.com/alibaba/x-deeplearning
17. Distributed training framework for TensorFlow, Keras, PyTorch, and Apache MXNet , https://github.com/horovod/horovod
18. nccl/nccl2, https://developer.nvidia.com/nccl, http://on-demand.gputechconf.com/gtc/2017/presentation/s7155-jeaugey-nccl.pdf
19. MPI enabled for Fluid, https://github.com/PaddlePaddle/Paddle/pull/11992
20. High Performance Distributed Deep Learning: A Beginner’s Guide
, http://mvapich.cse.ohio-state.edu/static/media/talks/slide/s9501.pdf
21. www.kubeflow.org, https://www.kubeflow.org/docs/started/
22. tf-operator, https://github.com/kubeflow/tf-operator
http://23.kaldi-asr.org, https://kaldi-asr.org/
24.VERY DEEP CONVOLUTIONAL NETWORKS FOR LARGE-SCALE IMAGE RECOGNITION
, https://arxiv.org/pdf/1409.1556.pdf
25.Going deeper with convolutions,https://arxiv.org/pdf/1409.4842.pdf
26.Use Cases and Status of GPUDirect: A High Productivity & Performance Feature for GPU Supercomputing,https://www.olcf.ornl.gov/wp-content/uploads/2012/05/DirectGPU_CSCS_alam.pdf
27.History of the ImageNet Challenge,https://en.wikipedia.org/wiki/ImageNet
28. Minwa Supercomputer,https://www.ibtimes.com/baidus-minwa-supercomputer-beats-google-microsoft-new-artificial-intelligence-record-1918175
29. RDMA over Converged Ethernet,https://en.wikipedia.org/wiki/RDMA_over_Converged_Ethernet#RoCE_v2
30. cuda-convnet,https://code.google.com/archive/p/cuda-convnet/
31. Stochastic gradient descent, https://en.wikipedia.org/wiki/Stochastic_gradient_descent, http://ruder.io/optimizing-gradient-descent/
32. Caffe,https://caffe.berkeleyvision.org/
33. paddlepaddle, https://www.paddlepaddle.org.cn
34. Comparison of AI Frameworks, https://skymind.ai/wiki/comparison-frameworks-dl4j-tensorflow-pytorch
35. https://project.inria.fr/deeplearning/files/2016/05/DLFrameworks.pdf
36. A Comparative Measurement Study of Deep Learning as a Service Framework, https://arxiv.org/pdf/1810.12210.pdf
37. Relay: A New IR for Machine Learning Frameworks, https://arxiv.org/pdf/1810.00952.pdf
38.Open MPI: Open Source High Performance Computing, https://www.open-mpi.org
39. OpenFabrics Enterprise Distribution, http://www.mellanox.com/related-docs/prod_software/PB_OFED.pdf
40. NVIDIA to Acquire Mellanox for $6.9 Billion ,https://nvidianews.nvidia.com/news/nvidia-to-acquire-mellanox-for-6-9-billion
41. Large Scale Distributed Deep Networks,https://static.googleusercontent.com/media/research.google.com/en//archive/large_deep_networks_nips2012.pdf
42. NCCL 2.0,http://on-demand.gputechconf.com/gtc/2017/presentation/s7155-jeaugey-nccl.pdf
43. Slurm Workload Manager, https://slurm.schedmd.com/documentation.html
44. Nvidia Opens GPUs for AI Work with Containers, Kubernetes, https://thenewstack.io/nvidia-opens-gpus-for-ai-work-with-containers-kubernetes/
45. Univa Launches HPC Cloud Migration News Portal,https://insidehpc.com/2019/04/univa-launches-hpc-cloud-migration-news-portal/
46. High performance computing on google cloud,https://cloud.google.com/solutions/hpc/
47. Kubeflow,https://www.kubeflow.org/
48. Applying transfer learning in NLP and CV,https://towardsdatascience.com/applying-transfer-learning-in-nlp-and-cv-d4aaddd7ca90
49. BERT: Pre-training of Deep Bidirectional Transformers for Language Understanding,https://arxiv.org/abs/1810.04805
50. tesla-v100 ,https://www.nvidia.com/en-us/>enter/tesla-v100/
51. Google Announces 8x Faster TPU 3.0 For AI, Machine Learning,
https://www.extremetech.com/extreme/269008-google-announces-8x-faster-tpu-3-0-for-ai-machine-learning
52. Production-Grade Container Orchestration, https://kubernetes.io
53. Best practices for building Kubernetes Operators and stateful apps, https://cloud.google.com/blog/products/containers-kubernetes/best-practices-for-building-kubernetes-operators-and-stateful-apps
54. operator-sdk, https://github.com/operator-framework/operator-sdk
55. SDK for building Kubernetes APIs using CRDs, https://github.com/kubernetes-sigs/kubebuilder
56. 滴滴机器学习平台架构演进之路,https://www.infoq.cn/article/jJ4pjkf8Huf-WVlE7Xw7
57. Resource scheduling and cluster management for AI,https://github.com/microsoft/pai,https://www.msra.cn/zh-cn/news/features/openpai
58. 从零到破万节点!支撑618大促背后的蚂蚁金服Kubernetes集群,https://juejin.im/post/5d3984ece51d4510aa0115f1
59. HPC典型业务场景, https://www.huaweicloud.com/solution/highperformance/
60. Scaling Distributed Machine Learning with the Parameter Server, https://www.cs.cmu.edu/~muli/file/parameter_server_osdi14.pdf
61. The Rationale of BytePS, https://github.com/bytedance/byteps/blob/master/docs/rationale.md
62. TensorFlow at Scale - MPI, RDMA and All That,
https://cug.org/proceedings/cug2018_proceedings/includes/files/pap146s2-file1.pdf
63. What is Kubernetes, https://kubernetes.io/de/docs/concepts/overview/what-is-kubernetes/
64. Welcome to http://OperatorHub.io,https://operatorhub.io/?category=Integration+%26+Delivery
65. The Kubernetes Operating System ,https://k3os.io/