来源:https://medium.com/@offercstephen/dkeras-make-keras-faster-with-a-few-lines-of-code-a1792b12dfa0
一、介绍
通过更快的推断和更便宜的硬件来降低服务器成本是工业深度学习应用程序的主要关注点。本文将解释为什么深度学习正在从工作站过渡到数据中心,以及如何使用基于Ray和Keras的分布式框架dKeras来通过分布式推理大幅提高性能和降低成本。本文的第一部分是分布式深度学习的总体分析。关于如何应用Ray和dKeras的技术细节将在后半段给出。下图显示了dKeras如何在一台机器上将Keras的速度提高30倍。
二、分布式深度学习
分布式深度学习是指分布式的训练和推理。本节将主要关注分布式推理的技术细节,但也将涉及一些分布式训练的工业示例。
分布式推理算法分为模型并行算法和数据并行算法两大类。在模型并行方法中,单个模型被划分为多个计算设备和节点。尽管有许多方法可以跨节点划分模型,但在一个简单的示例中,一个节点的模型分区的输出将成为下一个节点的模型分区的输入。这种技术的目标是那些不能放在一个节点上(可能是由于内存限制)的大型模型。相反,较小的模型通常利用数据并行性。在这种情况下,每个节点都包含一个或多个模型副本,请求被分割成批,每个批被发送到不同的模型副本。然后聚合并返回所有副本的输出。
这些技术可以用于需要大数据吞吐量和大模型尺寸的应用程序。一个例子可能是多模型数据处理管道或超级网络数据并行托管服务器,其中的模型无法在一个加速器中容纳。
某些研究领域需要某种形式的分布式训练,例如主动学习、联邦学习和自然语言处理(NLP)。主动学习可以通过web浏览器设备上常见的一种用户查询系统使用分布式训练技术。类似的是联邦学习,由于隐私法,用户的数据不能被发送到另一个服务器。语言模型是分布式学习重要性的最好例子,因为它们比计算机视觉模型要大得多。BERT-Large模型使用83亿个参数,强调数据中心AI训练的重要性,在DGX SuperPod中使用92个DGX- 2h节点使用1,472 V100 gpu进行训练。这显示了人工智能计算的另一个趋势,处理器聚集在一起,形成一个单一的产品,然后连接到更多的集群,如DGX SuperPods或TPU pods。据估计,用于训练最先进模型的计算机每3.4个月就会翻一番,而摩尔定律在过去几年中却逐渐消失,因此大规模的分布将成为必要(图片来源:https://openai.com/blog/aiandcompute/)
三、单机系统的约束
GPU有限的内存限制了可行的模型尺寸。随着移动应用程序的日益普及,新一代更小的模型已经被提出,比如SqueezeNet和MobileNet,它们牺牲了速度的准确性。但是,一些最先进的新型号的尺寸也有所增加,如FixResNetXt-101 32x48d (829M参数)、GPIPE (557M参数)和SENet-154 (146M参数)。加载这些模型和使用单精度浮点权重分别需要大约3.3 GB、2.2 GB和0.6 GB。这没有考虑到前向传递所需的训练批处理和激活,也没有考虑后向传递的梯度。虽然这些可能适合GPU,但它们利用分布式推理或训练的好处的能力有限。模型尺寸与ImageNet精度的关系如下图所示:
球图报告Top1和Top5的准确性与计算复杂性。报告了仅使用中心裁剪与单次向前传递所需的浮点操作(FLOPs)的Top1和Top5精度。每个球的大小与模型的复杂性相对应。(来源:https://arxiv.org/pdf/1810.00736.pdf)
从下图中可以清楚地看出,由于内存大小,这将影响推理性能,该模型的准确性将与Nvidia Titan XP GPU的FPS进行比较(资料来源:https://arxiv.org/pdf/1810.00736.pdf):)
对于多模型管道,问题会因所需gpu的数量而加剧,特别是当它需要多个计算节点,并且必须在节点之间进行数据传输,然后再将数据传输到它们的gpu时。通常,这需要结合定制的硬件和微调过的软件,但对于正常的计算系统,这可能需要大量额外的成本和时间。
四、dKeras和Ray
Ray通过一个易于使用的硬件分配API解决了这些问题,该API允许GPU分区,并使分布式GPU的问题变得容易。通过强调实时执行,Ray简化了开发过程,同时仍然提供了良好的性能。这是通过使用共享内存而不是在进程之间复制数据来实现的。Ray提供了一种跨多个节点创建复杂的分层执行图的快速方法,大大减少了开发时间。然而,虽然这从技术角度解决了这个问题,但也可以通过使用只使用cpu的解决方案来提高成本。
虽然gpu传统上被用于推理,但随着CPU优化的深度学习框架的出现,从使用加速器过渡到使用分布式CPU推理的趋势越来越明显。这在一定程度上是由于过去几年深度学习CPU软件加速的进步。最近一个成功的框架优化的例子是,Intel Xeon 9280 CPU打破了ResNet50的推断记录,当时Nvidia V100 GPU的帧率为7878,而GPU的帧率为7844。
为了让开发人员更容易地进行分布式推理,我们构建了dKeras,这是一个基于ray的框架,它包装了Keras,这是一个流行的深度学习框架,运行在TensorFlow、CNTK、Theano或PlaidML之上。通过使用与Keras相同的API,这个新框架使串行和分布式深度学习系统之间的转换更加容易,而不必使用通常需要重新设计主要系统的大型分布式框架。与Ray结合使用,开发人员可以在他们的笔记本电脑或工作站上创建测试系统,然后只需修改几行代码就可以在云上运行。
五、安装
pip install git+https://github.com/dkeras-project/dkeras
例如:
from tensorflow.keras.applications import ResNet50
from dkeras import dKeras
import numpy as np
import ray
ray.init()
# Create random dataset of 100 frames
data = np.float16(np.random.uniform(-1, 1, (100, 224, 224, 3)))
# Send the ResNet50 model to dKeras, have 4 remote workers,
# and wait for the worker processes to initialize before continuing
model = dKeras(ResNet50, init_ray=False, wait_for_workers=True, n_workers=4)
# Classify the data with data parallelism inference
preds = model.predict(data)
# Close the worker processes
model.close()
对于cpu,数据并行是一种有效的方法,可以通过在内存中存储更大的模型来大大提高推理性能。事实上,基于cpu的系统可以容纳数兆兆字节的DDR4 RAM,比GPU的数量级还要大。需要考虑的瓶颈是worker之间共享的数据量、传输速度、多核利用率,以及worker与参数服务器之间通信的实现。由于多个worker向参数服务器请求数据,可能会出现访问冲突,从而降低性能。因此,推理绩效在工作人员数量上的比例较低,如下图所示:
数据并行推理的一个缺点是,为了初始化工作进程,必须在每个进程上建立模型的副本。尽管它们存在于单独的进程中,但每个worker仍然需要一次性的时间成本,因为每个worker必须从共享数据对象存储中获取权重,创建模型,并加载模型的权重。使用dKeras,设置工人的性能成本与工人数量如下图所示:
然而,在支付了初始化成本之后,我们可以看到CPU性能的显著提高。从下图所示的测试中,我们观察到,在没有对模型或底层软件本身进行任何更改的情况下,改进幅度高达30倍。通常,CPU优化需要使用CPU优化库(如Intel MKL-DNN或AVX-512)来构建框架,或者通过层精度更改来优化模型本身,但是dKeras只需要增加几行Python代码就可以加速推理。
然而,这一改进是在大型多核处理器上进行的,单个模型占用的CPU很少。这种加速级别不应该出现在小得多的处理器上。
目前,dKeras还处于非常早期的阶段,它只支持数据并行推理。dKeras库的未来计划包括模型并行推理、分布式训练、自动硬件分配、分布式GANs,以及更多分布式深度学习的应用。这个新兴的机器学习领域已经对医疗、科学和工业系统产生了巨大的影响。使用Ray,可以很容易地构建强大的分布式深度学习应用程序。
网友评论