如何在Mathematica中配置并行远程内核?

时间:2011-07-21 22:58:38

标签: wolfram-mathematica mathematica-8

当我尝试通过评估>并行内核配置在mathematica中配置远程内核时...然后我转到“远程内核”并添加主机。之后我尝试启动远程内核,其中只有一些启动(它们的数量不同)。我得到了一个像以下一样的消息。

  

KernelObject :: rdead:出现通过远程[nodo2]连接的子内核   死。 >> LinkConnect :: linkc:无法连接   的LinkObject [36154 @ 192.168.1.104,49648 @ 192.168.1.104,38,12。 >>   General :: stop:将禁止LinkConnect :: linkc的进一步输出   在此计算过程中。 >>

任何想法如何使这个工作?

考虑到它有时会加载一些远程内核,但绝不会加载所有远程内核。提前谢谢。


这是我$ConfiguredKernels // InputForm

的输出
{SubKernels`LocalKernels`LocalMachine[4], 
 SubKernels`RemoteKernels`RemoteMachine["nodo2", 2], 
 SubKernels`RemoteKernels`RemoteMachine["nodo1", 2], 
 SubKernels`RemoteKernels`RemoteMachine["nodo3", 2], 
 SubKernels`RemoteKernels`RemoteMachine["nodo4", 2], 
 SubKernels`RemoteKernels`RemoteMachine["nodo5", 2]}

一旦它加载了所有内核,但它通常没有,只有一个或两个远程内核。

1 个答案:

答案 0 :(得分:10)

提供的信息非常少,因此这个答案可能不是100%有用。

始终要考虑的第一个问题是远程计算机上的许可。如果某些内核启动,但其他内核没有启动,则可能是因为该机器上的内核许可证已用完。本文的其余部分将假定许可不是问题。

连接方法

默认情况下, Mathematica 中的远程内核接口采用 rsh 协议,这对许多环境来说都不是正确的选择,因为 rsh 是不是一个非常安全的协议。

另一个选项是 ssh ,它得到了更广泛的支持。有许多 ssh 客户端,但我将专注于 Mathematica 附带的客户端,即 WolframSSH.jar 。该客户端是基于Java的,它具有在 Mathematica (Mac,Window和Linux)支持的所有平台上运行相同的额外好处。

为了避免为每个内核连接键入密码,可以方便地创建私钥/公钥对。私钥保留在您的计算机上,公钥需要放在远程计算机上(通常位于远程主目录的.ssh文件夹中)。

要生成私钥/公钥对,您可以使用WolframSSHKeyGen.jar文件,如下所示:

java -jar c:\path\to\mathematica\SystemFiles\Java\WolframSSHKeyGen.jar

并按照出现的对话框上的说明进行操作。完成后,将公钥复制到.ssh文件夹 在远程机器上。就我而言,我调用了密钥kernel_keykernel_key.pub自动命名为。

您现在可以从命令行测试连接,如下所示(使用远程计算机上的ls命令):

java -jar c:\path\to\mathematica\SystemFiles\Java\WolframSSH.jar --keyfile kernel_key arnoudb@machine.example.com ls

如果这样做,你应该能够完成Mathematica方面的工作。

远程内核连接

要建立连接,您需要以下设置,即远程计算机的名称:

machine = "machine.example.com";

登录名,通常是$ UserName:

user = $UserName;

ssh二进制位置:

ssh = FileNameJoin[{$InstallationDirectory, "SystemFiles", "Java", "WolframSSH.jar"}];

如上所述的私钥:

privatekey = "c:\\users\\arnoudb\\kernel_key";

内核的启动命令:

math = "math -mathlink -linkmode Connect `4` -linkname `2` -subkernel -noinit >& /dev/null &";

将所有内容放在一起的配置功能:

ConfigureKernel[machine_, user_, ssh_, privatekey_, math_, number_] :=
 SubKernels`RemoteKernels`RemoteMachine[
  machine,
  "java -jar \"" <> ssh <> "\" --keyfile \"" <> privatekey <> "\" " <> user <> "@" <> machine <> " \"" <> math <> "\"", number]

这使用配置函数并将其定义为使用4个远程内核:

remote = ConfigureKernel[machine, user, ssh, privatekey, math, 4]

这将启动内核:

LaunchKernels[remote]

此命令验证内核是否全部连接且远程:

ParallelEvaluate[$MachineName]