浅谈AI算力优化技术
一、AI算力的主要构成在人工智能三要素中,无论是数据还是算法,都离不开算力的支撑。根据IDC报告,过去,用户对于人工智能的感知更多停留在数据层和应用层,随着非结构化数据的激增和算法框架的日益复杂,算力不足的问题逐渐显现出来,越来越多的用户认识到算力的重要性。
根据《2020-2021中国人工智能计算力发展评估报告》显示,人工智能应用对算力最大的挑战来自于数据中心的模型训练。具有海量参数的模型训练几乎完全依赖于核心数据中心的算力支撑。比如2020年微软发布的智能感知计算模型Turing-NLG,参数量高达到175亿;OpenAI发布的GPT-3模型,参数量更达到1750亿,是GPT-2的100余倍。由于其庞大的参数体量,在给人工智能应用提供便利的同时,对AI算力提出了更高的要求。
因此,人工智能的算法越来越依赖于算力的发展。
目前,为AI提供算力的主流AI计算加速芯片主要为以下几种:
GPU:图形处理器(Graphics Processing Unit,GPU),又称显示核心、视觉处理器、显示芯片,是一种专门在个人电脑、工作站、游戏机和一些移动设备(如平板电脑、智能手机等)上图像运算工作的微处理器。
FPGA:现场可编程门阵列(Field Programmable Gate Array,FPGA)。其设计初衷是为了实现半定制芯片的功能,即硬件结构可根据需要实时配置灵活改变。
ASIC:专用集成电路(Application Specific Integrated Circuit,ASIC),适合于某一单一用途的集成电路产品。
他们之间与传统的CPU对比如下:
从图中可以看出,针对不同的计算任务、不同的场景,不同类型的芯片各具优势。
根据IDC报告,2020年,中国的GPU服务器依然占据人工智能市场95%左右份额;未来FPGA和ASIC等其他加速芯片将在各个行业和领域被越来越多的采用,尤其是部署在边缘和端侧的推理工作负载,以满足成本与功耗的需求。
从厂商的角度来看,Nvidia的GPU加速芯片由于其超多的核心数、超高的计算性能、简单易用的特性,成为数据中心深度学习加速方案的绝佳搭档。
随着GPU在AI领域的广泛应用,对GPU算力的优化也迎来了新的挑战。
二、如何进行算力优化
Q:为什么要优化?
A:因为算力昂贵,而且现阶段算力紧张。
Q:怎么优化?
A:从以下三个方面入手。
1、GPU资源池化
早些年,我们主要使用的资源对象还是以CPU为主,业界的虚拟化和云化技术也是围绕CPU展开。现在随着AI的发展,深度学习应用的规模化扩张,在很多头部客户的数据中心里面已经构建了几千张甚至上万张规模的GPU卡。
当一种新资源扩张到一定程度,必然会带来管理、调度、分配和使用上的挑战,特别是GPU这种既昂贵,又稀缺的资源:
[*] 对于资源的IT运维方,就要花更多的金钱和精力来埋单;
[*] 对于资源的使用方,就要花更多的时间和人力来填坑。
可以看到,GPU资源使用上的这些挑战是由于缺乏虚拟化,缺乏资源池化所导致的。因此,解决问题的根源就是从底层虚拟化入手,将GPU从硬件定义转换成软件定义的资源池。
[*]首先,虚拟化是基础。早期的GPU虚拟化是以单纯的显存切分为主,固定比例,无法动态调节,无法进行算力切分。理想的虚拟化应该是显存、算力双维度任意切分、动态调节、同时还有QoS保障的。
[*]其次,把GPU资源的调用范围逐渐从本地调用扩展到远程调用。能够实现远程调用的最大意义在于,GPU资源的服务范围不再局限于本地服务器;AI应用的落地范围也不再局限于拥有GPU的服务器;两者互相解耦,弹性范围扩大。
[*]最后,就是资源池化,而且是软件定义的资源池化。试想一下,曾经难以分配的GPU卡,现在可以像云一样按需分配,随用随取,任意伸缩,统一管理,看起来是不是很nice!
当然,用起来确实也很nice,如下图所示:
综上所述,GPU资源池化之后:
①通过切分,资源并行使用,可以带来3-5倍利用率的提升,大大缓解资源紧张与资金的矛盾,节约大笔硬件开销。
②横向打通,消除孤岛,避免独占,让用户轻松共享所有GPU资源,大幅提高效率,节省大量调度与等待时间。
③软件定义让底层硬件的管理/调度更加智能,开发人员可以更加专注于更有价值的业务层面。
2、计算精度优化
上面我们提到,GPU是人工智能深度学习的绝佳搭档,那么,GPU最令人叹服的地方就在于它超强的浮点计算能力。
浮点数是计算机上最常用的数据类型之一,常用的浮点数有双精度(FP64)和单精度(FP32)。除此之外,Nvidia还提出了一个叫半精度(FP16)的浮点数。
双精度和单精度是为了计算,而半精度更多是为了降低数据传输和存储成本。很多场景对于精度要求也没那么高,例如分布式深度学习里面,如果用半精度的话,比起单精度来可以节省一半传输成本。当然,前提条件是精度的降低对训练的结果没有影响,毕竟浮点精度的降低必然导致模型训练精度的损失。
很多算法工程师和数据科学家们更希望看到的是①模型训练结果不受精度的影响;②有效整合计算精度,节省计算资源。
因此Nvidia从V100开始,推出了第一代Tensor Core,这是一种新型处理核心,用来处理混合精度计算。混合精度是指训练时在模型中同时使用 16 位和 32 位浮点类型,从而加快运行速度,减少内存使用的一种训练方法。通过让模型的某些部分保持使用 32 位类型以保持数值稳定性,可以缩短模型的单步用时,而在评估指标(如准确率)方面仍可以获得同等的训练效果。
以矩阵乘加举例,D=AB+C,首先是最耗计算资源的AB矩阵乘法,但是对精度要求又没那么高要求的,我们可以使用半精度(FP16)进行计算;然后再将结果添加到半精度(FP16)或单精度(FP32)矩阵中进行矩阵加,最终输出的结果还是可以保持在大家熟悉的单精度(FP32)上。
可以看到在整个过程中,并不是端到端全部都变成更低的半精度(FP16)计算,而是仅在最耗资源以及对结果没有直接影响的部分进行精度变换。
伴随着Nvidia A100的发布,Tensor Core目前已经进化到第三代,可以加速几乎所有的常见数据类型,包括FP16、BF16、TF32、FP64、INT8、INT4和二进制。
从实际训练效果来看,Tensor Core混合精度计算对常用的图像分类,目标检测以及一些循环神经网络模型训练的加速效果还是不错的,最高可达3.3倍的加速。
同样的,在推理场景,本身推理的精度要求就比训练来得更低,适当降低精度会更加容易一些。特别是在一些嵌入式设备、边缘AI计算领域,功耗低,存储空间小,适当降低精度会拥有更加广泛的应用场景。举个例子,在inception的人脸识别场景,把FP32的浮点计算变成INT8的整数型计算,内存占用率仅仅是原来的1/4,有3/4的内存可以被释放,在效果不变的情况下,还能做到资源的大幅节约。
综上所述,通过计算精度的优化,可以明显降低对计算资源的占用,这对于昂贵而且紧张的GPU资源来说是一大福利。同时,针对优化的计算平台,在模型训练和推理的速度方面也都有较大提升。考虑到深度学习的模型未来的发展趋势可能会有几万亿个参数,混合使用FP32、FP16、INT8甚至更低精度的INT4是非常有价值的。
3、并行训练优化
众所周知,大模型训练对算力要求非常高,特别是当需要用很多数据进行训练的时候,训练周期一般以周、月来计算。所以,大家都希望通过使用更多GPU卡来加速这个过程。这个过程就是并行训练。
首先,硬件上面,实现并行训练的服务器方案一般有两种:scale-up和scale-out。
scale-up方案就是在一台服务器里面叠加更多GPU卡,4张、8张甚至16张卡,一个训练任务使用这个服务器内的多卡资源即可。该方案的好处是深度学习的软件框架实现起来比较简单,只需修改环境变量参数即可。当然,缺点也很明显,GPU的并行扩展性受限于单机物理服务器规格,不可能无限扩展。
scale-out方案,即横向扩展,刚好可以弥补上面scale-up的单机缺陷,让训练任务可以使用来自不同物理服务器的GPU卡,组成多机多卡分布式训练,实现更大规模的集群和更快的训练速度。该方案不受单机物理服务器规格限制,硬件部署更灵活高效。但是在AI框架层面,需要手工修改代码,比如将模型修改成适配Horovod的分布式。同时,为了保证大规模分布式训练拥有良好的加速比,对于GPU参数同步机制需要做更仔细的规划。
从目前的应用场景来看,如果不是大规模训练,同时考虑到成本、技术难度等因素,多数客户会先采用scale-up方,毕竟这是最简单也是最基础的解决方案。当遇到大规模训练时,通过技术升级和架构调整,可以完全过渡到scale-out方案。
其次,通信也很重要。当GPU数量越来越多,怎么保障多GPU之间的传输效率?在单机内部,硬件厂商们通过高速的PCIe Switch结合PCIe 3.0/4.0总线带宽来实现GPU端到端的通信。更高效率的还有Nvidia自己的NVSwitch结合NVLink,可以进一步提高GPU之间的互联性能。最新的A100上搭载的第三代NVLink总带宽达到600GB/秒,几乎是PCIe 4.0带宽的10倍。
看完单机内部,我们再来看多机之间的通信。scale-out支持的分布式模型训练中,有千万级,甚至亿级别的参数需要通过网络跨机传输,对网络带宽要求更高,网络延时更加苛刻。通过大量实践证明,25Gb及以上的RDMA网络,可以比较好的解决跨机通信问题。RDMA协议绕过CPU直接读取内存数据,可以有效降低延时。带宽上面,25Gb只是起步而已,目前主流的分布式GPU训练集群首选网络以100Gb或200Gb的Infiniband为主,可以有效降低多机之间的性能损耗,实现更好的加速比。
最后,是分布式训练框架。分布式训练框架最主要的就是用来保障GPU之间的参数同步机制。比如TensorFlow默认的PS-Worker架构GPU参数同步机制,是以参数服务器的形式来保障。它会选举一张(或多张)GPU卡作为参数服务器(parameter server),其他GPU卡作为工作服务器(worker)。其中参数服务器存放模型的参数,而工作服务器负责计算参数的梯度。在每个迭代过程,工作服务器从参数服务器中获得参数,然后将计算的梯度返回给参数服务器,参数服务器聚合从工作服务器传回的梯度,然后更新参数,并将新的参数广播给工作服务器。这来回的通信量就是:K(参数量)N(GPU数量)2(双向通信)。由此可见,在模型参数固定的情况下,GPU卡数量越多,对带宽的占用就越高,线性加速比就越差。
因此,在多机多卡分布式训练中,需要更优化的训练框架。Horovod 是一套支持TensorFlow, Keras, PyTorch, and Apache MXNet 的分布式训练框架,由 Uber 构建并开源。Horovod采用Ring-Allreduce架构,有效提高多GPU之间的通信效率。Ring-Allreduce 的命名中Ring意味着设备之间的拓扑结构为环形,Allreduce则代表着没有中心节点,架构中的每个节点都是梯度的汇总计算节点。此种算法各个节点之间只与相邻的两个节点通信,并不需要参数服务器。因此,所有节点都参与计算也参与存储。相比PS-Worker架构,Ring Allreduce架构是带宽优化的,因为集群中每个节点的带宽都被充分利用。Ring-Allreduce的参数传递耗时并不会随着设备的增加而线性增长,这是该架构性能优于PS-Worker的最大原因。
综上所述,从GPU服务器的硬件优化开始,到通信优化,再到框架优化,可以逐步提高并行训练的效率,充分发挥每一片GPU卡性能,减少损耗,使训练集群接近于线性加速。
<hr/>趋动科技介绍
趋动科技于2019年成立于北京中关村高新技术园区,拥有专业的研发、运营和服务团队,被评为WISE2020「新基建创业榜」最具成长性创业公司TOP20。趋动科技致力于帮助客户构建高效的AI算力资源池,提升客户AI运维管理的效率和AI业务应用的效率。根据客户测算,OrionX猎户座软件可以每年提升50%AI算法工程师人效、提升AI资源利用率3-8倍以及让客户总体拥有成本下降80%。
趋动科技创始人兼CEO王鲲博士表示,凭借标准化、可复制的产品架构,OrionX猎户座软件得到了包括互联网、金融、电信运营商、科研机构和高校等大量行业头部客户的认可,资本市场对于趋动科技的发展充满信心。
页:
[1]