分布式计算
为何分布式计算?
需要构建一个语料库的语义表示,这个语料库是数百万个大型文档并且它将永远存在?您可以使用几台闲置的机器吗? 分布式计算试图通过将给定任务拆分为几个较小的子任务来加速计算,并将它们并行传递到多个计算节点。
在gensim的上下文中,计算节点是由其IP地址/端口标识的计算机,并且通过TCP / IP进行通信。整个可用机器集合称为集群。分布非常粗糙(进行的通信不多),因此允许网络具有相对较高的延迟。
警告 * 使用分布式计算的主要原因是使事情运行得更快。在gensim中,大多数耗时的东西是在NumPy内部的线性代数的低级例程中完成的,与任何gensim代码无关。 为NumPy 安装快速 BLAS(基本线性代数) 库可以将性能提高15倍!因此,在开始购买这些额外的计算机之前,请考虑安装一个针对您的特定计算机优化的快速线程BLAS(而不是通用的二进制分布式库)。选项包括供应商的BLAS库(英特尔的MKL,AMD的ACML,OS X的vecLib,Sun的Sunperf,......)或一些开源替代品(GotoBLAS,ALTAS)。 * 要查看您正在使用的BLAS和LAPACK,请键入您的shell:
python -c 'import scipy; scipy.show_config()'
先决条件
对于节点之间的通信,gensim使用Pyro(PYthon远程对象),版本> = 4.27。这是一个用于Python中的低级套接字通信和远程过程调用(RPC)的库。Pyro4是一个纯Python库,因此它的安装非常简单,只需将* .py文件复制到Python的导入路径上:
pip install Pyro4
您不必安装Pyro来运行gensim,但如果不这样做,您将无法访问分布式功能(即,所有内容都将始终以串行模式运行,此页面上的示例不适用)。
核心概念
与往常一样,gensim努力寻求一个清晰明了的API(见功能)。为此,您无需在代码中进行任何更改,以便在计算机集群上运行它!
您需要做的是在开始计算之前在每个集群节点上运行一个工作脚本(见下文)。运行此脚本告诉gensim它可以使用该节点作为从属程序将某些工作委托给它。在初始化期间,gensim中的算法将尝试查找并奴役所有可用的工作节点。
- Node
一个逻辑工作单位。可以对应单个物理计算机,但您也可以在一台计算机上运行多个工作程序,从而生成多个逻辑节点。
- Cluster
通过TCP / IP进行通信的几个节点。目前,网络广播用于发现和连接所有通信节点,因此节点必须位于同一广播域内。
- Worker
在每个节点上创建的进程。要从群集中删除节点,只需终止其工作进程。
- Dispatcher
调度员将负责协商所有计算,排队(“调度”)个人工作给工人。计算永远不会直接与工作节点“交谈”,只能通过此调度程序。与worker不同,集群中一次只能有一个活动调度程序。