15

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

KernelObject::rdead:通过 remote[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]}

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

4

1 回答 1

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]
于 2011-11-11T20:20:19.047 回答