AWSその3
最初に、前々回の記事を2ヶ所訂正します。
無料枠ではEBSは30GB以下に制限されているので、とりあえず30GB付けておく
と書きましたが、後から減らすのは難しいので、SSDの下限である10GBか、CentOSのAMIで設定されている8GBのままで良かったかもしれません。
課金されるようになると、EBSにしろAMI(を置いているS3にしろ)1GB単位の単価なので。*1
もう一箇所はauthorized_keysを作成した後で
chmod 600 ~/.ssh/authorized_keys
するのを忘れてました。
今日別のマシンでやっていて、この作業を忘れてたんですが、クライアント側では(-vvvを付けても)原因を表示せずにパスワード認証に落ちるのでしばらくはまってましたorz
*2
さて、今日の作業はこちら
http://docs.aws.amazon.com/ja_jp/AWSEC2/latest/UserGuide/dynamic-dns.html
昔懐しのDDNSです。
といっても、これまたほぼamazonのドキュメントどおりですが・・・
まずは、epelを有効にしてnoipのパッケージをインストールします。
次にno-ipの設定ファイルを作成します。以下のコマンドを入力するとインタラクティブにアカウント名とかパスワードを聞いてくるので、入力してください。
$ noip2 -C
それから、noipのサービスを起動します。
$ service noip start
ちょっと待ってから、設定したホスト名でアクセスできることを確認してください。
最後に自動起動の設定です。
$ chkconfig noip on
$ chkconfig --list noip
noip 0:off 1:off 2:on 3:on 4:on 5:on 6:off
これで概ねsshでログインして遊ぶオモチャが完成です。
AWSその2
OSの設定(続き)
rpm -qa |wc -l すると 195行 とかいうコンパクトな構成なので、
とりあえず、片っぱしから使いそうなパッケージをインストールします。
yum install vim screen gcc gcc-c++ gcc-gfortran gdb wget git xeyes openmpi
とりあえずこれで普段使っているものは一通り入ったはず。*1
あとはpythonも欲しいとこだけど、標準だと2.6なんで2.7を/optの下にでも後で入れることにします。
ユーザ設定
この辺は人によって違うと思いますが、私の場合は
で完了です。
AMIの保存
せっかくの仮想環境なので、一通りの設定が終わったところでOSイメージを保存しておきましょう。
といっても、この項もほぼこのドキュメントに従って操作するだけなので、手順は省略します。
Amazon EBS-Backed Linux AMI の作成 - Amazon Elastic Compute Cloud
作成が完了したら、新しいAMIでインスタンスを立ち上げて、これまでの設定が残っているかどうか確認します。
最後に、元のインスタンスとEBSボリュームを削除して作業完了です。
*1:xeysは常用してるわけじゃなくて、Xのポートフォワードのテスト用に使うだけなわけですが
AWS
ずいぶん前にUdacityのparallel computing(という名のGPGPU)の授業でレポートを提出したら、AWSのクーポンをくれていたのを思いだして、インスタンスを作ってみました。
構成は、t2.microでCentOS6.5にして、片っ端から使いそうなパッケージを突っ込んだだけという、テキトーなものですが
後々の備忘のためにまとめときます。
インスタンスの作成
基本的にはこの動画の流れにそってやればOK
ご利用開始にあたって - Amazon EC2 (クラウド上の仮想サーバー Amazon Elastic Compute Cloud) | アマゾン ウェブ サービス(AWS 日本語)
ポイントは3つあって
OSの設定
インスタンス起動ウィザードの最後の方で作成した鍵ペアを使ってrootでログインします。
無事に入れたら、とりあえずrootのパスワードを設定しときましょう。
その後、一般ユーザでリモートログインできるように変更します。
> adduser hoge
> su hoge
> mkdir .ssh
> chmod 755
> vi .ssh/authorized_keys
として、普段つかっている公開鍵を放り込みましょう。
その後、作成した一般ユーザでログインできることを確認してからRootのリモートログインを不可にします。
/etc/ssh/sshd_confを編集して
PermitRootLogin no
PasswordAuthentication no
あたりを設定します。
PermitRootLoginに関しては、私が設定した時は通常のコメントアウトされた行がある位置から大きく離れて、ファイルの末尾近くに"PermitRootLogin without-pasword"という設定が書かれていたので注意してください。
ファイルの修正が終わったら、新しいターミナルを起動して接続し、前のターミナルは残したままの状態で
> service sshd restart
とします。*2
さらに別のターミナルからログインできることを確認したら、作業完了です。
最後に、OSを再起動しても正常にログインできるかどうか確認します。
これは、コンソールから
shutdown -r now
ではなく
とします。
長くなってきたので、続きは後日
OpenMP+MPIハイブリッド実行 with OpenMPI
ひさびさにすっぽりとハマったのでメモ
OpenMPI 1.8.1な環境で、MPI/OpenMPのハイブリッド実行をしようとしてたのですが、
mpirun -np 1 ./a.out
とやるとOMP_NUM_THREADSの値に関わらず1coreしか使われないけど、mpirunを使わないで
./a.out
とすると、きっちりOMP_NUM_THREADSで指定したコア数まで使われるという謎の現象が起きてました。
結論を先に書くと、mpirunのオプション --bind-to を明示的に指定することでこの現象は解決します。
mpirun --bind-to board -np 1 ./a.out
みたいな感じで。
ちなみに、今回のテスト環境はシングルソケットのマシンだったのでboardを使ったけど、マルチソケットな環境であれば--bind-to socketを指定したうえで
プロセス数をsocket数(の倍数)にすることをお勧めします。*1
これはどういうことかというと、mpirun経由で実行した時は、デフォルト設定の"--bind-to core"の指定によって、生成されたプロセスとそこからfolkした子スレッド全てが同一コアに割り当てられてしまったために、何スレッド生成しようが1コアしか動かなかったんではないかと。
なんでこんなもんをデフォルトの挙動にしたのかと問い詰めたいとこですが、これやんないとflatMPIのプログラムをコアを余らせて実行した時に空いているコア間で
マイグレーションして、キャッシュミス頻発しちゃうという、嫌な状況になるので理解できなくはないです。
実際のところ、マイグレーションはされたくないけどどこのコアでも勝手に使ってくれて良いよというユーザの方が多いと思うので、デフォルトではpinning(一回使い始めたコアを使い続ける)は有効だけど、バインド(特定のRankを特定のコアに割り当てる)は無効になっているIntelMPIの方がありがたいなぁ。*2
OpenMPIの開発者の皆様には、夜中の1時にデバッガからomp_get_max_threads()した時の私の絶望を多少なりとも慮っていただきたいもんだ*3
python2.6@windows7 へ IPython を導入してみる
会社から支給されているお仕事PCには、某ソフトのインストール時に一緒に導入されたpython2.6が入ってるんですが、仕事の合間にちょろっと調査で使った時に
windowsのコマンドプロンプトからコピペするのが激しく面倒
ということに今さらながら気付かされたので、IPythonを導入してみることにしました。
必要なツールの導入
パッケージによっては、Cコンパイラが必要になるため、VC++2008 expressを導入します。
インストーラはこちら
http://go.microsoft.com/?linkid=7729279
python2系列のwindows用バイナリはVS2008でビルドしているので、これより新しいバージョンでは不具合が起きるそうです。
参考URL: https://support.enthought.com/entries/26864394-Windows-Unable-to-find-vcvarsall-bat
実際に、最初はVS express 2013 for windows desktopを入れて試してたのですが、パッケージのビルドに失敗していました。
インストーラをダウンロードして起動したら後はお任せ設定で良いのでインストール方法自体は省略します。
VC++2008 expressには64bit用のコンパイラが含まれていないので、
Microsoft Windows SDK for Windows 7 and .NET Framework 3.5 SP1をダウンロードしてインストールします。
インストーラはこちら
http://www.microsoft.com/en-us/download/details.aspx?id=3138
こちらも同様にインストール方法自体は省略。
ただし、サンプルとかドキュメントが2GB近くあったので、不要であればインストール対象から外した方が良いかもしれません。
私は実際に外してインストールしましたが、特に問題は起きていないです。
それから、こちらのURLにある、インストラクションの1.6に従ってバッチファイルをコピーします。
http://blog.victorjabur.com/2011/06/05/compiling-python-2-7-modules-on-windows-32-and-64-using-msvc-2008-express/
このファイルを
C:\Program Files (x86)\Microsoft Visual Studio 9.0\VC\bin\vcvars64.bat
こっちへコピーしてさらにファイル名を変えます
C:\Program Files (x86)\Microsoft Visual Studio 9.0\VC\bin\amd64\vcvarsamd64.bat
なお、さきほどのインストラクションではさらにmsvccompiler.pyへ修正をしていますが、私の環境では不要でした。
PATHの設定
環境変数のPATHに、(もし無ければ)以下の設定を追加します。
C:\Python26;C:\Python26\Scripts;C:\Program Files (x86)\Microsoft Visual Studio 9.0\VC;
pipのインストール
python用のパッケージマネージャであるpipをインストールします。
公式webサイトにあるドキュメント(http://www.pip-installer.org/en/latest/installing.html)のとおり
get-pip.pyをダウンロードして、コマンドプロンプトから
> python get-pip.py
でインストール完了です。
ぐぐると、「setuptoolsを入れて easy_install pip する」という記事がみつかりますが
最近のバージョンはこれでOKだそうで。
ipythonのインストール
>pip install ipython
これだけで本体はすんなりとインストールできます。
続けて、--pylabみたいな素敵な機能を使うためにパッケージを追加していきます。
といっても、基本的にpip installしてるだけですが。
>pip install pyzmq
>pip install jinja2
>pip install tornado
>pip install matplotlib
しかし、matplotlibのビルドはこんなエラーが出て失敗しました。
c:\users\(中略)\matplotlib\src\ft2font.h(16) : fatal error C1083: Cannot open include file: 'ft2build.h': No such file or directory
freetype2のヘッダが無いと言われてるので、入れればビルドできそうですが、matplotlib1.3.1はpython 2.6用のpre-buildパッケージがあるので、こっちを入れて回避します。
http://matplotlib.org/downloads.html
インストール完了後に、ンタラクティブシェルからimport matplotlibすると
dateutil, pyparsingが無いと言われるので、さらに追加インストールします。
>pip install python-dateutil
>pip install pyparsing
これで一応環境の構築は完了
あとはこんな感じのバッチファイルを用意して、ダブルクリックすれば、ブラウザ上になんか出てきます。
ipython notebook --pylab inline
最後に
pythonのバージョンに拘らなくても良いのであれば、IPythonの公式webにあるように
1. Download and install Anaconda or the free edition of Enthought Canopy.
ってのがお勧めです。
*1:投げる相手が入ればの話だけど・・・
cygwinのインストール
ここのとこteraterm+winscp+Xmingの代替として、MobaXtermってのを試してました。
ローカルでgccとかも実行できて便利そうだし、sshとsftpとXサーバを1アプリにまとめられるから、持ち歩きも簡単そうと思って期待してたんですが、
高負荷時にちょくちょく落ちたり(sftpでファイルサイズが大きいものを転送しようとするとsftpのタブが無くなったりとか)パッケージとしてインストールできるgccのバージョンが古かったりで、常用してるとストレスがたまってきます。
でも、元に戻るのも癪だったので、いっそのことと思ってcygwinを導入することにしました。*1
インストール方法は以前(10年くらい前か?)試した時とほとんど変わってなくて
といった流れです。
*2
インストールするパッケージは次のものを選びました。
とりあえず、これで手元でちょろっとテストコードをコンパイルすることもできるsshクライアント&Xサーバの完成です。
あとは、bitbucketに放り込んでいる、dot fileとかを取ってくればだいたい普段のLinux環境と同じ感覚で使えます。
*3
で、これインストール先にSkyDrive(現OneDrive)を選んだんですが、同期が終わるのはいつになるかな・・・
MPIライブラリ毎のコンパイラ指定方法
たいていのMPIライブラリには、伝統的にmpi{cc,f90,cxx}といったコンパイラのラッパーが付いています。-Iとか-Lとか-lを適当に設定したうえで、コンパイラを呼び出してくれる便利なものですが、
これが最終的に呼び出すコンパイラを切り替える方法がライブラリによってバラバラなので、ざっくりとまとめておきます。
IntelMPIの場合
コマンド名で呼び出すコンパイラを切り替えています。
mpicc: gcc or cc
mpicxx: g++
mpifc: gfortran
mpigcc: gcc
mpigxx: g++
mpif77: g77
mpif90: gfortran
mpiicc: icc
mpiicpc: icpc
mpiifort: ifort
mpich2, mpich, mvapich2の場合
mpicc,mpicxx,mpif77,mpif90に対してオプションを指定するか、環境変数でコマンド名を設定します。
mpicc: -cc={コンパイラ名} or MPICH_CC
mpicxx: -cxx={コンパイラ名} or MPICH_CXX
mpif77:-f77={コンパイラ名}, -fc={コンパイラ名} or MPICH_F77
mpif90 :-f90={コンパイラ名} or MPICH_F90
mvapich2も指定する環境変数はMPICH_XXなので注意*2
mpich3は未調査ですが、たぶん変わっていないでしょう。
OpenMPIの場合
環境変数でコマンド名を設定します。
mpicc: OMPI_CC
mpicxx: OMPI_CXX
mpif77: OMPI_F77
mpif90: OMPI_FC
使い方
IntelMPIみたいにコマンド名自体が違う場合や、mpich系のオプション指定を使う方法では、あまり気にしなくても良いんですが、環境変数でコンパイラを切り替える場合はmakefileがからむとちょっと面倒です。
駄目な例
OMPI_CC=icc
CC=mpicc
動作する例
CC="env OMPI_CC=icc mpicc"
要はmakefile内で環境変数を設定する方法が無いってのが問題なんですが、CCにenvを渡せば一応解決できます。*3
一時的に変更するのであれば、makeを実行するシェル上で環境変数を設定しても良いのですが、この設定を前提にコンパイル手順を決めると
とかいう間抜けな事態が発生するので、美しくないけどmakefile内に書いてしまうことをお勧めします。