OpenAI近日发布的分析表明,自2012年以来,人工智能训练任务中使用的算力正呈指数级增长,其目前速度为每3.5个月翻一倍(相比之下,摩尔定律是每18个月翻倍)。自2012年以来,人们对于算力的需求增长了超过300,000倍(而如果是以摩尔定律的速度,只会有12倍的增长)。在此期间,硬件算力的提升一直是人工智能快速发展的重要因素。因此,如果我们希望目前的发展趋势持续下去,我们就需要为实现远超当前方法负载的全新系统做好准备。
上图中的计算方法参见下文附录。
上表显示了不同模型以petaflop/s-days计的计算总量。深度模型需要耗费大量时间和算力,因此若给定足够信息,我们可以估计已知训练结果的总算力需求。一个petaflop/s-day(pfs-day)代表在一天时间内每秒执行10^15次神经网络操作,总计约为10^20次操作(operations)。这种计法类似于电能的千瓦时。在这里,我们不测量硬件FLOPS数的理论峰值,而是尝试估计执行的实际操作数量。OpenAI在这里将任何加法或乘法计为单个操作,而不考虑数值精度(使「FLOP」略微用词不当),同时忽略集成模型。通过计算,每次算力需求翻倍的时间为3.43个月。
概论
推动人工智能发展的动力有三个:算法创新、数据(其可以是有监督数据或者交互式环境),以及可以用于训练的算力。算法创新和大数据体量或许难以跟踪,但算力通常是可以量化的,这为我们探究AI发展进程提供了机会。显然,使用大量算力有时候只会暴露人类当前算法低效的现实,但至少目前在很多领域中,使用更多的算力通常会带来更为优秀的结果,而且这通常也与算法的进步相辅相成。
在算力的分析中,OpenAI相信起决定作用的数字并不是单个CPU的速度,也不是数据中心的最大容量,而是用于训练单个模型所需的算力数字——这一数字最有可能代表当前最佳算法的强大程度。以模型计的算力需求与总算力有很大不同,因为并行计算的限制(硬件和算法上)定义了模型不能过大,训练的效率也不会太高。当然,重要的技术突破仍然是在适量的计算上实现的——在这里我们仅分析算力需求。
OpenAI发现,目前发展的趋势是每年大约增加10倍。这一过程部分是由更为专业的硬件(如GPU和TPU)使得给定价格下芯片每秒能够执行更多操作,但主要还是由研究人员一再推动寻找和使用并行方法,花费大量资金来实现的。
时期
从图中我们可以看到四个时期:
2012年之前:使用GPU研究ML还不常见,图中的任何结果都很难达到。
2012-2014:在多个GPU上进行训练的基础架构不常见,因此大多数结果使用1-8个速度为1-2TFLOPS的GPU进行训练,得到0.001-0.1pfs-days的结果。
2014-2016:使用10-100个速度为5-10TFLOPS的GPU进行大规模训练,得到0.1-10pfs-days的结果。减少数据并行化的返回值意味着更大的训练运行产生的值是有限的。
2016-2017:允许更大算法并行的方法(如较大的批量大小、架构搜索和专家迭代)以及专用硬件(如TPU和更快的互联)极大地突破了限制,尤其是对某些应用来说。
AlphaGoZero/AlphaZero是公众可见的大型算法并行化例子,而很多其他同等规模的应用现在在算法层面上是可行的,而且可能已经用于生产。
展望
有很多理由让我们相信图中展示的趋势将会继续。很多硬件创业公司正在开发AI专用的芯片,一些企业声称他们将在接下来一两年大幅提高芯片的FLPOS/Watt(和FLOPS/$相关)。此外,也可以仅通过重配置硬件,以更少的经济成本得到相同的计算次数。在并行性方面,上述的很多近期的算法创新在原则上可以相乘地结合,例如,架构搜索和大规模并行SGD。
另一方面,成本最终会限制该趋势的并行性方面,物理学将会限制芯片效率方面。OpenAI认为如今最大规模的训练运行使用的硬件在个位数数量上就要以百万计美元的成本来采购(尽管已摊销成本低得多)。但今天的神经网络计算的主体仍然在于推理(部署)阶段,而不是训练过程,这意味着企业可以重新利用或采购更大规模的芯片机群用于训练。因此,如果出现了足够的经济诱因,我们甚至可以见证更大规模的平行训练,为此该趋势将继续保持多年。全世界的总体硬件预算是每年1万亿美元,因此绝对的限制仍然远未达到。总体而言,给定上面的数据,计算的指数增长趋势的先例、在机器学习专用的硬件上运行,以及正在发挥作用的经济诱因,OpenAI认为那些相信这个趋势在短期内将消失的看法是错误的。
过去的趋势并不足以预测该趋势将在未来持续多久,或当它继续时会发生什么。但容量的快速增长的合理潜力意味着开始解决安全()和AI的恶意使用成为重要的问题,我们必须抢在该趋势之前率先行动,而不是延迟地反应。
附录:方法
OpenAI使用了两种方法来生成这些数据点。当我们有足够的信息时,可以直接计算各种架构在每个训练样本所花费的FLOPs数(加和乘运算数),并乘以训练过程中前向传播与反向传播的总数量。当我们没有足够的信息直接计算FLOPs数时,可以查看GPU训练时间与GPU的使用数量,并假设一个使用效率(通常为0.33)。对于大多数论文,我们可以直接使用第一种方法,不过仍然有少数模型需要使用第二种方法计算,OpenAI尽可能使用两种方法计算以作为一致性检查。此外,OpenAI也会将大多数计算结果送与原作者确定。计算并不是非常精确,但OpenAI旨在2-3倍的范围内保持准确,以下提供了一些计算示例。
方法1示例:计算模型中的操作数
这种方法在作者给出了前向传播中的操作数(operations)时非常容易处理,例如在论文Goingdeeperwithconvolutions中构建的ResNet-151:
(add-multipliesperforwardpass)*(2FLOPs/add-multiply)*(3forforwardandbackwardpass)*(numberofexamplesindataset)*(numberofepochs)=(11.4*10^9)*2*3*(1.2*10^6images)*128=10,000PF=0.117pfs-days
已知模型架构的操作数可以通过一些深度学习框架程式地计算出来,或者我们也可以简单地手动计算操作数。如果论文给出了足够的信息以计算操作数,那么方法1会非常精确.但有些时候论文并没有包含所有的必要信息,且作者也不能公开地展示详细细节,这样的计算就会比较麻烦。
方法2示例:GPU时间
如果我们不能直接计算操作数,那么就要查看模型需要多少GPU训练多长时间,然后再根据对GPU利用率的合理假设估计执行的操作数量。需要强调的是,我们不能只计算FLOPs的理论峰值,相反需要使用理论FLOPs数的假定分数来尝试预测实际的FLOPs数。根据OpenAI的实验经验,除非有更加具体的信息,他们一般假设GPU的利用率为33%、CPU的利用率为17%。
例如在AlexNet论文中,原文表示「我们的网络在两块GTX5803GB显存的GPU上需要花5到6天进行训练。」根据OpenAI的假设,那么它的总计算数可计算为:
NumberofGPUs*(peta-flops/GTX580)*daystrained*estimatedutilization=2*(1.58*10^-3PF)*5.5*0.33=500PF=0.0058pfs-days
这个方法只是一种近似计算,并且很容易超出实际的上下两倍。因此,OpenAI的目标是仅估计模型操作数的数量级。在实践中,这两种方法都可以用且结果也比较相似,例如直接计算AlexNet的操作数将得出0.0054pfs-days,而通过GPU执行时间估计可得出0.0058pfs-days。
1.2Mimages*90epochs*0.75GFLOPS*(2add-multiply)*(3backwardpass)=470PF=0.0054pfs-days
选定的附加计算
dropout
Method2:1GPU*4days*1.54TFLOPS/GTX580*0.33utilization=184PF=0.0021pfs-days
可视化和理解卷积神经网络
Method2:1GPU*12days*1.54TFLOPS/GTX580*0.33utilization=532PF=0.0062pfs-days
DQN
Method1:Networkis84x84x3input,16,8x8,stride4,324x4stride2,256fullyconnectedFirstlayer:20*20*3*16*8*8=1.23Madd-multipliesSecondlayer:9*9*16*32*4*4=0.66Madd-multipliesThirdlayer:9*9*32*256=0.66Madd-mutlipliesTotal~2.55*5Mupdates*32batchsize*2multiply-add*3backwardpass=2.3PF=2.7e-5pfs-days
Seq2Seq
Method1:(348M+304M)words*0.380GF*2add-multiply*3backprop*7.5epoch=7,300PF=0.085pfs-days
Method2:10days*8GPU’s*3.5TFLOPS/K20GPU*0.33utilization=8,100PF=0.093pfs-days
VGG
Method1:1.2Mimages*74epochs*16GFLOPS*2add-multiply*3backwardpass=8524PF=0.098pfs-days
Method2:4TitanBlackGPU’s*15days*5.1TFLOPS/GPU*0.33utilization=10,000PF=0.12pfs-days
DeepSpeech2
Method1:1timestep=(1280hiddenunits)^2*(7RNNlayers*4matricesforbidirectional+2DNNlayers)*(2fordoublingparametersfrom36Mto72M)=98MFLOPs20epochs*12,000hours*3600seconds/hour*50samples/sec*98MFLOPs*3add-multiply*2backprop=26,000PF=0.30pfs-days
Method2:16TitanXGPU’s*5days*6TFLOPS/GPU*0.50utilization=21,000PF=0.25pfs-days
Xception
Method2:60K80GPU’s*30days*8.5TFLOPS/GPU*0.33utilization=4.5e5PF=5.0pfs-days
神经架构搜索
Method1:50epochs*50,000images*10.0GFLOPSs*12800networks*2add-multiply*3backwardpass=1.9e6PF=22pfs-days
Method2:800K40’s*28days*4.2TFLOPS/GPU*0.33utilization=2.8e6PF=31pfs-daysDetailsgivenina[laterpaper]().
神经机器翻译
Method2:sqrt(10*100)factoraddedbecauseproductionmodelused2-3ordersofmagnitudemoredata,’s*9days*8.5TFLOPS*0.33utilization*sqrt(10*100)=6.9e6PF=79pfs-days
附录:使用适当计算量得到的近期新结果
产生重要的结果不一定需要大量的计算。很多近期值得注意的结果仅使用了适当的计算量。以下是一些相关的案例,它们能为计算评估给出足够的信息。OpenAI并没有使用多种方法来评估这些模型的计算,对于上边界他们对可能的丢失信息进行的保守估计,因此它们会有更多的总不确定度。这些结果并不包含在OpenAI的定量分析中,但它们仍然是有趣和值得分享的:
Attentionisallyouneed:0.089pfs-days(6/2017)()
AdamOptimizer:(12/2014)()
LearningtoAlignandTranslate:0.018pfs-days(09/2014)()
GANs:(6/2014)()
Word2Vec:(10/2013)()
VariationalAutoEncoders:(12/2013)()