帖子

目前显示的是 八月, 2015的博文

当心Intel® Management Engine埋下openssl的雷

Intel的电脑经常会默认安装一个叫做Intel® Management Engine的软件。这个东西会导致严重的安全漏洞,甚至让很多程序无法运行。举个例子,我今天自己在windows下编译了一个curl然后运行,发现出错了。报告curl.exe - Ordinal Not Found
The ordinal 385 could not be located in the dynamic link library C:\os\curl-7.43.0\builds\libcurl-vc14-x64-release-static-ssl-dll-zlib-dll-sspi\bin\curl.exe. 后来我用depends.exe发现,它引用了c:\program files (x86)\intel\icls client\LIBEAY32.DLL这个文件。而icls client是Intel® Management Engine的一部分,它安装后会把自己加到PATH环境变量中,它还带了两个openssl的dll。这种软件几百年都不会更新一次,想想去年openssl的heart bleed bug。 所以,赶紧,我建议,卸载这个破软件了事。

Reduce, Broadcast and AllReduce

图片
在做机器学习的时候,经常要做这样一个操作:每台机器计算出一个vector,然后把这些vector汇总加起来,再广播回去传统模式如下面这组图所示:总体来说,它可以分为两步:Reduce。 即map-reduce中的那个reduce。 Broadcast。 把reduce的结果broadcast到所有节点。直接以这样两步走的方式解决此问题会很低效。如果vector长度很大,那么负责汇聚的那个节点,就会成为性能瓶颈。树状模式于是就有了基于tree的map-reduce来解决这个问题。这种方式被广泛用在了Vowpal Wabbit和spark中。broadcast的过程与reduce的过程类似,我就不画了。下面举个例子分析下它需要花多少时间。 假设我们有75台机器,采用5叉树的方式来汇聚。那么需要5层。 第一层75台机器。 第二层15台机器。 第三层3台机器。 第四层1台机器。假设每个Vector的大小是1GB,而带宽是10Gb/s,那么reduce阶段至少需要(5+5+3)*8/10=10秒才能传输完。采用上一种方案,reduce需要75*1*8/10=60秒。相比之下有很大的改进。All to All 模式All to All的模式是每台机器和每台机器都得建立一个连接。初始状态是这样:value1value2value3value4机器11321机器22545机器381097机器46236然后,第i行的数据都汇总到第i%n台机器上。(n为机器数)
如下表所示。红色的代表新修改的值。value1value2value3value4机器117321机器222045机器3810187机器462319然后broadcast出去value1value2value3value4机器117201819机器217201819机器317201819机器417201819然后还是按上面的例子算下时间。可以发现,网络开销和机器数量无关。每台机器都需要传输大约2GB*(1-1/n)的数据出去,接收1GB * (1-1/n)的数据进来。所以,大约2秒就可以完成。汇总比较一下:所需时间传统方法60秒*2Tree10秒*2All to All2秒结合实际Yahoo的vowpal wabbit是率先把tree allreduce与hadoop结合起来。spark在reduce阶段提供了tree的…