详解CPU漏洞对机器学习的影响:几乎所有卷积层都受影响,QR分解降速37%

2018新年伊始,互联网公司发现了两个非常严重的新漏洞。这两个漏洞分别是熔毁(Meltdown)幽灵(Spectre),它们主要会影响几大处理器供应商。


这些漏洞会使攻击者利用处理器在推测性执行时产生的错误,读取(并潜在地执行)其各自进程之外的存储器位置。这意味着,攻击者可以读取其他软件存储器中的敏感数据。


如果在Linux内核中打一个叫做KAISER(也称为KPTI)或PTI(页表隔离)的补丁,可以有效地解决了利用了Meltdown的攻击。但是,这个补丁会对Linux的性能造成很大的影响。据报告显示,CPU性能下降的范围是5%到35%,另有一些综合的评测标准显示,CPU的性能下降幅度甚至超过了50%。


(报告地址:https://www.phoronix.com/scan.php?page=article&item=linux-415-x86pti&num=2)


然而,PTI的性能问题在很大程度上取决于每个人手头需要执行的任务。换句话说,这种性能的大幅度下降可能仅仅出现在FSMark等综合的基准测试中。


所以问题来了:在机器学习的应用程序中,我们会看到什么样的性能?



环境部署


为了比较在使用和不使用PTI时,机器学习应用程序的性能变化,我部署了一个新的带intel微码(也称为微指令)的机器。该机器装有Ubuntu 16.04版本的操作系统。


我还比较了Ubuntu 16.04(4.10.0-42-generic版本)上自动安装的最新内核与最新的主线内核版本(4.15.0-041500rc6-generic版本),这个版本的Linux带有PTI补丁。


我采用的工具是基于Python 3.6(带有用pip下载的额外软件包)的Anaconda,由它来执行整个测试。


我用于测试的机子配置包括英特尔酷睿i7-5820K(Haswell-E,stock clocks)和64GB DDR4 @ 2400MHz。


值得注意的是,AMD的处理器没有启用PTI补丁,因为它们不受Meltdown攻击的影响——所以如果你使用的是AMD处理器,性能将不会受到任何影响。



测试结果

0?wx_fmt=png请注意,图表上的比例是从60%开始的


首先,我们可以看到几乎所有的程序性能都有轻微的下降,不过在卷积层模型的推理过程中下降的速度非常快。尤其是AlexNet,它的推理速度比正常的慢了大约5%,但反向传播速度几乎是相同的——这就是为什么对训练造成的影响大约只是推理的一半。


就Keras的原始操作而言,全连接和LSTM层几乎没有受到任何的性能影响,但卷积层却减少了10%左右。


对于AlexNet和MNIST的基准测试,我使用了TensorFlow教程的模型。而对于Keras,我则使用了一个只有几层卷积并可以随机初始化的模型。我还计算了其在随机数据上的推理速度。


值得注意的是,这些基准测试都仅使用了CPU来运行。


0?wx_fmt=png我在这里使用了Scikit-learn工具包来衡量“传统”机器学习和数据科学算法的性能。


我们看到,与神经网络相比,操作系统带来的性能下降更大,且PCA和线性/逻辑回归受到的影响最严重。造成这种下降的原因可能是由于某些数学受到了非常严重的影响——正如下面针对NumPy的基准结果所讨论的那样。


有趣的是,K最近邻算法完全没有受到PTI的影响,而且目测在新的内核上表现的还稍好一些。这有可能只是在性能测试错误的范围之内,但也有可能是其他一些内核的改进,稍微帮助提高了该算法的速度。


我还从内存里缓存的文件中提取了一个pandas.read_csv()函数的基准,用于查看带PTI的系统对CSV解析的速度降低了多少——输入博世(Bosch)Kaggle竞赛数据集(大小2GB,1M行,1K列,类型是浮点数, 80%缺失),带来了6%左右的读取性能下降。


所有的Scikit-learn工具包基准也是在博世数据集上进行计算的。我发现,普遍来讲,它对于进行机器学习算法基准测试,效果是很好的,因为这是一个庞大的,标准化的且格式良好的数据集(尽管因为采用完整的数据会花费太久的时间,kNN和K-means算法是在一个子集上进行计算的)。


0?wx_fmt=png

这些基准在这里可能是最综合的了,因为仅测试了单一的scipy操作的速度。然而,这些结果告诉我们,PTI带来的性能损失是与任务依赖有极大联系的。在这里我们可以看到,大多数的操作受到的影响都很小,包括点积和FFT(快速傅里叶变换)操作,其对性能的影响也很小。


当PTI启用时,SVD(奇异值分解),LU分解和QR(正交三角)分解性能都会受到大幅度的影响。QR分解从190GFLOPS降低到110GFLOPS,降低了37%的性能。这可能有助于解释为什么PCA(主要依赖于SVD)和线性回归(主要依赖于QR分解)的性能会下降。


这些基准测试是使用英特尔自己的ibench软件包完成的,只是使用了Anaconda而不是英特尔的python发行版。

0?wx_fmt=png

对XGBoost算法进行测试时,我得到了一些有趣的结果。


在大多数情况下,使用较少的线程数时,无论使用慢速精确的方法还是快速直方图方法,PTI带给XGBoost的性能影响都可以忽略不计。


但是,当使用非常多的线程时,也就是CPU同时处理更多的任务时,使用PTI系统会带来速度的下降。


这并不是XGBoost在大量线程内核上执行的完美表示(因为它是在12个逻辑内核上运行了40个线程)。不过,它也能表明,带PTI的系统在CPU同时处理很多事情时,会带来更大的性能影响。不幸的是,我不能访问任何的可以修改内核的高内核数量的服务器,所以我不能得到一个更深入的结果。


与测试scikit-learn一样,这些基准测试是在博世(Bosch)数据集上进行的。



结论


最重要的结论是,PTI带来的性能影响其实是非常依赖于任务的——一些任务不受影响,而有些任务的性能却下降了40%。不过就总体而言,我认为这种影响比我预期的要小,因为只是一些应用程序受到了严重的影响。