20
$\begingroup$

Is it possible to setup connection to remote kernels through ssh?

I'm able to SSH into the remote server(linux) and start a kernel in the terminal, but it can't connect back to my local front end. I asked the network administrator and he says that the "stringent firewall rules" allow only SSH connection to the linux server.

So is it possible to setup the connection through SSH? I have seen several solutions here or there but I'm never able to make them work. Could you give a detailed step by step guide?

$\endgroup$
  • $\begingroup$ What's wrong with the tutorial in the reference material/ It states that connecting this way uses SSH. $\endgroup$ – bobthechemist Nov 17 '14 at 23:10
  • 1
    $\begingroup$ library.wolfram.com/infocenter/Conferences/7250 There is a script in here that will automatically tunnel the ports you need via SSH. $\endgroup$ – mfvonh Nov 17 '14 at 23:33
  • $\begingroup$ @bobthechemist I guess it start the connection to the server with SSH, but the kernels on the server will connects back to the front end not use SSH, instead it uses some random ports, which seems to have been blocked in my network. $\endgroup$ – xslittlegrass Nov 18 '14 at 1:31
  • $\begingroup$ @mfvonh I tried that multiple times, but never able to make it work. Does it work for you? $\endgroup$ – xslittlegrass Nov 18 '14 at 1:31
  • 1
    $\begingroup$ This link may be of use as well. I can follow these directions to interact with a kernel on the RPi from v9 on Windows using Putty. $\endgroup$ – bobthechemist Nov 18 '14 at 3:08
17
$\begingroup$

Here's a solution that works quite well with me and a colleague of mine in my research group.

I assume you have Mathematica installed on both your local and remote machine. The command MathKernel has to be available on the shell of the remote machine.

Short answer:

1- Install GOW if you're using Windows

2- Open command prompt, and connect to the target machine using ssh, command is: ssh hostname. Confirm and make sure the shell is accessible. Then Restart Mathematica.

3- Run that script below from the long answer after modifying the necessary variables (username, password, hostname and number of kernels):

If you're using a linux client, there's a note for you at the end.


Long answer:

Note: this works for clients with any operating system, but the target server has to have an ssh server. It didn't work on target servers being Windows. If you manage to get it work, I'd appreciate adding it here.

If you're under Windows (as client), install GOW (and make sure it gets added to PATH (The installer offers that as far as I remember), which will install an SSH client for you. You should test the ssh client by running ssh yourTargetMachineHostname in your Command Prompt/Terminal. Make sure it works and you enter the shell of that machine, then proceed. Make sure you restart Mathematica after this point (to give environment variables a chance to update).

Then all you have to do is run the following code, but modify the username, password, the target machine hostname, and the number of parallel kernels you'd like to launch. Modify the ssh path if you have to (in case GOW bin directory was not added to PATH), but normally you don't have to.

Needs["SubKernels`RemoteKernels`"]
Parallel`Settings`$MathLinkTimeout = 100
user = "myuser";
password = "mypassword";
ssh = "ssh"; (*ssh program name. If you install GOW on Windows, then this should work, otherwise put the path yourself*)
math = "MathKernel" <> 
   " -wstp -linkmode Connect `4` -linkname `2` -subkernel -noinit >&  \
/dev/null &";
number = 20; (*number of parallel kernels to launch*)
machine = "targetPC-Hostname";
remote = SubKernels`RemoteKernels`RemoteMachine[machine, 
  ssh <> " " <> user <> "@" <> machine <> " " <> "-pw " <> password <>
    " \"" <> math <> "\"", number]

