您现在的位置是:首页 > 科技前沿

学习超大神经网络,CPU超越V100 GPU,靠的居然是哈希?

智慧创新站 2025-01-27【科技前沿】80人已围观

简介机器之心报道机器之心编辑部在论文中,研究者指出,尽管已有的研究表明,在算法端对模型进行优化无法显示出如同V100GPU那样强大的性能提升,但是他们提出的SLIDE引擎却可以实现。这一模型可以显著地减少训练和推理阶段的运算,比在GPU上经过TensorFlow高度优化过的算法还要快。例如,在工业级的推...

机器之心报道

机器之心编辑部


在论文中,研究者指出,尽管已有的研究表明,在算法端对模型进行优化无法显示出如同V100GPU那样强大的性能提升,但是他们提出的SLIDE引擎却可以实现。这一模型可以显著地减少训练和推理阶段的运算,比在GPU上经过TensorFlow高度优化过的算法还要快。

例如,在工业级的推荐数据集上测试SLIDE时,TeslaV100GPU上的训练时间是的3.5倍。而在同样的CPU硬件条件下,SLIDE比TensorFlow快了10倍。

我们可以先看张实验图,在Amazon-670K这样的复杂分类数据集上,超一亿参数量的大型神经网络训练时间竟然是SLIDE+CPU最快,连TensorFlow+TeslaV100都要慢很多。而且从迭代步数上看,它们两者是等价的,表明模型的收敛行为是相同的。


对于论文和结果的复现,研究者已提供了相应的代码。

开源地址:

计算复杂度大降,局部敏感哈希立功

如此神奇的加速是怎么实现的?具体而言,研究者采用了局部敏感哈希(LocalitySensitiveHashing)算法,并在神经网络中使用了自适应dropout。局部敏感哈希是一类哈希算法,当输入数据彼此类似的时候,具有更高的碰撞概率,而不相似的算法彼此碰撞的概率很低。一种广泛应用的最近邻逼近搜索算法就使用了局部敏感哈希理论。

SLIDE的局部敏感哈希如何构建

在Indyk和Motwani在1998年的一项研究中表明,对于给定的相似性计算,一类LSH函数就足以有效地解决次线性时间中的最近相邻搜索。

算法:LSH算法使用两个参数(K,L),研究者构造了L个独立的哈希列表。每个哈希表都有一个原始哈希函数H,而该函数是由集合F里K个随机的独立哈希函数串联而成。在给定一个查询下,从每一个哈希列表中采集一个bucket后会返还L个bucket的集合。

直观地说,原哈希函数使得bucket变得稀疏,并减少了误报的数量,因为只有有效的最近相邻项才可以匹配给所查询的所有K的哈希值。L的bucket集合通过增加可存放的最近相邻项的潜在bucket数量来减少漏报的数量。而候选生成算法分为两个阶段工作:

1.预处理阶段,通过储存所有x元素,从数据层面构造L的哈希列表。只存储哈希列表中指向向量的指针,因为储存整个数据向量会非常低效。

2.查询阶段:给定一个查询Q,搜索其最近相邻项,从L的哈希列表所收集的所有bucket集合进行报告。这里注意,不需要去扫描所有的元素,只是在探测L的不同的bucket,而每个哈希列表里都有一个bucket。

在生成潜在的候选算法后,通过比较候选集里的每个子项与查询间的距离从而计算处最近相邻项。

将局部敏感哈希用于采样和预估

虽然局部敏感哈希被证明能够在亚线性条件下进行快速抽取,但是对于精确搜索而言速度非常慢,因为它需要大量的哈希表。有研究表明,通过如图1所示的高效采样能够在一定程度上缓解搜索的计算量,只需要看一些哈希桶就能够做到足够的自适应采样。

图1:局部敏感哈希的图示。对于一个输入,可以从对应的哈希桶中抽取哈希码。

而最近在最大化内积搜索(maximuminnerproductsearch:MIPS)的研究也说明了这一点,在这里,可以使用非对称局部敏感哈希,使得采样大的内积变得可能。给定一个向量集合C和查询向量Q。使用(K,L)--参数化的LSH算法和MIPS哈希,可以获得一个候选集合S。在这里,只需要一次线性成本,对C进行哈希化的预处理,而对于Q则只需要少量哈希查表工作。

SLIDE中的算法,包括框架(算法1)和哈希采样(算法2)。

构建SLIDE系统

图2:SLIDE系统架构。

在SLIDE架构中,其核心模块是网络。该神经网络由一些单层模块组成。对于每个层的模块,其都是由神经元和一些哈希表组成——即将神经元的ids转换成哈希。

对于每个神经元来说,它都有多个批大小长度数组:1)一个二元数组,表示对于每个输入,该神经元是否激活;2)每个输入的激活;3)批数据中每个输入的累积梯度;4)该层和上一层连接权重;5)上一层神经元数量,由最后一个数组表示。

初始化

每层对象包含一个神经元列表以及一组LSH采样哈希列表。每个哈希列表包含被散列至bucket中神经元的ids。在网络初始化过程中,网络的权重值是随机初始化的。随后,对每层使用L的哈希列表进行初始化K*LLSH函数。

