DeepBlueタスクチームブログ#1: OpenMPI

活動について

はじめまして、私たちは「DeepBlueタスクチーム」というチームで活動を行っています。
チームは「安いハードウェアで、低コスト高パフォーマンスを実現しよう」という目的に向けて、
月2回ほどのペースで活動しています。

現在は3台のRaspberry Pi2を用いて、並列分散処理について勉強調査中です。
並列分散処理にはメッセージパッシングを利用した分散処理ライブラリOpenMPIの使用を考えていて、
今回はその概要と設定について書かせていただきます。

MPIの概要

open-mpi-logo

ライブラリはOpenMPIを使用しますが、まずはMPIの概要です。
この2つは、MPIが規格、OpenMPIが実装という関係です。
MPIは別々のプログラム同士を「メッセージ」によって連携させるための通信プロトコルであり、あくまでも「規格」です。
MPIは規格なのでそのまま使えるツール等ではなく、その実装は幾つかあります。 (選定理由は後ほど)

  • OpenMPI
  • MPICH
  • FT-MPI
  • LA-MPI
  • PACX-MPI

MPIの規格はThe MPI Forumという団体により、定義、維持されています。
彼らのHP[Message Passing Interface Forum](http://www.mpi-forum.org/index.html)に
日本語翻訳版ドキュメントがありますのでご参照ください。
(ドキュメントの日付が1996年7月16日とあるので古いかもしれません)

このドキュメントによるとMPIの概念と目標とは、

> Chapter1 > MPIの紹介 > 1.1 概要と目標 > メッセージ通信は、ある種の、特に分散メモリを備える並列マシンで広く用いられているパラダイムである。そのバリエーションはいろいろあるが、メッセージによって通信をおこなうプロセスという基本概念は良く理解されている。この十年間で、重要なアプリケーションをこのパラダイムに当てはめることに関して、非常に大きな進歩が成し遂げられた。各ベンダはそれぞれに異なる独自のシステムを実現した。さらに最近では、いくつかのシステムによって、メッセージ通信システムが効率よくかつポータブルに実現できるということが実証された。したがって、今や、広範囲のユーザーにとって役に立ち、なおかつ広範囲のコンピュータ上で効率的に実現できるライブラリルーチンの中核について、その構文と意味の定義を試みるに適当な時期に来ていると言えるだろう。 参考: MPI: メッセージ通信インターフェース標準 日本語訳ドラフト

とあります。
プロセス間のメッセージ通信によって並列処理が盛んになってきた当時、
それぞれ独自に作られていた複数の実装を共通化/汎用化する必要性から規格化されたようです。
その後、MPI規格によって実装の違いに左右されること無く様々な環境で動作させる
という目標を達成できているのが現状ということです。

なぜOpenMPI?

先ほども書いたように、MPI実装はいくつかあります。
その中でなぜOpenMPIを採用しようと思ったか、それについて次の2つ理由が挙げられます。

  • 他のMPI実装(FT-MPI、LA-MPI、LAM/MPI)の後継として、開発され続けている。
  • デファクトスタンダード(単純に検索結果の比較ですが、日本語ドキュメントも多くあります)

特に2.は初めてMPI実装を触る私たちにとって心強い条件です。

統計

セットアップ

話が長くなってしまいましたが、セットアップに入ります。
最終的に複数のRaspberry Pi2で並列分散処理を行おうと思っており、その構成は以下のようになります;

  • Raspberry Pi2 * 3
  • OS: Raspbian
  • LAN、ハブ等の接続機器

今回はノードの連携は置いておいて、まずはRaspberry Pi一台にセットアップします。
それではOpenMPIをインストールしましょう。Raspbian Pi起動しログインしたあと、以下の手順を行います。

Javaのパスを確認

# Javaのバージョンを確認 java -version # Javaコマンドのパスを確認 which java

バージョンが表示され、javaコマンドのパスが表示されれば問題ありません。

ダウンロ-ドして展開

# ダウンロード wget -d https://www.open-mpi.org/software/ompi/v1.10/downloads/openmpi-1.10.2.tar.gz # hash確認 diff <(echo 'efbb84a32ea3e2004f3668b2699437a2c7d67172') <(sha1sum openmpi-1.10.2.tar.gz|awk '$0=$1') # 展開 tar xzf openmpi-1.10.2.tar.gz

make&install

# 展開したディレクトリに移動 cd openmpi-1.10.2 # JavaInterfaceを有効にして、「/opt/openmpi-1.10.2」にインストールする ./configure --prefix=/opt/openmpi-1.10.2 --enable-mpi-java make clean make make install

私の環境では`configure`、`make`に合計1時間くらいかかりました。。。

pathを通す

# OpenMPI(とそのマニュアル)にパスを通す設定を「.bash_profile」に追記 cat <<'EOF'>> ~/.bash_profile export OPENMPI_HOME=/opt/openmpi-1.10.2 export PATH=$PATH:$OPENMPI_HOME/bin export MANPATH=$MANPATH:$OPENMPI_HOME/share/man EOF # 追記した内容を反映 source ~/.bash_profile # mpirunコマンドにパスが通っているか確認 which mpirun

インストールの確認

`make`したdirectoryに`examples/Hello.java`というファイルが作成されているかと思います。 これを実行して動作確認を行いましょう。 # コンパイル(mpi.jarをclasspathに含める) javac -cp $OPENMPI_HOME/lib/mpi.jar Hello.java # 実行 mpirun -v -np 1 java Hello

実行ができればインストール完了です!

次回

お疲れ様でした。
これでOpenMPIのセットアップが済みましたね。
MPIの本当の力を感じるために、次回はノードをつなげて並列処理を行いたいと思います。