大家好啊,我是董董灿。
今天介绍两个在做神经网络性能优化中,非常非常重要的概念——吞吐和延时。
其实不光在做神经网络性能优化时会用到,在计算机网络的性能调优时,这两个概念也会被反复提到,可见其重要性。
很多同学对这两个概念的最大误区,大概都集中在:高吞吐就等于低延时,低吞吐就等于高延时。这样理解是有问题的。
下面介绍这两个概念,帮助大家更深入的理解其区别。
吞吐
吞吐或吞吐量(Throughput):完成一个特定任务的速率(The Rate of completing a specific action),也可以理解为在单位时间内完成的任务量。
对于计算机网络而言,吞吐量的衡量单位一般是 bits / second 或者 Bytes / second。举个例子,如果说一条数据通路的吞吐量是 40Gbps,那么意味着,如果你往这个数据通路中注入40Gb 的数据量,那么它可以在1秒内流过这条数据通路。
对于神经网络而言,我们可以把吞吐量的衡量设置为每秒处理的图片数量(如果是图像任务)或语音数量(如果是NLP任务)。
延时
延时(Latency):完成一个任务所花费的时间(The time taken to complete an action)。举个例子,如果我用我的电脑去 ping 一个网站,从我发送这条 ping 指令(数据包)开始,一直到这条 ping 指令到达对方服务器的时间,就可以理解为延时。
ping 百度的延时。一般在打游戏时,都会关注延时,如果延时太高,玩游戏就会很卡,同样,ping 百度也是很多开发人员喜欢的用来测试网络环境的手段。你是不是也喜欢在测试网络的时候,试试能否打开百度呢?
那么,吞吐量和延时这两者有什么关系呢?是不是意味着,高的吞吐量就会有低的延时?延时增加总是会导致吞吐量减少?
一个例子
我们看一个ATM(Automatic Teller Machine)机取款的例子。
假设银行里有一台ATM机,平均下来它基本会花费1分钟将钱吐出来送给客户(包括插卡、输密码等步骤,这里不考虑个人差异等因素)。这就意味着,如果我排着队轮到我使用这台ATM机取钱,我可以预见的是,1分钟的时间,我就可以拿到钱并且离开ATM机。
换句话说,这台ATM机的延时是1分钟(或者60秒,或者60000毫秒)。那么吞吐量呢?吞吐量是1/60个人每秒。也就是说,如果存在 1/60个人去取钱的话,那么ATM机每秒能接待的客户是1/60个。
这是很简单的数学计算。所以,吞吐量 = 1 / 延时 ?对么?
如果ATM机突然进行了升级,从之前平均1分钟可以接待一个客户,到升级后平均30秒就可以接待一个客户。那么此刻的ATM机的延时是多少?没错,是30秒。那么吞吐量呢?30秒可以接待1个客户,一分钟可以接待两个,吞吐量翻倍了。
延时减半,吞吐量翻倍。看起来很符合上面的公式。
我们继续。
银行为了应对更多的客户取钱需求,在原来仅有的ATM机旁又安装了一台新的ATM机,我们假设这两天ATM机都是未升级前的。也就是一台机器平均1分钟可以接待一名客户。
那么我去取钱,从我占据一台ATM机,到取出钱来,还是会花费1分钟,也就是延时是1分钟。那么此时的吞吐量呢?两天ATM机可以同时一起工作,也就是1分钟可以处理两名客户。吞吐量为2个人/分钟,或者2/60个人每秒。
和只有一台ATM机的时候相比,延时没有变,一个客户取一次钱,都是需要花费1分钟,但是整个ATM机的吞吐量却增加了一倍。
吞吐量的增加,和延时没有关系!
这个例子很清晰的可以说明这个问题。
所以,对于吞吐量,我们可以理解为,一个系统可以并行处理的任务量。而延时,指一个系统串行处理一个任务时所花费的时间。
对应到神经网络性能优化这个场景下。神经网络的吞吐量,就是每秒中可以处理的图片数量,或者语音数量。
这与模型本身的性能有关,也与实际完成计算的硬件资源有关。比如两个GPU可以并行独立完成,其吐吞量一般要比单个 GPU 高。
搞神经网络训练的人,都喜欢堆显卡,就是为了提高整体系统吐吞量,毕竟训练一个模型,需要处理海量的数据。
搞神经网络推理的人,都喜欢做性能优化,为了提高整个模型在有限硬件资源下的速度。毕竟,2秒完成一张图片的识别会让人忍受不了,而1ms的时间,大部分人会感受不到卡顿。
欢迎关注@董董灿是个攻城狮 和同名微信公众号
本文作者原创,转载请联系作者,请勿随意转载