Как настроить параллельные удаленные ядра в Mathematica?

Когда я пытаюсь настроить удаленные ядра в математике через Evaluation > Parallel Kernel Configuration..., тогда я перехожу к "Удаленным ядрам" и добавляю хосты. После этого я пытаюсь запустить удаленные ядра, и только некоторые из них запускаются (количество их варьируется). И я получаю msg, как показано ниже.

KernelObject:: rdead: появляется Subkernel, подключенный через удаленный [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

Существует очень мало информации, поэтому этот ответ может быть не полезным на 100%.

Первым вопросом, который нужно всегда учитывать, является лицензирование на удаленной машине. Если запускаются некоторые ядра, а другие нет, возможно, у вас закончились лицензии для ядер на этой машине. Остальная часть этого сообщения предполагает, что лицензирование не является проблемой.

Метод подключения

Интерфейс удаленного ядра в Mathematica по умолчанию принимает rsh-протокол, который не является правильным выбором для многих сред, поскольку rsh не является очень безопасным протоколом.

Другой вариант - ssh, который гораздо более широко поддерживается. Есть много клиентов ssh, но я сосредоточусь на клиенте, включенном в Mathematica, а именно WolframSSH.jar. Этот клиент основан на Java, который имеет дополнительное преимущество для работы на всех платформах, поддерживаемых Mathematica (Mac, Window и Linux).

Чтобы избежать необходимости вводить пароль для каждого подключения к ядерному соединению, удобно создать пару private/public key. Закрытый ключ остается на вашем компьютере, и открытый ключ должен быть размещен на удаленном компьютере (обычно в папке .ssh в удаленном домашнем каталоге).

Для создания пары private/public key вы можете использовать файл WolframSSHKeyGen.jar, например:

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

и следуйте инструкциям в появившихся диалоговых окнах. Когда это будет сделано, скопируйте открытый ключ в папку .ssh на удаленной машине. В моем случае я вызывал ключи kernel_key и kernel_key.pub был автоматически указан таким образом.

Теперь вы можете проверить соединение из командной строки, как это (с помощью команды ls на удаленном компьютере):

java -jar c:\path\to\mathematica\SystemFiles\Java\WolframSSH.jar --keyfile kernel_key [email protected] 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]