最近、自宅計算サーバのメンテに疲れたので重い計算はクラウドで流すことに決めました。Amazon EC2で流すstanが思いのほか快適なのでそれまでの道のりをメモとして残します。AWSの中の人である(違 @yamakatuさんに途中でめっちゃサポートしてもらいました。感謝!お約束ですがこの記事の内容の実行については自己責任でお願いします。
Amazon EC2の基本
「AWSのアカウント開設」から「snapshot・AMI・instanceなどの簡単な説明」は以下の資料を参考にしました。
- ドットインストールの動画 Amazon Web Services入門
- AWSの中の人の資料1 はじめてのアマゾンクラウド①[Amazon Web Services(AWS)のアカウントを開設する]
- AWSの中の人の資料2 はじめてのアマゾンクラウド②[仮想サーバ(Amazon EC2)を立ち上げる]
- AWSの中の人の資料3 はじめてのアマゾンクラウド④『EC2でwindowsサーバを立ち上げリモート接続』 なお僕はRLoginを使ってssh接続やファイル転送をしています。
Amazon LinuxにR(3.1.1)のインストール
Rは@yamano357さんのこの記事を参考にソースから3.1.1入れました。t2.micro(vCPUs=1, Memory=1GiB)で入ります。具体的には以下のコマンドでインストールできました。
sudo yum install automake bison tetex texlive-latex texinfo-tex texlive* gcc gcc-c++ gcc-gfortran readline-devel cairo-devel libgfortran gcc-objc openssl-devel cpp libX* xorg-x11* java-1.7.0-openjdk-devel curl -O http://cran.md.tsukuba.ac.jp/src/base/R-3/R-3.1.1.tar.gz tar -zxvf R-3.1.1.tar.gz cd R-3.1.1 ./configure --enable-R-shlib --enable-R-static-lib --enable-BLAS-shlib make sudo make install
Amazon LinuxにStan(2.4.0)のインストール
Stanはメモリがボトルネックでt2.medium(vCPUs=2, Memory=4GiB)が必要でした。これが唯一のハマりどころ。あとは公式ドキュメントに書いてあるようにRを起動して、以下のコマンドでインストールできました。
Sys.setenv(MAKEFLAGS = "-j1") source('http://mc-stan.org/rstan/install.R', echo = TRUE, max.deparse.length = 2000) install_rstan()
※ stan 2.7.0以降ではCRANから簡単にインストールできるようになりました。
instanceをコマンドラインからstopするには
重い計算を流して、計算が終わったら自動でinstanceをstopするようにしたいですよね。Amazon Linuxでは以下の方法で割と簡単にできるようになります(他のOSだと追加の作業が必要になるかもとのことです)。
- アカウント名のところのプルダウンメニューの中の「Security Credentials」のページへ。そして「Access Keys (Access Key ID and Secret Access Key)」からAccess Key ID and Secret Access KeyをCreateしてメモ。
- instance上で「aws configure」コマンドを実行して先ほどメモしたAccess Key ID等を入力します。
AWS Access Key ID [None]: XXXXXXXXXXXXXXX74A4Q AWS Secret Access Key [None]: XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXWPBYl Default region name [None]: ap-northeast-1 Default output format [None]: json
- 以下のコマンドでstopできるか確認(未来の自分へ:手を抜かず絶対に確認しとけ!)
aws ec2 stop-instances --instance-ids i-XXXXXXXX
最後のi-XXXXXXXXは各自のinstance IDを入力します。instanceの詳細の画面に記載があります。
Stanの並列実行
これができないとEC2使う意味がありません。僕はc3.xlarge(vCPUs=4, Memory=7.5GiB)以上を使います。RStanのサンプルコードは以下になりました。
library(rstan) rstan_options(auto_write = TRUE) options(mc.cores = parallel::detectCores()) N <- 10 X <- 1:10 Y <- c(1, 2, 3, 6, 3, 8, 5, 8, 9, 10) data <- list(N = N, X = X, Y = Y) stan_fit <- stan(file="model/test.stan", data=data) save.image("output/test.RData")
・2~3行目: stan 2.7.0からこれらの行を記述するだけで並列計算ができるようになりました。
そしてstopまで込みのシェルスクリプトは以下になります。
#!/bin/bash R --vanilla --silent < runstan.test.R aws ec2 stop-instances --instance-ids i-XXXXXXXX
このシェルスクリプトはWindows環境で作成してSFTPで転送してAmazon Linux上で実行しようとするとエラーが出ます。この記事を参照。Linux上で作成するなり、改行コードを置換するなりして下さい。最後にこのシェルスクリプトをコマンドラインからnohupで起動して完了です。
nohup bash exec.sh > nohup.out &