使用哈希表采样进行稀疏前向传播

在前向传播阶段,给定一个单独的训练实例,研究者会计算直到最后一层的网络激活,并给出输出。在SLIDE中,他们不会去计算每层的所有激活,而是将每层的输入xl输入到哈希函数中,得到hl(xl),哈希码作为查询,从对应匹配的buckets中获得激活(采样)的神经元的ids。

稀疏反向传播/梯度更新

反向传播步骤紧接着前向传播进行。计算了神经网络的输出之后,研究者会将输出和标签进行比较,并将误差逐层进行反向传播,来计算梯度、更新权重。这里他们使用了经典的反向传播方法。

权重更新后再更新哈希列表

权重值更新后,需要相应地调整哈希列表中神经元的位置。更新神经元通常涉及到从旧的哈希桶中删除,然后再从新的哈希桶中添加新的内容,这可能会非常耗时。在4.2节中,将讨论几种用于优化更新哈希列表所导致昂贵开销的设计技巧。

OpenMP跨批量处理的并行化

对于任何给定的训练实例中,前馈以及反向传播操作都是按照顺序的,因为它们需要逐层的去执行。SLIDE使用常用的批量处理梯度的下降方法以及Adam优化器,批量处理大小通常在几百个左右。批量处理中的每个数据实例的运行都在单独的线程中,其梯度是按照并行方式计算的。

梯度更新的极端稀疏性以及随机性使得我们可以在不导致大量重叠更新的情况下,在不同的训练数据上通过异步并行处理梯度累积的步骤。SLID大量地使用了HOGWILD的理论(Rechtetal.,2011),同时也表明少量的重叠是可控的。

真→CPU比GPU快

研究者在论文后面附上了一系列实验结果,包括对比采用TeslaV100GPU的TensorFlow模型、对比采用两个IntelXeonE5-2699ACPU(单个22核心,总共44核心)的TensorFlow模型,对比SLIDE自适应采样与带采样的Softmax之间的性能等等。我们可以发现,SLIDE在CPU上的训练速度,竟然惊人地高效。

首先对于测试模型,研究者采用了具有一亿参数量的超大全连接模型,数据集也是Delicious200K和Amazon-670K这种大型工业级分类数据集。这两个数据集分别有78万+和13万+特征维度,20万+和67万+的类别数量,看着就恐怖。因为特征维度和分类类别太高,即使隐藏层单元不多,整体的参数量也会剧增。

如下图所示展示了论文的主要结果,CPU上的SLIDE从时间上要比V100快(采用TensorFlow框架),且能一直优于基于CPU的TF模型。

图5:SLIDE(红线)、TF-GPU(蓝线)和TF-CPU(黑线)之间的效果对比。

在Delicious200K数据集上,SLIDE比TF-GPU快1.8倍。而在需要更大算力的Amazon-670K上,TF-GPU的收敛时间是SLIDE的2.7倍(2小时与5.5小时)。从迭代量来看,两者之间的收敛行为也是等价的,只不过每一次迭代SLIDE都快一些。

此外,在图5中,最后的收敛效果都是差不多的,也就是说在SLIDE框架下,模型效果并不会被破坏。

表2展示了CPU核心的使用情况,其分别测试了框架在使用8、16、32线程下的负载情况。我们可以看到,对于TF-CPU,其使用率非常低(50%),且随着线程的增加,使用率会进一步降低。对于SLIDE,计算核心的利用是非常稳定的,大约在80%左右。

图6展示了TF-CPU和SLIDE在CPU无效利用率上的分布情况。SLIDE对于计算核心的利用率要远远高于TF-CPU的利用率。

图6:CPU低效利用率:Memory-bound的低效利用率(橙色)对于这两种算法是最显著的。TF-CPU随着核心数的增加,Memory-bound低效利用率也会增加,而SLIDE会降低。

因为能高效利用CPU的计算资源,SLIDE随着CPU核心数的增加,收敛时间还能极大地降低。

图9:TF-CPU与SLIDE之间的可扩展性测试,很明显SLIDE要强很多。

代码示例

现在SLIDE已经开源。在开源项目中,作者提供了数据集和相应的代码进行测试。

首先,使用者需要安装CNPY,并开启TransparentHugePages,SLIDE需要大约900个pages,每个2MB,以及10个1GB的pages。

运行代码过程如下:

make./runmeConfig_

需要注意的是,Makefile需要基于CNPY修改路径,同时需要修改的包括在Config_中的trainData、testData、logFile等。

至于训练数据,它来自Amazon-670K,下载地址如下:

在工业领域中,模型结构并不一定非常复杂,朴素贝叶斯、全连接网络这些简单模型往往能获得更多的青睐。然而,真实模型通常非常庞大,配置高性能GPU来训练模型非常不划算。即使这篇论文只验证了全连接网络,但至少说明高性能CPU真的能满足大模型的训练,能大量降低硬件成本。

很赞哦!(120)