就在上周,互联网爆出两个新的严重漏洞,分别是 Meltdown 和 Spectre, 这两组漏洞几乎影响所有的主流 CPU.这些漏洞都源于处理器的 "推演执行"(speculative execution)的 bug,它允许攻击者读取(并潜在地执行)其各自进程之外的内存位置,这意味着程序可以读取其他软件内存中的敏感数据.
为了解决这个问题,Linux 内核合并了一个名为 KAISER 或 PTI(页表隔离)的补丁,这个补丁有效地解决了 Meltdown 攻击.但是,这个补丁对性能造成了很大的影响,据报告 CPU 性能下降达到 5%至 35%(甚至一些综合 benchmark 性能下降超过 50%).
但是,PTI 的性能问题在很大程度上取决于当前的任务,大幅度下降可能仅会出现在 FSMark 等综合 benchmark 中.因此,我们提出一个问题:在机器学习应用程序中,性能受到怎样的影响?
安装
为了比较使用和不使用 PTI 补丁的性能,我安装了一台新的安装了 Intel microcode 的 Ubuntu 16.04 机器,并将 Ubuntu 16.04(4.10.0-42-generic)上自动安装的最新内核与最新的有 PTI 补丁的主线内核版本(4.15.0-041500rc6-generic)进行比较.我使用了 Python 3.6(以及来自 pip 的额外软件包)的 Anaconda 来执行测试.
我用于测试的机组包括英特尔酷睿 i7-5820K(Haswell-E,stock clocks)和 64GB DDR4 @ 2400MHz.值得注意的是,AMD 处理器没有启用 PTI 补丁,因为它们不受 Meltdown 攻击的影响——所以如果你使用 AMD 的话,性能不会受到任何影响.
结果
首先,所有的性能都出现了轻微的下降,但是卷积层模型的推断性能下降很大.特别是 AlexNet,前向传播速度慢了大约 5%,但反向传播速度几乎没变——训练性能受到的影响大约是推理的一半.
就 keras 的 raw 操作而言,全连接层和 LSTM 层的性能几乎没有受到影响,但卷积层的性能降了 10%.
对于 Alexnet 和 MNIST 基准测试,我使用了 TensorFlow 教程模型,对于 Keras,我使用了随机初始化模型和几个有问题的层,并测试了随机数据的推理速度.值得注意的是,这些基准测试完全在 CPU 上运行.
我在这里使用了 Scikit-learn 来衡量 "经典"ML 和数据科学算法的性能.从上图中可以看到,与神经网络相比,经典 ML 算法的性能下降更大,PCA 和线性回归 / 逻辑回归受到的影响最严重.造成这么大的性能下降的原因可能是某些数学运算受到严重影响,我将在下文的 NumPy benchmarks 讨论这一点.
有意思的是,kNearestNeighbour 完全不受 PTI 的影响,而且看起来在新内核上甚至表现更好.这可能只是在 error 的范围之内,但也有可能是其他一些内核的改进有助于提高速度.
我还从内存缓存的文件中提取了一个 pandas.read_csv()的 benchmark,目的是看看 PTI 对 CSV 的解析速度有多大的影响——在读取 Bosch Kaggle 竞赛数据集的速度下降是 6%.
所有 scikit-learn benchmark 也都在 Bosch 数据集上计算了——我发现通常对于 ML benchmark 表现较好,因为这个数据集具有规模大,标准化和格式良好的数据(虽然 kNN 和 Kmeans 是在一个子集上计算的,因为使用完整的数据需要的时间太长).
这些 benchmark 可能是这里最综合的,测试的是一个单一的 scipy 操作的速度.但是,上图的结果显示,PTI 的性能受到的影响是极端任务依赖性( task-dependent)的.我们可以看到,大多数操作只受到很小的影响,点积(dot product)和 FFT 对性能影响很小.
当 PTI 启用时,SVD,LU 分解和 QR 分解都会大幅度影响性能,QR 分解从 190GFLOPS 降低到 110GFLOPS,降低了 37%.这可能有助于解释 PCA(主要依赖于 SVD)和线性回归(主要依赖于 QR 分解)的性能下降.
这些 benchmark 是使用英特尔自己的 ibench 软件包完成的,只使用了 Anaconda 而不是英特尔的 python 发行版.
XGBoost 的结果有点意思.大多数情况下,使用较少的线程数时,无论使用慢的 Exact 方法还是快的直方图方法,PTI 对 XGBoost 的性能影响都可以忽略不计.
但是,当使用的线程非常多时,CPU 同时处理更多的 column,使用 PTI 的处理速度就下降了.
这并不是 XGBoost 如何在大量内核上执行的一个完美展示(因为这是在 12 个逻辑内核上运行了 40 个线程),但是它表明 PTI 对 CPU 同时处理很多线程时的影响更大.不过,我没法访问任何可以修改内核的多内核数量的服务器,所以没法得到更深入的结果.
与 scikit-learn 一样,这些基准是在 Bosch 数据集上进行的.
原文发布时间为:2018-01-07
来源: https://yq.aliyun.com/articles/337565