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

functions - Get leading series expansion term?

Given a function f[x] , I would like to have a function leadingSeries that returns just the leading term in the series around x=0 . For example: leadingSeries[(1/x + 2)/(4 + 1/x^2 + x)] x and leadingSeries[(1/x + 2 + (1 - 1/x^3)/4)/(4 + x)] -(1/(16 x^3)) Is there such a function in Mathematica? Or maybe one can implement it efficiently? EDIT I finally went with the following implementation, based on Carl Woll 's answer: lds[ex_,x_]:=( (ex/.x->(x+O[x]^2))/.SeriesData[U_,Z_,L_List,Mi_,Ma_,De_]:>SeriesData[U,Z,{L[[1]]},Mi,Mi+1,De]//Quiet//Normal) The advantage is, that this one also properly works with functions whose leading term is a constant: lds[Exp[x],x] 1 Answer Update 1 Updated to eliminate SeriesData and to not return additional terms Perhaps you could use: leadingSeries[expr_, x_] := Normal[expr /. x->(x+O[x]^2) /. a_List :> Take[a, 1]] Then for your examples: leadingSeries[(1/x + 2)/(4 + 1/x^2 + x), x] leadingSeries[Exp[x], x] leadingSeries[(1/x + 2 + (1 - 1/x...

How to thread a list

I have data in format data = {{a1, a2}, {b1, b2}, {c1, c2}, {d1, d2}} Tableform: I want to thread it to : tdata = {{{a1, b1}, {a2, b2}}, {{a1, c1}, {a2, c2}}, {{a1, d1}, {a2, d2}}} Tableform: And I would like to do better then pseudofunction[n_] := Transpose[{data2[[1]], data2[[n]]}]; SetAttributes[pseudofunction, Listable]; Range[2, 4] // pseudofunction Here is my benchmark data, where data3 is normal sample of real data. data3 = Drop[ExcelWorkBook[[Column1 ;; Column4]], None, 1]; data2 = {a #, b #, c #, d #} & /@ Range[1, 10^5]; data = RandomReal[{0, 1}, {10^6, 4}]; Here is my benchmark code kptnw[list_] := Transpose[{Table[First@#, {Length@# - 1}], Rest@#}, {3, 1, 2}] &@list kptnw2[list_] := Transpose[{ConstantArray[First@#, Length@# - 1], Rest@#}, {3, 1, 2}] &@list OleksandrR[list_] := Flatten[Outer[List, List@First[list], Rest[list], 1], {{2}, {1, 4}}] paradox2[list_] := Partition[Riffle[list[[1]], #], 2] & /@ Drop[list, 1] RM[list_] := FoldList[Transpose[{First@li...

front end - keyboard shortcut to invoke Insert new matrix

I frequently need to type in some matrices, and the menu command Insert > Table/Matrix > New... allows matrices with lines drawn between columns and rows, which is very helpful. I would like to make a keyboard shortcut for it, but cannot find the relevant frontend token command (4209405) for it. Since the FullForm[] and InputForm[] of matrices with lines drawn between rows and columns is the same as those without lines, it's hard to do this via 3rd party system-wide text expanders (e.g. autohotkey or atext on mac). How does one assign a keyboard shortcut for the menu item Insert > Table/Matrix > New... , preferably using only mathematica? Thanks! Answer In the MenuSetup.tr (for linux located in the $InstallationDirectory/SystemFiles/FrontEnd/TextResources/X/ directory), I changed the line MenuItem["&New...", "CreateGridBoxDialog"] to read MenuItem["&New...", "CreateGridBoxDialog", MenuKey["m", Modifiers-...