Print[remote // InputForm]
kerns = LaunchKernels[remote]

ParallelEvaluate[$MachineName]

(*CloseKernels[]*)

How to know if it works? If launching the kernels is successful, then the execution of the command ParallelEvaluate[$MachineName] will produce the hostname of the remote machine, not the local machine.

Now everything parallel will go to the remote host!

My advice: Make good use of ParallelTable, ParallelDo and similar commands, because by using these, you don't have to define the variables from your kernel into each parallel kernel, which is the case for ParallelEvaluate.

If you have limited licensing and you work in a group, consider using the commented command CloseKernels[], to close the kernels after you're done, so that your colleagues can benefit from the remote host. It's not generally possible to start an infinite amount of kernels.

I personally love this way of using remote kernels for many reasons. Mainly because it doesn't execute everything on the remote host, but it only executes parallel calls. Meaning that you can only divert expensive calls to the remote host (which is supposedly a very powerful machine), while execute simple calls on your local machine. Consequently, if you lose connection to the host, you can reconnect without a single problem without losing data from your local kernel!

CAVEAT: Notice that your password is written there in clear text. If you feel this is not secure and you need a better way, consider using Pageant, which makes it possible to connect through ssh using private/public key pair. Here's a tutorial for how to do it on Windows, and here's a tutorial on how to do it on Linux. Of course, the remote host has to have your public key in that case.


For Linux users: There's a well known incompatibility problem between Mathematica and the ssh command. To fix it, you have to reset the environment in which Mathematica calls the kernels. Replace the "ssh" variable in the code above with this:

ssh = "export LD_LIBRARY_PATH=;ssh"

This will execute export LD_LIBRARY_PATH=; then connect. One more thing is that putting the password in the command to ssh in Linux doesn't work. So replace the math variable with the following:

remote = SubKernels`RemoteKernels`RemoteMachine[machine, 
  ssh <> " " <> user <> "@" <> machine <>
    " \"" <> math <> "\"", number]

And then you have to find a way to login to ssh without directly inputting the password, like public key login or sshpass. The web is filled with documentation on how to do this.

$\endgroup$
  • $\begingroup$ Thanks, this works well for mac to mac communication. The resulting kernel(s) are configured as parallel kernels; how do you create remote kernels that, once selected, communicate with the Front End and perform all the kernel computations? I can name my kernels using "KernelName[]" but I can't select one from 'Evaluation' or use "Evaluator[]" to programmatically select a kernel. Ideally I would like to be able to select a remote kernel whilst using the front end of my Raspberry Pi. $\endgroup$ – user37955 Feb 23 '16 at 4:09
  • $\begingroup$ @Ian I'm not sure I get your questions properly, but I got two questions. If you want to use a specific Kernel for your evaluations saved in the variable kerns (this contains all the kernels objects in a list), you can use the second argument of ParallelEvaluate. For example, ParallelEvaluate[{1+1,$MachineName},kerns[[1]]]. This will be executed on your remote host. Now if you want to even have the local/default kernel done remotely, this is not supposedly impossible, but I couldn't do it myself. This is done from the menu "Evaluation" then "Kernel Configuration Options..." [...] $\endgroup$ – The Quantum Physicist Feb 23 '16 at 10:09
  • $\begingroup$ @Ian Then add a new kernel and choose for it to be "Remote". There, there is some java mess that uses some weird ssh, so the automatic version doesn't work and even Mathematica crashes when it's used. You have to use the advanced options and try to define the commands there yourself. I failed in doing that myself (and honestly I prefer to have my remote kernels only parallel, in case I'm moving my laptop from work to home I don't lose my kernel information or I have comm error). So if you succeed in getting everything on the remote, please add it to my answer so that everyone benefits from it. $\endgroup$ – The Quantum Physicist Feb 23 '16 at 10:13
  • $\begingroup$ I'm getting General::time: Operation LaunchKernels timed out after 10. seconds from a MacOS to an Ubuntu 16 box, any suggestion you have would be greatly appreciated $\endgroup$ – M.R. Dec 14 '16 at 3:28
  • $\begingroup$ @M.R. Sorry, never tried this on Mac hosts and never heard of this problem. $\endgroup$ – The Quantum Physicist Dec 14 '16 at 8:26
3
$\begingroup$

Regarding The Quantum Physicist's answer, there might be a little problem for some macOS users who use macOS as remote machine. If you get the time out error message, it's very likely that the remote machine doesn't know the path of MathKernel.

math = "MathKernel" <> 
   " -wstp -linkmode Connect `4` -linkname `2` -subkernel -noinit >&  \
/dev/null &";

You can use the full path of MathKernel instead.

math = "/Applications/Mathematica.app/Contents/MacOS/MathKernel" <> 
   " -wstp -linkmode Connect `4` -linkname `2` -subkernel -noinit >&  \
/dev/null &";
$\endgroup$

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

Not the answer you're looking for? Browse other questions tagged or ask your own question.