ver.7 の Mathematica には、計算を実行する MathKernel プログラムをいくつも実行して計算を手分けするタイプの並列計算プログラムを書くための仕組みが、標準で内蔵されている。ひとつのマスター MathKernel プロセスが、複数の並列計算用 MathKernel プロセスに計算を割り振る「スター型」と言われる並列計算方式だ。

シングルライセンスの Mathematica の場合、1台のマシンで複数の並列計算用 MathKernel プロセスを起動して使うことになる(通常のシングルライセンスでは4つまで)。最近のマルチコア CPU の環境でなら、計算によっては処理を高速化できる(使い方の雰囲気を知るには、6分ほどのこのスクリーンキャストがおすすめ)。

Mathematica を複数の PC で使うことができるライセンスを所有している場合、 並列計算用 MathKernel を、 ネットワーク上の別のマシンで(リモートで)動かすことができる。 今回は、 この並列用リモートカーネルとの通信の話。

並列用リモートカーネルを、マスターカーネルから起動するとき、次のような流れで接続が確立される。

  1. マスターカーネルが、自ホストの未使用ポートを開き、このポート番号情報を取得する。
  2. ssh などの OS コマンドを介して、マスターカーネルが並列用リモートカーネルを起動する。このとき、カーネル起動オプションの形で、1で開いたマスター側のポート番号情報がリモートカーネルに渡される。
  3. 起動した並列用リモートカーネルは、マスターカーネルの開いたポートに接続する。

(実際には、1では複数のポートが開かれるが、説明の簡便のため省略している)

この方式の難点は2つ。ひとつは、マスターカーネルが開くポートが事前に分からないため、マスター/リモート間の通信ポート限定が難しいこと。もうひとつは、並列用リモートカーネルの起動に ssh などの暗号化コマンドを使っていても、接続確立後の通信は暗号化されていないことだ。

Mathematica 開発元の Wolfram Research 社のサポートチームに聞いてみたところ、「これは現在の製品仕様からは避けられない。お客様が独自に、ssh フォワードを使って回避した事例はあるが、Wolfram は決して推奨しないしサポートもしない」とのこと。

気になって手元であれこれ試したところ、僕の手元の Mac OS X と Linux の環境では、Mathematica 7.0.1 を使って次の方法でうまくいった。ssh フォーワードで作った経路に、上図の③の通信を入れてしまうという作戦だ。
これがすべてのユーザーの環境でうまくいくのかどうかは分からないが、情報として知りたい人がいるかもと思ったので、ここに紹介する次第。

  1. 先立って、マスターのコマンドターミナルで、 ssh user-name@remote-pc-host-name math でリモートの MathKernel がパスワードレスで起動するよう、ローカル/リモート双方のパスや公開鍵情報などを設定しておく。
  2. マスター側の Mathematica を起動し、メニューの [評価] > [並列カーネル設定...] の [リモートカーネル] タブで [ホストを追加] ボタンをクリックしてリモートカーネルを追加し、 [カスタム起動コマンドを使用] にチェックを入れて、次のように設定する。
_H=($(echo `2`|sed -e 's/^\([0-9]*\)@\([^,]*\),\([0-9]*\)@.*$/\2 \1 \3/'));ssh -C -x -f -R ${_H[1]}:${_H[0]}:${_H[1]} -R ${_H[2]}:${_H[0]}:${_H[2]} user-name@`1` math -mathlink -linkmode connect -linkprotocol TCPIP -linkname `2` -linkhost 127.0.0.1 -subkernel -noinit

僕の試した環境では、Mac OS X でも Linux でも、[カスタム起動コマンド] にテキストエディタからペーストしたときに、不必要なスペースが挿入されたり必要なスペースが削除されたりが多数発生したので、試してみる人は注意。

これがうまくいくと、ssh のポート(tcp/22)しか空けていないような PC の MathKernel を並列用リモートカーネルとして使うことができて、ちょっぴりハッピー。...え?ハッピーなのはお前だけだって?

  

【補遺】

Windows でも、コマンドラインから ssh フォワードを使える PuTTY などのクライアントソフトとバッチファイルを組み合わせれば、同様のことはできるはず。将来確認したら、改めて書く...かも。

通常、リモートカーネルというと、Mathematica フロントエンド(Mathematica の入出力を担当するプログラム)から直接リモートマシンの MathKernel を使用することを言う。そのため、上では「並列用リモートカーネル」と書くことでそれと区別した(つもり)。フロントエンドからの通常のリモートカーネルの場合にも、上述した2つの難点はまったく同様に存在する。これへの対応については、下記のページが参考になる。

FAQ Remote Kernels
(おそらくは)有志の運営する Mathematica に関する Wiki の1ページ。Mac OS X 環境で、フロントエンド側で指定したポートを開く方法などが紹介されている。
Remote Kernel Strategies
ドイツの有名 Mathematica 代理店のスタッフが 2008 年の International Mathematica User Conference で発表した資料。Windows の場合についても言及された詳細な設定方法の資料や、実際に使えるバッチファイルなどがダウンロードできる。なんでこの人たち、こんなことまで知ってるの?

※この記事の内容は執筆者の個人的見解で、ヒューリンクスによる公式情報ではありません。[免責事項]

トラックバック

この記事へのトラックバックURL
http://blog.hulinks.co.jp/cgi/mt/mt-tb.cgi/440
内容に対しての関連性がみられないものは削除する場合があります

コメントの投稿

Emailアドレスは表示されません。は必須項目です。
ヒューリンクス取り扱い製品の内容や購入に関するお問い合わせはヒューリンクスサイト連絡先へお願いいたします。投稿前にその他の注意事項もご覧ください。

HULINKS サイトの新着情報