読者です 読者をやめる 読者になる 読者になる

StatModeling Memorandum

StanとRとPythonでベイズ統計モデリングします. たまに書評.

Amazon EC2でstanの計算をさせるまでのメモ

最近、自宅計算サーバのメンテに疲れたので重い計算はクラウドで流すことに決めました。Amazon EC2で流すstanが思いのほか快適なのでそれまでの道のりをメモとして残します。AWSの中の人である(違 @yamakatuさんに途中でめっちゃサポートしてもらいました。感謝!お約束ですがこの記事の内容の実行については自己責任でお願いします。

Amazon EC2の基本

AWSのアカウント開設」から「snapshot・AMI・instanceなどの簡単な説明」は以下の資料を参考にしました。

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 &