Skip to main content

remote kernel through SSH


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?



Answer



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.


Comments

Popular posts from this blog

plotting - Filling between two spheres in SphericalPlot3D

Manipulate[ SphericalPlot3D[{1, 2 - n}, {θ, 0, Pi}, {ϕ, 0, 1.5 Pi}, Mesh -> None, PlotPoints -> 15, PlotRange -> {-2.2, 2.2}], {n, 0, 1}] I cant' seem to be able to make a filling between two spheres. I've already tried the obvious Filling -> {1 -> {2}} but Mathematica doesn't seem to like that option. Is there any easy way around this or ... Answer There is no built-in filling in SphericalPlot3D . One option is to use ParametricPlot3D to draw the surfaces between the two shells: Manipulate[ Show[SphericalPlot3D[{1, 2 - n}, {θ, 0, Pi}, {ϕ, 0, 1.5 Pi}, PlotPoints -> 15, PlotRange -> {-2.2, 2.2}], ParametricPlot3D[{ r {Sin[t] Cos[1.5 Pi], Sin[t] Sin[1.5 Pi], Cos[t]}, r {Sin[t] Cos[0 Pi], Sin[t] Sin[0 Pi], Cos[t]}}, {r, 1, 2 - n}, {t, 0, Pi}, PlotStyle -> Yellow, Mesh -> {2, 15}]], {n, 0, 1}]

plotting - Plot 4D data with color as 4th dimension

I have a list of 4D data (x position, y position, amplitude, wavelength). I want to plot x, y, and amplitude on a 3D plot and have the color of the points correspond to the wavelength. I have seen many examples using functions to define color but my wavelength cannot be expressed by an analytic function. Is there a simple way to do this? Answer Here a another possible way to visualize 4D data: data = Flatten[Table[{x, y, x^2 + y^2, Sin[x - y]}, {x, -Pi, Pi,Pi/10}, {y,-Pi,Pi, Pi/10}], 1]; You can use the function Point along with VertexColors . Now the points are places using the first three elements and the color is determined by the fourth. In this case I used Hue, but you can use whatever you prefer. Graphics3D[ Point[data[[All, 1 ;; 3]], VertexColors -> Hue /@ data[[All, 4]]], Axes -> True, BoxRatios -> {1, 1, 1/GoldenRatio}]

plotting - Mathematica: 3D plot based on combined 2D graphs

I have several sigmoidal fits to 3 different datasets, with mean fit predictions plus the 95% confidence limits (not symmetrical around the mean) and the actual data. I would now like to show these different 2D plots projected in 3D as in but then using proper perspective. In the link here they give some solutions to combine the plots using isometric perspective, but I would like to use proper 3 point perspective. Any thoughts? Also any way to show the mean points per time point for each series plus or minus the standard error on the mean would be cool too, either using points+vertical bars, or using spheres plus tubes. Below are some test data and the fit function I am using. Note that I am working on a logit(proportion) scale and that the final vertical scale is Log10(percentage). (* some test data *) data = Table[Null, {i, 4}]; data[[1]] = {{1, -5.8}, {2, -5.4}, {3, -0.8}, {4, -0.2}, {5, 4.6}, {1, -6.4}, {2, -5.6}, {3, -0.7}, {4, 0.04}, {5, 1.0}, {1, -6.8}, {2, -4.7}, {3, -1.